diff --git a/.gitignore b/.gitignore index 81d5108cae397b9151249495acd54897a8f1fe45..c49a12edc170f56db2006f682b46e8ab5401beef 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,39 @@ -.DS_Store .idea /nbproject/private/ .phplint-cache *.swp + +# macOS-specific things to exclude + +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + + +Icon? + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +# Configuration for the Nova editor +.nova \ No newline at end of file diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f3bb140d1b1aaa5cc99b94b2ed8570d35b6a3b33..e7a4bf81481d388375c2e50d0d47efe1f6c086e4 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -3,6 +3,7 @@ stages: - syntax - syntax_diff - test + - build # ### Stage syntax @@ -16,6 +17,7 @@ syntax:lint: - schedules - web - merge_requests + - /^\d+\.\d+\.\d+(p\d+)?$/ script: - echo "Syntax checking PHP files" @@ -31,6 +33,12 @@ syntax_diff:lint: - pushes - branches + except: + - schedules + - web + - merge_requests + - /^\d+\.\d+\.\d+(p\d+)?$/ + script: - echo "Syntax checking PHP files" - bash ./.git-scripts/syntax.sh commit @@ -51,15 +59,46 @@ syntax_diff:lint: # - vendor/bin/phplint -test:install: - stage: test - image: jerob/docker-ispconfig - only: - - schedules - - web - script: - - $CI_PROJECT_DIR/helper_scripts/test_install_docker.sh - - apt-get update - - apt-get --yes install curl - - curl --insecure https://127.0.0.1:8080/login/ - - ps xaf +#test:install: +# stage: test +# image: jerob/docker-ispconfig +# only: +# - schedules +# - web +# - /^\d+\.\d+\.\d+$/ +# +# script: +# - $CI_PROJECT_DIR/helper_scripts/test_install_docker.sh +# - apt-get update +# - apt-get --yes install curl +# - curl --insecure https://127.0.0.1:8080/login/ +# - ps xaf +# +# needs: ["syntax:lint"] + +build:package: + stage: build + image: edbizarro/gitlab-ci-pipeline-php:7.2 + only: + refs: + - /^\d+\.\d+\.\d+(p\d+)?$/ + - web + + script: + - echo "Building release." + - if [[ "$VER" == "" ]] ; then VER="$CI_COMMIT_TAG" ; fi + - if [[ "$VER" == "" ]] ; then VER="3.2dev"$(date +%s) ; fi + - if [[ "$VER" != "" ]] ; then echo "Replacing 3.2dev by $VER" ; sed -i -r 's/3\.2dev/'${VER}'/g' install/tpl/config.inc.php.master install/sql/ispconfig3.sql ; fi + - RET=0 + - tar -cpzf ISPConfig-${VER}.tar.gz --exclude "ISPConfig-${VER}.tar.gz" --exclude ".git*" --exclude ".phplint.yml" --transform 's,^\./,ispconfig3_install/,' . || RET=$? + - if [[ $RET > 1 ]] ; then exit $RET ; fi + - echo "Listing tar contents for verification" + - tar -tvf ISPConfig-${VER}.tar.gz + - echo "Uploading file to download server" + - curl -u "${DEPLOY_FTP_USER}:${DEPLOY_FTP_PASSWORD}" -T ISPConfig-${VER}.tar.gz ftp://${DEPLOY_FTP_SERVER}/web/ + - if [[ "$VER" =~ ^[0-9]+\.[0-9]+\.[0-9]+(p[0-9]+)?$ ]] ; then echo "Stable release ${VER}" ; curl -u "${DEPLOY_FTP_USER}:${DEPLOY_FTP_PASSWORD}" -T ISPConfig-${VER}.tar.gz ftp://${DEPLOY_FTP_SERVER}/web/ISPConfig-3-stable.tar.gz ; echo -n "${VER}" > ispconfig3_version.txt ; curl -u "${DEPLOY_FTP_USER}:${DEPLOY_FTP_PASSWORD}" -T ispconfig3_version.txt ftp://${DEPLOY_FTP_SERVER}/web/ ; else echo "Dev release ${VER}" ; fi + - rm ISPConfig-${VER}.tar.gz + - echo "Download url is https://download.ispconfig.org/ISPConfig-${VER}.tar.gz" + + needs: ["syntax:lint"] + allow_failure: false \ No newline at end of file diff --git a/.gitlab/issue_templates/Bug.md b/.gitlab/issue_templates/Bug.md index 751016f70ad21999ff87d79d5e8191e1e1ae5d84..d86285d53d321b491b17bc8cfd3b228190f3773a 100644 --- a/.gitlab/issue_templates/Bug.md +++ b/.gitlab/issue_templates/Bug.md @@ -1,41 +1,45 @@ -## short description -What is happening and what is wrong with that? +<!-- Before creating a bug report, please: +- Read the contribution guidelines: https://git.ispconfig.org/ispconfig/ispconfig3/-/blob/develop/CONTRIBUTING.md +- Do not ask support questions here. If you are unsure if your problem is a bug, post a thread on the forum: https://www.howtoforge.com/community/#ispconfig-3.23 +- Make sure to remove any content from the description that you did not add. For example, if there are no related log entries, remove the whole "Related log entries" part. +--> -## correct behaviour -What should happen instead? +## Summary +<!-- What is happening and what is wrong with that? --> -## environment -Server OS: (debian/ubuntu/centos/...) -Server OS version: (wheezy/trusty/centos6/...) -ISPConfig version: (3.0.5.4/3.1.5/3.1dev/...) -_you can use `grep 'ISPC_APP_VERSION' /usr/local/ispconfig/server/lib/config.inc.php` to get it from the command line_ +## Steps to reproduce +1. [First step] +2. [Second step] +3. [and so on...] -If it might be related to the problem -``` -insert the output of `nginx -v` or `apachectl -v` here -``` +## Correct behaviour +<!-- What should happen instead? --> + +## Environment +Server OS + version: (Debian 10/Ubuntu 20.04/CentOS 8/...) \ +ISPConfig version: (3.1.15p3/3.2.3/3.2dev/...) +<!-- _you can use `grep 'ISPC_APP_VERSION' /usr/local/ispconfig/server/lib/config.inc.php` to get it from the command line_ --> +Software version of the related software: +<!-- You can use 'nginx -v' or 'apachectl -v' to find the webserver version. Use 'php -v' to find the PHP version.> Put this in code blocks, like so: --> ``` -insert the output of `php -v` here +Output of the command ``` -## proposed fix +## Proposed fix optional, of course. -if you want to post code snippets, please use +if you want to post code snippets, please use ``` your code ``` -or attach a code file. Best is to create a merge request of course. +or attach a code file. Best is to create a merge request of course. -## references -if you know of related bugs or feature requests, please reference them by using `#<bugnumber>`, e. g. #123 -if you have done a merge request already, please reference it by using `!<mergenumber>`, e. g. !12 +## References +if you know of related bugs or feature requests, please reference them by using `#<issuenumber>`, e. g. #6105 +if you have done a merge request already, please reference it by using `!<mergenumber>`, e. g. !1444 if you know of a forum post on howtoforge.com that deals with this topic, just add the link to the forum topic here -## screenshots +## Screenshots optional, of course. Add screenshots of the problem by clicking "Attach a file" on the bottom right. -## log entries -``` -apache / nginx error.log lines (if related) -``` \ No newline at end of file +## Related log entries diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 27377de6e6acb8840aff10ebd3c8b529157c61cd..3a4a7de71fac0c761db397a24d37111979ada037 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -9,6 +9,7 @@ This document is under development and will be continuously improved. * If you want to report several bugs or request several features, open a separate issue for each one of them. # Branches +* If you are a new user, please send an email to: dev [at] ispconfig [dot] org to receive rights to fork the project. * Please create an issue for each contribution you want to make. * Do not put multiple contributions into a single branch and merge request. Each contribution should have it's own branch. * Do not use the develop branch in your forked project for your contribution. Create a separate branch for each issue. diff --git a/README.md b/README.md index 544c36e7d613330b19fb85b62ad586c91d249a01..901cb2a7b9578ba22bd6fc066c2e7842cb2ca685 100644 --- a/README.md +++ b/README.md @@ -1,43 +1,46 @@ # ISPConfig - Hosting Control Panel - \ + \ Development branch: [](https://git.ispconfig.org/ispconfig/ispconfig3/commits/develop) ## Functions - Manage multiple servers from one control panel - Single server, multiserver and mirrored clusters. -- Webserver management (Apache2 and nginx) +- Webserver management - Mailserver management -- DNS server management (BIND and PowerDNS) +- DNS server management - Virtualization (OpenVZ) - Administrator, reseller, client and mailuser login -- Open Source software (BSD license) +- Open Source software ([BSD license](LICENSE)) ## Supported daemons -- HTTP: Apache2 and nginx +- HTTP: Apache2 and NGINX - HTTP stats: Webalizer, GoAccess and AWStats - Let's Encrypt: Acme.sh and certbot - SMTP: Postfix - POP3/IMAP: Dovecot - Spamfilter: Rspamd and Amavis - FTP: PureFTPD -- DNS: BIND9 and PowerDNS +- DNS: BIND9 and PowerDNS[^1] - Database: MariaDB and MySQL +[^1]: not actively tested + ## Supported operating systems -- Debian 9, 10, and testing +- Debian 9 - 11, and testing - Ubuntu 16.04 - 20.04 - CentOS 7 and 8 ## Auto-install script -You can install ISPConfig with our official autoinstaller: https://git.ispconfig.org/ispconfig/ispconfig-autoinstaller/-/blob/master/README.md +You can install the "Perfect Server" with ISPConfig using [our official autoinstaller](https://www.howtoforge.com/ispconfig-autoinstall-debian-ubuntu/) ## Migration tool -The Migration Tool helps you to import data from other control panels (currently ISPConfig 2 and 3 – 3.2, Plesk 10 – 12.5, Plesk Onyx, CPanel** and Confixx 3). For more information, see https://www.ispconfig.org/add-ons/ispconfig-migration-tool/ +The Migration Tool helps you to import data from other control panels (currently ISPConfig 2 and 3 – 3.2, Plesk 10 – 12.5, Plesk Onyx, CPanel[^2] and Confixx 3). For more information, see https://www.ispconfig.org/add-ons/ispconfig-migration-tool/ -** The Migration Toolkit contains now beta support for migrating CPanel to ISPConfig. +[^2]: The Migration Toolkit now contains beta support for migrating CPanel to ISPConfig. ## Documentation You can support ISPConfig development by buying the manual: https://www.ispconfig.org/documentation/ ## Contributing -If you like to contribute to the ISPConfig development, please send an email to: dev [at] ispconfig [dot] org. +If you like to contribute to the ISPConfig development, please read the contributing guidelines: [CONTRIBUTING.MD](CONTRIBUTING.md) + diff --git a/docs/autoinstall_samples/autoinstall.conf_sample.php b/docs/autoinstall_samples/autoinstall.conf_sample.php index 904d65403cb40c4060094c813dcc2eae4f121803..c8bf209f9fcb2d9284f2fed8b33f96091ec36496 100644 --- a/docs/autoinstall_samples/autoinstall.conf_sample.php +++ b/docs/autoinstall_samples/autoinstall.conf_sample.php @@ -29,7 +29,7 @@ $autoinstall['ssl_cert_email'] = 'hostmaster@'.$autoinstall['hostname']; /* optional expert mode settings, needed only for expert mode */ $autoinstall['mysql_ispconfig_user'] = 'ispconfig'; // default: ispconfig -$autoinstall['mysql_ispconfig_password'] = md5(uniqid(rand())); +$autoinstall['mysql_ispconfig_password'] = bin2hex(random_bytes(20)); $autoinstall['join_multiserver_setup'] = 'n'; // y, n (default) $autoinstall['mysql_master_hostname'] = 'master.example.com'; $autoinstall['mysql_master_root_user'] = 'root'; @@ -70,4 +70,4 @@ $autoupdate['svc_detect_change_firewall_server'] = 'yes'; // yes (default), no $autoupdate['svc_detect_change_vserver_server'] = 'yes'; // yes (default), no $autoupdate['svc_detect_change_db_server'] = 'yes'; // yes (default), no -?> \ No newline at end of file +?> diff --git a/helper_scripts/cert_check.sh b/helper_scripts/cert_check.sh new file mode 100644 index 0000000000000000000000000000000000000000..148ab59f7aa20abf5babb259c29299700096071c --- /dev/null +++ b/helper_scripts/cert_check.sh @@ -0,0 +1,66 @@ +#!/bin/bash + +chkdata() { + F=$1 + CRT=$2 + KEY=$3 + if [[ "$CRT" != "" && "$KEY" != "" ]] ; then + if [[ ! -f "$CRT" ]] ; then + echo "[WARN] CERTIFICATE FILE ${CRT} MISSING FOR ${F}" ; + else + echo -n "Checking ${CRT}" ; + CHK=$(openssl x509 -in "${CRT}" -text -noout >/dev/null 2>&1 ; echo $?); + if [[ $CHK -ne 0 ]] ; then + echo " FAILED!" ; + else + echo " OK" ; + fi + fi + if [[ ! -f "$KEY" ]] ; then + echo "[WARN] KEY FILE ${KEY} MISSING FOR ${F}" ; + else + echo -n "Checking ${KEY}" ; + CHK=$(openssl rsa -in "${KEY}" -check -noout >/dev/null 2>&1 ; echo $?); + if [[ $CHK -ne 0 ]] ; then + echo " FAILED!" ; + else + echo " OK" ; + fi + fi + + if [[ -f "$CRT" && -f "$KEY" ]] ; then + echo -n "Checking that key and certificate match"; + MDCRT=$(openssl x509 -noout -modulus -in "${CRT}" | openssl md5) ; + MDKEY=$(openssl rsa -noout -modulus -in "${KEY}" | openssl md5) ; + if [[ "$MDCRT" != "$MDKEY" ]] ; then + echo " FAILED!" ; + else + echo " OK" ; + fi + fi + echo "---" ; + elif [[ "$CRT" != "" || "$KEY" != "" ]] ; then + echo "[WARN] Check SSL config of ${F}"; + echo "---" ; + fi +} + +if [[ -d /etc/apache2/sites-enabled ]] ; then + echo "Checking enabled apache vhosts" ; + for FIL in /etc/apache2/sites-enabled/* ; do + CRT=$(grep 'SSLCertificateFile' "${FIL}" | grep -E -v '^[[:space:]]*#' | awk '{print $2}' | head -n 1) ; + KEY=$(grep 'SSLCertificateKeyFile' "${FIL}" | grep -E -v '^[[:space:]]*#' | awk '{print $2}' | head -n 1) ; + chkdata "$FIL" "$CRT" "$KEY" ; + done +fi + +if [[ -d /etc/nginx/sites-enabled ]] ; then + echo "Checking enabled nginx vhosts" ; + for FIL in /etc/nginx/sites-enabled/* ; do + CRT=$(grep 'ssl_certificate' "${FIL}" | grep -E -v '^[[:space:]]*#' | awk '{print $2}' | head -n 1) ; + CRT=${CRT%;} + KEY=$(grep 'ssl_certificate_key' "${FIL}" | grep -E -v '^[[:space:]]*#' | awk '{print $2}' | head -n 1) ; + KEY=${KEY%;} + chkdata "$FIL" "$CRT" "$KEY" ; + done +fi \ No newline at end of file diff --git a/install/dist/conf/centos52.conf.php b/install/dist/conf/centos52.conf.php index 12044d3ce07d36d42e166c961c4939b4d82ba01f..9a7e2d0cadfd8e64cbb6e411f18446812237ea9e 100644 --- a/install/dist/conf/centos52.conf.php +++ b/install/dist/conf/centos52.conf.php @@ -147,6 +147,11 @@ $conf['amavis']['installed'] = false; // will be detected automatically during i $conf['amavis']['config_dir'] = '/etc'; $conf['amavis']['init_script'] = 'amavisd'; +//* Rspamd +$conf['rspamd']['installed'] = false; // will be detected automatically during installation +$conf['rspamd']['config_dir'] = '/etc/rspamd'; +$conf['rspamd']['init_script'] = 'rspamd'; + //* ClamAV $conf['clamav']['installed'] = false; // will be detected automatically during installation $conf['clamav']['init_script'] = 'clamd'; @@ -216,4 +221,7 @@ $conf['cron']['wget'] = '/usr/bin/wget'; //* OpenVZ $conf['openvz']['installed'] = false; +// AppArmor +$conf['apparmor']['installed'] = false; + ?> diff --git a/install/dist/conf/centos53.conf.php b/install/dist/conf/centos53.conf.php index 12044d3ce07d36d42e166c961c4939b4d82ba01f..9a7e2d0cadfd8e64cbb6e411f18446812237ea9e 100644 --- a/install/dist/conf/centos53.conf.php +++ b/install/dist/conf/centos53.conf.php @@ -147,6 +147,11 @@ $conf['amavis']['installed'] = false; // will be detected automatically during i $conf['amavis']['config_dir'] = '/etc'; $conf['amavis']['init_script'] = 'amavisd'; +//* Rspamd +$conf['rspamd']['installed'] = false; // will be detected automatically during installation +$conf['rspamd']['config_dir'] = '/etc/rspamd'; +$conf['rspamd']['init_script'] = 'rspamd'; + //* ClamAV $conf['clamav']['installed'] = false; // will be detected automatically during installation $conf['clamav']['init_script'] = 'clamd'; @@ -216,4 +221,7 @@ $conf['cron']['wget'] = '/usr/bin/wget'; //* OpenVZ $conf['openvz']['installed'] = false; +// AppArmor +$conf['apparmor']['installed'] = false; + ?> diff --git a/install/dist/conf/centos70.conf.php b/install/dist/conf/centos70.conf.php index 0465e5618a0a33e6e4dc27813b237356c275d090..efe166e0791214cc26afc6768712a14283c31c2a 100644 --- a/install/dist/conf/centos70.conf.php +++ b/install/dist/conf/centos70.conf.php @@ -221,4 +221,7 @@ $conf['cron']['wget'] = '/usr/bin/wget'; //* OpenVZ $conf['openvz']['installed'] = false; +// AppArmor +$conf['apparmor']['installed'] = false; + ?> diff --git a/install/dist/conf/centos72.conf.php b/install/dist/conf/centos72.conf.php index 8bb2ca5239875b47d37a36a7ca940517f8091b57..f4a3c937baf7e1bcb42ae5701605458e1465a2af 100644 --- a/install/dist/conf/centos72.conf.php +++ b/install/dist/conf/centos72.conf.php @@ -224,4 +224,7 @@ $conf['cron']['wget'] = '/usr/bin/wget'; //* OpenVZ $conf['openvz']['installed'] = false; +// AppArmor +$conf['apparmor']['installed'] = false; + ?> diff --git a/install/dist/conf/centos80.conf.php b/install/dist/conf/centos80.conf.php index 0411fb9ce5e95238cf29c0cf1afb374cd5458209..1a354d3644f0033739b79a8406ac9a2d188b7c41 100644 --- a/install/dist/conf/centos80.conf.php +++ b/install/dist/conf/centos80.conf.php @@ -63,14 +63,14 @@ $conf['mysql']['admin_user'] = 'root'; $conf['mysql']['admin_password'] = ''; $conf['mysql']['charset'] = 'utf8'; $conf['mysql']['ispconfig_user'] = 'ispconfig'; -$conf['mysql']['ispconfig_password'] = md5(uniqid(rand())); +$conf['mysql']['ispconfig_password'] = md5(random_bytes(20)); $conf['mysql']['master_slave_setup'] = 'n'; $conf['mysql']['master_host'] = ''; $conf['mysql']['master_database'] = 'dbispconfig'; $conf['mysql']['master_admin_user'] = 'root'; $conf['mysql']['master_admin_password'] = ''; $conf['mysql']['master_ispconfig_user'] = ''; -$conf['mysql']['master_ispconfig_password'] = md5(uniqid(rand())); +$conf['mysql']['master_ispconfig_password'] = md5(random_bytes(20)); //* Apache $conf['apache']['installed'] = false; // will be detected automatically during installation @@ -224,4 +224,7 @@ $conf['cron']['wget'] = '/usr/bin/wget'; //* OpenVZ $conf['openvz']['installed'] = false; +// AppArmor +$conf['apparmor']['installed'] = false; + ?> diff --git a/install/dist/conf/debian100.conf.php b/install/dist/conf/debian100.conf.php index 28d82b80794fad567dec6720a890596bd4838bcb..30f483980aad9cf651d70f2ca507085ece7d2814 100644 --- a/install/dist/conf/debian100.conf.php +++ b/install/dist/conf/debian100.conf.php @@ -65,14 +65,14 @@ $conf['mysql']['admin_user'] = 'root'; $conf['mysql']['admin_password'] = ''; $conf['mysql']['charset'] = 'utf8'; $conf['mysql']['ispconfig_user'] = 'ispconfig'; -$conf['mysql']['ispconfig_password'] = md5(uniqid(rand())); +$conf['mysql']['ispconfig_password'] = md5(random_bytes(20)); $conf['mysql']['master_slave_setup'] = 'n'; $conf['mysql']['master_host'] = ''; $conf['mysql']['master_database'] = 'dbispconfig'; $conf['mysql']['master_admin_user'] = 'root'; $conf['mysql']['master_admin_password'] = ''; $conf['mysql']['master_ispconfig_user'] = ''; -$conf['mysql']['master_ispconfig_password'] = md5(uniqid(rand())); +$conf['mysql']['master_ispconfig_password'] = md5(random_bytes(20)); //* Apache $conf['apache']['installed'] = false; // will be detected automatically during installation @@ -153,6 +153,11 @@ $conf['amavis']['installed'] = false; // will be detected automatically during i $conf['amavis']['config_dir'] = '/etc/amavis'; $conf['amavis']['init_script'] = 'amavis'; +//* Rspamd +$conf['rspamd']['installed'] = false; // will be detected automatically during installation +$conf['rspamd']['config_dir'] = '/etc/rspamd'; +$conf['rspamd']['init_script'] = 'rspamd'; + //* ClamAV $conf['clamav']['installed'] = false; // will be detected automatically during installation $conf['clamav']['init_script'] = 'clamav-daemon'; @@ -231,4 +236,7 @@ $conf['xmpp']['installed'] = false; $conf['xmpp']['init_script'] = 'metronome'; +// AppArmor +$conf['apparmor']['installed'] = false; + ?> diff --git a/install/dist/conf/debian110.conf.php b/install/dist/conf/debian110.conf.php new file mode 100644 index 0000000000000000000000000000000000000000..ce5bda7170aae2a3db322c9dd43650d67c462ef0 --- /dev/null +++ b/install/dist/conf/debian110.conf.php @@ -0,0 +1,242 @@ +<?php + +/* +Copyright (c) 2021, Till Brehm, ISPConfig UG +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of ISPConfig nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +//*** Debian 11 default settings + +//* Main +$conf['language'] = 'en'; +$conf['distname'] = 'debian110'; +$conf['hostname'] = 'server1.domain.tld'; // Full hostname +$conf['ispconfig_install_dir'] = '/usr/local/ispconfig'; +$conf['ispconfig_config_dir'] = '/usr/local/ispconfig'; +$conf['ispconfig_log_priority'] = 2; // 0 = Debug, 1 = Warning, 2 = Error +$conf['ispconfig_log_dir'] = '/var/log/ispconfig'; +$conf['server_id'] = 1; +$conf['init_scripts'] = '/etc/init.d'; +$conf['runlevel'] = '/etc'; +$conf['shells'] = '/etc/shells'; +$conf['pam'] = '/etc/pam.d'; + +//* Services provided by this server, this selection will be overridden by the expert mode +$conf['services']['mail'] = true; +$conf['services']['web'] = true; +$conf['services']['dns'] = true; +$conf['services']['file'] = true; +$conf['services']['db'] = true; +$conf['services']['vserver'] = true; +$conf['services']['proxy'] = false; +$conf['services']['firewall'] = false; + +//* MySQL +$conf['mysql']['installed'] = false; // will be detected automatically during installation +$conf['mysql']['init_script'] = 'mysql'; +$conf['mysql']['host'] = 'localhost'; +$conf['mysql']['ip'] = '127.0.0.1'; +$conf['mysql']['port'] = '3306'; +$conf['mysql']['database'] = 'dbispconfig'; +$conf['mysql']['admin_user'] = 'root'; +$conf['mysql']['admin_password'] = ''; +$conf['mysql']['charset'] = 'utf8'; +$conf['mysql']['ispconfig_user'] = 'ispconfig'; +$conf['mysql']['ispconfig_password'] = md5(random_bytes(20)); +$conf['mysql']['master_slave_setup'] = 'n'; +$conf['mysql']['master_host'] = ''; +$conf['mysql']['master_database'] = 'dbispconfig'; +$conf['mysql']['master_admin_user'] = 'root'; +$conf['mysql']['master_admin_password'] = ''; +$conf['mysql']['master_ispconfig_user'] = ''; +$conf['mysql']['master_ispconfig_password'] = md5(random_bytes(20)); + +//* Apache +$conf['apache']['installed'] = false; // will be detected automatically during installation +$conf['apache']['user'] = 'www-data'; +$conf['apache']['group'] = 'www-data'; +$conf['apache']['init_script'] = 'apache2'; +$conf['apache']['version'] = '2.4'; +$conf['apache']['vhost_conf_dir'] = '/etc/apache2/sites-available'; +$conf['apache']['vhost_conf_enabled_dir'] = '/etc/apache2/sites-enabled'; +$conf['apache']['vhost_port'] = '8080'; +$conf['apache']['php_ini_path_apache'] = '/etc/php/7.4/apache2/php.ini'; +$conf['apache']['php_ini_path_cgi'] = '/etc/php/7.4/cgi/php.ini'; + +//* Website base settings +$conf['web']['website_basedir'] = '/var/www'; +$conf['web']['website_path'] = '/var/www/clients/client[client_id]/web[website_id]'; +$conf['web']['website_symlinks'] = '/var/www/[website_domain]/:/var/www/clients/client[client_id]/[website_domain]/'; + +//* Apps base settings +$conf['web']['apps_vhost_ip'] = '_default_'; +$conf['web']['apps_vhost_port'] = '8081'; +$conf['web']['apps_vhost_servername'] = ''; +$conf['web']['apps_vhost_user'] = 'ispapps'; +$conf['web']['apps_vhost_group'] = 'ispapps'; + +//* Fastcgi +$conf['fastcgi']['fastcgi_phpini_path'] = '/etc/php/7.4/cgi/'; +$conf['fastcgi']['fastcgi_starter_path'] = '/var/www/php-fcgi-scripts/[system_user]/'; +$conf['fastcgi']['fastcgi_bin'] = '/usr/bin/php-cgi'; + +//* Postfix +$conf['postfix']['installed'] = false; // will be detected automatically during installation +$conf['postfix']['config_dir'] = '/etc/postfix'; +$conf['postfix']['init_script'] = 'postfix'; +$conf['postfix']['user'] = 'postfix'; +$conf['postfix']['group'] = 'postfix'; +$conf['postfix']['vmail_userid'] = '5000'; +$conf['postfix']['vmail_username'] = 'vmail'; +$conf['postfix']['vmail_groupid'] = '5000'; +$conf['postfix']['vmail_groupname'] = 'vmail'; +$conf['postfix']['vmail_mailbox_base'] = '/var/vmail'; + +//* Mailman +$conf['mailman']['installed'] = false; // will be detected automatically during installation +$conf['mailman']['config_dir'] = '/etc/mailman'; +$conf['mailman']['init_script'] = 'mailman'; + +//* mlmmj +$conf['mlmmj']['installed'] = false; // will be detected automatically during installation +$conf['mlmmj']['config_dir'] = '/etc/mlmmj'; + +//* Getmail +$conf['getmail']['installed'] = false; // will be detected automatically during installation +$conf['getmail']['config_dir'] = '/etc/getmail'; +$conf['getmail']['program'] = '/usr/bin/getmail'; + +//* Courier +$conf['courier']['installed'] = false; // will be detected automatically during installation +$conf['courier']['config_dir'] = '/etc/courier'; +$conf['courier']['courier-authdaemon'] = 'courier-authdaemon'; +$conf['courier']['courier-imap'] = 'courier-imap'; +$conf['courier']['courier-imap-ssl'] = 'courier-imap-ssl'; +$conf['courier']['courier-pop'] = 'courier-pop'; +$conf['courier']['courier-pop-ssl'] = 'courier-pop-ssl'; + +//* Dovecot +$conf['dovecot']['installed'] = false; // will be detected automatically during installation +$conf['dovecot']['config_dir'] = '/etc/dovecot'; +$conf['dovecot']['init_script'] = 'dovecot'; + +//* SASL +$conf['saslauthd']['installed'] = false; // will be detected automatically during installation +$conf['saslauthd']['config'] = '/etc/default/saslauthd'; +$conf['saslauthd']['init_script'] = 'saslauthd'; + +//* Amavisd +$conf['amavis']['installed'] = false; // will be detected automatically during installation +$conf['amavis']['config_dir'] = '/etc/amavis'; +$conf['amavis']['init_script'] = 'amavis'; + +//* Rspamd +$conf['rspamd']['installed'] = false; // will be detected automatically during installation +$conf['rspamd']['config_dir'] = '/etc/rspamd'; +$conf['rspamd']['init_script'] = 'rspamd'; + +//* ClamAV +$conf['clamav']['installed'] = false; // will be detected automatically during installation +$conf['clamav']['init_script'] = 'clamav-daemon'; + +//* Pureftpd +$conf['pureftpd']['installed'] = false; // will be detected automatically during installation +$conf['pureftpd']['config_dir'] = '/etc/pure-ftpd'; +$conf['pureftpd']['init_script'] = 'pure-ftpd-mysql'; + +//* MyDNS +$conf['mydns']['installed'] = false; // will be detected automatically during installation +$conf['mydns']['config_dir'] = '/etc'; +$conf['mydns']['init_script'] = 'mydns'; + +//* PowerDNS +$conf['powerdns']['installed'] = false; // will be detected automatically during installation +$conf['powerdns']['database'] = 'powerdns'; +$conf["powerdns"]["config_dir"] = '/etc/powerdns/pdns.d'; +$conf['powerdns']['init_script'] = 'pdns'; + +//* BIND DNS Server +$conf['bind']['installed'] = false; // will be detected automatically during installation +$conf['bind']['bind_user'] = 'root'; +$conf['bind']['bind_group'] = 'bind'; +$conf['bind']['bind_zonefiles_dir'] = '/etc/bind'; +$conf['bind']['named_conf_path'] = '/etc/bind/named.conf'; +$conf['bind']['named_conf_local_path'] = '/etc/bind/named.conf.local'; +$conf['bind']['init_script'] = 'bind9'; + +//* Jailkit +$conf['jailkit']['installed'] = false; // will be detected automatically during installation +$conf['jailkit']['config_dir'] = '/etc/jailkit'; +$conf['jailkit']['jk_init'] = 'jk_init.ini'; +$conf['jailkit']['jk_chrootsh'] = 'jk_chrootsh.ini'; +$conf['jailkit']['jailkit_chroot_app_programs'] = '/usr/bin/groups /usr/bin/id /usr/bin/dircolors /usr/bin/lesspipe /usr/bin/basename /usr/bin/dirname /usr/bin/nano /usr/bin/pico /usr/bin/mysql /usr/bin/mysqldump /usr/bin/git /usr/bin/git-receive-pack /usr/bin/git-upload-pack /usr/bin/unzip /usr/bin/zip /bin/tar /bin/rm /usr/bin/patch'; +$conf['jailkit']['jailkit_chroot_cron_programs'] = '/usr/bin/php /usr/bin/perl /usr/share/perl /usr/share/php'; + +//* Squid +$conf['squid']['installed'] = false; // will be detected automatically during installation +$conf['squid']['config_dir'] = '/etc/squid'; +$conf['squid']['init_script'] = 'squid'; + +//* Nginx +$conf['nginx']['installed'] = false; // will be detected automatically during installation +$conf['nginx']['user'] = 'www-data'; +$conf['nginx']['group'] = 'www-data'; +$conf['nginx']['config_dir'] = '/etc/nginx'; +$conf['nginx']['vhost_conf_dir'] = '/etc/nginx/sites-available'; +$conf['nginx']['vhost_conf_enabled_dir'] = '/etc/nginx/sites-enabled'; +$conf['nginx']['init_script'] = 'nginx'; +$conf['nginx']['vhost_port'] = '8080'; +$conf['nginx']['cgi_socket'] = '/var/run/fcgiwrap.socket'; +$conf['nginx']['php_fpm_init_script'] = 'php7.4-fpm'; +$conf['nginx']['php_fpm_ini_path'] = '/etc/php/7.4/fpm/php.ini'; +$conf['nginx']['php_fpm_pool_dir'] = '/etc/php/7.4/fpm/pool.d'; +$conf['nginx']['php_fpm_start_port'] = 9010; +$conf['nginx']['php_fpm_socket_dir'] = '/var/lib/php7.4-fpm'; + +//* OpenVZ +$conf['openvz']['installed'] = false; + +//*Bastille-Firwall +$conf['bastille']['installed'] = false; +$conf['bastille']['config_dir'] = '/etc/Bastille'; + +//* vlogger +$conf['vlogger']['config_dir'] = '/etc'; + +//* cron +$conf['cron']['init_script'] = 'cron'; +$conf['cron']['crontab_dir'] = '/etc/cron.d'; +$conf['cron']['wget'] = '/usr/bin/wget'; + +//* Metronome XMPP +$conf['xmpp']['installed'] = false; +$conf['xmpp']['init_script'] = 'metronome'; + + +// AppArmor +$conf['apparmor']['installed'] = false; + +?> diff --git a/install/dist/conf/debian40.conf.php b/install/dist/conf/debian40.conf.php index c04a54e998e5224e6d061937527184e18b27cc34..653b979a6735aef6823fc5a8ad0af603ec65e90c 100644 --- a/install/dist/conf/debian40.conf.php +++ b/install/dist/conf/debian40.conf.php @@ -229,4 +229,7 @@ $conf['cron']['wget'] = '/usr/bin/wget'; $conf['openvz']['installed'] = false; +// AppArmor +$conf['apparmor']['installed'] = false; + ?> diff --git a/install/dist/conf/debian60.conf.php b/install/dist/conf/debian60.conf.php index e7c8f59845f5cf4b957c5c5fc791f61990ce493f..3577869bcd908616b54c7d4eb67756e01008f526 100644 --- a/install/dist/conf/debian60.conf.php +++ b/install/dist/conf/debian60.conf.php @@ -232,4 +232,7 @@ $conf['xmpp']['installed'] = false; $conf['xmpp']['init_script'] = 'metronome'; +// AppArmor +$conf['apparmor']['installed'] = false; + ?> diff --git a/install/dist/conf/debian90.conf.php b/install/dist/conf/debian90.conf.php index e5d1d8a9b4f43c767ee5520b3cb61ce9d6f29424..1abbf732a1201da6d2ef036bc5c60f8affdb7d83 100644 --- a/install/dist/conf/debian90.conf.php +++ b/install/dist/conf/debian90.conf.php @@ -65,14 +65,14 @@ $conf['mysql']['admin_user'] = 'root'; $conf['mysql']['admin_password'] = ''; $conf['mysql']['charset'] = 'utf8'; $conf['mysql']['ispconfig_user'] = 'ispconfig'; -$conf['mysql']['ispconfig_password'] = md5(uniqid(rand())); +$conf['mysql']['ispconfig_password'] = md5(random_bytes(20)); $conf['mysql']['master_slave_setup'] = 'n'; $conf['mysql']['master_host'] = ''; $conf['mysql']['master_database'] = 'dbispconfig'; $conf['mysql']['master_admin_user'] = 'root'; $conf['mysql']['master_admin_password'] = ''; $conf['mysql']['master_ispconfig_user'] = ''; -$conf['mysql']['master_ispconfig_password'] = md5(uniqid(rand())); +$conf['mysql']['master_ispconfig_password'] = md5(random_bytes(20)); //* Apache $conf['apache']['installed'] = false; // will be detected automatically during installation @@ -236,4 +236,7 @@ $conf['xmpp']['installed'] = false; $conf['xmpp']['init_script'] = 'metronome'; +// AppArmor +$conf['apparmor']['installed'] = false; + ?> diff --git a/install/dist/conf/debiantesting.conf.php b/install/dist/conf/debiantesting.conf.php index 6ea9112dff854e87e39fac2c521d48cecf5fe840..6564be0dab1be4dc5924ce9157a15496459b65c5 100644 --- a/install/dist/conf/debiantesting.conf.php +++ b/install/dist/conf/debiantesting.conf.php @@ -32,7 +32,7 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. //* Main $conf['language'] = 'en'; -$conf['distname'] = 'debian100'; +$conf['distname'] = 'debian110'; $conf['hostname'] = 'server1.domain.tld'; // Full hostname $conf['ispconfig_install_dir'] = '/usr/local/ispconfig'; $conf['ispconfig_config_dir'] = '/usr/local/ispconfig'; @@ -65,14 +65,14 @@ $conf['mysql']['admin_user'] = 'root'; $conf['mysql']['admin_password'] = ''; $conf['mysql']['charset'] = 'utf8'; $conf['mysql']['ispconfig_user'] = 'ispconfig'; -$conf['mysql']['ispconfig_password'] = md5(uniqid(rand())); +$conf['mysql']['ispconfig_password'] = md5(random_bytes(20)); $conf['mysql']['master_slave_setup'] = 'n'; $conf['mysql']['master_host'] = ''; $conf['mysql']['master_database'] = 'dbispconfig'; $conf['mysql']['master_admin_user'] = 'root'; $conf['mysql']['master_admin_password'] = ''; $conf['mysql']['master_ispconfig_user'] = ''; -$conf['mysql']['master_ispconfig_password'] = md5(uniqid(rand())); +$conf['mysql']['master_ispconfig_password'] = md5(random_bytes(20)); //* Apache $conf['apache']['installed'] = false; // will be detected automatically during installation @@ -83,8 +83,8 @@ $conf['apache']['version'] = '2.4'; $conf['apache']['vhost_conf_dir'] = '/etc/apache2/sites-available'; $conf['apache']['vhost_conf_enabled_dir'] = '/etc/apache2/sites-enabled'; $conf['apache']['vhost_port'] = '8080'; -$conf['apache']['php_ini_path_apache'] = '/etc/php/7.3/apache2/php.ini'; -$conf['apache']['php_ini_path_cgi'] = '/etc/php/7.3/cgi/php.ini'; +$conf['apache']['php_ini_path_apache'] = '/etc/php/7.4/apache2/php.ini'; +$conf['apache']['php_ini_path_cgi'] = '/etc/php/7.4/cgi/php.ini'; //* Website base settings $conf['web']['website_basedir'] = '/var/www'; @@ -99,7 +99,7 @@ $conf['web']['apps_vhost_user'] = 'ispapps'; $conf['web']['apps_vhost_group'] = 'ispapps'; //* Fastcgi -$conf['fastcgi']['fastcgi_phpini_path'] = '/etc/php/7.3/cgi/'; +$conf['fastcgi']['fastcgi_phpini_path'] = '/etc/php/7.4/cgi/'; $conf['fastcgi']['fastcgi_starter_path'] = '/var/www/php-fcgi-scripts/[system_user]/'; $conf['fastcgi']['fastcgi_bin'] = '/usr/bin/php-cgi'; @@ -210,11 +210,11 @@ $conf['nginx']['vhost_conf_enabled_dir'] = '/etc/nginx/sites-enabled'; $conf['nginx']['init_script'] = 'nginx'; $conf['nginx']['vhost_port'] = '8080'; $conf['nginx']['cgi_socket'] = '/var/run/fcgiwrap.socket'; -$conf['nginx']['php_fpm_init_script'] = 'php7.3-fpm'; -$conf['nginx']['php_fpm_ini_path'] = '/etc/php/7.3/fpm/php.ini'; -$conf['nginx']['php_fpm_pool_dir'] = '/etc/php/7.3/fpm/pool.d'; +$conf['nginx']['php_fpm_init_script'] = 'php7.4-fpm'; +$conf['nginx']['php_fpm_ini_path'] = '/etc/php/7.4/fpm/php.ini'; +$conf['nginx']['php_fpm_pool_dir'] = '/etc/php/7.4/fpm/pool.d'; $conf['nginx']['php_fpm_start_port'] = 9010; -$conf['nginx']['php_fpm_socket_dir'] = '/var/lib/php7.3-fpm'; +$conf['nginx']['php_fpm_socket_dir'] = '/var/lib/php7.4-fpm'; //* OpenVZ $conf['openvz']['installed'] = false; @@ -236,4 +236,7 @@ $conf['xmpp']['installed'] = false; $conf['xmpp']['init_script'] = 'metronome'; +// AppArmor +$conf['apparmor']['installed'] = false; + ?> diff --git a/install/dist/conf/fedora32.conf.php b/install/dist/conf/fedora32.conf.php index 6701bb8729f66efaf198deed3b2037bc15475049..0280959988e0a2a8ef4ad57d354580dd350aba17 100644 --- a/install/dist/conf/fedora32.conf.php +++ b/install/dist/conf/fedora32.conf.php @@ -226,4 +226,7 @@ $conf['cron']['wget'] = '/usr/bin/wget'; //* OpenVZ $conf['openvz']['installed'] = false; +// AppArmor +$conf['apparmor']['installed'] = false; + ?> diff --git a/install/dist/conf/fedora33.conf.php b/install/dist/conf/fedora33.conf.php index 873376fa2cc5ddfbb1dcb63a360040083f196d32..677731c01e20c4c184218777e3c6e55f1b303b5e 100644 --- a/install/dist/conf/fedora33.conf.php +++ b/install/dist/conf/fedora33.conf.php @@ -226,4 +226,7 @@ $conf['cron']['wget'] = '/usr/bin/wget'; //* OpenVZ $conf['openvz']['installed'] = false; +// AppArmor +$conf['apparmor']['installed'] = false; + ?> diff --git a/install/dist/conf/fedora9.conf.php b/install/dist/conf/fedora9.conf.php index 19c9a4f6259600499d493c66718cf64bb7ff0a13..c05d21a155ee3545dafab4fb647b62d81bada6d8 100644 --- a/install/dist/conf/fedora9.conf.php +++ b/install/dist/conf/fedora9.conf.php @@ -154,7 +154,7 @@ $conf['rspamd']['init_script'] = 'rspamd'; //* ClamAV $conf['clamav']['installed'] = false; // will be detected automatically during installation -$conf['clamav']['init_script'] = 'clamd.amavisd'; +$conf['clamav']['init_script'] = 'clamd@amavisd'; //* Pureftpd $conf['pureftpd']['installed'] = false; // will be detected automatically during installation @@ -221,4 +221,7 @@ $conf['cron']['wget'] = '/usr/bin/wget'; //* OpenVZ $conf['openvz']['installed'] = false; +// AppArmor +$conf['apparmor']['installed'] = false; + ?> diff --git a/install/dist/conf/gentoo.conf.php b/install/dist/conf/gentoo.conf.php index 24c7d0633e0b5b62db4004f329e83d503fb66aad..057d397796d931fe54a7a962227be66fe03a95e0 100644 --- a/install/dist/conf/gentoo.conf.php +++ b/install/dist/conf/gentoo.conf.php @@ -63,14 +63,14 @@ $conf['mysql']['admin_user'] = 'root'; $conf['mysql']['admin_password'] = ''; $conf['mysql']['charset'] = 'utf8'; $conf['mysql']['ispconfig_user'] = 'ispconfig'; -$conf['mysql']['ispconfig_password'] = md5(uniqid(rand())); +$conf['mysql']['ispconfig_password'] = md5(random_bytes(20)); $conf['mysql']['master_slave_setup'] = 'n'; $conf['mysql']['master_host'] = ''; $conf['mysql']['master_database'] = 'dbispconfig'; $conf['mysql']['master_admin_user'] = 'root'; $conf['mysql']['master_admin_password'] = ''; $conf['mysql']['master_ispconfig_user'] = ''; -$conf['mysql']['master_ispconfig_password'] = md5(uniqid(rand())); +$conf['mysql']['master_ispconfig_password'] = md5(random_bytes(20)); //* SuPHP $conf['suphp']['config_file'] = '/etc/suphp.conf'; @@ -238,4 +238,7 @@ $conf['cron']['wget'] = '/usr/bin/wget'; //* OpenVZ $conf['openvz']['installed'] = false; +// AppArmor +$conf['apparmor']['installed'] = false; + ?> diff --git a/install/dist/conf/opensuse110.conf.php b/install/dist/conf/opensuse110.conf.php index e389c3b2a0ea727d619b453c477ef0a8f0964122..ac4f5a3e1850cf708199050e80d8c2bbdee2916d 100644 --- a/install/dist/conf/opensuse110.conf.php +++ b/install/dist/conf/opensuse110.conf.php @@ -147,6 +147,11 @@ $conf['amavis']['installed'] = false; // will be detected automatically during i $conf['amavis']['config_dir'] = '/etc/amavis'; $conf['amavis']['init_script'] = 'amavis'; +//* Rspamd +$conf['rspamd']['installed'] = false; // will be detected automatically during installation +$conf['rspamd']['config_dir'] = '/etc/rspamd'; +$conf['rspamd']['init_script'] = 'rspamd'; + //* ClamAV $conf['clamav']['installed'] = false; // will be detected automatically during installation $conf['clamav']['init_script'] = 'clamd'; @@ -216,4 +221,7 @@ $conf['cron']['wget'] = '/usr/bin/wget';; //* OpenVZ $conf['openvz']['installed'] = false; +// AppArmor +$conf['apparmor']['installed'] = false; + ?> diff --git a/install/dist/conf/opensuse112.conf.php b/install/dist/conf/opensuse112.conf.php index 378320a144eb645262d39e645a1e994d7d2823d7..eda4879004b23af81d6c9db6127b6c1b94697ba6 100644 --- a/install/dist/conf/opensuse112.conf.php +++ b/install/dist/conf/opensuse112.conf.php @@ -221,4 +221,7 @@ $conf['cron']['wget'] = '/usr/bin/wget'; //* OpenVZ $conf['openvz']['installed'] = false; +// AppArmor +$conf['apparmor']['installed'] = false; + ?> diff --git a/install/dist/conf/ubuntu1604.conf.php b/install/dist/conf/ubuntu1604.conf.php index 0d3fe23bada198df3c9aae42b6cb42784973a6c1..1893a93fbf09516e25b3e2cc0f2cbc6f22f7c187 100644 --- a/install/dist/conf/ubuntu1604.conf.php +++ b/install/dist/conf/ubuntu1604.conf.php @@ -65,14 +65,14 @@ $conf['mysql']['admin_user'] = 'root'; $conf['mysql']['admin_password'] = ''; $conf['mysql']['charset'] = 'utf8'; $conf['mysql']['ispconfig_user'] = 'ispconfig'; -$conf['mysql']['ispconfig_password'] = md5(uniqid(rand())); +$conf['mysql']['ispconfig_password'] = md5(random_bytes(20)); $conf['mysql']['master_slave_setup'] = 'n'; $conf['mysql']['master_host'] = ''; $conf['mysql']['master_database'] = 'dbispconfig'; $conf['mysql']['master_admin_user'] = 'root'; $conf['mysql']['master_admin_password'] = ''; $conf['mysql']['master_ispconfig_user'] = ''; -$conf['mysql']['master_ispconfig_password'] = md5(uniqid(rand())); +$conf['mysql']['master_ispconfig_password'] = md5(random_bytes(20)); //* Apache $conf['apache']['installed'] = false; // will be detected automatically during installation @@ -232,4 +232,7 @@ $conf['xmpp']['installed'] = false; $conf['xmpp']['init_script'] = 'metronome'; +// AppArmor +$conf['apparmor']['installed'] = false; + ?> diff --git a/install/dist/conf/ubuntu1710.conf.php b/install/dist/conf/ubuntu1710.conf.php index 0730f8f2d533c712ee78173ebb28b3fed477c514..b37c91291f2182fd4cc7b506f4b657cc8c3608fd 100644 --- a/install/dist/conf/ubuntu1710.conf.php +++ b/install/dist/conf/ubuntu1710.conf.php @@ -65,14 +65,14 @@ $conf['mysql']['admin_user'] = 'root'; $conf['mysql']['admin_password'] = ''; $conf['mysql']['charset'] = 'utf8'; $conf['mysql']['ispconfig_user'] = 'ispconfig'; -$conf['mysql']['ispconfig_password'] = md5(uniqid(rand())); +$conf['mysql']['ispconfig_password'] = md5(random_bytes(20)); $conf['mysql']['master_slave_setup'] = 'n'; $conf['mysql']['master_host'] = ''; $conf['mysql']['master_database'] = 'dbispconfig'; $conf['mysql']['master_admin_user'] = 'root'; $conf['mysql']['master_admin_password'] = ''; $conf['mysql']['master_ispconfig_user'] = ''; -$conf['mysql']['master_ispconfig_password'] = md5(uniqid(rand())); +$conf['mysql']['master_ispconfig_password'] = md5(random_bytes(20)); //* Apache $conf['apache']['installed'] = false; // will be detected automatically during installation @@ -232,4 +232,7 @@ $conf['xmpp']['installed'] = false; $conf['xmpp']['init_script'] = 'metronome'; +// AppArmor +$conf['apparmor']['installed'] = false; + ?> diff --git a/install/dist/conf/ubuntu1804.conf.php b/install/dist/conf/ubuntu1804.conf.php index 2a09f787db46f5abf8fc7d2e15e4804dfe9d3222..9c2721141329f762368f14003efd67243b6f3c14 100644 --- a/install/dist/conf/ubuntu1804.conf.php +++ b/install/dist/conf/ubuntu1804.conf.php @@ -65,14 +65,14 @@ $conf['mysql']['admin_user'] = 'root'; $conf['mysql']['admin_password'] = ''; $conf['mysql']['charset'] = 'utf8'; $conf['mysql']['ispconfig_user'] = 'ispconfig'; -$conf['mysql']['ispconfig_password'] = md5(uniqid(rand())); +$conf['mysql']['ispconfig_password'] = md5(random_bytes(20)); $conf['mysql']['master_slave_setup'] = 'n'; $conf['mysql']['master_host'] = ''; $conf['mysql']['master_database'] = 'dbispconfig'; $conf['mysql']['master_admin_user'] = 'root'; $conf['mysql']['master_admin_password'] = ''; $conf['mysql']['master_ispconfig_user'] = ''; -$conf['mysql']['master_ispconfig_password'] = md5(uniqid(rand())); +$conf['mysql']['master_ispconfig_password'] = md5(random_bytes(20)); //* Apache $conf['apache']['installed'] = false; // will be detected automatically during installation @@ -232,4 +232,7 @@ $conf['xmpp']['installed'] = false; $conf['xmpp']['init_script'] = 'metronome'; +// AppArmor +$conf['apparmor']['installed'] = false; + ?> diff --git a/install/dist/conf/ubuntu2004.conf.php b/install/dist/conf/ubuntu2004.conf.php index fe5a9b083b84db4cd400ef655e9cf5a84170f546..72bf90d45eefb06f65a54ff05c28057f4e5c12f7 100644 --- a/install/dist/conf/ubuntu2004.conf.php +++ b/install/dist/conf/ubuntu2004.conf.php @@ -65,14 +65,14 @@ $conf['mysql']['admin_user'] = 'root'; $conf['mysql']['admin_password'] = ''; $conf['mysql']['charset'] = 'utf8'; $conf['mysql']['ispconfig_user'] = 'ispconfig'; -$conf['mysql']['ispconfig_password'] = md5(uniqid(rand())); +$conf['mysql']['ispconfig_password'] = md5(random_bytes(20)); $conf['mysql']['master_slave_setup'] = 'n'; $conf['mysql']['master_host'] = ''; $conf['mysql']['master_database'] = 'dbispconfig'; $conf['mysql']['master_admin_user'] = 'root'; $conf['mysql']['master_admin_password'] = ''; $conf['mysql']['master_ispconfig_user'] = ''; -$conf['mysql']['master_ispconfig_password'] = md5(uniqid(rand())); +$conf['mysql']['master_ispconfig_password'] = md5(random_bytes(20)); //* Apache $conf['apache']['installed'] = false; // will be detected automatically during installation @@ -232,4 +232,7 @@ $conf['xmpp']['installed'] = false; $conf['xmpp']['init_script'] = 'metronome'; +// AppArmor +$conf['apparmor']['installed'] = false; + ?> diff --git a/install/dist/lib/centos_base.lib.php b/install/dist/lib/centos_base.lib.php index 0fe988439d8098c255bf216489ab6e0053d99e2e..8c71db34a66531ec2cecc8f496ccb2113e4253d1 100644 --- a/install/dist/lib/centos_base.lib.php +++ b/install/dist/lib/centos_base.lib.php @@ -83,31 +83,28 @@ class installer_centos extends installer_dist { $config_dir = $conf['postfix']['config_dir']; - // Adding amavis-services to the master.cf file if the service does not already exists - $add_amavis = !$this->get_postfix_service('amavis','unix'); - $add_amavis_10025 = !$this->get_postfix_service('127.0.0.1:10025','inet'); - $add_amavis_10027 = !$this->get_postfix_service('127.0.0.1:10027','inet'); - - if ($add_amavis || $add_amavis_10025 || $add_amavis_10027) { - //* backup master.cf - if(is_file($config_dir.'/master.cf')) copy($config_dir.'/master.cf', $config_dir.'/master.cf~'); - // adjust amavis-config - if($add_amavis) { - $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis.master', 'tpl/master_cf_amavis.master'); - af($config_dir.'/master.cf', $content); - unset($content); - } - if ($add_amavis_10025) { - $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10025.master', 'tpl/master_cf_amavis10025.master'); - af($config_dir.'/master.cf', $content); - unset($content); - } - if ($add_amavis_10027) { - $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10027.master', 'tpl/master_cf_amavis10027.master'); - af($config_dir.'/master.cf', $content); - unset($content); - } - } + // Adding amavis-services to the master.cf file + + // backup master.cf + if(is_file($config_dir.'/master.cf')) copy($config_dir.'/master.cf', $config_dir.'/master.cf~'); + + // first remove the old service definitions + $this->remove_postfix_service('amavis','unix'); + $this->remove_postfix_service('127.0.0.1:10025','inet'); + $this->remove_postfix_service('127.0.0.1:10027','inet'); + + // then add them back + $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis.master', 'tpl/master_cf_amavis.master'); + af($config_dir.'/master.cf', $content); + unset($content); + + $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10025.master', 'tpl/master_cf_amavis10025.master'); + af($config_dir.'/master.cf', $content); + unset($content); + + $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10027.master', 'tpl/master_cf_amavis10027.master'); + af($config_dir.'/master.cf', $content); + unset($content); removeLine('/etc/sysconfig/freshclam', 'FRESHCLAM_DELAY=disabled-warn # REMOVE ME', 1); replaceLine('/etc/freshclam.conf', 'Example', '# Example', 1); diff --git a/install/dist/lib/debian60.lib.php b/install/dist/lib/debian60.lib.php index 154c6b99c487f7b009cd5b7741111c5617d853d7..981e6cff92a70216656435bddb10a393f01dca54 100644 --- a/install/dist/lib/debian60.lib.php +++ b/install/dist/lib/debian60.lib.php @@ -33,7 +33,7 @@ class installer extends installer_base { public function configure_dovecot() { global $conf; - + $virtual_transport = 'dovecot'; $configure_lmtp = false; @@ -48,7 +48,7 @@ class installer extends installer_base { $tmp = $this->db->queryOneRecord("SELECT * FROM ?? WHERE server_id = ?", $conf["mysql"]["database"] . ".server", $conf['server_id']); $ini_array = ini_to_array(stripslashes($tmp['config'])); // ini_array needs not to be checked, because already done in update.php -> updateDbAndIni() - + if(isset($ini_array['mail']['mailbox_virtual_uidgid_maps']) && $ini_array['mail']['mailbox_virtual_uidgid_maps'] == 'y') { $virtual_transport = 'lmtp:unix:private/dovecot-lmtp'; $configure_lmtp = true; @@ -108,6 +108,13 @@ class installer extends installer_base { } else { copy('tpl/debian6_dovecot2.conf.master', $config_dir.'/'.$configfile); } + // Copy custom config file + if(is_file($conf['ispconfig_install_dir'].'/server/conf-custom/install/dovecot_custom.conf.master')) { + if(!@is_dir($config_dir . '/conf.d')) { + mkdir($config_dir . '/conf.d'); + } + copy($conf['ispconfig_install_dir'].'/server/conf-custom/install/dovecot_custom.conf.master', $config_dir.'/conf.d/99-ispconfig-custom-config.conf'); + } replaceLine($config_dir.'/'.$configfile, 'postmaster_address = postmaster@example.com', 'postmaster_address = postmaster@'.$conf['hostname'], 1, 0); replaceLine($config_dir.'/'.$configfile, 'postmaster_address = webmaster@localhost', 'postmaster_address = postmaster@'.$conf['hostname'], 1, 0); if(version_compare($dovecot_version,2.1) < 0) { @@ -123,7 +130,7 @@ class installer extends installer_base { if(version_compare($dovecot_version,2.3) >= 0) { // Remove deprecated setting(s) removeLine($config_dir.'/'.$configfile, 'ssl_protocols ='); - + // Check if we have a dhparams file and if not, create it if(!file_exists('/etc/dovecot/dh.pem')) { swriteln('Creating new DHParams file, this takes several minutes. Do not interrupt the script.'); @@ -146,7 +153,7 @@ class installer extends installer_base { $content = str_replace('#2.3+ ','',$content); file_put_contents($config_dir.'/'.$configfile,$content); unset($content); - + } else { // remove settings which are not supported in Dovecot < 2.3 removeLine($config_dir.'/'.$configfile, 'ssl_min_protocol ='); @@ -159,7 +166,7 @@ class installer extends installer_base { copy('tpl/debian6_dovecot.conf.master', $config_dir.'/'.$configfile); } } - + $dovecot_protocols = 'imap pop3'; //* dovecot-lmtpd @@ -196,7 +203,7 @@ class installer extends installer_base { chmod($config_dir.'/'.$configfile, 0600); chown($config_dir.'/'.$configfile, 'root'); chgrp($config_dir.'/'.$configfile, 'root'); - + // Dovecot shall ignore mounts in website directory if(is_installed('doveadm')) exec("doveadm mount add '/var/www/*' ignore > /dev/null 2> /dev/null"); diff --git a/install/dist/lib/fedora.lib.php b/install/dist/lib/fedora.lib.php index 25dc46143351b328d1d7d8905d6eb38dcb1639fe..71809ac81ea0ec084a5dfa83031e3bb2e7859da2 100644 --- a/install/dist/lib/fedora.lib.php +++ b/install/dist/lib/fedora.lib.php @@ -47,237 +47,6 @@ class installer_dist extends installer_base { } } - function configure_postfix($options = '') - { - global $conf,$autoinstall; - $cf = $conf['postfix']; - $config_dir = $cf['config_dir']; - - if(!is_dir($config_dir)){ - $this->error("The postfix configuration directory '$config_dir' does not exist."); - } - - //* Install virtual mappings - foreach (glob('tpl/mysql-virtual_*.master') as $filename) { - $this->process_postfix_config( basename($filename, '.master') ); - } - - //* mysql-verify_recipients.cf - $this->process_postfix_config('mysql-verify_recipients.cf'); - - //* postfix-dkim - $filename='tag_as_originating.re'; - $full_file_name=$config_dir.'/'.$filename; - if(is_file($full_file_name)) copy($full_file_name, $full_file_name.'~'); - $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/postfix-'.$filename.'.master', 'tpl/postfix-'.$filename.'.master'); - wf($full_file_name, $content); - - $filename='tag_as_foreign.re'; - $full_file_name=$config_dir.'/'.$filename; - if(is_file($full_file_name)) copy($full_file_name, $full_file_name.'~'); - $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/postfix-'.$filename.'.master', 'tpl/postfix-'.$filename.'.master'); - wf($full_file_name, $content); - - //* Creating virtual mail user and group - $command = 'groupadd -g '.$cf['vmail_groupid'].' '.$cf['vmail_groupname']; - if(!is_group($cf['vmail_groupname'])) caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - - $command = 'useradd -g '.$cf['vmail_groupname'].' -u '.$cf['vmail_userid'].' '.$cf['vmail_username'].' -d '.$cf['vmail_mailbox_base'].' -m'; - if(!is_user($cf['vmail_username'])) caselog("$command &> /dev/null", __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - - //* These postconf commands will be executed on installation and update - $server_ini_rec = $this->db->queryOneRecord("SELECT config FROM server WHERE server_id = ?", $conf['server_id']); - $server_ini_array = ini_to_array(stripslashes($server_ini_rec['config'])); - unset($server_ini_rec); - - //* If there are RBL's defined, format the list and add them to smtp_recipient_restrictions to prevent removeal after an update - $rbl_list = ''; - if (@isset($server_ini_array['mail']['realtime_blackhole_list']) && $server_ini_array['mail']['realtime_blackhole_list'] != '') { - $rbl_hosts = explode(",", str_replace(" ", "", $server_ini_array['mail']['realtime_blackhole_list'])); - foreach ($rbl_hosts as $key => $value) { - $rbl_list .= ", reject_rbl_client ". $value; - } - } - unset($rbl_hosts); - - //* If Postgrey is installed, configure it - $greylisting = ''; - if($conf['postgrey']['installed'] == true) { - $greylisting = ', check_recipient_access mysql:/etc/postfix/mysql-virtual_policy_greylist.cf'; - } - - $reject_sender_login_mismatch = ''; - $reject_authenticated_sender_login_mismatch = ''; - if(isset($server_ini_array['mail']['reject_sender_login_mismatch']) && ($server_ini_array['mail']['reject_sender_login_mismatch'] == 'y')) { - $reject_sender_login_mismatch = ', reject_sender_login_mismatch'; - $reject_authenticated_sender_login_mismatch = 'reject_authenticated_sender_login_mismatch, '; - } - - # placeholder includes comment char - $stress_adaptive_placeholder = '#{stress_adaptive} '; - $stress_adaptive = (isset($server_ini_array['mail']['stress_adaptive']) && ($server_ini_array['mail']['stress_adaptive'] == 'y')) ? '' : $stress_adaptive_placeholder; - - $reject_unknown_client_hostname=''; - if (isset($server_ini_array['mail']['reject_unknown']) && ($server_ini_array['mail']['reject_unknown'] == 'client' || $server_ini_array['mail']['reject_unknown'] == 'client_helo')) { - $reject_unknown_client_hostname=',reject_unknown_client_hostname'; - } - $reject_unknown_helo_hostname=''; - if ((!isset($server_ini_array['mail']['reject_unknown'])) || $server_ini_array['mail']['reject_unknown'] == 'helo' || $server_ini_array['mail']['reject_unknown'] == 'client_helo') { - $reject_unknown_helo_hostname=',reject_unknown_helo_hostname'; - } - - unset($server_ini_array); - - $myhostname = str_replace('.','\.',$conf['hostname']); - - $postconf_placeholders = array('{config_dir}' => $config_dir, - '{vmail_mailbox_base}' => $cf['vmail_mailbox_base'], - '{vmail_userid}' => $cf['vmail_userid'], - '{vmail_groupid}' => $cf['vmail_groupid'], - '{rbl_list}' => $rbl_list, - '{greylisting}' => $greylisting, - '{reject_slm}' => $reject_sender_login_mismatch, - '{reject_aslm}' => $reject_authenticated_sender_login_mismatch, - '{myhostname}' => $myhostname, - $stress_adaptive_placeholder => $stress_adaptive, - '{reject_unknown_client_hostname}' => $reject_unknown_client_hostname, - '{reject_unknown_helo_hostname}' => $reject_unknown_helo_hostname, - ); - - $postconf_tpl = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/fedora_postfix.conf.master', 'tpl/fedora_postfix.conf.master'); - $postconf_tpl = strtr($postconf_tpl, $postconf_placeholders); - $postconf_commands = array_filter(explode("\n", $postconf_tpl)); // read and remove empty lines - - //* These postconf commands will be executed on installation only - if($this->is_update == false) { - $postconf_commands = array_merge($postconf_commands, array( - 'myhostname = '.$conf['hostname'], - 'mydestination = '.$conf['hostname'].', localhost, localhost.localdomain', - 'mynetworks = 127.0.0.0/8 [::1]/128' - )); - } - - //* Create the header and body check files - touch($config_dir.'/header_checks'); - touch($config_dir.'/mime_header_checks'); - touch($config_dir.'/nested_header_checks'); - touch($config_dir.'/body_checks'); - touch($config_dir.'/sasl_passwd'); - - //* Create the mailman files - if(!is_dir('/var/lib/mailman/data')) exec('mkdir -p /var/lib/mailman/data'); - //if(!is_file('/var/lib/mailman/data/aliases')) touch('/var/lib/mailman/data/aliases'); - if(is_file('/var/lib/mailman/data/aliases')) unlink('/var/lib/mailman/data/aliases'); - if(!is_link('/var/lib/mailman/data/aliases')) symlink('/etc/mailman/aliases', '/var/lib/mailman/data/aliases'); - if(!is_dir('/etc/mailman')) mkdir('/etc/mailman'); - if(!is_file('/etc/mailman/aliases')) touch('/etc/mailman/aliases'); - exec('postalias /var/lib/mailman/data/aliases'); - if(!is_file('/etc/mailman/virtual-mailman')) touch('/etc/mailman/virtual-mailman'); - exec('postmap /etc/mailman/virtual-mailman'); - if(!is_file('/var/lib/mailman/data/transport-mailman')) touch('/var/lib/mailman/data/transport-mailman'); - exec('/usr/sbin/postmap /var/lib/mailman/data/transport-mailman'); - - //* Create auxillary postfix conf files - $configfile = 'helo_access'; - if(is_file($config_dir.'/'.$configfile)) { - copy($config_dir.'/'.$configfile, $config_dir.'/'.$configfile.'~'); - chmod($config_dir.'/'.$configfile.'~', 0400); - } - $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master', 'tpl/'.$configfile.'.master'); - $content = strtr($content, $postconf_placeholders); - # todo: look up this server's ip addrs and loop through each - # todo: look up domains hosted on this server and loop through each - wf($config_dir.'/'.$configfile, $content); - - $configfile = 'blacklist_helo'; - if(is_file($config_dir.'/'.$configfile)) { - copy($config_dir.'/'.$configfile, $config_dir.'/'.$configfile.'~'); - chmod($config_dir.'/'.$configfile.'~', 0400); - } - $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master', 'tpl/'.$configfile.'.master'); - $content = strtr($content, $postconf_placeholders); - wf($config_dir.'/'.$configfile, $content); - - //* Make a backup copy of the main.cf file - copy($config_dir.'/main.cf', $config_dir.'/main.cf~'); - - //* Executing the postconf commands - foreach($postconf_commands as $cmd) { - $command = "postconf -e '$cmd'"; - caselog($command." &> /dev/null", __FILE__, __LINE__, 'EXECUTED: '.$command, 'Failed to execute the command '.$command); - } - - if(!stristr($options, 'dont-create-certs')) { - //* Create the SSL certificate - if(AUTOINSTALL){ - $command = 'cd '.$config_dir.'; ' - ."openssl req -new -subj '/C=".escapeshellcmd($autoinstall['ssl_cert_country'])."/ST=".escapeshellcmd($autoinstall['ssl_cert_state'])."/L=".escapeshellcmd($autoinstall['ssl_cert_locality'])."/O=".escapeshellcmd($autoinstall['ssl_cert_organisation'])."/OU=".escapeshellcmd($autoinstall['ssl_cert_organisation_unit'])."/CN=".escapeshellcmd($autoinstall['ssl_cert_common_name'])."' -outform PEM -out smtpd.cert -newkey rsa:4096 -nodes -keyout smtpd.key -keyform PEM -days 3650 -x509"; - } else { - $command = 'cd '.$config_dir.'; ' - .'openssl req -new -outform PEM -out smtpd.cert -newkey rsa:4096 -nodes -keyout smtpd.key -keyform PEM -days 3650 -x509'; - } - exec($command); - - $command = 'chmod o= '.$config_dir.'/smtpd.key'; - caselog($command.' &> /dev/null', __FILE__, __LINE__, 'EXECUTED: '.$command, 'Failed to execute the command '.$command); - } - - //** We have to change the permissions of the courier authdaemon directory to make it accessible for maildrop. - $command = 'chmod 755 /var/spool/authdaemon'; - caselog($command.' &> /dev/null', __FILE__, __LINE__, 'EXECUTED: '.$command, 'Failed to execute the command '.$command); - - //* Changing maildrop lines in posfix master.cf - if(is_file($config_dir.'/master.cf')){ - copy($config_dir.'/master.cf', $config_dir.'/master.cf~'); - } - if(is_file($config_dir.'/master.cf~')){ - exec('chmod 400 '.$config_dir.'/master.cf~'); - } - $configfile = $config_dir.'/master.cf'; - $content = rf($configfile); - // if postfix package is from fedora or centios main repo - $content = str_replace('# flags=DRhu user=vmail argv=/usr/local/bin/maildrop -d ${recipient}', - ' flags=DRhu user='.$cf['vmail_username'].' argv=/usr/bin/maildrop -d ${recipient} ${extension} ${recipient} ${user} ${nexthop} ${sender}', - $content); - - // If postfix package is from centos plus repo - $content = str_replace('# flags=DRhu user=vmail argv=/usr/bin/maildrop -d ${recipient}', - ' flags=DRhu user='.$cf['vmail_username'].' argv=/usr/bin/maildrop -d ${recipient} ${extension} ${recipient} ${user} ${nexthop} ${sender}', - $content); - - $content = str_replace(' flags=DRhu user=vmail argv=/usr/local/bin/maildrop -d ${recipient}', - ' flags=DRhu user='.$cf['vmail_username'].' argv=/usr/bin/maildrop -d ${recipient} ${extension} ${recipient} ${user} ${nexthop} ${sender}', - $content); - - - $content = str_replace('#maildrop unix - n n - - pipe', - 'maildrop unix - n n - - pipe', - $content); - - wf($configfile, $content); - - //* Writing the Maildrop mailfilter file - $configfile = 'mailfilter'; - if(is_file($cf['vmail_mailbox_base'].'/.'.$configfile)){ - copy($cf['vmail_mailbox_base'].'/.'.$configfile, $cf['vmail_mailbox_base'].'/.'.$configfile.'~'); - } - $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master', "tpl/$configfile.master"); - $content = str_replace('{dist_postfix_vmail_mailbox_base}', $cf['vmail_mailbox_base'], $content); - wf($cf['vmail_mailbox_base'].'/.'.$configfile, $content); - - //* Create the directory for the custom mailfilters - $command = 'mkdir '.$cf['vmail_mailbox_base'].'/mailfilters'; - caselog($command." &> /dev/null", __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - - //* Chmod and chown the .mailfilter file - $command = 'chown -R '.$cf['vmail_username'].':'.$cf['vmail_groupname'].' '.$cf['vmail_mailbox_base'].'/.mailfilter'; - caselog($command." &> /dev/null", __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - - $command = 'chmod -R 600 '.$cf['vmail_mailbox_base'].'/.mailfilter'; - caselog($command." &> /dev/null", __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - - } - public function configure_saslauthd() { global $conf; @@ -561,31 +330,28 @@ class installer_dist extends installer_base { $config_dir = $conf['postfix']['config_dir']; - // Adding amavis-services to the master.cf file if the service does not already exists - $add_amavis = !$this->get_postfix_service('amavis','unix'); - $add_amavis_10025 = !$this->get_postfix_service('127.0.0.1:10025','inet'); - $add_amavis_10027 = !$this->get_postfix_service('127.0.0.1:10027','inet'); - - if ($add_amavis || $add_amavis_10025 || $add_amavis_10027) { - //* backup master.cf - if(is_file($config_dir.'/master.cf')) copy($config_dir.'/master.cf', $config_dir.'/master.cf~'); - // adjust amavis-config - if($add_amavis) { - $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis.master', 'tpl/master_cf_amavis.master'); - af($config_dir.'/master.cf', $content); - unset($content); - } - if ($add_amavis_10025) { - $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10025.master', 'tpl/master_cf_amavis10025.master'); - af($config_dir.'/master.cf', $content); - unset($content); - } - if ($add_amavis_10027) { - $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10027.master', 'tpl/master_cf_amavis10027.master'); - af($config_dir.'/master.cf', $content); - unset($content); - } - } + // Adding amavis-services to the master.cf file + + // backup master.cf + if(is_file($config_dir.'/master.cf')) copy($config_dir.'/master.cf', $config_dir.'/master.cf~'); + + // first remove the old service definitions + $this->remove_postfix_service('amavis','unix'); + $this->remove_postfix_service('127.0.0.1:10025','inet'); + $this->remove_postfix_service('127.0.0.1:10027','inet'); + + // then add them back + $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis.master', 'tpl/master_cf_amavis.master'); + af($config_dir.'/master.cf', $content); + unset($content); + + $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10025.master', 'tpl/master_cf_amavis10025.master'); + af($config_dir.'/master.cf', $content); + unset($content); + + $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10027.master', 'tpl/master_cf_amavis10027.master'); + af($config_dir.'/master.cf', $content); + unset($content); removeLine('/etc/sysconfig/freshclam', 'FRESHCLAM_DELAY=disabled-warn # REMOVE ME', 1); replaceLine('/etc/freshclam.conf', 'Example', '# Example', 1); diff --git a/install/dist/lib/gentoo.lib.php b/install/dist/lib/gentoo.lib.php index 78dffabf85a4d94e2ca52b147f5588dd508e390c..c98788e33cc60a3151c277ef4fd57fb360ee21c8 100644 --- a/install/dist/lib/gentoo.lib.php +++ b/install/dist/lib/gentoo.lib.php @@ -444,31 +444,28 @@ class installer extends installer_base $config_dir = $conf['postfix']['config_dir']; - // Adding amavis-services to the master.cf file if the service does not already exists - $add_amavis = !$this->get_postfix_service('amavis','unix'); - $add_amavis_10025 = !$this->get_postfix_service('127.0.0.1:10025','inet'); - $add_amavis_10027 = !$this->get_postfix_service('127.0.0.1:10027','inet'); - - if ($add_amavis || $add_amavis_10025 || $add_amavis_10027) { - //* backup master.cf - if(is_file($config_dir.'/master.cf')) copy($config_dir.'/master.cf', $config_dir.'/master.cf~'); - // adjust amavis-config - if($add_amavis) { - $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis.master', 'tpl/master_cf_amavis.master'); - af($config_dir.'/master.cf', $content); - unset($content); - } - if ($add_amavis_10025) { - $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10025.master', 'tpl/master_cf_amavis10025.master'); - af($config_dir.'/master.cf', $content); - unset($content); - } - if ($add_amavis_10027) { - $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10027.master', 'tpl/master_cf_amavis10027.master'); - af($config_dir.'/master.cf', $content); - unset($content); - } - } + // Adding amavis-services to the master.cf file + + // backup master.cf + if(is_file($config_dir.'/master.cf')) copy($config_dir.'/master.cf', $config_dir.'/master.cf~'); + + // first remove the old service definitions + $this->remove_postfix_service('amavis','unix'); + $this->remove_postfix_service('127.0.0.1:10025','inet'); + $this->remove_postfix_service('127.0.0.1:10027','inet'); + + // then add them back + $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis.master', 'tpl/master_cf_amavis.master'); + af($config_dir.'/master.cf', $content); + unset($content); + + $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10025.master', 'tpl/master_cf_amavis10025.master'); + af($config_dir.'/master.cf', $content); + unset($content); + + $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10027.master', 'tpl/master_cf_amavis10027.master'); + af($config_dir.'/master.cf', $content); + unset($content); //* Add the clamav user to the amavis group exec('usermod -a -G amavis clamav'); @@ -509,7 +506,13 @@ class installer extends installer_base */ - $content = preg_replace('/MISC_OTHER="[^"]+"/', 'MISC_OTHER="-b -A -E -Z -D -H -O clf:'.$logdir.'/transfer.log"', $content); + //* Enable TLS if certificate file exists + $enable_tls = ''; + if(file_exists('/etc/ssl/private/pure-ftpd.pem')) { + $enable_tls = ' -Y 1'; + } + + $content = preg_replace('/MISC_OTHER="[^"]+"/', 'MISC_OTHER="-b -A -E -Z -D -H -O clf:'.$logdir.'/transfer.log'.$enable_tls.'"', $content); $this->write_config_file($conf['pureftpd']['config_file'], $content); } @@ -531,10 +534,10 @@ class installer extends installer_base //* load the powerdns databse dump if($conf['mysql']['admin_password'] == '') { - caselog("mysql --default-character-set=".$conf['mysql']['charset']." -h '".$conf['mysql']['host']."' -u '".$conf['mysql']['admin_user']."' '".$conf['powerdns']['database']."' < '".ISPC_INSTALL_ROOT."/install/sql/powerdns.sql' &> /dev/null", + caselog("mysql --default-character-set=".$conf['mysql']['charset']." -h '".$conf['mysql']['host']."' -u '".$conf['mysql']['admin_user']."' --force '".$conf['powerdns']['database']."' < '".ISPC_INSTALL_ROOT."/install/sql/powerdns.sql' &> /dev/null", __FILE__, __LINE__, 'read in ispconfig3.sql', 'could not read in powerdns.sql'); } else { - caselog("mysql --default-character-set=".$conf['mysql']['charset']." -h '".$conf['mysql']['host']."' -u '".$conf['mysql']['admin_user']."' -p'".$conf['mysql']['admin_password']."' '".$conf['powerdns']['database']."' < '".ISPC_INSTALL_ROOT."/install/sql/powerdns.sql' &> /dev/null", + caselog("mysql --default-character-set=".$conf['mysql']['charset']." -h '".$conf['mysql']['host']."' -u '".$conf['mysql']['admin_user']."' -p'".$conf['mysql']['admin_password']."' --force '".$conf['powerdns']['database']."' < '".ISPC_INSTALL_ROOT."/install/sql/powerdns.sql' &> /dev/null", __FILE__, __LINE__, 'read in ispconfig3.sql', 'could not read in powerdns.sql'); } diff --git a/install/dist/lib/opensuse.lib.php b/install/dist/lib/opensuse.lib.php index 3effb1d10c8cc61af717601cdaece67e784e9444..7cc368a14e3fdab0351f06f6c088c9c1d6611257 100644 --- a/install/dist/lib/opensuse.lib.php +++ b/install/dist/lib/opensuse.lib.php @@ -513,31 +513,28 @@ class installer_dist extends installer_base { $config_dir = $conf['postfix']['config_dir']; - // Adding amavis-services to the master.cf file if the service does not already exists - $add_amavis = !$this->get_postfix_service('amavis','unix'); - $add_amavis_10025 = !$this->get_postfix_service('127.0.0.1:10025','inet'); - $add_amavis_10027 = !$this->get_postfix_service('127.0.0.1:10027','inet'); - - if ($add_amavis || $add_amavis_10025 || $add_amavis_10027) { - //* backup master.cf - if(is_file($config_dir.'/master.cf')) copy($config_dir.'/master.cf', $config_dir.'/master.cf~'); - // adjust amavis-config - if($add_amavis) { - $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis.master', 'tpl/master_cf_amavis.master'); - af($config_dir.'/master.cf', $content); - unset($content); - } - if ($add_amavis_10025) { - $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10025.master', 'tpl/master_cf_amavis10025.master'); - af($config_dir.'/master.cf', $content); - unset($content); - } - if ($add_amavis_10027) { - $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10027.master', 'tpl/master_cf_amavis10027.master'); - af($config_dir.'/master.cf', $content); - unset($content); - } - } + // Adding amavis-services to the master.cf file + + // backup master.cf + if(is_file($config_dir.'/master.cf')) copy($config_dir.'/master.cf', $config_dir.'/master.cf~'); + + // first remove the old service definitions + $this->remove_postfix_service('amavis','unix'); + $this->remove_postfix_service('127.0.0.1:10025','inet'); + $this->remove_postfix_service('127.0.0.1:10027','inet'); + + // then add them back + $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis.master', 'tpl/master_cf_amavis.master'); + af($config_dir.'/master.cf', $content); + unset($content); + + $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10025.master', 'tpl/master_cf_amavis10025.master'); + af($config_dir.'/master.cf', $content); + unset($content); + + $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10027.master', 'tpl/master_cf_amavis10027.master'); + af($config_dir.'/master.cf', $content); + unset($content); // Add the clamav user to the vscan group //exec('groupmod --add-user clamav vscan'); diff --git a/install/dist/tpl/gentoo/amavisd-ispconfig.conf.master b/install/dist/tpl/gentoo/amavisd-ispconfig.conf.master index 7e42c8a362b86f9255fbd46aa16c3a546b727a34..c60b50e2fa9aa47e3a9a93b187c701ba7c6d7e34 100644 --- a/install/dist/tpl/gentoo/amavisd-ispconfig.conf.master +++ b/install/dist/tpl/gentoo/amavisd-ispconfig.conf.master @@ -51,7 +51,8 @@ use strict; $sql_select_policy = 'SELECT *,spamfilter_users.id'. ' FROM spamfilter_users LEFT JOIN spamfilter_policy ON spamfilter_users.policy_id=spamfilter_policy.id'. - ' WHERE spamfilter_users.email IN (%k) ORDER BY spamfilter_users.priority DESC'; + ' WHERE spamfilter_users.email IN (%k) AND spamfilter_users.policy_id != 0'. + ' ORDER BY spamfilter_users.priority DESC'; $sql_select_white_black_list = 'SELECT wb FROM spamfilter_wblist'. diff --git a/install/dist/tpl/gentoo/jk_init.ini.master b/install/dist/tpl/gentoo/jk_init.ini.master index 6e11d05fd5414b5d3904bc3b188efd8b52e8f816..267210535b19d07877e101210ed5e2dab8079ce7 100644 --- a/install/dist/tpl/gentoo/jk_init.ini.master +++ b/install/dist/tpl/gentoo/jk_init.ini.master @@ -96,8 +96,8 @@ regularfiles = /etc/vimrc directories = /etc/joe, /etc/terminfo, /usr/share/vim, /usr/share/terminfo, /usr/lib/terminfo [netutils] -comment = several internet utilities like wget, ftp, rsync, scp, ssh -executables = /usr/bin/wget, /usr/bin/lynx, /usr/bin/ftp, /usr/bin/host, /usr/bin/rsync, /usr/bin/smbclient +comment = several internet utilities like curl, wget, ftp, rsync, scp, ssh +executables = /usr/bin/curl /usr/bin/wget, /usr/bin/lynx, /usr/bin/ftp, /usr/bin/host, /usr/bin/rsync, /usr/bin/smbclient includesections = netbasics, ssh, sftp, scp directories = /etc/ssl/certs/ regularfiles = /usr/lib/ssl/certs diff --git a/install/install.php b/install/install.php index 7bc3836223514ae3685b1d49543818d725c3c6df..9cc6bb5fa7db8127355fa62711428fe6bd4fbde3 100644 --- a/install/install.php +++ b/install/install.php @@ -160,8 +160,13 @@ if(!is_writable(dirname(ISPC_LOG_FILE))){ die("ERROR: Cannot write to the ".dirname(ISPC_LOG_FILE)." directory. Are you root or sudo ?\n\n"); } +//** Check for ISPConfig 2.x versions if(is_dir('/root/ispconfig') || is_dir('/home/admispconfig')) { - die('This software cannot be installed on a server wich runs ISPConfig 2.x.'); + if(is_dir('/home/admispconfig')) { + die('This software cannot be installed on a server which runs ISPConfig 2.x.'); + } else { + die('This software cannot be installed on a server which runs ISPConfig 2.x; the presence of the /root/ispconfig/ directory may indicate an ISPConfig 2.x installation, otherwise you can remove or rename it to continue.'); + } } if(is_dir('/usr/local/ispconfig')) { @@ -495,6 +500,12 @@ if($force) { swriteln('Configuring OpenVZ'); } +// Configure AppArmor +if($conf['apparmor']['installed']){ + swriteln('Configuring AppArmor'); + $inst->configure_apparmor(); +} + if($install_mode == 'standard' || strtolower($inst->simple_query('Configure Firewall Server', array('y', 'n'), 'y','configure_firewall')) == 'y') { //* Check for Firewall if(!$conf['ufw']['installed'] && !$conf['firewall']['installed']) { @@ -597,6 +608,9 @@ if(!$issue_asked) { } } +// update acme.sh if installed +$inst->update_acme(); + if($conf['services']['web'] == true) { //** Configure apps vhost swriteln('Configuring Apps vhost'); diff --git a/install/lib/compatibility.inc.php b/install/lib/compatibility.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..562e07ada42f404cae0708f32105dcf39a84768c --- /dev/null +++ b/install/lib/compatibility.inc.php @@ -0,0 +1,80 @@ +<?php + +/* +Copyright (c) 2021, Jesse Norell <jesse@kci.net> +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of ISPConfig nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* random_bytes can be dropped when php 5.6 support is dropped */ +if (! function_exists('random_bytes')) { + function random_bytes($length) { + return openssl_random_pseudo_bytes($length); + } +} + +/* random_int can be dropped when php 5.6 support is dropped */ +if (! function_exists('random_int')) { + function random_int($min=null, $max=null) { + if (null === $min) { + $min = PHP_INT_MIN; + } + + if (null === $max) { + $min = PHP_INT_MAX; + } + + if (!is_int($min) || !is_int($max)) { + trigger_error('random_int: $min and $max must be integer values', E_USER_NOTICE); + $min = (int)$min; + $max = (int)$max; + } + + if ($min > $max) { + trigger_error('random_int: $max can\'t be lesser than $min', E_USER_WARNING); + return null; + } + + $range = $counter = $max - $min; + $bits = 1; + + while ($counter >>= 1) { + ++$bits; + } + + $bytes = (int)max(ceil($bits/8), 1); + $bitmask = pow(2, $bits) - 1; + + if ($bitmask >= PHP_INT_MAX) { + $bitmask = PHP_INT_MAX; + } + + do { + $result = hexdec(bin2hex(random_bytes($bytes))) & $bitmask; + } while ($result > $range); + + return $result + $min; + } +} diff --git a/install/lib/install.lib.php b/install/lib/install.lib.php index 7a49939600ec610e548e7f34da6ac560d6063a11..d9b482a842f835cd9feed7e52da9894c06d7fae6 100644 --- a/install/lib/install.lib.php +++ b/install/lib/install.lib.php @@ -29,6 +29,9 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ error_reporting(E_ALL|E_STRICT); +if(version_compare(phpversion(), '7.0', '<')) { + require_once 'compatibility.inc.php'; +} $FILE = realpath('../install.php'); @@ -238,6 +241,13 @@ function get_distname() { $distid = 'debian60'; $distbaseid = 'debian'; swriteln("Operating System: Debian 10.0 (Buster) or compatible\n"); + } elseif(substr(trim(file_get_contents('/etc/debian_version')),0,2) == '11') { + $distname = 'Debian'; + $distver = 'Bullseye'; + $distconfid = 'debian110'; + $distid = 'debian60'; + $distbaseid = 'debian'; + swriteln("Operating System: Debian 11.0 (Bullseye) or compatible\n"); } elseif(strstr(trim(file_get_contents('/etc/debian_version')), '/sid')) { $distname = 'Debian'; $distver = 'Testing'; @@ -284,96 +294,89 @@ function get_distname() { } } + //** RHEL (including compatible clones) & Fedora + elseif(file_exists('/etc/redhat-release') && file_exists('/etc/os-release')) { + + $content = file_get_contents('/etc/os-release'); + + preg_match('/(?<=PRETTY_NAME=\").+?(?=\")/', $content, $prettyname); + preg_match('/(?<=NAME=\").+?(?=\")/', $content, $name); + preg_match('/(?<=VERSION=\").+?(?=\")/', $content, $version); + preg_match('/(?<=VERSION_ID=\").+?(?=\")/', $content, $versionid); + + if(stristr($prettyname[0], 'Fedora 32 (Thirty Two)')) { + $distname = 'Fedora'; + $distver = '32'; + $distid = 'fedora32'; + $distbaseid = 'fedora'; + swriteln("Operating System: Fedora 32 or compatible\n"); + } elseif(stristr($prettyname[0], 'Fedora 33 (Thirty Three)')) { + $distname = 'Fedora'; + $distver = '33'; + $distid = 'fedora33'; + $distbaseid = 'fedora'; + swriteln("Operating System: Fedora 33 or compatible\n"); + //** RHEL 7 and compatible clones + } elseif(preg_match('/^(?:7|7\.[0-9]{1,2})$/', $versionid[0])) { + preg_match_all('/([0-9]{1,2})\.?([0-9]{0,2})\.?([0-9]*)/', file_get_contents('/etc/redhat-release'), $centos7_version); + $distname = $name[0]; + $distver = is_array($centos7_version)? implode('.', array_filter(array($centos7_version[1][0],$centos7_version[2][0],$centos7_version[3][0]),'strlen')) : $version[0]; + $distid = 'centos72'; + $distbaseid = 'fedora'; + swriteln("Operating System: " . $distname . " " . $distver . "\n"); + //** RHEL 8 and compatible clones + } elseif(preg_match('/^(?:8|8\.[0-9]{1,2})$/', $versionid[0])) { + $distname = $name[0]; + $distver = $version[0]; + $distid = 'centos80'; + $distbaseid = 'fedora'; + swriteln("Operating System: " . $prettyname[0] . "\n"); + } else { + $distname = 'Redhat'; + $distver = 'Unknown'; + $distid = 'fedora9'; + $distbaseid = 'fedora'; + swriteln("Operating System: Redhat or compatible\n"); + } + //** CentOS 6 + } elseif(file_exists('/etc/redhat-release') && !file_exists('/etc/os-release') && !file_exists('/etc/els-release')) { - //** Redhat - elseif(file_exists('/etc/redhat-release')) { - - $content = file_get_contents('/etc/redhat-release'); + $content = file_get_contents('/etc/redhat-release'); - if(stristr($content, 'Fedora release 9 (Sulphur)')) { - $distname = 'Fedora'; - $distver = '9'; - $distid = 'fedora9'; - $distbaseid = 'fedora'; - swriteln("Operating System: Fedora 9 or compatible\n"); - } elseif(stristr($content, 'Fedora release 10 (Cambridge)')) { - $distname = 'Fedora'; - $distver = '10'; - $distid = 'fedora9'; - $distbaseid = 'fedora'; - swriteln("Operating System: Fedora 10 or compatible\n"); - } elseif(stristr($content, 'Fedora release 10')) { - $distname = 'Fedora'; - $distver = '11'; - $distid = 'fedora9'; - $distbaseid = 'fedora'; - swriteln("Operating System: Fedora 11 or compatible\n"); - } elseif(stristr($content, 'Fedora release 32 (Thirty Two)')) { - $distname = 'Fedora'; - $distver = '32'; - $distid = 'fedora32'; - $distbaseid = 'fedora'; - swriteln("Operating System: Fedora 32 or compatible\n"); - } elseif(stristr($content, 'Fedora release 33 (Thirty Three)')) { - $distname = 'Fedora'; - $distver = '33'; - $distid = 'fedora33'; - $distbaseid = 'fedora'; - swriteln("Operating System: Fedora 33 or compatible\n"); - } elseif(stristr($content, 'CentOS release 5.2 (Final)')) { - $distname = 'CentOS'; - $distver = '5.2'; - $distid = 'centos52'; - $distbaseid = 'fedora'; - swriteln("Operating System: CentOS 5.2 or compatible\n"); - } elseif(stristr($content, 'CentOS release 5.3 (Final)')) { - $distname = 'CentOS'; - $distver = '5.3'; + if(stristr($content, 'CentOS Linux release 6') || stristr($content, 'CentOS release 6')) { + preg_match_all('/(6\.?([0-9]{0,2})\.?(\s)?([a-zA-Z()]+))$/', $content, $centos6_version); + $distname = 'CentOS Linux'; + $distver = $centos6_version[0][0] ? $centos6_version[0][0] : '6'; $distid = 'centos53'; $distbaseid = 'fedora'; - swriteln("Operating System: CentOS 5.3 or compatible\n"); - } elseif(stristr($content, 'CentOS release 5')) { - $distname = 'CentOS'; - $distver = 'Unknown'; - $distid = 'centos53'; + swriteln("Operating System: " . $distname . " " . $distver . "\n"); + + } else { + $distname = 'Redhat'; + $distver = 'Unknown'; + $distid = 'fedora9'; + $distbaseid = 'fedora'; + } + //** CentOS 6 Extended Lifecycle Support by CloudLinux + } elseif(file_exists('/etc/redhat-release') && file_exists('/etc/els-release') && !file_exists('/etc/os-release')) { + + $content = file_get_contents('/etc/els-release'); + + if(stristr($content, 'CentOS Linux release 6') || stristr($content, 'CentOS release 6')) { + preg_match_all('/(6)\.?([0-9]{0,2})?\.?\s([a-zA-Z(), ]+)?$/', $content, $centos6_version); + $distname = 'CentOS Linux'; + $distver = $centos6_version[0][0] ? $centos6_version[0][0] : '6'; + $distid = 'centos53'; $distbaseid = 'fedora'; - swriteln("Operating System: CentOS 5 or compatible\n"); - } elseif(stristr($content, 'CentOS Linux release 6') || stristr($content, 'CentOS release 6')) { - $distname = 'CentOS'; - $distver = 'Unknown'; - $distid = 'centos53'; - $distbaseid = 'fedora'; - swriteln("Operating System: CentOS 6 or compatible\n"); - } elseif(stristr($content, 'CentOS Linux release 7')) { - $distname = 'CentOS'; - $distver = 'Unknown'; - $distbaseid = 'fedora'; - $var=explode(" ", $content); - $var=explode(".", $var[3]); - $var=$var[0].".".$var[1]; - if($var=='7.0' || $var=='7.1') { - $distid = 'centos70'; - } else { - $distid = 'centos72'; - } - swriteln("Operating System: CentOS $var\n"); - } elseif(stristr($content, 'CentOS Linux release 8')) { - $distname = 'CentOS'; - $distver = 'Unknown'; - $distbaseid = 'fedora'; - $distid = 'centos80'; - $var=explode(" ", $content); - $var=explode(".", $var[3]); - $var=$var[0].".".$var[1]; - swriteln("Operating System: CentOS $var\n"); - } else { - $distname = 'Redhat'; - $distver = 'Unknown'; - $distid = 'fedora9'; - $distbaseid = 'fedora'; - swriteln("Operating System: Redhat or compatible, unknown version.\n"); - } - } + swriteln("Operating System: " . $distname . " " . $distver . "\n"); + } else { + $distname = 'Redhat'; + $distver = 'Unknown'; + $distid = 'fedora9'; + $distbaseid = 'fedora'; + } + } + //** Gentoo elseif(file_exists('/etc/gentoo-release')) { @@ -835,7 +838,7 @@ function is_installed($appname) { function get_ispconfig_port_number() { global $conf; - if($conf['nginx']['installed'] == true){ + if(is_file($conf['nginx']['vhost_conf_dir'].'/ispconfig.vhost')) { $ispconfig_vhost_file = $conf['nginx']['vhost_conf_dir'].'/ispconfig.vhost'; $regex = '/listen (\d+)/'; } else { @@ -861,7 +864,7 @@ function get_ispconfig_port_number() { function get_apps_vhost_port_number() { global $conf; - if($conf['nginx']['installed'] == true){ + if(is_file($conf['nginx']['vhost_conf_dir'].'/apps.vhost')) { $ispconfig_vhost_file = $conf['nginx']['vhost_conf_dir'].'/apps.vhost'; $regex = '/listen (\d+)/'; } else { diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php index 34981ff8a0b6c15ecba38b8425db5658d8c5cc22..71753a6b3317276d0c936954d346cfb53783b736 100644 --- a/install/lib/installer_base.lib.php +++ b/install/lib/installer_base.lib.php @@ -51,6 +51,21 @@ class installer_base { return ($val == 0 ? true : false); } + public function update_acme() { + $acme = explode("\n", shell_exec('which acme.sh /usr/local/ispconfig/server/scripts/acme.sh /root/.acme.sh/acme.sh')); + $acme = reset($acme); + $val = 0; + + if($acme && is_executable($acme)) { + $cmd = $acme . ' --upgrade --auto-upgrade ; ' . $acme . ' --set-default-ca --server letsencrypt'; + $ret = null; + $val = 0; + exec($cmd. ' 2>&1', $ret, $val); + } + + return ($val == 0 ? true : false); + } + //: TODO Implement the translation function and language files for the installer. public function lng($text) { return $text; @@ -175,6 +190,7 @@ class installer_base { $salt_length = 12; } + // todo: replace the below with password_hash() when we drop php5.4 support if(function_exists('openssl_random_pseudo_bytes')) { $salt .= substr(bin2hex(openssl_random_pseudo_bytes($salt_length)), 0, $salt_length); } else { @@ -210,6 +226,7 @@ class installer_base { if(is_installed('named') || is_installed('bind') || is_installed('bind9')) $conf['bind']['installed'] = true; if(is_installed('squid')) $conf['squid']['installed'] = true; if(is_installed('nginx')) $conf['nginx']['installed'] = true; + if(is_installed('apparmor_status')) $conf['apparmor']['installed'] = true; if(is_installed('iptables') && is_installed('ufw')) { $conf['ufw']['installed'] = true; } elseif(is_installed('iptables')) { @@ -232,6 +249,7 @@ class installer_base { $msg = ''; if(version_compare(phpversion(), '5.4', '<')) $msg .= "PHP Version 5.4 or newer is required. The currently used PHP version is ".phpversion().".\n"; + if(version_compare(phpversion(), '8.0', '>=')) $msg .= "PHP Version 8 is not supported yet. Change PHP version back to the default version of the OS. The currently used PHP version is ".phpversion().".\n"; if(!function_exists('curl_init')) $msg .= "PHP Curl Module is missing.\n"; if(!function_exists('mysqli_connect')) $msg .= "PHP MySQLi Module is nmissing.\n"; if(!function_exists('mb_detect_encoding')) $msg .= "PHP Multibyte Module (MB) is missing.\n"; @@ -773,7 +791,7 @@ class installer_base { $this->warning('Unable to set rights of user in master database: '.$value['db']."\n Query: ".$query."\n Error: ".$this->dbmaster->errorMessage); } - $query = "GRANT SELECT, UPDATE(`dnssec_initialized`, `dnssec_info`, `dnssec_last_signed`) ON ?? TO ?@?"; + $query = "GRANT SELECT, UPDATE(`dnssec_initialized`, `dnssec_info`, `dnssec_last_signed`, `rendered_zone`) ON ?? TO ?@?"; if ($verbose){ echo $query ."\n"; } @@ -1092,7 +1110,7 @@ class installer_base { $server_ini_array = ini_to_array(stripslashes($server_ini_rec['config'])); unset($server_ini_rec); - //* If there are RBL's defined, format the list and add them to smtp_recipient_restrictions to prevent removeal after an update + //* If there are RBL's defined, format the list and add them to smtp_recipient_restrictions to prevent removal after an update $rbl_list = ''; if (@isset($server_ini_array['mail']['realtime_blackhole_list']) && $server_ini_array['mail']['realtime_blackhole_list'] != '') { $rbl_hosts = explode(",", str_replace(" ", "", $server_ini_array['mail']['realtime_blackhole_list'])); @@ -1536,6 +1554,9 @@ class installer_base { } // Copy custom config file if(is_file($conf['ispconfig_install_dir'].'/server/conf-custom/install/dovecot_custom.conf.master')) { + if(!@is_dir($config_dir . '/conf.d')) { + mkdir($config_dir . '/conf.d'); + } copy($conf['ispconfig_install_dir'].'/server/conf-custom/install/dovecot_custom.conf.master', $config_dir.'/conf.d/99-ispconfig-custom-config.conf'); } replaceLine($config_dir.'/'.$configfile, 'postmaster_address = postmaster@example.com', 'postmaster_address = postmaster@'.$conf['hostname'], 1, 0); @@ -1629,6 +1650,12 @@ class installer_base { public function configure_amavis() { global $conf; + //* These postconf commands will be executed on installation and update + $server_ini_rec = $this->db->queryOneRecord("SELECT mail_server, config FROM ?? WHERE server_id = ?", $conf["mysql"]["database"] . '.server', $conf['server_id']); + $server_ini_array = ini_to_array(stripslashes($server_ini_rec['config'])); + $mail_server = ($server_ini_rec['mail_server']) ? true : false; + unset($server_ini_rec); + // amavisd user config file $configfile = 'amavisd_user_config'; if(is_file($conf['amavis']['config_dir'].'/conf.d/50-user')) copy($conf['amavis']['config_dir'].'/conf.d/50-user', $conf['amavis']['config_dir'].'/50-user~'); @@ -1641,64 +1668,84 @@ class installer_base { $content = str_replace('{mysql_server_ip}', $conf['mysql']['ip'], $content); wf($conf['amavis']['config_dir'].'/conf.d/50-user', $content); chmod($conf['amavis']['config_dir'].'/conf.d/50-user', 0640); + chgrp($conf['amavis']['config_dir'].'/conf.d/50-user', 'amavis'); - // TODO: chmod and chown on the config file - - // test if lmtp if available - $configure_lmtp = $this->get_postfix_service('lmtp','unix'); + $config_dir = $conf['postfix']['config_dir']; + $quoted_config_dir = preg_quote($config_dir, '|'); - // Adding the amavisd commands to the postfix configuration - // Add array for no error in foreach and maybe future options - $postconf_commands = array (); + $mail_config = $server_ini_array['mail']; + //* only change postfix config if amavisd is active filter + if($mail_server && $mail_config['content_filter'] === 'amavisd') { + // test if lmtp if available + $configure_lmtp = $this->get_postfix_service('lmtp','unix'); - // Check for amavisd -> pure webserver with postfix for mailing without antispam - if ($conf['amavis']['installed']) { - $content_filter_service = ($configure_lmtp) ? 'lmtp' : 'amavis'; - $postconf_commands[] = "content_filter = ${content_filter_service}:[127.0.0.1]:10024"; - $postconf_commands[] = 'receive_override_options = no_address_mappings'; - } + // Adding the amavisd commands to the postfix configuration + $postconf_commands = array (); - // Make a backup copy of the main.cf file - copy($conf['postfix']['config_dir'].'/main.cf', $conf['postfix']['config_dir'].'/main.cf~2'); + // Check for amavisd -> pure webserver with postfix for mailing without antispam + if ($conf['amavis']['installed']) { + $content_filter_service = ($configure_lmtp) ? 'lmtp' : 'amavis'; + $postconf_commands[] = "content_filter = ${content_filter_service}:[127.0.0.1]:10024"; + $postconf_commands[] = 'receive_override_options = no_address_mappings'; + $postconf_commands[] = 'address_verify_virtual_transport = smtp:[127.0.0.1]:10025'; + $postconf_commands[] = 'address_verify_transport_maps = static:smtp:[127.0.0.1]:10025'; + } - // Executing the postconf commands - foreach($postconf_commands as $cmd) { - $command = "postconf -e '$cmd'"; - caselog($command." &> /dev/null", __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - } + $options = preg_split("/,\s*/", exec("postconf -h smtpd_recipient_restrictions")); + $new_options = array(); + foreach ($options as $value) { + $value = trim($value); + if ($value == '') continue; + if (preg_match("|check_recipient_access\s+proxy:mysql:${quoted_config_dir}/mysql-verify_recipients.cf|", $value)) { + continue; + } + $new_options[] = $value; + } + if ($configure_lmtp) { + for ($i = 0; isset($new_options[$i]); $i++) { + if ($new_options[$i] == 'reject_unlisted_recipient') { + array_splice($new_options, $i+1, 0, array("check_recipient_access proxy:mysql:${config_dir}/mysql-verify_recipients.cf")); + break; + } + } + # postfix < 3.3 needs this when using reject_unverified_recipient: + if(version_compare($postfix_version, 3.3, '<')) { + $postconf_commands[] = "enable_original_recipient = yes"; + } + } + $postconf_commands[] = "smtpd_recipient_restrictions = ".implode(", ", $new_options); - $config_dir = $conf['postfix']['config_dir']; + // Make a backup copy of the main.cf file + copy($conf['postfix']['config_dir'].'/main.cf', $conf['postfix']['config_dir'].'/main.cf~2'); - // Adding amavis-services to the master.cf file if the service does not already exists -// $add_amavis = !$this->get_postfix_service('amavis','unix'); -// $add_amavis_10025 = !$this->get_postfix_service('127.0.0.1:10025','inet'); -// $add_amavis_10027 = !$this->get_postfix_service('127.0.0.1:10027','inet'); - //*TODO: check templates against existing postfix-services to make sure we use the template + // Executing the postconf commands + foreach($postconf_commands as $cmd) { + $command = "postconf -e '$cmd'"; + caselog($command." &> /dev/null", __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); + } - // Or just remove the old service definitions and add them again? - $add_amavis = $this->remove_postfix_service('amavis','unix'); - $add_amavis_10025 = $this->remove_postfix_service('127.0.0.1:10025','inet'); - $add_amavis_10027 = $this->remove_postfix_service('127.0.0.1:10027','inet'); + // Adding amavis-services to the master.cf file - if ($add_amavis || $add_amavis_10025 || $add_amavis_10027) { - //* backup master.cf + // backup master.cf if(is_file($config_dir.'/master.cf')) copy($config_dir.'/master.cf', $config_dir.'/master.cf~'); - // adjust amavis-config - if($add_amavis) { - $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis.master', 'tpl/master_cf_amavis.master'); - af($config_dir.'/master.cf', $content); - unset($content); - } - if ($add_amavis_10025) { - $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10025.master', 'tpl/master_cf_amavis10025.master'); - af($config_dir.'/master.cf', $content); - unset($content); - } - if ($add_amavis_10027) { - $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10027.master', 'tpl/master_cf_amavis10027.master'); - af($config_dir.'/master.cf', $content); - unset($content); - } + + // first remove the old service definitions + $this->remove_postfix_service('amavis','unix'); + $this->remove_postfix_service('127.0.0.1:10025','inet'); + $this->remove_postfix_service('127.0.0.1:10027','inet'); + + // then add them back + $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis.master', 'tpl/master_cf_amavis.master'); + af($config_dir.'/master.cf', $content); + unset($content); + + $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10025.master', 'tpl/master_cf_amavis10025.master'); + af($config_dir.'/master.cf', $content); + unset($content); + + $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10027.master', 'tpl/master_cf_amavis10027.master'); + af($config_dir.'/master.cf', $content); + unset($content); } // Add the clamav user to the amavis group @@ -1728,14 +1775,21 @@ class installer_base { global $conf; //* These postconf commands will be executed on installation and update - $server_ini_rec = $this->db->queryOneRecord("SELECT config FROM ?? WHERE server_id = ?", $conf["mysql"]["database"] . '.server', $conf['server_id']); + $server_ini_rec = $this->db->queryOneRecord("SELECT mail_server, config FROM ?? WHERE server_id = ?", $conf["mysql"]["database"] . '.server', $conf['server_id']); $server_ini_array = ini_to_array(stripslashes($server_ini_rec['config'])); + $mail_server = ($server_ini_rec['mail_server']) ? true : false; unset($server_ini_rec); + $config_dir = $conf['postfix']['config_dir']; + $quoted_config_dir = preg_quote($config_dir, '|'); + $mail_config = $server_ini_array['mail']; - if($mail_config['content_filter'] === 'rspamd') { - exec("postconf -X 'receive_override_options'"); - exec("postconf -X 'content_filter'"); + //* only change postfix config if rspamd is active filter + if($mail_server && $mail_config['content_filter'] === 'rspamd') { + exec("postconf -X receive_override_options"); + exec("postconf -X content_filter"); + exec("postconf -X address_verify_virtual_transport"); + exec("postconf -X address_verify_transport_maps"); exec("postconf -e 'smtpd_milters = inet:localhost:11332'"); exec("postconf -e 'non_smtpd_milters = inet:localhost:11332'"); @@ -1786,6 +1840,9 @@ class installer_base { if (preg_match('/check_policy_service\s+inet:127.0.0.1:10023/', $value)) { continue; } + if (preg_match("|check_recipient_access\s+proxy:mysql:${quoted_config_dir}/mysql-verify_recipients.cf|", $value)) { + continue; + } $new_options[] = $value; } exec("postconf -e 'smtpd_recipient_restrictions = ".implode(", ", $new_options)."'"); @@ -1800,14 +1857,17 @@ class installer_base { if(!is_dir('/etc/rspamd/local.d/')){ mkdir('/etc/rspamd/local.d/', 0755, true); + chmod('/etc/rspamd/local.d/', 0755); } if(!is_dir('/etc/rspamd/local.d/maps.d/')){ mkdir('/etc/rspamd/local.d/maps.d/', 0755, true); + chmod('/etc/rspamd/local.d/maps.d/', 0755); } if(!is_dir('/etc/rspamd/override.d/')){ mkdir('/etc/rspamd/override.d/', 0755, true); + chmod('/etc/rspamd/override.d/', 0755); } if ( substr($mail_config['dkim_path'], strlen($mail_config['dkim_path'])-1) == '/' ) { @@ -1825,38 +1885,58 @@ class installer_base { fclose($fps); unset($dkim_domains); - # local.d templates with template tags - $tpl = new tpl(); - $tpl->newTemplate('rspamd_dkim_signing.conf.master'); - $tpl->setVar('dkim_path', $mail_config['dkim_path']); - wf('/etc/rspamd/local.d/dkim_signing.conf', $tpl->grab()); - - $tpl = new tpl(); - $tpl->newTemplate('rspamd_options.inc.master'); - + # look up values for use in template tags $local_addrs = array(); $ips = $this->db->queryAllRecords('SELECT `ip_address`, `ip_type` FROM ?? WHERE `server_id` = ?', $conf['mysql']['database'].'.server_ip', $conf['server_id']); if(is_array($ips) && !empty($ips)){ foreach($ips as $ip){ - $local_addrs[] = array('quoted_ip' => "\"".$ip['ip_address']."\",\n"); + $local_addrs[] = array( + 'ip' => $ip['ip_address'], + 'quoted_ip' => "\"".$ip['ip_address']."\",\n" + ); + } + } + + # local.d templates with template tags + # note: ensure these template files are in server/conf/ and symlinked in install/tpl/ + $local_d = array( + 'dkim_signing.conf', # dkim_signing.conf no longer uses template tags, could move below + 'options.inc', + 'redis.conf', + 'classifier-bayes.conf', + ); + foreach ($local_d as $f) { + $tpl = new tpl(); + if (file_exists($conf['ispconfig_install_dir']."/server/conf-custom/install/rspamd_${f}.master")) { + $tpl->newTemplate($conf['ispconfig_install_dir']."/server/conf-custom/install/rspamd_${f}.master"); + } else { + $tpl->newTemplate("rspamd_${f}.master"); + } + + $tpl->setVar('dkim_path', $mail_config['dkim_path']); + $tpl->setVar('rspamd_redis_servers', $mail_config['rspamd_redis_servers']); + $tpl->setVar('rspamd_redis_password', $mail_config['rspamd_redis_password']); + $tpl->setVar('rspamd_redis_bayes_servers', $mail_config['rspamd_redis_bayes_servers']); + $tpl->setVar('rspamd_redis_bayes_password', $mail_config['rspamd_redis_bayes_password']); + if(count($local_addrs) > 0) { + $tpl->setLoop('local_addrs', $local_addrs); } + + wf("/etc/rspamd/local.d/${f}", $tpl->grab()); } - $tpl->setLoop('local_addrs', $local_addrs); - wf('/etc/rspamd/local.d/options.inc', $tpl->grab()); + # local.d templates without template tags $local_d = array( 'groups.conf', 'antivirus.conf', - 'classifier-bayes.conf', - 'greylist.conf', 'mx_check.conf', - 'redis.conf', 'milter_headers.conf', 'neural.conf', 'neural_group.conf', 'users.conf', 'groups.conf', + 'arc.conf', ); foreach ($local_d as $f) { if(file_exists($conf['ispconfig_install_dir']."/server/conf-custom/install/rspamd_${f}.master")) { @@ -1881,10 +1961,10 @@ class installer_base { # local.d/maps.d templates without template tags $maps_d = array( - 'dkim_whitelist.inc', - 'dmarc_whitelist.inc', - 'spf_dkim_whitelist.inc', - 'spf_whitelist.inc', + 'dkim_whitelist.inc.ispc', + 'dmarc_whitelist.inc.ispc', + 'spf_dkim_whitelist.inc.ispc', + 'spf_whitelist.inc.ispc', ); foreach ($maps_d as $f) { if(file_exists($conf['ispconfig_install_dir']."/server/conf-custom/install/rspamd_${f}.master")) { @@ -1894,8 +1974,15 @@ class installer_base { } } + # rename rspamd templates we no longer use + if(file_exists("/etc/rspamd/local.d/greylist.conf")) { + rename("/etc/rspamd/local.d/greylist.conf", "/etc/rspamd/local.d/greylist.old"); + } exec('chmod a+r /etc/rspamd/local.d/* /etc/rspamd/local.d/maps.d/* /etc/rspamd/override.d/*'); + # protect passwords in these files + exec('chgrp _rspamd /etc/rspamd/local.d/redis.conf /etc/rspamd/local.d/classifier-bayes.conf /etc/rspamd/local.d/worker-controller.inc'); + exec('chmod 640 /etc/rspamd/local.d/redis.conf /etc/rspamd/local.d/classifier-bayes.conf /etc/rspamd/local.d/worker-controller.inc'); # unneccesary, since this was done above? $command = 'usermod -a -G amavis _rspamd'; @@ -1921,7 +2008,11 @@ class installer_base { unset($server_ini_string); $tpl = new tpl(); - $tpl->newTemplate('rspamd_worker-controller.inc.master'); + if (file_exists($conf['ispconfig_install_dir']."/server/conf-custom/install/rspamd_worker-controller.inc.master")) { + $tpl->newTemplate($conf['ispconfig_install_dir']."/server/conf-custom/install/rspamd_worker-controller.inc.master"); + } else { + $tpl->newTemplate("rspamd_worker-controller.inc.master"); + } $rspamd_password = $mail_config['rspamd_password']; $crypted_password = trim(exec('rspamadm pw -p ' . escapeshellarg($rspamd_password))); if($crypted_password) { @@ -2036,17 +2127,17 @@ class installer_base { } //* Create the ISPConfig database user in the local database - $query = "GRANT ALL ON ?? TO ?@'localhost'"; - if(!$this->db->query($query, $conf['powerdns']['database'] . '.*', $conf['mysql']['ispconfig_user'])) { + $query = "GRANT ALL ON ??.* TO ?@?"; + if(!$this->db->query($query, $conf['powerdns']['database'], $conf['mysql']['ispconfig_user'], 'localhost')) { $this->error('Unable to create user for powerdns database Error: '.$this->db->errorMessage); } //* load the powerdns databse dump if($conf['mysql']['admin_password'] == '') { - caselog("mysql --default-character-set=".$conf['mysql']['charset']." -h '".$conf['mysql']['host']."' -u '".$conf['mysql']['admin_user']."' '".$conf['powerdns']['database']."' < '".ISPC_INSTALL_ROOT."/install/sql/powerdns.sql' &> /dev/null", + caselog("mysql --default-character-set=".$conf['mysql']['charset']." -h '".$conf['mysql']['host']."' -u '".$conf['mysql']['admin_user']."' --force '".$conf['powerdns']['database']."' < '".ISPC_INSTALL_ROOT."/install/sql/powerdns.sql' &> /dev/null", __FILE__, __LINE__, 'read in ispconfig3.sql', 'could not read in powerdns.sql'); } else { - caselog("mysql --default-character-set=".$conf['mysql']['charset']." -h '".$conf['mysql']['host']."' -u '".$conf['mysql']['admin_user']."' -p'".$conf['mysql']['admin_password']."' '".$conf['powerdns']['database']."' < '".ISPC_INSTALL_ROOT."/install/sql/powerdns.sql' &> /dev/null", + caselog("mysql --default-character-set=".$conf['mysql']['charset']." -h '".$conf['mysql']['host']."' -u '".$conf['mysql']['admin_user']."' -p'".$conf['mysql']['admin_password']."' --force '".$conf['powerdns']['database']."' < '".ISPC_INSTALL_ROOT."/install/sql/powerdns.sql' &> /dev/null", __FILE__, __LINE__, 'read in ispconfig3.sql', 'could not read in powerdns.sql'); } @@ -2389,6 +2480,13 @@ class installer_base { exec('chown root:root '.$conf["squid"]["config_dir"].'/'.$configfile); } + public function configure_apparmor() { + $configfile = 'apparmor_usr.sbin.named'; + if(is_file('/etc/apparmor.d/local/usr.sbin.named')) copy('/etc/apparmor.d/local/usr.sbin.named', '/etc/apparmor.d/local/usr.sbin.named~'); + $content = rf("tpl/".$configfile.".master"); + wf('/etc/apparmor.d/local/usr.sbin.named', $content); + } + public function configure_ufw_firewall() { if($this->is_update == false) { @@ -2621,7 +2719,7 @@ class installer_base { // Enable SSL if a cert is in place. if(is_file($conf['ispconfig_install_dir'].'/interface/ssl/ispserver.crt') && is_file($conf['ispconfig_install_dir'].'/interface/ssl/ispserver.key')) { - $content = str_replace('{ssl_on}', 'ssl', $content); + $content = str_replace('{ssl_on}', 'ssl http2', $content); $content = str_replace('{ssl_comment}', '', $content); } else { $content = str_replace('{ssl_on}', '', $content); @@ -2671,11 +2769,17 @@ class installer_base { $content = str_replace('{use_socket}', $use_socket, $content); // Fix socket path on PHP 7 systems - if(file_exists('/var/run/php/php7.0-fpm.sock')) $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.0-fpm.sock', $content); - if(file_exists('/var/run/php/php7.1-fpm.sock')) $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.1-fpm.sock', $content); - if(file_exists('/var/run/php/php7.2-fpm.sock')) $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.2-fpm.sock', $content); - if(file_exists('/var/run/php/php7.3-fpm.sock')) $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.3-fpm.sock', $content); - if(file_exists('/var/run/php/php7.4-fpm.sock')) $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.4-fpm.sock', $content); + if (file_exists('/var/run/php/php7.4-fpm.sock')) { + $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.4-fpm.sock', $content); + } elseif(file_exists('/var/run/php/php7.3-fpm.sock')) { + $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.3-fpm.sock', $content); + } elseif (file_exists('/var/run/php/php7.2-fpm.sock')) { + $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.2-fpm.sock', $content); + } elseif (file_exists('/var/run/php/php7.1-fpm.sock')) { + $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.1-fpm.sock', $content); + } elseif (file_exists('/var/run/php/php7.0-fpm.sock')) { + $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.0-fpm.sock', $content); + } wf($vhost_conf_dir.'/apps.vhost', $content); @@ -2772,7 +2876,7 @@ class installer_base { if(@is_link($vhost_conf_enabled_dir.'/' . $use_symlink)) { unlink($vhost_conf_enabled_dir.'/' . $use_symlink); } - if(!@is_link($vhost_conf_enabled_dir.'' . $use_symlink)) { + if(!@is_file($vhost_conf_enabled_dir.'/' . $use_symlink)) { symlink($vhost_conf_dir.'/' . $use_name, $vhost_conf_enabled_dir.'/' . $use_symlink); } } @@ -2843,8 +2947,13 @@ class installer_base { $check_acme_file = $acme_cert_dir . '/cert.pem'; } } - swriteln('Using certificate path ' . $acme_cert_dir); + + if(!is_dir($conf['ispconfig_log_dir'])) { + mkdir($conf['ispconfig_log_dir'], 0755, true); + } + $acme_log = $conf['ispconfig_log_dir'] . '/acme.log'; + $ip_address_match = false; if(!(($svr_ip4 && in_array($svr_ip4, $dns_ips)) || ($svr_ip6 && in_array($svr_ip6, $dns_ips)))) { swriteln('Server\'s public ip(s) (' . $svr_ip4 . ($svr_ip6 ? ', ' . $svr_ip6 : '') . ') not found in A/AAAA records for ' . $hostname . ': ' . implode(', ', $dns_ips)); @@ -2866,16 +2975,25 @@ class installer_base { // This script is needed earlier to check and open http port 80 or standalone might fail // Make executable and temporary symlink latest letsencrypt pre, post and renew hook script before install if(file_exists(ISPC_INSTALL_ROOT . '/server/scripts/letsencrypt_pre_hook.sh') && !file_exists('/usr/local/bin/letsencrypt_pre_hook.sh')) { + if(is_link('/usr/local/bin/letsencrypt_pre_hook.sh')) { + unlink('/usr/local/bin/letsencrypt_pre_hook.sh'); + } symlink(ISPC_INSTALL_ROOT . '/server/scripts/letsencrypt_pre_hook.sh', '/usr/local/bin/letsencrypt_pre_hook.sh'); chown('/usr/local/bin/letsencrypt_pre_hook.sh', 'root'); chmod('/usr/local/bin/letsencrypt_pre_hook.sh', 0700); } if(file_exists(ISPC_INSTALL_ROOT . '/server/scripts/letsencrypt_post_hook.sh') && !file_exists('/usr/local/bin/letsencrypt_post_hook.sh')) { + if(is_link('/usr/local/bin/letsencrypt_post_hook.sh')) { + unlink('/usr/local/bin/letsencrypt_post_hook.sh'); + } symlink(ISPC_INSTALL_ROOT . '/server/scripts/letsencrypt_post_hook.sh', '/usr/local/bin/letsencrypt_post_hook.sh'); chown('/usr/local/bin/letsencrypt_post_hook.sh', 'root'); chmod('/usr/local/bin/letsencrypt_post_hook.sh', 0700); } if(file_exists(ISPC_INSTALL_ROOT . '/server/scripts/letsencrypt_renew_hook.sh') && !file_exists('/usr/local/bin/letsencrypt_renew_hook.sh')) { + if(is_link('/usr/local/bin/letsencrypt_renew_hook.sh')) { + unlink('/usr/local/bin/letsencrypt_renew_hook.sh'); + } symlink(ISPC_INSTALL_ROOT . '/server/scripts/letsencrypt_renew_hook.sh', '/usr/local/bin/letsencrypt_renew_hook.sh'); chown('/usr/local/bin/letsencrypt_renew_hook.sh', 'root'); chmod('/usr/local/bin/letsencrypt_renew_hook.sh', 0700); @@ -2895,11 +3013,11 @@ class installer_base { } // Get the default LE client name and version - $le_client = explode("\n", shell_exec('which letsencrypt certbot /root/.local/share/letsencrypt/bin/letsencrypt /opt/eff.org/certbot/venv/bin/certbot')); + $le_client = explode("\n", shell_exec('which certbot /root/.local/share/letsencrypt/bin/letsencrypt /opt/eff.org/certbot/venv/bin/certbot letsencrypt')); $le_client = reset($le_client); // Check for Neilpang acme.sh as well - $acme = explode("\n", shell_exec('which /usr/local/ispconfig/server/scripts/acme.sh /root/.acme.sh/acme.sh')); + $acme = explode("\n", shell_exec('which acme.sh /usr/local/ispconfig/server/scripts/acme.sh /root/.acme.sh/acme.sh')); $acme = reset($acme); if((!$acme || !is_executable($acme)) && (!$le_client || !is_executable($le_client))) { @@ -2907,10 +3025,13 @@ class installer_base { if(!$success) { swriteln('Failed installing acme.sh. Will not be able to issue certificate during install.'); } else { - $acme = explode("\n", shell_exec('which /usr/local/ispconfig/server/scripts/acme.sh /root/.acme.sh/acme.sh')); + $acme = explode("\n", shell_exec('which acme.sh /usr/local/ispconfig/server/scripts/acme.sh /root/.acme.sh/acme.sh')); $acme = reset($acme); if($acme && is_executable($acme)) { swriteln('Installed acme.sh and using it for certificate creation during install.'); + + // we do this even on install to enable automatic updates + $this->update_acme(); } else { swriteln('Failed installing acme.sh. Will not be able to issue certificate during install.'); } @@ -2947,14 +3068,30 @@ class installer_base { $issued_successfully = false; // Backup existing ispserver ssl files - if(file_exists($ssl_crt_file) || is_link($ssl_crt_file)) { - rename($ssl_crt_file, $ssl_crt_file . '-temporary.bak'); - } - if(file_exists($ssl_key_file) || is_link($ssl_key_file)) { - rename($ssl_key_file, $ssl_key_file . '-temporary.bak'); - } - if(file_exists($ssl_pem_file) || is_link($ssl_pem_file)) { - rename($ssl_pem_file, $ssl_pem_file . '-temporary.bak'); + // + // We may find valid or broken symlinks or actual files here. + // + // - dangling links are broken and get perm renamed (should just delete?). + // possibly web server can't start because vhost file points to non-existing cert files, + // we're not trying to catch or fix that (and not making it worse) + // + // - link to valid file is tmp renamed, and file copied to original name. + // if cert request is successful, remove the old symlink; + // if cert request fails, remove file copy and rename symlink to original name + // + // - actual file copied to tmp name. + // if cert request is successful, rename tmp copy to perm rename; + // if cert request fails, delete tmp copy + $cert_files = array( $ssl_crt_file, $ssl_key_file, $ssl_pem_file ); + foreach ($cert_files as $f) { + if (is_link($f) && ! file_exists($f)) { + rename($f, $f.'-'.$date->format('YmdHis').'.bak'); + } elseif (is_link($f)) { + rename($f, $f.'-temporary.bak'); + copy($f.'-temporary.bak', $f); + } elseif(file_exists($f)) { + copy($f, $f.'-temporary.bak'); + } } // Attempt to use Neilpang acme.sh first, as it is now the preferred LE client @@ -2966,14 +3103,17 @@ class installer_base { # acme.sh does not set umask, resulting in incorrect permissions (ispconfig issue #6015) $old_umask = umask(0022); + // Switch from zerossl to letsencrypt CA + exec("$acme --set-default-ca --server letsencrypt"); + $out = null; $ret = null; if($conf['nginx']['installed'] == true || $conf['apache']['installed'] == true) { - exec("$acme --issue -w /usr/local/ispconfig/interface/acme -d " . escapeshellarg($hostname) . " $renew_hook", $out, $ret); + exec("$acme --issue --log $acme_log -w /usr/local/ispconfig/interface/acme -d " . escapeshellarg($hostname) . " $renew_hook", $out, $ret); } // Else, it is not webserver, so we use standalone else { - exec("$acme --issue --standalone -d " . escapeshellarg($hostname) . " $hook", $out, $ret); + exec("$acme --issue --log $acme_log --standalone -d " . escapeshellarg($hostname) . " $hook", $out, $ret); } if($ret == 0 || ($ret == 2 && file_exists($check_acme_file))) { @@ -2985,31 +3125,33 @@ class installer_base { //$acme_cert = "--cert-file $acme_cert_dir/cert.pem"; $acme_key = "--key-file " . escapeshellarg($ssl_key_file); $acme_chain = "--fullchain-file " . escapeshellarg($ssl_crt_file); - exec("$acme --install-cert -d " . escapeshellarg($hostname) . " $acme_key $acme_chain"); + exec("$acme --install-cert --log $acme_log -d " . escapeshellarg($hostname) . " $acme_key $acme_chain"); $issued_successfully = true; umask($old_umask); // Make temporary backup of self-signed certs permanent - if(file_exists($ssl_crt_file.'-temporary.bak') || is_link($ssl_crt_file.'-temporary.bak')) - rename($ssl_crt_file.'-temporary.bak', $ssl_crt_file.'-'.$date->format('YmdHis').'.bak'); - if(file_exists($ssl_key_file.'-temporary.bak') || is_link($ssl_key_file.'-temporary.bak')) - rename($ssl_key_file.'-temporary.bak', $ssl_key_file.'-'.$date->format('YmdHis').'.bak'); - if(file_exists($ssl_pem_file.'-temporary.bak') || is_link($ssl_pem_file.'-temporary.bak')) - rename($ssl_pem_file.'-temporary.bak', $ssl_pem_file.'-'.$date->format('YmdHis').'.bak'); + foreach ($cert_files as $f) { + if (is_link($f.'-temporary.bak')) { + unlink($f.'-temporary.bak'); + } elseif(file_exists($f.'-temporary.bak')) { + rename($f.'-temporary.bak', $f.'-'.$date->format('YmdHis').'.bak'); + } + } } else { swriteln('Issuing certificate via acme.sh failed. Please check that your hostname can be verified by letsencrypt'); umask($old_umask); - // Restore temporary backup of self-signed certs - if(file_exists($ssl_crt_file.'-temporary.bak') || is_link($ssl_crt_file.'-temporary.bak')) - rename($ssl_crt_file.'-temporary.bak', $ssl_crt_file); - if(file_exists($ssl_key_file.'-temporary.bak') || is_link($ssl_key_file.'-temporary.bak')) - rename($ssl_key_file.'-temporary.bak', $ssl_key_file); - if(file_exists($ssl_pem_file.'-temporary.bak') || is_link($ssl_pem_file.'-temporary.bak')) - rename($ssl_pem_file.'-temporary.bak', $ssl_pem_file); - + // Restore/cleanup temporary backup of self-signed certs + foreach ($cert_files as $f) { + if (is_link($f.'-temporary.bak')) { + @unlink($f); + rename($f.'-temporary.bak', $f); + } elseif(file_exists($f.'-temporary.bak')) { + unlink($f.'-temporary.bak'); + } + } } // Else, we attempt to use the official LE certbot client certbot } else { @@ -3042,29 +3184,37 @@ class installer_base { // certbot returns with 0 on issue for already existing certificate $acme_cert_dir = '/etc/letsencrypt/live/' . $hostname; + foreach (array( $ssl_crt_file, $ssl_key_file) as $f) { + if (file_exists($f) && ! is_link($f)) { + unlink($f); + } + } symlink($acme_cert_dir . '/fullchain.pem', $ssl_crt_file); symlink($acme_cert_dir . '/privkey.pem', $ssl_key_file); $issued_successfully = true; // Make temporary backup of self-signed certs permanent - if(file_exists($ssl_crt_file.'-temporary.bak') || is_link($ssl_crt_file.'-temporary.bak')) - rename($ssl_crt_file.'-temporary.bak', $ssl_crt_file.'-'.$date->format('YmdHis').'.bak'); - if(file_exists($ssl_key_file.'-temporary.bak') || is_link($ssl_key_file.'-temporary.bak')) - rename($ssl_key_file.'-temporary.bak', $ssl_key_file.'-'.$date->format('YmdHis').'.bak'); - if(file_exists($ssl_pem_file.'-temporary.bak') || is_link($ssl_pem_file.'-temporary.bak')) - rename($ssl_pem_file.'-temporary.bak', $ssl_pem_file.'-'.$date->format('YmdHis').'.bak'); + foreach ($cert_files as $f) { + if (is_link($f.'-temporary.bak')) { + unlink($f.'-temporary.bak'); + } elseif(file_exists($f.'-temporary.bak')) { + rename($f.'-temporary.bak', $f.'-'.$date->format('YmdHis').'.bak'); + } + } } else { swriteln('Issuing certificate via certbot failed. Please check log files and make sure that your hostname can be verified by letsencrypt'); - // Restore temporary backup of self-signed certs - if(file_exists($ssl_crt_file.'-temporary.bak') || is_link($ssl_crt_file.'-temporary.bak')) - rename($ssl_crt_file.'-temporary.bak', $ssl_crt_file); - if(file_exists($ssl_key_file.'-temporary.bak') || is_link($ssl_key_file.'-temporary.bak')) - rename($ssl_key_file.'-temporary.bak', $ssl_key_file); - if(file_exists($ssl_pem_file.'-temporary.bak') || is_link($ssl_pem_file.'-temporary.bak')) - rename($ssl_pem_file.'-temporary.bak', $ssl_pem_file); + // Restore/cleanup temporary backup of self-signed certs + foreach ($cert_files as $f) { + if (is_link($f.'-temporary.bak')) { + @unlink($f); + rename($f.'-temporary.bak', $f); + } elseif(file_exists($f.'-temporary.bak')) { + unlink($f.'-temporary.bak'); + } + } } } else { @@ -3093,17 +3243,11 @@ class installer_base { } // We can still use the old self-signed method - $ssl_pw = substr(md5(mt_rand()), 0, 6); - exec("openssl genrsa -des3 -passout pass:$ssl_pw -out $ssl_key_file 4096"); + $openssl_cmd = 'openssl req -nodes -newkey rsa:4096 -x509 -days 3650 -keyout ' . escapeshellarg($ssl_key_file) . ' -out ' . escapeshellarg($ssl_crt_file); if(AUTOINSTALL){ - exec("openssl req -new -passin pass:$ssl_pw -passout pass:$ssl_pw -subj '/C=".escapeshellcmd($autoinstall['ssl_cert_country'])."/ST=".escapeshellcmd($autoinstall['ssl_cert_state'])."/L=".escapeshellcmd($autoinstall['ssl_cert_locality'])."/O=".escapeshellcmd($autoinstall['ssl_cert_organisation'])."/OU=".escapeshellcmd($autoinstall['ssl_cert_organisation_unit'])."/CN=".escapeshellcmd($autoinstall['ssl_cert_common_name'])."' -key $ssl_key_file -out $ssl_csr_file"); - } else { - exec("openssl req -new -passin pass:$ssl_pw -passout pass:$ssl_pw -key $ssl_key_file -out $ssl_csr_file"); + $openssl_cmd .= ' -subj ' . escapeshellarg('/C=' . $autoinstall['ssl_cert_country'] . '/ST=' . $autoinstall['ssl_cert_state'] . '/L=' . $autoinstall['ssl_cert_locality'] . '/O=' . $autoinstall['ssl_cert_organisation'] . '/OU=' . $autoinstall['ssl_cert_organisation_unit'] . '/CN=' . $autoinstall['ssl_cert_common_name']); } - exec("openssl req -x509 -passin pass:$ssl_pw -passout pass:$ssl_pw -key $ssl_key_file -in $ssl_csr_file -out $ssl_crt_file -days 3650"); - exec("openssl rsa -passin pass:$ssl_pw -in $ssl_key_file -out $ssl_key_file.insecure"); - rename($ssl_key_file, $ssl_key_file.'.secure'); - rename($ssl_key_file.'.insecure', $ssl_key_file); + exec($openssl_cmd); } // Build ispserver.pem file and chmod it @@ -3518,7 +3662,7 @@ class installer_base { $content = str_replace('{vhost_port}', $conf['nginx']['vhost_port'], $content); if(is_file($install_dir.'/interface/ssl/ispserver.crt') && is_file($install_dir.'/interface/ssl/ispserver.key')) { - $content = str_replace('{ssl_on}', 'ssl', $content); + $content = str_replace('{ssl_on}', 'ssl http2', $content); $content = str_replace('{ssl_comment}', '', $content); $content = str_replace('{fastcgi_ssl}', 'on', $content); } else { diff --git a/install/patches/upd_0094.php b/install/patches/upd_0094.php new file mode 100644 index 0000000000000000000000000000000000000000..304828931e7a10f08f022664c1ab861b94ad4d40 --- /dev/null +++ b/install/patches/upd_0094.php @@ -0,0 +1,17 @@ +<?php + +if(!defined('INSTALLER_RUN')) die('Patch update file access violation.'); + +class upd_0094 extends installer_patch_update { + + public function onBeforeSQL() { + global $inst; + + // Remove any duplicate mail_forwardings prior to adding unique key + //$inst->db->query("DELETE FROM mail_forwarding WHERE forwarding_id NOT IN (SELECT MIN(forwarding_id) FROM mail_forwarding GROUP BY source)"); + + // Remove any duplicate mail_transports prior to adding unique key + $inst->db->query("DELETE FROM mail_transport WHERE transport_id NOT IN (SELECT MIN(transport_id) FROM mail_transport GROUP BY domain, server_id)"); + } + +} diff --git a/install/sql/incremental/upd_0093.sql b/install/sql/incremental/upd_0093.sql index 71efb3085e18f6570e17b3b4a85288ae51620a85..96c5307f0ed22c0bda2651b41919f66af1a530a2 100644 --- a/install/sql/incremental/upd_0093.sql +++ b/install/sql/incremental/upd_0093.sql @@ -12,10 +12,10 @@ ALTER TABLE mail_domain ADD COLUMN `relay_host` varchar(255) NOT NULL default '' ADD COLUMN `relay_user` varchar(255) NOT NULL default '' AFTER `relay_host`, ADD COLUMN `relay_pass` varchar(255) NOT NULL default '' AFTER `relay_user`; -- Purge apps & addons installer (#5795) -DROP TABLE 'software_package'; -DROP TABLE 'software_repo'; -DROP TABLE 'software_update'; -DROP TABLE 'software_update_inst'; +DROP TABLE `software_package`; +DROP TABLE `software_repo`; +DROP TABLE `software_update`; +DROP TABLE `software_update_inst`; -- Brexit UPDATE `country` SET `eu` = 'n' WHERE `iso` = 'GB'; diff --git a/install/sql/incremental/upd_0094.sql b/install/sql/incremental/upd_0094.sql new file mode 100644 index 0000000000000000000000000000000000000000..2206658555b653d3bd4600e082faddbbb5b18816 --- /dev/null +++ b/install/sql/incremental/upd_0094.sql @@ -0,0 +1,20 @@ +-- Add column for email backup limit (#5732) +ALTER TABLE `client_template` ADD `limit_mail_backup` ENUM( 'n', 'y' ) NOT NULL DEFAULT 'y' AFTER `limit_spamfilter_policy`; +ALTER TABLE `client` ADD `limit_mail_backup` ENUM( 'n', 'y' ) NOT NULL DEFAULT 'y' AFTER `limit_spamfilter_policy`; + +-- default spamfilter_users.policy_id to 0 +ALTER TABLE `spamfilter_users` ALTER `policy_id` SET DEFAULT 0; + +-- mail_forwarding.source must be unique +ALTER TABLE `mail_forwarding` DROP KEY `server_id`; +ALTER TABLE `mail_forwarding` ADD KEY `server_id` (`server_id`, `source`); + +-- Purge apps & addons installer (#5795) - second time due to syntax error in 0093 +DROP TABLE IF EXISTS `software_package`; +DROP TABLE IF EXISTS `software_repo`; +DROP TABLE IF EXISTS `software_update`; +DROP TABLE IF EXISTS `software_update_inst`; + +-- mail_transport.domain must be unique +ALTER TABLE `mail_transport` DROP KEY `server_id_2`; +ALTER TABLE `mail_transport` ADD UNIQUE KEY `server_id_2` (`server_id`, `domain`); diff --git a/install/sql/incremental/upd_0095.sql b/install/sql/incremental/upd_0095.sql new file mode 100644 index 0000000000000000000000000000000000000000..0a17c387371c7ebd852f7dc2043b9f565ad8491e --- /dev/null +++ b/install/sql/incremental/upd_0095.sql @@ -0,0 +1 @@ +ALTER TABLE `remote_session` ADD `remote_ip` VARCHAR(39) NOT NULL DEFAULT '' AFTER `tstamp`; \ No newline at end of file diff --git a/install/sql/incremental/upd_0096.sql b/install/sql/incremental/upd_0096.sql new file mode 100644 index 0000000000000000000000000000000000000000..db4870ad663415a4eb1e7fa85d1fa09417690739 --- /dev/null +++ b/install/sql/incremental/upd_0096.sql @@ -0,0 +1,19 @@ +-- create mail_relay_domain and load with current domains from mail_transport table +CREATE TABLE IF NOT EXISTS `mail_relay_domain` ( + `relay_domain_id` bigint(20) NOT NULL AUTO_INCREMENT, + `sys_userid` int(11) NOT NULL DEFAULT '0', + `sys_groupid` int(11) NOT NULL DEFAULT '0', + `sys_perm_user` varchar(5) DEFAULT NULL, + `sys_perm_group` varchar(5) DEFAULT NULL, + `sys_perm_other` varchar(5) DEFAULT NULL, + `server_id` int(11) NOT NULL DEFAULT '0', + `domain` varchar(255) DEFAULT NULL, + `access` varchar(255) NOT NULL DEFAULT 'OK', + `active` varchar(255) NOT NULL DEFAULT 'y', + PRIMARY KEY (`relay_domain_id`), + UNIQUE KEY `domain` (`domain`, `server_id`) + ) DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; + +INSERT INTO `mail_relay_domain` SELECT NULL, `sys_userid`, `sys_groupid`, `sys_perm_user`, `sys_perm_group`, `sys_perm_other`, `server_id`, `domain`, 'OK', `active` FROM `mail_transport` WHERE `domain` NOT LIKE '%@%' AND `domain` LIKE '%.%' GROUP BY `domain`, `server_id`; + +ALTER TABLE `dns_soa` ADD `rendered_zone` MEDIUMTEXT NULL AFTER `dnssec_info`; diff --git a/install/sql/ispconfig3.sql b/install/sql/ispconfig3.sql index 006beb6b53945de3403408dac1bfcbab8b7bb498..ec6596bc779e4274d5612273e5f9fa96fd9a27cd 100644 --- a/install/sql/ispconfig3.sql +++ b/install/sql/ispconfig3.sql @@ -185,6 +185,7 @@ CREATE TABLE `client` ( `limit_spamfilter_wblist` int(11) NOT NULL DEFAULT '0', `limit_spamfilter_user` int(11) NOT NULL DEFAULT '0', `limit_spamfilter_policy` int(11) NOT NULL DEFAULT '0', + `limit_mail_backup` ENUM( 'n', 'y' ) NOT NULL DEFAULT 'y', `limit_relayhost` ENUM( 'n', 'y' ) NOT NULL DEFAULT 'n', `default_xmppserver` int(11) unsigned NOT NULL DEFAULT '1', `xmpp_servers` text, @@ -318,6 +319,7 @@ CREATE TABLE `client_template` ( `limit_spamfilter_wblist` int(11) NOT NULL default '0', `limit_spamfilter_user` int(11) NOT NULL default '0', `limit_spamfilter_policy` int(11) NOT NULL default '0', + `limit_mail_backup` ENUM( 'n', 'y' ) NOT NULL DEFAULT 'y', `limit_relayhost` ENUM( 'n', 'y' ) NOT NULL DEFAULT 'n', `default_xmppserver` int(11) unsigned NOT NULL DEFAULT '1', `xmpp_servers` text, @@ -633,6 +635,7 @@ CREATE TABLE `dns_soa` ( `dnssec_algo` SET('NSEC3RSASHA1','ECDSAP256SHA256') NOT NULL DEFAULT 'ECDSAP256SHA256', `dnssec_last_signed` BIGINT NOT NULL DEFAULT '0', `dnssec_info` TEXT NULL, + `rendered_zone` MEDIUMTEXT NULL, PRIMARY KEY (`id`), UNIQUE KEY `origin` (`origin`), KEY `active` (`active`) @@ -916,7 +919,7 @@ CREATE TABLE `mail_forwarding` ( `allow_send_as` ENUM('n','y') NOT NULL DEFAULT 'n', `greylisting` enum('n','y' ) NOT NULL DEFAULT 'n', PRIMARY KEY (`forwarding_id`), - KEY `server_id` (`server_id`,`source`), + KEY `server_id` (`server_id`, `source`), KEY `type` (`type`) ) DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; @@ -968,6 +971,27 @@ CREATE TABLE `mail_mailinglist` ( -- -------------------------------------------------------- +-- +-- Table structure for Table `mail_relay_domain` +-- + +CREATE TABLE IF NOT EXISTS `mail_relay_domain` ( + `relay_domain_id` bigint(20) NOT NULL AUTO_INCREMENT, + `sys_userid` int(11) NOT NULL DEFAULT '0', + `sys_groupid` int(11) NOT NULL DEFAULT '0', + `sys_perm_user` varchar(5) DEFAULT NULL, + `sys_perm_group` varchar(5) DEFAULT NULL, + `sys_perm_other` varchar(5) DEFAULT NULL, + `server_id` int(11) NOT NULL DEFAULT '0', + `domain` varchar(255) DEFAULT NULL, + `access` varchar(255) NOT NULL DEFAULT 'OK', + `active` varchar(255) NOT NULL DEFAULT 'y', + PRIMARY KEY (`relay_domain_id`), + UNIQUE KEY `domain` (`domain`, `server_id`) +) DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + -- -- Table structure for Table `mail_relay_recipient` -- @@ -1021,7 +1045,7 @@ CREATE TABLE `mail_transport` ( `active` enum('n','y') NOT NULL DEFAULT 'n', PRIMARY KEY (`transport_id`), KEY `server_id` (`server_id`,`transport`), - KEY `server_id_2` (`server_id`,`domain`) + UNIQUE KEY `server_id_2` (`server_id`, `domain`) ) DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; -- -------------------------------------------------------- @@ -1315,6 +1339,7 @@ CREATE TABLE `remote_session` ( `remote_functions` text, `client_login` tinyint(1) unsigned NOT NULL default '0', `tstamp` int(10) unsigned NOT NULL DEFAULT '0', + `remote_ip` varchar(39) NOT NULL DEFAULT '', PRIMARY KEY (`remote_session`) ) DEFAULT CHARSET=utf8 ; @@ -1545,7 +1570,7 @@ CREATE TABLE `spamfilter_users` ( `sys_perm_other` varchar(5) NOT NULL DEFAULT '', `server_id` int(11) unsigned NOT NULL DEFAULT '0', `priority` tinyint(3) unsigned NOT NULL default '7', - `policy_id` int(11) unsigned NOT NULL default '1', + `policy_id` int(11) unsigned NOT NULL default '0', `email` varchar(255) NOT NULL DEFAULT '', `fullname` varchar(64) default NULL, `local` varchar(1) default NULL, diff --git a/install/sql/powerdns.sql b/install/sql/powerdns.sql index c9bf8280f23f2aa593dcaafd6e793ce2786413c6..640e06eb060f3b8f6a3094fcae5a1695cf476d34 100644 --- a/install/sql/powerdns.sql +++ b/install/sql/powerdns.sql @@ -20,6 +20,8 @@ CREATE TABLE IF NOT EXISTS `records` ( `ttl` int(11) default NULL, `prio` int(11) default NULL, `change_date` int(11) default NULL, + `disabled` tinyint(1) default 0, + `auth` tinyint(1) default 1, `ispconfig_id` int(11) NOT NULL, PRIMARY KEY (`id`), KEY `rec_name_index` (`name`), @@ -32,3 +34,26 @@ CREATE TABLE IF NOT EXISTS `supermasters` ( `nameserver` varchar(255) NOT NULL, `account` varchar(40) default NULL ) ENGINE=InnoDB; + +CREATE TABLE IF NOT EXISTS `domainmetadata` ( + `id` int auto_increment, + `domain_id` int NOT NULL, + `kind` varchar(32), + `content` TEXT, + PRIMARY KEY (`id`) +) Engine=InnoDB; + + +-- add new columns if not existing +SET @dbname = DATABASE(); + +SELECT count(*) INTO @exist FROM `information_schema`.`columns` WHERE `table_schema` = @dbname AND `column_name` = 'auth' AND `table_name` = 'records' LIMIT 1; +SET @query = IF(@exist <= 0, 'ALTER TABLE `records` ADD COLUMN `auth` tinyint(1) default 1 AFTER `change_date`', 'SELECT \'Column Exists\' STATUS'); +PREPARE stmt FROM @query; +EXECUTE stmt; + +SELECT count(*) INTO @exist FROM `information_schema`.`columns` WHERE `table_schema` = @dbname AND `column_name` = 'disabled' AND `table_name` = 'records' LIMIT 1; +SET @query = IF(@exist <= 0, 'ALTER TABLE `records` ADD COLUMN `disabled` tinyint(1) default 0 AFTER `change_date`', 'SELECT \'Column Exists\' STATUS'); +PREPARE stmt FROM @query; +EXECUTE stmt; + diff --git a/install/tpl/amavisd_user_config.master b/install/tpl/amavisd_user_config.master index 344ea9a152de0ab43982c83b18b6bb7e99525d6c..f764bb3acb0bedd1c884f255662e7782e58b473a 100644 --- a/install/tpl/amavisd_user_config.master +++ b/install/tpl/amavisd_user_config.master @@ -33,7 +33,8 @@ use strict; $sql_select_policy = 'SELECT *,spamfilter_users.id'. ' FROM spamfilter_users LEFT JOIN spamfilter_policy ON spamfilter_users.policy_id=spamfilter_policy.id'. - ' WHERE spamfilter_users.email IN (%k) ORDER BY spamfilter_users.priority DESC'; + ' WHERE spamfilter_users.email IN (%k) AND spamfilter_users.policy_id != 0'. + ' ORDER BY spamfilter_users.priority DESC'; $sql_select_white_black_list = 'SELECT wb FROM spamfilter_wblist'. diff --git a/install/tpl/apache_apps.vhost.master b/install/tpl/apache_apps.vhost.master index 8d6df71b7da0cf2c07e7e57cce50c77d04787b2e..6957ed5eb8062dc8f65021710ebb637c5e22dc7d 100644 --- a/install/tpl/apache_apps.vhost.master +++ b/install/tpl/apache_apps.vhost.master @@ -9,10 +9,12 @@ <VirtualHost {tmpl_var name='apps_vhost_ip'}:{tmpl_var name='apps_vhost_port'}> ServerAdmin webmaster@localhost {tmpl_var name='apps_vhost_servername'} - - <FilesMatch "\.ph(p3?|tml)$"> - SetHandler None - </FilesMatch> + + <Directory {tmpl_var name='apps_vhost_dir'}> + <FilesMatch "\.ph(p3?|tml)$"> + SetHandler None + </FilesMatch> + </Directory> # SSL Configuration <tmpl_var name="ssl_comment">SSLEngine On @@ -96,7 +98,7 @@ DocumentRoot {tmpl_var name='apps_vhost_dir'} SuexecUserGroup ispapps ispapps <Directory {tmpl_var name='apps_vhost_dir'}> - Options +Indexes +FollowSymLinks +MultiViews +ExecCGI + Options -Indexes +FollowSymLinks +MultiViews +ExecCGI AllowOverride AuthConfig Indexes Limit Options FileInfo <FilesMatch "\.php$"> SetHandler fcgid-script @@ -109,6 +111,8 @@ Allow from all </tmpl_if> </Directory> + IPCCommTimeout 7200 + MaxRequestLen 15728640 </IfModule> {tmpl_if name="use_rspamd"} diff --git a/install/tpl/apache_ispconfig.vhost.master b/install/tpl/apache_ispconfig.vhost.master index 0d12694f7ae57b57f1a24c4407b37d45d9ae9492..df0b98fda7da7c7c4ff5896742a65ad1f8476350 100644 --- a/install/tpl/apache_ispconfig.vhost.master +++ b/install/tpl/apache_ispconfig.vhost.master @@ -112,4 +112,8 @@ NameVirtualHost *:<tmpl_var name="vhost_port"> <tmpl_var name="ssl_comment">SSLStaplingResponderTimeout 5 <tmpl_var name="ssl_comment">SSLStaplingReturnResponderErrors Off </tmpl_if> + + # Redirect http to https + ErrorDocument 400 "<script>document.location.href='https://'+location.hostname+':'+location.port;</script><h1>Error 400 - trying to redirect</h1>" + </VirtualHost> diff --git a/install/tpl/apparmor_usr.sbin.named.master b/install/tpl/apparmor_usr.sbin.named.master new file mode 100644 index 0000000000000000000000000000000000000000..38a30ffc875e1447001523efbcd42192fdb6082a --- /dev/null +++ b/install/tpl/apparmor_usr.sbin.named.master @@ -0,0 +1,2 @@ +/etc/bind/slave/** lrw, +/etc/bind/slave/ rw, diff --git a/install/tpl/debian6_dovecot2.conf.master b/install/tpl/debian6_dovecot2.conf.master index 91d745bc39ec56d01ba2b8be017673d76b1a91d5..36ae86fa6df7023218ba12d686fdb6a6c964ec38 100644 --- a/install/tpl/debian6_dovecot2.conf.master +++ b/install/tpl/debian6_dovecot2.conf.master @@ -68,21 +68,21 @@ service imap-login { process_limit = 512 } protocol imap { - mail_plugins = quota imap_quota + mail_plugins = $mail_plugins quota imap_quota auth_verbose = yes } protocol pop3 { pop3_uidl_format = %08Xu%08Xv - mail_plugins = quota + mail_plugins = $mail_plugins quota auth_verbose = yes } protocol lda { postmaster_address = webmaster@localhost - mail_plugins = sieve quota + mail_plugins = $mail_plugins sieve quota } protocol lmtp { postmaster_address = webmaster@localhost - mail_plugins = quota sieve + mail_plugins = $mail_plugins quota sieve } #2.3+ service stats { @@ -91,7 +91,7 @@ protocol lmtp { #2.3+ group = vmail #2.3+ mode = 0660 #2.3+ } -#2.3+ +#2.3+ #2.3+ unix_listener stats-writer { #2.3+ user = vmail #2.3+ group = vmail @@ -134,4 +134,5 @@ namespace inbox { special_use = \Trash } } -!include_try conf.d/99-ispconfig-custom-config.conf + +!include_try conf.d/99-ispconfig-custom-config.conf \ No newline at end of file diff --git a/install/tpl/debian_dovecot2.conf.master b/install/tpl/debian_dovecot2.conf.master index acbb5ccdff11a01fabe0b59b6b9bd7a31d4ee46e..12288e2cdeaf510cc80603eb9bd616a371076ed9 100644 --- a/install/tpl/debian_dovecot2.conf.master +++ b/install/tpl/debian_dovecot2.conf.master @@ -65,21 +65,21 @@ service imap-login { process_limit = 512 } protocol imap { - mail_plugins = quota imap_quota + mail_plugins = $mail_plugins quota imap_quota auth_verbose = yes } protocol pop3 { pop3_uidl_format = %08Xu%08Xv - mail_plugins = quota + mail_plugins = $mail_plugins quota auth_verbose = yes } protocol lda { postmaster_address = webmaster@localhost - mail_plugins = sieve quota + mail_plugins = $mail_plugins sieve quota } protocol lmtp { postmaster_address = webmaster@localhost - mail_plugins = quota sieve + mail_plugins = $mail_plugins quota sieve } @@ -111,4 +111,5 @@ plugin { quota_status_nouser = DUNNO quota_status_overquota = "552 5.2.2 Mailbox is full" } -!include_try conf.d/99-ispconfig-custom-config.conf + +!include_try conf.d/99-ispconfig-custom-config.conf \ No newline at end of file diff --git a/install/tpl/debian_postfix.conf.master b/install/tpl/debian_postfix.conf.master index 5023caf6bee402159e822caa7a396ccd8f910242..8bd34f6928b8a57c516bf4edd848c7892f8018c8 100644 --- a/install/tpl/debian_postfix.conf.master +++ b/install/tpl/debian_postfix.conf.master @@ -59,3 +59,5 @@ smtp_sender_dependent_authentication = yes smtp_sasl_auth_enable = yes smtp_sasl_security_options = noanonymous, noplaintext smtp_sasl_tls_security_options = noanonymous +authorized_flush_users = +authorized_mailq_users = nagios, icinga diff --git a/install/tpl/fedora_amavisd_conf.master b/install/tpl/fedora_amavisd_conf.master index 9cf4b801bc669813239dc8d4478729b492623872..2435e6939e06511899dde1377f50c27de15c48b5 100644 --- a/install/tpl/fedora_amavisd_conf.master +++ b/install/tpl/fedora_amavisd_conf.master @@ -751,7 +751,8 @@ $banned_filename_re = new_RE( $sql_select_policy = 'SELECT *,spamfilter_users.id'. ' FROM spamfilter_users LEFT JOIN spamfilter_policy ON spamfilter_users.policy_id=spamfilter_policy.id'. - ' WHERE spamfilter_users.email IN (%k) ORDER BY spamfilter_users.priority DESC'; + ' WHERE spamfilter_users.email IN (%k) AND spamfilter_users.policy_id != 0'. + ' ORDER BY spamfilter_users.priority DESC'; $sql_select_white_black_list = 'SELECT wb FROM spamfilter_wblist'. diff --git a/install/tpl/fedora_dovecot2.conf.master b/install/tpl/fedora_dovecot2.conf.master index 0b31c23b4e159430863511213f5e5868a3867fb1..d4cd148ef0e3e6c8138d844840084d57dda18e5c 100644 --- a/install/tpl/fedora_dovecot2.conf.master +++ b/install/tpl/fedora_dovecot2.conf.master @@ -62,21 +62,21 @@ service imap-login { process_limit = 500 } protocol imap { - mail_plugins = quota imap_quota + mail_plugins = $mail_plugins quota imap_quota auth_verbose = yes } protocol pop3 { pop3_uidl_format = %08Xu%08Xv - mail_plugins = quota + mail_plugins = $mail_plugins quota auth_verbose = yes } protocol lda { - mail_plugins = sieve quota + mail_plugins = $mail_plugins sieve quota postmaster_address = root@localhost } protocol lmtp { postmaster_address = webmaster@localhost - mail_plugins = quota sieve + mail_plugins = $mail_plugins quota sieve } #2.3+ service stats { @@ -128,4 +128,5 @@ namespace inbox { special_use = \Trash } } + !include_try conf.d/99-ispconfig-custom-config.conf diff --git a/install/tpl/fedora_postfix.conf.master b/install/tpl/fedora_postfix.conf.master index c5786c6ea8cf54262d0325a0ebccbe97d2cca640..8d2b1a9dc25b5211e0c7a42dfb69354d53455b78 100644 --- a/install/tpl/fedora_postfix.conf.master +++ b/install/tpl/fedora_postfix.conf.master @@ -55,3 +55,5 @@ smtp_sender_dependent_authentication = yes smtp_sasl_auth_enable = yes smtp_sasl_security_options = noanonymous, noplaintext smtp_sasl_tls_security_options = noanonymous +authorized_flush_users = +authorized_mailq_users = nagios, icinga diff --git a/install/tpl/gentoo_postfix.conf.master b/install/tpl/gentoo_postfix.conf.master index 405640f52a9dd4310289db241ee6fce61fec8aea..c6b1c2f9c509c6ba20ef94572192c676ac274d4a 100644 --- a/install/tpl/gentoo_postfix.conf.master +++ b/install/tpl/gentoo_postfix.conf.master @@ -54,3 +54,5 @@ smtp_sender_dependent_authentication = yes smtp_sasl_auth_enable = yes smtp_sasl_security_options = noanonymous, noplaintext smtp_sasl_tls_security_options = noanonymous +authorized_flush_users = +authorized_mailq_users = nagios, icinga diff --git a/install/tpl/jk_init.ini.master b/install/tpl/jk_init.ini.master index 1060085e397e6a835b7b75e82e1b00c0b9835226..0f9acb1cedf6c6e733c49e73397a876730268cc9 100644 --- a/install/tpl/jk_init.ini.master +++ b/install/tpl/jk_init.ini.master @@ -6,11 +6,11 @@ [uidbasics] comment = common files for all jails that need user/group information -paths = /lib/libnsl.so.1, /lib64/libnsl.so.1, /lib/libnss*.so.2, /lib64/libnss*.so.2, /lib/i386-linux-gnu/libnsl.so.1, /lib/i386-linux-gnu/libnss*.so.2, /lib/x86_64-linux-gnu/libnsl.so.1, /lib/x86_64-linux-gnu/libnss*.so.2, /lib/arm-linux-gnueabihf/libnsl*.so.1, /lib/arm-linux-gnueabihf/libnss*.so.2, /lib/aarch64-linux-gnu/libnsl.so.1, /lib/aarch64-linux-gnu/libnss*.so.2, /etc/nsswitch.conf, /etc/ld.so.conf +paths = /lib*/libnsl.so.*, /lib*/libnss*.so.*, /lib/*/libnsl.so.*, /lib/*/libnss*.so.*, /etc/nsswitch.conf, /etc/ld.so.conf [netbasics] comment = common files for all jails that need any internet connectivity -paths = /lib/libnss_dns.so.2, /lib64/libnss_dns.so.2, /lib/libnss_mdns*.so.2, /lib/i386-linux-gnu/libnss_dns.so.2, /lib/x86_64-linux-gnu/libnss_dns.so.2, /lib/arm-linux-gnueabihf/libnss_dns.so.2, /lib/aarch64-linux-gnu/libnss_dns.so.2, /etc/resolv.conf, /etc/host.conf, /etc/hosts, /etc/protocols, /etc/services, /etc/ssl/certs/, /usr/lib/ssl/certs +paths = /lib*/libnss_dns.so.*, /lib*/libnss_mdns*.so.*, /lib/*/libnss_dns.so.*, /lib/*/libnss_mdns*.so.*, /etc/resolv.conf, /etc/host.conf, /etc/hosts, /etc/protocols, /etc/services, /etc/ssl/certs/, /usr/lib/ssl/certs [logbasics] comment = timezone information and log sockets @@ -35,22 +35,20 @@ devices = /dev/null [git] comment = Fast Version Control System -paths = /usr/bin/git*, /usr/lib/git-core, /usr/share/git-core, /usr/bin/pager +paths = /usr/bin/git*, /usr/lib/git-core, /usr/share/git-core, pager includesections = editors, perl, netbasics, basicshell, coreutils [scp] comment = ssh secure copy paths = scp includesections = netbasics, uidbasics -devices = /dev/urandom +devices = /dev/urandom, /dev/null [sftp] comment = ssh secure ftp paths = /usr/lib/sftp-server, /usr/libexec/openssh/sftp-server, /usr/lib/misc/sftp-server, /usr/libexec/sftp-server, /usr/lib/openssh/sftp-server includesections = netbasics, uidbasics devices = /dev/urandom, /dev/null -# on solaris -#paths = /usr/lib/ssh/sftp-server [ssh] comment = ssh secure shell @@ -74,6 +72,10 @@ users = root groups = root includesections = uidbasics +[interactiveshell] +comment = for ssh access to a full shell +includesections = uidbasics, basicshell, terminfo, editors, extendedshell + [midnightcommander] comment = Midnight Commander paths = mc, mcedit, mcview, /usr/share/mc @@ -85,7 +87,7 @@ paths = awk, bzip2, bunzip2, ldd, less, clear, cut, du, find, head, less, md5sum includesections = basicshell, midnightcommander, editors [terminfo] -comment = terminfo databases, required for example for ncurses or vim +comment = terminfo databases, required for example for ncurses or vim paths = /etc/terminfo, /usr/share/terminfo, /lib/terminfo [editors] @@ -94,8 +96,8 @@ includesections = terminfo paths = joe, nano, vi, vim, /etc/vimrc, /etc/joe, /usr/share/vim [netutils] -comment = several internet utilities like wget, ftp, rsync, scp, ssh -paths = wget, lynx, ftp, host, rsync, smbclient +comment = several internet utilities like curl, wget, ftp, rsync, scp, ssh +paths = curl, wget, lynx, ftp, host, rsync, smbclient includesections = netbasics, ssh, sftp, scp [apacheutils] @@ -158,7 +160,7 @@ paths = cat, chgrp, chmod, chown, cp, date, dd, df, dir, echo, false, ln, ls, mk [wp] comment = WordPress Command Line -paths = wp, /usr/local/bin/php +paths = wp, which, mysqlcheck, tput, unrar, /usr/local/bin/php includesections = php, mysql-client [mysql-client] @@ -173,7 +175,7 @@ includesections = php, uidbasics, netbasics [node] comment = NodeJS -paths = npm, node, nodejs, /usr/lib/nodejs, /usr/share/npm, /usr/share/node-mime, /usr/lib/node_modules, /usr/local/lib/nodejs, /usr/local/lib/node_modules, elmi-to-json, /usr/local/bin/elmi-to-json +paths = npm, npx, node, nodejs, semver, /usr/lib/nodejs, /usr/share/nodejs, /usr/share/npm, /usr/share/node-mime, /usr/lib/node_modules, /usr/local/lib/nodejs, /usr/local/lib/node_modules, /etc/npmrc, /etc/npmignore, elmi-to-json, /usr/local/bin/elmi-to-json [env] comment = /usr/bin/env for environment variables @@ -226,11 +228,21 @@ comment = php version 7.4 paths = /usr/bin/php7.4, /usr/lib/php/7.4/, /usr/lib/php/20190902/, /usr/share/php/7.4/, /etc/php/7.4/cli/, /etc/php/7.4/mods-available/ includesections = php_common -[imagemagick] -comment = ImageMagick needed for php-imagemagick extension -paths = /usr/share/ImageMagick-*, /etc/ImageMagick-*, /usr/lib/i386-linux-gnu/ImageMagick-*, /usr/lib/x86_64-linux-gnu/ImageMagick-*, /usr/lib/arm-linux-gnueabihf/ImageMagick-*, /usr/lib/aarch64-linux-gnu/ImageMagick-* - [php8_0] comment = php version 8.0 paths = /usr/bin/php8.0, /usr/lib/php/8.0/, /usr/lib/php/20200930/, /usr/share/php/8.0/, /etc/php/8.0/cli/, /etc/php/8.0/mods-available/ includesections = php_common + +[php8_1] +comment = php version 8.1 +paths = /usr/bin/php8.1, /usr/lib/php/8.1/, /usr/lib/php/20210902/, /usr/share/php/8.1/, /etc/php/8.1/cli/, /etc/php/8.1/mods-available/ +includesections = php_common + +[php8_2] +comment = php version 8.2 +paths = /usr/bin/php8.2, /usr/lib/php/8.2/, /usr/lib/php/20210902/, /usr/share/php/8.2/, /etc/php/8.2/cli/, /etc/php/8.2/mods-available/ +includesections = php_common + +[imagemagick] +comment = ImageMagick needed for php-imagemagick extension +paths = /usr/share/ImageMagick-*, /etc/ImageMagick-*, /usr/lib/*/ImageMagick-* diff --git a/install/tpl/master_cf_amavis.master b/install/tpl/master_cf_amavis.master index 243f28a288dc2e5f27a54f79422a9b5f48571d76..a565f1a1bb50977d8d945e1efcf3b07b641c617d 100644 --- a/install/tpl/master_cf_amavis.master +++ b/install/tpl/master_cf_amavis.master @@ -2,5 +2,5 @@ amavis unix - - - - 2 smtp -o smtp_data_done_timeout=1200 -o smtp_send_xforward_command=yes - -o smtp_bind_address= + -o smtp_bind_address= diff --git a/install/tpl/master_cf_amavis10025.master b/install/tpl/master_cf_amavis10025.master index 6dee892264d3d6f5491fecb104a0242f079cda88..68d4561494b0568c7b4bbac4e6d51ad13c1f66f2 100644 --- a/install/tpl/master_cf_amavis10025.master +++ b/install/tpl/master_cf_amavis10025.master @@ -14,4 +14,6 @@ -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks -o smtp_send_xforward_command=yes -o disable_dns_lookups=yes + -o address_verify_virtual_transport=$virtual_transport + -o address_verify_transport_maps=$transport_maps diff --git a/install/tpl/master_cf_amavis10027.master b/install/tpl/master_cf_amavis10027.master index 640902d52e109a76d206cb72123b7cf1ea65e9d0..d3a07a8bce45d1e2c415f1a6085323faa9066261 100644 --- a/install/tpl/master_cf_amavis10027.master +++ b/install/tpl/master_cf_amavis10027.master @@ -13,7 +13,9 @@ -o strict_rfc821_envelopes=yes -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks -o smtp_send_xforward_command=yes - -o milter_default_action=accept - -o milter_macro_daemon_name=ORIGINATING -o disable_dns_lookups=yes + -o address_verify_virtual_transport=$virtual_transport + -o address_verify_transport_maps=$transport_maps + -o milter_default_action=accept + -o milter_macro_daemon_name=ORIGINATING diff --git a/install/tpl/mysql-virtual_email2email.cf.master b/install/tpl/mysql-virtual_email2email.cf.master index f420a104d9ac0235362178ba35c7fa672375e888..21d5146f2c129485c237fcc980f06ccf473c8e25 100644 --- a/install/tpl/mysql-virtual_email2email.cf.master +++ b/install/tpl/mysql-virtual_email2email.cf.master @@ -2,7 +2,7 @@ user = {mysql_server_ispconfig_user} password = {mysql_server_ispconfig_password} dbname = {mysql_server_database} hosts = {mysql_server_ip} -query = SELECT email FROM mail_user WHERE email = '%s' AND forward_in_lda = 'n' AND disabledeliver = 'n' AND disablesmtp = 'n' AND server_id = {server_id} +query = SELECT email FROM mail_user WHERE email = '%s' AND forward_in_lda = 'n' AND disabledeliver = 'n' AND postfix = 'y' AND server_id = {server_id} AND EXISTS (SELECT domain_id FROM mail_domain WHERE domain = SUBSTRING_INDEX('%s', '@', -1) AND active = 'y' AND server_id = {server_id}) UNION SELECT cc AS email FROM mail_user WHERE email = '%s' AND cc != '' AND (forward_in_lda = 'n' OR disabledeliver = 'y') AND disablesmtp = 'n' AND server_id = {server_id} diff --git a/install/tpl/mysql-virtual_relaydomains.cf.master b/install/tpl/mysql-virtual_relaydomains.cf.master index 5ce2db6954429b96b9b4437f2cd9831cb002bc21..c27596d1e75d56e522ad5c40a67399af406cec29 100644 --- a/install/tpl/mysql-virtual_relaydomains.cf.master +++ b/install/tpl/mysql-virtual_relaydomains.cf.master @@ -2,4 +2,4 @@ user = {mysql_server_ispconfig_user} password = {mysql_server_ispconfig_password} dbname = {mysql_server_database} hosts = {mysql_server_ip} -query = select domain from mail_transport where domain = '%s' and active = 'y' and server_id = {server_id} +query = select domain from mail_relay_domain where domain = '%s' and active = 'y' and server_id = {server_id} diff --git a/install/tpl/named.conf.options.master b/install/tpl/named.conf.options.master index cd5b0ebc2f614b0ab2881c733de35b42f068823c..588488c1815e82587b2113953040e3f1138b8ea6 100644 --- a/install/tpl/named.conf.options.master +++ b/install/tpl/named.conf.options.master @@ -18,12 +18,9 @@ options { // If BIND logs error messages about the root key being expired, // you will need to update your keys. See https://www.isc.org/bind-keys //======================================================================== - dnssec-enable yes; - dnssec-validation yes; - dnssec-lookaside auto; version "unknown"; - + allow-transfer {none;}; auth-nxdomain no; # conform to RFC1035 diff --git a/install/tpl/nginx_apps.vhost.master b/install/tpl/nginx_apps.vhost.master index de4842005491ef64b207bbbb85ee347298585638..181f4c807e2ee0761e61ef26f3f0589153703ca2 100644 --- a/install/tpl/nginx_apps.vhost.master +++ b/install/tpl/nginx_apps.vhost.master @@ -1,6 +1,6 @@ server { - listen {apps_vhost_ip}{apps_vhost_port} {ssl_on} http2; - listen [::]:{apps_vhost_port} {ssl_on} ipv6only=on http2; + listen {apps_vhost_ip}{apps_vhost_port} {ssl_on}; + listen [::]:{apps_vhost_port} {ssl_on} ipv6only=on; {ssl_comment}ssl_protocols TLSv1.2; {ssl_comment}ssl_certificate /usr/local/ispconfig/interface/ssl/ispserver.crt; diff --git a/install/tpl/nginx_ispconfig.vhost.master b/install/tpl/nginx_ispconfig.vhost.master index e1c39ee98b8224661feba4350097b861dd6d9d30..dbe44d7064861eae187731a39e5ced7d120affd3 100644 --- a/install/tpl/nginx_ispconfig.vhost.master +++ b/install/tpl/nginx_ispconfig.vhost.master @@ -1,6 +1,6 @@ server { - listen {vhost_port} {ssl_on} http2; - listen [::]:{vhost_port} {ssl_on} ipv6only=on http2; + listen {vhost_port} {ssl_on}; + listen [::]:{vhost_port} {ssl_on} ipv6only=on; {ssl_comment}ssl_protocols TLSv1.2; {ssl_comment}ssl_certificate /usr/local/ispconfig/interface/ssl/ispserver.crt; diff --git a/install/tpl/opensuse_amavisd_conf.master b/install/tpl/opensuse_amavisd_conf.master index 419eea237c2a81d2bbb939a135ffe0accacfd4c4..7310db9cbf9e45956d5ce6cdbb7aa1dcaf19231d 100644 --- a/install/tpl/opensuse_amavisd_conf.master +++ b/install/tpl/opensuse_amavisd_conf.master @@ -746,7 +746,8 @@ $banned_filename_re = new_RE( $sql_select_policy = 'SELECT *,spamfilter_users.id'. ' FROM spamfilter_users LEFT JOIN spamfilter_policy ON spamfilter_users.policy_id=spamfilter_policy.id'. - ' WHERE spamfilter_users.email IN (%k) ORDER BY spamfilter_users.priority DESC'; + ' WHERE spamfilter_users.email IN (%k) AND spamfilter_users.policy_id != 0'. + ' ORDER BY spamfilter_users.priority DESC'; $sql_select_white_black_list = 'SELECT wb FROM spamfilter_wblist'. diff --git a/install/tpl/opensuse_postfix.conf.master b/install/tpl/opensuse_postfix.conf.master index a98f4223e13ee1d9221885d4ee6775b08de239ce..03f134bb0804ae2d70f12afef0068736e5b1e506 100644 --- a/install/tpl/opensuse_postfix.conf.master +++ b/install/tpl/opensuse_postfix.conf.master @@ -57,3 +57,5 @@ smtp_sender_dependent_authentication = yes smtp_sasl_auth_enable = yes smtp_sasl_security_options = noanonymous, noplaintext smtp_sasl_tls_security_options = noanonymous +authorized_flush_users = +authorized_mailq_users = nagios, icinga diff --git a/install/tpl/rspamd_antivirus.conf.master b/install/tpl/rspamd_antivirus.conf.master index f88d81ac7ce94c881087b93e0d08bc2f1849f429..aa3d2cc9f252970ad246a6cafdefea639438f36e 100644 --- a/install/tpl/rspamd_antivirus.conf.master +++ b/install/tpl/rspamd_antivirus.conf.master @@ -1,8 +1,11 @@ clamav { # If set force this action if any virus is found (default unset: no action is forced) #action = "reject"; - # if `true` only messages with non-image attachments will be checked (default true) + # Scan mime_parts separately - otherwise the complete mail will be transferred to AV Scanner scan_mime_parts = true; + # Scanning Text is suitable for some av scanner databases (e.g. Sanesecurity) + scan_text_mime = true; + scan_image_mime = true; # If `max_size` is set, messages > n bytes in size are not scanned #max_size = 20000000; # symbol to add (add it to metric if you want non-zero weight) @@ -25,6 +28,10 @@ clamav { # symbol_name = "pattern"; JUST_EICAR = "^Eicar-Test-Signature$"; } + patterns_fail { + # symbol_name = "pattern"; + CLAM_PROTOCOL_ERROR = '^unhandled response'; + } # `whitelist` points to a map of IP addresses. Mail from these addresses is not scanned. whitelist = "/etc/rspamd/antivirus.wl"; -} \ No newline at end of file +} diff --git a/install/tpl/rspamd_arc.conf.master b/install/tpl/rspamd_arc.conf.master new file mode 100644 index 0000000000000000000000000000000000000000..781f83ccb26ae13406725022e3f7adb4d568e851 --- /dev/null +++ b/install/tpl/rspamd_arc.conf.master @@ -0,0 +1,8 @@ +sign_authenticated = false; +sign_inbound = true; +sign_local = false; +use_domain = "recipient"; +try_fallback = false; +use_esld = false; +path_map = "/etc/rspamd/local.d/dkim_domains.map"; +selector_map = "/etc/rspamd/local.d/dkim_selectors.map"; diff --git a/install/tpl/rspamd_classifier-bayes.conf.master b/install/tpl/rspamd_classifier-bayes.conf.master deleted file mode 100644 index dcda4a6391f009be67f2ccbd4047a030c3b7acaa..0000000000000000000000000000000000000000 --- a/install/tpl/rspamd_classifier-bayes.conf.master +++ /dev/null @@ -1,3 +0,0 @@ -autolearn = [-0.01, 5.00]; -per_user = false; -per_language = true; diff --git a/install/tpl/rspamd_classifier-bayes.conf.master b/install/tpl/rspamd_classifier-bayes.conf.master new file mode 120000 index 0000000000000000000000000000000000000000..b5324722948b7a3df0d5bd78d858f95ed6583b52 --- /dev/null +++ b/install/tpl/rspamd_classifier-bayes.conf.master @@ -0,0 +1 @@ +../../server/conf/rspamd_classifier-bayes.conf.master \ No newline at end of file diff --git a/install/tpl/rspamd_dkim_signing.conf.master b/install/tpl/rspamd_dkim_signing.conf.master deleted file mode 100644 index 10d89e74952075ce6daa6244ef9dbf5b22fa4a5a..0000000000000000000000000000000000000000 --- a/install/tpl/rspamd_dkim_signing.conf.master +++ /dev/null @@ -1,4 +0,0 @@ -try_fallback = false; -use_esld = false; -path_map = "/etc/rspamd/local.d/dkim_domains.map"; -selector_map = "/etc/rspamd/local.d/dkim_selectors.map"; diff --git a/install/tpl/rspamd_dkim_signing.conf.master b/install/tpl/rspamd_dkim_signing.conf.master new file mode 120000 index 0000000000000000000000000000000000000000..ebc6d4ace842401e25e1c48ff73a89d1dc4e11cf --- /dev/null +++ b/install/tpl/rspamd_dkim_signing.conf.master @@ -0,0 +1 @@ +../../server/conf/rspamd_dkim_signing.conf.master \ No newline at end of file diff --git a/install/tpl/rspamd_dkim_whitelist.inc.master b/install/tpl/rspamd_dkim_whitelist.inc.ispc.master similarity index 100% rename from install/tpl/rspamd_dkim_whitelist.inc.master rename to install/tpl/rspamd_dkim_whitelist.inc.ispc.master diff --git a/install/tpl/rspamd_dmarc_whitelist.inc.master b/install/tpl/rspamd_dmarc_whitelist.inc.ispc.master similarity index 100% rename from install/tpl/rspamd_dmarc_whitelist.inc.master rename to install/tpl/rspamd_dmarc_whitelist.inc.ispc.master diff --git a/install/tpl/rspamd_greylist.conf.master b/install/tpl/rspamd_greylist.conf.master deleted file mode 100644 index 74ea715a22cc6fa76671fd47a3f1bf89cfe92d49..0000000000000000000000000000000000000000 --- a/install/tpl/rspamd_greylist.conf.master +++ /dev/null @@ -1 +0,0 @@ -servers = "127.0.0.1:6379"; \ No newline at end of file diff --git a/install/tpl/rspamd_milter_headers.conf.master b/install/tpl/rspamd_milter_headers.conf.master index 0205160c25467fcbddf145f5beff499918eee428..c9ef9fa2d0a517602706b54d37626517e23df285 100644 --- a/install/tpl/rspamd_milter_headers.conf.master +++ b/install/tpl/rspamd_milter_headers.conf.master @@ -1,11 +1,13 @@ -use = ["x-spamd-bar", "x-spam-level", "x-spam-status", "authentication-results"]; +use = ["x-spamd-bar", "x-spam-level", "x-spam-status", "authentication-results", "remove-headers"]; authenticated_headers = ["authentication-results"]; routines { remove-headers { - "X-Spam" = 0; - "X-Spamd-Bar" = 0; - "X-Spam-Level" = 0; - "X-Spam-Status" = 0; - "X-Spam-Flag" = 0; + headers { + "X-Spam" = 0; + "X-Spamd-Bar" = 0; + "X-Spam-Level" = 0; + "X-Spam-Status" = 0; + "X-Spam-Flag" = 0; + } } } diff --git a/install/tpl/rspamd_mx_check.conf.master b/install/tpl/rspamd_mx_check.conf.master index 0a628f9c8382ee1f0def03883c91b91d7701e625..0c71ecb26b9e5ae295b179851b41896432c3eb83 100644 --- a/install/tpl/rspamd_mx_check.conf.master +++ b/install/tpl/rspamd_mx_check.conf.master @@ -1,9 +1,8 @@ enabled = true; -servers = "localhost"; key_prefix = "rmx"; symbol_bad_mx = "MX_INVALID"; symbol_no_mx = "MX_MISSING"; symbol_good_mx = "MX_GOOD"; expire = 86400; expire_novalid = 7200; -greylist_invalid = false; \ No newline at end of file +greylist_invalid = false; diff --git a/install/tpl/rspamd_neural.conf.master b/install/tpl/rspamd_neural.conf.master index 76f8a6d34479f05dfb638d736fdb5c975b31a7a0..9047212cd3b6fc135fbeb37a89b6c7c825d4e52b 100644 --- a/install/tpl/rspamd_neural.conf.master +++ b/install/tpl/rspamd_neural.conf.master @@ -1,4 +1,3 @@ -servers = 127.0.0.1:6379; enabled = true; rules { @@ -28,4 +27,4 @@ rules { symbol_ham = "NEURAL_HAM_SHORT"; ann_expire = 1d; } -} \ No newline at end of file +} diff --git a/install/tpl/rspamd_redis.conf.master b/install/tpl/rspamd_redis.conf.master deleted file mode 100644 index b908af9f5ebe0e23293797e234eb9dd455838a01..0000000000000000000000000000000000000000 --- a/install/tpl/rspamd_redis.conf.master +++ /dev/null @@ -1 +0,0 @@ -servers = "127.0.0.1"; \ No newline at end of file diff --git a/install/tpl/rspamd_redis.conf.master b/install/tpl/rspamd_redis.conf.master new file mode 120000 index 0000000000000000000000000000000000000000..df7de6da3cc87c905596bf75991fce01c00b9173 --- /dev/null +++ b/install/tpl/rspamd_redis.conf.master @@ -0,0 +1 @@ +../../server/conf/rspamd_redis.conf.master \ No newline at end of file diff --git a/install/tpl/rspamd_spf_dkim_whitelist.inc.master b/install/tpl/rspamd_spf_dkim_whitelist.inc.ispc.master similarity index 100% rename from install/tpl/rspamd_spf_dkim_whitelist.inc.master rename to install/tpl/rspamd_spf_dkim_whitelist.inc.ispc.master diff --git a/install/tpl/rspamd_spf_whitelist.inc.master b/install/tpl/rspamd_spf_whitelist.inc.ispc.master similarity index 100% rename from install/tpl/rspamd_spf_whitelist.inc.master rename to install/tpl/rspamd_spf_whitelist.inc.ispc.master diff --git a/install/tpl/server.ini.master b/install/tpl/server.ini.master index 7fc1783f67a16f1d6d7eb9032d619eec0d8775b5..30bce91c00e7fc0ab9c45b46cb78db25e25ece7e 100644 --- a/install/tpl/server.ini.master +++ b/install/tpl/server.ini.master @@ -37,9 +37,13 @@ maildir_path=/var/vmail/[domain]/[localpart] homedir_path=/var/vmail maildir_format=maildir dkim_path=/var/lib/amavis/dkim -dkim_strength=1024 +dkim_strength=2048 content_filter=amavis rspamd_password= +rspamd_redis_servers=127.0.0.1 +rspamd_redis_passwd= +rspamd_redis_bayes_servers=127.0.0.1 +rspamd_redis_bayes_passwd= pop3_imap_daemon=courier mail_filter_syntax=maildrop mailuser_uid=5000 @@ -55,6 +59,7 @@ message_size_limit=0 mailbox_soft_delete=n mailbox_quota_stats=y realtime_blackhole_list=zen.spamhaus.org +overquota_notify_threshold=90 overquota_notify_admin=y overquota_notify_client=y overquota_notify_freq=7 @@ -115,9 +120,11 @@ connect_userid_to_webid_start=10000 web_folder_protection=y php_ini_check_minutes=1 overtraffic_disable_web=y +overquota_notify_threshold=90 overquota_notify_admin=y overquota_notify_client=y overquota_notify_freq=7 +overquota_db_notify_threshold=90 overquota_db_notify_admin=y overquota_db_notify_client=y overquota_notify_onok=n @@ -145,9 +152,9 @@ fastcgi_config_syntax=2 [jailkit] jailkit_chroot_home=/home/[username] -jailkit_chroot_app_sections=basicshell editors extendedshell netutils ssh sftp scp groups jk_lsh -jailkit_chroot_app_programs=/usr/bin/groups /usr/bin/id /usr/bin/dircolors /usr/bin/lesspipe /usr/bin/basename /usr/bin/dirname /usr/bin/nano /usr/bin/pico /usr/bin/mysql /usr/bin/mysqldump /usr/bin/git /usr/bin/git-receive-pack /usr/bin/git-upload-pack /usr/bin/unzip /usr/bin/zip /bin/tar /bin/rm /usr/bin/patch /usr/bin/which /usr/lib/x86_64-linux-gnu/libmemcached.so.11 /usr/lib/x86_64-linux-gnu/libmemcachedutil.so.2 /usr/lib/x86_64-linux-gnu/libMagickWand-6.Q16.so.2 /opt/php-5.6.8/bin/php /opt/php-5.6.8/include /opt/php-5.6.8/lib -jailkit_chroot_cron_programs=/usr/bin/php /usr/bin/perl /usr/share/perl /usr/share/php +jailkit_chroot_app_sections=coreutils basicshell editors extendedshell netutils ssh sftp scp jk_lsh mysql-client git +jailkit_chroot_app_programs=lesspipe pico unzip zip patch which +jailkit_chroot_cron_programs=/usr/bin/php /usr/lib/php/ /usr/share/php/ /usr/share/zoneinfo/ /usr/bin/perl /usr/share/perl/ jailkit_chroot_authorized_keys_template=/root/.ssh/authorized_keys jailkit_hardlinks=allow diff --git a/install/update.php b/install/update.php index e821eac2033b5711b77b42408040de5ee699fa12..56316546ac34ae3bdf568c1c3554e35cbd2f59d3 100644 --- a/install/update.php +++ b/install/update.php @@ -96,7 +96,11 @@ require_once 'lib/classes/tpl.inc.php'; //** Check for ISPConfig 2.x versions if(is_dir('/root/ispconfig') || is_dir('/home/admispconfig')) { - die('This software cannot be installed on a server wich runs ISPConfig 2.x.'); + if(is_dir('/home/admispconfig')) { + die('This software cannot be installed on a server which runs ISPConfig 2.x.'); + } else { + die('This software cannot be installed on a server which runs ISPConfig 2.x; the presence of the /root/ispconfig/ directory may indicate an ISPConfig 2.x installation, otherwise you can remove or rename it to continue.'); + } } // Patch is required to reapir latest amavis versions @@ -212,6 +216,19 @@ if($do_backup == 'yes') { exec("tar pcfz $backup_path/etc.tar.gz /etc 2> /dev/null", $out, $returnvar); if($returnvar != 0) die("Backup failed. We stop here...\n"); + if (is_dir('/root/.acme.sh')) { + swriteln('Creating backup of "/root/.acme.sh" directory...'); + exec("tar pcfz $backup_path/acme.sh.tar.gz /root/.acme.sh 2> /dev/null", $out, $returnvar); + if($returnvar != 0) die("Backup failed. We stop here...\n"); + } + + if (is_dir('/etc/letsencrypt')) { + swriteln('Creating backup of "/etc/letsencrypt" directory...'); + exec("tar pcfz $backup_path/certbot.tar.gz /etc/letsencrypt 2> /dev/null", $out, $returnvar); + if($returnvar != 0) die("Backup failed. We stop here...\n"); + } + + exec("chown root:root $backup_path/*.tar.gz"); exec("chmod 700 $backup_path/*.tar.gz"); } @@ -495,6 +512,12 @@ if($reconfigure_services_answer == 'yes' || $reconfigure_services_answer == 'sel $inst->configure_xmpp('dont-create-certs'); } + // Configure AppArmor + if($conf['apparmor']['installed']){ + swriteln('Configuring AppArmor'); + $inst->configure_apparmor(); + } + if($conf['services']['firewall'] && $inst->reconfigure_app('Firewall', $reconfigure_services_answer)) { if($conf['ufw']['installed'] == true) { //* Configure Ubuntu Firewall @@ -566,6 +589,9 @@ if(!$issue_asked) { } } +// update acme.sh if installed +$inst->update_acme(); + $inst->install_ispconfig(); // Cleanup @@ -644,6 +670,11 @@ $md5_filename = '/usr/local/ispconfig/security/data/file_checksums_'.date('Y-m-d exec('find /usr/local/ispconfig -type f -print0 | xargs -0 md5sum > '.$md5_filename . ' 2>/dev/null'); chmod($md5_filename,0700); +// TODO: In a future update, stop the update script when running courier +if ($conf['courier']['installed'] == true) { + swriteln('WARNING: You are running Courier. We are removing support for Courier from ISPConfig. Migrate your system to Dovecot as soon as possible. See https://www.howtoforge.com/community/threads/migrate-from-courier-to-dovecot-on-your-ispconfig-managed-mailserver.88523/ for more information.'); +} + echo "Update finished.\n"; ?> diff --git a/interface/lib/app.inc.php b/interface/lib/app.inc.php index 631bd430dafb6cb4a67d2e10d11c383ee4208493..96e8a1ddef0892b1ca35186ea08d263af75b21be 100755 --- a/interface/lib/app.inc.php +++ b/interface/lib/app.inc.php @@ -28,6 +28,10 @@ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +if(version_compare(phpversion(), '7.0', '<')) { + require_once 'compatibility.inc.php'; +} + //* Enable gzip compression for the interface ob_start('ob_gzhandler'); @@ -126,12 +130,15 @@ class app { array($this->session, 'destroy'), array($this->session, 'gc')); + ini_set('session.cookie_httponly', true); + @ini_set('session.cookie_samesite', 'Lax'); + session_start(); //* Initialize session variables if(!isset($_SESSION['s']['id']) ) $_SESSION['s']['id'] = session_id(); - if(empty($_SESSION['s']['theme'])) $_SESSION['s']['theme'] = $conf['theme']; - if(empty($_SESSION['s']['language'])) $_SESSION['s']['language'] = $conf['language']; + if(empty($_SESSION['s']['theme'])) $_SESSION['s']['theme'] = $this->_conf['theme']; + if(empty($_SESSION['s']['language'])) $_SESSION['s']['language'] = $this->_conf['language']; } } diff --git a/interface/lib/classes/auth.inc.php b/interface/lib/classes/auth.inc.php index a69d43da2ec1a079c0d4aefe906684f389d4ffa4..3a4cc1603cca1972f8711c7e09ff19f7c53cc8f9 100644 --- a/interface/lib/classes/auth.inc.php +++ b/interface/lib/classes/auth.inc.php @@ -231,7 +231,7 @@ class auth { public function get_random_password($minLength = 8, $special = false) { if($minLength < 8) $minLength = 8; $maxLength = $minLength + 5; - $length = mt_rand($minLength, $maxLength); + $length = random_int($minLength, $maxLength); $alphachars = "abcdefghijklmnopqrstuvwxyz"; $upperchars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; @@ -240,28 +240,28 @@ class auth { $num_special = 0; if($special == true) { - $num_special = intval(mt_rand(0, round($length / 4))) + 1; + $num_special = intval(random_int(0, round($length / 4))) + 1; } - $numericlen = mt_rand(1, 2); + $numericlen = random_int(1, 2); $alphalen = $length - $num_special - $numericlen; $upperlen = intval($alphalen / 2); $alphalen = $alphalen - $upperlen; $password = ''; for($i = 0; $i < $alphalen; $i++) { - $password .= substr($alphachars, mt_rand(0, strlen($alphachars) - 1), 1); + $password .= substr($alphachars, random_int(0, strlen($alphachars) - 1), 1); } for($i = 0; $i < $upperlen; $i++) { - $password .= substr($upperchars, mt_rand(0, strlen($upperchars) - 1), 1); + $password .= substr($upperchars, random_int(0, strlen($upperchars) - 1), 1); } for($i = 0; $i < $num_special; $i++) { - $password .= substr($specialchars, mt_rand(0, strlen($specialchars) - 1), 1); + $password .= substr($specialchars, random_int(0, strlen($specialchars) - 1), 1); } for($i = 0; $i < $numericlen; $i++) { - $password .= substr($numchars, mt_rand(0, strlen($numchars) - 1), 1); + $password .= substr($numchars, random_int(0, strlen($numchars) - 1), 1); } return str_shuffle($password); @@ -298,8 +298,8 @@ class auth { public function csrf_token_get($form_name) { /* CSRF PROTECTION */ // generate csrf protection id and key - $_csrf_id = uniqid($form_name . '_'); // form id - $_csrf_key = sha1(uniqid(microtime(true), true)); // the key + $_csrf_id = $form_name . '_' . bin2hex(random_bytes(12)); // form id + $_csrf_key = sha1(random_bytes(20)); // the key if(!isset($_SESSION['_csrf'])) $_SESSION['_csrf'] = array(); if(!isset($_SESSION['_csrf_timeout'])) $_SESSION['_csrf_timeout'] = array(); $_SESSION['_csrf'][$_csrf_id] = $_csrf_key; diff --git a/interface/lib/classes/functions.inc.php b/interface/lib/classes/functions.inc.php index 4d4c011fb5e5e4b06bed617601bd7bac42f345d8..1b396686740bc026b11204d09697debff3cd1a45 100644 --- a/interface/lib/classes/functions.inc.php +++ b/interface/lib/classes/functions.inc.php @@ -28,6 +28,8 @@ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +require_once __DIR__.'/../compatibility.inc.php'; + //* The purpose of this library is to provide some general functions. //* This class is loaded automatically by the ispconfig framework. @@ -437,10 +439,10 @@ class functions { $iteration = 0; $password = ""; $maxLength = $minLength + 5; - $length = $this->getRandomInt($minLength, $maxLength); + $length = random_int($minLength, $maxLength); while($iteration < $length){ - $randomNumber = (floor(((mt_rand() / mt_getrandmax()) * 100)) % 94) + 33; + $randomNumber = random_int(33, 126); if(!$special){ if (($randomNumber >=33) && ($randomNumber <=47)) { continue; } if (($randomNumber >=58) && ($randomNumber <=64)) { continue; } @@ -455,10 +457,6 @@ class functions { return $password; } - public function getRandomInt($min, $max){ - return floor((mt_rand() / mt_getrandmax()) * ($max - $min + 1)) + $min; - } - public function generate_customer_no(){ global $app; // generate customer no. @@ -474,14 +472,17 @@ class functions { global $app; // generate the SSH key pair for the client - $id_rsa_file = '/tmp/'.uniqid('',true); + if (! $tmpdir = $app->system->exec_safe('mktemp -dt id_rsa.XXXXXXXX')) { + $app->log("mktemp failed, cannot create SSH keypair for ".$username, LOGLEVEL_WARN); + } + $id_rsa_file = $tmpdir . uniqid('',true); $id_rsa_pub_file = $id_rsa_file.'.pub'; if(file_exists($id_rsa_file)) unset($id_rsa_file); if(file_exists($id_rsa_pub_file)) unset($id_rsa_pub_file); if(!file_exists($id_rsa_file) && !file_exists($id_rsa_pub_file)) { $app->system->exec_safe('ssh-keygen -t rsa -C ? -f ? -N ""', $username.'-rsa-key-'.time(), $id_rsa_file); $app->db->query("UPDATE client SET created_at = UNIX_TIMESTAMP(), id_rsa = ?, ssh_rsa = ? WHERE client_id = ?", @file_get_contents($id_rsa_file), @file_get_contents($id_rsa_pub_file), $client_id); - $app->system->exec_safe('rm -f ? ?', $id_rsa_file, $id_rsa_pub_file); + $app->system->rmdir($tmpdir, true); } else { $app->log("Failed to create SSH keypair for ".$username, LOGLEVEL_WARN); } @@ -528,6 +529,117 @@ class functions { } } + // Function to lock a client + public function func_client_lock($client_id,$locked) { + global $app; + $client_data = $app->db->queryOneRecord('SELECT `tmp_data` FROM `client` WHERE `client_id` = ?', $client_id); + if($client_data['tmp_data'] == '') $tmp_data = array(); + else $tmp_data = unserialize($client_data['tmp_data']); + if(!is_array($tmp_data)) $tmp_data = array(); + $to_disable = array('cron' => 'id', + 'ftp_user' => 'ftp_user_id', + 'mail_domain' => 'domain_id', + 'mail_user' => 'mailuser_id', + 'mail_user_smtp' => 'mailuser_id', + 'mail_forwarding' => 'forwarding_id', + 'mail_get' => 'mailget_id', + 'openvz_vm' => 'vm_id', + 'shell_user' => 'shell_user_id', + 'webdav_user' => 'webdav_user_id', + 'web_database' => 'database_id', + 'web_domain' => 'domain_id', + 'web_folder' => 'web_folder_id', + 'web_folder_user' => 'web_folder_user_id' + ); + $udata = $app->db->queryOneRecord('SELECT `userid` FROM `sys_user` WHERE `client_id` = ?', $client_id); + $gdata = $app->db->queryOneRecord('SELECT `groupid` FROM `sys_group` WHERE `client_id` = ?', $client_id); + $sys_groupid = $gdata['groupid']; + $sys_userid = $udata['userid']; + if($locked == 'y') { + $prev_active = array(); + $prev_sysuser = array(); + foreach($to_disable as $current => $keycolumn) { + $active_col = 'active'; + $reverse = false; + if($current == 'mail_user') { + $active_col = 'postfix'; + } elseif($current == 'mail_user_smtp') { + $current = 'mail_user'; + $active_col = 'disablesmtp'; + $reverse = true; + } + + if(!isset($prev_active[$current])) $prev_active[$current] = array(); + if(!isset($prev_sysuser[$current])) $prev_sysuser[$current] = array(); + + $entries = $app->db->queryAllRecords('SELECT ?? as `id`, `sys_userid`, ?? FROM ?? WHERE `sys_groupid` = ?', $keycolumn, $active_col, $current, $sys_groupid); + foreach($entries as $item) { + + if($item[$active_col] != 'y' && $reverse == false) $prev_active[$current][$item['id']][$active_col] = 'n'; + elseif($item[$active_col] == 'y' && $reverse == true) $prev_active[$current][$item['id']][$active_col] = 'y'; + if($item['sys_userid'] != $sys_userid) $prev_sysuser[$current][$item['id']] = $item['sys_userid']; + // we don't have to store these if y, as everything without previous state gets enabled later + + //$app->db->datalogUpdate($current, array($active_col => ($reverse == true ? 'y' : 'n'), 'sys_userid' => $_SESSION["s"]["user"]["userid"]), $keycolumn, $item['id']); + $app->db->datalogUpdate($current, array($active_col => ($reverse == true ? 'y' : 'n'), 'sys_userid' => $sys_userid), $keycolumn, $item['id']); + } + } + + $tmp_data['prev_active'] = $prev_active; + $tmp_data['prev_sys_userid'] = $prev_sysuser; + $app->db->query("UPDATE `client` SET `tmp_data` = ? WHERE `client_id` = ?", serialize($tmp_data), $client_id); + unset($prev_active); + unset($prev_sysuser); + } elseif ($locked == 'n') { + foreach($to_disable as $current => $keycolumn) { + $active_col = 'active'; + $reverse = false; + if($current == 'mail_user') { + $active_col = 'postfix'; + } elseif($current == 'mail_user_smtp') { + $current = 'mail_user'; + $active_col = 'disablesmtp'; + $reverse = true; + } + + $entries = $app->db->queryAllRecords('SELECT ?? as `id` FROM ?? WHERE `sys_groupid` = ?', $keycolumn, $current, $sys_groupid); + foreach($entries as $item) { + $set_active = ($reverse == true ? 'n' : 'y'); + $set_inactive = ($reverse == true ? 'y' : 'n'); + $set_sysuser = $sys_userid; + if(array_key_exists('prev_active', $tmp_data) == true + && array_key_exists($current, $tmp_data['prev_active']) == true + && array_key_exists($item['id'], $tmp_data['prev_active'][$current]) == true + && $tmp_data['prev_active'][$current][$item['id']][$active_col] == $set_inactive) $set_active = $set_inactive; + if(array_key_exists('prev_sysuser', $tmp_data) == true + && array_key_exists($current, $tmp_data['prev_sysuser']) == true + && array_key_exists($item['id'], $tmp_data['prev_sysuser'][$current]) == true + && $tmp_data['prev_sysuser'][$current][$item['id']] != $sys_userid) $set_sysuser = $tmp_data['prev_sysuser'][$current][$item['id']]; + $app->db->datalogUpdate($current, array($active_col => $set_active, 'sys_userid' => $set_sysuser), $keycolumn, $item['id']); + } + } + if(array_key_exists('prev_active', $tmp_data)) unset($tmp_data['prev_active']); + $app->db->query("UPDATE `client` SET `tmp_data` = ? WHERE `client_id` = ?", serialize($tmp_data), $client_id); + } + unset($tmp_data); + unset($entries); + unset($to_disable); + } + // Function to cancel disable/enable a client + public function func_client_cancel($client_id,$cancel) { + global $app; + if ($cancel == 'y') { + $sql = "UPDATE sys_user SET active = '0' WHERE client_id = ?"; + $result = $app->db->query($sql, $client_id); + } elseif($cancel == 'n') { + $sql = "UPDATE sys_user SET active = '1' WHERE client_id = ?"; + $result = $app->db->query($sql, $client_id); + } else { + $result = false; + } + return $result; + } + } ?> diff --git a/interface/lib/classes/plugin_backuplist.inc.php b/interface/lib/classes/plugin_backuplist.inc.php index 0b98dc9ec0b2c8a9a42ba11187a4962014243f8c..b2fdd006d291bac48626a2909c2277480716ce63 100644 --- a/interface/lib/classes/plugin_backuplist.inc.php +++ b/interface/lib/classes/plugin_backuplist.inc.php @@ -160,7 +160,7 @@ class plugin_backuplist extends plugin_base { //* Get the data $server_ids = array(); - $web = $app->db->queryOneRecord("SELECT server_id FROM web_domain WHERE domain_id = ?", $this->form->id); + $web = $app->db->queryOneRecord("SELECT server_id, backup_format_web, backup_format_db, backup_password, backup_encrypt FROM web_domain WHERE domain_id = ?", $this->form->id); $databases = $app->db->queryAllRecords("SELECT server_id FROM web_database WHERE parent_domain_id = ?", $this->form->id); if($app->functions->intval($web['server_id']) > 0) $server_ids[] = $app->functions->intval($web['server_id']); if(is_array($databases) && !empty($databases)){ @@ -181,8 +181,33 @@ class plugin_backuplist extends plugin_base { $rec["bgcolor"] = $bgcolor; $rec['date'] = date($app->lng('conf_format_datetime'), $rec['tstamp']); + $backup_format = $rec['backup_format']; - if (empty($backup_format)) { + $backup_mode = $rec['backup_mode']; + if ($backup_mode === 'borg') { + // Get backup format from domain config + switch ($rec['backup_type']) { + case 'mysql': + $backup_format = $web['backup_format_db']; + if (empty($backup_format) || $backup_format == 'default') { + $backup_format = self::getDefaultBackupFormat('rootgz', 'mysql'); + } + $rec['filename'] .= self::getBackupDbExtension($backup_format); + break; + case 'web': + $backup_format = $web['backup_format_web']; + if (empty($backup_format) || $backup_format == 'default') { + $backup_format = self::getDefaultBackupFormat($backup_mode, 'web'); + } + $rec['filename'] .= self::getBackupWebExtension($backup_format); + break; + default: + $app->log('Unsupported backup type "' . $rec['backup_type'] . '" for backup id ' . $rec['backup_id'], LOGLEVEL_ERROR); + break; + } + $rec['backup_password'] = $web['backup_encrypt'] == 'y' ? trim($web['backup_password']) : ''; + + } elseif (empty($backup_format)) { //We have a backup from old version of ISPConfig switch ($rec['backup_type']) { case 'mysql': @@ -210,7 +235,13 @@ class plugin_backuplist extends plugin_base { if($rec['server_id'] != $web['server_id']) $rec['download_available'] = false; if($rec['filesize'] > 0){ - $rec['filesize'] = $app->functions->currency_format($rec['filesize']/(1024*1024), 'client').' MB'; + $rec['filesize'] = $app->functions->currency_format($rec['filesize']/(1024*1024), 'client').' MB'; + if($backup_mode === "borg") { + $rec['filesize'] = '<a href="javascript:void(0)" data-toggle="tooltip" title="' + . $wb['final_size_txt'] + . '"><strong>*</strong></a>' + . $rec['filesize']; + } } $records_new[] = $rec; @@ -235,6 +266,73 @@ class plugin_backuplist extends plugin_base { return $listTpl->grab(); } + /** + * Returns file extension for specified backup format + * @param string $format backup format + * @return string|null + * @author Ramil Valitov <ramilvalitov@gmail.com> + */ + protected static function getBackupDbExtension($format) + { + $prefix = '.sql'; + switch ($format) { + case 'gzip': + return $prefix . '.gz'; + case 'bzip2': + return $prefix . '.bz2'; + case 'xz': + return $prefix . '.xz'; + case 'zip': + case 'zip_bzip2': + return '.zip'; + case 'rar': + return '.rar'; + } + if (strpos($format, "7z_") === 0) { + return $prefix . '.7z'; + } + return null; + } + + /** + * Returns file extension for specified backup format + * @param string $format backup format + * @return string|null + * @author Ramil Valitov <ramilvalitov@gmail.com> + */ + protected static function getBackupWebExtension($format) + { + switch ($format) { + case 'tar_gzip': + return '.tar.gz'; + case 'tar_bzip2': + return '.tar.bz2'; + case 'tar_xz': + return '.tar.xz'; + case 'zip': + case 'zip_bzip2': + return '.zip'; + case 'rar': + return '.rar'; + } + if (strpos($format, "tar_7z_") === 0) { + return '.tar.7z'; + } + return null; + } + + protected static function getDefaultBackupFormat($backup_mode, $backup_type) + { + //We have a backup from old version of ISPConfig + switch ($backup_type) { + case 'mysql': + return 'gzip'; + case 'web': + return ($backup_mode == 'userzip') ? 'zip' : 'tar_gzip'; + } + return ""; + } + } ?> diff --git a/interface/lib/classes/quota_lib.inc.php b/interface/lib/classes/quota_lib.inc.php index 3bae97f046ada93cb7c701dfb5d52ffa58e7ad8f..b02cdea9949fb92c23451a18f49b2377a3d23d4c 100644 --- a/interface/lib/classes/quota_lib.inc.php +++ b/interface/lib/classes/quota_lib.inc.php @@ -2,8 +2,8 @@ class quota_lib { public function get_quota_data($clientid = null, $readable = true) { - global $app; - + global $app; + $tmp_rec = $app->db->queryAllRecords("SELECT data from monitor_data WHERE type = 'harddisk_quota' ORDER BY created DESC"); $monitor_data = array(); if(is_array($tmp_rec)) { @@ -12,10 +12,10 @@ class quota_lib { } } //print_r($monitor_data); - + // select all websites or websites belonging to client $sites = $app->db->queryAllRecords("SELECT * FROM web_domain WHERE active = 'y' AND type = 'vhost'".(($clientid != null)?" AND sys_groupid = (SELECT default_group FROM sys_user WHERE client_id=?)":'') . " ORDER BY domain", $clientid); - + //print_r($sites); if(is_array($sites) && !empty($sites)){ for($i=0;$i<sizeof($sites);$i++){ @@ -24,7 +24,7 @@ class quota_lib { $sites[$i]['soft'] = $monitor_data['user'][$username]['soft']; $sites[$i]['hard'] = $monitor_data['user'][$username]['hard']; $sites[$i]['files'] = $monitor_data['user'][$username]['files']; - + if (!is_numeric($sites[$i]['used'])){ if ($sites[$i]['used'][0] > $sites[$i]['used'][1]){ $sites[$i]['used'] = $sites[$i]['used'][0]; @@ -35,13 +35,13 @@ class quota_lib { if (!is_numeric($sites[$i]['soft'])) $sites[$i]['soft']=$sites[$i]['soft'][1]; if (!is_numeric($sites[$i]['hard'])) $sites[$i]['hard']=$sites[$i]['hard'][1]; if (!is_numeric($sites[$i]['files'])) $sites[$i]['files']=$sites[$i]['files'][1]; - + $sites[$i]['used_raw'] = $sites[$i]['used']; $sites[$i]['soft_raw'] = $sites[$i]['soft']; $sites[$i]['hard_raw'] = $sites[$i]['hard']; $sites[$i]['files_raw'] = $sites[$i]['files']; $sites[$i]['used_percentage'] = ($sites[$i]['soft'] > 0 && $sites[$i]['used'] > 0 ? round($sites[$i]['used'] * 100 / $sites[$i]['soft']) : 0); - + if ($readable) { // colours $sites[$i]['display_colour'] = '#000000'; @@ -52,31 +52,31 @@ class quota_lib { } if($used_ratio >= 0.8) $sites[$i]['display_colour'] = '#fd934f'; if($used_ratio >= 1) $sites[$i]['display_colour'] = '#cc0000'; - + if($sites[$i]['used'] > 1024) { $sites[$i]['used'] = round($sites[$i]['used'] / 1024, 1).' MB'; } else { if ($sites[$i]['used'] != '') $sites[$i]['used'] .= ' KB'; } - + if($sites[$i]['soft'] > 1024) { $sites[$i]['soft'] = round($sites[$i]['soft'] / 1024, 1).' MB'; } else { $sites[$i]['soft'] .= ' KB'; } - + if($sites[$i]['hard'] > 1024) { $sites[$i]['hard'] = round($sites[$i]['hard'] / 1024, 1).' MB'; } else { $sites[$i]['hard'] .= ' KB'; } - + if($sites[$i]['soft'] == " KB") $sites[$i]['soft'] = $app->lng('unlimited_txt'); if($sites[$i]['hard'] == " KB") $sites[$i]['hard'] = $app->lng('unlimited_txt'); - + if($sites[$i]['soft'] == '0 B' || $sites[$i]['soft'] == '0 KB' || $sites[$i]['soft'] == '0') $sites[$i]['soft'] = $app->lng('unlimited_txt'); if($sites[$i]['hard'] == '0 B' || $sites[$i]['hard'] == '0 KB' || $sites[$i]['hard'] == '0') $sites[$i]['hard'] = $app->lng('unlimited_txt'); - + /* if(!strstr($sites[$i]['used'],'M') && !strstr($sites[$i]['used'],'K')) $sites[$i]['used'].= ' B'; if(!strstr($sites[$i]['soft'],'M') && !strstr($sites[$i]['soft'],'K')) $sites[$i]['soft'].= ' B'; @@ -86,35 +86,35 @@ class quota_lib { else { if (empty($sites[$i]['soft'])) $sites[$i]['soft'] = -1; if (empty($sites[$i]['hard'])) $sites[$i]['hard'] = -1; - + if($sites[$i]['soft'] == '0 B' || $sites[$i]['soft'] == '0 KB' || $sites[$i]['soft'] == '0') $sites[$i]['soft'] = -1; if($sites[$i]['hard'] == '0 B' || $sites[$i]['hard'] == '0 KB' || $sites[$i]['hard'] == '0') $sites[$i]['hard'] = -1; } } } - + return $sites; } - + public function get_trafficquota_data($clientid = null, $lastdays = 0) { global $app; - + $traffic_data = array(); - + // select vhosts (belonging to client) if($clientid != null){ $sql_where = " AND sys_groupid = (SELECT default_group FROM sys_user WHERE client_id=?)"; } $sites = $app->db->queryAllRecords("SELECT * FROM web_domain WHERE active = 'y' AND (type = 'vhost' OR type = 'vhostsubdomain' OR type = 'vhostalias')".$sql_where, $clientid); - + $hostnames = array(); $traffic_data = array(); - + foreach ($sites as $site) { $hostnames[] = $site['domain']; $traffic_data[$site['domain']]['domain_id'] = $site['domain_id']; } - + // fetch all traffic-data of selected vhosts if (!empty($hostnames)) { $tmp_year = date('Y'); @@ -129,7 +129,7 @@ class quota_lib { foreach ($tmp_recs as $tmp_rec) { $traffic_data[$tmp_rec['hostname']]['this_year'] = $tmp_rec['t']; } - + $tmp_year = date('Y', mktime(0, 0, 0, date("m")-1, date("d"), date("Y"))); $tmp_month = date('m', mktime(0, 0, 0, date("m")-1, date("d"), date("Y"))); // Last Month @@ -137,14 +137,14 @@ class quota_lib { foreach ($tmp_recs as $tmp_rec) { $traffic_data[$tmp_rec['hostname']]['last_month'] = $tmp_rec['t']; } - + $tmp_year = date('Y', mktime(0, 0, 0, date("m"), date("d"), date("Y")-1)); // Last Year $tmp_recs = $app->db->queryAllRecords("SELECT hostname, SUM(traffic_bytes) as t FROM web_traffic WHERE YEAR(traffic_date) = ? AND hostname IN ? GROUP BY hostname", $tmp_year, $hostnames); foreach ($tmp_recs as $tmp_rec) { $traffic_data[$tmp_rec['hostname']]['last_year'] = $tmp_rec['t']; } - + if (is_int($lastdays) && ($lastdays > 0)) { // Last xx Days $tmp_recs = $app->db->queryAllRecords("SELECT hostname, SUM(traffic_bytes) as t FROM web_traffic WHERE (traffic_date >= DATE_SUB(NOW(), INTERVAL ? DAY)) AND hostname IN ? GROUP BY hostname", $lastdays, $hostnames); @@ -153,29 +153,29 @@ class quota_lib { } } } - + return $traffic_data; } public function get_ftptrafficquota_data($clientid = null, $lastdays = 0) { global $app; - + $traffic_data = array(); - + // select vhosts (belonging to client) if($clientid != null){ $sql_where = " AND sys_groupid = (SELECT default_group FROM sys_user WHERE client_id=?)"; } $sites = $app->db->queryAllRecords("SELECT * FROM web_domain WHERE active = 'y' AND (type = 'vhost' OR type = 'vhostsubdomain' OR type = 'vhostalias')".$sql_where, $clientid); - + $hostnames = array(); $traffic_data = array(); - + foreach ($sites as $site) { $hostnames[] = $site['domain']; $traffic_data[$site['domain']]['domain_id'] = $site['domain_id']; } - + // fetch all traffic-data of selected vhosts if (!empty($hostnames)) { $tmp_year = date('Y'); @@ -190,7 +190,7 @@ class quota_lib { foreach ($tmp_recs as $tmp_rec) { $traffic_data[$tmp_rec['hostname']]['this_year'] = $tmp_rec['t']; } - + $tmp_year = date('Y', mktime(0, 0, 0, date("m")-1, date("d"), date("Y"))); $tmp_month = date('m', mktime(0, 0, 0, date("m")-1, date("d"), date("Y"))); // Last Month @@ -198,14 +198,14 @@ class quota_lib { foreach ($tmp_recs as $tmp_rec) { $traffic_data[$tmp_rec['hostname']]['last_month'] = $tmp_rec['t']; } - + $tmp_year = date('Y', mktime(0, 0, 0, date("m"), date("d"), date("Y")-1)); // Last Year $tmp_recs = $app->db->queryAllRecords("SELECT hostname, SUM(in_bytes) AS ftp_in, SUM(out_bytes) AS ftp_out FROM ftp_traffic WHERE YEAR(traffic_date) = ? AND hostname IN ? GROUP BY hostname", $tmp_year, $hostnames); foreach ($tmp_recs as $tmp_rec) { $traffic_data[$tmp_rec['hostname']]['last_year'] = $tmp_rec['t']; } - + if (is_int($lastdays) && ($lastdays > 0)) { // Last xx Days $tmp_recs = $app->db->queryAllRecords("SELECT hostname, SUM(in_bytes) AS ftp_in, SUM(out_bytes) AS ftp_out FROM ftp_traffic WHERE (traffic_date >= DATE_SUB(NOW(), INTERVAL ? DAY)) AND hostname IN ? GROUP BY hostname", $lastdays, $hostnames); @@ -214,13 +214,13 @@ class quota_lib { } } } - + return $traffic_data; } - + public function get_mailquota_data($clientid = null, $readable = true) { global $app; - + $tmp_rec = $app->db->queryAllRecords("SELECT data from monitor_data WHERE type = 'email_quota' ORDER BY created DESC"); $monitor_data = array(); if(is_array($tmp_rec)) { @@ -235,25 +235,25 @@ class quota_lib { } } //print_r($monitor_data); - + // select all email accounts or email accounts belonging to client $emails = $app->db->queryAllRecords("SELECT * FROM mail_user".(($clientid != null)? " WHERE sys_groupid = (SELECT default_group FROM sys_user WHERE client_id=?)" : '') . " ORDER BY email", $clientid); - + //print_r($emails); - if(is_array($emails) && !empty($emails)){ + if(is_array($emails) && !empty($emails)) { for($i=0;$i<sizeof($emails);$i++){ $email = $emails[$i]['email']; - + $emails[$i]['name'] = $app->functions->htmlentities($emails[$i]['name']); $emails[$i]['used'] = isset($monitor_data[$email]['used']) ? $monitor_data[$email]['used'] : array(1 => 0); - + if (!is_numeric($emails[$i]['used'])) $emails[$i]['used']=$emails[$i]['used'][1]; - + $emails[$i]['quota_raw'] = $emails[$i]['quota']; $emails[$i]['used_raw'] = $emails[$i]['used']; $emails[$i]['used_percentage'] = ($emails[$i]['quota'] > 0 && $emails[$i]['used'] > 0 ? round($emails[$i]['used'] * 100 / $emails[$i]['quota']) : 0); - + if ($readable) { // colours $emails[$i]['display_colour'] = '#000000'; @@ -264,14 +264,14 @@ class quota_lib { } if($used_ratio >= 0.8) $emails[$i]['display_colour'] = '#fd934f'; if($used_ratio >= 1) $emails[$i]['display_colour'] = '#cc0000'; - + if($emails[$i]['quota'] == 0){ $emails[$i]['quota'] = $app->lng('unlimited_txt'); } else { $emails[$i]['quota'] = round($emails[$i]['quota'] / 1048576, 1).' MB'; } - - + + if($emails[$i]['used'] < 1544000) { $emails[$i]['used'] = round($emails[$i]['used'] / 1024, 1).' KB'; } else { @@ -280,13 +280,13 @@ class quota_lib { } } } - + return $emails; } - + public function get_databasequota_data($clientid = null, $readable = true) { global $app; - + $tmp_rec = $app->db->queryAllRecords("SELECT data from monitor_data WHERE type = 'database_size' ORDER BY created DESC"); $monitor_data = array(); if(is_array($tmp_rec)) { @@ -300,21 +300,21 @@ class quota_lib { } } //print_r($monitor_data); - + // select all databases belonging to client $databases = $app->db->queryAllRecords("SELECT * FROM web_database".(($clientid != null)? " WHERE sys_groupid = (SELECT default_group FROM sys_user WHERE client_id=?)" : '') . " ORDER BY database_name", $clientid); - + //print_r($databases); if(is_array($databases) && !empty($databases)){ for($i=0;$i<sizeof($databases);$i++){ $databasename = $databases[$i]['database_name']; - + $databases[$i]['used'] = isset($monitor_data[$databasename]['size']) ? $monitor_data[$databasename]['size'] : 0; - + $databases[$i]['quota_raw'] = $databases[$i]['database_quota']; $databases[$i]['used_raw'] = $databases[$i]['used'] / 1024 / 1024; //* quota is stored as MB - calculated bytes $databases[$i]['used_percentage'] = (($databases[$i]['database_quota'] > 0) && ($databases[$i]['used'] > 0)) ? round($databases[$i]['used_raw'] * 100 / $databases[$i]['database_quota']) : 0; - + if ($readable) { // colours $databases[$i]['display_colour'] = '#000000'; @@ -325,14 +325,14 @@ class quota_lib { } if($used_ratio >= 0.8) $databases[$i]['display_colour'] = '#fd934f'; if($used_ratio >= 1) $databases[$i]['display_colour'] = '#cc0000'; - + if($databases[$i]['database_quota'] == 0){ $databases[$i]['database_quota'] = $app->lng('unlimited_txt'); } else { $databases[$i]['database_quota'] = $databases[$i]['database_quota'] . ' MB'; } - - + + if($databases[$i]['used'] < 1544000) { $databases[$i]['used'] = round($databases[$i]['used'] / 1024, 1).' KB'; } else { @@ -341,8 +341,8 @@ class quota_lib { } } } - + return $databases; } - + } diff --git a/interface/lib/classes/remote.d/client.inc.php b/interface/lib/classes/remote.d/client.inc.php index 57412e5e192bef9f478c59db36c80db1fc5864f5..5af1592db9347d60932f5f05b44b27d2274a6d05 100644 --- a/interface/lib/classes/remote.d/client.inc.php +++ b/interface/lib/classes/remote.d/client.inc.php @@ -243,6 +243,15 @@ class remoting_client extends remoting { $affected_rows = $this->updateQuery('../client/form/' . (isset($params['limit_client']) && $params['limit_client'] != 0 ? 'reseller' : 'client') . '.tform.php', $reseller_id, $client_id, $params, 'client:' . ($reseller_id ? 'reseller' : 'client') . ':on_after_update'); $app->remoting_lib->ispconfig_sysuser_update($params, $client_id); + + // if canceled + if ($params['canceled']) { + $result = $app->functions->func_client_cancel($client_id, $params['canceled']); + } + // if locked + if ($params['locked']) { + $result = $app->functions->func_client_lock($client_id, $params['locked']); + } return $affected_rows; } @@ -404,7 +413,7 @@ class remoting_client extends remoting { $app->db->query("DELETE FROM sys_user WHERE client_id = ?", $client_id); //* Delete all records (sub-clients, mail, web, etc....) of this client. - $tables = 'cron,dns_rr,dns_soa,dns_slave,ftp_user,mail_access,mail_content_filter,mail_domain,mail_forwarding,mail_get,mail_user,mail_user_filter,shell_user,spamfilter_users,support_message,web_database,web_database_user,web_domain,web_traffic,domain,mail_mailinglist,client'; + $tables = 'cron,dns_rr,dns_soa,dns_slave,ftp_user,mail_access,mail_content_filter,mail_domain,mail_forwarding,mail_get,mail_user,mail_user_filter,shell_user,spamfilter_users,support_message,web_database,web_database_user,web_domain,web_traffic,domain,mail_mailinglist,client,spamfilter_wblist'; $tables_array = explode(',', $tables); $client_group_id = $app->functions->intval($client_group['groupid']); if($client_group_id > 1) { diff --git a/interface/lib/classes/remote.d/dns.inc.php b/interface/lib/classes/remote.d/dns.inc.php index 463b474cd15ebb18b9d86885294a25b658932b2c..67b97e722d32c4be4acd9b990275f3614be6a1a2 100644 --- a/interface/lib/classes/remote.d/dns.inc.php +++ b/interface/lib/classes/remote.d/dns.inc.php @@ -42,7 +42,7 @@ class remoting_dns extends remoting { // DNS Function -------------------------------------------------------------------------------------------------- //* Create Zone with Template - public function dns_templatezone_add($session_id, $client_id, $template_id, $domain, $ip, $ns1, $ns2, $email) { + public function dns_templatezone_add($session_id, $client_id, $template_id, $domain, $ip, $ns1, $ns2, $email, $ipv6 = '') { global $app, $conf; if(!$this->checkPerm($session_id, 'dns_templatezone_add')) { throw new SoapFault('permission_denied', 'You do not have the permissions to access this function.'); @@ -63,6 +63,7 @@ class remoting_dns extends remoting { $tpl_content = $template_record['template']; if($domain != '') $tpl_content = str_replace('{DOMAIN}', $domain, $tpl_content); if($ip != '') $tpl_content = str_replace('{IP}', $ip, $tpl_content); + if($ipv6 != '') $tpl_content = str_replace('{IPV6}', $ipv6, $tpl_content); if($ns1 != '') $tpl_content = str_replace('{NS1}', $ns1, $tpl_content); if($ns2 != '') $tpl_content = str_replace('{NS2}', $ns2, $tpl_content); if($email != '') $tpl_content = str_replace('{EMAIL}', $email, $tpl_content); @@ -248,7 +249,7 @@ class remoting_dns extends remoting { return false; } - if(!preg_match('/^[\w\.\-]{2,64}\.[a-zA-Z0-9\-]{2,63}$/', $origin)){ + if(!preg_match('/^[\w\.\-]{1,64}\.[a-zA-Z0-9\-]{2,63}$/', $origin)){ throw new SoapFault('no_domain_found', 'Invalid domain name.'); return false; } @@ -513,6 +514,29 @@ class remoting_dns extends remoting { return $this->dns_rr_delete($session_id, $primary_id, $update_serial, 'HINFO'); } + + // ---------------------------------------------------------------------------------------------------------------- + + //* Get record details + public function dns_loc_get($session_id, $primary_id) { + return $this->dns_rr_get($session_id, $primary_id, 'LOC'); + } + + //* Add a record + public function dns_loc_add($session_id, $client_id, $params, $update_serial=false) { + return $this->dns_rr_add($session_id, $client_id, $params, $update_serial, 'LOC'); + } + + //* Update a record + public function dns_loc_update($session_id, $client_id, $primary_id, $params, $update_serial=false) { + return $this->dns_rr_update($session_id, $client_id, $primary_id, $params, $update_serial, 'LOC'); + } + + //* Delete a record + public function dns_loc_delete($session_id, $primary_id, $update_serial=false) { + return $this->dns_rr_delete($session_id, $primary_id, $update_serial, 'LOC'); + } + // ---------------------------------------------------------------------------------------------------------------- //* Get record details @@ -581,6 +605,28 @@ class remoting_dns extends remoting { // ---------------------------------------------------------------------------------------------------------------- + //* Get record details + public function dns_ds_get($session_id, $primary_id) { + return $this->dns_rr_get($session_id, $primary_id, 'DS'); + } + + //* Add a record + public function dns_ds_add($session_id, $client_id, $params, $update_serial=false) { + return $this->dns_rr_add($session_id, $client_id, $params, $update_serial, 'DS'); + } + + //* Update a record + public function dns_ds_update($session_id, $client_id, $primary_id, $params, $update_serial=false) { + return $this->dns_rr_update($session_id, $client_id, $primary_id, $params, $update_serial, 'DS'); + } + + //* Delete a record + public function dns_ds_delete($session_id, $primary_id, $update_serial=false) { + return $this->dns_rr_delete($session_id, $primary_id, $update_serial, 'DS'); + } + + // ---------------------------------------------------------------------------------------------------------------- + //* Get record details public function dns_ptr_get($session_id, $primary_id) { return $this->dns_rr_get($session_id, $primary_id, 'PTR'); diff --git a/interface/lib/classes/remote.d/mail.inc.php b/interface/lib/classes/remote.d/mail.inc.php index c4582c634e43824d632881b2496b5a71930c3ba9..cad598043593bdddb82befe954ab665e428b2528 100644 --- a/interface/lib/classes/remote.d/mail.inc.php +++ b/interface/lib/classes/remote.d/mail.inc.php @@ -60,7 +60,7 @@ class remoting_mail extends remoting { throw new SoapFault('permission_denied', 'You do not have the permissions to access this function.'); return false; } - $primary_id = $this->insertQuery('../mail/form/mail_domain.tform.php', $client_id, $params); + $primary_id = $this->insertQuery('../mail/form/mail_domain.tform.php', $client_id, $params, 'mail:mail_domain:on_after_insert'); return $primary_id; } @@ -71,7 +71,7 @@ class remoting_mail extends remoting { throw new SoapFault('permission_denied', 'You do not have the permissions to access this function.'); return false; } - $affected_rows = $this->updateQuery('../mail/form/mail_domain.tform.php', $client_id, $primary_id, $params); + $affected_rows = $this->updateQuery('../mail/form/mail_domain.tform.php', $client_id, $primary_id, $params, 'mail:mail_domain:on_after_update'); return $affected_rows; } @@ -82,7 +82,7 @@ class remoting_mail extends remoting { throw new SoapFault('permission_denied', 'You do not have the permissions to access this function.'); return false; } - $affected_rows = $this->deleteQuery('../mail/form/mail_domain.tform.php', $primary_id); + $affected_rows = $this->deleteQuery('../mail/form/mail_domain.tform.php', $primary_id, 'mail:mail_domain:on_after_delete'); return $affected_rows; } @@ -222,7 +222,7 @@ class remoting_mail extends remoting { if (!isset($params['gid'])) $params['gid'] = -1; if (!isset($params['maildir_format'])) $params['maildir_format'] = 'maildir'; - $mailuser_id = $this->insertQuery('../mail/form/mail_user.tform.php', $client_id, $params); + $mailuser_id = $this->insertQuery('../mail/form/mail_user.tform.php', $client_id, $params, 'mail:mail_user:on_after_insert'); return $mailuser_id; } @@ -245,7 +245,7 @@ class remoting_mail extends remoting { return false; } - $affected_rows = $this->updateQuery('../mail/form/mail_user.tform.php', $client_id, $primary_id, $params); + $affected_rows = $this->updateQuery('../mail/form/mail_user.tform.php', $client_id, $primary_id, $params, 'mail:mail_user:on_after_update'); return $affected_rows; } @@ -258,7 +258,7 @@ class remoting_mail extends remoting { throw new SoapFault('permission_denied', 'You do not have the permissions to access this function.'); return false; } - $affected_rows = $this->deleteQuery('../mail/form/mail_user.tform.php', $primary_id); + $affected_rows = $this->deleteQuery('../mail/form/mail_user.tform.php', $primary_id, 'mail:mail_user:on_after_delete'); return $affected_rows; } @@ -413,7 +413,7 @@ class remoting_mail extends remoting { } unset($tmp); - $affected_rows = $this->insertQuery('../mail/form/mail_alias.tform.php', $client_id, $params); + $affected_rows = $this->insertQuery('../mail/form/mail_alias.tform.php', $client_id, $params, 'mail:mail_alias:on_after_insert'); return $affected_rows; } @@ -435,7 +435,7 @@ class remoting_mail extends remoting { } unset($tmp); - $affected_rows = $this->updateQuery('../mail/form/mail_alias.tform.php', $client_id, $primary_id, $params); + $affected_rows = $this->updateQuery('../mail/form/mail_alias.tform.php', $client_id, $primary_id, $params, 'mail:mail_alias:on_after_update'); return $affected_rows; } @@ -446,7 +446,7 @@ class remoting_mail extends remoting { throw new SoapFault('permission_denied', 'You do not have the permissions to access this function.'); return false; } - $affected_rows = $this->deleteQuery('../mail/form/mail_alias.tform.php', $primary_id); + $affected_rows = $this->deleteQuery('../mail/form/mail_alias.tform.php', $primary_id, 'mail:mail_alias:on_after_delete'); return $affected_rows; } @@ -472,7 +472,7 @@ class remoting_mail extends remoting { throw new SoapFault('permission_denied', 'You do not have the permissions to access this function.'); return false; } - $affected_rows = $this->insertQuery('../mail/form/mail_forward.tform.php', $client_id, $params); + $affected_rows = $this->insertQuery('../mail/form/mail_forward.tform.php', $client_id, $params, 'mail:mail_forward:on_after_insert'); return $affected_rows; } @@ -484,7 +484,7 @@ class remoting_mail extends remoting { throw new SoapFault('permission_denied', 'You do not have the permissions to access this function.'); return false; } - $affected_rows = $this->updateQuery('../mail/form/mail_forward.tform.php', $client_id, $primary_id, $params); + $affected_rows = $this->updateQuery('../mail/form/mail_forward.tform.php', $client_id, $primary_id, $params, 'mail:mail_forward:on_after_update'); return $affected_rows; } @@ -496,7 +496,7 @@ class remoting_mail extends remoting { throw new SoapFault('permission_denied', 'You do not have the permissions to access this function.'); return false; } - $affected_rows = $this->deleteQuery('../mail/form/mail_forward.tform.php', $primary_id); + $affected_rows = $this->deleteQuery('../mail/form/mail_forward.tform.php', $primary_id, 'mail:mail_forward:on_after_delete'); return $affected_rows; } @@ -663,7 +663,7 @@ class remoting_mail extends remoting { return $app->remoting_lib->getDataRecord($primary_id); } - //* biaÅ‚a lista e-mail + //* add spamfilter whitelist entry public function mail_spamfilter_whitelist_add($session_id, $client_id, $params) { if (!$this->checkPerm($session_id, 'mail_spamfilter_whitelist_add')) @@ -763,7 +763,7 @@ class remoting_mail extends remoting { return $app->remoting_lib->getDataRecord($primary_id); } - //* filtr spamu użytkowników e-mail + //* Add new spamfilter_users public function mail_spamfilter_user_add($session_id, $client_id, $params) { if (!$this->checkPerm($session_id, 'mail_spamfilter_user_add')) @@ -1110,4 +1110,4 @@ class remoting_mail extends remoting { } -?> +?> \ No newline at end of file diff --git a/interface/lib/classes/remoting.inc.php b/interface/lib/classes/remoting.inc.php index fbadebd777a078da38ecad0670bc328b6346f3b1..7bd39645af4ca7ae37bab872a651be07268609ac 100644 --- a/interface/lib/classes/remoting.inc.php +++ b/interface/lib/classes/remoting.inc.php @@ -85,10 +85,20 @@ class remoting { //* Delete old remoting sessions $sql = "DELETE FROM remote_session WHERE tstamp < UNIX_TIMESTAMP()"; $app->db->query($sql); + + //* Check for max. login attempts + $ip_md5 = md5($_SERVER['REMOTE_ADDR']); + $sql = "SELECT * FROM `attempts_login` WHERE `ip`= ? AND `login_time` > (NOW() - INTERVAL 5 MINUTE) LIMIT 1"; + $alreadyfailed = $app->db->queryOneRecord($sql, $ip_md5); + + if($alreadyfailed['times'] >= 10) { + throw new SoapFault('login_failure_limit', 'The login failure limit has been reached.'); + return false; + } if($client_login == true) { $sql = "SELECT * FROM sys_user WHERE USERNAME = ?"; - $user = $app->db->queryOneRecord($sql, $username); + $user = $app->db->queryOneRecord($sql, (string)$username); if($user) { $saved_password = stripslashes($user['passwort']); @@ -104,6 +114,16 @@ class remoting { } } } else { + if(!$alreadyfailed['times'] ) + { + //* user login the first time wrong + $sql = "INSERT INTO `attempts_login` (`ip`, `times`, `login_time`) VALUES (?, 1, NOW())"; + $app->db->query($sql, $ip_md5); + } elseif($alreadyfailed['times'] >= 1) { + //* update times wrong + $sql = "UPDATE `attempts_login` SET `times`=`times`+1, `login_time`=NOW() WHERE `ip` = ? ORDER BY `login_time` DESC LIMIT 1"; + $app->db->query($sql, $ip_md5); + } throw new SoapFault('client_login_failed', 'The login failed. Username or password wrong.'); } if($user['active'] != 1) { @@ -118,18 +138,24 @@ class remoting { } //* Create a remote user session - //srand ((double)microtime()*1000000); - $remote_session = md5(mt_rand().uniqid('ispco')); + // session id must begin with a char, not digit, to avoid mysql type confusion abuse + $remote_session = substr(str_shuffle('abcdefghijklmnopqrstuvwxyz'),0,1).bin2hex(random_bytes(20)); $remote_userid = $user['userid']; $remote_functions = ''; $tstamp = time() + $this->session_timeout; - $sql = 'INSERT INTO remote_session (remote_session,remote_userid,remote_functions,client_login,tstamp' - .') VALUES (?, ?, ?, 1, ?)'; - $app->db->query($sql, $remote_session,$remote_userid,$remote_functions,$tstamp); + $ip = $_SERVER['REMOTE_ADDR']; + $sql = 'INSERT INTO remote_session (remote_session,remote_userid,remote_functions,client_login,tstamp,remote_ip' + .') VALUES (?, ?, ?, 1, ?, ?)'; + $app->db->query($sql, $remote_session,$remote_userid,$remote_functions,$tstamp,$ip); + + //* Delete login attempts after successful login + $sql = "DELETE FROM `attempts_login` WHERE `ip`=?"; + $app->db->query($sql, $ip_md5); + return $remote_session; } else { $sql = "SELECT * FROM remote_user WHERE remote_username = ?"; - $remote_user = $app->db->queryOneRecord($sql, $username); + $remote_user = $app->db->queryOneRecord($sql, (string)$username); if($remote_user) { if(substr($remote_user['remote_password'], 0, 1) === '$') { if(crypt(stripslashes($password), $remote_user['remote_password']) != $remote_user['remote_password']) { @@ -138,7 +164,7 @@ class remoting { } elseif(md5($password) == $remote_user['remote_password']) { // update hash algo $sql = 'UPDATE `remote_user` SET `remote_password` = ? WHERE `remote_username` = ?'; - $app->db->query($sql, $app->auth->crypt_password($password), $username); + $app->db->query($sql, $app->auth->crypt_password($password), (string)$username); } else { $remote_user = null; } @@ -170,9 +196,9 @@ class remoting { if(trim($remote_user['remote_ips']) == '') { $remote_allowed=true; } else { - $ip = inet_pton($_SERVER['REMOTE_ADDR']); + $ip_bin = inet_pton($ip); foreach($allowed_ips as $allowed) { - if($ip == inet_pton(trim($allowed))) { + if($ip_bin == inet_pton(trim($allowed))) { $remote_allowed=true; break; } @@ -184,16 +210,33 @@ class remoting { return false; } //* Create a remote user session - //srand ((double)microtime()*1000000); - $remote_session = md5(mt_rand().uniqid('ispco')); + // session id must begin with a char, not digit, to avoid mysql type confusion abuse + $remote_session = substr(str_shuffle('abcdefghijklmnopqrstuvwxyz'),0,1).bin2hex(random_bytes(20)); $remote_userid = $remote_user['remote_userid']; $remote_functions = $remote_user['remote_functions']; $tstamp = time() + $this->session_timeout; - $sql = 'INSERT INTO remote_session (remote_session,remote_userid,remote_functions,tstamp' - .') VALUES (?, ?, ?, ?)'; - $app->db->query($sql, $remote_session,$remote_userid,$remote_functions,$tstamp); + $sql = 'INSERT INTO remote_session (remote_session,remote_userid,remote_functions,tstamp,remote_ip' + .') VALUES (?, ?, ?, ?, ?)'; + $app->db->query($sql, $remote_session,$remote_userid,$remote_functions,$tstamp, $ip); + + //* Delete login attempts after successful login + $sql = "DELETE FROM `attempts_login` WHERE `ip`=?"; + $app->db->query($sql, $ip_md5); + return $remote_session; } else { + + if(!$alreadyfailed['times'] ) + { + //* user login the first time wrong + $sql = "INSERT INTO `attempts_login` (`ip`, `times`, `login_time`) VALUES (?, 1, NOW())"; + $app->db->query($sql, $ip_md5); + } elseif($alreadyfailed['times'] >= 1) { + //* update times wrong + $sql = "UPDATE `attempts_login` SET `times`=`times`+1, `login_time`=NOW() WHERE `ip` = ? ORDER BY `login_time` DESC LIMIT 1"; + $app->db->query($sql, $ip_md5); + } + throw new SoapFault('login_failed', 'The login failed. Username or password wrong.'); return false; } @@ -212,7 +255,7 @@ class remoting { } $sql = "DELETE FROM remote_session WHERE remote_session = ?"; - if($app->db->query($sql, $session_id) != false) { + if($app->db->query($sql, (string)$session_id) != false) { return true; } else { return false; @@ -522,12 +565,61 @@ class remoting { throw new SoapFault('session_id_empty', 'The SessionID is empty.'); return false; } + + if(!is_string($session_id)) { + throw new SoapFault('session_id_nostring', 'Wrong SessionID datatype.'); + return false; + } + + $ip_md5 = md5($_SERVER['REMOTE_ADDR']); + $sql = "SELECT * FROM `attempts_login` WHERE `ip`= ? AND `login_time` > (NOW() - INTERVAL 5 MINUTE) LIMIT 1"; + $alreadyfailed = $app->db->queryOneRecord($sql, $ip_md5); + + if($alreadyfailed['times'] >= 10) { + throw new SoapFault('session_failure_limit', 'The Session failure limit has been reached.'); + return false; + } $sql = "SELECT * FROM remote_session WHERE remote_session = ? AND tstamp >= UNIX_TIMESTAMP()"; - $session = $app->db->queryOneRecord($sql, $session_id); + $session = $app->db->queryOneRecord($sql, (string)$session_id); + + if(!is_array($session)) { + if(!$alreadyfailed['times'] ) + { + //* user login the first time wrong + $sql = "INSERT INTO `attempts_login` (`ip`, `times`, `login_time`) VALUES (?, 1, NOW())"; + $app->db->query($sql, $ip_md5); + } elseif($alreadyfailed['times'] >= 1) { + //* update times wrong + $sql = "UPDATE `attempts_login` SET `times`=`times`+1, `login_time`=NOW() WHERE `ip` = ? ORDER BY `login_time` DESC LIMIT 1"; + $app->db->query($sql, $ip_md5); + } + + throw new SoapFault('session_does_not_exist', 'The Session is expired or does not exist.'); + return false; + } + + $ip = $_SERVER['REMOTE_ADDR']; + if($session['remote_ip'] != $ip) { + throw new SoapFault('session_ip_mismatch', 'Session IP mismatch.'); + return false; + } + if($session['remote_userid'] > 0) { return $session; } else { + + if(!$alreadyfailed['times'] ) + { + //* user login the first time wrong + $sql = "INSERT INTO `attempts_login` (`ip`, `times`, `login_time`) VALUES (?, 1, NOW())"; + $app->db->query($sql, $ip_md5); + } elseif($alreadyfailed['times'] >= 1) { + //* update times wrong + $sql = "UPDATE `attempts_login` SET `times`=`times`+1, `login_time`=NOW() WHERE `ip` = ? AND `login_time` < NOW() ORDER BY `login_time` DESC LIMIT 1"; + $app->db->query($sql, $ip_md5); + } + throw new SoapFault('session_does_not_exist', 'The Session is expired or does not exist.'); return false; } diff --git a/interface/lib/classes/remoting_lib.inc.php b/interface/lib/classes/remoting_lib.inc.php index 6436e6e792a04aba37ccc56864dc55134f459673..c496cb7e2233eb9fa85ad22eed9ce5faaa35b7d5 100644 --- a/interface/lib/classes/remoting_lib.inc.php +++ b/interface/lib/classes/remoting_lib.inc.php @@ -232,7 +232,7 @@ class remoting_lib extends tform_base { if(@is_numeric($primary_id)) { if($primary_id > 0) { // Return a single record - return parent::getDataRecord($primary_id); + return parent::getDataRecord(intval($primary_id)); } elseif($primary_id == -1) { // Return a array with all records $sql = "SELECT * FROM ??"; @@ -255,8 +255,8 @@ class remoting_lib extends tform_base { } else { $sql_where .= "?? = ? AND "; } - $params[] = $key; - $params[] = $val; + $params[] = (string)$key; + $params[] = (string)$val; } $sql_where = substr($sql_where, 0, -5); if($sql_where == '') $sql_where = '1'; diff --git a/interface/lib/classes/session.inc.php b/interface/lib/classes/session.inc.php index 3e93cd4314faded0b1f32e7a0e0b094a183de693..55247621a39cff22e272dfbe22fcaa1fe57e209d 100644 --- a/interface/lib/classes/session.inc.php +++ b/interface/lib/classes/session.inc.php @@ -70,9 +70,9 @@ class session { function read ($session_id) { if($this->timeout > 0) { - $rec = $this->db->queryOneRecord("SELECT * FROM sys_session WHERE session_id = ? AND (`permanent` = 'y' OR last_updated >= DATE_SUB(NOW(), INTERVAL ? MINUTE))", $session_id, $this->timeout); + $rec = $this->db->queryOneRecord("SELECT * FROM sys_session WHERE session_id = ? AND (`permanent` = 'y' OR last_updated >= DATE_SUB(NOW(), INTERVAL ? MINUTE))", (string)$session_id, $this->timeout); } else { - $rec = $this->db->queryOneRecord("SELECT * FROM sys_session WHERE session_id = ?", $session_id); + $rec = $this->db->queryOneRecord("SELECT * FROM sys_session WHERE session_id = ?", (string)$session_id); } if (is_array($rec)) { @@ -91,18 +91,18 @@ class session { // Dont write session_data to DB if session data has not been changed after reading it. if(isset($this->session_array['session_data']) && $this->session_array['session_data'] != '' && $this->session_array['session_data'] == $session_data) { - $this->db->query("UPDATE sys_session SET last_updated = NOW() WHERE session_id = ?", $session_id); + $this->db->query("UPDATE sys_session SET last_updated = NOW() WHERE session_id = ?", (string)$session_id); return true; } if (@$this->session_array['session_id'] == '') { $sql = "REPLACE INTO sys_session (session_id,date_created,last_updated,session_data,permanent) VALUES (?,NOW(),NOW(),?,?)"; - $this->db->query($sql, $session_id, $session_data, ($this->permanent ? 'y' : 'n')); + $this->db->query($sql, (string)$session_id, $session_data, ($this->permanent ? 'y' : 'n')); } else { $sql = "UPDATE sys_session SET last_updated = NOW(), session_data = ?" . ($this->permanent ? ", `permanent` = 'y'" : "") . " WHERE session_id = ?"; - $this->db->query($sql, $session_data, $session_id); + $this->db->query($sql, $session_data, (string)$session_id); } @@ -112,7 +112,7 @@ class session { function destroy ($session_id) { $sql = "DELETE FROM sys_session WHERE session_id = ?"; - $this->db->query($sql, $session_id); + $this->db->query($sql, (string)$session_id); return true; } diff --git a/interface/lib/classes/system.inc.php b/interface/lib/classes/system.inc.php index d6b0ef149e285dbe3e3c438cff36bbe44daddac8..9cb171cae5d2f230ede4b117bc1b6900625f1d69 100644 --- a/interface/lib/classes/system.inc.php +++ b/interface/lib/classes/system.inc.php @@ -79,6 +79,32 @@ class system { return false; } + function rmdir($path, $recursive=false) { + // Disallow operating on root directory + if(realpath($path) == '/') { + $app->log("rmdir: afraid I might delete root: $path", LOGLEVEL_WARN); + return false; + } + + $path = rtrim($path, '/'); + if (is_dir($path) && !is_link($path)) { + $objects = array_diff(scandir($path), array('.', '..')); + foreach ($objects as $object) { + if ($recursive) { + if (is_dir("$path/$object") && !is_link("$path/$object")) { + $this->rmdir("$path/$object", $recursive); + } else { + unlink ("$path/$object"); + } + } else { + $app->log("rmdir: invoked non-recursive, not removing $path (expect rmdir failure)", LOGLEVEL_DEBUG); + } + } + return rmdir($path); + } + return false; + } + public function last_exec_out() { return $this->_last_exec_out; } diff --git a/interface/lib/classes/validate_client.inc.php b/interface/lib/classes/validate_client.inc.php index 4652e2a07b1ddc65f5776a4538ec34d4ab382db4..09e1df9e150e9042cdc32c10587a407f6c226fe4 100644 --- a/interface/lib/classes/validate_client.inc.php +++ b/interface/lib/classes/validate_client.inc.php @@ -175,7 +175,8 @@ class validate_client { } } try { - $client = new SoapClient("http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl"); + ini_set("default_socket_timeout", 5); + $client = new SoapClient("http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl", array('connection_timeout' => 5)); $params = array('countryCode' => $cc, 'vatNumber' => $vn); try{ $r = $client->checkVat($params); diff --git a/interface/lib/classes/validate_mail_relay_domain.inc.php b/interface/lib/classes/validate_mail_relay_domain.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..44e13998a4af1ed529c02e62ffd27dae582ccb75 --- /dev/null +++ b/interface/lib/classes/validate_mail_relay_domain.inc.php @@ -0,0 +1,61 @@ +<?php + +/* +Copyright (c) 2007, Till Brehm, projektfarm Gmbh +Copyright (c) 2021, Jesse Norell <jesse@kci.net> +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of ISPConfig nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +class validate_mail_relay_domain { + + function get_error($errmsg) { + global $app; + + if(isset($app->tform->wordbook[$errmsg])) { + return $app->tform->wordbook[$errmsg]."<br>\r\n"; + } else { + return $errmsg."<br>\r\n"; + } + } + + /* Validator function for checking the 'domain' of a mail relay domain */ + function validate_domain($field_name, $field_value, $validator) { + global $app, $conf; + + if(isset($app->remoting_lib->primary_id)) { + $id = $app->remoting_lib->primary_id; + } else { + $id = $app->tform->primary_id; + } + + // mail_relay_domain.domain must be unique per server + $sql = "SELECT relay_domain_id, domain FROM mail_relay_domain WHERE domain = ? AND server_id = ? AND relay_domain_id != ?"; + $domain_check = $app->db->queryOneRecord($sql, $field_value, $app->tform_actions->dataRecord['server_id'], $id); + + if($domain_check) return $this->get_error('domain_error_unique'); + } + +} diff --git a/interface/lib/classes/validate_mail_transport.inc.php b/interface/lib/classes/validate_mail_transport.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..6b47d953030cb2274ed34ed598231336f940fbc9 --- /dev/null +++ b/interface/lib/classes/validate_mail_transport.inc.php @@ -0,0 +1,61 @@ +<?php + +/* +Copyright (c) 2007, Till Brehm, projektfarm Gmbh +Copyright (c) 2021, Jesse Norell <jesse@kci.net> +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of ISPConfig nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +class validate_mail_transport { + + function get_error($errmsg) { + global $app; + + if(isset($app->tform->wordbook[$errmsg])) { + return $app->tform->wordbook[$errmsg]."<br>\r\n"; + } else { + return $errmsg."<br>\r\n"; + } + } + + /* Validator function for checking the 'domain' of a mail transport */ + function validate_domain($field_name, $field_value, $validator) { + global $app, $conf; + + if(isset($app->remoting_lib->primary_id)) { + $id = $app->remoting_lib->primary_id; + } else { + $id = $app->tform->primary_id; + } + + // mail_transport.domain (could also be an email address) must be unique per server + $sql = "SELECT transport_id, domain FROM mail_transport WHERE domain = ? AND server_id = ? AND transport_id != ?"; + $domain_check = $app->db->queryOneRecord($sql, $field_value, $app->tform_actions->dataRecord['server_id'], $id); + + if($domain_check) return $this->get_error('domain_error_unique'); + } + +} diff --git a/interface/lib/compatibility.inc.php b/interface/lib/compatibility.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..562e07ada42f404cae0708f32105dcf39a84768c --- /dev/null +++ b/interface/lib/compatibility.inc.php @@ -0,0 +1,80 @@ +<?php + +/* +Copyright (c) 2021, Jesse Norell <jesse@kci.net> +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of ISPConfig nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* random_bytes can be dropped when php 5.6 support is dropped */ +if (! function_exists('random_bytes')) { + function random_bytes($length) { + return openssl_random_pseudo_bytes($length); + } +} + +/* random_int can be dropped when php 5.6 support is dropped */ +if (! function_exists('random_int')) { + function random_int($min=null, $max=null) { + if (null === $min) { + $min = PHP_INT_MIN; + } + + if (null === $max) { + $min = PHP_INT_MAX; + } + + if (!is_int($min) || !is_int($max)) { + trigger_error('random_int: $min and $max must be integer values', E_USER_NOTICE); + $min = (int)$min; + $max = (int)$max; + } + + if ($min > $max) { + trigger_error('random_int: $max can\'t be lesser than $min', E_USER_WARNING); + return null; + } + + $range = $counter = $max - $min; + $bits = 1; + + while ($counter >>= 1) { + ++$bits; + } + + $bytes = (int)max(ceil($bits/8), 1); + $bitmask = pow(2, $bits) - 1; + + if ($bitmask >= PHP_INT_MAX) { + $bitmask = PHP_INT_MAX; + } + + do { + $result = hexdec(bin2hex(random_bytes($bytes))) & $bitmask; + } while ($result > $range); + + return $result + $min; + } +} diff --git a/interface/lib/config.inc.php b/interface/lib/config.inc.php index c5d14d79cdbdb02d98e2a1129d91871101170258..c492680513e0553fe00499adf670725a714d6fc7 100644 --- a/interface/lib/config.inc.php +++ b/interface/lib/config.inc.php @@ -159,4 +159,7 @@ define('LOGLEVEL_DEBUG', 0); define('LOGLEVEL_WARN', 1); define('LOGLEVEL_ERROR', 2); +//** Admin IP whitelist file +$conf['admin_ip_whitelist_file'] = '/usr/local/ispconfig/security/admin_ip.whitelist'; + ?> diff --git a/interface/lib/lang/ar.lng b/interface/lib/lang/ar.lng index 2763f8e82b62ca71763dcba6434898d7eb1f1fac..c2bc19a6b9f483c11d8fe2e5bcc48ac2af5ef109 100644 --- a/interface/lib/lang/ar.lng +++ b/interface/lib/lang/ar.lng @@ -172,4 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user'; $wb['unlimited_txt'] = 'Unlimited'; $wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.'; $wb['datalog_changes_close_txt'] = 'Close'; -?> +$wb['non_admin_error'] = 'Requires administrator level permissions'; diff --git a/interface/lib/lang/bg.lng b/interface/lib/lang/bg.lng index 94dfaa8ad19b9f45499558418abcb46ea7cb49de..e0a0bfcdaba846f50de030d2bc1c07d7849eb154 100644 --- a/interface/lib/lang/bg.lng +++ b/interface/lib/lang/bg.lng @@ -172,4 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Изтрий XMPP потребител'; $wb['unlimited_txt'] = 'Ðеограничен'; $wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.'; $wb['datalog_changes_close_txt'] = 'Close'; -?> +$wb['non_admin_error'] = 'Requires administrator level permissions'; diff --git a/interface/lib/lang/br.lng b/interface/lib/lang/br.lng index e47df8250d24614216a07587ee96874ad4d9426c..7e78ddaf364953e5d0f567aa6bf63384c8ef513b 100644 --- a/interface/lib/lang/br.lng +++ b/interface/lib/lang/br.lng @@ -172,3 +172,4 @@ $wb['select_master_directive_snippet_txt'] = 'Diretiva mestre de trechos de cód $wb['unlimited_txt'] = 'Ilimitado'; $wb['server_id_0_error_txt'] = 'Por favor, selecione um servidor válido. O ID do servidor deve ser > 0.'; $wb['datalog_changes_close_txt'] = 'Fechar'; +$wb['non_admin_error'] = 'Requires administrator level permissions'; diff --git a/interface/lib/lang/ca.lng b/interface/lib/lang/ca.lng index c57185fd108c8efb9df79f46b0b1acd786b73844..308aba545bfb2fffbfdb63b2076988f51e91f7fa 100644 --- a/interface/lib/lang/ca.lng +++ b/interface/lib/lang/ca.lng @@ -172,4 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user'; $wb['unlimited_txt'] = 'Illimité'; $wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.'; $wb['datalog_changes_close_txt'] = 'Close'; -?> \ No newline at end of file +$wb['non_admin_error'] = 'Requires administrator level permissions'; diff --git a/interface/lib/lang/cz.lng b/interface/lib/lang/cz.lng index 04ad86178c2f46e50b7f9b0fd1e5015c0b72de02..84ce72a4c0bc98a423932e90904306ee9256fcf4 100644 --- a/interface/lib/lang/cz.lng +++ b/interface/lib/lang/cz.lng @@ -172,3 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Smazat XMPP uživatele'; $wb['unlimited_txt'] = 'Neomezený'; $wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.'; $wb['datalog_changes_close_txt'] = 'Close'; +$wb['non_admin_error'] = 'Requires administrator level permissions'; diff --git a/interface/lib/lang/de.lng b/interface/lib/lang/de.lng index 11a5e21a5d2ef0f62e26d18627c4b0cab444da93..38e9c2b40c04df1deaea832f89681ea96ed1b5d2 100644 --- a/interface/lib/lang/de.lng +++ b/interface/lib/lang/de.lng @@ -172,4 +172,4 @@ $wb['select_master_directive_snippet_txt'] = 'Master Direktiven Schnipsel'; $wb['unlimited_txt'] = 'unlimitiert'; $wb['server_id_0_error_txt'] = 'Bitte Server auswählen. Server ID muss > als 0 sein.'; $wb['datalog_changes_close_txt'] = 'Close'; -?> \ No newline at end of file +$wb['non_admin_error'] = 'Requires administrator level permissions'; diff --git a/interface/lib/lang/dk.lng b/interface/lib/lang/dk.lng index 9d09f1dc8dd97691652d4f1353d2fc9ae9490300..de52b0e704f00f5c6b9d1808ff09ad6845203aa7 100644 --- a/interface/lib/lang/dk.lng +++ b/interface/lib/lang/dk.lng @@ -172,4 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user'; $wb['unlimited_txt'] = 'Ubegrænset'; $wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.'; $wb['datalog_changes_close_txt'] = 'Close'; -?> \ No newline at end of file +$wb['non_admin_error'] = 'Requires administrator level permissions'; diff --git a/interface/lib/lang/el.lng b/interface/lib/lang/el.lng index 31829d5f937f3b5effcfc0a26974a8298a82cf70..42d991401d696eeef8a1b9e0ed9720438ac70884 100644 --- a/interface/lib/lang/el.lng +++ b/interface/lib/lang/el.lng @@ -172,4 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user'; $wb['unlimited_txt'] = 'ΑπεÏιόÏιστα'; $wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.'; $wb['datalog_changes_close_txt'] = 'Close'; -?> \ No newline at end of file +$wb['non_admin_error'] = 'Requires administrator level permissions'; diff --git a/interface/lib/lang/en.lng b/interface/lib/lang/en.lng index dbffc95b8c9bdcb6a821b6038fa40c72ee35131b..57c8d1f79f88ac69ced6a397e5bb5dd8fe7d5806 100644 --- a/interface/lib/lang/en.lng +++ b/interface/lib/lang/en.lng @@ -173,4 +173,4 @@ $wb['select_master_directive_snippet_txt'] = 'Master Directive Snippets'; $wb['unlimited_txt'] = 'Unlimited'; $wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.'; $wb['datalog_changes_close_txt'] = 'Close'; -?> \ No newline at end of file +$wb['non_admin_error'] = 'Requires administrator level permissions'; diff --git a/interface/lib/lang/es.lng b/interface/lib/lang/es.lng index 3a421e7af51352f0c7e1be5b2e8d1bc0b7e6a301..2d120a2b97603a0d962508aa425e9158272c4baf 100644 --- a/interface/lib/lang/es.lng +++ b/interface/lib/lang/es.lng @@ -172,4 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Borrar usuario XMPP'; $wb['unlimited_txt'] = 'Ilimitado'; $wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.'; $wb['datalog_changes_close_txt'] = 'Cerrar'; -?> +$wb['non_admin_error'] = 'Requires administrator level permissions'; diff --git a/interface/lib/lang/fi.lng b/interface/lib/lang/fi.lng index f6648e88c6bcc0a07ca3e187f6bf3aea32ce780a..7974914e0e9eab89775f76fdbad6febbbaa166f9 100644 --- a/interface/lib/lang/fi.lng +++ b/interface/lib/lang/fi.lng @@ -172,4 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user'; $wb['unlimited_txt'] = 'Unlimited'; $wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.'; $wb['datalog_changes_close_txt'] = 'Close'; -?> \ No newline at end of file +$wb['non_admin_error'] = 'Requires administrator level permissions'; diff --git a/interface/lib/lang/fr.lng b/interface/lib/lang/fr.lng index 15e8294e0c91aa97a15e19774432a0464a8a5d2c..b4bb837e7df140a132009910c64221a5ab227d3c 100644 --- a/interface/lib/lang/fr.lng +++ b/interface/lib/lang/fr.lng @@ -172,4 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user'; $wb['unlimited_txt'] = 'Illimité'; $wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.'; $wb['datalog_changes_close_txt'] = 'Close'; -?> \ No newline at end of file +$wb['non_admin_error'] = 'Requires administrator level permissions'; diff --git a/interface/lib/lang/hr.lng b/interface/lib/lang/hr.lng index fdb09cbff53d220195ae9b313dba6aea71c86aad..bef42f1814ce5d93bc603c69d31b3cb630b7faeb 100644 --- a/interface/lib/lang/hr.lng +++ b/interface/lib/lang/hr.lng @@ -172,4 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user'; $wb['unlimited_txt'] = 'neograniÄeno'; $wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.'; $wb['datalog_changes_close_txt'] = 'Close'; -?> \ No newline at end of file +$wb['non_admin_error'] = 'Requires administrator level permissions'; diff --git a/interface/lib/lang/hu.lng b/interface/lib/lang/hu.lng index 8e65d4c97416c77f9964c24afc0d0bbd5e96f3dd..e3913462fe0adc3a0152e4c39425d62bfb634dbf 100644 --- a/interface/lib/lang/hu.lng +++ b/interface/lib/lang/hu.lng @@ -172,4 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user'; $wb['unlimited_txt'] = 'Korlátlan'; $wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.'; $wb['datalog_changes_close_txt'] = 'Close'; -?> \ No newline at end of file +$wb['non_admin_error'] = 'Requires administrator level permissions'; diff --git a/interface/lib/lang/id.lng b/interface/lib/lang/id.lng index 693ca49015657476fd703df309c8a45f8dd2cd4c..aea01a061486780e671c2d12e03f1e95cc18b866 100644 --- a/interface/lib/lang/id.lng +++ b/interface/lib/lang/id.lng @@ -172,4 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user'; $wb['unlimited_txt'] = 'Tak terbatas'; $wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.'; $wb['datalog_changes_close_txt'] = 'Close'; -?> \ No newline at end of file +$wb['non_admin_error'] = 'Requires administrator level permissions'; diff --git a/interface/lib/lang/it.lng b/interface/lib/lang/it.lng index 1333cc907f541947ec262ecedf708e01985281a0..ff08d6f6337a6fdf84ed4b6befc103344e12b1e1 100644 --- a/interface/lib/lang/it.lng +++ b/interface/lib/lang/it.lng @@ -172,4 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Elimina utente XMPP'; $wb['unlimited_txt'] = 'illimitati'; $wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.'; $wb['datalog_changes_close_txt'] = 'Chiudi'; -?> +$wb['non_admin_error'] = 'Requires administrator level permissions'; diff --git a/interface/lib/lang/ja.lng b/interface/lib/lang/ja.lng index 2d24f9a1f70ab5bbdbebd7d53927546ffd52153c..7235de393e3c7d4a7878eeb13554b791f048084f 100644 --- a/interface/lib/lang/ja.lng +++ b/interface/lib/lang/ja.lng @@ -172,4 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user'; $wb['unlimited_txt'] = 'Unlimited'; $wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.'; $wb['datalog_changes_close_txt'] = 'Close'; -?> \ No newline at end of file +$wb['non_admin_error'] = 'Requires administrator level permissions'; diff --git a/interface/lib/lang/nl.lng b/interface/lib/lang/nl.lng index 3af436ca485348404bc1c3bde176ac4356b9246f..54e7045e612ff200bad7be702f0ddd74141f3e29 100644 --- a/interface/lib/lang/nl.lng +++ b/interface/lib/lang/nl.lng @@ -172,4 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user'; $wb['unlimited_txt'] = 'Ongelimiteerd'; $wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.'; $wb['datalog_changes_close_txt'] = 'Sluiten'; -?> +$wb['non_admin_error'] = 'Requires administrator level permissions'; diff --git a/interface/lib/lang/pl.lng b/interface/lib/lang/pl.lng index 4a1cd0384e1c8b5f2042bfc954630fc97ec43a1b..ccd3347324793d50ead081987c6f3d1c49ee55ba 100644 --- a/interface/lib/lang/pl.lng +++ b/interface/lib/lang/pl.lng @@ -172,4 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user'; $wb['unlimited_txt'] = 'nielimitowane'; $wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.'; $wb['datalog_changes_close_txt'] = 'Close'; -?> \ No newline at end of file +$wb['non_admin_error'] = 'Requires administrator level permissions'; diff --git a/interface/lib/lang/pt.lng b/interface/lib/lang/pt.lng index 86d4442c42d2f31eb4d6d83359ce2a30db1cc9af..e2dc2f72acba3a877f0463fff46f38b4931641c1 100644 --- a/interface/lib/lang/pt.lng +++ b/interface/lib/lang/pt.lng @@ -172,4 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user'; $wb['unlimited_txt'] = 'Unlimited'; $wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.'; $wb['datalog_changes_close_txt'] = 'Close'; -?> \ No newline at end of file +$wb['non_admin_error'] = 'Requires administrator level permissions'; diff --git a/interface/lib/lang/ro.lng b/interface/lib/lang/ro.lng index 4f032832eb92c4b26c261892e3ca6a1268a42e79..6a9f596a0b74fd64d85099ce0f8b3ed941421407 100644 --- a/interface/lib/lang/ro.lng +++ b/interface/lib/lang/ro.lng @@ -172,4 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user'; $wb['unlimited_txt'] = 'Unlimited'; $wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.'; $wb['datalog_changes_close_txt'] = 'Close'; -?> \ No newline at end of file +$wb['non_admin_error'] = 'Requires administrator level permissions'; diff --git a/interface/lib/lang/ru.lng b/interface/lib/lang/ru.lng index 2d18c9f628a418d3e3232819798e0ff14d0364ca..dca0c7a53e4cb9fc8cfaf82529d6fb6f9358efe8 100644 --- a/interface/lib/lang/ru.lng +++ b/interface/lib/lang/ru.lng @@ -172,4 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Удалить Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ XMP $wb['unlimited_txt'] = 'Безлимитный'; $wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.'; $wb['datalog_changes_close_txt'] = 'Close'; -?> \ No newline at end of file +$wb['non_admin_error'] = 'Requires administrator level permissions'; diff --git a/interface/lib/lang/se.lng b/interface/lib/lang/se.lng index 5e8b3c7123a96af9a3e5697bbc3855cea19bc668..2d3c38fd3892654599a4b616b23755062d4d70b0 100644 --- a/interface/lib/lang/se.lng +++ b/interface/lib/lang/se.lng @@ -172,4 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user'; $wb['unlimited_txt'] = 'Obegränsat'; $wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.'; $wb['datalog_changes_close_txt'] = 'Close'; -?> \ No newline at end of file +$wb['non_admin_error'] = 'Requires administrator level permissions'; diff --git a/interface/lib/lang/sk.lng b/interface/lib/lang/sk.lng index cab3ea1f8f9b8017ca6b92747e5eb5ef062e5640..d8e06d1ab3a1c024260ee1fc3fed89f00f35d8e8 100644 --- a/interface/lib/lang/sk.lng +++ b/interface/lib/lang/sk.lng @@ -172,4 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user'; $wb['unlimited_txt'] = 'Unlimited'; $wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.'; $wb['datalog_changes_close_txt'] = 'Close'; -?> \ No newline at end of file +$wb['non_admin_error'] = 'Requires administrator level permissions'; diff --git a/interface/lib/lang/tr.lng b/interface/lib/lang/tr.lng index 041c8d71030e856a9e93ba18bb90a145eb4bfbdc..ec5f1bfd930ecd2d3de74f48b3ddcb48f3440511 100644 --- a/interface/lib/lang/tr.lng +++ b/interface/lib/lang/tr.lng @@ -173,4 +173,4 @@ $wb['select_master_directive_snippet_txt'] = 'Ana Komut Parçaları'; $wb['unlimited_txt'] = 'Sınırsız'; $wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.'; $wb['datalog_changes_close_txt'] = 'Close'; -?> \ No newline at end of file +$wb['non_admin_error'] = 'Requires administrator level permissions'; diff --git a/interface/lib/plugins/mail_mail_domain_plugin.inc.php b/interface/lib/plugins/mail_mail_domain_plugin.inc.php index 598fe74f09bb75c843b4a9a66a322e454a471957..4ff756f44fb2ec1be22c46313b8c7da649128a99 100644 --- a/interface/lib/plugins/mail_mail_domain_plugin.inc.php +++ b/interface/lib/plugins/mail_mail_domain_plugin.inc.php @@ -13,9 +13,10 @@ class mail_mail_domain_plugin { /* This function is called when the plugin is loaded - */ + */ function onLoad() { global $app; + //Register for the events $app->plugin->registerEvent('mail:mail_domain:on_after_insert', 'mail_mail_domain_plugin', 'mail_mail_domain_edit'); $app->plugin->registerEvent('mail:mail_domain:on_after_update', 'mail_mail_domain_plugin', 'mail_mail_domain_edit'); @@ -23,13 +24,13 @@ class mail_mail_domain_plugin { /* Function to create the sites_web_domain rule and insert it into the custom rules - */ + */ function mail_mail_domain_edit($event_name, $page_form) { global $app, $conf; $domain = $app->functions->idn_encode($page_form->dataRecord['domain']); - // make sure that the record belongs to the client group and not the admin group when a dmin inserts it + // make sure that the record belongs to the client group and not the admin group when admin inserts it // also make sure that the user can not delete entry created by an admin if($_SESSION["s"]["user"]["typ"] == 'admin' && isset($page_form->dataRecord["client_group_id"])) { $client_group_id = $app->functions->intval($page_form->dataRecord["client_group_id"]); @@ -64,6 +65,8 @@ class mail_mail_domain_plugin { $app->uses('getconf'); $mail_config = $app->getconf->get_server_config($page_form->dataRecord["server_id"], 'mail'); + $old_domain = $app->functions->idn_encode($page_form->oldDataRecord['domain']); + //* Update the mailboxes $mailusers = $app->db->queryAllRecords("SELECT * FROM mail_user WHERE email like ?", "%@" . $page_form->oldDataRecord['domain']); $sys_groupid = $app->functions->intval((isset($page_form->dataRecord['client_group_id']))?$page_form->dataRecord['client_group_id']:$page_form->oldDataRecord['sys_groupid']); @@ -76,25 +79,164 @@ class mail_mail_domain_plugin { $maildir = str_replace("[domain]", $domain, $mail_config["maildir_path"]); $maildir = str_replace("[localpart]", $mail_parts[0], $maildir); $email = $mail_parts[0].'@'.$domain; + + // update spamfilter_users and spamfilter_wblist if email change + $skip_spamfilter_users_update = false; + if($email != $rec['email']) { + $tmp_olduser = $app->db->queryOneRecord("SELECT id,fullname FROM spamfilter_users WHERE email = ?", $rec['email']); + if($tmp_olduser['id'] > 0) { + $tmp_newuser = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = ?", $email); + if($tmp_newuser['id'] > 0) { + // There is a spamfilter_users for both old and new email, we'll update old wblist entries + $tmp_wblist = $app->db->queryAllRecords("SELECT wblist_id FROM spamfilter_wblist WHERE rid = ?", $tmp_olduser['id']); + foreach ($tmp_wblist as $tmp) { + $update_data = array( + 'rid' => $tmp_newuser['id'], + 'sys_userid' => $client_user_id, + 'sys_groupid' => $sys_groupid, + ); + $app->db->datalogUpdate('spamfilter_wblist', $update_data, 'wblist_id', $tmp['wblist_id']); + } + + // now delete old spamfilter_users entry + $app->db->datalogDelete('spamfilter_users', 'id', $tmp_olduser['id']); + } else { + $update_data = array( + 'email' => $email, + 'sys_userid' => $client_user_id, + 'sys_groupid' => $sys_groupid, + ); + if($tmp_olduser['fullname'] == $app->functions->idn_decode($rec['email'])) { + $update_data['fullname'] = $app->functions->idn_decode($email); + } + $app->db->datalogUpdate('spamfilter_users', $update_data, 'id', $tmp_olduser['id']); + $skip_spamfilter_users_update = true; + + $tmp_wblist = $app->db->queryAllRecords("SELECT wblist_id FROM spamfilter_wblist WHERE rid = ?", $tmp_olduser['id']); + $update_data = array( + 'sys_userid' => $client_user_id, + 'sys_groupid' => $sys_groupid, + ); + foreach ($tmp_wblist as $tmp) { + $app->db->datalogUpdate('spamfilter_wblist', $update_data, 'wblist_id', $tmp['wblist_id']); + } + } + } + + $tmp_user = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = ?", $email); + if($tmp_user["id"] > 0) { + // There is already a record that we will update + if(!$skip_spamfilter_users_update) { + $update_data = array( + 'sys_userid' => $client_user_id, + 'sys_groupid' => $sys_groupid, + ); + $app->db->datalogUpdate('spamfilter_users', $update_data, 'id', $tmp_user['id']); + } + } else { + // We create a new record + $insert_data = array( + "sys_userid" => $client_user_id, + "sys_groupid" => $sys_groupid, + "sys_perm_user" => 'riud', + "sys_perm_group" => 'riud', + "sys_perm_other" => '', + "server_id" => $page_form->dataRecord["server_id"], + "priority" => 5, + "policy_id" => 0, + "email" => $email, + "fullname" => $app->functions->idn_decode($email), + "local" => 'Y' + ); + $app->db->datalogInsert('spamfilter_users', $insert_data, 'id'); + } + } + $app->db->datalogUpdate('mail_user', array("maildir" => $maildir, "email" => $email, "sys_userid" => $client_user_id, "sys_groupid" => $sys_groupid), 'mailuser_id', $rec['mailuser_id']); + } } //* Update the aliases - $forwardings = $app->db->queryAllRecords("SELECT * FROM mail_forwarding WHERE source LIKE ? OR destination LIKE ?", "%@" . $page_form->oldDataRecord['domain'], "%@" . $page_form->oldDataRecord['domain']); + $forwardings = $app->db->queryAllRecords("SELECT * FROM mail_forwarding WHERE source like ? OR destination like ?", '%@' . $old_domain, '%@' . $old_domain); if(is_array($forwardings)) { foreach($forwardings as $rec) { - $destination = str_replace($page_form->oldDataRecord['domain'], $domain, $rec['destination']); - $source = str_replace($page_form->oldDataRecord['domain'], $domain, $rec['source']); + $destination = str_replace($old_domain, $domain, $rec['destination']); + $source = str_replace($old_domain, $domain, $rec['source']); + + // update spamfilter_users and spamfilter_wblist if source email changes + $skip_spamfilter_users_update = false; + if(strpos($rec['source'],'@'.$old_domain) && $source != $rec['source']) { + $tmp_olduser = $app->db->queryOneRecord("SELECT id,fullname FROM spamfilter_users WHERE email = ?", $rec['source']); + if($tmp_olduser['id'] > 0) { + $tmp_newuser = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = ?", $source); + if($tmp_newuser['id'] > 0) { + // There is a spamfilter_users for both old and new email, we'll update old wblist entries + $tmp_wblist = $app->db->queryAllRecords("SELECT wblist_id FROM spamfilter_wblist WHERE rid = ?", $tmp_olduser['id']); + foreach ($tmp_wblist as $tmp) { + $update_data = array( + 'rid' => $tmp_newuser['id'], + 'sys_userid' => $client_user_id, + 'sys_groupid' => $sys_groupid, + ); + $app->db->datalogUpdate('spamfilter_wblist', $update_data, 'wblist_id', $tmp['wblist_id']); + } + + // now delete old spamfilter_users entry + $app->db->datalogDelete('spamfilter_users', 'id', $tmp_olduser['id']); + } else { + $update_data = array( + 'email' => $source, + 'sys_userid' => $client_user_id, + 'sys_groupid' => $sys_groupid, + ); + if($tmp_olduser['fullname'] == $app->functions->idn_decode($rec['source'])) { + $update_data['fullname'] = $app->functions->idn_decode($source); + } + $app->db->datalogUpdate('spamfilter_users', $update_data, 'id', $tmp_olduser['id']); + $skip_spamfilter_users_update = true; + + $tmp_wblist = $app->db->queryAllRecords("SELECT wblist_id FROM spamfilter_wblist WHERE rid = ?", $tmp_olduser['id']); + $update_data = array( + 'sys_userid' => $client_user_id, + 'sys_groupid' => $sys_groupid, + ); + foreach ($tmp_wblist as $tmp) { + $app->db->datalogUpdate('spamfilter_wblist', $update_data, 'wblist_id', $tmp['wblist_id']); + } + } + } + + + $tmp_user = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = ?", $source); + if($tmp_user["id"] > 0) { + // There is already a record that we will update + if(!$skip_spamfilter_users_update) { + $update_data = array( + 'sys_userid' => $client_user_id, + 'sys_groupid' => $sys_groupid, + ); + $app->db->datalogUpdate('spamfilter_users', $update_data, 'id', $tmp_user['id']); + } + } + + } + $app->db->datalogUpdate('mail_forwarding', array("source" => $source, "destination" => $destination, "sys_userid" => $client_user_id, "sys_groupid" => $sys_groupid), 'forwarding_id', $rec['forwarding_id']); } } //* Update the mailinglist - $mailing_lists = $app->db->queryAllRecords("SELECT mailinglist_id FROM mail_mailinglist WHERE domain = ?", $page_form->oldDataRecord['domain']); - if(is_array($mailing_lists)) { - foreach($mailing_lists as $rec) { - $app->db->datalogUpdate('mail_mailinglist', array("sys_userid" => $client_user_id, "sys_groupid" => $sys_groupid), 'mailinglist_id', $rec['mailinglist_id']); + $mailinglists = $app->db->queryAllRecords("SELECT * FROM mail_mailinglist WHERE domain = ?", $old_domain); + if(is_array($mailinglists)) { + foreach($mailinglists as $rec) { + $update_data = array( + 'sys_userid' => $client_user_id, + 'sys_groupid' => $sys_groupid, + 'domain' => $domain, + 'email' => str_replace($old_domain, $domain, $rec['email']), + ); + $app->db->datalogUpdate('mail_mailinglist', $update_data, 'mailinglist_id', $rec['mailinglist_id']); } } @@ -107,25 +249,81 @@ class mail_mail_domain_plugin { } } - if ($page_form->oldDataRecord["domain"] != $domain) { - //* Delete the old spamfilter record - $tmp = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = ?", "@" . $page_form->oldDataRecord["domain"]); - $app->db->datalogDelete('spamfilter_users', 'id', $tmp["id"]); - unset($tmp); + // Spamfilter policy + $policy_id = $app->functions->intval($page_form->dataRecord["policy"]); + + // If domain changes, update spamfilter_users + // and fire spamfilter_wblist_update events so rspamd files are rewritten + if ($old_domain != $domain) { + $tmp_users = $app->db->queryOneRecord("SELECT id,fullname FROM spamfilter_users WHERE email LIKE ?", '%@' . $old_domain); + if(is_array($tmp_users)) { + foreach ($tmp_users as $tmp_old) { + $tmp_new = $app->db->queryOneRecord("SELECT id,fullname FROM spamfilter_users WHERE email = ?", '@' . $domain); + if($tmp_new['id'] > 0) { + // There is a spamfilter_users for both old and new domain, we'll update old wblist entries + $update_data = array( + 'sys_userid' => $client_user_id, + 'sys_groupid' => $sys_groupid, + 'rid' => $tmp_new['id'], + ); + $tmp_wblist = $app->db->queryAllRecords("SELECT wblist_id FROM spamfilter_wblist WHERE rid = ?", $tmp_old['id']); + foreach ($tmp_wblist as $tmp) { + $app->db->datalogUpdate('spamfilter_wblist', $update_data, 'wblist_id', $tmp['wblist_id']); + } + + // now delete old spamfilter_users entry + $app->db->datalogDelete('spamfilter_users', 'id', $tmp_old['id']); + + /// and update the new + $update_data = array( + 'sys_userid' => $client_user_id, + 'sys_groupid' => $sys_groupid, + ); + $app->db->datalogUpdate('spamfilter_users', $update_data, 'id', $tmp_old['id']); + } else { + $update_data = array( + 'sys_userid' => $client_user_id, + 'sys_groupid' => $sys_groupid, + 'email' => '@' . $domain, + ); + if($tmp_old['fullname'] == '@' . $old_domain) { + $update_data['fullname'] = '@' . $domain; + } + $app->db->datalogUpdate('spamfilter_users', $update_data, 'id', $tmp_old['id']); + } + } + } } - $app->db->query("UPDATE spamfilter_users SET email=REPLACE(email, ?, ?), sys_userid = ?, sys_groupid = ? WHERE email LIKE ?", $page_form->oldDataRecord['domain'], $domain, $client_user_id, $sys_groupid, "%@" . $page_form->oldDataRecord['domain']); - } // end if domain name changed - - //* Force-update the aliases (required for spamfilter changes) - $forwardings = $app->db->queryAllRecords("SELECT * FROM mail_forwarding WHERE source LIKE ? OR destination LIKE ?", "%@" . $domain, "%@" . $domain); - - if(is_array($forwardings)) { - foreach($forwardings as $rec) { - $app->db->datalogUpdate('mail_forwarding', array("source" => $rec['source']), 'forwarding_id', $rec['forwarding_id'],true); + $tmp_user = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = ?", '@' . $domain); + if(isset($tmp_user['id']) && $tmp_user['id'] > 0) { + // There is already a record that we will update + if($policy_id != $tmp_user['policy_id']) { + $update_data = array( + 'policy_id' => $policy_id, + ); + $app->db->datalogUpdate('spamfilter_users', $update_data, 'id', $tmp_user["id"]); + } + } else { + // We create a new record + $insert_data = array( + "sys_userid" => $client_user_id, + "sys_groupid" => $sys_groupid, + "sys_perm_user" => 'riud', + "sys_perm_group" => 'riud', + "sys_perm_other" => '', + "server_id" => $page_form->dataRecord["server_id"], + "priority" => 5, + "policy_id" => $policy_id, + "email" => '@' . $domain, + "fullname" => '@' . $domain, + "local" => 'Y' + ); + $app->db->datalogInsert('spamfilter_users', $insert_data, 'id'); } - } - + + } // end if domain name changed + } } diff --git a/interface/web/admin/form/firewall.tform.php b/interface/web/admin/form/firewall.tform.php index eb7dcb3acf83bf7d603d7a3454fe62b2610b2ee9..90614bac55394582cd661649b72810c32b9d7219 100644 --- a/interface/web/admin/form/firewall.tform.php +++ b/interface/web/admin/form/firewall.tform.php @@ -79,7 +79,7 @@ $form["tabs"]['firewall'] = array ( 'regex' => '/^$|\d{1,5}(?::\d{1,5})?(?:,\d{1,5}(?::\d{1,5})?)*$/', 'errmsg'=> 'tcp_ports_error_regex'), ), - 'default' => '20,21,22,25,53,80,110,143,443,465,587,993,995,3306,8080,8081,10000', + 'default' => '21,22,25,53,80,110,143,443,465,587,993,995,3306,4190,8080,8081,40110:40210', 'value' => '', 'width' => '30', 'maxlength' => '255' @@ -91,7 +91,7 @@ $form["tabs"]['firewall'] = array ( 'regex' => '/^$|\d{1,5}(?::\d{1,5})?(?:,\d{1,5}(?::\d{1,5})?)*$/', 'errmsg'=> 'udp_ports_error_regex'), ), - 'default' => '53,3306', + 'default' => '53', 'value' => '', 'width' => '30', 'maxlength' => '255' diff --git a/interface/web/admin/form/server_config.tform.php b/interface/web/admin/form/server_config.tform.php index 528976ca7fbce642a16132e94241ca05bda6b99b..abf9ab72d837b64a4ed04f7bfb194153bc21f090 100644 --- a/interface/web/admin/form/server_config.tform.php +++ b/interface/web/admin/form/server_config.tform.php @@ -131,7 +131,7 @@ $form["tabs"]['server'] = array( 'validators' => array( 0 => array('type' => 'NOTEMPTY', 'errmsg' => 'hostname_error_empty'), 1 => array ('type' => 'REGEX', - 'regex' => '/^[\w\.\-]{2,255}\.[a-zA-Z0-9\-]{2,63}$/', + 'regex' => '/^[\w\.\-]{1,255}\.[a-zA-Z0-9\-]{2,63}$/', 'errmsg'=> 'hostname_error_regex'), ), 'value' => '', @@ -207,7 +207,7 @@ $form["tabs"]['server'] = array( 'datatype' => 'VARCHAR', 'formtype' => 'SELECT', 'default' => 'userzip', - 'value' => array('userzip' => 'backup_mode_userzip', 'rootgz' => 'backup_mode_rootgz'), + 'value' => array('userzip' => 'backup_mode_userzip', 'rootgz' => 'backup_mode_rootgz', 'borg' => 'backup_mode_borg_txt'), 'width' => '40', 'maxlength' => '255' ), @@ -481,8 +481,57 @@ $form["tabs"]['mail'] = array( 'value' => '', 'width' => '40', 'maxlength' => '255', - 'filters' => array( 0 => array( 'event' => 'SAVE', - 'type' => 'TRIM'), + 'filters' => array( + 0 => array( 'event' => 'SAVE', + 'type' => 'TRIM'), + ), + ), + 'rspamd_redis_servers' => array( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '127.0.0.1', + 'value' => '', + 'width' => '40', + 'maxlength' => '255', + 'filters' => array( + 0 => array( 'event' => 'SAVE', + 'type' => 'TRIM'), + ), + ), + 'rspamd_redis_password' => array( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '40', + 'maxlength' => '255', + 'filters' => array( + 0 => array( 'event' => 'SAVE', + 'type' => 'TRIM'), + ), + ), + 'rspamd_redis_bayes_servers' => array( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '127.0.0.1', + 'value' => '', + 'width' => '40', + 'maxlength' => '255', + 'filters' => array( + 0 => array( 'event' => 'SAVE', + 'type' => 'TRIM'), + ), + ), + 'rspamd_redis_bayes_password' => array( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '40', + 'maxlength' => '255', + 'filters' => array( + 0 => array( 'event' => 'SAVE', + 'type' => 'TRIM'), ), ), 'rspamd_available' => array( @@ -697,6 +746,18 @@ $form["tabs"]['mail'] = array( 'default' => 'y', 'value' => array(0 => 'n', 1 => 'y') ), + 'overquota_notify_threshold' => array( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '90', + 'validators' => array( + 0 => array('type' => 'NOTEMPTY', 'errmsg' => 'overquota_notify_threshold_error'), + 1 => array('type' => 'RANGE', 'range' => '0:100', 'errmsg' => 'overquota_notify_threshold_error'), + ), + 'value' => '', + 'width' => '20', + 'maxlength' => '3' + ), 'overquota_notify_admin' => array( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', @@ -1039,6 +1100,18 @@ $form["tabs"]['web'] = array( 'default' => 'y', 'value' => array(0 => 'n', 1 => 'y') ), + 'overquota_notify_threshold' => array( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '90', + 'validators' => array( + 0 => array('type' => 'NOTEMPTY', 'errmsg' => 'overquota_notify_threshold_error'), + 1 => array('type' => 'RANGE', 'range' => '0:100', 'errmsg' => 'overquota_notify_threshold_error'), + ), + 'value' => '', + 'width' => '20', + 'maxlength' => '3' + ), 'overquota_notify_admin' => array( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', @@ -1051,6 +1124,18 @@ $form["tabs"]['web'] = array( 'default' => 'y', 'value' => array(0 => 'n', 1 => 'y') ), + 'overquota_db_notify_threshold' => array( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '90', + 'validators' => array( + 0 => array('type' => 'NOTEMPTY', 'errmsg' => 'overquota_notify_threshold_error'), + 1 => array('type' => 'RANGE', 'range' => '0:100', 'errmsg' => 'overquota_notify_threshold_error'), + ), + 'value' => '', + 'width' => '20', + 'maxlength' => '3' + ), 'overquota_db_notify_admin' => array( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', diff --git a/interface/web/admin/form/system_config.tform.php b/interface/web/admin/form/system_config.tform.php index c7d15ffcf4ddfcb6a7a125a732c539e050f1d68d..bce858b5221a274487ec81b03b0d778b6474c8c5 100644 --- a/interface/web/admin/form/system_config.tform.php +++ b/interface/web/admin/form/system_config.tform.php @@ -481,6 +481,12 @@ $form["tabs"]['dns'] = array ( 'value' => '', 'name' => 'default_slave_dnsserver' ), + 'dns_show_zoneexport' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'n', + 'value' => array(0 => 'n', 1 => 'y') + ), //################################# // END Datatable fields //################################# diff --git a/interface/web/admin/lib/lang/ar_remote_action.lng b/interface/web/admin/lib/lang/ar_remote_action.lng index 3f8948e19f602408715f9554606f5478359bec9a..dfe56b616d5b3d18abd7eb9965b8c5602cb4354c 100644 --- a/interface/web/admin/lib/lang/ar_remote_action.lng +++ b/interface/web/admin/lib/lang/ar_remote_action.lng @@ -2,7 +2,7 @@ $wb['select_server_txt'] = 'Select Server'; $wb['btn_do_txt'] = 'Execute action'; $wb['do_osupdate_caption'] = 'Do OS-Update at remote server'; -$wb['do_osupdate_desc'] = 'This Action does a aptitude -y upgrade at your selected server.<br><br><strong>USE THIS AT YOUR OWN RISK!</strong>'; +$wb['do_osupdate_desc'] = 'This Action does a apt -y upgrade at your selected server.<br><br><strong>USE THIS AT YOUR OWN RISK!</strong>'; $wb['do_ispcupdate_caption'] = 'Do ISPConfig 3 - Update at remote server'; $wb['do_ispcupdate_desc'] = 'This action does a ISPConfig3 update at your selected server.<br><br><strong>USE THIS AT YOUR OWN RISK!</strong>'; $wb['action_scheduled'] = 'The action is scheduled for execution'; diff --git a/interface/web/admin/lib/lang/ar_server_config.lng b/interface/web/admin/lib/lang/ar_server_config.lng index 421d27172b9dcd8be53f70f1b57f09dfb0d3ccc2..01b35d3e58d979e982bc3260a4b3d7484c3cd8d1 100644 --- a/interface/web/admin/lib/lang/ar_server_config.lng +++ b/interface/web/admin/lib/lang/ar_server_config.lng @@ -176,6 +176,8 @@ $wb['website_autoalias_note_txt'] = 'Placeholders:'; $wb['backup_mode_txt'] = 'Backup mode'; $wb['backup_mode_userzip'] = 'Backup web files owned by web user as zip'; $wb['backup_mode_rootgz'] = 'Backup all files in web directory as root user'; +$wb['backup_mode_borg_txt'] = 'BorgBackup: Backup all files in vhost directory and databases into incremental repositories'; +$wb['backup_missing_utils_txt'] = 'The following backup mode can not be used because the required tools are not installed:'; $wb['realtime_blackhole_list_txt'] = 'Real-time Blackhole List'; $wb['realtime_blackhole_list_note_txt'] = '(Separate RBL\'s with commas)'; $wb['stress_adaptive_txt'] = 'Adapt to temporary load spikes'; @@ -193,6 +195,8 @@ $wb['overtraffic_notify_admin_txt'] = 'Send overtraffic notification to admin'; $wb['overtraffic_notify_client_txt'] = 'Send overtraffic notification to client'; $wb['overtraffic_disable_web_txt'] = 'Disable websites that exceed traffic limit'; $wb['rbl_error_regex'] = 'Please specify valid RBL hostnames.'; +$wb['overquota_notify_threshold_txt'] = 'Quota warning usage level'; +$wb['overquota_notify_threshold_error'] = 'Quota warning usage level must be between 0-100%'; $wb['overquota_notify_admin_txt'] = 'Send quota warnings to admin'; $wb['overquota_notify_client_txt'] = 'Send quota warnings to client'; $wb['overquota_notify_onok_txt'] = 'Send quota ok message to client'; @@ -273,6 +277,7 @@ $wb['disable_bind_log_txt'] = 'Disable bind9 messages for Loglevel WARN'; $wb['apps_vhost_enabled_txt'] = 'Apps-vhost enabled'; $wb['do_not_try_rescue_mongodb_txt'] = 'Disable MongoDB monitoring'; $wb['backup_dir_mount_cmd_txt'] = 'Mount command, if backup directory not mounted'; +$wb['overquota_db_notify_threshold_txt'] = 'DB quota warning usage level'; $wb['overquota_db_notify_admin_txt'] = 'Send DB quota warnings to admin'; $wb['overquota_db_notify_client_txt'] = 'Send DB quota warnings to client'; $wb['php_handler_txt'] = 'Default PHP Handler'; @@ -316,6 +321,14 @@ $wb['content_filter_txt'] = 'Content Filter'; $wb['rspamd_url_txt'] = 'Rspamd URL'; $wb['rspamd_user_txt'] = 'Rspamd User'; $wb['rspamd_password_txt'] = 'Rspamd Password'; +$wb['rspamd_redis_servers_txt'] = 'Redis Servers'; +$wb['tooltip_rspamd_redis_servers_txt'] = 'Redis server(s) which Rspamd will use. Eg. \'127.0.0.1\', \'localhost:6379\' or \'/var/run/redis/redis-server.sock\'.'; +$wb['rspamd_redis_password_txt'] = 'Redis Password'; +$wb['tooltip_rspamd_redis_password_txt'] = 'Password for Redis Servers (leave blank if unused).'; +$wb['rspamd_redis_bayes_servers_txt'] = 'Redis Servers for Bayes'; +$wb['tooltip_rspamd_redis_bayes_servers_txt'] = 'Redis server(s) which Rspamd will use for Bayes if different (otherwise leave blank). Eg. \'localhost:6378\' or \'/var/run/redis-bayes/redis-server.sock\'.'; +$wb['rspamd_redis_bayes_password_txt'] = 'Redis Password for Bayes'; +$wb['tooltip_rspamd_redis_bayes_password_txt'] = 'Password for Bayes Redis Server (leave blank if unused).'; $wb['vhost_proxy_protocol_enabled_txt'] = 'Enable PROXY Protocol'; $wb['vhost_proxy_protocol_http_port_txt'] = 'PROXY Protocol HTTP Port'; $wb['vhost_proxy_protocol_https_port_txt'] = 'PROXY Protocol HTTPS Port'; diff --git a/interface/web/admin/lib/lang/ar_system_config.lng b/interface/web/admin/lib/lang/ar_system_config.lng index 5d21ab4c2e93e8bf0fd713516481429a36d9d97c..a10274c670519674f336c0406f855cec6df4eb87 100644 --- a/interface/web/admin/lib/lang/ar_system_config.lng +++ b/interface/web/admin/lib/lang/ar_system_config.lng @@ -105,4 +105,5 @@ $wb['show_support_messages_txt'] = 'Show message function in help module'; $wb['show_aps_menu_txt'] = 'Show APS menu'; $wb['show_aps_menu_note_txt'] = 'APS will be removed from the panel in the near future.'; $wb['show_aps_menu_note_url_txt'] = 'Click here for more information.'; +$wb['dns_show_zoneexport_txt'] = 'Show zone export.'; ?> diff --git a/interface/web/admin/lib/lang/bg_remote_action.lng b/interface/web/admin/lib/lang/bg_remote_action.lng index 6925ec260dbfa4b48ac2b93884f0358ef28cb892..8d6e441d852736b08b183efc2b178fabcab91c53 100644 --- a/interface/web/admin/lib/lang/bg_remote_action.lng +++ b/interface/web/admin/lib/lang/bg_remote_action.lng @@ -2,7 +2,7 @@ $wb['select_server_txt'] = 'Избери Ñървър'; $wb['btn_do_txt'] = 'Изпълни дейÑтвие'; $wb['do_osupdate_caption'] = 'Ðаправете OS - ÐÐºÑ‚ÑƒÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð½Ð° отдалечен Ñървър'; -$wb['do_osupdate_desc'] = 'Това дейÑтвие прави за aptitude-y ъпгрейд на Ð¸Ð·Ð±Ñ€Ð°Ð½Ð¸Ñ Ð¾Ñ‚ Ð’Ð°Ñ Ñървър.<br><br><strong>ИЗПОЛЗВÐШ ТОВРÐРТВОЙ РИСК!</strong>'; +$wb['do_osupdate_desc'] = 'Това дейÑтвие прави за apt-y ъпгрейд на Ð¸Ð·Ð±Ñ€Ð°Ð½Ð¸Ñ Ð¾Ñ‚ Ð’Ð°Ñ Ñървър.<br><br><strong>ИЗПОЛЗВÐШ ТОВРÐРТВОЙ РИСК!</strong>'; $wb['do_ispcupdate_caption'] = 'Do ISPConfig 3 - Update at remote server'; $wb['do_ispcupdate_desc'] = 'Това дейÑтвие прави ISPConfig 3 обновÑване на Ð¸Ð·Ð±Ñ€Ð°Ð½Ð¸Ñ Ð¾Ñ‚ Ð’Ð°Ñ Ñървър.<br><br><strong>ИЗПОЛЗВÐШ ТОВРÐРТВОЙ РИСК!</strong>'; $wb['action_scheduled'] = 'Това дейÑтвие е наÑрочено за изпълнение'; diff --git a/interface/web/admin/lib/lang/bg_server_config.lng b/interface/web/admin/lib/lang/bg_server_config.lng index 2edad9a631b570f66e6d2fc20895d75024064fbf..485e17e9f8404c9c04b2dcaad5a90ca6ac7edb74 100644 --- a/interface/web/admin/lib/lang/bg_server_config.lng +++ b/interface/web/admin/lib/lang/bg_server_config.lng @@ -174,6 +174,8 @@ $wb['connect_userid_to_webid_start_txt'] = 'Start ID for userid/webid connect'; $wb['backup_mode_txt'] = 'Backup mode'; $wb['backup_mode_userzip'] = 'Backup web files owned by web user as zip'; $wb['backup_mode_rootgz'] = 'Backup all files in web directory as root user'; +$wb['backup_mode_borg_txt'] = 'BorgBackup: Backup all files in vhost directory and databases into incremental repositories'; +$wb['backup_missing_utils_txt'] = 'The following backup mode can not be used because the required tools are not installed:'; $wb['realtime_blackhole_list_txt'] = 'Real-time Blackhole List'; $wb['realtime_blackhole_list_note_txt'] = '(Separate RBL\'s with commas)'; $wb['stress_adaptive_txt'] = 'Adapt to temporary load spikes'; @@ -193,6 +195,8 @@ $wb['overtraffic_notify_admin_txt'] = 'Send overtraffic notification to admin'; $wb['overtraffic_notify_client_txt'] = 'Send overtraffic notification to client'; $wb['overtraffic_disable_web_txt'] = 'Disable websites that exceed traffic limit'; $wb['rbl_error_regex'] = 'Please specify valid RBL hostnames.'; +$wb['overquota_notify_threshold_txt'] = 'Quota warning usage level'; +$wb['overquota_notify_threshold_error'] = 'Quota warning usage level must be between 0-100%'; $wb['overquota_notify_admin_txt'] = 'Send quota warnings to admin'; $wb['overquota_notify_client_txt'] = 'Send quota warnings to client'; $wb['overquota_notify_onok_txt'] = 'Send quota ok message to client'; @@ -273,6 +277,7 @@ $wb['disable_bind_log_txt'] = 'Disable bind9 messages for Loglevel WARN'; $wb['apps_vhost_enabled_txt'] = 'Apps-vhost enabled'; $wb['do_not_try_rescue_mongodb_txt'] = 'Disable MongoDB monitoring'; $wb['backup_dir_mount_cmd_txt'] = 'Mount command, if backup directory not mounted'; +$wb['overquota_db_notify_threshold_txt'] = 'DB quota warning usage level'; $wb['overquota_db_notify_admin_txt'] = 'Send DB quota warnings to admin'; $wb['overquota_db_notify_client_txt'] = 'Send DB quota warnings to client'; $wb['php_handler_txt'] = 'Default PHP Handler'; @@ -316,6 +321,14 @@ $wb['content_filter_txt'] = 'Content Filter'; $wb['rspamd_url_txt'] = 'Rspamd URL'; $wb['rspamd_user_txt'] = 'Rspamd User'; $wb['rspamd_password_txt'] = 'Rspamd Password'; +$wb['rspamd_redis_servers_txt'] = 'Redis Servers'; +$wb['tooltip_rspamd_redis_servers_txt'] = 'Redis server(s) which Rspamd will use. Eg. \'127.0.0.1\', \'localhost:6379\' or \'/var/run/redis/redis-server.sock\'.'; +$wb['rspamd_redis_password_txt'] = 'Redis Password'; +$wb['tooltip_rspamd_redis_password_txt'] = 'Password for Redis Servers (leave blank if unused).'; +$wb['rspamd_redis_bayes_servers_txt'] = 'Redis Servers for Bayes'; +$wb['tooltip_rspamd_redis_bayes_servers_txt'] = 'Redis server(s) which Rspamd will use for Bayes if different (otherwise leave blank). Eg. \'localhost:6378\' or \'/var/run/redis-bayes/redis-server.sock\'.'; +$wb['rspamd_redis_bayes_password_txt'] = 'Redis Password for Bayes'; +$wb['tooltip_rspamd_redis_bayes_password_txt'] = 'Password for Bayes Redis Server (leave blank if unused).'; $wb['vhost_proxy_protocol_enabled_txt'] = 'Enable PROXY Protocol'; $wb['vhost_proxy_protocol_http_port_txt'] = 'PROXY Protocol HTTP Port'; $wb['vhost_proxy_protocol_https_port_txt'] = 'PROXY Protocol HTTPS Port'; diff --git a/interface/web/admin/lib/lang/bg_system_config.lng b/interface/web/admin/lib/lang/bg_system_config.lng index 1b8d10541d05febec539338ac21a0fc9eda0e6ae..898020365f07503859375268e1d0d7940c72e513 100644 --- a/interface/web/admin/lib/lang/bg_system_config.lng +++ b/interface/web/admin/lib/lang/bg_system_config.lng @@ -105,4 +105,5 @@ $wb['show_support_messages_txt'] = 'Show message function in help module'; $wb['show_aps_menu_txt'] = 'Show APS menu'; $wb['show_aps_menu_note_txt'] = 'APS will be removed from the panel in the near future.'; $wb['show_aps_menu_note_url_txt'] = 'Click here for more information.'; +$wb['dns_show_zoneexport_txt'] = 'Show zone export.'; ?> diff --git a/interface/web/admin/lib/lang/br_remote_action.lng b/interface/web/admin/lib/lang/br_remote_action.lng index 5c888618148ca13a9ca97fc62acaa97313a6d29a..84e928dbd9134cf4482133657f611378d8373a4e 100644 --- a/interface/web/admin/lib/lang/br_remote_action.lng +++ b/interface/web/admin/lib/lang/br_remote_action.lng @@ -2,7 +2,7 @@ $wb['select_server_txt'] = 'Selecionar servidor'; $wb['btn_do_txt'] = 'Executar ação'; $wb['do_osupdate_caption'] = 'Atualizar sistema operacional no servidor remoto'; -$wb['do_osupdate_desc'] = 'Esta ação fará o comando \'aptitude -y upgrade\' no servidor selecionado.<br><br><strong>UTILIZE POR SUA CONTA E RISCO!</strong>'; +$wb['do_osupdate_desc'] = 'Esta ação fará o comando \'apt -y upgrade\' no servidor selecionado.<br><br><strong>UTILIZE POR SUA CONTA E RISCO!</strong>'; $wb['do_ispcupdate_caption'] = 'Atualizar ISPConfig 3 - Atualizar o servidor remoto'; $wb['do_ispcupdate_desc'] = 'Esta ação atualizará o ISPConfig3 no servidor selecionado.<br><br><strong>UTILIZE POR SUA CONTA E RISCO!</strong>'; $wb['action_scheduled'] = 'A ação foi agendada.'; diff --git a/interface/web/admin/lib/lang/br_server_config.lng b/interface/web/admin/lib/lang/br_server_config.lng index d0001267be4baef3439a3bf96b4f4c152d6d77a8..66ad1e73b388a3feac9f15c61be30d5ec037312d 100644 --- a/interface/web/admin/lib/lang/br_server_config.lng +++ b/interface/web/admin/lib/lang/br_server_config.lng @@ -114,6 +114,8 @@ $wb['fastcgi_config_syntax_txt'] = 'Sintaxe das configurações do FastCGI'; $wb['backup_mode_txt'] = 'Modo do backup'; $wb['backup_mode_userzip'] = 'Arquivos de backup com propriedade do usuário web e compactados como zip'; $wb['backup_mode_rootgz'] = 'Todos os arquivos no diretório web com proprietário root'; +$wb['backup_mode_borg_txt'] = 'BorgBackup: Faça backup de todos os arquivos no diretório vhost e bancos de dados em repositórios incrementais'; +$wb['backup_missing_utils_txt'] = 'O seguinte modo de backup não pode ser usado porque as ferramentas necessárias não estão instaladas:'; $wb['tmpdir_path_error_empty'] = 'Caminho do diretório temporário está vazio.'; $wb['tmpdir_path_error_regex'] = 'Caminho do diretório temporário é inválido.'; $wb['backup_time_txt'] = 'Hora do backup'; @@ -200,6 +202,8 @@ $wb['overtraffic_notify_admin_txt'] = 'Enviar notificação de tráfego excedido $wb['overtraffic_notify_client_txt'] = 'Enviar notificação de tráfego excedido para o cliente'; $wb['overtraffic_disable_web_txt'] = 'Disable websites that exceed traffic limit'; $wb['rbl_error_regex'] = 'Por favor, insira nomes de host válidos para RBLs.'; +$wb['overquota_notify_threshold_txt'] = 'Quota warning usage level'; +$wb['overquota_notify_threshold_error'] = 'Quota warning usage level must be between 0-100%'; $wb['overquota_notify_admin_txt'] = 'Enviar alerta da cota para o administrador'; $wb['overquota_notify_client_txt'] = 'Enviar alerta da cota para o cliente'; $wb['overquota_notify_onok_txt'] = 'Enviar mensagem da cota para o cliente'; @@ -223,6 +227,7 @@ $wb['v6_prefix_length'] = 'O prefixo é muito longo de acordo com as definiçõe $wb['backup_dir_is_mount_txt'] = 'O diretório de backup está montando?'; $wb['backup_dir_mount_cmd_txt'] = 'Comando mount, se o diretório não está montado'; $wb['backup_delete_txt'] = 'Remover backups de domÃnios/site'; +$wb['overquota_db_notify_threshold_txt'] = 'DB quota warning usage level'; $wb['overquota_db_notify_admin_txt'] = 'Enviar alerta da cota do Banco de Dados para o administrador'; $wb['overquota_db_notify_client_txt'] = 'Enviar alerta da cota do Banco de Dados para o cliente'; $wb['monitor_system_updates_txt'] = 'Verificar por atualizações do sistema'; @@ -316,6 +321,14 @@ $wb['content_filter_txt'] = 'Filtro de conteúdo'; $wb['rspamd_url_txt'] = 'URL do RSPAMD'; $wb['rspamd_user_txt'] = 'Usuário RSPAMD'; $wb['rspamd_password_txt'] = 'Senha RSPAMD'; +$wb['rspamd_redis_servers_txt'] = 'Redis Servers'; +$wb['tooltip_rspamd_redis_servers_txt'] = 'Redis server(s) which Rspamd will use. Eg. \'127.0.0.1\', \'localhost:6379\' or \'/var/run/redis/redis-server.sock\'.'; +$wb['rspamd_redis_password_txt'] = 'Redis Password'; +$wb['tooltip_rspamd_redis_password_txt'] = 'Password for Redis Servers (leave blank if unused).'; +$wb['rspamd_redis_bayes_servers_txt'] = 'Redis Servers for Bayes'; +$wb['tooltip_rspamd_redis_bayes_servers_txt'] = 'Redis server(s) which Rspamd will use for Bayes if different (otherwise leave blank). Eg. \'localhost:6378\' or \'/var/run/redis-bayes/redis-server.sock\'.'; +$wb['rspamd_redis_bayes_password_txt'] = 'Redis Password for Bayes'; +$wb['tooltip_rspamd_redis_bayes_password_txt'] = 'Password for Bayes Redis Server (leave blank if unused).'; $wb['vhost_proxy_protocol_enabled_txt'] = 'Habilitar protocolo PROXY'; $wb['vhost_proxy_protocol_http_port_txt'] = 'Porta HTTP protocolo PROXY'; $wb['vhost_proxy_protocol_https_port_txt'] = 'Porta HTTPS protocolo PROXY'; diff --git a/interface/web/admin/lib/lang/br_system_config.lng b/interface/web/admin/lib/lang/br_system_config.lng index 6cf3bf58bbb6ef0be3f8a84f780270eef09b8957..1fb510ace046206ee404107ca32e9eef74068469 100644 --- a/interface/web/admin/lib/lang/br_system_config.lng +++ b/interface/web/admin/lib/lang/br_system_config.lng @@ -106,3 +106,4 @@ $wb['show_aps_menu_txt'] = 'Show APS menu'; $wb['show_aps_menu_note_txt'] = 'APS will be removed from the panel in the near future.'; $wb['show_aps_menu_note_url_txt'] = 'Click here for more information.'; $wb['monitor_key_txt'] = 'Senha do Monitor'; +$wb['dns_show_zoneexport_txt'] = 'Show zone export.'; diff --git a/interface/web/admin/lib/lang/ca_remote_action.lng b/interface/web/admin/lib/lang/ca_remote_action.lng index cb7800aca6db155da59f335f2070c2a7bb64c43b..667f382fbbdbafeab52971e520bd57655a7f4487 100644 --- a/interface/web/admin/lib/lang/ca_remote_action.lng +++ b/interface/web/admin/lib/lang/ca_remote_action.lng @@ -2,7 +2,7 @@ $wb['select_server_txt'] = 'Select Server'; $wb['btn_do_txt'] = 'Execute action'; $wb['do_osupdate_caption'] = 'Do OS-Update at remote server'; -$wb['do_osupdate_desc'] = 'This Action does a \'aptitude -y upgrade\' at your selected server.<br><br><strong>USE THIS AT YOUR OWN RISK!</strong>'; +$wb['do_osupdate_desc'] = 'This Action does a \'apt -y upgrade\' at your selected server.<br><br><strong>USE THIS AT YOUR OWN RISK!</strong>'; $wb['do_ispcupdate_caption'] = 'Do ISPConfig 3 - Update at remote server'; $wb['do_ispcupdate_desc'] = 'This action does a ISPConfig3 update at your selected server.<br><br><strong>USE THIS AT YOUR OWN RISK!</strong>'; $wb['action_scheduled'] = 'The action is scheduled for execution'; diff --git a/interface/web/admin/lib/lang/ca_server_config.lng b/interface/web/admin/lib/lang/ca_server_config.lng index 1a539d54293010de11a064e2f19037f84ff167c3..bc1ee89883a7754a02d2a04dd7ffdb1976ccd21a 100644 --- a/interface/web/admin/lib/lang/ca_server_config.lng +++ b/interface/web/admin/lib/lang/ca_server_config.lng @@ -113,6 +113,8 @@ $wb['fastcgi_config_syntax_txt'] = 'FastCGI config syntax'; $wb['backup_mode_txt'] = 'Backup mode'; $wb['backup_mode_userzip'] = 'Backup web files owned by web user as zip'; $wb['backup_mode_rootgz'] = 'Backup all files in web directory as root user'; +$wb['backup_mode_borg_txt'] = 'BorgBackup: Backup all files in vhost directory and databases into incremental repositories'; +$wb['backup_missing_utils_txt'] = 'The following backup mode can not be used because the required tools are not installed:'; $wb['server_type_txt'] = 'Server Type'; $wb['nginx_vhost_conf_dir_txt'] = 'Nginx Vhost config dir'; $wb['nginx_vhost_conf_enabled_dir_txt'] = 'Nginx Vhost config enabled dir'; @@ -196,6 +198,8 @@ $wb['overtraffic_notify_admin_txt'] = 'Send overtraffic notification to admin'; $wb['overtraffic_notify_client_txt'] = 'Send overtraffic notification to client'; $wb['overtraffic_disable_web_txt'] = 'Disable websites that exceed traffic limit'; $wb['rbl_error_regex'] = 'Please specify valid RBL hostnames.'; +$wb['overquota_notify_threshold_txt'] = 'Quota warning usage level'; +$wb['overquota_notify_threshold_error'] = 'Quota warning usage level must be between 0-100%'; $wb['overquota_notify_admin_txt'] = 'Send quota warnings to admin'; $wb['overquota_notify_client_txt'] = 'Send quota warnings to client'; $wb['overquota_notify_onok_txt'] = 'Send quota ok message to client'; @@ -219,6 +223,7 @@ $wb['v6_prefix_length'] = 'Prefix too long according to defined IPv6 '; $wb['backup_dir_is_mount_txt'] = 'Backup directory is a mount?'; $wb['backup_dir_mount_cmd_txt'] = 'Mount command, if backup directory not mounted'; $wb['backup_delete_txt'] = 'Delete backups on domain/website delete'; +$wb['overquota_db_notify_threshold_txt'] = 'DB quota warning usage level'; $wb['overquota_db_notify_admin_txt'] = 'Send DB quota warnings to admin'; $wb['overquota_db_notify_client_txt'] = 'Send DB quota warnings to client'; $wb['monitor_system_updates_txt'] = 'Check for Linux updates'; @@ -316,6 +321,14 @@ $wb['content_filter_txt'] = 'Content Filter'; $wb['rspamd_url_txt'] = 'Rspamd URL'; $wb['rspamd_user_txt'] = 'Rspamd User'; $wb['rspamd_password_txt'] = 'Rspamd Password'; +$wb['rspamd_redis_servers_txt'] = 'Redis Servers'; +$wb['tooltip_rspamd_redis_servers_txt'] = 'Redis server(s) which Rspamd will use. Eg. \'127.0.0.1\', \'localhost:6379\' or \'/var/run/redis/redis-server.sock\'.'; +$wb['rspamd_redis_password_txt'] = 'Redis Password'; +$wb['tooltip_rspamd_redis_password_txt'] = 'Password for Redis Servers (leave blank if unused).'; +$wb['rspamd_redis_bayes_servers_txt'] = 'Redis Servers for Bayes'; +$wb['tooltip_rspamd_redis_bayes_servers_txt'] = 'Redis server(s) which Rspamd will use for Bayes if different (otherwise leave blank). Eg. \'localhost:6378\' or \'/var/run/redis-bayes/redis-server.sock\'.'; +$wb['rspamd_redis_bayes_password_txt'] = 'Redis Password for Bayes'; +$wb['tooltip_rspamd_redis_bayes_password_txt'] = 'Password for Bayes Redis Server (leave blank if unused).'; $wb['vhost_proxy_protocol_enabled_txt'] = 'Enable PROXY Protocol'; $wb['vhost_proxy_protocol_http_port_txt'] = 'PROXY Protocol HTTP Port'; $wb['vhost_proxy_protocol_https_port_txt'] = 'PROXY Protocol HTTPS Port'; diff --git a/interface/web/admin/lib/lang/ca_system_config.lng b/interface/web/admin/lib/lang/ca_system_config.lng index 9f9f3622884342a93ed6088ee9c4956ec9eaa782..68ca245f3dd26e85b9d45701d86f5de19d3de13e 100644 --- a/interface/web/admin/lib/lang/ca_system_config.lng +++ b/interface/web/admin/lib/lang/ca_system_config.lng @@ -105,4 +105,5 @@ $wb['show_support_messages_txt'] = 'Show message function in help module'; $wb['show_aps_menu_txt'] = 'Show APS menu'; $wb['show_aps_menu_note_txt'] = 'APS will be removed from the panel in the near future.'; $wb['show_aps_menu_note_url_txt'] = 'Click here for more information.'; +$wb['dns_show_zoneexport_txt'] = 'Show zone export.'; ?> diff --git a/interface/web/admin/lib/lang/cz_remote_action.lng b/interface/web/admin/lib/lang/cz_remote_action.lng index c361f6d664d9054a7491b88dc4f088688f09291e..5f7fb604fcbd7e59871dd8397bd77ffc975a4aa3 100644 --- a/interface/web/admin/lib/lang/cz_remote_action.lng +++ b/interface/web/admin/lib/lang/cz_remote_action.lng @@ -2,7 +2,7 @@ $wb['select_server_txt'] = 'Zvolit server'; $wb['btn_do_txt'] = 'Provést akci'; $wb['do_osupdate_caption'] = 'Aktualizace operaÄnÃho systému na vzdáleném serveru.'; -$wb['do_osupdate_desc'] = 'Tato akce provede \"aptitude -y\" aktualizaci na vybraném serveru.<br><br><strong>POUŽITà TÉTO AKCE NA VLASTNà NEBEZPEČà !</strong>'; +$wb['do_osupdate_desc'] = 'Tato akce provede \"apt -y\" aktualizaci na vybraném serveru.<br><br><strong>POUŽITà TÉTO AKCE NA VLASTNà NEBEZPEČà !</strong>'; $wb['do_ispcupdate_caption'] = 'Provedenà ISPConfig 3 - aktualizace na vzdáleném serveru'; $wb['do_ispcupdate_desc'] = 'Tato akce provede \"ISPConfig 3\" aktualizaci na vaÅ¡em vybraném serveru.<br><br><strong>POUŽITà TÉTO AKCE NA VLASTNà NEBEZPEČà !</strong>'; $wb['action_scheduled'] = 'Akce je naplánována na provedenÃ'; diff --git a/interface/web/admin/lib/lang/cz_server_config.lng b/interface/web/admin/lib/lang/cz_server_config.lng index 7bb9b91b12c342a1574aa518eda2daefc5fbeef0..5ac09bff4f9d30b5cf7ee0977d7e365db49acc67 100644 --- a/interface/web/admin/lib/lang/cz_server_config.lng +++ b/interface/web/admin/lib/lang/cz_server_config.lng @@ -162,6 +162,8 @@ $wb['website_autoalias_note_txt'] = 'Placeholders:'; $wb['backup_mode_txt'] = 'Režim zálohovánÃ'; $wb['backup_mode_userzip'] = 'Zálohovánà vÅ¡ech souborů v adresáři web jako uživatel vlastnÃcà web adresář do souboru zip'; $wb['backup_mode_rootgz'] = 'Zálohovánà vÅ¡ech souborů v adresáři web jako uživatel root'; +$wb['backup_mode_borg_txt'] = 'BorgBackup: Zálohujte vÅ¡echny soubory v adresáři vhost a databázÃch do pÅ™Ãrůstkových úložišť'; +$wb['backup_missing_utils_txt'] = 'NásledujÃcà režim zálohovánà nelze použÃt, protože nejsou nainstalovány požadované nástroje:'; $wb['realtime_blackhole_list_txt'] = 'Real-time Blackhole List'; $wb['realtime_blackhole_list_note_txt'] = '(jednotlivé RBL databáze oddÄ›lujte Äárkou)'; $wb['stress_adaptive_txt'] = 'Adapt to temporary load spikes'; @@ -179,6 +181,8 @@ $wb['overtraffic_notify_admin_txt'] = 'PÅ™i pÅ™ekroÄenà limitu pÅ™enesených d $wb['overtraffic_notify_client_txt'] = 'PÅ™i pÅ™ekroÄenà limitu pÅ™enesených dat, poslat oznámenà klientovi'; $wb['overtraffic_disable_web_txt'] = 'Disable websites that exceed traffic limit'; $wb['rbl_error_regex'] = 'Please specify valid RBL hostnames.'; +$wb['overquota_notify_threshold_txt'] = 'Quota warning usage level'; +$wb['overquota_notify_threshold_error'] = 'Quota warning usage level must be between 0-100%'; $wb['overquota_notify_admin_txt'] = 'Poslat varovánà o pÅ™ekroÄenà nebo vyÄerpánà kvót adminovi'; $wb['overquota_notify_client_txt'] = 'Poslat varovánà o pÅ™ekroÄenà nebo vyÄerpánà kvót klientovi'; $wb['overquota_notify_onok_txt'] = 'Poslat zprávu klientovi, že kvóta je již v pořádku'; @@ -269,6 +273,7 @@ $wb['vhost_rewrite_v6_txt'] = 'Rewrite IPv6 on Mirror'; $wb['v6_prefix_length'] = 'Prefix too long according to defined IPv6 '; $wb['backup_dir_mount_cmd_txt'] = 'Mount command, if backup directory not mounted'; $wb['backup_delete_txt'] = 'Odstranit zálohy pokud byla smazána doména/webové stránky'; +$wb['overquota_db_notify_threshold_txt'] = 'DB quota warning usage level'; $wb['overquota_db_notify_admin_txt'] = 'Poslat varovánà o pÅ™ekroÄenà nebo vyÄerpánà DB kvót adminovi'; $wb['overquota_db_notify_client_txt'] = 'Poslat varovánà o pÅ™ekroÄenà nebo vyÄerpánà DB kvót klientovi'; $wb['php_handler_txt'] = 'Výchozà PHP obslužná rutina'; @@ -316,6 +321,14 @@ $wb['content_filter_txt'] = 'Filtr obsahu'; $wb['rspamd_url_txt'] = 'Rspamd URL'; $wb['rspamd_user_txt'] = 'Rspamd User'; $wb['rspamd_password_txt'] = 'Rspamd heslo'; +$wb['rspamd_redis_servers_txt'] = 'Redis Servers'; +$wb['tooltip_rspamd_redis_servers_txt'] = 'Redis server(s) which Rspamd will use. Eg. \'127.0.0.1\', \'localhost:6379\' or \'/var/run/redis/redis-server.sock\'.'; +$wb['rspamd_redis_password_txt'] = 'Redis Password'; +$wb['tooltip_rspamd_redis_password_txt'] = 'Password for Redis Servers (leave blank if unused).'; +$wb['rspamd_redis_bayes_servers_txt'] = 'Redis Servers for Bayes'; +$wb['tooltip_rspamd_redis_bayes_servers_txt'] = 'Redis server(s) which Rspamd will use for Bayes if different (otherwise leave blank). Eg. \'localhost:6378\' or \'/var/run/redis-bayes/redis-server.sock\'.'; +$wb['rspamd_redis_bayes_password_txt'] = 'Redis Password for Bayes'; +$wb['tooltip_rspamd_redis_bayes_password_txt'] = 'Password for Bayes Redis Server (leave blank if unused).'; $wb['vhost_proxy_protocol_enabled_txt'] = 'Enable PROXY Protocol'; $wb['vhost_proxy_protocol_http_port_txt'] = 'PROXY Protocol HTTP Port'; $wb['vhost_proxy_protocol_https_port_txt'] = 'PROXY Protocol HTTPS Port'; diff --git a/interface/web/admin/lib/lang/cz_system_config.lng b/interface/web/admin/lib/lang/cz_system_config.lng index 23dbc9c41efa0b41775599e1a73a7d1a8e939957..c6f45e7d46319e764172fd4081017c5b71b9892e 100644 --- a/interface/web/admin/lib/lang/cz_system_config.lng +++ b/interface/web/admin/lib/lang/cz_system_config.lng @@ -106,3 +106,4 @@ $wb['show_aps_menu_txt'] = 'Show APS menu'; $wb['show_aps_menu_note_txt'] = 'APS will be removed from the panel in the near future.'; $wb['show_aps_menu_note_url_txt'] = 'Click here for more information.'; $wb['monitor_key_txt'] = 'Monitor keyword'; +$wb['dns_show_zoneexport_txt'] = 'Show zone export.'; diff --git a/interface/web/admin/lib/lang/de_remote_action.lng b/interface/web/admin/lib/lang/de_remote_action.lng index 3bb968d0137b30626b02e80c92b42566d6fbcbec..324c18331154f059f02f56308b2c2897eff7584d 100644 --- a/interface/web/admin/lib/lang/de_remote_action.lng +++ b/interface/web/admin/lib/lang/de_remote_action.lng @@ -2,7 +2,7 @@ $wb['select_server_txt'] = 'Server auswählen'; $wb['btn_do_txt'] = 'Aktion ausführen'; $wb['do_osupdate_caption'] = 'Betriebssystem Update auf entferntem Server ausführen'; -$wb['do_osupdate_desc'] = 'Diese Aktion wird ein aptitude -y upgrade auf dem ausgewählten Server ausführen.<br><br><strong>DIES GESCHIEHT AUF IHRE EIGENE VERANTWORTUNG!</strong>'; +$wb['do_osupdate_desc'] = 'Diese Aktion wird ein apt -y upgrade auf dem ausgewählten Server ausführen.<br><br><strong>DIES GESCHIEHT AUF IHRE EIGENE VERANTWORTUNG!</strong>'; $wb['do_ispcupdate_caption'] = 'ISPConfig 3 Update auf entferntem Server ausführen'; $wb['do_ispcupdate_desc'] = 'Diese Aktion wird ein Update des ISPConfig 3 Systems auf Ihrem ausgewählten Server ausführen.<br><br><strong>DIES GESCHIEHT AUF IHRE EIGENE VERANTWORTUNG!</strong>'; $wb['action_scheduled'] = 'Die Aktion wurde zur Ausführung vorgemerkt'; diff --git a/interface/web/admin/lib/lang/de_server_config.lng b/interface/web/admin/lib/lang/de_server_config.lng index 26f7fa13af0a3e0f029f725f3cdefc0a293b77dd..9c8f1cb3dc77b6cc4f0d2bd64b073d3be70c1361 100644 --- a/interface/web/admin/lib/lang/de_server_config.lng +++ b/interface/web/admin/lib/lang/de_server_config.lng @@ -190,6 +190,8 @@ $wb['awstats_settings_txt'] = 'AWStats Einstellungen'; $wb['backup_mode_txt'] = 'Backupmodus'; $wb['backup_mode_userzip'] = 'Backup Dateien gehören dem Web Benutzer (.zip Datei)'; $wb['backup_mode_rootgz'] = 'Backup aller Dateien des Webverzeichnisses als Root Benutzer'; +$wb['backup_mode_borg_txt'] = 'BorgBackup: Maak een back-up van alle bestanden in de vhost-directory en databases in incrementele repositories'; +$wb['backup_missing_utils_txt'] = 'De volgende back-upmodus kan niet worden gebruikt omdat de vereiste tools niet zijn geïnstalleerd:'; $wb['backup_time_txt'] = 'Backupzeit'; $wb['firewall_txt'] = 'Firewall'; $wb['mailbox_quota_stats_txt'] = 'E-Mailkonto Beschränkung Statistiken'; @@ -199,6 +201,8 @@ $wb['overtraffic_notify_admin_txt'] = 'Überschreiten des Datentransfer Limits a $wb['overtraffic_notify_client_txt'] = 'Überschreiten des Datentransfer Limits an den Kunden senden'; $wb['overtraffic_disable_web_txt'] = 'Disable websites that exceed traffic limit'; $wb['rbl_error_regex'] = 'Bitte geben Sie gültige RBL-Hostnamen an.'; +$wb['overquota_notify_threshold_txt'] = 'Quota warning usage level'; +$wb['overquota_notify_threshold_error'] = 'Quota warning usage level must be between 0-100%'; $wb['overquota_notify_admin_txt'] = 'Quota-Warnungen an den Administrator senden'; $wb['overquota_notify_client_txt'] = 'Quota-Warnungen an den Kunden senden'; $wb['overquota_notify_onok_txt'] = 'Meldung an den Kunden senden, wenn Belegung wieder ok'; @@ -276,6 +280,7 @@ $wb['cron_init_script_error_regex'] = 'Invalid cron init script.'; $wb['crontab_dir_error_regex'] = 'Invalid crontab directory.'; $wb['cron_wget_error_regex'] = 'Invalid cron wget path.'; $wb['network_filesystem_txt'] = 'Netzwerk-Dateisystem'; +$wb['overquota_db_notify_threshold_txt'] = 'DB quota warning usage level'; $wb['overquota_db_notify_admin_txt'] = 'Datenbank-Quota-Warnungen an den Administrator senden'; $wb['overquota_db_notify_client_txt'] = 'Datenbank-Quota-Warnungen an den Kunden senden'; $wb['php_ini_check_minutes_txt'] = 'Prüfe php.ini alle X Minuten auf Änderungen'; @@ -316,6 +321,14 @@ $wb['content_filter_txt'] = 'Content-Filter'; $wb['rspamd_url_txt'] = 'Rspamd-URL'; $wb['rspamd_user_txt'] = 'Rspamd-Benutzer'; $wb['rspamd_password_txt'] = 'Rspamd-Passwort'; +$wb['rspamd_redis_servers_txt'] = 'Redis Servers'; +$wb['tooltip_rspamd_redis_servers_txt'] = 'Redis server(s) which Rspamd will use. Eg. \'127.0.0.1\', \'localhost:6379\' or \'/var/run/redis/redis-server.sock\'.'; +$wb['rspamd_redis_password_txt'] = 'Redis Password'; +$wb['tooltip_rspamd_redis_password_txt'] = 'Password for Redis Servers (leave blank if unused).'; +$wb['rspamd_redis_bayes_servers_txt'] = 'Redis Servers for Bayes'; +$wb['tooltip_rspamd_redis_bayes_servers_txt'] = 'Redis server(s) which Rspamd will use for Bayes if different (otherwise leave blank). Eg. \'localhost:6378\' or \'/var/run/redis-bayes/redis-server.sock\'.'; +$wb['rspamd_redis_bayes_password_txt'] = 'Redis Password for Bayes'; +$wb['tooltip_rspamd_redis_bayes_password_txt'] = 'Password for Bayes Redis Server (leave blank if unused).'; $wb['vhost_proxy_protocol_enabled_txt'] = 'Enable PROXY Protocol'; $wb['vhost_proxy_protocol_http_port_txt'] = 'PROXY Protocol HTTP Port'; $wb['vhost_proxy_protocol_https_port_txt'] = 'PROXY Protocol HTTPS Port'; diff --git a/interface/web/admin/lib/lang/de_system_config.lng b/interface/web/admin/lib/lang/de_system_config.lng index 7d372a820e9a56e1ce54ca429c6c2ea28d24ca86..328124f6e72e33c0a0cadb6ab3d0a3b9546ef885 100644 --- a/interface/web/admin/lib/lang/de_system_config.lng +++ b/interface/web/admin/lib/lang/de_system_config.lng @@ -105,4 +105,5 @@ $wb['show_support_messages_txt'] = 'Show message function in help module'; $wb['show_aps_menu_txt'] = 'Show APS menu'; $wb['show_aps_menu_note_txt'] = 'APS will be removed from the panel in the near future.'; $wb['show_aps_menu_note_url_txt'] = 'Click here for more information.'; +$wb['dns_show_zoneexport_txt'] = 'Show zone export.'; ?> diff --git a/interface/web/admin/lib/lang/dk_remote_action.lng b/interface/web/admin/lib/lang/dk_remote_action.lng index a5366d9175b4bab6be04a30686e6b3f732a70953..53c12f6adfb2d3fe5daf95764f544597f21f4392 100644 --- a/interface/web/admin/lib/lang/dk_remote_action.lng +++ b/interface/web/admin/lib/lang/dk_remote_action.lng @@ -2,7 +2,7 @@ $wb['select_server_txt'] = 'Vælg Server(e)'; $wb['btn_do_txt'] = 'Udfør handling'; $wb['do_osupdate_caption'] = 'Udfør OS-Opdatering pÃ¥ fjern server'; -$wb['do_osupdate_desc'] = 'Denne Handling udfør en \'aptitude -y upgrade\' pÃ¥ den valgte server.<br><br><strong>BRUG DETTE PÃ… EGEN RISIKO!</strong>'; +$wb['do_osupdate_desc'] = 'Denne Handling udfør en \'apt -y upgrade\' pÃ¥ den valgte server.<br><br><strong>BRUG DETTE PÃ… EGEN RISIKO!</strong>'; $wb['do_ispcupdate_caption'] = 'Udfør ISPConfig 3 - Opdatering pÃ¥ fjern-server'; $wb['do_ispcupdate_desc'] = 'Denne Handling udfør en ISPConfig 3 opdatering pÃ¥ den valgte server.<br><br><strong>BRUG DETTE PÃ… EGEN RISIKO!</strong>'; $wb['action_scheduled'] = 'Handlingen er planlagt til udførelse'; diff --git a/interface/web/admin/lib/lang/dk_server_config.lng b/interface/web/admin/lib/lang/dk_server_config.lng index 95e37c0f9692880a97d1016308395e6d9cf8d94c..33863a1d764d45b3aebe7ca03a04348522239d3d 100644 --- a/interface/web/admin/lib/lang/dk_server_config.lng +++ b/interface/web/admin/lib/lang/dk_server_config.lng @@ -100,6 +100,8 @@ $wb['fastcgi_config_syntax_txt'] = 'FastCGI config syntax'; $wb['backup_mode_txt'] = 'Backup mode'; $wb['backup_mode_userzip'] = 'Backup webfiler ejet af web-bruger som zip'; $wb['backup_mode_rootgz'] = 'Backup alle filer i web mappe som root-bruger'; +$wb['backup_mode_borg_txt'] = 'BorgBackup: Sikkerhedskopier alle filer i vhost -bibliotek og databaser til inkrementelle lagre'; +$wb['backup_missing_utils_txt'] = 'Følgende backup -tilstand kan ikke bruges, fordi de nødvendige værktøjer ikke er installeret:'; $wb['server_type_txt'] = 'Server Type'; $wb['nginx_vhost_conf_dir_txt'] = 'Nginx Vhost config dir'; $wb['nginx_vhost_conf_enabled_dir_txt'] = 'Nginx Vhost config enabled dir'; @@ -182,6 +184,8 @@ $wb['overtraffic_notify_admin_txt'] = 'Send over-trafik meddelelse til admin'; $wb['overtraffic_notify_client_txt'] = 'Send over-trafik meddelelse til kunde'; $wb['overtraffic_disable_web_txt'] = 'Disable websites that exceed traffic limit'; $wb['rbl_error_regex'] = 'Angiv gyldige RBL værtsnavne.'; +$wb['overquota_notify_threshold_txt'] = 'Quota warning usage level'; +$wb['overquota_notify_threshold_error'] = 'Quota warning usage level must be between 0-100%'; $wb['overquota_notify_admin_txt'] = 'Send kvote advarsler til admin'; $wb['overquota_notify_client_txt'] = 'Send kvote advarsler til kunde'; $wb['overquota_notify_onok_txt'] = 'Send kvote ok meddelelse til kunde'; @@ -272,6 +276,7 @@ $wb['vhost_rewrite_v6_txt'] = 'Rewrite IPv6 on Mirror'; $wb['v6_prefix_length'] = 'Prefix too long according to defined IPv6 '; $wb['backup_dir_mount_cmd_txt'] = 'Mount command, if backup directory not mounted'; $wb['backup_delete_txt'] = 'Delete backups on domain/website delete'; +$wb['overquota_db_notify_threshold_txt'] = 'DB quota warning usage level'; $wb['overquota_db_notify_admin_txt'] = 'Send DB quota warnings to admin'; $wb['overquota_db_notify_client_txt'] = 'Send DB quota warnings to client'; $wb['php_handler_txt'] = 'Default PHP Handler'; @@ -316,6 +321,14 @@ $wb['content_filter_txt'] = 'Content Filter'; $wb['rspamd_url_txt'] = 'Rspamd URL'; $wb['rspamd_user_txt'] = 'Rspamd User'; $wb['rspamd_password_txt'] = 'Rspamd Password'; +$wb['rspamd_redis_servers_txt'] = 'Redis Servers'; +$wb['tooltip_rspamd_redis_servers_txt'] = 'Redis server(s) which Rspamd will use. Eg. \'127.0.0.1\', \'localhost:6379\' or \'/var/run/redis/redis-server.sock\'.'; +$wb['rspamd_redis_password_txt'] = 'Redis Password'; +$wb['tooltip_rspamd_redis_password_txt'] = 'Password for Redis Servers (leave blank if unused).'; +$wb['rspamd_redis_bayes_servers_txt'] = 'Redis Servers for Bayes'; +$wb['tooltip_rspamd_redis_bayes_servers_txt'] = 'Redis server(s) which Rspamd will use for Bayes if different (otherwise leave blank). Eg. \'localhost:6378\' or \'/var/run/redis-bayes/redis-server.sock\'.'; +$wb['rspamd_redis_bayes_password_txt'] = 'Redis Password for Bayes'; +$wb['tooltip_rspamd_redis_bayes_password_txt'] = 'Password for Bayes Redis Server (leave blank if unused).'; $wb['vhost_proxy_protocol_enabled_txt'] = 'Enable PROXY Protocol'; $wb['vhost_proxy_protocol_http_port_txt'] = 'PROXY Protocol HTTP Port'; $wb['vhost_proxy_protocol_https_port_txt'] = 'PROXY Protocol HTTPS Port'; diff --git a/interface/web/admin/lib/lang/dk_system_config.lng b/interface/web/admin/lib/lang/dk_system_config.lng index 18160789a9d8bb83152ba44547c8ae35fe521326..71533e77d0469e26624c1fd33b9c09e1028163dd 100644 --- a/interface/web/admin/lib/lang/dk_system_config.lng +++ b/interface/web/admin/lib/lang/dk_system_config.lng @@ -105,4 +105,5 @@ $wb['show_support_messages_txt'] = 'Show message function in help module'; $wb['show_aps_menu_txt'] = 'Show APS menu'; $wb['show_aps_menu_note_txt'] = 'APS will be removed from the panel in the near future.'; $wb['show_aps_menu_note_url_txt'] = 'Click here for more information.'; +$wb['dns_show_zoneexport_txt'] = 'Show zone export.'; ?> diff --git a/interface/web/admin/lib/lang/el_remote_action.lng b/interface/web/admin/lib/lang/el_remote_action.lng index ff63fd59354a2d9870b3beda773a9ada68baf985..18363323251764dd4f1e2bf6d29eca23b3bb2ec5 100644 --- a/interface/web/admin/lib/lang/el_remote_action.lng +++ b/interface/web/admin/lib/lang/el_remote_action.lng @@ -2,7 +2,7 @@ $wb['select_server_txt'] = 'Επιλογή Server'; $wb['btn_do_txt'] = 'ΕκτÎλεση ενÎÏγειας'; $wb['do_osupdate_caption'] = 'Εκκίνηση αναβάθμισης λειτουÏÎ³Î¹ÎºÎ¿Ï ÏƒÏ…ÏƒÏ„Î®Î¼Î±Ï„Î¿Ï‚ στον απομακÏυσμÎνο server'; -$wb['do_osupdate_desc'] = 'Αυτή η ενÎÏγεια εκτελεί την εντολή aptitude -y upgrade στον επιλεγμÎνο σας server.<br><br><strong>ΧΡΗΣΙΜΟΠΟΙΗΣΤΕ ΤΟ ΜΕ ΔΙΚΗ ΣΑΣ ΕΥΘΥÎΗ!</strong>'; +$wb['do_osupdate_desc'] = 'Αυτή η ενÎÏγεια εκτελεί την εντολή apt -y upgrade στον επιλεγμÎνο σας server.<br><br><strong>ΧΡΗΣΙΜΟΠΟΙΗΣΤΕ ΤΟ ΜΕ ΔΙΚΗ ΣΑΣ ΕΥΘΥÎΗ!</strong>'; $wb['do_ispcupdate_caption'] = 'Εκκίνηση αναβάθμισης ISPConfig 3 στον απομακÏυσμÎνο server'; $wb['do_ispcupdate_desc'] = 'Αυτή η ενÎÏγεια κάνει αναβάθμιση στο ISPConfig3 στον επιλεγμÎνο σας server.<br><br><strong>ΧΡΗΣΙΜΟΠΟΙΗΣΤΕ ΤΟ ΜΕ ΔΙΚΗ ΣΑΣ ΕΥΘΥÎΗ!</strong>'; $wb['action_scheduled'] = 'Η ενÎÏγεια Ï€ÏογÏαμματίστηκε για εκτÎλεση'; diff --git a/interface/web/admin/lib/lang/el_server_config.lng b/interface/web/admin/lib/lang/el_server_config.lng index 7d857f331c15a8cb8e49611ff0363af654e8ce03..db0eabd0d18103d6831a8aa0e71cc19aea91a61f 100644 --- a/interface/web/admin/lib/lang/el_server_config.lng +++ b/interface/web/admin/lib/lang/el_server_config.lng @@ -176,6 +176,8 @@ $wb['website_autoalias_note_txt'] = 'Placeholders:'; $wb['backup_mode_txt'] = 'Backup mode'; $wb['backup_mode_userzip'] = 'Backup web files owned by web user as zip'; $wb['backup_mode_rootgz'] = 'Backup all files in web directory as root user'; +$wb['backup_mode_borg_txt'] = 'BorgBackup: Backup all files in vhost directory and databases into incremental repositories'; +$wb['backup_missing_utils_txt'] = 'The following backup mode can not be used because the required tools are not installed:'; $wb['realtime_blackhole_list_txt'] = 'Real-time Blackhole List'; $wb['realtime_blackhole_list_note_txt'] = '(Separate RBL\'s with commas)'; $wb['stress_adaptive_txt'] = 'Adapt to temporary load spikes'; @@ -193,6 +195,8 @@ $wb['overtraffic_notify_admin_txt'] = 'Send overtraffic notification to admin'; $wb['overtraffic_notify_client_txt'] = 'Send overtraffic notification to client'; $wb['overtraffic_disable_web_txt'] = 'Disable websites that exceed traffic limit'; $wb['rbl_error_regex'] = 'Please specify valid RBL hostnames.'; +$wb['overquota_notify_threshold_txt'] = 'Quota warning usage level'; +$wb['overquota_notify_threshold_error'] = 'Quota warning usage level must be between 0-100%'; $wb['overquota_notify_admin_txt'] = 'Send quota warnings to admin'; $wb['overquota_notify_client_txt'] = 'Send quota warnings to client'; $wb['overquota_notify_onok_txt'] = 'Send quota ok message to client'; @@ -273,6 +277,7 @@ $wb['vhost_rewrite_v6_txt'] = 'Rewrite IPv6 on Mirror'; $wb['v6_prefix_length'] = 'Prefix too long according to defined IPv6 '; $wb['backup_dir_mount_cmd_txt'] = 'Mount command, if backup directory not mounted'; $wb['backup_delete_txt'] = 'Delete backups on domain/website delete'; +$wb['overquota_db_notify_threshold_txt'] = 'DB quota warning usage level'; $wb['overquota_db_notify_admin_txt'] = 'Send DB quota warnings to admin'; $wb['overquota_db_notify_client_txt'] = 'Send DB quota warnings to client'; $wb['php_handler_txt'] = 'Default PHP Handler'; @@ -316,6 +321,14 @@ $wb['content_filter_txt'] = 'Content Filter'; $wb['rspamd_url_txt'] = 'Rspamd URL'; $wb['rspamd_user_txt'] = 'Rspamd User'; $wb['rspamd_password_txt'] = 'Rspamd Password'; +$wb['rspamd_redis_servers_txt'] = 'Redis Servers'; +$wb['tooltip_rspamd_redis_servers_txt'] = 'Redis server(s) which Rspamd will use. Eg. \'127.0.0.1\', \'localhost:6379\' or \'/var/run/redis/redis-server.sock\'.'; +$wb['rspamd_redis_password_txt'] = 'Redis Password'; +$wb['tooltip_rspamd_redis_password_txt'] = 'Password for Redis Servers (leave blank if unused).'; +$wb['rspamd_redis_bayes_servers_txt'] = 'Redis Servers for Bayes'; +$wb['tooltip_rspamd_redis_bayes_servers_txt'] = 'Redis server(s) which Rspamd will use for Bayes if different (otherwise leave blank). Eg. \'localhost:6378\' or \'/var/run/redis-bayes/redis-server.sock\'.'; +$wb['rspamd_redis_bayes_password_txt'] = 'Redis Password for Bayes'; +$wb['tooltip_rspamd_redis_bayes_password_txt'] = 'Password for Bayes Redis Server (leave blank if unused).'; $wb['vhost_proxy_protocol_enabled_txt'] = 'Enable PROXY Protocol'; $wb['vhost_proxy_protocol_http_port_txt'] = 'PROXY Protocol HTTP Port'; $wb['vhost_proxy_protocol_https_port_txt'] = 'PROXY Protocol HTTPS Port'; diff --git a/interface/web/admin/lib/lang/el_system_config.lng b/interface/web/admin/lib/lang/el_system_config.lng index 7e2df97a492f642c466fc3a0095564329f75f4e3..f64df47bc949ca1bb6ca3e571994878e3f79dd51 100644 --- a/interface/web/admin/lib/lang/el_system_config.lng +++ b/interface/web/admin/lib/lang/el_system_config.lng @@ -105,4 +105,5 @@ $wb['show_support_messages_txt'] = 'Show message function in help module'; $wb['show_aps_menu_txt'] = 'Show APS menu'; $wb['show_aps_menu_note_txt'] = 'APS will be removed from the panel in the near future.'; $wb['show_aps_menu_note_url_txt'] = 'Click here for more information.'; +$wb['dns_show_zoneexport_txt'] = 'Show zone export.'; ?> diff --git a/interface/web/admin/lib/lang/en_remote_action.lng b/interface/web/admin/lib/lang/en_remote_action.lng index 963eb473faa6e6b0ea4c5e23fe2122a0916392fe..16b45fada9adeb35902c30d5d84cc473af855fa1 100644 --- a/interface/web/admin/lib/lang/en_remote_action.lng +++ b/interface/web/admin/lib/lang/en_remote_action.lng @@ -2,7 +2,7 @@ $wb['select_server_txt'] = 'Select Server'; $wb['btn_do_txt'] = 'Execute action'; $wb['do_osupdate_caption'] = 'Do OS-Update at remote server'; -$wb['do_osupdate_desc'] = 'This Action does a "aptitude -y upgrade" at your selected server.<br><br><strong>USE THIS AT YOUR OWN RISK!</strong>'; +$wb['do_osupdate_desc'] = 'This Action does a "apt -y upgrade" at your selected server.<br><br><strong>USE THIS AT YOUR OWN RISK!</strong>'; $wb['do_ispcupdate_caption'] = 'Do ISPConfig 3 - Update at remote server'; $wb['do_ispcupdate_desc'] = 'This action does a ISPConfig3 update at your selected server.<br><br><strong>USE THIS AT YOUR OWN RISK!</strong>'; $wb['action_scheduled'] = 'The action is scheduled for execution'; diff --git a/interface/web/admin/lib/lang/en_server_config.lng b/interface/web/admin/lib/lang/en_server_config.lng index 2eb49af3b7572bb993f73e189e2bb5974d5e1401..b0c9ba3673a0895275d052794ae05d5b06ace2c8 100644 --- a/interface/web/admin/lib/lang/en_server_config.lng +++ b/interface/web/admin/lib/lang/en_server_config.lng @@ -120,6 +120,8 @@ $wb['fastcgi_config_syntax_txt'] = 'FastCGI config syntax'; $wb['backup_mode_txt'] = 'Backup mode'; $wb['backup_mode_userzip'] = 'Backup web files owned by web user as zip'; $wb['backup_mode_rootgz'] = 'Backup all files in web directory as root user'; +$wb['backup_mode_borg_txt'] = 'BorgBackup: Backup all files in vhost directory and databases into incremental repositories'; +$wb['backup_missing_utils_txt'] = 'The following backup mode can not be used because the required tools are not installed:'; $wb['tmpdir_path_error_empty'] = 'tmp-dir Path is empty.'; $wb['tmpdir_path_error_regex'] = 'Invalid tmp-dir path.'; $wb['backup_time_txt'] = 'Backup time'; @@ -206,6 +208,8 @@ $wb['overtraffic_notify_admin_txt'] = 'Send overtraffic notification to admin'; $wb['overtraffic_notify_client_txt'] = 'Send overtraffic notification to client'; $wb['overtraffic_disable_web_txt'] = 'Disable websites that exceed traffic limit'; $wb['rbl_error_regex'] = 'Please specify valid RBL hostnames.'; +$wb['overquota_notify_threshold_txt'] = 'Quota warning usage level'; +$wb['overquota_notify_threshold_error'] = 'Quota warning usage level must be between 0-100%'; $wb['overquota_notify_admin_txt'] = 'Send quota warnings to admin'; $wb['overquota_notify_client_txt'] = 'Send quota warnings to client'; $wb['overquota_notify_onok_txt'] = 'Send quota ok message to client'; @@ -229,6 +233,7 @@ $wb['v6_prefix_length'] = 'Prefix too long according to defined IPv6 '; $wb['backup_dir_is_mount_txt'] = 'Backup directory is a mount?'; $wb['backup_dir_mount_cmd_txt'] = 'Mount command, if backup directory not mounted'; $wb['backup_delete_txt'] = 'Delete backups on domain/website delete'; +$wb['overquota_db_notify_threshold_txt'] = 'DB quota warning usage level'; $wb['overquota_db_notify_admin_txt'] = 'Send DB quota warnings to admin'; $wb['overquota_db_notify_client_txt'] = 'Send DB quota warnings to client'; $wb['monitor_system_updates_txt'] = 'Check for Linux updates'; @@ -324,6 +329,14 @@ $wb['content_filter_txt'] = 'Content Filter'; $wb['rspamd_url_txt'] = 'Rspamd URL'; $wb['rspamd_user_txt'] = 'Rspamd User'; $wb['rspamd_password_txt'] = 'Rspamd Password'; +$wb['rspamd_redis_servers_txt'] = 'Redis Servers'; +$wb['tooltip_rspamd_redis_servers_txt'] = 'Redis server(s) which Rspamd will use. Eg. \'127.0.0.1\', \'localhost:6379\' or \'/var/run/redis/redis-server.sock\'.'; +$wb['rspamd_redis_password_txt'] = 'Redis Password'; +$wb['tooltip_rspamd_redis_password_txt'] = 'Password for Redis Servers (leave blank if unused).'; +$wb['rspamd_redis_bayes_servers_txt'] = 'Redis Servers for Bayes'; +$wb['tooltip_rspamd_redis_bayes_servers_txt'] = 'Redis server(s) which Rspamd will use for Bayes if different (otherwise leave blank). Eg. \'localhost:6378\' or \'/var/run/redis-bayes/redis-server.sock\'.'; +$wb['rspamd_redis_bayes_password_txt'] = 'Redis Password for Bayes'; +$wb['tooltip_rspamd_redis_bayes_password_txt'] = 'Password for Bayes Redis Server (leave blank if unused).'; $wb['vhost_proxy_protocol_enabled_txt'] = 'Enable PROXY Protocol'; $wb['vhost_proxy_protocol_http_port_txt'] = 'PROXY Protocol HTTP Port'; $wb['vhost_proxy_protocol_https_port_txt'] = 'PROXY Protocol HTTPS Port'; diff --git a/interface/web/admin/lib/lang/en_system_config.lng b/interface/web/admin/lib/lang/en_system_config.lng index 7db4270c128013516c6135c817198d9c30257c06..2f32d4feaaf743d705907aeaa3b3cf8b15027820 100644 --- a/interface/web/admin/lib/lang/en_system_config.lng +++ b/interface/web/admin/lib/lang/en_system_config.lng @@ -106,4 +106,5 @@ $wb['show_support_messages_txt'] = 'Show message function in help module'; $wb['show_aps_menu_txt'] = 'Show APS menu'; $wb['show_aps_menu_note_txt'] = 'APS will be removed from the panel in the near future.'; $wb['show_aps_menu_note_url_txt'] = 'Click here for more information.'; +$wb['dns_show_zoneexport_txt'] = 'Show zone export.'; ?> diff --git a/interface/web/admin/lib/lang/es_remote_action.lng b/interface/web/admin/lib/lang/es_remote_action.lng index d259d33a15803951c73a5554f534a4bf59fe15b7..0e7997d049eca881c5644e528a001f8348687afe 100644 --- a/interface/web/admin/lib/lang/es_remote_action.lng +++ b/interface/web/admin/lib/lang/es_remote_action.lng @@ -4,7 +4,7 @@ $wb['btn_do_txt'] = 'Ejecutar acción'; $wb['do_ispcupdate_caption'] = 'Realizar actualización de ISPConfig 3 en el servidor remoto'; $wb['do_ispcupdate_desc'] = 'Esta acción realizará una actualización de ISPConfig 3 en el servidor seleccionado.<br><br><strong>¡USE ESTO BAJO SU PROPIA RESPONSABILIDAD!</strong>'; $wb['do_osupdate_caption'] = 'Ejecutar actualización de S.O. al servidor remoto'; -$wb['do_osupdate_desc'] = 'Esta acción realizará un \'aptitude -y upgrade\' en el servidor seleccionado.<br><br><strong>¡USE ESTO BAJO SU PROPIA RESPONSABILIDAD!</strong>'; +$wb['do_osupdate_desc'] = 'Esta acción realizará un \'apt -y upgrade\' en el servidor seleccionado.<br><br><strong>¡USE ESTO BAJO SU PROPIA RESPONSABILIDAD!</strong>'; $wb['ispconfig_update_text'] = 'Inicie sesión como root en el shell de su servidor y ejecute el comando<br /><br /> <strong>ispconfig_update.sh</strong><br /><br />para iniciar la actualización de ISPConfig.<br /><br /><a href= target=>Pulse aquà para ver una descripción detallada de cómo actualizar</a>'; $wb['ispconfig_update_title'] = 'Instrucciones de actualización de ISPConfig'; $wb['select_all_server'] = 'Todos los servidores'; diff --git a/interface/web/admin/lib/lang/es_server_config.lng b/interface/web/admin/lib/lang/es_server_config.lng index 9fe1d49638b0c96054cab9681bdf256554bfd779..2a48a99a72f0f84878ad9a8867ceada7595905e6 100644 --- a/interface/web/admin/lib/lang/es_server_config.lng +++ b/interface/web/admin/lib/lang/es_server_config.lng @@ -36,6 +36,8 @@ $wb['backup_dir_is_mount_txt'] = 'El directorio de copias de seguridad está mon $wb['backup_dir_mount_cmd_txt'] = 'Comando de montaje, si el directorio de copias de seguridad no está montado'; $wb['backup_dir_txt'] = 'Directorio para respaldos'; $wb['backup_mode_rootgz'] = 'Respaldar todos los archivos en el directorio web siendo root el propietario'; +$wb['backup_mode_borg_txt'] = 'BorgBackup: Respaldar todos los archivos en el directorio vhost y las bases de datos en repositorios incrementales'; +$wb['backup_missing_utils_txt'] = 'El siguiente modo de respaldo no se puede utilizar porque las herramientas necesarias no están instaladas:'; $wb['backup_mode_txt'] = 'Modo de respaldo'; $wb['backup_mode_userzip'] = 'Respaldar archivos web siendo el usuario el propietario en formato zip'; $wb['bind_group_error_empty'] = 'El grupo para BIND está vacÃo.'; @@ -187,8 +189,11 @@ $wb['nginx_vhost_conf_enabled_dir_error_empty'] = 'El directorio de configuraci $wb['nginx_vhost_conf_enabled_dir_error_regex'] = 'El directorio de configuración para Vhost habilitados de Nginx es inválido.'; $wb['nginx_vhost_conf_enabled_dir_txt'] = 'Directorio de configuración de host virtual de Nginx habilitado'; $wb['no_notifications_txt'] = 'Sin notificaciones'; +$wb['overquota_db_notify_threshold_txt'] = 'DB quota warning usage level'; $wb['overquota_db_notify_admin_txt'] = 'Enviar advertencias de cuota de base de datos al administrador'; $wb['overquota_db_notify_client_txt'] = 'Enviar advertencias de cuota de base de datos a los clientes'; +$wb['overquota_notify_threshold_txt'] = 'Quota warning usage level'; +$wb['overquota_notify_threshold_error'] = 'Quota warning usage level must be between 0-100%'; $wb['overquota_notify_admin_txt'] = 'Enviar advertencias de cuota excedida al administrador'; $wb['overquota_notify_client_txt'] = 'Enviar advertencias de cuota excedida al cliente'; $wb['overquota_notify_freq_note_txt'] = '0 = enviar mensaje solo una vez, sin volver a notificar'; @@ -316,6 +321,14 @@ $wb['content_filter_txt'] = 'Content Filter'; $wb['rspamd_url_txt'] = 'Rspamd URL'; $wb['rspamd_user_txt'] = 'Rspamd User'; $wb['rspamd_password_txt'] = 'Rspamd Password'; +$wb['rspamd_redis_servers_txt'] = 'Redis Servers'; +$wb['tooltip_rspamd_redis_servers_txt'] = 'Redis server(s) which Rspamd will use. Eg. \'127.0.0.1\', \'localhost:6379\' or \'/var/run/redis/redis-server.sock\'.'; +$wb['rspamd_redis_password_txt'] = 'Redis Password'; +$wb['tooltip_rspamd_redis_password_txt'] = 'Password for Redis Servers (leave blank if unused).'; +$wb['rspamd_redis_bayes_servers_txt'] = 'Redis Servers for Bayes'; +$wb['tooltip_rspamd_redis_bayes_servers_txt'] = 'Redis server(s) which Rspamd will use for Bayes if different (otherwise leave blank). Eg. \'localhost:6378\' or \'/var/run/redis-bayes/redis-server.sock\'.'; +$wb['rspamd_redis_bayes_password_txt'] = 'Redis Password for Bayes'; +$wb['tooltip_rspamd_redis_bayes_password_txt'] = 'Password for Bayes Redis Server (leave blank if unused).'; $wb['vhost_proxy_protocol_enabled_txt'] = 'Enable PROXY Protocol'; $wb['vhost_proxy_protocol_http_port_txt'] = 'PROXY Protocol HTTP Port'; $wb['vhost_proxy_protocol_https_port_txt'] = 'PROXY Protocol HTTPS Port'; diff --git a/interface/web/admin/lib/lang/es_system_config.lng b/interface/web/admin/lib/lang/es_system_config.lng index 92633c160114e1721e48245bcc078cc6bf7bc6c6..471975be4330c60dee4291ae405b35df501e82ac 100644 --- a/interface/web/admin/lib/lang/es_system_config.lng +++ b/interface/web/admin/lib/lang/es_system_config.lng @@ -105,4 +105,5 @@ $wb['show_support_messages_txt'] = 'Show message function in help module'; $wb['show_aps_menu_txt'] = 'Show APS menu'; $wb['show_aps_menu_note_txt'] = 'APS will be removed from the panel in the near future.'; $wb['show_aps_menu_note_url_txt'] = 'Click here for more information.'; +$wb['dns_show_zoneexport_txt'] = 'Show zone export.'; ?> diff --git a/interface/web/admin/lib/lang/fi_remote_action.lng b/interface/web/admin/lib/lang/fi_remote_action.lng index 3f8948e19f602408715f9554606f5478359bec9a..dfe56b616d5b3d18abd7eb9965b8c5602cb4354c 100644 --- a/interface/web/admin/lib/lang/fi_remote_action.lng +++ b/interface/web/admin/lib/lang/fi_remote_action.lng @@ -2,7 +2,7 @@ $wb['select_server_txt'] = 'Select Server'; $wb['btn_do_txt'] = 'Execute action'; $wb['do_osupdate_caption'] = 'Do OS-Update at remote server'; -$wb['do_osupdate_desc'] = 'This Action does a aptitude -y upgrade at your selected server.<br><br><strong>USE THIS AT YOUR OWN RISK!</strong>'; +$wb['do_osupdate_desc'] = 'This Action does a apt -y upgrade at your selected server.<br><br><strong>USE THIS AT YOUR OWN RISK!</strong>'; $wb['do_ispcupdate_caption'] = 'Do ISPConfig 3 - Update at remote server'; $wb['do_ispcupdate_desc'] = 'This action does a ISPConfig3 update at your selected server.<br><br><strong>USE THIS AT YOUR OWN RISK!</strong>'; $wb['action_scheduled'] = 'The action is scheduled for execution'; diff --git a/interface/web/admin/lib/lang/fi_server_config.lng b/interface/web/admin/lib/lang/fi_server_config.lng index 7856cdb7c88d33cb97597e2e719545e045b59261..f377aff00271ad5d54aed994e5418566a5e9f216 100644 --- a/interface/web/admin/lib/lang/fi_server_config.lng +++ b/interface/web/admin/lib/lang/fi_server_config.lng @@ -176,6 +176,8 @@ $wb['website_autoalias_note_txt'] = 'Placeholders:'; $wb['backup_mode_txt'] = 'Backup mode'; $wb['backup_mode_userzip'] = 'Backup web files owned by web user as zip'; $wb['backup_mode_rootgz'] = 'Backup all files in web directory as root user'; +$wb['backup_mode_borg_txt'] = 'BorgBackup: Backup all files in vhost directory and databases into incremental repositories'; +$wb['backup_missing_utils_txt'] = 'The following backup mode can not be used because the required tools are not installed:'; $wb['realtime_blackhole_list_txt'] = 'Real-time Blackhole List'; $wb['realtime_blackhole_list_note_txt'] = '(Separate RBL\'s with commas)'; $wb['stress_adaptive_txt'] = 'Adapt to temporary load spikes'; @@ -193,6 +195,8 @@ $wb['overtraffic_notify_admin_txt'] = 'Send overtraffic notification to admin'; $wb['overtraffic_notify_client_txt'] = 'Send overtraffic notification to client'; $wb['overtraffic_disable_web_txt'] = 'Disable websites that exceed traffic limit'; $wb['rbl_error_regex'] = 'Please specify valid RBL hostnames.'; +$wb['overquota_notify_threshold_txt'] = 'Quota warning usage level'; +$wb['overquota_notify_threshold_error'] = 'Quota warning usage level must be between 0-100%'; $wb['overquota_notify_admin_txt'] = 'Send quota warnings to admin'; $wb['overquota_notify_client_txt'] = 'Send quota warnings to client'; $wb['overquota_notify_onok_txt'] = 'Send quota ok message to client'; @@ -273,6 +277,7 @@ $wb['disable_bind_log_txt'] = 'Disable bind9 messages for Loglevel WARN'; $wb['apps_vhost_enabled_txt'] = 'Apps-vhost enabled'; $wb['do_not_try_rescue_mongodb_txt'] = 'Disable MongoDB monitoring'; $wb['backup_dir_mount_cmd_txt'] = 'Mount command, if backup directory not mounted'; +$wb['overquota_db_notify_threshold_txt'] = 'DB quota warning usage level'; $wb['overquota_db_notify_admin_txt'] = 'Send DB quota warnings to admin'; $wb['overquota_db_notify_client_txt'] = 'Send DB quota warnings to client'; $wb['php_handler_txt'] = 'Default PHP Handler'; @@ -316,6 +321,14 @@ $wb['content_filter_txt'] = 'Content Filter'; $wb['rspamd_url_txt'] = 'Rspamd URL'; $wb['rspamd_user_txt'] = 'Rspamd User'; $wb['rspamd_password_txt'] = 'Rspamd Password'; +$wb['rspamd_redis_servers_txt'] = 'Redis Servers'; +$wb['tooltip_rspamd_redis_servers_txt'] = 'Redis server(s) which Rspamd will use. Eg. \'127.0.0.1\', \'localhost:6379\' or \'/var/run/redis/redis-server.sock\'.'; +$wb['rspamd_redis_password_txt'] = 'Redis Password'; +$wb['tooltip_rspamd_redis_password_txt'] = 'Password for Redis Servers (leave blank if unused).'; +$wb['rspamd_redis_bayes_servers_txt'] = 'Redis Servers for Bayes'; +$wb['tooltip_rspamd_redis_bayes_servers_txt'] = 'Redis server(s) which Rspamd will use for Bayes if different (otherwise leave blank). Eg. \'localhost:6378\' or \'/var/run/redis-bayes/redis-server.sock\'.'; +$wb['rspamd_redis_bayes_password_txt'] = 'Redis Password for Bayes'; +$wb['tooltip_rspamd_redis_bayes_password_txt'] = 'Password for Bayes Redis Server (leave blank if unused).'; $wb['vhost_proxy_protocol_enabled_txt'] = 'Enable PROXY Protocol'; $wb['vhost_proxy_protocol_http_port_txt'] = 'PROXY Protocol HTTP Port'; $wb['vhost_proxy_protocol_https_port_txt'] = 'PROXY Protocol HTTPS Port'; diff --git a/interface/web/admin/lib/lang/fi_system_config.lng b/interface/web/admin/lib/lang/fi_system_config.lng index 1a124440574379e02b7ac3a80ed90905f40ed01c..30dd462a2955f13f0dae5234697d1dd71e8950dc 100644 --- a/interface/web/admin/lib/lang/fi_system_config.lng +++ b/interface/web/admin/lib/lang/fi_system_config.lng @@ -105,4 +105,5 @@ $wb['show_support_messages_txt'] = 'Show message function in help module'; $wb['show_aps_menu_txt'] = 'Show APS menu'; $wb['show_aps_menu_note_txt'] = 'APS will be removed from the panel in the near future.'; $wb['show_aps_menu_note_url_txt'] = 'Click here for more information.'; +$wb['dns_show_zoneexport_txt'] = 'Show zone export.'; ?> diff --git a/interface/web/admin/lib/lang/fr_remote_action.lng b/interface/web/admin/lib/lang/fr_remote_action.lng index 640c17af9011b93ca5ff543242916f5db27057f2..ca4dc85dddfe078c32937eb68db369e7f3a16446 100644 --- a/interface/web/admin/lib/lang/fr_remote_action.lng +++ b/interface/web/admin/lib/lang/fr_remote_action.lng @@ -2,7 +2,7 @@ $wb['select_server_txt'] = 'Sélectionner un serveur'; $wb['btn_do_txt'] = 'Exécuter l’action'; $wb['do_osupdate_caption'] = 'Mettre à jour l\'OS du serveur distant'; -$wb['do_osupdate_desc'] = 'Cette action effectue aptitude -y upgrade sur le serveur sélectionné.<br/><br/><strong>UTILISEZ A VOS RISQUES ET PERILS !</strong>'; +$wb['do_osupdate_desc'] = 'Cette action effectue apt -y upgrade sur le serveur sélectionné.<br/><br/><strong>UTILISEZ A VOS RISQUES ET PERILS !</strong>'; $wb['do_ispcupdate_caption'] = 'Mettre à jour ISPConfig 3 sur le serveur distant'; $wb['do_ispcupdate_desc'] = 'Cette action met à jour ISPConfig3 sur le serveur sélectionné.<br/><br/><strong>UTILISEZ A VOS RISQUES ET PERILS !</strong>'; $wb['action_scheduled'] = 'L’action est marquée pour exécution'; diff --git a/interface/web/admin/lib/lang/fr_server_config.lng b/interface/web/admin/lib/lang/fr_server_config.lng index 50dddd0ad7b2a5d1adaf45d2ddbe4d9b3362e467..ebe43617bff1f785708a3f6c844ddd3aacbd272b 100644 --- a/interface/web/admin/lib/lang/fr_server_config.lng +++ b/interface/web/admin/lib/lang/fr_server_config.lng @@ -164,6 +164,8 @@ $wb['website_autoalias_note_txt'] = 'Placeholders:'; $wb['backup_mode_txt'] = 'Backup mode'; $wb['backup_mode_userzip'] = 'Backup web files owned by web user as zip'; $wb['backup_mode_rootgz'] = 'Backup all files in web directory as root user'; +$wb['backup_mode_borg_txt'] = 'BorgBackup: Backup all files in vhost directory and databases into incremental repositories'; +$wb['backup_missing_utils_txt'] = 'The following backup mode can not be used because the required tools are not installed:'; $wb['realtime_blackhole_list_txt'] = 'Real-time Blackhole List'; $wb['realtime_blackhole_list_note_txt'] = '(Separate RBL’s with commas)'; $wb['stress_adaptive_txt'] = 'Adapt to temporary load spikes'; @@ -181,6 +183,8 @@ $wb['overtraffic_notify_admin_txt'] = 'Send overtraffic notification to admin'; $wb['overtraffic_notify_client_txt'] = 'Send overtraffic notification to client'; $wb['overtraffic_disable_web_txt'] = 'Disable websites that exceed traffic limit'; $wb['rbl_error_regex'] = 'Please specify valid RBL hostnames.'; +$wb['overquota_notify_threshold_txt'] = 'Quota warning usage level'; +$wb['overquota_notify_threshold_error'] = 'Quota warning usage level must be between 0-100%'; $wb['overquota_notify_admin_txt'] = 'Send quota warnings to admin'; $wb['overquota_notify_client_txt'] = 'Send quota warnings to client'; $wb['overquota_notify_onok_txt'] = 'Send quota ok message to client'; @@ -271,6 +275,7 @@ $wb['vhost_rewrite_v6_txt'] = 'Rewrite IPv6 on Mirror'; $wb['v6_prefix_length'] = 'Prefix too long according to defined IPv6 '; $wb['backup_dir_mount_cmd_txt'] = 'Mount command, if backup directory not mounted'; $wb['backup_delete_txt'] = 'Delete backups on domain/website delete'; +$wb['overquota_db_notify_threshold_txt'] = 'DB quota warning usage level'; $wb['overquota_db_notify_admin_txt'] = 'Send DB quota warnings to admin'; $wb['overquota_db_notify_client_txt'] = 'Send DB quota warnings to client'; $wb['php_handler_txt'] = 'Default PHP Handler'; @@ -316,6 +321,14 @@ $wb['content_filter_txt'] = 'Content Filter'; $wb['rspamd_url_txt'] = 'Rspamd URL'; $wb['rspamd_user_txt'] = 'Rspamd User'; $wb['rspamd_password_txt'] = 'Rspamd Password'; +$wb['rspamd_redis_servers_txt'] = 'Redis Servers'; +$wb['tooltip_rspamd_redis_servers_txt'] = 'Redis server(s) which Rspamd will use. Eg. \'127.0.0.1\', \'localhost:6379\' or \'/var/run/redis/redis-server.sock\'.'; +$wb['rspamd_redis_password_txt'] = 'Redis Password'; +$wb['tooltip_rspamd_redis_password_txt'] = 'Password for Redis Servers (leave blank if unused).'; +$wb['rspamd_redis_bayes_servers_txt'] = 'Redis Servers for Bayes'; +$wb['tooltip_rspamd_redis_bayes_servers_txt'] = 'Redis server(s) which Rspamd will use for Bayes if different (otherwise leave blank). Eg. \'localhost:6378\' or \'/var/run/redis-bayes/redis-server.sock\'.'; +$wb['rspamd_redis_bayes_password_txt'] = 'Redis Password for Bayes'; +$wb['tooltip_rspamd_redis_bayes_password_txt'] = 'Password for Bayes Redis Server (leave blank if unused).'; $wb['vhost_proxy_protocol_enabled_txt'] = 'Enable PROXY Protocol'; $wb['vhost_proxy_protocol_http_port_txt'] = 'PROXY Protocol HTTP Port'; $wb['vhost_proxy_protocol_https_port_txt'] = 'PROXY Protocol HTTPS Port'; diff --git a/interface/web/admin/lib/lang/fr_system_config.lng b/interface/web/admin/lib/lang/fr_system_config.lng index a79bf9dafd7ce3b7ed37118e23cffcdd7f9dc2bf..ac606922a05896fd791d5aa7b85abbde0bfe34ca 100644 --- a/interface/web/admin/lib/lang/fr_system_config.lng +++ b/interface/web/admin/lib/lang/fr_system_config.lng @@ -105,4 +105,5 @@ $wb['show_support_messages_txt'] = 'Show message function in help module'; $wb['show_aps_menu_txt'] = 'Show APS menu'; $wb['show_aps_menu_note_txt'] = 'APS will be removed from the panel in the near future.'; $wb['show_aps_menu_note_url_txt'] = 'Click here for more information.'; +$wb['dns_show_zoneexport_txt'] = 'Show zone export.'; ?> diff --git a/interface/web/admin/lib/lang/hr_remote_action.lng b/interface/web/admin/lib/lang/hr_remote_action.lng index 6b10a83f5340b8aa65be2a7a0a365337e9c1add3..d36e61de86750702369587c7cfdb1f7dbaa51006 100644 --- a/interface/web/admin/lib/lang/hr_remote_action.lng +++ b/interface/web/admin/lib/lang/hr_remote_action.lng @@ -2,7 +2,7 @@ $wb['select_server_txt'] = 'Izaberi server'; $wb['btn_do_txt'] = 'Pokreni'; $wb['do_osupdate_caption'] = 'Nadogradi operativni sistem na udaljenom serveru'; -$wb['do_osupdate_desc'] = 'Ovime pokrećete \'aptitude -y upgrade\' na izabranom serveru.<br><br><strong>KORISTITE NA VLASTITU ODGOVORNOST!</strong>'; +$wb['do_osupdate_desc'] = 'Ovime pokrećete \'apt -y upgrade\' na izabranom serveru.<br><br><strong>KORISTITE NA VLASTITU ODGOVORNOST!</strong>'; $wb['do_ispcupdate_caption'] = 'Nadogradi ISPConfig 3 na udaljenom serveru'; $wb['do_ispcupdate_desc'] = 'Ovime pokrećete nadogradnju ISPConfig3-a na izabranom serveru.<br><br><strong>KORISTITE NA VLASTITU ODGOVORNOST!</strong>'; $wb['action_scheduled'] = 'Nadogradnja je dodana u planer poslova'; diff --git a/interface/web/admin/lib/lang/hr_server_config.lng b/interface/web/admin/lib/lang/hr_server_config.lng index de1ff48913a5f102d010c74404dd5fca15fb86a3..f20f29ed4525319f3e6a3d352027bbd1dab2637e 100644 --- a/interface/web/admin/lib/lang/hr_server_config.lng +++ b/interface/web/admin/lib/lang/hr_server_config.lng @@ -176,6 +176,8 @@ $wb['website_autoalias_note_txt'] = 'Placeholders:'; $wb['backup_mode_txt'] = 'Backup mode'; $wb['backup_mode_userzip'] = 'Backup web files owned by web user as zip'; $wb['backup_mode_rootgz'] = 'Backup all files in web directory as root user'; +$wb['backup_mode_borg_txt'] = 'BorgBackup: Backup all files in vhost directory and databases into incremental repositories'; +$wb['backup_missing_utils_txt'] = 'The following backup mode can not be used because the required tools are not installed:'; $wb['realtime_blackhole_list_txt'] = 'Real-time Blackhole List'; $wb['realtime_blackhole_list_note_txt'] = '(Separate RBL\'s with commas)'; $wb['stress_adaptive_txt'] = 'Adapt to temporary load spikes'; @@ -193,6 +195,8 @@ $wb['overtraffic_notify_admin_txt'] = 'Send overtraffic notification to admin'; $wb['overtraffic_notify_client_txt'] = 'Send overtraffic notification to client'; $wb['overtraffic_disable_web_txt'] = 'Disable websites that exceed traffic limit'; $wb['rbl_error_regex'] = 'Please specify valid RBL hostnames.'; +$wb['overquota_notify_threshold_txt'] = 'Quota warning usage level'; +$wb['overquota_notify_threshold_error'] = 'Quota warning usage level must be between 0-100%'; $wb['overquota_notify_admin_txt'] = 'Send quota warnings to admin'; $wb['overquota_notify_client_txt'] = 'Send quota warnings to client'; $wb['overquota_notify_onok_txt'] = 'Send quota ok message to client'; @@ -273,6 +277,7 @@ $wb['network_filesystem_txt'] = 'Network Filesystem'; $wb['disable_bind_log_txt'] = 'Disable bind9 messages for Loglevel WARN'; $wb['apps_vhost_enabled_txt'] = 'Apps-vhost enabled'; $wb['do_not_try_rescue_mongodb_txt'] = 'Disable MongoDB monitoring'; +$wb['overquota_db_notify_threshold_txt'] = 'DB quota warning usage level'; $wb['overquota_db_notify_admin_txt'] = 'Send DB quota warnings to admin'; $wb['overquota_db_notify_client_txt'] = 'Send DB quota warnings to client'; $wb['php_handler_txt'] = 'Default PHP Handler'; @@ -316,6 +321,14 @@ $wb['content_filter_txt'] = 'Content Filter'; $wb['rspamd_url_txt'] = 'Rspamd URL'; $wb['rspamd_user_txt'] = 'Rspamd User'; $wb['rspamd_password_txt'] = 'Rspamd Password'; +$wb['rspamd_redis_servers_txt'] = 'Redis Servers'; +$wb['tooltip_rspamd_redis_servers_txt'] = 'Redis server(s) which Rspamd will use. Eg. \'127.0.0.1\', \'localhost:6379\' or \'/var/run/redis/redis-server.sock\'.'; +$wb['rspamd_redis_password_txt'] = 'Redis Password'; +$wb['tooltip_rspamd_redis_password_txt'] = 'Password for Redis Servers (leave blank if unused).'; +$wb['rspamd_redis_bayes_servers_txt'] = 'Redis Servers for Bayes'; +$wb['tooltip_rspamd_redis_bayes_servers_txt'] = 'Redis server(s) which Rspamd will use for Bayes if different (otherwise leave blank). Eg. \'localhost:6378\' or \'/var/run/redis-bayes/redis-server.sock\'.'; +$wb['rspamd_redis_bayes_password_txt'] = 'Redis Password for Bayes'; +$wb['tooltip_rspamd_redis_bayes_password_txt'] = 'Password for Bayes Redis Server (leave blank if unused).'; $wb['vhost_proxy_protocol_enabled_txt'] = 'Enable PROXY Protocol'; $wb['vhost_proxy_protocol_http_port_txt'] = 'PROXY Protocol HTTP Port'; $wb['vhost_proxy_protocol_https_port_txt'] = 'PROXY Protocol HTTPS Port'; diff --git a/interface/web/admin/lib/lang/hr_system_config.lng b/interface/web/admin/lib/lang/hr_system_config.lng index 7a3426eff580f77e0e1cf684913b60f5b084e61f..0f29ae0c0c5ad6c90d8c8fb7355ad51f7ecfe4e2 100644 --- a/interface/web/admin/lib/lang/hr_system_config.lng +++ b/interface/web/admin/lib/lang/hr_system_config.lng @@ -105,4 +105,5 @@ $wb['show_support_messages_txt'] = 'Show message function in help module'; $wb['show_aps_menu_txt'] = 'Show APS menu'; $wb['show_aps_menu_note_txt'] = 'APS will be removed from the panel in the near future.'; $wb['show_aps_menu_note_url_txt'] = 'Click here for more information.'; +$wb['dns_show_zoneexport_txt'] = 'Show zone export.'; ?> diff --git a/interface/web/admin/lib/lang/hu_remote_action.lng b/interface/web/admin/lib/lang/hu_remote_action.lng index 6c31b4fd0dd31a54209267f38515009eb0e3fd86..03d94116b9f6047c100c304a977309083460bad3 100644 --- a/interface/web/admin/lib/lang/hu_remote_action.lng +++ b/interface/web/admin/lib/lang/hu_remote_action.lng @@ -2,7 +2,7 @@ $wb['select_server_txt'] = 'Válasszon szervert'; $wb['btn_do_txt'] = 'Execute action'; $wb['do_osupdate_caption'] = 'Do OS-Update at remote server'; -$wb['do_osupdate_desc'] = 'This Action does a aptitude -y upgrade at your selected server.<br><br><strong>USE THIS AT YOUR OWN RISK!</strong>'; +$wb['do_osupdate_desc'] = 'This Action does a apt -y upgrade at your selected server.<br><br><strong>USE THIS AT YOUR OWN RISK!</strong>'; $wb['do_ispcupdate_caption'] = 'Do ISPConfig 3 - Update at remote server'; $wb['do_ispcupdate_desc'] = 'This action does a ISPConfig3 update at your selected server.<br><br><strong>USE THIS AT YOUR OWN RISK!</strong>'; $wb['action_scheduled'] = 'The action is scheduled for execution'; diff --git a/interface/web/admin/lib/lang/hu_server_config.lng b/interface/web/admin/lib/lang/hu_server_config.lng index c608c02ee16aa350a3e3a6888e66cc567bb0188e..ac1b485cf33b9ffad1febe658e87fbffa2e0926c 100644 --- a/interface/web/admin/lib/lang/hu_server_config.lng +++ b/interface/web/admin/lib/lang/hu_server_config.lng @@ -176,6 +176,8 @@ $wb['website_autoalias_note_txt'] = 'Placeholders:'; $wb['backup_mode_txt'] = 'Backup mode'; $wb['backup_mode_userzip'] = 'Backup web files owned by web user as zip'; $wb['backup_mode_rootgz'] = 'Backup all files in web directory as root user'; +$wb['backup_mode_borg_txt'] = 'BorgBackup: Backup all files in vhost directory and databases into incremental repositories'; +$wb['backup_missing_utils_txt'] = 'The following backup mode can not be used because the required tools are not installed:'; $wb['realtime_blackhole_list_txt'] = 'Real-time Blackhole List'; $wb['realtime_blackhole_list_note_txt'] = '(Separate RBL\'s with commas)'; $wb['stress_adaptive_txt'] = 'Adapt to temporary load spikes'; @@ -193,6 +195,8 @@ $wb['overtraffic_notify_admin_txt'] = 'Send overtraffic notification to admin'; $wb['overtraffic_notify_client_txt'] = 'Send overtraffic notification to client'; $wb['overtraffic_disable_web_txt'] = 'Disable websites that exceed traffic limit'; $wb['rbl_error_regex'] = 'Please specify valid RBL hostnames.'; +$wb['overquota_notify_threshold_txt'] = 'Quota warning usage level'; +$wb['overquota_notify_threshold_error'] = 'Quota warning usage level must be between 0-100%'; $wb['overquota_notify_admin_txt'] = 'Send quota warnings to admin'; $wb['overquota_notify_client_txt'] = 'Send quota warnings to client'; $wb['overquota_notify_onok_txt'] = 'Send quota ok message to client'; @@ -273,6 +277,7 @@ $wb['disable_bind_log_txt'] = 'Disable bind9 messages for Loglevel WARN'; $wb['apps_vhost_enabled_txt'] = 'Apps-vhost enabled'; $wb['do_not_try_rescue_mongodb_txt'] = 'Disable MongoDB monitoring'; $wb['backup_dir_mount_cmd_txt'] = 'Mount command, if backup directory not mounted'; +$wb['overquota_db_notify_threshold_txt'] = 'DB quota warning usage level'; $wb['overquota_db_notify_admin_txt'] = 'Send DB quota warnings to admin'; $wb['overquota_db_notify_client_txt'] = 'Send DB quota warnings to client'; $wb['php_handler_txt'] = 'Default PHP Handler'; @@ -316,6 +321,14 @@ $wb['content_filter_txt'] = 'Content Filter'; $wb['rspamd_url_txt'] = 'Rspamd URL'; $wb['rspamd_user_txt'] = 'Rspamd User'; $wb['rspamd_password_txt'] = 'Rspamd Password'; +$wb['rspamd_redis_servers_txt'] = 'Redis Servers'; +$wb['tooltip_rspamd_redis_servers_txt'] = 'Redis server(s) which Rspamd will use. Eg. \'127.0.0.1\', \'localhost:6379\' or \'/var/run/redis/redis-server.sock\'.'; +$wb['rspamd_redis_password_txt'] = 'Redis Password'; +$wb['tooltip_rspamd_redis_password_txt'] = 'Password for Redis Servers (leave blank if unused).'; +$wb['rspamd_redis_bayes_servers_txt'] = 'Redis Servers for Bayes'; +$wb['tooltip_rspamd_redis_bayes_servers_txt'] = 'Redis server(s) which Rspamd will use for Bayes if different (otherwise leave blank). Eg. \'localhost:6378\' or \'/var/run/redis-bayes/redis-server.sock\'.'; +$wb['rspamd_redis_bayes_password_txt'] = 'Redis Password for Bayes'; +$wb['tooltip_rspamd_redis_bayes_password_txt'] = 'Password for Bayes Redis Server (leave blank if unused).'; $wb['vhost_proxy_protocol_enabled_txt'] = 'Enable PROXY Protocol'; $wb['vhost_proxy_protocol_http_port_txt'] = 'PROXY Protocol HTTP Port'; $wb['vhost_proxy_protocol_https_port_txt'] = 'PROXY Protocol HTTPS Port'; diff --git a/interface/web/admin/lib/lang/hu_system_config.lng b/interface/web/admin/lib/lang/hu_system_config.lng index 5fb8f7cd6e54e364cbd43b31e3f369e9bbfe8f75..1258e6acfe878a90df09079f58d7f995ea93ab6c 100644 --- a/interface/web/admin/lib/lang/hu_system_config.lng +++ b/interface/web/admin/lib/lang/hu_system_config.lng @@ -105,4 +105,5 @@ $wb['show_support_messages_txt'] = 'Show message function in help module'; $wb['show_aps_menu_txt'] = 'Show APS menu'; $wb['show_aps_menu_note_txt'] = 'APS will be removed from the panel in the near future.'; $wb['show_aps_menu_note_url_txt'] = 'Click here for more information.'; +$wb['dns_show_zoneexport_txt'] = 'Show zone export.'; ?> diff --git a/interface/web/admin/lib/lang/id_remote_action.lng b/interface/web/admin/lib/lang/id_remote_action.lng index 9e3eccb30885730125e874407887b4322cc08b06..2ddc957f630d7aff9bf3e177ff452b612226a430 100644 --- a/interface/web/admin/lib/lang/id_remote_action.lng +++ b/interface/web/admin/lib/lang/id_remote_action.lng @@ -2,7 +2,7 @@ $wb['select_server_txt'] = 'Pilih Server'; $wb['btn_do_txt'] = 'Jalankan Tindakan'; $wb['do_osupdate_caption'] = 'Lakukan pemutakhiran OS di server remote'; -$wb['do_osupdate_desc'] = 'Tindakan ini menjalankan aptitude -y upgrade di server yang dipilih.<br><br><strong>PENGGUNAANNYA MENJADI TANGGUNG JAWAB ANDA SENDIRI!</strong>'; +$wb['do_osupdate_desc'] = 'Tindakan ini menjalankan apt -y upgrade di server yang dipilih.<br><br><strong>PENGGUNAANNYA MENJADI TANGGUNG JAWAB ANDA SENDIRI!</strong>'; $wb['do_ispcupdate_caption'] = 'Lakukan pemutakhiran ISPConfig 3 - di server remote'; $wb['do_ispcupdate_desc'] = 'Tindakan ini melakukan pemutakhiran ISPConfig3 di server yang Anda pilih.<br><br><strong>PENGGUNAANNYA MENJADI TANGGUNG JAWAB ANDA SENDIRI!</strong>'; $wb['action_scheduled'] = 'Tindakan dijadwalkan untuk dijalankan'; diff --git a/interface/web/admin/lib/lang/id_server_config.lng b/interface/web/admin/lib/lang/id_server_config.lng index 37c19013452e54a18cd6166b7153ac4bf6e769e0..ae645317479dd99414216a7906bf633f977dbb3a 100644 --- a/interface/web/admin/lib/lang/id_server_config.lng +++ b/interface/web/admin/lib/lang/id_server_config.lng @@ -176,6 +176,8 @@ $wb['website_autoalias_note_txt'] = 'Placeholders:'; $wb['backup_mode_txt'] = 'Backup mode'; $wb['backup_mode_userzip'] = 'Backup web files owned by web user as zip'; $wb['backup_mode_rootgz'] = 'Backup all files in web directory as root user'; +$wb['backup_mode_borg_txt'] = 'BorgBackup: Backup all files in vhost directory and databases into incremental repositories'; +$wb['backup_missing_utils_txt'] = 'The following backup mode can not be used because the required tools are not installed:'; $wb['realtime_blackhole_list_txt'] = 'Real-time Blackhole List'; $wb['realtime_blackhole_list_note_txt'] = '(Separate RBL\'s with commas)'; $wb['stress_adaptive_txt'] = 'Adapt to temporary load spikes'; @@ -193,6 +195,8 @@ $wb['overtraffic_notify_admin_txt'] = 'Send overtraffic notification to admin'; $wb['overtraffic_notify_client_txt'] = 'Send overtraffic notification to client'; $wb['overtraffic_disable_web_txt'] = 'Disable websites that exceed traffic limit'; $wb['rbl_error_regex'] = 'Please specify valid RBL hostnames.'; +$wb['overquota_notify_threshold_txt'] = 'Quota warning usage level'; +$wb['overquota_notify_threshold_error'] = 'Quota warning usage level must be between 0-100%'; $wb['overquota_notify_admin_txt'] = 'Send quota warnings to admin'; $wb['overquota_notify_client_txt'] = 'Send quota warnings to client'; $wb['overquota_notify_onok_txt'] = 'Send quota ok message to client'; @@ -273,6 +277,7 @@ $wb['disable_bind_log_txt'] = 'Disable bind9 messages for Loglevel WARN'; $wb['apps_vhost_enabled_txt'] = 'Apps-vhost enabled'; $wb['do_not_try_rescue_mongodb_txt'] = 'Disable MongoDB monitoring'; $wb['backup_dir_mount_cmd_txt'] = 'Mount command, if backup directory not mounted'; +$wb['overquota_db_notify_threshold_txt'] = 'DB quota warning usage level'; $wb['overquota_db_notify_admin_txt'] = 'Send DB quota warnings to admin'; $wb['overquota_db_notify_client_txt'] = 'Send DB quota warnings to client'; $wb['php_handler_txt'] = 'Default PHP Handler'; @@ -316,6 +321,14 @@ $wb['content_filter_txt'] = 'Content Filter'; $wb['rspamd_url_txt'] = 'Rspamd URL'; $wb['rspamd_user_txt'] = 'Rspamd User'; $wb['rspamd_password_txt'] = 'Rspamd Password'; +$wb['rspamd_redis_servers_txt'] = 'Redis Servers'; +$wb['tooltip_rspamd_redis_servers_txt'] = 'Redis server(s) which Rspamd will use. Eg. \'127.0.0.1\', \'localhost:6379\' or \'/var/run/redis/redis-server.sock\'.'; +$wb['rspamd_redis_password_txt'] = 'Redis Password'; +$wb['tooltip_rspamd_redis_password_txt'] = 'Password for Redis Servers (leave blank if unused).'; +$wb['rspamd_redis_bayes_servers_txt'] = 'Redis Servers for Bayes'; +$wb['tooltip_rspamd_redis_bayes_servers_txt'] = 'Redis server(s) which Rspamd will use for Bayes if different (otherwise leave blank). Eg. \'localhost:6378\' or \'/var/run/redis-bayes/redis-server.sock\'.'; +$wb['rspamd_redis_bayes_password_txt'] = 'Redis Password for Bayes'; +$wb['tooltip_rspamd_redis_bayes_password_txt'] = 'Password for Bayes Redis Server (leave blank if unused).'; $wb['vhost_proxy_protocol_enabled_txt'] = 'Enable PROXY Protocol'; $wb['vhost_proxy_protocol_http_port_txt'] = 'PROXY Protocol HTTP Port'; $wb['vhost_proxy_protocol_https_port_txt'] = 'PROXY Protocol HTTPS Port'; diff --git a/interface/web/admin/lib/lang/id_system_config.lng b/interface/web/admin/lib/lang/id_system_config.lng index b1df781b7646c5b729a4eb6d19d1b64076e3552b..60eff076d378caabe62bd41685391a509a484e51 100644 --- a/interface/web/admin/lib/lang/id_system_config.lng +++ b/interface/web/admin/lib/lang/id_system_config.lng @@ -105,4 +105,5 @@ $wb['show_support_messages_txt'] = 'Show message function in help module'; $wb['show_aps_menu_txt'] = 'Show APS menu'; $wb['show_aps_menu_note_txt'] = 'APS will be removed from the panel in the near future.'; $wb['show_aps_menu_note_url_txt'] = 'Click here for more information.'; +$wb['dns_show_zoneexport_txt'] = 'Show zone export.'; ?> diff --git a/interface/web/admin/lib/lang/it_directive_snippets.lng b/interface/web/admin/lib/lang/it_directive_snippets.lng index 35e17caaffb3b48146595e2fdbcae376692e61df..1e7d3109a1692aa2e60fcf74c713c4273a4c7028 100644 --- a/interface/web/admin/lib/lang/it_directive_snippets.lng +++ b/interface/web/admin/lib/lang/it_directive_snippets.lng @@ -7,9 +7,9 @@ $wb['active_txt'] = 'Attivo'; $wb['directive_snippets_name_empty'] = 'Indicare un nome per lo snippet.'; $wb['directive_snippets_name_error_unique'] = 'Esiste già una direttiva snippet con questo nome.'; $wb['variables_txt'] = 'Variabili'; -$wb['customer_viewable_txt'] = 'Customer viewable'; -$wb['required_php_snippets_txt'] = 'Required PHP Snippet'; -$wb['update_sites_txt'] = 'Update sites using this snippet'; -$wb['error_hide_snippet_active_sites'] = 'You cannot hide this snippet from customers as it is currently used by existing websites.'; -$wb['error_disable_snippet_active_sites'] = 'You cannot disable this snippet as it is currently used by existing websites.'; -$wb['error_delete_snippet_active_sites'] = 'You cannot delete this snippet as it is currently used by existing websites.'; \ No newline at end of file +$wb['customer_viewable_txt'] = 'Cliente visibile'; +$wb['required_php_snippets_txt'] = 'Richiedi Snippet PHP'; +$wb['update_sites_txt'] = 'Aggiorna i siti usando questo snippet'; +$wb['error_hide_snippet_active_sites'] = 'Non puoi nascondere questo snippet poichè e già usato dai siti web esistenti.'; +$wb['error_disable_snippet_active_sites'] = 'Non puoi disabilitare questo snippet poichè e già usato dai siti web esistenti.'; +$wb['error_delete_snippet_active_sites'] = 'Non puoi cancellare questo snippet poichè e già usato dai siti web esistenti.'; diff --git a/interface/web/admin/lib/lang/it_directive_snippets_list.lng b/interface/web/admin/lib/lang/it_directive_snippets_list.lng index 7bb90ce94338a83bd3c95ab3a7a34178fb283a8e..b1d82a1caa687916304f7796dc2dc141cdbf6bf8 100644 --- a/interface/web/admin/lib/lang/it_directive_snippets_list.lng +++ b/interface/web/admin/lib/lang/it_directive_snippets_list.lng @@ -1,8 +1,8 @@ <?php -$wb['list_head_txt'] = 'Directtive Snippets'; +$wb['list_head_txt'] = 'Direttive Snippets'; $wb['active_txt'] = 'Attivo'; $wb['name_txt'] = 'Nome del Snippet'; $wb['type_txt'] = 'Tipo'; -$wb['add_new_record_txt'] = 'Aggiungi Direttive Snippet'; -$wb['customer_viewable_txt'] = 'Customer viewable'; +$wb['add_new_record_txt'] = 'Aggiungi Direttive Snippet'; +$wb['customer_viewable_txt'] = 'Cliente visibile'; ?> diff --git a/interface/web/admin/lib/lang/it_groups_list.lng b/interface/web/admin/lib/lang/it_groups_list.lng index 52cdce78e70b3677d1e16a1d685be2fc5dbe44e7..f816bcca86bcad302ab858b586f43fc6aad3aca8 100644 --- a/interface/web/admin/lib/lang/it_groups_list.lng +++ b/interface/web/admin/lib/lang/it_groups_list.lng @@ -3,5 +3,5 @@ $wb['list_head_txt'] = 'Gruppi utenti sistema'; $wb['description_txt'] = 'Descrizione'; $wb['name_txt'] = 'Gruppo'; $wb['add_new_record_txt'] = 'Aggiungi nuovo gruppo'; -$wb['warning_txt'] = '<b>ATTENZIONE:</b> Non editare o modificare alcuna impostazione utente da qui. Utilizzare invece le impostazioni del modulo nella sezione Clienti- e Rivenditori. Modificare o cambiare Utenti o Gruppi in questa sezione può causare perdita di dati!'; +$wb['warning_txt'] = '<b>ATTENZIONE:</b> Non editare o modificare alcuna impostazione utente da qui. Utilizzare invece le impostazioni del modulo nella sezione Clienti e Rivenditori. Modificare o cambiare Utenti o Gruppi in questa sezione può causare perdita di dati!'; ?> diff --git a/interface/web/admin/lib/lang/it_iptables.lng b/interface/web/admin/lib/lang/it_iptables.lng index 8fb963ebec01f174b1eca9ae370a53f90c97e917..24016ff7c815d95177e587f613148e9387ba38cc 100644 --- a/interface/web/admin/lib/lang/it_iptables.lng +++ b/interface/web/admin/lib/lang/it_iptables.lng @@ -1,13 +1,13 @@ <?php $wb['server_id_txt'] = 'Server'; -$wb['multiport_txt'] = 'Multi Port'; -$wb['singleport_txt'] = 'Single Port'; -$wb['protocol_txt'] = 'Protocol'; -$wb['table_txt'] = 'Table'; -$wb['target_txt'] = 'Target'; -$wb['state_txt'] = 'State'; -$wb['destination_ip_txt'] = 'Destination Address'; -$wb['source_ip_txt'] = 'Source Address'; +$wb['multiport_txt'] = 'Multi Porta'; +$wb['singleport_txt'] = 'Singola Porta'; +$wb['protocol_txt'] = 'Protocollo'; +$wb['table_txt'] = 'Tavola'; +$wb['target_txt'] = 'Obiettivo'; +$wb['state_txt'] = 'Stato'; +$wb['destination_ip_txt'] = 'Indirizzo Destinazione'; +$wb['source_ip_txt'] = 'Indirizzo Sorgente'; $wb['active_txt'] = 'Attivo'; -$wb['iptables_error_unique'] = 'There is already a firewall record for this server.'; +$wb['iptables_error_unique'] = 'Esiste già una regola del firewall per questo server.'; ?> diff --git a/interface/web/admin/lib/lang/it_iptables_list.lng b/interface/web/admin/lib/lang/it_iptables_list.lng index 76fbcaff8583b484dc6f89ac481d1c15e574d3bd..f8248869d824b9d7f2b8386c2ed04bc6940294bb 100644 --- a/interface/web/admin/lib/lang/it_iptables_list.lng +++ b/interface/web/admin/lib/lang/it_iptables_list.lng @@ -2,14 +2,14 @@ $wb['list_head_txt'] = 'IPTables'; $wb['add_new_rule_txt'] = 'Aggiungi Regola IPTables'; $wb['server_id_txt'] = 'Server'; -$wb['multiport_txt'] = 'Multi Port'; -$wb['singleport_txt'] = 'Single Port'; -$wb['protocol_txt'] = 'Protocol'; -$wb['table_txt'] = 'Table'; -$wb['target_txt'] = 'Target'; -$wb['state_txt'] = 'State'; -$wb['destination_ip_txt'] = 'Destination Address'; -$wb['source_ip_txt'] = 'Source Address'; +$wb['multiport_txt'] = 'Multi Porta'; +$wb['singleport_txt'] = 'Singola Porta'; +$wb['protocol_txt'] = 'Protocollo'; +$wb['table_txt'] = 'Tavola'; +$wb['target_txt'] = 'Obiettivo'; +$wb['state_txt'] = 'Stato'; +$wb['destination_ip_txt'] = 'Indirizzo Destinazione'; +$wb['source_ip_txt'] = 'Indirizzo Sorgente'; $wb['active_txt'] = 'Attivo'; $wb['iptables_error_unique'] = 'Esiste già una regola firewall per questo server.'; ?> diff --git a/interface/web/admin/lib/lang/it_language_complete.lng b/interface/web/admin/lib/lang/it_language_complete.lng index 84e629e100b9045109a31dbcce899f0377fb44df..a637e532f49d8d6177041c5e448b84fb01b631e3 100644 --- a/interface/web/admin/lib/lang/it_language_complete.lng +++ b/interface/web/admin/lib/lang/it_language_complete.lng @@ -1,7 +1,7 @@ <?php -$wb['list_head_txt'] = 'Merge the selected language file with the english master language file. <br />This adds missing strings from the english master language files to the selected language.'; -$wb['language_select_txt'] = 'Select language'; -$wb['btn_save_txt'] = 'Merge files now'; +$wb['list_head_txt'] = 'Unisci il file di traduzione selezionato con il file master in lingua inglese. <br />Questo aggiungerà le stringhe mancanti (in inglese) al file di traduzione selezionato.'; +$wb['language_select_txt'] = 'Seleziona lingua'; +$wb['btn_save_txt'] = 'Unisci i file adesso'; $wb['btn_cancel_txt'] = 'Annulla'; -$wb['list_desc_txt'] = 'Merge the selected language file with the english master language file. <br />This adds missing strings from the english master language files to the selected language.'; +$wb['list_desc_txt'] = 'Unendo il file di traduzione selezionato con il file master in lingua inglese. <br />Questo aggiungerà le stringhe mancanti (in inglese) al file di traduzione selezionato..'; ?> diff --git a/interface/web/admin/lib/lang/it_language_edit.lng b/interface/web/admin/lib/lang/it_language_edit.lng index 5a710c90ea24aa9a02ccb83475a37a45603ea898..101d41072adecec9fd6256b0146c724714bd730a 100644 --- a/interface/web/admin/lib/lang/it_language_edit.lng +++ b/interface/web/admin/lib/lang/it_language_edit.lng @@ -1,8 +1,8 @@ <?php -$wb['list_head_txt'] = 'Language file editor'; -$wb['language_select_txt'] = 'Seleziona language'; -$wb['module_txt'] = 'Module'; -$wb['lang_file_txt'] = 'Language file'; +$wb['list_head_txt'] = 'Editor del file della traduzione'; +$wb['language_select_txt'] = 'Seleziona lingua'; +$wb['module_txt'] = 'Modulo'; +$wb['lang_file_txt'] = 'File traduzione'; $wb['btn_save_txt'] = 'Salva'; $wb['btn_cancel_txt'] = 'Annulla'; ?> diff --git a/interface/web/admin/lib/lang/it_language_import.lng b/interface/web/admin/lib/lang/it_language_import.lng index a6ce43814c9e088b5493c64601ce02b7d236a152..0705efd126f1ee0abfc8f5513ba542b9da321f3a 100644 --- a/interface/web/admin/lib/lang/it_language_import.lng +++ b/interface/web/admin/lib/lang/it_language_import.lng @@ -5,5 +5,5 @@ $wb['btn_save_txt'] = 'Importa il file di lingua selezionato'; $wb['language_overwrite_txt'] = 'Sovrascrivi file, se esiste'; $wb['btn_cancel_txt'] = 'Annulla'; $wb['ignore_version_txt'] = 'Tralascia controllo versione ISPconfig'; -$wb['list_desc_txt'] = 'WARNING: Do not import language files from untrustworthy sources.'; +$wb['list_desc_txt'] = 'ATTENZIONE: non importare file di traduzione da sorgenti non affidabili.'; ?> diff --git a/interface/web/admin/lib/lang/it_remote_action.lng b/interface/web/admin/lib/lang/it_remote_action.lng index 08d02db6a33163db54081c2a556c4721457d93f7..9f43cb45fc90f10dc6b606aaacf24df45f84429c 100644 --- a/interface/web/admin/lib/lang/it_remote_action.lng +++ b/interface/web/admin/lib/lang/it_remote_action.lng @@ -1,12 +1,12 @@ <?php $wb['select_server_txt'] = 'Seleziona Server'; $wb['btn_do_txt'] = 'Esegui Azione'; -$wb['do_osupdate_caption'] = 'Do OS-Update at remote server'; -$wb['do_osupdate_desc'] = 'This Action does a aptitude -y upgrade at your selected server.<br><br><strong>USE THIS AT YOUR OWN RISK!</strong>'; -$wb['do_ispcupdate_caption'] = 'Do ISPConfig 3 - Update at remote server'; -$wb['do_ispcupdate_desc'] = 'This action does a ISPConfig3 update at your selected server.<br><br><strong>USE THIS AT YOUR OWN RISK!</strong>'; -$wb['action_scheduled'] = 'The action is scheduled for execution'; -$wb['select_all_server'] = 'All server'; -$wb['ispconfig_update_title'] = 'ISPConfig update instructions'; -$wb['ispconfig_update_text'] = 'Login as root user on the shell of your server and execute the command<br /><br /> <strong>ispconfig_update.sh</strong><br /><br />to start the ISPConfig update.<br /><br /><a href=https://www.faqforge.com/linux/controlpanels/ispconfig3/how-to-update-ispconfig-3/ target=_blank>Click here for detailed update instructins</a>'; +$wb['do_osupdate_caption'] = 'Esegui un aggiornamento del S.O. sul server remoto'; +$wb['do_osupdate_desc'] = 'Questa azione esegue apt -y upgrade sul server selezionato.<br><br><strong>USI QUESTA FUNZIONE A TUO RISCHIO E PERICOLO!</strong>'; +$wb['do_ispcupdate_caption'] = 'Esegui aggiornamento di ISPConfig 3 sul server remoto'; +$wb['do_ispcupdate_desc'] = 'Questa operazione esegue un aggiornamento a ISPConfig 3 sul server selezionato.<br><br><strong>USI QUESTA FUNZIONE A TUO RISCHIO E PERICOLO!</strong>'; +$wb['action_scheduled'] = 'L\'azione è programmata per la sua esecuzione'; +$wb['select_all_server'] = 'Tutti i server'; +$wb['ispconfig_update_title'] = 'Istruzioni per l\'aggiornamento di ISPConfig'; +$wb['ispconfig_update_text'] = 'Collegati alla shell del server come root ed esegui il comando <br /><br /> <strong>ispconfig_update.sh</strong><br /><br />per iniziare il processo di aggiornamento.<br /><br /><a href=https://www.faqforge.com/linux/controlpanels/ispconfig3/how-to-update-ispconfig-3/ target=_blank>Clicca qui per le istruzioni dettagliate di aggiornamento (in inglese)</a>'; ?> diff --git a/interface/web/admin/lib/lang/it_remote_user.lng b/interface/web/admin/lib/lang/it_remote_user.lng index f5fc847d68a317c7c8395c0adfc0b8692efb1094..f3bdba77371ae983c8ac94e2fa9abda79d056c3f 100644 --- a/interface/web/admin/lib/lang/it_remote_user.lng +++ b/interface/web/admin/lib/lang/it_remote_user.lng @@ -1,12 +1,12 @@ <?php -$wb['remote_user_txt'] = 'Remote User'; +$wb['remote_user_txt'] = 'Utente Remoto'; $wb['username_txt'] = 'Nome Utente'; $wb['password_txt'] = 'Password'; $wb['function_txt'] = 'Funzioni'; $wb['username_error_unique'] = 'Il nome utente deve essere unico'; $wb['username_error_empty'] = 'Il nome utente non può essere vuoto '; $wb['password_error_empty'] = 'La Password non può essere vuoto '; -$wb['password_strength_txt'] = 'Livello Sicurezza Password'; +$wb['password_strength_txt'] = 'Robustezza Password'; $wb['Mail domain functions'] = 'Funzioni Dominio di Posta'; $wb['Mail user functions'] = 'Funzioni Utente di posta'; $wb['Mail alias functions'] = 'Funzioni Alias di posta'; @@ -16,37 +16,37 @@ $wb['Mail transport functions'] = 'Funzioni Mail transport'; $wb['Mail whitelist functions'] = 'Funzioni whitelist di posta'; $wb['Mail blacklist functions'] = 'Funzioni blacklist di posta'; $wb['Mail spamfilter user functions'] = 'Funzioni utente filtri spam di posta'; -$wb['Mail spamfilter policy functions'] = 'Mail spamfilter policy functions'; -$wb['Mail fetchmail functions'] = 'Mail fetchmail functions'; -$wb['Mail user filter functions'] = 'Mail user filter functions'; -$wb['Mail filter functions'] = 'Mail filter functions'; -$wb['Client functions'] = 'Client functions'; -$wb['Sites cron functions'] = 'Sites cron functions'; -$wb['Sites database functions'] = 'Sites database functions'; -$wb['Sites FTP-User functions'] = 'Sites FTP-User functions'; -$wb['Sites Shell-User functions'] = 'Sites Shell-User functions'; -$wb['Sites Domain functions'] = 'Sites Domain functions'; -$wb['Sites Aliasdomain functions'] = 'Sites Aliasdomain functions'; -$wb['Sites Subdomain functions'] = 'Sites Subdomain functions'; -$wb['DNS zone functions'] = 'DNS zone functions'; -$wb['DNS a functions'] = 'DNS a functions'; -$wb['DNS aaaa functions'] = 'DNS aaaa functions'; -$wb['DNS alias functions'] = 'DNS alias functions'; -$wb['DNS cname functions'] = 'DNS cname functions'; -$wb['DNS hinfo functions'] = 'DNS hinfo functions'; -$wb['DNS mx functions'] = 'DNS mx functions'; -$wb['DNS naptr functions'] = 'DNS naptr functions'; -$wb['DNS ns functions'] = 'DNS ns functions'; -$wb['DNS ptr functions'] = 'DNS ptr functions'; -$wb['DNS rp functions'] = 'DNS rp functions'; -$wb['DNS srv functions'] = 'DNS srv functions'; -$wb['DNS txt functions'] = 'DNS txt functions'; -$wb['Mail mailing list functions'] = 'Mail mailinglist functions'; +$wb['Mail spamfilter policy functions'] = 'Funzioni di polotica di filtro spam per le mail'; +$wb['Mail fetchmail functions'] = 'Funzioni Mail fetchmail'; +$wb['Mail user filter functions'] = 'Funzioni di filtro utente per le mail'; +$wb['Mail filter functions'] = 'Funzioni di filtro Mail'; +$wb['Client functions'] = 'Funzioni Cliente'; +$wb['Sites cron functions'] = 'Funzioni cron per i siti'; +$wb['Sites database functions'] = 'Funzioni per database siti'; +$wb['Sites FTP-User functions'] = 'Funzioni per utenti FTP'; +$wb['Sites Shell-User functions'] = 'Funzioni per utenti Shell'; +$wb['Sites Domain functions'] = 'Funzioni per i Domini'; +$wb['Sites Aliasdomain functions'] = 'Funzioni per domini Alias'; +$wb['Sites Subdomain functions'] = 'Funzioni per sottodomini'; +$wb['DNS zone functions'] = 'Funzioni per zone DNS'; +$wb['DNS a functions'] = 'Funzioni per record A DNS'; +$wb['DNS aaaa functions'] = 'Funzioni per record AAAA DNS'; +$wb['DNS alias functions'] = 'Funzioni per alias DNS'; +$wb['DNS cname functions'] = 'Funzioni per cname DNS'; +$wb['DNS hinfo functions'] = 'Funzioni per hinfo DNS'; +$wb['DNS mx functions'] = 'Funzioni per MX DNS'; +$wb['DNS naptr functions'] = 'Funzioni NAPTR DNS'; +$wb['DNS ns functions'] = 'Funzioni NS DNS'; +$wb['DNS ptr functions'] = 'Funzioni PTR DNS'; +$wb['DNS rp functions'] = 'Funzioni RP DNS'; +$wb['DNS srv functions'] = 'Funzioni SRV DNS'; +$wb['DNS txt functions'] = 'Funzioni TXT DNS'; +$wb['Mail mailing list functions'] = 'Funzioni Mail mailinglist'; $wb['generate_password_txt'] = 'Genera Password'; $wb['repeat_password_txt'] = 'Ripeti Password'; $wb['password_mismatch_txt'] = 'Le password non coincidono.'; $wb['password_match_txt'] = 'Le password coincidono.'; -$wb['remote_access_txt'] = 'Remote Access'; -$wb['remote_ips_txt'] = 'Remote Access IPs / Hostnames (separate by , and leave blank for <i>any</i>)'; -$wb['remote_user_error_ips'] = 'At least one of the entered ip addresses or hostnames is invalid.'; +$wb['remote_access_txt'] = 'Accesso remoto Access'; +$wb['remote_ips_txt'] = 'Accesso remoto IPs / Hostnames (separati da , lasciare vuote per <i>qualunque</i>)'; +$wb['remote_user_error_ips'] = 'Almeno un indirizzo IP o hostname inserito non è valido.'; ?> diff --git a/interface/web/admin/lib/lang/it_server_config.lng b/interface/web/admin/lib/lang/it_server_config.lng index 08d3f7be8bc372b11deeb320ed87c75cd0e0b640..c8fab9c188593a52da90495973abb8dc27eb3d31 100644 --- a/interface/web/admin/lib/lang/it_server_config.lng +++ b/interface/web/admin/lib/lang/it_server_config.lng @@ -1,27 +1,27 @@ <?php -$wb['server_config'] = 'Server Config'; -$wb['config_for_txt'] = 'Configuration for'; -$wb['server_config_error_not_updated'] = 'Error in Server Config: not updated'; -$wb['server_config_error_section_not_updated'] = 'Error in Server Config: %s section not updated'; -$wb['jailkit_chroot_home_txt'] = 'Jailkit chroot home'; -$wb['jailkit_chroot_app_sections_txt'] = 'Jailkit chroot app sections'; -$wb['jailkit_chroot_app_programs_txt'] = 'Jailkit chrooted applications'; +$wb['server_config'] = 'Configurazione Server'; +$wb['config_for_txt'] = 'Configurazione per'; +$wb['server_config_error_not_updated'] = 'Errore nella configurazione del Server: non aggiornato'; +$wb['server_config_error_section_not_updated'] = 'Errore nella configurazione del Server: %s sezione non aggiornata'; +$wb['jailkit_chroot_home_txt'] = 'Cartella home di chroot Jailkit'; +$wb['jailkit_chroot_app_sections_txt'] = 'Sezione applicazioni chroot Jailkit'; +$wb['jailkit_chroot_app_programs_txt'] = 'Applicazioni Jailkit chrooted'; $wb['website_path_txt'] = 'Percorso Sito Web'; $wb['website_symlinks_txt'] = 'Sito Web symlinks'; -$wb['vhost_conf_dir_txt'] = 'Vhost config dir'; -$wb['vhost_conf_enabled_dir_txt'] = 'Vhost config dir abilitata'; -$wb['apache_init_script_txt'] = 'Apache init script'; -$wb['apache_init_script_note_txt'] = 'Lasciare questo vuoto rileverà automaticamente lo script init di Apache'; -$wb['apache_init_script_error_regex'] = 'Script init Apache non valido.'; -$wb['getmail_config_dir_txt'] = 'Getmail config dir'; +$wb['vhost_conf_dir_txt'] = 'Cartella configurazione Vhost'; +$wb['vhost_conf_enabled_dir_txt'] = 'Cartella configurazione Vhost abilitata'; +$wb['apache_init_script_txt'] = 'script Apache di avvio'; +$wb['apache_init_script_note_txt'] = 'Lasciare questo vuoto rileverà automaticamente lo script di avvio di Apache'; +$wb['apache_init_script_error_regex'] = 'Script di avvio di Apache non valido.'; +$wb['getmail_config_dir_txt'] = 'Cartella di configurazione Getmail'; $wb['fastcgi_starter_path_txt'] = 'Percorso FastCGI starter'; -$wb['fastcgi_starter_script_txt'] = 'FastCGI starter script'; -$wb['fastcgi_alias_txt'] = 'FastCGI Alias'; +$wb['fastcgi_starter_script_txt'] = 'script di avvio FastCGI'; +$wb['fastcgi_alias_txt'] = 'Alias FastCGI'; $wb['fastcgi_phpini_path_txt'] = 'Percorso FastCGI php.ini'; $wb['fastcgi_children_txt'] = 'FastCGI Children'; $wb['fastcgi_max_requests_txt'] = 'FastCGI max. Requests'; $wb['fastcgi_bin_txt'] = 'FastCGI Bin'; -$wb['module_txt'] = 'Module'; +$wb['module_txt'] = 'Modulo'; $wb['maildir_path_txt'] = 'Percorso Maildir'; $wb['homedir_path_txt'] = 'Percorso Homedir'; $wb['mailuser_uid_txt'] = 'Mailuser UID'; @@ -43,8 +43,8 @@ $wb['website_basedir_txt'] = 'basedir per Sito Web'; $wb['ip_address_error_wrong'] = 'Formato indirizzo IP non valido.'; $wb['netmask_error_wrong'] = 'Formato Maschera di rete non valido.'; $wb['gateway_error_wrong'] = 'Formato Gateway non valido.'; -$wb['hostname_error_empty'] = 'Hostname vuoto.'; -$wb['nameservers_error_empty'] = 'Nameserver vuoto.'; +$wb['hostname_error_empty'] = 'Hostname vuoto.'; +$wb['nameservers_error_empty'] = 'Nameserver vuoto.'; $wb['jailkit_chroot_cron_programs_txt'] = 'Applicazioni Jailkit cron chrooted'; $wb['config_dir_txt'] = 'Direttrice configurazione'; $wb['init_script_txt'] = 'Nome script di Cron init'; @@ -71,7 +71,7 @@ $wb['pop3_imap_daemon_txt'] = 'Demone POP3/IMAP'; $wb['php_open_basedir_txt'] = 'PHP open_basedir'; $wb['php_open_basedir_error_empty'] = 'PHP open_basedir vuoto.'; $wb['htaccess_allow_override_txt'] = '.htaccess AllowOverride'; -$wb['htaccess_allow_override_error_empty'] = '.htaccess AllowOverride vuoto.'; +$wb['htaccess_allow_override_error_empty'] = '.htaccess AllowOverride vuoto.'; $wb['awstats_conf_dir_txt'] = 'awstats cartella di configurazione'; $wb['awstats_data_dir_txt'] = 'awstats cartella dati'; $wb['awstats_pl_txt'] = 'awstats.pl script'; @@ -90,7 +90,7 @@ $wb['ufw_default_forward_policy_txt'] = 'Default Forward Policy'; $wb['ufw_default_application_policy_txt'] = 'Default Application Policy'; $wb['ufw_log_level_txt'] = 'Livello di Log'; $wb['website_symlinks_rel_txt'] = 'Make relative symlinks'; -$wb['network_config_warning_txt'] = 'L opzione di configurazione di rete è disponibile solo per Debian and Ubuntu Servers. Non abilitare se la tua interfaccia di rete non è eth0.'; +$wb['network_config_warning_txt'] = 'L\'opzione di configurazione di rete è disponibile solo per Debian and Ubuntu Servers. Non abilitare se la tua interfaccia di rete non è eth0.'; $wb['CA_path_txt'] = 'Percorso CA'; $wb['CA_pass_txt'] = 'CA passphrase'; $wb['fastcgi_config_syntax_txt'] = 'Sintassi configurazione FastCGI'; @@ -100,8 +100,8 @@ $wb['nginx_vhost_conf_enabled_dir_txt'] = 'Nginx Vhost config enabled dir'; $wb['nginx_user_txt'] = 'Utente Nginx'; $wb['nginx_group_txt'] = 'Gruppo Nginx'; $wb['nginx_cgi_socket_txt'] = 'Nginx CGI Socket'; -$wb['backup_dir_error_empty'] = 'Backup directory vuoto.'; -$wb['maildir_path_error_empty'] = 'Maildir Percorso vuoto.'; +$wb['backup_dir_error_empty'] = 'Backup directory vuoto.'; +$wb['maildir_path_error_empty'] = 'Maildir Percorso vuoto.'; $wb['homedir_path_error_empty'] = 'Homedir Percorso vuoto.'; $wb['mailuser_uid_error_empty'] = 'Mailuser UID vuoto.'; $wb['mailuser_gid_error_empty'] = 'Mailuser GID vuoto.'; @@ -113,8 +113,8 @@ $wb['website_path_error_empty'] = 'Percorso Sito Web vuoto.'; $wb['website_symlinks_error_empty'] = 'Website symlinks vuoto.'; $wb['vhost_conf_dir_error_empty'] = 'Vhost config dir vuoto.'; $wb['vhost_conf_enabled_dir_error_empty'] = 'Vhost config enabled dir vuoto.'; -$wb['nginx_vhost_conf_dir_error_empty'] = 'Nginx Vhost config dir vuoto.'; -$wb['nginx_vhost_conf_enabled_dir_error_empty'] = 'Nginx Vhost config enabled dir vuoto.'; +$wb['nginx_vhost_conf_dir_error_empty'] = 'Cartella di configurazione Vhost Nginx vuoto.'; +$wb['nginx_vhost_conf_enabled_dir_error_empty'] = 'Cartella di configurazione Vhost Nginx vuoto.'; $wb['apache_user_error_empty'] = 'Utente Apache vuoto.'; $wb['apache_group_error_empty'] = 'Gruppo Apache vuoto.'; $wb['nginx_user_error_empty'] = 'Utente Nginx vuoto.'; @@ -132,23 +132,23 @@ $wb['fastcgi_children_error_empty'] = 'FastCGI Children vuoto.'; $wb['fastcgi_max_requests_error_empty'] = 'FastCGI max. Requests vuoto.'; $wb['fastcgi_bin_error_empty'] = 'FastCGI Bin vuoto.'; $wb['jailkit_chroot_home_error_empty'] = 'Jailkit chroot home vuoto.'; -$wb['jailkit_chroot_app_sections_error_empty'] = 'Jailkit chroot app sections vuoto.'; -$wb['jailkit_chroot_app_programs_error_empty'] = 'Jailkit chrooted applications vuoto.'; +$wb['jailkit_chroot_app_sections_error_empty'] = 'Sezione app chroot Jailkit vuoto.'; +$wb['jailkit_chroot_app_programs_error_empty'] = 'Applicazioni chrooted Jailkit vuoto.'; $wb['jailkit_chroot_cron_programs_error_empty'] = 'Jailkit cron chrooted applications vuoto.'; -$wb['vlogger_config_dir_error_empty'] = 'Config directory vuoto.'; -$wb['cron_init_script_error_empty'] = 'Cron init script name vuoto.'; +$wb['vlogger_config_dir_error_empty'] = 'Cartella di configurazione vuoto.'; +$wb['cron_init_script_error_empty'] = 'nome script di avvio Cron vuoto.'; $wb['crontab_dir_error_empty'] = 'Percorso per crontabs individuali vuoto.'; -$wb['cron_wget_error_empty'] = 'Percorso al programma wget vuoto.'; -$wb['php_fpm_init_script_txt'] = 'PHP-FPM init script'; -$wb['php_fpm_init_script_error_empty'] = 'PHP-FPM init script vuoto.'; -$wb['php_fpm_ini_path_txt'] = 'PHP-FPM php.ini path'; -$wb['php_fpm_ini_path_error_empty'] = 'PHP-FPM php.ini path vuoto.'; +$wb['cron_wget_error_empty'] = 'Percorso al programma wget vuoto.'; +$wb['php_fpm_init_script_txt'] = 'script di avvio PHP-FPM'; +$wb['php_fpm_init_script_error_empty'] = 'script di avvio PHP-FPM vuoto.'; +$wb['php_fpm_ini_path_txt'] = 'Percorso PHP-FPM php.ini'; +$wb['php_fpm_ini_path_error_empty'] = 'Percorso PHP-FPM php.ini vuoto.'; $wb['php_fpm_pool_dir_txt'] = 'PHP-FPM pool directory'; -$wb['php_fpm_pool_dir_error_empty'] = 'PHP-FPM pool directory vuoto.'; +$wb['php_fpm_pool_dir_error_empty'] = 'PHP-FPM pool directory vuoto.'; $wb['php_fpm_start_port_txt'] = 'PHP-FPM start port'; -$wb['php_fpm_start_port_error_empty'] = 'PHP-FPM start port vuoto.'; +$wb['php_fpm_start_port_error_empty'] = 'PHP-FPM start port vuoto.'; $wb['php_fpm_socket_dir_txt'] = 'PHP-FPM socket directory'; -$wb['php_fpm_socket_dir_error_empty'] = 'PHP-FPM socket directory vuoto.'; +$wb['php_fpm_socket_dir_error_empty'] = 'PHP-FPM socket directory vuoto.'; $wb['try_rescue_txt'] = 'Abilita servizio di monitoraggio in caso di failure'; $wb['do_not_try_rescue_httpd_txt'] = 'Disabilita monitoraggio HTTPD'; $wb['do_not_try_rescue_mysql_txt'] = 'Disabilita monitoraggio MySQL'; @@ -156,18 +156,20 @@ $wb['do_not_try_rescue_mail_txt'] = 'Disabilita monitoraggio Email'; $wb['rescue_description_txt'] = '<b>Informazione:</b> Se desideri fermare MySQL devi selezionare la spunta per Disabilitare monitor MySQL ed attendere 2-3 minuti.<br>Se non attendi 2-3 minuti, il sistema tenterà di riavviare MySQL!'; $wb['enable_sni_txt'] = 'Abilita SNI'; $wb['set_folder_permissions_on_update_txt'] = 'Imposta permessi cartella ad aggiornamento'; -$wb['add_web_users_to_sshusers_group_txt'] = 'Aggiungi utente sito web a gruppo utenti -ssh-'; -$wb['connect_userid_to_webid_txt'] = 'Conllega userid Linux a webid'; +$wb['add_web_users_to_sshusers_group_txt'] = 'Aggiungi utente sito web a gruppo utenti -ssh-'; +$wb['connect_userid_to_webid_txt'] = 'Collega userid Linux a webid'; $wb['connect_userid_to_webid_start_txt'] = 'Avvia ID per collegamento userid/webid'; $wb['website_autoalias_txt'] = 'Sito Web auto alias'; -$wb['website_autoalias_note_txt'] = 'Placeholders:'; +$wb['website_autoalias_note_txt'] = 'Marcaposto:'; $wb['backup_mode_txt'] = 'Modalità di Backup'; $wb['backup_mode_userzip'] = 'Backup files siti web come utente web in formato zip'; $wb['backup_mode_rootgz'] = 'Backup di tutti i files nella cartella sito come utente root'; +$wb['backup_mode_borg_txt'] = 'BorgBackup: Backup all files in vhost directory and databases into incremental repositories'; +$wb['backup_missing_utils_txt'] = 'The following backup mode can not be used because the required tools are not installed:'; $wb['realtime_blackhole_list_txt'] = 'Lista Real-Time Blackhole'; $wb['realtime_blackhole_list_note_txt'] = '(Separare RBL con le virgole)'; -$wb['stress_adaptive_txt'] = 'Adapt to temporary load spikes'; -$wb['tooltip_stress_adaptive_txt'] = 'Enables Postfix stress-adaptive behavior.'; +$wb['stress_adaptive_txt'] = 'Adatta a momentanee punte di carico di lavoro'; +$wb['tooltip_stress_adaptive_txt'] = 'Abilita il comportamente adattivo allo stress di Postfix.'; $wb['ssl_settings_txt'] = 'Impostazioni SSL'; $wb['permissions_txt'] = 'Permessi'; $wb['php_settings_txt'] = 'Impostazioni PHP'; @@ -179,8 +181,10 @@ $wb['enable_ip_wildcard_txt'] = 'Abilita IP wildcard (*)'; $wb['web_folder_protection_txt'] = 'Imposta cartelle sito in moaniera non modificabile (attributi estesi)'; $wb['overtraffic_notify_admin_txt'] = 'Trasmetti notifiche superamento traffico ad admin'; $wb['overtraffic_notify_client_txt'] = 'Trasmetti notifiche superamento traffico al cliente'; -$wb['overtraffic_disable_web_txt'] = 'Disable websites that exceed traffic limit'; +$wb['overtraffic_disable_web_txt'] = 'Disabilita i siti web che eccedono il limiti di traffico'; $wb['rbl_error_regex'] = 'Per cortesia specificare nomi host RBL validi.'; +$wb['overquota_notify_threshold_txt'] = 'Quota warning usage level'; +$wb['overquota_notify_threshold_error'] = 'Quota warning usage level must be between 0-100%'; $wb['overquota_notify_admin_txt'] = 'Trasmetti allarmi quota ad admin'; $wb['overquota_notify_client_txt'] = 'Trasmetti allarmi quota al cliente'; $wb['overquota_notify_onok_txt'] = 'Trasmetti messaggio quota ok al cliente'; @@ -192,12 +196,12 @@ $wb['monit_url_txt'] = 'Monit URL'; $wb['monit_user_txt'] = 'Monit utente'; $wb['monit_password_txt'] = 'Monit Password'; $wb['monit_url_error_regex'] = 'Monit URL non valida'; -$wb['monit_url_note_txt'] = 'Placeholder:'; +$wb['monit_url_note_txt'] = 'Marcaposto:'; $wb['munin_url_txt'] = 'Munin URL'; $wb['munin_user_txt'] = 'Munin Utente'; $wb['munin_password_txt'] = 'Munin Password'; $wb['munin_url_error_regex'] = 'Munin URL non valida'; -$wb['munin_url_note_txt'] = 'Placeholder:'; +$wb['munin_url_note_txt'] = 'Marcaposto:'; $wb['backup_dir_is_mount_txt'] = 'La direttirice di Backup è un mount?'; $wb['monitor_system_updates_txt'] = 'Verifica aggiornamenti Linux'; $wb['hostname_error_regex'] = 'Nome Host non valido.'; @@ -216,115 +220,123 @@ $wb['website_symlinks_error_regex'] = 'website symlinks non valido.'; $wb['vhost_conf_dir_error_regex'] = 'Direttrice configurazione vhost non valida.'; $wb['vhost_conf_enabled_dir_error_regex'] = 'Direttirce abilitata per vhost conf non valida.'; $wb['nginx_vhost_conf_dir_error_regex'] = 'nginx config directory non valida.'; -$wb['nginx_vhost_conf_enabled_dir_error_regex'] = 'Invalid nginx conf enabled directory.'; -$wb['ca_path_error_regex'] = 'Invalid CA path.'; -$wb['invalid_nginx_user_txt'] = 'Invalid nginx user.'; -$wb['invalid_nginx_group_txt'] = 'Invalid nginx group.'; -$wb['php_ini_path_apache_error_regex'] = 'Invalid apache php.ini path.'; -$wb['php_ini_path_cgi_error_regex'] = 'Invalid cgi php.ini path.'; -$wb['php_fpm_init_script_error_regex'] = 'Invalid php-fpm init script.'; -$wb['php_fpm_ini_path_error_regex'] = 'Invalid php-fpm ini path.'; -$wb['php_fpm_pool_dir_error_regex'] = 'Invalid php-fpm pool directory.'; -$wb['php_fpm_socket_dir_error_regex'] = 'Invalid php-fpm socket directory.'; -$wb['php_open_basedir_error_regex'] = 'Invalid php open_basedir.'; -$wb['awstats_data_dir_empty'] = 'awstats data directory is empty'; -$wb['awstats_data_dir_error_regex'] = 'Invalid awstats data directory.'; -$wb['awstats_pl_empty'] = 'awstats.pl setting vuoto.'; -$wb['awstats_pl_error_regex'] = 'Invalid awstats.pl path.'; -$wb['awstats_buildstaticpages_pl_empty'] = 'awstats_buildstaticpages.pl is empty'; -$wb['awstats_buildstaticpages_pl_error_regex'] = 'Invalid awstats_buildstaticpages.pl path.'; -$wb['invalid_bind_user_txt'] = 'Invalid BIND user.'; -$wb['invalid_bind_group_txt'] = 'Invalid BIND group.'; -$wb['bind_zonefiles_dir_error_regex'] = 'Invalid BIND zonefiles directory.'; -$wb['named_conf_path_error_regex'] = 'Invalid named.conf path.'; -$wb['named_conf_local_path_error_regex'] = 'Invalid named.conf.local path.'; -$wb['fastcgi_starter_path_error_regex'] = 'Invalid fastcgi starter path.'; -$wb['fastcgi_starter_script_error_regex'] = 'Invalid fastcgi starter script.'; -$wb['fastcgi_alias_error_regex'] = 'Invalid fastcgi alias.'; -$wb['fastcgi_phpini_path_error_regex'] = 'Invalid fastcgi path.'; -$wb['fastcgi_bin_error_regex'] = 'Invalid fastcgi bin.'; -$wb['jailkit_chroot_home_error_regex'] = 'Invalid jaikit chroot home.'; -$wb['jailkit_chroot_app_sections_error_regex'] = 'Invalid jaikit chroot sections.'; -$wb['jailkit_chroot_app_programs_error_regex'] = 'Invalid jaikit chroot app programs.'; -$wb['jailkit_chroot_cron_programs_error_regex'] = 'Invalid jaikit chroot cron programs.'; -$wb['vlogger_config_dir_error_regex'] = 'Invalid vlogger config dir.'; -$wb['cron_init_script_error_regex'] = 'Invalid cron init script.'; -$wb['crontab_dir_error_regex'] = 'Invalid crontab directory.'; -$wb['cron_wget_error_regex'] = 'Invalid cron wget path.'; -$wb['network_filesystem_txt'] = 'Network Filesystem'; -$wb['maildir_format_txt'] = 'Maildir Format'; -$wb['dkim_path_txt'] = 'DKIM Path'; -$wb['mailbox_virtual_uidgid_maps_txt'] = 'Use Websites Linux uid for mailbox'; -$wb['mailbox_virtual_uidgid_maps_info_txt'] = 'only in single web and mail-server-setup'; -$wb['mailbox_virtual_uidgid_maps_error_nosingleserver'] = 'Uid cannot be mapped in multi-server-setup.'; -$wb['mailbox_virtual_uidgid_maps_error_nodovecot'] = 'Uid-mapping can only be used with dovecot.'; -$wb['mailbox_virtual_uidgid_maps_error_alreadyusers'] = 'Uid-mapping cannot be changed if there are already mail users.'; -$wb['reject_sender_login_mismatch_txt'] = 'Reject sender and login mismatch'; -$wb['reject_unknown_txt'] = 'Reject unknown hostnames'; -$wb['tooltip_reject_unknown_txt'] = 'Requires hostnames to pass DNS checks. Not checked for authenticated users.'; -$wb['reject_unknown_helo_txt'] = 'Reject unknown helo hostnames'; -$wb['reject_unknown_client_txt'] = 'Reject unknown client hostnames'; -$wb['reject_unknown_client_helo_txt'] = 'Reject unknown helo and client hostnames'; -$wb['do_not_try_rescue_mongodb_txt'] = 'Disable MongoDB monitoring'; -$wb['v6_prefix_txt'] = 'IPv6 Prefix'; -$wb['vhost_rewrite_v6_txt'] = 'Rewrite IPv6 on Mirror'; -$wb['v6_prefix_length'] = 'Prefix too long according to defined IPv6 '; -$wb['backup_dir_mount_cmd_txt'] = 'Mount command, if backup directory not mounted'; -$wb['backup_delete_txt'] = 'Delete backups on domain/website delete'; -$wb['overquota_db_notify_admin_txt'] = 'Send DB quota warnings to admin'; -$wb['overquota_db_notify_client_txt'] = 'Send DB quota warnings to client'; +$wb['nginx_vhost_conf_enabled_dir_error_regex'] = 'Cartella conf enabled di nginx non valida.'; +$wb['ca_path_error_regex'] = 'Invalido percorso a CA.'; +$wb['invalid_nginx_user_txt'] = 'Invalido utente nginx.'; +$wb['invalid_nginx_group_txt'] = 'Invalido gruppo nginx.'; +$wb['php_ini_path_apache_error_regex'] = 'Percorso apache php.ini non valido.'; +$wb['php_ini_path_cgi_error_regex'] = 'Percorso cgi php.ini non valido.'; +$wb['php_fpm_init_script_error_regex'] = 'Script php-fpm init non valido.'; +$wb['php_fpm_ini_path_error_regex'] = 'Percorso php-fpm ini non valido.'; +$wb['php_fpm_pool_dir_error_regex'] = 'Cartella php-fpm pool non valida.'; +$wb['php_fpm_socket_dir_error_regex'] = 'Cartella php-fpm socket non valida.'; +$wb['php_open_basedir_error_regex'] = 'php open_basedir non valido.'; +$wb['awstats_data_dir_empty'] = 'awstats: la cartella dati è vuota'; +$wb['awstats_data_dir_error_regex'] = 'Cartella dati awstats non valida.'; +$wb['awstats_pl_empty'] = 'awstats.pl impostazioni vuoto.'; +$wb['awstats_pl_error_regex'] = 'Percorso awstats.pl non valido.'; +$wb['awstats_buildstaticpages_pl_empty'] = 'awstats_buildstaticpages.pl è vuoto'; +$wb['awstats_buildstaticpages_pl_error_regex'] = 'Percorso awstats_buildstaticpages.pl non valido.'; +$wb['invalid_bind_user_txt'] = 'Utente BIND non valido.'; +$wb['invalid_bind_group_txt'] = 'Gruppo BIND non valido.'; +$wb['bind_zonefiles_dir_error_regex'] = 'Cartella zone BIND non valida.'; +$wb['named_conf_path_error_regex'] = 'Percorso named.conf non valido.'; +$wb['named_conf_local_path_error_regex'] = 'Percorso named.conf.local non valido.'; +$wb['fastcgi_starter_path_error_regex'] = 'Percorso starter fastcgi non valido.'; +$wb['fastcgi_starter_script_error_regex'] = 'Percorso script di avvioo fastcgi non valido.'; +$wb['fastcgi_alias_error_regex'] = 'Alias fastcgi non valido.'; +$wb['fastcgi_phpini_path_error_regex'] = 'Percorso fastcgi non valido.'; +$wb['fastcgi_bin_error_regex'] = 'Binario fastcgi non valido.'; +$wb['jailkit_chroot_home_error_regex'] = 'Cartella home jailkit chroot non valida.'; +$wb['jailkit_chroot_app_sections_error_regex'] = 'Sezione jailkit chroot non valida.'; +$wb['jailkit_chroot_app_programs_error_regex'] = 'Programma jailkit chroot app non valido.'; +$wb['jailkit_chroot_cron_programs_error_regex'] = 'Programma jailkit chroot cron non valido.'; +$wb['vlogger_config_dir_error_regex'] = 'Cartella di configurazione vlogger non valida.'; +$wb['cron_init_script_error_regex'] = 'Script di avvio cron non valido.'; +$wb['crontab_dir_error_regex'] = 'Cartella crontab non valida.'; +$wb['cron_wget_error_regex'] = 'Percorso cron wget non valido.'; +$wb['network_filesystem_txt'] = 'Filesystem di rete'; +$wb['maildir_format_txt'] = 'Formato Maildir'; +$wb['dkim_path_txt'] = 'Percorso DKIM'; +$wb['mailbox_virtual_uidgid_maps_txt'] = 'Usare uid dei siti Web per mailbox'; +$wb['mailbox_virtual_uidgid_maps_info_txt'] = 'Solo per setup di unico sito web e server mail'; +$wb['mailbox_virtual_uidgid_maps_error_nosingleserver'] = 'Uid non può essere usato per mappare multi-server-setup.'; +$wb['mailbox_virtual_uidgid_maps_error_nodovecot'] = 'La mappatura Uidpuò essere usata solo con dovecot.'; +$wb['mailbox_virtual_uidgid_maps_error_alreadyusers'] = 'La mappatura Uid non può essere cambiata se esistono già utenti mail.'; +$wb['reject_sender_login_mismatch_txt'] = 'RIfiuta se il mittente non soddisfa login'; +$wb['reject_unknown_txt'] = 'Rifiuta hostnames sconosciuti'; +$wb['tooltip_reject_unknown_txt'] = 'Richiedi che gli hostnames tsuperino il check del DNS. Check non eseguito per utenti autenticati.'; +$wb['reject_unknown_helo_txt'] = 'Rifiuta helo hostnames sconosciuti'; +$wb['reject_unknown_client_txt'] = 'Rifiuta client hostnames sconosciuti'; +$wb['reject_unknown_client_helo_txt'] = 'Rifiuta helo e client hostnames sconosciuti'; +$wb['do_not_try_rescue_mongodb_txt'] = 'Disabilita monitoring MongoDB'; +$wb['v6_prefix_txt'] = 'Prefisso IPv6'; +$wb['vhost_rewrite_v6_txt'] = 'Riscrivi IPv6 su Mirror'; +$wb['v6_prefix_length'] = 'Prefisso troppo lungo secondo le regole IPv6'; +$wb['backup_dir_mount_cmd_txt'] = 'Comanda mount se la directory di backup non è montata'; +$wb['backup_delete_txt'] = 'Cancellare i backup alla cancellazione dei domini/siti web'; +$wb['overquota_db_notify_admin_txt'] = 'Invia avviso di quota DB all\'amministratore'; +$wb['overquota_db_notify_client_txt'] = 'Invia avviso di quota DB al cliente'; $wb['php_handler_txt'] = 'Default PHP Handler'; $wb['php_fpm_default_chroot_txt'] = 'Default chrooted PHP-FPM'; -$wb['php_fpm_incron_reload_txt'] = 'Install incron trigger file to reload PHP-FPM'; -$wb['disabled_txt'] = 'Disabled'; -$wb['dkim_strength_txt'] = 'DKIM strength'; -$wb['php_ini_check_minutes_txt'] = 'Check php.ini every X minutes for changes'; -$wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; +$wb['php_fpm_incron_reload_txt'] = 'Installare trigger incron trigger per riavviare PHP-FPM'; +$wb['disabled_txt'] = 'Disabilitato'; +$wb['dkim_strength_txt'] = 'Affidabilità DKIM'; +$wb['php_ini_check_minutes_txt'] = 'Verifica php.ini ogni X minuti per canbiamenti'; +$wb['php_ini_check_minutes_error_empty'] = 'Indica quanto spesso deve essere verificato php.ini per cambiamenti.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Use IPv6'; -$wb['xmpp_bosh_max_inactivity_txt'] = 'Max. BOSH inactivity time'; -$wb['xmpp_bosh_timeout_range_wrong'] = 'Please enter a bosh timeout range between 15 - 360'; +$wb['xmpp_bosh_max_inactivity_txt'] = 'Max. BOSH tempo di inattività time'; +$wb['xmpp_bosh_timeout_range_wrong'] = 'Inserire un tempo di bosh compreso tra 15 - 360'; $wb['xmpp_module_saslauth'] = 'saslauth'; -$wb['xmpp_server_admins_txt'] = 'Server Admins (JIDs)'; -$wb['xmpp_modules_enabled_txt'] = 'Serverwide enabled plugins (one per line)'; -$wb['xmpp_ports_txt'] = 'Component ports'; +$wb['xmpp_server_admins_txt'] = 'Amministratori del Server (JIDs)'; +$wb['xmpp_modules_enabled_txt'] = 'plugins abilitati su tutti i server (uno per linea)'; +$wb['xmpp_ports_txt'] = 'Porte del componente'; $wb['xmpp_port_http_txt'] = 'HTTP'; $wb['xmpp_port_https_txt'] = 'HTTPS'; $wb['xmpp_port_pastebin_txt'] = 'Pastebin'; $wb['xmpp_port_bosh_txt'] = 'BOSH'; -$wb['disable_bind_log_txt'] = 'Disable bind9 messages for Loglevel WARN'; -$wb['apps_vhost_enabled_txt'] = 'Apps-vhost enabled'; -$wb['backup_time_txt'] = 'Backup time'; -$wb['skip_le_check_txt'] = 'Skip Lets Encrypt Check'; -$wb['migration_mode_txt'] = 'Server Migration Mode'; -$wb['nginx_enable_pagespeed_txt'] = 'Makes Pagespeed available'; -$wb['backup_tmp_txt'] = 'Backup tmp directory for zip'; -$wb['tmpdir_path_error_empty'] = 'tmp-dir Path is empty.'; -$wb['tmpdir_path_error_regex'] = 'Invalid tmp-dir path.'; -$wb['logging_txt'] = 'Store website access and error logs'; -$wb['logging_desc_txt'] = 'Use Tools > Resync to apply changes to existing sites. For Apache, access and error log can be anonymized. For nginx, only the access log is anonymized, the error log will contain IP addresses.'; -$wb['log_retention_txt'] = 'Log retention (days)'; -$wb['log_retention_error_ispositive'] = 'Log retention must be a number > 0'; -$wb['php_default_hide_txt'] = 'Hide Default PHP-Version in selectbox'; -$wb['php_default_name_txt'] = 'Description Default PHP-Version'; -$wb['php_default_name_error_empty'] = 'Description Default PHP-Version must not be empty'; -$wb['error_mailbox_message_size_txt'] = 'Mailbox size must be larger or equal to message size'; -$wb['php_fpm_reload_mode_txt'] = 'PHP-FPM reload mode'; -$wb['content_filter_txt'] = 'Content Filter'; +$wb['disable_bind_log_txt'] = 'Disabilita messaggi bind9 di tipologia WARN'; +$wb['apps_vhost_enabled_txt'] = 'Apps-vhost abilitato'; +$wb['backup_time_txt'] = 'Ora del backuo'; +$wb['skip_le_check_txt'] = 'Salta la verifica Let\'s Encrypt'; +$wb['migration_mode_txt'] = 'Modo migrazione delServer'; +$wb['nginx_enable_pagespeed_txt'] = 'Rendi Pagespeed disponibile'; +$wb['backup_tmp_txt'] = 'Cartella temporanea di backup per zip'; +$wb['tmpdir_path_error_empty'] = 'Percorso tmp-dir è vuoto.'; +$wb['tmpdir_path_error_regex'] = 'Percorso tmp-dir non valido.'; +$wb['logging_txt'] = 'Memorizza log di accessi ed errori dei sisti web'; +$wb['logging_desc_txt'] = 'Usare Strumenti > Risincronizza per applicare le modifiche ai siti web esistenti. Con Apache, i log di accesso ed errori possono essere resi anonimi. Con nginx, solo i log di accesso sono resi anonimi, i log di errore conterranno gli indirizzi IP.'; +$wb['log_retention_txt'] = 'Tempo di conservazione dei Log (giorni)'; +$wb['log_retention_error_ispositive'] = 'Il tempo di conservazione dei Log deve essere un numero > 0'; +$wb['php_default_hide_txt'] = 'Nasconi la versione default di PHP nel box di selezione'; +$wb['php_default_name_txt'] = 'Descrizione versione Default di PHP'; +$wb['php_default_name_error_empty'] = 'Descrizione versione Default di PHP non può essere vuota'; +$wb['error_mailbox_message_size_txt'] = 'La dimensione della casella di posta deve essere più grande della dimensione del messaggio'; +$wb['php_fpm_reload_mode_txt'] = 'Metodo di riavvio PHP-FPM'; +$wb['content_filter_txt'] = 'Filtro contenuti'; $wb['rspamd_url_txt'] = 'Rspamd URL'; $wb['rspamd_user_txt'] = 'Rspamd User'; $wb['rspamd_password_txt'] = 'Rspamd Password'; -$wb['vhost_proxy_protocol_enabled_txt'] = 'Enable PROXY Protocol'; -$wb['vhost_proxy_protocol_http_port_txt'] = 'PROXY Protocol HTTP Port'; -$wb['vhost_proxy_protocol_https_port_txt'] = 'PROXY Protocol HTTPS Port'; -$wb['jailkit_chroot_authorized_keys_template_txt'] = 'Jailkit authorized_keys template'; -$wb['jailkit_chroot_authorized_keys_template_error_regex'] = 'Invalid jaikit chroot authorized_keys template file.'; -$wb['jailkit_hardlinks_txt'] = 'Hardlinks within Jailkit chroot'; -$wb['tooltip_jailkit_hardlinks_txt'] = 'Using hardlinks is insecure, but saves disk space.'; -$wb['jailkit_hardlinks_allow_txt'] = 'Allow hardlinks within the jail'; -$wb['jailkit_hardlinks_no_txt'] = 'No, remove hardlinked files'; -$wb['jailkit_hardlinks_yes_txt'] = 'Yes, use hardlinks if possible'; +$wb['rspamd_redis_servers_txt'] = 'Redis Servers'; +$wb['tooltip_rspamd_redis_servers_txt'] = 'Redis server(s) che sarà usato da Rspamd. Esempio: \'127.0.0.1\', \'localhost:6379\' or \'/var/run/redis/redis-server.sock\'.'; +$wb['rspamd_redis_password_txt'] = 'Redis Password'; +$wb['tooltip_rspamd_redis_password_txt'] = 'Password per Redis Servers (lasciare vuoto se non usato).'; +$wb['rspamd_redis_bayes_servers_txt'] = 'Redis Servers per Bayes'; +$wb['tooltip_rspamd_redis_bayes_servers_txt'] = 'Redis server(s) che Rspamd userà per Bayes se differente (altrimenti lasciare vuoto). Esempio: \'localhost:6378\' or \'/var/run/redis-bayes/redis-server.sock\'.'; +$wb['rspamd_redis_bayes_password_txt'] = 'Redis Password per Bayes'; +$wb['tooltip_rspamd_redis_bayes_password_txt'] = 'Password per Bayes Redis Server (lasciare vuoto se non usato).'; +$wb['vhost_proxy_protocol_enabled_txt'] = 'Abilita protocollo PROXY'; +$wb['vhost_proxy_protocol_http_port_txt'] = 'Porta HHTP per il protocollo PROXY'; +$wb['vhost_proxy_protocol_https_port_txt'] = 'Porta HHTPS per il protocollo PROXY'; +$wb['jailkit_chroot_authorized_keys_template_txt'] = 'modello Jailkit authorized_keys'; +$wb['jailkit_chroot_authorized_keys_template_error_regex'] = 'modello file per jailkit chroot authorized_keys non valido.'; +$wb['jailkit_hardlinks_txt'] = 'Hardlinks per Jailkit chroot'; +$wb['tooltip_jailkit_hardlinks_txt'] = 'L\'uso di hardlinks è meno sicuro però riduce lo spazio disco.'; +$wb['jailkit_hardlinks_allow_txt'] = 'Consenti hardlinks all\'interno di jail'; +$wb['jailkit_hardlinks_no_txt'] = 'No, rimuovi i file con hardlink'; +$wb['jailkit_hardlinks_yes_txt'] = 'Si, usa hardlinks se possibile'; $wb['mailbox_soft_delete_txt'] = 'Mailbox soft delete'; $wb['mailbox_soft_delete_info_txt'] = 'by default cleaned up after 7 days.'; diff --git a/interface/web/admin/lib/lang/it_server_ip.lng b/interface/web/admin/lib/lang/it_server_ip.lng index 9850f2e38bd01dad3672029d27bcb5d0179388d3..42cecce91ad41bc51f2d77d7869409eab946d4c1 100644 --- a/interface/web/admin/lib/lang/it_server_ip.lng +++ b/interface/web/admin/lib/lang/it_server_ip.lng @@ -1,13 +1,13 @@ <?php -$wb['server_ip_edit_title'] = 'IP Adresses'; -$wb['server_ip_edit_desc'] = 'Form to edit system IP adresses'; +$wb['server_ip_edit_title'] = 'Indirizzi IP'; +$wb['server_ip_edit_desc'] = 'Modulo per editare gli indirizzi IP'; $wb['server_id_txt'] = 'Server'; $wb['ip_address_txt'] = 'Indirizzo IP'; $wb['virtualhost_txt'] = 'HTTP NameVirtualHost'; $wb['ip_error_wrong'] = 'Indirizzo IP non valido'; $wb['ip_error_unique'] = 'Indirizzo IP deve essere unico'; $wb['client_id_txt'] = 'Cliente'; -$wb['ip_type_txt'] = 'Type'; -$wb['virtualhost_port_txt'] = 'HTTP Ports'; +$wb['ip_type_txt'] = 'tipo'; +$wb['virtualhost_port_txt'] = 'Porte HTTP'; $wb['error_port_syntax'] = 'Caratteri non validi nel campo porta, per favore inserire solo valori separati da virgola. Esempio: 80,443'; ?> diff --git a/interface/web/admin/lib/lang/it_server_ip_list.lng b/interface/web/admin/lib/lang/it_server_ip_list.lng index b831408dc042c78735dc5719ff580ef246588ab6..97e19468bf165307cf46d1a0bc0801e910ab7a1e 100644 --- a/interface/web/admin/lib/lang/it_server_ip_list.lng +++ b/interface/web/admin/lib/lang/it_server_ip_list.lng @@ -5,6 +5,6 @@ $wb['ip_address_txt'] = 'Indirizzo IP'; $wb['add_new_record_txt'] = 'Aggiungi nuovo indirizzo IP'; $wb['client_id_txt'] = 'Cliente'; $wb['virtualhost_txt'] = 'HTTP Vhost'; -$wb['virtualhost_port_txt'] = 'HTTP Ports'; -$wb['ip_type_txt'] = 'Type'; +$wb['virtualhost_port_txt'] = 'Porte HTTP'; +$wb['ip_type_txt'] = 'Tipo'; ?> diff --git a/interface/web/admin/lib/lang/it_server_ip_map.lng b/interface/web/admin/lib/lang/it_server_ip_map.lng index f02bdafd848b900e9960346c10c6e927221b10f7..fff88acc12ba426fc5450204a69edbb8df0d77a6 100644 --- a/interface/web/admin/lib/lang/it_server_ip_map.lng +++ b/interface/web/admin/lib/lang/it_server_ip_map.lng @@ -1,14 +1,14 @@ <?php -$wb['server_ip_map_title'] = 'IPv4 Address mapping'; -$wb['server_ip_map_desc'] = 'Form to map IPv4-addresses for Web-Server'; +$wb['server_ip_map_title'] = 'Mappatura indirizzi IPv4'; +$wb['server_ip_map_desc'] = 'Modulo per mappare indirizzi IPv4 per i server Web'; $wb['server_id_txt'] = 'Rewrite on Server'; -$wb['source_txt'] = 'Source IP'; -$wb['destination_txt'] = 'Destination IP'; -$wb['active_txt'] = 'Active'; -$wb['ip_error_wrong'] = 'The Destination IP address is invalid'; -$wb['destination_ip_empty'] = 'The Destination IP is empty.'; -$wb['source_ip_empty'] = 'The Source IP is empty.'; -$wb['server_empty_error'] = 'The Server is empty.'; -$wb['duplicate_mapping_error'] = 'Mapping already exists.'; -$wb['ip_mapping_error'] = 'Source IP can not be an IP of the Rewrite-Server'; +$wb['source_txt'] = 'IP Sorgennte'; +$wb['destination_txt'] = 'IP Destinazione'; +$wb['active_txt'] = 'Attivo'; +$wb['ip_error_wrong'] = 'L\'indirizzo IP destinazione non è valido'; +$wb['destination_ip_empty'] = 'L\'indirizzo IP destinazione è vuoto.'; +$wb['source_ip_empty'] = 'L\'indirizzo IP sorgente èvuoto .'; +$wb['server_empty_error'] = 'Il Server è vuoto.'; +$wb['duplicate_mapping_error'] = 'La mappatura esiste già .'; +$wb['ip_mapping_error'] = 'l\'IP sorgente non può essere un Server rewrite.'; ?> diff --git a/interface/web/admin/lib/lang/it_server_ip_map_list.lng b/interface/web/admin/lib/lang/it_server_ip_map_list.lng index 1fedc10b2e2590cb4c252d9c0ff90eeaf565d68b..790975c33aa3423e72356c424e88ac5564dc08cd 100644 --- a/interface/web/admin/lib/lang/it_server_ip_map_list.lng +++ b/interface/web/admin/lib/lang/it_server_ip_map_list.lng @@ -1,7 +1,7 @@ <?php -$wb['list_head_txt'] = 'IP Mappings'; +$wb['list_head_txt'] = 'Mappatura IP'; $wb['server_id_txt'] = 'Server'; -$wb['source_ip_txt'] = 'Source IP'; -$wb['destination_ip_txt'] = 'Destination IP'; -$wb['active_txt'] = 'Active'; +$wb['source_ip_txt'] = 'Sorgente IP'; +$wb['destination_ip_txt'] = 'Destinazione IP'; +$wb['active_txt'] = 'Attivo'; ?> diff --git a/interface/web/admin/lib/lang/it_server_php.lng b/interface/web/admin/lib/lang/it_server_php.lng index d85b5cd7da2a6adb369442e1b08734a4e3880d3f..7569ba9b5215c7bbdb3ecfd5eab10c5a2b8e544f 100644 --- a/interface/web/admin/lib/lang/it_server_php.lng +++ b/interface/web/admin/lib/lang/it_server_php.lng @@ -1,20 +1,20 @@ <?php $wb['server_id_txt'] = 'Server'; $wb['client_id_txt'] = 'Cliente'; -$wb['name_txt'] = 'PHP Name'; +$wb['name_txt'] = 'PHP Nome'; $wb['Name'] = 'Nome'; -$wb['FastCGI Settings'] = 'FastCGI Settings'; -$wb['PHP-FPM Settings'] = 'PHP-FPM Settings'; -$wb['Additional PHP Versions'] = 'Additional PHP Versions'; -$wb['Form to edit additional PHP versions'] = 'Form to edit additional PHP versions'; -$wb['server_php_name_error_empty'] = 'The Name field must not be vuoto.'; -$wb['php_fastcgi_binary_txt'] = 'Percorso per PHP FastCGI binary'; -$wb['php_fastcgi_ini_dir_txt'] = 'Percorso per php.ini directory'; -$wb['php_fpm_init_script_txt'] = 'Percorso per PHP-FPM init script'; -$wb['php_fpm_ini_dir_txt'] = 'Percorso per php.ini directory'; -$wb['php_fpm_pool_dir_txt'] = 'Percorso per PHP-FPM pool directory'; +$wb['FastCGI Settings'] = 'Impostazioni FastCGI'; +$wb['PHP-FPM Settings'] = 'Impostazioni PHP-FPM'; +$wb['Additional PHP Versions'] = 'Versioni PHP aggiuntive'; +$wb['Form to edit additional PHP versions'] = 'Modulo per editare versioni aggiuntive PHP'; +$wb['server_php_name_error_empty'] = 'Il campo nome non può essere vuoto.'; +$wb['php_fastcgi_binary_txt'] = 'Percorso per PHP FastCGI binary'; +$wb['php_fastcgi_ini_dir_txt'] = 'Percorso per php.ini directory'; +$wb['php_fpm_init_script_txt'] = 'Percorso per PHP-FPM init script'; +$wb['php_fpm_ini_dir_txt'] = 'Percorso per php.ini directory'; +$wb['php_fpm_pool_dir_txt'] = 'Percorso per PHP-FPM pool directory'; $wb['php_fpm_socket_dir_txt'] = 'PHP-FPM socket directory'; -$wb['active_txt'] = 'Active'; -$wb['php_in_use_error'] = 'This PHP-Version is in use.'; -$wb['php_name_in_use_error'] = 'The name can not be changed.'; +$wb['active_txt'] = 'Attivo'; +$wb['php_in_use_error'] = 'Questa versione PHP è in uso.'; +$wb['php_name_in_use_error'] = 'Il nome non può essere cambiato.'; ?> diff --git a/interface/web/admin/lib/lang/it_software_package.lng b/interface/web/admin/lib/lang/it_software_package.lng new file mode 100644 index 0000000000000000000000000000000000000000..4125430c567a8b712d6356182400efa4bfede986 --- /dev/null +++ b/interface/web/admin/lib/lang/it_software_package.lng @@ -0,0 +1,6 @@ +<?php +$wb['package_title_txt'] = 'Titolo pacchetto'; +$wb['package_key_txt'] = 'Chiave del Pacchetto'; +$wb['Software Package'] = 'Pacchetto Software'; +$wb['Modify software package details'] = 'Modifica dettagli pacchetto software'; +?> diff --git a/interface/web/admin/lib/lang/it_software_package_install.lng b/interface/web/admin/lib/lang/it_software_package_install.lng new file mode 100644 index 0000000000000000000000000000000000000000..1e210d58940cd0a352afaf9ff1d0f81697b8540e --- /dev/null +++ b/interface/web/admin/lib/lang/it_software_package_install.lng @@ -0,0 +1,6 @@ +<?php +$wb['head_txt'] = 'Installa pacchetto software'; +$wb['install_key_txt'] = 'Inserisci chiave pacchetto'; +$wb['btn_save_txt'] = 'Avvia installazione'; +$wb['btn_cancel_txt'] = 'Annulla'; +?> diff --git a/interface/web/admin/lib/lang/it_software_package_list.lng b/interface/web/admin/lib/lang/it_software_package_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..5ab82417de404318600984e7ac4d732fcb130840 --- /dev/null +++ b/interface/web/admin/lib/lang/it_software_package_list.lng @@ -0,0 +1,13 @@ +<?php +$wb['list_head_txt'] = 'Pacchetti Software'; +$wb['installed_txt'] = 'Stato'; +$wb['package_title_txt'] = 'Pacchetto'; +$wb['package_description_txt'] = 'Descrizione'; +$wb['action_txt'] = 'Action'; +$wb['toolsarea_head_txt'] = 'Pacchetti'; +$wb['repoupdate_txt'] = 'Aggiorna elenco pacchetti'; +$wb['package_id_txt'] = 'local App-ID'; +$wb['no_packages_txt'] = 'Nessun pacchetto disponibile'; +$wb['edit_txt'] = 'Modifica'; +$wb['delete_txt'] = 'Elimina'; +?> diff --git a/interface/web/admin/lib/lang/it_software_repo.lng b/interface/web/admin/lib/lang/it_software_repo.lng new file mode 100644 index 0000000000000000000000000000000000000000..76b01826971d75f28c53c52dbbed40f3587a7fdd --- /dev/null +++ b/interface/web/admin/lib/lang/it_software_repo.lng @@ -0,0 +1,8 @@ +<?php +$wb['repo_name_txt'] = 'Repository'; +$wb['repo_url_txt'] = 'URL'; +$wb['repo_username_txt'] = 'Utente (facoltativo)'; +$wb['repo_password_txt'] = 'Password (facoltativa)'; +$wb['active_txt'] = 'Attivo'; +$wb['Software Repository which may contain addons or updates'] = 'Software Repository che può contenere aggiunte o aggiornamenti'; +?> diff --git a/interface/web/admin/lib/lang/it_software_repo_list.lng b/interface/web/admin/lib/lang/it_software_repo_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..be378f3ca8e32d75cf538e74d04631a7eb4e1bd7 --- /dev/null +++ b/interface/web/admin/lib/lang/it_software_repo_list.lng @@ -0,0 +1,6 @@ +<?php +$wb['list_head_txt'] = 'Repository'; +$wb['active_txt'] = 'Attivo'; +$wb['repo_name_txt'] = 'Repository'; +$wb['repo_url_txt'] = 'URL del Repository'; +?> diff --git a/interface/web/admin/lib/lang/it_software_update_list.lng b/interface/web/admin/lib/lang/it_software_update_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..cc264b84eccbc926ccc68ca4b553548ad9eaf764 --- /dev/null +++ b/interface/web/admin/lib/lang/it_software_update_list.lng @@ -0,0 +1,9 @@ +<?php +$wb['list_head_txt'] = 'Aggiornamento programmi'; +$wb['installed_txt'] = 'Azione'; +$wb['update_title_txt'] = 'Aggiornamento'; +$wb['version_txt'] = 'Versione'; +$wb['action_txt'] = 'Azione'; +$wb['server_select_txt'] = 'Selezionare server'; +$wb['no_updates_txt'] = 'Nessun aggiornamento disponibile'; +?> diff --git a/interface/web/admin/lib/lang/it_system_config.lng b/interface/web/admin/lib/lang/it_system_config.lng index ddfc072ff2653d987596d44d76ba9949ec0621a6..d58e1d1d22f481647a73175938358d02486c193b 100644 --- a/interface/web/admin/lib/lang/it_system_config.lng +++ b/interface/web/admin/lib/lang/it_system_config.lng @@ -6,103 +6,105 @@ $wb['dbname_prefix_txt'] = 'Prefisso nome database'; $wb['dbuser_prefix_txt'] = 'Prefisso utente database'; $wb['shelluser_prefix_txt'] = 'Prefisso utente Shell'; $wb['ftpuser_prefix_txt'] = 'Prefisso utente FTP'; -$wb['dbname_prefix_error_regex'] = 'Char not allowed in database name prefix.'; -$wb['dbuser_prefix_error_regex'] = 'Char not allowed in database user prefix.'; -$wb['ftpuser_prefix_error_regex'] = 'Char not allowed in ftp user prefix.'; -$wb['shelluser_prefix_error_regex'] = 'Char not allowed in shell user prefix.'; -$wb['dblist_phpmyadmin_link_txt'] = 'Link to phpmyadmin in DB list'; -$wb['mailboxlist_webmail_link_txt'] = 'Link to webmail in Mailbox list'; +$wb['dbname_prefix_error_regex'] = 'Carattere non consentito nel prefisso del nome database.'; +$wb['dbuser_prefix_error_regex'] = 'Carattere non consentito nel prefisso del nome utente database.'; +$wb['ftpuser_prefix_error_regex'] = 'Carattere non consentito nel prefisso del nome utente FTP.'; +$wb['shelluser_prefix_error_regex'] = 'Carattere non consentito nel prefisso del nome utente shell..'; +$wb['dblist_phpmyadmin_link_txt'] = 'Collegamento a phpmyadmin nella lista dei DB'; +$wb['mailboxlist_webmail_link_txt'] = 'Collegamento a webmail nella lista di Mailbox'; $wb['webmail_url_txt'] = 'Webmail URL'; $wb['phpmyadmin_url_txt'] = 'PHPMyAdmin URL'; -$wb['use_domain_module_txt'] = 'Use the domain-module to add new domains'; -$wb['use_domain_module_hint'] = 'If you use this module, your customers can only select one of the domains the admin creates for them. They can not free edit the domain-field.You have to re-login after changing this value, to make the changes visible.'; -$wb['new_domain_txt'] = 'HTML to create a new domain'; -$wb['webdavuser_prefix_txt'] = 'Webdav user prefix'; -$wb['webdavuser_prefix_error_regex'] = 'Char not allowed in webdav user prefix.'; +$wb['use_domain_module_txt'] = 'Usare il modulo Siti per aggiungere un Dominio'; +$wb['use_domain_module_hint'] = 'Se usi questo modulo, i tuoi clienti potranno solamente selezionare uno dei domini creati per loro. Non potranno cambiare a loro piacimento i campi del dominio. Devi disconnetterti e rifare il login dopo aver cambiato i dati affinchè questi siano visibili.'; +$wb['new_domain_txt'] = 'HTML per creare un nuovo dominio'; +$wb['webdavuser_prefix_txt'] = 'Prefisso utente webdav'; +$wb['webdavuser_prefix_error_regex'] = 'Carattere non consentito nel prefisso del nome utente webdav..'; $wb['webftp_url_txt'] = 'WebFTP URL'; $wb['dashboard_atom_url_admin_txt'] = 'Dashboard atom feed URL (admin)'; $wb['dashboard_atom_url_reseller_txt'] = 'Dashboard atom feed URL (reseller)'; $wb['dashboard_atom_url_client_txt'] = 'Dashboard atom feed URL (client)'; -$wb['enable_welcome_mail_txt'] = 'Enable welcome email'; -$wb['enable_custom_login_txt'] = 'Allow custom login name'; -$wb['mailmailinglist_link_txt'] = 'Link to mailing list in Mailing list list'; +$wb['enable_welcome_mail_txt'] = 'Abilita email di benvenuto'; +$wb['enable_custom_login_txt'] = 'Consenti login name personalizzati'; +$wb['mailmailinglist_link_txt'] = 'Collegamento alla mailing list in Mailing list list'; $wb['mailmailinglist_url_txt'] = 'Mailing list URL'; -$wb['admin_mail_txt'] = 'Administrators e-mail'; -$wb['admin_name_txt'] = 'Administrators name'; -$wb['maintenance_mode_txt'] = 'Maintenance Mode'; -$wb['maintenance_mode_exclude_ips_txt'] = 'Exclude IP\'s from maintenance'; -$wb['maintenance_mode_exclude_ips_error_isip'] = 'One or more invalid IP addresses in maintenance mode exclude list. Must be a list of comma-separated IPv4 and/or IPv6 addresses.'; -$wb['smtp_enabled_txt'] = 'Use SMTP to send system mails'; +$wb['admin_mail_txt'] = 'Email dell\'Amministratore'; +$wb['admin_name_txt'] = 'Nome dell\'Amministratore name'; +$wb['maintenance_mode_txt'] = 'Modo manutenzione'; +$wb['maintenance_mode_exclude_ips_txt'] = 'Escludere IP\'s per manutenzione'; +$wb['maintenance_mode_exclude_ips_error_isip'] = 'Uno o più indirizzi IP errati nella lista di esclusione per manutenzione. Deve essere una lista, separata da virgole, di indirizzi IPv4 e/o IPv6.'; +$wb['smtp_enabled_txt'] = 'Usare SMTP per inviare mail di sistema'; $wb['smtp_host_txt'] = 'SMTP host'; -$wb['smtp_port_txt'] = 'SMTP port'; -$wb['smtp_user_txt'] = 'SMTP user'; +$wb['smtp_port_txt'] = 'SMTP porta'; +$wb['smtp_user_txt'] = 'SMTP utente'; $wb['smtp_pass_txt'] = 'SMTP password'; -$wb['smtp_crypt_txt'] = 'Use SSL/TLS encrypted connection for SMTP'; -$wb['smtp_missing_admin_mail_txt'] = 'Please enter the admin name and admin mail address if you want to use smtp mail sending.'; -$wb['tab_change_discard_txt'] = 'Discard changes on tab change'; -$wb['tab_change_warning_txt'] = 'Tab change warning'; -$wb['tab_change_warning_note_txt'] = 'Show a warning on tab change in edit forms if any data has been altered by the user.'; -$wb['vhost_subdomains_txt'] = 'Crea Subdomains as web site'; -$wb['vhost_subdomains_note_txt'] = 'You cannot disable this as long as vhost subdomains exist in the system!'; -$wb['phpmyadmin_url_error_regex'] = 'Invalid phpmyadmin URL'; -$wb['use_combobox_txt'] = 'Use jQuery UI Combobox'; -$wb['use_loadindicator_txt'] = 'Use Load Indicator'; -$wb['f5_to_reload_js_txt'] = 'If you change this, you might have to press F5 to make the browser reload JavaScript libraries or empty your browser cache.'; -$wb['client_username_web_check_disabled_txt'] = 'Disable client username check for the word \'web\'.'; -$wb['show_per_domain_relay_options_txt'] = 'Show per domain relay options'; -$wb['mailbox_show_autoresponder_tab_txt'] = 'Show autoresponder tab in mail account details'; -$wb['mailbox_show_mail_filter_tab_txt'] = 'Show mail filter tab in mail account details'; -$wb['mailbox_show_custom_rules_tab_txt'] = 'Show custom mailfilter tab in mail account details'; -$wb['webmail_url_error_regex'] = 'Invalid webmail URL'; -$wb['phpmyadmin_url_note_txt'] = 'Placeholder:'; -$wb['webmail_url_note_txt'] = 'Placeholder:'; -$wb['available_dashlets_note_txt'] = 'Available Dashlets:'; -$wb['admin_dashlets_left_txt'] = 'Left Admin Dashlets'; -$wb['admin_dashlets_right_txt'] = 'Right Admin Dashlets'; -$wb['reseller_dashlets_left_txt'] = 'Left Reseller Dashlets'; -$wb['reseller_dashlets_right_txt'] = 'Right Reseller Dashlets'; -$wb['client_dashlets_left_txt'] = 'Left Client Dashlets'; -$wb['client_dashlets_right_txt'] = 'Right Client Dashlets'; -$wb['customer_no_template_txt'] = 'Customer No. template'; -$wb['customer_no_template_error_regex_txt'] = 'The customer No. template contains invalid characters'; -$wb['customer_no_start_txt'] = 'Customer No. start value'; -$wb['customer_no_counter_txt'] = 'Customer No. counter'; -$wb['session_timeout_txt'] = 'Session timeout (minutes)'; -$wb['session_allow_endless_txt'] = 'Enable \\"stay logged in\\"'; +$wb['smtp_crypt_txt'] = 'Usare connessione cifrata SSL/TLS per SMTP'; +$wb['smtp_missing_admin_mail_txt'] = 'Inserire nome amministratore e mail amministratore se vuoi usaresmtp per inviare mail.'; +$wb['tab_change_discard_txt'] = 'Trascura le modifiche al cambio di scheda'; +$wb['tab_change_warning_txt'] = 'Avviso di cambio scheda'; +$wb['tab_change_warning_note_txt'] = 'Mostra un avviso al cambio di scheda se qualche dato è stato cambiato nel modulo in uso.'; +$wb['vhost_subdomains_txt'] = 'Crea Sottodomini come siti web'; +$wb['vhost_subdomains_note_txt'] = 'Non puoi disabilitare questo fintanto che un sottodominio vhost esiste nel sistema!'; +$wb['phpmyadmin_url_error_regex'] = 'URL a phpmyadmin non valido'; +$wb['use_combobox_txt'] = 'Usare jQuery UI Combobox'; +$wb['use_loadindicator_txt'] = 'Usare Indicatore di carico'; +$wb['f5_to_reload_js_txt'] = 'Se cambi questo, dovrai premere F5 per costringere il browser a ricaricare le librerie JavaScript oppure devi svuotare la cache del browser.'; +$wb['client_username_web_check_disabled_txt'] = 'Disabilita la verifica del nome utente per la parola \'web\'.'; +$wb['show_per_domain_relay_options_txt'] = 'Mostra le opzioni di relay per il dominio'; +$wb['mailbox_show_autoresponder_tab_txt'] = 'Mostra la scheda autorisponditore nel profilo mail'; +$wb['mailbox_show_mail_filter_tab_txt'] = 'Mostra la scheda dei filtri mail nel profilo mail'; +$wb['mailbox_show_custom_rules_tab_txt'] = 'Mostra la scheda di filtri mail personalizzati nel profilo mail'; +$wb['webmail_url_error_regex'] = 'URL webmail non valido'; +$wb['phpmyadmin_url_note_txt'] = 'Segnaposto:'; +$wb['webmail_url_note_txt'] = 'Segnaposto:'; +$wb['available_dashlets_note_txt'] = 'Dashlets disponibili:'; +$wb['admin_dashlets_left_txt'] = 'Dashlets di sinistra per amministratore'; +$wb['admin_dashlets_right_txt'] = 'Dashlets di destra per amministratore'; +$wb['reseller_dashlets_left_txt'] = 'Dashlets di sinistra per rivenditore'; +$wb['reseller_dashlets_right_txt'] = 'Dashlets di destra per rivenditore'; +$wb['client_dashlets_left_txt'] = 'Dashlets di sinistra per Clienti'; +$wb['client_dashlets_right_txt'] = 'Dashlets di destra per Clienti'; +$wb['customer_no_template_txt'] = 'Modello per n° cliente'; +$wb['customer_no_template_error_regex_txt'] = 'Il templeate per il n° cliente contiene caratteri non validi'; +$wb['customer_no_start_txt'] = 'Valore iniziale del n° Cliente'; +$wb['customer_no_counter_txt'] = 'Contatore n° Clienti'; +$wb['session_timeout_txt'] = 'Timeout di sessione (minuti)'; +$wb['session_allow_endless_txt'] = 'Abilita \\"rimani collegato\\"'; $wb['No'] = 'No'; -$wb['min_password_length_txt'] = 'Minimum password length'; -$wb['min_password_strength_txt'] = 'Minimum password strength'; -$wb['ssh_authentication_txt'] = 'Allowed SSH authentication'; -$wb['ssh_authentication_password_key'] = 'Password & Key'; +$wb['min_password_length_txt'] = 'Lunghezza minima della password'; +$wb['min_password_strength_txt'] = 'Robustezza minima della password'; +$wb['ssh_authentication_txt'] = 'Autenticazione SSH consentita'; +$wb['ssh_authentication_password_key'] = 'Password & Chiave'; $wb['ssh_authentication_password'] = 'Password'; -$wb['ssh_authentication_key'] = 'Key'; -$wb['vhost_aliasdomains_txt'] = 'Create aliasdomains as web site'; -$wb['vhost_aliasdomains_note_txt'] = 'You cannot disable this as long as vhost aliasdomains exist in the system!'; -$wb['backups_include_into_web_quota_txt'] = 'Include backup files into web quota.'; +$wb['ssh_authentication_key'] = 'Chiave'; +$wb['vhost_aliasdomains_txt'] = 'Crea dominio alias come sito web'; +$wb['vhost_aliasdomains_note_txt'] = 'Non puoi disabilitare questo fintanto che un dominio alias vhost è presente nel sistema!'; +$wb['backups_include_into_web_quota_txt'] = 'Includere i file di backup nella quota web.'; $wb['default_mailserver_txt'] = 'Default Mailserver'; $wb['default_webserver_txt'] = 'Default Webserver'; $wb['default_dnsserver_txt'] = 'Default DNS Server'; $wb['default_slave_dnsserver_txt'] = 'Default Secondary DNS Server'; $wb['default_dbserver_txt'] = 'Default Database Server'; -$wb['company_name_txt'] = 'Company Name for the page title'; -$wb['reseller_can_use_options_txt'] = 'Reseller can use the option-tab for websites'; -$wb['custom_login_text_txt'] = 'Custom Text on Login-Page'; -$wb['custom_login_link_txt'] = 'Custom Link on Login-Page'; -$wb['login_link_error_regex'] = 'Invalid Link for Custom Login'; +$wb['company_name_txt'] = 'Nome azienda per il titolo della pagina'; +$wb['reseller_can_use_options_txt'] = 'Il Rivenditore può usare la scheda opzioni per i siti web'; +$wb['custom_login_text_txt'] = 'Text personalizzato nella pagina di login'; +$wb['custom_login_link_txt'] = 'Collegamento personalizzato nella pagina di login'; +$wb['login_link_error_regex'] = 'Collegamento per login personalizzato non valido'; $wb['default_remote_dbserver_txt'] = 'DB remoti predefiniti'; $wb['disable_client_remote_dbserver_txt'] = 'Disabilita la configurazione dei DB Remoti per i clienti'; -$wb['ca_name_txt'] = 'Name'; -$wb['ca_issue_txt'] = 'Issue'; -$wb['ca_wildcard_txt'] = 'Use Wildcard'; -$wb['ca_critical_txt'] = 'Strict Check'; +$wb['ca_name_txt'] = 'Nome'; +$wb['ca_issue_txt'] = 'Testo'; +$wb['ca_wildcard_txt'] = 'Usare Wildcard'; +$wb['ca_critical_txt'] = 'Verifica approfondita'; $wb['ca_iodef_txt'] = 'iodef'; -$wb['active_txt'] = 'Aktive'; -$wb['btn_save_txt'] = 'Save'; -$wb['btn_cancel_txt'] = 'Cancel'; +$wb['active_txt'] = 'Attivo'; +$wb['btn_save_txt'] = 'Salva'; +$wb['btn_cancel_txt'] = 'Annulla'; $wb['web_php_options_txt'] = 'PHP Handler (Apache only)'; -$wb['client_protection_txt'] = 'Client protection'; -$wb['show_support_messages_txt'] = 'Show message function in help module'; -$wb['show_aps_menu_txt'] = 'Show APS menu'; -$wb['show_aps_menu_note_txt'] = 'APS will be removed from the panel in the near future.'; +$wb['client_protection_txt'] = 'Protezione Cliente'; +$wb['show_support_messages_txt'] = 'Mostra la funzione messaggio nel modulo Help'; +$wb['show_aps_menu_txt'] = 'Mostra menu APS'; +$wb['show_aps_menu_note_txt'] = 'APS saranno rimosse dal pannello in un prossimo futuro.'; +$wb['show_aps_menu_note_url_txt'] = 'Clicca qui per maggiori informazioni.'; $wb['show_aps_menu_note_url_txt'] = 'Click here for more information.'; +$wb['dns_show_zoneexport_txt'] = 'Show zone export.'; ?> diff --git a/interface/web/admin/lib/lang/it_tpl_default_admin.lng b/interface/web/admin/lib/lang/it_tpl_default_admin.lng index 04d2bd959ac8d2e2f376f1bbd86d5b910e0ff5fe..ba9e1b41bb29b8cb70557021baadbf86b64867da 100644 --- a/interface/web/admin/lib/lang/it_tpl_default_admin.lng +++ b/interface/web/admin/lib/lang/it_tpl_default_admin.lng @@ -1,18 +1,18 @@ <?php -$wb['tpl_default_admin_head_txt'] = 'Global Default-Theme Settings'; +$wb['tpl_default_admin_head_txt'] = 'Impostazioni globali del tema default'; $wb['tpl_default_admin_desc_txt'] = ''; $wb['server_id_txt'] = 'Server'; $wb['client_id_txt'] = 'Cliente'; -$wb['name_txt'] = 'PHP Name'; +$wb['name_txt'] = 'Nome PHP'; $wb['Name'] = 'Nome'; -$wb['FastCGI Settings'] = 'FastCGI Settings'; -$wb['PHP-FPM Settings'] = 'PHP-FPM Settings'; -$wb['Additional PHP Versions'] = 'Additional PHP Versions'; -$wb['Form to edit additional PHP versions'] = 'Form to edit additional PHP versions'; -$wb['server_php_name_error_empty'] = 'The Name field must not be vuoto.'; -$wb['php_fastcgi_binary_txt'] = 'Percorso per PHP FastCGI binary'; -$wb['php_fastcgi_ini_dir_txt'] = 'Percorso per php.ini directory'; -$wb['php_fpm_init_script_txt'] = 'Percorso per PHP-FPM init script'; -$wb['php_fpm_ini_dir_txt'] = 'Percorso per php.ini directory'; -$wb['php_fpm_pool_dir_txt'] = 'Percorso per PHP-FPM pool directory'; +$wb['FastCGI Settings'] = 'Impostazioni FastCGI'; +$wb['PHP-FPM Settings'] = 'Impostazioni PHP-FPM'; +$wb['Additional PHP Versions'] = 'Versioni PHP aggiuntive'; +$wb['Form to edit additional PHP versions'] = 'Modulo per gestire le versioni addizionali di PHP'; +$wb['server_php_name_error_empty'] = 'Il campo nome non può essere vuoto.'; +$wb['php_fastcgi_binary_txt'] = 'Percorso per PHP FastCGI binary'; +$wb['php_fastcgi_ini_dir_txt'] = 'Percorso per php.ini directory'; +$wb['php_fpm_init_script_txt'] = 'Percorso per PHP-FPM init script'; +$wb['php_fpm_ini_dir_txt'] = 'Percorso per php.ini directory'; +$wb['php_fpm_pool_dir_txt'] = 'Percorso per PHP-FPM pool directory'; ?> diff --git a/interface/web/admin/lib/lang/it_users.lng b/interface/web/admin/lib/lang/it_users.lng index e657d2ae967e851954ed7778c1a89a4108d8d40a..2c5dbeda480b1c84f05caf7237c37e95edfda014 100644 --- a/interface/web/admin/lib/lang/it_users.lng +++ b/interface/web/admin/lib/lang/it_users.lng @@ -1,13 +1,13 @@ <?php -$wb['users_txt'] = 'Users'; +$wb['users_txt'] = 'Utenti'; $wb['username_txt'] = 'Nome utente'; $wb['username_err'] = 'Nome utente troppo lungo o avente caratteri non validi.'; $wb['username_empty'] = 'Nome utente mancante.'; $wb['username_unique'] = 'Nome utente già utilizzato.'; $wb['password_txt'] = 'Password'; -$wb['password_strength_txt'] = 'Solidità password'; +$wb['password_strength_txt'] = 'Robustezza password'; $wb['modules_txt'] = 'Modulo'; -$wb['startmodule_txt'] = 'Startmodule'; +$wb['startmodule_txt'] = 'Modulo di avvio'; $wb['app_theme_txt'] = 'Aspetto'; $wb['typ_txt'] = 'Tipo'; $wb['active_txt'] = 'Attiva'; @@ -25,13 +25,13 @@ $wb['telefon_txt'] = 'Telefono'; $wb['fax_txt'] = 'Fax'; $wb['groups_txt'] = 'Gruppi'; $wb['default_group_txt'] = 'Gruppo predefinito'; -$wb['startmodule_err'] = 'Start module is not within modules.'; +$wb['startmodule_err'] = 'Il modulo di avvio non è presente.'; $wb['generate_password_txt'] = 'Genera Password'; $wb['repeat_password_txt'] = 'Ripeti Password'; $wb['password_mismatch_txt'] = 'Le password non coincidono.'; $wb['password_match_txt'] = 'Le password coincidono.'; -$wb['username_error_collision'] = 'The username may not be web or web plus a number.\\"'; -$wb['client_not_admin_err'] = 'A user that belongs to a client can not be set to type: admin'; -$wb['lost_password_function_txt'] = 'Forgot password function is available'; -$wb['no_user_insert'] = 'CP-Users of type -user- get added and updated automatically when you add a client or reseller.'; +$wb['username_error_collision'] = 'Il nome utente non può essere web o web+un numero.\\"'; +$wb['client_not_admin_err'] = 'Un utente che appartiene ad un cliente non può essere del tipo: admin'; +$wb['lost_password_function_txt'] = 'La funzione password dimenticata è disponibile'; +$wb['no_user_insert'] = 'CP-Utente di tipo -utente- viene aggiunto automaticamente quando aggiungi un cliente o un rivenditore.'; ?> diff --git a/interface/web/admin/lib/lang/it_users_list.lng b/interface/web/admin/lib/lang/it_users_list.lng index decfe623aa4acd63a091c53e5d1e8392c98d8061..6d2acae1ec10793d7925d50574d1949a88c98c49 100644 --- a/interface/web/admin/lib/lang/it_users_list.lng +++ b/interface/web/admin/lib/lang/it_users_list.lng @@ -5,5 +5,5 @@ $wb['client_id_txt'] = 'Client ID'; $wb['active_txt'] = 'Attivo'; $wb['add_new_record_txt'] = 'Aggiungi un nuovo user'; $wb['warning_txt'] = '<b>ATTENZIONE:</b> non editare o modificare alcuna impostazione utente in questa schermata. Usare piuttosto le impostazioni Cliente/Rivenditore del modulo Clienti. Modificare Utenti o gruppi in questa schermata può provocare la perdita di dati.'; -$wb['groups_txt'] = 'Groups'; +$wb['groups_txt'] = 'Gruppi'; ?> diff --git a/interface/web/admin/lib/lang/ja_remote_action.lng b/interface/web/admin/lib/lang/ja_remote_action.lng index 3f8948e19f602408715f9554606f5478359bec9a..dfe56b616d5b3d18abd7eb9965b8c5602cb4354c 100644 --- a/interface/web/admin/lib/lang/ja_remote_action.lng +++ b/interface/web/admin/lib/lang/ja_remote_action.lng @@ -2,7 +2,7 @@ $wb['select_server_txt'] = 'Select Server'; $wb['btn_do_txt'] = 'Execute action'; $wb['do_osupdate_caption'] = 'Do OS-Update at remote server'; -$wb['do_osupdate_desc'] = 'This Action does a aptitude -y upgrade at your selected server.<br><br><strong>USE THIS AT YOUR OWN RISK!</strong>'; +$wb['do_osupdate_desc'] = 'This Action does a apt -y upgrade at your selected server.<br><br><strong>USE THIS AT YOUR OWN RISK!</strong>'; $wb['do_ispcupdate_caption'] = 'Do ISPConfig 3 - Update at remote server'; $wb['do_ispcupdate_desc'] = 'This action does a ISPConfig3 update at your selected server.<br><br><strong>USE THIS AT YOUR OWN RISK!</strong>'; $wb['action_scheduled'] = 'The action is scheduled for execution'; diff --git a/interface/web/admin/lib/lang/ja_server_config.lng b/interface/web/admin/lib/lang/ja_server_config.lng index 1cdf94786f97fb9b3b81cbab6dbbaf417a6751b9..4e9e216010c4dd46923e272a42a2d43f5f0b145c 100644 --- a/interface/web/admin/lib/lang/ja_server_config.lng +++ b/interface/web/admin/lib/lang/ja_server_config.lng @@ -176,6 +176,8 @@ $wb['website_autoalias_note_txt'] = 'Placeholders:'; $wb['backup_mode_txt'] = 'Backup mode'; $wb['backup_mode_userzip'] = 'Backup web files owned by web user as zip'; $wb['backup_mode_rootgz'] = 'Backup all files in web directory as root user'; +$wb['backup_mode_borg_txt'] = 'BorgBackup: Backup all files in vhost directory and databases into incremental repositories'; +$wb['backup_missing_utils_txt'] = 'The following backup mode can not be used because the required tools are not installed:'; $wb['realtime_blackhole_list_txt'] = 'Real-time Blackhole List'; $wb['realtime_blackhole_list_note_txt'] = '(Separate RBL\'s with commas)'; $wb['stress_adaptive_txt'] = 'Adapt to temporary load spikes'; @@ -193,6 +195,8 @@ $wb['overtraffic_notify_admin_txt'] = 'Send overtraffic notification to admin'; $wb['overtraffic_notify_client_txt'] = 'Send overtraffic notification to client'; $wb['overtraffic_disable_web_txt'] = 'Disable websites that exceed traffic limit'; $wb['rbl_error_regex'] = 'Please specify valid RBL hostnames.'; +$wb['overquota_notify_threshold_txt'] = 'Quota warning usage level'; +$wb['overquota_notify_threshold_error'] = 'Quota warning usage level must be between 0-100%'; $wb['overquota_notify_admin_txt'] = 'Send quota warnings to admin'; $wb['overquota_notify_client_txt'] = 'Send quota warnings to client'; $wb['overquota_notify_onok_txt'] = 'Send quota ok message to client'; @@ -273,6 +277,7 @@ $wb['disable_bind_log_txt'] = 'Disable bind9 messages for Loglevel WARN'; $wb['apps_vhost_enabled_txt'] = 'Apps-vhost enabled'; $wb['do_not_try_rescue_mongodb_txt'] = 'Disable MongoDB monitoring'; $wb['backup_dir_mount_cmd_txt'] = 'Mount command, if backup directory not mounted'; +$wb['overquota_db_notify_threshold_txt'] = 'DB quota warning usage level'; $wb['overquota_db_notify_admin_txt'] = 'Send DB quota warnings to admin'; $wb['overquota_db_notify_client_txt'] = 'Send DB quota warnings to client'; $wb['php_handler_txt'] = 'Default PHP Handler'; @@ -316,6 +321,14 @@ $wb['content_filter_txt'] = 'Content Filter'; $wb['rspamd_url_txt'] = 'Rspamd URL'; $wb['rspamd_user_txt'] = 'Rspamd User'; $wb['rspamd_password_txt'] = 'Rspamd Password'; +$wb['rspamd_redis_servers_txt'] = 'Redis Servers'; +$wb['tooltip_rspamd_redis_servers_txt'] = 'Redis server(s) which Rspamd will use. Eg. \'127.0.0.1\', \'localhost:6379\' or \'/var/run/redis/redis-server.sock\'.'; +$wb['rspamd_redis_password_txt'] = 'Redis Password'; +$wb['tooltip_rspamd_redis_password_txt'] = 'Password for Redis Servers (leave blank if unused).'; +$wb['rspamd_redis_bayes_servers_txt'] = 'Redis Servers for Bayes'; +$wb['tooltip_rspamd_redis_bayes_servers_txt'] = 'Redis server(s) which Rspamd will use for Bayes if different (otherwise leave blank). Eg. \'localhost:6378\' or \'/var/run/redis-bayes/redis-server.sock\'.'; +$wb['rspamd_redis_bayes_password_txt'] = 'Redis Password for Bayes'; +$wb['tooltip_rspamd_redis_bayes_password_txt'] = 'Password for Bayes Redis Server (leave blank if unused).'; $wb['vhost_proxy_protocol_enabled_txt'] = 'Enable PROXY Protocol'; $wb['vhost_proxy_protocol_http_port_txt'] = 'PROXY Protocol HTTP Port'; $wb['vhost_proxy_protocol_https_port_txt'] = 'PROXY Protocol HTTPS Port'; diff --git a/interface/web/admin/lib/lang/ja_system_config.lng b/interface/web/admin/lib/lang/ja_system_config.lng index 8ff20d13cade7b51fdf9d77603fe15f7e4a9c635..b5601ea8009d3c3032dfb493b0de4c9b95466f1b 100644 --- a/interface/web/admin/lib/lang/ja_system_config.lng +++ b/interface/web/admin/lib/lang/ja_system_config.lng @@ -105,4 +105,5 @@ $wb['show_support_messages_txt'] = 'Show message function in help module'; $wb['show_aps_menu_txt'] = 'Show APS menu'; $wb['show_aps_menu_note_txt'] = 'APS will be removed from the panel in the near future.'; $wb['show_aps_menu_note_url_txt'] = 'Click here for more information.'; +$wb['dns_show_zoneexport_txt'] = 'Show zone export.'; ?> diff --git a/interface/web/admin/lib/lang/nl_remote_action.lng b/interface/web/admin/lib/lang/nl_remote_action.lng index 6f1521152f65b993d7a1344369c19c72c5470701..146bbc6bfb7b89afeae5f0bd836b447697cb327d 100644 --- a/interface/web/admin/lib/lang/nl_remote_action.lng +++ b/interface/web/admin/lib/lang/nl_remote_action.lng @@ -2,7 +2,7 @@ $wb['select_server_txt'] = 'Seleceert server'; $wb['btn_do_txt'] = 'Actie uitvoeren'; $wb['do_osupdate_caption'] = 'Voer een OS-update uit op de remote server'; -$wb['do_osupdate_desc'] = 'Deze actie voert een aptitude -y upgrade uit op de door u geselecteerde server.<br><br><strong>GEBRUIK OP EIGEN RISICO!</strong>'; +$wb['do_osupdate_desc'] = 'Deze actie voert een apt -y upgrade uit op de door u geselecteerde server.<br><br><strong>GEBRUIK OP EIGEN RISICO!</strong>'; $wb['do_ispcupdate_caption'] = 'Voer een ISPConfig 3 - update uit op de remote server'; $wb['do_ispcupdate_desc'] = 'Deze actie voert een ISPConfig3 update uit op de soor u geselecteerde server.<br><br><strong>GEBRUIK OP EIGEN RISICO!</strong>'; $wb['action_scheduled'] = 'Deze actie is ingepland om uitgevoerd te worden'; diff --git a/interface/web/admin/lib/lang/nl_server_config.lng b/interface/web/admin/lib/lang/nl_server_config.lng index d940980fb2f21b7dd1cbafc487708b97630e66e9..e0ce415853d18a9dd12b688e828f71feca2280d9 100644 --- a/interface/web/admin/lib/lang/nl_server_config.lng +++ b/interface/web/admin/lib/lang/nl_server_config.lng @@ -176,6 +176,8 @@ $wb['website_autoalias_note_txt'] = 'Placeholders:'; $wb['backup_mode_txt'] = 'Backup mode'; $wb['backup_mode_userzip'] = 'Backup web files owned by web user as zip'; $wb['backup_mode_rootgz'] = 'Backup all files in web directory as root user'; +$wb['backup_mode_borg_txt'] = 'BorgBackup: Backup all files in vhost directory and databases into incremental repositories'; +$wb['backup_missing_utils_txt'] = 'The following backup mode can not be used because the required tools are not installed:'; $wb['realtime_blackhole_list_txt'] = 'Real-time Blackhole List'; $wb['realtime_blackhole_list_note_txt'] = '(Separate RBL\'s with commas)'; $wb['stress_adaptive_txt'] = 'Adapt to temporary load spikes'; @@ -193,6 +195,8 @@ $wb['overtraffic_notify_admin_txt'] = 'Send overtraffic notification to admin'; $wb['overtraffic_notify_client_txt'] = 'Send overtraffic notification to client'; $wb['overtraffic_disable_web_txt'] = 'Disable websites that exceed traffic limit'; $wb['rbl_error_regex'] = 'Please specify valid RBL hostnames.'; +$wb['overquota_notify_threshold_txt'] = 'Quota warning usage level'; +$wb['overquota_notify_threshold_error'] = 'Quota warning usage level must be between 0-100%'; $wb['overquota_notify_admin_txt'] = 'Send quota warnings to admin'; $wb['overquota_notify_client_txt'] = 'Send quota warnings to client'; $wb['overquota_notify_onok_txt'] = 'Send quota ok message to client'; @@ -273,6 +277,7 @@ $wb['disable_bind_log_txt'] = 'Disable bind9 messages for Loglevel WARN'; $wb['apps_vhost_enabled_txt'] = 'Apps-vhost enabled'; $wb['do_not_try_rescue_mongodb_txt'] = 'Disable MongoDB monitoring'; $wb['backup_dir_mount_cmd_txt'] = 'Mount command, if backup directory not mounted'; +$wb['overquota_db_notify_threshold_txt'] = 'DB quota warning usage level'; $wb['overquota_db_notify_admin_txt'] = 'Send DB quota warnings to admin'; $wb['overquota_db_notify_client_txt'] = 'Send DB quota warnings to client'; $wb['php_handler_txt'] = 'Default PHP Handler'; @@ -316,6 +321,14 @@ $wb['content_filter_txt'] = 'Content Filter'; $wb['rspamd_url_txt'] = 'Rspamd URL'; $wb['rspamd_user_txt'] = 'Rspamd User'; $wb['rspamd_password_txt'] = 'Rspamd Password'; +$wb['rspamd_redis_servers_txt'] = 'Redis Servers'; +$wb['tooltip_rspamd_redis_servers_txt'] = 'Redis server(s) which Rspamd will use. Eg. \'127.0.0.1\', \'localhost:6379\' or \'/var/run/redis/redis-server.sock\'.'; +$wb['rspamd_redis_password_txt'] = 'Redis Password'; +$wb['tooltip_rspamd_redis_password_txt'] = 'Password for Redis Servers (leave blank if unused).'; +$wb['rspamd_redis_bayes_servers_txt'] = 'Redis Servers for Bayes'; +$wb['tooltip_rspamd_redis_bayes_servers_txt'] = 'Redis server(s) which Rspamd will use for Bayes if different (otherwise leave blank). Eg. \'localhost:6378\' or \'/var/run/redis-bayes/redis-server.sock\'.'; +$wb['rspamd_redis_bayes_password_txt'] = 'Redis Password for Bayes'; +$wb['tooltip_rspamd_redis_bayes_password_txt'] = 'Password for Bayes Redis Server (leave blank if unused).'; $wb['vhost_proxy_protocol_enabled_txt'] = 'Enable PROXY Protocol'; $wb['vhost_proxy_protocol_http_port_txt'] = 'PROXY Protocol HTTP Port'; $wb['vhost_proxy_protocol_https_port_txt'] = 'PROXY Protocol HTTPS Port'; diff --git a/interface/web/admin/lib/lang/nl_system_config.lng b/interface/web/admin/lib/lang/nl_system_config.lng index 0caa9228e08fda0e5dbb84ce29a66704ba2a9e1d..107c42395ecf2420d7f2f3f0a00a9e30cc96b033 100644 --- a/interface/web/admin/lib/lang/nl_system_config.lng +++ b/interface/web/admin/lib/lang/nl_system_config.lng @@ -105,4 +105,5 @@ $wb['show_support_messages_txt'] = 'Show message function in help module'; $wb['show_aps_menu_txt'] = 'Show APS menu'; $wb['show_aps_menu_note_txt'] = 'APS will be removed from the panel in the near future.'; $wb['show_aps_menu_note_url_txt'] = 'Click here for more information.'; +$wb['dns_show_zoneexport_txt'] = 'Show zone export.'; ?> diff --git a/interface/web/admin/lib/lang/pl_remote_action.lng b/interface/web/admin/lib/lang/pl_remote_action.lng index 67a819febba341362353e1d375255b698b4b3a06..884b2047d54293e9aae795e8c5737567c7022d54 100644 --- a/interface/web/admin/lib/lang/pl_remote_action.lng +++ b/interface/web/admin/lib/lang/pl_remote_action.lng @@ -2,7 +2,7 @@ $wb['select_server_txt'] = 'Wybierz serwer'; $wb['btn_do_txt'] = 'Uruchom akcjÄ™'; $wb['do_osupdate_caption'] = 'Wykonaj zdalnÄ… aktualizacjÄ™ systemu na serwerze'; -$wb['do_osupdate_desc'] = 'Ta akcja wykona polecenie <b>aptitude -y upgrade</b> na wybranym serwerze.<br><br><strong>UÅ»YWASZ JEJ NA WÅASNÄ„ ODPOWIEDZIALNOŚĆ!</strong>'; +$wb['do_osupdate_desc'] = 'Ta akcja wykona polecenie <b>apt -y upgrade</b> na wybranym serwerze.<br><br><strong>UÅ»YWASZ JEJ NA WÅASNÄ„ ODPOWIEDZIALNOŚĆ!</strong>'; $wb['do_ispcupdate_caption'] = 'Wykonaj zdalnÄ… aktualizacjÄ™ ISPConfig 3 na serwerze'; $wb['do_ispcupdate_desc'] = 'Ta akcja przeprowadzi aktualizacjÄ™ ISPConfig3 na wybranym serwerze.<br><br><strong>UÅ»YWASZ JEJ NA WÅASNÄ„ ODPOWIEDZIALNOŚĆ!</strong>'; $wb['action_scheduled'] = 'Akcja zaplanowana do wykonania'; diff --git a/interface/web/admin/lib/lang/pl_server_config.lng b/interface/web/admin/lib/lang/pl_server_config.lng index d72bfc0102007ddfa38a6757603cf7c5fe2eb3d7..f3d3b0235a75cef480b96d3797304f640f077ae7 100644 --- a/interface/web/admin/lib/lang/pl_server_config.lng +++ b/interface/web/admin/lib/lang/pl_server_config.lng @@ -176,6 +176,8 @@ $wb['website_autoalias_note_txt'] = 'Placeholders:'; $wb['backup_mode_txt'] = 'Tryb tworzenia kopii'; $wb['backup_mode_userzip'] = 'Pliki kopii z prawami użytkownika jako zip'; $wb['backup_mode_rootgz'] = 'Twórz kopie wszystkich plików w katalogu web jako root'; +$wb['backup_mode_borg_txt'] = 'BorgBackup: Twórz kopiÄ™ wszystkich plików z katalogu vhost i baz danych w repozytoriach przyrostowych'; +$wb['backup_missing_utils_txt'] = 'Nie można użyć nastÄ™pujÄ…cego trybu kopii zapasowej, ponieważ wymagane narzÄ™dzia nie sÄ… zainstalowane:'; $wb['realtime_blackhole_list_txt'] = 'Real-time Blackhole List'; $wb['realtime_blackhole_list_note_txt'] = '(oddziel RBL-e przecinkami)'; $wb['stress_adaptive_txt'] = 'Adapt to temporary load spikes'; @@ -193,6 +195,8 @@ $wb['overtraffic_notify_admin_txt'] = 'PrzeÅ›lij informacje o przekroczeniu tran $wb['overtraffic_notify_client_txt'] = 'PrzeÅ›lij informacje o przekroczeniu transferu do klienta'; $wb['overtraffic_disable_web_txt'] = 'Disable websites that exceed traffic limit'; $wb['rbl_error_regex'] = 'Please specify valid RBL hostnames.'; +$wb['overquota_notify_threshold_txt'] = 'Quota warning usage level'; +$wb['overquota_notify_threshold_error'] = 'Quota warning usage level must be between 0-100%'; $wb['overquota_notify_admin_txt'] = 'Send quota warnings to admin'; $wb['overquota_notify_client_txt'] = 'Send quota warnings to client'; $wb['overquota_notify_onok_txt'] = 'Send quota ok message to client'; @@ -273,6 +277,7 @@ $wb['disable_bind_log_txt'] = 'Disable bind9 messages for Loglevel WARN'; $wb['apps_vhost_enabled_txt'] = 'Apps-vhost enabled'; $wb['do_not_try_rescue_mongodb_txt'] = 'Disable MongoDB monitoring'; $wb['backup_dir_mount_cmd_txt'] = 'Mount command, if backup directory not mounted'; +$wb['overquota_db_notify_threshold_txt'] = 'DB quota warning usage level'; $wb['overquota_db_notify_admin_txt'] = 'Send DB quota warnings to admin'; $wb['overquota_db_notify_client_txt'] = 'Send DB quota warnings to client'; $wb['php_handler_txt'] = 'Default PHP Handler'; @@ -316,6 +321,14 @@ $wb['content_filter_txt'] = 'Content Filter'; $wb['rspamd_url_txt'] = 'Rspamd URL'; $wb['rspamd_user_txt'] = 'Rspamd User'; $wb['rspamd_password_txt'] = 'Rspamd Password'; +$wb['rspamd_redis_servers_txt'] = 'Redis Servers'; +$wb['tooltip_rspamd_redis_servers_txt'] = 'Redis server(s) which Rspamd will use. Eg. \'127.0.0.1\', \'localhost:6379\' or \'/var/run/redis/redis-server.sock\'.'; +$wb['rspamd_redis_password_txt'] = 'Redis Password'; +$wb['tooltip_rspamd_redis_password_txt'] = 'Password for Redis Servers (leave blank if unused).'; +$wb['rspamd_redis_bayes_servers_txt'] = 'Redis Servers for Bayes'; +$wb['tooltip_rspamd_redis_bayes_servers_txt'] = 'Redis server(s) which Rspamd will use for Bayes if different (otherwise leave blank). Eg. \'localhost:6378\' or \'/var/run/redis-bayes/redis-server.sock\'.'; +$wb['rspamd_redis_bayes_password_txt'] = 'Redis Password for Bayes'; +$wb['tooltip_rspamd_redis_bayes_password_txt'] = 'Password for Bayes Redis Server (leave blank if unused).'; $wb['vhost_proxy_protocol_enabled_txt'] = 'Enable PROXY Protocol'; $wb['vhost_proxy_protocol_http_port_txt'] = 'PROXY Protocol HTTP Port'; $wb['vhost_proxy_protocol_https_port_txt'] = 'PROXY Protocol HTTPS Port'; diff --git a/interface/web/admin/lib/lang/pl_system_config.lng b/interface/web/admin/lib/lang/pl_system_config.lng index 92b167c60d8c60ba4f19082d4c49a21da2b3a085..1bb20987655cb6a7e836797904aa0258b4285c35 100644 --- a/interface/web/admin/lib/lang/pl_system_config.lng +++ b/interface/web/admin/lib/lang/pl_system_config.lng @@ -105,4 +105,5 @@ $wb['show_support_messages_txt'] = 'Show message function in help module'; $wb['show_aps_menu_txt'] = 'Show APS menu'; $wb['show_aps_menu_note_txt'] = 'APS will be removed from the panel in the near future.'; $wb['show_aps_menu_note_url_txt'] = 'Click here for more information.'; +$wb['dns_show_zoneexport_txt'] = 'Show zone export.'; ?> diff --git a/interface/web/admin/lib/lang/pt_remote_action.lng b/interface/web/admin/lib/lang/pt_remote_action.lng index 3f8948e19f602408715f9554606f5478359bec9a..dfe56b616d5b3d18abd7eb9965b8c5602cb4354c 100644 --- a/interface/web/admin/lib/lang/pt_remote_action.lng +++ b/interface/web/admin/lib/lang/pt_remote_action.lng @@ -2,7 +2,7 @@ $wb['select_server_txt'] = 'Select Server'; $wb['btn_do_txt'] = 'Execute action'; $wb['do_osupdate_caption'] = 'Do OS-Update at remote server'; -$wb['do_osupdate_desc'] = 'This Action does a aptitude -y upgrade at your selected server.<br><br><strong>USE THIS AT YOUR OWN RISK!</strong>'; +$wb['do_osupdate_desc'] = 'This Action does a apt -y upgrade at your selected server.<br><br><strong>USE THIS AT YOUR OWN RISK!</strong>'; $wb['do_ispcupdate_caption'] = 'Do ISPConfig 3 - Update at remote server'; $wb['do_ispcupdate_desc'] = 'This action does a ISPConfig3 update at your selected server.<br><br><strong>USE THIS AT YOUR OWN RISK!</strong>'; $wb['action_scheduled'] = 'The action is scheduled for execution'; diff --git a/interface/web/admin/lib/lang/pt_server_config.lng b/interface/web/admin/lib/lang/pt_server_config.lng index 00fa9ec0dd893be2a25d35f0f0aa72c5902b6a12..e6fd1d4540944ab860a458af11d0bb26e79a2665 100644 --- a/interface/web/admin/lib/lang/pt_server_config.lng +++ b/interface/web/admin/lib/lang/pt_server_config.lng @@ -176,6 +176,8 @@ $wb['website_autoalias_note_txt'] = 'Placeholders:'; $wb['backup_mode_txt'] = 'Backup mode'; $wb['backup_mode_userzip'] = 'Backup web files owned by web user as zip'; $wb['backup_mode_rootgz'] = 'Backup all files in web directory as root user'; +$wb['backup_mode_borg_txt'] = 'BorgBackup: Backup all files in vhost directory and databases into incremental repositories'; +$wb['backup_missing_utils_txt'] = 'The following backup mode can not be used because the required tools are not installed:'; $wb['realtime_blackhole_list_txt'] = 'Real-time Blackhole List'; $wb['realtime_blackhole_list_note_txt'] = '(Separate RBL\'s with commas)'; $wb['stress_adaptive_txt'] = 'Adapt to temporary load spikes'; @@ -193,6 +195,8 @@ $wb['overtraffic_notify_admin_txt'] = 'Send overtraffic notification to admin'; $wb['overtraffic_notify_client_txt'] = 'Send overtraffic notification to client'; $wb['overtraffic_disable_web_txt'] = 'Disable websites that exceed traffic limit'; $wb['rbl_error_regex'] = 'Please specify valid RBL hostnames.'; +$wb['overquota_notify_threshold_txt'] = 'Quota warning usage level'; +$wb['overquota_notify_threshold_error'] = 'Quota warning usage level must be between 0-100%'; $wb['overquota_notify_admin_txt'] = 'Send quota warnings to admin'; $wb['overquota_notify_client_txt'] = 'Send quota warnings to client'; $wb['overquota_notify_onok_txt'] = 'Send quota ok message to client'; @@ -273,6 +277,7 @@ $wb['disable_bind_log_txt'] = 'Disable bind9 messages for Loglevel WARN'; $wb['apps_vhost_enabled_txt'] = 'Apps-vhost enabled'; $wb['do_not_try_rescue_mongodb_txt'] = 'Disable MongoDB monitoring'; $wb['backup_dir_mount_cmd_txt'] = 'Mount command, if backup directory not mounted'; +$wb['overquota_db_notify_threshold_txt'] = 'DB quota warning usage level'; $wb['overquota_db_notify_admin_txt'] = 'Send DB quota warnings to admin'; $wb['overquota_db_notify_client_txt'] = 'Send DB quota warnings to client'; $wb['php_handler_txt'] = 'Default PHP Handler'; @@ -316,6 +321,14 @@ $wb['content_filter_txt'] = 'Content Filter'; $wb['rspamd_url_txt'] = 'Rspamd URL'; $wb['rspamd_user_txt'] = 'Rspamd User'; $wb['rspamd_password_txt'] = 'Rspamd Password'; +$wb['rspamd_redis_servers_txt'] = 'Redis Servers'; +$wb['tooltip_rspamd_redis_servers_txt'] = 'Redis server(s) which Rspamd will use. Eg. \'127.0.0.1\', \'localhost:6379\' or \'/var/run/redis/redis-server.sock\'.'; +$wb['rspamd_redis_password_txt'] = 'Redis Password'; +$wb['tooltip_rspamd_redis_password_txt'] = 'Password for Redis Servers (leave blank if unused).'; +$wb['rspamd_redis_bayes_servers_txt'] = 'Redis Servers for Bayes'; +$wb['tooltip_rspamd_redis_bayes_servers_txt'] = 'Redis server(s) which Rspamd will use for Bayes if different (otherwise leave blank). Eg. \'localhost:6378\' or \'/var/run/redis-bayes/redis-server.sock\'.'; +$wb['rspamd_redis_bayes_password_txt'] = 'Redis Password for Bayes'; +$wb['tooltip_rspamd_redis_bayes_password_txt'] = 'Password for Bayes Redis Server (leave blank if unused).'; $wb['vhost_proxy_protocol_enabled_txt'] = 'Enable PROXY Protocol'; $wb['vhost_proxy_protocol_http_port_txt'] = 'PROXY Protocol HTTP Port'; $wb['vhost_proxy_protocol_https_port_txt'] = 'PROXY Protocol HTTPS Port'; diff --git a/interface/web/admin/lib/lang/pt_system_config.lng b/interface/web/admin/lib/lang/pt_system_config.lng index 491aa6272c75a24b0710fb9e04ead319a9288c25..41becdf5cbb95f563a2816bb7e5c4aa7d7c222c2 100644 --- a/interface/web/admin/lib/lang/pt_system_config.lng +++ b/interface/web/admin/lib/lang/pt_system_config.lng @@ -105,4 +105,5 @@ $wb['show_support_messages_txt'] = 'Show message function in help module'; $wb['show_aps_menu_txt'] = 'Show APS menu'; $wb['show_aps_menu_note_txt'] = 'APS will be removed from the panel in the near future.'; $wb['show_aps_menu_note_url_txt'] = 'Click here for more information.'; +$wb['dns_show_zoneexport_txt'] = 'Show zone export.'; ?> diff --git a/interface/web/admin/lib/lang/ro_remote_action.lng b/interface/web/admin/lib/lang/ro_remote_action.lng index 3f8948e19f602408715f9554606f5478359bec9a..dfe56b616d5b3d18abd7eb9965b8c5602cb4354c 100644 --- a/interface/web/admin/lib/lang/ro_remote_action.lng +++ b/interface/web/admin/lib/lang/ro_remote_action.lng @@ -2,7 +2,7 @@ $wb['select_server_txt'] = 'Select Server'; $wb['btn_do_txt'] = 'Execute action'; $wb['do_osupdate_caption'] = 'Do OS-Update at remote server'; -$wb['do_osupdate_desc'] = 'This Action does a aptitude -y upgrade at your selected server.<br><br><strong>USE THIS AT YOUR OWN RISK!</strong>'; +$wb['do_osupdate_desc'] = 'This Action does a apt -y upgrade at your selected server.<br><br><strong>USE THIS AT YOUR OWN RISK!</strong>'; $wb['do_ispcupdate_caption'] = 'Do ISPConfig 3 - Update at remote server'; $wb['do_ispcupdate_desc'] = 'This action does a ISPConfig3 update at your selected server.<br><br><strong>USE THIS AT YOUR OWN RISK!</strong>'; $wb['action_scheduled'] = 'The action is scheduled for execution'; diff --git a/interface/web/admin/lib/lang/ro_server_config.lng b/interface/web/admin/lib/lang/ro_server_config.lng index 111f3c9e3e62eeb9879c814d92378a4b08577a3b..17322c189733da0846ce9e2ecbafdf05ebeafbdf 100644 --- a/interface/web/admin/lib/lang/ro_server_config.lng +++ b/interface/web/admin/lib/lang/ro_server_config.lng @@ -176,6 +176,8 @@ $wb['website_autoalias_note_txt'] = 'Placeholders:'; $wb['backup_mode_txt'] = 'Backup mode'; $wb['backup_mode_userzip'] = 'Backup web files owned by web user as zip'; $wb['backup_mode_rootgz'] = 'Backup all files in web directory as root user'; +$wb['backup_mode_borg_txt'] = 'BorgBackup: Backup all files in vhost directory and databases into incremental repositories'; +$wb['backup_missing_utils_txt'] = 'The following backup mode can not be used because the required tools are not installed:'; $wb['realtime_blackhole_list_txt'] = 'Real-time Blackhole List'; $wb['realtime_blackhole_list_note_txt'] = '(Separate RBL\'s with commas)'; $wb['stress_adaptive_txt'] = 'Adapt to temporary load spikes'; @@ -193,6 +195,8 @@ $wb['overtraffic_notify_admin_txt'] = 'Send overtraffic notification to admin'; $wb['overtraffic_notify_client_txt'] = 'Send overtraffic notification to client'; $wb['overtraffic_disable_web_txt'] = 'Disable websites that exceed traffic limit'; $wb['rbl_error_regex'] = 'Please specify valid RBL hostnames.'; +$wb['overquota_notify_threshold_txt'] = 'Quota warning usage level'; +$wb['overquota_notify_threshold_error'] = 'Quota warning usage level must be between 0-100%'; $wb['overquota_notify_admin_txt'] = 'Send quota warnings to admin'; $wb['overquota_notify_client_txt'] = 'Send quota warnings to client'; $wb['overquota_notify_onok_txt'] = 'Send quota ok message to client'; @@ -273,6 +277,7 @@ $wb['disable_bind_log_txt'] = 'Disable bind9 messages for Loglevel WARN'; $wb['apps_vhost_enabled_txt'] = 'Apps-vhost enabled'; $wb['do_not_try_rescue_mongodb_txt'] = 'Disable MongoDB monitoring'; $wb['backup_dir_mount_cmd_txt'] = 'Mount command, if backup directory not mounted'; +$wb['overquota_db_notify_threshold_txt'] = 'DB quota warning usage level'; $wb['overquota_db_notify_admin_txt'] = 'Send DB quota warnings to admin'; $wb['overquota_db_notify_client_txt'] = 'Send DB quota warnings to client'; $wb['php_handler_txt'] = 'Default PHP Handler'; @@ -316,6 +321,14 @@ $wb['content_filter_txt'] = 'Content Filter'; $wb['rspamd_url_txt'] = 'Rspamd URL'; $wb['rspamd_user_txt'] = 'Rspamd User'; $wb['rspamd_password_txt'] = 'Rspamd Password'; +$wb['rspamd_redis_servers_txt'] = 'Redis Servers'; +$wb['tooltip_rspamd_redis_servers_txt'] = 'Redis server(s) which Rspamd will use. Eg. \'127.0.0.1\', \'localhost:6379\' or \'/var/run/redis/redis-server.sock\'.'; +$wb['rspamd_redis_password_txt'] = 'Redis Password'; +$wb['tooltip_rspamd_redis_password_txt'] = 'Password for Redis Servers (leave blank if unused).'; +$wb['rspamd_redis_bayes_servers_txt'] = 'Redis Servers for Bayes'; +$wb['tooltip_rspamd_redis_bayes_servers_txt'] = 'Redis server(s) which Rspamd will use for Bayes if different (otherwise leave blank). Eg. \'localhost:6378\' or \'/var/run/redis-bayes/redis-server.sock\'.'; +$wb['rspamd_redis_bayes_password_txt'] = 'Redis Password for Bayes'; +$wb['tooltip_rspamd_redis_bayes_password_txt'] = 'Password for Bayes Redis Server (leave blank if unused).'; $wb['vhost_proxy_protocol_enabled_txt'] = 'Enable PROXY Protocol'; $wb['vhost_proxy_protocol_http_port_txt'] = 'PROXY Protocol HTTP Port'; $wb['vhost_proxy_protocol_https_port_txt'] = 'PROXY Protocol HTTPS Port'; diff --git a/interface/web/admin/lib/lang/ro_system_config.lng b/interface/web/admin/lib/lang/ro_system_config.lng index fc268d22410452399e5fc8e62a5e36243deaf951..2fc1a00b5699762a99e3a2d165c45644fd62042e 100644 --- a/interface/web/admin/lib/lang/ro_system_config.lng +++ b/interface/web/admin/lib/lang/ro_system_config.lng @@ -105,4 +105,5 @@ $wb['show_support_messages_txt'] = 'Show message function in help module'; $wb['show_aps_menu_txt'] = 'Show APS menu'; $wb['show_aps_menu_note_txt'] = 'APS will be removed from the panel in the near future.'; $wb['show_aps_menu_note_url_txt'] = 'Click here for more information.'; +$wb['dns_show_zoneexport_txt'] = 'Show zone export.'; ?> diff --git a/interface/web/admin/lib/lang/ru_remote_action.lng b/interface/web/admin/lib/lang/ru_remote_action.lng index 858d96b02ef558f5841015886d5d1bbf9ca4c9ee..f9d10afc53873d8670b06aba9649012d29690ced 100644 --- a/interface/web/admin/lib/lang/ru_remote_action.lng +++ b/interface/web/admin/lib/lang/ru_remote_action.lng @@ -2,7 +2,7 @@ $wb['select_server_txt'] = 'Выбор Ñервера'; $wb['btn_do_txt'] = 'Выполнить дейÑтвие'; $wb['do_osupdate_caption'] = 'Обновление ОС на удалённом Ñервере'; -$wb['do_osupdate_desc'] = 'Ðто дейÑтвие выполнит <strong>aptitude -y upgrade</strong> на выбранном Ñервере.<br><br><strong>ИСПОЛЬЗУЙТЕ ÐТО ÐРСВОЙ СТРÐÐ¥ И РИСК!</strong>'; +$wb['do_osupdate_desc'] = 'Ðто дейÑтвие выполнит <strong>apt -y upgrade</strong> на выбранном Ñервере.<br><br><strong>ИСПОЛЬЗУЙТЕ ÐТО ÐРСВОЙ СТРÐÐ¥ И РИСК!</strong>'; $wb['do_ispcupdate_caption'] = 'ЗапуÑк Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ISPConfig 3 на удалённом Ñервере'; $wb['do_ispcupdate_desc'] = 'Ðто дейÑтвие выполнит обновление ISPConfig 3 на выбранном Ñервере.<br><br><strong>ИСПОЛЬЗУЙТЕ ÐТО ÐРСВОЙ СТРÐÐ¥ И РИСК!</strong>'; $wb['action_scheduled'] = 'ДейÑтвие запланировано на выполнение'; diff --git a/interface/web/admin/lib/lang/ru_server_config.lng b/interface/web/admin/lib/lang/ru_server_config.lng index e028e1370d99f14f8eebf4f0a67acc911d825b15..e971ac94ec3f4f2fe0d6cb5a2e0a48566c30c010 100644 --- a/interface/web/admin/lib/lang/ru_server_config.lng +++ b/interface/web/admin/lib/lang/ru_server_config.lng @@ -176,6 +176,8 @@ $wb['website_autoalias_note_txt'] = 'Заменители:'; $wb['backup_mode_txt'] = 'Режим резервного копированиÑ'; $wb['backup_mode_userzip'] = 'Делать резервные копии web файлов принадлежащих ползователю web как архив ZIP'; $wb['backup_mode_rootgz'] = 'Делать резервные копии вÑех файлов в веб-каталог как корневой пользователь'; +$wb['backup_mode_borg_txt'] = 'BorgBackup: Делать резервные копии вÑех файлов в каталоге vhost и базах данных в инкрементные репозитории'; +$wb['backup_missing_utils_txt'] = 'Следующий режим резервного ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать, поÑкольку не уÑтановлены необходимые инÑтрументы:'; $wb['realtime_blackhole_list_txt'] = 'Real-time Blackhole List'; $wb['realtime_blackhole_list_note_txt'] = '(РазделÑйте RBL запÑтыми)'; $wb['stress_adaptive_txt'] = 'Adapt to temporary load spikes'; @@ -193,6 +195,8 @@ $wb['overtraffic_notify_admin_txt'] = 'ПриÑылать уведомление $wb['overtraffic_notify_client_txt'] = 'ПриÑылать уведомление трафика клиенту'; $wb['overtraffic_disable_web_txt'] = 'Disable websites that exceed traffic limit'; $wb['rbl_error_regex'] = 'ПожалуйÑта, укажите дейÑтвительные имена хоÑтов RBL.'; +$wb['overquota_notify_threshold_txt'] = 'Quota warning usage level'; +$wb['overquota_notify_threshold_error'] = 'Quota warning usage level must be between 0-100%'; $wb['overquota_notify_admin_txt'] = 'ПриÑылать Ð¿Ñ€ÐµÐ´ÑƒÐ¿Ñ€ÐµÐ¶Ð´ÐµÐ½Ð¸Ñ ÐºÐ²Ð¾Ñ‚Ñ‹ админиÑтратору'; $wb['overquota_notify_client_txt'] = 'ПриÑылать Ð¿Ñ€ÐµÐ´ÑƒÐ¿Ñ€ÐµÐ¶Ð´ÐµÐ½Ð¸Ñ ÐºÐ²Ð¾Ñ‚Ñ‹ клиенту'; $wb['overquota_notify_onok_txt'] = 'ПриÑылать Ñообщение квоты ОК клиенту'; @@ -273,6 +277,7 @@ $wb['disable_bind_log_txt'] = 'Отключить ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ bind9 дл $wb['apps_vhost_enabled_txt'] = 'Apps-vhost включен'; $wb['do_not_try_rescue_mongodb_txt'] = 'Отключить мониторинг MongoDB'; $wb['backup_dir_mount_cmd_txt'] = 'Выполните команду монтированиÑ, еÑли каталог резервного ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ðµ уÑтановлен'; +$wb['overquota_db_notify_threshold_txt'] = 'DB quota warning usage level'; $wb['overquota_db_notify_admin_txt'] = 'ПриÑылать Ð¿Ñ€ÐµÐ´ÑƒÐ¿Ñ€ÐµÐ¶Ð´ÐµÐ½Ð¸Ñ ÐºÐ²Ð¾Ñ‚Ñ‹ DB админиÑтратору'; $wb['overquota_db_notify_client_txt'] = 'ПриÑылать Ð¿Ñ€ÐµÐ´ÑƒÐ¿Ñ€ÐµÐ¶Ð´ÐµÐ½Ð¸Ñ ÐºÐ²Ð¾Ñ‚Ñ‹ DB клиенту'; $wb['php_handler_txt'] = 'Обработчик PHP по умолчанию'; @@ -316,6 +321,14 @@ $wb['content_filter_txt'] = 'Content Filter'; $wb['rspamd_url_txt'] = 'Rspamd URL'; $wb['rspamd_user_txt'] = 'Rspamd User'; $wb['rspamd_password_txt'] = 'Rspamd Password'; +$wb['rspamd_redis_servers_txt'] = 'Redis Servers'; +$wb['tooltip_rspamd_redis_servers_txt'] = 'Redis server(s) which Rspamd will use. Eg. \'127.0.0.1\', \'localhost:6379\' or \'/var/run/redis/redis-server.sock\'.'; +$wb['rspamd_redis_password_txt'] = 'Redis Password'; +$wb['tooltip_rspamd_redis_password_txt'] = 'Password for Redis Servers (leave blank if unused).'; +$wb['rspamd_redis_bayes_servers_txt'] = 'Redis Servers for Bayes'; +$wb['tooltip_rspamd_redis_bayes_servers_txt'] = 'Redis server(s) which Rspamd will use for Bayes if different (otherwise leave blank). Eg. \'localhost:6378\' or \'/var/run/redis-bayes/redis-server.sock\'.'; +$wb['rspamd_redis_bayes_password_txt'] = 'Redis Password for Bayes'; +$wb['tooltip_rspamd_redis_bayes_password_txt'] = 'Password for Bayes Redis Server (leave blank if unused).'; $wb['vhost_proxy_protocol_enabled_txt'] = 'Enable PROXY Protocol'; $wb['vhost_proxy_protocol_http_port_txt'] = 'PROXY Protocol HTTP Port'; $wb['vhost_proxy_protocol_https_port_txt'] = 'PROXY Protocol HTTPS Port'; diff --git a/interface/web/admin/lib/lang/ru_system_config.lng b/interface/web/admin/lib/lang/ru_system_config.lng index ae12c4b4c1682d4b63b38159635896325dafce5d..d829d1ca97d642054958057b433a1b45132a0ac7 100644 --- a/interface/web/admin/lib/lang/ru_system_config.lng +++ b/interface/web/admin/lib/lang/ru_system_config.lng @@ -105,4 +105,5 @@ $wb['show_support_messages_txt'] = 'Show message function in help module'; $wb['show_aps_menu_txt'] = 'Show APS menu'; $wb['show_aps_menu_note_txt'] = 'APS will be removed from the panel in the near future.'; $wb['show_aps_menu_note_url_txt'] = 'Click here for more information.'; +$wb['dns_show_zoneexport_txt'] = 'Show zone export.'; ?> diff --git a/interface/web/admin/lib/lang/se_remote_action.lng b/interface/web/admin/lib/lang/se_remote_action.lng index fe6a849905a143f773ec78e3ac2dab2af6233223..9aeb7d9ba3c3e193cbd625b3aebcc1bcbb2e9f97 100644 --- a/interface/web/admin/lib/lang/se_remote_action.lng +++ b/interface/web/admin/lib/lang/se_remote_action.lng @@ -2,7 +2,7 @@ $wb['select_server_txt'] = 'Välj server'; $wb['btn_do_txt'] = 'Utför handling'; $wb['do_osupdate_caption'] = 'Utför OS-uppdatering pÃ¥ fjärrserver'; -$wb['do_osupdate_desc'] = 'This Action does a aptitude -y upgrade at your selected server.<br><br><strong>USE THIS AT YOUR OWN RISK!</strong>'; +$wb['do_osupdate_desc'] = 'This Action does a apt -y upgrade at your selected server.<br><br><strong>USE THIS AT YOUR OWN RISK!</strong>'; $wb['do_ispcupdate_caption'] = 'Utför ISPConfig 3 -uppdatering pÃ¥ fjärrserver'; $wb['do_ispcupdate_desc'] = 'This action does a ISPConfig3 update at your selected server.<br><br><strong>USE THIS AT YOUR OWN RISK!</strong>'; $wb['action_scheduled'] = 'Handlingen är schemalagd att utföras'; diff --git a/interface/web/admin/lib/lang/se_server_config.lng b/interface/web/admin/lib/lang/se_server_config.lng index aea7a8ab891ed6893e2d7f87da70fece8de6439c..9e52893f41531408d511331fbab77a2bbdc1d4ea 100644 --- a/interface/web/admin/lib/lang/se_server_config.lng +++ b/interface/web/admin/lib/lang/se_server_config.lng @@ -176,6 +176,8 @@ $wb['website_autoalias_note_txt'] = 'Placeholders:'; $wb['backup_mode_txt'] = 'Backup mode'; $wb['backup_mode_userzip'] = 'Backup web files owned by web user as zip'; $wb['backup_mode_rootgz'] = 'Backup all files in web directory as root user'; +$wb['backup_mode_borg_txt'] = 'BorgBackup: Backup all files in vhost directory and databases into incremental repositories'; +$wb['backup_missing_utils_txt'] = 'The following backup mode can not be used because the required tools are not installed:'; $wb['realtime_blackhole_list_txt'] = 'Real-time Blackhole List'; $wb['realtime_blackhole_list_note_txt'] = '(Separate RBL\'s with commas)'; $wb['stress_adaptive_txt'] = 'Adapt to temporary load spikes'; @@ -193,6 +195,8 @@ $wb['overtraffic_notify_admin_txt'] = 'Send overtraffic notification to admin'; $wb['overtraffic_notify_client_txt'] = 'Send overtraffic notification to client'; $wb['overtraffic_disable_web_txt'] = 'Disable websites that exceed traffic limit'; $wb['rbl_error_regex'] = 'Please specify valid RBL hostnames.'; +$wb['overquota_notify_threshold_txt'] = 'Quota warning usage level'; +$wb['overquota_notify_threshold_error'] = 'Quota warning usage level must be between 0-100%'; $wb['overquota_notify_admin_txt'] = 'Send quota warnings to admin'; $wb['overquota_notify_client_txt'] = 'Send quota warnings to client'; $wb['overquota_notify_onok_txt'] = 'Send quota ok message to client'; @@ -273,6 +277,7 @@ $wb['disable_bind_log_txt'] = 'Disable bind9 messages for Loglevel WARN'; $wb['apps_vhost_enabled_txt'] = 'Apps-vhost enabled'; $wb['do_not_try_rescue_mongodb_txt'] = 'Disable MongoDB monitoring'; $wb['backup_dir_mount_cmd_txt'] = 'Mount command, if backup directory not mounted'; +$wb['overquota_db_notify_threshold_txt'] = 'DB quota warning usage level'; $wb['overquota_db_notify_admin_txt'] = 'Send DB quota warnings to admin'; $wb['overquota_db_notify_client_txt'] = 'Send DB quota warnings to client'; $wb['php_handler_txt'] = 'Default PHP Handler'; @@ -316,6 +321,14 @@ $wb['content_filter_txt'] = 'Content Filter'; $wb['rspamd_url_txt'] = 'Rspamd URL'; $wb['rspamd_user_txt'] = 'Rspamd User'; $wb['rspamd_password_txt'] = 'Rspamd Password'; +$wb['rspamd_redis_servers_txt'] = 'Redis Servers'; +$wb['tooltip_rspamd_redis_servers_txt'] = 'Redis server(s) which Rspamd will use. Eg. \'127.0.0.1\', \'localhost:6379\' or \'/var/run/redis/redis-server.sock\'.'; +$wb['rspamd_redis_password_txt'] = 'Redis Password'; +$wb['tooltip_rspamd_redis_password_txt'] = 'Password for Redis Servers (leave blank if unused).'; +$wb['rspamd_redis_bayes_servers_txt'] = 'Redis Servers for Bayes'; +$wb['tooltip_rspamd_redis_bayes_servers_txt'] = 'Redis server(s) which Rspamd will use for Bayes if different (otherwise leave blank). Eg. \'localhost:6378\' or \'/var/run/redis-bayes/redis-server.sock\'.'; +$wb['rspamd_redis_bayes_password_txt'] = 'Redis Password for Bayes'; +$wb['tooltip_rspamd_redis_bayes_password_txt'] = 'Password for Bayes Redis Server (leave blank if unused).'; $wb['vhost_proxy_protocol_enabled_txt'] = 'Enable PROXY Protocol'; $wb['vhost_proxy_protocol_http_port_txt'] = 'PROXY Protocol HTTP Port'; $wb['vhost_proxy_protocol_https_port_txt'] = 'PROXY Protocol HTTPS Port'; diff --git a/interface/web/admin/lib/lang/se_system_config.lng b/interface/web/admin/lib/lang/se_system_config.lng index fa302c344aa1531d3e2fc0e7863ec5823088b601..fa67bc2bc9265801ba2deb04cafd3bac98cb6137 100644 --- a/interface/web/admin/lib/lang/se_system_config.lng +++ b/interface/web/admin/lib/lang/se_system_config.lng @@ -105,4 +105,5 @@ $wb['show_support_messages_txt'] = 'Show message function in help module'; $wb['show_aps_menu_txt'] = 'Show APS menu'; $wb['show_aps_menu_note_txt'] = 'APS will be removed from the panel in the near future.'; $wb['show_aps_menu_note_url_txt'] = 'Click here for more information.'; +$wb['dns_show_zoneexport_txt'] = 'Show zone export.'; ?> diff --git a/interface/web/admin/lib/lang/sk_remote_action.lng b/interface/web/admin/lib/lang/sk_remote_action.lng index 3f8948e19f602408715f9554606f5478359bec9a..dfe56b616d5b3d18abd7eb9965b8c5602cb4354c 100644 --- a/interface/web/admin/lib/lang/sk_remote_action.lng +++ b/interface/web/admin/lib/lang/sk_remote_action.lng @@ -2,7 +2,7 @@ $wb['select_server_txt'] = 'Select Server'; $wb['btn_do_txt'] = 'Execute action'; $wb['do_osupdate_caption'] = 'Do OS-Update at remote server'; -$wb['do_osupdate_desc'] = 'This Action does a aptitude -y upgrade at your selected server.<br><br><strong>USE THIS AT YOUR OWN RISK!</strong>'; +$wb['do_osupdate_desc'] = 'This Action does a apt -y upgrade at your selected server.<br><br><strong>USE THIS AT YOUR OWN RISK!</strong>'; $wb['do_ispcupdate_caption'] = 'Do ISPConfig 3 - Update at remote server'; $wb['do_ispcupdate_desc'] = 'This action does a ISPConfig3 update at your selected server.<br><br><strong>USE THIS AT YOUR OWN RISK!</strong>'; $wb['action_scheduled'] = 'The action is scheduled for execution'; diff --git a/interface/web/admin/lib/lang/sk_server_config.lng b/interface/web/admin/lib/lang/sk_server_config.lng index ba3ae9486db3d62e61d176e32a772bed76e19378..dbe11188af74189abda5741f235bdb5f0572a11b 100644 --- a/interface/web/admin/lib/lang/sk_server_config.lng +++ b/interface/web/admin/lib/lang/sk_server_config.lng @@ -176,6 +176,8 @@ $wb['website_autoalias_note_txt'] = 'Placeholders:'; $wb['backup_mode_txt'] = 'Backup mode'; $wb['backup_mode_userzip'] = 'Backup web files owned by web user as zip'; $wb['backup_mode_rootgz'] = 'Backup all files in web directory as root user'; +$wb['backup_mode_borg_txt'] = 'BorgBackup: Backup all files in vhost directory and databases into incremental repositories'; +$wb['backup_missing_utils_txt'] = 'The following backup mode can not be used because the required tools are not installed:'; $wb['realtime_blackhole_list_txt'] = 'Real-time Blackhole List'; $wb['realtime_blackhole_list_note_txt'] = '(Separate RBL\'s with commas)'; $wb['stress_adaptive_txt'] = 'Adapt to temporary load spikes'; @@ -193,6 +195,8 @@ $wb['overtraffic_notify_admin_txt'] = 'Send overtraffic notification to admin'; $wb['overtraffic_notify_client_txt'] = 'Send overtraffic notification to client'; $wb['overtraffic_disable_web_txt'] = 'Disable websites that exceed traffic limit'; $wb['rbl_error_regex'] = 'Please specify valid RBL hostnames.'; +$wb['overquota_notify_threshold_txt'] = 'Quota warning usage level'; +$wb['overquota_notify_threshold_error'] = 'Quota warning usage level must be between 0-100%'; $wb['overquota_notify_admin_txt'] = 'Send quota warnings to admin'; $wb['overquota_notify_client_txt'] = 'Send quota warnings to client'; $wb['overquota_notify_onok_txt'] = 'Send quota ok message to client'; @@ -273,6 +277,7 @@ $wb['disable_bind_log_txt'] = 'Disable bind9 messages for Loglevel WARN'; $wb['apps_vhost_enabled_txt'] = 'Apps-vhost enabled'; $wb['do_not_try_rescue_mongodb_txt'] = 'Disable MongoDB monitoring'; $wb['backup_dir_mount_cmd_txt'] = 'Mount command, if backup directory not mounted'; +$wb['overquota_db_notify_threshold_txt'] = 'DB quota warning usage level'; $wb['overquota_db_notify_admin_txt'] = 'Send DB quota warnings to admin'; $wb['overquota_db_notify_client_txt'] = 'Send DB quota warnings to client'; $wb['php_handler_txt'] = 'Default PHP Handler'; @@ -316,6 +321,14 @@ $wb['content_filter_txt'] = 'Content Filter'; $wb['rspamd_url_txt'] = 'Rspamd URL'; $wb['rspamd_user_txt'] = 'Rspamd User'; $wb['rspamd_password_txt'] = 'Rspamd Password'; +$wb['rspamd_redis_servers_txt'] = 'Redis Servers'; +$wb['tooltip_rspamd_redis_servers_txt'] = 'Redis server(s) which Rspamd will use. Eg. \'127.0.0.1\', \'localhost:6379\' or \'/var/run/redis/redis-server.sock\'.'; +$wb['rspamd_redis_password_txt'] = 'Redis Password'; +$wb['tooltip_rspamd_redis_password_txt'] = 'Password for Redis Servers (leave blank if unused).'; +$wb['rspamd_redis_bayes_servers_txt'] = 'Redis Servers for Bayes'; +$wb['tooltip_rspamd_redis_bayes_servers_txt'] = 'Redis server(s) which Rspamd will use for Bayes if different (otherwise leave blank). Eg. \'localhost:6378\' or \'/var/run/redis-bayes/redis-server.sock\'.'; +$wb['rspamd_redis_bayes_password_txt'] = 'Redis Password for Bayes'; +$wb['tooltip_rspamd_redis_bayes_password_txt'] = 'Password for Bayes Redis Server (leave blank if unused).'; $wb['vhost_proxy_protocol_enabled_txt'] = 'Enable PROXY Protocol'; $wb['vhost_proxy_protocol_http_port_txt'] = 'PROXY Protocol HTTP Port'; $wb['vhost_proxy_protocol_https_port_txt'] = 'PROXY Protocol HTTPS Port'; diff --git a/interface/web/admin/lib/lang/sk_system_config.lng b/interface/web/admin/lib/lang/sk_system_config.lng index 6735e91c53f82691edd308d6d07b8723f1f0296c..317b435eae569d8a3ba79e707d3ba33276d80b4f 100644 --- a/interface/web/admin/lib/lang/sk_system_config.lng +++ b/interface/web/admin/lib/lang/sk_system_config.lng @@ -105,4 +105,5 @@ $wb['show_support_messages_txt'] = 'Show message function in help module'; $wb['show_aps_menu_txt'] = 'Show APS menu'; $wb['show_aps_menu_note_txt'] = 'APS will be removed from the panel in the near future.'; $wb['show_aps_menu_note_url_txt'] = 'Click here for more information.'; +$wb['dns_show_zoneexport_txt'] = 'Show zone export.'; ?> diff --git a/interface/web/admin/lib/lang/tr_server_config.lng b/interface/web/admin/lib/lang/tr_server_config.lng index 720c0aa3e57ea04088ce2c0baf4abe48cc607cf6..1f0cf1383f836adb86b70a100a92ce5bd69b740f 100644 --- a/interface/web/admin/lib/lang/tr_server_config.lng +++ b/interface/web/admin/lib/lang/tr_server_config.lng @@ -114,6 +114,8 @@ $wb['fastcgi_config_syntax_txt'] = 'FastCGI Ayar Yazımı'; $wb['backup_mode_txt'] = 'Yedekleme Kipi'; $wb['backup_mode_userzip'] = 'Web kullanıcısına ait web dosyaları ZIP biçiminde yedeklensin'; $wb['backup_mode_rootgz'] = 'Web klasöründeki tüm dosyalar root kullanıcısı olarak yedeklensin'; +$wb['backup_mode_borg_txt'] = 'BorgBackup: Vhost dizinindeki ve veritabanlarındaki tüm dosyaları artımlı depolara yedekleyin'; +$wb['backup_missing_utils_txt'] = 'Gerekli araçlar kurulu olmadığı için aÅŸağıdaki yedekleme modu kullanılamaz:'; $wb['tmpdir_path_error_empty'] = 'tmp klasörü yolu boÅŸ olamaz.'; $wb['tmpdir_path_error_regex'] = 'tmp klasörü yolu geçersiz.'; $wb['backup_time_txt'] = 'Yedekleme Zamanı'; @@ -200,6 +202,8 @@ $wb['overtraffic_notify_admin_txt'] = 'Trafik Aşımı Bildirimi Yöneticiye Gö $wb['overtraffic_notify_client_txt'] = 'Trafik Aşımı Bildirimi Müşteriye Gönderilsin'; $wb['overtraffic_disable_web_txt'] = 'Disable websites that exceed traffic limit'; $wb['rbl_error_regex'] = 'Lütfen geçerli RBL sunucu adları yazın.'; +$wb['overquota_notify_threshold_txt'] = 'Quota warning usage level'; +$wb['overquota_notify_threshold_error'] = 'Quota warning usage level must be between 0-100%'; $wb['overquota_notify_admin_txt'] = 'Kota Uyarıları Yöneticiye Gönderilsin'; $wb['overquota_notify_client_txt'] = 'Kota Uyarıları Müşteriye Gönderilsin'; $wb['overquota_notify_onok_txt'] = 'Kota Tamam İletisi Müşteriye Gönderilsin'; @@ -223,6 +227,7 @@ $wb['v6_prefix_length'] = 'Ön ek tanımlanmış IPv6 adresine göre çok uzun ' $wb['backup_dir_is_mount_txt'] = 'Yedek Klasörü Takılı mı?'; $wb['backup_dir_mount_cmd_txt'] = 'Mount komutu, yedek klasörü takılı deÄŸil ise'; $wb['backup_delete_txt'] = 'Etki alanı ya da web sitesi silindiÄŸinde yedekler de silinsin'; +$wb['overquota_db_notify_threshold_txt'] = 'DB quota warning usage level'; $wb['overquota_db_notify_admin_txt'] = 'Veritabanı Kotası Bildirimleri Yöneticiye Gönderilsin'; $wb['overquota_db_notify_client_txt'] = 'Veritabanı Kotası Bildirimleri Müşteriye Gönderilsin'; $wb['monitor_system_updates_txt'] = 'Linux Güncellemeleri Denetlensin'; @@ -310,6 +315,17 @@ $wb['log_retention_error_ispositive'] = 'Günlük tutma süresi 0 deÄŸerinden b $wb['php_default_hide_txt'] = 'Hide Default PHP-Version in selectbox'; $wb['php_default_name_txt'] = 'Varsayılan PHP Sürümü Açıklaması'; $wb['php_default_name_error_empty'] = 'Varsayılan PHP sürümü açıklaması boÅŸ olamaz'; +$wb['rspamd_url_txt'] = 'Rspamd URL'; +$wb['rspamd_user_txt'] = 'Rspamd User'; +$wb['rspamd_password_txt'] = 'Rspamd Password'; +$wb['rspamd_redis_servers_txt'] = 'Redis Servers'; +$wb['tooltip_rspamd_redis_servers_txt'] = 'Redis server(s) which Rspamd will use. Eg. \'127.0.0.1\', \'localhost:6379\' or \'/var/run/redis/redis-server.sock\'.'; +$wb['rspamd_redis_password_txt'] = 'Redis Password'; +$wb['tooltip_rspamd_redis_password_txt'] = 'Password for Redis Servers (leave blank if unused).'; +$wb['rspamd_redis_bayes_servers_txt'] = 'Redis Servers for Bayes'; +$wb['tooltip_rspamd_redis_bayes_servers_txt'] = 'Redis server(s) which Rspamd will use for Bayes if different (otherwise leave blank). Eg. \'localhost:6378\' or \'/var/run/redis-bayes/redis-server.sock\'.'; +$wb['rspamd_redis_bayes_password_txt'] = 'Redis Password for Bayes'; +$wb['tooltip_rspamd_redis_bayes_password_txt'] = 'Password for Bayes Redis Server (leave blank if unused).'; $wb['vhost_proxy_protocol_enabled_txt'] = 'Enable PROXY Protocol'; $wb['vhost_proxy_protocol_http_port_txt'] = 'PROXY Protocol HTTP Port'; $wb['vhost_proxy_protocol_https_port_txt'] = 'PROXY Protocol HTTPS Port'; diff --git a/interface/web/admin/lib/lang/tr_system_config.lng b/interface/web/admin/lib/lang/tr_system_config.lng index b767101e22a67448d6d91d193b70c69f02da1450..a6e6299375f1820031bb7181429ab0d52358b992 100644 --- a/interface/web/admin/lib/lang/tr_system_config.lng +++ b/interface/web/admin/lib/lang/tr_system_config.lng @@ -105,4 +105,5 @@ $wb['show_support_messages_txt'] = 'Show message function in help module'; $wb['show_aps_menu_txt'] = 'Show APS menu'; $wb['show_aps_menu_note_txt'] = 'APS will be removed from the panel in the near future.'; $wb['show_aps_menu_note_url_txt'] = 'Click here for more information.'; +$wb['dns_show_zoneexport_txt'] = 'Show zone export.'; ?> diff --git a/interface/web/admin/lib/remote.conf.php b/interface/web/admin/lib/remote.conf.php index 9c2db8144e3da2b20a872f0fef78718f60ba45f7..fd94b6275ec4ec3f360d4c3dba7e6e1a842cc5f4 100644 --- a/interface/web/admin/lib/remote.conf.php +++ b/interface/web/admin/lib/remote.conf.php @@ -3,9 +3,11 @@ $function_list['server_get,server_config_set,get_function_list,client_templates_get_all,server_get_serverid_by_ip,server_ip_get,server_ip_add,server_ip_update,server_ip_delete,system_config_set,system_config_get,config_value_get,config_value_add,config_value_update,config_value_replace,config_value_delete'] = 'Server functions'; $function_list['admin_record_permissions'] = 'Record permission changes'; -# Roundcube: generate list of actual soap methods used with: -# grep soap-\> /usr/share/roundcube/plugins/ispconfig3_*/ispconfig3_*.php | sed -e 's/^.*soap->//g' -e 's/(.*$//g' | sort -u | xargs | sed -e 's/ /,/g' -# +// Roundcube: generate list of actual soap methods used with: +// grep soap-\> /usr/share/roundcube/plugins/ispconfig3_*/ispconfig3_*.php | sed -e 's/^.*soap->//g' -e 's/(.*$//g' | sort -u | xargs | sed -e 's/ /,/g' +// $function_list['client_get_id,login,logout,mail_alias_get,mail_fetchmail_add,mail_fetchmail_delete,mail_fetchmail_get,mail_fetchmail_update,mail_policy_get,mail_spamfilter_blacklist_add,mail_spamfilter_blacklist_delete,mail_spamfilter_blacklist_get,mail_spamfilter_blacklist_update,mail_spamfilter_user_add,mail_spamfilter_user_get,mail_spamfilter_user_update,mail_spamfilter_whitelist_add,mail_spamfilter_whitelist_delete,mail_spamfilter_whitelist_get,mail_spamfilter_whitelist_update,mail_user_filter_add,mail_user_filter_delete,mail_user_filter_get,mail_user_filter_update,mail_user_get,mail_user_update,server_get,server_get_app_version'] = 'Roundcube plugins functions'; -?> +// functions used by ispc_acmeproxy: https://git.ispconfig.org/ispconfig/Modules/-/tree/master/ispc_acmeproxy +// +$function_list['client_get_by_username,client_get_id,dns_zone_get,dns_zone_get_by_user,dns_zone_update,dns_txt_add,dns_txt_get,dns_txt_delete'] = 'ISPConfig module: acme proxy functions'; diff --git a/interface/web/admin/server_config_edit.php b/interface/web/admin/server_config_edit.php index 1fd1921b84e38562f1b756426c63bddf801430a3..32aa270893f467ea3448a0d3940a6cc7832fec81 100644 --- a/interface/web/admin/server_config_edit.php +++ b/interface/web/admin/server_config_edit.php @@ -63,7 +63,23 @@ class page_action extends tform_actions { unset($app->tform->formDef["tabs"]["fastcgi"]); unset($app->tform->formDef["tabs"]["vlogger"]); } - + //Check if borg is installed + $is_borg_installed = false; + if($this->id != $conf['server_id']) { + $mon = $app->db->queryOneRecord('SELECT `data` FROM `monitor_data` WHERE `server_id` = ? AND `type` = ? ORDER BY `created` DESC', $this->id, 'backup_utils'); + if($mon) { + $missing_utils = unserialize($mon['data']); + if($missing_utils) { + $missing_utils = $missing_utils['missing_utils']; + $is_borg_installed = ! in_array('borg', $missing_utils); + } + } + } else { + $is_borg_installed = $app->system->is_installed('borg'); + } + if ( ! $is_borg_installed) { + $app->tpl->setVar('missing_utils', 'BorgBackup'); + } parent::onShow(); } diff --git a/interface/web/admin/templates/server_config_mail_edit.htm b/interface/web/admin/templates/server_config_mail_edit.htm index 7f7b87d7c1bd51cfa1223c0ea6ee96081a8736a4..53ef330cc639cd754c086cb1b59314aa3a687f9d 100644 --- a/interface/web/admin/templates/server_config_mail_edit.htm +++ b/interface/web/admin/templates/server_config_mail_edit.htm @@ -61,6 +61,26 @@ <label for="rspamd_password" class="col-sm-3 control-label">{tmpl_var name='rspamd_password_txt'}</label> <div class="col-sm-9"><input type="text" name="rspamd_password" id="rspamd_password" value="{tmpl_var name='rspamd_password'}" class="form-control" /></div> </div> + <div class="form-group rspamd"> + <label for="rspamd_redis_servers" class="col-sm-3 control-label">{tmpl_var name='rspamd_redis_servers_txt'}</label> + <div class="col-sm-9" data-toggle="tooltip" title="{tmpl_var name='tooltip_rspamd_redis_servers_txt'}"> + <input type="text" name="rspamd_redis_servers" id="rspamd_redis_servers" value="{tmpl_var name='rspamd_redis_servers'}" class="form-control" /></div> + </div> + <div class="form-group rspamd"> + <label for="rspamd_redis_password" class="col-sm-3 control-label">{tmpl_var name='rspamd_redis_password_txt'}</label> + <div class="col-sm-9" data-toggle="tooltip" title="{tmpl_var name='tooltip_rspamd_redis_password_txt'}"> + <input type="text" name="rspamd_redis_password" id="rspamd_redis_password" value="{tmpl_var name='rspamd_redis_password'}" class="form-control" /></div> + </div> + <div class="form-group rspamd"> + <label for="rspamd_redis_bayes_servers" class="col-sm-3 control-label">{tmpl_var name='rspamd_redis_bayes_servers_txt'}</label> + <div class="col-sm-9" data-toggle="tooltip" title="{tmpl_var name='tooltip_rspamd_redis_bayes_servers_txt'}"> + <input type="text" name="rspamd_redis_bayes_servers" id="rspamd_redis_bayes_servers" value="{tmpl_var name='rspamd_redis_bayes_servers'}" class="form-control" /></div> + </div> + <div class="form-group rspamd"> + <label for="rspamd_redis_bayes_password" class="col-sm-3 control-label">{tmpl_var name='rspamd_redis_bayes_password_txt'}</label> + <div class="col-sm-9" data-toggle="tooltip" title="{tmpl_var name='tooltip_rspamd_redis_bayes_password_txt'}"> + <input type="text" name="rspamd_redis_bayes_password" id="rspamd_redis_bayes_password" value="{tmpl_var name='rspamd_redis_bayes_password'}" class="form-control" /></div> + </div> <div class="form-group"> <label for="mailuser_uid" class="col-sm-3 control-label">{tmpl_var name='mailuser_uid_txt'}</label> <div class="col-sm-9"><input type="text" name="mailuser_uid" id="mailuser_uid" value="{tmpl_var name='mailuser_uid'}" class="form-control" /></div></div> @@ -132,6 +152,11 @@ {tmpl_var name='mailbox_quota_stats'} </div> </div> + <div class="form-group"> + <label for="overquota_notify_threshold" class="col-sm-3 control-label">{tmpl_var name='overquota_notify_threshold_txt'}</label> + <div class="col-sm-6"><input type="text" name="overquota_notify_threshold" id="overquota_notify_threshold" value="{tmpl_var name='overquota_notify_threshold'}" class="form-control" /></div> + <div class="col-sm-3 input-sm">%</div> + </div> <div class="form-group"> <label class="col-sm-3 control-label">{tmpl_var name='overquota_notify_admin_txt'}</label> <div class="col-sm-9"> diff --git a/interface/web/admin/templates/server_config_server_edit.htm b/interface/web/admin/templates/server_config_server_edit.htm index 394bf55278833f23df18c477a3fe781242213331..1898f2bc556ef4d516abf11dd30fb22cfdc13c81 100644 --- a/interface/web/admin/templates/server_config_server_edit.htm +++ b/interface/web/admin/templates/server_config_server_edit.htm @@ -1,4 +1,9 @@ <div class="alert alert-info"><h4 style="text-align:center"><tmpl_var name="config_for_txt"> {tmpl_var name='server_name'}</h4></div> + <tmpl_if name="missing_utils"> + <div class="tab-content alert alert-warning"> + {tmpl_var name='backup_missing_utils_txt'} {tmpl_var name='missing_utils'} + </div> + </tmpl_if> diff --git a/interface/web/admin/templates/server_config_web_edit.htm b/interface/web/admin/templates/server_config_web_edit.htm index ca1d54344cbf9e50baaf6dd21c37afbbcd69928f..5cf5c43a75826bce63f1c089366bf87bb3383fec 100644 --- a/interface/web/admin/templates/server_config_web_edit.htm +++ b/interface/web/admin/templates/server_config_web_edit.htm @@ -144,6 +144,11 @@ <div class="col-sm-9"> {tmpl_var name='overtraffic_disable_web'} </div> + </div> + <div class="form-group"> + <label for="overquota_notify_threshold" class="col-sm-3 control-label">{tmpl_var name='overquota_notify_threshold_txt'}</label> + <div class="col-sm-6"><input type="text" name="overquota_notify_threshold" id="overquota_notify_threshold" value="{tmpl_var name='overquota_notify_threshold'}" class="form-control" /></div> + <div class="col-sm-3 input-sm">%</div> </div> <div class="form-group"> <label class="col-sm-3 control-label">{tmpl_var name='overquota_notify_admin_txt'}</label> @@ -156,6 +161,11 @@ <div class="col-sm-9"> {tmpl_var name='overquota_notify_client'} </div> + </div> + <div class="form-group"> + <label for="overquota_db_notify_threshold" class="col-sm-3 control-label">{tmpl_var name='overquota_db_notify_threshold_txt'}</label> + <div class="col-sm-6"><input type="text" name="overquota_db_notify_threshold" id="overquota_db_notify_threshold" value="{tmpl_var name='overquota_db_notify_threshold'}" class="form-control" /></div> + <div class="col-sm-3 input-sm">%</div> </div> <div class="form-group"> <label class="col-sm-3 control-label">{tmpl_var name='overquota_db_notify_admin_txt'}</label> diff --git a/interface/web/admin/templates/system_config_dns_edit.htm b/interface/web/admin/templates/system_config_dns_edit.htm index f3d0b20dda12fb2d620bdac076b83babde8a22cf..9636b4a26114d517adcf7c50a127401961b54fa8 100644 --- a/interface/web/admin/templates/system_config_dns_edit.htm +++ b/interface/web/admin/templates/system_config_dns_edit.htm @@ -11,10 +11,18 @@ {tmpl_var name='default_dnsserver'} </select></div> </div> + +<div class="form-group"> + <label class="col-sm-3 control-label">{tmpl_var name=dns_show_zoneexport_txt'}</label> + <div class="col-sm-9"> + {tmpl_var name='dns_show_zoneexport'} + </div> +</div> + <input type="hidden" name="id" value="{tmpl_var name='id'}"> <div class="clear"><div class="right"> <button class="btn btn-default formbutton-success" type="button" value="{tmpl_var name='btn_save_txt'}" data-submit-form="pageForm" data-form-action="admin/system_config_edit.php">{tmpl_var name='btn_save_txt'}</button> <button class="btn btn-default formbutton-default" type="button" value="{tmpl_var name='btn_cancel_txt'}" data-load-content="admin/users_list.php">{tmpl_var name='btn_cancel_txt'}</button> -</div></div> \ No newline at end of file +</div></div> diff --git a/interface/web/capp.php b/interface/web/capp.php index 5d49fe80d7b8d33807c50214daf0719bffe70026..71d3d9ba35c79e0da5b2a84097276f9a644476d0 100644 --- a/interface/web/capp.php +++ b/interface/web/capp.php @@ -31,45 +31,37 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. require_once '../lib/config.inc.php'; require_once '../lib/app.inc.php'; +include_once 'common.php'; + //* Import module variable $mod = $_REQUEST["mod"]; //* If we click on a search result, load that one instead of the module's start page $redirect = (isset($_REQUEST["redirect"]) ? $_REQUEST["redirect"] : ''); //* Check if user is logged in -if($_SESSION["s"]["user"]['active'] != 1) { +if ($_SESSION["s"]["user"]['active'] != 1) { die("URL_REDIRECT: /index.php"); //die(); } -if(!preg_match("/^[a-z]{2,20}$/i", $mod)) die('module name contains unallowed chars.'); -if($redirect != '' && !preg_match("/^[a-z0-9]+\/[a-z0-9_\.\-]+\?id=[0-9]{1,9}(\&type=[a-z0-9_\.\-]+)?$/i", $redirect)) die('redirect contains unallowed chars.'); +if (!preg_match("/^[a-z]{2,20}$/i", $mod)) die('module name contains unallowed chars.'); +if ($redirect != '' && !preg_match("/^[a-z0-9]+\/[a-z0-9_\.\-]+\?id=[0-9]{1,9}(\&type=[a-z0-9_\.\-]+)?$/i", $redirect)) die('redirect contains unallowed chars.'); //* Check if user may use the module. $user_modules = explode(",", $_SESSION["s"]["user"]["modules"]); -if(!in_array($mod, $user_modules)) $app->error($app->lng(301)); +if (!in_array($mod, $user_modules)) $app->error($app->lng(301)); //* Load module configuration into the session. -if(is_file($mod."/lib/module.conf.php")) { +if (is_file($mod."/lib/module.conf.php")) { include_once $mod."/lib/module.conf.php"; - $menu_dir = ISPC_WEB_PATH.'/' . $mod . '/lib/menu.d'; - - if (is_dir($menu_dir)) { - if ($dh = opendir($menu_dir)) { - //** Go through all files in the menu dir - while (($file = readdir($dh)) !== false) { - if ($file != '.' && $file != '..' && substr($file, -9, 9) == '.menu.php' && $file != 'dns_resync.menu.php') { - include_once $menu_dir . '/' . $file; - } - } - } - } + $menu_dir = ISPC_WEB_PATH.'/'.$mod.'/lib/menu.d'; + include_menu_dir_files($menu_dir); $_SESSION["s"]["module"] = $module; session_write_close(); - if($redirect == ''){ + if ($redirect == '') { echo "HEADER_REDIRECT:".$_SESSION["s"]["module"]["startpage"]; } else { //* If we click on a search result, load that one instead of the module's start page diff --git a/interface/web/client/client_del.php b/interface/web/client/client_del.php index c018b7a27db50b9686f63aedce827cc8a89b49ef..dadcae0bdff53f2152b17a59e596d0d906902def 100644 --- a/interface/web/client/client_del.php +++ b/interface/web/client/client_del.php @@ -69,7 +69,8 @@ class page_action extends tform_actions { 'mail_user' => 'email', 'mail_user_filter' => '', 'shell_user' => 'username', - 'spamfilter_users' => '', 'spamfilter_wblist' => '', + 'spamfilter_users' => '', + 'spamfilter_wblist' => '', 'support_message' => '', 'web_domain' => 'domain', 'web_folder' => 'path', @@ -208,6 +209,5 @@ class page_action extends tform_actions { } $page = new page_action; -$page->onDelete() +$page->onDelete(); -?> diff --git a/interface/web/client/client_edit.php b/interface/web/client/client_edit.php index 3d2e4e805d5d7cfe4836bc9f443b40959252e2bb..f1964d7eff567a3ef7bd5d93d859a7c8ebb3c519 100644 --- a/interface/web/client/client_edit.php +++ b/interface/web/client/client_edit.php @@ -190,6 +190,15 @@ class page_action extends tform_actions { $app->tpl->setVar("show_per_domain_relay_options", 0); } + // APS is enabled or not + $global_config = $app->getconf->get_global_config('sites'); + if($global_config['show_aps_menu'] == 'y') { + $app->tpl->setVar("show_aps_menu", 1); + } else { + $app->tpl->setVar("show_aps_menu", 0); + } + + //* Set the 'customer no' default value if($this->id == 0) { @@ -425,122 +434,16 @@ class page_action extends tform_actions { $app->db->query($sql, $password, $client_id); } - if(!isset($this->dataRecord['locked'])) $this->dataRecord['locked'] = 'n'; - if(isset($conf['demo_mode']) && $conf['demo_mode'] != true && $this->dataRecord["locked"] != $this->oldDataRecord['locked']) { - /** lock all the things like web, mail etc. - easy to extend */ - - - // get tmp_data of client - $client_data = $app->db->queryOneRecord('SELECT `tmp_data` FROM `client` WHERE `client_id` = ?', $this->id); - - if($client_data['tmp_data'] == '') $tmp_data = array(); - else $tmp_data = unserialize($client_data['tmp_data']); - - if(!is_array($tmp_data)) $tmp_data = array(); - - // database tables with their primary key columns - $to_disable = array('cron' => 'id', - 'ftp_user' => 'ftp_user_id', - 'mail_domain' => 'domain_id', - 'mail_user' => 'mailuser_id', - 'mail_user_smtp' => 'mailuser_id', - 'mail_forwarding' => 'forwarding_id', - 'mail_get' => 'mailget_id', - 'openvz_vm' => 'vm_id', - 'shell_user' => 'shell_user_id', - 'webdav_user' => 'webdav_user_id', - 'web_database' => 'database_id', - 'web_domain' => 'domain_id', - 'web_folder' => 'web_folder_id', - 'web_folder_user' => 'web_folder_user_id' - ); - - $udata = $app->db->queryOneRecord('SELECT `userid` FROM `sys_user` WHERE `client_id` = ?', $this->id); - $gdata = $app->db->queryOneRecord('SELECT `groupid` FROM `sys_group` WHERE `client_id` = ?', $this->id); - $sys_groupid = $gdata['groupid']; - $sys_userid = $udata['userid']; - - $entries = array(); - if($this->dataRecord['locked'] == 'y') { - $prev_active = array(); - $prev_sysuser = array(); - foreach($to_disable as $current => $keycolumn) { - $active_col = 'active'; - $reverse = false; - if($current == 'mail_user') { - $active_col = 'postfix'; - } elseif($current == 'mail_user_smtp') { - $current = 'mail_user'; - $active_col = 'disablesmtp'; - $reverse = true; - } - - if(!isset($prev_active[$current])) $prev_active[$current] = array(); - if(!isset($prev_sysuser[$current])) $prev_sysuser[$current] = array(); - - $entries = $app->db->queryAllRecords('SELECT ?? as `id`, `sys_userid`, ?? FROM ?? WHERE `sys_groupid` = ?', $keycolumn, $active_col, $current, $sys_groupid); - foreach($entries as $item) { - - if($item[$active_col] != 'y' && $reverse == false) $prev_active[$current][$item['id']][$active_col] = 'n'; - elseif($item[$active_col] == 'y' && $reverse == true) $prev_active[$current][$item['id']][$active_col] = 'y'; - if($item['sys_userid'] != $sys_userid) $prev_sysuser[$current][$item['id']] = $item['sys_userid']; - // we don't have to store these if y, as everything without previous state gets enabled later - - $app->db->datalogUpdate($current, array($active_col => ($reverse == true ? 'y' : 'n'), 'sys_userid' => $_SESSION["s"]["user"]["userid"]), $keycolumn, $item['id']); - } - } - - $tmp_data['prev_active'] = $prev_active; - $tmp_data['prev_sys_userid'] = $prev_sysuser; - $app->db->query("UPDATE `client` SET `tmp_data` = ? WHERE `client_id` = ?", serialize($tmp_data), $this->id); - unset($prev_active); - unset($prev_sysuser); - } elseif($this->dataRecord['locked'] == 'n') { - foreach($to_disable as $current => $keycolumn) { - $active_col = 'active'; - $reverse = false; - if($current == 'mail_user') { - $active_col = 'postfix'; - } elseif($current == 'mail_user_smtp') { - $current = 'mail_user'; - $active_col = 'disablesmtp'; - $reverse = true; - } - - $entries = $app->db->queryAllRecords('SELECT ?? as `id` FROM ?? WHERE `sys_groupid` = ?', $keycolumn, $current, $sys_groupid); - foreach($entries as $item) { - $set_active = ($reverse == true ? 'n' : 'y'); - $set_inactive = ($reverse == true ? 'y' : 'n'); - $set_sysuser = $sys_userid; - if(array_key_exists('prev_active', $tmp_data) == true - && array_key_exists($current, $tmp_data['prev_active']) == true - && array_key_exists($item['id'], $tmp_data['prev_active'][$current]) == true - && $tmp_data['prev_active'][$current][$item['id']][$active_col] == $set_inactive) $set_active = $set_inactive; - if(array_key_exists('prev_sysuser', $tmp_data) == true - && array_key_exists($current, $tmp_data['prev_sysuser']) == true - && array_key_exists($item['id'], $tmp_data['prev_sysuser'][$current]) == true - && $tmp_data['prev_sysuser'][$current][$item['id']] != $sys_userid) $set_sysuser = $tmp_data['prev_sysuser'][$current][$item['id']]; - - $app->db->datalogUpdate($current, array($active_col => $set_active, 'sys_userid' => $set_sysuser), $keycolumn, $item['id']); - } - } - if(array_key_exists('prev_active', $tmp_data)) unset($tmp_data['prev_active']); - $app->db->query("UPDATE `client` SET `tmp_data` = ? WHERE `client_id` = ?", serialize($tmp_data), $this->id); - } - unset($tmp_data); - unset($entries); - unset($to_disable); - } + // lock and cancel + if(!isset($this->dataRecord['locked'])) $this->dataRecord['locked'] = 'n'; + if(isset($conf['demo_mode']) && $conf['demo_mode'] != true && $this->dataRecord["locked"] != $this->oldDataRecord['locked']) + { + $lock = $app->functions->func_client_lock($this->id,$this->dataRecord["locked"]); + } if(!isset($this->dataRecord['canceled'])) $this->dataRecord['canceled'] = 'n'; if(isset($conf['demo_mode']) && $conf['demo_mode'] != true && $this->dataRecord["canceled"] != $this->oldDataRecord['canceled']) { - if($this->dataRecord['canceled'] == 'y') { - $sql = "UPDATE sys_user SET active = '0' WHERE client_id = ?"; - $app->db->query($sql, $this->id); - } elseif($this->dataRecord['canceled'] == 'n') { - $sql = "UPDATE sys_user SET active = '1' WHERE client_id = ?"; - $app->db->query($sql, $this->id); - } + $cancel = $app->functions->func_client_cancel($this->id,$this->dataRecord["canceled"]); } // language changed diff --git a/interface/web/client/client_template_edit.php b/interface/web/client/client_template_edit.php index dc43d90de3febaa5cf0f6e28507f4d4695ab86d0..7cc3ab5ff9742bd1d8b48bf0120a8399b6b1c954 100644 --- a/interface/web/client/client_template_edit.php +++ b/interface/web/client/client_template_edit.php @@ -73,6 +73,13 @@ class page_action extends tform_actions { } else { $app->tpl->setVar("show_per_domain_relay_options", 0); } + // APS is enabled or not + $global_config = $app->getconf->get_global_config('sites'); + if($global_config['show_aps_menu'] == 'y') { + $app->tpl->setVar("show_aps_menu", 1); + } else { + $app->tpl->setVar("show_aps_menu", 0); + } parent::onShowEnd(); } diff --git a/interface/web/client/form/client.tform.php b/interface/web/client/form/client.tform.php index 83464112d5429a9636d66f7a2c3641aea4d24b1e..1f60ffe1b4ca4955a2b74dda44dbf4c307a1a1fc 100644 --- a/interface/web/client/form/client.tform.php +++ b/interface/web/client/form/client.tform.php @@ -938,6 +938,13 @@ $form["tabs"]['limits'] = array ( 'rows' => '', 'cols' => '' ), + 'limit_mail_backup' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'valuelimit' => 'client:limit_mail_backup', + 'value' => array(0 => 'n', 1 => 'y') + ), 'limit_relayhost' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', diff --git a/interface/web/client/form/client_template.tform.php b/interface/web/client/form/client_template.tform.php index ea8fb7d27e777b8baf752ff79c2858b32e9e27d9..adf72670f8f01f97a1bc02e8a9e35b797191b09c 100644 --- a/interface/web/client/form/client_template.tform.php +++ b/interface/web/client/form/client_template.tform.php @@ -354,6 +354,13 @@ $form["tabs"]['limits'] = array ( 'rows' => '', 'cols' => '' ), + 'limit_mail_backup' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'valuelimit' => 'client:limit_mail_backup', + 'value' => array(0 => 'n', 1 => 'y') + ), 'limit_relayhost' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', diff --git a/interface/web/client/form/domain.tform.php b/interface/web/client/form/domain.tform.php index a3dc1aaac030bab9328c8beb677d32033c86dea1..f521a55b2dac3b5b8f8c18628f4ffbd2b63aa047 100644 --- a/interface/web/client/form/domain.tform.php +++ b/interface/web/client/form/domain.tform.php @@ -100,7 +100,7 @@ $form["tabs"]['domain'] = array ( 1 => array ( 'type' => 'UNIQUE', 'errmsg'=> 'domain_error_unique'), 2 => array ( 'type' => 'REGEX', - 'regex' => '/^[\w\.\-]{2,255}\.[a-zA-Z0-9\-]{2,63}$/', + 'regex' => '/^[\w\.\-]{1,255}\.[a-zA-Z0-9\-]{2,63}$/', 'errmsg'=> 'domain_error_regex'), ), 'default' => '', diff --git a/interface/web/client/form/reseller.tform.php b/interface/web/client/form/reseller.tform.php index f2f88343bf665d77304ffc9de4b130dc9c559be0..d48dea62299ca28d4b82c3fc65c337dd87b693c9 100644 --- a/interface/web/client/form/reseller.tform.php +++ b/interface/web/client/form/reseller.tform.php @@ -936,6 +936,12 @@ $form["tabs"]['limits'] = array ( 'rows' => '', 'cols' => '' ), + 'limit_mail_backup' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n', 1 => 'y') + ), 'limit_relayhost' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', diff --git a/interface/web/client/lib/lang/ar_client.lng b/interface/web/client/lib/lang/ar_client.lng index 6de8fa1138b7eb5285444c7381e38ef0b97cceb3..8b6ff765c9692163f0320df1fe9acc6e3a3bdfc9 100644 --- a/interface/web/client/lib/lang/ar_client.lng +++ b/interface/web/client/lib/lang/ar_client.lng @@ -13,6 +13,7 @@ $wb['limit_mailquota_txt'] = 'Mailbox quota'; $wb['limit_spamfilter_wblist_txt'] = 'Max. number of spamfilter white / blacklist filters'; $wb['limit_spamfilter_user_txt'] = 'Max. number of spamfilter users'; $wb['limit_spamfilter_policy_txt'] = 'Max. number of spamfilter policies'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Default Mailserver'; $wb['company_name_txt'] = 'Company name'; $wb['contact_firstname_txt'] = 'Contact firstname'; diff --git a/interface/web/client/lib/lang/ar_client_template.lng b/interface/web/client/lib/lang/ar_client_template.lng index d1050a825128a5dfbc2987c9bd09529ed289c633..464f1426bec1b804c03ffc63190f639cf8df4467 100644 --- a/interface/web/client/lib/lang/ar_client_template.lng +++ b/interface/web/client/lib/lang/ar_client_template.lng @@ -94,6 +94,7 @@ $wb['limit_aps_txt'] = 'Max. number of APS instances'; $wb['limit_aps_error_notint'] = 'The APS instances limit must be a number.'; $wb['limit_domainmodule_txt'] = 'Domainmodule Limit'; $wb['client_limits_txt'] = 'Client Limits'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Default Mailserver'; $wb['default_webserver_txt'] = 'Default Webserver'; $wb['default_dnsserver_txt'] = 'Default DNS Server'; diff --git a/interface/web/client/lib/lang/ar_reseller.lng b/interface/web/client/lib/lang/ar_reseller.lng index 4d21c7d173522f9aa06151eb20d6c6ce3fc1dee0..9f3ce64e8007a6dd75590e1e68f32586827d9561 100644 --- a/interface/web/client/lib/lang/ar_reseller.lng +++ b/interface/web/client/lib/lang/ar_reseller.lng @@ -12,6 +12,7 @@ $wb['limit_mailquota_txt'] = 'Mailbox quota'; $wb['limit_spamfilter_wblist_txt'] = 'Max. number of spamfilter white / blacklist filters'; $wb['limit_spamfilter_user_txt'] = 'Max. number of spamfilter users'; $wb['limit_spamfilter_policy_txt'] = 'Max. number of spamfilter policies'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Default Mailserver'; $wb['company_name_txt'] = 'Company name'; $wb['contact_firstname_txt'] = 'Contact firstname'; diff --git a/interface/web/client/lib/lang/bg_client.lng b/interface/web/client/lib/lang/bg_client.lng index 5d696dd3201485032f7caab1c71a3fdbdf0f0b42..233a7c9b2733733bfad7d03bb56a3e308e4aa733 100644 --- a/interface/web/client/lib/lang/bg_client.lng +++ b/interface/web/client/lib/lang/bg_client.lng @@ -12,6 +12,7 @@ $wb['limit_mailquota_txt'] = 'Размер на пощенÑките кутии' $wb['limit_spamfilter_wblist_txt'] = 'МакÑ. брой spamfilter white / blacklist filters'; $wb['limit_spamfilter_user_txt'] = 'МакÑ. брой spamfilter users'; $wb['limit_spamfilter_policy_txt'] = 'МакÑ. брой spamfilter policys'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'ПощенÑки Ñървър по подразбиране'; $wb['company_name_txt'] = 'КомпаниÑ'; $wb['contact_firstname_txt'] = 'Contact firstname'; diff --git a/interface/web/client/lib/lang/bg_client_template.lng b/interface/web/client/lib/lang/bg_client_template.lng index 222554fbfd2aa7ede757fd463060f74e83f0cc37..393af633eb323c27eddf094195a82c82f95682d5 100644 --- a/interface/web/client/lib/lang/bg_client_template.lng +++ b/interface/web/client/lib/lang/bg_client_template.lng @@ -94,6 +94,7 @@ $wb['limit_aps_txt'] = 'Max. number of APS instances'; $wb['limit_aps_error_notint'] = 'The APS instances limit must be a number.'; $wb['limit_domainmodule_txt'] = 'Domainmodule Limit'; $wb['client_limits_txt'] = 'Client Limits'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Default Mailserver'; $wb['default_webserver_txt'] = 'Default Webserver'; $wb['default_dnsserver_txt'] = 'Default DNS Server'; diff --git a/interface/web/client/lib/lang/bg_reseller.lng b/interface/web/client/lib/lang/bg_reseller.lng index d8489b581791a7b802681b88e8e39261bfb5ce39..bd25475c64b7d53f9039ee404fb9d352eca2db9f 100644 --- a/interface/web/client/lib/lang/bg_reseller.lng +++ b/interface/web/client/lib/lang/bg_reseller.lng @@ -12,6 +12,7 @@ $wb['limit_mailquota_txt'] = 'Квота на пощенÑката кутиÑ'; $wb['limit_spamfilter_wblist_txt'] = 'Max. number of spamfilter white / blacklist filters'; $wb['limit_spamfilter_user_txt'] = 'Max. number of spamfilter users'; $wb['limit_spamfilter_policy_txt'] = 'Max. number of spamfilter policys'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Мейл Ñървър по подразбиране'; $wb['company_name_txt'] = 'Име на компаниÑта'; $wb['contact_firstname_txt'] = 'Contact firstname'; diff --git a/interface/web/client/lib/lang/br_client.lng b/interface/web/client/lib/lang/br_client.lng index f5f735a9dc055511379e4ee81a21a1cf1c00917d..58557a3a00860c55e399213c506b594d8d60d90f 100644 --- a/interface/web/client/lib/lang/br_client.lng +++ b/interface/web/client/lib/lang/br_client.lng @@ -14,7 +14,8 @@ $wb['limit_mailquota_txt'] = 'Cota da conta de email'; $wb['limit_spamfilter_wblist_txt'] = 'Limite de filtros anti-spam "lista de permissões/bloqueio"'; $wb['limit_spamfilter_user_txt'] = 'Limite de filtros anti-spam por conta de email'; $wb['limit_spamfilter_policy_txt'] = 'Limite de polÃticas anti-spam'; -$wb['default_mailserver_txt'] = 'Servidor de email padrão'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; +$wb['default_mailserver_txt'] = 'Servidor de e-mail padrão'; $wb['company_name_txt'] = 'Empresa'; $wb['contact_firstname_txt'] = 'Nome do contato'; $wb['contact_name_txt'] = 'Contato'; diff --git a/interface/web/client/lib/lang/br_client_template.lng b/interface/web/client/lib/lang/br_client_template.lng index af4824fad1e5c5c402e9d25b7dde1265fbc7461b..92bff5cb06e629bb1b83ccf4bdf2802fc2496fdc 100644 --- a/interface/web/client/lib/lang/br_client_template.lng +++ b/interface/web/client/lib/lang/br_client_template.lng @@ -3,6 +3,7 @@ $wb['ssh_chroot_notempty'] = 'Nenhuma opção chroot SSH selecionada. Selecione $wb['template_type_txt'] = 'Tipo de gabarito'; $wb['template_name_txt'] = 'Nome do gabarito'; $wb['limit_client_error_notint'] = 'Limite de cliente não é um número.'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Servidor de email padrão'; $wb['limit_maildomain_txt'] = 'Limite de domÃnios de email'; $wb['limit_mailbox_txt'] = 'Limite de contas de email'; diff --git a/interface/web/client/lib/lang/br_reseller.lng b/interface/web/client/lib/lang/br_reseller.lng index b7cc4526233771d48282f1d84129d4e9c9b07a63..fea2945178b27515760599e835e6a117f2c7fdf8 100644 --- a/interface/web/client/lib/lang/br_reseller.lng +++ b/interface/web/client/lib/lang/br_reseller.lng @@ -14,7 +14,8 @@ $wb['limit_mailquota_txt'] = 'Cota de contas de email'; $wb['limit_spamfilter_wblist_txt'] = 'Limite de filtros anti-spam "lista de permissões/bloqueio"'; $wb['limit_spamfilter_user_txt'] = 'Limite de filtros anti-spam por usuário'; $wb['limit_spamfilter_policy_txt'] = 'Limite de polÃticas anti-spam'; -$wb['default_mailserver_txt'] = 'Servidor de email padrão'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; +$wb['default_mailserver_txt'] = 'Servidor de e-mail padrão'; $wb['company_name_txt'] = 'Empresa'; $wb['contact_firstname_txt'] = 'Contato'; $wb['contact_name_txt'] = 'Nome do contato'; diff --git a/interface/web/client/lib/lang/ca_client.lng b/interface/web/client/lib/lang/ca_client.lng index cc8276ac20e0bbfe61128df437eb83c5231f9e95..4482b8f2415cd068bdf22d9ea8e8bb1494b15cd2 100644 --- a/interface/web/client/lib/lang/ca_client.lng +++ b/interface/web/client/lib/lang/ca_client.lng @@ -12,6 +12,7 @@ $wb['limit_mailquota_txt'] = 'Quota des boites courriel'; $wb['limit_spamfilter_wblist_txt'] = 'Nombre maximal de liste blanches/noires d\'email'; $wb['limit_spamfilter_user_txt'] = 'Nombre maximal d\'utilisateurs du filtre antispam'; $wb['limit_spamfilter_policy_txt'] = 'Nombre maximal de règles du filtre antispam'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Serveur mail par défaut'; $wb['company_name_txt'] = 'Nom de l\'entreprise'; $wb['contact_name_txt'] = 'Nom de contact'; diff --git a/interface/web/client/lib/lang/ca_client_template.lng b/interface/web/client/lib/lang/ca_client_template.lng index 9328b422aa4038c9e4df98a0ebd336d1b10d57e7..2a0f6eac455066350e28e2cf2d6169dd4159ed0a 100644 --- a/interface/web/client/lib/lang/ca_client_template.lng +++ b/interface/web/client/lib/lang/ca_client_template.lng @@ -93,6 +93,7 @@ $wb['limit_aps_txt'] = 'Nombre max d\'instances APS'; $wb['limit_aps_error_notint'] = 'La limite d\'instances APS doit être un nombre.'; $wb['limit_domainmodule_txt'] = 'Domainmodule Limit'; $wb['client_limits_txt'] = 'Client Limits'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Default Mailserver'; $wb['default_webserver_txt'] = 'Default Webserver'; $wb['default_dnsserver_txt'] = 'Default DNS Server'; diff --git a/interface/web/client/lib/lang/ca_reseller.lng b/interface/web/client/lib/lang/ca_reseller.lng index 6e39d6741f46edd9cdc587215a00dc2ffdd81942..7d92ced9888ab9105744d8b615c37721955c464e 100644 --- a/interface/web/client/lib/lang/ca_reseller.lng +++ b/interface/web/client/lib/lang/ca_reseller.lng @@ -12,6 +12,7 @@ $wb['limit_mailquota_txt'] = 'Quota des boites courriel'; $wb['limit_spamfilter_wblist_txt'] = 'Nombre maximal de liste blanches/noires d\'emails'; $wb['limit_spamfilter_user_txt'] = 'Nombre maximal d\'utilisateurs du filtre antispam'; $wb['limit_spamfilter_policy_txt'] = 'Nombre maximal de règles du filtre antispam'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Serveur mail par défaut'; $wb['company_name_txt'] = 'Nom de l\'entreprise'; $wb['contact_name_txt'] = 'Nom de contact'; diff --git a/interface/web/client/lib/lang/cz_client.lng b/interface/web/client/lib/lang/cz_client.lng index 6c6bb093ad0d43cacb4151ed54ec385802b771a5..691bac508a09cdf18debf37c3878096e3835757d 100644 --- a/interface/web/client/lib/lang/cz_client.lng +++ b/interface/web/client/lib/lang/cz_client.lng @@ -13,6 +13,7 @@ $wb['limit_mailquota_txt'] = 'Kvóta e-mailové schránky'; $wb['limit_spamfilter_wblist_txt'] = 'Max. poÄet spamfiltrových bÃlých / Äerných listinových filtrů'; $wb['limit_spamfilter_user_txt'] = 'Max. poÄet spamflitrových uživatelů'; $wb['limit_spamfilter_policy_txt'] = 'Max. poÄet spamfiltrových politik'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Výchozà e-mailový server'; $wb['company_name_txt'] = 'Název spoleÄnosti'; $wb['contact_name_txt'] = 'Název kontaktu'; diff --git a/interface/web/client/lib/lang/cz_client_template.lng b/interface/web/client/lib/lang/cz_client_template.lng index addc035022b3005d6f052b84e3e436c6fd80a592..f927e7bffdcd3b2acf51f25b20d9ae936d84dac6 100644 --- a/interface/web/client/lib/lang/cz_client_template.lng +++ b/interface/web/client/lib/lang/cz_client_template.lng @@ -93,6 +93,7 @@ $wb['limit_aps_txt'] = 'Max. poÄet APS instalacÃ'; $wb['limit_aps_error_notint'] = 'Limit pro APS instalace musà být ÄÃslo.'; $wb['limit_domainmodule_txt'] = 'Domainmodule Limit'; $wb['client_limits_txt'] = 'Klientské limity'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Výchozà E-mailový server'; $wb['default_webserver_txt'] = 'Výchozà webový server'; $wb['default_dnsserver_txt'] = 'Výchozà DNS server'; diff --git a/interface/web/client/lib/lang/cz_reseller.lng b/interface/web/client/lib/lang/cz_reseller.lng index 2ae6860b32db8bfb73cbfd5fd80527e574630be2..3b137a11bc9999b1b1c299dbab0807dc491f93bc 100644 --- a/interface/web/client/lib/lang/cz_reseller.lng +++ b/interface/web/client/lib/lang/cz_reseller.lng @@ -12,6 +12,7 @@ $wb['limit_mailquota_txt'] = 'Kvóta e-mailové schránky'; $wb['limit_spamfilter_wblist_txt'] = 'Max. poÄet spamfiltrových bÃlých / Äerných listinových filtrů'; $wb['limit_spamfilter_user_txt'] = 'Max. poÄet spamflitrových uživatelů'; $wb['limit_spamfilter_policy_txt'] = 'Max. poÄet spamfiltrových politik'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Výchozà e-mailový server'; $wb['company_name_txt'] = 'Název spoleÄnosti'; $wb['contact_name_txt'] = 'Název kontaktu'; diff --git a/interface/web/client/lib/lang/de_client.lng b/interface/web/client/lib/lang/de_client.lng index 077e3f32658c648551640ce523ed85dd700ba31a..c75f3263a02360a77b8d144b11a49e220eb98e2e 100644 --- a/interface/web/client/lib/lang/de_client.lng +++ b/interface/web/client/lib/lang/de_client.lng @@ -12,6 +12,7 @@ $wb['limit_mailquota_txt'] = 'E-Mail Konto Beschränkung'; $wb['limit_spamfilter_wblist_txt'] = 'Max. Anzahl an Spamfilter (White-/Blacklist)'; $wb['limit_spamfilter_user_txt'] = 'Max. Anzahl an Spamfilter Benutzern'; $wb['limit_spamfilter_policy_txt'] = 'Max. Anzahl an Spamfilter Richtlinien'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Standardmailserver'; $wb['company_name_txt'] = 'Firmenname'; $wb['contact_firstname_txt'] = 'Vorname'; diff --git a/interface/web/client/lib/lang/de_client_template.lng b/interface/web/client/lib/lang/de_client_template.lng index 6ca0f25579ca49362afa7ad213461fdaeae3b5dc..f985e19847c23a23596b0cb2f1443adfa74548ff 100644 --- a/interface/web/client/lib/lang/de_client_template.lng +++ b/interface/web/client/lib/lang/de_client_template.lng @@ -95,6 +95,7 @@ $wb['limit_aps_txt'] = 'Max. Anzahl an APS-Instanzen'; $wb['limit_aps_error_notint'] = 'Das APS Instanzen Limit muss eine Zahl sein.'; $wb['limit_domainmodule_txt'] = 'Domainmodule Limit'; $wb['client_limits_txt'] = 'Client Limits'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Default Mailserver'; $wb['default_webserver_txt'] = 'Default Webserver'; $wb['default_dnsserver_txt'] = 'Default DNS Server'; diff --git a/interface/web/client/lib/lang/de_reseller.lng b/interface/web/client/lib/lang/de_reseller.lng index c5536ceec955201d326dd86cac4908e3d6c1670a..108cf7cd95100009633196d244341a47983109e2 100644 --- a/interface/web/client/lib/lang/de_reseller.lng +++ b/interface/web/client/lib/lang/de_reseller.lng @@ -12,6 +12,7 @@ $wb['limit_mailquota_txt'] = 'E-Mail konten Beschränkung'; $wb['limit_spamfilter_wblist_txt'] = 'Max. Anzahl an White-/Blacklist Filter'; $wb['limit_spamfilter_user_txt'] = 'Max. Anzahl an Spamfilter Benutzern'; $wb['limit_spamfilter_policy_txt'] = 'Max. Anzahl an Spamfilter Richtlinien'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Standardmailserver'; $wb['company_name_txt'] = 'Firmenname'; $wb['contact_firstname_txt'] = 'Vorname'; diff --git a/interface/web/client/lib/lang/dk_client.lng b/interface/web/client/lib/lang/dk_client.lng index aebe9a9bddc7e58dfdeb5013830d1b64a7c1eb48..c5154dac5d95889718361249f70da1e499b4d19c 100644 --- a/interface/web/client/lib/lang/dk_client.lng +++ b/interface/web/client/lib/lang/dk_client.lng @@ -14,6 +14,7 @@ $wb['limit_mailquota_txt'] = 'Postboks kvota'; $wb['limit_spamfilter_wblist_txt'] = 'Max. antal af spamfilter white/blacklist filtere'; $wb['limit_spamfilter_user_txt'] = 'Max. antal af spamfilter brugere'; $wb['limit_spamfilter_policy_txt'] = 'Max. antal af spamfilter politikker'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Standard Mailserver'; $wb['company_name_txt'] = 'Firma navn'; $wb['contact_name_txt'] = 'Kontakt navn'; diff --git a/interface/web/client/lib/lang/dk_client_template.lng b/interface/web/client/lib/lang/dk_client_template.lng index 64a8b30874fc0078300922f25fbeabadbb0a418e..daacc207e49901281a688a0d197266210c662e3d 100644 --- a/interface/web/client/lib/lang/dk_client_template.lng +++ b/interface/web/client/lib/lang/dk_client_template.lng @@ -93,6 +93,7 @@ $wb['limit_aps_txt'] = 'Max. antal af APS instances'; $wb['limit_aps_error_notint'] = 'APS forekomst grænse skal være et tal.'; $wb['limit_domainmodule_txt'] = 'Domænemodul Begrænsning'; $wb['client_limits_txt'] = 'Kunde Begrænsninger'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Default Mailserver'; $wb['default_webserver_txt'] = 'Default Webserver'; $wb['default_dnsserver_txt'] = 'Default DNS Server'; diff --git a/interface/web/client/lib/lang/dk_reseller.lng b/interface/web/client/lib/lang/dk_reseller.lng index ef37da2c8ed97d679b963763fe78848a53c861b2..816d9a35ef2768afe2ef23ac53b3b0b849f02eea 100644 --- a/interface/web/client/lib/lang/dk_reseller.lng +++ b/interface/web/client/lib/lang/dk_reseller.lng @@ -14,6 +14,7 @@ $wb['limit_mailquota_txt'] = 'Postboks kvota'; $wb['limit_spamfilter_wblist_txt'] = 'Max. antal af spamfilter white/blacklist filtere'; $wb['limit_spamfilter_user_txt'] = 'Max. antal af spamfilter brugere'; $wb['limit_spamfilter_policy_txt'] = 'Max. antal af spamfilter politikker'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Standard Mailserver'; $wb['company_name_txt'] = 'Firma navn'; $wb['contact_name_txt'] = 'Kontakt navn'; diff --git a/interface/web/client/lib/lang/el_client.lng b/interface/web/client/lib/lang/el_client.lng index 468c6e29af4299e05e8c79b8a3132b0f567ebcb0..373c751a520fef1438b9127481716da653f92bf5 100644 --- a/interface/web/client/lib/lang/el_client.lng +++ b/interface/web/client/lib/lang/el_client.lng @@ -13,6 +13,7 @@ $wb['limit_mailquota_txt'] = 'ÎŒÏιο χώÏου θυÏίδας'; $wb['limit_spamfilter_wblist_txt'] = 'ÎŒÏιο spamfilter white / blacklist'; $wb['limit_spamfilter_user_txt'] = 'ÎŒÏιο χÏηστών spamfilter'; $wb['limit_spamfilter_policy_txt'] = 'ÎŒÏιο πολιτικών spamfilter'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Î ÏοκαθοÏισμÎνος Mailserver'; $wb['company_name_txt'] = 'Όνομα εταιÏίας'; $wb['contact_firstname_txt'] = 'Contact firstname'; diff --git a/interface/web/client/lib/lang/el_client_template.lng b/interface/web/client/lib/lang/el_client_template.lng index 9b6333deaabbb313c604f6944a47fa62b122db28..bd0097b3dfe1b548ad6fba74daa26e0d04847637 100644 --- a/interface/web/client/lib/lang/el_client_template.lng +++ b/interface/web/client/lib/lang/el_client_template.lng @@ -94,6 +94,7 @@ $wb['limit_aps_txt'] = 'Max. number of APS instances'; $wb['limit_aps_error_notint'] = 'The APS instances limit must be a number.'; $wb['limit_domainmodule_txt'] = 'Domainmodule Limit'; $wb['client_limits_txt'] = 'Client Limits'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Default Mailserver'; $wb['default_webserver_txt'] = 'Default Webserver'; $wb['default_dnsserver_txt'] = 'Default DNS Server'; diff --git a/interface/web/client/lib/lang/el_reseller.lng b/interface/web/client/lib/lang/el_reseller.lng index 2a4ae26bdf0ccb30c982a532fd2f62854bfe36a8..512351c8f0374ae136a7bf642a753016b50fc2d9 100644 --- a/interface/web/client/lib/lang/el_reseller.lng +++ b/interface/web/client/lib/lang/el_reseller.lng @@ -12,6 +12,7 @@ $wb['limit_mailquota_txt'] = 'ÎŒÏιο θυÏίδας'; $wb['limit_spamfilter_wblist_txt'] = 'ÎŒÏιο φίλτÏων spamfilter white / blacklist'; $wb['limit_spamfilter_user_txt'] = 'ÎŒÏιο χÏηστών spamfilter'; $wb['limit_spamfilter_policy_txt'] = 'ÎŒÏιο πολιτικών spamfilter'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Î ÏοκαθοÏισμÎνος Mailserver'; $wb['company_name_txt'] = 'Όνομα ΕταιÏίας'; $wb['contact_firstname_txt'] = 'Contact firstname'; diff --git a/interface/web/client/lib/lang/en_client.lng b/interface/web/client/lib/lang/en_client.lng index 0f38b60dd925382920ee7ebc8eaba20ca525880e..acaafeb390e9ae7c62180f35fa615dbc49ad9870 100644 --- a/interface/web/client/lib/lang/en_client.lng +++ b/interface/web/client/lib/lang/en_client.lng @@ -14,6 +14,7 @@ $wb['limit_mailquota_txt'] = 'Mailbox quota'; $wb['limit_spamfilter_wblist_txt'] = 'Max. number of spamfilter white / blacklist filters'; $wb['limit_spamfilter_user_txt'] = 'Max. number of spamfilter users'; $wb['limit_spamfilter_policy_txt'] = 'Max. number of spamfilter policies'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Default Mailserver'; $wb['company_name_txt'] = 'Company name'; $wb['contact_firstname_txt'] = 'Contact firstname'; diff --git a/interface/web/client/lib/lang/en_client_template.lng b/interface/web/client/lib/lang/en_client_template.lng index 8cb93a9966b833e13089e31f717f9bc8de9843ba..ad20fc5699b774a50588513119ad21c7ed9e9457 100644 --- a/interface/web/client/lib/lang/en_client_template.lng +++ b/interface/web/client/lib/lang/en_client_template.lng @@ -3,6 +3,7 @@ $wb['ssh_chroot_notempty'] = 'No SSH chroot option selected. Select at least one $wb['template_type_txt'] = 'Template type'; $wb['template_name_txt'] = 'Template name'; $wb['limit_client_error_notint'] = 'Client Limit is not a number.'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Default Mailserver'; $wb['limit_maildomain_txt'] = 'Max. number of email domains'; $wb['limit_mailbox_txt'] = 'Max. number of mailboxes'; diff --git a/interface/web/client/lib/lang/en_reseller.lng b/interface/web/client/lib/lang/en_reseller.lng index 8e09ae1b4d3cd22504291cb73476b9f8fc644488..d243c28cc17e6785121a63afc7c0d1e2c42a445f 100644 --- a/interface/web/client/lib/lang/en_reseller.lng +++ b/interface/web/client/lib/lang/en_reseller.lng @@ -14,6 +14,7 @@ $wb['limit_mailquota_txt'] = 'Mailbox quota'; $wb['limit_spamfilter_wblist_txt'] = 'Max. number of spamfilter white / blacklist filters'; $wb['limit_spamfilter_user_txt'] = 'Max. number of spamfilter users'; $wb['limit_spamfilter_policy_txt'] = 'Max. number of spamfilter policies'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Default Mailserver'; $wb['company_name_txt'] = 'Company name'; $wb['contact_firstname_txt'] = 'Contact firstname'; diff --git a/interface/web/client/lib/lang/es_client.lng b/interface/web/client/lib/lang/es_client.lng index 6fe418a1d61c1b3a73c6096c4dffa057228caf75..d9210b8ec36b1a97b2acafda4bc12684f1833d11 100644 --- a/interface/web/client/lib/lang/es_client.lng +++ b/interface/web/client/lib/lang/es_client.lng @@ -30,6 +30,7 @@ $wb['db_servers_txt'] = 'Servidores de base de datos'; $wb['db_servers_used'] = 'El servidor que está intentando borrar de este cliente está siendo utilizado como servidor de base de datos. Por favor asegúrese de que este servidor no esté siendo utilizado por este cliente antes de borrarlo.'; $wb['default_dbserver_txt'] = 'Servidor de base de datos por defecto'; $wb['default_dnsserver_txt'] = 'Servidor DNS por defecto'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Servidor de correo por defecto'; $wb['default_slave_dnsserver_txt'] = 'Servidor DNS secundario por defecto'; $wb['default_webserver_txt'] = 'Servidor web por defecto'; diff --git a/interface/web/client/lib/lang/es_client_template.lng b/interface/web/client/lib/lang/es_client_template.lng index 0c2a4700fd37b64e12cf17bc5502bc1574485958..2099173c191006baf1c7d7e1fd0e3f191335c1fb 100644 --- a/interface/web/client/lib/lang/es_client_template.lng +++ b/interface/web/client/lib/lang/es_client_template.lng @@ -6,6 +6,7 @@ $wb['cron_job_limits_txt'] = 'LÃmites de trabajos programados'; $wb['database_limits_txt'] = 'LÃmites de base de datos'; $wb['default_dbserver_txt'] = 'Servidor de bases de datos por defecto'; $wb['default_dnsserver_txt'] = 'Servidor DNS por defecto'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Servidor de correo por defecto'; $wb['default_slave_dnsserver_txt'] = 'Servidor DNS secundario por defecto'; $wb['default_webserver_txt'] = 'Servidor web por defecto'; diff --git a/interface/web/client/lib/lang/es_reseller.lng b/interface/web/client/lib/lang/es_reseller.lng index 2d96fe2bdca5d999fd5adde2831826d1f2fcf24d..9fe710e6e327e33656ca2821ccc7a50507d1c11d 100644 --- a/interface/web/client/lib/lang/es_reseller.lng +++ b/interface/web/client/lib/lang/es_reseller.lng @@ -34,6 +34,7 @@ $wb['db_servers_txt'] = 'Servidor de base de datos'; $wb['db_servers_used'] = 'El servidor que está intentando borrar de este cliente está siendo utilizado como servidor de base de datos. Por favor asegúrese de que este servidor no esté siendo utilizado por este cliente antes de borrarlo.'; $wb['default_dbserver_txt'] = 'Servidor de base de datos por defecto'; $wb['default_dnsserver_txt'] = 'Servidor DNS por defecto'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Servidor de correo por defecto'; $wb['default_slave_dnsserver_txt'] = 'Servidor DNS secundario por defecto'; $wb['default_webserver_txt'] = 'Servidor web por defecto'; diff --git a/interface/web/client/lib/lang/fi_client.lng b/interface/web/client/lib/lang/fi_client.lng index b373a7f10fbb232b26b1179adf11d82243f9b422..68058e1ab5a4c87365db95dc285519b21feb9216 100644 --- a/interface/web/client/lib/lang/fi_client.lng +++ b/interface/web/client/lib/lang/fi_client.lng @@ -12,6 +12,7 @@ $wb['limit_mailquota_txt'] = 'Postilaatikon enimmäiskoko'; $wb['limit_spamfilter_wblist_txt'] = 'Roskapostisuodattimien määrä'; $wb['limit_spamfilter_user_txt'] = 'Roskapostisuodattimen käyttäjien määrä'; $wb['limit_spamfilter_policy_txt'] = 'Roskapostisuodattimen kohtelutapojen määrä'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Oletuspostipalvelin'; $wb['company_name_txt'] = 'Yrityksen nimi'; $wb['contact_firstname_txt'] = 'Contact firstname'; diff --git a/interface/web/client/lib/lang/fi_client_template.lng b/interface/web/client/lib/lang/fi_client_template.lng index 68d9c0bead2c88dabdea4ba1227638c1c8c55cf7..46ce6e6a8d03a0a96d6964adf46253d8aa2820bb 100644 --- a/interface/web/client/lib/lang/fi_client_template.lng +++ b/interface/web/client/lib/lang/fi_client_template.lng @@ -94,6 +94,7 @@ $wb['limit_aps_txt'] = 'Max. number of APS instances'; $wb['limit_aps_error_notint'] = 'The APS instances limit must be a number.'; $wb['limit_domainmodule_txt'] = 'Domainmodule Limit'; $wb['client_limits_txt'] = 'Client Limits'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Default Mailserver'; $wb['default_webserver_txt'] = 'Default Webserver'; $wb['default_dnsserver_txt'] = 'Default DNS Server'; diff --git a/interface/web/client/lib/lang/fi_reseller.lng b/interface/web/client/lib/lang/fi_reseller.lng index d0e4eedcfe95c30dbb58494a5385e148988150c5..5c16e702644e8586b5aff5795f7aac8c3e2857f8 100644 --- a/interface/web/client/lib/lang/fi_reseller.lng +++ b/interface/web/client/lib/lang/fi_reseller.lng @@ -12,6 +12,7 @@ $wb['limit_mailquota_txt'] = 'Sähköpostilaatikoiden levytila'; $wb['limit_spamfilter_wblist_txt'] = 'Roskapostisuodatimen estetty / sallittu-suodattimien enimmäismäärä'; $wb['limit_spamfilter_user_txt'] = 'Roskapostisuodattimen käyttäjien enimmäismäärä'; $wb['limit_spamfilter_policy_txt'] = 'Roskapostin kohtelutapojen enimmäismäärä'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Oletuspostipalvelin'; $wb['company_name_txt'] = 'Yrityksen nimi'; $wb['contact_firstname_txt'] = 'Contact firstname'; diff --git a/interface/web/client/lib/lang/fr_client.lng b/interface/web/client/lib/lang/fr_client.lng index 61b9e800b5609cee42dd2476b25c930608a472e6..fc96c0d3195dab0b51bc75225e646395c2f14e03 100644 --- a/interface/web/client/lib/lang/fr_client.lng +++ b/interface/web/client/lib/lang/fr_client.lng @@ -12,6 +12,7 @@ $wb['limit_mailquota_txt'] = 'Quota des boîtes aux lettres'; $wb['limit_spamfilter_wblist_txt'] = 'Nombre maximal de liste blanches/noires d’e-mail'; $wb['limit_spamfilter_user_txt'] = 'Nombre maximal d’utilisateurs du filtre antispam'; $wb['limit_spamfilter_policy_txt'] = 'Nombre maximal de règles du filtre antispam'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Serveur mail par défaut'; $wb['company_name_txt'] = 'Nom de l’entreprise'; $wb['contact_name_txt'] = 'Nom de contact'; diff --git a/interface/web/client/lib/lang/fr_client_template.lng b/interface/web/client/lib/lang/fr_client_template.lng index f09e408cc96d20ad69de347aa03f5a517d2e5ec8..33548deba4979d017765df6fd9a6eebbe787c742 100644 --- a/interface/web/client/lib/lang/fr_client_template.lng +++ b/interface/web/client/lib/lang/fr_client_template.lng @@ -93,6 +93,7 @@ $wb['limit_aps_txt'] = 'Nombre max d’instances APS'; $wb['limit_aps_error_notint'] = 'La limite d’instances APS doit être un nombre.'; $wb['limit_domainmodule_txt'] = 'Domainmodule Limit'; $wb['client_limits_txt'] = 'Client Limits'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Default Mailserver'; $wb['default_webserver_txt'] = 'Default Webserver'; $wb['default_dnsserver_txt'] = 'Default DNS Server'; diff --git a/interface/web/client/lib/lang/fr_reseller.lng b/interface/web/client/lib/lang/fr_reseller.lng index ef5d956d33e47e2e10817f09cdf3723085b4dc26..867e9d5da06ff6320e8389d42f9bb41934679317 100644 --- a/interface/web/client/lib/lang/fr_reseller.lng +++ b/interface/web/client/lib/lang/fr_reseller.lng @@ -12,6 +12,7 @@ $wb['limit_mailquota_txt'] = 'Quota des boîtes aux lettres'; $wb['limit_spamfilter_wblist_txt'] = 'Nombre maximal de liste blanches/noires d’e-mails'; $wb['limit_spamfilter_user_txt'] = 'Nombre maximal d’utilisateurs du filtre antispam'; $wb['limit_spamfilter_policy_txt'] = 'Nombre maximal de règles du filtre antispam'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Serveur mail par défaut'; $wb['company_name_txt'] = 'Nom de l’entreprise'; $wb['contact_name_txt'] = 'Nom de contact'; diff --git a/interface/web/client/lib/lang/hr_client.lng b/interface/web/client/lib/lang/hr_client.lng index bdfcb839d34e2b31fd9c9d20015f3122c742edb0..ed00a5c5202ee427218c3f7dfbc3af6a54f7421c 100644 --- a/interface/web/client/lib/lang/hr_client.lng +++ b/interface/web/client/lib/lang/hr_client.lng @@ -13,6 +13,7 @@ $wb['limit_mailquota_txt'] = 'VeliÄina mailboxa'; $wb['limit_spamfilter_wblist_txt'] = 'Maksimalan broj spamfilter white / blacklist filtera'; $wb['limit_spamfilter_user_txt'] = 'Maksimalan broj spamfilter korisnika'; $wb['limit_spamfilter_policy_txt'] = 'Maksimalan broj spamfilter pravila'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Izaberi email server'; $wb['company_name_txt'] = 'Poduzeće'; $wb['contact_firstname_txt'] = 'Contact firstname'; diff --git a/interface/web/client/lib/lang/hr_client_template.lng b/interface/web/client/lib/lang/hr_client_template.lng index 23ff2def637b5a141d024fac4724b45a694b240e..ce5b3e8ebc874b95612da325d18f4a3add305157 100644 --- a/interface/web/client/lib/lang/hr_client_template.lng +++ b/interface/web/client/lib/lang/hr_client_template.lng @@ -94,6 +94,7 @@ $wb['limit_aps_txt'] = 'Max. number of APS instances'; $wb['limit_aps_error_notint'] = 'The APS instances limit must be a number.'; $wb['limit_domainmodule_txt'] = 'Domainmodule Limit'; $wb['client_limits_txt'] = 'Client Limits'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Default Mailserver'; $wb['default_webserver_txt'] = 'Default Webserver'; $wb['default_dnsserver_txt'] = 'Default DNS Server'; diff --git a/interface/web/client/lib/lang/hr_reseller.lng b/interface/web/client/lib/lang/hr_reseller.lng index 24c84e5c23107cb756b0d63bfcd32473d7e51e3c..aaedd0b1c5e35e98b5fef8510a81839e0e5da42d 100644 --- a/interface/web/client/lib/lang/hr_reseller.lng +++ b/interface/web/client/lib/lang/hr_reseller.lng @@ -13,6 +13,7 @@ $wb['limit_mailquota_txt'] = 'VeliÄina mailboxa'; $wb['limit_spamfilter_wblist_txt'] = 'Maksimalan broj spamfilter white / blacklist filtera'; $wb['limit_spamfilter_user_txt'] = 'Maksimalan broj spamfilter korisnika'; $wb['limit_spamfilter_policy_txt'] = 'Maksimalan broj spamfilter pravila'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Izaberi email server'; $wb['company_name_txt'] = 'Poduzeće'; $wb['contact_firstname_txt'] = 'Contact firstname'; diff --git a/interface/web/client/lib/lang/hu_client.lng b/interface/web/client/lib/lang/hu_client.lng index 9d3aba88b974ad086a58834913421b1b8679dad9..9e6ad94a7b80c65bae8def8c4b09e87e773bab5a 100644 --- a/interface/web/client/lib/lang/hu_client.lng +++ b/interface/web/client/lib/lang/hu_client.lng @@ -12,6 +12,7 @@ $wb['limit_mailquota_txt'] = 'Mailbox korlát'; $wb['limit_spamfilter_wblist_txt'] = 'Max. number of spamfilter white / blacklist filters'; $wb['limit_spamfilter_user_txt'] = 'Max. number of spamfilter users'; $wb['limit_spamfilter_policy_txt'] = 'Max. number of spamfilter policies'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Alap levelezÅ‘ szerver'; $wb['company_name_txt'] = 'Cégnév'; $wb['contact_firstname_txt'] = 'Contact firstname'; diff --git a/interface/web/client/lib/lang/hu_client_template.lng b/interface/web/client/lib/lang/hu_client_template.lng index 63a17660549b98b8e268688245823e6e9ece9839..74d37e7589486816faa3462e85e7ae1257c5cf47 100644 --- a/interface/web/client/lib/lang/hu_client_template.lng +++ b/interface/web/client/lib/lang/hu_client_template.lng @@ -94,6 +94,7 @@ $wb['limit_aps_txt'] = 'Max. number of APS instances'; $wb['limit_aps_error_notint'] = 'The APS instances limit must be a number.'; $wb['limit_domainmodule_txt'] = 'Domainmodule Limit'; $wb['client_limits_txt'] = 'Client Limits'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Default Mailserver'; $wb['default_webserver_txt'] = 'Default Webserver'; $wb['default_dnsserver_txt'] = 'Default DNS Server'; diff --git a/interface/web/client/lib/lang/hu_reseller.lng b/interface/web/client/lib/lang/hu_reseller.lng index ed67fba8863ca326e0320a1203edebd514c2c510..26fffbc7e35a00eece5f249f943667fe516cea11 100644 --- a/interface/web/client/lib/lang/hu_reseller.lng +++ b/interface/web/client/lib/lang/hu_reseller.lng @@ -12,6 +12,7 @@ $wb['limit_mailquota_txt'] = 'Mailbox quota'; $wb['limit_spamfilter_wblist_txt'] = 'Max. number of spamfilter white / blacklist filters'; $wb['limit_spamfilter_user_txt'] = 'Max. number of spamfilter users'; $wb['limit_spamfilter_policy_txt'] = 'Max. number of spamfilter policies'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Default Mailserver'; $wb['company_name_txt'] = 'Cégnév'; $wb['contact_firstname_txt'] = 'Contact firstname'; diff --git a/interface/web/client/lib/lang/id_client.lng b/interface/web/client/lib/lang/id_client.lng index f4c3bd974c9896d2d95f4591e2f16e4b015f408a..47f8971b1fdec6b1dd36c9ce145319b19cffcd7d 100644 --- a/interface/web/client/lib/lang/id_client.lng +++ b/interface/web/client/lib/lang/id_client.lng @@ -13,6 +13,7 @@ $wb['limit_mailquota_txt'] = 'Kuota Mailbox'; $wb['limit_spamfilter_wblist_txt'] = 'Jumlah maks penyaringan whitelist/blacklist spamfilter'; $wb['limit_spamfilter_user_txt'] = 'Jumlah maks pengguna spamfilter'; $wb['limit_spamfilter_policy_txt'] = 'Jumlah maks kebijakan spamfilter'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Server Mail Default'; $wb['company_name_txt'] = 'Nama Perusahaan'; $wb['contact_firstname_txt'] = 'Contact firstname'; diff --git a/interface/web/client/lib/lang/id_client_template.lng b/interface/web/client/lib/lang/id_client_template.lng index b6ecb87e26a8437a164525c3ac8eeaf6f37e7581..b4367236f73c9f09c1a35c92490d8867737184b1 100644 --- a/interface/web/client/lib/lang/id_client_template.lng +++ b/interface/web/client/lib/lang/id_client_template.lng @@ -94,6 +94,7 @@ $wb['limit_aps_txt'] = 'Max. number of APS instances'; $wb['limit_aps_error_notint'] = 'The APS instances limit must be a number.'; $wb['limit_domainmodule_txt'] = 'Domainmodule Limit'; $wb['client_limits_txt'] = 'Client Limits'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Default Mailserver'; $wb['default_webserver_txt'] = 'Default Webserver'; $wb['default_dnsserver_txt'] = 'Default DNS Server'; diff --git a/interface/web/client/lib/lang/id_reseller.lng b/interface/web/client/lib/lang/id_reseller.lng index 58450627eddf0d10847196a4d24049aae20805b6..01195a244c3eb45d6fad9134d7d3abd44e452281 100644 --- a/interface/web/client/lib/lang/id_reseller.lng +++ b/interface/web/client/lib/lang/id_reseller.lng @@ -12,6 +12,7 @@ $wb['limit_mailquota_txt'] = 'Kuota Mailbox'; $wb['limit_spamfilter_wblist_txt'] = 'Jumlah maks penyaringan whitelist/blacklist spamfilter'; $wb['limit_spamfilter_user_txt'] = 'Jumlah maks pengguna spamfilter'; $wb['limit_spamfilter_policy_txt'] = 'Jumlah maks kebijakan spamfilter'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Server Mail Default'; $wb['company_name_txt'] = 'Nama Perusahaan'; $wb['contact_firstname_txt'] = 'Contact firstname'; diff --git a/interface/web/client/lib/lang/it_client.lng b/interface/web/client/lib/lang/it_client.lng index 19b2a18b4adff8ea62b4fee8eeac5a0b26a0fe7e..9b2e6492cf55b41963b6d7718f251839651b00d1 100644 --- a/interface/web/client/lib/lang/it_client.lng +++ b/interface/web/client/lib/lang/it_client.lng @@ -3,15 +3,16 @@ $wb['limit_maildomain_txt'] = 'Numero massimo di domini di posta'; $wb['limit_mailbox_txt'] = 'Numero massimo di caselle di posta'; $wb['limit_mailalias_txt'] = 'Numero massimo di aliases di posta'; $wb['limit_mailforward_txt'] = 'Numero massimo di forwarders di posta'; -$wb['limit_mailcatchall_txt'] = 'Numero massimo di catchall accounts'; +$wb['limit_mailcatchall_txt'] = 'Numero massimo di profili catchall'; $wb['limit_mailrouting_txt'] = 'Numero massimo di email routes'; $wb['limit_mail_wblist_txt'] = 'Max. number of email white / blacklist entries'; $wb['limit_mailfilter_txt'] = 'Numero massimo di email filters'; -$wb['limit_fetchmail_txt'] = 'Numero massimo di fetchmail accounts'; +$wb['limit_fetchmail_txt'] = 'Numero massimo di profili fetchmail'; $wb['limit_mailquota_txt'] = 'Limite quota mailbox'; $wb['limit_spamfilter_wblist_txt'] = 'Numero massimo di filtri spamfilter white / blacklist'; $wb['limit_spamfilter_user_txt'] = 'Numero massimo di utenti spamfilter'; $wb['limit_spamfilter_policy_txt'] = 'Numero massimo di policy per spamfilter'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Server di posta predefinito'; $wb['company_name_txt'] = 'Nome Azienda'; $wb['contact_name_txt'] = 'Nome contatto'; @@ -42,7 +43,7 @@ $wb['limit_subdomain_txt'] = 'limit_subdomain'; $wb['limit_webquota_txt'] = 'limit_webquota'; $wb['limit_database_txt'] = 'Numero massimo database'; $wb['ip_address_txt'] = 'Indirizzi ip'; -$wb['limit_client_error_notint'] = 'The sub client limit must be a number.'; +$wb['limit_client_error_notint'] = 'Il numero di sub-cliente deve essere un numero.'; $wb['firstname_error_empty'] = 'Nome è vuoto.'; $wb['contact_error_empty'] = 'Nome azienda è vuoto.'; $wb['default_webserver_txt'] = 'Webserver predefinito'; @@ -60,95 +61,95 @@ $wb['username_error_unique'] = 'Il nome utente deve essere unico.'; $wb['limit_maildomain_error_notint'] = 'Il limite dei domini email devessere un numero.'; $wb['limit_mailbox_error_notint'] = 'Il limite delle caselle di posta devessere un numero.'; $wb['limit_mailalias_error_notint'] = 'Il limite di email alias deve essere un numero.'; -$wb['limit_mailforward_error_notint'] = 'The email forward limit must be a number.'; -$wb['limit_mailcatchall_error_notint'] = 'The email catchall limit must be a number.'; -$wb['limit_mailrouting_error_notint'] = 'The email routing limit must be a number.'; -$wb['limit_mail_wblist_error_notint'] = 'The email white / blacklist limit must be a number.'; -$wb['limit_mailfilter_error_notint'] = 'The email filter limit must be a number.'; -$wb['limit_mailfetchmail_error_notint'] = 'The fetchmail limit must be a number.'; -$wb['limit_mailquota_error_notint'] = 'The email quota limit must be a number.'; -$wb['limit_spamfilter_wblist_error_notint'] = 'The spamfilter white / blacklist limit must be a number.'; -$wb['limit_spamfilter_user_error_notint'] = 'The spamfilter user limit must be a number.'; -$wb['limit_spamfilter_policy_error_notint'] = 'The spamfilter policy limit must be a number.'; -$wb['limit_web_domain_error_notint'] = 'The website limit must be a number.'; -$wb['limit_web_aliasdomain_error_notint'] = 'The website alias domain limit must be a number.'; -$wb['limit_web_subdomain_error_notint'] = 'The website subdomain limit must be a number.'; +$wb['limit_mailforward_error_notint'] = 'Il limite delle forward email deve essere un numero.'; +$wb['limit_mailcatchall_error_notint'] = 'Il limite delle mail catchall deve essere un numero.'; +$wb['limit_mailrouting_error_notint'] = 'Il limite di di routing email dve essere un numero.'; +$wb['limit_mail_wblist_error_notint'] = 'Il limite delle liste bianche / nere deve essere un numero.'; +$wb['limit_mailfilter_error_notint'] = 'Il limite di filtri email deve essere un numero.'; +$wb['limit_mailfetchmail_error_notint'] = 'Il limite di fetchmail deve essere un numero.'; +$wb['limit_mailquota_error_notint'] = 'La quota email deve essere un numero.'; +$wb['limit_spamfilter_wblist_error_notint'] = 'Il limite di liste bianche / nere di filtri SPAM deve essere un numero.'; +$wb['limit_spamfilter_user_error_notint'] = 'Il limite di utenti di filtri SPAM deve essere un numero.'; +$wb['limit_spamfilter_policy_error_notint'] = 'Il limite delle politiche di spamfilter deve essere un numero.'; +$wb['limit_web_domain_error_notint'] = 'Il limite di siti web deve essere un numero.'; +$wb['limit_web_aliasdomain_error_notint'] = 'Il limite dei domini web Alias deve essere un numero.'; +$wb['limit_web_subdomain_error_notint'] = 'Il limite dei siti web sottodomini deve essere un numero.'; $wb['limit_ftp_user_error_notint'] = 'Il limite degli utenti ftp deve essere un numero.'; $wb['limit_shell_user_error_notint'] = 'Il limite degli utenti shell deve essere un numero.'; $wb['limit_dns_zone_error_notint'] = 'Il limite dei record dns deve essere un numero.'; -$wb['limit_dns_slave_zone_error_notint'] = 'The dns slave zone limit must be a number.'; +$wb['limit_dns_slave_zone_error_notint'] = 'Il limite delle zone DNS slave deve essere un numero.'; $wb['default_dbserver_txt'] = 'Server Database predefinito'; $wb['limit_database_error_notint'] = 'Il limite dei database deve essere un numero.'; $wb['username_error_regex'] = 'Il nome utente contiene caratteri non validi.'; -$wb['password_strength_txt'] = 'Sicurezza della Password'; +$wb['password_strength_txt'] = 'Robustezza della Password'; $wb['template_master_txt'] = 'Principale'; $wb['template_additional_txt'] = 'Aggiuntivo'; -$wb['ssh_chroot_txt'] = 'SSH-Chroot Options'; -$wb['web_php_options_txt'] = 'PHP Options'; -$wb['limit_cron_txt'] = 'Max. number of cron jobs'; -$wb['limit_cron_type_txt'] = 'Max. type of cron jobs (chrooted and full implies url)'; -$wb['limit_cron_frequency_txt'] = 'Min. delay between executions'; -$wb['limit_cron_error_notint'] = 'The cron limit must be a number.'; -$wb['limit_cron_error_frequency'] = 'The cron frequency limit must be a number.'; -$wb['limit_client_error'] = 'The max. number of clients is reached.'; -$wb['limit_mailaliasdomain_txt'] = 'Max. number of domain aliases'; -$wb['limit_mailaliasdomain_error_notint'] = 'The email domain alias limit must be a number.'; +$wb['ssh_chroot_txt'] = 'Opzioni chroot SSH'; +$wb['web_php_options_txt'] = 'Opzioni PHP'; +$wb['limit_cron_txt'] = 'Numero massimo di cron jobs'; +$wb['limit_cron_type_txt'] = 'Massimo tipo di cron jobs (chrooted e completi implica url)'; +$wb['limit_cron_frequency_txt'] = 'Ritardo minimo tra le esecuzioni'; +$wb['limit_cron_error_notint'] = 'Il limite di cron deve essere un numero.'; +$wb['limit_cron_error_frequency'] = 'Il limite di frequenza cron deve essere un numero.'; +$wb['limit_client_error'] = 'Hai raggiunto il numero massimo di clienti.'; +$wb['limit_mailaliasdomain_txt'] = 'Massimo numero di domini Alias'; +$wb['limit_mailaliasdomain_error_notint'] = 'Il numero massimo di domini email alias devve essere un numero.'; $wb['limit_web_quota_txt'] = 'Quota Web'; $wb['limit_traffic_quota_txt'] = 'Quota Traffico'; -$wb['limit_trafficquota_error_notint'] = 'Traffic Quota must be a number.'; -$wb['limit_webdav_user_txt'] = 'Max. number of Webdav users'; -$wb['limit_webdav_user_error_notint'] = 'The webdav user limit must be a number.'; -$wb['customer_no_txt'] = 'Customer No.'; +$wb['limit_trafficquota_error_notint'] = 'La quota traffico deve essere un numero.'; +$wb['limit_webdav_user_txt'] = 'Massimo numero di utenti Webdav'; +$wb['limit_webdav_user_error_notint'] = 'Il numero massimo di utenti Webdav deve essere un numero.'; +$wb['customer_no_txt'] = 'n° Cliente'; $wb['vat_id_txt'] = 'P. IVA'; $wb['required_fields_txt'] = '* Campi obbligatori'; -$wb['limit_mailmailinglist_txt'] = 'Max. number of mailing lists'; -$wb['limit_mailmailinglist_error_notint'] = 'The mailing list record limit must be a number.'; +$wb['limit_mailmailinglist_txt'] = 'Massimo numero di mailing lists'; +$wb['limit_mailmailinglist_error_notint'] = 'Il numero di mailing list deve essere un numero.'; $wb['company_id_txt'] = 'Azienda/Titolare ID'; $wb['limit_openvz_vm_txt'] = 'Numero massimo server virtuali'; -$wb['limit_openvz_vm_template_id_txt'] = 'Force virtual server template'; -$wb['limit_openvz_vm_error_notint'] = 'The virtual server limit must be a number.'; -$wb['web_php_options_notempty'] = 'No PHP option(s) selected. Select at least one PHP option.'; -$wb['ssh_chroot_notempty'] = 'No SSH chroot option selected. Select at least one option.'; -$wb['username_error_collision'] = 'The username may not start with the word -web- or -web- followed by a number.'; -$wb['add_additional_template_txt'] = 'Add additional template'; -$wb['delete_additional_template_txt'] = 'Elimina additional template'; -$wb['limit_cgi_txt'] = 'CGI available'; -$wb['limit_ssi_txt'] = 'SSI available'; -$wb['limit_perl_txt'] = 'Perl available'; -$wb['limit_ruby_txt'] = 'Ruby available'; -$wb['limit_python_txt'] = 'Python available'; -$wb['force_suexec_txt'] = 'SuEXEC forced'; -$wb['limit_hterror_txt'] = 'Custom error docs available'; -$wb['limit_wildcard_txt'] = 'Wildcard subdomain available'; -$wb['limit_ssl_txt'] = 'SSL available'; -$wb['bank_account_number_txt'] = 'Bank account no.'; -$wb['bank_code_txt'] = 'Bank code'; -$wb['bank_name_txt'] = 'Bank name'; +$wb['limit_openvz_vm_template_id_txt'] = 'Forzare il modello dei server virtuali'; +$wb['limit_openvz_vm_error_notint'] = 'Il limite dei server virtuali deve essere un numero.'; +$wb['web_php_options_notempty'] = 'Nessuna opzione PHP selezionata. Seleziona almeno una opzione PHP.'; +$wb['ssh_chroot_notempty'] = 'Nessuna opzione chroot SSH selezionata. Seleziona almeno una opzione.'; +$wb['username_error_collision'] = 'Il nome utente non può iniziare con la parola -web- o con -web- seguito da un numero.'; +$wb['add_additional_template_txt'] = 'Aggiungi un modello'; +$wb['delete_additional_template_txt'] = 'Elimina un modello'; +$wb['limit_cgi_txt'] = 'CGI disponibile'; +$wb['limit_ssi_txt'] = 'SSI disponibile'; +$wb['limit_perl_txt'] = 'Perl disponibile'; +$wb['limit_ruby_txt'] = 'Ruby disponibile'; +$wb['limit_python_txt'] = 'Python disponibile'; +$wb['force_suexec_txt'] = 'SuEXEC imposto'; +$wb['limit_hterror_txt'] = 'Messaggi di errore personalizzati disponibili'; +$wb['limit_wildcard_txt'] = 'Sottodomini * disponibile'; +$wb['limit_ssl_txt'] = 'SSL disponibile'; +$wb['bank_account_number_txt'] = 'n° Conto corrente bancario'; +$wb['bank_code_txt'] = 'Codice Banca'; +$wb['bank_name_txt'] = 'Nome Banca'; $wb['bank_account_iban_txt'] = 'IBAN'; $wb['bank_account_swift_txt'] = 'BIC / Swift'; -$wb['web_limits_txt'] = 'Web Limits'; -$wb['email_limits_txt'] = 'Email Limits'; -$wb['database_limits_txt'] = 'Database Limits'; -$wb['cron_job_limits_txt'] = 'Cron Job Limits'; -$wb['dns_limits_txt'] = 'DNS Limits'; -$wb['virtualization_limits_txt'] = 'Virtualization Limits'; +$wb['web_limits_txt'] = 'Limiti Web'; +$wb['email_limits_txt'] = 'Limiti Email'; +$wb['database_limits_txt'] = 'Limiti Database'; +$wb['cron_job_limits_txt'] = 'Limiti Cron Job'; +$wb['dns_limits_txt'] = 'Limiti DNS'; +$wb['virtualization_limits_txt'] = 'Limiti Virtualizzazione'; $wb['generate_password_txt'] = 'Genera Password'; $wb['repeat_password_txt'] = 'Ripeti Password'; $wb['password_mismatch_txt'] = 'Le password non coincidono.'; $wb['password_match_txt'] = 'Le password coincidono.'; -$wb['active_template_additional_txt'] = 'AttivoAddons'; -$wb['bank_account_owner_txt'] = 'Bank account owner'; -$wb['email_error_isemail'] = 'Please enter a valid email address.'; -$wb['customer_no_error_unique'] = 'The customer no. must be unique (or empty).'; -$wb['paypal_email_error_isemail'] = 'Please enter a valid PayPal email address.'; -$wb['paypal_email_txt'] = 'PayPal Email'; -$wb['err_msg_master_tpl_set'] = 'All custom limit settings are ignored if any master template other than \\"custom\\" is selected.'; -$wb['aps_limits_txt'] = 'APS Installer Limits'; -$wb['limit_aps_txt'] = 'Max. number of APS instances'; -$wb['limit_aps_error_notint'] = 'The APS instances limit must be a number.'; -$wb['default_slave_dnsserver_txt'] = 'Default Secondary DNS Server'; -$wb['locked_txt'] = 'Locked (disables everything except DNS)'; -$wb['canceled_txt'] = 'Cancellato(disables client login)'; +$wb['active_template_additional_txt'] = 'Attivo Addons'; +$wb['bank_account_owner_txt'] = 'Titolare conto bancario'; +$wb['email_error_isemail'] = 'Inserire un email valido.'; +$wb['customer_no_error_unique'] = 'Il n° di cliente deve essere univoco (o vuoto).'; +$wb['paypal_email_error_isemail'] = 'Inserire una email valida per PayPal.'; +$wb['paypal_email_txt'] = 'email PayPal'; +$wb['err_msg_master_tpl_set'] = 'Tutti i limiti personalizzati impostati sono ignorati se viene selezionato un modello master diverso da \\"custom\\".'; +$wb['aps_limits_txt'] = 'Limite installazione APS'; +$wb['limit_aps_txt'] = 'Numero massimo di istanze APS'; +$wb['limit_aps_error_notint'] = 'Il limite di istanze APS deve essere un numero.'; +$wb['default_slave_dnsserver_txt'] = 'Server DNS secondario default'; +$wb['locked_txt'] = 'Bloccato (Disabilita tutto eccetto DNS)'; +$wb['canceled_txt'] = 'Cancellato (disabilita il login del cliente)'; $wb['gender_txt'] = 'Titolo'; $wb['gender_m_txt'] = 'Sig.'; $wb['gender_f_txt'] = 'Sig.ra'; @@ -156,52 +157,52 @@ $wb['added_by_txt'] = 'Aggiunto da'; $wb['added_date_txt'] = 'Data inserimento'; $wb['parent_client_id_txt'] = 'Cliente di rivenditore'; $wb['none_txt'] = 'Nessuno'; -$wb['contact_firstname_txt'] = 'Contact firstname'; -$wb['limit_backup_txt'] = 'Backupfunction available'; -$wb['xmpp_limits_txt'] = 'XMPP Limits'; +$wb['contact_firstname_txt'] = 'Nome contatto'; +$wb['limit_backup_txt'] = 'Funzione backup disponibile'; +$wb['xmpp_limits_txt'] = 'Limiti XMPPs'; $wb['web_servers_txt'] = 'Webservers'; -$wb['web_servers_placeholder'] = 'Select webservers'; -$wb['no_web_server_error'] = 'At least one webserver must be selected.'; -$wb['web_servers_used'] = 'The server you are trying to remove from this client is used as a webserver. Be sure that this server is not used by this client before you remove it.'; -$wb['dns_servers_txt'] = 'DNS servers'; -$wb['dns_servers_placeholder'] = 'Select DNS servers'; -$wb['no_dns_server_error'] = 'At least one DNS server must be selected.'; -$wb['dns_servers_used'] = 'The server you are trying to remove from this client is used as a DNS server. Be sure that this server is not used by this client before you remove it.'; -$wb['db_servers_txt'] = 'Database servers'; -$wb['db_servers_placeholder'] = 'Select database servers'; -$wb['no_db_server_error'] = 'At least one Database server must be selected.'; -$wb['db_servers_used'] = 'The server you are trying to remove from this client is used as a Database server. Be sure that this server is not used by this client before you remove it.'; +$wb['web_servers_placeholder'] = 'Seleziona webservers'; +$wb['no_web_server_error'] = 'Almeno un webserver deve essere selezionato.'; +$wb['web_servers_used'] = 'Il server che stai cercando di rimuovere da questo cliente è in uso come sito Web. Assicurati che non sia usato dal cliente prima di tentare di rimuoverlo.'; +$wb['dns_servers_txt'] = 'Server DNS'; +$wb['dns_servers_placeholder'] = 'Seleziona i server DNS'; +$wb['no_dns_server_error'] = 'Almeno un server DNS deve essere selezionato.'; +$wb['dns_servers_used'] = 'Il server che stai cercando di rimuovere da questo cliente è in uso come server DNS. Assicurati che non sia usato dal cliente prima di tentare di rimuoverlo.'; +$wb['db_servers_txt'] = 'Server Database'; +$wb['db_servers_placeholder'] = 'Seleziona server database'; +$wb['no_db_server_error'] = 'Almeno un server Database server deve essere selezionato.'; +$wb['db_servers_used'] = 'Il server che stai cercando di rimuovere da questo cliente è in uso come server Database. Assicurati che non sia usato dal cliente prima di tentare di rimuoverlo.'; $wb['mail_servers_txt'] = 'Mailservers'; -$wb['mail_servers_placeholder'] = 'Select mailservers'; -$wb['no_mail_server_error'] = 'At least one mailserver must be selected.'; -$wb['mail_servers_used'] = 'The server you are trying to remove from this client is used as a Mailserver. Be sure that this server is not used by this client before you remove it.'; -$wb['xmpp_servers_txt'] = 'XMPP Servers'; -$wb['xmpp_servers_placeholder'] = 'Select XMPP Servers'; -$wb['no_xmpp_server_error'] = 'At least one XMPP Server must be selected.'; -$wb['xmpp_servers_used'] = 'The server you are trying to remove from this client is used as a XMPP Server. Be sure that this server is not used by this client before you remove it.'; -$wb['limit_xmpp_domain_error_notint'] = 'The XMPP domain limit must be a number.'; -$wb['limit_xmpp_user_error_notint'] = 'The XMPP user limit must be a number.'; -$wb['limit_xmpp_domain_txt'] = 'Max. number of XMPP domains'; -$wb['limit_xmpp_user_txt'] = 'Max. number of XMPP accounts'; -$wb['limit_xmpp_muc_txt'] = 'Multiuser chat available'; -$wb['limit_xmpp_pastebin_txt'] = 'Pastebin for MUC available'; -$wb['limit_xmpp_httparchive_txt'] = 'HTTP archive for MUC available'; -$wb['limit_xmpp_anon_txt'] = 'Anonymous host available'; -$wb['limit_xmpp_vjud_txt'] = 'VJUD user directory available'; -$wb['limit_xmpp_proxy_txt'] = 'Bytestream proxy available'; -$wb['limit_xmpp_status_txt'] = 'Status host available'; -$wb['limit_database_quota_txt'] = 'Database quota'; -$wb['limit_database_quota_error_notint'] = 'The database quota limit must be a number.'; -$wb['reseller_txt'] = 'Reseller'; -$wb['btn_save_txt'] = 'Save'; -$wb['btn_cancel_txt'] = 'Cancel'; -$wb['invalid_vat_id'] = 'The VAT ID is invalid.'; -$wb['email_error_empty'] = 'Email is empty'; -$wb['limit_database_user_txt'] = 'Max. Database users'; -$wb['limit_database_user_error_notint'] = 'The database user limit must be a number.'; -$wb['limit_ssl_letsencrypt_txt'] = 'Let\'s Encrypt available'; -$wb['limit_directive_snippets_txt'] = 'Show web server config selection'; -$wb['password_click_to_set_txt'] = 'Click to set'; -$wb['limit_dns_record_error_notint'] = 'The dns record limit must be a number.'; -$wb['Address'] = 'Address'; -$wb['Limits'] = 'Limits'; +$wb['mail_servers_placeholder'] = 'Seleziona mailservers'; +$wb['no_mail_server_error'] = 'Almeno un server mail deve essere selezionato.'; +$wb['mail_servers_used'] = 'Il server che stai cercando di rimuovere da questo cliente è in uso come serve Mail. Assicurati che non sia usato dal cliente prima di tentare di rimuoverlo.'; +$wb['xmpp_servers_txt'] = 'Server XMPP'; +$wb['xmpp_servers_placeholder'] = 'Seleziona server XMPP'; +$wb['no_xmpp_server_error'] = 'Almeno un server XMPP deve essere selezionato.'; +$wb['xmpp_servers_used'] = 'Il server che stai cercando di rimuovere da questo cliente è in uso come server XMPP. Assicurati che non sia usato dal cliente prima di tentare di rimuoverlo.'; +$wb['limit_xmpp_domain_error_notint'] = 'Il limite dei domini XMPP deve essere un numero.'; +$wb['limit_xmpp_user_error_notint'] = 'Il limite degli utenti XMPP deve essere un numero.'; +$wb['limit_xmpp_domain_txt'] = 'Numero massimo di domini XMPP'; +$wb['limit_xmpp_user_txt'] = 'Massimo numero di profili XMPP'; +$wb['limit_xmpp_muc_txt'] = 'Multiuser chat disponibile'; +$wb['limit_xmpp_pastebin_txt'] = 'Pastebin per MUC disponibile'; +$wb['limit_xmpp_httparchive_txt'] = 'Archivio HTTP per MUC disponibile'; +$wb['limit_xmpp_anon_txt'] = 'host anonimo disponibile'; +$wb['limit_xmpp_vjud_txt'] = 'Rubrica utenti VJUD disponibile'; +$wb['limit_xmpp_proxy_txt'] = 'Bytestream proxy disponibile'; +$wb['limit_xmpp_status_txt'] = 'Status host disponibile'; +$wb['limit_database_quota_txt'] = 'quota Database'; +$wb['limit_database_quota_error_notint'] = 'La quota database deve essere un numero.'; +$wb['reseller_txt'] = 'Rivenditori'; +$wb['btn_save_txt'] = 'Salva'; +$wb['btn_cancel_txt'] = 'Annulla'; +$wb['invalid_vat_id'] = 'Il n° di IVA non + valido.'; +$wb['email_error_empty'] = 'Email è vuoto'; +$wb['limit_database_user_txt'] = 'Massimo numero utenti Database'; +$wb['limit_database_user_error_notint'] = 'Il numero di utenti database deve essere un numero.'; +$wb['limit_ssl_letsencrypt_txt'] = 'Let\'s Encrypt disponibile'; +$wb['limit_directive_snippets_txt'] = 'Mostra selezione di configurazione del server web'; +$wb['password_click_to_set_txt'] = 'Clicca per impostare'; +$wb['limit_dns_record_error_notint'] = 'Il limite di record DNS deve essere un numero.'; +$wb['Address'] = 'Indirizzo'; +$wb['Limits'] = 'Limiti'; diff --git a/interface/web/client/lib/lang/it_client_circle.lng b/interface/web/client/lib/lang/it_client_circle.lng index b7703b4f99cef5917d03232176fd46ff78c6751e..70ff1fd6e082c2d6b98c31842e2c72a98761f8d7 100644 --- a/interface/web/client/lib/lang/it_client_circle.lng +++ b/interface/web/client/lib/lang/it_client_circle.lng @@ -1,9 +1,9 @@ <?php -$wb['Client Circle'] = 'Client Circle'; -$wb['Circle'] = 'Circle'; -$wb['circle_txt'] = 'Circle'; -$wb['circle_name_txt'] = 'Circle Name'; -$wb['client_ids_txt'] = 'Clients/Resellers'; +$wb['Client Circle'] = 'Circolo Cliente'; +$wb['Circle'] = 'Circolo'; +$wb['circle_txt'] = 'Circolo'; +$wb['circle_name_txt'] = 'Nome Circolo'; +$wb['client_ids_txt'] = 'Clienti/Rivenditori'; $wb['description_txt'] = 'Descrizione'; $wb['active_txt'] = 'Attivo'; ?> diff --git a/interface/web/client/lib/lang/it_client_circle_list.lng b/interface/web/client/lib/lang/it_client_circle_list.lng index faa225f0587d44813520c1628c2ea49b85681d95..a7e74f32e3fcd36f55f375ec469418bfa0b8a430 100644 --- a/interface/web/client/lib/lang/it_client_circle_list.lng +++ b/interface/web/client/lib/lang/it_client_circle_list.lng @@ -1,10 +1,10 @@ <?php -$wb['list_head_txt'] = 'Client Circles'; -$wb['circle_id_txt'] = 'Circle ID'; -$wb['circle_name_txt'] = 'Circle Name'; +$wb['list_head_txt'] = 'Circolo Clienti'; +$wb['circle_id_txt'] = 'ID Circolo'; +$wb['circle_name_txt'] = 'Nome Circolo'; $wb['description_txt'] = 'Descrizione'; -$wb['add_new_record_txt'] = 'Aggiungi un nuovo circle'; -$wb['filter_txt'] = 'Filter'; +$wb['add_new_record_txt'] = 'Aggiungi un nuovo Circolo'; +$wb['filter_txt'] = 'Filtro'; $wb['delete_txt'] = 'Elimina'; $wb['active_txt'] = 'Attivo'; ?> diff --git a/interface/web/client/lib/lang/it_client_del.lng b/interface/web/client/lib/lang/it_client_del.lng index a17dc6a7ff3d54de5af7bc4def05114558b15c9a..ec0e31aa3c801de2c700d9fca6a137ac7dc4a121 100644 --- a/interface/web/client/lib/lang/it_client_del.lng +++ b/interface/web/client/lib/lang/it_client_del.lng @@ -3,8 +3,8 @@ $wb['confirm_action_txt'] = 'Conferma operazione'; $wb['delete_explanation'] = 'Questa operazione cancellerà i seguenti record associati a questo cliente'; $wb['btn_save_txt'] = 'Cancella cliente'; $wb['btn_cancel_txt'] = 'Annulla senza cancellare il cliente'; -$wb['confirm_client_delete_txt'] = 'Are you sure you want to delete this client?'; -$wb['list_head_txt'] = 'Delete Client'; -$wb['table_txt'] = 'Table'; -$wb['data_txt'] = 'Data'; +$wb['confirm_client_delete_txt'] = 'Sei sicuro di voler cancellare questo Cliente?'; +$wb['list_head_txt'] = 'Cancella Cliente'; +$wb['table_txt'] = 'Tavola'; +$wb['data_txt'] = 'Dati'; ?> diff --git a/interface/web/client/lib/lang/it_client_message.lng b/interface/web/client/lib/lang/it_client_message.lng index 6e8f0fe1b8b19e491cd5c541d243690e058a864e..fcb5c20e57227200f93e6d238a19f88930055a2b 100644 --- a/interface/web/client/lib/lang/it_client_message.lng +++ b/interface/web/client/lib/lang/it_client_message.lng @@ -1,20 +1,20 @@ <?php -$wb['btn_send_txt'] = 'Send email'; +$wb['btn_send_txt'] = 'Invia email'; $wb['btn_cancel_txt'] = 'Annulla'; -$wb['sender_txt'] = 'Sender email address'; -$wb['subject_txt'] = 'Subject'; -$wb['message_txt'] = 'Message'; -$wb['form_legend_client_txt'] = 'Send email message to all clients.'; -$wb['form_legend_admin_txt'] = 'Send email message to all clients and resellers.'; -$wb['sender_invalid_error'] = 'Sender email invalid.'; -$wb['subject_invalid_error'] = 'Subject vuoto.'; -$wb['message_invalid_error'] = 'Message vuoto.'; -$wb['email_sent_to_txt'] = 'Email sent to:'; -$wb['page_head_txt'] = 'Send email message to clients and resellers'; -$wb['recipient_txt'] = 'Recipient'; -$wb['all_clients_resellers_txt'] = 'All clients and resellers'; -$wb['all_clients_txt'] = 'All clients'; -$wb['variables_txt'] = 'Variables:'; -$wb['gender_m_txt'] = 'Mr.'; -$wb['gender_f_txt'] = 'Ms.'; +$wb['sender_txt'] = 'Indirizzo email del mittente'; +$wb['subject_txt'] = 'Oggetto'; +$wb['message_txt'] = 'Messaggio'; +$wb['form_legend_client_txt'] = 'Invia messaggio email a tutti i clienti.'; +$wb['form_legend_admin_txt'] = 'Invia messaggio email a tutti i clienti e rivenditori.'; +$wb['sender_invalid_error'] = 'Mittente email invalido.'; +$wb['subject_invalid_error'] = 'Oggetto vuoto.'; +$wb['message_invalid_error'] = 'Messaggio vuoto.'; +$wb['email_sent_to_txt'] = 'Email inviato a:'; +$wb['page_head_txt'] = 'Invia messaggio email a clienti e rivenditori'; +$wb['recipient_txt'] = 'Destinatario'; +$wb['all_clients_resellers_txt'] = 'Tutti i clienti e rivenditori'; +$wb['all_clients_txt'] = 'Tutti i clienti'; +$wb['variables_txt'] = 'Variabili:'; +$wb['gender_m_txt'] = 'Sig.'; +$wb['gender_f_txt'] = 'Sig.ra'; ?> diff --git a/interface/web/client/lib/lang/it_client_message_template.lng b/interface/web/client/lib/lang/it_client_message_template.lng index f9c7d11c4d6a65c38b5e2016589d48d613e3fb5e..d464077026d174ae38e76d904b8a476c1ab75549 100644 --- a/interface/web/client/lib/lang/it_client_message_template.lng +++ b/interface/web/client/lib/lang/it_client_message_template.lng @@ -1,13 +1,13 @@ <?php -$wb['template_type_txt'] = 'Email type'; -$wb['subject_txt'] = 'Subject'; -$wb['message_txt'] = 'Message'; -$wb['Email template'] = 'Email template'; -$wb['Settings'] = 'Setting'; -$wb['variables_txt'] = 'Variables'; -$wb['variables_description_txt'] = '(The username and password variables are only available in welcome emails.)'; -$wb['duplicate_welcome_error'] = 'There can be only one default welcome email template. Please edit the existing template instead of adding a new one.'; -$wb['template_name_txt'] = 'Template name'; -$wb['subject_error_empty'] = 'Subject is empty'; -$wb['message_error_empty'] = 'Message is empty'; +$wb['template_type_txt'] = 'Email tipo'; +$wb['subject_txt'] = 'Oggetto'; +$wb['message_txt'] = 'Messaggio'; +$wb['Email template'] = 'Email modello'; +$wb['Settings'] = 'Impostazioni'; +$wb['variables_txt'] = 'Variabili'; +$wb['variables_description_txt'] = '(I valori della username e della password sono disponibili solo nella mail di benvenuto.)'; +$wb['duplicate_welcome_error'] = 'Ci può essere un solo modello di mail di benvenuto. Edita il modello esistente piuttosto che aggiungerne un altro.'; +$wb['template_name_txt'] = 'Nome Modello'; +$wb['subject_error_empty'] = 'Oggetto è vuoto'; +$wb['message_error_empty'] = 'Messaggio è vuoto'; ?> diff --git a/interface/web/client/lib/lang/it_client_message_template_list.lng b/interface/web/client/lib/lang/it_client_message_template_list.lng index d9c307ed5220b04a7657896edae66cf689411c0b..a79bad2a1d6cec3173d898c60ca326fc2a73f8c3 100644 --- a/interface/web/client/lib/lang/it_client_message_template_list.lng +++ b/interface/web/client/lib/lang/it_client_message_template_list.lng @@ -1,5 +1,5 @@ <?php -$wb['list_head_txt'] = 'Email templates'; -$wb['template_type_txt'] = 'Message for'; -$wb['template_name_txt'] = 'Template name'; +$wb['list_head_txt'] = 'Modello Email'; +$wb['template_type_txt'] = 'Messaggio per'; +$wb['template_name_txt'] = 'Nome Modello'; ?> diff --git a/interface/web/client/lib/lang/it_client_template.lng b/interface/web/client/lib/lang/it_client_template.lng index 45f477918312e09c0fa541869e672976596bfb06..418bb033c7784802089f3915e7109c5a38ac382b 100644 --- a/interface/web/client/lib/lang/it_client_template.lng +++ b/interface/web/client/lib/lang/it_client_template.lng @@ -1,24 +1,24 @@ <?php -$wb['ssh_chroot_notempty'] = 'No SSH chroot option selected. Select at least one option.'; +$wb['ssh_chroot_notempty'] = 'Nessuna opzione chroot SSH selezionata. Seleziona almeno una opzione.'; $wb['limit_client_error_notint'] = 'Il limite dei sub-clienti devessere un numero.'; $wb['limit_maildomain_txt'] = 'Num. massimo domini email'; $wb['limit_mailbox_txt'] = 'Num. massimo caselle di posta'; $wb['limit_mailalias_txt'] = 'Num. massimo alias email'; $wb['limit_mailforward_txt'] = 'Num. massimo inoltri email'; -$wb['limit_mailcatchall_txt'] = 'Num. massimo account email catchall'; +$wb['limit_mailcatchall_txt'] = 'Num. massimo profilo email catchall'; $wb['limit_mailrouting_txt'] = 'Num. massimo routes email'; $wb['limit_mail_wblist_txt'] = 'Max. number of email white / blacklist entries'; $wb['limit_mailfilter_txt'] = 'Num. massimo filtri email'; -$wb['limit_fetchmail_txt'] = 'Num. massimo account fetchmail'; +$wb['limit_fetchmail_txt'] = 'Num. massimo profilo fetchmail'; $wb['limit_mailquota_txt'] = 'Quota caselle di posta'; $wb['limit_spamfilter_wblist_txt'] = 'Num. massimo filtri spam white / blacklist'; $wb['limit_spamfilter_user_txt'] = 'Num. massimo utenti spamfilter'; -$wb['limit_spamfilter_policy_txt'] = 'Num. massimo policys spamfilter'; +$wb['limit_spamfilter_policy_txt'] = 'Num. massimo politiche spamfilter'; $wb['limit_client_txt'] = 'Num. massimo clienti'; -$wb['limit_relayhost_txt'] = 'Show SMTP relay host options'; -$wb['limit_domain_txt'] = 'limit_domain'; -$wb['limit_subdomain_txt'] = 'limit_subdomain'; -$wb['limit_webquota_txt'] = 'limit_webquota'; +$wb['limit_relayhost_txt'] = 'Mostra le opzioni dell\'host SMTP relay'; +$wb['limit_domain_txt'] = 'Limite di domini'; +$wb['limit_subdomain_txt'] = 'Limite sottodomini'; +$wb['limit_webquota_txt'] = 'Limiti quota Web'; $wb['limit_database_txt'] = 'Num. massimo database'; $wb['limit_web_domain_txt'] = 'Num. massimo domini web'; $wb['limit_web_aliasdomain_txt'] = 'Num. massimo alias domini web'; @@ -34,13 +34,13 @@ $wb['limit_mailalias_error_notint'] = 'Il limite alias email devessere un numero $wb['limit_mailforward_error_notint'] = 'Il limite inoltro email devessere un numero.'; $wb['limit_mailcatchall_error_notint'] = 'Il limite catchall email devessere un numero.'; $wb['limit_mailrouting_error_notint'] = 'Il limite routing email devessere un numero .'; -$wb['limit_mail_wblist_error_notint'] = 'The email white / blacklist limit must be a number.'; +$wb['limit_mail_wblist_error_notint'] = 'Il limite di delle liste liste binche / nere deve essere un numero.'; $wb['limit_mailfilter_error_notint'] = 'Il limite filtri email devessere un numero.'; $wb['limit_mailfetchmail_error_notint'] = 'Il limite fetchmail devessere un numero.'; $wb['limit_mailquota_error_notint'] = 'Il limite quota email devessere un numero.'; $wb['limit_spamfilter_wblist_error_notint'] = 'Il limite filtri spamfilter devessere un numero.'; $wb['limit_spamfilter_user_error_notint'] = 'Il limite utenti spamfilter devessere un numero.'; -$wb['limit_spamfilter_policy_error_notint'] = 'Il limite policy spamfilter devessere un numero.'; +$wb['limit_spamfilter_policy_error_notint'] = 'Il limite politiche spamfilter devessere un numero.'; $wb['limit_web_domain_error_notint'] = 'Il limite siti web devessere un numero.'; $wb['limit_web_aliasdomain_error_notint'] = 'Il limite alias siti web devessere un numero.'; $wb['limit_web_subdomain_error_notint'] = 'Il limite sottodomini web devessere un numero.'; @@ -61,67 +61,68 @@ $wb['limit_mailaliasdomain_error_notint'] = 'Il limite alias domini devessere un $wb['limit_web_quota_txt'] = 'Quota web'; $wb['limit_traffic_quota_txt'] = 'Quota traffico'; $wb['limit_trafficquota_error_notint'] = 'Quota traffico devessere un numero.'; -$wb['template_del_aborted_txt'] = 'Eliminazione annullata. Esiste almeno un cliente che ha questo template attivo.'; +$wb['template_del_aborted_txt'] = 'Eliminazione annullata. Esiste almeno un cliente che ha questo modello attivo.'; $wb['limit_webdav_user_txt'] = 'Num. massimo utenti webdav'; $wb['limit_webdav_user_error_notint'] = 'Il limite utenti webdav devessere un numero.'; -$wb['template_type_txt'] = 'Template type'; -$wb['limit_mailmailinglist_txt'] = 'Max. number of mailing lists'; -$wb['limit_mailmailinglist_error_notint'] = 'The mailing list record limit must be a number.'; -$wb['limit_openvz_vm_txt'] = 'Max. number of virtual servers'; -$wb['limit_openvz_vm_template_id_txt'] = 'Force virtual server template'; -$wb['limit_openvz_vm_error_notint'] = 'The virtual server limit must be a number.'; -$wb['ssh_chroot_txt'] = 'SSH-Chroot Options'; -$wb['web_php_options_txt'] = 'PHP Options'; -$wb['limit_cgi_txt'] = 'CGI available'; -$wb['limit_ssi_txt'] = 'SSI available'; -$wb['limit_perl_txt'] = 'Perl available'; -$wb['limit_ruby_txt'] = 'Ruby available'; -$wb['limit_python_txt'] = 'Python available'; -$wb['force_suexec_txt'] = 'SuEXEC forced'; -$wb['limit_hterror_txt'] = 'Custom error docs available'; -$wb['limit_wildcard_txt'] = 'Wildcard subdomain available'; -$wb['limit_ssl_txt'] = 'SSL available'; -$wb['web_limits_txt'] = 'Web Limits'; -$wb['email_limits_txt'] = 'Email Limits'; -$wb['database_limits_txt'] = 'Database Limits'; -$wb['cron_job_limits_txt'] = 'Cron Job Limits'; -$wb['dns_limits_txt'] = 'DNS Limits'; -$wb['virtualization_limits_txt'] = 'Virtualization Limits'; -$wb['aps_limits_txt'] = 'APS Installer Limits'; -$wb['limit_aps_txt'] = 'Max. number of APS instances'; -$wb['limit_aps_error_notint'] = 'The APS instances limit must be a number.'; -$wb['limit_domainmodule_txt'] = 'Domainmodule Limit'; -$wb['client_limits_txt'] = 'Client Limits'; -$wb['template_name_txt'] = 'Template name'; -$wb['default_mailserver_txt'] = 'Default Mailserver'; -$wb['default_webserver_txt'] = 'Default Webserver'; -$wb['default_dnsserver_txt'] = 'Default DNS Server'; -$wb['default_slave_dnsserver_txt'] = 'Default Secondary DNS Server'; -$wb['limit_backup_txt'] = 'Backupfunction available'; +$wb['template_type_txt'] = 'T>ipo di Modello'; +$wb['limit_mailmailinglist_txt'] = 'Numero massimo delle mailing lists'; +$wb['limit_mailmailinglist_error_notint'] = 'Il limite dell mailing list deve essere un numero.'; +$wb['limit_openvz_vm_txt'] = 'Numero massimo di Virtual Server'; +$wb['limit_openvz_vm_template_id_txt'] = 'Forza modello per virtual server'; +$wb['limit_openvz_vm_error_notint'] = 'Il limite di server virtuali deve essere un numero.'; +$wb['ssh_chroot_txt'] = 'Opzioni chroot SSH'; +$wb['web_php_options_txt'] = 'Opzioni PHP'; +$wb['limit_cgi_txt'] = 'CGI disponibile'; +$wb['limit_ssi_txt'] = 'SSI disponibile'; +$wb['limit_perl_txt'] = 'Perl disponibile'; +$wb['limit_ruby_txt'] = 'Ruby disponibile'; +$wb['limit_python_txt'] = 'Python disponibile'; +$wb['force_suexec_txt'] = 'SuEXEC imposto'; +$wb['limit_hterror_txt'] = 'Messaggi di errore personalizzati disponibile'; +$wb['limit_wildcard_txt'] = 'Sottodomini * disponibile'; +$wb['limit_ssl_txt'] = 'SSL disponibile'; +$wb['web_limits_txt'] = 'Limite Web'; +$wb['email_limits_txt'] = 'Limite Email'; +$wb['database_limits_txt'] = 'Database'; +$wb['cron_job_limits_txt'] = 'Limite Cron Job'; +$wb['dns_limits_txt'] = 'Limite DNS'; +$wb['virtualization_limits_txt'] = 'Limite Virtualizzazioni'; +$wb['aps_limits_txt'] = 'Limite installazione APS'; +$wb['limit_aps_txt'] = 'Numero massimo di istanze APS'; +$wb['limit_aps_error_notint'] = 'Il limite delle istanze APS deve essere un numero.'; +$wb['limit_domainmodule_txt'] = 'Limiti del modulo Domini'; +$wb['client_limits_txt'] = 'Limite Clienti'; +$wb['template_name_txt'] = 'Nome Modello'; +$wb['limit_mail_backup_txt'] = 'Funzione backup email disponibile'; +$wb['default_mailserver_txt'] = 'Mailserver Default'; +$wb['default_webserver_txt'] = 'Webserver Default'; +$wb['default_dnsserver_txt'] = 'Default Server DNS'; +$wb['default_slave_dnsserver_txt'] = 'Default Server DNS Secondario'; +$wb['limit_backup_txt'] = 'Funzione backup disponibile'; $wb['default_dbserver_txt'] = 'Default Database Server'; -$wb['limit_database_quota_txt'] = 'Database quota'; -$wb['limit_database_quota_error_notint'] = 'The database quota limit must be a number.'; -$wb['xmpp_limits_txt'] = 'XMPP Limits'; -$wb['xmpp_servers_txt'] = 'XMPP Servers'; -$wb['xmpp_servers_placeholder'] = 'Select XMPP Servers'; -$wb['no_xmpp_server_error'] = 'At least one XMPP Server must be selected.'; -$wb['xmpp_servers_used'] = 'The server you are trying to remove from this client is used as a XMPP Server. Be sure that this server is not used by this client before you remove it.'; -$wb['limit_xmpp_domain_error_notint'] = 'The XMPP domain limit must be a number.'; -$wb['limit_xmpp_user_error_notint'] = 'The XMPP user limit must be a number.'; -$wb['limit_xmpp_domain_txt'] = 'Max. number of XMPP domains'; -$wb['limit_xmpp_user_txt'] = 'Max. number of XMPP accounts'; -$wb['limit_xmpp_muc_txt'] = 'Multiuser chat available'; -$wb['limit_xmpp_pastebin_txt'] = 'Pastebin for MUC available'; -$wb['limit_xmpp_httparchive_txt'] = 'HTTP archive for MUC available'; -$wb['limit_xmpp_anon_txt'] = 'Anonymous host available'; -$wb['limit_xmpp_vjud_txt'] = 'VJUD user directory available'; -$wb['limit_xmpp_proxy_txt'] = 'Bytestream proxy available'; -$wb['limit_xmpp_status_txt'] = 'Status host available'; -$wb['dns_servers_txt'] = 'DNS servers'; -$wb['limit_ssl_letsencrypt_txt'] = 'Let\'s Encrypt available'; -$wb['limit_directive_snippets_txt'] = 'Show web server config selection'; -$wb['limit_database_user_txt'] = 'Max. Database users'; +$wb['limit_database_quota_txt'] = 'Quota Database'; +$wb['limit_database_quota_error_notint'] = 'Il limite di quota database deve essere un numero.'; +$wb['xmpp_limits_txt'] = 'Limiti XMPP'; +$wb['xmpp_servers_txt'] = 'Servers XMPP'; +$wb['xmpp_servers_placeholder'] = 'Seleziona i Server XMPP'; +$wb['no_xmpp_server_error'] = 'Almeno un Server XMPP deve essere selezionato.'; +$wb['xmpp_servers_used'] = 'Il server che stai cercando di rimuovere da questo cliente è usato come server XMPP. Assicurati che questo server non sia in uso da questo cliente prima di rimuoverlo.'; +$wb['limit_xmpp_domain_error_notint'] = 'Il limite dei domini XMPP deve essere un numero.'; +$wb['limit_xmpp_user_error_notint'] = 'Il limite degli utenti XMPP deve essere un numero.'; +$wb['limit_xmpp_domain_txt'] = 'Numero massimo di domini XMPP'; +$wb['limit_xmpp_user_txt'] = 'Numero massimo di profili XMPP'; +$wb['limit_xmpp_muc_txt'] = 'chat multiutente disponibile'; +$wb['limit_xmpp_pastebin_txt'] = 'Pastebin per MUC disponibile'; +$wb['limit_xmpp_httparchive_txt'] = 'Archivio su HTTP per MUC disponibile'; +$wb['limit_xmpp_anon_txt'] = 'host anonimo disponibile'; +$wb['limit_xmpp_vjud_txt'] = 'Rubrica utenti VJUD disponibile'; +$wb['limit_xmpp_proxy_txt'] = 'Bytestream proxy disponibile'; +$wb['limit_xmpp_status_txt'] = 'Status host disponibile'; +$wb['dns_servers_txt'] = 'servers DNS'; +$wb['limit_ssl_letsencrypt_txt'] = 'Let\'s Encrypt disponibile'; +$wb['limit_directive_snippets_txt'] = 'Mostra selezione configurazione web server'; +$wb['limit_database_user_txt'] = 'Numero massimo utenti database'; $wb['web_servers_txt'] = 'Webservers'; $wb['db_servers_txt'] = 'Database servers'; $wb['mail_servers_txt'] = 'Mailservers'; -$wb['Limits'] = 'Limits'; +$wb['Limits'] = 'Limiti'; diff --git a/interface/web/client/lib/lang/it_client_template_list.lng b/interface/web/client/lib/lang/it_client_template_list.lng index 43b1a5ca49c7fa88a022a7c43370effa0a5ccde3..0d22389e35d30ca44337fb46fd4eef626f2bd2dd 100644 --- a/interface/web/client/lib/lang/it_client_template_list.lng +++ b/interface/web/client/lib/lang/it_client_template_list.lng @@ -2,6 +2,6 @@ $wb['list_head_txt'] = 'Modelli cliente'; $wb['template_type_txt'] = 'Tipo'; $wb['template_name_txt'] = 'Nome modello'; -$wb['template_id_txt'] = 'Template ID'; -$wb['sys_groupid_txt'] = 'Reseller'; +$wb['template_id_txt'] = 'Modello ID'; +$wb['sys_groupid_txt'] = 'Rivenditore'; ?> diff --git a/interface/web/client/lib/lang/it_clients_list.lng b/interface/web/client/lib/lang/it_clients_list.lng index 6b502eea884907a27dad577cc7bd744e1c1bb1ff..674f65f284a6a0674f65ed5c7479bf03b3136351 100644 --- a/interface/web/client/lib/lang/it_clients_list.lng +++ b/interface/web/client/lib/lang/it_clients_list.lng @@ -7,8 +7,8 @@ $wb['city_txt'] = 'Città '; $wb['country_txt'] = 'Stato'; $wb['add_new_record_txt'] = 'Aggiungi nuovo cliente'; $wb['username_txt'] = 'Nome Utente'; -$wb['customer_no_txt'] = 'Customer No.'; -$wb['locked_txt'] = 'Locked'; -$wb['yes_txt'] = 'Yes'; +$wb['customer_no_txt'] = 'n° Cliente'; +$wb['locked_txt'] = 'Bloccato'; +$wb['yes_txt'] = 'si'; $wb['no_txt'] = 'No'; ?> diff --git a/interface/web/client/lib/lang/it_domain.lng b/interface/web/client/lib/lang/it_domain.lng index 7c26779aae29a390cf82ee427c8f7205b544cc77..dba372981a34d4bfca5294e1b58a21248e18eb6c 100644 --- a/interface/web/client/lib/lang/it_domain.lng +++ b/interface/web/client/lib/lang/it_domain.lng @@ -1,6 +1,6 @@ <?php $wb['domain_error_empty'] = 'Nome dominio è vuoto'; $wb['domain_error_unique'] = 'Dominio già esistente'; -$wb['domain_error_regex'] = 'Questo nome a dominio non è permesso'; +$wb['domain_error_regex'] = 'Questo nome di dominio non è permesso'; $wb['Domain'] = 'Dominio'; ?> diff --git a/interface/web/client/lib/lang/it_reseller.lng b/interface/web/client/lib/lang/it_reseller.lng index f023dcf54d36cb54ff12efa67d5f6393c022c982..2acac2cb609c9aa20161f460ab8970a28d32a8c8 100644 --- a/interface/web/client/lib/lang/it_reseller.lng +++ b/interface/web/client/lib/lang/it_reseller.lng @@ -1,24 +1,25 @@ <?php -$wb['limit_maildomain_txt'] = 'Max. number of email domains'; -$wb['limit_mailbox_txt'] = 'Max. number of mailboxes'; -$wb['limit_mailalias_txt'] = 'Max. number of email aliases'; -$wb['limit_mailforward_txt'] = 'Max. number of email forwarders'; -$wb['limit_mailcatchall_txt'] = 'Max. number of email catchall accounts'; -$wb['limit_mailrouting_txt'] = 'Max. number of email routes'; -$wb['limit_mail_wblist_txt'] = 'Max. number of email white / blacklist entries'; -$wb['limit_mailfilter_txt'] = 'Max. number of email filters'; -$wb['limit_fetchmail_txt'] = 'Max. number of fetchmail accounts'; -$wb['limit_mailquota_txt'] = 'Mailbox quota'; -$wb['limit_spamfilter_wblist_txt'] = 'Max. number of spamfilter white / blacklist filters'; -$wb['limit_spamfilter_user_txt'] = 'Max. number of spamfilter users'; -$wb['limit_spamfilter_policy_txt'] = 'Max. number of spamfilter policies'; -$wb['default_mailserver_txt'] = 'Default Mailserver'; -$wb['company_name_txt'] = 'Company name'; -$wb['contact_name_txt'] = 'Contact name'; +$wb['limit_maildomain_txt'] = 'Massimo numero di domini email'; +$wb['limit_mailbox_txt'] = 'Massimo numero di caselle mail'; +$wb['limit_mailalias_txt'] = 'Massimo numero di alias email'; +$wb['limit_mailforward_txt'] = 'Massimo numero di forwarder email'; +$wb['limit_mailcatchall_txt'] = 'Massimo numero di profili mail catchall'; +$wb['limit_mailrouting_txt'] = 'Massimo numero di route mail'; +$wb['limit_mail_wblist_txt'] = 'Massimo numero di liste mail bianche e nere'; +$wb['limit_mailfilter_txt'] = 'Massimo numero di filtri mail'; +$wb['limit_fetchmail_txt'] = 'Massimo numero di profili fetchmail'; +$wb['limit_mailquota_txt'] = 'Quota Mailbox'; +$wb['limit_spamfilter_wblist_txt'] = 'Massimo numero di liste SPAMfilter bianche e nere'; +$wb['limit_spamfilter_user_txt'] = 'Massimo numero di utenti spamfilter'; +$wb['limit_spamfilter_policy_txt'] = 'Massimo numero di politiche spamfilter'; +$wb['limit_mail_backup_txt'] = 'Funzione E-mail backup disponibile'; +$wb['default_mailserver_txt'] = 'Mailserver Default'; +$wb['company_name_txt'] = 'Nome Azienda'; +$wb['contact_name_txt'] = 'nome Contatto'; $wb['username_txt'] = 'Nome Utente'; $wb['password_txt'] = 'Password'; -$wb['password_strength_txt'] = 'Livello sicurezza Password'; -$wb['language_txt'] = 'Language'; +$wb['password_strength_txt'] = 'Robustezza Password'; +$wb['language_txt'] = 'Lingua'; $wb['usertheme_txt'] = 'Tema'; $wb['street_txt'] = 'Via'; $wb['zip_txt'] = 'CAP'; @@ -36,176 +37,176 @@ $wb['company_txt'] = 'Azienda'; $wb['title_txt'] = 'Titolo'; $wb['firstname_txt'] = 'Nome'; $wb['surname_txt'] = 'Cognome'; -$wb['limit_relayhost_txt'] = 'Show SMTP relay host options'; +$wb['limit_relayhost_txt'] = 'Mostra le opzioni dell\'host SMTP relay'; $wb['limit_domain_txt'] = 'limit_domain'; $wb['limit_subdomain_txt'] = 'limit_subdomain'; $wb['limit_webquota_txt'] = 'limit_webquota'; -$wb['limit_database_txt'] = 'Max. number of Databases'; -$wb['limit_cron_txt'] = 'Max. number of cron jobs'; -$wb['limit_cron_type_txt'] = 'Max. type of cron jobs (chrooted and full implies url)'; -$wb['limit_cron_frequency_txt'] = 'Min. delay between executions'; -$wb['ip_address_txt'] = 'ip_address'; -$wb['limit_client_error_notint'] = 'The sub client limit must be a number.'; -$wb['firstname_error_empty'] = 'Firstname vuoto.'; -$wb['contact_error_empty'] = 'Contact name vuoto.'; +$wb['limit_database_txt'] = 'Massimo numero di Databases'; +$wb['limit_cron_txt'] = 'Massimo numero di cron jobs'; +$wb['limit_cron_type_txt'] = 'Massimo tipo di cron jobs (chrooted e completi implica url)'; +$wb['limit_cron_frequency_txt'] = 'Mininìmo ritardo tra le esecuzioni'; +$wb['ip_address_txt'] = 'Indirizzo IP'; +$wb['limit_client_error_notint'] = 'Il limite dei sotto clienti deve essere un numero.'; +$wb['firstname_error_empty'] = 'Nome vuoto.'; +$wb['contact_error_empty'] = 'Nome contatto vuoto.'; $wb['default_webserver_txt'] = 'Default Webserver'; -$wb['limit_web_domain_txt'] = 'Max. number of web domains'; -$wb['limit_web_aliasdomain_txt'] = 'Max. number of web aliasdomains'; -$wb['limit_web_subdomain_txt'] = 'Max. number of web subdomains'; -$wb['limit_ftp_user_txt'] = 'Max. number of FTP users'; -$wb['default_dnsserver_txt'] = 'Default DNS Server'; -$wb['limit_dns_zone_txt'] = 'Max. number of DNS zones'; -$wb['limit_dns_slave_zone_txt'] = 'Max. number of secondary DNS zones'; -$wb['limit_dns_record_txt'] = 'Max. number DNS records'; -$wb['limit_shell_user_txt'] = 'Max. number of Shell users'; -$wb['limit_client_txt'] = 'Max. number of Clients'; -$wb['username_error_empty'] = 'Username vuoto.'; -$wb['username_error_unique'] = 'The username must be unique.'; -$wb['limit_maildomain_error_notint'] = 'The email domain limit must be a number.'; -$wb['limit_mailbox_error_notint'] = 'The mailbox limit must be a number.'; -$wb['limit_mailalias_error_notint'] = 'The email alias limit must be a number.'; -$wb['limit_mailforward_error_notint'] = 'The email forward limit must be a number.'; -$wb['limit_mailcatchall_error_notint'] = 'The email catchall limit must be a number.'; -$wb['limit_mailrouting_error_notint'] = 'The email routing limit must be a number.'; -$wb['limit_mail_wblist_error_notint'] = 'The email white / blacklist limit must be a number.'; -$wb['limit_mailfilter_error_notint'] = 'The email filter limit must be a number.'; -$wb['limit_mailfetchmail_error_notint'] = 'The fetchmail limit must be a number.'; -$wb['limit_mailquota_error_notint'] = 'The email quota limit must be a number.'; -$wb['limit_spamfilter_wblist_error_notint'] = 'The spamfilter white / blacklist limit must be a number.'; -$wb['limit_spamfilter_user_error_notint'] = 'The spamfilter user limit must be a number.'; -$wb['limit_spamfilter_policy_error_notint'] = 'The spamfilter policy limit must be a number.'; -$wb['limit_web_domain_error_notint'] = 'The website limit must be a number.'; -$wb['limit_web_aliasdomain_error_notint'] = 'The website alias domain limit must be a number.'; -$wb['limit_web_subdomain_error_notint'] = 'The website subdomain limit must be a number.'; -$wb['limit_ftp_user_error_notint'] = 'The ftp user limit must be a number.'; -$wb['limit_shell_user_error_notint'] = 'The shell user limit must be a number.'; -$wb['limit_dns_zone_error_notint'] = 'The dns record limit must be a number.'; -$wb['limit_dns_slave_zone_error_notint'] = 'The dns slave zone limit must be a number.'; -$wb['limit_dns_record_error_notint'] = 'The dns record limit must be a number.'; +$wb['limit_web_domain_txt'] = 'Massimo numero di domini web'; +$wb['limit_web_aliasdomain_txt'] = 'Massimo numero di domini web alias'; +$wb['limit_web_subdomain_txt'] = 'Massimo numero di sottodomini web'; +$wb['limit_ftp_user_txt'] = 'Massimo numero di utenti FTP'; +$wb['default_dnsserver_txt'] = 'Server DNS Default'; +$wb['limit_dns_zone_txt'] = 'Massimo numero di zone DNS'; +$wb['limit_dns_slave_zone_txt'] = 'Massimo numero di zone DNS secondarie'; +$wb['limit_dns_record_txt'] = 'Massimo numero di record DNS'; +$wb['limit_shell_user_txt'] = 'Massimo numero di utenti della Shell'; +$wb['limit_client_txt'] = 'Massimo numero di Clienti'; +$wb['username_error_empty'] = 'Username vuoto.'; +$wb['username_error_unique'] = 'La username deve essere univoca.'; +$wb['limit_maildomain_error_notint'] = 'Il limite dei domini email deve essere un numero.'; +$wb['limit_mailbox_error_notint'] = 'Il limite delle caselle mail deve essere un numero.'; +$wb['limit_mailalias_error_notint'] = 'Il limite degli alias email deve essere un numero.'; +$wb['limit_mailforward_error_notint'] = 'Il limite delle email forward deve essere un numero.'; +$wb['limit_mailcatchall_error_notint'] = 'Il limite delle catchall deve essere un numero.'; +$wb['limit_mailrouting_error_notint'] = 'Il limite delle routing email deve essere un numero.'; +$wb['limit_mail_wblist_error_notint'] = 'Il limite delle liste email bianche / nere deve essere un numero.'; +$wb['limit_mailfilter_error_notint'] = 'Il limite dei filtri email deve essere un numero.'; +$wb['limit_mailfetchmail_error_notint'] = 'Il limite di fetchmail deve essere un numero.'; +$wb['limit_mailquota_error_notint'] = 'Il limite della quota mail deve essere un numero.'; +$wb['limit_spamfilter_wblist_error_notint'] = 'I limiti delle liste mail spamfilter bianhce / nere deve essere un numero.'; +$wb['limit_spamfilter_user_error_notint'] = 'Il limite di utenti liste spamfilter deve essere un numero.'; +$wb['limit_spamfilter_policy_error_notint'] = 'Il limite delle politiche spamfilter deve essere un numero.'; +$wb['limit_web_domain_error_notint'] = 'Il limite di siti web deve essere un numero.'; +$wb['limit_web_aliasdomain_error_notint'] = 'Il limite dei domini web alias deve essere un numero.'; +$wb['limit_web_subdomain_error_notint'] = 'Il limite di sottodomini web deve essere un numero.'; +$wb['limit_ftp_user_error_notint'] = 'Il limite degli utenti FTP deve essere un numero.'; +$wb['limit_shell_user_error_notint'] = 'Il limite degli utenti shell deve essere un numero.'; +$wb['limit_dns_zone_error_notint'] = 'Il limite dei record DNF deve essere un numero.'; +$wb['limit_dns_slave_zone_error_notint'] = 'Il numero di zone DNS slave deve essere un numero.'; +$wb['limit_dns_record_error_notint'] = 'Il limite dei record DNF deve essere un numero.'; $wb['default_dbserver_txt'] = 'Default Database Server'; -$wb['limit_database_error_notint'] = 'The database limit must be a number.'; -$wb['limit_cron_error_notint'] = 'The cron limit must be a number.'; -$wb['limit_cron_error_frequency'] = 'The cron frequency limit must be a number.'; -$wb['username_error_regex'] = 'The Username contains invalid chracaters.'; -$wb['template_master_txt'] = 'Master template'; -$wb['template_additional_txt'] = 'Addon template'; -$wb['ssh_chroot_txt'] = 'SSH-Chroot Options'; -$wb['web_php_options_txt'] = 'PHP Options'; -$wb['limit_client_error'] = 'The max. number of clients is reached.'; -$wb['limit_web_quota_txt'] = 'Web Quota'; -$wb['limit_traffic_quota_txt'] = 'Traffic Quota'; -$wb['limit_trafficquota_error_notint'] = 'Traffic Quota must be a number.'; -$wb['customer_no_txt'] = 'Customer No.'; +$wb['limit_database_error_notint'] = 'Il limite dei database deve essere un numero.'; +$wb['limit_cron_error_notint'] = 'Il limite di cron deve essere un numero.'; +$wb['limit_cron_error_frequency'] = 'La frequenza di cron deve essere un numero.'; +$wb['username_error_regex'] = 'Il nome utente contiene caratteri non ammessi.'; +$wb['template_master_txt'] = 'Modello Master'; +$wb['template_additional_txt'] = 'Modello Addon'; +$wb['ssh_chroot_txt'] = 'Opzioni SSH-Chroot'; +$wb['web_php_options_txt'] = 'Opzioni PHP'; +$wb['limit_client_error'] = 'Hai raggiunto il massimo numero di utenti di un cliente.'; +$wb['limit_web_quota_txt'] = 'Quota Web'; +$wb['limit_traffic_quota_txt'] = 'Quota Traffico'; +$wb['limit_trafficquota_error_notint'] = 'Quota Traffico deve essere un numero.'; +$wb['customer_no_txt'] = 'N° Cliente'; $wb['vat_id_txt'] = 'VAT ID'; -$wb['required_fields_txt'] = '* Required fields'; -$wb['limit_webdav_user_txt'] = 'Max. number of Webdav users'; -$wb['limit_webdav_user_error_notint'] = 'The webdav user limit must be a number.'; -$wb['limit_mailmailinglist_txt'] = 'Max. number of mailing lists'; -$wb['limit_mailaliasdomain_txt'] = 'Max. number of domain aliases'; -$wb['limit_mailmailinglist_error_notint'] = 'The mailing list record limit must be a number.'; -$wb['limit_openvz_vm_txt'] = 'Max. number of virtual servers'; -$wb['limit_openvz_vm_template_id_txt'] = 'Force virtual server template'; -$wb['limit_openvz_vm_error_notint'] = 'The virtual server limit must be a number.'; -$wb['web_php_options_notempty'] = 'No PHP option(s) selected. Select at least one PHP option.'; -$wb['ssh_chroot_notempty'] = 'No SSH chroot option selected. Select at least one option.'; -$wb['username_error_collision'] = 'The username may not start with the word -web- or -web- followed by a number.'; -$wb['add_additional_template_txt'] = 'Add additional template'; -$wb['delete_additional_template_txt'] = 'Elimina additional template'; -$wb['limit_cgi_txt'] = 'CGI available'; -$wb['limit_ssi_txt'] = 'SSI available'; -$wb['limit_perl_txt'] = 'Perl available'; -$wb['limit_ruby_txt'] = 'Ruby available'; -$wb['limit_python_txt'] = 'Python available'; -$wb['force_suexec_txt'] = 'SuEXEC forced'; -$wb['limit_hterror_txt'] = 'Custom error docs available'; -$wb['limit_wildcard_txt'] = 'Wildcard subdomain available'; -$wb['limit_ssl_txt'] = 'SSL available'; -$wb['web_limits_txt'] = 'Web Limits'; -$wb['email_limits_txt'] = 'Email Limits'; -$wb['database_limits_txt'] = 'Database Limits'; -$wb['cron_job_limits_txt'] = 'Cron Job Limits'; -$wb['dns_limits_txt'] = 'DNS Limits'; -$wb['virtualization_limits_txt'] = 'Virtualization Limits'; +$wb['required_fields_txt'] = '* Campi obbligatori'; +$wb['limit_webdav_user_txt'] = 'Massimo numero di utenti Webdav'; +$wb['limit_webdav_user_error_notint'] = 'Il limite di utenti Webdav deve essere un numero.'; +$wb['limit_mailmailinglist_txt'] = 'Massimo numero di mailing lists'; +$wb['limit_mailaliasdomain_txt'] = 'Massimo numero si domini alias'; +$wb['limit_mailmailinglist_error_notint'] = 'Il limite di mailing list deve essere un numero.'; +$wb['limit_openvz_vm_txt'] = 'Masimo numero di server virtuali'; +$wb['limit_openvz_vm_template_id_txt'] = 'Imponi modello virtual server'; +$wb['limit_openvz_vm_error_notint'] = 'Il limite di server virtuali deve essere un numero.'; +$wb['web_php_options_notempty'] = 'Nessuna opzione PHP selezionata. Selezionare almeno una opzione PHP.'; +$wb['ssh_chroot_notempty'] = 'Nessuna opzione chroot SSH selezionata. Seleziona almeno una opzione.'; +$wb['username_error_collision'] = 'La username non può iniziare con la parola -web- o -web- seguito da un numero.'; +$wb['add_additional_template_txt'] = 'Aggiungi modello'; +$wb['delete_additional_template_txt'] = 'Elimina modello'; +$wb['limit_cgi_txt'] = 'CGI disponibile'; +$wb['limit_ssi_txt'] = 'SSI disponibile'; +$wb['limit_perl_txt'] = 'Perl disponibile'; +$wb['limit_ruby_txt'] = 'Ruby disponibile'; +$wb['limit_python_txt'] = 'Python disponibile'; +$wb['force_suexec_txt'] = 'SuEXEC imposto'; +$wb['limit_hterror_txt'] = 'Messaggi di errore personalizzati disponibili'; +$wb['limit_wildcard_txt'] = 'sottodomini * disponibile'; +$wb['limit_ssl_txt'] = 'SSL disponibile'; +$wb['web_limits_txt'] = 'Limiti Web'; +$wb['email_limits_txt'] = 'Limiti Email'; +$wb['database_limits_txt'] = 'Limiti Database'; +$wb['cron_job_limits_txt'] = 'Limiti Cron Job'; +$wb['dns_limits_txt'] = 'Limiti DNS'; +$wb['virtualization_limits_txt'] = 'Limiti Virtualizzazione'; $wb['generate_password_txt'] = 'Genera Password'; $wb['repeat_password_txt'] = 'Ripeti Password'; $wb['password_mismatch_txt'] = 'Le password non coincidono.'; $wb['password_match_txt'] = 'Le password coincidono.'; -$wb['email_error_isemail'] = 'Please enter a valid email address.'; -$wb['customer_no_error_unique'] = 'The customer no. must be unique (or empty).'; -$wb['paypal_email_error_isemail'] = 'Please enter a valid PayPal email address.'; -$wb['paypal_email_txt'] = 'PayPal Email'; -$wb['company_id_txt'] = 'Company/Entrepreneur ID'; -$wb['bank_account_number_txt'] = 'Bank account no.'; -$wb['bank_account_owner_txt'] = 'Bank account owner'; -$wb['bank_code_txt'] = 'Bank code'; -$wb['bank_name_txt'] = 'Bank name'; +$wb['email_error_isemail'] = 'Inserisci un indirizzo mail corretto.'; +$wb['customer_no_error_unique'] = 'Il numero di cliente deve essere univoco (o vuoto).'; +$wb['paypal_email_error_isemail'] = 'Inserire una mail valida per PayPal.'; +$wb['paypal_email_txt'] = 'Email PayPal'; +$wb['company_id_txt'] = 'ID Azienda/Impresa'; +$wb['bank_account_number_txt'] = 'n° conto corrente bancario.'; +$wb['bank_account_owner_txt'] = 'Titolare conto corrente bancario'; +$wb['bank_code_txt'] = 'Codice Banca'; +$wb['bank_name_txt'] = 'Nome banca'; $wb['bank_account_iban_txt'] = 'IBAN'; $wb['bank_account_swift_txt'] = 'BIC / Swift'; $wb['aps_limits_txt'] = 'APS Installer Limits'; -$wb['limit_aps_txt'] = 'Max. number of APS instances'; -$wb['limit_aps_error_notint'] = 'The APS instances limit must be a number.'; -$wb['default_slave_dnsserver_txt'] = 'Default Secondary DNS Server'; -$wb['locked_txt'] = 'Locked'; -$wb['canceled_txt'] = 'Canceled'; -$wb['gender_m_txt'] = 'Mr.'; -$wb['gender_f_txt'] = 'Ms.'; -$wb['gender_txt'] = 'Title'; -$wb['customer_no_template_txt'] = 'Customer No. template'; -$wb['customer_no_template_error_regex_txt'] = 'The customer No. template contains invalid characters'; -$wb['customer_no_start_txt'] = 'Customer No. start value'; -$wb['customer_no_counter_txt'] = 'Customer No. counter'; -$wb['added_by_txt'] = 'Added by'; -$wb['added_date_txt'] = 'Added date'; -$wb['limit_domainmodule_error_notint'] = 'Domainmodule limit must be a number.'; -$wb['limit_domainmodule_txt'] = 'Domainmodule Limit'; -$wb['client_limits_txt'] = 'Client Limits'; -$wb['err_msg_master_tpl_set'] = 'All custom limit settings are ignored if any master template other than \\"custom\\" is selected.'; -$wb['contact_firstname_txt'] = 'Contact firstname'; -$wb['limit_backup_txt'] = 'Backupfunction available'; -$wb['limit_client_error_positive_or_unlimited'] = 'The number of clients must be > 0 or -1 (unlimited)'; +$wb['limit_aps_txt'] = 'Massimo numero di istanze APS'; +$wb['limit_aps_error_notint'] = 'Il limite di istanze APS edve essere un numero.'; +$wb['default_slave_dnsserver_txt'] = 'Server DNS Secondario Default'; +$wb['locked_txt'] = 'Bloccato'; +$wb['canceled_txt'] = 'Eliminato'; +$wb['gender_m_txt'] = 'Sig.'; +$wb['gender_f_txt'] = 'Sig.ra'; +$wb['gender_txt'] = 'Titolo'; +$wb['customer_no_template_txt'] = 'Modello n° Cliente'; +$wb['customer_no_template_error_regex_txt'] = 'Il modello del n° cliente contiene caratteri non ammessi'; +$wb['customer_no_start_txt'] = 'Valore iniziale del n° cliente'; +$wb['customer_no_counter_txt'] = 'Contatore n° Cliente'; +$wb['added_by_txt'] = 'Aggiunto da'; +$wb['added_date_txt'] = 'Aggiunto in data'; +$wb['limit_domainmodule_error_notint'] = 'Il limite del modulo di Domini deve essere un numero.'; +$wb['limit_domainmodule_txt'] = 'Limite modulo Domini'; +$wb['client_limits_txt'] = 'Limiti Cliente'; +$wb['err_msg_master_tpl_set'] = 'Tutti i limiti personalizzati sono ignorati se viene selezionato un mìtemplate master diverso da \\"custom\\".'; +$wb['contact_firstname_txt'] = 'Nome contatto'; +$wb['limit_backup_txt'] = 'Funzione Backup disponibile'; +$wb['limit_client_error_positive_or_unlimited'] = 'Il numero di clienti deve essere > 0 or -1 (illimitato)'; $wb['web_servers_txt'] = 'Webservers'; -$wb['web_servers_placeholder'] = 'Select Webservers'; -$wb['no_web_server_error'] = 'At least one webserver must be selected.'; -$wb['web_servers_used'] = 'The server you are trying to remove from this client is used as a webserver. Be sure that this server is not used by this client before to remove it.'; +$wb['web_servers_placeholder'] = 'Seleziona Webservers'; +$wb['no_web_server_error'] = 'Almeno un webserver deve essere selezionato.'; +$wb['web_servers_used'] = 'Il server che stai cercando di rimuovere da questo cliente è in uso come web server. Assicurati che non sia usato dal cliente prima di tentare di rimuoverlo.'; $wb['dns_servers_txt'] = 'DNS Server'; -$wb['dns_servers_placeholder'] = 'Select DNS Servers'; -$wb['no_dns_server_error'] = 'At least one DNS server must be selected.'; -$wb['dns_servers_used'] = 'The server you are trying to remove from this client is used as a DNS server. Be sure that this server is not used by this client before to remove it.'; +$wb['dns_servers_placeholder'] = 'Seleziona DNS Servers'; +$wb['no_dns_server_error'] = 'Almeno un DNS server deve essere selezionato.'; +$wb['dns_servers_used'] = 'Il server che stai cercando di rimuovere da questo cliente è in uso come DNS server. Assicurati che non sia usato dal cliente prima di tentare di rimuoverlo.'; $wb['db_servers_txt'] = 'Database Server'; -$wb['db_servers_placeholder'] = 'Select Database Servers'; -$wb['no_db_server_error'] = 'At least one Database server must be selected.'; -$wb['db_servers_used'] = 'The server you are trying to remove from this client is used as a Database server. Be sure that this server is not used by this client before to remove it.'; +$wb['db_servers_placeholder'] = 'Seleziona Database Servers'; +$wb['no_db_server_error'] = 'Almeno un Database server deve essere selezionato.'; +$wb['db_servers_used'] = 'Il server che stai cercando di rimuovere da questo cliente è in uso come Database server. Assicurati che non sia usato dal cliente prima di tentare di rimuoverlo.'; $wb['mail_servers_txt'] = 'Mailservers'; -$wb['mail_servers_placeholder'] = 'Select Mailservers'; -$wb['no_mail_server_error'] = 'At least one Mailserver must be selected.'; -$wb['mail_servers_used'] = 'The server you are trying to remove from this client is used as a Mailserver. Be sure that this server is not used by this client before to remove it.'; -$wb['xmpp_limits_txt'] = 'XMPP Limits'; +$wb['mail_servers_placeholder'] = 'Seleziona Mailservers'; +$wb['no_mail_server_error'] = 'Almeno un Mailserver deve essere selezionate.'; +$wb['mail_servers_used'] = 'Il server che stai cercando di rimuovere da questo cliente è in uso come server Mail. Assicurati che non sia usato dal cliente prima di tentare di rimuoverlo.'; +$wb['xmpp_limits_txt'] = 'Limiti XMPP'; $wb['xmpp_servers_txt'] = 'XMPP Servers'; -$wb['xmpp_servers_placeholder'] = 'Select XMPP Servers'; -$wb['no_xmpp_server_error'] = 'At least one XMPP Server must be selected.'; -$wb['xmpp_servers_used'] = 'The server you are trying to remove from this client is used as a XMPP Server. Be sure that this server is not used by this client before you remove it.'; -$wb['limit_xmpp_domain_error_notint'] = 'The XMPP domain limit must be a number.'; -$wb['limit_xmpp_user_error_notint'] = 'The XMPP user limit must be a number.'; -$wb['limit_xmpp_domain_txt'] = 'Max. number of XMPP domains'; -$wb['limit_xmpp_user_txt'] = 'Max. number of XMPP accounts'; -$wb['limit_xmpp_muc_txt'] = 'Multiuser chat available'; -$wb['limit_xmpp_pastebin_txt'] = 'Pastebin for MUC available'; -$wb['limit_xmpp_httparchive_txt'] = 'HTTP archive for MUC available'; -$wb['limit_xmpp_anon_txt'] = 'Anonymous host available'; -$wb['limit_xmpp_vjud_txt'] = 'VJUD user directory available'; -$wb['limit_xmpp_proxy_txt'] = 'Bytestream proxy available'; -$wb['limit_xmpp_status_txt'] = 'Status host available'; -$wb['invalid_vat_id'] = 'The VAT ID is invalid.'; -$wb['btn_save_txt'] = 'Save'; -$wb['btn_cancel_txt'] = 'Cancel'; -$wb['email_error_empty'] = 'Email is empty'; -$wb['limit_database_user_txt'] = 'Max. Database users'; -$wb['limit_database_user_error_notint'] = 'The database user limit must be a number.'; -$wb['limit_database_quota_txt'] = 'Database quota'; -$wb['limit_database_quota_error_notint'] = 'The database quota limit must be a number.'; -$wb['limit_ssl_letsencrypt_txt'] = 'Let\'s Encrypt available'; -$wb['limit_directive_snippets_txt'] = 'Show web server config selection'; -$wb['password_click_to_set_txt'] = 'Click to set'; -$wb['Reseller'] = 'Reseller'; -$wb['Address'] = 'Address'; -$wb['Limits'] = 'Limits'; +$wb['xmpp_servers_placeholder'] = 'Seleziona XMPP Servers'; +$wb['no_xmpp_server_error'] = 'Almeno un XMPP Server deve essere selezionata.'; +$wb['xmpp_servers_used'] = 'Il server che stai cercando di rimuovere da questo cliente è in uso come server XMPP. Assicurati che non sia usato dal cliente prima di tentare di rimuoverlo.'; +$wb['limit_xmpp_domain_error_notint'] = 'Il limite di domini XMPP deve essere un numero.'; +$wb['limit_xmpp_user_error_notint'] = 'Il limite di utenti XMPP deve essere un numero.'; +$wb['limit_xmpp_domain_txt'] = 'Massimo numero di domini XMPP'; +$wb['limit_xmpp_user_txt'] = 'Massimo numero di profili XMPP'; +$wb['limit_xmpp_muc_txt'] = 'Multiuser chat disponibile'; +$wb['limit_xmpp_pastebin_txt'] = 'Pastebin per MUC disponibile'; +$wb['limit_xmpp_httparchive_txt'] = 'Archivio HTTP per MUC disponibile'; +$wb['limit_xmpp_anon_txt'] = 'host anonimo disponibile'; +$wb['limit_xmpp_vjud_txt'] = 'Rubrica utenti VJUD disponibile'; +$wb['limit_xmpp_proxy_txt'] = 'Bytestream proxy disponibile'; +$wb['limit_xmpp_status_txt'] = 'Status host disponibile'; +$wb['invalid_vat_id'] = 'Il numero IVA non è corretto.'; +$wb['btn_save_txt'] = 'Salva'; +$wb['btn_cancel_txt'] = 'Annulla'; +$wb['email_error_empty'] = 'Email è vuoto'; +$wb['limit_database_user_txt'] = 'Massimo numero di utenti Database'; +$wb['limit_database_user_error_notint'] = 'Il limite di utente database deve essere un numero.'; +$wb['limit_database_quota_txt'] = 'Quota Database'; +$wb['limit_database_quota_error_notint'] = 'La quota database deve essere un numore.'; +$wb['limit_ssl_letsencrypt_txt'] = 'Let\'s Encrypt disponibile'; +$wb['limit_directive_snippets_txt'] = 'Mostra selezione configurazione server web'; +$wb['password_click_to_set_txt'] = 'Clicca per impostare'; +$wb['Reseller'] = 'Rivenditore'; +$wb['Address'] = 'Indirizzo'; +$wb['Limits'] = 'Limiti'; diff --git a/interface/web/client/lib/lang/it_resellers_list.lng b/interface/web/client/lib/lang/it_resellers_list.lng index 079ce84f4d0d1d4e431256430932cde427cdb354..dbf6b8f6ecc68e33735678094f7acfff39e6c91c 100644 --- a/interface/web/client/lib/lang/it_resellers_list.lng +++ b/interface/web/client/lib/lang/it_resellers_list.lng @@ -6,6 +6,6 @@ $wb['contact_name_txt'] = 'Contatto'; $wb['city_txt'] = 'Città '; $wb['country_txt'] = 'Nazione'; $wb['add_new_record_txt'] = 'Aggiungi nuovo rivenditore'; -$wb['customer_no_txt'] = 'Customer No.'; +$wb['customer_no_txt'] = 'n° cliente'; $wb['username_txt'] = 'Nome Utente'; ?> diff --git a/interface/web/client/lib/lang/ja_client.lng b/interface/web/client/lib/lang/ja_client.lng index 6d25b13ce1db67263f214e57d41ad118821445c0..4639125717189e1184ce60564d6cf5ea501b7eca 100644 --- a/interface/web/client/lib/lang/ja_client.lng +++ b/interface/web/client/lib/lang/ja_client.lng @@ -12,6 +12,7 @@ $wb['limit_mailquota_txt'] = 'メールボックスã®å®¹é‡'; $wb['limit_spamfilter_wblist_txt'] = '迷惑メールã®ãƒ›ãƒ¯ã‚¤ãƒˆãƒªã‚¹ãƒˆã€ãƒ–ãƒ©ãƒƒã‚¯ãƒªã‚¹ãƒˆãƒ•ã‚£ãƒ«ã‚¿ãƒ¼ã®æœ€å¤§æ•°'; $wb['limit_spamfilter_user_txt'] = 'Max. number of spamfilter users'; $wb['limit_spamfilter_policy_txt'] = '迷惑メールフィルタã®ãƒãƒªã‚·ãƒ¼ã®æœ€å¤§æ•°'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'デフォルトã®ãƒ¡ãƒ¼ãƒ«ã‚µãƒ¼ãƒãƒ¼'; $wb['company_name_txt'] = '社å'; $wb['contact_firstname_txt'] = 'Contact firstname'; diff --git a/interface/web/client/lib/lang/ja_client_template.lng b/interface/web/client/lib/lang/ja_client_template.lng index 768e56cc42e3765b44bab8cbead7a7c991d35562..a871199051c506aaccf96f3111b827c16bbc9d18 100644 --- a/interface/web/client/lib/lang/ja_client_template.lng +++ b/interface/web/client/lib/lang/ja_client_template.lng @@ -94,6 +94,7 @@ $wb['limit_aps_txt'] = 'Max. number of APS instances'; $wb['limit_aps_error_notint'] = 'The APS instances limit must be a number.'; $wb['limit_domainmodule_txt'] = 'Domainmodule Limit'; $wb['client_limits_txt'] = 'Client Limits'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Default Mailserver'; $wb['default_webserver_txt'] = 'Default Webserver'; $wb['default_dnsserver_txt'] = 'Default DNS Server'; diff --git a/interface/web/client/lib/lang/ja_reseller.lng b/interface/web/client/lib/lang/ja_reseller.lng index 1c5851bdfc5a4c6c4aa9403a41fa311e6e938fe5..041174da1bffb74ca02a52c37cf03d27a866143a 100644 --- a/interface/web/client/lib/lang/ja_reseller.lng +++ b/interface/web/client/lib/lang/ja_reseller.lng @@ -12,6 +12,7 @@ $wb['limit_mailquota_txt'] = 'メールボックスã®å®¹é‡'; $wb['limit_spamfilter_wblist_txt'] = 'スパムメールã®ãƒ›ãƒ¯ã‚¤ãƒˆãƒªã‚¹ãƒˆã€ãƒ–ãƒ©ãƒƒã‚¯ãƒªã‚¹ãƒˆãƒ•ã‚£ãƒ«ã‚¿ãƒ¼ã®æœ€å¤§æ•°'; $wb['limit_spamfilter_user_txt'] = 'ã‚¹ãƒ‘ãƒ ãƒ•ã‚£ãƒ«ã‚¿ãƒ¼ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®æœ€å¤§æ•°'; $wb['limit_spamfilter_policy_txt'] = 'スパムフィルターãƒãƒªã‚·ãƒ¼ã®æœ€å¤§æ•°'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'デフォルトã®ãƒ¡ãƒ¼ãƒ«ã‚µãƒ¼ãƒãƒ¼'; $wb['company_name_txt'] = '社å'; $wb['contact_firstname_txt'] = 'Contact firstname'; diff --git a/interface/web/client/lib/lang/nl_client.lng b/interface/web/client/lib/lang/nl_client.lng index 9d0160da3238dcd0f2075165421b73c2f277676c..593d5dbdff1fb904284899a65accc379d58b2e02 100644 --- a/interface/web/client/lib/lang/nl_client.lng +++ b/interface/web/client/lib/lang/nl_client.lng @@ -13,6 +13,7 @@ $wb['limit_mailquota_txt'] = 'Mailbox quota'; $wb['limit_spamfilter_wblist_txt'] = 'Max. aantal spamfilter white / blacklist filters'; $wb['limit_spamfilter_user_txt'] = 'Max. aantal spamfilter users'; $wb['limit_spamfilter_policy_txt'] = 'Max. aantal spamfilter policys'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Standaard mailserver'; $wb['company_name_txt'] = 'Bedrijfsnaam'; $wb['contact_firstname_txt'] = 'Contact firstname'; diff --git a/interface/web/client/lib/lang/nl_client_template.lng b/interface/web/client/lib/lang/nl_client_template.lng index d6bfd660e2d32089fa105c166b5dbb84b449e57e..c31638c1327e4f56b8cd6029825dfd19b38cc6c3 100644 --- a/interface/web/client/lib/lang/nl_client_template.lng +++ b/interface/web/client/lib/lang/nl_client_template.lng @@ -94,6 +94,7 @@ $wb['limit_aps_txt'] = 'Max. number of APS instances'; $wb['limit_aps_error_notint'] = 'The APS instances limit must be a number.'; $wb['limit_domainmodule_txt'] = 'Domainmodule Limit'; $wb['client_limits_txt'] = 'Client Limits'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Default Mailserver'; $wb['default_webserver_txt'] = 'Default Webserver'; $wb['default_dnsserver_txt'] = 'Default DNS Server'; diff --git a/interface/web/client/lib/lang/nl_reseller.lng b/interface/web/client/lib/lang/nl_reseller.lng index 1cb2abbd9ca0121920a5f6c1e38d6d7103718373..e67e560e93b091dfe3fe57e92a8069b01777d040 100644 --- a/interface/web/client/lib/lang/nl_reseller.lng +++ b/interface/web/client/lib/lang/nl_reseller.lng @@ -12,6 +12,7 @@ $wb['limit_mailquota_txt'] = 'Mailbox quota'; $wb['limit_spamfilter_wblist_txt'] = 'Max. aantal spamfilter white / blacklist filters'; $wb['limit_spamfilter_user_txt'] = 'Max. aantal spamfilter gebruikers'; $wb['limit_spamfilter_policy_txt'] = 'Max. aantal spamfilter policys'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Standaard Mailserver'; $wb['company_name_txt'] = 'Bedrijfsnaam'; $wb['contact_firstname_txt'] = 'Contact firstname'; diff --git a/interface/web/client/lib/lang/pl_client.lng b/interface/web/client/lib/lang/pl_client.lng index 67ea97fbe6e5cc766731a85d458a4f181b0998b6..6943deef9502488431195fc80af074cea5a51c26 100644 --- a/interface/web/client/lib/lang/pl_client.lng +++ b/interface/web/client/lib/lang/pl_client.lng @@ -12,6 +12,7 @@ $wb['limit_mailquota_txt'] = 'Pojemność skrzynki'; $wb['limit_spamfilter_wblist_txt'] = 'Maksymalna ilość filtrów spamu biaÅ‚ej / czarnej listy'; $wb['limit_spamfilter_user_txt'] = 'Maksymalna ilość filtrów spamu użytkowników'; $wb['limit_spamfilter_policy_txt'] = 'Maksymalna ilość polityk filtrów spamu'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'DomyÅ›lny serwer e-mail'; $wb['company_name_txt'] = 'Nazwa firmy'; $wb['contact_firstname_txt'] = 'Contact firstname'; diff --git a/interface/web/client/lib/lang/pl_client_template.lng b/interface/web/client/lib/lang/pl_client_template.lng index 95e2b48d5d505d2ea258bdb73df7d05c8862dcff..614bf2757584bab00c4c83b74c486da935bd0a11 100644 --- a/interface/web/client/lib/lang/pl_client_template.lng +++ b/interface/web/client/lib/lang/pl_client_template.lng @@ -94,6 +94,7 @@ $wb['limit_aps_txt'] = 'Maks. liczba instancji APS'; $wb['limit_aps_error_notint'] = 'Limit instancji APS musi być liczbÄ…'; $wb['limit_domainmodule_txt'] = 'Domainmodule Limit'; $wb['client_limits_txt'] = 'Client Limits'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Default Mailserver'; $wb['default_webserver_txt'] = 'Default Webserver'; $wb['default_dnsserver_txt'] = 'Default DNS Server'; diff --git a/interface/web/client/lib/lang/pl_reseller.lng b/interface/web/client/lib/lang/pl_reseller.lng index 8ada7b86c7524d12f8c34be67831e56a502bbfaf..da566ab4c6c14fdc8674a0bd06fb2057cec38851 100644 --- a/interface/web/client/lib/lang/pl_reseller.lng +++ b/interface/web/client/lib/lang/pl_reseller.lng @@ -12,6 +12,7 @@ $wb['limit_mailquota_txt'] = 'Limit skrzynki pocztowej'; $wb['limit_spamfilter_wblist_txt'] = 'Maksymalna ilość filtrów spamu biaÅ‚ej / czarnej listy'; $wb['limit_spamfilter_user_txt'] = 'Maksymalna ilość użytkowników z filtrem spamu'; $wb['limit_spamfilter_policy_txt'] = 'Maksymalna ilość polityk filtrów spamu'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'DomyÅ›lny serwer poczty'; $wb['company_name_txt'] = 'Nazwa firmy'; $wb['contact_firstname_txt'] = 'Contact firstname'; diff --git a/interface/web/client/lib/lang/pt_client.lng b/interface/web/client/lib/lang/pt_client.lng index 6b41a2fe3a976d590a1caad8b029dee7f99f34fc..2b90c823ca93407a2f80b3f172babc97c0ce87e2 100644 --- a/interface/web/client/lib/lang/pt_client.lng +++ b/interface/web/client/lib/lang/pt_client.lng @@ -12,6 +12,7 @@ $wb['limit_mailquota_txt'] = 'Quota de Correio'; $wb['limit_spamfilter_wblist_txt'] = 'Número máximo de filtros spam lista branca / negra'; $wb['limit_spamfilter_user_txt'] = 'Número máximo de utilizadors de filtros spam'; $wb['limit_spamfilter_policy_txt'] = 'Número máximo de polÃticas de filtros spam'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Servidor de Correio Padrão'; $wb['company_name_txt'] = 'Empresa'; $wb['contact_firstname_txt'] = 'Contact firstname'; diff --git a/interface/web/client/lib/lang/pt_client_template.lng b/interface/web/client/lib/lang/pt_client_template.lng index 98cda03d0addcf14fac8da06c2964ea5f8e619d0..7f63af0df32217c2291abb807e942d6eb43890f5 100644 --- a/interface/web/client/lib/lang/pt_client_template.lng +++ b/interface/web/client/lib/lang/pt_client_template.lng @@ -94,6 +94,7 @@ $wb['limit_aps_txt'] = 'Max. number of APS instances'; $wb['limit_aps_error_notint'] = 'The APS instances limit must be a number.'; $wb['limit_domainmodule_txt'] = 'Domainmodule Limit'; $wb['client_limits_txt'] = 'Client Limits'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Default Mailserver'; $wb['default_webserver_txt'] = 'Default Webserver'; $wb['default_dnsserver_txt'] = 'Default DNS Server'; diff --git a/interface/web/client/lib/lang/pt_reseller.lng b/interface/web/client/lib/lang/pt_reseller.lng index eeb8f69c05f53d40d558870446fe7a64c50c50ed..22c4f107a8d0030bd1536898d66ccd21f87ade81 100644 --- a/interface/web/client/lib/lang/pt_reseller.lng +++ b/interface/web/client/lib/lang/pt_reseller.lng @@ -12,6 +12,7 @@ $wb['limit_mailquota_txt'] = 'Quota de correio'; $wb['limit_spamfilter_wblist_txt'] = 'Número máximo de filtros do spamfilter lista branca / negra'; $wb['limit_spamfilter_user_txt'] = 'Número máximo de utilizadors de spamfilter'; $wb['limit_spamfilter_policy_txt'] = 'Número máximo de polÃticas de spamfilter'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Servidor de Correio Padrão'; $wb['company_name_txt'] = 'Empresa'; $wb['contact_firstname_txt'] = 'Contact firstname'; diff --git a/interface/web/client/lib/lang/ro_client.lng b/interface/web/client/lib/lang/ro_client.lng index fdf112f7af51802dba4d3ed09820f0ba5ea13b29..70407714a8fbe67e51c83474c909fcd43c077f68 100644 --- a/interface/web/client/lib/lang/ro_client.lng +++ b/interface/web/client/lib/lang/ro_client.lng @@ -12,6 +12,7 @@ $wb['limit_mailquota_txt'] = 'Mailbox quota'; $wb['limit_spamfilter_wblist_txt'] = 'Numar maxim de filtre spam whitelist /blacklist'; $wb['limit_spamfilter_user_txt'] = 'Numar maxim de filtre spam'; $wb['limit_spamfilter_policy_txt'] = 'Numar maxim de reguli filtre spam '; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Default Mailserver'; $wb['company_name_txt'] = 'Nume companie'; $wb['contact_firstname_txt'] = 'Contact firstname'; diff --git a/interface/web/client/lib/lang/ro_client_template.lng b/interface/web/client/lib/lang/ro_client_template.lng index 77c024db641e522856be92879c748f794849d7ae..abd9f64eb123a7333335f5066125d6d7a7852b62 100644 --- a/interface/web/client/lib/lang/ro_client_template.lng +++ b/interface/web/client/lib/lang/ro_client_template.lng @@ -94,6 +94,7 @@ $wb['limit_aps_txt'] = 'Max. number of APS instances'; $wb['limit_aps_error_notint'] = 'The APS instances limit must be a number.'; $wb['limit_domainmodule_txt'] = 'Domainmodule Limit'; $wb['client_limits_txt'] = 'Client Limits'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Default Mailserver'; $wb['default_webserver_txt'] = 'Default Webserver'; $wb['default_dnsserver_txt'] = 'Default DNS Server'; diff --git a/interface/web/client/lib/lang/ro_reseller.lng b/interface/web/client/lib/lang/ro_reseller.lng index 4d21c7d173522f9aa06151eb20d6c6ce3fc1dee0..9f3ce64e8007a6dd75590e1e68f32586827d9561 100644 --- a/interface/web/client/lib/lang/ro_reseller.lng +++ b/interface/web/client/lib/lang/ro_reseller.lng @@ -12,6 +12,7 @@ $wb['limit_mailquota_txt'] = 'Mailbox quota'; $wb['limit_spamfilter_wblist_txt'] = 'Max. number of spamfilter white / blacklist filters'; $wb['limit_spamfilter_user_txt'] = 'Max. number of spamfilter users'; $wb['limit_spamfilter_policy_txt'] = 'Max. number of spamfilter policies'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Default Mailserver'; $wb['company_name_txt'] = 'Company name'; $wb['contact_firstname_txt'] = 'Contact firstname'; diff --git a/interface/web/client/lib/lang/ru_client.lng b/interface/web/client/lib/lang/ru_client.lng index 920020e9f4fd917b4e13e828a6f4a6b074224aab..d8cd5e4788e4cfa8607d21697777cd7c2ab53de6 100644 --- a/interface/web/client/lib/lang/ru_client.lng +++ b/interface/web/client/lib/lang/ru_client.lng @@ -12,6 +12,7 @@ $wb['limit_mailquota_txt'] = 'Квота почтового Ñщика'; $wb['limit_spamfilter_wblist_txt'] = 'МакÑ. количеÑтво фильтров белого/черного ÑпиÑка'; $wb['limit_spamfilter_user_txt'] = 'МакÑ. количеÑтво пользователей Ñпам-фильтра'; $wb['limit_spamfilter_policy_txt'] = 'МакÑ. количеÑтво правил Ñпам-фильтра'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Почтовый Ñервер по умолчанию'; $wb['company_name_txt'] = 'Ðазвание компании'; $wb['contact_firstname_txt'] = 'Ð˜Ð¼Ñ ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ð°'; diff --git a/interface/web/client/lib/lang/ru_client_template.lng b/interface/web/client/lib/lang/ru_client_template.lng index 94842e91556022997cd8b7ffe78b4933180c0cf8..65397933ff0069216bbe2975df9ae26a13a5d459 100644 --- a/interface/web/client/lib/lang/ru_client_template.lng +++ b/interface/web/client/lib/lang/ru_client_template.lng @@ -94,6 +94,7 @@ $wb['limit_aps_txt'] = 'МакÑ. количеÑтво ÑкземплÑров AP $wb['limit_aps_error_notint'] = 'Лимит ÑкземплÑров APS должен быть чиÑлом.'; $wb['limit_domainmodule_txt'] = 'Лимит модулей домена'; $wb['client_limits_txt'] = 'Лимиты Клиента'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Почтовый Ñервер по умолчанию'; $wb['default_webserver_txt'] = 'Web-Ñервер по умолчанию'; $wb['default_dnsserver_txt'] = 'DNS-Ñервер по умолчанию'; diff --git a/interface/web/client/lib/lang/ru_reseller.lng b/interface/web/client/lib/lang/ru_reseller.lng index aeac8ab7d796bde274922f108511d5fa857e3519..3447e52070648f84a820cb9efb5a5da4753a58f9 100644 --- a/interface/web/client/lib/lang/ru_reseller.lng +++ b/interface/web/client/lib/lang/ru_reseller.lng @@ -12,6 +12,7 @@ $wb['limit_mailquota_txt'] = 'Квота Ñщика'; $wb['limit_spamfilter_wblist_txt'] = 'МакÑ. количеÑтво белых/черных ÑпиÑков Ñпам-фильтра'; $wb['limit_spamfilter_user_txt'] = 'МакÑ. количеÑтво пользователей Ñпам-фильтра'; $wb['limit_spamfilter_policy_txt'] = 'МакÑ. количеÑтво правил Ñпам-фильтра'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Почтовый Ñервер по умолчанию'; $wb['company_name_txt'] = 'КомпаниÑ'; $wb['contact_firstname_txt'] = 'Ð˜Ð¼Ñ ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ð°'; diff --git a/interface/web/client/lib/lang/se_client.lng b/interface/web/client/lib/lang/se_client.lng index f9a9b8ef4cd41d363f1524de304504a940e167c5..41aca6a6bb5d978681ff70caf33927360558fce6 100644 --- a/interface/web/client/lib/lang/se_client.lng +++ b/interface/web/client/lib/lang/se_client.lng @@ -12,6 +12,7 @@ $wb['limit_mailquota_txt'] = 'Kvot för epostkonton'; $wb['limit_spamfilter_wblist_txt'] = 'Max. number of spamfilter white / blacklist filters'; $wb['limit_spamfilter_user_txt'] = 'Max antal spamfilteranvändare'; $wb['limit_spamfilter_policy_txt'] = 'Max. number of spamfilter policies'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Förvald epostserver'; $wb['company_name_txt'] = 'Företagsnamn'; $wb['contact_firstname_txt'] = 'Contact firstname'; diff --git a/interface/web/client/lib/lang/se_client_template.lng b/interface/web/client/lib/lang/se_client_template.lng index ffffed1971052d0619ea593f8ce53027ede8ffa7..a1a6f9457b3138d1cfa5994abc1efab1baf0de3f 100644 --- a/interface/web/client/lib/lang/se_client_template.lng +++ b/interface/web/client/lib/lang/se_client_template.lng @@ -94,6 +94,7 @@ $wb['limit_aps_txt'] = 'Max. number of APS instances'; $wb['limit_aps_error_notint'] = 'The APS instances limit must be a number.'; $wb['limit_domainmodule_txt'] = 'Domainmodule Limit'; $wb['client_limits_txt'] = 'Client Limits'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Default Mailserver'; $wb['default_webserver_txt'] = 'Default Webserver'; $wb['default_dnsserver_txt'] = 'Default DNS Server'; diff --git a/interface/web/client/lib/lang/se_reseller.lng b/interface/web/client/lib/lang/se_reseller.lng index 4d21c7d173522f9aa06151eb20d6c6ce3fc1dee0..9f3ce64e8007a6dd75590e1e68f32586827d9561 100644 --- a/interface/web/client/lib/lang/se_reseller.lng +++ b/interface/web/client/lib/lang/se_reseller.lng @@ -12,6 +12,7 @@ $wb['limit_mailquota_txt'] = 'Mailbox quota'; $wb['limit_spamfilter_wblist_txt'] = 'Max. number of spamfilter white / blacklist filters'; $wb['limit_spamfilter_user_txt'] = 'Max. number of spamfilter users'; $wb['limit_spamfilter_policy_txt'] = 'Max. number of spamfilter policies'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Default Mailserver'; $wb['company_name_txt'] = 'Company name'; $wb['contact_firstname_txt'] = 'Contact firstname'; diff --git a/interface/web/client/lib/lang/sk_client.lng b/interface/web/client/lib/lang/sk_client.lng index 980ae853353662bb635c1b0344b33eb1073b131d..5ca58b5b0e9aeb7af32a0b504714d33cf2f41786 100644 --- a/interface/web/client/lib/lang/sk_client.lng +++ b/interface/web/client/lib/lang/sk_client.lng @@ -12,6 +12,7 @@ $wb['limit_mailquota_txt'] = 'Kvóta schránky'; $wb['limit_spamfilter_wblist_txt'] = 'Max. poÄet Spamfilter biele / Äierne listiny filtre'; $wb['limit_spamfilter_user_txt'] = 'Max. poÄet poUžÃvateľov Spamfilter'; $wb['limit_spamfilter_policy_txt'] = 'Max. poÄet Spamfilter politÃk'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Predvolený Mailserver'; $wb['company_name_txt'] = 'Názov firmy'; $wb['contact_firstname_txt'] = 'Contact firstname'; diff --git a/interface/web/client/lib/lang/sk_client_template.lng b/interface/web/client/lib/lang/sk_client_template.lng index 14172a1f621d2e2e54779c5716c2584e4bb774a4..21acadd651d85f63a8e8fa469e7d46fbacece76d 100644 --- a/interface/web/client/lib/lang/sk_client_template.lng +++ b/interface/web/client/lib/lang/sk_client_template.lng @@ -94,6 +94,7 @@ $wb['limit_aps_txt'] = 'Max. number of APS instances'; $wb['limit_aps_error_notint'] = 'The APS instances limit must be a number.'; $wb['limit_domainmodule_txt'] = 'Domainmodule Limit'; $wb['client_limits_txt'] = 'Client Limits'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Default Mailserver'; $wb['default_webserver_txt'] = 'Default Webserver'; $wb['default_dnsserver_txt'] = 'Default DNS Server'; diff --git a/interface/web/client/lib/lang/sk_reseller.lng b/interface/web/client/lib/lang/sk_reseller.lng index 040ffc47ca4c2a9c5e1ec75d2e6cae753a3c3fde..a00b1a4156eb4d3b6dc668b0d59338ea37fbf327 100644 --- a/interface/web/client/lib/lang/sk_reseller.lng +++ b/interface/web/client/lib/lang/sk_reseller.lng @@ -12,6 +12,7 @@ $wb['limit_mailquota_txt'] = 'Kvóta schránky'; $wb['limit_spamfilter_wblist_txt'] = 'Max. poÄet Spamfilter biele / Äierne filtre'; $wb['limit_spamfilter_user_txt'] = 'Max. poÄet poUžÃvateľov Spamfiltrov'; $wb['limit_spamfilter_policy_txt'] = 'Max. poÄet Spamfilter politÃk'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Predvolený Mailserver'; $wb['company_name_txt'] = 'Názov firmy'; $wb['contact_firstname_txt'] = 'Contact firstname'; diff --git a/interface/web/client/lib/lang/tr_client.lng b/interface/web/client/lib/lang/tr_client.lng index 5e6e55f543745b1c7dba6ea368b1cfc05dbd3613..ca1e2f74293e0f9064719c1670bfcaf4e7dd5075 100644 --- a/interface/web/client/lib/lang/tr_client.lng +++ b/interface/web/client/lib/lang/tr_client.lng @@ -14,6 +14,7 @@ $wb['limit_mailquota_txt'] = 'E-posta Kutusu Kotası'; $wb['limit_spamfilter_wblist_txt'] = 'En Fazla Önemsiz İleti Beyaz/Kara Liste Süzgeci Sayısı'; $wb['limit_spamfilter_user_txt'] = 'En Fazla Önemsiz İleti Süzgeci Kullanıcısı Sayısı'; $wb['limit_spamfilter_policy_txt'] = 'En Fazla Önemsiz İleti Süzgeci Kuralı Sayısı'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Varsayılan E-posta Sunucusu'; $wb['company_name_txt'] = 'KuruluÅŸ Adı'; $wb['contact_firstname_txt'] = 'İlgili Adı'; diff --git a/interface/web/client/lib/lang/tr_client_template.lng b/interface/web/client/lib/lang/tr_client_template.lng index 84c7fa05438e6a8cba9d3fda5cd4bb61d85ffb79..3d5edfeeba178c393661f8251189d3d52e13961b 100644 --- a/interface/web/client/lib/lang/tr_client_template.lng +++ b/interface/web/client/lib/lang/tr_client_template.lng @@ -3,6 +3,7 @@ $wb['ssh_chroot_notempty'] = 'No SSH chroot option selected. Select at least one $wb['template_type_txt'] = 'Kalıp Türü'; $wb['template_name_txt'] = 'Kalıp Adı'; $wb['limit_client_error_notint'] = 'Müşteri sınırı bir sayı olmalıdır.'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Varsayılan E-posta Sunucusu'; $wb['limit_maildomain_txt'] = 'En Fazla E-posta Etki Alanı Sayısı'; $wb['limit_mailbox_txt'] = 'En Fazla E-posta Kutusu Sayısı'; diff --git a/interface/web/client/lib/lang/tr_reseller.lng b/interface/web/client/lib/lang/tr_reseller.lng index 169d8c5ea4109768cec42938376184f1ea0ef666..31da0d1bc42672253f6013a456924016c8a1052c 100644 --- a/interface/web/client/lib/lang/tr_reseller.lng +++ b/interface/web/client/lib/lang/tr_reseller.lng @@ -14,6 +14,7 @@ $wb['limit_mailquota_txt'] = 'E-posta Kutusu Kotası'; $wb['limit_spamfilter_wblist_txt'] = 'En Fazla Önemsiz İleti Beyaz/Kara Liste Süzgeci Sayısı'; $wb['limit_spamfilter_user_txt'] = 'En Fazla Önemsiz İleti Kullanıcısı Sayısı'; $wb['limit_spamfilter_policy_txt'] = 'En Fazla Önemsiz İleti Kuralı Sayısı'; +$wb['limit_mail_backup_txt'] = 'E-mail backup function available'; $wb['default_mailserver_txt'] = 'Varsayılan E-posta Sunucusu'; $wb['company_name_txt'] = 'KuruluÅŸ Adı'; $wb['contact_firstname_txt'] = 'İlgili Adı'; diff --git a/interface/web/client/reseller_edit.php b/interface/web/client/reseller_edit.php index 78ee149e77f3cbbd65fde088d92f3db3516c964c..7cbd6687bc40eefad4f0beaf174cad996595ea17 100644 --- a/interface/web/client/reseller_edit.php +++ b/interface/web/client/reseller_edit.php @@ -184,6 +184,14 @@ class page_action extends tform_actions { $app->tpl->setVar("show_per_domain_relay_options", 0); } + // APS is enabled or not + $global_config = $app->getconf->get_global_config('sites'); + if($global_config['show_aps_menu'] == 'y') { + $app->tpl->setVar("show_aps_menu", 1); + } else { + $app->tpl->setVar("show_aps_menu", 0); + } + //* Set the 'customer no' default value if($this->id == 0) { //* get the system config diff --git a/interface/web/client/templates/client_edit_limits.htm b/interface/web/client/templates/client_edit_limits.htm index b7a0ccf69c52491a23e46ed4435c2b3dca64fd9d..9a2578b697b20e8424aee5dee86fa531c3cf261d 100644 --- a/interface/web/client/templates/client_edit_limits.htm +++ b/interface/web/client/templates/client_edit_limits.htm @@ -235,6 +235,12 @@ <label for="limit_spamfilter_policy" class="col-sm-3 control-label">{tmpl_var name='limit_spamfilter_policy_txt'}</label> <div class="col-sm-9"><input type="text" name="limit_spamfilter_policy" id="limit_spamfilter_policy" value="{tmpl_var name='limit_spamfilter_policy'}" class="form-control" /></div> </div> + <div class="form-group"> + <label class="col-sm-3 control-label">{tmpl_var name='limit_mail_backup_txt'}</label> + <div class="col-sm-9"> + {tmpl_var name='limit_mail_backup'} + </div> + </div> <tmpl_if name="show_per_domain_relay_options"> <div class="form-group"> <label class="col-sm-3 control-label">{tmpl_var name='limit_relayhost_txt'}</label> @@ -433,6 +439,7 @@ </div> </div> </div> + <tmpl_if name="show_aps_menu"> <div class="panel panel-default"> <div class="panel-heading" role="tab" id="headingAPS"> <h4 class="panel-title"> @@ -450,6 +457,7 @@ </div> </div> </div> + </tmpl_if> </div> <input type="hidden" name="id" value="{tmpl_var name='id'}"> diff --git a/interface/web/client/templates/client_template_edit_limits.htm b/interface/web/client/templates/client_template_edit_limits.htm index 8aa6d87ac72fcb721fc00e90f6c6037acc14745a..ef15d18358f7b91fedbe5cee94030577c3ea25f2 100644 --- a/interface/web/client/templates/client_template_edit_limits.htm +++ b/interface/web/client/templates/client_template_edit_limits.htm @@ -192,6 +192,12 @@ <label for="limit_spamfilter_policy" class="col-sm-3 control-label">{tmpl_var name='limit_spamfilter_policy_txt'}</label> <div class="col-sm-9"><input type="text" name="limit_spamfilter_policy" id="limit_spamfilter_policy" value="{tmpl_var name='limit_spamfilter_policy'}" class="form-control" /></div> </div> + <div class="form-group"> + <label class="col-sm-3 control-label">{tmpl_var name='limit_mail_backup_txt'}</label> + <div class="col-sm-9"> + {tmpl_var name='limit_mail_backup'} + </div> + </div> <tmpl_if name="show_per_domain_relay_options"> <div class="form-group"> <label class="col-sm-3 control-label">{tmpl_var name='limit_relayhost_txt'}</label> @@ -391,6 +397,7 @@ </div> </div> <!-- APS --> + <tmpl_if name="show_aps_menu"> <div class="panel panel-default"> <div class="panel-heading" role="tab" id="headingAPS"> <h4 class="panel-title"> @@ -408,6 +415,7 @@ </div> </div> </div> + </tmpl_if> <tmpl_if name="is_admin"> <!-- Client --> <div class="panel panel-default"> diff --git a/interface/web/client/templates/reseller_edit_limits.htm b/interface/web/client/templates/reseller_edit_limits.htm index cbc8c38c57cd1b7a1ff25783126459b764f19e43..eee685ac518bb8d6051f43ff931d1312de2ba3ac 100644 --- a/interface/web/client/templates/reseller_edit_limits.htm +++ b/interface/web/client/templates/reseller_edit_limits.htm @@ -236,6 +236,12 @@ <label for="limit_spamfilter_policy" class="col-sm-3 control-label">{tmpl_var name='limit_spamfilter_policy_txt'}</label> <div class="col-sm-9"><input type="text" name="limit_spamfilter_policy" id="limit_spamfilter_policy" value="{tmpl_var name='limit_spamfilter_policy'}" class="form-control" /></div> </div> + <div class="form-group"> + <label class="col-sm-3 control-label">{tmpl_var name='limit_mail_backup_txt'}</label> + <div class="col-sm-9"> + {tmpl_var name='limit_mail_backup'} + </div> + </div> <tmpl_if name="show_per_domain_relay_options"> <div class="form-group"> <label class="col-sm-3 control-label">{tmpl_var name='limit_relayhost_txt'}</label> @@ -435,6 +441,7 @@ </div> </div> <!-- APS --> + <tmpl_if name="show_aps_menu"> <div class="panel panel-default"> <div class="panel-heading" role="tab" id="headingAPS"> <h4 class="panel-title"> @@ -452,6 +459,7 @@ </div> </div> </div> + </tmpl_if> <!-- Client --> <div class="panel panel-default"> <div class="panel-heading" role="tab" id="headingClient"> diff --git a/interface/web/common.php b/interface/web/common.php new file mode 100644 index 0000000000000000000000000000000000000000..ac37a1aa765df658abb0664ccd07833a1fbe33fa --- /dev/null +++ b/interface/web/common.php @@ -0,0 +1,55 @@ +<?php + +/* +Copyright (c) 2007, Till Brehm, projektfarm Gmbh +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of ISPConfig nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + Some common helper functions which can be reused throughout the project. +*/ + +/** + * Includes all the menu files from the menu dir. + * @param string $menu_dir Path to the menu dir + * @return void + */ +function include_menu_dir_files($menu_dir) +{ + global $app, $module; + + if (is_dir($menu_dir)) { + if ($dh = opendir($menu_dir)) { + //** Go through all files in the menu dir + while (($file = readdir($dh)) !== false) { + if ($file != '.' && $file != '..' && substr($file, -9, 9) == '.menu.php' && $file != 'dns_resync.menu.php') { + include_once $menu_dir.'/'.$file; + } + } + } + } +} + diff --git a/interface/web/dashboard/dashlets/limits.php b/interface/web/dashboard/dashlets/limits.php index e5a8cc459fa2f141eceb471ea829b5b1e048e7b0..a649fef0f7fdfe9a28a1244e257b0ec780732976 100644 --- a/interface/web/dashboard/dashlets/limits.php +++ b/interface/web/dashboard/dashlets/limits.php @@ -141,6 +141,10 @@ class dashlet_limits if (is_file($lng_file)) { include $lng_file; } + $lng_file = ISPC_ROOT_PATH . '/lib/lang/'.$_SESSION['s']['language'].'.lng'; + if (is_file($lng_file)) { + include $lng_file; + } $tpl->setVar($wb); if ($app->auth->is_admin()) { diff --git a/interface/web/dashboard/lib/lang/ar_dashlet_limits.lng b/interface/web/dashboard/lib/lang/ar_dashlet_limits.lng index b15261dfc421c88c018bc81c790b14815ad08322..7f87485dfe46dcf18c2b41f75eafc9266e2eedc2 100644 --- a/interface/web/dashboard/lib/lang/ar_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/ar_dashlet_limits.lng @@ -30,4 +30,5 @@ $wb['limit_domain_txt'] = 'Number of Domains'; $wb['limit_mailquota_txt'] = 'Assigned mailbox quota'; $wb['limit_web_quota_txt'] = 'Assigned web quota'; $wb['limit_database_quota_txt'] = 'Assigned database quota'; +$wb['limit_mail_wblist_txt'] = 'Number of email white / blacklist entries'; ?> diff --git a/interface/web/dashboard/lib/lang/bg_dashlet_limits.lng b/interface/web/dashboard/lib/lang/bg_dashlet_limits.lng index 961e6825df2fdb495e131a1258d4086148e72828..78f68a031250d111c57d261c8331beb1a54001f6 100644 --- a/interface/web/dashboard/lib/lang/bg_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/bg_dashlet_limits.lng @@ -30,4 +30,5 @@ $wb['limit_domain_txt'] = 'Number of Domains'; $wb['limit_mailquota_txt'] = 'Assigned mailbox quota'; $wb['limit_web_quota_txt'] = 'Assigned web quota'; $wb['limit_database_quota_txt'] = 'Assigned database quota'; +$wb['limit_mail_wblist_txt'] = 'Number of email white / blacklist entries'; ?> diff --git a/interface/web/dashboard/lib/lang/br_dashlet_limits.lng b/interface/web/dashboard/lib/lang/br_dashlet_limits.lng index 057a1c780ce3883f0a0d7edd8ded8c743589f984..1b336fe02b3cdd3d87d61953897b8ac177e899e3 100644 --- a/interface/web/dashboard/lib/lang/br_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/br_dashlet_limits.lng @@ -30,3 +30,4 @@ $wb['limit_domain_txt'] = 'Número de domÃnios'; $wb['limit_mailquota_txt'] = 'Cotas atribuÃdas para contas de email'; $wb['limit_web_quota_txt'] = 'Cotas atribuÃdas para sites'; $wb['limit_database_quota_txt'] = 'Cotas atribuÃdas para Banco de Dados'; +$wb['limit_mail_wblist_txt'] = 'Number of email white / blacklist entries'; diff --git a/interface/web/dashboard/lib/lang/ca_dashlet_limits.lng b/interface/web/dashboard/lib/lang/ca_dashlet_limits.lng index ae78112c858cf3cd53484e95400e0398b3f30b2f..6a443950a423ca320e7fb2dbb1d7118df3975a79 100644 --- a/interface/web/dashboard/lib/lang/ca_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/ca_dashlet_limits.lng @@ -30,4 +30,5 @@ $wb['limit_domain_txt'] = 'Number of Domains'; $wb['limit_mailquota_txt'] = 'Assigned mailbox quota'; $wb['limit_web_quota_txt'] = 'Assigned web quota'; $wb['limit_database_quota_txt'] = 'Assigned database quota'; +$wb['limit_mail_wblist_txt'] = 'Number of email white / blacklist entries'; ?> diff --git a/interface/web/dashboard/lib/lang/cz_dashlet_limits.lng b/interface/web/dashboard/lib/lang/cz_dashlet_limits.lng index 7386ff3c4ded0b428d4eacec23c591fad26a7922..7ad586e7c62cf446d51ff035e57659c27c51aba6 100644 --- a/interface/web/dashboard/lib/lang/cz_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/cz_dashlet_limits.lng @@ -30,3 +30,4 @@ $wb['limit_domain_txt'] = 'PoÄet domén'; $wb['limit_mailquota_txt'] = 'PÅ™iÅ™azená e-mailová kvóta'; $wb['limit_web_quota_txt'] = 'PÅ™iÅ™azená webová kvóta'; $wb['limit_database_quota_txt'] = 'PÅ™iÅ™azená databázová kvóta'; +$wb['limit_mail_wblist_txt'] = 'Number of email white / blacklist entries'; diff --git a/interface/web/dashboard/lib/lang/de_dashlet_limits.lng b/interface/web/dashboard/lib/lang/de_dashlet_limits.lng index 22e87237d5d6b1716a253f285bf9b530b590dcba..68f5e262c2e44fbe53011e264a8b3c5b88cb2c74 100644 --- a/interface/web/dashboard/lib/lang/de_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/de_dashlet_limits.lng @@ -30,4 +30,5 @@ $wb['limit_domain_txt'] = 'Anzahl der Domains'; $wb['limit_mailquota_txt'] = 'Assigned mailbox quota'; $wb['limit_web_quota_txt'] = 'Assigned web quota'; $wb['limit_database_quota_txt'] = 'Assigned database quota'; +$wb['limit_mail_wblist_txt'] = 'Number of email white / blacklist entries'; ?> diff --git a/interface/web/dashboard/lib/lang/dk_dashlet_limits.lng b/interface/web/dashboard/lib/lang/dk_dashlet_limits.lng index 402aa722f514f5486d454419bfe91768fdda74f8..02c7125c23eb70b40b431982c00156a29d01f18b 100644 --- a/interface/web/dashboard/lib/lang/dk_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/dk_dashlet_limits.lng @@ -30,4 +30,5 @@ $wb['limit_domain_txt'] = 'Antal af Domæner'; $wb['limit_mailquota_txt'] = 'Assigned mailbox quota'; $wb['limit_web_quota_txt'] = 'Assigned web quota'; $wb['limit_database_quota_txt'] = 'Assigned database quota'; +$wb['limit_mail_wblist_txt'] = 'Number of email white / blacklist entries'; ?> diff --git a/interface/web/dashboard/lib/lang/el_dashlet_limits.lng b/interface/web/dashboard/lib/lang/el_dashlet_limits.lng index f51c1da1b5cc87cf0f97c731acf8d3e85e304c41..fe9d66391d2a5ef357b8816b73f2430e67699b57 100644 --- a/interface/web/dashboard/lib/lang/el_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/el_dashlet_limits.lng @@ -30,4 +30,5 @@ $wb['limit_domain_txt'] = 'Number of Domains'; $wb['limit_mailquota_txt'] = 'Assigned mailbox quota'; $wb['limit_web_quota_txt'] = 'Assigned web quota'; $wb['limit_database_quota_txt'] = 'Assigned database quota'; +$wb['limit_mail_wblist_txt'] = 'Number of email white / blacklist entries'; ?> diff --git a/interface/web/dashboard/lib/lang/en_dashlet_limits.lng b/interface/web/dashboard/lib/lang/en_dashlet_limits.lng index 2e3bb8c086e5291a0652839c66e09381e2f710e5..0306e6ead3eca62b86d5fb8f48909917f07eec1b 100644 --- a/interface/web/dashboard/lib/lang/en_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/en_dashlet_limits.lng @@ -30,5 +30,5 @@ $wb['limit_domain_txt'] = 'Number of Domains'; $wb['limit_mailquota_txt'] = 'Assigned mailbox quota'; $wb['limit_web_quota_txt'] = 'Assigned web quota'; $wb['limit_database_quota_txt'] = 'Assigned database quota'; -$wb['unlimited_txt'] = 'Unlimited'; +$wb['limit_mail_wblist_txt'] = 'Number of email white / blacklist entries'; ?> diff --git a/interface/web/dashboard/lib/lang/es_dashlet_limits.lng b/interface/web/dashboard/lib/lang/es_dashlet_limits.lng index d56d17c6615dbc071ca039ff7190e569d520370a..5e04a1ba61d9879d1992a703d63d105060db35df 100644 --- a/interface/web/dashboard/lib/lang/es_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/es_dashlet_limits.lng @@ -30,4 +30,5 @@ $wb['of_txt'] = 'de'; $wb['limit_mailquota_txt'] = 'Assigned mailbox quota'; $wb['limit_web_quota_txt'] = 'Assigned web quota'; $wb['limit_database_quota_txt'] = 'Assigned database quota'; +$wb['limit_mail_wblist_txt'] = 'Number of email white / blacklist entries'; ?> diff --git a/interface/web/dashboard/lib/lang/fi_dashlet_limits.lng b/interface/web/dashboard/lib/lang/fi_dashlet_limits.lng index b15261dfc421c88c018bc81c790b14815ad08322..7f87485dfe46dcf18c2b41f75eafc9266e2eedc2 100644 --- a/interface/web/dashboard/lib/lang/fi_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/fi_dashlet_limits.lng @@ -30,4 +30,5 @@ $wb['limit_domain_txt'] = 'Number of Domains'; $wb['limit_mailquota_txt'] = 'Assigned mailbox quota'; $wb['limit_web_quota_txt'] = 'Assigned web quota'; $wb['limit_database_quota_txt'] = 'Assigned database quota'; +$wb['limit_mail_wblist_txt'] = 'Number of email white / blacklist entries'; ?> diff --git a/interface/web/dashboard/lib/lang/fr_dashlet_limits.lng b/interface/web/dashboard/lib/lang/fr_dashlet_limits.lng index fa5043ab85ac7fa31637f53e2c24eda50c83aace..7d46a22e6f83d356d88267730dbddd07bdfcba6d 100644 --- a/interface/web/dashboard/lib/lang/fr_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/fr_dashlet_limits.lng @@ -30,4 +30,5 @@ $wb['limit_domain_txt'] = 'Number of Domains'; $wb['limit_mailquota_txt'] = 'Assigned mailbox quota'; $wb['limit_web_quota_txt'] = 'Assigned web quota'; $wb['limit_database_quota_txt'] = 'Assigned database quota'; +$wb['limit_mail_wblist_txt'] = 'Number of email white / blacklist entries'; ?> diff --git a/interface/web/dashboard/lib/lang/hr_dashlet_limits.lng b/interface/web/dashboard/lib/lang/hr_dashlet_limits.lng index 2aa1792f91559950cb35a9ab0ffe6cd24074ecde..6eada3538ef2c702c7d11f0ee00aaf670ad4d62a 100644 --- a/interface/web/dashboard/lib/lang/hr_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/hr_dashlet_limits.lng @@ -30,4 +30,5 @@ $wb['limit_domain_txt'] = 'Number of Domains'; $wb['limit_mailquota_txt'] = 'Assigned mailbox quota'; $wb['limit_web_quota_txt'] = 'Assigned web quota'; $wb['limit_database_quota_txt'] = 'Assigned database quota'; +$wb['limit_mail_wblist_txt'] = 'Number of email white / blacklist entries'; ?> diff --git a/interface/web/dashboard/lib/lang/hu_dashlet_limits.lng b/interface/web/dashboard/lib/lang/hu_dashlet_limits.lng index 76498eed86f896ebb972effc317e771f422c27b3..67049d5137577216c4e98bf660c97666bb6e162e 100644 --- a/interface/web/dashboard/lib/lang/hu_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/hu_dashlet_limits.lng @@ -30,4 +30,5 @@ $wb['limit_domain_txt'] = 'Number of Domains'; $wb['limit_mailquota_txt'] = 'Assigned mailbox quota'; $wb['limit_web_quota_txt'] = 'Assigned web quota'; $wb['limit_database_quota_txt'] = 'Assigned database quota'; +$wb['limit_mail_wblist_txt'] = 'Number of email white / blacklist entries'; ?> diff --git a/interface/web/dashboard/lib/lang/id_dashlet_limits.lng b/interface/web/dashboard/lib/lang/id_dashlet_limits.lng index 94a64e226f6090ac1e0beddab50ee4c2d7dc4ea6..0e34d0e13d6d81702710e66ac4795771a077deea 100644 --- a/interface/web/dashboard/lib/lang/id_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/id_dashlet_limits.lng @@ -30,4 +30,5 @@ $wb['limit_domain_txt'] = 'Number of Domains'; $wb['limit_mailquota_txt'] = 'Assigned mailbox quota'; $wb['limit_web_quota_txt'] = 'Assigned web quota'; $wb['limit_database_quota_txt'] = 'Assigned database quota'; +$wb['limit_mail_wblist_txt'] = 'Number of email white / blacklist entries'; ?> diff --git a/interface/web/dashboard/lib/lang/it_dashlet_donate.lng b/interface/web/dashboard/lib/lang/it_dashlet_donate.lng index e41c374cde792db1d7b906f986f7ba7e0a215ef8..803301e0467e9305006a1f8f885e3f8a18f122b0 100644 --- a/interface/web/dashboard/lib/lang/it_dashlet_donate.lng +++ b/interface/web/dashboard/lib/lang/it_dashlet_donate.lng @@ -1,7 +1,7 @@ <?php -$wb['donate_txt'] = 'The ISPConfig Hosting Control Panel is free software. Maybe you are aware, that it takes a lot of time and effort to develop, maintain and support a software project of this complexity. If you want to support the further development of ISPConfig, please consider making a donation. As a bonus you will get a copy of the current ISPConfig Manual.'; -$wb['donate2_txt'] = 'The donation amount can be 5 EUR or more, the amount is chosen during checkout. The payment method is PayPal. You will receive an receipt as PDF from ISPConfig UG.'; -$wb['hide_btn_txt'] = 'Hide'; -$wb['donate_btn_txt'] = 'Support ISPConfig and get the Manual'; -$wb['more_btn_txt'] = 'More'; +$wb['donate_txt'] = 'Il software ISPConfig Hosting Control Panel è un software libero. Può darsi che tu lo sappia già , che richiede molto tempo e impegno per sviluppare un progetto software di questa complessità . Se vuoi supportare ulteriori sviluppi di ISPConfig, per favore considera di fare una donazione. Otterrai anche, come bonus, una copia del manuale di ISPConfig.'; +$wb['donate2_txt'] = 'L\'importo della donazione può essere di 5 Euro o pù, l\'importo viene scelto durante il checkout. Il metodo di pagamento è PayPal. Riceverai anche la ricevuta in PDF da ISPConfig UG.'; +$wb['hide_btn_txt'] = 'Nascondi'; +$wb['donate_btn_txt'] = 'Supporta il manuale di ISPConfig'; +$wb['more_btn_txt'] = 'Ancora'; ?> diff --git a/interface/web/dashboard/lib/lang/it_dashlet_invoice_client_settings.lng b/interface/web/dashboard/lib/lang/it_dashlet_invoice_client_settings.lng index 8cae3dfb4f0563e28f98f3cc43f4e0983946e9d6..bde1eb9f97d8c78a618465a6e4be7b826e6204a7 100644 --- a/interface/web/dashboard/lib/lang/it_dashlet_invoice_client_settings.lng +++ b/interface/web/dashboard/lib/lang/it_dashlet_invoice_client_settings.lng @@ -1,4 +1,4 @@ <?php -$wb['invoice_client_settings_txt'] = 'Invoice Client Settings'; +$wb['invoice_client_settings_txt'] = 'Impostazioni di fatturazione Cliente'; $wb['edit_txt'] = 'Edit'; ?> diff --git a/interface/web/dashboard/lib/lang/it_dashlet_invoices.lng b/interface/web/dashboard/lib/lang/it_dashlet_invoices.lng index a680daa8f623ad5af726dffd8eb1e1c0b1ce9b4e..8c5eec03a18a30415ad0eb4f8cd13f68be2a8543 100644 --- a/interface/web/dashboard/lib/lang/it_dashlet_invoices.lng +++ b/interface/web/dashboard/lib/lang/it_dashlet_invoices.lng @@ -1,18 +1,18 @@ <?php -$wb['invoices_txt'] = 'Invoices'; -$wb['invoice_no_txt'] = 'Invoice No.'; -$wb['amount_txt'] = 'Amount'; -$wb['date_txt'] = 'Date'; -$wb['invoice_status_txt'] = 'Status'; -$wb['no_invoices_txt'] = 'No Invoices available.'; -$wb['paid_txt'] = 'Paid'; -$wb['unpaid_txt'] = 'Unpaid'; -$wb['paynow_txt'] = 'pay now'; +$wb['invoices_txt'] = 'Fattura'; +$wb['invoice_no_txt'] = 'Fattura n°.'; +$wb['amount_txt'] = 'Importo'; +$wb['date_txt'] = 'Data'; +$wb['invoice_status_txt'] = 'Stato'; +$wb['no_invoices_txt'] = 'Fattura non disponibile.'; +$wb['paid_txt'] = 'Pagato'; +$wb['unpaid_txt'] = 'Non pagato'; +$wb['paynow_txt'] = 'paga adesso'; $wb['proforma_txt'] = 'Proforma'; -$wb['refunded_txt'] = 'Refunded'; -$wb['not_refunded_txt'] = 'Not refunded'; -$wb['invoice_type_invoice_txt'] = 'Invoice'; +$wb['refunded_txt'] = 'Rimborsato'; +$wb['not_refunded_txt'] = 'Non rimborsato'; +$wb['invoice_type_invoice_txt'] = 'Fattura'; $wb['invoice_type_proforma_txt'] = 'Proforma'; -$wb['invoice_type_refund_txt'] = 'Refund'; -$wb['invoice_type_reminder_txt'] = 'Reminder'; +$wb['invoice_type_refund_txt'] = 'Rimborso'; +$wb['invoice_type_reminder_txt'] = 'Promemoria'; ?> diff --git a/interface/web/dashboard/lib/lang/it_dashlet_limits.lng b/interface/web/dashboard/lib/lang/it_dashlet_limits.lng index 895f619864720b0f8c3e695f9707be243343c66b..b09fbaabc81c6050765dd5876fb2136f84cb2143 100644 --- a/interface/web/dashboard/lib/lang/it_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/it_dashlet_limits.lng @@ -1,15 +1,15 @@ <?php -$wb['limits_txt'] = 'Sintesi account'; +$wb['limits_txt'] = 'Sintesi profili'; $wb['of_txt'] = 'su'; $wb['limit_maildomain_txt'] = 'Domini e-mail'; $wb['limit_mailbox_txt'] = 'Caselle e-mail'; $wb['limit_mailalias_txt'] = 'Alias di e-mail'; $wb['limit_mailaliasdomain_txt'] = 'Alias di domini'; $wb['limit_mailforward_txt'] = 'Inoltro e-mail'; -$wb['limit_mailcatchall_txt'] = 'Account catchall e-mail'; +$wb['limit_mailcatchall_txt'] = 'Profilo catchall e-mail'; $wb['limit_mailrouting_txt'] = 'Instradamento e-mail'; $wb['limit_mailfilter_txt'] = 'Filtri e-mail'; -$wb['limit_fetchmail_txt'] = 'Account fetchmail'; +$wb['limit_fetchmail_txt'] = 'Profilo fetchmail'; $wb['limit_spamfilter_wblist_txt'] = 'Filtri spamfilter white / blacklist'; $wb['limit_spamfilter_user_txt'] = 'Utenti spamfilter'; $wb['limit_spamfilter_policy_txt'] = 'Policy spamfilter'; @@ -30,4 +30,5 @@ $wb['limit_domain_txt'] = 'Numero domini'; $wb['limit_mailquota_txt'] = 'Quota mailbox assegnata'; $wb['limit_web_quota_txt'] = 'Quota web assegnata'; $wb['limit_database_quota_txt'] = 'Quota database assegnata'; +$wb['limit_mail_wblist_txt'] = 'Number of email white / blacklist entries'; ?> diff --git a/interface/web/dashboard/lib/lang/it_dashlet_mailquota.lng b/interface/web/dashboard/lib/lang/it_dashlet_mailquota.lng index daaaa67f49c948861df6a5a049c2758212d6964e..6b7fc62c1e669363d2212bb1ff7e0be1ed3d77c0 100644 --- a/interface/web/dashboard/lib/lang/it_dashlet_mailquota.lng +++ b/interface/web/dashboard/lib/lang/it_dashlet_mailquota.lng @@ -4,5 +4,5 @@ $wb['email_txt'] = 'Indirizzo e-mail'; $wb['name_txt'] = 'Nome'; $wb['used_txt'] = 'Spazio Usato'; $wb['quota_txt'] = 'Quota'; -$wb['no_email_accounts_txt'] = 'Nessun account e-mail trovato.'; +$wb['no_email_accounts_txt'] = 'Nessun profilo e-mail trovato.'; ?> diff --git a/interface/web/dashboard/lib/lang/it_dashlet_products.lng b/interface/web/dashboard/lib/lang/it_dashlet_products.lng index a69b61d2fbf06f20ab1cbed5f33d4804256ba40a..9e5895d71177b6b48764c757aae6b127d828abb8 100644 --- a/interface/web/dashboard/lib/lang/it_dashlet_products.lng +++ b/interface/web/dashboard/lib/lang/it_dashlet_products.lng @@ -1,9 +1,9 @@ <?php -$wb['products_txt'] = 'My Products'; -$wb['name_txt'] = 'Name'; -$wb['price_txt'] = 'Price'; -$wb['next_payment_date_txt'] = 'Next Invoice'; -$wb['no_products_txt'] = 'No products found.'; +$wb['products_txt'] = 'I miei prodotti'; +$wb['name_txt'] = 'Nome'; +$wb['price_txt'] = 'Prezzo'; +$wb['next_payment_date_txt'] = 'Prossima fattura'; +$wb['no_products_txt'] = 'Nessun prodotto trovato.'; $wb['edit_txt'] = 'Edit'; -$wb['cancellation_date_txt'] = 'Cancelled by'; +$wb['cancellation_date_txt'] = 'Cancellato da'; ?> diff --git a/interface/web/dashboard/lib/lang/it_dashlet_shop.lng b/interface/web/dashboard/lib/lang/it_dashlet_shop.lng index 1e0b5361d7baaca8a3501c3b3506d424a0c29581..0befa94c0a592319a37085282f6e6733f362a362 100644 --- a/interface/web/dashboard/lib/lang/it_dashlet_shop.lng +++ b/interface/web/dashboard/lib/lang/it_dashlet_shop.lng @@ -1,8 +1,8 @@ <?php -$wb['shop_txt'] = 'Order'; -$wb['name_txt'] = 'Name'; -$wb['price_txt'] = 'Price'; -$wb['setup_fee_txt'] = 'Setup Fee'; -$wb['no_products_txt'] = 'No products found.'; -$wb['order_txt'] = 'Order'; +$wb['shop_txt'] = 'Ordine'; +$wb['name_txt'] = 'Nome'; +$wb['price_txt'] = 'Prezzo'; +$wb['setup_fee_txt'] = 'Imposta contributo'; +$wb['no_products_txt'] = 'Nessun prodotto trovato.'; +$wb['order_txt'] = 'Ordine'; ?> diff --git a/interface/web/dashboard/lib/lang/ja_dashlet_limits.lng b/interface/web/dashboard/lib/lang/ja_dashlet_limits.lng index b15261dfc421c88c018bc81c790b14815ad08322..7f87485dfe46dcf18c2b41f75eafc9266e2eedc2 100644 --- a/interface/web/dashboard/lib/lang/ja_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/ja_dashlet_limits.lng @@ -30,4 +30,5 @@ $wb['limit_domain_txt'] = 'Number of Domains'; $wb['limit_mailquota_txt'] = 'Assigned mailbox quota'; $wb['limit_web_quota_txt'] = 'Assigned web quota'; $wb['limit_database_quota_txt'] = 'Assigned database quota'; +$wb['limit_mail_wblist_txt'] = 'Number of email white / blacklist entries'; ?> diff --git a/interface/web/dashboard/lib/lang/nl_dashlet_limits.lng b/interface/web/dashboard/lib/lang/nl_dashlet_limits.lng index 10bb89a3ea51ce0de80c21f8a40056b40f57b984..9f00b2eeeb3a3fbf676e4c2ec41cc854bb4b8332 100644 --- a/interface/web/dashboard/lib/lang/nl_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/nl_dashlet_limits.lng @@ -30,5 +30,5 @@ $wb['limit_domain_txt'] = 'Aantal domeinen'; $wb['limit_mailquota_txt'] = 'Assigned mailbox quota'; $wb['limit_web_quota_txt'] = 'Assigned web quota'; $wb['limit_database_quota_txt'] = 'Assigned database quota'; -$wb['unlimited_txt'] = 'Ongelimiteerd'; +$wb['limit_mail_wblist_txt'] = 'Number of email white / blacklist entries'; ?> diff --git a/interface/web/dashboard/lib/lang/pl_dashlet_limits.lng b/interface/web/dashboard/lib/lang/pl_dashlet_limits.lng index 5513b32551afdce00566c74f02c63f85fce8ea1b..b4cdeb1d7ae1501f56127d822284435f22633965 100644 --- a/interface/web/dashboard/lib/lang/pl_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/pl_dashlet_limits.lng @@ -30,4 +30,5 @@ $wb['limit_domain_txt'] = 'Number of Domains'; $wb['limit_mailquota_txt'] = 'Assigned mailbox quota'; $wb['limit_web_quota_txt'] = 'Assigned web quota'; $wb['limit_database_quota_txt'] = 'Assigned database quota'; +$wb['limit_mail_wblist_txt'] = 'Number of email white / blacklist entries'; ?> diff --git a/interface/web/dashboard/lib/lang/pt_dashlet_limits.lng b/interface/web/dashboard/lib/lang/pt_dashlet_limits.lng index b15261dfc421c88c018bc81c790b14815ad08322..7f87485dfe46dcf18c2b41f75eafc9266e2eedc2 100644 --- a/interface/web/dashboard/lib/lang/pt_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/pt_dashlet_limits.lng @@ -30,4 +30,5 @@ $wb['limit_domain_txt'] = 'Number of Domains'; $wb['limit_mailquota_txt'] = 'Assigned mailbox quota'; $wb['limit_web_quota_txt'] = 'Assigned web quota'; $wb['limit_database_quota_txt'] = 'Assigned database quota'; +$wb['limit_mail_wblist_txt'] = 'Number of email white / blacklist entries'; ?> diff --git a/interface/web/dashboard/lib/lang/ro_dashlet_limits.lng b/interface/web/dashboard/lib/lang/ro_dashlet_limits.lng index b15261dfc421c88c018bc81c790b14815ad08322..7f87485dfe46dcf18c2b41f75eafc9266e2eedc2 100644 --- a/interface/web/dashboard/lib/lang/ro_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/ro_dashlet_limits.lng @@ -30,4 +30,5 @@ $wb['limit_domain_txt'] = 'Number of Domains'; $wb['limit_mailquota_txt'] = 'Assigned mailbox quota'; $wb['limit_web_quota_txt'] = 'Assigned web quota'; $wb['limit_database_quota_txt'] = 'Assigned database quota'; +$wb['limit_mail_wblist_txt'] = 'Number of email white / blacklist entries'; ?> diff --git a/interface/web/dashboard/lib/lang/ru_dashlet_limits.lng b/interface/web/dashboard/lib/lang/ru_dashlet_limits.lng index 9e77f43d8d115a4b792ce723d1f5f474d186eb57..c97f090052652905f920be2c2960caf469757dbe 100644 --- a/interface/web/dashboard/lib/lang/ru_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/ru_dashlet_limits.lng @@ -30,4 +30,5 @@ $wb['limit_domain_txt'] = 'КоличеÑтво доменов'; $wb['limit_mailquota_txt'] = 'Assigned mailbox quota'; $wb['limit_web_quota_txt'] = 'Assigned web quota'; $wb['limit_database_quota_txt'] = 'Assigned database quota'; +$wb['limit_mail_wblist_txt'] = 'Number of email white / blacklist entries'; ?> diff --git a/interface/web/dashboard/lib/lang/se_dashlet_limits.lng b/interface/web/dashboard/lib/lang/se_dashlet_limits.lng index f02f83bffd4133794f554b99eb2c8def0e210205..7cbd24f2fbe41b09d1ab7b4a242f0e2a91e5841f 100644 --- a/interface/web/dashboard/lib/lang/se_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/se_dashlet_limits.lng @@ -30,4 +30,5 @@ $wb['limit_domain_txt'] = 'Number of Domains'; $wb['limit_mailquota_txt'] = 'Assigned mailbox quota'; $wb['limit_web_quota_txt'] = 'Assigned web quota'; $wb['limit_database_quota_txt'] = 'Assigned database quota'; +$wb['limit_mail_wblist_txt'] = 'Number of email white / blacklist entries'; ?> diff --git a/interface/web/dashboard/lib/lang/sk_dashlet_limits.lng b/interface/web/dashboard/lib/lang/sk_dashlet_limits.lng index b15261dfc421c88c018bc81c790b14815ad08322..7f87485dfe46dcf18c2b41f75eafc9266e2eedc2 100644 --- a/interface/web/dashboard/lib/lang/sk_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/sk_dashlet_limits.lng @@ -30,4 +30,5 @@ $wb['limit_domain_txt'] = 'Number of Domains'; $wb['limit_mailquota_txt'] = 'Assigned mailbox quota'; $wb['limit_web_quota_txt'] = 'Assigned web quota'; $wb['limit_database_quota_txt'] = 'Assigned database quota'; +$wb['limit_mail_wblist_txt'] = 'Number of email white / blacklist entries'; ?> diff --git a/interface/web/dashboard/lib/lang/tr_dashlet_limits.lng b/interface/web/dashboard/lib/lang/tr_dashlet_limits.lng index 6a4a6a0d242ce70939e727db129d476e66bd5e96..b48a81377a912ab4d2d4f7736362e6584f3a18ed 100644 --- a/interface/web/dashboard/lib/lang/tr_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/tr_dashlet_limits.lng @@ -30,4 +30,5 @@ $wb['limit_domain_txt'] = 'Etki Alanı Sayısı'; $wb['limit_mailquota_txt'] = 'E-posta Kutusu Alanı Kotası'; $wb['limit_web_quota_txt'] = 'Web Sitesi Alanı Kotası'; $wb['limit_database_quota_txt'] = 'Veritabanı Alanı Kotası'; +$wb['limit_mail_wblist_txt'] = 'Number of email white / blacklist entries'; ?> diff --git a/interface/web/dns/dns_wizard.php b/interface/web/dns/dns_wizard.php index bef4422ef3bff11351637a3e5d0f57545ee87fd8..90e2fef1c46935ae47968f376d659b0a27cc90d5 100644 --- a/interface/web/dns/dns_wizard.php +++ b/interface/web/dns/dns_wizard.php @@ -276,18 +276,20 @@ if($_POST['create'] == 1) { } + # fixme: this regex is pretty poor for domain validation if(isset($_POST['domain']) && $_POST['domain'] == '') $error .= $app->lng('error_domain_empty').'<br />'; - elseif(isset($_POST['domain']) && !preg_match('/^[\w\.\-]{2,64}\.[a-zA-Z0-9\-]{2,63}$/', $_POST['domain'])) $error .= $app->lng('error_domain_regex').'<br />'; + elseif(isset($_POST['domain']) && !preg_match('/^[\w\.\-]{1,64}\.[a-zA-Z0-9\-]{2,63}$/', $_POST['domain'])) $error .= $app->lng('error_domain_regex').'<br />'; if(isset($_POST['ip']) && $_POST['ip'] == '') $error .= $app->lng('error_ip_empty').'<br />'; if(isset($_POST['ipv6']) && $_POST['ipv6'] == '') $error .= $app->lng('error_ipv6_empty').'<br />'; + # fixme: this regex is pretty poor for hostname validation if(isset($_POST['ns1']) && $_POST['ns1'] == '') $error .= $app->lng('error_ns1_empty').'<br />'; - elseif(isset($_POST['ns1']) && !preg_match('/^[\w\.\-]{2,64}\.[a-zA-Z0-9]{2,63}$/', $_POST['ns1'])) $error .= $app->lng('error_ns1_regex').'<br />'; + elseif(isset($_POST['ns1']) && !preg_match('/^[\w\.\-]{1,64}\.[a-zA-Z0-9]{2,63}$/', $_POST['ns1'])) $error .= $app->lng('error_ns1_regex').'<br />'; if(isset($_POST['ns2']) && $_POST['ns2'] == '') $error .= $app->lng('error_ns2_empty').'<br />'; - elseif(isset($_POST['ns2']) && !preg_match('/^[\w\.\-]{2,64}\.[a-zA-Z0-9]{2,63}$/', $_POST['ns2'])) $error .= $app->lng('error_ns2_regex').'<br />'; + elseif(isset($_POST['ns2']) && !preg_match('/^[\w\.\-]{1,64}\.[a-zA-Z0-9]{2,63}$/', $_POST['ns2'])) $error .= $app->lng('error_ns2_regex').'<br />'; if(isset($_POST['email']) && $_POST['email'] == '') $error .= $app->lng('error_email_empty').'<br />'; elseif(isset($_POST['email']) && filter_var($_POST['email'], FILTER_VALIDATE_EMAIL) === false) $error .= $app->lng('error_email_regex').'<br />'; @@ -326,7 +328,7 @@ if($_POST['create'] == 1) { // $enable_dnssec = (($_POST['dnssec'] == 'Y') ? 'Y' : 'N'); // if(isset($_POST['dnssec'])) $vars['dnssec_wanted'] = 'Y'; if(isset($_POST['dnssec'])) $tpl_content = str_replace('[ZONE]', '[ZONE]'."\n".'dnssec_wanted=Y', $tpl_content); - if(isset($_POST['dkim']) && preg_match('/^[\w\.\-\/]{2,255}\.[a-zA-Z0-9\-]{2,63}[\.]{0,1}$/', $_POST['domain'])) { + if(isset($_POST['dkim']) && preg_match('/^[\w\.\-\/]{1,255}\.[a-zA-Z0-9\-]{2,63}[\.]{0,1}$/', $_POST['domain'])) { $sql = $app->db->queryOneRecord("SELECT dkim_public, dkim_selector FROM mail_domain WHERE domain = ? AND dkim = 'y' AND ".$app->tform->getAuthSQL('r'), $_POST['domain']); $public_key = $sql['dkim_public']; if ($public_key!='') { diff --git a/interface/web/dns/form/dns_slave.tform.php b/interface/web/dns/form/dns_slave.tform.php index 55e085861a128c37e24c87a3dc94a75a476e70a2..bf684f98683d72d8d49f02be75925713765c877a 100644 --- a/interface/web/dns/form/dns_slave.tform.php +++ b/interface/web/dns/form/dns_slave.tform.php @@ -96,7 +96,7 @@ $form["tabs"]['dns_slave'] = array ( 'errmsg'=> 'origin_error_unique'), */ 1 => array ( 'type' => 'REGEX', - 'regex' => '/^[a-zA-Z0-9\.\-\/]{2,255}\.[a-zA-Z0-9\-]{2,63}[\.]{0,1}$/', + 'regex' => '/^[a-zA-Z0-9\.\-\/]{1,255}\.[a-zA-Z0-9\-]{2,63}[\.]{0,1}$/', 'errmsg'=> 'origin_error_regex'), ), 'default' => '', diff --git a/interface/web/dns/form/dns_soa.tform.php b/interface/web/dns/form/dns_soa.tform.php index fe717577881d2253983309d654ca381b65e6edcd..6259cceddb12fe8b511eba64533cf4ccb75f0c6e 100644 --- a/interface/web/dns/form/dns_soa.tform.php +++ b/interface/web/dns/form/dns_soa.tform.php @@ -120,7 +120,7 @@ $form["tabs"]['dns_soa'] = array ( 1 => array ( 'type' => 'UNIQUE', 'errmsg'=> 'origin_error_unique'), 2 => array ( 'type' => 'REGEX', - 'regex' => '/^[a-zA-Z0-9\.\-\/]{2,255}\.[a-zA-Z0-9\-]{2,63}[\.]{0,1}$/', + 'regex' => '/^[a-zA-Z0-9\.\-\/]{1,255}\.[a-zA-Z0-9\-]{2,63}[\.]{0,1}$/', 'errmsg'=> 'origin_error_regex'), ), 'default' => '', @@ -323,6 +323,21 @@ $form["tabs"]['dns_soa'] = array ( ) ); +$sys_config = $app->getconf->get_global_config('dns'); +if($sys_config['dns_show_zoneexport'] == 'y') { + $form["tabs"]['dns_rendered_zone'] = array ( + 'title' => "Zone rendering", + 'width' => 100, + 'template' => "templates/dns_soa_rendered.htm", + 'fields' => array ( + 'rendered_zone' => array ( + 'datatype' => 'TEXT', + 'formtype' => 'TEXTAREA', + ), + ) + ); +} + // show update acl to admins only. if(!$app->auth->is_admin()) unset($form["tabs"]['dns_soa']['fields']['update_acl']); diff --git a/interface/web/dns/lib/lang/ar_dns_soa.lng b/interface/web/dns/lib/lang/ar_dns_soa.lng index 0d90b7091b8554e3e20237442748a30bc2a35adf..4333c3793aa1c144ce4f9da6a0d823700b6e1fa2 100644 --- a/interface/web/dns/lib/lang/ar_dns_soa.lng +++ b/interface/web/dns/lib/lang/ar_dns_soa.lng @@ -42,4 +42,6 @@ $wb['error_not_allowed_server_id'] = 'The selected server is not allowed for thi $wb['soa_cannot_be_changed_txt'] = 'Die Zone (SOA) kann nicht verändert werden. Bitte kontaktieren Sie ihren Administrator, um die Zone zu ändern.'; $wb['configuration_error_txt'] = 'CONFIGURATION ERROR'; $wb['dnssec_algo_txt'] = 'DNSSEC Algorithm'; +$wb['rendered_zone_txt'] = 'Bind zone format for reference and export.'; +$wb['rendered_zone_unavailable_txt'] = 'Sorry, no data is available yet.'; ?> diff --git a/interface/web/dns/lib/lang/bg_dns_soa.lng b/interface/web/dns/lib/lang/bg_dns_soa.lng index 4cd3c705ac3e185889c2611ce48b86ce8c797545..c1e57edf8b9ffa60b9e6f7ae306a1ebeae2184d7 100644 --- a/interface/web/dns/lib/lang/bg_dns_soa.lng +++ b/interface/web/dns/lib/lang/bg_dns_soa.lng @@ -42,4 +42,6 @@ $wb['error_not_allowed_server_id'] = 'The selected server is not allowed for thi $wb['soa_cannot_be_changed_txt'] = 'Die Zone (SOA) kann nicht verändert werden. Bitte kontaktieren Sie ihren Administrator, um die Zone zu ändern.'; $wb['configuration_error_txt'] = 'CONFIGURATION ERROR'; $wb['dnssec_algo_txt'] = 'DNSSEC Algorithm'; +$wb['rendered_zone_txt'] = 'Bind zone format for reference and export.'; +$wb['rendered_zone_unavailable_txt'] = 'Sorry, no data is available yet.'; ?> diff --git a/interface/web/dns/lib/lang/br_dns_soa.lng b/interface/web/dns/lib/lang/br_dns_soa.lng index 81b2bb24c75482c3d97bdb8868f20e7abd9ebde9..e6c8982de0259df07f2d979f0b62bf6abf9fa241 100644 --- a/interface/web/dns/lib/lang/br_dns_soa.lng +++ b/interface/web/dns/lib/lang/br_dns_soa.lng @@ -42,3 +42,5 @@ $wb['error_not_allowed_server_id'] = 'O servidor selecionado não é permitido p $wb['soa_cannot_be_changed_txt'] = 'A zona (SOA) não pode ser modificada. Por favor, contate o administrador se deseja modificar esta zona.'; $wb['configuration_error_txt'] = 'ERRO DE CONFIGURAÇÃO'; $wb['dnssec_algo_txt'] = 'Algoritmo DNSSEC'; +$wb['rendered_zone_txt'] = 'Bind zone format for reference and export.'; +$wb['rendered_zone_unavailable_txt'] = 'Sorry, no data is available yet.'; diff --git a/interface/web/dns/lib/lang/ca_dns_soa.lng b/interface/web/dns/lib/lang/ca_dns_soa.lng index ee2fdb07b64c3a188cca64d12fe20b6129c21f69..2ac84a17df977e720a5b2fe752d30f6a7396ba16 100644 --- a/interface/web/dns/lib/lang/ca_dns_soa.lng +++ b/interface/web/dns/lib/lang/ca_dns_soa.lng @@ -42,4 +42,6 @@ $wb['error_not_allowed_server_id'] = 'The selected server is not allowed for thi $wb['soa_cannot_be_changed_txt'] = 'Die Zone (SOA) kann nicht verändert werden. Bitte kontaktieren Sie ihren Administrator, um die Zone zu ändern.'; $wb['configuration_error_txt'] = 'CONFIGURATION ERROR'; $wb['dnssec_algo_txt'] = 'DNSSEC Algorithm'; +$wb['rendered_zone_txt'] = 'Bind zone format for reference and export.'; +$wb['rendered_zone_unavailable_txt'] = 'Sorry, no data is available yet.'; ?> diff --git a/interface/web/dns/lib/lang/cz_dns_soa.lng b/interface/web/dns/lib/lang/cz_dns_soa.lng index ef6fdf82d82578aa871a058e9f0c421c85c74f47..73c2582117a039a345323bb3b50d63b2b06b9937 100644 --- a/interface/web/dns/lib/lang/cz_dns_soa.lng +++ b/interface/web/dns/lib/lang/cz_dns_soa.lng @@ -42,3 +42,5 @@ $wb['error_not_allowed_server_id'] = 'Vybraný server nenà pro tento úÄet pov $wb['soa_cannot_be_changed_txt'] = 'Die Zone (SOA) kann nicht verändert werden. Bitte kontaktieren Sie ihren Administrator, um die Zone zu ändern.'; $wb['configuration_error_txt'] = 'CONFIGURATION ERROR'; $wb['dnssec_algo_txt'] = 'DNSSEC Algoritmus'; +$wb['rendered_zone_txt'] = 'Bind zone format for reference and export.'; +$wb['rendered_zone_unavailable_txt'] = 'Sorry, no data is available yet.'; diff --git a/interface/web/dns/lib/lang/de_dns_soa.lng b/interface/web/dns/lib/lang/de_dns_soa.lng index 14897b24e45fd86dbca1e4ddfc95d3317c6aae4b..7338e154338c1a8bd2978c4c3fc5cbbb40a83913 100644 --- a/interface/web/dns/lib/lang/de_dns_soa.lng +++ b/interface/web/dns/lib/lang/de_dns_soa.lng @@ -42,4 +42,6 @@ $wb['soa_cannot_be_changed_txt'] = 'Die Zone (SOA) kann nicht verändert werden. $wb['error_not_allowed_server_id'] = 'The selected server is not allowed for this account.'; $wb['configuration_error_txt'] = 'CONFIGURATION ERROR'; $wb['dnssec_algo_txt'] = 'DNSSEC Algorithmus'; +$wb['rendered_zone_txt'] = 'Bind zone format for reference and export.'; +$wb['rendered_zone_unavailable_txt'] = 'Sorry, no data is available yet.'; ?> diff --git a/interface/web/dns/lib/lang/dk_dns_soa.lng b/interface/web/dns/lib/lang/dk_dns_soa.lng index a4ff50f14fa3f705e59b6ba19472bf8bd5f7ad5d..6759024041b91aa1c83db92fcd9503cb7b029639 100644 --- a/interface/web/dns/lib/lang/dk_dns_soa.lng +++ b/interface/web/dns/lib/lang/dk_dns_soa.lng @@ -42,4 +42,6 @@ $wb['error_not_allowed_server_id'] = 'The selected server is not allowed for thi $wb['soa_cannot_be_changed_txt'] = 'The Zone (SOA) can not be changed. Please contact your administrator to change the zone.'; $wb['configuration_error_txt'] = 'CONFIGURATION ERROR'; $wb['dnssec_algo_txt'] = 'DNSSEC Algorithm'; +$wb['rendered_zone_txt'] = 'Bind zone format for reference and export.'; +$wb['rendered_zone_unavailable_txt'] = 'Sorry, no data is available yet.'; ?> diff --git a/interface/web/dns/lib/lang/el_dns_soa.lng b/interface/web/dns/lib/lang/el_dns_soa.lng index a22c9de41306f88350baf780d72e9deb38f2eedc..4ceed78dc9ebc0e515b048a91fb768c6d92ab0d6 100644 --- a/interface/web/dns/lib/lang/el_dns_soa.lng +++ b/interface/web/dns/lib/lang/el_dns_soa.lng @@ -42,4 +42,6 @@ $wb['error_not_allowed_server_id'] = 'The selected server is not allowed for thi $wb['soa_cannot_be_changed_txt'] = 'Die Zone (SOA) kann nicht verändert werden. Bitte kontaktieren Sie ihren Administrator, um die Zone zu ändern.'; $wb['configuration_error_txt'] = 'CONFIGURATION ERROR'; $wb['dnssec_algo_txt'] = 'DNSSEC Algorithm'; +$wb['rendered_zone_txt'] = 'Bind zone format for reference and export.'; +$wb['rendered_zone_unavailable_txt'] = 'Sorry, no data is available yet.'; ?> diff --git a/interface/web/dns/lib/lang/en_dns_soa.lng b/interface/web/dns/lib/lang/en_dns_soa.lng index 7f42b9f27a2bce96cf42fdf50ee21781d16d60d2..a5f1adfae5cc688659c98937fcb3c7c6947fa51d 100644 --- a/interface/web/dns/lib/lang/en_dns_soa.lng +++ b/interface/web/dns/lib/lang/en_dns_soa.lng @@ -42,4 +42,6 @@ $wb['error_not_allowed_server_id'] = 'The selected server is not allowed for thi $wb['soa_cannot_be_changed_txt'] = 'The Zone (SOA) can not be changed. Please contact your administrator to change the zone.'; $wb['configuration_error_txt'] = 'CONFIGURATION ERROR'; $wb['dnssec_algo_txt'] = 'DNSSEC Algorithm'; +$wb['rendered_zone_txt'] = 'Bind zone format for reference and export.'; +$wb['rendered_zone_unavailable_txt'] = 'Sorry, no data is available yet.'; ?> diff --git a/interface/web/dns/lib/lang/es_dns_soa.lng b/interface/web/dns/lib/lang/es_dns_soa.lng index b1484e749a0258b43ed279ca159226a451badb81..b1061373f509e8a120d4d4b5232a7f842f39dcae 100644 --- a/interface/web/dns/lib/lang/es_dns_soa.lng +++ b/interface/web/dns/lib/lang/es_dns_soa.lng @@ -42,4 +42,6 @@ $wb['xfer_error_regex'] = 'Notificar también a: Por favor, usa una dirección I $wb['xfer_txt'] = 'Permitir transferencia de zonas a<br />estas IP (lista separada por comas)'; $wb['configuration_error_txt'] = 'CONFIGURATION ERROR'; $wb['dnssec_algo_txt'] = 'DNSSEC Algorithm'; +$wb['rendered_zone_txt'] = 'Bind zone format for reference and export.'; +$wb['rendered_zone_unavailable_txt'] = 'Sorry, no data is available yet.'; ?> diff --git a/interface/web/dns/lib/lang/fi_dns_soa.lng b/interface/web/dns/lib/lang/fi_dns_soa.lng index d90de950b023047916574a12286dc17570db3798..36f95abab06a827df30a77fc7cd2b60e850defae 100644 --- a/interface/web/dns/lib/lang/fi_dns_soa.lng +++ b/interface/web/dns/lib/lang/fi_dns_soa.lng @@ -42,4 +42,6 @@ $wb['error_not_allowed_server_id'] = 'The selected server is not allowed for thi $wb['soa_cannot_be_changed_txt'] = 'Die Zone (SOA) kann nicht verändert werden. Bitte kontaktieren Sie ihren Administrator, um die Zone zu ändern.'; $wb['configuration_error_txt'] = 'CONFIGURATION ERROR'; $wb['dnssec_algo_txt'] = 'DNSSEC Algorithm'; +$wb['rendered_zone_txt'] = 'Bind zone format for reference and export.'; +$wb['rendered_zone_unavailable_txt'] = 'Sorry, no data is available yet.'; ?> diff --git a/interface/web/dns/lib/lang/fr_dns_soa.lng b/interface/web/dns/lib/lang/fr_dns_soa.lng index d2449c323e9a95cb966fd7f9497699a7044f51db..dd66dc19865e0b8e60eb97f05e65ca360e2e1be4 100644 --- a/interface/web/dns/lib/lang/fr_dns_soa.lng +++ b/interface/web/dns/lib/lang/fr_dns_soa.lng @@ -42,4 +42,6 @@ $wb['error_not_allowed_server_id'] = 'The selected server is not allowed for thi $wb['soa_cannot_be_changed_txt'] = 'Die Zone (SOA) kann nicht verändert werden. Bitte kontaktieren Sie ihren Administrator, um die Zone zu ändern.'; $wb['configuration_error_txt'] = 'CONFIGURATION ERROR'; $wb['dnssec_algo_txt'] = 'DNSSEC Algorithm'; +$wb['rendered_zone_txt'] = 'Bind zone format for reference and export.'; +$wb['rendered_zone_unavailable_txt'] = 'Sorry, no data is available yet.'; ?> diff --git a/interface/web/dns/lib/lang/hr_dns_soa.lng b/interface/web/dns/lib/lang/hr_dns_soa.lng index d738ff1e184cb52628d8aa105c16cc92503a60bb..5d88b4708746e0673fcd66bb4f40cd4e863a7a91 100644 --- a/interface/web/dns/lib/lang/hr_dns_soa.lng +++ b/interface/web/dns/lib/lang/hr_dns_soa.lng @@ -42,4 +42,6 @@ $wb['error_not_allowed_server_id'] = 'The selected server is not allowed for thi $wb['soa_cannot_be_changed_txt'] = 'Die Zone (SOA) kann nicht verändert werden. Bitte kontaktieren Sie ihren Administrator, um die Zone zu ändern.'; $wb['configuration_error_txt'] = 'CONFIGURATION ERROR'; $wb['dnssec_algo_txt'] = 'DNSSEC Algorithm'; +$wb['rendered_zone_txt'] = 'Bind zone format for reference and export.'; +$wb['rendered_zone_unavailable_txt'] = 'Sorry, no data is available yet.'; ?> diff --git a/interface/web/dns/lib/lang/hu_dns_soa.lng b/interface/web/dns/lib/lang/hu_dns_soa.lng index 38d3272f0448e154954de2ef7d0c8e24864ddc60..fdabdd99c295582fdd02d1400400ab3fbd872dd9 100644 --- a/interface/web/dns/lib/lang/hu_dns_soa.lng +++ b/interface/web/dns/lib/lang/hu_dns_soa.lng @@ -42,4 +42,6 @@ $wb['error_not_allowed_server_id'] = 'The selected server is not allowed for thi $wb['soa_cannot_be_changed_txt'] = 'Die Zone (SOA) kann nicht verändert werden. Bitte kontaktieren Sie ihren Administrator, um die Zone zu ändern.'; $wb['configuration_error_txt'] = 'CONFIGURATION ERROR'; $wb['dnssec_algo_txt'] = 'DNSSEC Algorithm'; +$wb['rendered_zone_txt'] = 'Bind zone format for reference and export.'; +$wb['rendered_zone_unavailable_txt'] = 'Sorry, no data is available yet.'; ?> diff --git a/interface/web/dns/lib/lang/id_dns_soa.lng b/interface/web/dns/lib/lang/id_dns_soa.lng index 2c1842e6f2e92647311df5fb13a6733739c817de..d6cb9d78dae561d91607469c4a31f27138d6888f 100644 --- a/interface/web/dns/lib/lang/id_dns_soa.lng +++ b/interface/web/dns/lib/lang/id_dns_soa.lng @@ -42,4 +42,6 @@ $wb['error_not_allowed_server_id'] = 'The selected server is not allowed for thi $wb['soa_cannot_be_changed_txt'] = 'Die Zone (SOA) kann nicht verändert werden. Bitte kontaktieren Sie ihren Administrator, um die Zone zu ändern.'; $wb['configuration_error_txt'] = 'CONFIGURATION ERROR'; $wb['dnssec_algo_txt'] = 'DNSSEC Algorithm'; +$wb['rendered_zone_txt'] = 'Bind zone format for reference and export.'; +$wb['rendered_zone_unavailable_txt'] = 'Sorry, no data is available yet.'; ?> diff --git a/interface/web/dns/lib/lang/it_dns_a.lng b/interface/web/dns/lib/lang/it_dns_a.lng index f45709437ec28c31334a14f652552523cc1b6dc7..b6d94f76a54cd1faf72c412d52d77bbe30ecfc8b 100644 --- a/interface/web/dns/lib/lang/it_dns_a.lng +++ b/interface/web/dns/lib/lang/it_dns_a.lng @@ -1,17 +1,17 @@ <?php $wb['server_id_txt'] = 'Server'; -$wb['zone_txt'] = 'Zone'; +$wb['zone_txt'] = 'Zona'; $wb['name_txt'] = 'Hostname'; -$wb['type_txt'] = 'type'; -$wb['data_txt'] = 'IP-Address'; +$wb['type_txt'] = 'Tipo'; +$wb['data_txt'] = 'Indirizzo IP'; $wb['ttl_txt'] = 'TTL'; $wb['active_txt'] = 'Attivo'; -$wb['limit_dns_record_txt'] = 'The max. number of DNS records raggiunto per il tuo account.'; -$wb['no_zone_perm'] = 'You do not have the permission to add a record to this DNS zone.'; -$wb['name_error_empty'] = 'The hostname vuoto.'; -$wb['name_error_regex'] = 'The hostname has the wrong format.'; -$wb['data_error_empty'] = 'IP-Address empty'; -$wb['data_error_duplicate'] = 'Duplicate A, ALIAS or CNAME record'; -$wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; -$wb['ip_error_wrong'] = 'IP-Address format invalid'; +$wb['limit_dns_record_txt'] = 'Numero massimo di record DNS raggiunto per il tuo profilo.'; +$wb['no_zone_perm'] = 'Non hai il permesso di aggiungere un record DNS a questa zona.'; +$wb['name_error_empty'] = 'The hostname vuoto.'; +$wb['name_error_regex'] = 'L\'hostname ha un formato errato.'; +$wb['data_error_empty'] = 'Indirizzo IP vuoto'; +$wb['data_error_duplicate'] = 'Record A, ALIAS or CNAME Duplicato'; +$wb['ttl_range_error'] = 'Minimo TTL è 60 secondi.'; +$wb['ip_error_wrong'] = 'Formato Indirizzo IP non valido'; ?> diff --git a/interface/web/dns/lib/lang/it_dns_a_list.lng b/interface/web/dns/lib/lang/it_dns_a_list.lng index 4c9a3de2dd32d5fd982f27df2d33eb258bf2a739..cd3682a217ab1f520a71da34f65c668a89dd84fe 100644 --- a/interface/web/dns/lib/lang/it_dns_a_list.lng +++ b/interface/web/dns/lib/lang/it_dns_a_list.lng @@ -2,14 +2,14 @@ $wb['list_head_txt'] = 'A-Record'; $wb['active_txt'] = 'Attivo'; $wb['server_id_txt'] = 'Server'; -$wb['zone_txt'] = 'Zone'; +$wb['zone_txt'] = 'Zona'; $wb['name_txt'] = 'Nome'; -$wb['data_txt'] = 'Data'; -$wb['aux_txt'] = 'Priorita'; +$wb['data_txt'] = 'Dati'; +$wb['aux_txt'] = 'Priorità '; $wb['ttl_txt'] = 'TTL'; -$wb['type_txt'] = 'Type'; -$wb['add_new_record_txt'] = 'Aggiungi un nuovo DNS A-Record'; -$wb['page_txt'] = 'Page'; -$wb['page_of_txt'] = 'of'; +$wb['type_txt'] = 'Tipo'; +$wb['add_new_record_txt'] = 'Aggiungi un nuovo DNS A-Record'; +$wb['page_txt'] = 'Pagina'; +$wb['page_of_txt'] = 'di'; $wb['delete_confirmation'] = 'Vuoi davvero eliminare questo record?'; ?> diff --git a/interface/web/dns/lib/lang/it_dns_aaaa.lng b/interface/web/dns/lib/lang/it_dns_aaaa.lng index a54f87a5fa5f711c79f28d489def989a2de4e070..8de4a2c5e2fd2d4283629c4ef4e9f5c5193ebe98 100644 --- a/interface/web/dns/lib/lang/it_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/it_dns_aaaa.lng @@ -6,7 +6,7 @@ $wb['type_txt'] = 'tipo'; $wb['data_txt'] = 'Indirizzo IPv6'; $wb['ttl_txt'] = 'TTL'; $wb['active_txt'] = 'Attivo'; -$wb['limit_dns_record_txt'] = 'Numero massimo records DNS raggiunto per il tuo account.'; +$wb['limit_dns_record_txt'] = 'Numero massimo records DNS raggiunto per il tuo profilo.'; $wb['no_zone_perm'] = 'Non hai il permesso di aggiungere record a questa zona DNS.'; $wb['name_error_empty'] = 'Nome Host vuoto.'; $wb['name_error_regex'] = 'Formato errato per Nome Host.'; diff --git a/interface/web/dns/lib/lang/it_dns_alias.lng b/interface/web/dns/lib/lang/it_dns_alias.lng index e2eade0f8a2d93c9ccf844ab013aab6672a5e372..c95d9b01e2058a11c7f021b6b024027ea8ae61db 100644 --- a/interface/web/dns/lib/lang/it_dns_alias.lng +++ b/interface/web/dns/lib/lang/it_dns_alias.lng @@ -1,17 +1,17 @@ <?php $wb['server_id_txt'] = 'Server'; -$wb['zone_txt'] = 'Zone'; +$wb['zone_txt'] = 'Zona'; $wb['name_txt'] = 'Hostname'; $wb['type_txt'] = 'type'; $wb['data_txt'] = 'Target Hostname'; $wb['ttl_txt'] = 'TTL'; $wb['active_txt'] = 'Attivo'; -$wb['limit_dns_record_txt'] = 'The max. number of DNS records raggiunto per il tuo account.'; -$wb['no_zone_perm'] = 'You do not have the permission to add a record to this DNS zone.'; -$wb['name_error_empty'] = 'The hostname vuoto.'; -$wb['name_error_regex'] = 'The hostname has the wrong format.'; -$wb['data_error_empty'] = 'Target hostname empty'; -$wb['data_error_regex'] = 'Target hostname format invalid'; -$wb['data_error_duplicate'] = 'Duplicate A, AAAA, ALIAS, CNAME, or DNAME record'; -$wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; +$wb['limit_dns_record_txt'] = 'Massimo numero di record DNS raggiunto per il tuo profilo.'; +$wb['no_zone_perm'] = 'Non sei abilitato ad aggiungere record a questa zona DNS.'; +$wb['name_error_empty'] = 'L\'hostname vuoto.'; +$wb['name_error_regex'] = 'L\'hostname ha un formato errato.'; +$wb['data_error_empty'] = 'Target hostname è vuoto'; +$wb['data_error_regex'] = 'formato Target hostname non valido'; +$wb['data_error_duplicate'] = 'record A, AAAA, ALIAS, CNAME, or DNAME Duplicate'; +$wb['ttl_range_error'] = 'Minimo TTL è 60 secondi.'; ?> diff --git a/interface/web/dns/lib/lang/it_dns_caa.lng b/interface/web/dns/lib/lang/it_dns_caa.lng index 8040cb4d549f3bc060a5b9ace62f711715446b0f..3cd8efd365fb39c8d554000168d60ed8df2759e6 100644 --- a/interface/web/dns/lib/lang/it_dns_caa.lng +++ b/interface/web/dns/lib/lang/it_dns_caa.lng @@ -1,19 +1,19 @@ <?php $wb['ca_list_txt'] = 'Certification Authority'; -$wb['ca_domain_txt'] = 'Domain'; -$wb['ca_hostname_txt'] = 'Additional Hostnames'; -$wb['ca_hostname_note_txt'] = '(Sepearated list with commas - empty for all hostnames)'; -$wb['ca_options_txt'] = 'Additional Options'; -$wb['ca_options_note_txt'] = 'requested by the CA (Sepearated list with commas)'; -$wb['ca_wildcard_txt'] = 'Use Wildcard SSL'; -$wb['ca_critical_txt'] = 'Strict check'; +$wb['ca_domain_txt'] = 'Dominio'; +$wb['ca_hostname_txt'] = 'Hostnames aggiuntivi'; +$wb['ca_hostname_note_txt'] = '(liste separate da virgole - vuoto per tutti gli hostname)'; +$wb['ca_options_txt'] = 'Optioni Aggiuntive'; +$wb['ca_options_note_txt'] = 'richieste dalla CA (liste separate da virgole)'; +$wb['ca_wildcard_txt'] = 'Usare * SSL'; +$wb['ca_critical_txt'] = 'Verifica approfondita'; $wb['ttl_txt'] = 'TTL'; -$wb['active_txt'] = 'Active'; -$wb['select_txt'] = 'Select Certification Authority'; -$wb['no_zone_perm'] = 'You do not have the permission to add a record to this DNS zone.'; -$wb['limit_dns_record_txt'] = 'The max. number of DNS records for your account is reached.'; -$wb['ca_error_txt'] = 'No Certification Authority selected'; -$wb['caa_exists_error'] = 'CAA Record already exists'; -$wb['ca_option_error'] = 'Invalid format for additional options; OPTION=VALUE'; -$wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; +$wb['active_txt'] = 'Attivo'; +$wb['select_txt'] = 'Seleziona Certification Authority'; +$wb['no_zone_perm'] = 'Non sei abilitato ad aggiungere record a questa zona DNS.'; +$wb['limit_dns_record_txt'] = 'Hai raggiunto il massimo numero di record DNS per il tuo profilo.'; +$wb['ca_error_txt'] = 'Nessuna Certification Authority selezionata'; +$wb['caa_exists_error'] = 'CAA Record esiste già '; +$wb['ca_option_error'] = 'Formato scorretto per opzioni aggiuntive; OPTION=VALUE'; +$wb['ttl_range_error'] = 'Minimo TTL è 60 secondi.'; ?> diff --git a/interface/web/dns/lib/lang/it_dns_cname.lng b/interface/web/dns/lib/lang/it_dns_cname.lng index ced97b351ae511ecfa512c77eb593f816d8ec801..0e05f1ea8f114ca694ee873bd5e079ab2ca1f50e 100644 --- a/interface/web/dns/lib/lang/it_dns_cname.lng +++ b/interface/web/dns/lib/lang/it_dns_cname.lng @@ -6,12 +6,12 @@ $wb['type_txt'] = 'tipo'; $wb['data_txt'] = 'Target Nome Host'; $wb['ttl_txt'] = 'TTL'; $wb['active_txt'] = 'Attivo'; -$wb['limit_dns_record_txt'] = 'Numero massimo di record DNS raggiunto per il tuo account.'; +$wb['limit_dns_record_txt'] = 'Numero massimo di record DNS raggiunto per il tuo profilo.'; $wb['no_zone_perm'] = 'Non hai il permesso di aggiungere record a questa zona DNS.'; $wb['name_error_empty'] = 'Nome Host vuoto.'; $wb['name_error_regex'] = 'Formato errato per Nome Host.'; $wb['data_error_empty'] = 'Target nome host vuoto'; $wb['data_error_regex'] = 'Target nome host formato errato'; -$wb['data_error_duplicate'] = 'Duplicate A, AAAA, ALIAS, CNAME, or DNAME record'; +$wb['data_error_duplicate'] = 'record A, AAAA, ALIAS, CNAME, or DNAME Duplicato'; $wb['ttl_range_error'] = 'TTL time minimo 60 secondi.'; ?> diff --git a/interface/web/dns/lib/lang/it_dns_dkim.lng b/interface/web/dns/lib/lang/it_dns_dkim.lng index 4d45fb4fe95d87134331a593c81c6994bafab57c..dd05a1fa1e976db7db2ad9f676aeae174d9dd3ec 100644 --- a/interface/web/dns/lib/lang/it_dns_dkim.lng +++ b/interface/web/dns/lib/lang/it_dns_dkim.lng @@ -1,13 +1,13 @@ <?php -$wb['public_key_txt'] = 'Public-Key'; +$wb['public_key_txt'] = 'Chiave pubblica'; $wb['ttl_txt'] = 'TTL'; -$wb['active_txt'] = 'Active'; -$wb['record_exists_txt'] = 'DNS-Record already exists'; -$wb['dkim_disabled_txt'] = 'DKIM disabled for this mail-domain'; -$wb['limit_dns_record_txt'] = 'The max. number of DNS records for your account is reached.'; -$wb['no_zone_perm'] = 'You do not have the permission to add a record to this DNS zone.'; -$wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; -$wb['selector_txt'] = 'DKIM-Selector'; -$wb['data_error_empty'] = 'Public-Key missing'; -$wb['dkim_selector_empty_txt'] = 'DKIM-Selector is empty'; +$wb['active_txt'] = 'Attivo'; +$wb['record_exists_txt'] = 'Il record DNS esiste già '; +$wb['dkim_disabled_txt'] = 'DKIM disabilitato per questo dominio mail'; +$wb['limit_dns_record_txt'] = 'The max. number of DNS records for your profilo is reached.'; +$wb['no_zone_perm'] = 'Non hai il permesso di aggiungere record DNZ a questa zona.'; +$wb['ttl_range_error'] = 'Minimo TTL è 60 secondi.'; +$wb['selector_txt'] = 'DKIM-Selettore'; +$wb['data_error_empty'] = 'Manca la chiave pubblica'; +$wb['dkim_selector_empty_txt'] = 'DKIM-Selettore è vuoto'; ?> diff --git a/interface/web/dns/lib/lang/it_dns_dmarc.lng b/interface/web/dns/lib/lang/it_dns_dmarc.lng index cf78bb8eed902817caf1e80e9e6e77d9d64b9ab3..64e66f4a93cb07b3b83b1f21c8ab33dea4c02fbf 100644 --- a/interface/web/dns/lib/lang/it_dns_dmarc.lng +++ b/interface/web/dns/lib/lang/it_dns_dmarc.lng @@ -1,50 +1,50 @@ <?php -$wb['data_txt'] = 'DMARC Record'; -$wb['domain_txt'] = 'Domain'; -$wb['dmarc_policy_txt'] = 'Mail Receiver Policy'; -$wb['dmarc_policy_note_txt'] = 'How ISPs should handle messages that failed SPF or DKIM (DMARC).'; -$wb['dmarc_policy_none_txt'] = 'none'; -$wb['dmarc_policy_quarantine_txt'] = 'quarantine'; -$wb['dmarc_policy_reject_txt'] = 'reject'; -$wb['dmarc_rua_txt'] = 'Aggregate Data Reporting Address'; -$wb['dmarc_rua_note_txt'] = 'Email to receive reports from ISPs aboute messages which failed DMARC checks for the domain (separated by whitespaces).'; -$wb['dmarc_ruf_txt'] = 'Forensic Data Reporting Address'; -$wb['dmarc_ruf_note_txt'] = 'Email to receive sample messages that are failing DMARC checks for the domain (separated by whitespaces).'; -$wb['dmarc_fo_txt'] = 'Forensic reporting options'; -$wb['dmarc_fo0_txt'] = 'Generate reports if all underlying authentication mechanisms fail to produce a DMARC \'pass\' result.'; -$wb['dmarc_fo1_txt'] = 'Generate reports if any mechanisms fail.'; -$wb['dmarc_fod_txt'] = 'Generate report if DKIM signature failed to verify.'; -$wb['dmarc_fos_txt'] = 'Generate report if SPF failed.'; +$wb['data_txt'] = 'Record DMARC'; +$wb['domain_txt'] = 'Dominio'; +$wb['dmarc_policy_txt'] = 'Politica di ricezione mail'; +$wb['dmarc_policy_note_txt'] = 'Come devono essere gestiti i messaggi che non hanno superato SPF or DKIM (DMARC).'; +$wb['dmarc_policy_none_txt'] = 'nessuno'; +$wb['dmarc_policy_quarantine_txt'] = 'quarantena'; +$wb['dmarc_policy_reject_txt'] = 'rifiuta'; +$wb['dmarc_rua_txt'] = 'Indirizzi di invio dei report di dati aggregati'; +$wb['dmarc_rua_note_txt'] = 'Indirizzi Email cui notificare i report dagli ISP riguardo i messaggi che non hanno superato la verifica DMARC per il dominio (separare gli indirizzi da spazi).'; +$wb['dmarc_ruf_txt'] = 'Indirizzi per i report di dati Forensi'; +$wb['dmarc_ruf_note_txt'] = 'Indirizzi Email cui notificare i report dagli ISP riguardo i messaggi che non hanno superato la verifica DMARC per il dominio (separare gli indirizzi da spazi).'; +$wb['dmarc_fo_txt'] = 'Opzioni di report Forense'; +$wb['dmarc_fo0_txt'] = 'Generare report se tutti i meccanismi di autenticazione non producono un risultato di \'pass\' alla verifica DMARC'; +$wb['dmarc_fo1_txt'] = 'Generare report se qualunque meccanismo fallisce.'; +$wb['dmarc_fod_txt'] = 'Generare report se non supera la verifica di firma DKIM.'; +$wb['dmarc_fos_txt'] = 'Generare report se fallisce SPF.'; $wb['dmarc_adkim_txt'] = 'DKIM identifier alignment'; -$wb['dmarc_adkim_note_txt'] = '\'strict\' requires exact matching between DKIM domain and email\'s from'; -$wb['dmarc_adkim_r_txt'] = 'relaxed'; -$wb['dmarc_adkim_s_txt'] = 'strict'; +$wb['dmarc_adkim_note_txt'] = '\'esetta\' richiede l\'esatta uguaglianza tra il dominio DKIM e il campo \'da\' della email'; +$wb['dmarc_adkim_r_txt'] = 'rilassata'; +$wb['dmarc_adkim_s_txt'] = 'esatta'; $wb['dmarc_aspf_txt'] = 'SPF identifier alignment'; -$wb['dmarc_aspf_note_txt'] = '\'strict\' requires exact matching between SPF domain and email\'s from'; -$wb['dmarc_aspf_r_txt'] = 'relaxed'; -$wb['dmarc_aspf_s_txt'] = 'strict'; -$wb['dmarc_rf_txt'] = 'Report Format'; -$wb['dmarc_rf_afrf_txt'] = 'Authentication Failure Reporting Format'; -$wb['dmarc_rf_iodef_txt'] = 'Incident Object Description Exchange Format'; -$wb['dmarc_pct_txt'] = 'Apply Policy to this Percentage'; -$wb['dmarc_pct_note_txt'] = '% (100 default). Messages in percent from the domain you want ISPs to check.'; -$wb['dmarc_ri_txt'] = 'Reporting Interval'; -$wb['dmarc_ri_note_txt'] = 'Seconds (default=86400). The time in seconds that aggregate reports should be generate (86400 represents 1 day).'; -$wb['dmarc_sp_txt'] = 'Subdomain Policy (Defaults to same as domain).'; -$wb['dmarc_sp_same_txt'] = 'same as domain'; -$wb['dmarc_sp_none_txt'] = 'none'; -$wb['dmarc_sp_quarantine_txt'] = 'quarantine'; -$wb['dmarc_sp_reject_txt'] = 'reject'; +$wb['dmarc_aspf_note_txt'] = '\'esatta\' richiede l\'esatta uguaglianza tra il domini SPF e il campo \'da\' della email'; +$wb['dmarc_aspf_r_txt'] = 'rilassata'; +$wb['dmarc_aspf_s_txt'] = 'esatta'; +$wb['dmarc_rf_txt'] = 'Formato Report'; +$wb['dmarc_rf_afrf_txt'] = 'Formato del reporto di mancata autenticazione'; +$wb['dmarc_rf_iodef_txt'] = 'Formato di scambio della descrizione del problema accaduto'; +$wb['dmarc_pct_txt'] = 'Applica la politica con questa percentuale'; +$wb['dmarc_pct_note_txt'] = '% (100 default). Numero di Messaggi in percentuale dal dominio per il quale vuoi che gli ISP eseguano la verifica.'; +$wb['dmarc_ri_txt'] = 'Intervallo di Report'; +$wb['dmarc_ri_note_txt'] = 'Secondi (default=86400). Tempo in secondi per aggregare i dati del report da generare (86400 rappresenta 1 giorno).'; +$wb['dmarc_sp_txt'] = 'Politica per i sottodomini (Default la stessa dei Domini).'; +$wb['dmarc_sp_same_txt'] = 'Stessa dei domini'; +$wb['dmarc_sp_none_txt'] = 'nessuna'; +$wb['dmarc_sp_quarantine_txt'] = 'quarantena'; +$wb['dmarc_sp_reject_txt'] = 'rifiuta'; $wb['ttl_txt'] = 'TTL'; -$wb['active_txt'] = 'Active'; -$wb['dmarc_policy_error_txt'] = 'Only policy \'none\' is allowed without DKIM-signed emails.'; -$wb['dmarc_no_dkim_txt'] = 'No active DKIM Record.'; -$wb['dmarc_no_spf_txt'] = 'No active SPF Record.'; -$wb['dmarc_more_spf_txt'] = 'More than one active SPF Record'; -$wb['dmarc_invalid_email_txt'] = 'Invalid Email'; -$wb['dmarc_empty_txt'] = 'DMARC Record empty - specify at least one option'; -$wb['record_exists_txt'] = 'DNS-Record already exists'; -$wb['limit_dns_record_txt'] = 'The max. number of DNS records for your account is reached.'; -$wb['no_zone_perm'] = 'You do not have the permission to add a record to this DNS zone.'; -$wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; +$wb['active_txt'] = 'Attivo'; +$wb['dmarc_policy_error_txt'] = 'Solo la politica \'nessuna\' è consentita senza mail firmate DKIM.'; +$wb['dmarc_no_dkim_txt'] = 'Nessun record DKIM attivo.'; +$wb['dmarc_no_spf_txt'] = 'Nessun record SPF attivo.'; +$wb['dmarc_more_spf_txt'] = 'Più di un record SPF attivo'; +$wb['dmarc_invalid_email_txt'] = 'Email non valida'; +$wb['dmarc_empty_txt'] = 'Record DMARC vuoto - specificare almeno un\'opzione'; +$wb['record_exists_txt'] = 'Record DNS esistono già '; +$wb['limit_dns_record_txt'] = 'Hai raggiunto il massimo numero di record DNS per il tuo profilo.'; +$wb['no_zone_perm'] = 'Non hai il permesso di aggiungere un record a questa zona DNS.'; +$wb['ttl_range_error'] = 'Minimo TTL è 60 secondi.'; ?> diff --git a/interface/web/dns/lib/lang/it_dns_dname.lng b/interface/web/dns/lib/lang/it_dns_dname.lng index e9d1a057cc51829d678f4c5ca676d1007859a54e..1e1e548b6bb53c14e7bf6713b98104858f75b833 100644 --- a/interface/web/dns/lib/lang/it_dns_dname.lng +++ b/interface/web/dns/lib/lang/it_dns_dname.lng @@ -6,7 +6,7 @@ $wb['type_txt'] = 'tipo'; $wb['data_txt'] = 'Target Nome Host'; $wb['ttl_txt'] = 'TTL'; $wb['active_txt'] = 'Attivo'; -$wb['limit_dns_record_txt'] = 'Numero massimo di record DNS raggiunto per il tuo account.'; +$wb['limit_dns_record_txt'] = 'Numero massimo di record DNS raggiunto per il tuo profilo.'; $wb['no_zone_perm'] = 'Non hai il permesso di aggiungere record a questa zona DNS.'; $wb['name_error_empty'] = 'Nome Host vuoto.'; $wb['name_error_regex'] = 'Formato errato per Nome Host.'; diff --git a/interface/web/dns/lib/lang/it_dns_ds.lng b/interface/web/dns/lib/lang/it_dns_ds.lng index c3622dc5b5eaa71ee71e573b6bb83da16aba3892..52fd45af0e591dd544c1440caad3b562e43278ea 100644 --- a/interface/web/dns/lib/lang/it_dns_ds.lng +++ b/interface/web/dns/lib/lang/it_dns_ds.lng @@ -1,17 +1,17 @@ <?php $wb['server_id_txt'] = 'Server'; -$wb['zone_txt'] = 'Zone'; +$wb['zone_txt'] = 'Zona'; $wb['name_txt'] = 'Hostname'; -$wb['type_txt'] = 'type'; -$wb['data_txt'] = 'Data'; +$wb['type_txt'] = 'tipo'; +$wb['data_txt'] = 'Dati'; $wb['ttl_txt'] = 'TTL'; -$wb['active_txt'] = 'Active'; -$wb['limit_dns_record_txt'] = 'The max. number of DNS records for your account is reached.'; -$wb['no_zone_perm'] = 'You do not have the permission to add a record to this DNS zone.'; -$wb['name_error_empty'] = 'The hostname is empty.'; -$wb['name_error_regex'] = 'The hostname has the wrong format.'; -$wb['data_error_empty'] = 'Text empty'; -$wb['data_error_regex'] = 'Text format invalid'; -$wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; -$wb['invalid_type_ds'] = 'DS-Record has a wrong format.'; +$wb['active_txt'] = 'Attivo'; +$wb['limit_dns_record_txt'] = 'Hai raggiunto il numero massimo di record DNS per il tuo profilo.'; +$wb['no_zone_perm'] = 'Non hai il permesso di aggiungere un record a questa zona DNS.'; +$wb['name_error_empty'] = 'Il campo hostname è vuoto.'; +$wb['name_error_regex'] = 'L\'hostname ha un formato errato.'; +$wb['data_error_empty'] = 'Testo vuoto'; +$wb['data_error_regex'] = 'Formato testo non corretto'; +$wb['ttl_range_error'] = 'Minimo TTL è 60 secondi.'; +$wb['invalid_type_ds'] = 'Il Record DNS ha un formato non corretto.'; ?> diff --git a/interface/web/dns/lib/lang/it_dns_hinfo.lng b/interface/web/dns/lib/lang/it_dns_hinfo.lng index 905b1e62e25c30ff94f6f011a8c69b7c93baba53..7ffae6a63cb9bf004c86b97d70983a45ddf7b3ce 100644 --- a/interface/web/dns/lib/lang/it_dns_hinfo.lng +++ b/interface/web/dns/lib/lang/it_dns_hinfo.lng @@ -1,16 +1,16 @@ <?php $wb['server_id_txt'] = 'Server'; -$wb['zone_txt'] = 'Zone'; +$wb['zone_txt'] = 'Zona'; $wb['name_txt'] = 'Hostname'; -$wb['type_txt'] = 'type'; -$wb['data_txt'] = 'Host Information'; +$wb['type_txt'] = 'Tipo'; +$wb['data_txt'] = 'Informazioni Host'; $wb['ttl_txt'] = 'TTL'; $wb['active_txt'] = 'Attivo'; -$wb['limit_dns_record_txt'] = 'The max. number of DNS records raggiunto per il tuo account.'; -$wb['no_zone_perm'] = 'You do not have the permission to add a record to this DNS zone.'; -$wb['name_error_empty'] = 'The hostname vuoto.'; -$wb['name_error_regex'] = 'The hostname has the wrong format.'; -$wb['data_error_empty'] = 'Host information empty'; -$wb['data_error_regex'] = 'Host Information format invalid'; -$wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; +$wb['limit_dns_record_txt'] = 'Hai raggiunto Il numero massimo di record DNS per il tuo profilo.'; +$wb['no_zone_perm'] = 'Non hai il permesso di aggiungere record a questa zona DNS.'; +$wb['name_error_empty'] = 'hostname è vuoto.'; +$wb['name_error_regex'] = 'L\'hostname ha un formato errato.'; +$wb['data_error_empty'] = 'Informazioni Host è vuoto'; +$wb['data_error_regex'] = 'Informazioni Host ha un formato non valido'; +$wb['ttl_range_error'] = 'Min. TTL è 60 secondi.'; ?> diff --git a/interface/web/dns/lib/lang/it_dns_import.lng b/interface/web/dns/lib/lang/it_dns_import.lng index 1d734ab4b04f92286fdef0c96e3a62e0efe49c39..3f49ddc427a079b49ea65950f0c34a4926d5479b 100644 --- a/interface/web/dns/lib/lang/it_dns_import.lng +++ b/interface/web/dns/lib/lang/it_dns_import.lng @@ -5,21 +5,21 @@ $wb['btn_save_txt'] = 'Importa file di zona'; $wb['btn_cancel_txt'] = 'Annulla'; $wb['domain_txt'] = 'Dominio'; $wb['zone_file_successfully_imported_txt'] = 'File di zona importato con successo!'; -$wb['error_no_valid_zone_file_txt'] = 'Fil di zona non corretto!'; +$wb['error_no_valid_zone_file_txt'] = 'File di zona non corretto!'; $wb['zonefile_to_import_txt'] = 'File di Zona'; $wb['domain_field_desc_txt'] = 'Può essere tralasciato se il dominio è nel nome del file di zona o nel contenuto del file.'; $wb['title'] = 'Importa file di zona'; $wb['no_file_uploaded_error'] = 'Nessun file di zona selezionato'; $wb['zone_file_import_txt'] = 'Importa file di zona'; -$wb['error_no_server_id'] = 'No server provided.'; -$wb['error_not_allowed_server_id'] = 'The selected server is not allowed for this account.'; -$wb['zone_already_exists'] = 'This zone already exists, you must delete or rename it first.'; -$wb['zone_not_allowed'] = 'This zone is not allowed for this account.'; -$wb['zone_file_missing_soa'] = 'The zone file must contain a SOA record.'; -$wb['zone_file_multiple_soa'] = 'The zone file cannot contain multiple SOA records.'; -$wb['zone_file_soa_parser'] = 'The SOA record in this zone file could not be processed. Ensure SERIAL, REFRESH, RETRY, EXPIRE and MINIMUM are each on a separate line from other data.'; -$wb['ignore_record_not_class_in'] = 'Ignoring DNS record, not class IN.'; -$wb['ignore_record_unknown_type'] = 'Ignoring DNS record, unknown type.'; -$wb['ignore_record_invalid_owner'] = 'Ignoring DNS record, not able to validate owner name.'; -$wb['zone_file_import_fail'] = 'The zone file did not import.'; +$wb['error_no_server_id'] = 'Nessun server indicato.'; +$wb['error_not_allowed_server_id'] = 'Il server selezionato non è consentito per il tuo profilo.'; +$wb['zone_already_exists'] = 'Questa zona esiste già devi prima cancellarla o rinominarla.'; +$wb['zone_not_allowed'] = 'Questa zona non è consentita per il tuo profilo.'; +$wb['zone_file_missing_soa'] = 'Il file di zoma deve contenere un record SOA.'; +$wb['zone_file_multiple_soa'] = 'Il file di zona non può avere più di un record SOA.'; +$wb['zone_file_soa_parser'] = 'Il record SOA di questa zona non può essere processato. Verifica che SERIAL, REFRESH, RETRY, EXPIRE and MINIMUM siano ognuno in una linea diversa da altri dati.'; +$wb['ignore_record_not_class_in'] = 'Ignoro record DNS non di tipo IN.'; +$wb['ignore_record_unknown_type'] = 'Ignoro record DNS record di tipo sconosciuto.'; +$wb['ignore_record_invalid_owner'] = 'Ignoro record DNS non essendo possibile di validare il nome del titolare.'; +$wb['zone_file_import_fail'] = 'Il file di zona non è stato importato.'; ?> diff --git a/interface/web/dns/lib/lang/it_dns_loc.lng b/interface/web/dns/lib/lang/it_dns_loc.lng index dc9ad9a00634513f03aec6da53682d2842bae7b6..3aed26d4ff9f451b2482cad5efc0f109a7a4ac21 100644 --- a/interface/web/dns/lib/lang/it_dns_loc.lng +++ b/interface/web/dns/lib/lang/it_dns_loc.lng @@ -1,16 +1,16 @@ <?php $wb['server_id_txt'] = 'Server'; -$wb['zone_txt'] = 'Zone'; +$wb['zone_txt'] = 'Zona'; $wb['name_txt'] = 'Hostname'; -$wb['type_txt'] = 'type'; -$wb['data_txt'] = 'Data'; +$wb['type_txt'] = 'tipo'; +$wb['data_txt'] = 'Dati'; $wb['ttl_txt'] = 'TTL'; -$wb['active_txt'] = 'Active'; +$wb['active_txt'] = 'Attivo'; $wb['limit_dns_record_txt'] = 'The max. number of DNS records for your account is reached.'; -$wb['no_zone_perm'] = 'You do not have the permission to add a record to this DNS zone.'; -$wb['name_error_empty'] = 'The hostname is empty.'; -$wb['name_error_regex'] = 'The hostname has the wrong format.'; -$wb['data_error_empty'] = 'Text empty'; -$wb['data_error_regex'] = 'Text format invalid'; -$wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; +$wb['no_zone_perm'] = 'Non hai il permesso di aggiungere record a questa zona DNS.'; +$wb['name_error_empty'] = 'Il campo hostname è vuoto.'; +$wb['name_error_regex'] = 'L\'hostname ha un formato errato.'; +$wb['data_error_empty'] = 'Testo vuoto'; +$wb['data_error_regex'] = 'Formato testo non valido'; +$wb['ttl_range_error'] = 'Minimo TTL è 60 secondi.'; ?> diff --git a/interface/web/dns/lib/lang/it_dns_mx.lng b/interface/web/dns/lib/lang/it_dns_mx.lng index d01ec250e15c1b78a2f4ea145f3b112f29c16787..221670a87d3dfa10501f9070fbbe6087dbcb5570 100644 --- a/interface/web/dns/lib/lang/it_dns_mx.lng +++ b/interface/web/dns/lib/lang/it_dns_mx.lng @@ -7,12 +7,12 @@ $wb['data_txt'] = 'Mailserver hostname'; $wb['aux_txt'] = 'Priorita'; $wb['ttl_txt'] = 'TTL'; $wb['active_txt'] = 'Attivo'; -$wb['limit_dns_record_txt'] = 'The max. number of DNS records raggiunto per il tuo account.'; -$wb['no_zone_perm'] = 'You do not have the permission to add a record to this DNS zone.'; -$wb['name_error_empty'] = 'The hostname vuoto.'; -$wb['name_error_regex'] = 'The hostname has the wrong format.'; -$wb['data_error_empty'] = 'Mailserver hostname empty'; -$wb['data_error_regex'] = 'Mailserver hostname format invalid'; -$wb['duplicate_mx_record_txt'] = 'Duplicate MX record.'; -$wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; +$wb['limit_dns_record_txt'] = 'Hai raggiunto il massimo numero di record DNS per il tuo profilo.'; +$wb['no_zone_perm'] = 'Non hai il permesso di aggiungere record a questa zona DNS.'; +$wb['name_error_empty'] = 'Campo hostname è vuoto.'; +$wb['name_error_regex'] = 'L\'hostname ha un formato errato.'; +$wb['data_error_empty'] = 'hostname del Mailserver vuoto'; +$wb['data_error_regex'] = 'L\'hostname del Mailserver ha un formato non valido'; +$wb['duplicate_mx_record_txt'] = 'record MX Duplicato.'; +$wb['ttl_range_error'] = 'Minimo TTL è 60 secondi.'; ?> diff --git a/interface/web/dns/lib/lang/it_dns_naptr.lng b/interface/web/dns/lib/lang/it_dns_naptr.lng index b39373c13de1d5b288b85d4ebeef8696a09d3af6..124897d5967a3b413c75fbd28c1a0bd6294a661b 100644 --- a/interface/web/dns/lib/lang/it_dns_naptr.lng +++ b/interface/web/dns/lib/lang/it_dns_naptr.lng @@ -1,21 +1,21 @@ <?php $wb['server_id_txt'] = 'Server'; -$wb['zone_txt'] = 'Zone'; +$wb['zone_txt'] = 'Zona'; $wb['name_txt'] = 'Hostname'; -$wb['order_txt'] = 'Order'; +$wb['order_txt'] = 'Ordine'; $wb['pref_txt'] = 'Pref'; -$wb['flags_txt'] = 'Flags'; -$wb['service_txt'] = 'Service'; +$wb['flags_txt'] = 'Bandierine'; +$wb['service_txt'] = 'Servizio'; $wb['regexp_txt'] = 'RegExp'; -$wb['replacement_txt'] = 'Replacement'; +$wb['replacement_txt'] = 'Rimpiazzo'; $wb['ttl_txt'] = 'TTL'; -$wb['active_txt'] = 'Active'; -$wb['limit_dns_record_txt'] = 'The max. number of DNS records for your account is reached.'; -$wb['no_zone_perm'] = 'You do not have the permission to add a record to this DNS zone.'; -$wb['name_error_empty'] = 'The hostname is empty.'; -$wb['name_error_regex'] = 'The hostname has the wrong format.'; -$wb['data_error_empty'] = 'NAPTR record is empty.'; -$wb['naptr_error_regex'] = 'Invalid NAPTR record. The NAPTR record must include Order, Pref and either Regex or Replacement.'; -$wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; -$wb['record_parse_error'] = 'Could not parse the record found in database.'; +$wb['active_txt'] = 'Attivo'; +$wb['limit_dns_record_txt'] = 'Hai raggiunto il numero massimo di record DNS per il tuo profilo.'; +$wb['no_zone_perm'] = 'Non sei abilitato ad aggiungere record a questa zona DNS.'; +$wb['name_error_empty'] = 'il campo hostnome è vuoto.'; +$wb['name_error_regex'] = 'L\'hostname ha formato errato.'; +$wb['data_error_empty'] = 'Il record NAPTR è vuoto.'; +$wb['naptr_error_regex'] = 'record NAPTR non valido. Il record NAPTR deve includere Ordine, Pref e o Regex oppure Rimpiazzo.'; +$wb['ttl_range_error'] = 'Minimo TTL è 60 secondi.'; +$wb['record_parse_error'] = 'Non ho posso gestire il record trovato nel database.'; ?> diff --git a/interface/web/dns/lib/lang/it_dns_ns.lng b/interface/web/dns/lib/lang/it_dns_ns.lng index 4ee8be59c81a2007e78d2467fa59e29c7a53de29..03f22816959e9e1908a9834fece4b19588a8b51c 100644 --- a/interface/web/dns/lib/lang/it_dns_ns.lng +++ b/interface/web/dns/lib/lang/it_dns_ns.lng @@ -6,11 +6,11 @@ $wb['type_txt'] = 'type'; $wb['data_txt'] = 'Hostname'; $wb['ttl_txt'] = 'TTL'; $wb['active_txt'] = 'Attivo'; -$wb['limit_dns_record_txt'] = 'Numero massimo record DNS raggiunto per il tuo account.'; +$wb['limit_dns_record_txt'] = 'Numero massimo record DNS raggiunto per il tuo profilo.'; $wb['no_zone_perm'] = 'Non hai i permessi per aggiungere record a questa zona DNS.'; $wb['name_error_empty'] = 'Zona vuota.'; $wb['name_error_regex'] = 'La zona ha un formato errato.'; $wb['data_error_empty'] = 'Nameserver vuoto'; $wb['data_error_regex'] = 'Formato nameserver non valido'; -$wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; +$wb['ttl_range_error'] = 'Minimo TTL è 60 secondi.'; ?> diff --git a/interface/web/dns/lib/lang/it_dns_ptr.lng b/interface/web/dns/lib/lang/it_dns_ptr.lng index 0da6da4366032a69dab54da46cf416511b93890c..ea301501165be7e89b40d4b403584e8852096d2e 100644 --- a/interface/web/dns/lib/lang/it_dns_ptr.lng +++ b/interface/web/dns/lib/lang/it_dns_ptr.lng @@ -1,16 +1,16 @@ <?php $wb['server_id_txt'] = 'Server'; -$wb['zone_txt'] = 'Zone'; +$wb['zone_txt'] = 'Zonae'; $wb['name_txt'] = 'Nome'; $wb['type_txt'] = 'tipo'; -$wb['data_txt'] = 'Canonical Hostname'; +$wb['data_txt'] = 'Hostname Canonico'; $wb['ttl_txt'] = 'TTL'; $wb['active_txt'] = 'Attivo'; -$wb['limit_dns_record_txt'] = 'The max. number of DNS records raggiunto per il tuo account.'; -$wb['no_zone_perm'] = 'You do not have the permission to add a record to this DNS zone.'; -$wb['name_error_empty'] = 'The name vuoto.'; -$wb['name_error_regex'] = 'The name has the wrong format.'; -$wb['data_error_empty'] = 'Canonical hostname empty'; -$wb['data_error_regex'] = 'Canonical hostname format invalid'; -$wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; +$wb['limit_dns_record_txt'] = 'il massimo numero of DNS records raggiunto per il tuo profilo.'; +$wb['no_zone_perm'] = 'Non sei abilitato ad aggiungere record a questa zona DNS.'; +$wb['name_error_empty'] = 'Il nome è vuoto.'; +$wb['name_error_regex'] = 'Il nome non è corretto.'; +$wb['data_error_empty'] = 'hostname Canonico è vuoto'; +$wb['data_error_regex'] = 'hostname Canonico non valido'; +$wb['ttl_range_error'] = 'Minimo TTL è 60 secondi.'; ?> diff --git a/interface/web/dns/lib/lang/it_dns_rp.lng b/interface/web/dns/lib/lang/it_dns_rp.lng index 691177bfe5783f3a74ff4823295fd6fe90f50964..fdeb758d54dd1a2fb90956790edc981dad6132b5 100644 --- a/interface/web/dns/lib/lang/it_dns_rp.lng +++ b/interface/web/dns/lib/lang/it_dns_rp.lng @@ -1,16 +1,16 @@ <?php $wb['server_id_txt'] = 'Server'; -$wb['zone_txt'] = 'Zone'; +$wb['zone_txt'] = 'Zona'; $wb['name_txt'] = 'Hostname'; $wb['type_txt'] = 'type'; -$wb['data_txt'] = 'Responsible Person'; +$wb['data_txt'] = 'Responsabile'; $wb['ttl_txt'] = 'TTL'; $wb['active_txt'] = 'Attivo'; -$wb['limit_dns_record_txt'] = 'The max. number of DNS records raggiunto per il tuo account.'; -$wb['no_zone_perm'] = 'You do not have the permission to add a record to this DNS zone.'; -$wb['name_error_empty'] = 'The hostname vuoto.'; -$wb['name_error_regex'] = 'The hostname has the wrong format.'; -$wb['data_error_empty'] = 'Responsible person field empty'; -$wb['data_error_regex'] = 'Responsible person field format invalid'; -$wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; +$wb['limit_dns_record_txt'] = 'Hai raggiunto il numero massimo di record DNS per il tuo profilo.'; +$wb['no_zone_perm'] = 'Non hai il permesso di aggiungere record a questa zona DNS.'; +$wb['name_error_empty'] = 'L\'hostname è vuoto.'; +$wb['name_error_regex'] = 'L\'hostname ha un formato errato.'; +$wb['data_error_empty'] = 'Campo Responsabile vuoto'; +$wb['data_error_regex'] = 'Campo Responsabile con formato errato'; +$wb['ttl_range_error'] = 'Min. TTL è 60 secondi.'; ?> diff --git a/interface/web/dns/lib/lang/it_dns_slave.lng b/interface/web/dns/lib/lang/it_dns_slave.lng index beae2824e47a1e280ae4a1dbe23cfb20607d547f..dd6ef101d9a2cd0bca7cdea6f6aec2e38c0eb3df 100644 --- a/interface/web/dns/lib/lang/it_dns_slave.lng +++ b/interface/web/dns/lib/lang/it_dns_slave.lng @@ -1,17 +1,17 @@ <?php $wb['server_id_txt'] = 'Server'; -$wb['origin_txt'] = 'DNS Zone'; +$wb['origin_txt'] = 'Zona DNS'; $wb['ns_txt'] = 'NS'; $wb['active_txt'] = 'Attivo'; -$wb['limit_dns_slave_zone_txt'] = 'The max. number of Secondary DNS zones raggiunto per il tuo account.'; +$wb['limit_dns_slave_zone_txt'] = 'Hai raggiunto il numero massimo di zone DNS secondarie per il tuo profilo.'; $wb['client_txt'] = 'Cliente'; -$wb['xfer_txt'] = 'Allow zone transfers to <br />these IPs (comma separated list)'; -$wb['server_id_error_empty'] = 'No server selected'; -$wb['origin_error_empty'] = 'Zone vuoto.'; -$wb['origin_error_unique'] = 'There is already a record for this zone.'; -$wb['origin_error_regex'] = 'Zone has a invalid format.'; -$wb['ns_error_regex'] = 'NS has a invalid format.'; -$wb['eg_domain_tld'] = 'e.g. domain.tld.'; -$wb['ipv4_form_txt'] = 'Separate multiple IPs with commas'; -$wb['secondary_zone_txt'] = 'Secondary DNS Zone'; +$wb['xfer_txt'] = 'Consenti il trasferimento di zona a <br />questi IP (lista indirizzi separati da virgola)'; +$wb['server_id_error_empty'] = 'Nessun server selezionato'; +$wb['origin_error_empty'] = 'Zona vuoto.'; +$wb['origin_error_unique'] = 'Esiste già un record per questa zona.'; +$wb['origin_error_regex'] = 'Zona ha un formato non valido.'; +$wb['ns_error_regex'] = 'NS ha un formato non valido.'; +$wb['eg_domain_tld'] = 'esempio: domain.tld.'; +$wb['ipv4_form_txt'] = 'Separare più indirizzi IP con virgola'; +$wb['secondary_zone_txt'] = 'Zona DNS Secondaria'; ?> diff --git a/interface/web/dns/lib/lang/it_dns_slave_admin_list.lng b/interface/web/dns/lib/lang/it_dns_slave_admin_list.lng index 726f14ffd3644fd628f8ead8529cbdd1919930b8..83658334025b2481f8c97769c89be09f0b20e682 100644 --- a/interface/web/dns/lib/lang/it_dns_slave_admin_list.lng +++ b/interface/web/dns/lib/lang/it_dns_slave_admin_list.lng @@ -1,10 +1,10 @@ <?php -$wb['list_head_txt'] = 'Secondary DNS-Zones'; +$wb['list_head_txt'] = 'DNS-Zona Secondaria'; $wb['active_txt'] = 'Attivo'; $wb['server_id_txt'] = 'Server'; $wb['origin_txt'] = 'Zone'; $wb['ns_txt'] = 'NS'; -$wb['add_new_record_txt'] = 'Aggiungi un nuovo Secondary DNS-Zone'; -$wb['eg_domain_tld'] = 'e.g. domain.tld.'; +$wb['add_new_record_txt'] = 'Aggiungi una nuova DNS-Zona secondaria'; +$wb['eg_domain_tld'] = 'esempio: domain.tld.'; $wb['sys_groupid_txt'] = 'Cliente'; ?> diff --git a/interface/web/dns/lib/lang/it_dns_slave_list.lng b/interface/web/dns/lib/lang/it_dns_slave_list.lng index 3ab1a1de9d48170eebcb01f86333d5faedc0ed52..2edbc37e2e0ce824596033ca5c005491775dfe20 100644 --- a/interface/web/dns/lib/lang/it_dns_slave_list.lng +++ b/interface/web/dns/lib/lang/it_dns_slave_list.lng @@ -5,5 +5,5 @@ $wb['server_id_txt'] = 'Server'; $wb['origin_txt'] = 'Zona'; $wb['ns_txt'] = 'NS'; $wb['add_new_record_txt'] = 'Aggiungi una nuova zona DNS Secondaria'; -$wb['eg_domain_tld'] = 'e.g. domain.tld.'; +$wb['eg_domain_tld'] = 'esempio: domain.tld.'; ?> diff --git a/interface/web/dns/lib/lang/it_dns_soa.lng b/interface/web/dns/lib/lang/it_dns_soa.lng index 714c6c70566c3af03ee5395ccc5790a8b86273c9..41c900e3988f7fed3755cb6273f0547fe7188faf 100644 --- a/interface/web/dns/lib/lang/it_dns_soa.lng +++ b/interface/web/dns/lib/lang/it_dns_soa.lng @@ -4,16 +4,16 @@ $wb['origin_txt'] = 'Zona (SOA)'; $wb['ns_txt'] = 'NS'; $wb['mbox_txt'] = 'Email'; $wb['serial_txt'] = 'Seriale'; -$wb['refresh_txt'] = 'Refresh'; -$wb['retry_txt'] = 'Retry'; -$wb['expire_txt'] = 'Expire'; -$wb['minimum_txt'] = 'Minimum (negative cache ttl)'; +$wb['refresh_txt'] = 'Aggiornamento'; +$wb['retry_txt'] = 'Ritenta'; +$wb['expire_txt'] = 'Scade'; +$wb['minimum_txt'] = 'Minimo (cache ttl negativa)'; $wb['ttl_txt'] = 'TTL'; $wb['xfer_txt'] = 'Consenti trasferimento zone a <br />questi IP (elenco separato da virgola)'; $wb['active_txt'] = 'Attivo'; -$wb['limit_dns_zone_txt'] = 'Numero massimo zone DNS raggiunto per il tuo account.'; +$wb['limit_dns_zone_txt'] = 'Numero massimo zone DNS raggiunto per il tuo profilo.'; $wb['client_txt'] = 'Cliente'; -$wb['no_zone_perm'] = 'You do not have the permission to add a record to this DNS zone.'; +$wb['no_zone_perm'] = 'Non hai il permesso di aggiungere record DNZ a questa zona.'; $wb['server_id_error_empty'] = 'Nessun server selezionato!'; $wb['origin_error_empty'] = 'Zona vuoto.'; $wb['origin_error_unique'] = 'Esiste già un record per questa zona.'; @@ -21,25 +21,27 @@ $wb['origin_error_regex'] = 'La zona ha un formato errato.'; $wb['ns_error_regex'] = 'NS ha un formato errato.'; $wb['mbox_error_empty'] = 'Email vuoto.'; $wb['mbox_error_regex'] = 'Email formato errato.'; -$wb['also_notify_txt'] = 'Also Notify'; -$wb['update_acl_txt'] = 'Aggiorna ACL'; +$wb['also_notify_txt'] = 'Notifica anche'; +$wb['update_acl_txt'] = 'Aggiorna ACL'; $wb['also_notify_error_regex'] = 'Per favore utilizza un indirizzo IP.'; $wb['seconds_txt'] = 'Secondi'; -$wb['eg_domain_tld'] = 'e.g. domain.tld'; -$wb['eg_ns1_domain_tld'] = 'e.g. ns1.domain.tld'; -$wb['eg_webmaster_domain_tld'] = 'e.g. webmaster@domain.tld'; -$wb['The Domain can not be changed. Please ask your Administrator if you want to change the domain name.'] = 'Il dominio non può essere modificato. Per cortesia contatta l'; -$wb['refresh_range_error'] = 'Min. Refresh time di 60 secondi.'; -$wb['retry_range_error'] = 'Min. Retry time di 60 secondi.'; -$wb['expire_range_error'] = 'Min. Expire time di 60 secondi.'; -$wb['minimum_range_error'] = 'Min. Minimum time di 60 secondi.'; -$wb['ttl_range_error'] = 'Min. TTL time di 60 secondi.'; -$wb['xfer_error_regex'] = 'Also notify: Per cortesia utilizzare un indirizzo IP.'; +$wb['eg_domain_tld'] = 'esempio: domain.tld'; +$wb['eg_ns1_domain_tld'] = 'esempio: ns1.domain.tld'; +$wb['eg_webmaster_domain_tld'] = 'esempio: webmaster@domain.tld'; +$wb['The Domain can not be changed. Please ask your Administrator if you want to change the domain name.'] = 'Il dominio non può essere modificato. Per cortesia contatta l\'amministratore se vuoi cambiare il nome di dominio.'; +$wb['refresh_range_error'] = 'Minimo intevallo di aggiornamento di 60 secondi.'; +$wb['retry_range_error'] = 'Minimo intervallo di riprova di 60 secondi.'; +$wb['expire_range_error'] = 'Minimo tempo di scadenza di 60 secondi.'; +$wb['minimum_range_error'] = 'Minimo tempo di 60 secondi.'; +$wb['ttl_range_error'] = 'Min. TTL di 60 secondi.'; +$wb['xfer_error_regex'] = 'Notifica anche: Per cortesia utilizzare un indirizzo IP.'; $wb['dnssec_info_txt'] = 'DNSSEC DS-Data for registry'; -$wb['dnssec_wanted_txt'] = 'Sign zone (DNSSEC)'; -$wb['dnssec_wanted_info'] = 'When disabling DNSSEC keys are not going to be deleted if DNSSEC was enabled before and keys already have been generated but the zone will no longer be delivered in signed format afterwards. If you use PowerDNS, keys WILL be deleted!'; -$wb['error_not_allowed_server_id'] = 'The selected server is not allowed for this account.'; -$wb['soa_cannot_be_changed_txt'] = 'Die Zone (SOA) kann nicht verändert werden. Bitte kontaktieren Sie ihren Administrator, um die Zone zu ändern.'; -$wb['configuration_error_txt'] = 'CONFIGURATION ERROR'; -$wb['dnssec_algo_txt'] = 'DNSSEC Algorithm'; +$wb['dnssec_wanted_txt'] = 'Firma la zona (DNSSEC)'; +$wb['dnssec_wanted_info'] = 'Quando viene disabilitata la DNSSEC le chiavi non vengono cancellate se erano già state generate ma la zona sarà distribuita in formato non firmato. Se si usa PowerDNS le chiavi verranno cancellate!'; +$wb['error_not_allowed_server_id'] = 'Il server selezionato non è abilitato per il tuo profilo.'; +$wb['soa_cannot_be_changed_txt'] = 'La zona SOA non può essere modificata. Contatta l\'Amministratore se hai necessità di fare la modifica.'; +$wb['configuration_error_txt'] = 'ERRORE DI CONFIGURATIONE'; +$wb['dnssec_algo_txt'] = 'Algoritmo DNSSEC'; +$wb['rendered_zone_txt'] = 'Bind zone format for reference and export.'; +$wb['rendered_zone_unavailable_txt'] = 'Sorry, no data is available yet.'; ?> diff --git a/interface/web/dns/lib/lang/it_dns_soa_admin_list.lng b/interface/web/dns/lib/lang/it_dns_soa_admin_list.lng index a7cce01001635072dd68f5d074fd4b22d1f1381d..22ecde574e06efe80d97a639b7ac8a234d938122 100644 --- a/interface/web/dns/lib/lang/it_dns_soa_admin_list.lng +++ b/interface/web/dns/lib/lang/it_dns_soa_admin_list.lng @@ -1,12 +1,12 @@ <?php -$wb['list_head_txt'] = 'DNS-Zones'; +$wb['list_head_txt'] = 'Zone DNS'; $wb['active_txt'] = 'Attivo'; $wb['server_id_txt'] = 'Server'; -$wb['origin_txt'] = 'Zone'; +$wb['origin_txt'] = 'Zona'; $wb['ns_txt'] = 'NS'; $wb['mbox_txt'] = 'Email'; -$wb['add_new_record_wizard_txt'] = 'Aggiungi un nuovo DNS Zone with Wizard'; +$wb['add_new_record_wizard_txt'] = 'Aggiungi una nuova Zona DNS con la procedura guidata'; $wb['add_new_record_txt'] = 'Aggiungi un nuovo DNS Zone manually'; -$wb['import_zone_file_txt'] = 'Import Zone File'; +$wb['import_zone_file_txt'] = 'Importa file di Zona'; $wb['sys_groupid_txt'] = 'Cliente'; ?> diff --git a/interface/web/dns/lib/lang/it_dns_soa_list.lng b/interface/web/dns/lib/lang/it_dns_soa_list.lng index 0e5ea645697fbf5ec9f996cc98884a82e6d1cc01..713e0149f6879789bcd83bf6044eb6551dca9393 100644 --- a/interface/web/dns/lib/lang/it_dns_soa_list.lng +++ b/interface/web/dns/lib/lang/it_dns_soa_list.lng @@ -1,11 +1,11 @@ <?php -$wb['list_head_txt'] = 'DNS Zones'; +$wb['list_head_txt'] = 'Zona DNS'; $wb['active_txt'] = 'Attivo'; $wb['server_id_txt'] = 'Server'; -$wb['origin_txt'] = 'Zone'; +$wb['origin_txt'] = 'Zona'; $wb['ns_txt'] = 'NS'; $wb['mbox_txt'] = 'Email'; -$wb['add_new_record_txt'] = 'Aggiungi un nuovo DNS Zone (SOA)'; -$wb['add_new_record_wizard_txt'] = 'Aggiungi un nuova nuova Zona DNS con il configuratore automatico'; -$wb['import_zone_file_txt'] = 'Import Zone File'; +$wb['add_new_record_txt'] = 'Aggiungi una nuova Zona DNS (SOA)'; +$wb['add_new_record_wizard_txt'] = 'Aggiungi un nuova nuova Zona DNS con la procedura guidata'; +$wb['import_zone_file_txt'] = 'Importa file di Zona'; ?> diff --git a/interface/web/dns/lib/lang/it_dns_spf.lng b/interface/web/dns/lib/lang/it_dns_spf.lng index 0cbf77862f6619ad477913cefb5c4b5e248ddae6..3c707f0013aa007632cf69547a179280fbd077d7 100644 --- a/interface/web/dns/lib/lang/it_dns_spf.lng +++ b/interface/web/dns/lib/lang/it_dns_spf.lng @@ -1,30 +1,30 @@ <?php $wb['data_txt'] = 'SPF-Record'; $wb['name_txt'] = 'Hostname'; -$wb['spf_mechanism_txt'] = 'SPF Mechanism'; -$wb['spf_mechanism_pass_txt'] = 'Pass - allow mail from other senders'; -$wb['spf_mechanism_fail_txt'] = 'Fail - reject mail from other senders'; -$wb['spf_mechanism_softfail_txt'] = 'SoftFail - allow mail from other senders but mark the email'; -$wb['spf_mechanism_neutral_txt'] = 'Neutral - do nothing'; -$wb['spf_mx_txt'] = 'Allow servers listed as MX to send email for this domain'; -$wb['spf_a_txt'] = 'Allow current IP address of the domain to send email for this domain'; -$wb['spf_ip_txt'] = 'Additional IP addresses in CIDR format that deliver or relay mail for this domain'; -$wb['spf_ip_note_txt'] = '(Sepearate IPs with whitespaces)'; -$wb['spf_invalid_ip_txt'] = 'Invalid IP-address'; -$wb['spf_hostname_txt'] = 'Any other server hostname that may deliver or relay mail for this domain'; -$wb['spf_hostname_note_txt'] = '(Sepearate hostnames with whitespaces)'; -$wb['spf_invalid_hostname_txt'] = 'Invalid hostname'; -$wb['spf_domain_txt'] = 'Any domains that may deliver or relay mail for this domain'; -$wb['spf_domain_note_txt'] = '(Sepearate domains with whitespaces)'; -$wb['spf_invalid_domain_txt'] = 'Invalid domainname'; +$wb['spf_mechanism_txt'] = 'Meccanismo SPF'; +$wb['spf_mechanism_pass_txt'] = 'Superato - consente mail dai mittenti'; +$wb['spf_mechanism_fail_txt'] = 'Fallito - rifiuta mail dai mittenti'; +$wb['spf_mechanism_softfail_txt'] = 'Intermedio - consente mail da altri mittenti ma contrassegna la mail'; +$wb['spf_mechanism_neutral_txt'] = 'Neutrale - nessuna azione'; +$wb['spf_mx_txt'] = 'Consenti ai server elencati come MX di inviare email per questo dominio'; +$wb['spf_a_txt'] = 'Consenti all\'indirizzo IP del dominio di inviare email per questo dominio'; +$wb['spf_ip_txt'] = 'Indirizzi IP aggiuntivi in formato CIDR che consegnano o rilanciano mail per questo dominio'; +$wb['spf_ip_note_txt'] = '(Sepearare gli indirizzi IP con spazi)'; +$wb['spf_invalid_ip_txt'] = 'Indirizzo IP non corretto'; +$wb['spf_hostname_txt'] = 'Qualunque nome server che può consegnare posta o rilanciare posta per questo dominio.'; +$wb['spf_hostname_note_txt'] = '(Sepearare i nomi con spazi)'; +$wb['spf_invalid_hostname_txt'] = 'nome host non valido'; +$wb['spf_domain_txt'] = 'Qualunque dominio che può consegnare o rilanciare posta per questo dominio'; +$wb['spf_domain_note_txt'] = '(Sepearare i domini con spazi)'; +$wb['spf_invalid_domain_txt'] = 'Nome dominio non valido'; $wb['ttl_txt'] = 'TTL'; -$wb['active_txt'] = 'Active'; -$wb['record_exists_txt'] = 'DNS-Record already exists'; -$wb['spf_record_exists_txt'] = 'SPF-Record already exists for hostname "{hostname}". Do you want to <a href="#" data-load-content="dns/dns_spf_edit.php?id={existing_record_id}">edit the existing record</a>?'; -$wb['spf_record_exists_multiple_txt'] = 'Multiple SPF-Records exist for hostname "{hostname}". This will cause recipients to reject your mail! Delete or merge duplicate existing records and try again.'; -$wb['limit_dns_record_txt'] = 'The max. number of DNS records for your account is reached.'; -$wb['no_zone_perm'] = 'You do not have the permission to add a record to this DNS zone.'; -$wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; -$wb['name_error_regex'] = 'The hostname has the wrong format.'; -$wb['btn_edit_as_txt_record_txt'] = 'Edit as TXT record'; +$wb['active_txt'] = 'Attivo'; +$wb['record_exists_txt'] = 'DNS-Record esite già '; +$wb['spf_record_exists_txt'] = 'SPF-Record esiste già per il nome host "{hostname}". Vuoi <a href="#" data-load-content="dns/dns_spf_edit.php?id={existing_record_id}">modificare il record esistente</a>?'; +$wb['spf_record_exists_multiple_txt'] = 'Sono presenti più record SPF per il nome host "{hostname}". Questo causerà il rifiuto delle mail da parte dei destinatari. Cancella o unisci i doppioni esistenti e prova di nuovo.'; +$wb['limit_dns_record_txt'] = 'Hai raggiunto il massimo numero di record DNS per il tuo profilo.'; +$wb['no_zone_perm'] = 'Non hai il permesso di aggiungere record a questa zona DNS.'; +$wb['ttl_range_error'] = 'Minimo TTL è 60 secondsi'; +$wb['name_error_regex'] = 'Il nome host ha un formato errato.'; +$wb['btn_edit_as_txt_record_txt'] = 'Modifica come record TXT'; ?> diff --git a/interface/web/dns/lib/lang/it_dns_srv.lng b/interface/web/dns/lib/lang/it_dns_srv.lng index 6d77d66e7f9e00341e40b65c2fd5f1278af28be8..33790bbad12386689a3c2e9f26c8c21596266e11 100644 --- a/interface/web/dns/lib/lang/it_dns_srv.lng +++ b/interface/web/dns/lib/lang/it_dns_srv.lng @@ -3,18 +3,18 @@ $wb['server_id_txt'] = 'Server'; $wb['zone_txt'] = 'Zona'; $wb['name_txt'] = 'Nome Host'; $wb['type_txt'] = 'tipo'; -$wb['target_txt'] = 'Target'; -$wb['weight_txt'] = 'Weight'; -$wb['port_txt'] = 'Port'; +$wb['target_txt'] = 'Obiettivo'; +$wb['weight_txt'] = 'Peso'; +$wb['port_txt'] = 'Porta'; $wb['ttl_txt'] = 'TTL'; $wb['active_txt'] = 'Attivo'; -$wb['limit_dns_record_txt'] = 'Limite massimo record DNS raggiunto per il tuo account.'; -$wb['no_zone_perm'] = 'You do not have the permission to add a record to this DNS zone.'; -$wb['name_error_empty'] = 'Nome Host vuoto.'; +$wb['limit_dns_record_txt'] = 'Limite massimo record DNS raggiunto per il tuo profilo.'; +$wb['no_zone_perm'] = 'Non hai il permesso di aggiungere un record a questa zona DNS.'; +$wb['name_error_empty'] = 'Nome Host vuoto.'; $wb['name_error_regex'] = 'Nome Host formato errato.'; -$wb['data_error_empty'] = 'Server record empty'; -$wb['data_error_regex'] = 'Server record format invalid'; -$wb['srv_error_regex'] = 'Invalid server record format. The server record must contain 3 text strings separated by spaces.'; +$wb['data_error_empty'] = 'Server record vuoto'; +$wb['data_error_regex'] = 'Server record formato non valido'; +$wb['srv_error_regex'] = 'Formato Record del server non valido. Il record del server deve contenre 3 stringhe di testo separate da spazio.'; $wb['aux_txt'] = 'Priorita'; -$wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; +$wb['ttl_range_error'] = 'Minimo TTL è 60 secondi.'; ?> diff --git a/interface/web/dns/lib/lang/it_dns_sshfp.lng b/interface/web/dns/lib/lang/it_dns_sshfp.lng index dc9ad9a00634513f03aec6da53682d2842bae7b6..e592105311f7c1e92cf061c5647d38648a088e94 100644 --- a/interface/web/dns/lib/lang/it_dns_sshfp.lng +++ b/interface/web/dns/lib/lang/it_dns_sshfp.lng @@ -1,16 +1,16 @@ <?php $wb['server_id_txt'] = 'Server'; -$wb['zone_txt'] = 'Zone'; +$wb['zone_txt'] = 'Zona'; $wb['name_txt'] = 'Hostname'; -$wb['type_txt'] = 'type'; -$wb['data_txt'] = 'Data'; +$wb['type_txt'] = 'tipo'; +$wb['data_txt'] = 'Dati'; $wb['ttl_txt'] = 'TTL'; -$wb['active_txt'] = 'Active'; -$wb['limit_dns_record_txt'] = 'The max. number of DNS records for your account is reached.'; -$wb['no_zone_perm'] = 'You do not have the permission to add a record to this DNS zone.'; -$wb['name_error_empty'] = 'The hostname is empty.'; -$wb['name_error_regex'] = 'The hostname has the wrong format.'; -$wb['data_error_empty'] = 'Text empty'; -$wb['data_error_regex'] = 'Text format invalid'; -$wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; +$wb['active_txt'] = 'Attiva'; +$wb['limit_dns_record_txt'] = 'Numero massimo record DNS raggiunto per il tuo profilo.'; +$wb['no_zone_perm'] = 'Non hai i permessi per aggiungere record a questa zona DNS.'; +$wb['name_error_empty'] = 'L\'hostname è vuoto.'; +$wb['name_error_regex'] = 'L\'hostname ha un formato errato.'; +$wb['data_error_empty'] = 'Testo vuoto'; +$wb['data_error_regex'] = 'Formato testo non valido'; +$wb['ttl_range_error'] = 'Minimo TTL 60 secondi.'; ?> diff --git a/interface/web/dns/lib/lang/it_dns_template.lng b/interface/web/dns/lib/lang/it_dns_template.lng index ee07983b288f7c321f2db10efeb68428e294715d..6abf3801dc28da21f16cc411ff67baeaa99405f7 100644 --- a/interface/web/dns/lib/lang/it_dns_template.lng +++ b/interface/web/dns/lib/lang/it_dns_template.lng @@ -1,7 +1,7 @@ <?php $wb['name_txt'] = 'Nome'; -$wb['fields_txt'] = 'Fields'; -$wb['template_txt'] = 'Template'; -$wb['visible_txt'] = 'Visible'; -$wb['placeholder_txt'] = 'Placeholder'; +$wb['fields_txt'] = 'Campi'; +$wb['template_txt'] = 'Modello'; +$wb['visible_txt'] = 'Visibile'; +$wb['placeholder_txt'] = 'Segnaposto'; ?> diff --git a/interface/web/dns/lib/lang/it_dns_template_list.lng b/interface/web/dns/lib/lang/it_dns_template_list.lng index 0d316c562946e0263310ac35f5fba92051e1fd2d..f68205327a75df8a778ead692913fe1cfbdf9cdc 100644 --- a/interface/web/dns/lib/lang/it_dns_template_list.lng +++ b/interface/web/dns/lib/lang/it_dns_template_list.lng @@ -1,6 +1,6 @@ <?php -$wb['list_head_txt'] = 'DNS Wizard Modello'; +$wb['list_head_txt'] = 'Procedura guidata Modello DNS'; $wb['visible_txt'] = 'Visibile'; $wb['name_txt'] = 'Nome'; -$wb['add_new_record_txt'] = 'Aggiungi un nuovo record'; +$wb['add_new_record_txt'] = 'Aggiungi un nuovo record'; ?> diff --git a/interface/web/dns/lib/lang/it_dns_tlsa.lng b/interface/web/dns/lib/lang/it_dns_tlsa.lng index 3b87e2ad5987236e2159ce12b7494c89d15a6250..762235dc394ed8aac20bb9a77cad894982eba2b3 100644 --- a/interface/web/dns/lib/lang/it_dns_tlsa.lng +++ b/interface/web/dns/lib/lang/it_dns_tlsa.lng @@ -1,16 +1,16 @@ <?php $wb['server_id_txt'] = 'Server'; -$wb['zone_txt'] = 'Zone'; -$wb['name_txt'] = 'Service-Descriptor'; -$wb['type_txt'] = 'type'; -$wb['data_txt'] = 'TLSA-Data'; +$wb['zone_txt'] = 'Zona'; +$wb['name_txt'] = 'Descrizione-Servizio'; +$wb['type_txt'] = 'Tipo'; +$wb['data_txt'] = 'Dati TLSA'; $wb['ttl_txt'] = 'TTL'; -$wb['active_txt'] = 'Active'; -$wb['limit_dns_record_txt'] = 'The max. number of DNS records for your account is reached.'; -$wb['no_zone_perm'] = 'You do not have the permission to add a record to this DNS zone.'; -$wb['name_error_empty'] = 'The hostname is empty.'; -$wb['name_error_regex'] = 'The hostname has the wrong format. Correct: _<port>._(tcp|udp).<hostname>'; -$wb['data_error_empty'] = 'TLSA-Data empty'; -$wb['data_error_regex'] = 'TLSA dataformat is wrong. Correct: n n n HASH'; -$wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; +$wb['active_txt'] = 'Attivo'; +$wb['limit_dns_record_txt'] = 'Hai raggiunto il massimo numero di record DNS per il tuo profilo.'; +$wb['no_zone_perm'] = 'Non hai il permesso di aggiungere record a questa zona DNS.'; +$wb['name_error_empty'] = 'Il campo hostname è vuoto.'; +$wb['name_error_regex'] = 'L\'hostname ha un formato errato. Corretto: _<port>._(tcp|udp).<hostname>'; +$wb['data_error_empty'] = 'Dati TLSA vuoto'; +$wb['data_error_regex'] = 'Formato dati TLSA scorretto. Corretto: n n n HASH'; +$wb['ttl_range_error'] = 'Minimo TTL è 60 secondi.'; ?> diff --git a/interface/web/dns/lib/lang/it_dns_txt.lng b/interface/web/dns/lib/lang/it_dns_txt.lng index de49712afdfd550ee9bab76c785ff29453c8c6c2..5b184ed262488698c342d5756b367d4e6e5af129 100644 --- a/interface/web/dns/lib/lang/it_dns_txt.lng +++ b/interface/web/dns/lib/lang/it_dns_txt.lng @@ -1,19 +1,19 @@ <?php $wb['server_id_txt'] = 'Server'; -$wb['zone_txt'] = 'Zone'; +$wb['zone_txt'] = 'Zona'; $wb['name_txt'] = 'Hostname'; -$wb['type_txt'] = 'type'; -$wb['data_txt'] = 'Text'; +$wb['type_txt'] = 'tipo'; +$wb['data_txt'] = 'Testo'; $wb['ttl_txt'] = 'TTL'; $wb['active_txt'] = 'Attivo'; -$wb['limit_dns_record_txt'] = 'The max. number of DNS records raggiunto per il tuo account.'; -$wb['no_zone_perm'] = 'You do not have the permission to add a record to this DNS zone.'; -$wb['name_error_empty'] = 'The hostname vuoto.'; -$wb['name_error_regex'] = 'The hostname has the wrong format.'; -$wb['data_error_empty'] = 'Text empty'; -$wb['data_error_regex'] = 'Text format invalid'; -$wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; -$wb['invalid_type_dkim'] = 'DKIM is not allowed. Use the DKIM button'; +$wb['limit_dns_record_txt'] = 'Hai raggiunto il massimo numero di record DNS per il tuo profilo.'; +$wb['no_zone_perm'] = 'Non hai il permesso di aggiungere record a questa zona DNS.'; +$wb['name_error_empty'] = 'Campo hostname vuoto.'; +$wb['name_error_regex'] = 'L\'hostname ha un formato non valido.'; +$wb['data_error_empty'] = 'Testo vuoto'; +$wb['data_error_regex'] = 'Formato testo non valido'; +$wb['ttl_range_error'] = 'Minimo TTL è 60 secondi.'; +$wb['invalid_type_dkim'] = 'DKIM non consentito. Usare il tasto DKIM'; $wb['invalid_type_dmarc'] = 'DMARC is not allowed. Use the DMARC button'; -$wb['invalid_type_spf'] = 'SPF is not allowed. Use the SPF button.'; +$wb['invalid_type_spf'] = 'SPF non è consentito. Usare il tasto SPF.'; ?> diff --git a/interface/web/dns/lib/lang/it_dns_wizard.lng b/interface/web/dns/lib/lang/it_dns_wizard.lng index 4174b0c5c47727008687ac11da564285c091c2b0..4ea81375ec05725805c9e64239160a0eab0e8a92 100644 --- a/interface/web/dns/lib/lang/it_dns_wizard.lng +++ b/interface/web/dns/lib/lang/it_dns_wizard.lng @@ -12,10 +12,10 @@ $wb['ip_txt'] = 'Indirizzo IP'; $wb['error_origin_empty'] = 'Origine vuoto.'; $wb['error_ns_empty'] = 'NS vuoto.'; $wb['error_mbox_empty'] = 'Casella Mail vuoto.'; -$wb['error_refresh_empty'] = 'Refresh vuoto.'; -$wb['error_retry_empty'] = 'Retry vuoto.'; -$wb['error_expire_empty'] = 'Expire vuoto.'; -$wb['error_minimum_empty'] = 'Minimum vuoto.'; +$wb['error_refresh_empty'] = 'Aggiorna vuoto.'; +$wb['error_retry_empty'] = 'Riprova vuoto.'; +$wb['error_expire_empty'] = 'Scade vuoto.'; +$wb['error_minimum_empty'] = 'Minimo vuoto.'; $wb['error_ttl_empty'] = 'TTL vuoto.'; $wb['error_domain_empty'] = 'Dominio vuoto'; $wb['error_ip_empty'] = 'IP vuoto.'; @@ -25,21 +25,21 @@ $wb['error_email_empty'] = 'EMail vuoto.'; $wb['error_domain_regex'] = 'Dominio contiene caratteri non validi.'; $wb['error_ns1_regex'] = 'NS1 contiene caratteri non validi.'; $wb['error_ns2_regex'] = 'NS2 contiene caratteri non validi.'; -$wb['error_email_regex'] = 'Email does not contain a valid email address.'; -$wb['dns_zone_txt'] = 'DNS Zone'; +$wb['error_email_regex'] = 'Email non contiene un indirizzo mail valido.'; +$wb['dns_zone_txt'] = 'Zona DNS'; $wb['globalsearch_resultslimit_of_txt'] = 'di'; $wb['globalsearch_resultslimit_results_txt'] = 'risultati'; $wb['globalsearch_noresults_text_txt'] = 'Nessun risultato.'; $wb['globalsearch_noresults_limit_txt'] = '0 risultati'; $wb['globalsearch_searchfield_watermark_txt'] = 'Cerca'; $wb['globalsearch_suggestions_text_txt'] = 'Suggerimenti'; -$wb['list_head_txt'] = 'Wizard Zone DNS'; +$wb['list_head_txt'] = 'Procedura guidata Zona DNS'; $wb['list_desc_txt'] = 'Crea una zona DNS con un configuratore automatico'; -$wb['dkim_txt'] = 'DKIM enabled'; -$wb['ipv6_txt'] = 'IPv6 Address'; -$wb['error_ipv6_empty'] = 'IPv6 empty.'; -$wb['error_no_server_id'] = 'No server provided.'; -$wb['error_not_allowed_server_id'] = 'The selected server is not allowed for this account.'; -$wb['dnssec_txt'] = 'Sign zone (DNSSEC)'; -$wb['limit_dns_zone_txt'] = 'The max. number of DNS zones for your account is reached.'; +$wb['dkim_txt'] = 'DKIM Abilitato'; +$wb['ipv6_txt'] = 'Indirizzo IPv6'; +$wb['error_ipv6_empty'] = 'IPv6 vuoto.'; +$wb['error_no_server_id'] = 'Nessun server indicato.'; +$wb['error_not_allowed_server_id'] = 'Il server selezionato non è abilitato per il tuo profilo.'; +$wb['dnssec_txt'] = 'Firma zona (DNSSEC)'; +$wb['limit_dns_zone_txt'] = 'Hai raggiunto il massimo numero di zone DNS per il tuo profilo.'; ?> diff --git a/interface/web/dns/lib/lang/ja_dns_soa.lng b/interface/web/dns/lib/lang/ja_dns_soa.lng index a2e5e20c7158043476967e5cbda49544a7abf3fa..70d9414d26630f1e1ec4bd5ad1ca55c99b549fce 100644 --- a/interface/web/dns/lib/lang/ja_dns_soa.lng +++ b/interface/web/dns/lib/lang/ja_dns_soa.lng @@ -42,4 +42,6 @@ $wb['error_not_allowed_server_id'] = 'The selected server is not allowed for thi $wb['soa_cannot_be_changed_txt'] = 'Die Zone (SOA) kann nicht verändert werden. Bitte kontaktieren Sie ihren Administrator, um die Zone zu ändern.'; $wb['configuration_error_txt'] = 'CONFIGURATION ERROR'; $wb['dnssec_algo_txt'] = 'DNSSEC Algorithm'; +$wb['rendered_zone_txt'] = 'Bind zone format for reference and export.'; +$wb['rendered_zone_unavailable_txt'] = 'Sorry, no data is available yet.'; ?> diff --git a/interface/web/dns/lib/lang/nl_dns_soa.lng b/interface/web/dns/lib/lang/nl_dns_soa.lng index 2b2b734e3ba778d49b6ebf661741e34d89565596..fda742cf148adb12a11d72467e04746023e14ed4 100644 --- a/interface/web/dns/lib/lang/nl_dns_soa.lng +++ b/interface/web/dns/lib/lang/nl_dns_soa.lng @@ -42,4 +42,6 @@ $wb['error_not_allowed_server_id'] = 'The selected server is not allowed for thi $wb['soa_cannot_be_changed_txt'] = 'Die Zone (SOA) kann nicht verändert werden. Bitte kontaktieren Sie ihren Administrator, um die Zone zu ändern.'; $wb['configuration_error_txt'] = 'CONFIGURATION ERROR'; $wb['dnssec_algo_txt'] = 'DNSSEC Algorithm'; +$wb['rendered_zone_txt'] = 'Bind zone format ter referentie en export.'; +$wb['rendered_zone_unavailable_txt'] = 'Sorry, er is nog geen data beschikbaar.'; ?> diff --git a/interface/web/dns/lib/lang/pl_dns_soa.lng b/interface/web/dns/lib/lang/pl_dns_soa.lng index 7502a592372707764358fde63333b8ef0938ee9d..d83e0aeeb0e18a392e71238fa021436365166b0e 100644 --- a/interface/web/dns/lib/lang/pl_dns_soa.lng +++ b/interface/web/dns/lib/lang/pl_dns_soa.lng @@ -42,4 +42,6 @@ $wb['error_not_allowed_server_id'] = 'The selected server is not allowed for thi $wb['soa_cannot_be_changed_txt'] = 'Die Zone (SOA) kann nicht verändert werden. Bitte kontaktieren Sie ihren Administrator, um die Zone zu ändern.'; $wb['configuration_error_txt'] = 'CONFIGURATION ERROR'; $wb['dnssec_algo_txt'] = 'DNSSEC Algorithm'; +$wb['rendered_zone_txt'] = 'Bind zone format for reference and export.'; +$wb['rendered_zone_unavailable_txt'] = 'Sorry, no data is available yet.'; ?> diff --git a/interface/web/dns/lib/lang/pt_dns_soa.lng b/interface/web/dns/lib/lang/pt_dns_soa.lng index 7d4c692855ed4a70dcc01e7d1026ce7e48bd2fa5..e1e8490b7d04fde56e5dbd625410c6bb753bfdcd 100644 --- a/interface/web/dns/lib/lang/pt_dns_soa.lng +++ b/interface/web/dns/lib/lang/pt_dns_soa.lng @@ -42,4 +42,6 @@ $wb['error_not_allowed_server_id'] = 'The selected server is not allowed for thi $wb['soa_cannot_be_changed_txt'] = 'Die Zone (SOA) kann nicht verändert werden. Bitte kontaktieren Sie ihren Administrator, um die Zone zu ändern.'; $wb['configuration_error_txt'] = 'CONFIGURATION ERROR'; $wb['dnssec_algo_txt'] = 'DNSSEC Algorithm'; +$wb['rendered_zone_txt'] = 'Bind zone format for reference and export.'; +$wb['rendered_zone_unavailable_txt'] = 'Sorry, no data is available yet.'; ?> diff --git a/interface/web/dns/lib/lang/ro_dns_soa.lng b/interface/web/dns/lib/lang/ro_dns_soa.lng index f1125b698158d055447ecff1240a4c6cac481d0c..87382ffa6fb46947058476641213235176e4ded6 100644 --- a/interface/web/dns/lib/lang/ro_dns_soa.lng +++ b/interface/web/dns/lib/lang/ro_dns_soa.lng @@ -42,4 +42,6 @@ $wb['error_not_allowed_server_id'] = 'The selected server is not allowed for thi $wb['soa_cannot_be_changed_txt'] = 'Die Zone (SOA) kann nicht verändert werden. Bitte kontaktieren Sie ihren Administrator, um die Zone zu ändern.'; $wb['configuration_error_txt'] = 'CONFIGURATION ERROR'; $wb['dnssec_algo_txt'] = 'DNSSEC Algorithm'; +$wb['rendered_zone_txt'] = 'Bind zone format for reference and export.'; +$wb['rendered_zone_unavailable_txt'] = 'Sorry, no data is available yet.'; ?> diff --git a/interface/web/dns/lib/lang/ru_dns_soa.lng b/interface/web/dns/lib/lang/ru_dns_soa.lng index f6043010d4e021d4d677e6fca002456e924cb3f3..36a4c89cdf10d503eb5b1ca05b8d3b2626167dfe 100644 --- a/interface/web/dns/lib/lang/ru_dns_soa.lng +++ b/interface/web/dns/lib/lang/ru_dns_soa.lng @@ -42,4 +42,6 @@ $wb['error_not_allowed_server_id'] = 'Выбранный Ñервер не до $wb['soa_cannot_be_changed_txt'] = 'Зона (SOA) не может быть изменена. ПожалуйÑта, обратитеÑÑŒ к админиÑтратору, чтобы изменить зону.'; $wb['configuration_error_txt'] = 'ОШИБКРКОÐФИГУРÐЦИИ'; $wb['dnssec_algo_txt'] = 'DNSSEC Algorithm'; +$wb['rendered_zone_txt'] = 'Bind zone format for reference and export.'; +$wb['rendered_zone_unavailable_txt'] = 'Sorry, no data is available yet.'; ?> diff --git a/interface/web/dns/lib/lang/se_dns_soa.lng b/interface/web/dns/lib/lang/se_dns_soa.lng index a27181699d12d5055b734d6478207d47f4655571..0e9732b43e2c25c4745f44b5a81aa75eedc736b7 100644 --- a/interface/web/dns/lib/lang/se_dns_soa.lng +++ b/interface/web/dns/lib/lang/se_dns_soa.lng @@ -42,4 +42,6 @@ $wb['error_not_allowed_server_id'] = 'The selected server is not allowed for thi $wb['soa_cannot_be_changed_txt'] = 'Die Zone (SOA) kann nicht verändert werden. Bitte kontaktieren Sie ihren Administrator, um die Zone zu ändern.'; $wb['configuration_error_txt'] = 'CONFIGURATION ERROR'; $wb['dnssec_algo_txt'] = 'DNSSEC Algorithm'; +$wb['rendered_zone_txt'] = 'Bind zone format for reference and export.'; +$wb['rendered_zone_unavailable_txt'] = 'Sorry, no data is available yet.'; ?> diff --git a/interface/web/dns/lib/lang/sk_dns_soa.lng b/interface/web/dns/lib/lang/sk_dns_soa.lng index a03b15d47773e0897b30e3b430a77e5a4a4defa5..115df5672527784714a3b563744077d0d9ff42ac 100644 --- a/interface/web/dns/lib/lang/sk_dns_soa.lng +++ b/interface/web/dns/lib/lang/sk_dns_soa.lng @@ -42,4 +42,6 @@ $wb['error_not_allowed_server_id'] = 'The selected server is not allowed for thi $wb['soa_cannot_be_changed_txt'] = 'Die Zone (SOA) kann nicht verändert werden. Bitte kontaktieren Sie ihren Administrator, um die Zone zu ändern.'; $wb['configuration_error_txt'] = 'CONFIGURATION ERROR'; $wb['dnssec_algo_txt'] = 'DNSSEC Algorithm'; +$wb['rendered_zone_txt'] = 'Bind zone format for reference and export.'; +$wb['rendered_zone_unavailable_txt'] = 'Sorry, no data is available yet.'; ?> diff --git a/interface/web/dns/lib/lang/tr_dns_soa.lng b/interface/web/dns/lib/lang/tr_dns_soa.lng index e5d55678cbd42f76353d2923d1c5d252c9c6d81a..fc1bc60a82aa95bbd9451f246b3ccf7e9c918529 100644 --- a/interface/web/dns/lib/lang/tr_dns_soa.lng +++ b/interface/web/dns/lib/lang/tr_dns_soa.lng @@ -42,4 +42,6 @@ $wb['error_not_allowed_server_id'] = 'SeçilmiÅŸ sunucuda bu hesap kullanılamaz $wb['soa_cannot_be_changed_txt'] = 'Bölge (SOA) deÄŸiÅŸtirilemez. Lütfen bölgeyi deÄŸiÅŸtirmek için yöneticiniz ile görüşün.'; $wb['configuration_error_txt'] = 'YAPILANDIRMA SORUNU'; $wb['dnssec_algo_txt'] = 'DNSSEC Algorithm'; +$wb['rendered_zone_txt'] = 'Bind zone format for reference and export.'; +$wb['rendered_zone_unavailable_txt'] = 'Sorry, no data is available yet.'; ?> diff --git a/interface/web/dns/templates/dns_soa_rendered.htm b/interface/web/dns/templates/dns_soa_rendered.htm new file mode 100644 index 0000000000000000000000000000000000000000..31f1d925a5627a305f8a1f4319e490fb499db1a8 --- /dev/null +++ b/interface/web/dns/templates/dns_soa_rendered.htm @@ -0,0 +1,12 @@ + +{tmpl_if name='rendered_zone'} + {tmpl_var name='rendered_zone_txt'} + <pre>{tmpl_var name='rendered_zone'}</pre> +{tmpl_else} + {tmpl_var name='rendered_zone_unavailable_txt'} +{/tmpl_if} + +<div class="pnl_formsarea"> + <input type="hidden" name="id" value="{tmpl_var name='id'}"> +</div> + diff --git a/interface/web/help/lib/lang/it_faq_manage_questions_list.lng b/interface/web/help/lib/lang/it_faq_manage_questions_list.lng index 857a9d20a4859c07a7c1c68cbe76116c5cf1831e..d5a66daac3c17766d8fd53d41a5910cf3f8c3a0f 100644 --- a/interface/web/help/lib/lang/it_faq_manage_questions_list.lng +++ b/interface/web/help/lib/lang/it_faq_manage_questions_list.lng @@ -5,5 +5,5 @@ $wb['faq_delete_txt'] = 'Elimina'; $wb['faq_edit_txt'] = 'Modifica'; $wb['faq_sections_txt'] = 'Sezione'; $wb['faq_faq_questions_txt'] = 'Domande frequenti'; -$wb['faq_new_question_txt'] = 'Aggiungi nuova domanda & rispondi'; +$wb['faq_new_question_txt'] = 'Aggiungi nuova domanda & risposta'; ?> diff --git a/interface/web/help/lib/lang/it_support_message.lng b/interface/web/help/lib/lang/it_support_message.lng index 60999758fb361a8db894993166acd900301640ac..1525512490f1519fc4149a489b0eca20c52dabed 100644 --- a/interface/web/help/lib/lang/it_support_message.lng +++ b/interface/web/help/lib/lang/it_support_message.lng @@ -3,7 +3,7 @@ $wb['recipient_id_txt'] = 'ID del Destinatario'; $wb['sender_id_txt'] = 'ID del Mittente'; $wb['subject_txt'] = 'Oggetto'; $wb['message_txt'] = 'Messaggio'; -$wb['tstamp_txt'] = 'Timestamp'; +$wb['tstamp_txt'] = 'Data'; $wb['reply_txt'] = 'Rispondi'; $wb['date_txt'] = 'Data'; $wb['support_request_subject_txt'] = 'Richiesta supporto'; diff --git a/interface/web/help/lib/lang/it_support_message_list.lng b/interface/web/help/lib/lang/it_support_message_list.lng index 1416474627e3c26880d85510c7da9f4fd77f84b5..814618e819cc0fadc5bf8b3234802871dc7b1884 100644 --- a/interface/web/help/lib/lang/it_support_message_list.lng +++ b/interface/web/help/lib/lang/it_support_message_list.lng @@ -3,5 +3,5 @@ $wb['list_head_txt'] = 'Messaggi di supporto'; $wb['sender_id_txt'] = 'Mittente'; $wb['subject_txt'] = 'Oggetto'; $wb['add_new_record_txt'] = 'Crea nuovo messaggio di supporto'; -$wb['date_txt'] = 'Date'; +$wb['date_txt'] = 'Data'; ?> diff --git a/interface/web/help/templates/faq_manage_questions_list.htm b/interface/web/help/templates/faq_manage_questions_list.htm index 9b54e7d4ff712dc1033b75b075c6faa974898bda..f810ad6ce33ba5149d3a24725ea598de5a4de7c7 100644 --- a/interface/web/help/templates/faq_manage_questions_list.htm +++ b/interface/web/help/templates/faq_manage_questions_list.htm @@ -12,7 +12,7 @@ <table class="table"> <thead class="dark form-group-sm"> <tr> - <th class="tiny-col">{tmpl_var name="faq_question_txt"}</th> + <th>{tmpl_var name="faq_question_txt"}</th> <th>{tmpl_var name="faq_section_name_txt"}</th> <th class="text-right">{tmpl_var name="faq_delete_txt"}</th> <th class="text-right">{tmpl_var name="faq_edit_txt"}</th> @@ -45,4 +45,4 @@ </table> </div> - \ No newline at end of file + diff --git a/interface/web/js/jquery.min.js b/interface/web/js/jquery.min.js index 25714ed29ab6fcf0355da4b45ac602fac0154efb..c4c6022f2982e8dae64cebd6b9a2b59f2547faad 100644 --- a/interface/web/js/jquery.min.js +++ b/interface/web/js/jquery.min.js @@ -1,4 +1,2 @@ -/*! jQuery v2.1.3 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */ -!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l=a.document,m="2.1.3",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){return!n.isArray(a)&&a-parseFloat(a)+1>=0},isPlainObject:function(a){return"object"!==n.type(a)||a.nodeType||n.isWindow(a)?!1:a.constructor&&!j.call(a.constructor.prototype,"isPrototypeOf")?!1:!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=l.createElement("script"),b.text=a,l.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:g.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(e=d.call(arguments,2),f=function(){return a.apply(b||this,e.concat(d.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:k}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=hb(),z=hb(),A=hb(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ab=/[+~]/,bb=/'|\\/g,cb=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),db=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},eb=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fb){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function gb(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(bb,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+rb(o[l]);w=ab.test(a)&&pb(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function hb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ib(a){return a[u]=!0,a}function jb(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function kb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function lb(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function mb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function nb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function ob(a){return ib(function(b){return b=+b,ib(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pb(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=gb.support={},f=gb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=gb.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",eb,!1):e.attachEvent&&e.attachEvent("onunload",eb)),p=!f(g),c.attributes=jb(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=jb(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=jb(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(jb(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\f]' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),jb(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&jb(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return lb(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?lb(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},gb.matches=function(a,b){return gb(a,null,null,b)},gb.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return gb(b,n,null,[a]).length>0},gb.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},gb.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},gb.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},gb.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=gb.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=gb.selectors={cacheLength:50,createPseudo:ib,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(cb,db),a[3]=(a[3]||a[4]||a[5]||"").replace(cb,db),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||gb.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&gb.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(cb,db).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=gb.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||gb.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ib(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ib(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ib(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ib(function(a){return function(b){return gb(a,b).length>0}}),contains:ib(function(a){return a=a.replace(cb,db),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ib(function(a){return W.test(a||"")||gb.error("unsupported lang: "+a),a=a.replace(cb,db).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:ob(function(){return[0]}),last:ob(function(a,b){return[b-1]}),eq:ob(function(a,b,c){return[0>c?c+b:c]}),even:ob(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:ob(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:ob(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:ob(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=mb(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=nb(b);function qb(){}qb.prototype=d.filters=d.pseudos,d.setFilters=new qb,g=gb.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=S.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=T.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(R," ")}),h=h.slice(c.length));for(g in d.filter)!(e=X[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?gb.error(a):z(a,i).slice(0)};function rb(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function sb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function tb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ub(a,b,c){for(var d=0,e=b.length;e>d;d++)gb(a,b[d],c);return c}function vb(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wb(a,b,c,d,e,f){return d&&!d[u]&&(d=wb(d)),e&&!e[u]&&(e=wb(e,f)),ib(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ub(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:vb(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=vb(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=vb(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sb(function(a){return a===b},h,!0),l=sb(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sb(tb(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wb(i>1&&tb(m),i>1&&rb(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xb(a.slice(i,e)),f>e&&xb(a=a.slice(e)),f>e&&rb(a))}m.push(c)}return tb(m)}function yb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=vb(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&gb.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ib(f):f}return h=gb.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xb(b[c]),f[u]?d.push(f):e.push(f);f=A(a,yb(e,d)),f.selector=a}return f},i=gb.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(cb,db),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(cb,db),ab.test(j[0].type)&&pb(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&rb(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,ab.test(a)&&pb(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=jb(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),jb(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||kb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&jb(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||kb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),jb(function(a){return null==a.getAttribute("disabled")})||kb(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),gb}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return g.call(b,a)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=n.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:l,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}return d=l.getElementById(c[2]),d&&d.parentNode&&(this.length=1,this[0]=d),this.context=l,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};A.prototype=n.fn,y=n(l);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir:function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?"string"==typeof a?g.call(n(a),this[0]):g.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,"parentNode")},parentsUntil:function(a,b,c){return n.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return n.dir(a,"nextSibling")},prevAll:function(a){return n.dir(a,"previousSibling")},nextUntil:function(a,b,c){return n.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return n.dir(a,"previousSibling",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(C[a]||n.unique(e),B.test(a)&&e.reverse()),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return n.each(a.match(E)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(b=a.memory&&l,c=!0,g=e||0,e=0,f=h.length,d=!0;h&&f>g;g++)if(h[g].apply(l[0],l[1])===!1&&a.stopOnFalse){b=!1;break}d=!1,h&&(i?i.length&&j(i.shift()):b?h=[]:k.disable())},k={add:function(){if(h){var c=h.length;!function g(b){n.each(b,function(b,c){var d=n.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&g(c)})}(arguments),d?f=h.length:b&&(e=c,j(b))}return this},remove:function(){return h&&n.each(arguments,function(a,b){var c;while((c=n.inArray(b,h,c))>-1)h.splice(c,1),d&&(f>=c&&f--,g>=c&&g--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],f=0,this},disable:function(){return h=i=b=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,b||k.disable(),this},locked:function(){return!i},fireWith:function(a,b){return!h||c&&!i||(b=b||[],b=[a,b.slice?b.slice():b],d?i.push(b):j(b)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!c}};return k},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&n.isFunction(a.promise)?e:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(H.resolveWith(l,[n]),n.fn.triggerHandler&&(n(l).triggerHandler("ready"),n(l).off("ready"))))}});function I(){l.removeEventListener("DOMContentLoaded",I,!1),a.removeEventListener("load",I,!1),n.ready()}n.ready.promise=function(b){return H||(H=n.Deferred(),"complete"===l.readyState?setTimeout(n.ready):(l.addEventListener("DOMContentLoaded",I,!1),a.addEventListener("load",I,!1))),H.promise(b)},n.ready.promise();var J=n.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)n.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f};n.acceptData=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function K(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=n.expando+K.uid++}K.uid=1,K.accepts=n.acceptData,K.prototype={key:function(a){if(!K.accepts(a))return 0;var b={},c=a[this.expando];if(!c){c=K.uid++;try{b[this.expando]={value:c},Object.defineProperties(a,b)}catch(d){b[this.expando]=c,n.extend(a,b)}}return this.cache[c]||(this.cache[c]={}),c},set:function(a,b,c){var d,e=this.key(a),f=this.cache[e];if("string"==typeof b)f[b]=c;else if(n.isEmptyObject(f))n.extend(this.cache[e],b);else for(d in b)f[d]=b[d];return f},get:function(a,b){var c=this.cache[this.key(a)];return void 0===b?c:c[b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=this.key(a),g=this.cache[f];if(void 0===b)this.cache[f]={};else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in g?d=[b,e]:(d=e,d=d in g?[d]:d.match(E)||[])),c=d.length;while(c--)delete g[d[c]]}},hasData:function(a){return!n.isEmptyObject(this.cache[a[this.expando]]||{})},discard:function(a){a[this.expando]&&delete this.cache[a[this.expando]]}};var L=new K,M=new K,N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(O,"-$1").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}M.set(a,b,c)}else c=void 0;return c}n.extend({hasData:function(a){return M.hasData(a)||L.hasData(a)},data:function(a,b,c){return M.access(a,b,c) -},removeData:function(a,b){M.remove(a,b)},_data:function(a,b,c){return L.access(a,b,c)},_removeData:function(a,b){L.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=M.get(f),1===f.nodeType&&!L.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));L.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){M.set(this,a)}):J(this,function(b){var c,d=n.camelCase(a);if(f&&void 0===b){if(c=M.get(f,a),void 0!==c)return c;if(c=M.get(f,d),void 0!==c)return c;if(c=P(f,d,void 0),void 0!==c)return c}else this.each(function(){var c=M.get(this,d);M.set(this,d,b),-1!==a.indexOf("-")&&void 0!==c&&M.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){M.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=L.get(a,b),c&&(!d||n.isArray(c)?d=L.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return L.get(a,c)||L.access(a,c,{empty:n.Callbacks("once memory").add(function(){L.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?n.queue(this[0],a):void 0===b?this:this.each(function(){var c=n.queue(this,a,b);n._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&n.dequeue(this,a)})},dequeue:function(a){return this.each(function(){n.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=n.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=L.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var Q=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,R=["Top","Right","Bottom","Left"],S=function(a,b){return a=b||a,"none"===n.css(a,"display")||!n.contains(a.ownerDocument,a)},T=/^(?:checkbox|radio)$/i;!function(){var a=l.createDocumentFragment(),b=a.appendChild(l.createElement("div")),c=l.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var U="undefined";k.focusinBubbles="onfocusin"in a;var V=/^key/,W=/^(?:mouse|pointer|contextmenu)|click/,X=/^(?:focusinfocus|focusoutblur)$/,Y=/^([^.]*)(?:\.(.+)|)$/;function Z(){return!0}function $(){return!1}function _(){try{return l.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return typeof n!==U&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(E)||[""],j=b.length;while(j--)h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g,!1)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.hasData(a)&&L.get(a);if(r&&(i=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&(delete r.handle,L.remove(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,m,o,p=[d||l],q=j.call(b,"type")?b.type:b,r=j.call(b,"namespace")?b.namespace.split("."):[];if(g=h=d=d||l,3!==d.nodeType&&8!==d.nodeType&&!X.test(q+n.event.triggered)&&(q.indexOf(".")>=0&&(r=q.split("."),q=r.shift(),r.sort()),k=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=r.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),o=n.event.special[q]||{},e||!o.trigger||o.trigger.apply(d,c)!==!1)){if(!e&&!o.noBubble&&!n.isWindow(d)){for(i=o.delegateType||q,X.test(i+q)||(g=g.parentNode);g;g=g.parentNode)p.push(g),h=g;h===(d.ownerDocument||l)&&p.push(h.defaultView||h.parentWindow||a)}f=0;while((g=p[f++])&&!b.isPropagationStopped())b.type=f>1?i:o.bindType||q,m=(L.get(g,"events")||{})[b.type]&&L.get(g,"handle"),m&&m.apply(g,c),m=k&&g[k],m&&m.apply&&n.acceptData(g)&&(b.result=m.apply(g,c),b.result===!1&&b.preventDefault());return b.type=q,e||b.isDefaultPrevented()||o._default&&o._default.apply(p.pop(),c)!==!1||!n.acceptData(d)||k&&n.isFunction(d[q])&&!n.isWindow(d)&&(h=d[k],h&&(d[k]=null),n.event.triggered=q,d[q](),n.event.triggered=void 0,h&&(d[k]=h)),b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(L.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(g.namespace))&&(a.handleObj=g,a.data=g.data,e=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(a.result=e)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!==this;i=i.parentNode||this)if(i.disabled!==!0||"click"!==a.type){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>=0:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button;return null==a.pageX&&null!=b.clientX&&(c=a.target.ownerDocument||l,d=c.documentElement,e=c.body,a.pageX=b.clientX+(d&&d.scrollLeft||e&&e.scrollLeft||0)-(d&&d.clientLeft||e&&e.clientLeft||0),a.pageY=b.clientY+(d&&d.scrollTop||e&&e.scrollTop||0)-(d&&d.clientTop||e&&e.clientTop||0)),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},fix:function(a){if(a[n.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=W.test(e)?this.mouseHooks:V.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new n.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=l),3===a.target.nodeType&&(a.target=a.target.parentNode),g.filter?g.filter(a,f):a},special:{load:{noBubble:!0},focus:{trigger:function(){return this!==_()&&this.focus?(this.focus(),!1):void 0},delegateType:"focusin"},blur:{trigger:function(){return this===_()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return"checkbox"===this.type&&this.click&&n.nodeName(this,"input")?(this.click(),!1):void 0},_default:function(a){return n.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=n.extend(new n.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?n.event.trigger(e,null,b):n.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},n.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)},n.Event=function(a,b){return this instanceof n.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?Z:$):this.type=a,b&&n.extend(this,b),this.timeStamp=a&&a.timeStamp||n.now(),void(this[n.expando]=!0)):new n.Event(a,b)},n.Event.prototype={isDefaultPrevented:$,isPropagationStopped:$,isImmediatePropagationStopped:$,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=Z,a&&a.preventDefault&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=Z,a&&a.stopPropagation&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=Z,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},n.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){n.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!n.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),k.focusinBubbles||n.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){n.event.simulate(b,a.target,n.event.fix(a),!0)};n.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=L.access(d,b);e||d.addEventListener(a,c,!0),L.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=L.access(d,b)-1;e?L.access(d,b,e):(d.removeEventListener(a,c,!0),L.remove(d,b))}}}),n.fn.extend({on:function(a,b,c,d,e){var f,g;if("object"==typeof a){"string"!=typeof b&&(c=c||b,b=void 0);for(g in a)this.on(g,b,c,a[g],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&("string"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=$;else if(!d)return this;return 1===e&&(f=d,d=function(a){return n().off(a),f.apply(this,arguments)},d.guid=f.guid||(f.guid=n.guid++)),this.each(function(){n.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,n(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=$),this.each(function(){n.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){n.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?n.event.trigger(a,b,c,!0):void 0}});var ab=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bb=/<([\w:]+)/,cb=/<|&#?\w+;/,db=/<(?:script|style|link)/i,eb=/checked\s*(?:[^=]|=\s*.checked.)/i,fb=/^$|\/(?:java|ecma)script/i,gb=/^true\/(.*)/,hb=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,ib={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ib.optgroup=ib.option,ib.tbody=ib.tfoot=ib.colgroup=ib.caption=ib.thead,ib.th=ib.td;function jb(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function kb(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function lb(a){var b=gb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function mb(a,b){for(var c=0,d=a.length;d>c;c++)L.set(a[c],"globalEval",!b||L.get(b[c],"globalEval"))}function nb(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(L.hasData(a)&&(f=L.access(a),g=L.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}M.hasData(a)&&(h=M.access(a),i=n.extend({},h),M.set(b,i))}}function ob(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function pb(a,b){var c=b.nodeName.toLowerCase();"input"===c&&T.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}n.extend({clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=ob(h),f=ob(a),d=0,e=f.length;e>d;d++)pb(f[d],g[d]);if(b)if(c)for(f=f||ob(a),g=g||ob(h),d=0,e=f.length;e>d;d++)nb(f[d],g[d]);else nb(a,h);return g=ob(h,"script"),g.length>0&&mb(g,!i&&ob(a,"script")),h},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k=b.createDocumentFragment(),l=[],m=0,o=a.length;o>m;m++)if(e=a[m],e||0===e)if("object"===n.type(e))n.merge(l,e.nodeType?[e]:e);else if(cb.test(e)){f=f||k.appendChild(b.createElement("div")),g=(bb.exec(e)||["",""])[1].toLowerCase(),h=ib[g]||ib._default,f.innerHTML=h[1]+e.replace(ab,"<$1></$2>")+h[2],j=h[0];while(j--)f=f.lastChild;n.merge(l,f.childNodes),f=k.firstChild,f.textContent=""}else l.push(b.createTextNode(e));k.textContent="",m=0;while(e=l[m++])if((!d||-1===n.inArray(e,d))&&(i=n.contains(e.ownerDocument,e),f=ob(k.appendChild(e),"script"),i&&mb(f),c)){j=0;while(e=f[j++])fb.test(e.type||"")&&c.push(e)}return k},cleanData:function(a){for(var b,c,d,e,f=n.event.special,g=0;void 0!==(c=a[g]);g++){if(n.acceptData(c)&&(e=c[L.expando],e&&(b=L.cache[e]))){if(b.events)for(d in b.events)f[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);L.cache[e]&&delete L.cache[e]}delete M.cache[c[M.expando]]}}}),n.fn.extend({text:function(a){return J(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=jb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=jb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(ob(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&mb(ob(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(ob(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return J(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!db.test(a)&&!ib[(bb.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(ab,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(ob(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(ob(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,m=this,o=l-1,p=a[0],q=n.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&eb.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(c=n.buildFragment(a,this[0].ownerDocument,!1,this),d=c.firstChild,1===c.childNodes.length&&(c=d),d)){for(f=n.map(ob(c,"script"),kb),g=f.length;l>j;j++)h=c,j!==o&&(h=n.clone(h,!0,!0),g&&n.merge(f,ob(h,"script"))),b.call(this[j],h,j);if(g)for(i=f[f.length-1].ownerDocument,n.map(f,lb),j=0;g>j;j++)h=f[j],fb.test(h.type||"")&&!L.access(h,"globalEval")&&n.contains(i,h)&&(h.src?n._evalUrl&&n._evalUrl(h.src):n.globalEval(h.textContent.replace(hb,"")))}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),g=e.length-1,h=0;g>=h;h++)c=h===g?this:this.clone(!0),n(e[h])[b](c),f.apply(d,c.get());return this.pushStack(d)}});var qb,rb={};function sb(b,c){var d,e=n(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:n.css(e[0],"display");return e.detach(),f}function tb(a){var b=l,c=rb[a];return c||(c=sb(a,b),"none"!==c&&c||(qb=(qb||n("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=qb[0].contentDocument,b.write(),b.close(),c=sb(a,b),qb.detach()),rb[a]=c),c}var ub=/^margin/,vb=new RegExp("^("+Q+")(?!px)[a-z%]+$","i"),wb=function(b){return b.ownerDocument.defaultView.opener?b.ownerDocument.defaultView.getComputedStyle(b,null):a.getComputedStyle(b,null)};function xb(a,b,c){var d,e,f,g,h=a.style;return c=c||wb(a),c&&(g=c.getPropertyValue(b)||c[b]),c&&(""!==g||n.contains(a.ownerDocument,a)||(g=n.style(a,b)),vb.test(g)&&ub.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function yb(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d=l.documentElement,e=l.createElement("div"),f=l.createElement("div");if(f.style){f.style.backgroundClip="content-box",f.cloneNode(!0).style.backgroundClip="",k.clearCloneStyle="content-box"===f.style.backgroundClip,e.style.cssText="border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;position:absolute",e.appendChild(f);function g(){f.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",f.innerHTML="",d.appendChild(e);var g=a.getComputedStyle(f,null);b="1%"!==g.top,c="4px"===g.width,d.removeChild(e)}a.getComputedStyle&&n.extend(k,{pixelPosition:function(){return g(),b},boxSizingReliable:function(){return null==c&&g(),c},reliableMarginRight:function(){var b,c=f.appendChild(l.createElement("div"));return c.style.cssText=f.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",c.style.marginRight=c.style.width="0",f.style.width="1px",d.appendChild(e),b=!parseFloat(a.getComputedStyle(c,null).marginRight),d.removeChild(e),f.removeChild(c),b}})}}(),n.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var zb=/^(none|table(?!-c[ea]).+)/,Ab=new RegExp("^("+Q+")(.*)$","i"),Bb=new RegExp("^([+-])=("+Q+")","i"),Cb={position:"absolute",visibility:"hidden",display:"block"},Db={letterSpacing:"0",fontWeight:"400"},Eb=["Webkit","O","Moz","ms"];function Fb(a,b){if(b in a)return b;var c=b[0].toUpperCase()+b.slice(1),d=b,e=Eb.length;while(e--)if(b=Eb[e]+c,b in a)return b;return d}function Gb(a,b,c){var d=Ab.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Hb(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=n.css(a,c+R[f],!0,e)),d?("content"===c&&(g-=n.css(a,"padding"+R[f],!0,e)),"margin"!==c&&(g-=n.css(a,"border"+R[f]+"Width",!0,e))):(g+=n.css(a,"padding"+R[f],!0,e),"padding"!==c&&(g+=n.css(a,"border"+R[f]+"Width",!0,e)));return g}function Ib(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=wb(a),g="border-box"===n.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=xb(a,b,f),(0>e||null==e)&&(e=a.style[b]),vb.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Hb(a,b,c||(g?"border":"content"),d,f)+"px"}function Jb(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=L.get(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&S(d)&&(f[g]=L.access(d,"olddisplay",tb(d.nodeName)))):(e=S(d),"none"===c&&e||L.set(d,"olddisplay",e?c:n.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}n.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=xb(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=n.camelCase(b),i=a.style;return b=n.cssProps[h]||(n.cssProps[h]=Fb(i,h)),g=n.cssHooks[b]||n.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b]:(f=typeof c,"string"===f&&(e=Bb.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(n.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||n.cssNumber[h]||(c+="px"),k.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=n.camelCase(b);return b=n.cssProps[h]||(n.cssProps[h]=Fb(a.style,h)),g=n.cssHooks[b]||n.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=xb(a,b,d)),"normal"===e&&b in Db&&(e=Db[b]),""===c||c?(f=parseFloat(e),c===!0||n.isNumeric(f)?f||0:e):e}}),n.each(["height","width"],function(a,b){n.cssHooks[b]={get:function(a,c,d){return c?zb.test(n.css(a,"display"))&&0===a.offsetWidth?n.swap(a,Cb,function(){return Ib(a,b,d)}):Ib(a,b,d):void 0},set:function(a,c,d){var e=d&&wb(a);return Gb(a,c,d?Hb(a,b,d,"border-box"===n.css(a,"boxSizing",!1,e),e):0)}}}),n.cssHooks.marginRight=yb(k.reliableMarginRight,function(a,b){return b?n.swap(a,{display:"inline-block"},xb,[a,"marginRight"]):void 0}),n.each({margin:"",padding:"",border:"Width"},function(a,b){n.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+R[d]+b]=f[d]||f[d-2]||f[0];return e}},ub.test(a)||(n.cssHooks[a+b].set=Gb)}),n.fn.extend({css:function(a,b){return J(this,function(a,b,c){var d,e,f={},g=0;if(n.isArray(b)){for(d=wb(a),e=b.length;e>g;g++)f[b[g]]=n.css(a,b[g],!1,d);return f}return void 0!==c?n.style(a,b,c):n.css(a,b)},a,b,arguments.length>1)},show:function(){return Jb(this,!0)},hide:function(){return Jb(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){S(this)?n(this).show():n(this).hide()})}});function Kb(a,b,c,d,e){return new Kb.prototype.init(a,b,c,d,e)}n.Tween=Kb,Kb.prototype={constructor:Kb,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(n.cssNumber[c]?"":"px")},cur:function(){var a=Kb.propHooks[this.prop];return a&&a.get?a.get(this):Kb.propHooks._default.get(this)},run:function(a){var b,c=Kb.propHooks[this.prop];return this.pos=b=this.options.duration?n.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Kb.propHooks._default.set(this),this}},Kb.prototype.init.prototype=Kb.prototype,Kb.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=n.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){n.fx.step[a.prop]?n.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[n.cssProps[a.prop]]||n.cssHooks[a.prop])?n.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Kb.propHooks.scrollTop=Kb.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},n.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},n.fx=Kb.prototype.init,n.fx.step={};var Lb,Mb,Nb=/^(?:toggle|show|hide)$/,Ob=new RegExp("^(?:([+-])=|)("+Q+")([a-z%]*)$","i"),Pb=/queueHooks$/,Qb=[Vb],Rb={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=Ob.exec(b),f=e&&e[3]||(n.cssNumber[a]?"":"px"),g=(n.cssNumber[a]||"px"!==f&&+d)&&Ob.exec(n.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,n.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function Sb(){return setTimeout(function(){Lb=void 0}),Lb=n.now()}function Tb(a,b){var c,d=0,e={height:a};for(b=b?1:0;4>d;d+=2-b)c=R[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function Ub(a,b,c){for(var d,e=(Rb[b]||[]).concat(Rb["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function Vb(a,b,c){var d,e,f,g,h,i,j,k,l=this,m={},o=a.style,p=a.nodeType&&S(a),q=L.get(a,"fxshow");c.queue||(h=n._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,l.always(function(){l.always(function(){h.unqueued--,n.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=n.css(a,"display"),k="none"===j?L.get(a,"olddisplay")||tb(a.nodeName):j,"inline"===k&&"none"===n.css(a,"float")&&(o.display="inline-block")),c.overflow&&(o.overflow="hidden",l.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],Nb.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(p?"hide":"show")){if("show"!==e||!q||void 0===q[d])continue;p=!0}m[d]=q&&q[d]||n.style(a,d)}else j=void 0;if(n.isEmptyObject(m))"inline"===("none"===j?tb(a.nodeName):j)&&(o.display=j);else{q?"hidden"in q&&(p=q.hidden):q=L.access(a,"fxshow",{}),f&&(q.hidden=!p),p?n(a).show():l.done(function(){n(a).hide()}),l.done(function(){var b;L.remove(a,"fxshow");for(b in m)n.style(a,b,m[b])});for(d in m)g=Ub(p?q[d]:0,d,l),d in q||(q[d]=g.start,p&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function Wb(a,b){var c,d,e,f,g;for(c in a)if(d=n.camelCase(c),e=b[d],f=a[c],n.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=n.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function Xb(a,b,c){var d,e,f=0,g=Qb.length,h=n.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=Lb||Sb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:n.extend({},b),opts:n.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:Lb||Sb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=n.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(Wb(k,j.opts.specialEasing);g>f;f++)if(d=Qb[f].call(j,a,k,j.opts))return d;return n.map(k,Ub,j),n.isFunction(j.opts.start)&&j.opts.start.call(a,j),n.fx.timer(n.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}n.Animation=n.extend(Xb,{tweener:function(a,b){n.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],Rb[c]=Rb[c]||[],Rb[c].unshift(b)},prefilter:function(a,b){b?Qb.unshift(a):Qb.push(a)}}),n.speed=function(a,b,c){var d=a&&"object"==typeof a?n.extend({},a):{complete:c||!c&&b||n.isFunction(a)&&a,duration:a,easing:c&&b||b&&!n.isFunction(b)&&b};return d.duration=n.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in n.fx.speeds?n.fx.speeds[d.duration]:n.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){n.isFunction(d.old)&&d.old.call(this),d.queue&&n.dequeue(this,d.queue)},d},n.fn.extend({fadeTo:function(a,b,c,d){return this.filter(S).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=n.isEmptyObject(a),f=n.speed(b,c,d),g=function(){var b=Xb(this,n.extend({},a),f);(e||L.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=n.timers,g=L.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&Pb.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&n.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=L.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=n.timers,g=d?d.length:0;for(c.finish=!0,n.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),n.each(["toggle","show","hide"],function(a,b){var c=n.fn[b];n.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(Tb(b,!0),a,d,e)}}),n.each({slideDown:Tb("show"),slideUp:Tb("hide"),slideToggle:Tb("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){n.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),n.timers=[],n.fx.tick=function(){var a,b=0,c=n.timers;for(Lb=n.now();b<c.length;b++)a=c[b],a()||c[b]!==a||c.splice(b--,1);c.length||n.fx.stop(),Lb=void 0},n.fx.timer=function(a){n.timers.push(a),a()?n.fx.start():n.timers.pop()},n.fx.interval=13,n.fx.start=function(){Mb||(Mb=setInterval(n.fx.tick,n.fx.interval))},n.fx.stop=function(){clearInterval(Mb),Mb=null},n.fx.speeds={slow:600,fast:200,_default:400},n.fn.delay=function(a,b){return a=n.fx?n.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a=l.createElement("input"),b=l.createElement("select"),c=b.appendChild(l.createElement("option"));a.type="checkbox",k.checkOn=""!==a.value,k.optSelected=c.selected,b.disabled=!0,k.optDisabled=!c.disabled,a=l.createElement("input"),a.value="t",a.type="radio",k.radioValue="t"===a.value}();var Yb,Zb,$b=n.expr.attrHandle;n.fn.extend({attr:function(a,b){return J(this,n.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){n.removeAttr(this,a)})}}),n.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===U?n.prop(a,b,c):(1===f&&n.isXMLDoc(a)||(b=b.toLowerCase(),d=n.attrHooks[b]||(n.expr.match.bool.test(b)?Zb:Yb)),void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=n.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void n.removeAttr(a,b)) -},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)&&(a[d]=!1),a.removeAttribute(c)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&n.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),Zb={set:function(a,b,c){return b===!1?n.removeAttr(a,c):a.setAttribute(c,c),c}},n.each(n.expr.match.bool.source.match(/\w+/g),function(a,b){var c=$b[b]||n.find.attr;$b[b]=function(a,b,d){var e,f;return d||(f=$b[b],$b[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,$b[b]=f),e}});var _b=/^(?:input|select|textarea|button)$/i;n.fn.extend({prop:function(a,b){return J(this,n.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[n.propFix[a]||a]})}}),n.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!n.isXMLDoc(a),f&&(b=n.propFix[b]||b,e=n.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){return a.hasAttribute("tabindex")||_b.test(a.nodeName)||a.href?a.tabIndex:-1}}}}),k.optSelected||(n.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null}}),n.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){n.propFix[this.toLowerCase()]=this});var ac=/[\t\r\n\f]/g;n.fn.extend({addClass:function(a){var b,c,d,e,f,g,h="string"==typeof a&&a,i=0,j=this.length;if(n.isFunction(a))return this.each(function(b){n(this).addClass(a.call(this,b,this.className))});if(h)for(b=(a||"").match(E)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ac," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=n.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0===arguments.length||"string"==typeof a&&a,i=0,j=this.length;if(n.isFunction(a))return this.each(function(b){n(this).removeClass(a.call(this,b,this.className))});if(h)for(b=(a||"").match(E)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ac," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?n.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(n.isFunction(a)?function(c){n(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=n(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===U||"boolean"===c)&&(this.className&&L.set(this,"__className__",this.className),this.className=this.className||a===!1?"":L.get(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(ac," ").indexOf(b)>=0)return!0;return!1}});var bc=/\r/g;n.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=n.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,n(this).val()):a,null==e?e="":"number"==typeof e?e+="":n.isArray(e)&&(e=n.map(e,function(a){return null==a?"":a+""})),b=n.valHooks[this.type]||n.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=n.valHooks[e.type]||n.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(bc,""):null==c?"":c)}}}),n.extend({valHooks:{option:{get:function(a){var b=n.find.attr(a,"value");return null!=b?b:n.trim(n.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&n.nodeName(c.parentNode,"optgroup"))){if(b=n(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=n.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=n.inArray(d.value,f)>=0)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),n.each(["radio","checkbox"],function(){n.valHooks[this]={set:function(a,b){return n.isArray(b)?a.checked=n.inArray(n(a).val(),b)>=0:void 0}},k.checkOn||(n.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})}),n.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){n.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),n.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var cc=n.now(),dc=/\?/;n.parseJSON=function(a){return JSON.parse(a+"")},n.parseXML=function(a){var b,c;if(!a||"string"!=typeof a)return null;try{c=new DOMParser,b=c.parseFromString(a,"text/xml")}catch(d){b=void 0}return(!b||b.getElementsByTagName("parsererror").length)&&n.error("Invalid XML: "+a),b};var ec=/#.*$/,fc=/([?&])_=[^&]*/,gc=/^(.*?):[ \t]*([^\r\n]*)$/gm,hc=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,ic=/^(?:GET|HEAD)$/,jc=/^\/\//,kc=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,lc={},mc={},nc="*/".concat("*"),oc=a.location.href,pc=kc.exec(oc.toLowerCase())||[];function qc(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(E)||[];if(n.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function rc(a,b,c,d){var e={},f=a===mc;function g(h){var i;return e[h]=!0,n.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function sc(a,b){var c,d,e=n.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&n.extend(!0,a,d),a}function tc(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function uc(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}n.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:oc,type:"GET",isLocal:hc.test(pc[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":nc,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":n.parseJSON,"text xml":n.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?sc(sc(a,n.ajaxSettings),b):sc(n.ajaxSettings,a)},ajaxPrefilter:qc(lc),ajaxTransport:qc(mc),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=n.ajaxSetup({},b),l=k.context||k,m=k.context&&(l.nodeType||l.jquery)?n(l):n.event,o=n.Deferred(),p=n.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!f){f={};while(b=gc.exec(e))f[b[1].toLowerCase()]=b[2]}b=f[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?e:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return c&&c.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||oc)+"").replace(ec,"").replace(jc,pc[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=n.trim(k.dataType||"*").toLowerCase().match(E)||[""],null==k.crossDomain&&(h=kc.exec(k.url.toLowerCase()),k.crossDomain=!(!h||h[1]===pc[1]&&h[2]===pc[2]&&(h[3]||("http:"===h[1]?"80":"443"))===(pc[3]||("http:"===pc[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=n.param(k.data,k.traditional)),rc(lc,k,b,v),2===t)return v;i=n.event&&k.global,i&&0===n.active++&&n.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!ic.test(k.type),d=k.url,k.hasContent||(k.data&&(d=k.url+=(dc.test(d)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=fc.test(d)?d.replace(fc,"$1_="+cc++):d+(dc.test(d)?"&":"?")+"_="+cc++)),k.ifModified&&(n.lastModified[d]&&v.setRequestHeader("If-Modified-Since",n.lastModified[d]),n.etag[d]&&v.setRequestHeader("If-None-Match",n.etag[d])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+nc+"; q=0.01":""):k.accepts["*"]);for(j in k.headers)v.setRequestHeader(j,k.headers[j]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(j in{success:1,error:1,complete:1})v[j](k[j]);if(c=rc(mc,k,b,v)){v.readyState=1,i&&m.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,c.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,f,h){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),c=void 0,e=h||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,f&&(u=tc(k,v,f)),u=uc(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(n.lastModified[d]=w),w=v.getResponseHeader("etag"),w&&(n.etag[d]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,i&&m.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),i&&(m.trigger("ajaxComplete",[v,k]),--n.active||n.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return n.get(a,b,c,"json")},getScript:function(a,b){return n.get(a,void 0,b,"script")}}),n.each(["get","post"],function(a,b){n[b]=function(a,c,d,e){return n.isFunction(c)&&(e=e||d,d=c,c=void 0),n.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),n._evalUrl=function(a){return n.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},n.fn.extend({wrapAll:function(a){var b;return n.isFunction(a)?this.each(function(b){n(this).wrapAll(a.call(this,b))}):(this[0]&&(b=n(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this)},wrapInner:function(a){return this.each(n.isFunction(a)?function(b){n(this).wrapInner(a.call(this,b))}:function(){var b=n(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=n.isFunction(a);return this.each(function(c){n(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){n.nodeName(this,"body")||n(this).replaceWith(this.childNodes)}).end()}}),n.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0},n.expr.filters.visible=function(a){return!n.expr.filters.hidden(a)};var vc=/%20/g,wc=/\[\]$/,xc=/\r?\n/g,yc=/^(?:submit|button|image|reset|file)$/i,zc=/^(?:input|select|textarea|keygen)/i;function Ac(a,b,c,d){var e;if(n.isArray(b))n.each(b,function(b,e){c||wc.test(a)?d(a,e):Ac(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==n.type(b))d(a,b);else for(e in b)Ac(a+"["+e+"]",b[e],c,d)}n.param=function(a,b){var c,d=[],e=function(a,b){b=n.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=n.ajaxSettings&&n.ajaxSettings.traditional),n.isArray(a)||a.jquery&&!n.isPlainObject(a))n.each(a,function(){e(this.name,this.value)});else for(c in a)Ac(c,a[c],b,e);return d.join("&").replace(vc,"+")},n.fn.extend({serialize:function(){return n.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=n.prop(this,"elements");return a?n.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!n(this).is(":disabled")&&zc.test(this.nodeName)&&!yc.test(a)&&(this.checked||!T.test(a))}).map(function(a,b){var c=n(this).val();return null==c?null:n.isArray(c)?n.map(c,function(a){return{name:b.name,value:a.replace(xc,"\r\n")}}):{name:b.name,value:c.replace(xc,"\r\n")}}).get()}}),n.ajaxSettings.xhr=function(){try{return new XMLHttpRequest}catch(a){}};var Bc=0,Cc={},Dc={0:200,1223:204},Ec=n.ajaxSettings.xhr();a.attachEvent&&a.attachEvent("onunload",function(){for(var a in Cc)Cc[a]()}),k.cors=!!Ec&&"withCredentials"in Ec,k.ajax=Ec=!!Ec,n.ajaxTransport(function(a){var b;return k.cors||Ec&&!a.crossDomain?{send:function(c,d){var e,f=a.xhr(),g=++Bc;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)f.setRequestHeader(e,c[e]);b=function(a){return function(){b&&(delete Cc[g],b=f.onload=f.onerror=null,"abort"===a?f.abort():"error"===a?d(f.status,f.statusText):d(Dc[f.status]||f.status,f.statusText,"string"==typeof f.responseText?{text:f.responseText}:void 0,f.getAllResponseHeaders()))}},f.onload=b(),f.onerror=b("error"),b=Cc[g]=b("abort");try{f.send(a.hasContent&&a.data||null)}catch(h){if(b)throw h}},abort:function(){b&&b()}}:void 0}),n.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return n.globalEval(a),a}}}),n.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),n.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(d,e){b=n("<script>").prop({async:!0,charset:a.scriptCharset,src:a.url}).on("load error",c=function(a){b.remove(),c=null,a&&e("error"===a.type?404:200,a.type)}),l.head.appendChild(b[0])},abort:function(){c&&c()}}}});var Fc=[],Gc=/(=)\?(?=&|$)|\?\?/;n.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Fc.pop()||n.expando+"_"+cc++;return this[a]=!0,a}}),n.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(Gc.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&Gc.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=n.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(Gc,"$1"+e):b.jsonp!==!1&&(b.url+=(dc.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||n.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,Fc.push(e)),g&&n.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),n.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||l;var d=v.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=n.buildFragment([a],b,e),e&&e.length&&n(e).remove(),n.merge([],d.childNodes))};var Hc=n.fn.load;n.fn.load=function(a,b,c){if("string"!=typeof a&&Hc)return Hc.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=n.trim(a.slice(h)),a=a.slice(0,h)),n.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&n.ajax({url:a,type:e,dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?n("<div>").append(n.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,f||[a.responseText,b,a])}),this},n.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){n.fn[b]=function(a){return this.on(b,a)}}),n.expr.filters.animated=function(a){return n.grep(n.timers,function(b){return a===b.elem}).length};var Ic=a.document.documentElement;function Jc(a){return n.isWindow(a)?a:9===a.nodeType&&a.defaultView}n.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=n.css(a,"position"),l=n(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=n.css(a,"top"),i=n.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),n.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},n.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){n.offset.setOffset(this,a,b)});var b,c,d=this[0],e={top:0,left:0},f=d&&d.ownerDocument;if(f)return b=f.documentElement,n.contains(b,d)?(typeof d.getBoundingClientRect!==U&&(e=d.getBoundingClientRect()),c=Jc(f),{top:e.top+c.pageYOffset-b.clientTop,left:e.left+c.pageXOffset-b.clientLeft}):e},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===n.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),n.nodeName(a[0],"html")||(d=a.offset()),d.top+=n.css(a[0],"borderTopWidth",!0),d.left+=n.css(a[0],"borderLeftWidth",!0)),{top:b.top-d.top-n.css(c,"marginTop",!0),left:b.left-d.left-n.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||Ic;while(a&&!n.nodeName(a,"html")&&"static"===n.css(a,"position"))a=a.offsetParent;return a||Ic})}}),n.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(b,c){var d="pageYOffset"===c;n.fn[b]=function(e){return J(this,function(b,e,f){var g=Jc(b);return void 0===f?g?g[c]:b[e]:void(g?g.scrollTo(d?a.pageXOffset:f,d?f:a.pageYOffset):b[e]=f)},b,e,arguments.length,null)}}),n.each(["top","left"],function(a,b){n.cssHooks[b]=yb(k.pixelPosition,function(a,c){return c?(c=xb(a,b),vb.test(c)?n(a).position()[b]+"px":c):void 0})}),n.each({Height:"height",Width:"width"},function(a,b){n.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){n.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return J(this,function(b,c,d){var e;return n.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?n.css(b,c,g):n.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),n.fn.size=function(){return this.length},n.fn.andSelf=n.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return n});var Kc=a.jQuery,Lc=a.$;return n.noConflict=function(b){return a.$===n&&(a.$=Lc),b&&a.jQuery===n&&(a.jQuery=Kc),n},typeof b===U&&(a.jQuery=a.$=n),n}); +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}S.fn=S.prototype={jquery:f,constructor:S,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=S.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return S.each(this,e)},map:function(n){return this.pushStack(S.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(S.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(S.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},S.extend=S.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(S.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||S.isPlainObject(n)?n:{},i=!1,a[t]=S.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},S.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(p(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},makeArray:function(e,t){var n=t||[];return null!=e&&(p(Object(e))?S.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(p(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:y}),"function"==typeof Symbol&&(S.fn[Symbol.iterator]=t[Symbol.iterator]),S.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var d=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,S="sizzle"+1*new Date,p=n.document,k=0,r=0,m=ue(),x=ue(),A=ue(),N=ue(),j=function(e,t){return e===t&&(l=!0),0},D={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",F=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",B=new RegExp(M+"+","g"),$=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="<a id='"+S+"'></a><select id='"+S+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!=C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!=C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&D.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(j),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(B," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[k,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[k,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace($,"$1"));return s[S]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[k,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[S]||(e[S]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===k&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[S]&&(v=Ce(v)),y&&!y[S]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace($,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace($," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=A[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[S]?i.push(a):o.push(a);(a=A(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=k+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(k=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(k=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=S.split("").sort(j).join("")===S,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);S.find=d,S.expr=d.selectors,S.expr[":"]=S.expr.pseudos,S.uniqueSort=S.unique=d.uniqueSort,S.text=d.getText,S.isXMLDoc=d.isXML,S.contains=d.contains,S.escapeSelector=d.escape;var h=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&S(e).is(n))break;r.push(e)}return r},T=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},k=S.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1<i.call(n,e)!==r}):S.filter(n,e,r)}S.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?S.find.matchesSelector(r,e)?[r]:[]:S.find.matches(e,S.grep(t,function(e){return 1===e.nodeType}))},S.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(S(e).filter(function(){for(t=0;t<r;t++)if(S.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)S.find(e,i[t],n);return 1<r?S.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&k.test(e)?S(e):e||[],!1).length}});var D,q=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(S.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&S(e);if(!k.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&S.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?S.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(S(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(S.uniqueSort(S.merge(this.get(),S(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),S.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return h(e,"parentNode")},parentsUntil:function(e,t,n){return h(e,"parentNode",n)},next:function(e){return O(e,"nextSibling")},prev:function(e){return O(e,"previousSibling")},nextAll:function(e){return h(e,"nextSibling")},prevAll:function(e){return h(e,"previousSibling")},nextUntil:function(e,t,n){return h(e,"nextSibling",n)},prevUntil:function(e,t,n){return h(e,"previousSibling",n)},siblings:function(e){return T((e.parentNode||{}).firstChild,e)},children:function(e){return T(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(A(e,"template")&&(e=e.content||e),S.merge([],e.childNodes))}},function(r,i){S.fn[r]=function(e,t){var n=S.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=S.filter(t,n)),1<this.length&&(H[r]||S.uniqueSort(n),L.test(r)&&n.reverse()),this.pushStack(n)}});var P=/[^\x20\t\r\n\f]+/g;function R(e){return e}function M(e){throw e}function I(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}S.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},S.each(e.match(P)||[],function(e,t){n[t]=!0}),n):S.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){S.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return S.each(arguments,function(e,t){var n;while(-1<(n=S.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<S.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},S.extend({Deferred:function(e){var o=[["notify","progress",S.Callbacks("memory"),S.Callbacks("memory"),2],["resolve","done",S.Callbacks("once memory"),S.Callbacks("once memory"),0,"resolved"],["reject","fail",S.Callbacks("once memory"),S.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return S.Deferred(function(r){S.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,R,s),l(u,o,M,s)):(u++,t.call(e,l(u,o,R,s),l(u,o,M,s),l(u,o,R,o.notifyWith))):(a!==R&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){S.Deferred.exceptionHook&&S.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==M&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(S.Deferred.getStackHook&&(t.stackTrace=S.Deferred.getStackHook()),C.setTimeout(t))}}return S.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:R,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:R)),o[2][3].add(l(0,e,m(n)?n:M))}).promise()},promise:function(e){return null!=e?S.extend(e,a):a}},s={};return S.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=S.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(I(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)I(i[t],a(t),o.reject);return o.promise()}});var W=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;S.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&W.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},S.readyException=function(e){C.setTimeout(function(){throw e})};var F=S.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),S.ready()}S.fn.ready=function(e){return F.then(e)["catch"](function(e){S.readyException(e)}),this},S.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--S.readyWait:S.isReady)||(S.isReady=!0)!==e&&0<--S.readyWait||F.resolveWith(E,[S])}}),S.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(S.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var $=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)$(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(S(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},_=/^-ms-/,z=/-([a-z])/g;function U(e,t){return t.toUpperCase()}function X(e){return e.replace(_,"ms-").replace(z,U)}var V=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function G(){this.expando=S.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t=e[this.expando];return t||(t={},V(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[X(t)]=n;else for(r in t)i[X(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][X(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(X):(t=X(t))in r?[t]:t.match(P)||[]).length;while(n--)delete r[t[n]]}(void 0===t||S.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!S.isEmptyObject(t)}};var Y=new G,Q=new G,J=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,K=/[A-Z]/g;function Z(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(K,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:J.test(i)?JSON.parse(i):i)}catch(e){}Q.set(e,t,n)}else n=void 0;return n}S.extend({hasData:function(e){return Q.hasData(e)||Y.hasData(e)},data:function(e,t,n){return Q.access(e,t,n)},removeData:function(e,t){Q.remove(e,t)},_data:function(e,t,n){return Y.access(e,t,n)},_removeData:function(e,t){Y.remove(e,t)}}),S.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=Q.get(o),1===o.nodeType&&!Y.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=X(r.slice(5)),Z(o,r,i[r]));Y.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){Q.set(this,n)}):$(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=Q.get(o,n))?t:void 0!==(t=Z(o,n))?t:void 0;this.each(function(){Q.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){Q.remove(this,e)})}}),S.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Y.get(e,t),n&&(!r||Array.isArray(n)?r=Y.access(e,t,S.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=S.queue(e,t),r=n.length,i=n.shift(),o=S._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){S.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Y.get(e,n)||Y.access(e,n,{empty:S.Callbacks("once memory").add(function(){Y.remove(e,[t+"queue",n])})})}}),S.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?S.queue(this[0],t):void 0===n?this:this.each(function(){var e=S.queue(this,t,n);S._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&S.dequeue(this,t)})},dequeue:function(e){return this.each(function(){S.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=S.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Y.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var ee=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,te=new RegExp("^(?:([+-])=|)("+ee+")([a-z%]*)$","i"),ne=["Top","Right","Bottom","Left"],re=E.documentElement,ie=function(e){return S.contains(e.ownerDocument,e)},oe={composed:!0};re.getRootNode&&(ie=function(e){return S.contains(e.ownerDocument,e)||e.getRootNode(oe)===e.ownerDocument});var ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&ie(e)&&"none"===S.css(e,"display")};function se(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return S.css(e,t,"")},u=s(),l=n&&n[3]||(S.cssNumber[t]?"":"px"),c=e.nodeType&&(S.cssNumber[t]||"px"!==l&&+u)&&te.exec(S.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)S.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,S.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ue={};function le(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Y.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ae(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ue[s])||(o=a.body.appendChild(a.createElement(s)),u=S.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ue[s]=u)))):"none"!==n&&(l[c]="none",Y.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}S.fn.extend({show:function(){return le(this,!0)},hide:function(){return le(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?S(this).show():S(this).hide()})}});var ce,fe,pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="<option></option>",y.option=!!ce.lastChild;var ge={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Y.set(e[n],"globalEval",!t||Y.get(t[n],"globalEval"))}ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td,y.option||(ge.optgroup=ge.option=[1,"<select multiple='multiple'>","</select>"]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))S.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+S.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;S.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<S.inArray(o,r))i&&i.push(o);else if(l=ie(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}var be=/^([^.]*)(?:\.(.+)|)/;function we(){return!0}function Te(){return!1}function Ce(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ee(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ee(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Te;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return S().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=S.guid++)),e.each(function(){S.event.add(this,t,i,r,n)})}function Se(e,i,o){o?(Y.set(e,i,!1),S.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Y.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(S.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Y.set(this,i,r),t=o(this,i),this[i](),r!==(n=Y.get(this,i))||t?Y.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n&&n.value}else r.length&&(Y.set(this,i,{value:S.event.trigger(S.extend(r[0],S.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,i)&&S.event.add(e,i,we)}S.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.get(t);if(V(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&S.find.matchesSelector(re,i),n.guid||(n.guid=S.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof S&&S.event.triggered!==e.type?S.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(P)||[""]).length;while(l--)d=g=(s=be.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=S.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=S.event.special[d]||{},c=S.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&S.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),S.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.hasData(e)&&Y.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(P)||[""]).length;while(l--)if(d=g=(s=be.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=S.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||S.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)S.event.remove(e,d+t[l],n,r,!0);S.isEmptyObject(u)&&Y.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=S.event.fix(e),l=(Y.get(this,"events")||Object.create(null))[u.type]||[],c=S.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=S.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((S.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<S(i,this).index(l):S.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(S.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[S.expando]?e:new S.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click",we),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Y.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},S.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},S.Event=function(e,t){if(!(this instanceof S.Event))return new S.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?we:Te,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&S.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[S.expando]=!0},S.Event.prototype={constructor:S.Event,isDefaultPrevented:Te,isPropagationStopped:Te,isImmediatePropagationStopped:Te,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=we,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=we,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=we,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},S.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:!0},S.event.addProp),S.each({focus:"focusin",blur:"focusout"},function(e,t){S.event.special[e]={setup:function(){return Se(this,e,Ce),!1},trigger:function(){return Se(this,e),!0},_default:function(){return!0},delegateType:t}}),S.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){S.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||S.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),S.fn.extend({on:function(e,t,n,r){return Ee(this,e,t,n,r)},one:function(e,t,n,r){return Ee(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,S(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Te),this.each(function(){S.event.remove(this,e,n,t)})}});var ke=/<script|<style|<link/i,Ae=/checked\s*(?:[^=]|=\s*.checked.)/i,Ne=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)S.event.add(t,i,s[i][n]);Q.hasData(e)&&(o=Q.access(e),a=S.extend({},o),Q.set(t,a))}}function He(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&Ae.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),He(t,r,i,o)});if(f&&(t=(e=xe(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=S.map(ve(e,"script"),De)).length;c<f;c++)u=e,c!==p&&(u=S.clone(u,!0,!0),s&&S.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,S.map(a,qe),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Y.access(u,"globalEval")&&S.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?S._evalUrl&&!u.noModule&&S._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):b(u.textContent.replace(Ne,""),u,l))}return n}function Oe(e,t,n){for(var r,i=t?S.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||S.cleanData(ve(r)),r.parentNode&&(n&&ie(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}S.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=ie(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||S.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Le(o[r],a[r]);else Le(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=S.event.special,o=0;void 0!==(n=e[o]);o++)if(V(n)){if(t=n[Y.expando]){if(t.events)for(r in t.events)i[r]?S.event.remove(n,r):S.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void 0)}}}),S.fn.extend({detach:function(e){return Oe(this,e,!0)},remove:function(e){return Oe(this,e)},text:function(e){return $(this,function(e){return void 0===e?S.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return He(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||je(this,e).appendChild(e)})},prepend:function(){return He(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=je(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(S.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return S.clone(this,e,t)})},html:function(e){return $(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!ke.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=S.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(S.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return He(this,arguments,function(e){var t=this.parentNode;S.inArray(this,n)<0&&(S.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),S.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){S.fn[e]=function(e){for(var t,n=[],r=S(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),S(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var Pe=new RegExp("^("+ee+")(?!px)[a-z%]+$","i"),Re=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},Me=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Ie=new RegExp(ne.join("|"),"i");function We(e,t,n){var r,i,o,a,s=e.style;return(n=n||Re(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||ie(e)||(a=S.style(e,t)),!y.pixelBoxStyles()&&Pe.test(a)&&Ie.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function Fe(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",re.appendChild(u).appendChild(l);var e=C.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),re.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=E.createElement("div"),l=E.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===l.style.backgroundClip,S.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=E.createElement("table"),t=E.createElement("tr"),n=E.createElement("div"),e.style.cssText="position:absolute;left:-11111px;border-collapse:separate",t.style.cssText="border:1px solid",t.style.height="1px",n.style.height="9px",n.style.display="block",re.appendChild(e).appendChild(t).appendChild(n),r=C.getComputedStyle(t),a=parseInt(r.height,10)+parseInt(r.borderTopWidth,10)+parseInt(r.borderBottomWidth,10)===t.offsetHeight,re.removeChild(e)),a}}))}();var Be=["Webkit","Moz","ms"],$e=E.createElement("div").style,_e={};function ze(e){var t=S.cssProps[e]||_e[e];return t||(e in $e?e:_e[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=Be.length;while(n--)if((e=Be[n]+t)in $e)return e}(e)||e)}var Ue=/^(none|table(?!-c[ea]).+)/,Xe=/^--/,Ve={position:"absolute",visibility:"hidden",display:"block"},Ge={letterSpacing:"0",fontWeight:"400"};function Ye(e,t,n){var r=te.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Qe(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=S.css(e,n+ne[a],!0,i)),r?("content"===n&&(u-=S.css(e,"padding"+ne[a],!0,i)),"margin"!==n&&(u-=S.css(e,"border"+ne[a]+"Width",!0,i))):(u+=S.css(e,"padding"+ne[a],!0,i),"padding"!==n?u+=S.css(e,"border"+ne[a]+"Width",!0,i):s+=S.css(e,"border"+ne[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function Je(e,t,n){var r=Re(e),i=(!y.boxSizingReliable()||n)&&"border-box"===S.css(e,"boxSizing",!1,r),o=i,a=We(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(Pe.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||!y.reliableTrDimensions()&&A(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===S.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===S.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+Qe(e,t,n||(i?"border":"content"),o,r,a)+"px"}function Ke(e,t,n,r,i){return new Ke.prototype.init(e,t,n,r,i)}S.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=We(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=X(t),u=Xe.test(t),l=e.style;if(u||(t=ze(s)),a=S.cssHooks[t]||S.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=te.exec(n))&&i[1]&&(n=se(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(S.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=X(t);return Xe.test(t)||(t=ze(s)),(a=S.cssHooks[t]||S.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=We(e,t,r)),"normal"===i&&t in Ge&&(i=Ge[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),S.each(["height","width"],function(e,u){S.cssHooks[u]={get:function(e,t,n){if(t)return!Ue.test(S.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?Je(e,u,n):Me(e,Ve,function(){return Je(e,u,n)})},set:function(e,t,n){var r,i=Re(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===S.css(e,"boxSizing",!1,i),s=n?Qe(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-Qe(e,u,"border",!1,i)-.5)),s&&(r=te.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=S.css(e,u)),Ye(0,t,s)}}}),S.cssHooks.marginLeft=Fe(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(We(e,"marginLeft"))||e.getBoundingClientRect().left-Me(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),S.each({margin:"",padding:"",border:"Width"},function(i,o){S.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+ne[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(S.cssHooks[i+o].set=Ye)}),S.fn.extend({css:function(e,t){return $(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Re(e),i=t.length;a<i;a++)o[t[a]]=S.css(e,t[a],!1,r);return o}return void 0!==n?S.style(e,t,n):S.css(e,t)},e,t,1<arguments.length)}}),((S.Tween=Ke).prototype={constructor:Ke,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||S.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(S.cssNumber[n]?"":"px")},cur:function(){var e=Ke.propHooks[this.prop];return e&&e.get?e.get(this):Ke.propHooks._default.get(this)},run:function(e){var t,n=Ke.propHooks[this.prop];return this.options.duration?this.pos=t=S.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Ke.propHooks._default.set(this),this}}).init.prototype=Ke.prototype,(Ke.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=S.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){S.fx.step[e.prop]?S.fx.step[e.prop](e):1!==e.elem.nodeType||!S.cssHooks[e.prop]&&null==e.elem.style[ze(e.prop)]?e.elem[e.prop]=e.now:S.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=Ke.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},S.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},S.fx=Ke.prototype.init,S.fx.step={};var Ze,et,tt,nt,rt=/^(?:toggle|show|hide)$/,it=/queueHooks$/;function ot(){et&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(ot):C.setTimeout(ot,S.fx.interval),S.fx.tick())}function at(){return C.setTimeout(function(){Ze=void 0}),Ze=Date.now()}function st(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=ne[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function ut(e,t,n){for(var r,i=(lt.tweeners[t]||[]).concat(lt.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function lt(o,e,t){var n,a,r=0,i=lt.prefilters.length,s=S.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=Ze||at(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:S.extend({},e),opts:S.extend(!0,{specialEasing:{},easing:S.easing._default},t),originalProperties:e,originalOptions:t,startTime:Ze||at(),duration:t.duration,tweens:[],createTween:function(e,t){var n=S.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=X(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=S.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=lt.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(S._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return S.map(c,ut,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),S.fx.timer(S.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}S.Animation=S.extend(lt,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return se(n.elem,e,te.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(P);for(var n,r=0,i=e.length;r<i;r++)n=e[r],lt.tweeners[n]=lt.tweeners[n]||[],lt.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),v=Y.get(e,"fxshow");for(r in n.queue||(null==(a=S._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,S.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],rt.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||S.style(e,r)}if((u=!S.isEmptyObject(t))||!S.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Y.get(e,"display")),"none"===(c=S.css(e,"display"))&&(l?c=l:(le([e],!0),l=e.style.display||l,c=S.css(e,"display"),le([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===S.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Y.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&le([e],!0),p.done(function(){for(r in g||le([e]),Y.remove(e,"fxshow"),d)S.style(e,r,d[r])})),u=ut(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?lt.prefilters.unshift(e):lt.prefilters.push(e)}}),S.speed=function(e,t,n){var r=e&&"object"==typeof e?S.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return S.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in S.fx.speeds?r.duration=S.fx.speeds[r.duration]:r.duration=S.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&S.dequeue(this,r.queue)},r},S.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=S.isEmptyObject(t),o=S.speed(e,n,r),a=function(){var e=lt(this,S.extend({},t),o);(i||Y.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=S.timers,r=Y.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&it.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||S.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Y.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=S.timers,o=n?n.length:0;for(t.finish=!0,S.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),S.each(["toggle","show","hide"],function(e,r){var i=S.fn[r];S.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(st(r,!0),e,t,n)}}),S.each({slideDown:st("show"),slideUp:st("hide"),slideToggle:st("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){S.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),S.timers=[],S.fx.tick=function(){var e,t=0,n=S.timers;for(Ze=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||S.fx.stop(),Ze=void 0},S.fx.timer=function(e){S.timers.push(e),S.fx.start()},S.fx.interval=13,S.fx.start=function(){et||(et=!0,ot())},S.fx.stop=function(){et=null},S.fx.speeds={slow:600,fast:200,_default:400},S.fn.delay=function(r,e){return r=S.fx&&S.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},tt=E.createElement("input"),nt=E.createElement("select").appendChild(E.createElement("option")),tt.type="checkbox",y.checkOn=""!==tt.value,y.optSelected=nt.selected,(tt=E.createElement("input")).value="t",tt.type="radio",y.radioValue="t"===tt.value;var ct,ft=S.expr.attrHandle;S.fn.extend({attr:function(e,t){return $(this,S.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){S.removeAttr(this,e)})}}),S.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?S.prop(e,t,n):(1===o&&S.isXMLDoc(e)||(i=S.attrHooks[t.toLowerCase()]||(S.expr.match.bool.test(t)?ct:void 0)),void 0!==n?null===n?void S.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=S.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(P);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),ct={set:function(e,t,n){return!1===t?S.removeAttr(e,n):e.setAttribute(n,n),n}},S.each(S.expr.match.bool.source.match(/\w+/g),function(e,t){var a=ft[t]||S.find.attr;ft[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=ft[o],ft[o]=r,r=null!=a(e,t,n)?o:null,ft[o]=i),r}});var pt=/^(?:input|select|textarea|button)$/i,dt=/^(?:a|area)$/i;function ht(e){return(e.match(P)||[]).join(" ")}function gt(e){return e.getAttribute&&e.getAttribute("class")||""}function vt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(P)||[]}S.fn.extend({prop:function(e,t){return $(this,S.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[S.propFix[e]||e]})}}),S.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&S.isXMLDoc(e)||(t=S.propFix[t]||t,i=S.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=S.find.attr(e,"tabindex");return t?parseInt(t,10):pt.test(e.nodeName)||dt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(S.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),S.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){S.propFix[this.toLowerCase()]=this}),S.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).addClass(t.call(this,e,gt(this)))});if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).removeClass(t.call(this,e,gt(this)))});if(!arguments.length)return this.attr("class","");if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){S(this).toggleClass(i.call(this,e,gt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=S(this),r=vt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=gt(this))&&Y.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Y.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+ht(gt(n))+" ").indexOf(t))return!0;return!1}});var yt=/\r/g;S.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,S(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=S.map(t,function(e){return null==e?"":e+""})),(r=S.valHooks[this.type]||S.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=S.valHooks[t.type]||S.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(yt,""):null==e?"":e:void 0}}),S.extend({valHooks:{option:{get:function(e){var t=S.find.attr(e,"value");return null!=t?t:ht(S.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=S(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=S.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<S.inArray(S.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),S.each(["radio","checkbox"],function(){S.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<S.inArray(S(e).val(),t)}},y.checkOn||(S.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var mt=/^(?:focusinfocus|focusoutblur)$/,xt=function(e){e.stopPropagation()};S.extend(S.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!mt.test(d+S.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[S.expando]?e:new S.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:S.makeArray(t,[e]),c=S.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,mt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Y.get(o,"events")||Object.create(null))[e.type]&&Y.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&V(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!V(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),S.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,xt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,xt),S.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=S.extend(new S.Event,n,{type:e,isSimulated:!0});S.event.trigger(r,null,t)}}),S.fn.extend({trigger:function(e,t){return this.each(function(){S.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return S.event.trigger(e,t,n,!0)}}),y.focusin||S.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){S.event.simulate(r,e.target,S.event.fix(e))};S.event.special[r]={setup:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r);t||e.addEventListener(n,i,!0),Y.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r)-1;t?Y.access(e,r,t):(e.removeEventListener(n,i,!0),Y.remove(e,r))}}});var bt=C.location,wt={guid:Date.now()},Tt=/\?/;S.parseXML=function(e){var t,n;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){}return n=t&&t.getElementsByTagName("parsererror")[0],t&&!n||S.error("Invalid XML: "+(n?S.map(n.childNodes,function(e){return e.textContent}).join("\n"):e)),t};var Ct=/\[\]$/,Et=/\r?\n/g,St=/^(?:submit|button|image|reset|file)$/i,kt=/^(?:input|select|textarea|keygen)/i;function At(n,e,r,i){var t;if(Array.isArray(e))S.each(e,function(e,t){r||Ct.test(n)?i(n,t):At(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)At(n+"["+t+"]",e[t],r,i)}S.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!S.isPlainObject(e))S.each(e,function(){i(this.name,this.value)});else for(n in e)At(n,e[n],t,i);return r.join("&")},S.fn.extend({serialize:function(){return S.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=S.prop(this,"elements");return e?S.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!S(this).is(":disabled")&&kt.test(this.nodeName)&&!St.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=S(this).val();return null==n?null:Array.isArray(n)?S.map(n,function(e){return{name:t.name,value:e.replace(Et,"\r\n")}}):{name:t.name,value:n.replace(Et,"\r\n")}}).get()}});var Nt=/%20/g,jt=/#.*$/,Dt=/([?&])_=[^&]*/,qt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Lt=/^(?:GET|HEAD)$/,Ht=/^\/\//,Ot={},Pt={},Rt="*/".concat("*"),Mt=E.createElement("a");function It(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(P)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Wt(t,i,o,a){var s={},u=t===Pt;function l(e){var r;return s[e]=!0,S.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function Ft(e,t){var n,r,i=S.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&S.extend(!0,e,r),e}Mt.href=bt.href,S.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:bt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(bt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Rt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":S.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Ft(Ft(e,S.ajaxSettings),t):Ft(S.ajaxSettings,e)},ajaxPrefilter:It(Ot),ajaxTransport:It(Pt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=S.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?S(y):S.event,x=S.Deferred(),b=S.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=qt.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||bt.href)+"").replace(Ht,bt.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(P)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Mt.protocol+"//"+Mt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=S.param(v.data,v.traditional)),Wt(Ot,v,t,T),h)return T;for(i in(g=S.event&&v.global)&&0==S.active++&&S.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Lt.test(v.type),f=v.url.replace(jt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(Nt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(Tt.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Dt,"$1"),o=(Tt.test(f)?"&":"?")+"_="+wt.guid+++o),v.url=f+o),v.ifModified&&(S.lastModified[f]&&T.setRequestHeader("If-Modified-Since",S.lastModified[f]),S.etag[f]&&T.setRequestHeader("If-None-Match",S.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+Rt+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Wt(Pt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<S.inArray("script",v.dataTypes)&&S.inArray("json",v.dataTypes)<0&&(v.converters["text script"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(S.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(S.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--S.active||S.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return S.get(e,t,n,"json")},getScript:function(e,t){return S.get(e,void 0,t,"script")}}),S.each(["get","post"],function(e,i){S[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),S.ajax(S.extend({url:e,type:i,dataType:r,data:t,success:n},S.isPlainObject(e)&&e))}}),S.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),S._evalUrl=function(e,t,n){return S.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){S.globalEval(e,t,n)}})},S.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=S(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){S(this).wrapInner(n.call(this,e))}):this.each(function(){var e=S(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){S(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){S(this).replaceWith(this.childNodes)}),this}}),S.expr.pseudos.hidden=function(e){return!S.expr.pseudos.visible(e)},S.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},S.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var Bt={0:200,1223:204},$t=S.ajaxSettings.xhr();y.cors=!!$t&&"withCredentials"in $t,y.ajax=$t=!!$t,S.ajaxTransport(function(i){var o,a;if(y.cors||$t&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(Bt[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),S.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),S.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return S.globalEval(e),e}}}),S.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),S.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=S("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=ht(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&S.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?S("<div>").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var Xt=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;S.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||S.guid++,i},S.holdReady=function(e){e?S.readyWait++:S.ready(!0)},S.isArray=Array.isArray,S.parseJSON=JSON.parse,S.nodeName=A,S.isFunction=m,S.isWindow=x,S.camelCase=X,S.type=w,S.now=Date.now,S.isNumeric=function(e){var t=S.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},S.trim=function(e){return null==e?"":(e+"").replace(Xt,"")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return S});var Vt=C.jQuery,Gt=C.$;return S.noConflict=function(e){return C.$===S&&(C.$=Gt),e&&C.jQuery===S&&(C.jQuery=Vt),S},"undefined"==typeof e&&(C.jQuery=C.$=S),S}); diff --git a/interface/web/login/index.php b/interface/web/login/index.php index 58456dea0e4b855b642395b7756b12c2aec65136..d59d24efc8273dc6ab5781f117a5f640a667daa8 100644 --- a/interface/web/login/index.php +++ b/interface/web/login/index.php @@ -28,297 +28,428 @@ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -require_once '../../lib/config.inc.php'; -require_once '../../lib/app.inc.php'; +/** + * @param app $app + * @param $error + * @param $conf + * @param $module + * @return void + */ +function process_login_request(app $app, &$error, $conf, $module) +{ + //** Check variables + if (!preg_match("/^[\w\.\-\_\@]{1,128}$/", $app->functions->idn_encode($_POST['username']))) $error = $app->lng('user_regex_error'); + if (!preg_match("/^.{1,256}$/i", $_POST['password'])) $error = $app->lng('pw_error_length'); -// Check if we have an active users ession and no login_as. -if($_SESSION['s']['user']['active'] == 1 && @$_POST['login_as'] != 1) { - header('Location: /index.php'); - die(); -} + //** importing variables + $ip = md5($_SERVER['REMOTE_ADDR']); + $username = $_POST['username']; + $password = $_POST['password']; + $loginAs = false; + $time = time(); -$app->uses('tpl'); -$app->tpl->newTemplate('main_login.tpl.htm'); -$app->tpl->setInclude('content_tpl', 'templates/index.htm'); + if ($username == '' || $password == '' || $error != '') { + //* Username or password empty + if ($error == '') $error = $app->lng('error_user_password_empty'); + $app->plugin->raiseEvent('login_empty', $username); + return; + } -$error = ''; + $loginAs = is_login_as($app, $username, $password); -$app->load_language_file('web/login/lib/lang/'.$conf["language"].'.lng'); + //* Check if there are already wrong logins + $sql = "SELECT * FROM `attempts_login` WHERE `ip`= ? AND `login_time` > (NOW() - INTERVAL 1 MINUTE) LIMIT 1"; + $alreadyfailed = $app->db->queryOneRecord($sql, $ip); -// Maintenance mode -$maintenance_mode = false; -$maintenance_mode_error = ''; -$server_config_array = $app->getconf->get_global_config('misc'); -if($app->is_under_maintenance()) { - $maintenance_mode = true; - $maintenance_mode_error = $app->lng('error_maintenance_mode'); -} + //* too many failed logins + if ($alreadyfailed['times'] > 5) { + $error = $app->lng('error_user_too_many_logins'); + return; + } -//* Login Form was sent -if(count($_POST) > 0) { + $user = validate_and_fetch_user($app, $username, $password, $loginAs, $conf); - //** Check variables - if(!preg_match("/^[\w\.\-\_\@]{1,128}$/", $app->functions->idn_encode($_POST['username']))) $error = $app->lng('user_regex_error'); - if(!preg_match("/^.{1,256}$/i", $_POST['password'])) $error = $app->lng('pw_error_length'); + if ($user) { + if ($user['active'] != 1) { + $error = $app->lng('error_user_blocked'); + return; + } - //** importing variables - $ip = md5($_SERVER['REMOTE_ADDR']); - $username = $_POST['username']; - $password = $_POST['password']; - $loginAs = false; - $time = time(); + // Maintenance mode - allow logins only when maintenance mode is off or if the user is admin + if ($app->is_under_maintenance() && $user['typ'] != 'admin') return; - if($username != '' && $password != '' && $error == '') { - /* - * Check, if there is a "login as" instead of a "normal" login - */ - if (isset($_SESSION['s']['user']) && $_SESSION['s']['user']['active'] == 1){ - /* - * only the admin or reseller can "login as" so if the user is NOT an admin or reseller, we - * open the startpage (after killing the old session), so the user - * is logout and has to start again! - */ - if ($_SESSION['s']['user']['typ'] != 'admin' && !$app->auth->has_clients($_SESSION['s']['user']['userid'])) { - /* - * The actual user is NOT a admin or reseller, but maybe he - * has logged in as "normal" user before... - */ + if ($user['typ'] == 'admin' && !is_admin_ip_whitelisted($_SERVER['REMOTE_ADDR'], $conf)) { + // TODO: if it's not a security risk (information disclosure) to + // let the user know they are not whitelisted, then change this + // error message to a more appropriate one + $error = $app->lng('error_user_password_incorrect'); + return; + } - if (isset($_SESSION['s_old'])&& ($_SESSION['s_old']['user']['typ'] == 'admin' || $app->auth->has_clients($_SESSION['s_old']['user']['userid']))){ - /* The "old" user is admin or reseller, so everything is ok - * if he is reseller, we need to check if he logs in to one of his clients - */ - if($_SESSION['s_old']['user']['typ'] != 'admin') { - - /* this is the one currently logged in (normal user) */ - $old_client_group_id = $app->functions->intval($_SESSION["s"]["user"]["default_group"]); - $old_client = $app->db->queryOneRecord("SELECT client.client_id, client.parent_client_id FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $old_client_group_id); - - /* this is the reseller, that shall be re-logged in */ - $sql = "SELECT * FROM sys_user WHERE USERNAME = ? and PASSWORT = ?"; - $tmp = $app->db->queryOneRecord($sql, $username, $password); - $client_group_id = $app->functions->intval($tmp['default_group']); - $tmp_client = $app->db->queryOneRecord("SELECT client.client_id FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $client_group_id); - - if(!$tmp_client || $old_client["parent_client_id"] != $tmp_client["client_id"] || $tmp["default_group"] != $_SESSION["s_old"]["user"]["default_group"] ) { - die("You don't have the right to 'login as' this user!"); - } - unset($old_client); - unset($tmp_client); - unset($tmp); - } - } - else { - die("You don't have the right to 'login as'!"); - } - } elseif($_SESSION['s']['user']['typ'] != 'admin' && (!isset($_SESSION['s_old']['user']) || $_SESSION['s_old']['user']['typ'] != 'admin')) { - /* a reseller wants to 'login as', we need to check if he is allowed to */ - $res_client_group_id = $app->functions->intval($_SESSION["s"]["user"]["default_group"]); - $res_client = $app->db->queryOneRecord("SELECT client.client_id FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $res_client_group_id); - - /* this is the user the reseller wants to 'login as' */ - $sql = "SELECT * FROM sys_user WHERE USERNAME = ? and PASSWORT = ?"; - $tmp = $app->db->queryOneRecord($sql, $username, $password); - $tmp_client = $app->db->queryOneRecord("SELECT client.client_id, client.parent_client_id FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $tmp["default_group"]); - - if(!$tmp || $tmp_client["parent_client_id"] != $res_client["client_id"]) { - die("You don't have the right to login as this user!"); - } - unset($res_client); - unset($tmp); - unset($tmp_client); + // User login right, so attempts can be deleted + $sql = "DELETE FROM `attempts_login` WHERE `ip`=?"; + $app->db->query($sql, $ip); + $user = $app->db->toLower($user); + + if ($loginAs) $oldSession = $_SESSION['s']; + + // Session regenerate causes login problems on some systems, see Issue #3827 + // Set session_regenerate_id to no in security settings, it you encounter + // this problem. + $app->uses('getconf'); + $security_config = $app->getconf->get_security_config('permissions'); + if (isset($security_config['session_regenerate_id']) && $security_config['session_regenerate_id'] == 'yes') { + if (!$loginAs) session_regenerate_id(true); + } + $_SESSION = array(); + if ($loginAs) $_SESSION['s_old'] = $oldSession; // keep the way back! + $_SESSION['s']['user'] = $user; + $_SESSION['s']['user']['theme'] = isset($user['app_theme']) ? $user['app_theme'] : 'default'; + $_SESSION['s']['language'] = $app->functions->check_language($user['language']); + $_SESSION["s"]['theme'] = $_SESSION['s']['user']['theme']; + if ($loginAs) $_SESSION['s']['plugin_cache'] = $_SESSION['s_old']['plugin_cache']; + + if (is_file(ISPC_WEB_PATH.'/'.$_SESSION['s']['user']['startmodule'].'/lib/module.conf.php')) { + include_once $app->functions->check_include_path(ISPC_WEB_PATH.'/'.$_SESSION['s']['user']['startmodule'].'/lib/module.conf.php'); + $menu_dir = ISPC_WEB_PATH.'/'.$_SESSION['s']['user']['startmodule'].'/lib/menu.d'; + include_menu_dir_files($menu_dir); + $_SESSION['s']['module'] = $module; + } + // check if the user theme is valid + if ($_SESSION['s']['user']['theme'] != 'default') { + $tmp_path = ISPC_THEMES_PATH."/".$_SESSION['s']['user']['theme']; + if (!@is_dir($tmp_path) || !@file_exists($tmp_path."/ispconfig_version") || trim(file_get_contents($tmp_path."/ispconfig_version")) != ISPC_APP_VERSION) { + // fall back to default theme if this one is not compatible with current ispc version + $_SESSION['s']['user']['theme'] = 'default'; + $_SESSION['s']['theme'] = 'default'; + $_SESSION['show_error_msg'] = $app->lng('theme_not_compatible'); } - $loginAs = true; + } + + $app->plugin->raiseEvent('login', $username); + + //* Save successful login message to var + $authlog = 'Successful login for user \''.$username.'\' from '.$_SERVER['REMOTE_ADDR'].' at '.date('Y-m-d H:i:s').' with session ID '.session_id(); + $authlog_handle = fopen($conf['ispconfig_log_dir'].'/auth.log', 'a'); + fwrite($authlog_handle, $authlog."\n"); + fclose($authlog_handle); + /* + * We need LOGIN_REDIRECT instead of HEADER_REDIRECT to load the + * new theme, if the logged-in user has another + */ + + if ($loginAs) { + echo 'LOGIN_REDIRECT:'.$_SESSION['s']['module']['startpage']; + exit; } else { - /* normal login */ - $loginAs = false; + header('Location: ../index.php'); + die(); } + } else { + if (!$alreadyfailed['times']) { + //* user login the first time wrong + $sql = "INSERT INTO `attempts_login` (`ip`, `times`, `login_time`) VALUES (?, 1, NOW())"; + $app->db->query($sql, $ip); + } elseif ($alreadyfailed['times'] >= 1) { + //* update times wrong + $sql = "UPDATE `attempts_login` SET `times`=`times`+1, `login_time`=NOW() WHERE `ip` = ? AND `login_time` < NOW() ORDER BY `login_time` DESC LIMIT 1"; + $app->db->query($sql, $ip); + } + //* Incorrect login - Username and password incorrect + $error = $app->lng('error_user_password_incorrect'); + if ($app->db->errorMessage != '') $error .= '<br />'.$app->db->errorMessage != ''; + + $app->plugin->raiseEvent('login_failed', $username); + //* Save failed login message to var + $authlog = 'Failed login for user \''.$username.'\' from '.$_SERVER['REMOTE_ADDR'].' at '.date('Y-m-d H:i:s'); + $authlog_handle = fopen($conf['ispconfig_log_dir'].'/auth.log', 'a'); + fwrite($authlog_handle, $authlog."\n"); + fclose($authlog_handle); + } +} + +/** + * Checks if the given admin's IP address is whitelisted. + * @param string $ip + * @return bool + */ +function is_admin_ip_whitelisted($ip, $conf) +{ + // if there is no config value, we assume that webmaster doesn't use this feature + if (!isset($conf['admin_ip_whitelist_file'])) return true; + + // if the file doesn't exist, we assume that webmaster doesn't use this feature + if (!file_exists($conf['admin_ip_whitelist_file'])) return true; + + $file_lines = file($conf['admin_ip_whitelist_file']); + + $matches = array_filter($file_lines, function($v) use ($ip) { + $line = trim($v); + + // exclude empty lines and comments + if ($line === '' || $line[0] === '#') return false; + + return ipv6_matches_cidr($ip, $line) || ipv4_matches_cidr($ip, $line); + }); + + return count($matches) > 0; +} + +// based on https://www.php.net/manual/en/ref.network.php (comments) +/** + * Checks if the given IPv4 address matches the given CIDR. + * @param string $ip The IPv4 address. + * @param string $cidr The CIDR in the IPv4 format. + * @return bool + */ +function ipv4_matches_cidr ($ip, $cidr) +{ + if (strpos($ip, '.') === false) return false; + + list ($net, $mask) = explode ('/', $cidr); + if (!$mask) $mask = 32; + + $ip_net = ip2long ($net); + $ip_ip = ip2long ($ip); + $ip_mask = ~((1 << (32 - $mask)) - 1); + + return (($ip_ip & $ip_mask) == ($ip_net & $ip_mask)); +} + +// based on https://stackoverflow.com/a/7951507/2428861 +/** + * Checks if the given IPv6 address matches the given CIDR. + * @param string $ip The IPv6 address. + * @param string $cidr The CIDR in the IPv6 format. + * @return bool + */ +function ipv6_matches_cidr($ip, $cidr) +{ + if (strpos($ip, ':') === false) return false; - //* Check if there are already wrong logins - $sql = "SELECT * FROM `attempts_login` WHERE `ip`= ? AND `login_time` > (NOW() - INTERVAL 1 MINUTE) LIMIT 1"; - $alreadyfailed = $app->db->queryOneRecord($sql, $ip); + list ($net, $mask) = explode('/', $cidr); + if (!$mask) $mask = 128; - //* too many failedlogins - if($alreadyfailed['times'] > 5) { - $error = $app->lng('error_user_too_many_logins'); + $ip_net = in_addr_to_bitstring(inet_pton($net)); + $ip_ip = in_addr_to_bitstring(inet_pton($ip)); + + return substr($ip_ip, 0, $mask) === substr($ip_net, 0, $mask); +} + +/** + * Converts the output of {@see inet_pton()} to string of bits. + * @param string $in_addr The in_addr representation of the IP address. + * @return string String of bits representing given in_addr representation of the IP address. + */ +function in_addr_to_bitstring($in_addr) +{ + $result = ''; + foreach (str_split($in_addr) as $c) { + $result .= str_pad(decbin(ord($c)), 8, '0', STR_PAD_LEFT); + } + return $result; +} + +/** + * Validates user credentials and fetches the user if validation succeeded + * @param app $app + * @param $username + * @param $password + * @param $loginAs + * @param $conf + * @return array | bool + */ +function validate_and_fetch_user(app $app, $username, $password, $loginAs, $conf) +{ + if ($loginAs) { + $sql = "SELECT * FROM sys_user WHERE USERNAME = ? and PASSWORT = ?"; + return $app->db->queryOneRecord($sql, (string)$username, (string)$password); + } + + if (stristr($username, '@')) { + //* mailuser login + $sql = "SELECT * FROM mail_user WHERE login = ? or email = ?"; + $mailuser = $app->db->queryOneRecord($sql, (string)$username, $app->functions->idn_encode($username)); + + return $mailuser + ? build_fake_user($app, $username, $password, $mailuser, $conf) + : false; + } + + //* normal cp user login + $sql = "SELECT * FROM sys_user WHERE USERNAME = ?"; + $user = $app->db->queryOneRecord($sql, (string)$username); + if (!$user) return false; + + $saved_password = stripslashes($user['passwort']); + if (substr($saved_password, 0, 1) == '$') { + //* The password is encrypted with crypt + return crypt(stripslashes($password), $saved_password) == $saved_password + ? $user + : false; + } + + //* The password is md5 encrypted + if (md5($password) != $saved_password) return false; + + // update password with secure algo + $sql = 'UPDATE `sys_user` SET `passwort` = ? WHERE `username` = ?'; + $app->db->query($sql, $app->auth->crypt_password($password), (string)$username); + + return $user; +} + +/** + * @param app $app + * @param $username + * @param $password + * @param array $mailuser + * @param array $user + * @param $conf + * @return array + */ +function build_fake_user(app $app, $username, $password, array $mailuser, $conf) +{ + $saved_password = stripslashes($mailuser['password']); + //* Check if mailuser password is correct + if (crypt(stripslashes($password), $saved_password) == $saved_password) { + //* Get the sys_user language of the client of the mailuser + $sys_user_lang = $app->db->queryOneRecord("SELECT language FROM sys_user WHERE default_group = ?", $mailuser['sys_groupid']); + + //* we build a fake user here which has access to the mailuser module only and userid 0 + $user = array(); + $user['userid'] = 0; + $user['active'] = 1; + $user['startmodule'] = 'mailuser'; + $user['modules'] = 'mailuser'; + $user['typ'] = 'user'; + $user['email'] = $mailuser['email']; + $user['username'] = $username; + if (is_array($sys_user_lang) && $sys_user_lang['language'] != '') { + $user['language'] = $sys_user_lang['language']; } else { + $user['language'] = $conf['language']; + } + $user['theme'] = $conf['theme']; + $user['app_theme'] = $conf['theme']; + $user['mailuser_id'] = $mailuser['mailuser_id']; + $user['default_group'] = $mailuser['sys_groupid']; + } - if ($loginAs){ - $sql = "SELECT * FROM sys_user WHERE USERNAME = ? and PASSWORT = ?"; - $user = $app->db->queryOneRecord($sql, $username, $password); - } else { + return $user; +} - if(stristr($username, '@')) { - //* mailuser login - $sql = "SELECT * FROM mail_user WHERE login = ? or email = ?"; - $mailuser = $app->db->queryOneRecord($sql, $username, $app->functions->idn_encode($username)); - $user = false; - if($mailuser) { - $saved_password = stripslashes($mailuser['password']); - //* Check if mailuser password is correct - if(crypt(stripslashes($password), $saved_password) == $saved_password) { - //* Get the sys_user language of the client of the mailuser - $sys_user_lang = $app->db->queryOneRecord("SELECT language FROM sys_user WHERE default_group = ?", $mailuser['sys_groupid'] ); - - //* we build a fake user here which has access to the mailuser module only and userid 0 - $user = array(); - $user['userid'] = 0; - $user['active'] = 1; - $user['startmodule'] = 'mailuser'; - $user['modules'] = 'mailuser'; - $user['typ'] = 'user'; - $user['email'] = $mailuser['email']; - $user['username'] = $username; - if(is_array($sys_user_lang) && $sys_user_lang['language'] != '') { - $user['language'] = $sys_user_lang['language']; - } else { - $user['language'] = $conf['language']; - } - $user['theme'] = $conf['theme']; - $user['app_theme'] = $conf['theme']; - $user['mailuser_id'] = $mailuser['mailuser_id']; - $user['default_group'] = $mailuser['sys_groupid']; - } - } - } else { - //* normal cp user login - $sql = "SELECT * FROM sys_user WHERE USERNAME = ?"; - $user = $app->db->queryOneRecord($sql, $username); - if($user) { - $saved_password = stripslashes($user['passwort']); - if(substr($saved_password, 0, 1) == '$') { - //* The password is encrypted with crypt - if(crypt(stripslashes($password), $saved_password) != $saved_password) { - $user = false; - } - } else { - //* The password is md5 encrypted - if(md5($password) != $saved_password) { - $user = false; - } else { - // update password with secure algo - $sql = 'UPDATE `sys_user` SET `passwort` = ? WHERE `username` = ?'; - $app->db->query($sql, $app->auth->crypt_password($password), $username); - } - } - } else { - $user = false; - } - } - } +/** + * Checks if there is a "login as" instead of a "normal" login + * @param app $app + * @param $username + * @param $password + * @return bool + */ +function is_login_as(app $app, $username, $password) +{ + if (isset($_SESSION['s']['user']) && $_SESSION['s']['user']['active'] == 1) { + /* + * only the admin or reseller can "login as" so if the user is NOT an admin or reseller, we + * open the startpage (after killing the old session), so the user + * is logout and has to start again! + */ + if ($_SESSION['s']['user']['typ'] != 'admin' && !$app->auth->has_clients($_SESSION['s']['user']['userid'])) { + /* + * The actual user is NOT a admin or reseller, but maybe he + * has logged in as "normal" user before... + */ + + if (isset($_SESSION['s_old']) && ($_SESSION['s_old']['user']['typ'] == 'admin' || $app->auth->has_clients($_SESSION['s_old']['user']['userid']))) { + /* The "old" user is admin or reseller, so everything is ok + * if he is reseller, we need to check if he logs in to one of his clients + */ + if ($_SESSION['s_old']['user']['typ'] != 'admin') { + + /* this is the one currently logged in (normal user) */ + $old_client_group_id = $app->functions->intval($_SESSION["s"]["user"]["default_group"]); + $old_client = $app->db->queryOneRecord("SELECT client.client_id, client.parent_client_id FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $old_client_group_id); + + /* this is the reseller, that shall be re-logged in */ + $sql = "SELECT * FROM sys_user WHERE USERNAME = ? and PASSWORT = ?"; + $tmp = $app->db->queryOneRecord($sql, (string)$username, (string)$password); + $client_group_id = $app->functions->intval($tmp['default_group']); + $tmp_client = $app->db->queryOneRecord("SELECT client.client_id FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $client_group_id); - if($user) { - if($user['active'] == 1) { - // Maintenance mode - allow logins only when maintenance mode is off or if the user is admin - if(!$app->is_under_maintenance() || $user['typ'] == 'admin'){ - - // User login right, so attempts can be deleted - $sql = "DELETE FROM `attempts_login` WHERE `ip`=?"; - $app->db->query($sql, $ip); - $user = $app->db->toLower($user); - - if ($loginAs) $oldSession = $_SESSION['s']; - - // Session regenerate causes login problems on some systems, see Issue #3827 - // Set session_regenerate_id to no in security settings, it you encounter - // this problem. - $app->uses('getconf'); - $security_config = $app->getconf->get_security_config('permissions'); - if(isset($security_config['session_regenerate_id']) && $security_config['session_regenerate_id'] == 'yes') { - if (!$loginAs) session_regenerate_id(true); - } - $_SESSION = array(); - if ($loginAs) $_SESSION['s_old'] = $oldSession; // keep the way back! - $_SESSION['s']['user'] = $user; - $_SESSION['s']['user']['theme'] = isset($user['app_theme']) ? $user['app_theme'] : 'default'; - $_SESSION['s']['language'] = $app->functions->check_language($user['language']); - $_SESSION["s"]['theme'] = $_SESSION['s']['user']['theme']; - if ($loginAs) $_SESSION['s']['plugin_cache'] = $_SESSION['s_old']['plugin_cache']; - - if(is_file(ISPC_WEB_PATH . '/' . $_SESSION['s']['user']['startmodule'].'/lib/module.conf.php')) { - include_once $app->functions->check_include_path(ISPC_WEB_PATH . '/' . $_SESSION['s']['user']['startmodule'].'/lib/module.conf.php'); - $menu_dir = ISPC_WEB_PATH.'/' . $_SESSION['s']['user']['startmodule'] . '/lib/menu.d'; - if (is_dir($menu_dir)) { - if ($dh = opendir($menu_dir)) { - //** Go through all files in the menu dir - while (($file = readdir($dh)) !== false) { - if ($file != '.' && $file != '..' && substr($file, -9, 9) == '.menu.php' && $file != 'dns_resync.menu.php') { - include_once $menu_dir . '/' . $file; - } - } - } - } - $_SESSION['s']['module'] = $module; - } - // check if the user theme is valid - if($_SESSION['s']['user']['theme'] != 'default') { - $tmp_path = ISPC_THEMES_PATH."/".$_SESSION['s']['user']['theme']; - if(!@is_dir($tmp_path) || !@file_exists($tmp_path."/ispconfig_version") || trim(file_get_contents($tmp_path."/ispconfig_version")) != ISPC_APP_VERSION) { - // fall back to default theme if this one is not compatible with current ispc version - $_SESSION['s']['user']['theme'] = 'default'; - $_SESSION['s']['theme'] = 'default'; - $_SESSION['show_error_msg'] = $app->lng('theme_not_compatible'); - } - } - - $app->plugin->raiseEvent('login', $username); - - //* Save successfull login message to var - $authlog = 'Successful login for user \''. $username .'\' from '. $_SERVER['REMOTE_ADDR'] .' at '. date('Y-m-d H:i:s') . ' with session ID ' .session_id(); - $authlog_handle = fopen($conf['ispconfig_log_dir'].'/auth.log', 'a'); - fwrite($authlog_handle, $authlog ."\n"); - fclose($authlog_handle); - - /* - * We need LOGIN_REDIRECT instead of HEADER_REDIRECT to load the - * new theme, if the logged-in user has another - */ - - if ($loginAs){ - echo 'LOGIN_REDIRECT:'.$_SESSION['s']['module']['startpage']; - exit; - } else { - header('Location: ../index.php'); - die(); - } + if (!$tmp_client || $old_client["parent_client_id"] != $tmp_client["client_id"] || $tmp["default_group"] != $_SESSION["s_old"]["user"]["default_group"]) { + die("You don't have the right to 'login as' this user!"); } - } else { - $error = $app->lng('error_user_blocked'); + unset($old_client); + unset($tmp_client); + unset($tmp); } } else { - if(!$alreadyfailed['times'] ) - { - //* user login the first time wrong - $sql = "INSERT INTO `attempts_login` (`ip`, `times`, `login_time`) VALUES (?, 1, NOW())"; - $app->db->query($sql, $ip); - } elseif($alreadyfailed['times'] >= 1) { - //* update times wrong - $sql = "UPDATE `attempts_login` SET `times`=`times`+1, `login_time`=NOW() WHERE `ip` = ? AND `login_time` < NOW() ORDER BY `login_time` DESC LIMIT 1"; - $app->db->query($sql, $ip); - } - //* Incorrect login - Username and password incorrect - $error = $app->lng('error_user_password_incorrect'); - if($app->db->errorMessage != '') $error .= '<br />'.$app->db->errorMessage != ''; - - $app->plugin->raiseEvent('login_failed', $username); - //* Save failed login message to var - $authlog = 'Failed login for user \''. $username .'\' from '. $_SERVER['REMOTE_ADDR'] .' at '. date('Y-m-d H:i:s'); - $authlog_handle = fopen($conf['ispconfig_log_dir'].'/auth.log', 'a'); - fwrite($authlog_handle, $authlog ."\n"); - fclose($authlog_handle); + die("You don't have the right to 'login as'!"); + } + } elseif ($_SESSION['s']['user']['typ'] != 'admin' && (!isset($_SESSION['s_old']['user']) || $_SESSION['s_old']['user']['typ'] != 'admin')) { + /* a reseller wants to 'login as', we need to check if he is allowed to */ + $res_client_group_id = $app->functions->intval($_SESSION["s"]["user"]["default_group"]); + $res_client = $app->db->queryOneRecord("SELECT client.client_id FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $res_client_group_id); + + /* this is the user the reseller wants to 'login as' */ + $sql = "SELECT * FROM sys_user WHERE USERNAME = ? and PASSWORT = ?"; + $tmp = $app->db->queryOneRecord($sql, (string)$username, (string)$password); + $tmp_client = $app->db->queryOneRecord("SELECT client.client_id, client.parent_client_id FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $tmp["default_group"]); + + if (!$tmp || $tmp_client["parent_client_id"] != $res_client["client_id"]) { + die("You don't have the right to login as this user!"); } + unset($res_client); + unset($tmp); + unset($tmp_client); } - } else { - //* Username or password empty - if($error == '') $error = $app->lng('error_user_password_empty'); - $app->plugin->raiseEvent('login_empty', $username); + $loginAs = true; + + } else { + /* normal login */ + $loginAs = false; } + + return $loginAs; +} + +require_once '../../lib/config.inc.php'; +require_once '../../lib/app.inc.php'; + +include_once '../common.php'; + +// Check if we have an active users session and no login_as. +if ($_SESSION['s']['user']['active'] == 1 && @$_POST['login_as'] != 1) { + header('Location: /index.php'); + die(); +} + +$app->uses('tpl'); +$app->tpl->newTemplate('main_login.tpl.htm'); +$app->tpl->setInclude('content_tpl', 'templates/index.htm'); + +$error = ''; + +$app->load_language_file('web/login/lib/lang/'.$conf["language"].'.lng'); + +// Maintenance mode +$maintenance_mode = false; +$maintenance_mode_error = ''; +$server_config_array = $app->getconf->get_global_config('misc'); +if ($app->is_under_maintenance()) { + $maintenance_mode = true; + $maintenance_mode_error = $app->lng('error_maintenance_mode'); +} + +//* Login Form was sent +if (count($_POST) > 0) { + process_login_request($app, $error, $conf, $module); } -// Maintenance mode - show message when people try to log in and also when people are forcedly logged off -if($maintenance_mode_error != '') $error = '<strong>'.$maintenance_mode_error.'</strong><br><br>'.$error; -if($error != ''){ +// Maintenance mode - show message when people try to log in and also when people are forcibly logged off +if ($maintenance_mode_error != '') $error = '<strong>'.$maintenance_mode_error.'</strong><br><br>'.$error; +if ($error != '') { $error = '<div class="box box_error">'.$error.'</div>'; } @@ -326,7 +457,7 @@ $app->load('getconf'); $sys_config = $app->getconf->get_global_config('misc'); $security_config = $app->getconf->get_security_config('permissions'); -if($security_config['password_reset_allowed'] == 'yes') { +if ($security_config['password_reset_allowed'] == 'yes') { $app->tpl->setVar('pw_lost_show', 1); } else { $app->tpl->setVar('pw_lost_show', 0); @@ -348,7 +479,7 @@ $app->tpl->setVar('current_theme', isset($_SESSION['s']['theme']) ? $_SESSION['s // Logo $logo = $app->db->queryOneRecord("SELECT * FROM sys_ini WHERE sysini_id = 1"); -if($logo['custom_logo'] != ''){ +if ($logo['custom_logo'] != '') { $base64_logo_txt = $logo['custom_logo']; } else { $base64_logo_txt = $logo['default_logo']; @@ -361,12 +492,12 @@ $app->tpl->setVar('base64_logo_txt', $base64_logo_txt); // Title if (!empty($sys_config['company_name'])) { - $app->tpl->setVar('company_name', $sys_config['company_name']. ' :: '); + $app->tpl->setVar('company_name', $sys_config['company_name'].' :: '); } // Custom Login if ($sys_config['custom_login_text'] != '') { - $custom_login = @($sys_config['custom_login_link'] != '')?'<a href="'.$sys_config['custom_login_link'].'" target="_blank">'.$sys_config['custom_login_text'].'</a>':$sys_config['custom_login_text']; + $custom_login = @($sys_config['custom_login_link'] != '') ? '<a href="'.$sys_config['custom_login_link'].'" target="_blank">'.$sys_config['custom_login_text'].'</a>' : $sys_config['custom_login_text']; } $app->tpl->setVar('custom_login', $custom_login); diff --git a/interface/web/login/password_reset.php b/interface/web/login/password_reset.php index db4ad71c22d2614566b0c2658cb4254ee8e7afdb..659075483c918c4813a28e74bf1a67eb8faa7ea9 100644 --- a/interface/web/login/password_reset.php +++ b/interface/web/login/password_reset.php @@ -71,7 +71,7 @@ if(isset($_POST['username']) && is_string($_POST['username']) && $_POST['usernam } elseif ($continue) { if($client['client_id'] > 0) { $username = $client['username']; - $password_hash = sha1(uniqid('ispc_pw')); + $password_hash = sha1(random_bytes(20)); $app->db->query("UPDATE sys_user SET lost_password_reqtime = NOW(), lost_password_hash = ? WHERE username = ?", $password_hash, $username); $server_domain = (isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : $_SERVER['HTTP_HOST']); diff --git a/interface/web/mail/ajax_get_json.php b/interface/web/mail/ajax_get_json.php index dfc9dc220c0b9ea5ff7d5c4c0c5ed90f666449fe..c40c3bf401bdb0a06af0487a0f9104467bca3317 100644 --- a/interface/web/mail/ajax_get_json.php +++ b/interface/web/mail/ajax_get_json.php @@ -113,7 +113,7 @@ header('Content-type: application/json'); echo $json; function validate_domain($domain) { - $regex = '/^[\w\.\-]{2,255}\.[a-zA-Z0-9\-]{2,63}$/'; + $regex = '/^[\w\.\-]{1,255}\.[a-zA-Z0-9\-]{2,63}$/'; if ( preg_match($regex, $domain) === 1 ) return true; else return false; } diff --git a/interface/web/mail/form/mail_aliasdomain.tform.php b/interface/web/mail/form/mail_aliasdomain.tform.php index a0d10249898695f4d3b8dd124684f167adb4045f..c94e1a931113c21275c0fe5c6ea5cf74deafdfc5 100644 --- a/interface/web/mail/form/mail_aliasdomain.tform.php +++ b/interface/web/mail/form/mail_aliasdomain.tform.php @@ -86,7 +86,7 @@ $form["tabs"]['alias'] = array ( 1 => array ( 'type' => 'UNIQUE', 'errmsg'=> 'source_error_unique'), 2 => array ( 'type' => 'REGEX', - 'regex' => '/^\@[\w\.\-]{2,64}\.[a-zA-Z0-9\-]{2,20}$/', + 'regex' => '/^\@[\w\.\-]{1,255}\.[a-zA-Z0-9\-]{2,63}$/', 'errmsg'=> 'source_error_regex'), ), 'default' => '', diff --git a/interface/web/mail/form/mail_domain_catchall.tform.php b/interface/web/mail/form/mail_domain_catchall.tform.php index 95e10354cc78cbd10b8da1371cebb2e60bc260c8..ac4631bedbe962cd08c19fefd5b3821fd74d43a2 100644 --- a/interface/web/mail/form/mail_domain_catchall.tform.php +++ b/interface/web/mail/form/mail_domain_catchall.tform.php @@ -86,7 +86,7 @@ $form["tabs"]['catchall'] = array ( 1 => array ( 'type' => 'UNIQUE', 'errmsg'=> 'domain_error_unique'), 2 => array ( 'type' => 'REGEX', - 'regex' => '/^\@[\w\.\-]{2,255}\.[a-zA-Z\-]{2,63}$/', + 'regex' => '/^\@[\w\.\-]{1,255}\.[a-zA-Z\-]{2,63}$/', 'errmsg'=> 'domain_error_regex'), ), 'default' => '', diff --git a/interface/web/mail/form/mail_mailinglist.tform.php b/interface/web/mail/form/mail_mailinglist.tform.php index ba877f410cec3f6c57b4dbe571d2691c9f905d46..295bd8d5710fc33c1736656500ef322eeee6186f 100644 --- a/interface/web/mail/form/mail_mailinglist.tform.php +++ b/interface/web/mail/form/mail_mailinglist.tform.php @@ -87,7 +87,7 @@ $form["tabs"]['mailinglist'] = array ( 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', 'errmsg'=> 'domain_error_empty'), 1 => array ( 'type' => 'REGEX', - 'regex' => '/^[\w\.\-]{2,255}\.[a-zA-Z\-]{2,10}$/', + 'regex' => '/^[\w\.\-]{1,255}\.[a-zA-Z\-]{2,10}$/', 'errmsg'=> 'domain_error_regex'), ), 'default' => '', diff --git a/interface/web/mail/form/mail_relay_domain.tform.php b/interface/web/mail/form/mail_relay_domain.tform.php new file mode 100644 index 0000000000000000000000000000000000000000..4e2523309deb99e75bece53334e23464748cd905 --- /dev/null +++ b/interface/web/mail/form/mail_relay_domain.tform.php @@ -0,0 +1,151 @@ +<?php + +/* +Copyright (c) 2021, Jesse Norell <jesse@kci.net> +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of ISPConfig nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + Form Definition + + Tabledefinition + + Datatypes: + - INTEGER (Forces the input to Int) + - DOUBLE + - CURRENCY (Formats the values to currency notation) + - VARCHAR (no format check, maxlength: 255) + - TEXT (no format check) + - DATE (Dateformat, automatic conversion to timestamps) + + Formtype: + - TEXT (Textfield) + - TEXTAREA (Textarea) + - PASSWORD (Password textfield, input is not shown when edited) + - SELECT (Select option field) + - RADIO + - CHECKBOX + - CHECKBOXARRAY + - FILE + + VALUE: + - Wert oder Array + + Hint: + The ID field of the database table is not part of the datafield definition. + The ID field must be always auto incement (int or bigint). + + +*/ + +$form["title"] = "mail_relay_domain_title"; +$form["description"] = ""; +$form["name"] = "mail_relay_domain"; +$form["action"] = "mail_relay_domain_edit.php"; +$form["db_table"] = "mail_relay_domain"; +$form["db_table_idx"] = "relay_domain_id"; +$form["db_history"] = "yes"; +$form["tab_default"] = "relay_domain"; +$form["list_default"] = "mail_relay_domain_list.php"; +$form["auth"] = 'yes'; // yes / no + +$form["auth_preset"]["userid"] = 0; // 0 = id of the user, > 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['relay_domain'] = array ( + 'title' => "tab_relay_domain_title", + 'width' => 100, + 'template' => "templates/mail_relay_domain_edit.htm", + 'fields' => array ( + //################################# + // Begin Datatable fields + //################################# + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE mail_server = 1 AND mirror_server_id = 0 AND {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'value' => '' + ), + 'domain' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'filters' => array( 0 => array( 'event' => 'SAVE', + 'type' => 'IDNTOASCII'), + 1 => array( 'event' => 'SHOW', + 'type' => 'IDNTOUTF8'), + 2 => array( 'event' => 'SAVE', + 'type' => 'TOLOWER'), + 3 => array( 'event' => 'SAVE', + 'type' => 'STRIPNL'), + ), + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg' => 'domain_error_empty'), + 1 => array ( 'type' => 'ISDOMAIN', + 'errmsg' => 'domain_error_regex'), + 2 => array ( 'type' => 'CUSTOM', + 'class' => 'validate_mail_relay_domain', + 'function' => 'validate_domain', + 'errmsg' => 'domain_error_unique'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255', + ), + 'access' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'filters' => array( + 0 => array( 'event' => 'SAVE', + 'type' => 'STRIPTAGS'), + 1 => array( 'event' => 'SAVE', + 'type' => 'STRIPNL') + ), + 'default' => 'OK', + 'value' => 'OK', + 'width' => '30', + 'maxlength' => '255' + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n', 1 => 'y') + ), + //################################# + // END Datatable fields + //################################# + ) +); + diff --git a/interface/web/mail/form/mail_transport.tform.php b/interface/web/mail/form/mail_transport.tform.php index b40ad86e8ad15a590f0f57efcd961fa272020776..deb83d629d9d8aa276e45f85f29d8bc57235050d 100644 --- a/interface/web/mail/form/mail_transport.tform.php +++ b/interface/web/mail/form/mail_transport.tform.php @@ -88,6 +88,14 @@ $form["tabs"]['transport'] = array ( 4 => array( 'event' => 'SAVE', 'type' => 'STRIPNL') ), + 'validators' => array( + 0 => array( + 'type' => 'CUSTOM', + 'class' => 'validate_mail_transport', + 'function' => 'validate_domain', + 'errmsg'=> 'domain_error_unique', + ) + ), 'default' => '', 'value' => '', 'width' => '30', diff --git a/interface/web/mail/form/mail_user.tform.php b/interface/web/mail/form/mail_user.tform.php index 982d79474dc558b5aa3bc7239626599682904224..32e58686e28a16d312fd2884e3d3d0d1bc6e34cc 100644 --- a/interface/web/mail/form/mail_user.tform.php +++ b/interface/web/mail/form/mail_user.tform.php @@ -44,8 +44,8 @@ $global_config = $app->getconf->get_global_config(); $backup_available = true; if(!$app->auth->is_admin()) { $client_group_id = $_SESSION['s']['user']['default_group']; - $client = $app->db->queryOneRecord("SELECT limit_backup FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $client_group_id); - if($client['limit_backup'] != 'y') $backup_available = false; + $client = $app->db->queryOneRecord("SELECT limit_mail_backup FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $client_group_id); + if($client['limit_mail_backup'] != 'y') $backup_available = false; } $form["title"] = "Mailbox"; diff --git a/interface/web/mail/form/mail_user_filter.tform.php b/interface/web/mail/form/mail_user_filter.tform.php index 1e5980af2d57419bc90b997c55512bd7e9bab2bb..f0ae4b6611af70d79648710b9dd88669379da496 100644 --- a/interface/web/mail/form/mail_user_filter.tform.php +++ b/interface/web/mail/form/mail_user_filter.tform.php @@ -121,7 +121,7 @@ $form["tabs"]['filter'] = array ( 'datatype' => 'VARCHAR', 'formtype' => 'TEXT', 'validators' => array ( 0 => array ( 'type' => 'REGEX', - 'regex' => '/^[\p{Latin}0-9\.\-\_\ \&\/]{0,100}$/u', + 'regex' => '/^[\p{Latin}0-9\.\'\-\_\ \&\/]{0,100}$/u', 'errmsg'=> 'target_error_regex'), ), 'default' => '', diff --git a/interface/web/mail/form/spamfilter_users.tform.php b/interface/web/mail/form/spamfilter_users.tform.php index 65f196b9879be55f37d170b3a447f8395f0ec946..1bb7b5f682f0ce0e221f4e3f00708ad6163ba1d3 100644 --- a/interface/web/mail/form/spamfilter_users.tform.php +++ b/interface/web/mail/form/spamfilter_users.tform.php @@ -78,7 +78,7 @@ $form["tabs"]['users'] = array ( 'policy_id' => array ( 'datatype' => 'INTEGER', 'formtype' => 'SELECT', - 'default' => '5', + 'default' => '0', 'datasource' => array ( 'type' => 'SQL', 'querystring' => 'SELECT id,policy_name FROM spamfilter_policy WHERE {AUTHSQL} ORDER BY policy_name', 'keyfield'=> 'id', diff --git a/interface/web/mail/form/xmpp_domain.tform.php b/interface/web/mail/form/xmpp_domain.tform.php index c703b0bea39b43c60df6234488dc994262a1b5d6..28262923b95f06125faf8c29c88ac4f567c144cd 100644 --- a/interface/web/mail/form/xmpp_domain.tform.php +++ b/interface/web/mail/form/xmpp_domain.tform.php @@ -103,7 +103,7 @@ $form["tabs"]['domain'] = array ( 1 => array ( 'type' => 'UNIQUE', 'errmsg'=> 'domain_error_unique'), 2 => array ( 'type' => 'REGEX', - 'regex' => '/^[\w\.\-]{2,255}\.[a-zA-Z0-9\-]{2,63}$/', + 'regex' => '/^[\w\.\-]{1,255}\.[a-zA-Z0-9\-]{2,63}$/', 'errmsg'=> 'domain_error_regex'), ), 'default' => '', diff --git a/interface/web/mail/lib/lang/ar_mail_alias.lng b/interface/web/mail/lib/lang/ar_mail_alias.lng index 32a6b85e4e677aa5e0d117cc9abd4f195ef4f16d..fbfd79b501cc5e00aebbd003966d1eac8097db33 100644 --- a/interface/web/mail/lib/lang/ar_mail_alias.lng +++ b/interface/web/mail/lib/lang/ar_mail_alias.lng @@ -3,9 +3,9 @@ $wb['email_txt'] = 'Email'; $wb['destination_txt'] = 'Destination'; $wb['active_txt'] = 'Active'; $wb['email_error_isemail'] = 'Email address is invalid.'; -$wb['email_error_unique'] = 'Duplicate Emailaddress.'; +$wb['email_error_unique'] = 'Duplicate Email Address.'; $wb['no_domain_perm'] = 'You have no permission for this domain.'; -$wb['destination_error_isemail'] = 'Destination Emailaddress is invalid.'; +$wb['destination_error_isemail'] = 'Destination Email Address is invalid.'; $wb['limit_mailalias_txt'] = 'The max. number of email aliases for your account is reached.'; $wb['duplicate_mailbox_txt'] = 'There is already a mailbox with this email address'; $wb['domain_txt'] = 'Domain'; @@ -14,4 +14,3 @@ $wb['source_txt'] = 'Alias'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this alias as origin'; -?> diff --git a/interface/web/mail/lib/lang/ar_mail_forward.lng b/interface/web/mail/lib/lang/ar_mail_forward.lng index 3f9cfa956b329bc9f19e1316f32429ea5a5da1c5..29d0d91a57f15cb67934d18116cff14450a7009f 100644 --- a/interface/web/mail/lib/lang/ar_mail_forward.lng +++ b/interface/web/mail/lib/lang/ar_mail_forward.lng @@ -10,6 +10,6 @@ $wb['greylisting_txt'] = 'Enable greylisting'; $wb['destination_error_empty'] = 'The destination must not be empty.'; $wb['destination_error_isemail'] = 'The destination contains at least one invalid email address.'; $wb['email_error_isemail'] = 'Please enter a valid email address.'; +$wb['email_error_unique'] = 'Duplicate Email Address.'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this address as origin (if target is internal)'; -?> diff --git a/interface/web/mail/lib/lang/ar_mail_relay_domain.lng b/interface/web/mail/lib/lang/ar_mail_relay_domain.lng new file mode 100644 index 0000000000000000000000000000000000000000..e5296a9a9bba1dea5a068c7cef8187e5d4e51a4f --- /dev/null +++ b/interface/web/mail/lib/lang/ar_mail_relay_domain.lng @@ -0,0 +1,9 @@ +<?php +$wb['mail_relay_domain_title'] = 'Email relay domain'; +$wb['tab_relay_domain_title'] = 'Relay domain'; +$wb['server_id_txt'] = 'Server'; +$wb['active_txt'] = 'Active'; +$wb['domain_txt'] = 'Domain'; +$wb['domain_error_regex'] = 'Invalid domain name.'; +$wb['domain_error_empty'] = 'Domain is empty.'; +$wb['domain_error_unique'] = 'This Domain already exists as a mail relay domain on this server.'; diff --git a/interface/web/mail/lib/lang/ar_mail_relay_domain_list.lng b/interface/web/mail/lib/lang/ar_mail_relay_domain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..e33b3bde4b1d93aca533bc9d806d4fe34e08dded --- /dev/null +++ b/interface/web/mail/lib/lang/ar_mail_relay_domain_list.lng @@ -0,0 +1,7 @@ +<?php +$wb['list_head_txt'] = 'Relay domains'; +$wb['active_txt'] = 'Active'; +$wb['server_id_txt'] = 'Server'; +$wb['domain_txt'] = 'Domain'; +$wb['add_new_record_txt'] = 'Add new relay domain'; +$wb['access_txt'] = 'access'; diff --git a/interface/web/mail/lib/lang/ar_mail_transport.lng b/interface/web/mail/lib/lang/ar_mail_transport.lng index c2498634693c8e60c96e28f6d666f8e9c2e8cbdf..16c33c02011d4bec352ffdde12a70234d51aeab7 100644 --- a/interface/web/mail/lib/lang/ar_mail_transport.lng +++ b/interface/web/mail/lib/lang/ar_mail_transport.lng @@ -8,4 +8,4 @@ $wb['sort_order_txt'] = 'Sort by'; $wb['active_txt'] = 'Active'; $wb['limit_mailrouting_txt'] = 'The max. number of routes for your account is reached.'; $wb['transport_txt'] = 'Transport'; -?> +$wb['domain_error_unique'] = 'A mail transport for this Domain already exists on this server.'; diff --git a/interface/web/mail/lib/lang/ar_spamfilter_users.lng b/interface/web/mail/lib/lang/ar_spamfilter_users.lng index efe95b5c7f1bad9138a1a9c141787f1f06141c6d..05d0ca9bd627de80cdd373cfe5fe80af517ff484 100644 --- a/interface/web/mail/lib/lang/ar_spamfilter_users.lng +++ b/interface/web/mail/lib/lang/ar_spamfilter_users.lng @@ -10,4 +10,4 @@ $wb['fullname_error_notempty'] = 'The name must not be empty.'; $wb['10 - highest'] = '10 - highest'; $wb['5 - medium'] = '5 - medium'; $wb['1 - lowest'] = '1 - lowest'; -?> +$wb['inherit_policy'] = '- Inherit domain setting -'; diff --git a/interface/web/mail/lib/lang/bg_mail_alias.lng b/interface/web/mail/lib/lang/bg_mail_alias.lng index 32a6b85e4e677aa5e0d117cc9abd4f195ef4f16d..fbfd79b501cc5e00aebbd003966d1eac8097db33 100644 --- a/interface/web/mail/lib/lang/bg_mail_alias.lng +++ b/interface/web/mail/lib/lang/bg_mail_alias.lng @@ -3,9 +3,9 @@ $wb['email_txt'] = 'Email'; $wb['destination_txt'] = 'Destination'; $wb['active_txt'] = 'Active'; $wb['email_error_isemail'] = 'Email address is invalid.'; -$wb['email_error_unique'] = 'Duplicate Emailaddress.'; +$wb['email_error_unique'] = 'Duplicate Email Address.'; $wb['no_domain_perm'] = 'You have no permission for this domain.'; -$wb['destination_error_isemail'] = 'Destination Emailaddress is invalid.'; +$wb['destination_error_isemail'] = 'Destination Email Address is invalid.'; $wb['limit_mailalias_txt'] = 'The max. number of email aliases for your account is reached.'; $wb['duplicate_mailbox_txt'] = 'There is already a mailbox with this email address'; $wb['domain_txt'] = 'Domain'; @@ -14,4 +14,3 @@ $wb['source_txt'] = 'Alias'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this alias as origin'; -?> diff --git a/interface/web/mail/lib/lang/bg_mail_forward.lng b/interface/web/mail/lib/lang/bg_mail_forward.lng index b5c80dd89d244a76039b09d25322a3dce8939b19..10193da7400de18125cec689119a2023c027bb3f 100644 --- a/interface/web/mail/lib/lang/bg_mail_forward.lng +++ b/interface/web/mail/lib/lang/bg_mail_forward.lng @@ -10,6 +10,6 @@ $wb['greylisting_txt'] = 'Enable greylisting'; $wb['destination_error_empty'] = 'The destination must not be empty.'; $wb['destination_error_isemail'] = 'The destination contains at least one invalid email address.'; $wb['email_error_isemail'] = 'Please enter a valid email address.'; +$wb['email_error_unique'] = 'Duplicate Email Address.'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this address as origin (if target is internal)'; -?> diff --git a/interface/web/mail/lib/lang/bg_mail_relay_domain.lng b/interface/web/mail/lib/lang/bg_mail_relay_domain.lng new file mode 100644 index 0000000000000000000000000000000000000000..0da8a0a2460de3082333bc0ba84fd1d2da82b416 --- /dev/null +++ b/interface/web/mail/lib/lang/bg_mail_relay_domain.lng @@ -0,0 +1,9 @@ +<?php +$wb['mail_relay_domain_title'] = 'Email relay domain'; +$wb['tab_relay_domain_title'] = 'Relay domain'; +$wb['server_id_txt'] = 'Сървър'; +$wb['active_txt'] = 'Ðктивен'; +$wb['domain_txt'] = 'Домейн'; +$wb['domain_error_regex'] = 'Invalid domain name.'; +$wb['domain_error_empty'] = 'Полето Ñ Ð´Ð¾Ð¼ÐµÐ¹Ð½ е празно.'; +$wb['domain_error_unique'] = 'This Domain already exists as a mail relay domain on this server.'; diff --git a/interface/web/mail/lib/lang/bg_mail_relay_domain_list.lng b/interface/web/mail/lib/lang/bg_mail_relay_domain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..be92be35babeb5e5c43977c820e2eec2813d5de7 --- /dev/null +++ b/interface/web/mail/lib/lang/bg_mail_relay_domain_list.lng @@ -0,0 +1,7 @@ +<?php +$wb['list_head_txt'] = 'Relay domains'; +$wb['active_txt'] = 'Ðктивен'; +$wb['server_id_txt'] = 'Сървър'; +$wb['domain_txt'] = 'Домейн'; +$wb['add_new_record_txt'] = 'Add new relay domain'; +$wb['access_txt'] = 'access'; diff --git a/interface/web/mail/lib/lang/bg_mail_transport.lng b/interface/web/mail/lib/lang/bg_mail_transport.lng index 57394dc218e8881a9fd8b26319b54a5c1b865981..0f4a8db0b8c3622568c06f5694c1f41732c0a0ac 100644 --- a/interface/web/mail/lib/lang/bg_mail_transport.lng +++ b/interface/web/mail/lib/lang/bg_mail_transport.lng @@ -8,4 +8,4 @@ $wb['sort_order_txt'] = 'Сортирай по'; $wb['active_txt'] = 'Ðктивен'; $wb['limit_mailrouting_txt'] = 'The max. number of routes for your account is reached.'; $wb['transport_txt'] = 'Transport'; -?> +$wb['domain_error_unique'] = 'A mail transport for this Domain already exists on this server.'; diff --git a/interface/web/mail/lib/lang/bg_spamfilter_users.lng b/interface/web/mail/lib/lang/bg_spamfilter_users.lng index efe95b5c7f1bad9138a1a9c141787f1f06141c6d..05d0ca9bd627de80cdd373cfe5fe80af517ff484 100644 --- a/interface/web/mail/lib/lang/bg_spamfilter_users.lng +++ b/interface/web/mail/lib/lang/bg_spamfilter_users.lng @@ -10,4 +10,4 @@ $wb['fullname_error_notempty'] = 'The name must not be empty.'; $wb['10 - highest'] = '10 - highest'; $wb['5 - medium'] = '5 - medium'; $wb['1 - lowest'] = '1 - lowest'; -?> +$wb['inherit_policy'] = '- Inherit domain setting -'; diff --git a/interface/web/mail/lib/lang/br_mail_forward.lng b/interface/web/mail/lib/lang/br_mail_forward.lng index dd1eb9bb561d4c3e421225e11e4b5f17d1de472c..396262d7873dcc355a23ecc707ac205bbad750c4 100644 --- a/interface/web/mail/lib/lang/br_mail_forward.lng +++ b/interface/web/mail/lib/lang/br_mail_forward.lng @@ -9,6 +9,7 @@ $wb['source_txt'] = 'Endereço de email de origem'; $wb['destination_error_empty'] = 'O endereço de email de destino não pode ficar vazio.'; $wb['destination_error_isemail'] = 'O endereço de email de destino é inválido.'; $wb['email_error_isemail'] = 'Por favor informe um endereço de email válido.'; +$wb['email_error_unique'] = 'Endereço de email duplicado.'; $wb['send_as_txt'] = 'Enviar como'; $wb['send_as_exp'] = 'Permitir o destino enviar emails usando este endereço como origem (se o destino for interno)'; $wb['greylisting_txt'] = 'Habilitar greylist'; diff --git a/interface/web/mail/lib/lang/br_mail_relay_domain.lng b/interface/web/mail/lib/lang/br_mail_relay_domain.lng new file mode 100644 index 0000000000000000000000000000000000000000..b992e63aa23c2efd58b3d8e1fc787f46170a43d1 --- /dev/null +++ b/interface/web/mail/lib/lang/br_mail_relay_domain.lng @@ -0,0 +1,9 @@ +<?php +$wb['mail_relay_domain_title'] = 'Email relay domain'; +$wb['tab_relay_domain_title'] = 'Relay domain'; +$wb['server_id_txt'] = 'Servidor'; +$wb['active_txt'] = 'Ativo'; +$wb['domain_txt'] = 'DomÃnio'; +$wb['domain_error_regex'] = 'O domÃnio é inválido.'; +$wb['domain_error_empty'] = 'O domÃnio está vazio.'; +$wb['domain_error_unique'] = 'This Domain already exists as a mail relay domain on this server.'; diff --git a/interface/web/mail/lib/lang/br_mail_relay_domain_list.lng b/interface/web/mail/lib/lang/br_mail_relay_domain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..95cda7fde6bdaefa600c46fbd23cd9b8e4294a62 --- /dev/null +++ b/interface/web/mail/lib/lang/br_mail_relay_domain_list.lng @@ -0,0 +1,7 @@ +<?php +$wb['list_head_txt'] = 'Relay domains'; +$wb['active_txt'] = 'Ativo'; +$wb['server_id_txt'] = 'Servidor'; +$wb['domain_txt'] = 'DomÃnio'; +$wb['add_new_record_txt'] = 'Add new relay domain'; +$wb['access_txt'] = 'acesso'; diff --git a/interface/web/mail/lib/lang/br_mail_transport.lng b/interface/web/mail/lib/lang/br_mail_transport.lng index 3f87343dbcdd47e9f56b27b571a60ba7b10a01be..afe35c1a7e66a60aeab27c235fd88c581df9d8df 100644 --- a/interface/web/mail/lib/lang/br_mail_transport.lng +++ b/interface/web/mail/lib/lang/br_mail_transport.lng @@ -8,3 +8,4 @@ $wb['sort_order_txt'] = 'Ordenar por'; $wb['active_txt'] = 'Ativo'; $wb['limit_mailrouting_txt'] = 'O limite de rotas de email para esta conta foi alcançado.'; $wb['transport_txt'] = 'Transporte'; +$wb['domain_error_unique'] = 'A mail transport for this Domain already exists on this server.'; diff --git a/interface/web/mail/lib/lang/br_spamfilter_users.lng b/interface/web/mail/lib/lang/br_spamfilter_users.lng index d18fbc13a9f29a018258c23b254bd2c2bacb45a4..bdc989833e5bc2af51ba8c3d5fe4b3f06221b59f 100644 --- a/interface/web/mail/lib/lang/br_spamfilter_users.lng +++ b/interface/web/mail/lib/lang/br_spamfilter_users.lng @@ -10,3 +10,4 @@ $wb['fullname_error_notempty'] = 'Nome está vazio.'; $wb['10 - highest'] = '10 - alta'; $wb['5 - medium'] = '5 - média'; $wb['1 - lowest'] = '1 - baixa'; +$wb['inherit_policy'] = '- Herdar configuração de domÃnio -'; diff --git a/interface/web/mail/lib/lang/ca_mail_alias.lng b/interface/web/mail/lib/lang/ca_mail_alias.lng index a1c3eacb67bdba9de1cc9644a3ee403204e78dbe..0b8d9b0e45bec427d980495d66f229d8822be46e 100644 --- a/interface/web/mail/lib/lang/ca_mail_alias.lng +++ b/interface/web/mail/lib/lang/ca_mail_alias.lng @@ -14,4 +14,3 @@ $wb['source_txt'] = 'Alias'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this alias as origin'; $wb['greylisting_txt'] = 'Enable greylisting'; -?> diff --git a/interface/web/mail/lib/lang/ca_mail_forward.lng b/interface/web/mail/lib/lang/ca_mail_forward.lng index 7b8feb1e8f1d7bdcd3b58b02dd897f7adaf2fc2b..2f9d26288f803cd20de14cf7d4f000f69580341a 100644 --- a/interface/web/mail/lib/lang/ca_mail_forward.lng +++ b/interface/web/mail/lib/lang/ca_mail_forward.lng @@ -9,7 +9,7 @@ $wb['source_txt'] = 'Source courriel'; $wb['destination_error_empty'] = 'The destination must not be empty.'; $wb['destination_error_isemail'] = 'The destination contains at least one invalid email address.'; $wb['email_error_isemail'] = 'Please enter a valid email address.'; +$wb['email_error_unique'] = 'Dupliquer l\'adresse courriel.'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this address as origin (if target is internal)'; $wb['greylisting_txt'] = 'Enable greylisting'; -?> diff --git a/interface/web/mail/lib/lang/ca_mail_relay_domain.lng b/interface/web/mail/lib/lang/ca_mail_relay_domain.lng new file mode 100644 index 0000000000000000000000000000000000000000..b6e9d8f2fbc31cb5774d3bfc99e8b949c7f26de3 --- /dev/null +++ b/interface/web/mail/lib/lang/ca_mail_relay_domain.lng @@ -0,0 +1,9 @@ +<?php +$wb['mail_relay_domain_title'] = 'Email relay domain'; +$wb['tab_relay_domain_title'] = 'Relay domain'; +$wb['server_id_txt'] = 'Serveur'; +$wb['active_txt'] = 'Actif'; +$wb['domain_txt'] = 'Domaine'; +$wb['domain_error_regex'] = 'Nom de domaine invalide.'; +$wb['domain_error_empty'] = 'Le domain est vide.'; +$wb['domain_error_unique'] = 'This Domain already exists as a mail relay domain on this server.'; diff --git a/interface/web/mail/lib/lang/ca_mail_relay_domain_list.lng b/interface/web/mail/lib/lang/ca_mail_relay_domain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..771b9619745c862e78ca540c91b546a5ab76df36 --- /dev/null +++ b/interface/web/mail/lib/lang/ca_mail_relay_domain_list.lng @@ -0,0 +1,7 @@ +<?php +$wb['list_head_txt'] = 'Relay domains'; +$wb['active_txt'] = 'Actif'; +$wb['server_id_txt'] = 'Serveur'; +$wb['domain_txt'] = 'Domaine'; +$wb['add_new_record_txt'] = 'Add new relay domain'; +$wb['access_txt'] = 'accès'; diff --git a/interface/web/mail/lib/lang/ca_mail_transport.lng b/interface/web/mail/lib/lang/ca_mail_transport.lng index f8a5536560d4ae94e0cd63336f3a39f92ce4b276..7b12c7d0eb919596e0c0e05f40dec15c00e6b85a 100644 --- a/interface/web/mail/lib/lang/ca_mail_transport.lng +++ b/interface/web/mail/lib/lang/ca_mail_transport.lng @@ -8,4 +8,4 @@ $wb['sort_order_txt'] = 'Trier par'; $wb['active_txt'] = 'Actif'; $wb['limit_mailrouting_txt'] = 'Le nombre maximal de routes pour votre compte a été atteint.'; $wb['transport_txt'] = 'Transport'; -?> +$wb['domain_error_unique'] = 'A mail transport for this Domain already exists on this server.'; diff --git a/interface/web/mail/lib/lang/ca_spamfilter_users.lng b/interface/web/mail/lib/lang/ca_spamfilter_users.lng index 9c7d5bbe7a645145c386eb32654ffc0f50bb72cc..a54e84e6080587f2f4a130ef1f530e3cdfbbe63f 100644 --- a/interface/web/mail/lib/lang/ca_spamfilter_users.lng +++ b/interface/web/mail/lib/lang/ca_spamfilter_users.lng @@ -10,4 +10,4 @@ $wb['fullname_error_notempty'] = 'The name must not be empty.'; $wb['10 - highest'] = '10 - highest'; $wb['5 - medium'] = '5 - medium'; $wb['1 - lowest'] = '1 - lowest'; -?> +$wb['inherit_policy'] = '- Inherit domain setting -'; diff --git a/interface/web/mail/lib/lang/cz_mail_forward.lng b/interface/web/mail/lib/lang/cz_mail_forward.lng index f1deae40814462d93153dddc247f3dab09176521..1faa74c26c76256486743c0de979a436f422e620 100644 --- a/interface/web/mail/lib/lang/cz_mail_forward.lng +++ b/interface/web/mail/lib/lang/cz_mail_forward.lng @@ -9,6 +9,7 @@ $wb['source_txt'] = 'Zdrojový e-mail'; $wb['destination_error_empty'] = 'The destination must not be empty.'; $wb['destination_error_isemail'] = 'The destination contains at least one invalid email address.'; $wb['email_error_isemail'] = 'Zadejte prosÃm platnou e-mailovou adresu.'; +$wb['email_error_unique'] = 'Duplikovánà e-mailové adresy.'; $wb['send_as_txt'] = 'Odeslat jako'; $wb['send_as_exp'] = 'Allow target to send mail using this address as origin (if target is internal)'; $wb['greylisting_txt'] = 'Povolit greylisting'; diff --git a/interface/web/mail/lib/lang/cz_mail_relay_domain.lng b/interface/web/mail/lib/lang/cz_mail_relay_domain.lng new file mode 100644 index 0000000000000000000000000000000000000000..e5563fd535103835a8617052885fddf4c527985c --- /dev/null +++ b/interface/web/mail/lib/lang/cz_mail_relay_domain.lng @@ -0,0 +1,9 @@ +<?php +$wb['mail_relay_domain_title'] = 'Email relay domain'; +$wb['tab_relay_domain_title'] = 'Relay domain'; +$wb['server_id_txt'] = 'Server'; +$wb['active_txt'] = 'AktivnÃ'; +$wb['domain_txt'] = 'Doména'; +$wb['domain_error_regex'] = 'Neplatný název domény.'; +$wb['domain_error_empty'] = 'Doména je prázdná.'; +$wb['domain_error_unique'] = 'This Domain already exists as a mail relay domain on this server.'; diff --git a/interface/web/mail/lib/lang/cz_mail_relay_domain_list.lng b/interface/web/mail/lib/lang/cz_mail_relay_domain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..1932abfa9f7b3e0dbc11763784256de8d243ec5e --- /dev/null +++ b/interface/web/mail/lib/lang/cz_mail_relay_domain_list.lng @@ -0,0 +1,7 @@ +<?php +$wb['list_head_txt'] = 'Relay domains'; +$wb['active_txt'] = 'AktivnÃ'; +$wb['server_id_txt'] = 'Server'; +$wb['domain_txt'] = 'Doména'; +$wb['add_new_record_txt'] = 'Add new relay domain'; +$wb['access_txt'] = 'PÅ™Ãstup'; diff --git a/interface/web/mail/lib/lang/cz_mail_transport.lng b/interface/web/mail/lib/lang/cz_mail_transport.lng index 14c7dc2934dc5b746ba603930f3ae0a43228a654..d2dfec591f9725f767c41a8193da82a8f9fd35c7 100644 --- a/interface/web/mail/lib/lang/cz_mail_transport.lng +++ b/interface/web/mail/lib/lang/cz_mail_transport.lng @@ -8,3 +8,4 @@ $wb['sort_order_txt'] = 'TÅ™Ãdit podle'; $wb['active_txt'] = 'AktivnÃ'; $wb['limit_mailrouting_txt'] = 'Byl dosažen maximálnà poÄet e-mail smÄ›rovánà pro Váš úÄet.'; $wb['transport_txt'] = 'Transport'; +$wb['domain_error_unique'] = 'A mail transport for this Domain already exists on this server.'; diff --git a/interface/web/mail/lib/lang/cz_spamfilter_users.lng b/interface/web/mail/lib/lang/cz_spamfilter_users.lng index f2fff323f4a71ebb187aa7f983b7593b7b12bed5..8c66a071440a39562bc05da565acbfe804741971 100644 --- a/interface/web/mail/lib/lang/cz_spamfilter_users.lng +++ b/interface/web/mail/lib/lang/cz_spamfilter_users.lng @@ -10,3 +10,4 @@ $wb['fullname_error_notempty'] = 'Jméno nesmà být prázdné.'; $wb['10 - highest'] = '10 - nejvyššÃ'; $wb['5 - medium'] = '5 - stÅ™ednÃ'; $wb['1 - lowest'] = '1 - nejnižšÃ'; +$wb['inherit_policy'] = '- ZdÄ›dit nastavenà od domény -'; diff --git a/interface/web/mail/lib/lang/de_mail_alias.lng b/interface/web/mail/lib/lang/de_mail_alias.lng index 4cdcd03a6f9e607366f59e7b5d555c1d08cd9d34..7d8099fdcaaa8eb62479a398306e340e3cecc671 100644 --- a/interface/web/mail/lib/lang/de_mail_alias.lng +++ b/interface/web/mail/lib/lang/de_mail_alias.lng @@ -14,4 +14,3 @@ $wb['source_txt'] = 'Alias'; $wb['send_as_txt'] = 'Senden als'; $wb['send_as_exp'] = 'Ziel erlauben, den Alias als Absender zu benutzen'; $wb['greylisting_txt'] = 'Aktiviere Greylisting'; -?> diff --git a/interface/web/mail/lib/lang/de_mail_forward.lng b/interface/web/mail/lib/lang/de_mail_forward.lng index 4825ef781121cf0e4cfea82145863170b505df65..4435ce707c3dbfb6104dc56796762daca72e4e52 100644 --- a/interface/web/mail/lib/lang/de_mail_forward.lng +++ b/interface/web/mail/lib/lang/de_mail_forward.lng @@ -9,7 +9,7 @@ $wb['source_txt'] = 'Quell E-Mail Adresse'; $wb['destination_error_empty'] = 'Das Weiterleitungsziel darf nicht leer sein.'; $wb['destination_error_isemail'] = 'Das Weiterleitungsziel enthält mindestens eine ungültige E-Mail-Adresse.'; $wb['email_error_isemail'] = 'Bitte geben Sie eine gültige E-Mail Adresse an.'; +$wb['email_error_unique'] = 'Doppelte E-Mail Adresse.'; $wb['send_as_txt'] = 'Senden als'; $wb['send_as_exp'] = 'Ziel erlauben, die Adresse als Absender zu nutzen (Nur, falls das Ziel intern ist)'; $wb['greylisting_txt'] = 'Aktiviere greylisting'; -?> diff --git a/interface/web/mail/lib/lang/de_mail_relay_domain.lng b/interface/web/mail/lib/lang/de_mail_relay_domain.lng new file mode 100644 index 0000000000000000000000000000000000000000..6c0456a2c242ba694164f33ba5f1b35b11b2e6dd --- /dev/null +++ b/interface/web/mail/lib/lang/de_mail_relay_domain.lng @@ -0,0 +1,9 @@ +<?php +$wb['mail_relay_domain_title'] = 'Email relay domain'; +$wb['tab_relay_domain_title'] = 'Relay domain'; +$wb['server_id_txt'] = 'Server'; +$wb['active_txt'] = 'Aktiv'; +$wb['domain_txt'] = 'Domain'; +$wb['domain_error_regex'] = 'Domain Name ist nicht gültig.'; +$wb['domain_error_empty'] = 'Domain ist leer.'; +$wb['domain_error_unique'] = 'This Domain already exists as a mail relay domain on this server.'; diff --git a/interface/web/mail/lib/lang/de_mail_relay_domain_list.lng b/interface/web/mail/lib/lang/de_mail_relay_domain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..833a055963ee2389b0b93216ce1554142eef59ce --- /dev/null +++ b/interface/web/mail/lib/lang/de_mail_relay_domain_list.lng @@ -0,0 +1,7 @@ +<?php +$wb['list_head_txt'] = 'Relay domains'; +$wb['active_txt'] = 'Aktiv'; +$wb['server_id_txt'] = 'Server'; +$wb['domain_txt'] = 'Domain'; +$wb['add_new_record_txt'] = 'Add new relay domain'; +$wb['access_txt'] = 'Zugriff'; diff --git a/interface/web/mail/lib/lang/de_mail_transport.lng b/interface/web/mail/lib/lang/de_mail_transport.lng index 873036f947329e3df2ef874909f4dc0749954aef..724882866f968c6d4ac11da1576c41d781db4d90 100644 --- a/interface/web/mail/lib/lang/de_mail_transport.lng +++ b/interface/web/mail/lib/lang/de_mail_transport.lng @@ -8,4 +8,4 @@ $wb['sort_order_txt'] = 'Sortiert nach'; $wb['active_txt'] = 'Aktiv'; $wb['limit_mailrouting_txt'] = 'Die maximale Anzahl an E-Mail Routen für Ihr Konto wurde erreicht.'; $wb['transport_txt'] = 'Transport'; -?> +$wb['domain_error_unique'] = 'A mail transport for this Domain already exists on this server.'; diff --git a/interface/web/mail/lib/lang/de_spamfilter_users.lng b/interface/web/mail/lib/lang/de_spamfilter_users.lng index 9322c804664200e59122b34b0ab1f1e2d57bf722..d6b148cbe3153ab5343b5faaeffd2b925d0693ac 100644 --- a/interface/web/mail/lib/lang/de_spamfilter_users.lng +++ b/interface/web/mail/lib/lang/de_spamfilter_users.lng @@ -10,4 +10,4 @@ $wb['fullname_error_notempty'] = 'Der Name darf nicht leer sein.'; $wb['10 - highest'] = '10 - höchste'; $wb['5 - medium'] = '5 - normal'; $wb['1 - lowest'] = '1 - niedrigste'; -?> +$wb['inherit_policy'] = '- Inherit domain setting -'; diff --git a/interface/web/mail/lib/lang/dk_mail_alias.lng b/interface/web/mail/lib/lang/dk_mail_alias.lng index 19b41120012e0cc2f2e804eec5553ba89b6e820d..c0a66126f247342f72f4b7ac734fde0831266ce9 100644 --- a/interface/web/mail/lib/lang/dk_mail_alias.lng +++ b/interface/web/mail/lib/lang/dk_mail_alias.lng @@ -14,4 +14,3 @@ $wb['source_txt'] = 'Alias'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this alias as origin'; $wb['greylisting_txt'] = 'Enable greylisting'; -?> diff --git a/interface/web/mail/lib/lang/dk_mail_forward.lng b/interface/web/mail/lib/lang/dk_mail_forward.lng index ba47d8421d438cea4b5c29871bd1351c0bca2731..55939b9deb0bfd2b9addaea5fd0824e65877567d 100644 --- a/interface/web/mail/lib/lang/dk_mail_forward.lng +++ b/interface/web/mail/lib/lang/dk_mail_forward.lng @@ -9,7 +9,7 @@ $wb['source_txt'] = 'Kilde E-mail'; $wb['destination_error_empty'] = 'The destination must not be empty.'; $wb['destination_error_isemail'] = 'The destination contains at least one invalid email address.'; $wb['email_error_isemail'] = 'Please enter a valid email address.'; +$wb['email_error_unique'] = 'Dupliker E-mailadresse.'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this address as origin (if target is internal)'; $wb['greylisting_txt'] = 'Enable greylisting'; -?> diff --git a/interface/web/mail/lib/lang/dk_mail_relay_domain.lng b/interface/web/mail/lib/lang/dk_mail_relay_domain.lng new file mode 100644 index 0000000000000000000000000000000000000000..d993bcd4b1533a94bc33bdfdc0bca3d8d0ee4c00 --- /dev/null +++ b/interface/web/mail/lib/lang/dk_mail_relay_domain.lng @@ -0,0 +1,9 @@ +<?php +$wb['mail_relay_domain_title'] = 'Email relay domain'; +$wb['tab_relay_domain_title'] = 'Relay domain'; +$wb['server_id_txt'] = 'Server'; +$wb['active_txt'] = 'Aktiv'; +$wb['domain_txt'] = 'Domæne'; +$wb['domain_error_regex'] = 'Ugyldigt domæne name.'; +$wb['domain_error_empty'] = 'Domæne er tom.'; +$wb['domain_error_unique'] = 'This Domain already exists as a mail relay domain on this server.'; diff --git a/interface/web/mail/lib/lang/dk_mail_relay_domain_list.lng b/interface/web/mail/lib/lang/dk_mail_relay_domain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..10479084bebd4e00c9c0220b645d09f9943e9cfa --- /dev/null +++ b/interface/web/mail/lib/lang/dk_mail_relay_domain_list.lng @@ -0,0 +1,7 @@ +<?php +$wb['list_head_txt'] = 'Relay domains'; +$wb['active_txt'] = 'Aktiv'; +$wb['server_id_txt'] = 'Server'; +$wb['domain_txt'] = 'Domæne'; +$wb['add_new_record_txt'] = 'Add new relay domain'; +$wb['access_txt'] = 'adgang'; diff --git a/interface/web/mail/lib/lang/dk_mail_transport.lng b/interface/web/mail/lib/lang/dk_mail_transport.lng index df2131cde4234714498ff56c105e6a17c5b66741..bb8a94f433d2259244de66755ad61e6634951af8 100644 --- a/interface/web/mail/lib/lang/dk_mail_transport.lng +++ b/interface/web/mail/lib/lang/dk_mail_transport.lng @@ -8,4 +8,4 @@ $wb['sort_order_txt'] = 'Sort by'; $wb['active_txt'] = 'Aktiv'; $wb['limit_mailrouting_txt'] = 'Max. antal af ruter for din konto er nÃ¥et.'; $wb['transport_txt'] = 'Transport'; -?> +$wb['domain_error_unique'] = 'A mail transport for this Domain already exists on this server.'; diff --git a/interface/web/mail/lib/lang/dk_spamfilter_users.lng b/interface/web/mail/lib/lang/dk_spamfilter_users.lng index 5b132bc77405cb7d983d9ff638076c44267fa9ca..b6d9a226d0e84031700acdb7e8522fa37975c510 100644 --- a/interface/web/mail/lib/lang/dk_spamfilter_users.lng +++ b/interface/web/mail/lib/lang/dk_spamfilter_users.lng @@ -10,4 +10,4 @@ $wb['fullname_error_notempty'] = 'Navn mÃ¥ ikke være tomt.'; $wb['10 - highest'] = '10 - højeste'; $wb['5 - medium'] = '5 - medium'; $wb['1 - lowest'] = '1 - laveste'; -?> +$wb['inherit_policy'] = '- Inherit domain setting -'; diff --git a/interface/web/mail/lib/lang/el_mail_alias.lng b/interface/web/mail/lib/lang/el_mail_alias.lng index 5663822ce05b81428fe8669a5d9fec7aa1172c0c..bcbb3220c75c41609c02b68ba10fc9705c7def6e 100644 --- a/interface/web/mail/lib/lang/el_mail_alias.lng +++ b/interface/web/mail/lib/lang/el_mail_alias.lng @@ -14,4 +14,3 @@ $wb['source_txt'] = 'Alias'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this alias as origin'; -?> diff --git a/interface/web/mail/lib/lang/el_mail_forward.lng b/interface/web/mail/lib/lang/el_mail_forward.lng index 8893b2fa0ffb886cefbceea5ad37f2d7a9ef45d0..2519aa39e8f7b9fa02e437c8bd6ce0a24c28432b 100644 --- a/interface/web/mail/lib/lang/el_mail_forward.lng +++ b/interface/web/mail/lib/lang/el_mail_forward.lng @@ -10,6 +10,6 @@ $wb['greylisting_txt'] = 'Enable greylisting'; $wb['destination_error_empty'] = 'The destination must not be empty.'; $wb['destination_error_isemail'] = 'The destination contains at least one invalid email address.'; $wb['email_error_isemail'] = 'Please enter a valid email address.'; +$wb['email_error_unique'] = 'Διπλή διεÏθυνση Email.'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this address as origin (if target is internal)'; -?> diff --git a/interface/web/mail/lib/lang/el_mail_relay_domain.lng b/interface/web/mail/lib/lang/el_mail_relay_domain.lng new file mode 100644 index 0000000000000000000000000000000000000000..6f6d698afacc6ea1070411cfc3a309f7012b42fc --- /dev/null +++ b/interface/web/mail/lib/lang/el_mail_relay_domain.lng @@ -0,0 +1,9 @@ +<?php +$wb['mail_relay_domain_title'] = 'Email relay domain'; +$wb['tab_relay_domain_title'] = 'Relay domain'; +$wb['server_id_txt'] = 'Server'; +$wb['active_txt'] = 'ΕνεÏγό'; +$wb['domain_txt'] = 'Domain'; +$wb['domain_error_regex'] = 'Το όνομα domain δεν είναι ÎγκυÏο/'; +$wb['domain_error_empty'] = 'Το Domain είναι άδειο.'; +$wb['domain_error_unique'] = 'This Domain already exists as a mail relay domain on this server.'; diff --git a/interface/web/mail/lib/lang/el_mail_relay_domain_list.lng b/interface/web/mail/lib/lang/el_mail_relay_domain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..49e51052d156d81a93688a388194fd4257e99dcc --- /dev/null +++ b/interface/web/mail/lib/lang/el_mail_relay_domain_list.lng @@ -0,0 +1,7 @@ +<?php +$wb['list_head_txt'] = 'Relay domains'; +$wb['active_txt'] = 'ΕνεÏγός'; +$wb['server_id_txt'] = 'Server'; +$wb['domain_txt'] = 'Domain'; +$wb['add_new_record_txt'] = 'Add new relay domain'; +$wb['access_txt'] = 'Ï€Ïόσβαση'; diff --git a/interface/web/mail/lib/lang/el_mail_transport.lng b/interface/web/mail/lib/lang/el_mail_transport.lng index 1b1a5c7ab4a0229b7824bf031df672fd926d7a6e..37eef348b626a7aad46a3f446537e98979d051d8 100644 --- a/interface/web/mail/lib/lang/el_mail_transport.lng +++ b/interface/web/mail/lib/lang/el_mail_transport.lng @@ -8,4 +8,4 @@ $wb['sort_order_txt'] = 'Ταξινόμηση κατά'; $wb['active_txt'] = 'ΕνεÏγό'; $wb['limit_mailrouting_txt'] = 'Το μÎγιστο πλήθος των δÏομολογήσεων email για τον λογαÏιασμό σας, εξαντλήθηκε.'; $wb['transport_txt'] = 'Transport'; -?> +$wb['domain_error_unique'] = 'A mail transport for this Domain already exists on this server.'; diff --git a/interface/web/mail/lib/lang/el_spamfilter_users.lng b/interface/web/mail/lib/lang/el_spamfilter_users.lng index b6da2d1e15dc3ea54c0ce3c3d206d80fbd4065c3..fc61aa818dc0ef1d5a0f8ddf64ff703ffaa2b279 100644 --- a/interface/web/mail/lib/lang/el_spamfilter_users.lng +++ b/interface/web/mail/lib/lang/el_spamfilter_users.lng @@ -10,4 +10,4 @@ $wb['fullname_error_notempty'] = 'The name must not be empty.'; $wb['10 - highest'] = '10 - highest'; $wb['5 - medium'] = '5 - medium'; $wb['1 - lowest'] = '1 - lowest'; -?> +$wb['inherit_policy'] = '- Inherit domain setting -'; diff --git a/interface/web/mail/lib/lang/en_mail_alias.lng b/interface/web/mail/lib/lang/en_mail_alias.lng index 439ab74a096cdf2c83fc676db0f8fee70ff9cbea..84770e4c7ec9547315f78720ca7e367996d79258 100644 --- a/interface/web/mail/lib/lang/en_mail_alias.lng +++ b/interface/web/mail/lib/lang/en_mail_alias.lng @@ -3,9 +3,9 @@ $wb['email_txt'] = 'Email'; $wb['destination_txt'] = 'Destination'; $wb['active_txt'] = 'Active'; $wb['email_error_isemail'] = 'Email address is invalid.'; -$wb['email_error_unique'] = 'Duplicate Emailaddress.'; +$wb['email_error_unique'] = 'Duplicate Email Address.'; $wb['no_domain_perm'] = 'You have no permission for this domain.'; -$wb['destination_error_isemail'] = 'Destination Emailaddress is invalid.'; +$wb['destination_error_isemail'] = 'Destination Email Address is invalid.'; $wb['limit_mailalias_txt'] = 'The max. number of email aliases for your account is reached.'; $wb['duplicate_mailbox_txt'] = 'There is already a mailbox with this email address.'; $wb['domain_txt'] = 'Domain'; @@ -14,4 +14,3 @@ $wb['source_txt'] = 'Alias'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this alias as origin'; $wb['greylisting_txt'] = 'Enable greylisting'; -?> diff --git a/interface/web/mail/lib/lang/en_mail_forward.lng b/interface/web/mail/lib/lang/en_mail_forward.lng index c38e2bf4ffe7c38e3ea4cdce2acf7444e1ae3b8b..65b2b753d9731839a417ff8efa976b9b3c46389c 100644 --- a/interface/web/mail/lib/lang/en_mail_forward.lng +++ b/interface/web/mail/lib/lang/en_mail_forward.lng @@ -9,7 +9,7 @@ $wb['source_txt'] = 'Source Email'; $wb['destination_error_empty'] = 'The destination must not be empty.'; $wb['destination_error_isemail'] = 'The destination contains at least one invalid email address.'; $wb['email_error_isemail'] = 'Please enter a valid email address.'; +$wb['email_error_unique'] = 'Duplicate Email Address.'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this address as origin (if target is internal)'; $wb['greylisting_txt'] = 'Enable greylisting'; -?> diff --git a/interface/web/mail/lib/lang/en_mail_relay_domain.lng b/interface/web/mail/lib/lang/en_mail_relay_domain.lng new file mode 100644 index 0000000000000000000000000000000000000000..e5296a9a9bba1dea5a068c7cef8187e5d4e51a4f --- /dev/null +++ b/interface/web/mail/lib/lang/en_mail_relay_domain.lng @@ -0,0 +1,9 @@ +<?php +$wb['mail_relay_domain_title'] = 'Email relay domain'; +$wb['tab_relay_domain_title'] = 'Relay domain'; +$wb['server_id_txt'] = 'Server'; +$wb['active_txt'] = 'Active'; +$wb['domain_txt'] = 'Domain'; +$wb['domain_error_regex'] = 'Invalid domain name.'; +$wb['domain_error_empty'] = 'Domain is empty.'; +$wb['domain_error_unique'] = 'This Domain already exists as a mail relay domain on this server.'; diff --git a/interface/web/mail/lib/lang/en_mail_relay_domain_list.lng b/interface/web/mail/lib/lang/en_mail_relay_domain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..e33b3bde4b1d93aca533bc9d806d4fe34e08dded --- /dev/null +++ b/interface/web/mail/lib/lang/en_mail_relay_domain_list.lng @@ -0,0 +1,7 @@ +<?php +$wb['list_head_txt'] = 'Relay domains'; +$wb['active_txt'] = 'Active'; +$wb['server_id_txt'] = 'Server'; +$wb['domain_txt'] = 'Domain'; +$wb['add_new_record_txt'] = 'Add new relay domain'; +$wb['access_txt'] = 'access'; diff --git a/interface/web/mail/lib/lang/en_mail_transport.lng b/interface/web/mail/lib/lang/en_mail_transport.lng index a0b3dd808b6d0cec752227adaebc6820e99f44b9..16c33c02011d4bec352ffdde12a70234d51aeab7 100644 --- a/interface/web/mail/lib/lang/en_mail_transport.lng +++ b/interface/web/mail/lib/lang/en_mail_transport.lng @@ -8,4 +8,4 @@ $wb['sort_order_txt'] = 'Sort by'; $wb['active_txt'] = 'Active'; $wb['limit_mailrouting_txt'] = 'The max. number of routes for your account is reached.'; $wb['transport_txt'] = 'Transport'; -?> \ No newline at end of file +$wb['domain_error_unique'] = 'A mail transport for this Domain already exists on this server.'; diff --git a/interface/web/mail/lib/lang/en_spamfilter_users.lng b/interface/web/mail/lib/lang/en_spamfilter_users.lng index e43b315df6b655a4cc738a77a4a1a328521915f6..05d0ca9bd627de80cdd373cfe5fe80af517ff484 100644 --- a/interface/web/mail/lib/lang/en_spamfilter_users.lng +++ b/interface/web/mail/lib/lang/en_spamfilter_users.lng @@ -10,4 +10,4 @@ $wb['fullname_error_notempty'] = 'The name must not be empty.'; $wb['10 - highest'] = '10 - highest'; $wb['5 - medium'] = '5 - medium'; $wb['1 - lowest'] = '1 - lowest'; -?> \ No newline at end of file +$wb['inherit_policy'] = '- Inherit domain setting -'; diff --git a/interface/web/mail/lib/lang/es_mail_alias.lng b/interface/web/mail/lib/lang/es_mail_alias.lng index 18d1cb734728e8a2a9cca4cc828aa83beebd77be..7c0d7c7ccf446cef0b395035584e8b0937afd586 100644 --- a/interface/web/mail/lib/lang/es_mail_alias.lng +++ b/interface/web/mail/lib/lang/es_mail_alias.lng @@ -14,4 +14,3 @@ $wb['no_domain_perm'] = 'No tiene permisos para usar este dominio.'; $wb['send_as_exp'] = 'Permite al destinatario enviar correos usando este alias como origen'; $wb['send_as_txt'] = 'Enviar como'; $wb['source_txt'] = 'Alias'; -?> diff --git a/interface/web/mail/lib/lang/es_mail_forward.lng b/interface/web/mail/lib/lang/es_mail_forward.lng index 7ea99ea61909f1b6388fbe7a0c58454f15f73a73..a295943f3c15719d3cd7fb87a987a305fdd5916f 100644 --- a/interface/web/mail/lib/lang/es_mail_forward.lng +++ b/interface/web/mail/lib/lang/es_mail_forward.lng @@ -6,10 +6,10 @@ $wb['duplicate_mailbox_txt'] = 'Ya existe un buzón con esta cuenta de correo.'; $wb['destination_error_empty'] = 'The destination must not be empty.'; $wb['destination_error_isemail'] = 'The destination contains at least one invalid email address.'; $wb['email_error_isemail'] = 'Por favor, introduzca una dirección de correo válida.'; +$wb['email_error_unique'] = 'Dirección de correo duplicada.'; $wb['email_txt'] = 'Correo'; $wb['greylisting_txt'] = 'Habilitar Lista Gris'; $wb['limit_mailforward_txt'] = 'Ha alcanzado el número máx. de reenvÃos de correos permitidos para su cuenta.'; $wb['send_as_exp'] = 'Permitir al destino enviar correo usando esta dirección como origen (si el destino es interno)'; $wb['send_as_txt'] = 'Enviar como'; $wb['source_txt'] = 'Origen del correo'; -?> diff --git a/interface/web/mail/lib/lang/es_mail_relay_domain.lng b/interface/web/mail/lib/lang/es_mail_relay_domain.lng new file mode 100644 index 0000000000000000000000000000000000000000..848775dd2a892087f89beabd1c796ed344fcf0d2 --- /dev/null +++ b/interface/web/mail/lib/lang/es_mail_relay_domain.lng @@ -0,0 +1,9 @@ +<?php +$wb['mail_relay_domain_title'] = 'Email relay domain'; +$wb['tab_relay_domain_title'] = 'Relay domain'; +$wb['server_id_txt'] = 'Servidor'; +$wb['active_txt'] = 'Habilitado'; +$wb['domain_txt'] = 'Dominio'; +$wb['domain_error_regex'] = 'Nombre de dominio inválido.'; +$wb['domain_error_empty'] = 'El dominio está vacÃo.'; +$wb['domain_error_unique'] = 'This Domain already exists as a mail relay domain on this server.'; diff --git a/interface/web/mail/lib/lang/es_mail_relay_domain_list.lng b/interface/web/mail/lib/lang/es_mail_relay_domain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..bb4c57042e80e5222c993ab39abef27f4ce01440 --- /dev/null +++ b/interface/web/mail/lib/lang/es_mail_relay_domain_list.lng @@ -0,0 +1,7 @@ +<?php +$wb['list_head_txt'] = 'Relay domains'; +$wb['active_txt'] = 'Habilitado'; +$wb['server_id_txt'] = 'Servidor'; +$wb['domain_txt'] = 'Dominio'; +$wb['add_new_record_txt'] = 'Add new relay domain'; +$wb['access_txt'] = 'acceso'; diff --git a/interface/web/mail/lib/lang/es_mail_transport.lng b/interface/web/mail/lib/lang/es_mail_transport.lng index b35ee39188c7bfd1722f854f3baa4fba443dc20b..e0b3b4ad81503667e8e003b1a0d58cb15977f541 100644 --- a/interface/web/mail/lib/lang/es_mail_transport.lng +++ b/interface/web/mail/lib/lang/es_mail_transport.lng @@ -8,4 +8,4 @@ $wb['server_id_txt'] = 'Servidor'; $wb['sort_order_txt'] = 'Ordenar por'; $wb['transport_txt'] = 'Transporte'; $wb['type_txt'] = 'Tipo'; -?> +$wb['domain_error_unique'] = 'A mail transport for this Domain already exists on this server.'; diff --git a/interface/web/mail/lib/lang/es_spamfilter_users.lng b/interface/web/mail/lib/lang/es_spamfilter_users.lng index c5a5a0f9480cb677df0f003378c94d6594ce933d..575c14a9f4cc5df4d0aa0e8c547bc68303ded332 100644 --- a/interface/web/mail/lib/lang/es_spamfilter_users.lng +++ b/interface/web/mail/lib/lang/es_spamfilter_users.lng @@ -10,4 +10,4 @@ $wb['local_txt'] = 'Local'; $wb['policy_id_txt'] = 'Directiva'; $wb['priority_txt'] = 'Prioridad'; $wb['server_id_txt'] = 'Servidor'; -?> +$wb['inherit_policy'] = '- Inherit domain setting -'; diff --git a/interface/web/mail/lib/lang/fi_mail_alias.lng b/interface/web/mail/lib/lang/fi_mail_alias.lng index 918db07761b4d5fa93992f74245d62a79716f717..20179dfdb6565716d3a9f6567254d7d44a773974 100644 --- a/interface/web/mail/lib/lang/fi_mail_alias.lng +++ b/interface/web/mail/lib/lang/fi_mail_alias.lng @@ -14,4 +14,3 @@ $wb['source_txt'] = 'Alias'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this alias as origin'; -?> diff --git a/interface/web/mail/lib/lang/fi_mail_forward.lng b/interface/web/mail/lib/lang/fi_mail_forward.lng index 80d34b500437108ba8d7300d27dd2af6e561fb5e..72b36cd082988b2c416a5f825fb245f7c8c178d2 100644 --- a/interface/web/mail/lib/lang/fi_mail_forward.lng +++ b/interface/web/mail/lib/lang/fi_mail_forward.lng @@ -10,6 +10,6 @@ $wb['greylisting_txt'] = 'Enable greylisting'; $wb['destination_error_empty'] = 'The destination must not be empty.'; $wb['destination_error_isemail'] = 'The destination contains at least one invalid email address.'; $wb['email_error_isemail'] = 'Please enter a valid email address.'; +$wb['email_error_unique'] = 'Tämä aliasosoite on jo olemassa'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this address as origin (if target is internal)'; -?> diff --git a/interface/web/mail/lib/lang/fi_mail_relay_domain.lng b/interface/web/mail/lib/lang/fi_mail_relay_domain.lng new file mode 100644 index 0000000000000000000000000000000000000000..37afab76cec7d2aef0b4fc91740bb130f303aa7d --- /dev/null +++ b/interface/web/mail/lib/lang/fi_mail_relay_domain.lng @@ -0,0 +1,9 @@ +<?php +$wb['mail_relay_domain_title'] = 'Email relay domain'; +$wb['tab_relay_domain_title'] = 'Relay domain'; +$wb['server_id_txt'] = 'Palvelin'; +$wb['active_txt'] = 'Toiminnassa'; +$wb['domain_txt'] = 'Postiverkkotunnus'; +$wb['domain_error_regex'] = 'Invalid domain name.'; +$wb['domain_error_empty'] = 'Domain is empty.'; +$wb['domain_error_unique'] = 'This Domain already exists as a mail relay domain on this server.'; diff --git a/interface/web/mail/lib/lang/fi_mail_relay_domain_list.lng b/interface/web/mail/lib/lang/fi_mail_relay_domain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..d43c485da6b8b0308a8fd59cfdfb4983513d64c9 --- /dev/null +++ b/interface/web/mail/lib/lang/fi_mail_relay_domain_list.lng @@ -0,0 +1,7 @@ +<?php +$wb['list_head_txt'] = 'Relay domains'; +$wb['active_txt'] = 'Toiminnassa'; +$wb['server_id_txt'] = 'Palvelin'; +$wb['domain_txt'] = 'Postiverkkotunnus'; +$wb['add_new_record_txt'] = 'Add new relay domain'; +$wb['access_txt'] = 'yhteys'; diff --git a/interface/web/mail/lib/lang/fi_mail_transport.lng b/interface/web/mail/lib/lang/fi_mail_transport.lng index 01be49e44ac786965d16cb77cf12a46d0e7a67b4..24675e457f6d35eb5648b07ae6aa37bdedd91f30 100644 --- a/interface/web/mail/lib/lang/fi_mail_transport.lng +++ b/interface/web/mail/lib/lang/fi_mail_transport.lng @@ -8,4 +8,4 @@ $wb['sort_order_txt'] = 'Järjestä..'; $wb['active_txt'] = 'Käytössä'; $wb['limit_mailrouting_txt'] = 'Käyttäjätunnuksella on jo sallittu määrä sähköpostireitityksiä.'; $wb['transport_txt'] = 'Transport'; -?> +$wb['domain_error_unique'] = 'A mail transport for this Domain already exists on this server.'; diff --git a/interface/web/mail/lib/lang/fi_spamfilter_users.lng b/interface/web/mail/lib/lang/fi_spamfilter_users.lng index c4290efbf25f6dce6c23523c2683bcedfec571f5..5c9570d6fb5e7bfb8aa900f23570e9002f23dcda 100644 --- a/interface/web/mail/lib/lang/fi_spamfilter_users.lng +++ b/interface/web/mail/lib/lang/fi_spamfilter_users.lng @@ -10,4 +10,4 @@ $wb['fullname_error_notempty'] = 'The name must not be empty.'; $wb['10 - highest'] = '10 - highest'; $wb['5 - medium'] = '5 - medium'; $wb['1 - lowest'] = '1 - lowest'; -?> +$wb['inherit_policy'] = '- Inherit domain setting -'; diff --git a/interface/web/mail/lib/lang/fr_mail_alias.lng b/interface/web/mail/lib/lang/fr_mail_alias.lng index 2baa476c657202c4a7471505698bd04d48e61a8c..b3868afc2c9694f3a38432d22fca121b53ce8804 100644 --- a/interface/web/mail/lib/lang/fr_mail_alias.lng +++ b/interface/web/mail/lib/lang/fr_mail_alias.lng @@ -14,4 +14,3 @@ $wb['source_txt'] = 'Alias'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this alias as origin'; $wb['greylisting_txt'] = 'Enable greylisting'; -?> diff --git a/interface/web/mail/lib/lang/fr_mail_forward.lng b/interface/web/mail/lib/lang/fr_mail_forward.lng index fd6d13c6bb0d84e4f1917cbc0f368b24d2ae2f5b..87caec79e03a6d660225e73d289d9ee9837436a3 100644 --- a/interface/web/mail/lib/lang/fr_mail_forward.lng +++ b/interface/web/mail/lib/lang/fr_mail_forward.lng @@ -9,7 +9,7 @@ $wb['source_txt'] = 'Source Email'; $wb['destination_error_empty'] = 'The destination must not be empty.'; $wb['destination_error_isemail'] = 'The destination contains at least one invalid email address.'; $wb['email_error_isemail'] = 'Please enter a valid email address.'; +$wb['email_error_unique'] = 'Dupliquer l’adresse e-mail.'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this address as origin (if target is internal)'; $wb['greylisting_txt'] = 'Enable greylisting'; -?> diff --git a/interface/web/mail/lib/lang/fr_mail_relay_domain.lng b/interface/web/mail/lib/lang/fr_mail_relay_domain.lng new file mode 100644 index 0000000000000000000000000000000000000000..b6e9d8f2fbc31cb5774d3bfc99e8b949c7f26de3 --- /dev/null +++ b/interface/web/mail/lib/lang/fr_mail_relay_domain.lng @@ -0,0 +1,9 @@ +<?php +$wb['mail_relay_domain_title'] = 'Email relay domain'; +$wb['tab_relay_domain_title'] = 'Relay domain'; +$wb['server_id_txt'] = 'Serveur'; +$wb['active_txt'] = 'Actif'; +$wb['domain_txt'] = 'Domaine'; +$wb['domain_error_regex'] = 'Nom de domaine invalide.'; +$wb['domain_error_empty'] = 'Le domain est vide.'; +$wb['domain_error_unique'] = 'This Domain already exists as a mail relay domain on this server.'; diff --git a/interface/web/mail/lib/lang/fr_mail_relay_domain_list.lng b/interface/web/mail/lib/lang/fr_mail_relay_domain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..771b9619745c862e78ca540c91b546a5ab76df36 --- /dev/null +++ b/interface/web/mail/lib/lang/fr_mail_relay_domain_list.lng @@ -0,0 +1,7 @@ +<?php +$wb['list_head_txt'] = 'Relay domains'; +$wb['active_txt'] = 'Actif'; +$wb['server_id_txt'] = 'Serveur'; +$wb['domain_txt'] = 'Domaine'; +$wb['add_new_record_txt'] = 'Add new relay domain'; +$wb['access_txt'] = 'accès'; diff --git a/interface/web/mail/lib/lang/fr_mail_transport.lng b/interface/web/mail/lib/lang/fr_mail_transport.lng index f8a5536560d4ae94e0cd63336f3a39f92ce4b276..7b12c7d0eb919596e0c0e05f40dec15c00e6b85a 100644 --- a/interface/web/mail/lib/lang/fr_mail_transport.lng +++ b/interface/web/mail/lib/lang/fr_mail_transport.lng @@ -8,4 +8,4 @@ $wb['sort_order_txt'] = 'Trier par'; $wb['active_txt'] = 'Actif'; $wb['limit_mailrouting_txt'] = 'Le nombre maximal de routes pour votre compte a été atteint.'; $wb['transport_txt'] = 'Transport'; -?> +$wb['domain_error_unique'] = 'A mail transport for this Domain already exists on this server.'; diff --git a/interface/web/mail/lib/lang/fr_spamfilter_users.lng b/interface/web/mail/lib/lang/fr_spamfilter_users.lng index e8936b01833f43adb8057bef19b7d566c153b28d..b87fe87ccb6ae51a8f3a79b63b40129754a3db7c 100644 --- a/interface/web/mail/lib/lang/fr_spamfilter_users.lng +++ b/interface/web/mail/lib/lang/fr_spamfilter_users.lng @@ -10,4 +10,4 @@ $wb['fullname_error_notempty'] = 'The name must not be empty.'; $wb['10 - highest'] = '10 - highest'; $wb['5 - medium'] = '5 - medium'; $wb['1 - lowest'] = '1 - lowest'; -?> +$wb['inherit_policy'] = '- Inherit domain setting -'; diff --git a/interface/web/mail/lib/lang/hr_mail_alias.lng b/interface/web/mail/lib/lang/hr_mail_alias.lng index 180bcbeacd9bddbe09c14038b09742347c179e84..152172a6b51467eff2a9447439b90d165991c8d1 100644 --- a/interface/web/mail/lib/lang/hr_mail_alias.lng +++ b/interface/web/mail/lib/lang/hr_mail_alias.lng @@ -14,4 +14,3 @@ $wb['source_txt'] = 'Alias'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this alias as origin'; -?> diff --git a/interface/web/mail/lib/lang/hr_mail_forward.lng b/interface/web/mail/lib/lang/hr_mail_forward.lng index 10abd5fe9286fceb3d1f40b3707c369bafcc39f3..86430d19f7f37995bcba8159adf1bf8c989de22a 100644 --- a/interface/web/mail/lib/lang/hr_mail_forward.lng +++ b/interface/web/mail/lib/lang/hr_mail_forward.lng @@ -10,6 +10,6 @@ $wb['greylisting_txt'] = 'Enable greylisting'; $wb['destination_error_empty'] = 'The destination must not be empty.'; $wb['destination_error_isemail'] = 'The destination contains at least one invalid email address.'; $wb['email_error_isemail'] = 'Please enter a valid email address.'; +$wb['email_error_unique'] = 'Duplicirane email adrese.'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this address as origin (if target is internal)'; -?> diff --git a/interface/web/mail/lib/lang/hr_mail_relay_domain.lng b/interface/web/mail/lib/lang/hr_mail_relay_domain.lng new file mode 100644 index 0000000000000000000000000000000000000000..c0d40b147cdd4b24fc9ffe87a6ab3cd0adc25954 --- /dev/null +++ b/interface/web/mail/lib/lang/hr_mail_relay_domain.lng @@ -0,0 +1,9 @@ +<?php +$wb['mail_relay_domain_title'] = 'Email relay domain'; +$wb['tab_relay_domain_title'] = 'Relay domain'; +$wb['server_id_txt'] = 'Server'; +$wb['active_txt'] = 'Aktivno'; +$wb['domain_txt'] = 'Domena'; +$wb['domain_error_regex'] = 'Neispravan naziv domene.'; +$wb['domain_error_empty'] = 'Domena je prazna.'; +$wb['domain_error_unique'] = 'This Domain already exists as a mail relay domain on this server.'; diff --git a/interface/web/mail/lib/lang/hr_mail_relay_domain_list.lng b/interface/web/mail/lib/lang/hr_mail_relay_domain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..43f29ed453845c81bb91afb739524b8352c24cde --- /dev/null +++ b/interface/web/mail/lib/lang/hr_mail_relay_domain_list.lng @@ -0,0 +1,7 @@ +<?php +$wb['list_head_txt'] = 'Relay domains'; +$wb['active_txt'] = 'Aktivno'; +$wb['server_id_txt'] = 'Server'; +$wb['domain_txt'] = 'Domena'; +$wb['add_new_record_txt'] = 'Add new relay domain'; +$wb['access_txt'] = 'pristup'; diff --git a/interface/web/mail/lib/lang/hr_mail_transport.lng b/interface/web/mail/lib/lang/hr_mail_transport.lng index c27687f9562306a1b507aefbb3d3093b16bb5084..923ac09d52670ab5190967c62ef3b8d29f82ff18 100644 --- a/interface/web/mail/lib/lang/hr_mail_transport.lng +++ b/interface/web/mail/lib/lang/hr_mail_transport.lng @@ -8,4 +8,4 @@ $wb['sort_order_txt'] = 'Sortiraj'; $wb['active_txt'] = 'Aktivno'; $wb['limit_mailrouting_txt'] = 'IskoriÅ¡ten je maksimalan broj ruta.'; $wb['transport_txt'] = 'Transport'; -?> +$wb['domain_error_unique'] = 'A mail transport for this Domain already exists on this server.'; diff --git a/interface/web/mail/lib/lang/hr_spamfilter_users.lng b/interface/web/mail/lib/lang/hr_spamfilter_users.lng index 9969ef421d93ae8f4b78ce8b87074b7d5a76b7f4..9e78310d71d13eb020ebd7855635a255c41c54e2 100644 --- a/interface/web/mail/lib/lang/hr_spamfilter_users.lng +++ b/interface/web/mail/lib/lang/hr_spamfilter_users.lng @@ -10,4 +10,4 @@ $wb['fullname_error_notempty'] = 'The name must not be empty.'; $wb['10 - highest'] = '10 - highest'; $wb['5 - medium'] = '5 - medium'; $wb['1 - lowest'] = '1 - lowest'; -?> +$wb['inherit_policy'] = '- Inherit domain setting -'; diff --git a/interface/web/mail/lib/lang/hu_mail_alias.lng b/interface/web/mail/lib/lang/hu_mail_alias.lng index 7fc9e7a1d3d569e3092116059b6155386ad4379c..f2b5fab45a6b2fb78a7d11eb4bafac458cd8d7f4 100644 --- a/interface/web/mail/lib/lang/hu_mail_alias.lng +++ b/interface/web/mail/lib/lang/hu_mail_alias.lng @@ -14,4 +14,3 @@ $wb['source_txt'] = 'Alias'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this alias as origin'; -?> diff --git a/interface/web/mail/lib/lang/hu_mail_forward.lng b/interface/web/mail/lib/lang/hu_mail_forward.lng index c58ae29d317bd3de03e716cbfe77f76cb068eaaa..936b9781ef49026f1bf16eba784a167996d24c04 100644 --- a/interface/web/mail/lib/lang/hu_mail_forward.lng +++ b/interface/web/mail/lib/lang/hu_mail_forward.lng @@ -10,6 +10,6 @@ $wb['greylisting_txt'] = 'Enable greylisting'; $wb['destination_error_empty'] = 'The destination must not be empty.'; $wb['destination_error_isemail'] = 'The destination contains at least one invalid email address.'; $wb['email_error_isemail'] = 'Please enter a valid email address.'; +$wb['email_error_unique'] = 'Már létezÅ‘ email cÃm'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this address as origin (if target is internal)'; -?> diff --git a/interface/web/mail/lib/lang/hu_mail_relay_domain.lng b/interface/web/mail/lib/lang/hu_mail_relay_domain.lng new file mode 100644 index 0000000000000000000000000000000000000000..0ad225ad5551d04f1e4facde8e0d07ab5157b246 --- /dev/null +++ b/interface/web/mail/lib/lang/hu_mail_relay_domain.lng @@ -0,0 +1,9 @@ +<?php +$wb['mail_relay_domain_title'] = 'Email relay domain'; +$wb['tab_relay_domain_title'] = 'Relay domain'; +$wb['server_id_txt'] = 'Szerver'; +$wb['active_txt'] = 'AktÃv'; +$wb['domain_txt'] = 'Domain'; +$wb['domain_error_regex'] = 'Invalid domain name.'; +$wb['domain_error_empty'] = 'Domain is empty.'; +$wb['domain_error_unique'] = 'This Domain already exists as a mail relay domain on this server.'; diff --git a/interface/web/mail/lib/lang/hu_mail_relay_domain_list.lng b/interface/web/mail/lib/lang/hu_mail_relay_domain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..286b7e5e9c24cb177d3ddc3a5881ac48e7cb6573 --- /dev/null +++ b/interface/web/mail/lib/lang/hu_mail_relay_domain_list.lng @@ -0,0 +1,7 @@ +<?php +$wb['list_head_txt'] = 'Relay domains'; +$wb['active_txt'] = 'AktÃv'; +$wb['server_id_txt'] = 'Szerver'; +$wb['domain_txt'] = 'Domain'; +$wb['add_new_record_txt'] = 'Add new relay domain'; +$wb['access_txt'] = 'access'; diff --git a/interface/web/mail/lib/lang/hu_mail_transport.lng b/interface/web/mail/lib/lang/hu_mail_transport.lng index 7ade063c2b17a4de1cc4c7af9cba97245aacfda2..08e8300e2ed3c5d375d9864c7c080f4299c11755 100644 --- a/interface/web/mail/lib/lang/hu_mail_transport.lng +++ b/interface/web/mail/lib/lang/hu_mail_transport.lng @@ -8,4 +8,4 @@ $wb['sort_order_txt'] = 'Rendezés'; $wb['active_txt'] = 'AktÃv'; $wb['limit_mailrouting_txt'] = 'Nincs több Email irányÃtás lehetÅ‘ség.'; $wb['transport_txt'] = 'Transport'; -?> +$wb['domain_error_unique'] = 'A mail transport for this Domain already exists on this server.'; diff --git a/interface/web/mail/lib/lang/hu_spamfilter_users.lng b/interface/web/mail/lib/lang/hu_spamfilter_users.lng index 573d696182d6451da51b202602229b542aa6cb7a..a5097ddbfde5272c06aa6110de2b12809e4b4fd6 100644 --- a/interface/web/mail/lib/lang/hu_spamfilter_users.lng +++ b/interface/web/mail/lib/lang/hu_spamfilter_users.lng @@ -10,4 +10,4 @@ $wb['fullname_error_notempty'] = 'The name must not be empty.'; $wb['10 - highest'] = '10 - highest'; $wb['5 - medium'] = '5 - medium'; $wb['1 - lowest'] = '1 - lowest'; -?> +$wb['inherit_policy'] = '- Inherit domain setting -'; diff --git a/interface/web/mail/lib/lang/id_mail_alias.lng b/interface/web/mail/lib/lang/id_mail_alias.lng index e0efdb1504c511bf4d298047f29579c0f049cf7a..aae76432fd7e4afce677baaccc642cdefdb03f15 100644 --- a/interface/web/mail/lib/lang/id_mail_alias.lng +++ b/interface/web/mail/lib/lang/id_mail_alias.lng @@ -14,4 +14,3 @@ $wb['source_txt'] = 'Alias'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this alias as origin'; -?> diff --git a/interface/web/mail/lib/lang/id_mail_forward.lng b/interface/web/mail/lib/lang/id_mail_forward.lng index 5f0c788878e3cb5223205438c0cfaa1b47997843..792070d92076bb3a223f7208c098db2783c5dbf3 100644 --- a/interface/web/mail/lib/lang/id_mail_forward.lng +++ b/interface/web/mail/lib/lang/id_mail_forward.lng @@ -10,6 +10,6 @@ $wb['greylisting_txt'] = 'Enable greylisting'; $wb['destination_error_empty'] = 'The destination must not be empty.'; $wb['destination_error_isemail'] = 'The destination contains at least one invalid email address.'; $wb['email_error_isemail'] = 'Please enter a valid email address.'; +$wb['email_error_unique'] = 'Alamat Email Ganda.'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this address as origin (if target is internal)'; -?> diff --git a/interface/web/mail/lib/lang/id_mail_relay_domain.lng b/interface/web/mail/lib/lang/id_mail_relay_domain.lng new file mode 100644 index 0000000000000000000000000000000000000000..042ebf0f628cad64f0b587506da7cd6ecabc548c --- /dev/null +++ b/interface/web/mail/lib/lang/id_mail_relay_domain.lng @@ -0,0 +1,9 @@ +<?php +$wb['mail_relay_domain_title'] = 'Email relay domain'; +$wb['tab_relay_domain_title'] = 'Relay domain'; +$wb['server_id_txt'] = 'Server'; +$wb['active_txt'] = 'Aktif'; +$wb['domain_txt'] = 'Domain'; +$wb['domain_error_regex'] = 'Invalid domain name.'; +$wb['domain_error_empty'] = 'Domain is empty.'; +$wb['domain_error_unique'] = 'This Domain already exists as a mail relay domain on this server.'; diff --git a/interface/web/mail/lib/lang/id_mail_relay_domain_list.lng b/interface/web/mail/lib/lang/id_mail_relay_domain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..3d632507c4d279517619759441c0e7ed4a72a92c --- /dev/null +++ b/interface/web/mail/lib/lang/id_mail_relay_domain_list.lng @@ -0,0 +1,7 @@ +<?php +$wb['list_head_txt'] = 'Relay domains'; +$wb['active_txt'] = 'Aktif'; +$wb['server_id_txt'] = 'Server'; +$wb['domain_txt'] = 'Domain'; +$wb['add_new_record_txt'] = 'Add new relay domain'; +$wb['access_txt'] = 'Akses'; diff --git a/interface/web/mail/lib/lang/id_mail_transport.lng b/interface/web/mail/lib/lang/id_mail_transport.lng index 8ad3dacf2ab4bb6932dfef044cc1d9478c184e2f..818f6f72803a6ee6ce84f9f0eaa431c40d386bf8 100644 --- a/interface/web/mail/lib/lang/id_mail_transport.lng +++ b/interface/web/mail/lib/lang/id_mail_transport.lng @@ -8,4 +8,4 @@ $wb['sort_order_txt'] = 'Urutkan berdasarkan'; $wb['active_txt'] = 'Aktif'; $wb['limit_mailrouting_txt'] = 'Jumlah maks rute untuk akun Anda telah tercapai.'; $wb['transport_txt'] = 'Transport'; -?> +$wb['domain_error_unique'] = 'A mail transport for this Domain already exists on this server.'; diff --git a/interface/web/mail/lib/lang/id_spamfilter_users.lng b/interface/web/mail/lib/lang/id_spamfilter_users.lng index f4549c5c46bba8e4afcd30497f0f6b886b253548..4777d33581258ff23d77245ceafde81cb6a0cdab 100644 --- a/interface/web/mail/lib/lang/id_spamfilter_users.lng +++ b/interface/web/mail/lib/lang/id_spamfilter_users.lng @@ -10,4 +10,4 @@ $wb['fullname_error_notempty'] = 'The name must not be empty.'; $wb['10 - highest'] = '10 - highest'; $wb['5 - medium'] = '5 - medium'; $wb['1 - lowest'] = '1 - lowest'; -?> +$wb['inherit_policy'] = '- Inherit domain setting -'; diff --git a/interface/web/mail/lib/lang/it_backup_stats_list.lng b/interface/web/mail/lib/lang/it_backup_stats_list.lng index 79cd6c9a63589ba43dd7772821c3d63f7b7a8394..027ef0d0b53566255556ae5b62708f99da9a0a98 100644 --- a/interface/web/mail/lib/lang/it_backup_stats_list.lng +++ b/interface/web/mail/lib/lang/it_backup_stats_list.lng @@ -1,9 +1,9 @@ <?php $wb['list_head_txt'] = 'Backup Stats'; -$wb['active_txt'] = 'Active'; +$wb['active_txt'] = 'Attivo'; $wb['domain_txt'] = 'Email'; -$wb['backup_count_txt'] = 'Backup count'; +$wb['backup_count_txt'] = 'Numero di Backup'; $wb['backup_server_txt'] = 'Server'; -$wb['backup_interval_txt'] = 'Interval / cnt.'; -$wb['backup_size_txt'] = 'Backupsize'; +$wb['backup_interval_txt'] = 'Intervallo / conteggio'; +$wb['backup_size_txt'] = 'Dimensione Backup'; ?> diff --git a/interface/web/mail/lib/lang/it_mail_alias.lng b/interface/web/mail/lib/lang/it_mail_alias.lng index fea4fe0c12ba3cb971c8a4c6c9afb6ee5630d1d6..6f6cbe17f94f2a04bd3773740ff0c37416532023 100644 --- a/interface/web/mail/lib/lang/it_mail_alias.lng +++ b/interface/web/mail/lib/lang/it_mail_alias.lng @@ -6,12 +6,11 @@ $wb['email_error_isemail'] = 'Indirizzo email non valido.'; $wb['email_error_unique'] = 'Indirizzo email duplicato.'; $wb['no_domain_perm'] = 'Permessi non sufficienti per questo dominio.'; $wb['destination_error_isemail'] = 'Email destinatario non valida.'; -$wb['limit_mailalias_txt'] = 'Raggiunto numero massimo di alias email per questo account.'; +$wb['limit_mailalias_txt'] = 'Raggiunto numero massimo di alias email per questo profilo.'; $wb['duplicate_mailbox_txt'] = 'Cé già una casella di posta con questo indirizzo email.'; $wb['domain_txt'] = 'Dominio'; -$wb['duplicate_email_alias_txt'] = 'This email alias does already exist.'; +$wb['duplicate_email_alias_txt'] = 'Questo alias email esiste già .'; $wb['source_txt'] = 'Alias'; -$wb['send_as_txt'] = 'Send as'; -$wb['send_as_exp'] = 'Allow target to send mail using this alias as origin'; -$wb['greylisting_txt'] = 'Enable greylisting'; -?> +$wb['send_as_txt'] = 'Invia come'; +$wb['send_as_exp'] = 'Consenti di inviare mail come alias'; +$wb['greylisting_txt'] = 'Abilita le liste grigie'; diff --git a/interface/web/mail/lib/lang/it_mail_alias_list.lng b/interface/web/mail/lib/lang/it_mail_alias_list.lng index 0f77839b94b545843172817dbb9e510a6d99e4a0..5ccede91e59d8e6ddeeabf7e94cbb82f878cf85f 100644 --- a/interface/web/mail/lib/lang/it_mail_alias_list.lng +++ b/interface/web/mail/lib/lang/it_mail_alias_list.lng @@ -1,8 +1,8 @@ <?php $wb['list_head_txt'] = 'Email Alias'; $wb['active_txt'] = 'Attivo'; -$wb['source_txt'] = 'source'; -$wb['destination_txt'] = 'Destinazione'; +$wb['source_txt'] = 'Mittente'; +$wb['destination_txt'] = 'Destinatario'; $wb['email_txt'] = 'Email'; $wb['add_new_record_txt'] = 'Aggiungi un nuovo Email alias'; ?> diff --git a/interface/web/mail/lib/lang/it_mail_aliasdomain.lng b/interface/web/mail/lib/lang/it_mail_aliasdomain.lng index 698582eddb699dbd40a4df95edec2b919280cc52..cad85dcfec925428f999b0fc3a2aa5084115298e 100644 --- a/interface/web/mail/lib/lang/it_mail_aliasdomain.lng +++ b/interface/web/mail/lib/lang/it_mail_aliasdomain.lng @@ -1,11 +1,11 @@ <?php -$wb['source_txt'] = 'Source'; -$wb['destination_txt'] = 'Destinazione'; +$wb['source_txt'] = 'Mittente'; +$wb['destination_txt'] = 'Destinatario'; $wb['active_txt'] = 'Attivo'; $wb['no_domain_perm'] = 'Non hai i diritti per this domain.'; -$wb['limit_mailaliasdomain_txt'] = 'The max. number of email alias domains raggiunto per il tuo account.'; -$wb['source_destination_identical_txt'] = 'Source and target Domain are the same.'; -$wb['source_error_empty'] = 'Source Domain vuoto.'; -$wb['source_error_unique'] = 'Duplicate source Domain.'; -$wb['source_error_regex'] = 'Invalid source domain name.'; +$wb['limit_mailaliasdomain_txt'] = 'Hai raggiunto il massimo numero si domini email alias per il tuo profilo.'; +$wb['source_destination_identical_txt'] = 'Il dominio mittente e il dominio destinatario sono il medesimo.'; +$wb['source_error_empty'] = 'Dominio Mittente vuoto.'; +$wb['source_error_unique'] = 'Dominio Mittente duplicato.'; +$wb['source_error_regex'] = 'Dominio Mittente non valido.'; ?> diff --git a/interface/web/mail/lib/lang/it_mail_aliasdomain_list.lng b/interface/web/mail/lib/lang/it_mail_aliasdomain_list.lng index 176964e54acf2ac88d7f7b4fc758e8e15787d62a..cc79dc89c745d6f052597d442e7a70198c320b74 100644 --- a/interface/web/mail/lib/lang/it_mail_aliasdomain_list.lng +++ b/interface/web/mail/lib/lang/it_mail_aliasdomain_list.lng @@ -1,7 +1,7 @@ <?php -$wb['list_head_txt'] = 'Domain alias'; +$wb['list_head_txt'] = 'Dominio alias'; $wb['active_txt'] = 'Attivo'; -$wb['source_txt'] = 'Source'; -$wb['destination_txt'] = 'Destinazione'; -$wb['add_new_record_txt'] = 'Aggiungi un nuovo Domain alias'; +$wb['source_txt'] = 'Mittente'; +$wb['destination_txt'] = 'Destinatario'; +$wb['add_new_record_txt'] = 'Aggiungi un nuovo Dominio alias'; ?> diff --git a/interface/web/mail/lib/lang/it_mail_backup_list.lng b/interface/web/mail/lib/lang/it_mail_backup_list.lng index 73286a0737103be7877ad8d6c3f4aaa669042224..f92d6671ecfae22ed1ef07473946a405825ee77c 100644 --- a/interface/web/mail/lib/lang/it_mail_backup_list.lng +++ b/interface/web/mail/lib/lang/it_mail_backup_list.lng @@ -1,16 +1,16 @@ <?php -$wb['list_head_txt'] = 'Existing backups'; -$wb['date_txt'] = 'Date'; -$wb['backup_type_txt'] = 'Type'; +$wb['list_head_txt'] = 'Backups esistenti'; +$wb['date_txt'] = 'Data'; +$wb['backup_type_txt'] = 'Tipo'; $wb['filename_txt'] = 'Backup file'; -$wb['restore_backup_txt'] = 'Restore'; -$wb['restore_info_txt'] = 'Restore of the backup has been started. This action takes several minutes to be completed.'; -$wb['restore_confirm_txt'] = 'Restoring may overwrite existing files in your mailbox. Do you really want to restore this backup?'; -$wb['download_pending_txt'] = 'There is already a pending backup download job.'; -$wb['restore_pending_txt'] = 'There is already a pending backup restore job.'; -$wb['delete_backup_txt'] = 'Delete Backup'; -$wb['delete_info_txt'] = 'Delete of the backup has been started. This action takes several minutes to be completed.'; -$wb['delete_confirm_txt'] = 'Really delete this backup?'; -$wb['delete_pending_txt'] = 'There is already a pending backup delete job.'; -$wb['filesize_txt'] = 'Filesize'; +$wb['restore_backup_txt'] = 'Ripristina'; +$wb['restore_info_txt'] = 'Il ripristino del backup è iniziato. Questa operazione richiede diversi minuti per essere completata.'; +$wb['restore_confirm_txt'] = 'Il ripristino può sovrascrivere file esistenti nella tua cartella di posta. Vuoi veramente ripristinare questo backup?'; +$wb['download_pending_txt'] = 'Esiste già una operazione di scaricamento backup in corso.'; +$wb['restore_pending_txt'] = 'Esiste già una operazione di ripristino da backup in corso.'; +$wb['delete_backup_txt'] = 'Cancellare Backup'; +$wb['delete_info_txt'] = 'La cancellazione del backup è iniziata. Questa operazione richiede diversi minuti per essere completata.'; +$wb['delete_confirm_txt'] = 'Vuoi veramente cancellare questo backup?'; +$wb['delete_pending_txt'] = 'Esiste già una operazione di cancellazione backup in corso..'; +$wb['filesize_txt'] = 'Dimensione file'; ?> diff --git a/interface/web/mail/lib/lang/it_mail_blacklist.lng b/interface/web/mail/lib/lang/it_mail_blacklist.lng index 0b4f16a7c4bd447fe87cb7e891d5c2b11b3d541c..ce87313dab6af66880106dbb6695cc87aaa421e6 100644 --- a/interface/web/mail/lib/lang/it_mail_blacklist.lng +++ b/interface/web/mail/lib/lang/it_mail_blacklist.lng @@ -1,12 +1,12 @@ <?php $wb['server_id_txt'] = 'Server'; $wb['source_txt'] = 'Blacklist Address'; -$wb['recipient_txt'] = 'Recipient'; +$wb['recipient_txt'] = 'Destinatario'; $wb['active_txt'] = 'Attivo'; -$wb['source_error_notempty'] = 'Address vuoto.'; -$wb['type_txt'] = 'Type'; -$wb['limit_mailfilter_txt'] = 'The max. number of email filters raggiunto per il tuo account.'; -$wb['limit_mail_wblist_txt'] = 'The max. number of email white / blacklist for your account is reached.'; -$wb['mail_access_unique'] = 'Blacklist Address already in use.'; -$wb['client_txt'] = 'Client'; -$wb['sender_txt'] = 'Sender'; +$wb['source_error_notempty'] = 'Indirizzo vuoto.'; +$wb['type_txt'] = 'Tipo'; +$wb['limit_mailfilter_txt'] = 'Hai raggiunto il massimo numero di filtri mail per il tuo profilo.'; +$wb['limit_mail_wblist_txt'] = 'È stato raggiunto il numero massimo di record per White- o Blacklist del tuo profilo.'; +$wb['mail_access_unique'] = 'Indirizzo di lista nera già in uso.'; +$wb['client_txt'] = 'Cliente'; +$wb['sender_txt'] = 'Mittente'; diff --git a/interface/web/mail/lib/lang/it_mail_blacklist_list.lng b/interface/web/mail/lib/lang/it_mail_blacklist_list.lng index 8840a270e42a4dd7d7f8d38588696873bd1180eb..567414c5b452a13ba645870e66b977a109cb2929 100644 --- a/interface/web/mail/lib/lang/it_mail_blacklist_list.lng +++ b/interface/web/mail/lib/lang/it_mail_blacklist_list.lng @@ -3,8 +3,8 @@ $wb['list_head_txt'] = 'Email Blacklist'; $wb['active_txt'] = 'Attivo'; $wb['server_id_txt'] = 'Server'; $wb['source_txt'] = 'Blacklisted address'; -$wb['type_txt'] = 'Type'; -$wb['recipient_txt'] = 'Recipient'; -$wb['add_new_record_txt'] = 'Aggiungi un nuovo Blacklist record'; -$wb['access_txt'] = 'access'; +$wb['type_txt'] = 'Tipo'; +$wb['recipient_txt'] = 'Destinatario'; +$wb['add_new_record_txt'] = 'Aggiungi un nuovo Blacklist record'; +$wb['access_txt'] = 'Accsso'; ?> diff --git a/interface/web/mail/lib/lang/it_mail_content_filter.lng b/interface/web/mail/lib/lang/it_mail_content_filter.lng index 5169e7fd632a24f0d6bc962053a0815289dded10..d2d9da5a31bbc468363dbfabeadd5dcb1e9b3cb5 100644 --- a/interface/web/mail/lib/lang/it_mail_content_filter.lng +++ b/interface/web/mail/lib/lang/it_mail_content_filter.lng @@ -3,7 +3,7 @@ $wb['server_id_txt'] = 'Server'; $wb['type_txt'] = 'Filter'; $wb['pattern_txt'] = 'Regexp. Pattern'; $wb['data_txt'] = 'Data'; -$wb['action_txt'] = 'Action'; +$wb['action_txt'] = 'Azione'; $wb['active_txt'] = 'Attivo'; $wb['pattern_error_empty'] = 'Pattern vuoto.'; ?> diff --git a/interface/web/mail/lib/lang/it_mail_content_filter_list.lng b/interface/web/mail/lib/lang/it_mail_content_filter_list.lng index bfda794abfc5a42c11e2c2ffbd2826dd88e089d1..fa9de14b13d365d55892859fc766526b856e7ad8 100644 --- a/interface/web/mail/lib/lang/it_mail_content_filter_list.lng +++ b/interface/web/mail/lib/lang/it_mail_content_filter_list.lng @@ -1,8 +1,8 @@ <?php -$wb['list_head_txt'] = 'Postfix Header and Body Checks'; +$wb['list_head_txt'] = 'Verifica Intestazione e contenuto Postfix'; $wb['active_txt'] = 'Attivo'; $wb['server_id_txt'] = 'Server'; $wb['pattern_txt'] = 'Pattern'; $wb['action_txt'] = 'Action'; -$wb['add_new_record_txt'] = 'Aggiungi un nuovo Content Filter'; +$wb['add_new_record_txt'] = 'Aggiungi un nuovo Content Filter'; ?> diff --git a/interface/web/mail/lib/lang/it_mail_domain.lng b/interface/web/mail/lib/lang/it_mail_domain.lng index 88e2c146df0a0c5e15cd28432635c65edc9b20b7..13af4beb97034dcd5c97a0da15e23613109b11ec 100644 --- a/interface/web/mail/lib/lang/it_mail_domain.lng +++ b/interface/web/mail/lib/lang/it_mail_domain.lng @@ -6,20 +6,21 @@ $wb['active_txt'] = 'Attivo'; $wb['domain_error_empty'] = 'Dominio vuoto.'; $wb['domain_error_unique'] = 'Dominio duplicato.'; $wb['domain_error_regex'] = 'Nome dominio non valido.'; -$wb['client_txt'] = 'Cleient'; -$wb['limit_maildomain_txt'] = 'Raggiunto numero massimo di domini email per questo account.'; +$wb['client_txt'] = 'Cliente'; +$wb['limit_maildomain_txt'] = 'Raggiunto numero massimo di domini email per questo profilo.'; $wb['policy_txt'] = 'Filtro Spam'; $wb['no_policy'] = '- non abilitato -'; -$wb['dkim_txt'] = 'enable DKIM'; -$wb['dkim_private_txt'] = 'DKIM Private-key'; -$wb['dkim_public_txt'] = 'DKIM Public-key\nfor information only'; -$wb['dkim_generate_txt'] = 'Generate DKIM Private-key'; +$wb['dkim_txt'] = 'abilita DKIM'; +$wb['dkim_private_txt'] = 'Chiave privata DKIM'; +$wb['dkim_public_txt'] = 'Chiave pubblica DKIM solo per informazione'; +$wb['dkim_generate_txt'] = 'Genera chiave DKIM Privata'; $wb['dkim_dns_txt'] = 'DNS-Record'; -$wb['dkim_private_key_error'] = 'Invalid DKIM-Private key'; -$wb['dkim_settings_txt'] = 'DomainKeys Identified Mail (DKIM)'; -$wb['error_not_allowed_server_id'] = 'Chosen server is not allowed for this account.'; -$wb['dkim_selector_txt'] = 'DKIM-Selector'; -$wb['dkim_selector_error'] = 'Invalid DKIM-Selector. Use only lower-case alphanumeric characters (a-z or 0-9) up to 63 chars'; +$wb['dkim_private_key_error'] = 'Chave DKIM-Privata invalida'; +$wb['dkim_settings_txt'] = 'DomainKeys Identified Mail (DKIM) - Chiave di identificazione dominio mail'; +$wb['error_not_allowed_server_id'] = 'Non sei abilitato a operare su questo server'; +$wb['dkim_selector_txt'] = 'Selettore di chiave DKIM'; +$wb['dkim_selector_error'] = 'Selettore di chiave DKIM invalido. Usare solo caratteri minuscoli e cifre (a-z or 0-9) fino a max 63 caratteri.'; $wb['relayhost_txt'] = 'Relayhost'; -$wb['relayhost_user_txt'] = 'Relayhost User'; +$wb['relayhost_user_txt'] = 'Utente Relayhost'; $wb['relayhost_password_txt'] = 'Relayhost Password'; +?> diff --git a/interface/web/mail/lib/lang/it_mail_domain_catchall.lng b/interface/web/mail/lib/lang/it_mail_domain_catchall.lng index 7403fcd663c0a042eb30938606a128e3de9ad238..841a4391251d559344fe95802bba12bb041c1bc4 100644 --- a/interface/web/mail/lib/lang/it_mail_domain_catchall.lng +++ b/interface/web/mail/lib/lang/it_mail_domain_catchall.lng @@ -2,12 +2,12 @@ $wb['domain_txt'] = 'Dominio'; $wb['destination_txt'] = 'Destinazione'; $wb['active_txt'] = 'Attivo'; -$wb['domain_error_unique'] = 'There is already a Catchall record for this domain.'; -$wb['no_domain_perm'] = 'Non hai i diritti per this domain.'; -$wb['domain_error_regex'] = 'Invalid domain name od domain contiene caratteri non validi.'; -$wb['limit_mailcatchall_txt'] = 'The max. number of email catchall accounts raggiunto per il tuo account.'; -$wb['source_txt'] = 'Source'; -$wb['destination_error_isemail'] = 'Destination is no valid email address.'; -$wb['greylisting_txt'] = 'Enable greylisting'; -$wb['send_as_txt'] = 'Send as'; -$wb['send_as_exp'] = 'Allow destination to send from email addresses in this domain'; +$wb['domain_error_unique'] = 'Esiste già un record catchall per questo dominio.'; +$wb['no_domain_perm'] = 'Non hai i diritti per questo dominio.'; +$wb['domain_error_regex'] = 'Il dominio contiene caratteri non validi.'; +$wb['limit_mailcatchall_txt'] = 'Hai raggiunto il massimo numero di mail catchall per il tuo profilo.'; +$wb['source_txt'] = 'Mittente'; +$wb['destination_error_isemail'] = 'Il Destinatario non è un indirizzo mail valido.'; +$wb['greylisting_txt'] = 'Abilita greylisting'; +$wb['send_as_txt'] = 'Invia comes'; +$wb['send_as_exp'] = 'Abilita ad inviare da indirizzi mail di questo dominio'; diff --git a/interface/web/mail/lib/lang/it_mail_domain_catchall_list.lng b/interface/web/mail/lib/lang/it_mail_domain_catchall_list.lng index 78515acd8a52d7af9ff112e0a4abf7b4d07c0940..b2b069e3fef5bce25d763a012c6e6a18141df04d 100644 --- a/interface/web/mail/lib/lang/it_mail_domain_catchall_list.lng +++ b/interface/web/mail/lib/lang/it_mail_domain_catchall_list.lng @@ -2,8 +2,8 @@ $wb['list_head_txt'] = 'Email Catchall'; $wb['active_txt'] = 'Attivo'; $wb['source_txt'] = 'source'; -$wb['destination_txt'] = 'Destination email address'; +$wb['destination_txt'] = 'Indirizzo email destinatario'; $wb['server_id_txt'] = 'Server'; $wb['domain_txt'] = 'Dominio'; -$wb['add_new_record_txt'] = 'Aggiungi un nuovo Catchall'; +$wb['add_new_record_txt'] = 'Aggiungi un nuovo Catchall'; ?> diff --git a/interface/web/mail/lib/lang/it_mail_domain_list.lng b/interface/web/mail/lib/lang/it_mail_domain_list.lng index fcdf0d2b550966c762c5bc820ac5c289810a6ba3..e18a0590723d6cc85f223842614343247db9f842 100644 --- a/interface/web/mail/lib/lang/it_mail_domain_list.lng +++ b/interface/web/mail/lib/lang/it_mail_domain_list.lng @@ -2,6 +2,6 @@ $wb['list_head_txt'] = 'Dominio di Posta'; $wb['server_id_txt'] = 'Server'; $wb['domain_txt'] = 'Dominio'; -$wb['add_new_record_txt'] = 'Aggiungi un nuovo Domain'; +$wb['add_new_record_txt'] = 'Aggiungi un nuovo Dominio'; $wb['active_txt'] = 'Attivo'; ?> diff --git a/interface/web/mail/lib/lang/it_mail_forward.lng b/interface/web/mail/lib/lang/it_mail_forward.lng index 3b5210fba1e19d02aa9ae23fcc771937f1910e1e..8cba8613775f0790c39e7d5d1cc12209d58001b6 100644 --- a/interface/web/mail/lib/lang/it_mail_forward.lng +++ b/interface/web/mail/lib/lang/it_mail_forward.lng @@ -2,14 +2,14 @@ $wb['email_txt'] = 'Email'; $wb['destination_txt'] = 'Destinazione Email'; $wb['active_txt'] = 'Attivo'; -$wb['limit_mailforward_txt'] = 'Raggiunto il numero massimo di forwarders per il tuo account.'; +$wb['limit_mailforward_txt'] = 'Raggiunto il numero massimo di forwarders per il tuo profilo.'; $wb['duplicate_mailbox_txt'] = 'Esiste già una casella email per questo indirizzo'; $wb['domain_txt'] = 'Dominio'; $wb['source_txt'] = 'Source Email'; -$wb['destination_error_empty'] = 'The destination must not be empty.'; -$wb['destination_error_isemail'] = 'The destination contains at least one invalid email address.'; -$wb['email_error_isemail'] = 'Please enter a valid email address.'; -$wb['send_as_txt'] = 'Send as'; -$wb['send_as_exp'] = 'Allow target to send mail using this address as origin (if target is internal)'; -$wb['greylisting_txt'] = 'Enable greylisting'; -?> +$wb['destination_error_empty'] = 'Il destinatario non può essere vuoto.'; +$wb['destination_error_isemail'] = 'Almeno un indirizzo email non valido tra i destinatari.'; +$wb['email_error_isemail'] = 'Inserire un indirizzo mail corretto.'; +$wb['email_error_unique'] = 'Indirizzo email duplicato.'; +$wb['send_as_txt'] = 'Invia come'; +$wb['send_as_exp'] = 'Consenti al soggetto di inviare mail usando questo indirizzo come mittente (se il soggetto è interno)'; +$wb['greylisting_txt'] = 'Abilita liste grigie'; diff --git a/interface/web/mail/lib/lang/it_mail_forward_list.lng b/interface/web/mail/lib/lang/it_mail_forward_list.lng index 46215c510c30d4f433f063f28b1836310db33b87..14687f01a703eb5a131cc8fe14302dc5181cbd2b 100644 --- a/interface/web/mail/lib/lang/it_mail_forward_list.lng +++ b/interface/web/mail/lib/lang/it_mail_forward_list.lng @@ -1,8 +1,8 @@ <?php -$wb['list_head_txt'] = 'Mail Forward'; +$wb['list_head_txt'] = 'Inoltro Mail'; $wb['active_txt'] = 'Attivo'; -$wb['source_txt'] = 'source'; +$wb['source_txt'] = 'Sorgente'; $wb['destination_txt'] = 'Destinazione'; $wb['email_txt'] = 'Email'; -$wb['add_new_record_txt'] = 'Aggiungi un nuovo Email forward'; +$wb['add_new_record_txt'] = 'Aggiungi un nuovo Email forward'; ?> diff --git a/interface/web/mail/lib/lang/it_mail_get.lng b/interface/web/mail/lib/lang/it_mail_get.lng index 70770c22d423dd4e2d741748f65b5f15f8cc104d..9451959b1b14d3ed212df73cf68108e12835b677 100644 --- a/interface/web/mail/lib/lang/it_mail_get.lng +++ b/interface/web/mail/lib/lang/it_mail_get.lng @@ -1,19 +1,19 @@ <?php $wb['server_id_txt'] = 'Server'; -$wb['type_txt'] = 'Type'; +$wb['type_txt'] = 'Tipo'; $wb['source_server_txt'] = 'Pop3/Imap Server'; $wb['source_username_txt'] = 'Nome Utente'; $wb['source_password_txt'] = 'Password'; $wb['source_delete_txt'] = 'Elimina emails dopo averle scaricate'; -$wb['destination_txt'] = 'Destinazione'; +$wb['destination_txt'] = 'Destinatario'; $wb['active_txt'] = 'Attivo'; -$wb['limit_fetchmail_txt'] = 'Numero massimo di indirizzi Fetchmail per il tuo account raggiunti.'; -$wb['source_server_error_isempty'] = 'Valore Server vuoto.'; -$wb['source_username_error_isempty'] = 'Valore Nome Utente vuoto.'; -$wb['source_password_error_isempty'] = 'Valore Password vuoto.'; +$wb['limit_fetchmail_txt'] = 'Numero massimo di indirizzi Fetchmail per il tuo profilo raggiunti.'; +$wb['source_server_error_isempty'] = 'Valore Server vuoto.'; +$wb['source_username_error_isempty'] = 'Valore Nome Utente vuoto.'; +$wb['source_password_error_isempty'] = 'Valore Password vuoto.'; $wb['destination_error_isemail'] = 'Nessuna destinazione selezionata.'; $wb['source_server_error_regex'] = 'Pop3/Imap Server non è un nome dominio valido.'; $wb['source_read_all_txt'] = 'Recupera tutte le email (incluso mail lette)'; $wb['error_delete_read_all_combination'] = 'Combinazione di opzioni non conforme. Non puoi utilizzare \\"Elimina mail dopo averle scaricate \\" = NO assieme a \\"Recupera tutte le email\\" = SI'; -$wb['source_delete_note_txt'] = 'Please check first if email retrieval works, before you activate this option.'; +$wb['source_delete_note_txt'] = 'Verifica se riesci a scaricare le mail prima di attivare questa opzione.'; ?> diff --git a/interface/web/mail/lib/lang/it_mail_get_list.lng b/interface/web/mail/lib/lang/it_mail_get_list.lng index 839a076d6733db79ae80f8ac812f96cdfa261f35..086f187afeb42a86230ead46d1c8cf2d6f6f29d4 100644 --- a/interface/web/mail/lib/lang/it_mail_get_list.lng +++ b/interface/web/mail/lib/lang/it_mail_get_list.lng @@ -1,9 +1,9 @@ <?php -$wb['list_head_txt'] = 'Fetch emails from external POP3 / IMAP servers'; +$wb['list_head_txt'] = 'Preleva le emails da un server POP3 / IMAP esterni'; $wb['active_txt'] = 'Attivo'; $wb['server_id_txt'] = 'Server'; -$wb['source_server_txt'] = 'External Server'; +$wb['source_server_txt'] = 'Server esterno'; $wb['source_username_txt'] = 'Nome Utente'; -$wb['destination_txt'] = 'Destinazione'; -$wb['add_new_record_txt'] = 'Aggiungi un nuovo Account'; +$wb['destination_txt'] = 'Destinatario'; +$wb['add_new_record_txt'] = 'Aggiungi un nuovo Profilo'; ?> diff --git a/interface/web/mail/lib/lang/it_mail_mailinglist.lng b/interface/web/mail/lib/lang/it_mail_mailinglist.lng index 15629238a944628da95b67581036b0a323c4f244..37835237d865b5ab075906add885fa92dcecacba 100644 --- a/interface/web/mail/lib/lang/it_mail_mailinglist.lng +++ b/interface/web/mail/lib/lang/it_mail_mailinglist.lng @@ -1,10 +1,10 @@ <?php -$wb['limit_mailmailinglist_txt'] = 'Limit reached'; -$wb['domain_error_empty'] = 'Domain vuoto.'; -$wb['listname_error_empty'] = 'Listname vuoto.'; -$wb['domain_error_regex'] = 'Invalid domain name.'; -$wb['email_in_use_txt'] = 'Email is in use'; -$wb['no_domain_perm'] = 'Non hai i diritti per this domain.'; +$wb['limit_mailmailinglist_txt'] = 'Limite raggiunto'; +$wb['domain_error_empty'] = 'Dominio vuoto.'; +$wb['listname_error_empty'] = 'Listname vuoto.'; +$wb['domain_error_regex'] = 'Nome dominio non valido.'; +$wb['email_in_use_txt'] = 'Email è già in uso'; +$wb['no_domain_perm'] = 'Non hai i diritti per questo dominio.'; $wb['password_strength_txt'] = 'Livello sicurezza Password'; $wb['server_id_txt'] = 'Server'; $wb['domain_txt'] = 'Dominio'; @@ -16,7 +16,7 @@ $wb['generate_password_txt'] = 'Genera Password'; $wb['repeat_password_txt'] = 'Ripeti Password'; $wb['password_mismatch_txt'] = 'Le password non coincidono.'; $wb['password_match_txt'] = 'Le password coincidono.'; -$wb['listname_error_unique'] = 'There is already a mailinglist with name on the server. Please choose a different listname.'; -$wb['email_error_isemail'] = 'Email address is invalid.'; +$wb['listname_error_unique'] = 'Esiste già una lista mail con questo nome. Scegli un nome differente.'; +$wb['email_error_isemail'] = 'Indirizzo Email non valido.'; $wb['mailinglist_txt'] = 'Mailing list'; ?> diff --git a/interface/web/mail/lib/lang/it_mail_relay_domain.lng b/interface/web/mail/lib/lang/it_mail_relay_domain.lng new file mode 100644 index 0000000000000000000000000000000000000000..e5ea20d1005c5c4d159e519357235d148ea6b094 --- /dev/null +++ b/interface/web/mail/lib/lang/it_mail_relay_domain.lng @@ -0,0 +1,9 @@ +<?php +$wb['mail_relay_domain_title'] = 'Email relay domain'; +$wb['tab_relay_domain_title'] = 'Relay domain'; +$wb['server_id_txt'] = 'Server'; +$wb['active_txt'] = 'Attivo'; +$wb['domain_txt'] = 'Dominio'; +$wb['domain_error_regex'] = 'Invalid domain name.'; +$wb['domain_error_empty'] = 'Domain vuoto.'; +$wb['domain_error_unique'] = 'This Domain already exists as a mail relay domain on this server.'; diff --git a/interface/web/mail/lib/lang/it_mail_relay_domain_list.lng b/interface/web/mail/lib/lang/it_mail_relay_domain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..96f997fe6eccb41d99012fe80d25d8a318b9e412 --- /dev/null +++ b/interface/web/mail/lib/lang/it_mail_relay_domain_list.lng @@ -0,0 +1,7 @@ +<?php +$wb['list_head_txt'] = 'Relay domains'; +$wb['active_txt'] = 'Attivo'; +$wb['server_id_txt'] = 'Server'; +$wb['domain_txt'] = 'Dominio'; +$wb['add_new_record_txt'] = 'Add new relay domain'; +$wb['access_txt'] = 'access'; diff --git a/interface/web/mail/lib/lang/it_mail_relay_recipient.lng b/interface/web/mail/lib/lang/it_mail_relay_recipient.lng index 3bac79de1e13dfa3f44d200a0918cd7fc6650df7..f3a9302ebc5fc1193465d96761aac4036e5ff3eb 100644 --- a/interface/web/mail/lib/lang/it_mail_relay_recipient.lng +++ b/interface/web/mail/lib/lang/it_mail_relay_recipient.lng @@ -1,9 +1,9 @@ <?php $wb['server_id_txt'] = 'Server'; -$wb['source_txt'] = 'Relay recipient'; +$wb['source_txt'] = 'Destinatario Relay'; $wb['recipient_txt'] = 'Destinatario'; $wb['active_txt'] = 'Attivo'; $wb['source_error_notempty'] = 'Indirizzo vuoto.'; -$wb['type_txt'] = 'Type'; -$wb['limit_mailfilter_txt'] = 'Raggiunto numero massimo filtri emai per il tuo account.'; +$wb['type_txt'] = 'tipo'; +$wb['limit_mailfilter_txt'] = 'Raggiunto numero massimo filtri emai per il tuo profilo.'; ?> diff --git a/interface/web/mail/lib/lang/it_mail_relay_recipient_list.lng b/interface/web/mail/lib/lang/it_mail_relay_recipient_list.lng index 17a1fa008dbf8e049a0e8df75bee225d0c415439..3925fb753042f217d93ce6301d86c0f7cbfd2937 100644 --- a/interface/web/mail/lib/lang/it_mail_relay_recipient_list.lng +++ b/interface/web/mail/lib/lang/it_mail_relay_recipient_list.lng @@ -1,9 +1,9 @@ <?php -$wb['list_head_txt'] = 'Relay recipients'; +$wb['list_head_txt'] = 'Destinatari Relay'; $wb['active_txt'] = 'Attivo'; $wb['server_id_txt'] = 'Server'; -$wb['source_txt'] = 'Recipient address'; -$wb['recipient_txt'] = 'Recipient'; -$wb['add_new_record_txt'] = 'Aggiungi un nuovo relay recipient'; -$wb['access_txt'] = 'access'; +$wb['source_txt'] = 'Indirizzo destinatario'; +$wb['recipient_txt'] = 'Destinatario'; +$wb['add_new_record_txt'] = 'Aggiungi un nuovo destinatario relay'; +$wb['access_txt'] = 'Accesso'; ?> diff --git a/interface/web/mail/lib/lang/it_mail_spamfilter_list.lng b/interface/web/mail/lib/lang/it_mail_spamfilter_list.lng index b7daa3eaad187c095fdce4ab7f1a555c65542586..ea46965e4e3e128080d87010927bd906f9977a2d 100644 --- a/interface/web/mail/lib/lang/it_mail_spamfilter_list.lng +++ b/interface/web/mail/lib/lang/it_mail_spamfilter_list.lng @@ -4,5 +4,5 @@ $wb['active_txt'] = 'Attivo'; $wb['server_id_txt'] = 'Server'; $wb['server_name_txt'] = 'server_name'; $wb['email_txt'] = 'Email'; -$wb['add_new_record_txt'] = 'Aggiungi un nuovo Spamfilter record'; +$wb['add_new_record_txt'] = 'Aggiungi un nuovo record Spamfilter'; ?> diff --git a/interface/web/mail/lib/lang/it_mail_transport.lng b/interface/web/mail/lib/lang/it_mail_transport.lng index 9273621ff19fbd2fe748e2264dc91b1ec0c6b2d5..6b4734abaf7cd74a4a74f0738eab278cd6417593 100644 --- a/interface/web/mail/lib/lang/it_mail_transport.lng +++ b/interface/web/mail/lib/lang/it_mail_transport.lng @@ -2,10 +2,10 @@ $wb['server_id_txt'] = 'Server'; $wb['domain_txt'] = 'Dominio'; $wb['destination_txt'] = 'Destinazione'; -$wb['type_txt'] = 'Type'; +$wb['type_txt'] = 'Tipo'; $wb['mx_txt'] = 'No MX lookup'; $wb['sort_order_txt'] = 'Ordina per'; $wb['active_txt'] = 'Attivo'; -$wb['limit_mailrouting_txt'] = 'The max. number of routes raggiunto per il tuo account.'; +$wb['limit_mailrouting_txt'] = 'Hai raggiunto il numero massimo di mailroutes per il tuo profilo.'; $wb['transport_txt'] = 'Transport'; -?> +$wb['domain_error_unique'] = 'Un sistema di trasporto mail esiste già per questo dominio su questo server.'; diff --git a/interface/web/mail/lib/lang/it_mail_transport_list.lng b/interface/web/mail/lib/lang/it_mail_transport_list.lng index c89bb9ff77b1b558227d5101397ebf399cea5c60..4c0c6b6b333e4301d11292d2f4dac7675b2f3e9a 100644 --- a/interface/web/mail/lib/lang/it_mail_transport_list.lng +++ b/interface/web/mail/lib/lang/it_mail_transport_list.lng @@ -5,5 +5,5 @@ $wb['server_id_txt'] = 'Server'; $wb['domain_txt'] = 'Dominio'; $wb['transport_txt'] = 'Transport'; $wb['sort_order_txt'] = 'Ordina per'; -$wb['add_new_record_txt'] = 'Aggiungi un nuovo transport'; +$wb['add_new_record_txt'] = 'Aggiungi un nuovo transport'; ?> diff --git a/interface/web/mail/lib/lang/it_mail_user.lng b/interface/web/mail/lib/lang/it_mail_user.lng index 9d96407e453e4055df66f919a66b20aa2d55982f..fbfdfd2ae49cc8bc29bcd3abb981e465f693bb55 100644 --- a/interface/web/mail/lib/lang/it_mail_user.lng +++ b/interface/web/mail/lib/lang/it_mail_user.lng @@ -1,5 +1,5 @@ <?php -$wb['custom_mailfilter_txt'] = 'Custom mail filter recipe'; +$wb['custom_mailfilter_txt'] = 'Filtro destinatari mail personalizzato'; $wb['email_txt'] = 'Email'; $wb['cryptpwd_txt'] = 'Password'; $wb['password_strength_txt'] = 'Password livello sicurezza'; @@ -8,8 +8,8 @@ $wb['email_error_isemail'] = 'Indirizzo Email non valido.'; $wb['email_error_unique'] = 'Indirizzo Email duplicato.'; $wb['autoresponder_text_txt'] = 'Testo'; $wb['autoresponder_txt'] = 'Autorisponditore'; -$wb['no_domain_perm'] = 'Non hai i diritti per questo dominio.'; -$wb['error_no_pwd'] = 'Valore Password vuoto.'; +$wb['no_domain_perm'] = 'Non hai i diritti per questo dominio.'; +$wb['error_no_pwd'] = 'Valore Password vuoto.'; $wb['quota_error_isint'] = 'Il valore per la dimensione della casella di posta deve essere un numero.'; $wb['quota_txt'] = 'quota in MB'; $wb['server_id_txt'] = 'server_id'; @@ -17,11 +17,11 @@ $wb['password_txt'] = 'password'; $wb['password_click_to_set_txt'] = 'Click to set'; $wb['maildir_txt'] = 'maildir'; $wb['postfix_txt'] = 'Abilita ricezione'; -$wb['tooltip_postfix_txt'] = 'Allows incoming mail to this address.'; +$wb['tooltip_postfix_txt'] = 'Abilita ricezione messaggi per questa email.'; $wb['access_txt'] = 'Abilita indirizzo'; $wb['policy_txt'] = 'Spamfilter'; -$wb['inherit_policy'] = '- Inherit domain setting -'; -$wb['limit_mailbox_txt'] = 'Hai raggiungo il numero massimo di caselle per il tuo account.'; +$wb['inherit_policy'] = '- Importa le impostazioni del dominio -'; +$wb['limit_mailbox_txt'] = 'Hai raggiungo il numero massimo di caselle per il tuo profilo.'; $wb['limit_mailquota_txt'] = 'Hai raggiunto lo spazio massimo per le tue caselle di posta. Lo spazio massimo in MB è di'; $wb['disableimap_txt'] = 'Disabilita IMAP'; $wb['disablepop3_txt'] = 'Disabilita POP3'; @@ -32,22 +32,22 @@ $wb['autoresponder_start_date_ispast'] = 'La data di avvio no può essere anterg $wb['autoresponder_end_date_txt'] = 'Termina il'; $wb['autoresponder_end_date_isgreater'] = 'La data termine deve essere impostata e successiva al giorno di inizio.'; $wb['move_junk_txt'] = 'Sposta Email di Spam nella cartella di spam Junk'; -$wb['move_junk_y_txt'] = 'Move first, before custom filters.'; -$wb['move_junk_a_txt'] = 'Move last, after custom filters.'; -$wb['move_junk_n_txt'] = 'Do not move Spam Emails to Junk folder.'; +$wb['move_junk_y_txt'] = 'Sposta prima, poi i filtri personalizzati.'; +$wb['move_junk_a_txt'] = 'Sposta successivamente, prima i filtri personalizzati.'; +$wb['move_junk_n_txt'] = 'Non spostare le mail SPAM nella cartella Indesiderate.'; $wb['name_txt'] = 'Nome vero'; $wb['name_optional_txt'] = '(Opzionale)'; $wb['autoresponder_active'] = 'Abilita autorisponditore'; $wb['cc_txt'] = 'Trasmetti copia a'; $wb['cc_error_isemail'] = 'Il campo trasmetti copia a non contiene un indirizzo email valido'; -$wb['forward_in_lda_txt'] = 'Copy during delivery'; -$wb['tooltip_forward_in_lda_txt'] = 'Controls if mail copy is forwarded before or during delivery to mailbox.'; +$wb['forward_in_lda_txt'] = 'Copia durante la consegna'; +$wb['tooltip_forward_in_lda_txt'] = 'Controlla se la copia mail è inviata prima o durante la consegna alla mailbox.'; $wb['domain_txt'] = 'Dominio'; $wb['now_txt'] = 'Ora'; -$wb['login_error_unique'] = 'Questo Login è già occupato.'; +$wb['login_error_unique'] = 'Questo Login è già presente.'; $wb['login_error_regex'] = 'Caratteri ammessi sono A-Z, a-z, 0-9, ., _ e -.'; $wb['login_txt'] = 'Login (opzionale)'; -$wb['error_login_email_txt'] = 'Questo login non è ammesso. Inserire un login diverso o utilizzare un indirizzo email come login.'; +$wb['error_login_email_txt'] = 'Questo login non è ammesso. Inserire un login diverso o utilizzare un indirizzo email come login.'; $wb['autoresponder_subject_txt'] = 'Oggetto Email'; $wb['autoresponder_subject'] = 'Out of office reply'; $wb['generate_password_txt'] = 'Genera Password'; @@ -57,22 +57,22 @@ $wb['password_match_txt'] = 'Le passwords coincidono.'; $wb['email_error_isascii'] = 'Non utilizzare caratteri speciali unicode per la password. Potresti avere problemi con il tuo client di psota.'; $wb['cc_note_txt'] = '(Separa indirizzi email multipli con la virgola)'; $wb['disablesmtp_txt'] = 'Disabilita SMTP (trasmissione)'; -$wb['tooltip_disablesmtp_txt'] = 'Disables mail submission from this mail account.'; -$wb['disabledeliver_txt'] = 'Disable (local) delivering'; -$wb['tooltip_disabledeliver_txt'] = 'Disables delivery to INBOX, and processing by mail filters and sieve scripts. Mail forwards to \'Send copy to\' address.'; -$wb['autoresponder_start_date_is_required'] = 'Start date must be set when Autoresponder is enabled.'; -$wb['greylisting_txt'] = 'Enable greylisting'; -$wb['sender_cc_txt'] = 'Send outgoing BCC to'; -$wb['sender_cc_error_isemail'] = 'The -Send outgoing copy to- field does not contain a valid email address'; -$wb['backup_interval_txt'] = 'Backup interval'; -$wb['backup_copies_txt'] = 'Number of backup copies'; -$wb['no_backup_txt'] = 'No backup'; -$wb['daily_backup_txt'] = 'Daily'; -$wb['weekly_backup_txt'] = 'Weekly'; -$wb['monthly_backup_txt'] = 'Monthly'; -$wb['sender_cc_note_txt'] = '(One email address only)'; -$wb['purge_trash_days_txt'] = 'Purge Trash automatically after X days'; -$wb['tooltip_purge_trash_days_txt'] = '0 = disabled'; -$wb['purge_junk_days_txt'] = 'Purge Junk automatically after X days'; -$wb['tooltip_purge_junk_days_txt'] = '0 = disabled'; +$wb['tooltip_disablesmtp_txt'] = 'Disabilita l\'invio di mail da questo profilo.'; +$wb['disabledeliver_txt'] = 'Disabilita invio (locale)'; +$wb['tooltip_disabledeliver_txt'] = 'Disabilita consegna in cartella INBOX, e gestione filtri mail e script di controllo. Inoltra le mail all\'indirizzo: \'Invia copia a\'.'; +$wb['autoresponder_start_date_is_required'] = 'La data di inizio deve essere impostata prima che sia abilitato l\'Autorisponditore.'; +$wb['greylisting_txt'] = 'Abilita liste grigie'; +$wb['sender_cc_txt'] = 'Invia i messaggi in uscita in copia nascosta a'; +$wb['sender_cc_error_isemail'] = 'Il campo -Invia copia in uscita a- non contiene un indirizzo mail valido'; +$wb['backup_interval_txt'] = 'Intervallo di Backup'; +$wb['backup_copies_txt'] = 'Numero di copie backup'; +$wb['no_backup_txt'] = 'Nessun backup'; +$wb['daily_backup_txt'] = 'Giornaliero'; +$wb['weekly_backup_txt'] = 'Settimanale'; +$wb['monthly_backup_txt'] = 'Mensile'; +$wb['sender_cc_note_txt'] = '(Un indirizzo mail solamente)'; +$wb['purge_trash_days_txt'] = 'Svuota automaticamente il Cestino dopo X giorni'; +$wb['tooltip_purge_trash_days_txt'] = '0 = Disabilitato'; +$wb['purge_junk_days_txt'] = 'Svuota cartella Indesiderati automaticamente dopo X giorni'; +$wb['tooltip_purge_junk_days_txt'] = '0 = Disabilitato'; ?> diff --git a/interface/web/mail/lib/lang/it_mail_user_filter.lng b/interface/web/mail/lib/lang/it_mail_user_filter.lng index 1287b716ff5a2a7dda59c026617ab8aeea3e3892..745e5deb1ef9932f2c711e1610349bcbdb8c3a43 100644 --- a/interface/web/mail/lib/lang/it_mail_user_filter.lng +++ b/interface/web/mail/lib/lang/it_mail_user_filter.lng @@ -6,26 +6,26 @@ $wb['active_txt'] = 'Attivo'; $wb['rulename_error_empty'] = 'Nome vuoto.'; $wb['searchterm_is_empty'] = 'Termine ricerca vuoto.'; $wb['source_txt'] = 'Origine'; -$wb['target_error_regex'] = 'The target may only contain these characters: a-z, 0-9, -, ., _, &, /, and {space}'; -$wb['limit_mailfilter_txt'] = 'The max. number of mailfilters is reached.'; +$wb['target_error_regex'] = 'Può contenere solo: a-z, 0-9, -, ., _, &, /, e {spazio}'; +$wb['limit_mailfilter_txt'] = 'Hai raggiunto il numero massimo di filtri mail.'; $wb['subject_txt'] = 'Oggetto'; $wb['from_txt'] = 'Da'; $wb['to_txt'] = 'A'; -$wb['list_id_txt'] = 'List ID'; +$wb['list_id_txt'] = 'Lista ID'; $wb['contains_txt'] = 'Contiene'; $wb['is_txt'] = 'è'; $wb['begins_with_txt'] = 'Inizia con'; $wb['ends_with_txt'] = 'Termina con'; -$wb['regex_txt'] = 'Matches Regex'; +$wb['regex_txt'] = 'Soddisfa espressione'; $wb['delete_txt'] = 'Elimina'; -$wb['move_stop_txt'] = 'Move to'; -$wb['header_txt'] = 'Header'; -$wb['size_over_txt'] = 'Email size over (KB)'; -$wb['size_under_txt'] = 'Email size under (KB)'; -$wb['localpart_txt'] = 'Localpart'; -$wb['domain_txt'] = 'Domain'; -$wb['keep_txt'] = 'Keep'; -$wb['reject_txt'] = 'Reject'; +$wb['move_stop_txt'] = 'sposta a'; +$wb['header_txt'] = 'Intestazione'; +$wb['size_over_txt'] = 'dimensione Email oltre (KB)'; +$wb['size_under_txt'] = 'Dimensione Email inferiore (KB)'; +$wb['localpart_txt'] = 'Parte locale'; +$wb['domain_txt'] = 'Dominio'; +$wb['keep_txt'] = 'Mantieni'; +$wb['reject_txt'] = 'Rifiuta'; $wb['stop_txt'] = 'Stop'; -$wb['move_to_txt'] = 'Move to'; +$wb['move_to_txt'] = 'Sposta a'; ?> diff --git a/interface/web/mail/lib/lang/it_mail_whitelist.lng b/interface/web/mail/lib/lang/it_mail_whitelist.lng index fbc9980fed0991ef1c1919811ed3b336fa0fa5dc..3d683c9d067114fa77844befe4ac3f8812746c73 100644 --- a/interface/web/mail/lib/lang/it_mail_whitelist.lng +++ b/interface/web/mail/lib/lang/it_mail_whitelist.lng @@ -1,12 +1,12 @@ <?php $wb['server_id_txt'] = 'Server'; -$wb['source_txt'] = 'Witelist Address'; -$wb['recipient_txt'] = 'Recipient'; +$wb['source_txt'] = 'Lista bianca indirizzi'; +$wb['recipient_txt'] = 'Destinatario'; $wb['active_txt'] = 'Attivo'; -$wb['source_error_notempty'] = 'Address vuoto.'; -$wb['type_txt'] = 'Type'; -$wb['limit_mailfilter_txt'] = 'The max. number of email filters raggiunto per il tuo account.'; -$wb['limit_mail_wblist_txt'] = 'The max. number of email white / blacklist for your account is reached.'; -$wb['mail_access_unique'] = 'Whitelist Address already in use.'; -$wb['client_txt'] = 'Client'; -$wb['sender_txt'] = 'Sender'; +$wb['source_error_notempty'] = 'Indirizzo vuoto.'; +$wb['type_txt'] = 'Tipo'; +$wb['limit_mailfilter_txt'] = 'Hai raggiunto il limite massimo di filtri mail per il tuo profilo.'; +$wb['limit_mail_wblist_txt'] = 'Hai raggiunto il limite massimo di liste bianche / nere mail per il tuo profilo.'; +$wb['mail_access_unique'] = 'Indirizzo lista bianca già in uso.'; +$wb['client_txt'] = 'Cliente'; +$wb['sender_txt'] = 'Mittente'; diff --git a/interface/web/mail/lib/lang/it_mail_whitelist_list.lng b/interface/web/mail/lib/lang/it_mail_whitelist_list.lng index 1a5bbb6bb97ede7221c1fdd525c3e98337c92937..7d096865efc956a3b2d718c59c596563a3fffdb6 100644 --- a/interface/web/mail/lib/lang/it_mail_whitelist_list.lng +++ b/interface/web/mail/lib/lang/it_mail_whitelist_list.lng @@ -3,8 +3,8 @@ $wb['list_head_txt'] = 'Email Whitelist'; $wb['active_txt'] = 'Attivo'; $wb['server_id_txt'] = 'Server'; $wb['source_txt'] = 'Whitelisted address'; -$wb['type_txt'] = 'Type'; -$wb['recipient_txt'] = 'Recipient'; -$wb['add_new_record_txt'] = 'Aggiungi un nuovo Whitelist record'; -$wb['access_txt'] = 'access'; +$wb['type_txt'] = 'Tipo'; +$wb['recipient_txt'] = 'Destinatario'; +$wb['add_new_record_txt'] = 'Aggiungi un nuovo record Whitelist'; +$wb['access_txt'] = 'accesso'; ?> diff --git a/interface/web/mail/lib/lang/it_spamfilter_blacklist.lng b/interface/web/mail/lib/lang/it_spamfilter_blacklist.lng index 862999b00a4267848a61268df4904ef98c5de1ca..625b483309a5a4171b5f25aed215afcaf85b2c6c 100644 --- a/interface/web/mail/lib/lang/it_spamfilter_blacklist.lng +++ b/interface/web/mail/lib/lang/it_spamfilter_blacklist.lng @@ -5,7 +5,7 @@ $wb['rid_txt'] = 'Utente'; $wb['email_txt'] = 'Email'; $wb['priority_txt'] = 'Priorita'; $wb['active_txt'] = 'Attivo'; -$wb['limit_spamfilter_wblist_txt'] = 'E stato raggiunto il numero massimo di record per White- o Blacklist del tuo account.'; +$wb['limit_spamfilter_wblist_txt'] = 'E stato raggiunto il numero massimo di record per White- o Blacklist del tuo profilo.'; $wb['10 - highest'] = '10 - elevato'; $wb['5 - medium'] = '5 - medio'; $wb['1 - lowest'] = '1 - minimo'; diff --git a/interface/web/mail/lib/lang/it_spamfilter_config.lng b/interface/web/mail/lib/lang/it_spamfilter_config.lng index 05b1a3dacf68ae554618c51eb34a439812c472cf..4f26656a1838de0b924e3974e99fd892e0eaf7d0 100644 --- a/interface/web/mail/lib/lang/it_spamfilter_config.lng +++ b/interface/web/mail/lib/lang/it_spamfilter_config.lng @@ -1,7 +1,7 @@ <?php -$wb['getmail_config_dir_txt'] = 'Getmail Config Path'; +$wb['getmail_config_dir_txt'] = 'Percorso di configurazione Getmail'; $wb['ip_address_txt'] = 'Indirizzo IP'; -$wb['netmask_txt'] = 'Netmask'; +$wb['netmask_txt'] = 'Maschera sottorete'; $wb['gateway_txt'] = 'Gateway'; $wb['hostname_txt'] = 'Hostname'; $wb['nameservers_txt'] = 'Nameservers'; diff --git a/interface/web/mail/lib/lang/it_spamfilter_policy.lng b/interface/web/mail/lib/lang/it_spamfilter_policy.lng index 683b378c21e0eebc93556c6914165bc708521c02..abe6ac8c997cd03421ca65c75ee2ff395c9c46d5 100644 --- a/interface/web/mail/lib/lang/it_spamfilter_policy.lng +++ b/interface/web/mail/lib/lang/it_spamfilter_policy.lng @@ -1,51 +1,51 @@ <?php -$wb['policy_name_txt'] = 'Policy Name'; -$wb['virus_lover_txt'] = 'Virus lover'; -$wb['spam_lover_txt'] = 'SPAM lover'; -$wb['banned_files_lover_txt'] = 'Banned files lover'; -$wb['bad_header_lover_txt'] = 'Bad header lover'; -$wb['bypass_virus_checks_txt'] = 'Bypass virus checks'; -$wb['bypass_banned_checks_txt'] = 'Bypass banned checks'; -$wb['bypass_header_checks_txt'] = 'Bypass header checks'; -$wb['virus_quarantine_to_txt'] = 'Forward virus to email'; -$wb['spam_quarantine_to_txt'] = 'Forward spam to email'; -$wb['banned_quarantine_to_txt'] = 'Forward banned to email'; -$wb['bad_header_quarantine_to_txt'] = 'Forward bad header to email'; -$wb['clean_quarantine_to_txt'] = 'Forward clean to email'; -$wb['other_quarantine_to_txt'] = 'Forward other to email'; -$wb['spam_tag_level_txt'] = 'SPAM tag level'; -$wb['spam_tag2_level_txt'] = 'SPAM tag2 level'; -$wb['spam_kill_level_txt'] = 'SPAM kill level'; -$wb['spam_dsn_cutoff_level_txt'] = 'SPAM dsn cutoff level'; +$wb['policy_name_txt'] = 'Nome della politica di filtro'; +$wb['virus_lover_txt'] = 'Amante dei Virus'; +$wb['spam_lover_txt'] = 'Amante dello SPAM'; +$wb['banned_files_lover_txt'] = 'Amante dei files proibiti'; +$wb['bad_header_lover_txt'] = 'Amante delle intestazioni scorretter'; +$wb['bypass_virus_checks_txt'] = 'Escludi il controllo dei virus'; +$wb['bypass_banned_checks_txt'] = 'Escludi il controllo dei file proibiti'; +$wb['bypass_header_checks_txt'] = 'Escludi il controllo delle intestazioni'; +$wb['virus_quarantine_to_txt'] = 'Inoltra virus alla email'; +$wb['spam_quarantine_to_txt'] = 'Inoltra spam alla email'; +$wb['banned_quarantine_to_txt'] = 'Inoltra proibito alla email'; +$wb['bad_header_quarantine_to_txt'] = 'Inoltra intestazione scorretta alla email'; +$wb['clean_quarantine_to_txt'] = 'Inoltra puliti alla email'; +$wb['other_quarantine_to_txt'] = 'Inoltra gli altri alla email'; +$wb['spam_tag_level_txt'] = 'Etichetta SPAM'; +$wb['spam_tag2_level_txt'] = 'Etichetta2 SPAM'; +$wb['spam_kill_level_txt'] = 'Etichetta Elimina SPAM'; +$wb['spam_dsn_cutoff_level_txt'] = 'Etichetta Cancella dominio SPAM'; $wb['spam_quarantine_cutoff_level_txt'] = 'SPAM quarantine cutoff level'; -$wb['spam_modifies_subj_txt'] = 'SPAM modifies subject'; -$wb['spam_subject_tag_txt'] = 'SPAM subject tag'; -$wb['spam_subject_tag2_txt'] = 'SPAM subject tag2'; -$wb['addr_extension_virus_txt'] = 'Addr. extension virus'; -$wb['addr_extension_spam_txt'] = 'Addr. extension SPAM'; -$wb['addr_extension_banned_txt'] = 'Addr. extension banned'; -$wb['addr_extension_bad_header_txt'] = 'Addr extension bad header'; -$wb['warnvirusrecip_txt'] = 'Warn virus recip.'; -$wb['warnbannedrecip_txt'] = 'Warn banned recip.'; -$wb['warnbadhrecip_txt'] = 'Warn bad header recip.'; -$wb['newvirus_admin_txt'] = 'Newvirus admin'; -$wb['virus_admin_txt'] = 'Virus admin'; -$wb['banned_admin_txt'] = 'Banned admin'; -$wb['bad_header_admin_txt'] = 'Bad header admin'; -$wb['spam_admin_txt'] = 'SPAM admin'; -$wb['message_size_limit_txt'] = 'Message size limit'; -$wb['banned_rulenames_txt'] = 'Banned rulenames'; -$wb['rspamd_greylisting_txt'] = 'Use greylisting'; -$wb['rspamd_spam_greylisting_level_txt'] = 'Greylisting level'; -$wb['rspamd_spam_tag_level_txt'] = 'SPAM tag level'; -$wb['rspamd_spam_tag_method_txt'] = 'SPAM tag method'; -$wb['rspamd_spam_kill_level_txt'] = 'SPAM reject level'; -$wb['btn_save_txt'] = 'Save'; -$wb['btn_cancel_txt'] = 'Cancel'; -$wb['amavis_settings_txt'] = 'Settings'; -$wb['amavis_taglevel_txt'] = 'Tag-Level'; -$wb['amavis_quarantine_txt'] = 'Quarantine'; -$wb['amavis_other_txt'] = 'Other'; -$wb['add_header_txt'] = 'Add header'; -$wb['rewrite_subject_txt'] = 'Rewrite subject'; +$wb['spam_modifies_subj_txt'] = 'Modifica oggetto SPAM'; +$wb['spam_subject_tag_txt'] = 'Etichetta oggetto SPAM'; +$wb['spam_subject_tag2_txt'] = 'Etichetta2 oggetto SPAM'; +$wb['addr_extension_virus_txt'] = 'Indirizzo con estensione virus'; +$wb['addr_extension_spam_txt'] = 'Indirizzo con estensione SPAM'; +$wb['addr_extension_banned_txt'] = 'Indirizzo con estensione proibito'; +$wb['addr_extension_bad_header_txt'] = 'Indirizzo con estensione intestazione errata'; +$wb['warnvirusrecip_txt'] = 'Avvisa destinatario virus'; +$wb['warnbannedrecip_txt'] = 'Avvisa destinatario proibito'; +$wb['warnbadhrecip_txt'] = 'Avvisa destinatario errata intestazione.'; +$wb['newvirus_admin_txt'] = 'Amministratore nuovi virus'; +$wb['virus_admin_txt'] = 'Amministratore Virus'; +$wb['banned_admin_txt'] = 'Amministratore proibiti'; +$wb['bad_header_admin_txt'] = 'Amministratore intestazioni errate'; +$wb['spam_admin_txt'] = 'Amministratore SPAM'; +$wb['message_size_limit_txt'] = 'Limite dimensione messaggio'; +$wb['banned_rulenames_txt'] = 'Nome regola proibiti'; +$wb['rspamd_greylisting_txt'] = 'Usare liste grigie'; +$wb['rspamd_spam_greylisting_level_txt'] = 'Livello di liste grigie'; +$wb['rspamd_spam_tag_level_txt'] = 'Etichetta SPAM'; +$wb['rspamd_spam_tag_method_txt'] = 'Etichetta metodo SPAM'; +$wb['rspamd_spam_kill_level_txt'] = 'Respinto SPAM'; +$wb['btn_save_txt'] = 'Salva'; +$wb['btn_cancel_txt'] = 'Annulla'; +$wb['amavis_settings_txt'] = 'Impostazioni'; +$wb['amavis_taglevel_txt'] = 'Livello Etichetta'; +$wb['amavis_quarantine_txt'] = 'Quarantena'; +$wb['amavis_other_txt'] = 'Altri'; +$wb['add_header_txt'] = 'Aggiungi intestazione'; +$wb['rewrite_subject_txt'] = 'Riscrivi oggett0'; ?> diff --git a/interface/web/mail/lib/lang/it_spamfilter_policy_list.lng b/interface/web/mail/lib/lang/it_spamfilter_policy_list.lng index 7010d6147151917ecfce8e288b2065417efd82eb..cc6fa50261df2f259f9bc54292e9e21aa39420f8 100644 --- a/interface/web/mail/lib/lang/it_spamfilter_policy_list.lng +++ b/interface/web/mail/lib/lang/it_spamfilter_policy_list.lng @@ -1,9 +1,9 @@ <?php -$wb['list_head_txt'] = 'Spamfilter Policy'; +$wb['list_head_txt'] = 'Politica di Spamfilter'; $wb['policy_name_txt'] = 'Nome'; -$wb['virus_lover_txt'] = 'Virus lover'; -$wb['spam_lover_txt'] = 'Spam lover'; -$wb['banned_files_lover_txt'] = 'Banned Files lover'; -$wb['bad_header_lover_txt'] = 'Bad Header lover'; -$wb['add_new_record_txt'] = 'Add Policy record'; +$wb['virus_lover_txt'] = 'Amante dei Virus'; +$wb['spam_lover_txt'] = 'Amante dello SPAM'; +$wb['banned_files_lover_txt'] = 'Amante dei files proibiti'; +$wb['bad_header_lover_txt'] = 'Amante delle intestazioni scorretter'; +$wb['add_new_record_txt'] = 'Aggiungi un record alla politica'; ?> diff --git a/interface/web/mail/lib/lang/it_spamfilter_users.lng b/interface/web/mail/lib/lang/it_spamfilter_users.lng index cebb20324e774bc92664e93435b23551fee213b1..097d75ffbdbeabeb060b691734aad601d3cde7b8 100644 --- a/interface/web/mail/lib/lang/it_spamfilter_users.lng +++ b/interface/web/mail/lib/lang/it_spamfilter_users.lng @@ -5,9 +5,9 @@ $wb['policy_id_txt'] = 'Policy'; $wb['email_txt'] = 'Email (Pattern)'; $wb['fullname_txt'] = 'Nome'; $wb['local_txt'] = 'Local'; -$wb['email_error_notempty'] = 'The email address must not be vuoto.'; -$wb['fullname_error_notempty'] = 'The name must not be vuoto.'; +$wb['email_error_notempty'] = 'L\'indirizzo mail non può essere vuoto.'; +$wb['fullname_error_notempty'] = 'Il nome non può essere vuoto.'; $wb['10 - highest'] = '10 - elevata'; $wb['5 - medium'] = '5 - media'; $wb['1 - lowest'] = '1 - minima'; -?> +$wb['inherit_policy'] = '- Importa le impostazioni del dominio -'; diff --git a/interface/web/mail/lib/lang/it_spamfilter_users_list.lng b/interface/web/mail/lib/lang/it_spamfilter_users_list.lng index 3a707975508a2ed8cbf69390050d9c08504de994..33ffd4db99e400230f25bbf97a9c3726479d1337 100644 --- a/interface/web/mail/lib/lang/it_spamfilter_users_list.lng +++ b/interface/web/mail/lib/lang/it_spamfilter_users_list.lng @@ -1,10 +1,10 @@ <?php -$wb['list_head_txt'] = 'Spamfilter Users'; -$wb['local_txt'] = 'Local'; +$wb['list_head_txt'] = 'Utenti Spamfilter'; +$wb['local_txt'] = 'Locale'; $wb['server_id_txt'] = 'Server'; $wb['priority_txt'] = 'Priorita'; -$wb['policy_id_txt'] = 'Policy'; +$wb['policy_id_txt'] = 'Politica'; $wb['fullname_txt'] = 'Nome'; $wb['email_txt'] = 'Email'; -$wb['add_new_record_txt'] = 'Add Spamfilter User'; +$wb['add_new_record_txt'] = 'Aggiungi utente Spamfilter'; ?> diff --git a/interface/web/mail/lib/lang/it_spamfilter_whitelist.lng b/interface/web/mail/lib/lang/it_spamfilter_whitelist.lng index a484eaf4f8e8708c2d5695125d2ad09c1f665fbc..277abadf1bd609cb8f907e23067896932e2803e5 100644 --- a/interface/web/mail/lib/lang/it_spamfilter_whitelist.lng +++ b/interface/web/mail/lib/lang/it_spamfilter_whitelist.lng @@ -5,7 +5,7 @@ $wb['rid_txt'] = 'Utente'; $wb['email_txt'] = 'Email'; $wb['priority_txt'] = 'Priorità '; $wb['active_txt'] = 'Attivo'; -$wb['limit_spamfilter_wblist_txt'] = 'Raggiunto numero massimo di record white/blacklist per questo account.'; +$wb['limit_spamfilter_wblist_txt'] = 'Raggiunto numero massimo di record white/blacklist per questo profilo.'; $wb['10 - highest'] = '10 - elevata'; $wb['5 - medium'] = '5 - media'; $wb['1 - lowest'] = '1 - minima'; diff --git a/interface/web/mail/lib/lang/it_spamfilter_whitelist_list.lng b/interface/web/mail/lib/lang/it_spamfilter_whitelist_list.lng index 1b75490065ece922704624178802644cc6af9fe8..2f91ad20a42b2679677697dde787ea212ab65f6e 100644 --- a/interface/web/mail/lib/lang/it_spamfilter_whitelist_list.lng +++ b/interface/web/mail/lib/lang/it_spamfilter_whitelist_list.lng @@ -2,7 +2,7 @@ $wb['list_head_txt'] = 'Whitelist Filtro Spam '; $wb['active_txt'] = 'Activo'; $wb['server_id_txt'] = 'Server'; -$wb['priority_txt'] = 'Priorita'; +$wb['priority_txt'] = 'Priorità '; $wb['rid_txt'] = 'Utente'; $wb['email_txt'] = 'Email in Whitelist'; $wb['add_new_record_txt'] = 'Adggiungi record Whitelist'; diff --git a/interface/web/mail/lib/lang/it_xmpp_domain.lng b/interface/web/mail/lib/lang/it_xmpp_domain.lng index 0541203b2e19bc1658e140470cb0375f774c7e0a..9e375a433c909ccefae70ce952df3207d6da0c2b 100644 --- a/interface/web/mail/lib/lang/it_xmpp_domain.lng +++ b/interface/web/mail/lib/lang/it_xmpp_domain.lng @@ -1,62 +1,62 @@ <?php $wb['server_id_txt'] = 'Server'; -$wb['client_group_id_txt'] = 'Client'; -$wb['domain_txt'] = 'Domain'; -$wb['type_txt'] = 'Type'; -$wb['active_txt'] = 'Active'; -$wb['client_txt'] = 'Client'; -$wb['management_method_txt'] = 'Management of user accounts'; -$wb['public_registration_txt'] = 'Enable public registration'; -$wb['registration_url_txt'] = 'Registration URL'; -$wb['registration_message_txt'] = 'Registration Message'; -$wb['domain_admins_txt'] = 'Domain Admins (JIDs)'; -$wb['use_pubsub_txt'] = 'Enable Pubsub'; -$wb['use_proxy_txt'] = 'Enable Bytestream Proxy'; -$wb['use_anon_host_txt'] = 'Enable Anonymous Host'; -$wb['use_vjud_txt'] = 'Enable VJUD User Directory'; +$wb['client_group_id_txt'] = 'Cliente'; +$wb['domain_txt'] = 'Dominio'; +$wb['type_txt'] = 'Tipo'; +$wb['active_txt'] = 'Attivo'; +$wb['client_txt'] = 'Cliente'; +$wb['management_method_txt'] = 'Mgestione profili utenti'; +$wb['public_registration_txt'] = 'Consenti registrazione pubblica'; +$wb['registration_url_txt'] = 'URL di Registrazione'; +$wb['registration_message_txt'] = 'Messaggio di Registratione'; +$wb['domain_admins_txt'] = 'Amministratori di Dominio (JIDs)'; +$wb['use_pubsub_txt'] = 'Abilita Pubsub'; +$wb['use_proxy_txt'] = 'Abilita Bytestream Proxy'; +$wb['use_anon_host_txt'] = 'Abilita Anonymous Host'; +$wb['use_vjud_txt'] = 'Abilita VJUD User Directory'; $wb['vjud_opt_mode_txt'] = 'VJUD Opt Mode'; -$wb['use_muc_host_txt'] = 'Enable Multi User Chatrooms'; -$wb['muc_name_txt'] = 'Name in MUC Service Discovery'; -$wb['muc_restrict_room_creation_txt'] = 'Permission to create chatrooms'; -$wb['muc_admins_txt'] = 'MUC Admins (JIDs)'; -$wb['use_pastebin_txt'] = 'Enable Pastebin'; -$wb['pastebin_expire_after_txt'] = 'Pastes expire after (hours)'; +$wb['use_muc_host_txt'] = 'Abilita Chatrooms multi utente'; +$wb['muc_name_txt'] = 'Nome in MUC Service Discovery'; +$wb['muc_restrict_room_creation_txt'] = 'Permesso di creare chatrooms'; +$wb['muc_admins_txt'] = 'Amministratori MUC (JIDs)'; +$wb['use_pastebin_txt'] = 'Abilita Pastebin'; +$wb['pastebin_expire_after_txt'] = 'Pastes scade dopo (ore)'; $wb['pastebin_trigger_txt'] = 'Pastebin trigger'; -$wb['use_http_archive_txt'] = 'Enable HTTP chatroom archive'; -$wb['http_archive_show_join_txt'] = 'Show join messages in archive'; -$wb['http_archive_show_status_txt'] = 'Show status changes in archive'; -$wb['use_status_host_txt'] = 'Enable XML Status host'; -$wb['cant_change_domainname_txt'] = 'The Domain name of existing XMPP domain cannot be changed.'; -$wb['about_registration_url_txt'] = 'Link to your registration form.'; -$wb['about_registration_message_txt'] = 'Description about your account registration process.'; -$wb['no_corresponding_maildomain_txt'] = 'Corresponding mail domain for user management not found. Please create the mail domain first.'; -$wb['ssl_state_txt'] = 'State'; -$wb['ssl_locality_txt'] = 'Locality'; -$wb['ssl_organisation_txt'] = 'Organisation'; -$wb['ssl_organisation_unit_txt'] = 'Organisation Unit'; -$wb['ssl_country_txt'] = 'Country'; -$wb['ssl_key_txt'] = 'SSL Key'; -$wb['ssl_request_txt'] = 'SSL Request'; -$wb['ssl_cert_txt'] = 'SSL Certificate'; +$wb['use_http_archive_txt'] = 'Abilita archivio chatroom HTTP'; +$wb['http_archive_show_join_txt'] = 'Mostra messaggio di collegamento in archivio'; +$wb['http_archive_show_status_txt'] = 'Mostra il cambio di stato nell\'archivio'; +$wb['use_status_host_txt'] = 'Abilita lo stato XML'; +$wb['cant_change_domainname_txt'] = 'Il nome di dominio di domini XMPP esistenti non può essere cambiato.'; +$wb['about_registration_url_txt'] = 'Collegamento al tuo modulo di registrazione.'; +$wb['about_registration_message_txt'] = 'Descrizione dellle modalità di registrazione del tuo profilo.'; +$wb['no_corresponding_maildomain_txt'] = 'Il dominio emai corrispondente per la gestione utenti non è stato trovato. Crea prima il dominio email.'; +$wb['ssl_state_txt'] = 'Stato'; +$wb['ssl_locality_txt'] = 'Località '; +$wb['ssl_organisation_txt'] = 'Organizzazione'; +$wb['ssl_organisation_unit_txt'] = 'Reparto'; +$wb['ssl_country_txt'] = 'Paese'; +$wb['ssl_key_txt'] = 'Chiave SSL'; +$wb['ssl_request_txt'] = 'Richiesta SSL'; +$wb['ssl_cert_txt'] = 'SSL Certificato'; $wb['ssl_bundle_txt'] = 'SSL Bundle'; -$wb['ssl_action_txt'] = 'SSL Action'; -$wb['ssl_email_txt'] = 'Email Address'; +$wb['ssl_action_txt'] = 'SSL Azione'; +$wb['ssl_email_txt'] = 'Indirizzo Email'; $wb['ssl_txt'] = 'SSL'; -$wb['error_ssl_state_empty'] = 'SSL State is empty.'; -$wb['error_ssl_locality_empty'] = 'SSL Locality is empty.'; -$wb['error_ssl_organisation_empty'] = 'SSL Organisation is empty.'; -$wb['error_ssl_organisation_unit_empty'] = 'SSL Organisation Unit is empty.'; -$wb['error_ssl_country_empty'] = 'SSL Country is empty.'; -$wb['error_ssl_cert_empty'] = 'SSL Certificate field is empty'; -$wb['ssl_state_error_regex'] = 'Invalid SSL State. Valid characters are: a-z, 0-9 and .,-_&äöüÄÖÜ'; -$wb['ssl_locality_error_regex'] = 'Invalid SSL Locality. Valid characters are: a-z, 0-9 and .,-_&äöüÄÖÜ'; -$wb['ssl_organisation_error_regex'] = 'Invalid SSL Organisation. Valid characters are: a-z, 0-9 and .,-_&äöüÄÖÜ'; -$wb['ssl_organistaion_unit_error_regex'] = 'Invalid SSL Organisation Unit. Valid characters are: a-z, 0-9 and .,-_&äöüÄÖÜ'; -$wb['ssl_country_error_regex'] = 'Invalid SSL Country. Valid characters are: A-Z'; -$wb['none_txt'] = 'None'; -$wb['save_certificate_txt'] = 'Save certificate'; -$wb['create_certificate_txt'] = 'Create certificate'; -$wb['delete_certificate_txt'] = 'Delete certificate'; -$wb['ssl_error_isemail'] = 'Please enter a valid email adress for generation of the SSL certificate'; -$wb['limit_xmppdomain_txt'] = 'The max. number of XMPP domains for your account is reached.'; +$wb['error_ssl_state_empty'] = 'SSL Stato è vuoto.'; +$wb['error_ssl_locality_empty'] = 'SSL Località è vuoto.'; +$wb['error_ssl_organisation_empty'] = 'SSL Organizzazione è vuoto.'; +$wb['error_ssl_organisation_unit_empty'] = 'SSL Reparto è vuoto.'; +$wb['error_ssl_country_empty'] = 'SSL Paese è vuoto.'; +$wb['error_ssl_cert_empty'] = 'SSL Il campo Certificato è vuoto'; +$wb['ssl_state_error_regex'] = 'Stato SSL non valido. Caratteri ammessi: a-z, 0-9 and .,-_&äöüÄÖÜ'; +$wb['ssl_locality_error_regex'] = 'Località SSL non valida. Caratteri ammessi: a-z, 0-9 and .,-_&äöüÄÖÜ'; +$wb['ssl_organisation_error_regex'] = 'Organizzazione SSL non valida. Caratteri ammessi: a-z, 0-9 and .,-_&äöüÄÖÜ'; +$wb['ssl_organistaion_unit_error_regex'] = 'Reparto SSL non valido. Caratteri ammessi: a-z, 0-9 and .,-_&äöüÄÖÜ'; +$wb['ssl_country_error_regex'] = 'Paese SSL non valido. Caratteri ammessi: A-Z'; +$wb['none_txt'] = 'Nessuno'; +$wb['save_certificate_txt'] = 'Salvare certificato'; +$wb['create_certificate_txt'] = 'Creare certificato'; +$wb['delete_certificate_txt'] = 'Cancellare certificato'; +$wb['ssl_error_isemail'] = 'Inserire un indirizzo email valido per generare il certificato SSL'; +$wb['limit_xmppdomain_txt'] = 'Hai raggiunto il massimo numero di domini XMPP per il tuo profilo.'; ?> diff --git a/interface/web/mail/lib/lang/it_xmpp_domain_admin_list.lng b/interface/web/mail/lib/lang/it_xmpp_domain_admin_list.lng index af643eab5aee3835de27ff78c851d0048052fefe..45c5b08979d838160f873e189f4714108113fe1a 100644 --- a/interface/web/mail/lib/lang/it_xmpp_domain_admin_list.lng +++ b/interface/web/mail/lib/lang/it_xmpp_domain_admin_list.lng @@ -1,8 +1,8 @@ <?php -$wb['list_head_txt'] = 'XMPP Domain'; +$wb['list_head_txt'] = 'Dominio XMPP'; $wb['server_id_txt'] = 'Server'; -$wb['domain_txt'] = 'Domain'; -$wb['add_new_record_txt'] = 'Add new Domain'; -$wb['active_txt'] = 'Active'; -$wb['sys_groupid_txt'] = 'Client'; +$wb['domain_txt'] = 'Dominio'; +$wb['add_new_record_txt'] = 'Aggiungi nuovo Dominio'; +$wb['active_txt'] = 'Attivo'; +$wb['sys_groupid_txt'] = 'Cliente'; ?> diff --git a/interface/web/mail/lib/lang/it_xmpp_domain_list.lng b/interface/web/mail/lib/lang/it_xmpp_domain_list.lng index ebfebab7d50cc92cd87be46e8de665ba2bfb6f23..7bf8ea9187d4469bc21c3f525c5b0fc380cad4b2 100644 --- a/interface/web/mail/lib/lang/it_xmpp_domain_list.lng +++ b/interface/web/mail/lib/lang/it_xmpp_domain_list.lng @@ -1,7 +1,7 @@ <?php -$wb['list_head_txt'] = 'XMPP Domain'; +$wb['list_head_txt'] = 'Dominio XMPP'; $wb['server_id_txt'] = 'Server'; -$wb['domain_txt'] = 'Domain'; -$wb['add_new_record_txt'] = 'Add new Domain'; -$wb['active_txt'] = 'Active'; +$wb['domain_txt'] = 'Dominio'; +$wb['add_new_record_txt'] = 'Aggiungi un nuovo Dominio'; +$wb['active_txt'] = 'Attivo'; ?> diff --git a/interface/web/mail/lib/lang/it_xmpp_user.lng b/interface/web/mail/lib/lang/it_xmpp_user.lng index 6ab739d98b9ad877f9f9de5f04530b7add424fd5..960ff8b331f8f7481e9fca2a612c11fcaf9cdabc 100644 --- a/interface/web/mail/lib/lang/it_xmpp_user.lng +++ b/interface/web/mail/lib/lang/it_xmpp_user.lng @@ -1,15 +1,15 @@ <?php -$wb['list_head_txt'] = 'XMPP User Accounts'; +$wb['list_head_txt'] = 'Profilo utente XMPP'; $wb['jid_txt'] = 'Jabber ID'; -$wb['active_txt'] = 'Active'; +$wb['active_txt'] = 'Attivo'; $wb['cryptpwd_txt'] = 'Password'; -$wb['password_strength_txt'] = 'Password strength'; -$wb['error_no_pwd'] = 'Password is empty.'; +$wb['password_strength_txt'] = 'Forza della Password'; +$wb['error_no_pwd'] = 'Password è vuota.'; $wb['password_txt'] = 'Password'; -$wb['generate_password_txt'] = 'Generate Password'; -$wb['repeat_password_txt'] = 'Repeat Password'; -$wb['password_mismatch_txt'] = 'The passwords do not match.'; -$wb['password_match_txt'] = 'The passwords do match.'; -$wb['no_domain_perm'] = 'You have no permission for this domain.'; -$wb['limit_xmpp_user_txt'] = 'The max. number of xmpp accounts for your account is reached.'; +$wb['generate_password_txt'] = 'Genera Password'; +$wb['repeat_password_txt'] = 'Ripeti Password'; +$wb['password_mismatch_txt'] = 'Le password sono diverse.'; +$wb['password_match_txt'] = 'Le password coincidono.'; +$wb['no_domain_perm'] = 'Non hai i permessi per questo dominio.'; +$wb['limit_xmpp_user_txt'] = 'Hai raggiunto il massimo numero di utenti XMPP per il tuo profilo.'; ?> diff --git a/interface/web/mail/lib/lang/it_xmpp_user_list.lng b/interface/web/mail/lib/lang/it_xmpp_user_list.lng index f2651cb62b0cfbe55156d943e91fd7e0c33ac515..0a22caf8a1b2edfbd08e2008eb548e7d89157f9d 100644 --- a/interface/web/mail/lib/lang/it_xmpp_user_list.lng +++ b/interface/web/mail/lib/lang/it_xmpp_user_list.lng @@ -1,8 +1,8 @@ <?php -$wb['list_head_txt'] = 'XMPP User Accounts'; +$wb['list_head_txt'] = 'Profilo utente XMPP'; $wb['jid_txt'] = 'Jabber ID'; -$wb['is_domain_admin_txt'] = 'Domain admin'; -$wb['is_muc_admin_txt'] = 'MUC admin'; -$wb['add_new_record_txt'] = 'Add new user'; -$wb['active_txt'] = 'Active'; +$wb['is_domain_admin_txt'] = 'Amministratore Dominio'; +$wb['is_muc_admin_txt'] = 'Amministratore MUC'; +$wb['add_new_record_txt'] = 'Aggiungi nuovo utente'; +$wb['active_txt'] = 'Attivo'; ?> diff --git a/interface/web/mail/lib/lang/ja_mail_alias.lng b/interface/web/mail/lib/lang/ja_mail_alias.lng index c03bb825dad7a258f13c3f57c5e028e358e7d552..317a28337fa7fd0e16ce2539e3ef04238403f8e5 100644 --- a/interface/web/mail/lib/lang/ja_mail_alias.lng +++ b/interface/web/mail/lib/lang/ja_mail_alias.lng @@ -14,4 +14,3 @@ $wb['source_txt'] = 'Alias'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this alias as origin'; -?> diff --git a/interface/web/mail/lib/lang/ja_mail_forward.lng b/interface/web/mail/lib/lang/ja_mail_forward.lng index f849f7bf18070bb4073d96c1982e26063dac971d..0d6b4312efb3fafa7b48f7ae62c11da3a58977a1 100644 --- a/interface/web/mail/lib/lang/ja_mail_forward.lng +++ b/interface/web/mail/lib/lang/ja_mail_forward.lng @@ -10,6 +10,6 @@ $wb['greylisting_txt'] = 'Enable greylisting'; $wb['destination_error_empty'] = 'The destination must not be empty.'; $wb['destination_error_isemail'] = 'The destination contains at least one invalid email address.'; $wb['email_error_isemail'] = 'Please enter a valid email address.'; +$wb['email_error_unique'] = 'メールアドレスãŒé‡è¤‡ã—ã¦ã„ã¾ã™ã€‚'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this address as origin (if target is internal)'; -?> diff --git a/interface/web/mail/lib/lang/ja_mail_relay_domain.lng b/interface/web/mail/lib/lang/ja_mail_relay_domain.lng new file mode 100644 index 0000000000000000000000000000000000000000..ea66b94551477cee7f882d8f2f73f45a101f62e7 --- /dev/null +++ b/interface/web/mail/lib/lang/ja_mail_relay_domain.lng @@ -0,0 +1,9 @@ +<?php +$wb['mail_relay_domain_title'] = 'Email relay domain'; +$wb['tab_relay_domain_title'] = 'Relay domain'; +$wb['server_id_txt'] = 'Server'; +$wb['active_txt'] = 'Active'; +$wb['domain_txt'] = 'ドメイン'; +$wb['domain_error_regex'] = 'Invalid domain name.'; +$wb['domain_error_empty'] = 'Domain is empty.'; +$wb['domain_error_unique'] = 'This Domain already exists as a mail relay domain on this server.'; diff --git a/interface/web/mail/lib/lang/ja_mail_relay_domain_list.lng b/interface/web/mail/lib/lang/ja_mail_relay_domain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..dceb86ee842b3839df4ad16b312435058ac504d1 --- /dev/null +++ b/interface/web/mail/lib/lang/ja_mail_relay_domain_list.lng @@ -0,0 +1,7 @@ +<?php +$wb['list_head_txt'] = 'Relay domains'; +$wb['active_txt'] = 'Active'; +$wb['server_id_txt'] = 'Server'; +$wb['domain_txt'] = 'ドメイン'; +$wb['add_new_record_txt'] = 'Add new relay domain'; +$wb['access_txt'] = 'access'; diff --git a/interface/web/mail/lib/lang/ja_mail_transport.lng b/interface/web/mail/lib/lang/ja_mail_transport.lng index a870dd118a849898c128694ecb3ad253db88ebd3..afccb0195637a98ad49bbb37eb0d73c4dc88150a 100644 --- a/interface/web/mail/lib/lang/ja_mail_transport.lng +++ b/interface/web/mail/lib/lang/ja_mail_transport.lng @@ -8,4 +8,4 @@ $wb['sort_order_txt'] = '優先度'; $wb['active_txt'] = '有効'; $wb['limit_mailrouting_txt'] = '最大数ã«é”ã—ãŸç‚ºã€ã“れ以上é…é€çµŒè·¯ã‚’è¿½åŠ ã§ãã¾ã›ã‚“。'; $wb['transport_txt'] = 'Transport'; -?> +$wb['domain_error_unique'] = 'A mail transport for this Domain already exists on this server.'; diff --git a/interface/web/mail/lib/lang/ja_spamfilter_users.lng b/interface/web/mail/lib/lang/ja_spamfilter_users.lng index cd212e941845697a470401501d90929af3856203..5272d3f3e1b2de9e3aba322fd76a2cbbbd62560b 100644 --- a/interface/web/mail/lib/lang/ja_spamfilter_users.lng +++ b/interface/web/mail/lib/lang/ja_spamfilter_users.lng @@ -10,4 +10,4 @@ $wb['fullname_error_notempty'] = 'The name must not be empty.'; $wb['10 - highest'] = '10 - highest'; $wb['5 - medium'] = '5 - medium'; $wb['1 - lowest'] = '1 - lowest'; -?> +$wb['inherit_policy'] = '- Inherit domain setting -'; diff --git a/interface/web/mail/lib/lang/nl_mail_alias.lng b/interface/web/mail/lib/lang/nl_mail_alias.lng index d327afa90c3008fe1e5ea678dea80dcee7f207d3..1ab52542abbafcaf5fbbffa944794a7bd4482cd9 100644 --- a/interface/web/mail/lib/lang/nl_mail_alias.lng +++ b/interface/web/mail/lib/lang/nl_mail_alias.lng @@ -14,4 +14,3 @@ $wb['source_txt'] = 'Alias'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this alias as origin'; -?> diff --git a/interface/web/mail/lib/lang/nl_mail_forward.lng b/interface/web/mail/lib/lang/nl_mail_forward.lng index 6bf586a0d2b849cf643a71d2cae3f7b5e74c5b86..33dadeef6b4c5877825b82d1f1e48f05cb3e97ce 100644 --- a/interface/web/mail/lib/lang/nl_mail_forward.lng +++ b/interface/web/mail/lib/lang/nl_mail_forward.lng @@ -10,6 +10,6 @@ $wb['greylisting_txt'] = 'Enable greylisting'; $wb['destination_error_empty'] = 'The destination must not be empty.'; $wb['destination_error_isemail'] = 'The destination contains at least one invalid email address.'; $wb['email_error_isemail'] = 'Please enter a valid email address.'; +$wb['email_error_unique'] = 'Duplicaat E-mail adres.'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this address as origin (if target is internal)'; -?> diff --git a/interface/web/mail/lib/lang/nl_mail_relay_domain.lng b/interface/web/mail/lib/lang/nl_mail_relay_domain.lng new file mode 100644 index 0000000000000000000000000000000000000000..e76ed68a5d2cb1eefbb8864f743b7986b5cf2cdd --- /dev/null +++ b/interface/web/mail/lib/lang/nl_mail_relay_domain.lng @@ -0,0 +1,9 @@ +<?php +$wb['mail_relay_domain_title'] = 'Email relay domain'; +$wb['tab_relay_domain_title'] = 'Relay domain'; +$wb['server_id_txt'] = 'Server'; +$wb['active_txt'] = 'Actief'; +$wb['domain_txt'] = 'Domein'; +$wb['domain_error_regex'] = 'Invalid domain name.'; +$wb['domain_error_empty'] = 'Domain is empty.'; +$wb['domain_error_unique'] = 'This Domain already exists as a mail relay domain on this server.'; diff --git a/interface/web/mail/lib/lang/nl_mail_relay_domain_list.lng b/interface/web/mail/lib/lang/nl_mail_relay_domain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..d25076fc2567ca61740ec68f5bb573bdabf8f8e3 --- /dev/null +++ b/interface/web/mail/lib/lang/nl_mail_relay_domain_list.lng @@ -0,0 +1,7 @@ +<?php +$wb['list_head_txt'] = 'Relay domains'; +$wb['active_txt'] = 'Actief'; +$wb['server_id_txt'] = 'Server'; +$wb['domain_txt'] = 'Domein'; +$wb['add_new_record_txt'] = 'Add new relay domain'; +$wb['access_txt'] = 'toegang'; diff --git a/interface/web/mail/lib/lang/nl_mail_transport.lng b/interface/web/mail/lib/lang/nl_mail_transport.lng index 9e792e87628d84e9f1c4517fb1948ffa9b9eb1df..d7ecc761e637a368d05af324b70af545cb806143 100644 --- a/interface/web/mail/lib/lang/nl_mail_transport.lng +++ b/interface/web/mail/lib/lang/nl_mail_transport.lng @@ -8,4 +8,4 @@ $wb['sort_order_txt'] = 'Gesorteerd op'; $wb['active_txt'] = 'Actief'; $wb['limit_mailrouting_txt'] = 'Het max. aantal routes voor uw account is bereikt.'; $wb['transport_txt'] = 'Transport'; -?> +$wb['domain_error_unique'] = 'A mail transport for this Domain already exists on this server.'; diff --git a/interface/web/mail/lib/lang/nl_spamfilter_users.lng b/interface/web/mail/lib/lang/nl_spamfilter_users.lng index 697e130b35b684598ec557f33e87614e51ad65b5..b9da8e7e4a56c55e18c2203361dd830f6dbaf113 100644 --- a/interface/web/mail/lib/lang/nl_spamfilter_users.lng +++ b/interface/web/mail/lib/lang/nl_spamfilter_users.lng @@ -10,4 +10,4 @@ $wb['fullname_error_notempty'] = 'The name must not be empty.'; $wb['10 - highest'] = '10 - highest'; $wb['5 - medium'] = '5 - medium'; $wb['1 - lowest'] = '1 - lowest'; -?> +$wb['inherit_policy'] = '- Inherit domain setting -'; diff --git a/interface/web/mail/lib/lang/pl_mail_alias.lng b/interface/web/mail/lib/lang/pl_mail_alias.lng index 4833383342825b8118dc8294ae04192ad3000e36..6c49433b60ce13415437836040b61fdd2d4ecce6 100644 --- a/interface/web/mail/lib/lang/pl_mail_alias.lng +++ b/interface/web/mail/lib/lang/pl_mail_alias.lng @@ -14,4 +14,3 @@ $wb['source_txt'] = 'Alias'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this alias as origin'; -?> diff --git a/interface/web/mail/lib/lang/pl_mail_forward.lng b/interface/web/mail/lib/lang/pl_mail_forward.lng index ce79e1093894a8698e8d4dd9b3f3e63fa9ef1121..2c9c32adf722914535b7fb7135809b122ae55a60 100644 --- a/interface/web/mail/lib/lang/pl_mail_forward.lng +++ b/interface/web/mail/lib/lang/pl_mail_forward.lng @@ -10,6 +10,6 @@ $wb['greylisting_txt'] = 'Enable greylisting'; $wb['destination_error_empty'] = 'The destination must not be empty.'; $wb['destination_error_isemail'] = 'The destination contains at least one invalid email address.'; $wb['email_error_isemail'] = 'Please enter a valid email address.'; +$wb['email_error_unique'] = 'Duplikat adresów e-mail.'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this address as origin (if target is internal)'; -?> diff --git a/interface/web/mail/lib/lang/pl_mail_relay_domain.lng b/interface/web/mail/lib/lang/pl_mail_relay_domain.lng new file mode 100644 index 0000000000000000000000000000000000000000..dc872f9242acd57a5d5eb8b8bad63465133c819b --- /dev/null +++ b/interface/web/mail/lib/lang/pl_mail_relay_domain.lng @@ -0,0 +1,9 @@ +<?php +$wb['mail_relay_domain_title'] = 'Email relay domain'; +$wb['tab_relay_domain_title'] = 'Relay domain'; +$wb['server_id_txt'] = 'Serwer'; +$wb['active_txt'] = 'Aktywny'; +$wb['domain_txt'] = 'Domena'; +$wb['domain_error_regex'] = 'NieprawidÅ‚owa nazwa domeny.'; +$wb['domain_error_empty'] = 'Domena jest pusta.'; +$wb['domain_error_unique'] = 'This Domain already exists as a mail relay domain on this server.'; diff --git a/interface/web/mail/lib/lang/pl_mail_relay_domain_list.lng b/interface/web/mail/lib/lang/pl_mail_relay_domain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..2de57c6d2256732d3456ff0ef3e46a8152fe621c --- /dev/null +++ b/interface/web/mail/lib/lang/pl_mail_relay_domain_list.lng @@ -0,0 +1,7 @@ +<?php +$wb['list_head_txt'] = 'Relay domains'; +$wb['active_txt'] = 'Aktywne'; +$wb['server_id_txt'] = 'Serwer'; +$wb['domain_txt'] = 'Domena'; +$wb['add_new_record_txt'] = 'Add new relay domain'; +$wb['access_txt'] = 'dostÄ™p'; diff --git a/interface/web/mail/lib/lang/pl_mail_transport.lng b/interface/web/mail/lib/lang/pl_mail_transport.lng index 514fc263a5353673f867df8295eb240e16340983..672a0c64559dec55a0a163e6551a4f8d50ff310a 100644 --- a/interface/web/mail/lib/lang/pl_mail_transport.lng +++ b/interface/web/mail/lib/lang/pl_mail_transport.lng @@ -8,4 +8,4 @@ $wb['sort_order_txt'] = 'Sortuj wedÅ‚ug'; $wb['active_txt'] = 'Aktywny'; $wb['limit_mailrouting_txt'] = 'Maksymalna ilość Å›cieżek dla Twojego konta zostaÅ‚a przekroczona.'; $wb['transport_txt'] = 'Transport'; -?> +$wb['domain_error_unique'] = 'A mail transport for this Domain already exists on this server.'; diff --git a/interface/web/mail/lib/lang/pl_spamfilter_users.lng b/interface/web/mail/lib/lang/pl_spamfilter_users.lng index c46589b18d71b76431e6f947bbce3f816432c012..5173099c274b83460b08b8b4416d406f3ddda793 100644 --- a/interface/web/mail/lib/lang/pl_spamfilter_users.lng +++ b/interface/web/mail/lib/lang/pl_spamfilter_users.lng @@ -10,4 +10,4 @@ $wb['fullname_error_notempty'] = 'The name must not be empty.'; $wb['10 - highest'] = '10 - highest'; $wb['5 - medium'] = '5 - medium'; $wb['1 - lowest'] = '1 - lowest'; -?> +$wb['inherit_policy'] = '- Inherit domain setting -'; diff --git a/interface/web/mail/lib/lang/pt_mail_alias.lng b/interface/web/mail/lib/lang/pt_mail_alias.lng index 91736e3020e5cf35cc0b531357bdcafee9af050e..afb7408eab4d28e2896cf5a6324cdfbc8c512ea9 100644 --- a/interface/web/mail/lib/lang/pt_mail_alias.lng +++ b/interface/web/mail/lib/lang/pt_mail_alias.lng @@ -14,4 +14,3 @@ $wb['source_txt'] = 'Alias'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this alias as origin'; -?> diff --git a/interface/web/mail/lib/lang/pt_mail_forward.lng b/interface/web/mail/lib/lang/pt_mail_forward.lng index db67461967dd5fa9926bf34ea2dfb0a04d287ad8..3f0dc04f7c8897ddd10d0fe4dd2f91af88bc3f40 100644 --- a/interface/web/mail/lib/lang/pt_mail_forward.lng +++ b/interface/web/mail/lib/lang/pt_mail_forward.lng @@ -10,6 +10,6 @@ $wb['greylisting_txt'] = 'Enable greylisting'; $wb['destination_error_empty'] = 'The destination must not be empty.'; $wb['destination_error_isemail'] = 'The destination contains at least one invalid email address.'; $wb['email_error_isemail'] = 'Please enter a valid email address.'; +$wb['email_error_unique'] = 'Endereço de correio duplicado.'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this address as origin (if target is internal)'; -?> diff --git a/interface/web/mail/lib/lang/pt_mail_relay_domain.lng b/interface/web/mail/lib/lang/pt_mail_relay_domain.lng new file mode 100644 index 0000000000000000000000000000000000000000..a775995cde1f972e2487952c91cc92ca883dfce6 --- /dev/null +++ b/interface/web/mail/lib/lang/pt_mail_relay_domain.lng @@ -0,0 +1,9 @@ +<?php +$wb['mail_relay_domain_title'] = 'Email relay domain'; +$wb['tab_relay_domain_title'] = 'Relay domain'; +$wb['server_id_txt'] = 'Servidor'; +$wb['active_txt'] = 'Activo'; +$wb['domain_txt'] = 'DomÃnio'; +$wb['domain_error_regex'] = 'Invalid domain name.'; +$wb['domain_error_empty'] = 'Domain is empty.'; +$wb['domain_error_unique'] = 'This Domain already exists as a mail relay domain on this server.'; diff --git a/interface/web/mail/lib/lang/pt_mail_relay_domain_list.lng b/interface/web/mail/lib/lang/pt_mail_relay_domain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..50b5422a17c4bd05274493c81154901223c48618 --- /dev/null +++ b/interface/web/mail/lib/lang/pt_mail_relay_domain_list.lng @@ -0,0 +1,7 @@ +<?php +$wb['list_head_txt'] = 'Relay domains'; +$wb['active_txt'] = 'Activo'; +$wb['server_id_txt'] = 'Servidor'; +$wb['domain_txt'] = 'DomÃnio'; +$wb['add_new_record_txt'] = 'Add new relay domain'; +$wb['access_txt'] = 'acesso'; diff --git a/interface/web/mail/lib/lang/pt_mail_transport.lng b/interface/web/mail/lib/lang/pt_mail_transport.lng index 3c676b8b4ad83f2dc0c10b57679069a44608ddfd..e41c129ac6d19d48c81a8045895e095b2a75542a 100644 --- a/interface/web/mail/lib/lang/pt_mail_transport.lng +++ b/interface/web/mail/lib/lang/pt_mail_transport.lng @@ -8,4 +8,4 @@ $wb['sort_order_txt'] = 'Ordenar por'; $wb['active_txt'] = 'Activo'; $wb['limit_mailrouting_txt'] = 'O número máximo de rotas para a conta foi atingido.'; $wb['transport_txt'] = 'Transport'; -?> +$wb['domain_error_unique'] = 'A mail transport for this Domain already exists on this server.'; diff --git a/interface/web/mail/lib/lang/pt_spamfilter_users.lng b/interface/web/mail/lib/lang/pt_spamfilter_users.lng index 0ee8d37d50dcd22c40f553b7f0c985f2dad521d4..adec31f8a1bac31963273aaa04e4291b99b35378 100644 --- a/interface/web/mail/lib/lang/pt_spamfilter_users.lng +++ b/interface/web/mail/lib/lang/pt_spamfilter_users.lng @@ -10,4 +10,4 @@ $wb['fullname_error_notempty'] = 'The name must not be empty.'; $wb['10 - highest'] = '10 - highest'; $wb['5 - medium'] = '5 - medium'; $wb['1 - lowest'] = '1 - lowest'; -?> +$wb['inherit_policy'] = '- Inherit domain setting -'; diff --git a/interface/web/mail/lib/lang/ro_mail_alias.lng b/interface/web/mail/lib/lang/ro_mail_alias.lng index d5e8e0fb0fe5ad882cd8035ea37565e9ee7474ad..389e96cb4cfcbebe5e23e381b6d0003c9b7a9a6a 100644 --- a/interface/web/mail/lib/lang/ro_mail_alias.lng +++ b/interface/web/mail/lib/lang/ro_mail_alias.lng @@ -3,9 +3,9 @@ $wb['email_txt'] = 'Email'; $wb['destination_txt'] = 'Destinatie'; $wb['active_txt'] = 'Active'; $wb['email_error_isemail'] = 'Adresa Email invlida'; -$wb['email_error_unique'] = 'Duplicat Emailaddress.'; +$wb['email_error_unique'] = 'Duplicat Email Address.'; $wb['no_domain_perm'] = 'NU aveti permisiunea pe acest Domain'; -$wb['destination_error_isemail'] = 'Destinatie Emailaddress invalida.'; +$wb['destination_error_isemail'] = 'Destinatie Email Address invalida.'; $wb['limit_mailalias_txt'] = 'Ati atins numarul maxim de alias-uri pentru contul dumneavoastra '; $wb['duplicate_mailbox_txt'] = 'There is already a mailbox with this email address'; $wb['domain_txt'] = 'Domain'; @@ -14,4 +14,3 @@ $wb['source_txt'] = 'Alias'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this alias as origin'; -?> diff --git a/interface/web/mail/lib/lang/ro_mail_forward.lng b/interface/web/mail/lib/lang/ro_mail_forward.lng index 5e00bf05271f58029e2676aad9430019bede7592..8d60b16de93d718262e732f8bf0d60e2769f6d77 100644 --- a/interface/web/mail/lib/lang/ro_mail_forward.lng +++ b/interface/web/mail/lib/lang/ro_mail_forward.lng @@ -10,6 +10,6 @@ $wb['greylisting_txt'] = 'Enable greylisting'; $wb['destination_error_empty'] = 'The destination must not be empty.'; $wb['destination_error_isemail'] = 'The destination contains at least one invalid email address.'; $wb['email_error_isemail'] = 'Please enter a valid email address.'; +$wb['email_error_unique'] = 'Duplicat Email Address.'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this address as origin (if target is internal)'; -?> diff --git a/interface/web/mail/lib/lang/ro_mail_relay_domain.lng b/interface/web/mail/lib/lang/ro_mail_relay_domain.lng new file mode 100644 index 0000000000000000000000000000000000000000..e5296a9a9bba1dea5a068c7cef8187e5d4e51a4f --- /dev/null +++ b/interface/web/mail/lib/lang/ro_mail_relay_domain.lng @@ -0,0 +1,9 @@ +<?php +$wb['mail_relay_domain_title'] = 'Email relay domain'; +$wb['tab_relay_domain_title'] = 'Relay domain'; +$wb['server_id_txt'] = 'Server'; +$wb['active_txt'] = 'Active'; +$wb['domain_txt'] = 'Domain'; +$wb['domain_error_regex'] = 'Invalid domain name.'; +$wb['domain_error_empty'] = 'Domain is empty.'; +$wb['domain_error_unique'] = 'This Domain already exists as a mail relay domain on this server.'; diff --git a/interface/web/mail/lib/lang/ro_mail_relay_domain_list.lng b/interface/web/mail/lib/lang/ro_mail_relay_domain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..e33b3bde4b1d93aca533bc9d806d4fe34e08dded --- /dev/null +++ b/interface/web/mail/lib/lang/ro_mail_relay_domain_list.lng @@ -0,0 +1,7 @@ +<?php +$wb['list_head_txt'] = 'Relay domains'; +$wb['active_txt'] = 'Active'; +$wb['server_id_txt'] = 'Server'; +$wb['domain_txt'] = 'Domain'; +$wb['add_new_record_txt'] = 'Add new relay domain'; +$wb['access_txt'] = 'access'; diff --git a/interface/web/mail/lib/lang/ro_mail_transport.lng b/interface/web/mail/lib/lang/ro_mail_transport.lng index 85fd99ad54788c2b526d4ed171390b823cee3045..736452a6c9dfcecaa6c462b6b49aa67f376783e2 100644 --- a/interface/web/mail/lib/lang/ro_mail_transport.lng +++ b/interface/web/mail/lib/lang/ro_mail_transport.lng @@ -8,4 +8,4 @@ $wb['sort_order_txt'] = 'Sortare pe '; $wb['active_txt'] = 'Active'; $wb['limit_mailrouting_txt'] = 'numarul maxim de rute pentru contul dumneavoastra a fost atins'; $wb['transport_txt'] = 'Transport'; -?> +$wb['domain_error_unique'] = 'A mail transport for this Domain already exists on this server.'; diff --git a/interface/web/mail/lib/lang/ro_spamfilter_users.lng b/interface/web/mail/lib/lang/ro_spamfilter_users.lng index c51b0b8182ce1a943fd625812cd1bf09dc847a37..bdc418c92c9a1627a678a4cb1ae50dbdc2a504f2 100644 --- a/interface/web/mail/lib/lang/ro_spamfilter_users.lng +++ b/interface/web/mail/lib/lang/ro_spamfilter_users.lng @@ -10,4 +10,4 @@ $wb['fullname_error_notempty'] = 'The name must not be empty.'; $wb['10 - highest'] = '10 - highest'; $wb['5 - medium'] = '5 - medium'; $wb['1 - lowest'] = '1 - lowest'; -?> +$wb['inherit_policy'] = '- Inherit domain setting -'; diff --git a/interface/web/mail/lib/lang/ru_mail_alias.lng b/interface/web/mail/lib/lang/ru_mail_alias.lng index e093ad9986f792b3d587652d784f2848abddd957..fd15ffbc91f97dbab7ab3df85566ee6972eefc83 100644 --- a/interface/web/mail/lib/lang/ru_mail_alias.lng +++ b/interface/web/mail/lib/lang/ru_mail_alias.lng @@ -14,4 +14,3 @@ $wb['source_txt'] = 'ÐлиаÑ'; $wb['greylisting_txt'] = 'Включить Ñерый ÑпиÑок (Greylisting)'; $wb['send_as_txt'] = 'Отправить как'; $wb['send_as_exp'] = 'Allow target to send mail using this alias as origin'; -?> diff --git a/interface/web/mail/lib/lang/ru_mail_forward.lng b/interface/web/mail/lib/lang/ru_mail_forward.lng index 6eb11f4f9130677a55bfc428eba2863e143b17b8..0be6608b806bf2f2a3cb6875a8291d0c8ea00c8e 100644 --- a/interface/web/mail/lib/lang/ru_mail_forward.lng +++ b/interface/web/mail/lib/lang/ru_mail_forward.lng @@ -10,6 +10,6 @@ $wb['greylisting_txt'] = 'Включить Ñерый ÑпиÑок (Greylisting) $wb['destination_error_empty'] = 'The destination must not be empty.'; $wb['destination_error_isemail'] = 'The destination contains at least one invalid email address.'; $wb['email_error_isemail'] = 'Ðекорректный почтовый адреÑ.'; +$wb['email_error_unique'] = 'Ð¢Ð°ÐºÐ°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ уже еÑть.'; $wb['send_as_txt'] = 'Отправить как'; $wb['send_as_exp'] = 'Allow target to send mail using this address as origin (if target is internal)'; -?> diff --git a/interface/web/mail/lib/lang/ru_mail_relay_domain.lng b/interface/web/mail/lib/lang/ru_mail_relay_domain.lng new file mode 100644 index 0000000000000000000000000000000000000000..a80c439da8c5aaee5d26fd174da9879c48d3384d --- /dev/null +++ b/interface/web/mail/lib/lang/ru_mail_relay_domain.lng @@ -0,0 +1,9 @@ +<?php +$wb['mail_relay_domain_title'] = 'Email relay domain'; +$wb['tab_relay_domain_title'] = 'Relay domain'; +$wb['server_id_txt'] = 'Сервер'; +$wb['active_txt'] = 'Ðктивно'; +$wb['domain_txt'] = 'Домен'; +$wb['domain_error_regex'] = 'Ðекорректное Ð¸Ð¼Ñ Ð´Ð¾Ð¼ÐµÐ½Ð°.'; +$wb['domain_error_empty'] = 'Домен пуÑтой.'; +$wb['domain_error_unique'] = 'This Domain already exists as a mail relay domain on this server.'; diff --git a/interface/web/mail/lib/lang/ru_mail_relay_domain_list.lng b/interface/web/mail/lib/lang/ru_mail_relay_domain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..87705b7fd393ffcb99ba24510841a1b62fd5aa90 --- /dev/null +++ b/interface/web/mail/lib/lang/ru_mail_relay_domain_list.lng @@ -0,0 +1,7 @@ +<?php +$wb['list_head_txt'] = 'Relay domains'; +$wb['active_txt'] = 'Ðктивно'; +$wb['server_id_txt'] = 'Сервер'; +$wb['domain_txt'] = 'Домен'; +$wb['add_new_record_txt'] = 'Add new relay domain'; +$wb['access_txt'] = 'доÑтуп'; diff --git a/interface/web/mail/lib/lang/ru_mail_transport.lng b/interface/web/mail/lib/lang/ru_mail_transport.lng index 05594256fd9b46f1a2e01f10e5a85d2e4946da40..2c6d758d9bf0966bcf2ebc6934f76d2cf748e4b4 100644 --- a/interface/web/mail/lib/lang/ru_mail_transport.lng +++ b/interface/web/mail/lib/lang/ru_mail_transport.lng @@ -8,4 +8,4 @@ $wb['sort_order_txt'] = 'Сортировать по'; $wb['active_txt'] = 'Ðктивно'; $wb['limit_mailrouting_txt'] = 'ДоÑтигнуто макÑ. количеÑтво маршрутов Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ¹ учетной запиÑи.'; $wb['transport_txt'] = 'ТранÑпорт'; -?> +$wb['domain_error_unique'] = 'A mail transport for this Domain already exists on this server.'; diff --git a/interface/web/mail/lib/lang/ru_spamfilter_users.lng b/interface/web/mail/lib/lang/ru_spamfilter_users.lng index 8fcfff421b33e42ac4ec30ba3886c6ccb74a0968..238f3b70480914256aa37f4a0ddb98c0550a1e9d 100644 --- a/interface/web/mail/lib/lang/ru_spamfilter_users.lng +++ b/interface/web/mail/lib/lang/ru_spamfilter_users.lng @@ -10,4 +10,4 @@ $wb['fullname_error_notempty'] = 'Ð˜Ð¼Ñ Ð½Ðµ может быть пуÑтым.' $wb['10 - highest'] = '10 - Ñильный'; $wb['5 - medium'] = '5 - Ñредний'; $wb['1 - lowest'] = '1 - Ñлабый'; -?> +$wb['inherit_policy'] = '- Inherit domain setting -'; diff --git a/interface/web/mail/lib/lang/se_mail_alias.lng b/interface/web/mail/lib/lang/se_mail_alias.lng index 441e33eac2d073df97e92803f6b61b732844eaba..5011c02a1ff9489580975f2f84ad711c31109cc8 100644 --- a/interface/web/mail/lib/lang/se_mail_alias.lng +++ b/interface/web/mail/lib/lang/se_mail_alias.lng @@ -14,4 +14,3 @@ $wb['source_txt'] = 'Alias'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this alias as origin'; -?> diff --git a/interface/web/mail/lib/lang/se_mail_forward.lng b/interface/web/mail/lib/lang/se_mail_forward.lng index 7b0aa2bc163a924bb01a49550cd3ba44c36d8f49..4ac59fb99cb83f0a8cd958c163d6f2f597f7c4a2 100644 --- a/interface/web/mail/lib/lang/se_mail_forward.lng +++ b/interface/web/mail/lib/lang/se_mail_forward.lng @@ -10,6 +10,6 @@ $wb['greylisting_txt'] = 'Enable greylisting'; $wb['destination_error_empty'] = 'The destination must not be empty.'; $wb['destination_error_isemail'] = 'The destination contains at least one invalid email address.'; $wb['email_error_isemail'] = 'Please enter a valid email address.'; +$wb['email_error_unique'] = 'Epostadressen finns redan.'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this address as origin (if target is internal)'; -?> diff --git a/interface/web/mail/lib/lang/se_mail_relay_domain.lng b/interface/web/mail/lib/lang/se_mail_relay_domain.lng new file mode 100644 index 0000000000000000000000000000000000000000..d1890449c420b0557aec76ff0af7c8a5d7737064 --- /dev/null +++ b/interface/web/mail/lib/lang/se_mail_relay_domain.lng @@ -0,0 +1,9 @@ +<?php +$wb['mail_relay_domain_title'] = 'Email relay domain'; +$wb['tab_relay_domain_title'] = 'Relay domain'; +$wb['server_id_txt'] = 'Server'; +$wb['active_txt'] = 'Aktiv'; +$wb['domain_txt'] = 'Domän'; +$wb['domain_error_regex'] = 'Ogiltigt domännamn.'; +$wb['domain_error_empty'] = 'Domänfältet är tomt.'; +$wb['domain_error_unique'] = 'This Domain already exists as a mail relay domain on this server.'; diff --git a/interface/web/mail/lib/lang/se_mail_relay_domain_list.lng b/interface/web/mail/lib/lang/se_mail_relay_domain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..a3f53e633f323c2e5085235c79d99e01e9ac2cce --- /dev/null +++ b/interface/web/mail/lib/lang/se_mail_relay_domain_list.lng @@ -0,0 +1,7 @@ +<?php +$wb['list_head_txt'] = 'Relay domains'; +$wb['active_txt'] = 'Aktiv'; +$wb['server_id_txt'] = 'Server'; +$wb['domain_txt'] = 'Domän'; +$wb['add_new_record_txt'] = 'Add new relay domain'; +$wb['access_txt'] = 'Ã¥tkomst'; diff --git a/interface/web/mail/lib/lang/se_mail_transport.lng b/interface/web/mail/lib/lang/se_mail_transport.lng index 70e26b78f9802d13f596e65e1aec79252d9481ff..73ac507b475fb070545d7dde19bce9130e465a60 100644 --- a/interface/web/mail/lib/lang/se_mail_transport.lng +++ b/interface/web/mail/lib/lang/se_mail_transport.lng @@ -8,4 +8,4 @@ $wb['sort_order_txt'] = 'Sortera pÃ¥'; $wb['active_txt'] = 'Aktiv'; $wb['limit_mailrouting_txt'] = 'Det maximala antalet epostrutter för ditt konto är uppnÃ¥tt.'; $wb['transport_txt'] = 'Transport'; -?> +$wb['domain_error_unique'] = 'A mail transport for this Domain already exists on this server.'; diff --git a/interface/web/mail/lib/lang/se_spamfilter_users.lng b/interface/web/mail/lib/lang/se_spamfilter_users.lng index ba3b60e273cbac87369962e66c4b75f44f9c0d31..ca3fac06c20f3c748f8374a6f135da6d36346dd9 100644 --- a/interface/web/mail/lib/lang/se_spamfilter_users.lng +++ b/interface/web/mail/lib/lang/se_spamfilter_users.lng @@ -10,4 +10,4 @@ $wb['fullname_error_notempty'] = 'Fältet för namn kan inte vara tomt.'; $wb['10 - highest'] = '10 - högsta'; $wb['5 - medium'] = '5 - medium'; $wb['1 - lowest'] = '1 - lägsta'; -?> +$wb['inherit_policy'] = '- Inherit domain setting -'; diff --git a/interface/web/mail/lib/lang/sk_mail_alias.lng b/interface/web/mail/lib/lang/sk_mail_alias.lng index 70b6b1c2468f81149c5978231b88df7a6f27bc8b..da89509e76de80a5a00e01222a6caae2d235de00 100644 --- a/interface/web/mail/lib/lang/sk_mail_alias.lng +++ b/interface/web/mail/lib/lang/sk_mail_alias.lng @@ -14,4 +14,3 @@ $wb['source_txt'] = 'Alias'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this alias as origin'; -?> diff --git a/interface/web/mail/lib/lang/sk_mail_forward.lng b/interface/web/mail/lib/lang/sk_mail_forward.lng index 399971261aa76a5d0d3bf6c48333b66b7324c94f..77306001256da786403b0d9819cdfb9d207a64fb 100644 --- a/interface/web/mail/lib/lang/sk_mail_forward.lng +++ b/interface/web/mail/lib/lang/sk_mail_forward.lng @@ -10,6 +10,6 @@ $wb['greylisting_txt'] = 'Enable greylisting'; $wb['destination_error_empty'] = 'The destination must not be empty.'; $wb['destination_error_isemail'] = 'The destination contains at least one invalid email address.'; $wb['email_error_isemail'] = 'Please enter a valid email address.'; +$wb['email_error_unique'] = 'Duplicitná email adresa.'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this address as origin (if target is internal)'; -?> diff --git a/interface/web/mail/lib/lang/sk_mail_relay_domain.lng b/interface/web/mail/lib/lang/sk_mail_relay_domain.lng new file mode 100644 index 0000000000000000000000000000000000000000..f63a9fd66302b0d7c2613703e9dd22a1a8cca1c4 --- /dev/null +++ b/interface/web/mail/lib/lang/sk_mail_relay_domain.lng @@ -0,0 +1,9 @@ +<?php +$wb['mail_relay_domain_title'] = 'Email relay domain'; +$wb['tab_relay_domain_title'] = 'Relay domain'; +$wb['server_id_txt'] = 'Server'; +$wb['active_txt'] = 'Active'; +$wb['domain_txt'] = 'Doména'; +$wb['domain_error_regex'] = 'Invalid domain name.'; +$wb['domain_error_empty'] = 'Domain is empty.'; +$wb['domain_error_unique'] = 'This Domain already exists as a mail relay domain on this server.'; diff --git a/interface/web/mail/lib/lang/sk_mail_relay_domain_list.lng b/interface/web/mail/lib/lang/sk_mail_relay_domain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..2dbfd76db6ae199817e906c6be409394fd4a0b48 --- /dev/null +++ b/interface/web/mail/lib/lang/sk_mail_relay_domain_list.lng @@ -0,0 +1,7 @@ +<?php +$wb['list_head_txt'] = 'Relay domains'; +$wb['active_txt'] = 'Active'; +$wb['server_id_txt'] = 'Server'; +$wb['domain_txt'] = 'Doména'; +$wb['add_new_record_txt'] = 'Add new relay domain'; +$wb['access_txt'] = 'access'; diff --git a/interface/web/mail/lib/lang/sk_mail_transport.lng b/interface/web/mail/lib/lang/sk_mail_transport.lng index b27c585b0460fdd55816e3f638dc85f6e04b2d42..e35f9d77b28dcfed5e29456ff3d7d3a01736e06c 100644 --- a/interface/web/mail/lib/lang/sk_mail_transport.lng +++ b/interface/web/mail/lib/lang/sk_mail_transport.lng @@ -8,4 +8,4 @@ $wb['sort_order_txt'] = 'TriediÅ¥ podľa'; $wb['active_txt'] = 'AktÃvny'; $wb['limit_mailrouting_txt'] = 'Max. poÄet trás pre váš úÄet je dosiahnutý.'; $wb['transport_txt'] = 'Transport'; -?> +$wb['domain_error_unique'] = 'A mail transport for this Domain already exists on this server.'; diff --git a/interface/web/mail/lib/lang/sk_spamfilter_users.lng b/interface/web/mail/lib/lang/sk_spamfilter_users.lng index 89bc415672edb4dc6fd367015f0560ff3e13e0f9..dfd74a3291eca5b2766e12ab8fd08b8962bef45d 100644 --- a/interface/web/mail/lib/lang/sk_spamfilter_users.lng +++ b/interface/web/mail/lib/lang/sk_spamfilter_users.lng @@ -10,4 +10,4 @@ $wb['fullname_error_notempty'] = 'The name must not be empty.'; $wb['10 - highest'] = '10 - highest'; $wb['5 - medium'] = '5 - medium'; $wb['1 - lowest'] = '1 - lowest'; -?> +$wb['inherit_policy'] = '- Inherit domain setting -'; diff --git a/interface/web/mail/lib/lang/tr_mail_alias.lng b/interface/web/mail/lib/lang/tr_mail_alias.lng index ea440b2e63004a783c017a9c6580106493e34cd8..f049c2b270225c7be24d2389786b9a7796e42b79 100644 --- a/interface/web/mail/lib/lang/tr_mail_alias.lng +++ b/interface/web/mail/lib/lang/tr_mail_alias.lng @@ -14,4 +14,3 @@ $wb['source_txt'] = 'Takma Ad'; $wb['send_as_txt'] = 'Gönderen'; $wb['send_as_exp'] = 'Hedef bu adresi kaynak olarak göstererek e-posta gönderebilsin'; $wb['greylisting_txt'] = 'Gri Liste Kullanılsın'; -?> diff --git a/interface/web/mail/lib/lang/tr_mail_forward.lng b/interface/web/mail/lib/lang/tr_mail_forward.lng index bdcd02a8623c212d9bfe7a8045a9d8d302becdaa..03624e56b6b874b3bcc893fd4bc6f167812f27b2 100644 --- a/interface/web/mail/lib/lang/tr_mail_forward.lng +++ b/interface/web/mail/lib/lang/tr_mail_forward.lng @@ -9,7 +9,7 @@ $wb['source_txt'] = 'Kaynak E-posta'; $wb['destination_error_empty'] = 'The destination must not be empty.'; $wb['destination_error_isemail'] = 'The destination contains at least one invalid email address.'; $wb['email_error_isemail'] = 'Lütfen geçerli bir e-posta adresi yazın.'; +$wb['email_error_unique'] = 'Bu e-posta adresi zaten var'; $wb['send_as_txt'] = 'Gönderen'; $wb['send_as_exp'] = 'Hedef bu adresi kaynak olarak göstererek e-posta gönderebilsin (hedef iç kullanıcı ise)'; $wb['greylisting_txt'] = 'Gri Liste Kullanılsın'; -?> diff --git a/interface/web/mail/lib/lang/tr_mail_relay_domain.lng b/interface/web/mail/lib/lang/tr_mail_relay_domain.lng new file mode 100644 index 0000000000000000000000000000000000000000..cd4b38cf2a0db2cae791b8919d3f935657c398f4 --- /dev/null +++ b/interface/web/mail/lib/lang/tr_mail_relay_domain.lng @@ -0,0 +1,9 @@ +<?php +$wb['mail_relay_domain_title'] = 'Email relay domain'; +$wb['tab_relay_domain_title'] = 'Relay domain'; +$wb['server_id_txt'] = 'Sunucu'; +$wb['active_txt'] = 'Etkin'; +$wb['domain_txt'] = 'Etki Alanı'; +$wb['domain_error_regex'] = 'Etki alanı geçersiz.'; +$wb['domain_error_empty'] = 'Etki alanı boÅŸ olamaz.'; +$wb['domain_error_unique'] = 'This Domain already exists as a mail relay domain on this server.'; diff --git a/interface/web/mail/lib/lang/tr_mail_relay_domain_list.lng b/interface/web/mail/lib/lang/tr_mail_relay_domain_list.lng new file mode 100644 index 0000000000000000000000000000000000000000..eb93ca7e439cd5f8757bd4c873208ef5ffaaf88e --- /dev/null +++ b/interface/web/mail/lib/lang/tr_mail_relay_domain_list.lng @@ -0,0 +1,7 @@ +<?php +$wb['list_head_txt'] = 'Relay domains'; +$wb['active_txt'] = 'Etkin'; +$wb['server_id_txt'] = 'Sunucu'; +$wb['domain_txt'] = 'Etki Alanı'; +$wb['add_new_record_txt'] = 'Add new relay domain'; +$wb['access_txt'] = 'EriÅŸim'; diff --git a/interface/web/mail/lib/lang/tr_mail_transport.lng b/interface/web/mail/lib/lang/tr_mail_transport.lng index 0b417703924b126b2dcfbf5a46fd13d30861844c..bc318545a972e1c67221d6941e94bda87137dba4 100644 --- a/interface/web/mail/lib/lang/tr_mail_transport.lng +++ b/interface/web/mail/lib/lang/tr_mail_transport.lng @@ -8,4 +8,4 @@ $wb['sort_order_txt'] = 'Sıralama'; $wb['active_txt'] = 'Etkin'; $wb['limit_mailrouting_txt'] = 'Hesabınıza ekleyebileceÄŸiniz en fazla yöneltme sayısına ulaÅŸtınız.'; $wb['transport_txt'] = 'Aktarım'; -?> +$wb['domain_error_unique'] = 'A mail transport for this Domain already exists on this server.'; diff --git a/interface/web/mail/lib/lang/tr_spamfilter_users.lng b/interface/web/mail/lib/lang/tr_spamfilter_users.lng index 33ef04c610b94444dce3ce0571056630a08278d2..10144b8232ab2bd2116511e2de960160947a2684 100644 --- a/interface/web/mail/lib/lang/tr_spamfilter_users.lng +++ b/interface/web/mail/lib/lang/tr_spamfilter_users.lng @@ -10,4 +10,4 @@ $wb['fullname_error_notempty'] = 'Ad boÅŸ olamaz.'; $wb['10 - highest'] = '10 - en yüksek'; $wb['5 - medium'] = '5 - orta'; $wb['1 - lowest'] = '1 - en düşük'; -?> +$wb['inherit_policy'] = '- Inherit domain setting -'; diff --git a/interface/web/mail/lib/module.conf.php b/interface/web/mail/lib/module.conf.php index fbe8ffbcb5785e4737d676034edd5cba0d9cc13d..40a7813b6274ae141d66d74d0aa8ea57f9e9e16c 100644 --- a/interface/web/mail/lib/module.conf.php +++ b/interface/web/mail/lib/module.conf.php @@ -13,56 +13,49 @@ $module['order'] = '40'; //**** Email accounts menu $items = array(); -if($app->auth->get_client_limit($userid, 'maildomain') != 0) -{ +if($app->auth->get_client_limit($userid, 'maildomain') != 0) { $items[] = array( 'title' => 'Domain', 'target' => 'content', 'link' => 'mail/mail_domain_list.php', 'html_id' => 'mail_domain_list'); } -if($app->auth->get_client_limit($userid, 'mailaliasdomain') != 0) -{ +if($app->auth->get_client_limit($userid, 'mailaliasdomain') != 0) { $items[] = array( 'title' => 'Domain Alias', 'target' => 'content', 'link' => 'mail/mail_aliasdomain_list.php', 'html_id' => 'mail_aliasdomain_list'); } -if($app->auth->get_client_limit($userid, 'mailbox') != 0) -{ +if($app->auth->get_client_limit($userid, 'mailbox') != 0) { $items[] = array( 'title' => 'Email Mailbox', 'target' => 'content', 'link' => 'mail/mail_user_list.php', 'html_id' => 'mail_user_list'); } -if($app->auth->get_client_limit($userid, 'mailalias') != 0) -{ +if($app->auth->get_client_limit($userid, 'mailalias') != 0) { $items[] = array( 'title' => 'Email Alias', 'target' => 'content', 'link' => 'mail/mail_alias_list.php', 'html_id' => 'mail_alias_list'); } -if($app->auth->get_client_limit($userid, 'mailforward') != 0) -{ +if($app->auth->get_client_limit($userid, 'mailforward') != 0) { $items[] = array( 'title' => 'Email Forward', 'target' => 'content', 'link' => 'mail/mail_forward_list.php', 'html_id' => 'mail_forward_list'); } -if($app->auth->get_client_limit($userid, 'mailcatchall') != 0) -{ +if($app->auth->get_client_limit($userid, 'mailcatchall') != 0) { $items[] = array( 'title' => 'Email Catchall', 'target' => 'content', 'link' => 'mail/mail_domain_catchall_list.php', 'html_id' => 'mail_domain_catchall_list'); } -if(! $app->auth->is_admin()) -{ +if(! $app->auth->is_admin() && $app->auth->get_client_limit($userid, 'mail_wblist') != 0) { $items[] = array( 'title' => 'Email Whitelist', 'target' => 'content', 'link' => 'mail/mail_whitelist_list.php', @@ -73,18 +66,17 @@ if(! $app->auth->is_admin()) 'target' => 'content', 'link' => 'mail/mail_blacklist_list.php', 'html_id' => 'mail_blacklist_list'); -} -if($app->auth->get_client_limit($userid, 'mailrouting') != 0) -{ +if($app->auth->get_client_limit($userid, 'mailrouting') != 0) { $items[] = array( 'title' => 'Email Routing', 'target' => 'content', 'link' => 'mail/mail_transport_list.php', 'html_id' => 'mail_transport_list'); } -if(count($items) && $app->system->has_service($userid, 'mail')) -{ +} + +if(count($items) && $app->system->has_service($userid, 'mail')) { $module['nav'][] = array( 'title' => 'Email Accounts', 'open' => 1, 'items' => $items); @@ -93,16 +85,14 @@ if(count($items) && $app->system->has_service($userid, 'mail')) //**** Mailinglist menu $items = array(); -if($app->auth->get_client_limit($userid, 'mailmailinglist') != 0) -{ +if($app->auth->get_client_limit($userid, 'mailmailinglist') != 0) { $items[] = array( 'title' => 'Mailing List', 'target' => 'content', 'link' => 'mail/mail_mailinglist_list.php', 'html_id' => 'mail_mailinglist_list'); } -if(count($items) && $app->system->has_service($userid, 'mail')) -{ +if(count($items) && $app->system->has_service($userid, 'mail')) { $module['nav'][] = array( 'title' => 'Mailing List', 'open' => 1, 'items' => $items); @@ -111,8 +101,7 @@ if(count($items) && $app->system->has_service($userid, 'mail')) //**** Spamfilter menu $items = array(); -if($app->auth->get_client_limit($userid, 'spamfilter_wblist') != 0) -{ +if($app->auth->get_client_limit($userid, 'spamfilter_wblist') != 0) { $items[] = array( 'title' => 'Whitelist', 'target' => 'content', 'link' => 'mail/spamfilter_whitelist_list.php', @@ -124,8 +113,7 @@ if($app->auth->get_client_limit($userid, 'spamfilter_wblist') != 0) 'html_id' => 'spamfilter_blacklist_list'); } -if($app->auth->is_admin()) -{ +if($app->auth->is_admin()) { $items[] = array( 'title' => 'User / Domain', 'target' => 'content', 'link' => 'mail/spamfilter_users_list.php', @@ -141,8 +129,7 @@ if($app->auth->is_admin()) // 'link' => 'mail/spamfilter_config_list.php'); } -if(count($items)) -{ +if(count($items)) { $module['nav'][] = array( 'title' => 'Spamfilter', 'open' => 1, 'items' => $items); @@ -151,8 +138,7 @@ if(count($items)) //**** Fetchmail menu $items = array(); -if($app->auth->get_client_limit($userid, 'fetchmail') != 0) -{ +if($app->auth->get_client_limit($userid, 'fetchmail') != 0) { $items[] = array( 'title' => 'Fetchmail', 'target' => 'content', 'link' => 'mail/mail_get_list.php', @@ -167,24 +153,21 @@ if($app->auth->get_client_limit($userid, 'fetchmail') != 0) if ($app->system->has_service($userid, 'xmpp')) { $items = array(); - if($app->auth->get_client_limit($userid, 'xmpp_domain') != 0) - { + if($app->auth->get_client_limit($userid, 'xmpp_domain') != 0) { $items[] = array( 'title' => 'XMPP Domain', 'target' => 'content', 'link' => 'mail/xmpp_domain_list.php', 'html_id' => 'xmpp_domain_list'); } - if($app->auth->get_client_limit($userid, 'xmpp_user') != 0) - { + if($app->auth->get_client_limit($userid, 'xmpp_user') != 0) { $items[] = array( 'title' => 'XMPP Account', 'target' => 'content', 'link' => 'mail/xmpp_user_list.php', 'html_id' => 'xmpp_user_list'); } - if(count($items)) - { + if(count($items)) { $module['nav'][] = array( 'title' => 'Jabber / XMPP', 'open' => 1, 'items' => $items); @@ -206,8 +189,7 @@ $items[] = array( 'title' => 'Mailbox traffic', 'link' => 'mail/mail_user_stats.php', 'html_id' => 'mail_user_stats'); -if($app->auth->get_client_limit($userid, 'backup') == 'y') -{ +if($app->auth->get_client_limit($userid, 'mail_backup') != 'n') { $items[] = array ( 'title' => 'Backup Stats', 'target' => 'content', @@ -222,8 +204,7 @@ $module['nav'][] = array( 'title' => 'Statistics', //**** Global filters menu $items = array(); -if($app->auth->is_admin()) -{ +if($app->auth->is_admin()) { $items[] = array( 'title' => 'Postfix Whitelist', 'target' => 'content', 'link' => 'mail/mail_whitelist_list.php', @@ -242,14 +223,25 @@ if($app->auth->is_admin()) 'html_id' => 'mail_content_filter_list'); + $items[] = array( 'title' => 'Email Routing', + 'target' => 'content', + 'link' => 'mail/mail_transport_list.php', + 'html_id' => 'mail_transport_list'); + + + $items[] = array( 'title' => 'Relay Domains', + 'target' => 'content', + 'link' => 'mail/mail_relay_domain_list.php', + 'html_id' => 'mail_relay_domain_list'); + + $items[] = array( 'title' => 'Relay Recipients', 'target' => 'content', 'link' => 'mail/mail_relay_recipient_list.php', 'html_id' => 'mail_relay_recipient_list'); - $module['nav'][] = array( 'title' => 'Global Filters', + $module['nav'][] = array( 'title' => 'Server Settings', 'open' => 1, 'items' => $items); } -?> diff --git a/interface/web/mail/list/mail_relay_domain.list.php b/interface/web/mail/list/mail_relay_domain.list.php new file mode 100644 index 0000000000000000000000000000000000000000..a6ff7834824de4c4e703bc876b48971e3ea2afa1 --- /dev/null +++ b/interface/web/mail/list/mail_relay_domain.list.php @@ -0,0 +1,111 @@ +<?php + +/* +Copyright (c) 2021, Jesse Norell <jesse@kci.net> +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of ISPConfig nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +// Name of the list +$liste["name"] = "mail_relay_domain"; + +// Database table +$liste["table"] = "mail_relay_domain"; + +// Index index field of the database table +$liste["table_idx"] = "relay_domain_id"; + +// Search Field Prefix +$liste["search_prefix"] = "search_"; + +// Records per page +$liste["records_per_page"] = "15"; + +// Script File of the list +$liste["file"] = "mail_relay_domain_list.php"; + +// Script file of the edit form +$liste["edit_file"] = "mail_relay_domain_edit.php"; + +// Script File of the delete script +$liste["delete_file"] = "mail_relay_domain_del.php"; + +// Paging Template +$liste["paging_tpl"] = "templates/paging.tpl.htm"; + +// Enable auth +$liste["auth"] = "yes"; + + +/***************************************************** + * Search fields + *****************************************************/ + +/* + Datatypes: + - INTEGER + - DOUBLE + - CURRENCY + - VARCHAR + - TEXT + - DATE +*/ + + +$liste["item"][] = array( 'field' => "active", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('y' => $app->lng('yes_txt'), 'n' => $app->lng('no_txt'))); + + +$liste["item"][] = array( 'field' => "server_id", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE {AUTHSQL} AND mirror_server_id = 0 ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'width' => "", + 'value' => ""); + + +$liste["item"][] = array( 'field' => "domain", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + diff --git a/interface/web/mail/mail_domain_del.php b/interface/web/mail/mail_domain_del.php index bce89695dc53ee1e016aec966a2d5030014b2db9..e4c26399ef110cb0079f6162c0e5ba58f6ce6af4 100644 --- a/interface/web/mail/mail_domain_del.php +++ b/interface/web/mail/mail_domain_del.php @@ -80,6 +80,10 @@ class page_action extends tform_actions { // Delete all spamfilters that belong to this domain $records = $app->db->queryAllRecords("SELECT id FROM spamfilter_users WHERE email like ?", '%@' . $domain); foreach($records as $rec) { + $wblists = $app->db->queryAllRecords("SELECT wblist_id FROM spamfilter_wblist WHERE rid = ?", $rec['id']); + foreach($wblists as $wblist) { + $app->db->datalogDelete('spamfilter_wblist', 'wblist_id', $wblist['wblist_id']); + } $app->db->datalogDelete('spamfilter_users', 'id', $rec['id']); } diff --git a/interface/web/mail/mail_domain_edit.php b/interface/web/mail/mail_domain_edit.php index 67a724dbaf04b1f9536aa4196b4617928a138311..f17f74e012f664dec4289db576905fc4921ed6b0 100644 --- a/interface/web/mail/mail_domain_edit.php +++ b/interface/web/mail/mail_domain_edit.php @@ -190,19 +190,19 @@ class page_action extends tform_actions { $app->tpl->setVar("domain_module", 0); } - // Get the spamfilter policys for the user + // Get the spamfilter policies for the user $tmp_user = $app->db->queryOneRecord("SELECT policy_id FROM spamfilter_users WHERE email = ?", '@' . $this->dataRecord["domain"]); $sql = "SELECT id, policy_name FROM spamfilter_policy WHERE ".$app->tform->getAuthSQL('r')." ORDER BY policy_name"; - $policys = $app->db->queryAllRecords($sql); - $policy_select = "<option value='0'>".$app->tform->wordbook["no_policy"]."</option>"; - if(is_array($policys)) { - foreach( $policys as $p) { + $policies = $app->db->queryAllRecords($sql); + $policy_select = "<option value='0'".(($tmp_user['policy_id'] == 0) ? " SELECTED>":">").$app->tform->wordbook["no_policy"]."</option>"; + if(is_array($policies)) { + foreach( $policies as $p) { $selected = ($p["id"] == $tmp_user["policy_id"])?'SELECTED':''; $policy_select .= "<option value='$p[id]' $selected>" . $app->functions->htmlentities($p['policy_name']) . "</option>\r\n"; } } $app->tpl->setVar("policy", $policy_select); - unset($policys); + unset($policies); unset($policy_select); unset($tmp_user); @@ -257,7 +257,7 @@ class page_action extends tform_actions { if (!empty($rec['dkim_public'])) $app->tpl->setVar('dns_record', $dns_record, true); parent::onShowEnd(); - } + } function onSubmit() { global $app, $conf; @@ -334,30 +334,30 @@ class page_action extends tform_actions { // Spamfilter policy $policy_id = $app->functions->intval($this->dataRecord["policy"]); - if($policy_id > 0) { - $tmp_user = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = ?", '@' . $domain); - if($tmp_user["id"] > 0) { - // There is already a record that we will update + $tmp_user = $app->db->queryOneRecord("SELECT id, policy_id FROM spamfilter_users WHERE email = ?", '@' . $domain); + if($tmp_user["id"] > 0) { + // There is already a record that we will update + if($policy_id != $tmp_user['policy_id']) { $app->db->datalogUpdate('spamfilter_users', array("policy_id" => $policy_id), 'id', $tmp_user["id"]); - } else { - $tmp_domain = $app->db->queryOneRecord("SELECT sys_groupid FROM mail_domain WHERE domain_id = ?", $this->id); - // We create a new record - $insert_data = array( - "sys_userid" => $_SESSION["s"]["user"]["userid"], - "sys_groupid" => $tmp_domain["sys_groupid"], - "sys_perm_user" => 'riud', - "sys_perm_group" => 'riud', - "sys_perm_other" => '', - "server_id" => $this->dataRecord["server_id"], - "priority" => 5, - "policy_id" => $policy_id, - "email" => '@' . $domain, - "fullname" => '@' . $domain, - "local" => 'Y' - ); - $app->db->datalogInsert('spamfilter_users', $insert_data, 'id'); - unset($tmp_domain); } + } else { + $tmp_domain = $app->db->queryOneRecord("SELECT sys_groupid FROM mail_domain WHERE domain_id = ?", $this->id); + // We create a new record + $insert_data = array( + "sys_userid" => $_SESSION["s"]["user"]["userid"], + "sys_groupid" => $tmp_domain["sys_groupid"], + "sys_perm_user" => 'riud', + "sys_perm_group" => 'riud', + "sys_perm_other" => '', + "server_id" => $this->dataRecord["server_id"], + "priority" => 5, + "policy_id" => $policy_id, + "email" => '@' . $domain, + "fullname" => '@' . $domain, + "local" => 'Y' + ); + $app->db->datalogInsert('spamfilter_users', $insert_data, 'id'); + unset($tmp_domain); } // endif spamfilter policy //* create dns-record with dkim-values if the zone exists @@ -405,46 +405,74 @@ class page_action extends tform_actions { global $app, $conf; $domain = $app->functions->idn_encode($this->dataRecord["domain"]); + $old_domain = $app->functions->idn_encode($this->oldDataRecord["domain"]); // Spamfilter policy $policy_id = $app->functions->intval($this->dataRecord["policy"]); - $tmp_user = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = ?", '@' . $domain); - if($policy_id > 0) { - if($tmp_user["id"] > 0) { - // There is already a record that we will update + + // If domain changes, update spamfilter_users + // and fire spamfilter_wblist_update events so rspamd files are rewritten + $skip_spamfilter_users_update = false; + if($old_domain != $domain) { + $tmp_old = $app->db->queryOneRecord("SELECT id,fullname FROM spamfilter_users WHERE email = ?", '@' . $old_domain); + if($tmp_old['id'] > 0) { + $tmp_new = $app->db->queryOneRecord("SELECT id,fullname FROM spamfilter_users WHERE email = ?", '@' . $domain); + if($tmp_new['id'] > 0) { + // There is a spamfilter_users for both old and new domain, we'll update old wblist entries + $tmp_wblist = $app->db->queryAllRecords("SELECT wblist_id FROM spamfilter_wblist WHERE rid = ?", $tmp_old['id']); + foreach ($tmp_wblist as $tmp) { + $app->db->datalogUpdate('spamfilter_wblist', array('rid' => $tmp_new['id']), 'wblist_id', $tmp['wblist_id']); + } + + // now delete old spamfilter_users entry + $app->db->datalogDelete('spamfilter_users', 'id', $tmp_old['id']); + } else { + $update_data = array( + 'email' => '@' . $domain, + 'policy_id' => $policy_id, + ); + if($tmp_old['fullname'] == '@' . $old_domain) { + $update_data['fullname'] = '@' . $domain; + } + $app->db->datalogUpdate('spamfilter_users', $update_data, 'id', $tmp_old['id']); + $skip_spamfilter_users_update = true; + } + } + } + + $tmp_user = $app->db->queryOneRecord("SELECT id, policy_id FROM spamfilter_users WHERE email = ?", '@' . $domain); + if($tmp_user["id"] > 0) { + // There is already a record that we will update + if((! $skip_spamfilter_users_update) && ($policy_id != $tmp_user['policy_id'])) { $app->db->datalogUpdate('spamfilter_users', array("policy_id" => $policy_id), 'id', $tmp_user["id"]); - } else { - $tmp_domain = $app->db->queryOneRecord("SELECT sys_groupid FROM mail_domain WHERE domain_id = ?", $this->id); - // We create a new record - $insert_data = array( - "sys_userid" => $_SESSION["s"]["user"]["userid"], - "sys_groupid" => $tmp_domain["sys_groupid"], - "sys_perm_user" => 'riud', - "sys_perm_group" => 'riud', - "sys_perm_other" => '', - "server_id" => $this->dataRecord["server_id"], - "priority" => 5, - "policy_id" => $policy_id, - "email" => '@' . $domain, - "fullname" => '@' . $domain, - "local" => 'Y' - ); - $app->db->datalogInsert('spamfilter_users', $insert_data, 'id'); - unset($tmp_domain); } } else { - if($tmp_user["id"] > 0) { - // There is already a record but the user shall have no policy, so we delete it - $app->db->datalogDelete('spamfilter_users', 'id', $tmp_user["id"]); - } + $tmp_domain = $app->db->queryOneRecord("SELECT sys_groupid FROM mail_domain WHERE domain_id = ?", $this->id); + // We create a new record + $insert_data = array( + "sys_userid" => $_SESSION["s"]["user"]["userid"], + "sys_groupid" => $tmp_domain["sys_groupid"], + "sys_perm_user" => 'riud', + "sys_perm_group" => 'riud', + "sys_perm_other" => '', + "server_id" => $this->dataRecord["server_id"], + "priority" => 5, + "policy_id" => $policy_id, + "email" => '@' . $domain, + "fullname" => '@' . $domain, + "local" => 'Y' + ); + $app->db->datalogInsert('spamfilter_users', $insert_data, 'id'); + unset($tmp_domain); } // endif spamfilter policy + //** If the domain name or owner has been changed, change the domain and owner in all mailbox records - if($this->oldDataRecord['domain'] != $domain || (isset($this->dataRecord['client_group_id']) && $this->oldDataRecord['sys_groupid'] != $this->dataRecord['client_group_id'])) { + if($old_domain != $domain || (isset($this->dataRecord['client_group_id']) && $this->oldDataRecord['sys_groupid'] != $this->dataRecord['client_group_id'])) { $app->uses('getconf'); $mail_config = $app->getconf->get_server_config($this->dataRecord["server_id"], 'mail'); //* Update the mailboxes - $mailusers = $app->db->queryAllRecords("SELECT * FROM mail_user WHERE email like ?", '%@' . $this->oldDataRecord['domain']); + $mailusers = $app->db->queryAllRecords("SELECT * FROM mail_user WHERE email like ?", '%@' . $old_domain); $sys_groupid = $app->functions->intval((isset($this->dataRecord['client_group_id']))?$this->dataRecord['client_group_id']:$this->oldDataRecord['sys_groupid']); $tmp = $app->db->queryOneRecord("SELECT userid FROM sys_user WHERE default_group = ?", $sys_groupid); $client_user_id = $app->functions->intval(($tmp['userid'] > 0)?$tmp['userid']:1); @@ -455,37 +483,194 @@ class page_action extends tform_actions { $maildir = str_replace("[domain]", $domain, $mail_config["maildir_path"]); $maildir = str_replace("[localpart]", $mail_parts[0], $maildir); $email = $mail_parts[0].'@'.$this->dataRecord['domain']; - $app->db->datalogUpdate('mail_user', array("maildir" => $maildir, "email" => $email, "sys_userid" => $client_user_id, "sys_groupid" => $sys_groupid), 'mailuser_id', $rec['mailuser_id']); + // update spamfilter_users and spamfilter_wblist if email change + $skip_spamfilter_users_update = false; + if($email != $rec['email']) { + $tmp_olduser = $app->db->queryOneRecord("SELECT id,fullname FROM spamfilter_users WHERE email = ?", $rec['email']); + if($tmp_olduser['id'] > 0) { + $tmp_newuser = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = ?", $email); + if($tmp_newuser['id'] > 0) { + // There is a spamfilter_users for both old and new email, we'll update old wblist entries + $tmp_wblist = $app->db->queryAllRecords("SELECT wblist_id FROM spamfilter_wblist WHERE rid = ?", $tmp_olduser['id']); + foreach ($tmp_wblist as $tmp) { + $update_data = array( + 'rid' => $tmp_newuser['id'], + 'sys_userid' => $client_user_id, + 'sys_groupid' => $sys_groupid, + ); + $app->db->datalogUpdate('spamfilter_wblist', $update_data, 'wblist_id', $tmp['wblist_id']); + } + + // now delete old spamfilter_users entry + $app->db->datalogDelete('spamfilter_users', 'id', $tmp_olduser['id']); + } else { + $update_data = array( + 'email' => $mail_parts[0].'@'.$this->dataRecord['domain'], + 'sys_userid' => $client_user_id, + 'sys_groupid' => $sys_groupid, + ); + if($tmp_olduser['fullname'] == $app->functions->idn_decode($rec['email'])) { + $update_data['fullname'] = $app->functions->idn_decode($email); + } + $app->db->datalogUpdate('spamfilter_users', $update_data, 'id', $tmp_olduser['id']); + $skip_spamfilter_users_update = true; + + $tmp_wblist = $app->db->queryAllRecords("SELECT wblist_id FROM spamfilter_wblist WHERE rid = ?", $tmp_olduser['id']); + $update_data = array( + 'sys_userid' => $client_user_id, + 'sys_groupid' => $sys_groupid, + ); + foreach ($tmp_wblist as $tmp) { + $app->db->datalogUpdate('spamfilter_wblist', $update_data, 'wblist_id', $tmp['wblist_id']); + } + } + } + + $tmp_user = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = ?", $email); + if($tmp_user["id"] > 0) { + // There is already a record that we will update + if(!$skip_spamfilter_users_update) { + $update_data = array( + 'sys_userid' => $client_user_id, + 'sys_groupid' => $sys_groupid, + ); + $app->db->datalogUpdate('spamfilter_users', $update_data, 'id', $tmp_user['id']); + } + } else { + // We create a new record + $insert_data = array( + "sys_userid" => $client_user_id, + "sys_groupid" => $sys_groupid, + "sys_perm_user" => 'riud', + "sys_perm_group" => 'riud', + "sys_perm_other" => '', + "server_id" => $this->dataRecord["server_id"], + "priority" => 5, + "policy_id" => 0, + "email" => $email, + "fullname" => $app->functions->idn_decode($email), + "local" => 'Y' + ); + $app->db->datalogInsert('spamfilter_users', $insert_data, 'id'); + } + + $app->db->datalogUpdate('mail_user', array("maildir" => $maildir, "email" => $email, "sys_userid" => $client_user_id, "sys_groupid" => $sys_groupid), 'mailuser_id', $rec['mailuser_id']); + } } } //* Update the aliases - $forwardings = $app->db->queryAllRecords("SELECT * FROM mail_forwarding WHERE source like ? OR destination like ?", '%@' . $this->oldDataRecord['domain'], '%@' . $this->oldDataRecord['domain']); + $forwardings = $app->db->queryAllRecords("SELECT * FROM mail_forwarding WHERE source like ? OR destination like ?", '%@' . $old_domain, '%@' . $old_domain); if(is_array($forwardings)) { foreach($forwardings as $rec) { - $destination = str_replace($this->oldDataRecord['domain'], $domain, $rec['destination']); - $source = str_replace($this->oldDataRecord['domain'], $domain, $rec['source']); + $destination = str_replace($old_domain, $domain, $rec['destination']); + $source = str_replace($old_domain, $domain, $rec['source']); + + // update spamfilter_users and spamfilter_wblist if source email changes + $skip_spamfilter_users_update = false; + if(strpos($rec['source'],'@'.$old_domain) && $source != $rec['source']) { + $tmp_olduser = $app->db->queryOneRecord("SELECT id,fullname FROM spamfilter_users WHERE email = ?", $rec['source']); + if($tmp_olduser['id'] > 0) { + $tmp_newuser = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = ?", $source); + if($tmp_newuser['id'] > 0) { + // There is a spamfilter_users for both old and new email, we'll update old wblist entries + $tmp_wblist = $app->db->queryAllRecords("SELECT wblist_id FROM spamfilter_wblist WHERE rid = ?", $tmp_olduser['id']); + foreach ($tmp_wblist as $tmp) { + $update_data = array( + 'rid' => $tmp_newuser['id'], + 'sys_userid' => $client_user_id, + 'sys_groupid' => $sys_groupid, + ); + $app->db->datalogUpdate('spamfilter_wblist', $update_data, 'wblist_id', $tmp['wblist_id']); + } + + // now delete old spamfilter_users entry + $app->db->datalogDelete('spamfilter_users', 'id', $tmp_olduser['id']); + } else { + $update_data = array( + 'email' => $source, + 'sys_userid' => $client_user_id, + 'sys_groupid' => $sys_groupid, + ); + if($tmp_olduser['fullname'] == $app->functions->idn_decode($rec['source'])) { + $update_data['fullname'] = $app->functions->idn_decode($source); + } + $app->db->datalogUpdate('spamfilter_users', $update_data, 'id', $tmp_olduser['id']); + $skip_spamfilter_users_update = true; + + $tmp_wblist = $app->db->queryAllRecords("SELECT wblist_id FROM spamfilter_wblist WHERE rid = ?", $tmp_olduser['id']); + $update_data = array( + 'sys_userid' => $client_user_id, + 'sys_groupid' => $sys_groupid, + ); + foreach ($tmp_wblist as $tmp) { + $app->db->datalogUpdate('spamfilter_wblist', $update_data, 'wblist_id', $tmp['wblist_id']); + } + } + } + + + $tmp_user = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = ?", $source); + if($tmp_user["id"] > 0) { + // There is already a record that we will update + if(!$skip_spamfilter_users_update) { + $update_data = array( + 'sys_userid' => $client_user_id, + 'sys_groupid' => $sys_groupid, + ); + $app->db->datalogUpdate('spamfilter_users', $update_data, 'id', $tmp_user['id']); + } + /* + * should we insert spamfilter_users with policy_id = 0 for mail_forwardings? + * I think no (see https://git.ispconfig.org/ispconfig/ispconfig3/-/issues/6201) + * + } else { + // We create a new record + $insert_data = array( + "sys_userid" => $client_user_id, + "sys_groupid" => $sys_groupid, + "sys_perm_user" => 'riud', + "sys_perm_group" => 'riud', + "sys_perm_other" => '', + "server_id" => $this->dataRecord["server_id"], + "priority" => 5, + "policy_id" => 0, + "email" => $source, + "fullname" => $app->functions->idn_decode($source), + "local" => 'Y' + ); + $app->db->datalogInsert('spamfilter_users', $insert_data, 'id'); + */ + } + + } + $app->db->datalogUpdate('mail_forwarding', array("source" => $source, "destination" => $destination, "sys_userid" => $client_user_id, "sys_groupid" => $sys_groupid), 'forwarding_id', $rec['forwarding_id']); } } //* Update the mailinglist - $app->db->query("UPDATE mail_mailinglist SET sys_userid = ?, sys_groupid = ? WHERE domain = ?", $client_user_id, $sys_groupid, $this->oldDataRecord['domain']); + $mailinglists = $app->db->queryAllRecords("SELECT * FROM mail_mailinglist WHERE domain = ?", $old_domain); + if(is_array($mailinglists)) { + foreach($mailinglists as $rec) { + $update_data = array( + 'sys_userid' => $client_user_id, + 'sys_groupid' => $sys_groupid, + 'domain' => $domain, + 'email' => str_replace($old_domain, $domain, $rec['email']), + ); + $app->db->datalogUpdate('mail_mailinglist', $update_data, 'mailinglist_id', $rec['mailinglist_id']); + } + } //* Update fetchmail accounts - $fetchmail = $app->db->queryAllRecords("SELECT * FROM mail_get WHERE destination like ?", '%@' . $this->oldDataRecord['domain']); + $fetchmail = $app->db->queryAllRecords("SELECT * FROM mail_get WHERE destination like ?", '%@' . $old_domain); if(is_array($fetchmail)) { foreach($fetchmail as $rec) { - $destination = str_replace($this->oldDataRecord['domain'], $domain, $rec['destination']); + $destination = str_replace($old_domain, $domain, $rec['destination']); $app->db->datalogUpdate('mail_get', array("destination" => $destination, "sys_userid" => $client_user_id, "sys_groupid" => $sys_groupid), 'mailget_id', $rec['mailget_id']); } } - - //* Delete the old spamfilter record - $tmp = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = ?", '@' . $this->oldDataRecord["domain"]); - $app->db->datalogDelete('spamfilter_users', 'id', $tmp["id"]); - unset($tmp); - } // end if domain name changed //* update dns-record when the dkim record was changed @@ -559,4 +744,3 @@ class page_action extends tform_actions { $page = new page_action; $page->onLoad(); -?> diff --git a/interface/web/mail/mail_relay_domain_del.php b/interface/web/mail/mail_relay_domain_del.php new file mode 100644 index 0000000000000000000000000000000000000000..2981d1518d2a62287fed9aa3e68fc169b48e95b0 --- /dev/null +++ b/interface/web/mail/mail_relay_domain_del.php @@ -0,0 +1,50 @@ +<?php + +/* +Copyright (c) 2021, Jesse Norell <jesse@kci.net> +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of ISPConfig nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/****************************************** +* Begin Form configuration +******************************************/ + +$list_def_file = "list/mail_relay_domain.list.php"; +$tform_def_file = "form/mail_relay_domain.tform.php"; + +/****************************************** +* End Form configuration +******************************************/ + +require_once '../../lib/config.inc.php'; +require_once '../../lib/app.inc.php'; + +//* Check permissions for module +$app->auth->check_module_permissions('mail'); + +$app->uses("tform_actions"); +$app->tform_actions->onDelete(); + diff --git a/interface/web/mail/mail_relay_domain_edit.php b/interface/web/mail/mail_relay_domain_edit.php new file mode 100644 index 0000000000000000000000000000000000000000..131b6fe06af73f19a00eed5bc9e2f43b3352683e --- /dev/null +++ b/interface/web/mail/mail_relay_domain_edit.php @@ -0,0 +1,78 @@ +<?php + +/* +Copyright (c) 2021, Jesse Norell <jesse@kci.net> +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of ISPConfig nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +/****************************************** +* Begin Form configuration +******************************************/ + +$tform_def_file = "form/mail_relay_domain.tform.php"; + +/****************************************** +* End Form configuration +******************************************/ + +require_once '../../lib/config.inc.php'; +require_once '../../lib/app.inc.php'; + +//* Check permissions for module +$app->auth->check_module_permissions('mail'); + +//* Only administrators allowed +if(! $app->auth->is_admin()) { die( $app->lng("non_admin_error") ); } + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onSubmit() { + global $app, $conf; + + //* make sure that the email domain is lowercase + if(isset($this->dataRecord["domain"])){ + $this->dataRecord["domain"] = $app->functions->idn_encode($this->dataRecord["domain"]); + $this->dataRecord["domain"] = strtolower($this->dataRecord["domain"]); + } + + //* server_id must be > 0 + if(isset($this->dataRecord["server_id"]) && $this->dataRecord["server_id"] < 1) { + $app->tform->errorMessage .= $app->lng("server_id_0_error_txt"); + } + + parent::onSubmit(); + } + +} + +$app->tform_actions = new page_action; +$app->tform_actions->onLoad(); + diff --git a/interface/web/mail/mail_relay_domain_list.php b/interface/web/mail/mail_relay_domain_list.php new file mode 100644 index 0000000000000000000000000000000000000000..56812b75805b5875695b703744d28fc6dbbffc42 --- /dev/null +++ b/interface/web/mail/mail_relay_domain_list.php @@ -0,0 +1,51 @@ +<?php + +/* +Copyright (c) 2021, Jesse Norell <jesse@kci.net> +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of ISPConfig nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +require_once '../../lib/config.inc.php'; +require_once '../../lib/app.inc.php'; + +/****************************************** +* Begin Form configuration +******************************************/ + +$list_def_file = "list/mail_relay_domain.list.php"; + +/****************************************** +* End Form configuration +******************************************/ + +//* Check permissions for module +$app->auth->check_module_permissions('mail'); + +$app->uses('listform_actions'); + +$app->listform_actions->onLoad(); + + diff --git a/interface/web/mail/mail_user_del.php b/interface/web/mail/mail_user_del.php index dc92047331952f097b8e80327102c71ca8a036d0..d301f5008573892c5c5527907d10de9dbaa1b44d 100644 --- a/interface/web/mail/mail_user_del.php +++ b/interface/web/mail/mail_user_del.php @@ -55,8 +55,18 @@ class page_action extends tform_actions { global $app; $conf; $tmp_user = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = ?", $this->dataRecord["email"]); + if (is_array($tmp_user) && isset($tmp_user['id'])) { + $tmp_wblists = $app->db->queryAllRecords("SELECT wblist_id FROM spamfilter_wblist WHERE rid = ?", $tmp_user['id']); + if(is_array($tmp_wblists)) { + foreach($tmp_wblists as $tmp) { + $app->db->datalogDelete('spamfilter_wblist', 'wblist_id', $tmp['wblist_id']); + } + } + } $app->db->datalogDelete('spamfilter_users', 'id', $tmp_user["id"]); + // delete mail_forwardings with destination == email ? + $tmp_filters = $app->db->queryAllRecords("SELECT filter_id FROM mail_user_filter WHERE mailuser_id = ?", $this->id); if(is_array($tmp_filters)) { foreach($tmp_filters as $tmp) { @@ -71,4 +81,3 @@ class page_action extends tform_actions { $page = new page_action; $page->onDelete(); -?> diff --git a/interface/web/mail/mail_user_edit.php b/interface/web/mail/mail_user_edit.php index 1dca1db848b93ff78ce9f8c2a9c143579bdf98f7..d8730fa2ebe78c3885af10f785a276e016b7ecfe 100644 --- a/interface/web/mail/mail_user_edit.php +++ b/interface/web/mail/mail_user_edit.php @@ -94,20 +94,20 @@ class page_action extends tform_actions { unset($domains); unset($domain_select); - // Get the spamfilter policys for the user + // Get the spamfilter policies for the user $tmp_user = $app->db->queryOneRecord("SELECT policy_id FROM spamfilter_users WHERE email = ?", $this->dataRecord["email"]); if (isset($_POST['policy'])) $tmp_user['policy_id'] = intval($_POST['policy']); $sql = "SELECT id, policy_name FROM spamfilter_policy WHERE ".$app->tform->getAuthSQL('r') . " ORDER BY policy_name"; - $policys = $app->db->queryAllRecords($sql); - $policy_select = "<option value='0'>".$app->tform->lng("inherit_policy")."</option>"; - if(is_array($policys)) { - foreach( $policys as $p) { + $policies = $app->db->queryAllRecords($sql); + $policy_select = "<option value='0'".(($tmp_user['policy_id'] == 0) ? " SELECTED>":">").$app->tform->lng("inherit_policy")."</option>"; + if(is_array($policies)) { + foreach( $policies as $p) { $selected = ($p["id"] == $tmp_user["policy_id"])?'SELECTED':''; $policy_select .= "<option value='$p[id]' $selected>" . $app->functions->htmlentities($p['policy_name']) . "</option>\r\n"; } } $app->tpl->setVar("policy", $policy_select); - unset($policys); + unset($policies); unset($policy_select); unset($tmp_user); @@ -281,42 +281,40 @@ class page_action extends tform_actions { // Spamfilter policy $policy_id = $app->functions->intval($this->dataRecord["policy"]); - if($policy_id > 0) { - $tmp_user = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = ?", $this->dataRecord["email"]); - if($tmp_user["id"] > 0) { - // There is already a record that we will update + $tmp_user = $app->db->queryOneRecord("SELECT id, policy_id FROM spamfilter_users WHERE email = ?", $this->dataRecord["email"]); + if($tmp_user["id"] > 0) { + // There is already a record that we will update + if($policy_id != $tmp_user['policy_id']) { $app->db->datalogUpdate('spamfilter_users', array("policy_id" => $policy_id), 'id', $tmp_user["id"]); - } else { - // We create a new record - $insert_data = array( - "sys_userid" => $_SESSION["s"]["user"]["userid"], - "sys_groupid" => $domain["sys_groupid"], - "sys_perm_user" => 'riud', - "sys_perm_group" => 'riud', - "sys_perm_other" => '', - "server_id" => $domain["server_id"], - "priority" => 10, - "policy_id" => $policy_id, - "email" => $this->dataRecord["email"], - "fullname" => $app->functions->idn_decode($this->dataRecord["email"]), - "local" => 'Y' - ); - $app->db->datalogInsert('spamfilter_users', $insert_data, 'id'); } - } // endif spamfilter policy + } else { + // We create a new record + $insert_data = array( + "sys_userid" => $_SESSION["s"]["user"]["userid"], + "sys_groupid" => $domain["sys_groupid"], + "sys_perm_user" => 'riud', + "sys_perm_group" => 'riud', + "sys_perm_other" => '', + "server_id" => $domain["server_id"], + "priority" => 7, + "policy_id" => $policy_id, + "email" => $this->dataRecord["email"], + "fullname" => $app->functions->idn_decode($this->dataRecord["email"]), + "local" => 'Y' + ); + $app->db->datalogInsert('spamfilter_users', $insert_data, 'id'); + } // Set the fields for dovecot - if(isset($this->dataRecord["email"])) { - $disableimap = ($this->dataRecord["disableimap"])?'y':'n'; - $disablepop3 = ($this->dataRecord["disablepop3"])?'y':'n'; - $disablesmtp = ($this->dataRecord["disablesmtp"])?'y':'n'; - $disabledeliver = ($this->dataRecord["disabledeliver"])?'y':'n'; - - $app->db->query($sql, $disableimap, $disableimap, $disablepop3, $disablesmtp, $disabledeliver, $disabledeliver, $this->id); - $sql = "UPDATE mail_user SET disableimap = ?, disablesieve = ?, disablepop3 = ?, disablesmtp = ?, disabledeliver = ?, disablelda = ?, disablelmtp = ? WHERE mailuser_id = ?"; - $app->db->query($sql, $disableimap, $disableimap, $disablepop3, $disablesmtp, $disabledeliver, $disabledeliver, $disabledeliver, $this->id); - } + $disableimap = ($this->dataRecord["disableimap"])?'y':'n'; + $disablepop3 = ($this->dataRecord["disablepop3"])?'y':'n'; + $disablesmtp = ($this->dataRecord["disablesmtp"])?'y':'n'; + $disabledeliver = ($this->dataRecord["disabledeliver"])?'y':'n'; + + $app->db->query($sql, $disableimap, $disableimap, $disablepop3, $disablesmtp, $disabledeliver, $disabledeliver, $this->id); + $sql = "UPDATE mail_user SET disableimap = ?, disablesieve = ?, disablepop3 = ?, disablesmtp = ?, disabledeliver = ?, disablelda = ?, disablelmtp = ? WHERE mailuser_id = ?"; + $app->db->query($sql, $disableimap, $disableimap, $disablepop3, $disablesmtp, $disabledeliver, $disabledeliver, $disabledeliver, $this->id); } function onAfterUpdate() { @@ -326,65 +324,104 @@ class page_action extends tform_actions { if(isset($_POST["email_domain"])) { $domain = $app->db->queryOneRecord("SELECT sys_groupid, server_id FROM mail_domain WHERE domain = ? AND ".$app->tform->getAuthSQL('r'), $app->functions->idn_encode($_POST["email_domain"])); $app->db->query("UPDATE mail_user SET sys_groupid = ? WHERE mailuser_id = ?", $domain["sys_groupid"], $this->id); - - // Spamfilter policy - $policy_id = $app->functions->intval($this->dataRecord["policy"]); - $tmp_user = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = ?", $this->dataRecord["email"]); - if($policy_id > 0) { - if($tmp_user["id"] > 0) { - // There is already a record that we will update - $app->db->datalogUpdate('spamfilter_users', array("policy_id" => $policy_id), 'id', $tmp_user["id"]); - } else { - // We create a new record - $insert_data = array( - "sys_userid" => $_SESSION["s"]["user"]["userid"], - "sys_groupid" => $domain["sys_groupid"], - "sys_perm_user" => 'riud', - "sys_perm_group" => 'riud', - "sys_perm_other" => '', - "server_id" => $domain["server_id"], - "priority" => 10, - "policy_id" => $policy_id, - "email" => $this->dataRecord["email"], - "fullname" => $app->functions->idn_decode($this->dataRecord["email"]), - "local" => 'Y' - ); - $app->db->datalogInsert('spamfilter_users', $insert_data, 'id'); - } - }else { - if($tmp_user["id"] > 0) { - // There is already a record but the user shall have no policy, so we delete it - $app->db->datalogDelete('spamfilter_users', 'id', $tmp_user["id"]); - } - } // endif spamfilter policy } // Set the fields for dovecot - if(isset($this->dataRecord["email"])) { - $disableimap = (isset($this->dataRecord["disableimap"]) && $this->dataRecord["disableimap"])?'y':'n'; - $disablepop3 = (isset($this->dataRecord["disablepop3"]) && $this->dataRecord["disablepop3"])?'y':'n'; - $disablesmtp = (isset($this->dataRecord["disablesmtp"]) && $this->dataRecord["disablesmtp"])?'y':'n'; - $disabledeliver = (isset($this->dataRecord["disabledeliver"]) && $this->dataRecord["disabledeliver"])?'y':'n'; - - $sql = "UPDATE mail_user SET disableimap = ?, disablesieve = ?, `disablesieve-filter` = ?, disablepop3 = ?, disablesmtp = ?, disabledeliver = ?, disablelda = ?, disablelmtp = ? WHERE mailuser_id = ?"; - $app->db->query($sql, $disableimap, $disableimap, $disableimap, $disablepop3, $disablesmtp, $disabledeliver, $disabledeliver, $disabledeliver, $this->id); - } + $disableimap = (isset($this->dataRecord["disableimap"]) && $this->dataRecord["disableimap"])?'y':'n'; + $disablepop3 = (isset($this->dataRecord["disablepop3"]) && $this->dataRecord["disablepop3"])?'y':'n'; + $disablesmtp = (isset($this->dataRecord["disablesmtp"]) && $this->dataRecord["disablesmtp"])?'y':'n'; + $disabledeliver = (isset($this->dataRecord["disabledeliver"]) && $this->dataRecord["disabledeliver"])?'y':'n'; + + $sql = "UPDATE mail_user SET disableimap = ?, disablesieve = ?, `disablesieve-filter` = ?, disablepop3 = ?, disablesmtp = ?, disabledeliver = ?, disablelda = ?, disablelmtp = ? WHERE mailuser_id = ?"; + $app->db->query($sql, $disableimap, $disableimap, $disableimap, $disablepop3, $disablesmtp, $disabledeliver, $disabledeliver, $disabledeliver, $this->id); + + // Spamfilter policy + $policy_id = $app->functions->intval($this->dataRecord["policy"]); + $skip_spamfilter_users_update = false; - //** If the email address has been changed, change it in all aliases too + //** Handle email address change if(isset($this->dataRecord['email']) && $this->oldDataRecord['email'] != $this->dataRecord['email']) { - //if($this->oldDataRecord['email'] != $this->dataRecord['email']) { + //** Update spamfilter_users and spamfilter_wblist + $tmp_olduser = $app->db->queryOneRecord("SELECT id,fullname FROM spamfilter_users WHERE email = ?", $this->oldDataRecord['email']); + if($tmp_olduser["id"] > 0) { + $tmp_newuser = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = ?", $this->dataRecord['email']); + if($tmp_newuser['id'] > 0) { + // There is a spamfilter_users for both old and new email, we'll update old wblist entries + $update_data = array( + 'rid' => $tmp_newuser['id'], + ); + if (isset($domain['sys_groupid'])) { + $update_data['sys_groupid'] = $domain['sys_groupid']; + } + $tmp_wblist = $app->db->queryAllRecords("SELECT wblist_id FROM spamfilter_wblist WHERE rid = ?", $tmp_olduser['id']); + foreach ($tmp_wblist as $tmp) { + $app->db->datalogUpdate('spamfilter_wblist', $update_data, 'wblist_id', $tmp['wblist_id']); + } + + // now delete old spamfilter_users entry + $app->db->datalogDelete('spamfilter_users', 'id', $tmp_olduser['id']); + + // we update spamfilter_users for new id below + } else { + $update_data = array( + 'email' => $this->dataRecord['email'], + 'policy_id' => $policy_id, + ); + if (isset($domain['sys_groupid'])) { + $update_data['sys_groupid'] = $domain['sys_groupid']; + } + if($tmp_olduser['fullname'] == $app->functions->idn_decode($this->oldDataRecord['email'])) { + $update_data['fullname'] = $app->functions->idn_decode($this->dataRecord['email']); + } + $app->db->datalogUpdate('spamfilter_users', $update_data, 'id', $tmp_olduser['id']); + $skip_spamfilter_users_update = true; + } + } //* Update the aliases $forwardings = $app->db->queryAllRecords("SELECT * FROM mail_forwarding WHERE destination = ?", $this->oldDataRecord['email']); if(is_array($forwardings)) { foreach($forwardings as $rec) { $destination = $this->dataRecord['email']; - $app->db->datalogUpdate('mail_forwarding', array("destination" => $destination), 'forwarding_id', $rec['forwarding_id']); + $update_data = array( + 'destination' => $destination, + ); + $app->db->datalogUpdate('mail_forwarding', $update_data, 'forwarding_id', $rec['forwarding_id']); } } } // end if email addess changed + $tmp_user = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = ?", $this->dataRecord['email']); + if($tmp_user["id"] > 0) { + // There is already a record that we will update + if(!$skip_spamfilter_users_update) { + $update_data = array( + 'policy_id' => $policy_id, + ); + if (isset($domain['sys_groupid'])) { + $update_data['sys_groupid'] = $domain['sys_groupid']; + } + $app->db->datalogUpdate('spamfilter_users', $update_data, 'id', $tmp_user['id']); + } + } else { + // We create a new record + $insert_data = array( + "sys_userid" => $_SESSION["s"]["user"]["userid"], + "sys_groupid" => $domain["sys_groupid"], + "sys_perm_user" => 'riud', + "sys_perm_group" => 'riud', + "sys_perm_other" => '', + "server_id" => $domain["server_id"], + "priority" => 7, + "policy_id" => $policy_id, + "email" => $this->dataRecord["email"], + "fullname" => $app->functions->idn_decode($this->dataRecord["email"]), + "local" => 'Y' + ); + $app->db->datalogInsert('spamfilter_users', $insert_data, 'id'); + } + //* Change backup options when user mail backup options have been changed if(isset($this->dataRecord['backup_interval']) && ($this->dataRecord['backup_interval'] != $this->oldDataRecord['backup_interval'] || $this->dataRecord['backup_copies'] != $this->oldDataRecord['backup_copies'])) { $backup_interval = $this->dataRecord['backup_interval']; @@ -401,4 +438,3 @@ class page_action extends tform_actions { $app->tform_actions = new page_action; $app->tform_actions->onLoad(); -?> diff --git a/interface/web/mail/spamfilter_blacklist_edit.php b/interface/web/mail/spamfilter_blacklist_edit.php index b76334b387728ef65e2daaa350a08ff37645d916..c304dafd2b3767ec966361c82372b5e748776c66 100644 --- a/interface/web/mail/spamfilter_blacklist_edit.php +++ b/interface/web/mail/spamfilter_blacklist_edit.php @@ -84,7 +84,7 @@ class page_action extends tform_actions { } } // end if user is not admin - // Select and set the server_id so it matches the server_id of the spa,filter_users record + // Select and set the server_id so it matches the server_id of the spamfilter_users record $tmp = $app->db->queryOneRecord("SELECT server_id FROM spamfilter_users WHERE id = ?", $this->dataRecord["rid"]); $this->dataRecord["server_id"] = $tmp["server_id"]; unset($tmp); diff --git a/interface/web/mail/spamfilter_policy_edit.php b/interface/web/mail/spamfilter_policy_edit.php index 8b15f2fac6637e167a4e266232f1cfb21b4d8c55..e8dd7f74736487f5f105cf345392a5aff2b66796 100644 --- a/interface/web/mail/spamfilter_policy_edit.php +++ b/interface/web/mail/spamfilter_policy_edit.php @@ -113,16 +113,9 @@ class page_action extends tform_actions { // check if this is an email domain if(substr($spamfilter_user['email'],0,1) == '@') { $domain = substr($spamfilter_user['email'],1); - $forwardings = $app->db->queryAllRecords("SELECT * FROM mail_forwarding WHERE source LIKE ? OR destination LIKE ?", "%@" . $domain, "%@" . $domain); - - // Force-update aliases and forwards - if(is_array($forwardings)) { - foreach($forwardings as $rec) { - $app->db->datalogUpdate('mail_forwarding', array("source" => $rec['source']), 'forwarding_id', $rec['forwarding_id'],true); - } - } - } + // Nothing special to do for a domain + } } } } diff --git a/interface/web/mail/spamfilter_users_del.php b/interface/web/mail/spamfilter_users_del.php index 0dc92935c136a0e00c3e24afad521848407cf8d8..a243803f9fc3577b2811556c292945957bde0d3e 100644 --- a/interface/web/mail/spamfilter_users_del.php +++ b/interface/web/mail/spamfilter_users_del.php @@ -45,7 +45,24 @@ require_once '../../lib/app.inc.php'; //* Check permissions for module $app->auth->check_module_permissions('mail'); -$app->uses("tform_actions"); -$app->tform_actions->onDelete(); +$app->uses('tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onBeforeDelete() { + global $app; $conf; + + $tmp_wblists = $app->db->queryAllRecords("SELECT wblist_id FROM spamfilter_wblist WHERE rid = ?", $this->id); + if(is_array($tmp_wblists)) { + foreach($tmp_wblists as $tmp) { + $app->db->datalogDelete('spamfilter_wblist', 'wblist_id', $tmp['wblist_id']); + } + } + } + +} + +$page = new page_action; +$page->onDelete(); -?> diff --git a/interface/web/mail/spamfilter_users_edit.php b/interface/web/mail/spamfilter_users_edit.php index b8bc9316c5fffdadff123f8bbf81ef951275e406..c06e31fc72559f1ea7ad9e4d98d37cbb7fa8236f 100644 --- a/interface/web/mail/spamfilter_users_edit.php +++ b/interface/web/mail/spamfilter_users_edit.php @@ -65,6 +65,29 @@ class page_action extends tform_actions { parent::onShowNew(); } + function onShowEnd() { + global $app, $conf; + + // Get the spamfilter policies for the user + $tmp_user = $app->db->queryOneRecord("SELECT policy_id FROM spamfilter_users WHERE email = ?", $this->dataRecord["email"]); + if (isset($_POST['policy_id'])) $tmp_user['policy_id'] = intval($_POST['policy_id']); + $sql = "SELECT id, policy_name FROM spamfilter_policy WHERE ".$app->tform->getAuthSQL('r') . " ORDER BY policy_name"; + $policies = $app->db->queryAllRecords($sql); + $policy_select = "<option value='0'".(($tmp_user['policy_id'] == 0) ? " SELECTED>":">").$app->tform->lng("inherit_policy")."</option>"; + if(is_array($policies)) { + foreach( $policies as $p) { + $selected = ($p["id"] == $tmp_user["policy_id"])?'SELECTED':''; + $policy_select .= "<option value='$p[id]' $selected>" . $app->functions->htmlentities($p['policy_name']) . "</option>\r\n"; + } + } + $app->tpl->setVar("policy_id", $policy_select); + unset($policies); + unset($policy_select); + unset($tmp_user); + + parent::onShowEnd(); + } + function onBeforeUpdate() { global $app, $conf; @@ -90,7 +113,7 @@ class page_action extends tform_actions { $client_group_id = $app->functions->intval($_SESSION["s"]["user"]["default_group"]); $client = $app->db->queryOneRecord("SELECT limit_spamfilter_user FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $client_group_id); - // Check if the user may add another mailbox. + // Check if the user may add another spamfilter user. if($this->id == 0 && $client["limit_spamfilter_user"] >= 0) { $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM spamfilter_users WHERE sys_groupid = ?", $client_group_id); if($tmp["number"] >= $client["limit_spamfilter_user"]) { @@ -103,10 +126,21 @@ class page_action extends tform_actions { parent::onSubmit(); } + + function onAfterUpdate() { + global $app, $conf; + + // If email changes fire spamfilter_wblist_update events so rspamd files are rewritten + if(isset($this->dataRecord['email']) && $this->oldDataRecord['email'] != $this->dataRecord['email']) { + $tmp_wblist = $app->db->queryAllRecords("SELECT wblist_id FROM spamfilter_wblist WHERE rid = ?", $this->dataRecord['id']); + foreach ($tmp_wblist as $tmp) { + $app->db->datalogUpdate('spamfilter_wblist', array('rid' => $this->dataRecord['id']), 'wblist_id', $tmp['wblist_id']); + } + } + } + } $app->tform_actions = new page_action; $app->tform_actions->onLoad(); - -?> diff --git a/interface/web/mail/spamfilter_whitelist_edit.php b/interface/web/mail/spamfilter_whitelist_edit.php index a404db0ef1008c7eba45ea9a9be8d7e6951d09bd..bc161e6e554a639ec93a0e669f31cb10503c662a 100644 --- a/interface/web/mail/spamfilter_whitelist_edit.php +++ b/interface/web/mail/spamfilter_whitelist_edit.php @@ -84,7 +84,7 @@ class page_action extends tform_actions { } } // end if user is not admin - // Select and set the server_id so it matches the server_id of the spa,filter_users record + // Select and set the server_id so it matches the server_id of the spamfilter_users record $tmp = $app->db->queryOneRecord("SELECT server_id FROM spamfilter_users WHERE id = ?", $this->dataRecord["rid"]); $this->dataRecord["server_id"] = $tmp["server_id"]; unset($tmp); diff --git a/interface/web/mail/templates/mail_relay_domain_edit.htm b/interface/web/mail/templates/mail_relay_domain_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..2d4d1f304164726292ad760f8511bdbf38add15a --- /dev/null +++ b/interface/web/mail/templates/mail_relay_domain_edit.htm @@ -0,0 +1,26 @@ + <div class="form-group"> + <label for="server_id" class="col-sm-3 control-label">{tmpl_var name='server_id_txt'}</label> + <div class="col-sm-9"> + <select name="server_id" id="server_id" class="form-control"> + {tmpl_var name='server_id'} + </select> + </div> + </div> + <div class="form-group"> + <label for="domain" class="col-sm-3 control-label">{tmpl_var name='domain_txt'}</label> + <div class="col-sm-9"><input type="text" name="domain" id="domain" value="{tmpl_var name='domain'}" class="form-control" /></div> + </div> + <div class="form-group"> + <label class="col-sm-3 control-label">{tmpl_var name='active_txt'}</label> + <div class="col-sm-9"> + {tmpl_var name='active'} + </div> + </div> + + <input type="hidden" name="id" value="{tmpl_var name='id'}"> + <input type="hidden" name="access" value="OK"> + + <div class="clear"><div class="right"> + <button class="btn btn-default formbutton-success" type="button" value="{tmpl_var name='btn_save_txt'}" data-submit-form="pageForm" data-form-action="mail/mail_relay_domain_edit.php">{tmpl_var name='btn_save_txt'}</button> + <button class="btn btn-default formbutton-default" type="button" value="{tmpl_var name='btn_cancel_txt'}" data-load-content="mail/mail_relay_domain_list.php">{tmpl_var name='btn_cancel_txt'}</button> + </div></div> diff --git a/interface/web/mail/templates/mail_relay_domain_list.htm b/interface/web/mail/templates/mail_relay_domain_list.htm new file mode 100644 index 0000000000000000000000000000000000000000..4bc201a77b706fe6356f264c10be974b79d8a829 --- /dev/null +++ b/interface/web/mail/templates/mail_relay_domain_list.htm @@ -0,0 +1,68 @@ + <div class='page-header'> + <h1><tmpl_var name="list_head_txt"></h1> + </div> + + <tmpl_if name='datalog_changes_count' op='>' value='0'> + <div> + <div class="systemmonitor-state state-info"> + <div class="status"></div> + <div class="statusMsg"> + {tmpl_var name="datalog_changes_txt"} + <ul> + <tmpl_loop name="datalog_changes"> + <li><strong>{tmpl_var name="text"}:</strong> {tmpl_var name="count"}</li> + </tmpl_loop> + </ul> + {tmpl_var name="datalog_changes_end_txt"} + </div> + </div><br /> + </div> + </tmpl_if> + <p class="fieldset-legend">{tmpl_var name="toolsarea_head_txt"}</p> + + <button class="btn btn-default formbutton-success" type="button" data-load-content="mail/mail_relay_domain_edit.php">{tmpl_var name="add_new_record_txt"}</button> + + <p class="fieldset-legend"><tmpl_var name="list_head_txt"></p> + <div class="table-wrapper marginTop15"> +<table class="table"> + <thead class="dark form-group-sm"> + <tr> + <th class="tiny-col" data-column="active"><tmpl_var name="active_txt"></th> + <th data-column="server_id"><tmpl_var name="server_id_txt"></th> + <th data-column="domain"><tmpl_var name="domain_txt"></th> + <th class="small-col text-right">{tmpl_var name='search_limit'}</th> + </tr> + <tr> + <td><select class="form-control" name="search_active">{tmpl_var name='search_active'}</select></td> + <td><select class="form-control" name="search_server_id">{tmpl_var name='search_server_id'}</select></td> + <td><input class="form-control" type="text" name="search_domain" value="{tmpl_var name='search_domain'}" /></td> + <td class="text-right"> + <button type="button" class="btn btn-default formbutton-default formbutton-narrow" name="Filter" id="Filter" value="{tmpl_var name="filter_txt"}" data-submit-form="pageForm" data-form-action="mail/mail_relay_domain_list.php"><span class="icon icon-filter"></span></button> + </td> + </tr> + </thead> + <tbody> + <tmpl_loop name="records"> + <tr> + <td><a href="#" data-load-content="mail/mail_relay_domain_edit.php?id={tmpl_var name='id'}">{tmpl_var name="active"}</a></td> + <td><a href="#" data-load-content="mail/mail_relay_domain_edit.php?id={tmpl_var name='id'}">{tmpl_var name="server_id"}</a></td> + <td><a href="#" data-load-content="mail/mail_relay_domain_edit.php?id={tmpl_var name='id'}">{tmpl_var name="domain"}</a></td> + <td class="text-right"> + <a class="btn btn-default formbutton-danger formbutton-narrow" href="javascript: ISPConfig.confirm_action('mail/mail_relay_domain_del.php?id={tmpl_var name='id'}&_csrf_id={tmpl_var name='csrf_id'}&_csrf_key={tmpl_var name='csrf_key'}&phpsessid={tmpl_var name='phpsessid'}','{tmpl_var name='delete_confirmation'}');"><span class="icon icon-delete"></span></a> + </td> + </tr> + </tmpl_loop> + <tmpl_unless name="records"> + <tr class="tbl_row_noresults tbl_row_<tmpl_if name='__EVEN__'}even<tmpl_else>uneven</tmpl_if>"> + <td colspan="4">{tmpl_var name='globalsearch_noresults_text_txt'}</td> + </tr> + </tmpl_unless> + </tbody> + <tfoot> + <tr> + <td colspan="4"><tmpl_var name="paging"></td> + </tr> + </tfoot> + </table> +</div> + diff --git a/interface/web/mailuser/form/mail_user_filter.tform.php b/interface/web/mailuser/form/mail_user_filter.tform.php index ec693fff36c3b819dbcf8273b53efb99b80804e3..f9f59db31a8942276f22e76f0f2c6aa73281b272 100644 --- a/interface/web/mailuser/form/mail_user_filter.tform.php +++ b/interface/web/mailuser/form/mail_user_filter.tform.php @@ -94,7 +94,6 @@ $form["tabs"]['filter'] = array ( 'datatype' => 'VARCHAR', 'formtype' => 'SELECT', 'default' => '', - //'value' => array('contains'=>'contains_txt','is' => 'Is','begins'=>'Begins with','ends'=>'Ends with') 'value' => array('contains'=>'contains_txt', 'is'=>'is_txt', 'begins'=>'begins_with_txt', 'ends'=>'ends_with_txt', 'regex'=>'regex_txt', 'localpart'=>'localpart_txt', 'domain'=>'domain_txt') ), 'searchterm' => array ( @@ -122,7 +121,7 @@ $form["tabs"]['filter'] = array ( 'datatype' => 'VARCHAR', 'formtype' => 'TEXT', 'validators' => array ( 0 => array ( 'type' => 'REGEX', - 'regex' => '/^[\p{Latin}0-9\.\-\_\ \&\/]{0,100}$/u', + 'regex' => '/^[\p{Latin}0-9\.\'\-\_\ \&\/]{0,100}$/u', 'errmsg'=> 'target_error_regex'), ), 'default' => '', diff --git a/interface/web/mailuser/lib/lang/it_index.lng b/interface/web/mailuser/lib/lang/it_index.lng index b0d9555d651f753191d452782bc99dafdc63cd07..41cd1a2532102f03425824687fb3ad61fd539309 100644 --- a/interface/web/mailuser/lib/lang/it_index.lng +++ b/interface/web/mailuser/lib/lang/it_index.lng @@ -1,6 +1,6 @@ <?php -$wb['page_head_txt'] = 'Impostazioni casela di posta'; -$wb['page_desc_txt'] = 'Qui puoi editare le impostazioni per gli account email.'; +$wb['page_head_txt'] = 'Impostazioni casella di posta'; +$wb['page_desc_txt'] = 'Qui puoi editare le impostazioni per i profili email.'; $wb['email_txt'] = 'Indirizzo Email '; $wb['login_txt'] = 'Accedi'; $wb['server_address_txt'] = 'Indirizzo server di posta'; diff --git a/interface/web/mailuser/lib/lang/it_mail_user_cc.lng b/interface/web/mailuser/lib/lang/it_mail_user_cc.lng index 49c4fe904b803b9e7a60614cbaab8d671462af3a..2bf71b1de93e8807b9570d378b9a84bc391fa783 100644 --- a/interface/web/mailuser/lib/lang/it_mail_user_cc.lng +++ b/interface/web/mailuser/lib/lang/it_mail_user_cc.lng @@ -4,9 +4,9 @@ $wb['cc_txt'] = 'Manda copia a'; $wb['email_txt'] = 'Email'; $wb['email_txt'] = 'E-mail ricevute da'; $wb['cc_error_isemail'] = 'Indirizzo e-mail non valido'; -$wb['email_is_cc_error'] = 'Specificare un indirizzo e-mail diverso dalll\'attuale e-mail.'; +$wb['email_is_cc_error'] = 'Specificare un indirizzo e-mail diverso dall\'attuale e-mail.'; $wb['name_optional_txt'] = '(Opzionale)'; $wb['cc_note_txt'] = '(Separare con una virgola e-mail multiple)'; -$wb['forward_in_lda_txt'] = 'Copy during delivery'; -$wb['tooltip_forward_in_lda_txt'] = 'Controls if mail copy is forwarded before or during delivery to mailbox.'; +$wb['forward_in_lda_txt'] = 'Copia durante la consegna'; +$wb['tooltip_forward_in_lda_txt'] = 'Controlla se copia della mail viene inoltrata prima o durante la consegna alla casella di posta.'; ?> diff --git a/interface/web/mailuser/lib/lang/it_mail_user_filter.lng b/interface/web/mailuser/lib/lang/it_mail_user_filter.lng index 77f47f1c4c456541d6d8bf827ac22ea3c5566cd3..6a1ec61d52c7be44716354c444d3b1c7c4e31c5e 100644 --- a/interface/web/mailuser/lib/lang/it_mail_user_filter.lng +++ b/interface/web/mailuser/lib/lang/it_mail_user_filter.lng @@ -18,8 +18,8 @@ $wb['ends_with_txt'] = 'Termina con'; $wb['move_to_txt'] = 'Sposta in'; $wb['regex_txt'] = 'Matches Regex'; $wb['delete_txt'] = 'Elimina'; -$wb['mailbox_filter_txt'] = 'Mailbox filter'; -$wb['header_txt'] = 'Header'; -$wb['size_over_txt'] = 'Email size over (KB)'; -$wb['size_under_txt'] = 'Email size under (KB)'; +$wb['mailbox_filter_txt'] = 'Mailbox filtro'; +$wb['header_txt'] = 'Intestazione'; +$wb['size_over_txt'] = 'dimensione Email sopra (KB)'; +$wb['size_under_txt'] = 'dimensione Email sotto (KB)'; ?> diff --git a/interface/web/mailuser/lib/lang/it_mail_user_filter_list.lng b/interface/web/mailuser/lib/lang/it_mail_user_filter_list.lng index e391368e0994e0a00776a9c9fbcdc39488fd1cbb..7970040a867cbc8c9d7681eee32a8d2d6a082c7d 100644 --- a/interface/web/mailuser/lib/lang/it_mail_user_filter_list.lng +++ b/interface/web/mailuser/lib/lang/it_mail_user_filter_list.lng @@ -1,8 +1,8 @@ <?php -$wb['list_head_txt'] = 'Email filter rules'; +$wb['list_head_txt'] = 'Regole di filtro della Email'; $wb['rulename_txt'] = 'Nome'; $wb['add_new_record_txt'] = 'Aggiungi un nuovo Filter'; -$wb['page_txt'] = 'Page'; -$wb['page_of_txt'] = 'of'; -$wb['delete_confirmation'] = 'Do you really want to delete the mailfilter?'; +$wb['page_txt'] = 'Pagina'; +$wb['page_of_txt'] = 'di'; +$wb['delete_confirmation'] = 'Vuoi veramente cancellare il filtro della mail??'; ?> diff --git a/interface/web/mailuser/lib/lang/it_mail_user_spamfilter.lng b/interface/web/mailuser/lib/lang/it_mail_user_spamfilter.lng index 17c811f115ea70ab786cc8cad68ff27daab42536..96cd80f04afe9668baf49fcf3919188398ccf393 100644 --- a/interface/web/mailuser/lib/lang/it_mail_user_spamfilter.lng +++ b/interface/web/mailuser/lib/lang/it_mail_user_spamfilter.lng @@ -2,6 +2,6 @@ $wb['mailbox_spamfilter_txt'] = 'Filtro SPAM'; $wb['spamfilter_txt'] = 'Filtro SPAM'; $wb['email_txt'] = 'E-mail'; -$wb['inherit_policy'] = '- Inherit domain setting -'; -$wb['policy_txt'] = 'Policy'; +$wb['inherit_policy'] = '- Ingloba le impostazioni del dominio -'; +$wb['policy_txt'] = 'Politica'; ?> diff --git a/interface/web/mailuser/mail_user_spamfilter_edit.php b/interface/web/mailuser/mail_user_spamfilter_edit.php index 8d1e70ba203c5eaf9603b141ea180561897c8912..2c8759b7954de6304b02a97e45c2dc7e3f450ad9 100644 --- a/interface/web/mailuser/mail_user_spamfilter_edit.php +++ b/interface/web/mailuser/mail_user_spamfilter_edit.php @@ -79,32 +79,25 @@ class page_action extends tform_actions { // Spamfilter policy $policy_id = $app->functions->intval($this->dataRecord["policy"]); $tmp_user = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = ?", $rec["email"]); - if($policy_id > 0) { - if($tmp_user["id"] > 0) { - // There is already a record that we will update - $app->db->datalogUpdate('spamfilter_users', array("policy_id" => $policy_id), 'id', $tmp_user["id"]); - } else { - // We create a new record - $insert_data = array( - "sys_userid" => $domain["sys_userid"], - "sys_groupid" => $domain["sys_groupid"], - "sys_perm_user" => 'riud', - "sys_perm_group" => 'riud', - "sys_perm_other" => '', - "server_id" => $domain["server_id"], - "priority" => 10, - "policy_id" => $policy_id, - "email" => $rec["email"], - "fullname" => $rec["email"], - "local" => 'Y' - ); - $app->db->datalogInsert('spamfilter_users', $insert_data, 'id'); - } - }else { - if($tmp_user["id"] > 0) { - // There is already a record but the user shall have no policy, so we delete it - $app->db->datalogDelete('spamfilter_users', 'id', $tmp_user["id"]); - } + if($tmp_user["id"] > 0) { + // There is already a record that we will update + $app->db->datalogUpdate('spamfilter_users', array("policy_id" => $policy_id), 'id', $tmp_user["id"]); + } else { + // We create a new record + $insert_data = array( + "sys_userid" => $domain["sys_userid"], + "sys_groupid" => $domain["sys_groupid"], + "sys_perm_user" => 'riud', + "sys_perm_group" => 'riud', + "sys_perm_other" => '', + "server_id" => $domain["server_id"], + "priority" => 7, + "policy_id" => $policy_id, + "email" => $rec["email"], + "fullname" => $rec["email"], + "local" => 'Y' + ); + $app->db->datalogInsert('spamfilter_users', $insert_data, 'id'); } // endif spamfilter policy } @@ -114,26 +107,25 @@ class page_action extends tform_actions { $rec = $app->tform->getDataRecord($this->id); $app->tpl->setVar("email", $app->functions->idn_decode($rec['email']), true); - // Get the spamfilter policys for the user + // Get the spamfilter policies for the user $tmp_user = $app->db->queryOneRecord("SELECT policy_id FROM spamfilter_users WHERE email = ?", $rec['email']); $sql = "SELECT id, policy_name FROM spamfilter_policy WHERE ".$app->tform->getAuthSQL('r'); - $policys = $app->db->queryAllRecords($sql); - $policy_select = "<option value='0'>".$app->tform->lng("inherit_policy")."</option>"; - if(is_array($policys)) { - foreach( $policys as $p) { + $policies = $app->db->queryAllRecords($sql); + $policy_select = "<option value='0'".(($tmp_user['policy_id'] == 0)?" SELECTED>":">").$app->tform->lng("inherit_policy")."</option>"; + if(is_array($policies)) { + foreach( $policies as $p) { $selected = ($p["id"] == $tmp_user["policy_id"])?'SELECTED':''; $policy_select .= "<option value='$p[id]' $selected>" . $app->functions->htmlentities($p['policy_name']) . "</option>\r\n"; } } $app->tpl->setVar("policy", $policy_select); - unset($policys); + unset($policies); unset($policy_select); unset($tmp_user); parent::onShowEnd(); } - } $app->tform_actions = new page_action; diff --git a/interface/web/monitor/lib/lang/ar_syslog_list.lng b/interface/web/monitor/lib/lang/ar_syslog_list.lng index 00da5abc7bf7d0ccecbc908db94a12b61b6baa91..256c0cb1ec313cb0af47557ca959f3de97b24684 100644 --- a/interface/web/monitor/lib/lang/ar_syslog_list.lng +++ b/interface/web/monitor/lib/lang/ar_syslog_list.lng @@ -4,4 +4,7 @@ $wb['tstamp_txt'] = 'Date'; $wb['server_id_txt'] = 'Server'; $wb['loglevel_txt'] = 'Loglevel'; $wb['message_txt'] = 'Message'; +$wb['batch_delete_warnings_txt'] = 'Remove all warnings'; +$wb['batch_delete_errors_txt'] = 'Remove all errors'; +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?'; ?> diff --git a/interface/web/monitor/lib/lang/bg_syslog_list.lng b/interface/web/monitor/lib/lang/bg_syslog_list.lng index 98ac28c0a7b023aea0ff5600caa5361e966233f4..ceec6c7d72d52dd3f0ca11ea535f4a374656b9a5 100644 --- a/interface/web/monitor/lib/lang/bg_syslog_list.lng +++ b/interface/web/monitor/lib/lang/bg_syslog_list.lng @@ -4,4 +4,7 @@ $wb['tstamp_txt'] = 'Дата'; $wb['server_id_txt'] = 'Сървър'; $wb['loglevel_txt'] = 'Loglevel'; $wb['message_txt'] = 'Съобщение'; +$wb['batch_delete_warnings_txt'] = 'Remove all warnings'; +$wb['batch_delete_errors_txt'] = 'Remove all errors'; +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?'; ?> diff --git a/interface/web/monitor/lib/lang/br_syslog_list.lng b/interface/web/monitor/lib/lang/br_syslog_list.lng index 18543c9ad39af92ce26f71d4cdd69c57031d3086..24118b48302b57b9ccff0445ebc2a2d83fe14c4e 100644 --- a/interface/web/monitor/lib/lang/br_syslog_list.lng +++ b/interface/web/monitor/lib/lang/br_syslog_list.lng @@ -4,3 +4,7 @@ $wb['tstamp_txt'] = 'Data/hora'; $wb['server_id_txt'] = 'Servidor'; $wb['loglevel_txt'] = 'NÃvel'; $wb['message_txt'] = 'Mensagem'; +$wb['batch_delete_warnings_txt'] = 'Remove all warnings'; +$wb['batch_delete_errors_txt'] = 'Remove all errors'; +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?'; +?> diff --git a/interface/web/monitor/lib/lang/ca_syslog_list.lng b/interface/web/monitor/lib/lang/ca_syslog_list.lng index 1b01a35df796d384b2e5ddd20fef5fa05c4dfc76..19396b5ca257d1aefcffd22e2b399bdda16301ce 100644 --- a/interface/web/monitor/lib/lang/ca_syslog_list.lng +++ b/interface/web/monitor/lib/lang/ca_syslog_list.lng @@ -4,4 +4,7 @@ $wb['tstamp_txt'] = 'Date'; $wb['server_id_txt'] = 'Serveur'; $wb['loglevel_txt'] = 'Niveau de log '; $wb['message_txt'] = 'Message'; +$wb['batch_delete_warnings_txt'] = 'Remove all warnings'; +$wb['batch_delete_errors_txt'] = 'Remove all errors'; +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?'; ?> diff --git a/interface/web/monitor/lib/lang/cz_syslog_list.lng b/interface/web/monitor/lib/lang/cz_syslog_list.lng index 5d5ce8f8c17b5d1af656fd454e0fba0d90553459..5fa66e066e51cd228c5f577d4a49c9d7645ad804 100644 --- a/interface/web/monitor/lib/lang/cz_syslog_list.lng +++ b/interface/web/monitor/lib/lang/cz_syslog_list.lng @@ -4,3 +4,7 @@ $wb['tstamp_txt'] = 'Datum'; $wb['server_id_txt'] = 'Server'; $wb['loglevel_txt'] = 'Úroveň protokolu'; $wb['message_txt'] = 'Zpráva'; +$wb['batch_delete_warnings_txt'] = 'Remove all warnings'; +$wb['batch_delete_errors_txt'] = 'Remove all errors'; +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?'; +?> diff --git a/interface/web/monitor/lib/lang/de_syslog_list.lng b/interface/web/monitor/lib/lang/de_syslog_list.lng index 4aa045a24bfe1aaa8fc20a9b8640e382002a7162..6ee36a677bbdb35401f07cf1c37a0267abfebf4c 100644 --- a/interface/web/monitor/lib/lang/de_syslog_list.lng +++ b/interface/web/monitor/lib/lang/de_syslog_list.lng @@ -4,4 +4,7 @@ $wb['tstamp_txt'] = 'Datum'; $wb['server_id_txt'] = 'Server'; $wb['loglevel_txt'] = 'Protokoll-Level'; $wb['message_txt'] = 'Nachricht'; +$wb['batch_delete_errors_txt'] = 'Remove all warnings'; +$wb['batch_delete_errors_txt'] = 'Remove all errors'; +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?'; ?> diff --git a/interface/web/monitor/lib/lang/dk_syslog_list.lng b/interface/web/monitor/lib/lang/dk_syslog_list.lng index e1b067bfe3e5afeec224553e680665c46ea6e2fa..22fbadfd1d3b9c5c218f730206a3c73efba9f68d 100644 --- a/interface/web/monitor/lib/lang/dk_syslog_list.lng +++ b/interface/web/monitor/lib/lang/dk_syslog_list.lng @@ -4,4 +4,7 @@ $wb['tstamp_txt'] = 'Dato'; $wb['server_id_txt'] = 'Server'; $wb['loglevel_txt'] = 'Loglevel'; $wb['message_txt'] = 'Meddelelse'; +$wb['batch_delete_warnings_txt'] = 'Remove all warnings'; +$wb['batch_delete_errors_txt'] = 'Remove all errors'; +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?'; ?> diff --git a/interface/web/monitor/lib/lang/el_syslog_list.lng b/interface/web/monitor/lib/lang/el_syslog_list.lng index c2db4823dd51ad0bc68d1aaf1ce9dfa90fe0dade..1eb4831e889f3fd05e31461144ad8519ea93cbcc 100644 --- a/interface/web/monitor/lib/lang/el_syslog_list.lng +++ b/interface/web/monitor/lib/lang/el_syslog_list.lng @@ -4,4 +4,7 @@ $wb['tstamp_txt'] = 'ΗμεÏομηνία'; $wb['server_id_txt'] = 'Server'; $wb['loglevel_txt'] = 'Επίπεδο καταγÏαφής'; $wb['message_txt'] = 'Μήνυμα'; +$wb['batch_delete_warnings_txt'] = 'Remove all warnings'; +$wb['batch_delete_errors_txt'] = 'Remove all errors'; +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?'; ?> diff --git a/interface/web/monitor/lib/lang/en_syslog_list.lng b/interface/web/monitor/lib/lang/en_syslog_list.lng index d85ab8d40fde1c9b002e481cfb2078dd24299f80..256c0cb1ec313cb0af47557ca959f3de97b24684 100644 --- a/interface/web/monitor/lib/lang/en_syslog_list.lng +++ b/interface/web/monitor/lib/lang/en_syslog_list.lng @@ -4,4 +4,7 @@ $wb['tstamp_txt'] = 'Date'; $wb['server_id_txt'] = 'Server'; $wb['loglevel_txt'] = 'Loglevel'; $wb['message_txt'] = 'Message'; -?> \ No newline at end of file +$wb['batch_delete_warnings_txt'] = 'Remove all warnings'; +$wb['batch_delete_errors_txt'] = 'Remove all errors'; +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?'; +?> diff --git a/interface/web/monitor/lib/lang/es_syslog_list.lng b/interface/web/monitor/lib/lang/es_syslog_list.lng index 355b1cffdf9d9b13f9224fd5ddb5a8f4bd9b3516..38cb93e098d57325b00bb5a8d55ff8421fa3d9f5 100644 --- a/interface/web/monitor/lib/lang/es_syslog_list.lng +++ b/interface/web/monitor/lib/lang/es_syslog_list.lng @@ -4,4 +4,7 @@ $wb['loglevel_txt'] = 'Nivel de registro'; $wb['message_txt'] = 'Mensaje'; $wb['server_id_txt'] = 'Servidor'; $wb['tstamp_txt'] = 'Fecha'; +$wb['batch_delete_warnings_txt'] = 'Remove all warnings'; +$wb['batch_delete_errors_txt'] = 'Remove all errors'; +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?'; ?> diff --git a/interface/web/monitor/lib/lang/fi_syslog_list.lng b/interface/web/monitor/lib/lang/fi_syslog_list.lng index 54aaa4e30695755e5408424a15ccc36a2434f05b..842ed0133552c658960081bc985a7ca36d585d87 100644 --- a/interface/web/monitor/lib/lang/fi_syslog_list.lng +++ b/interface/web/monitor/lib/lang/fi_syslog_list.lng @@ -4,4 +4,7 @@ $wb['tstamp_txt'] = 'Päiväys'; $wb['server_id_txt'] = 'Palvelin'; $wb['loglevel_txt'] = 'Lokitaso'; $wb['message_txt'] = 'Viesti'; +$wb['batch_delete_warnings_txt'] = 'Remove all warnings'; +$wb['batch_delete_errors_txt'] = 'Remove all errors'; +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?'; ?> diff --git a/interface/web/monitor/lib/lang/fr_syslog_list.lng b/interface/web/monitor/lib/lang/fr_syslog_list.lng index 1b01a35df796d384b2e5ddd20fef5fa05c4dfc76..19396b5ca257d1aefcffd22e2b399bdda16301ce 100644 --- a/interface/web/monitor/lib/lang/fr_syslog_list.lng +++ b/interface/web/monitor/lib/lang/fr_syslog_list.lng @@ -4,4 +4,7 @@ $wb['tstamp_txt'] = 'Date'; $wb['server_id_txt'] = 'Serveur'; $wb['loglevel_txt'] = 'Niveau de log '; $wb['message_txt'] = 'Message'; +$wb['batch_delete_warnings_txt'] = 'Remove all warnings'; +$wb['batch_delete_errors_txt'] = 'Remove all errors'; +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?'; ?> diff --git a/interface/web/monitor/lib/lang/hr_syslog_list.lng b/interface/web/monitor/lib/lang/hr_syslog_list.lng index 83c5fcdf49e592af6984ce81fb388d01757394e8..8a62c6248906616780554da673661e79a9f5ea06 100644 --- a/interface/web/monitor/lib/lang/hr_syslog_list.lng +++ b/interface/web/monitor/lib/lang/hr_syslog_list.lng @@ -4,4 +4,7 @@ $wb['tstamp_txt'] = 'Datum'; $wb['server_id_txt'] = 'Server'; $wb['loglevel_txt'] = 'Logovi'; $wb['message_txt'] = 'Poruka'; +$wb['batch_delete_warnings_txt'] = 'Remove all warnings'; +$wb['batch_delete_errors_txt'] = 'Remove all errors'; +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?'; ?> diff --git a/interface/web/monitor/lib/lang/hu_syslog_list.lng b/interface/web/monitor/lib/lang/hu_syslog_list.lng index 65480b9d71688f3ca842686ca9caab35a9c5cef7..21ef2bfcdf9f0933bd0bebaa1877e1b810ba1f20 100644 --- a/interface/web/monitor/lib/lang/hu_syslog_list.lng +++ b/interface/web/monitor/lib/lang/hu_syslog_list.lng @@ -4,4 +4,7 @@ $wb['tstamp_txt'] = 'Dátum'; $wb['server_id_txt'] = 'Szerver'; $wb['loglevel_txt'] = 'Naplózási szint'; $wb['message_txt'] = 'Üzenet'; +$wb['batch_delete_warnings_txt'] = 'Remove all warnings'; +$wb['batch_delete_errors_txt'] = 'Remove all errors'; +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?'; ?> diff --git a/interface/web/monitor/lib/lang/id_syslog_list.lng b/interface/web/monitor/lib/lang/id_syslog_list.lng index c523a55a2b924b37da1c3e646e4757b1062019f5..a06f5e3d711c1ef986b2ece88601729750390651 100644 --- a/interface/web/monitor/lib/lang/id_syslog_list.lng +++ b/interface/web/monitor/lib/lang/id_syslog_list.lng @@ -4,4 +4,7 @@ $wb['tstamp_txt'] = 'Tanggal'; $wb['server_id_txt'] = 'Server'; $wb['loglevel_txt'] = 'Tingkatan Log'; $wb['message_txt'] = 'Pesan'; +$wb['batch_delete_warnings_txt'] = 'Remove all warnings'; +$wb['batch_delete_errors_txt'] = 'Remove all errors'; +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?'; ?> diff --git a/interface/web/monitor/lib/lang/it_dataloghistory_list.lng b/interface/web/monitor/lib/lang/it_dataloghistory_list.lng index f1ba8c67b8eed44c916f66d91ec4bd7a1af49872..26138fba2503ea9a37ee24d3a3e010b82e6e6d83 100644 --- a/interface/web/monitor/lib/lang/it_dataloghistory_list.lng +++ b/interface/web/monitor/lib/lang/it_dataloghistory_list.lng @@ -2,7 +2,7 @@ $wb['list_head_txt'] = 'Datalog History'; $wb['tstamp_txt'] = 'Date'; $wb['server_id_txt'] = 'Server'; -$wb['dbtable_txt'] = 'DB Table'; -$wb['action_txt'] = 'Action'; -$wb['status_txt'] = 'Status'; +$wb['dbtable_txt'] = 'Tabella DB'; +$wb['action_txt'] = 'Azione'; +$wb['status_txt'] = 'Stato'; ?> diff --git a/interface/web/monitor/lib/lang/it_dataloghistory_undo.lng b/interface/web/monitor/lib/lang/it_dataloghistory_undo.lng index 0e040a3e77d48b89a779f7c7d3fb4198df0fe02e..32b9fb57a0e28b678d62f16be4534a087cc32219 100644 --- a/interface/web/monitor/lib/lang/it_dataloghistory_undo.lng +++ b/interface/web/monitor/lib/lang/it_dataloghistory_undo.lng @@ -1,7 +1,7 @@ <?php -$wb['list_head_txt'] = 'Data Log History Entry'; -$wb['success_txt'] = 'Undo successful'; -$wb['error_txt'] = 'Error during undo: Record does not exist anymore'; -$wb['error_undelete_txt'] = 'Error during undelete: Record with primary id already existing.'; -$wb['btn_cancel_txt'] = 'Back'; +$wb['list_head_txt'] = 'Elemento della History'; +$wb['success_txt'] = 'Annulla modifica eseguit con successo'; +$wb['error_txt'] = 'Errore durinte annulla modifica: il record non è più presente'; +$wb['error_undelete_txt'] = 'Errore durinte annulla modifica: il record con ID primario è già presente.'; +$wb['btn_cancel_txt'] = 'Indietro'; ?> diff --git a/interface/web/monitor/lib/lang/it_dataloghistory_view.lng b/interface/web/monitor/lib/lang/it_dataloghistory_view.lng index df9ddd286f46e816e06132e7465929ab8dd87229..3951e6b87302df1403271b43dacd651000aca383 100644 --- a/interface/web/monitor/lib/lang/it_dataloghistory_view.lng +++ b/interface/web/monitor/lib/lang/it_dataloghistory_view.lng @@ -1,26 +1,26 @@ <?php -$wb['i'] = 'Insert'; -$wb['u'] = 'Update'; -$wb['d'] = 'Delete'; -$wb['list_head_txt'] = 'Data Log History Entry'; +$wb['i'] = 'Inserisci'; +$wb['u'] = 'Aggiorna'; +$wb['d'] = 'Cancella'; +$wb['list_head_txt'] = 'Elemento ddella Log History'; $wb['id_txt'] = 'ID'; -$wb['timestamp_txt'] = 'Timestamp'; -$wb['table_txt'] = 'Table'; -$wb['action_txt'] = 'Action'; -$wb['session_id_txt'] = 'Session ID'; -$wb['fields_txt'] = 'Fields'; -$wb['fields_inserted_txt'] = 'Inserted Fields'; -$wb['fields_updated_txt'] = 'Updated Fields'; -$wb['fields_deleted_txt'] = 'Deleted Fields'; -$wb['no_changes_txt'] = 'No changes (re-sync)'; -$wb['is_diff_txt'] = 'The differences are highlighted'; -$wb['is_diff_inserts_txt'] = 'Insertions'; -$wb['is_diff_deletes_txt'] = 'Deletions'; -$wb['field_txt'] = 'Field'; -$wb['value_txt'] = 'Value'; -$wb['old_txt'] = 'Old'; -$wb['new_txt'] = 'New'; -$wb['btn_cancel_txt'] = 'Back'; -$wb['undo_txt'] = 'Undo action'; -$wb['undo_confirmation_txt'] = 'Do you really want to undo this action?'; +$wb['timestamp_txt'] = 'Data/Ora'; +$wb['table_txt'] = 'Tabella'; +$wb['action_txt'] = 'Azione'; +$wb['session_id_txt'] = 'ID di Sessione'; +$wb['fields_txt'] = 'Campi'; +$wb['fields_inserted_txt'] = 'Campi inseriti'; +$wb['fields_updated_txt'] = 'Campi aggiornati'; +$wb['fields_deleted_txt'] = 'Campi cancellati'; +$wb['no_changes_txt'] = 'Nessun cambiamento (risincronizza)'; +$wb['is_diff_txt'] = 'Le differenze sono evidenziate'; +$wb['is_diff_inserts_txt'] = 'Inserimenti'; +$wb['is_diff_deletes_txt'] = 'Cancellazioni'; +$wb['field_txt'] = 'Campo'; +$wb['value_txt'] = 'Valore'; +$wb['old_txt'] = 'Precedente'; +$wb['new_txt'] = 'Nuovo'; +$wb['btn_cancel_txt'] = 'Indietro'; +$wb['undo_txt'] = 'Annulla modifica'; +$wb['undo_confirmation_txt'] = 'Vuoi veramente annullare la modifica?'; ?> diff --git a/interface/web/monitor/lib/lang/it_syslog_list.lng b/interface/web/monitor/lib/lang/it_syslog_list.lng index 65ff6fc7c552d15eb69bb3f4282042edd3e85a5e..c67c716e3b4046a2c8e663ef7de4e09f93e7c0cc 100644 --- a/interface/web/monitor/lib/lang/it_syslog_list.lng +++ b/interface/web/monitor/lib/lang/it_syslog_list.lng @@ -4,4 +4,7 @@ $wb['tstamp_txt'] = 'Data'; $wb['server_id_txt'] = 'Server'; $wb['loglevel_txt'] = 'Livello log'; $wb['message_txt'] = 'Messaggio'; +$wb['batch_delete_warnings_txt'] = 'Remove all warnings'; +$wb['batch_delete_errors_txt'] = 'Remove all errors'; +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?'; ?> diff --git a/interface/web/monitor/lib/lang/ja_syslog_list.lng b/interface/web/monitor/lib/lang/ja_syslog_list.lng index 598b8d451a841ed13be696f3fc870225621660c4..bda73f402b2df2965fe579c810f7673ddae4b9b3 100644 --- a/interface/web/monitor/lib/lang/ja_syslog_list.lng +++ b/interface/web/monitor/lib/lang/ja_syslog_list.lng @@ -4,4 +4,7 @@ $wb['tstamp_txt'] = '日付'; $wb['server_id_txt'] = 'サーãƒãƒ¼'; $wb['loglevel_txt'] = 'ãƒã‚°ãƒ¬ãƒ™ãƒ«'; $wb['message_txt'] = 'メッセージ'; +$wb['batch_delete_warnings_txt'] = 'Remove all warnings'; +$wb['batch_delete_errors_txt'] = 'Remove all errors'; +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?'; ?> diff --git a/interface/web/monitor/lib/lang/nl_syslog_list.lng b/interface/web/monitor/lib/lang/nl_syslog_list.lng index 7e2fa4a45f8c34b362715a31b5c320598ccf7cb1..b084d9120d8b29230add3d3bdee48465ea4fbd11 100644 --- a/interface/web/monitor/lib/lang/nl_syslog_list.lng +++ b/interface/web/monitor/lib/lang/nl_syslog_list.lng @@ -4,4 +4,7 @@ $wb['tstamp_txt'] = 'Datum'; $wb['server_id_txt'] = 'Server'; $wb['loglevel_txt'] = 'Log niveau'; $wb['message_txt'] = 'Bericht'; +$wb['batch_delete_warnings_txt'] = 'Remove all warnings'; +$wb['batch_delete_errors_txt'] = 'Remove all errors'; +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?'; ?> diff --git a/interface/web/monitor/lib/lang/pl_syslog_list.lng b/interface/web/monitor/lib/lang/pl_syslog_list.lng index e37799c4749129e4ff2e372ce82257cbbf046d4a..efd50405ed247a2c7b5d64a975e73b59efe8d15e 100644 --- a/interface/web/monitor/lib/lang/pl_syslog_list.lng +++ b/interface/web/monitor/lib/lang/pl_syslog_list.lng @@ -4,4 +4,7 @@ $wb['tstamp_txt'] = 'Data'; $wb['server_id_txt'] = 'Serwer'; $wb['loglevel_txt'] = 'Poziom logowania'; $wb['message_txt'] = 'Wiadomość'; +$wb['batch_delete_warnings_txt'] = 'Remove all warnings'; +$wb['batch_delete_errors_txt'] = 'Remove all errors'; +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?'; ?> diff --git a/interface/web/monitor/lib/lang/pt_syslog_list.lng b/interface/web/monitor/lib/lang/pt_syslog_list.lng index 23f3c6d5daf43245f060b7de39004ede9e1895d4..9d9189d72056ed971ada50b9a2561969862b7323 100644 --- a/interface/web/monitor/lib/lang/pt_syslog_list.lng +++ b/interface/web/monitor/lib/lang/pt_syslog_list.lng @@ -4,4 +4,7 @@ $wb['tstamp_txt'] = 'Data'; $wb['server_id_txt'] = 'Servidor'; $wb['loglevel_txt'] = 'NÃvel do Log'; $wb['message_txt'] = 'Mensagem'; +$wb['batch_delete_warnings_txt'] = 'Remove all warnings'; +$wb['batch_delete_errors_txt'] = 'Remove all errors'; +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?'; ?> diff --git a/interface/web/monitor/lib/lang/ro_syslog_list.lng b/interface/web/monitor/lib/lang/ro_syslog_list.lng index 572095d8da102edfb955ff717d338980956f4dea..617fbed9b9ab02caefdf4e88f2632aa8e7f4cb10 100644 --- a/interface/web/monitor/lib/lang/ro_syslog_list.lng +++ b/interface/web/monitor/lib/lang/ro_syslog_list.lng @@ -4,4 +4,7 @@ $wb['tstamp_txt'] = 'Data'; $wb['server_id_txt'] = 'Server'; $wb['loglevel_txt'] = 'Loglevel'; $wb['message_txt'] = 'Mesaj'; +$wb['batch_delete_warnings_txt'] = 'Remove all warnings'; +$wb['batch_delete_errors_txt'] = 'Remove all errors'; +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?'; ?> diff --git a/interface/web/monitor/lib/lang/ru_syslog_list.lng b/interface/web/monitor/lib/lang/ru_syslog_list.lng index 242d06f3e313d081d9b4c296790198fe8a58fa29..adeed60a3c0caf7dd9a92044256e92f4bfe83eee 100644 --- a/interface/web/monitor/lib/lang/ru_syslog_list.lng +++ b/interface/web/monitor/lib/lang/ru_syslog_list.lng @@ -4,4 +4,7 @@ $wb['tstamp_txt'] = 'Отметка времени'; $wb['server_id_txt'] = 'Сервер'; $wb['loglevel_txt'] = 'Уровень журналированиÑ'; $wb['message_txt'] = 'Сообщение'; +$wb['batch_delete_warnings_txt'] = 'Remove all warnings'; +$wb['batch_delete_errors_txt'] = 'Remove all errors'; +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?'; ?> diff --git a/interface/web/monitor/lib/lang/se_syslog_list.lng b/interface/web/monitor/lib/lang/se_syslog_list.lng index 6c7268cb76d9593096cceeca771759a2d7a568da..c0ad7a2466a666ed1e2a7c77f7e9a662e9e48aae 100644 --- a/interface/web/monitor/lib/lang/se_syslog_list.lng +++ b/interface/web/monitor/lib/lang/se_syslog_list.lng @@ -4,4 +4,7 @@ $wb['tstamp_txt'] = 'Datum'; $wb['server_id_txt'] = 'Server'; $wb['loglevel_txt'] = 'LoggnivÃ¥'; $wb['message_txt'] = 'Meddelande'; +$wb['batch_delete_warnings_txt'] = 'Remove all warnings'; +$wb['batch_delete_errors_txt'] = 'Remove all errors'; +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?'; ?> diff --git a/interface/web/monitor/lib/lang/sk_syslog_list.lng b/interface/web/monitor/lib/lang/sk_syslog_list.lng index e3a800c8c11d6d6558e8a92678b7d9a07ca3e29c..5a01e6bef694d7f415e8e460d7493aaa8e504c8d 100644 --- a/interface/web/monitor/lib/lang/sk_syslog_list.lng +++ b/interface/web/monitor/lib/lang/sk_syslog_list.lng @@ -4,4 +4,7 @@ $wb['tstamp_txt'] = 'Dátum'; $wb['server_id_txt'] = 'Server'; $wb['loglevel_txt'] = 'Úroveň logovania'; $wb['message_txt'] = 'Správa'; +$wb['batch_delete_warnings_txt'] = 'Remove all warnings'; +$wb['batch_delete_errors_txt'] = 'Remove all errors'; +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?'; ?> diff --git a/interface/web/monitor/lib/lang/tr_syslog_list.lng b/interface/web/monitor/lib/lang/tr_syslog_list.lng index b961014e86e88bf3193397e0b2927d2b7b64e6ab..67a63387fa9ccbe1567a9a0c5a27f7183a076190 100644 --- a/interface/web/monitor/lib/lang/tr_syslog_list.lng +++ b/interface/web/monitor/lib/lang/tr_syslog_list.lng @@ -4,4 +4,7 @@ $wb['tstamp_txt'] = 'Tarih'; $wb['server_id_txt'] = 'Sunucu'; $wb['loglevel_txt'] = 'Günlükleme Düzeyi'; $wb['message_txt'] = 'İleti'; +$wb['batch_delete_warnings_txt'] = 'Remove all warnings'; +$wb['batch_delete_errors_txt'] = 'Remove all errors'; +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?'; ?> diff --git a/interface/web/monitor/log_del.php b/interface/web/monitor/log_del.php index 40fe185977ed37c2131b87078233bd612045111c..ec6b9442eb5823938f4ea2e996b9c61c31c25006 100644 --- a/interface/web/monitor/log_del.php +++ b/interface/web/monitor/log_del.php @@ -34,8 +34,14 @@ require_once '../../lib/app.inc.php'; //* Check permissions for module $app->auth->check_module_permissions('monitor'); -$syslog_id = $app->functions->intval($_GET['id']); -$app->db->query("UPDATE sys_log SET loglevel = 0 WHERE syslog_id = ?", $syslog_id); +$type = $app->functions->intval($_GET['type']); +if ($type == "batch") { + $loglevel = $app->functions->intval($_GET['loglevel']); + $app->db->query("UPDATE sys_log SET loglevel = 0 WHERE loglevel = ?", $loglevel); +} else { + $syslog_id = $app->functions->intval($_GET['id']); + $app->db->query("UPDATE sys_log SET loglevel = 0 WHERE syslog_id = ?", $syslog_id); +} header('Location: log_list.php'); exit; diff --git a/interface/web/monitor/templates/syslog_list.htm b/interface/web/monitor/templates/syslog_list.htm index 7196e3ab02bbeb413c994b2eaaeafdb54e8bf72e..087af5cdc953f4036a25598cdcd5bc7c1a7b715d 100644 --- a/interface/web/monitor/templates/syslog_list.htm +++ b/interface/web/monitor/templates/syslog_list.htm @@ -1,59 +1,85 @@ <div class='page-header'> - <h1><tmpl_var name="list_head_txt"></h1> + <h1> + <tmpl_var name="list_head_txt"> + </h1> </div> -<p><tmpl_var name="list_desc_txt"></p> +<p> + <tmpl_var name="list_desc_txt"> +</p> +<a class="btn btn-default formbutton-danger" + href="javascript: ISPConfig.confirm_action('monitor/log_del.php?type=batch&loglevel=1&_csrf_id={tmpl_var name='csrf_id'}&_csrf_key={tmpl_var name='csrf_key'}&phpsessid={tmpl_var name='phpsessid'}','{tmpl_var name='batch_delete_confirmation'}');"><span + class="icon icon-delete"></span> {tmpl_var name='batch_delete_warnings_txt'}</a> + <a class="btn btn-default formbutton-danger" + href="javascript: ISPConfig.confirm_action('monitor/log_del.php?type=batch&loglevel=2&_csrf_id={tmpl_var name='csrf_id'}&_csrf_key={tmpl_var name='csrf_key'}&phpsessid={tmpl_var name='phpsessid'}','{tmpl_var name='batch_delete_confirmation'}');"><span + class="icon icon-delete"></span> {tmpl_var name='batch_delete_errors_txt'}</a> +<p class="fieldset-legend"> + <tmpl_var name="list_head_txt"> +</p> +<div class="table-wrapper marginTop15"> + <table class="table"> + <thead class="dark form-group-sm"> + <tr> + <th data-column="tstamp"> + <tmpl_var name="tstamp_txt"> + </th> + <th data-column="server_id"> + <tmpl_var name="server_id_txt"> + </th> + <th data-column="loglevel"> + <tmpl_var name="loglevel_txt"> + </th> + <th data-column="message"> + <tmpl_var name="message_txt"> + </th> + <th class="small-col text-right">{tmpl_var name='search_limit'}</th> + </tr> + <tr> + <td> </td> + <td><select class="form-control" name="search_server_id">{tmpl_var name='search_server_id'}</select></td> + <td><select class="form-control" name="search_loglevel">{tmpl_var name='search_loglevel'}</select></td> + <td><input class="form-control" type="text" name="search_message" value="{tmpl_var name='search_message'}" /></td> + <td class="text-right"> + <button type="button" class="btn btn-default formbutton-default formbutton-narrow" name="Filter" id="Filter" value="{tmpl_var name=" filter_txt"}" data-submit-form="pageForm" data-form-action="monitor/log_list.php"><span + class="icon icon-filter"></span></button> + </td> + </tr> + </thead> + <tbody> + <tmpl_loop name="records"> + <tr> + <td>{tmpl_var name="tstamp"}</td> + <td>{tmpl_var name="server_id"}</td> + <td>{tmpl_var name="loglevel"}</td> + <td>{tmpl_var name="message"}</td> + <td class="text-right"> + <tmpl_if name="loglevel" op="==" value="Error"> + <a class="btn btn-default formbutton-danger formbutton-narrow" + href="javascript: ISPConfig.confirm_action('monitor/log_del.php?id={tmpl_var name='id'}&_csrf_id={tmpl_var name='csrf_id'}&_csrf_key={tmpl_var name='csrf_key'}&phpsessid={tmpl_var name='phpsessid'}','{tmpl_var name='delete_confirmation'}');"><span + class="icon icon-delete"></span></a> + </tmpl_if> + <tmpl_if name="loglevel" op="==" value="Warning"> + <a class="btn btn-default formbutton-danger formbutton-narrow" + href="javascript: ISPConfig.confirm_action('monitor/log_del.php?id={tmpl_var name='id'}&_csrf_id={tmpl_var name='csrf_id'}&_csrf_key={tmpl_var name='csrf_key'}&phpsessid={tmpl_var name='phpsessid'}','{tmpl_var name='delete_confirmation'}');"><span + class="icon icon-delete"></span></a> + </tmpl_if> + </td> + </tr> + </tmpl_loop> + <tmpl_unless name="records"> + <tr class="tbl_row_noresults tbl_row_<tmpl_if name='__EVEN__'}even<tmpl_else>uneven</tmpl_if>"> + <td colspan="5">{tmpl_var name='globalsearch_noresults_text_txt'}</td> + </tr> + </tmpl_unless> + </tbody> + <tfoot> + <tr> + <td colspan="5"> + <tmpl_var name="paging"> + </td> + </tr> + </tfoot> + </table> +</div> - <p class="fieldset-legend"><tmpl_var name="list_head_txt"></p> - <div class="table-wrapper marginTop15"> -<table class="table"> - <thead class="dark form-group-sm"> - <tr> - <th data-column="tstamp"><tmpl_var name="tstamp_txt"></th> - <th data-column="server_id"><tmpl_var name="server_id_txt"></th> - <th data-column="loglevel"><tmpl_var name="loglevel_txt"></th> - <th data-column="message"><tmpl_var name="message_txt"></th> - <th class="small-col text-right">{tmpl_var name='search_limit'}</th> - </tr> - <tr> - <td> </td> - <td><select class="form-control" name="search_server_id">{tmpl_var name='search_server_id'}</select></td> - <td><select class="form-control" name="search_loglevel">{tmpl_var name='search_loglevel'}</select></td> - <td><input class="form-control" type="text" name="search_message" value="{tmpl_var name='search_message'}" /></td> - <td class="text-right"> - <button type="button" class="btn btn-default formbutton-default formbutton-narrow" name="Filter" id="Filter" value="{tmpl_var name="filter_txt"}" data-submit-form="pageForm" data-form-action="monitor/log_list.php"><span class="icon icon-filter"></span></button> - </td> - </tr> - </thead> - <tbody> - <tmpl_loop name="records"> - <tr> - <td>{tmpl_var name="tstamp"}</td> - <td>{tmpl_var name="server_id"}</td> - <td>{tmpl_var name="loglevel"}</td> - <td>{tmpl_var name="message"}</td> - <td class="text-right"> - <tmpl_if name="loglevel" op="==" value="Error"> - <a class="btn btn-default formbutton-danger formbutton-narrow" href="javascript: ISPConfig.confirm_action('monitor/log_del.php?id={tmpl_var name='id'}&_csrf_id={tmpl_var name='csrf_id'}&_csrf_key={tmpl_var name='csrf_key'}&phpsessid={tmpl_var name='phpsessid'}','{tmpl_var name='delete_confirmation'}');"><span class="icon icon-delete"></span></a> - </tmpl_if> - <tmpl_if name="loglevel" op="==" value="Warning"> - <a class="btn btn-default formbutton-danger formbutton-narrow" href="javascript: ISPConfig.confirm_action('monitor/log_del.php?id={tmpl_var name='id'}&_csrf_id={tmpl_var name='csrf_id'}&_csrf_key={tmpl_var name='csrf_key'}&phpsessid={tmpl_var name='phpsessid'}','{tmpl_var name='delete_confirmation'}');"><span class="icon icon-delete"></span></a> - </tmpl_if> - </td> - </tr> - </tmpl_loop> - <tmpl_unless name="records"> - <tr class="tbl_row_noresults tbl_row_<tmpl_if name='__EVEN__'}even<tmpl_else>uneven</tmpl_if>"> - <td colspan="5">{tmpl_var name='globalsearch_noresults_text_txt'}</td> - </tr> - </tmpl_unless> - </tbody> - <tfoot> - <tr> - <td colspan="5"><tmpl_var name="paging"></td> - </tr> - </tfoot> - </table> </div> - - </div> \ No newline at end of file diff --git a/interface/web/sites/lib/lang/ar_web_backup_list.lng b/interface/web/sites/lib/lang/ar_web_backup_list.lng index 8f0d3a7469f807d706676c8581e3ea704584baec..0f19d9339ed75bcaaf730ee4b62bacc1cc70e4f9 100644 --- a/interface/web/sites/lib/lang/ar_web_backup_list.lng +++ b/interface/web/sites/lib/lang/ar_web_backup_list.lng @@ -30,6 +30,7 @@ $wb['manual_backup_title_txt'] = 'Manual backup'; $wb['make_backup_web_txt'] = 'Make backup of web files'; $wb['make_backup_database_txt'] = 'Make backup of databases'; $wb['make_backup_confirm_txt'] = 'You are about to start a manual backup process. Manual backups count towards the total number of allowed backup copies: therefore if the limit will be exceeded, then oldest backups may be deleted automatically. Proceed?'; +$wb['final_size_txt'] = 'Final download size may vary depending on selected compression format.'; $wb['yes_txt'] = 'Yes'; $wb['no_txt'] = 'No'; $wb['backup_is_encrypted_txt'] = 'Encrypted'; diff --git a/interface/web/sites/lib/lang/bg_web_backup_list.lng b/interface/web/sites/lib/lang/bg_web_backup_list.lng index 8f0d3a7469f807d706676c8581e3ea704584baec..0f19d9339ed75bcaaf730ee4b62bacc1cc70e4f9 100644 --- a/interface/web/sites/lib/lang/bg_web_backup_list.lng +++ b/interface/web/sites/lib/lang/bg_web_backup_list.lng @@ -30,6 +30,7 @@ $wb['manual_backup_title_txt'] = 'Manual backup'; $wb['make_backup_web_txt'] = 'Make backup of web files'; $wb['make_backup_database_txt'] = 'Make backup of databases'; $wb['make_backup_confirm_txt'] = 'You are about to start a manual backup process. Manual backups count towards the total number of allowed backup copies: therefore if the limit will be exceeded, then oldest backups may be deleted automatically. Proceed?'; +$wb['final_size_txt'] = 'Final download size may vary depending on selected compression format.'; $wb['yes_txt'] = 'Yes'; $wb['no_txt'] = 'No'; $wb['backup_is_encrypted_txt'] = 'Encrypted'; diff --git a/interface/web/sites/lib/lang/br_web_backup_list.lng b/interface/web/sites/lib/lang/br_web_backup_list.lng index 77580e3cc62b8df480a72db72c6c210c027063c4..f718769c44599ababccf1edde36c5aef2b05cf85 100644 --- a/interface/web/sites/lib/lang/br_web_backup_list.lng +++ b/interface/web/sites/lib/lang/br_web_backup_list.lng @@ -30,6 +30,7 @@ $wb['manual_backup_title_txt'] = 'Backup manual'; $wb['make_backup_web_txt'] = 'Criar backup dos arquivos Web'; $wb['make_backup_database_txt'] = 'Criar backup dos bancos de dados'; $wb['make_backup_confirm_txt'] = 'Você está prestes a iniciar um processo de backup manual. Os backups manuais contam para o número total de cópias de backup permitidas: portanto, se o limite for excedido, os backups mais antigos podem ser excluÃdos automaticamente. Continuar?'; +$wb['final_size_txt'] = 'O tamanho final do download pode variar dependendo do formato de compressão selecionado.'; $wb['yes_txt'] = 'Sim'; $wb['no_txt'] = 'Não'; $wb['backup_is_encrypted_txt'] = 'Criptografado'; diff --git a/interface/web/sites/lib/lang/ca_web_backup_list.lng b/interface/web/sites/lib/lang/ca_web_backup_list.lng index af33c311422dfc75d603491e7b66162a31168fb9..fbb0495a986d8d7f4588006f201443582adb7874 100644 --- a/interface/web/sites/lib/lang/ca_web_backup_list.lng +++ b/interface/web/sites/lib/lang/ca_web_backup_list.lng @@ -30,6 +30,7 @@ $wb['manual_backup_title_txt'] = 'Manual backup'; $wb['make_backup_web_txt'] = 'Make backup of web files'; $wb['make_backup_database_txt'] = 'Make backup of databases'; $wb['make_backup_confirm_txt'] = 'You are about to start a manual backup process. Manual backups count towards the total number of allowed backup copies: therefore if the limit will be exceeded, then oldest backups may be deleted automatically. Proceed?'; +$wb['final_size_txt'] = 'Final download size may vary depending on selected compression format.'; $wb['yes_txt'] = 'Yes'; $wb['no_txt'] = 'No'; $wb['backup_is_encrypted_txt'] = 'Encrypted'; diff --git a/interface/web/sites/lib/lang/cz_web_backup_list.lng b/interface/web/sites/lib/lang/cz_web_backup_list.lng index e6f80dac093d38de6d210d16190bff3ae811de7b..d06d69fa2df15fa62cadb2ccbc70fc05358d5c65 100644 --- a/interface/web/sites/lib/lang/cz_web_backup_list.lng +++ b/interface/web/sites/lib/lang/cz_web_backup_list.lng @@ -30,6 +30,7 @@ $wb['manual_backup_title_txt'] = 'RuÄnà zálohovánÃ'; $wb['make_backup_web_txt'] = 'VytvoÅ™it zálohu webových souborů'; $wb['make_backup_database_txt'] = 'VytvoÅ™it zálohu databázÃ'; $wb['make_backup_confirm_txt'] = 'Chystáte se zahájit proces ruÄnÃho zálohovánÃ. RuÄnà zálohy se zapoÄÃtávajà do celkového poÄtu povolených záložnÃch kopiÃ: proto pokud bude limit pÅ™ekroÄen, mohou být nejstaršà zálohy automaticky odstranÄ›ny. PokraÄovat ?'; +$wb['final_size_txt'] = 'KoneÄná velikost stahovánà se může liÅ¡it v závislosti na zvoleném kompresnÃm formátu.'; $wb['yes_txt'] = 'Ano'; $wb['no_txt'] = 'Ne'; $wb['backup_is_encrypted_txt'] = 'Å ifrované'; diff --git a/interface/web/sites/lib/lang/de_web_backup_list.lng b/interface/web/sites/lib/lang/de_web_backup_list.lng index 790156206ad075ce1f49c51b113bada9f9eb2d5c..11ebcd0645ecc950b456a31491325a58bad18682 100644 --- a/interface/web/sites/lib/lang/de_web_backup_list.lng +++ b/interface/web/sites/lib/lang/de_web_backup_list.lng @@ -30,6 +30,7 @@ $wb['manual_backup_title_txt'] = 'Manual backup'; $wb['make_backup_web_txt'] = 'Make backup of web files'; $wb['make_backup_database_txt'] = 'Make backup of databases'; $wb['make_backup_confirm_txt'] = 'You are about to start a manual backup process. Manual backups count towards the total number of allowed backup copies: therefore if the limit will be exceeded, then oldest backups may be deleted automatically. Proceed?'; +$wb['final_size_txt'] = 'Final download size may vary depending on selected compression format.'; $wb['yes_txt'] = 'Yes'; $wb['no_txt'] = 'No'; $wb['backup_is_encrypted_txt'] = 'Encrypted'; diff --git a/interface/web/sites/lib/lang/dk_web_backup_list.lng b/interface/web/sites/lib/lang/dk_web_backup_list.lng index ba5b7234f8426856ea2b70dcc40336a70b79849b..1529fa1a96d9bbef512bf9db216bfce598f601e9 100644 --- a/interface/web/sites/lib/lang/dk_web_backup_list.lng +++ b/interface/web/sites/lib/lang/dk_web_backup_list.lng @@ -30,6 +30,7 @@ $wb['manual_backup_title_txt'] = 'Manual backup'; $wb['make_backup_web_txt'] = 'Make backup of web files'; $wb['make_backup_database_txt'] = 'Make backup of databases'; $wb['make_backup_confirm_txt'] = 'You are about to start a manual backup process. Manual backups count towards the total number of allowed backup copies: therefore if the limit will be exceeded, then oldest backups may be deleted automatically. Proceed?'; +$wb['final_size_txt'] = 'Final download size may vary depending on selected compression format.'; $wb['yes_txt'] = 'Yes'; $wb['no_txt'] = 'No'; $wb['backup_is_encrypted_txt'] = 'Encrypted'; diff --git a/interface/web/sites/lib/lang/el_web_backup_list.lng b/interface/web/sites/lib/lang/el_web_backup_list.lng index 8f0d3a7469f807d706676c8581e3ea704584baec..0f19d9339ed75bcaaf730ee4b62bacc1cc70e4f9 100644 --- a/interface/web/sites/lib/lang/el_web_backup_list.lng +++ b/interface/web/sites/lib/lang/el_web_backup_list.lng @@ -30,6 +30,7 @@ $wb['manual_backup_title_txt'] = 'Manual backup'; $wb['make_backup_web_txt'] = 'Make backup of web files'; $wb['make_backup_database_txt'] = 'Make backup of databases'; $wb['make_backup_confirm_txt'] = 'You are about to start a manual backup process. Manual backups count towards the total number of allowed backup copies: therefore if the limit will be exceeded, then oldest backups may be deleted automatically. Proceed?'; +$wb['final_size_txt'] = 'Final download size may vary depending on selected compression format.'; $wb['yes_txt'] = 'Yes'; $wb['no_txt'] = 'No'; $wb['backup_is_encrypted_txt'] = 'Encrypted'; diff --git a/interface/web/sites/lib/lang/en_web_backup_list.lng b/interface/web/sites/lib/lang/en_web_backup_list.lng index f2cde7f216def69746314b2c67f2040e4f4044cf..571f3959b8fbf4ac53d8469d870e75ccf64d75a5 100644 --- a/interface/web/sites/lib/lang/en_web_backup_list.lng +++ b/interface/web/sites/lib/lang/en_web_backup_list.lng @@ -30,6 +30,7 @@ $wb['manual_backup_title_txt'] = 'Manual backup'; $wb['make_backup_web_txt'] = 'Make backup of web files'; $wb['make_backup_database_txt'] = 'Make backup of databases'; $wb['make_backup_confirm_txt'] = 'You are about to start a manual backup process. Manual backups count towards the total number of allowed backup copies: therefore if the limit will be exceeded, then oldest backups may be deleted automatically. Proceed?'; +$wb['final_size_txt'] = 'Final download size may vary depending on selected compression format.'; $wb['yes_txt'] = 'Yes'; $wb['no_txt'] = 'No'; $wb['backup_is_encrypted_txt'] = 'Encrypted'; diff --git a/interface/web/sites/lib/lang/es_web_backup_list.lng b/interface/web/sites/lib/lang/es_web_backup_list.lng index 61a7e83cb1c2bdc63308c1aa968facd26eeab4f8..fb8a547202bc615ab70d7c69e46a193df5f03a05 100644 --- a/interface/web/sites/lib/lang/es_web_backup_list.lng +++ b/interface/web/sites/lib/lang/es_web_backup_list.lng @@ -30,6 +30,7 @@ $wb['manual_backup_title_txt'] = 'Manual backup'; $wb['make_backup_web_txt'] = 'Make backup of web files'; $wb['make_backup_database_txt'] = 'Make backup of databases'; $wb['make_backup_confirm_txt'] = 'You are about to start a manual backup process. Manual backups count towards the total number of allowed backup copies: therefore if the limit will be exceeded, then oldest backups may be deleted automatically. Proceed?'; +$wb['final_size_txt'] = 'Final download size may vary depending on selected compression format.'; $wb['yes_txt'] = 'Yes'; $wb['no_txt'] = 'No'; $wb['backup_is_encrypted_txt'] = 'Encrypted'; diff --git a/interface/web/sites/lib/lang/fi_web_backup_list.lng b/interface/web/sites/lib/lang/fi_web_backup_list.lng index 8f0d3a7469f807d706676c8581e3ea704584baec..0f19d9339ed75bcaaf730ee4b62bacc1cc70e4f9 100644 --- a/interface/web/sites/lib/lang/fi_web_backup_list.lng +++ b/interface/web/sites/lib/lang/fi_web_backup_list.lng @@ -30,6 +30,7 @@ $wb['manual_backup_title_txt'] = 'Manual backup'; $wb['make_backup_web_txt'] = 'Make backup of web files'; $wb['make_backup_database_txt'] = 'Make backup of databases'; $wb['make_backup_confirm_txt'] = 'You are about to start a manual backup process. Manual backups count towards the total number of allowed backup copies: therefore if the limit will be exceeded, then oldest backups may be deleted automatically. Proceed?'; +$wb['final_size_txt'] = 'Final download size may vary depending on selected compression format.'; $wb['yes_txt'] = 'Yes'; $wb['no_txt'] = 'No'; $wb['backup_is_encrypted_txt'] = 'Encrypted'; diff --git a/interface/web/sites/lib/lang/fr_web_backup_list.lng b/interface/web/sites/lib/lang/fr_web_backup_list.lng index 1c3bd84662408614ce432caa71cf7bed1766f459..49da9188a10397bd2b45f41840dcf89690ce21ef 100644 --- a/interface/web/sites/lib/lang/fr_web_backup_list.lng +++ b/interface/web/sites/lib/lang/fr_web_backup_list.lng @@ -30,6 +30,7 @@ $wb['manual_backup_title_txt'] = 'Manual backup'; $wb['make_backup_web_txt'] = 'Make backup of web files'; $wb['make_backup_database_txt'] = 'Make backup of databases'; $wb['make_backup_confirm_txt'] = 'You are about to start a manual backup process. Manual backups count towards the total number of allowed backup copies: therefore if the limit will be exceeded, then oldest backups may be deleted automatically. Proceed?'; +$wb['final_size_txt'] = 'Final download size may vary depending on selected compression format.'; $wb['yes_txt'] = 'Yes'; $wb['no_txt'] = 'No'; $wb['backup_is_encrypted_txt'] = 'Encrypted'; diff --git a/interface/web/sites/lib/lang/hr_web_backup_list.lng b/interface/web/sites/lib/lang/hr_web_backup_list.lng index 8f0d3a7469f807d706676c8581e3ea704584baec..0f19d9339ed75bcaaf730ee4b62bacc1cc70e4f9 100644 --- a/interface/web/sites/lib/lang/hr_web_backup_list.lng +++ b/interface/web/sites/lib/lang/hr_web_backup_list.lng @@ -30,6 +30,7 @@ $wb['manual_backup_title_txt'] = 'Manual backup'; $wb['make_backup_web_txt'] = 'Make backup of web files'; $wb['make_backup_database_txt'] = 'Make backup of databases'; $wb['make_backup_confirm_txt'] = 'You are about to start a manual backup process. Manual backups count towards the total number of allowed backup copies: therefore if the limit will be exceeded, then oldest backups may be deleted automatically. Proceed?'; +$wb['final_size_txt'] = 'Final download size may vary depending on selected compression format.'; $wb['yes_txt'] = 'Yes'; $wb['no_txt'] = 'No'; $wb['backup_is_encrypted_txt'] = 'Encrypted'; diff --git a/interface/web/sites/lib/lang/hu_web_backup_list.lng b/interface/web/sites/lib/lang/hu_web_backup_list.lng index 8f0d3a7469f807d706676c8581e3ea704584baec..0f19d9339ed75bcaaf730ee4b62bacc1cc70e4f9 100644 --- a/interface/web/sites/lib/lang/hu_web_backup_list.lng +++ b/interface/web/sites/lib/lang/hu_web_backup_list.lng @@ -30,6 +30,7 @@ $wb['manual_backup_title_txt'] = 'Manual backup'; $wb['make_backup_web_txt'] = 'Make backup of web files'; $wb['make_backup_database_txt'] = 'Make backup of databases'; $wb['make_backup_confirm_txt'] = 'You are about to start a manual backup process. Manual backups count towards the total number of allowed backup copies: therefore if the limit will be exceeded, then oldest backups may be deleted automatically. Proceed?'; +$wb['final_size_txt'] = 'Final download size may vary depending on selected compression format.'; $wb['yes_txt'] = 'Yes'; $wb['no_txt'] = 'No'; $wb['backup_is_encrypted_txt'] = 'Encrypted'; diff --git a/interface/web/sites/lib/lang/id_web_backup_list.lng b/interface/web/sites/lib/lang/id_web_backup_list.lng index 8f0d3a7469f807d706676c8581e3ea704584baec..0f19d9339ed75bcaaf730ee4b62bacc1cc70e4f9 100644 --- a/interface/web/sites/lib/lang/id_web_backup_list.lng +++ b/interface/web/sites/lib/lang/id_web_backup_list.lng @@ -30,6 +30,7 @@ $wb['manual_backup_title_txt'] = 'Manual backup'; $wb['make_backup_web_txt'] = 'Make backup of web files'; $wb['make_backup_database_txt'] = 'Make backup of databases'; $wb['make_backup_confirm_txt'] = 'You are about to start a manual backup process. Manual backups count towards the total number of allowed backup copies: therefore if the limit will be exceeded, then oldest backups may be deleted automatically. Proceed?'; +$wb['final_size_txt'] = 'Final download size may vary depending on selected compression format.'; $wb['yes_txt'] = 'Yes'; $wb['no_txt'] = 'No'; $wb['backup_is_encrypted_txt'] = 'Encrypted'; diff --git a/interface/web/sites/lib/lang/it_aps.lng b/interface/web/sites/lib/lang/it_aps.lng index 0a6365f98f2b1eee54e80e88d6b59223347ca661..b075afda16dd47621d3c6287e92cae276a4d4d61 100644 --- a/interface/web/sites/lib/lang/it_aps.lng +++ b/interface/web/sites/lib/lang/it_aps.lng @@ -35,7 +35,7 @@ $wb['package_settings_txt'] = 'Impostazioni Pacchetto'; $wb['error_main_domain'] = 'Il dominio del percorso di installazione è errato.'; $wb['error_no_main_location'] = 'Hai fornito un percorso di installazione non valido.'; $wb['error_inv_main_location'] = 'La cartella di installazione fornita non è valida.'; -$wb['error_license_agreement'] = 'Per poter proseguire è necessario che prendi visione ed accetti l accordi di licenza.'; +$wb['error_license_agreement'] = 'Per poter proseguire è necessario che prendi visione ed accetti gli accordi di licenza.'; $wb['error_no_database_pw'] = 'La password fornita non è valida.'; $wb['error_short_database_pw'] = 'Per favore scegli una password di database più lunga.'; $wb['error_no_value_for'] = 'Il campo \\"%s\\" non può essere vuoto.'; @@ -45,8 +45,8 @@ $wb['error_inv_value_for'] = 'Hai inserito un valore non valido per il campo \\" $wb['error_inv_email_for'] = 'Hai inserito un indirizzo email non valido per il campo \\"%s\\".'; $wb['error_inv_domain_for'] = 'Hai inserito un dominio non valido per il campo \\"%s\\".'; $wb['error_inv_integer_for'] = 'Hai inserito un numero non valido per il campo \\"%s\\".'; -$wb['error_inv_float_for'] = 'Hai inserito un numero di floating point non valido per il campo \\"%s\\".'; -$wb['error_used_location'] = 'L installazione della patch contiene già un pacchetto di installazione.'; +$wb['error_inv_float_for'] = 'Hai inserito un numero decimale non valido per il campo \\"%s\\".'; +$wb['error_used_location'] = 'L\'installazione della patch contiene già un pacchetto di installazione.'; $wb['installation_task_txt'] = 'Installazione pianificata'; $wb['installation_error_txt'] = 'Errore di installazione'; $wb['installation_success_txt'] = 'Installato'; @@ -54,7 +54,7 @@ $wb['installation_remove_txt'] = 'Rimozione pianificata'; $wb['packagelist_update_finished_txt'] = 'Elenco aggiornamenti APS terminato.'; $wb['btn_install_txt'] = 'Installa'; $wb['btn_cancel_txt'] = 'Annulla'; -$wb['limit_aps_txt'] = 'Nmero massimo di istanza APS raggiunto per il tuo account.'; +$wb['limit_aps_txt'] = 'Nmero massimo di istanza APS raggiunto per il tuo profilo.'; $wb['generate_password_txt'] = 'Genera Password'; $wb['repeat_password_txt'] = 'Ripeti Password'; $wb['password_mismatch_txt'] = 'Le password non coincidono.'; diff --git a/interface/web/sites/lib/lang/it_backup_stats_list.lng b/interface/web/sites/lib/lang/it_backup_stats_list.lng index 65792aa591054d676f942164b40a0c7c3696825c..34645126a3be92d1e7a45970e34082a426d3871f 100644 --- a/interface/web/sites/lib/lang/it_backup_stats_list.lng +++ b/interface/web/sites/lib/lang/it_backup_stats_list.lng @@ -1,10 +1,10 @@ <?php -$wb['list_head_txt'] = 'Backup Stats'; +$wb['list_head_txt'] = 'Backup Statistiche'; $wb['database_name_txt'] = ''; -$wb['active_txt'] = 'Active'; -$wb['domain_txt'] = 'Domain'; -$wb['backup_count_txt'] = 'Backup count'; +$wb['active_txt'] = 'Attivo'; +$wb['domain_txt'] = 'Dominio'; +$wb['backup_count_txt'] = 'Numero di Backup'; $wb['backup_server_txt'] = 'Server'; -$wb['backup_interval_txt'] = 'Interval / cnt.'; -$wb['backup_size_txt'] = 'Backupsize'; +$wb['backup_interval_txt'] = 'Intervallo / cnt.'; +$wb['backup_size_txt'] = 'Dimensione Backup'; ?> diff --git a/interface/web/sites/lib/lang/it_cron.lng b/interface/web/sites/lib/lang/it_cron.lng index 1ecf489fe6fed6713e8a05b8af201cb8c056a784..ee38450186d2b0fcc92669cf560f27986c89f86e 100644 --- a/interface/web/sites/lib/lang/it_cron.lng +++ b/interface/web/sites/lib/lang/it_cron.lng @@ -1,6 +1,6 @@ <?php $wb['server_id_txt'] = 'Server'; -$wb['parent_domain_id_txt'] = 'Parent website'; +$wb['parent_domain_id_txt'] = 'Sito Web genitore'; $wb['active_txt'] = 'Attivo'; $wb['client_txt'] = 'Cliente'; $wb['run_min_txt'] = 'Minuti'; @@ -8,7 +8,7 @@ $wb['run_hour_txt'] = 'Ore'; $wb['run_mday_txt'] = 'Giorni del mese'; $wb['run_month_txt'] = 'Mesi'; $wb['run_wday_txt'] = 'Giorni della settimana'; -$wb['command_txt'] = 'Comando da lanciare(comandi eseguiti via sh, urls via wget)'; +$wb['command_txt'] = 'Comando da lanciare (comandi eseguiti via sh, urls via wget)'; $wb['limit_cron_txt'] = 'Hai raggiunto il numero massimo di cron jobs.'; $wb['limit_cron_frequency_txt'] = 'La frequenza del cron job supera il limite consentito.'; $wb['run_min_error_format'] = 'Formato non valido per minuti.'; @@ -21,6 +21,6 @@ $wb['unknown_fieldtype_error'] = 'Campo sconosciuto.'; $wb['server_id_error_empty'] = 'Server ID vuoto.'; $wb['limit_cron_url_txt'] = 'Solo URL cron. Per cortesia inserire una URL che inizi con https:// come comando cron.'; $wb['command_error_empty'] = 'Command vuoto.'; -$wb['command_hint_txt'] = 'e.g. /var/www/clients/clientX/webY/myscript.sh or https://www.mydomain.com/path/script.php, you can use [web_root] placeholder that is replaced by /var/www/clients/clientX/webY/web.'; +$wb['command_hint_txt'] = 'esempio: /var/www/clients/clientX/webY/myscript.sh o https://www.mydomain.com/path/script.php, puoi usare [web_root] come sostitutivo che viene rimpiazzato da /var/www/clients/clientX/webY/web.'; $wb['log_output_txt'] = 'Log output'; ?> diff --git a/interface/web/sites/lib/lang/it_database.lng b/interface/web/sites/lib/lang/it_database.lng index 007daaa00235c329cb627d15acb61dfb60e8a7ce..ba9be340915fc9313dc302ce08c5bd1f7df14fb4 100644 --- a/interface/web/sites/lib/lang/it_database.lng +++ b/interface/web/sites/lib/lang/it_database.lng @@ -10,7 +10,7 @@ $wb['remote_access_txt'] = 'Accesso remoto'; $wb['client_txt'] = 'Cliente'; $wb['active_txt'] = 'Attivo'; $wb['database_name_error_empty'] = 'Il nome database è vuoto.'; -$wb['database_name_error_unique'] = 'Esiste già un nome di database con questo nome sul server. Per ottenere un nome unico, ad esempio. preponi il nome del tuo dominio al nome di database.'; +$wb['database_name_error_unique'] = 'Esiste già un database con questo nome sul server. Per ottenere un nome unico, ad esempio, preponi il nome del tuo dominio al nome di database.'; $wb['database_name_error_regex'] = 'Nome database non valido. Il nome database può contenere i seguenti caratteri: a-z, A-Z, 0-9 e underscore. Lungheezza: 2 - 64 caratteri.'; $wb['database_user_error_empty'] = 'Utente Database vuoto.'; $wb['database_user_error_unique'] = 'Esiste già un utente di database con questo nome sul server. Per ottenere un nome unico, ad esempio. preponi il nome del tuo dominio al nome utente.'; @@ -18,7 +18,7 @@ $wb['database_user_error_regex'] = 'Nome utente database non valido. Il nome ute $wb['limit_database_txt'] = 'Numero massimo di databases raggiunto.'; $wb['database_name_change_txt'] = 'Il nome di database non può essere modificato'; $wb['database_charset_change_txt'] = 'Il charset per il database non può essere modificato'; -$wb['remote_ips_txt'] = 'Accesso IP remoti(separa con , e lascia campo vuoto per <i>qualunque</i>)'; +$wb['remote_ips_txt'] = 'Accesso IP remoti (separa con , e lascia campo vuoto per <i>qualunque</i>)'; $wb['database_remote_error_ips'] = 'Almeno uno degli indirizzi IP inseriti non è valido.'; $wb['database_name_error_len'] = 'Nome Database - {db} - troppo lungo. La lunghezza massima compreso il prefisso è di 64 caratteri.'; $wb['database_user_error_len'] = 'Nome utente Database - {user}- troppo lungo. La lunghezza massima compreso il prefisso è di 16 caratteri.'; @@ -33,7 +33,7 @@ $wb['password_mismatch_txt'] = 'Le password non coincidono.'; $wb['password_match_txt'] = 'Le password coincidono.'; $wb['globalsearch_resultslimit_of_txt'] = 'di'; $wb['globalsearch_resultslimit_results_txt'] = 'risultati'; -$wb['globalsearch_noresults_text_txt'] = 'Nesuun risultato.'; +$wb['globalsearch_noresults_text_txt'] = 'Nessun risultato.'; $wb['globalsearch_noresults_limit_txt'] = '0 risultati'; $wb['globalsearch_searchfield_watermark_txt'] = 'Cerca'; $wb['globalsearch_suggestions_text_txt'] = 'Suggerimenti'; @@ -41,10 +41,10 @@ $wb['database_ro_user_txt'] = 'Utente database di sola lettura'; $wb['optional_txt'] = 'opzionale'; $wb['select_dbuser_txt'] = 'Seleziona utente database'; $wb['no_dbuser_txt'] = 'Nessuno'; -$wb['database_client_differs_txt'] = 'Il cliente del sito parent e il database non coincidono.'; +$wb['database_client_differs_txt'] = 'Il cliente del sito genitore e il database non coincidono.'; $wb['database_user_missing_txt'] = 'Per favore selezionare un utente per questo database.'; $wb['limit_database_quota_txt'] = 'Database quota'; -$wb['limit_database_quota_error_notint'] = 'The database quota limit must be a number.'; -$wb['limit_database_quota_free_txt'] = 'Max. available DB quota '; -$wb['limit_database_quota_not_0_txt']= 'Database quota can not be 0'; +$wb['limit_database_quota_error_notint'] = 'La quota del database deve essere un numero positivo.'; +$wb['limit_database_quota_free_txt'] = 'Quota DB disponibile '; +$wb['limit_database_quota_not_0_txt'] = 'La quota Database non può essere 0'; ?> diff --git a/interface/web/sites/lib/lang/it_database_list.lng b/interface/web/sites/lib/lang/it_database_list.lng index 09abd791bb7928cccf7ecde5980ec40d2917dcbe..f4288fc2969c6c7fba7efe3450b91cd7d30a018a 100644 --- a/interface/web/sites/lib/lang/it_database_list.lng +++ b/interface/web/sites/lib/lang/it_database_list.lng @@ -7,5 +7,5 @@ $wb['database_name_txt'] = 'Nome Database'; $wb['add_new_record_txt'] = 'Aggiungi nuovo Database'; $wb['database_user_txt'] = 'Utente Database'; $wb['parent_domain_id_txt'] = 'Sito Web'; -$wb['type_txt'] = 'Type'; +$wb['type_txt'] = 'Tipo'; ?> diff --git a/interface/web/sites/lib/lang/it_database_quota_stats_list.lng b/interface/web/sites/lib/lang/it_database_quota_stats_list.lng index 50f2dcc496d1140a77dce8a25c7ee0a38fe1e277..21a2220e7f1cbb1244e1f589093794c33d6f694c 100644 --- a/interface/web/sites/lib/lang/it_database_quota_stats_list.lng +++ b/interface/web/sites/lib/lang/it_database_quota_stats_list.lng @@ -2,8 +2,8 @@ $wb['database_txt'] = 'Database'; $wb['server_name_txt'] = 'Server'; $wb['client_txt'] = 'Client'; -$wb['used_txt'] = 'Used space'; +$wb['used_txt'] = 'Spazio usato'; $wb['quota_txt'] = 'Quota'; -$wb['percentage_txt'] = 'Used in %'; +$wb['percentage_txt'] = 'Usato in %'; $wb['list_head_txt'] = 'Database Quota'; ?> diff --git a/interface/web/sites/lib/lang/it_database_user.lng b/interface/web/sites/lib/lang/it_database_user.lng index c0cb43b9d5bcdaa6a674413fa090785984d11cc1..c7692d686a516c3e724421c3dc16fdbd6313a1e5 100644 --- a/interface/web/sites/lib/lang/it_database_user.lng +++ b/interface/web/sites/lib/lang/it_database_user.lng @@ -15,11 +15,11 @@ $wb['repeat_password_txt'] = 'Ripeti Password'; $wb['password_mismatch_txt'] = 'Le password non coincidono.'; $wb['password_match_txt'] = 'Le password coincidono.'; $wb['globalsearch_resultslimit_of_txt'] = 'of'; -$wb['globalsearch_resultslimit_results_txt'] = 'results'; -$wb['globalsearch_noresults_text_txt'] = 'Nessun results.'; -$wb['globalsearch_noresults_limit_txt'] = '0 results'; +$wb['globalsearch_resultslimit_results_txt'] = 'risultati'; +$wb['globalsearch_noresults_text_txt'] = 'Nessun risultato.'; +$wb['globalsearch_noresults_limit_txt'] = '0 risultati'; $wb['globalsearch_searchfield_watermark_txt'] = 'Cerca'; $wb['globalsearch_suggestions_text_txt'] = 'Suggerimenti'; -$wb['limit_database_user_txt'] = 'The max. number of database users is reached.'; -$wb['database_password_error_empty'] = 'Database password is empty.'; +$wb['limit_database_user_txt'] = 'Hai raggiunto il numero massimo di utenti database.'; +$wb['database_password_error_empty'] = 'La password del Database è vuota.'; ?> diff --git a/interface/web/sites/lib/lang/it_ftp_sites_stats_list.lng b/interface/web/sites/lib/lang/it_ftp_sites_stats_list.lng index e44025a715dbf435bdca9faee0b109ba25bf611d..e62f81b42966427d76c94948d441fc042ec561c4 100644 --- a/interface/web/sites/lib/lang/it_ftp_sites_stats_list.lng +++ b/interface/web/sites/lib/lang/it_ftp_sites_stats_list.lng @@ -1,10 +1,10 @@ <?php -$wb['list_head_txt'] = 'FTP traffic'; -$wb['domain_txt'] = 'Domain'; -$wb['this_month_txt'] = 'This month'; -$wb['last_month_txt'] = 'Last month'; -$wb['this_year_txt'] = 'This year'; -$wb['last_year_txt'] = 'Last year'; +$wb['list_head_txt'] = 'Traffico FTP'; +$wb['domain_txt'] = 'Dominio'; +$wb['this_month_txt'] = 'Questo mese'; +$wb['last_month_txt'] = 'Mese scorso'; +$wb['this_year_txt'] = 'Questo anno'; +$wb['last_year_txt'] = 'Anno scorso'; $wb['sum_txt'] = 'Sum (Download + Upload)'; $wb['in_out_txt'] = 'DL/UL'; ?> diff --git a/interface/web/sites/lib/lang/it_ftp_user.lng b/interface/web/sites/lib/lang/it_ftp_user.lng index 36b068335b0e67dcd7bd927226015b92ab8221f3..0a254471c5733470f1713871a887f01a7315a90b 100644 --- a/interface/web/sites/lib/lang/it_ftp_user.lng +++ b/interface/web/sites/lib/lang/it_ftp_user.lng @@ -2,7 +2,7 @@ $wb['uid_txt'] = 'UID'; $wb['gid_txt'] = 'GID'; $wb['dir_txt'] = 'Cartella'; -$wb['quota_files_txt'] = 'Filequota'; +$wb['quota_files_txt'] = 'Quota file'; $wb['ul_ratio_txt'] = 'Uploadratio'; $wb['dl_ratio_txt'] = 'Downloadratio'; $wb['ul_bandwidth_txt'] = 'Banda Upload'; @@ -14,11 +14,11 @@ $wb['password_txt'] = 'Password'; $wb['password_strength_txt'] = 'Livello sicurezza Password'; $wb['quota_size_txt'] = 'Quota Spazio Disco'; $wb['active_txt'] = 'Attivo'; -$wb['limit_ftp_user_txt'] = 'Hai raggiunto il numero masslimo consentito di utenti FTP per il tuo account.'; -$wb['username_error_empty'] = 'Nome utente vuoto.'; +$wb['limit_ftp_user_txt'] = 'Hai raggiunto il numero masslimo consentito di utenti FTP per il tuo profilo.'; +$wb['username_error_empty'] = 'Nome utente vuoto.'; $wb['username_error_unique'] = 'Nome utente deve essere unico.'; $wb['username_error_regex'] = 'Il nome utente contiene dei carateri che non sono ammessi.'; -$wb['quota_size_error_empty'] = 'Quota vuoto.'; +$wb['quota_size_error_empty'] = 'Quota vuoto.'; $wb['uid_error_empty'] = 'GID vuoto.'; $wb['directory_error_empty'] = 'Directory vuoto.'; $wb['quota_files_unity_txt'] = 'Files'; @@ -31,5 +31,5 @@ $wb['generate_password_txt'] = 'Genera Password'; $wb['repeat_password_txt'] = 'Ripeti Password'; $wb['password_mismatch_txt'] = 'Le password non coincidono.'; $wb['password_match_txt'] = 'Le password coincidono.'; -$wb['expires_txt'] = 'Expire at'; +$wb['expires_txt'] = 'Scade il'; ?> diff --git a/interface/web/sites/lib/lang/it_shell_user.lng b/interface/web/sites/lib/lang/it_shell_user.lng index 53af373542e1aef7e5ceb4b476cfefda4d708d1f..a5fcf7e39be90269695ae8cfb825221aa5e6176b 100644 --- a/interface/web/sites/lib/lang/it_shell_user.lng +++ b/interface/web/sites/lib/lang/it_shell_user.lng @@ -12,25 +12,25 @@ $wb['active_txt'] = 'Attivo'; $wb['username_error_empty'] = 'Username vuoto.'; $wb['username_error_unique'] = 'Il nome utente deve essere unico.'; $wb['username_error_regex'] = 'Nome utente contiene caratteri non autorizzati.'; -$wb['quota_size_error_empty'] = 'Valore Quota vuoto.'; +$wb['quota_size_error_empty'] = 'Valore Quota vuoto.'; $wb['uid_error_empty'] = 'GID vuoto.'; $wb['directory_error_empty'] = 'Valore direttrice vuoto.'; $wb['limit_shell_user_txt'] = 'Numero massimo utenti shell raggiunto.'; $wb['parent_domain_id_error_empty'] = 'Nessun sito selezionato.'; $wb['puser_txt'] = 'Nome utente web'; $wb['pgroup_txt'] = 'Gruppo web'; -$wb['ssh_rsa_txt'] = 'SSH-RSA Public Key (for key-based logins)'; -$wb['dir_dot_error'] = 'Nessun .. consentito nel percorso.'; -$wb['dir_slashdot_error'] = 'Nessun ./ consentito nel percorso.'; +$wb['ssh_rsa_txt'] = 'SSH-Chiave RSA Pubblica (per login basati su chiave)'; +$wb['dir_dot_error'] = 'Non è consentito .. nel percorso.'; +$wb['dir_slashdot_error'] = 'Non è consentito ./ nel percorso.'; $wb['generate_password_txt'] = 'Genera Password'; $wb['repeat_password_txt'] = 'Ripeti Password'; $wb['password_mismatch_txt'] = 'Le password non coincidono.'; $wb['password_match_txt'] = 'Le password coincidono.'; $wb['username_must_not_exceed_32_chars_txt'] = 'il nome utente non deve superare i 32 caratteri.'; -$wb['username_not_allowed_txt'] = 'L utente non è autorizzato.'; +$wb['username_not_allowed_txt'] = 'L\'utente non è autorizzato.'; $wb['invalid_system_user_or_group_txt'] = 'Utenti di sistema o gruppo non valido'; -$wb['directory_error_regex'] = 'Direttrice non valida'; +$wb['directory_error_regex'] = 'Percorso cartelle non valida'; $wb['shell_error_regex'] = 'shell non valida'; $wb['invalid_username_txt'] = 'Nome utente non valido'; -$wb['directory_error_notinweb'] = 'La direttrice deve essere all interno della direttrice del sito .'; +$wb['directory_error_notinweb'] = 'La cartella deve essere all\'interno della cartella del sito .'; ?> diff --git a/interface/web/sites/lib/lang/it_web_aliasdomain.lng b/interface/web/sites/lib/lang/it_web_aliasdomain.lng index ee30db96a0df1812ca80d4efcc92bf3817591263..7ef46f8554b487836cdd5d525a00bdc9b68c8fc3 100644 --- a/interface/web/sites/lib/lang/it_web_aliasdomain.lng +++ b/interface/web/sites/lib/lang/it_web_aliasdomain.lng @@ -5,24 +5,24 @@ $wb['backup_copies_txt'] = 'Numero copie di backup'; $wb['ssl_state_txt'] = 'Stato'; $wb['ssl_locality_txt'] = 'Paese'; $wb['ssl_organisation_txt'] = 'Nome Organizzazione'; -$wb['ssl_organisation_unit_txt'] = 'Nome Unità di organizzazione'; +$wb['ssl_organisation_unit_txt'] = 'Nome Reparto'; $wb['ssl_country_txt'] = 'Città '; -$wb['ssl_key_txt'] = 'SSL Key'; +$wb['ssl_key_txt'] = 'Chiav eSSL'; $wb['ssl_request_txt'] = 'SSL Richiesta'; $wb['ssl_cert_txt'] = 'SSL Certificato'; $wb['ssl_bundle_txt'] = 'SSL Bundle'; -$wb['ssl_action_txt'] = 'SSL Action'; +$wb['ssl_action_txt'] = 'Azione SSL'; $wb['ssl_domain_txt'] = 'SSL Domain'; $wb['server_id_txt'] = 'Server'; $wb['web_folder_error_regex'] = 'Percorso inserito non valido. Non inserire slash.'; $wb['type_txt'] = 'Tipo'; -$wb['parent_domain_id_txt'] = 'Sito Parent'; -$wb['redirect_type_txt'] = 'Tipo di Redirect'; -$wb['r_redirect_txt'] = 'R (Temporary redirect)'; -$wb['l_redirect_txt'] = 'L (Last redirect rule)'; -$wb['r_l_redirect_txt'] = 'R,L (Temporary redirect + last rule)'; -$wb['r_301_l_redirect_txt'] = 'R=301,L (Permanent redirect + last rule)'; -$wb['redirect_path_txt'] = 'Redirect Path'; +$wb['parent_domain_id_txt'] = 'Sito genitore'; +$wb['redirect_type_txt'] = 'Tipo di reindirizzamento'; +$wb['r_redirect_txt'] = 'R (Reindirizzamento temporaneo)'; +$wb['l_redirect_txt'] = 'L (Ultima regola di reindirizzamento)'; +$wb['r_l_redirect_txt'] = 'R,L (Reindirizzamento temporaneo + ultima regola)'; +$wb['r_301_l_redirect_txt'] = 'R=301,L (Reindirizzamento Permanente + ultima regola)'; +$wb['redirect_path_txt'] = 'Percorso di reindirizzamento'; $wb['active_txt'] = 'Attivo'; $wb['document_root_txt'] = 'Cartella del sito'; $wb['system_user_txt'] = 'Utente Linux'; @@ -40,20 +40,20 @@ $wb['ssl_txt'] = 'SSL'; $wb['suexec_txt'] = 'SuEXEC'; $wb['php_txt'] = 'PHP'; $wb['client_txt'] = 'Cliente'; -$wb['limit_web_domain_txt'] = 'Numero massimo domini per il tuo account raggiunti.'; -$wb['limit_web_aliasdomain_txt'] = 'Numero massimo domini alias per il tuo account è stato raggiunto.'; -$wb['limit_web_subdomain_txt'] = 'Numero massimo sottodomini per il tuo account raggiunto.'; -$wb['apache_directives_txt'] = 'Apache Direttive'; -$wb['domain_error_empty'] = 'Domain vuoto.'; +$wb['limit_web_domain_txt'] = 'Hai raggiunto il numero massimo domini per il tuo profilo.'; +$wb['limit_web_aliasdomain_txt'] = 'Il numero massimo domini alias per il tuo profilo è stato raggiunto.'; +$wb['limit_web_subdomain_txt'] = 'Il numero massimo sottodomini per il tuo profilo raggiunto.'; +$wb['apache_directives_txt'] = 'Direttive Apache'; +$wb['domain_error_empty'] = 'Domain vuoto.'; $wb['domain_error_unique'] = 'Esiste già un sito o sottodominio / domino alias con questo nome dominio.'; $wb['domain_error_regex'] = 'Nome dominio non valido.'; $wb['domain_error_autosub'] = 'Impostazioni di sottodominio esistenti.'; -$wb['hd_quota_error_empty'] = 'Harddisk quota 0 o vuoto.'; -$wb['traffic_quota_error_empty'] = 'Campo Quota Traffico vuoto.'; -$wb['error_ssl_state_empty'] = 'SSL State vuoto.'; +$wb['hd_quota_error_empty'] = 'quota disco 0 o vuoto.'; +$wb['traffic_quota_error_empty'] = 'Campo Quota Traffico vuoto.'; +$wb['error_ssl_state_empty'] = 'SSL Stato vuoto.'; $wb['error_ssl_locality_empty'] = 'SSL Paese vuoto.'; -$wb['error_ssl_organisation_empty'] = 'SSL Organizzazione vuoto.'; -$wb['error_ssl_organisation_unit_empty'] = 'SSL Organisation Unit vuoto.'; +$wb['error_ssl_organisation_empty'] = 'SSL Organizzazione vuoto.'; +$wb['error_ssl_organisation_unit_empty'] = 'SSL Reparto vuoto.'; $wb['error_ssl_country_empty'] = 'SSL Città vuoto.'; $wb['error_ssl_cert_empty'] = 'SSL Certificato vuoto'; $wb['client_group_id_txt'] = 'Cliente'; @@ -61,10 +61,10 @@ $wb['stats_password_txt'] = 'Impostare password accesso a Statistiche Web'; $wb['allow_override_txt'] = 'Apache AllowOverride'; $wb['limit_web_quota_free_txt'] = 'Quota disco massima disponibile'; $wb['ssl_state_error_regex'] = 'Campo Stato SSL non valido.Valori accettati: a-z, 0-9 e .,-_'; -$wb['ssl_locality_error_regex'] = 'Campo SSL Locality non valido.. Caratteri ammessi: a-z, 0-9 e .,-_'; -$wb['ssl_organisation_error_regex'] = 'Campo SSL Organisation non valido.. Caratteri ammessi: a-z, 0-9 e .,-_'; -$wb['ssl_organistaion_unit_error_regex'] = 'Campo SSL Organisation Unit. Caratteri ammessi: a-z, 0-9 e .,-_'; -$wb['ssl_country_error_regex'] = 'Campo SSL Country. Valid characters are: A-Z'; +$wb['ssl_locality_error_regex'] = 'Campo SSL Località non valido.. Caratteri ammessi: a-z, 0-9 e .,-_'; +$wb['ssl_organisation_error_regex'] = 'Campo SSL Organizzazione non valido.. Caratteri ammessi: a-z, 0-9 e .,-_'; +$wb['ssl_organistaion_unit_error_regex'] = 'Campo SSL Reparto. Caratteri ammessi: a-z, 0-9 e .,-_'; +$wb['ssl_country_error_regex'] = 'Campo SSL Paese. Caratteri ammessi: A-Z'; $wb['limit_traffic_quota_free_txt'] = 'Quota Traffico massimo disponibile'; $wb['redirect_error_regex'] = 'Percorso reinderizzamento non valido. Percorsi di redirect sono ad esempio: /test/ or https://www.domain.tld/test/'; $wb['php_open_basedir_txt'] = 'PHP open_basedir'; @@ -77,7 +77,7 @@ $wb['disabled_txt'] = 'Disabilitato '; $wb['no_redirect_txt'] = 'Nessun redirect'; $wb['no_flag_txt'] = 'Nessun flag'; $wb['save_certificate_txt'] = 'Salva certificato'; -$wb['create_certificate_txt'] = 'Crea certificato'; +$wb['create_certificate_txt'] = 'Crea certificato'; $wb['delete_certificate_txt'] = 'Elimina certificato'; $wb['nginx_directives_txt'] = 'nginx Direttive'; $wb['seo_redirect_txt'] = 'Reinderizzamento SEO'; @@ -91,7 +91,7 @@ $wb['pm_max_children_txt'] = 'PHP-FPM pm.max_children'; $wb['pm_start_servers_txt'] = 'PHP-FPM pm.start_servers'; $wb['pm_min_spare_servers_txt'] = 'PHP-FPM pm.min_spare_servers'; $wb['pm_max_spare_servers_txt'] = 'PHP-FPM pm.max_spare_servers'; -$wb['error_php_fpm_pm_settings_txt'] = 'I valori per PHP-FPM pm devono essere i seguenti: pm.max_children >= pm.max_spare_servers >= pm.start_servers >= pm.min_spare_servers > 0'; +$wb['error_php_fpm_pm_settings_txt'] = 'I valori per PHP-FPM pm devono soddisfare: pm.max_children >= pm.max_spare_servers >= pm.start_servers >= pm.min_spare_servers > 0'; $wb['pm_max_children_error_regex'] = 'PHP-FPM pm.max_children deve essere un valore intero postivo.'; $wb['pm_start_servers_error_regex'] = 'PHP-FPM pm.start_servers deve essere un valore intero postivo.'; $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers deve essere un valore intero postivo.'; @@ -109,11 +109,11 @@ $wb['generate_password_txt'] = 'Genera Password'; $wb['repeat_password_txt'] = 'Ripeti Password'; $wb['password_mismatch_txt'] = 'Le password non coincidono.'; $wb['password_match_txt'] = 'Le password coincidono.'; -$wb['available_php_directive_snippets_txt'] = 'Sniipets Direttive PHP disponibili:'; -$wb['available_apache_directive_snippets_txt'] = 'Snippets Direttive Apache disponibili:'; -$wb['available_nginx_directive_snippets_txt'] = 'Snippets Direttive nginx Directive disponibili:'; +$wb['available_php_directive_snippets_txt'] = 'Direttive Snippets PHP disponibili:'; +$wb['available_apache_directive_snippets_txt'] = 'Direttive Snippets Apache disponibili:'; +$wb['available_nginx_directive_snippets_txt'] = 'Direttive Snippets nginx disponibili:'; $wb['proxy_directives_txt'] = 'Direttive Proxy'; -$wb['available_proxy_directive_snippets_txt'] = 'Snippets Direttive Proxy disponibili:'; +$wb['available_proxy_directive_snippets_txt'] = 'Direttive Snippets Proxy disponibili:'; $wb['Domain'] = 'Domini Alias'; -$wb['stats_type_txt'] = 'Webstatistics program'; +$wb['stats_type_txt'] = 'Gestrore statistiche Web'; ?> diff --git a/interface/web/sites/lib/lang/it_web_aliasdomain_list.lng b/interface/web/sites/lib/lang/it_web_aliasdomain_list.lng index bea222d28d84999555777cf74a8cc9ef6f8addf3..d7c0728a28a44cf0ebb90d6f96705d2138a759de 100644 --- a/interface/web/sites/lib/lang/it_web_aliasdomain_list.lng +++ b/interface/web/sites/lib/lang/it_web_aliasdomain_list.lng @@ -5,10 +5,10 @@ $wb['server_id_txt'] = 'Server'; $wb['parent_domain_id_txt'] = 'Sito Web'; $wb['domain_txt'] = 'Domini Alias'; $wb['add_new_record_txt'] = 'Aggiungi un nuovo dominio alias'; -$wb['domain_error_empty'] = 'Domain vuoto.'; +$wb['domain_error_empty'] = 'Dominio vuoto.'; $wb['domain_error_unique'] = 'Nome DOminio deve essere unico.'; $wb['domain_error_regex'] = 'Nome Dominio non valido.'; $wb['no_redirect_txt'] = 'Nessun reinderizzamento'; -$wb['no_flag_txt'] = 'Nessun flag'; +$wb['no_flag_txt'] = 'Nessuna bandierina'; $wb['none_txt'] = 'Nessuno'; ?> diff --git a/interface/web/sites/lib/lang/it_web_backup_list.lng b/interface/web/sites/lib/lang/it_web_backup_list.lng index 67cacff8645af8883809da15ceb44a396f2b9a0d..75587300a28acb94dcc5e56eb97d5f380a80a868 100644 --- a/interface/web/sites/lib/lang/it_web_backup_list.lng +++ b/interface/web/sites/lib/lang/it_web_backup_list.lng @@ -12,28 +12,28 @@ $wb['download_pending_txt'] = 'Esiste già un operazione di download di backup i $wb['restore_pending_txt'] = 'Esiste già un operazione di ripristino da backup in attesa.'; $wb['backup_type_mysql'] = 'Database MySQL'; $wb['backup_type_web'] = 'Files del Sito Web'; -$wb['filesize_txt'] = 'Filesize'; -$wb['delete_backup_txt'] = 'Delete Backup'; -$wb['delete_info_txt'] = 'Delete of the backup has been started. This action takes several minutes to be completed.'; -$wb['delete_confirm_txt'] = 'Really delete this backup?'; -$wb['delete_pending_txt'] = 'There is already a pending backup delete job.'; +$wb['filesize_txt'] = 'Dimensione file'; +$wb['delete_backup_txt'] = 'Cancella Backup'; +$wb['delete_info_txt'] = 'La cancellazione del backup è stata avviata. L\'operazione può richiedere diversi minuti per finire.'; +$wb['delete_confirm_txt'] = 'Vuoi realmente cancellare questo backup?'; +$wb['delete_pending_txt'] = 'C\'è già un\'operazione di cancellazione in corso.'; $wb['backup_type_mongodb'] = 'MongoDB Database'; -$wb['backup_pending_txt'] = 'There is already a pending backup job.'; -$wb['error_txt'] = 'Error'; -$wb['backup_info_txt'] = 'A backup process started. This action can take several minutes to complete.'; -$wb['backup_format_txt'] = 'Backup format'; -$wb['backup_format_unknown_txt'] = 'Unknown'; -$wb['backup_job_txt'] = 'Scheduler'; -$wb['backup_job_manual_txt'] = 'Manual'; +$wb['backup_pending_txt'] = 'C\'è già un\'operazione di backup in corso.'; +$wb['error_txt'] = 'Errore'; +$wb['backup_info_txt'] = 'È stato avviato un backup. Questa operazione può richiedere diversi minuti.'; +$wb['backup_format_txt'] = 'Formato Backup'; +$wb['backup_format_unknown_txt'] = 'Formato Backup sconosciuto'; +$wb['backup_job_txt'] = 'Schedulatore'; +$wb['backup_job_manual_txt'] = 'Manuale'; $wb['backup_job_auto_txt'] = 'Auto'; -$wb['manual_backup_title_txt'] = 'Manual backup'; -$wb['make_backup_web_txt'] = 'Make backup of web files'; -$wb['make_backup_database_txt'] = 'Make backup of databases'; -$wb['make_backup_confirm_txt'] = 'You are about to start a manual backup process. Manual backups count towards the total number of allowed backup copies: therefore if the limit will be exceeded, then oldest backups may be deleted automatically. Proceed?'; -$wb['yes_txt'] = 'Yes'; +$wb['manual_backup_title_txt'] = 'Backup manuale'; +$wb['make_backup_web_txt'] = 'Fare il backup dei file web'; +$wb['make_backup_database_txt'] = 'Fare il backup del databases'; +$wb['make_backup_confirm_txt'] = 'Stai per iniziare un backup manuale. I backup manuali rientrano nel conteggio del numero totale dei backup consentiti. Quindi se il limite sarà superato verranno cancellati automaticamente i backup più vecchi. Vuoi procedere?'; +$wb['yes_txt'] = 'Si'; $wb['no_txt'] = 'No'; -$wb['backup_is_encrypted_txt'] = 'Encrypted'; -$wb['backup_format_zip_txt'] = 'zip (deflate)'; +$wb['backup_is_encrypted_txt'] = 'cifrato'; +$wb['backup_format_zip_txt'] = 'zip'; $wb['backup_format_gzip_txt'] = 'gzip'; $wb['backup_format_bzip2_txt'] = 'bzip2'; $wb['backup_format_xz_txt'] = 'xz'; diff --git a/interface/web/sites/lib/lang/it_web_childdomain.lng b/interface/web/sites/lib/lang/it_web_childdomain.lng index ed48eae876c648bb1dfab6ed2207e4efe45ca381..5918bf20fa894271341d50993b103921a5ceafb4 100644 --- a/interface/web/sites/lib/lang/it_web_childdomain.lng +++ b/interface/web/sites/lib/lang/it_web_childdomain.lng @@ -1,30 +1,30 @@ <?php $wb['ssl_state_txt'] = 'Stato'; -$wb['ssl_locality_txt'] = 'Locality'; +$wb['ssl_locality_txt'] = 'Località '; $wb['ssl_organisation_txt'] = 'Organizzazione'; -$wb['ssl_organisation_unit_txt'] = 'Organisation Unit'; -$wb['ssl_country_txt'] = 'Country'; -$wb['ssl_request_txt'] = 'SSL Request'; -$wb['ssl_cert_txt'] = 'SSL Certificate'; +$wb['ssl_organisation_unit_txt'] = 'Reparto'; +$wb['ssl_country_txt'] = 'Paese'; +$wb['ssl_request_txt'] = 'Richiesta SSL'; +$wb['ssl_cert_txt'] = 'Certificato SSL'; $wb['ssl_bundle_txt'] = 'SSL Bundle'; -$wb['ssl_action_txt'] = 'SSL Action'; +$wb['ssl_action_txt'] = 'Azione SSL'; $wb['server_id_txt'] = 'Server'; $wb['domain_txt'] = 'Dominio'; $wb['type_txt'] = 'Tipo'; -$wb['parent_domain_id_txt'] = 'Parent Website'; +$wb['parent_domain_id_txt'] = 'Sito Web genitore'; $wb['redirect_type_txt'] = 'Tipo Redirect'; -$wb['r_redirect_txt'] = 'R (Temporary redirect)'; -$wb['l_redirect_txt'] = 'L (Last redirect rule)'; -$wb['r_l_redirect_txt'] = 'R,L (Temporary redirect + last rule)'; -$wb['r_301_l_redirect_txt'] = 'R=301,L (Permanent redirect + last rule)'; -$wb['redirect_path_txt'] = 'Percorso Redirect'; +$wb['r_redirect_txt'] = 'R (Reindirizzamento temporaneo)'; +$wb['l_redirect_txt'] = 'L (Ultima regola di reindirizzamento)'; +$wb['r_l_redirect_txt'] = 'R,L (Reindirizzamento temporaneo + Ultima regola)'; +$wb['r_301_l_redirect_txt'] = 'R=301,L (Reindirizzamento permanente + Ultima regol)'; +$wb['redirect_path_txt'] = 'Percorso di reindirizzamento'; $wb['active_txt'] = 'Attivo'; -$wb['document_root_txt'] = 'Documentroot'; +$wb['document_root_txt'] = 'Cartella radice dei documenti'; $wb['system_user_txt'] = 'Utente Linux'; $wb['system_group_txt'] = 'Gruppo Linux'; $wb['ip_address_txt'] = 'Indirizzo IP'; $wb['vhost_type_txt'] = 'Tipo VHost'; -$wb['hd_quota_txt'] = 'Quota Harddisk'; +$wb['hd_quota_txt'] = 'Quota disco'; $wb['traffic_quota_txt'] = 'Quota Traffico'; $wb['cgi_txt'] = 'CGI'; $wb['ssi_txt'] = 'SSI'; @@ -32,93 +32,93 @@ $wb['ssl_txt'] = 'SSL'; $wb['suexec_txt'] = 'SuEXEC'; $wb['php_txt'] = 'PHP'; $wb['client_txt'] = 'Cliente'; -$wb['limit_web_domain_txt'] = 'The max. number of web domains for your account is reached.'; -$wb['limit_web_aliasdomain_txt'] = 'The max. number of aliasdomains for your account is reached.'; -$wb['limit_web_subdomain_txt'] = 'The max. number of web subdomains for your account is reached.'; +$wb['limit_web_domain_txt'] = 'Hai raggiunto il limite dei siti Web per il tuo profilo.'; +$wb['limit_web_aliasdomain_txt'] = 'Hai raggiunto il limite dei domini Alias per il tuo profilo.'; +$wb['limit_web_subdomain_txt'] = 'Hai raggiunto il limite dei sottodomini per il tuo profilo.'; $wb['apache_directives_txt'] = 'Direttive Apache'; -$wb['domain_error_empty'] = 'Domain is empty.'; -$wb['domain_error_unique'] = 'Domain must be unique.'; -$wb['domain_error_regex'] = 'Domain name invalid.'; -$wb['domain_error_acme_invalid'] = 'Domain name acme.invalid not permitted.'; +$wb['domain_error_empty'] = 'Il campo Dominio è vuoto.'; +$wb['domain_error_unique'] = 'Il nome Dominio deve essere unico.'; +$wb['domain_error_regex'] = 'Il nome di dominio non è valido.'; +$wb['domain_error_acme_invalid'] = 'Il nome di dominio acme non è consentito.'; $wb['host_txt'] = 'Host'; -$wb['redirect_error_regex'] = 'Invalid redirect path. Valid redirects are for example: /test/ or https://www.domain.tld/test/'; -$wb['no_redirect_txt'] = 'No redirect'; -$wb['no_flag_txt'] = 'No flag'; -$wb['domain_error_wildcard'] = 'Wildcard subdomains are not allowed.'; -$wb['proxy_directives_txt'] = 'Proxy Directives'; -$wb['available_proxy_directive_snippets_txt'] = 'Available Proxy Directive Snippets:'; -$wb['error_proxy_requires_url'] = 'Redirect Type \\"proxy\\" requires a URL as the redirect path.'; -$wb['backup_interval_txt'] = 'Backup interval'; -$wb['backup_copies_txt'] = 'Number of backup copies'; -$wb['ssl_key_txt'] = 'SSL Key'; -$wb['ssl_domain_txt'] = 'SSL Domain'; -$wb['web_folder_error_regex'] = 'Invalid folder entered. Please do not enter a slash.'; -$wb['ipv6_address_txt'] = 'IPv6-Address'; -$wb['errordocs_txt'] = 'Own Error-Documents'; -$wb['subdomain_txt'] = 'Auto-Subdomain'; -$wb['domain_error_autosub'] = 'There is already a subdomain with these settings.'; -$wb['hd_quota_error_empty'] = 'Harddisk quota is 0 or empty.'; -$wb['traffic_quota_error_empty'] = 'Traffic quota is empty.'; -$wb['error_ssl_state_empty'] = 'SSL State is empty.'; -$wb['error_ssl_locality_empty'] = 'SSL Locality is empty.'; -$wb['error_ssl_organisation_empty'] = 'SSL Organisation is empty.'; -$wb['error_ssl_organisation_unit_empty'] = 'SSL Organisation Unit is empty.'; -$wb['error_ssl_country_empty'] = 'SSL Country is empty.'; -$wb['error_ssl_cert_empty'] = 'SSL Certificate field is empty'; -$wb['client_group_id_txt'] = 'Client'; -$wb['stats_password_txt'] = 'Set Webstatistics password'; +$wb['redirect_error_regex'] = 'Percorso di reindirizzamento non valido. Esempi corretti sono: /test/ or https://www.domain.tld/test/'; +$wb['no_redirect_txt'] = 'Nessun reindirizzamento'; +$wb['no_flag_txt'] = 'Nessuna bandierina'; +$wb['domain_error_wildcard'] = 'I domini * non sono consentiti.'; +$wb['proxy_directives_txt'] = 'Direttive Proxy'; +$wb['available_proxy_directive_snippets_txt'] = 'Direttive Snippets Proxy disponibili:'; +$wb['error_proxy_requires_url'] = 'La direttiva di reindirizzamento tipo \\"proxy\\" richiede un URL come percorso di reindirizzamento.'; +$wb['backup_interval_txt'] = 'Intervallo tra i Backup'; +$wb['backup_copies_txt'] = 'Numero di copie di backup'; +$wb['ssl_key_txt'] = 'Chiave SSL'; +$wb['ssl_domain_txt'] = 'Dominio SSL'; +$wb['web_folder_error_regex'] = 'Cartella inserita non corretta. Non inserire la sbarra.'; +$wb['ipv6_address_txt'] = 'Indirizzo IPv6'; +$wb['errordocs_txt'] = 'Documenti di errore personalizzati'; +$wb['subdomain_txt'] = 'Auto-Sottodomini'; +$wb['domain_error_autosub'] = 'Esiste già un sottodominio con queste impostazioni.'; +$wb['hd_quota_error_empty'] = 'La quota disco è 0 o è vuota.'; +$wb['traffic_quota_error_empty'] = 'La quota Traffico è vuota.'; +$wb['error_ssl_state_empty'] = 'SSL Lo Stato è vuoto.'; +$wb['error_ssl_locality_empty'] = 'SSL La Località è vuota.'; +$wb['error_ssl_organisation_empty'] = 'SSL l\'Organizzazione è vuota.'; +$wb['error_ssl_organisation_unit_empty'] = 'SSL Il Reparto è vuoto.'; +$wb['error_ssl_country_empty'] = 'SSL Il Paese è vuoto.'; +$wb['error_ssl_cert_empty'] = 'SSL Il campo Certificato è vuoto'; +$wb['client_group_id_txt'] = 'Cliente'; +$wb['stats_password_txt'] = 'Set Password per le statistiche Web password'; $wb['allow_override_txt'] = 'Apache AllowOverride'; -$wb['limit_web_quota_free_txt'] = 'Max. available Harddisk Quota'; -$wb['ssl_state_error_regex'] = 'Invalid SSL State. Valid characters are: a-z, 0-9 and .,-_'; -$wb['ssl_locality_error_regex'] = 'Invalid SSL Locality. Valid characters are: a-z, 0-9 and .,-_'; -$wb['ssl_organisation_error_regex'] = 'Invalid SSL Organisation. Valid characters are: a-z, 0-9 and .,-_'; -$wb['ssl_organistaion_unit_error_regex'] = 'Invalid SSL Organisation Unit. Valid characters are: a-z, 0-9 and .,-_'; -$wb['ssl_country_error_regex'] = 'Invalid SSL Country. Valid characters are: A-Z'; -$wb['limit_traffic_quota_free_txt'] = 'Max. available Traffic Quota'; +$wb['limit_web_quota_free_txt'] = 'Massima Quota disco disponibile'; +$wb['ssl_state_error_regex'] = 'SSL Stato non valido. Caratteri ammessi: a-z, 0-9 and .,-_'; +$wb['ssl_locality_error_regex'] = 'SSL Località non valida. Caratteri ammessi: a-z, 0-9 and .,-_'; +$wb['ssl_organisation_error_regex'] = 'SSL Organizzazione non valida. Caratteri ammessi: a-z, 0-9 and .,-_'; +$wb['ssl_organistaion_unit_error_regex'] = 'SSL Reparto non valido. Caratteri ammessi: a-z, 0-9 and .,-_'; +$wb['ssl_country_error_regex'] = 'SSL Paese non valido Country. Caratteri ammessi: A-Z'; +$wb['limit_traffic_quota_free_txt'] = 'Massima quota Traffico disponibile'; $wb['php_open_basedir_txt'] = 'PHP open_basedir'; -$wb['traffic_quota_exceeded_txt'] = 'Traffic quota exceeded'; +$wb['traffic_quota_exceeded_txt'] = 'Hai superato la quota Traffico'; $wb['ruby_txt'] = 'Ruby'; -$wb['stats_user_txt'] = 'Webstatistics username'; -$wb['stats_type_txt'] = 'Webstatistics program'; -$wb['custom_php_ini_txt'] = 'Custom php.ini settings'; -$wb['none_txt'] = 'None'; -$wb['disabled_txt'] = 'Disabled'; -$wb['save_certificate_txt'] = 'Save certificate'; -$wb['create_certificate_txt'] = 'Create certificate'; -$wb['delete_certificate_txt'] = 'Delete certificate'; -$wb['nginx_directives_txt'] = 'nginx Directives'; -$wb['seo_redirect_txt'] = 'SEO Redirect'; +$wb['stats_user_txt'] = 'username per le statistiche Web'; +$wb['stats_type_txt'] = 'Gestore statistiche Web'; +$wb['custom_php_ini_txt'] = 'Impostazioni php.ini personalizzate'; +$wb['none_txt'] = 'Nessuno'; +$wb['disabled_txt'] = 'Disabilitato'; +$wb['save_certificate_txt'] = 'Salva il certificato'; +$wb['create_certificate_txt'] = 'Crea il certificato'; +$wb['delete_certificate_txt'] = 'Cancella il certificato'; +$wb['nginx_directives_txt'] = 'Direttive nginx'; +$wb['seo_redirect_txt'] = 'Reindirizzamento SEO'; $wb['non_www_to_www_txt'] = 'Non-www -> www'; $wb['www_to_non_www_txt'] = 'www -> non-www'; -$wb['php_fpm_use_socket_txt'] = 'Use Socket For PHP-FPM'; -$wb['error_no_sni_txt'] = 'SNI for SSL is not activated on this server. You can enable only one SSL certificate on each IP address.'; +$wb['php_fpm_use_socket_txt'] = 'Usare Socket per PHP-FPM'; +$wb['error_no_sni_txt'] = 'SNI per SSL non è attivo su questo server. Puoi abilitare un solo certificato SSL per ciascun indirizzo IP.'; $wb['python_txt'] = 'Python'; $wb['perl_txt'] = 'Perl'; $wb['pm_max_children_txt'] = 'PHP-FPM pm.max_children'; $wb['pm_start_servers_txt'] = 'PHP-FPM pm.start_servers'; $wb['pm_min_spare_servers_txt'] = 'PHP-FPM pm.min_spare_servers'; $wb['pm_max_spare_servers_txt'] = 'PHP-FPM pm.max_spare_servers'; -$wb['error_php_fpm_pm_settings_txt'] = 'Values of PHP-FPM pm settings must be as follows: pm.max_children >= pm.max_spare_servers >= pm.start_servers >= pm.min_spare_servers > 0'; -$wb['pm_max_children_error_regex'] = 'PHP-FPM pm.max_children must be a positive integer value.'; -$wb['pm_start_servers_error_regex'] = 'PHP-FPM pm.start_servers must be a positive integer value.'; -$wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers must be a positive integer value.'; -$wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; -$wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; -$wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; -$wb['server_php_id_txt'] = 'PHP Version'; -$wb['pm_txt'] = 'PHP-FPM Process Manager'; +$wb['error_php_fpm_pm_settings_txt'] = 'I valori di PHP-FPM pm devono soddisfare: pm.max_children >= pm.max_spare_servers >= pm.start_servers >= pm.min_spare_servers > 0'; +$wb['pm_max_children_error_regex'] = 'PHP-FPM pm.max_children deve essere un intero positivo.'; +$wb['pm_start_servers_error_regex'] = 'PHP-FPM pm.start_servers deve essere un intero positivo.'; +$wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers deve essere un intero positivo.'; +$wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers deve essere un intero positivo.'; +$wb['hd_quota_error_regex'] = 'Il valore quota disco non è valido.'; +$wb['traffic_quota_error_regex'] = 'Il valore di quota Traffico non è valido.'; +$wb['server_php_id_txt'] = 'Versione PHP'; +$wb['pm_txt'] = 'Gestore del processo PHP-FPM'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; -$wb['pm_process_idle_timeout_error_regex'] = 'PHP-FPM pm.process_idle_timeout must be a positive integer value.'; -$wb['pm_max_requests_error_regex'] = 'PHP-FPM pm.max_requests must be an integer value >= 0.'; -$wb['pm_ondemand_hint_txt'] = 'Please note that you must have PHP version >= 5.3.9 in order to use the ondemand process manager. If you select ondemand for an older PHP version, PHP will not start anymore!'; -$wb['generate_password_txt'] = 'Generate Password'; -$wb['repeat_password_txt'] = 'Repeat Password'; -$wb['password_mismatch_txt'] = 'The passwords do not match.'; -$wb['password_match_txt'] = 'The passwords do match.'; -$wb['available_php_directive_snippets_txt'] = 'Available PHP Directive Snippets:'; -$wb['available_apache_directive_snippets_txt'] = 'Available Apache Directive Snippets:'; -$wb['available_nginx_directive_snippets_txt'] = 'Available nginx Directive Snippets:'; -$wb['Domain'] = 'Aliasdomain'; -$wb['ssl_letsencrypt_exclude_txt'] = 'Don\'t add to Let\'s Encrypt certificate'; +$wb['pm_process_idle_timeout_error_regex'] = 'PHP-FPM pm.process_idle_timeout deve essere un intero positivo.'; +$wb['pm_max_requests_error_regex'] = 'PHP-FPM pm.max_requests deve essere un intero >= 0.'; +$wb['pm_ondemand_hint_txt'] = 'evi avere una versione PHP >= 5.3.9 per poter utilizzare ondemand process manager. Se hai selezionato ondemand per una versione PHP precedente, PHP non si avvierà più!'; +$wb['generate_password_txt'] = 'Generare Password'; +$wb['repeat_password_txt'] = 'Ripetere Password'; +$wb['password_mismatch_txt'] = 'Le passwords non coincidono.'; +$wb['password_match_txt'] = 'Le passwords sono uguali.'; +$wb['available_php_directive_snippets_txt'] = 'Direttive Snippets PHP disponibili:'; +$wb['available_apache_directive_snippets_txt'] = 'Direttive Snippets Apache disponibili:'; +$wb['available_nginx_directive_snippets_txt'] = 'Direttive Snippets nginx disponibili:'; +$wb['Domain'] = 'Dominio Alias'; +$wb['ssl_letsencrypt_exclude_txt'] = 'Non fare aggiunte al certificato Let\'s Encrypt'; ?> diff --git a/interface/web/sites/lib/lang/it_web_childdomain_list.lng b/interface/web/sites/lib/lang/it_web_childdomain_list.lng index 45d82ecc58fe351faf9307d8bac9c20ac40a2f74..606ebc17bf57653be38726cfbcb8fc9d467c311e 100644 --- a/interface/web/sites/lib/lang/it_web_childdomain_list.lng +++ b/interface/web/sites/lib/lang/it_web_childdomain_list.lng @@ -11,8 +11,8 @@ $wb['domain_error_acme_invalid'] = 'Domain name acme.invalid not permitted.'; $wb['no_redirect_txt'] = 'No redirect'; $wb['no_flag_txt'] = 'No flag'; $wb['none_txt'] = 'None'; -$wb['add_new_subdomain_txt'] = 'Add new Subdomain'; -$wb['add_new_aliasdomain_txt'] = 'Add new Aliasdomain'; -$wb['aliasdomain_list_head_txt'] = 'Aliasdomains'; -$wb['subdomain_list_head_txt'] = 'Subdomains'; +$wb['add_new_subdomain_txt'] = 'Aggiungi un Sottodominio'; +$wb['add_new_aliasdomain_txt'] = 'AAggiungi un Alias di dominio'; +$wb['aliasdomain_list_head_txt'] = 'Dominio Alias'; +$wb['subdomain_list_head_txt'] = 'Sottodominio'; ?> diff --git a/interface/web/sites/lib/lang/it_web_directive_snippets.lng b/interface/web/sites/lib/lang/it_web_directive_snippets.lng index d2590e53cfbefea98a29cdd8fff773eb46050fe8..569070daaab79b3f9098e81bbb2f39841777a108 100644 --- a/interface/web/sites/lib/lang/it_web_directive_snippets.lng +++ b/interface/web/sites/lib/lang/it_web_directive_snippets.lng @@ -1,3 +1,3 @@ <?php -$wb['directive_snippets_id_txt'] = 'Desired configuration'; +$wb['directive_snippets_id_txt'] = 'Configuratione desiderata'; ?> diff --git a/interface/web/sites/lib/lang/it_web_domain.lng b/interface/web/sites/lib/lang/it_web_domain.lng index b05f2a15575f7a5d4a4d62d5f56a752c51a4ecec..18765c470246f6743c3ef1f79dce8dee2816fc63 100644 --- a/interface/web/sites/lib/lang/it_web_domain.lng +++ b/interface/web/sites/lib/lang/it_web_domain.lng @@ -2,24 +2,24 @@ $wb['ssl_state_txt'] = 'Stato'; $wb['ssl_locality_txt'] = 'Città '; $wb['ssl_organisation_txt'] = 'Organizzazione'; -$wb['ssl_organisation_unit_txt'] = 'Organisation Unit'; +$wb['ssl_organisation_unit_txt'] = 'Reparto'; $wb['ssl_country_txt'] = 'Codice Nazione'; $wb['ssl_request_txt'] = 'Richiesta SSL'; $wb['ssl_cert_txt'] = 'Certificato SSL'; $wb['ssl_bundle_txt'] = 'SSL Bundle'; -$wb['ssl_action_txt'] = 'SSL Action'; +$wb['ssl_action_txt'] = 'Azione SSL'; $wb['server_id_txt'] = 'Server'; $wb['domain_txt'] = 'Dominio'; $wb['type_txt'] = 'Tipo'; $wb['parent_domain_id_txt'] = 'Sito Web di riferimento'; $wb['redirect_type_txt'] = 'Tipo Reinderizzamento'; -$wb['r_redirect_txt'] = 'R (Temporary redirect)'; -$wb['l_redirect_txt'] = 'L (Last redirect rule)'; -$wb['r_l_redirect_txt'] = 'R,L (Temporary redirect + last rule)'; -$wb['r_301_l_redirect_txt'] = 'R=301,L (Permanent redirect + last rule)'; +$wb['r_redirect_txt'] = 'R (Reindirizzamento temporaneo)'; +$wb['l_redirect_txt'] = 'L (Ultima regola di reindirizzamento)'; +$wb['r_l_redirect_txt'] = 'R,L (Reindirizzamento temporaneo + ultima regola)'; +$wb['r_301_l_redirect_txt'] = 'R=301,L (Reindirizzamento permanente + ultima regola)'; $wb['redirect_path_txt'] = 'Percorso Reinderizzamento'; $wb['active_txt'] = 'Attivo'; -$wb['document_root_txt'] = 'Documentroot'; +$wb['document_root_txt'] = 'Radice dei documenti'; $wb['system_user_txt'] = 'Utente Linux'; $wb['system_group_txt'] = 'Gruppo Linux'; $wb['ip_address_txt'] = 'Indirizzo IP'; @@ -33,11 +33,11 @@ $wb['ssl_txt'] = 'SSL'; $wb['suexec_txt'] = 'SuEXEC'; $wb['php_txt'] = 'PHP'; $wb['client_txt'] = 'Cliente'; -$wb['limit_web_domain_txt'] = 'Numero massimo domini siti web raggiunto per il tuo account.'; -$wb['limit_web_aliasdomain_txt'] = 'Numero massimo di domini alias raggiunto per il tuo account.'; -$wb['limit_web_subdomain_txt'] = 'Numero massimo di sottodomini raggiunto per il tuo account.'; -$wb['apache_directives_txt'] = 'Apache Direttive '; -$wb['domain_error_empty'] = 'Domain vuoto.'; +$wb['limit_web_domain_txt'] = 'Numero massimo domini siti web raggiunto per il tuo profilo.'; +$wb['limit_web_aliasdomain_txt'] = 'Numero massimo di domini alias raggiunto per il tuo profilo.'; +$wb['limit_web_subdomain_txt'] = 'Numero massimo di sottodomini raggiunto per il tuo profilo.'; +$wb['apache_directives_txt'] = 'Direttive Apache '; +$wb['domain_error_empty'] = 'Domain vuoto.'; $wb['domain_error_unique'] = 'Il dominio deve essere unico.'; $wb['domain_error_regex'] = 'Nome Dominio non valido.'; $wb['hd_quota_error_empty'] = 'Quota Spazio Disco vuoto.'; @@ -51,7 +51,7 @@ $wb['subdomain_txt'] = 'Auto-Sottodominio'; $wb['client_group_id_txt'] = 'Cliente'; $wb['stats_password_txt'] = 'Pssword Statistiche Web'; $wb['ssl_domain_txt'] = 'SSL Domimio'; -$wb['allow_override_txt'] = 'Allow Override'; +$wb['allow_override_txt'] = 'Consenti di trascurare'; $wb['limit_web_quota_free_txt'] = 'Valore massimo Quota Spazio Disco disponibile'; $wb['ssl_state_error_regex'] = 'SSL Stato non valido. Caratteri ammessi: a-z, 0-9 e .,-_'; $wb['ssl_locality_error_regex'] = 'SSL Città non valido. Caratteri ammessi: a-z, 0-9 e .,-_'; @@ -88,16 +88,16 @@ $wb['pm_max_children_txt'] = 'PHP-FPM pm.max_children'; $wb['pm_start_servers_txt'] = 'PHP-FPM pm.start_servers'; $wb['pm_min_spare_servers_txt'] = 'PHP-FPM pm.min_spare_servers'; $wb['pm_max_spare_servers_txt'] = 'PHP-FPM pm.max_spare_servers'; -$wb['error_php_fpm_pm_settings_txt'] = 'I Valori per impostazioni PHP-FPM pm devono essere i seguenti: pm.max_children >= pm.max_spare_servers >= pm.start_servers >= pm.min_spare_servers > 0'; +$wb['error_php_fpm_pm_settings_txt'] = 'I Valori per impostazioni PHP-FPM pm devono soddisfare: pm.max_children >= pm.max_spare_servers >= pm.start_servers >= pm.min_spare_servers > 0'; $wb['pm_max_children_error_regex'] = 'PHP-FPM pm.max_children deve essere un valore intero positivo.'; $wb['pm_start_servers_error_regex'] = 'PHP-FPM pm.start_servers deve essere un valore intero positivo.'; $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers deve essere un valore intero positivo.'; $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers deve essere un valore intero positivo.'; $wb['hd_quota_error_regex'] = 'Quota spazio disco non valida.'; $wb['traffic_quota_error_regex'] = 'Quota Traffico non valida.'; -$wb['ssl_key_txt'] = 'SSL Key'; +$wb['ssl_key_txt'] = 'Chiave SSL'; $wb['perl_txt'] = 'Perl'; -$wb['server_php_id_txt'] = 'PHP Versione'; +$wb['server_php_id_txt'] = 'Versione PHP'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; @@ -123,7 +123,7 @@ $wb['monthly_backup_txt'] = 'Mensile'; $wb['rewrite_rules_txt'] = 'Rewrite Rules'; $wb['invalid_rewrite_rules_txt'] = 'Rewrite Rules non valide'; $wb['allowed_rewrite_rule_directives_txt'] = 'Allowed Directives:'; -$wb['configuration_error_txt'] = 'CONFIGURATION ERROR'; +$wb['configuration_error_txt'] = 'ERRORE DI CONFIGURAZIONE'; $wb['variables_txt'] = 'Variabili'; $wb['added_by_txt'] = 'Inserito da'; $wb['added_date_txt'] = 'Data inserimento'; @@ -133,9 +133,9 @@ $wb['backup_excludes_error_regex'] = 'Le cartelle escluse contengono caratteri n $wb['invalid_custom_php_ini_settings_txt'] = 'Impsotazioni php.ini non valide'; $wb['invalid_system_user_or_group_txt'] = 'Utente di sistema o Gruppo non valido'; $wb['apache_directive_blocked_error'] = 'Direttive di Apache bloccate da impostazioni di sicurezza:'; -$wb['http_port_txt'] = 'HTTP Port'; -$wb['https_port_txt'] = 'HTTPS Port'; -$wb['http_port_error_regex'] = 'HTTP Port invalid.'; -$wb['https_port_error_regex'] = 'HTTPS Port invalid.'; -$wb['nginx_directive_blocked_error'] = 'Nginx directive blocked by security settings:'; +$wb['http_port_txt'] = 'Porta HTTP'; +$wb['https_port_txt'] = 'Porta HTTPS'; +$wb['http_port_error_regex'] = 'Porta HTTP non valida.'; +$wb['https_port_error_regex'] = 'Porta HTTPS non valida.'; +$wb['nginx_directive_blocked_error'] = 'Direttive Nginx bloccate per impostazioni di sicurezza:'; ?> diff --git a/interface/web/sites/lib/lang/it_web_folder.lng b/interface/web/sites/lib/lang/it_web_folder.lng index eb32a966f4f4e8fc975a3552838f668a01a16b72..37404ef1da99d24c53ed5e9390a6a67212ac555c 100644 --- a/interface/web/sites/lib/lang/it_web_folder.lng +++ b/interface/web/sites/lib/lang/it_web_folder.lng @@ -4,5 +4,5 @@ $wb['parent_domain_id_txt'] = 'Sito Web'; $wb['path_txt'] = 'Path'; $wb['active_txt'] = 'Attivo'; $wb['path_error_regex'] = 'Percorso cartella non valido.'; -$wb['error_folder_already_protected_txt'] = 'esiste già un record per questa cartella.'; +$wb['error_folder_already_protected_txt'] = 'Esiste già un record per questa cartella.'; ?> diff --git a/interface/web/sites/lib/lang/it_web_subdomain.lng b/interface/web/sites/lib/lang/it_web_subdomain.lng index e3438eaf75e4de551c5339ce27727c6f591b8837..6f8e81d7b6afa6af65ac05d5849dfbc260d57832 100644 --- a/interface/web/sites/lib/lang/it_web_subdomain.lng +++ b/interface/web/sites/lib/lang/it_web_subdomain.lng @@ -1,30 +1,30 @@ <?php $wb['ssl_state_txt'] = 'Stato'; -$wb['ssl_locality_txt'] = 'Locality'; +$wb['ssl_locality_txt'] = 'Località '; $wb['ssl_organisation_txt'] = 'Organizzazione'; -$wb['ssl_organisation_unit_txt'] = 'Organisation Unit'; -$wb['ssl_country_txt'] = 'Country'; -$wb['ssl_request_txt'] = 'SSL Request'; -$wb['ssl_cert_txt'] = 'SSL Certificate'; +$wb['ssl_organisation_unit_txt'] = 'Reparto'; +$wb['ssl_country_txt'] = 'Paese'; +$wb['ssl_request_txt'] = 'Richiesta SSL'; +$wb['ssl_cert_txt'] = 'Certificato SSL'; $wb['ssl_bundle_txt'] = 'SSL Bundle'; -$wb['ssl_action_txt'] = 'SSL Action'; +$wb['ssl_action_txt'] = 'Azione SSL'; $wb['server_id_txt'] = 'Server'; $wb['domain_txt'] = 'Dominio'; $wb['type_txt'] = 'Tipo'; -$wb['parent_domain_id_txt'] = 'Parent Website'; -$wb['redirect_type_txt'] = 'Tipo Redirect'; -$wb['r_redirect_txt'] = 'R (Temporary redirect)'; -$wb['l_redirect_txt'] = 'L (Last redirect rule)'; -$wb['r_l_redirect_txt'] = 'R,L (Temporary redirect + last rule)'; -$wb['r_301_l_redirect_txt'] = 'R=301,L (Permanent redirect + last rule)'; -$wb['redirect_path_txt'] = 'Percorso Redirect'; +$wb['parent_domain_id_txt'] = 'Website genitore'; +$wb['redirect_type_txt'] = 'Tipo Reindirizzamento'; +$wb['r_redirect_txt'] = 'R (Reindirizzamento temporaneo)'; +$wb['l_redirect_txt'] = 'L (Ultima regola di reindirizzamento)'; +$wb['r_l_redirect_txt'] = 'R,L (Reindirizzamento temporaneo + ultima regola)'; +$wb['r_301_l_redirect_txt'] = 'R=301,L (Reindirizzamento permanente + ultima regola)'; +$wb['redirect_path_txt'] = 'Percorso reindirizzamento'; $wb['active_txt'] = 'Attivo'; -$wb['document_root_txt'] = 'Documentroot'; +$wb['document_root_txt'] = 'Radice dei documenti'; $wb['system_user_txt'] = 'Utente Linux'; $wb['system_group_txt'] = 'Gruppo Linux'; $wb['ip_address_txt'] = 'Indirizzo IP'; $wb['vhost_type_txt'] = 'Tipo VHost'; -$wb['hd_quota_txt'] = 'Quota Harddisk'; +$wb['hd_quota_txt'] = 'Quota disco'; $wb['traffic_quota_txt'] = 'Quota Traffico'; $wb['cgi_txt'] = 'CGI'; $wb['ssi_txt'] = 'SSI'; @@ -32,23 +32,23 @@ $wb['ssl_txt'] = 'SSL'; $wb['suexec_txt'] = 'SuEXEC'; $wb['php_txt'] = 'PHP'; $wb['client_txt'] = 'Cliente'; -$wb['limit_web_domain_txt'] = 'Hai raggiunto il numero massimo di siti web per il tuo account.'; -$wb['limit_web_aliasdomain_txt'] = 'Hai raggiunto il numero massimo di domini alias per il tuo account.'; -$wb['limit_web_subdomain_txt'] = 'Hai raggiunto il numero massimo di sottodomini per il tuo account.'; +$wb['limit_web_domain_txt'] = 'Hai raggiunto il numero massimo di siti web per il tuo profilo.'; +$wb['limit_web_aliasdomain_txt'] = 'Hai raggiunto il numero massimo di domini alias per il tuo profilo.'; +$wb['limit_web_subdomain_txt'] = 'Hai raggiunto il numero massimo di sottodomini per il tuo profilo.'; $wb['apache_directives_txt'] = 'Direttive Apache'; -$wb['domain_error_empty'] = 'Dominio vuoto.'; +$wb['domain_error_empty'] = 'Dominio vuoto.'; $wb['domain_error_unique'] = 'Il dominio deve essere unico.'; $wb['domain_error_regex'] = 'Nome dominio non valido.'; $wb['host_txt'] = 'Host'; $wb['redirect_error_regex'] = 'Percorso di reinderizzamento errato. esempi di reinderizzamento validi: /test/ o https://www.domain.tld/test/'; $wb['no_redirect_txt'] = 'Nessun reinderizzamento'; -$wb['no_flag_txt'] = 'No flag'; +$wb['no_flag_txt'] = 'Nessuna bandierina'; $wb['domain_error_wildcard'] = 'Non sono ammessi caratteri jolly per i sottodomini.'; $wb['proxy_directives_txt'] = 'Direttive Proxy'; $wb['available_proxy_directive_snippets_txt'] = 'Snippets Direttive Proxy disponibili:'; $wb['error_proxy_requires_url'] = 'Tipo reinderizzamento \\"proxy\\" richiede una URL come percorso di reinderizzamento.'; -$wb['http_port_txt'] = 'HTTP Port'; -$wb['https_port_txt'] = 'HTTPS Port'; -$wb['http_port_error_regex'] = 'HTTP Port invalid.'; -$wb['https_port_error_regex'] = 'HTTPS Port invalid.'; +$wb['http_port_txt'] = 'Porta HTTP'; +$wb['https_port_txt'] = 'Porta HTTPS'; +$wb['http_port_error_regex'] = 'Porta HTTP non valida.'; +$wb['https_port_error_regex'] = 'Porta HTTPS non valida.'; ?> diff --git a/interface/web/sites/lib/lang/it_web_vhost_domain.lng b/interface/web/sites/lib/lang/it_web_vhost_domain.lng index 22fce96dab4a8555cdbd433cd54693290b72440e..3e036a77487b831f122571d93b4d93c8d88ad335 100644 --- a/interface/web/sites/lib/lang/it_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/it_web_vhost_domain.lng @@ -1,23 +1,23 @@ <?php $wb['ssl_state_txt'] = 'Stato'; -$wb['ssl_locality_txt'] = 'Locality'; +$wb['ssl_locality_txt'] = 'Località '; $wb['ssl_organisation_txt'] = 'Organizzazione'; -$wb['ssl_organisation_unit_txt'] = 'Organisation Unit'; +$wb['ssl_organisation_unit_txt'] = 'Reparto'; $wb['ssl_country_txt'] = 'Regione'; $wb['ssl_request_txt'] = 'Richiesta SSL'; $wb['ssl_cert_txt'] = 'Certificato SSL'; $wb['ssl_bundle_txt'] = 'SSL Bundle'; -$wb['ssl_action_txt'] = 'SSL Action'; +$wb['ssl_action_txt'] = 'Azione SSL'; $wb['server_id_txt'] = 'Server'; $wb['domain_txt'] = 'Dominio'; $wb['type_txt'] = 'Tipo'; -$wb['parent_domain_id_txt'] = 'Parent Website'; -$wb['redirect_type_txt'] = 'Tipo Redirect'; -$wb['r_redirect_txt'] = 'R (Temporary redirect)'; -$wb['l_redirect_txt'] = 'L (Last redirect rule)'; -$wb['r_l_redirect_txt'] = 'R,L (Temporary redirect + last rule)'; -$wb['r_301_l_redirect_txt'] = 'R=301,L (Permanent redirect + last rule)'; -$wb['redirect_path_txt'] = 'Percorso Redirect'; +$wb['parent_domain_id_txt'] = 'Sito Web genitore'; +$wb['redirect_type_txt'] = 'Tipo Reindirizzamento'; +$wb['r_redirect_txt'] = 'R (Reindirizzamento temporaneo)'; +$wb['l_redirect_txt'] = 'L (Ultima regola di reindirizzamento)'; +$wb['r_l_redirect_txt'] = 'R,L (Reindirizzamento temporaneo + ultima regola)'; +$wb['r_301_l_redirect_txt'] = 'R=301,L (Reindirizzamento Permanente + ultima regola)'; +$wb['redirect_path_txt'] = 'Percorso Reindirizzamento'; $wb['active_txt'] = 'Attivo'; $wb['document_root_txt'] = 'Document Root'; $wb['system_user_txt'] = 'Utente Linux'; @@ -34,141 +34,141 @@ $wb['ssl_letsencrypt_txt'] = 'Let\'s Encrypt'; $wb['suexec_txt'] = 'SuEXEC'; $wb['php_txt'] = 'PHP'; $wb['client_txt'] = 'Cliente'; -$wb['limit_web_domain_txt'] = 'The max. number of web domains for your account is reached.'; -$wb['limit_web_aliasdomain_txt'] = 'The max. number of aliasdomains for your account is reached.'; -$wb['limit_web_subdomain_txt'] = 'The max. number of web subdomains for your account is reached.'; -$wb['apache_directives_txt'] = 'Apache directives'; -$wb['domain_error_empty'] = 'Domain is empty.'; -$wb['domain_error_unique'] = 'Domain must be unique.'; -$wb['domain_error_regex'] = 'Domain name invalid.'; -$wb['domain_error_acme_invalid'] = 'Domain name acme.invalid not permitted.'; -$wb['hd_quota_error_empty'] = 'Harddisk quota is empty.'; -$wb['traffic_quota_error_empty'] = 'Traffic quota is empty.'; -$wb['error_ssl_state_empty'] = 'SSL State is empty.'; -$wb['error_ssl_locality_empty'] = 'SSL Locality is empty.'; -$wb['error_ssl_organisation_empty'] = 'SSL Organisation is empty.'; -$wb['error_ssl_organisation_unit_empty'] = 'SSL Organisation Unit is empty.'; -$wb['error_ssl_country_empty'] = 'SSL Country is empty.'; -$wb['subdomain_txt'] = 'Auto-Subdomain'; -$wb['client_group_id_txt'] = 'Client'; -$wb['stats_password_txt'] = 'Webstatistics password'; -$wb['ssl_domain_txt'] = 'SSL Domain'; -$wb['allow_override_txt'] = 'Allow Override'; -$wb['limit_web_quota_free_txt'] = 'Max. available Harddisk Quota'; -$wb['ssl_state_error_regex'] = 'Invalid SSL State. Valid characters are: a-z, 0-9 and .,-_'; -$wb['ssl_locality_error_regex'] = 'Invalid SSL Locality. Valid characters are: a-z, 0-9 and .,-_'; -$wb['ssl_organisation_error_regex'] = 'Invalid SSL Organisation. Valid characters are: a-z, 0-9 and .,-_'; -$wb['ssl_organistaion_unit_error_regex'] = 'Invalid SSL Organisation Unit. Valid characters are: a-z, 0-9 and .,-_'; -$wb['ssl_country_error_regex'] = 'Invalid SSL Country. Valid characters are: A-Z'; -$wb['limit_traffic_quota_free_txt'] = 'Max. available Traffic Quota'; -$wb['redirect_error_regex'] = 'Invalid redirect path. Valid redirects are for example: /test/ or https://www.domain.tld/test/'; -$wb['php_open_basedir_txt'] = 'PHP open_basedir'; -$wb['traffic_quota_exceeded_txt'] = 'Traffic quota exceeded'; -$wb['backup_interval_txt'] = 'Backup interval'; -$wb['backup_copies_txt'] = 'Number of backup copies'; +$wb['limit_web_domain_txt'] = 'Hai raggiunto il numero massimo di siti Web.'; +$wb['limit_web_aliasdomain_txt'] = 'Hai raggiunto il numero massimo di domini Alias.'; +$wb['limit_web_subdomain_txt'] = 'Hai raggiunto il numero massimo di sottodomini Web.'; +$wb['apache_directives_txt'] = 'Direttive Apache'; +$wb['domain_error_empty'] = 'Il Dominio è vuoto.'; +$wb['domain_error_unique'] = 'Il Dominio deve essere unico.'; +$wb['domain_error_regex'] = 'Nome di Dominio non valido.'; +$wb['domain_error_acme_invalid'] = 'Errore di dominio acme.'; +$wb['hd_quota_error_empty'] = 'La quota disco è vuota.'; +$wb['traffic_quota_error_empty'] = 'La quota traffico è vuota.'; +$wb['error_ssl_state_empty'] = 'Lo Stato SSL è vuota'; +$wb['error_ssl_locality_empty'] = 'La Località SSL è vuota.'; +$wb['error_ssl_organisation_empty'] = 'SSL L\'Organizzazione è vuota.'; +$wb['error_ssl_organisation_unit_empty'] = 'SSL Il Reparto è vuoto.'; +$wb['error_ssl_country_empty'] = 'SSL Il Paese è vuoto.'; +$wb['subdomain_txt'] = 'Auto-Sottodominio'; +$wb['client_group_id_txt'] = 'Cliente'; +$wb['stats_password_txt'] = 'Password per le statistiche Web'; +$wb['ssl_domain_txt'] = 'SSL Dominio'; +$wb['allow_override_txt'] = 'Consenti di trascuraree'; +$wb['limit_web_quota_free_txt'] = 'Quota massima di disco'; +$wb['ssl_state_error_regex'] = 'SSL Stato non valido. Ammessi: a-z, 0-9 and .,-_'; +$wb['ssl_locality_error_regex'] = 'SSL Località non valida. Ammessi: a-z, 0-9 and .,-_'; +$wb['ssl_organisation_error_regex'] = 'SSL Organizzazione non valida. Ammessi: a-z, 0-9 and .,-_'; +$wb['ssl_organistaion_unit_error_regex'] = 'SSL Reparto non valido. Ammessi: a-z, 0-9 and .,-_'; +$wb['ssl_country_error_regex'] = 'SSL Paese non valido. Ammessi: A-Z'; +$wb['limit_traffic_quota_free_txt'] = 'Quota traffico massima disponibile'; +$wb['redirect_error_regex'] = 'Percorso di reindirizzamento non corretto. Esempi di percorsi corretti: /test/ or https://www.domain.tld/test/'; +$wb['php_open_basedir_txt'] = 'open_basedir PHP'; +$wb['traffic_quota_exceeded_txt'] = 'Superato quota di traffico'; +$wb['backup_interval_txt'] = 'Intervallo di backup'; +$wb['backup_copies_txt'] = 'Numero di copie di backup'; $wb['ruby_txt'] = 'Ruby'; -$wb['stats_user_txt'] = 'Webstatistics username'; -$wb['stats_type_txt'] = 'Webstatistics program'; -$wb['custom_php_ini_txt'] = 'Custom php.ini settings'; -$wb['error_ssl_cert_empty'] = 'SSL Certificate field is empty'; -$wb['ipv6_address_txt'] = 'IPv6-Address'; -$wb['none_txt'] = 'None'; -$wb['disabled_txt'] = 'Disabled'; -$wb['no_redirect_txt'] = 'No redirect'; -$wb['no_flag_txt'] = 'No flag'; -$wb['save_certificate_txt'] = 'Save certificate'; -$wb['create_certificate_txt'] = 'Create certificate'; -$wb['delete_certificate_txt'] = 'Delete certificate'; -$wb['nginx_directives_txt'] = 'nginx Directives'; -$wb['seo_redirect_txt'] = 'SEO Redirect'; +$wb['stats_user_txt'] = 'Username per statistiche Web'; +$wb['stats_type_txt'] = 'Gestore delle statistiche'; +$wb['custom_php_ini_txt'] = 'Impostazioni php.ini personalizzate'; +$wb['error_ssl_cert_empty'] = 'SSL Il campo certificato è vuoto'; +$wb['ipv6_address_txt'] = 'Indirizzo IPv6'; +$wb['none_txt'] = 'Nessuno'; +$wb['disabled_txt'] = 'Disabilitato'; +$wb['no_redirect_txt'] = 'Nessun reindirizzamento'; +$wb['no_flag_txt'] = 'Nessuna bandierina'; +$wb['save_certificate_txt'] = 'Salva il certificato'; +$wb['create_certificate_txt'] = 'Crea il certificato'; +$wb['delete_certificate_txt'] = 'Cancella il certificato'; +$wb['nginx_directives_txt'] = 'Direttive nginx'; +$wb['seo_redirect_txt'] = 'Reindirizzamento SEO'; $wb['non_www_to_www_txt'] = 'Non-www -> www'; $wb['www_to_non_www_txt'] = 'www -> non-www'; -$wb['php_fpm_use_socket_txt'] = 'Use Socket For PHP-FPM'; +$wb['php_fpm_use_socket_txt'] = 'Usa il Socket per PHP-FPM'; $wb['php_fpm_chroot_txt'] = 'Chroot PHP-FPM'; -$wb['error_no_sni_txt'] = 'SNI for SSL is not activated on this server. You can enable only one SSL certificate on each IP address.'; +$wb['error_no_sni_txt'] = 'SNI per SSL non attivo su questo server. Puoi abilitare un solo certificato SSL per ogni indirizzo IP.'; $wb['python_txt'] = 'Python'; $wb['pm_max_children_txt'] = 'PHP-FPM pm.max_children'; $wb['pm_start_servers_txt'] = 'PHP-FPM pm.start_servers'; $wb['pm_min_spare_servers_txt'] = 'PHP-FPM pm.min_spare_servers'; $wb['pm_max_spare_servers_txt'] = 'PHP-FPM pm.max_spare_servers'; -$wb['error_php_fpm_pm_settings_txt'] = 'Values of PHP-FPM pm settings must be as follows: pm.max_children >= pm.max_spare_servers >= pm.start_servers >= pm.min_spare_servers > 0'; -$wb['pm_max_children_error_regex'] = 'PHP-FPM pm.max_children must be a positive integer value.'; -$wb['pm_start_servers_error_regex'] = 'PHP-FPM pm.start_servers must be a positive integer value.'; -$wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers must be a positive integer value.'; -$wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; -$wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; -$wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; -$wb['ssl_key_txt'] = 'SSL Key'; +$wb['error_php_fpm_pm_settings_txt'] = 'I valori di PHP-FPM per pm devono soddisfare: pm.max_children >= pm.max_spare_servers >= pm.start_servers >= pm.min_spare_servers > 0'; +$wb['pm_max_children_error_regex'] = 'PHP-FPM pm.max_children deve essere un valore intero positivo.'; +$wb['pm_start_servers_error_regex'] = 'PHP-FPM pm.start_servers deve essere un valore intero positivo.'; +$wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers deve essere un valore intero positivo.'; +$wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers deve essere un valore intero positivo.'; +$wb['hd_quota_error_regex'] = 'Il valore di quota Disco non è valido.'; +$wb['traffic_quota_error_regex'] = 'Il valore di quota Traffico non è valido.'; +$wb['ssl_key_txt'] = 'SSL chiave'; $wb['perl_txt'] = 'Perl'; -$wb['server_php_id_txt'] = 'PHP Version'; -$wb['server_php_id_invalid_txt'] = 'PHP Version is invalid.'; -$wb['server_php_id_default_hidden_warning_txt'] = 'PHP Version was set to "default" but that can no longer be selected. Choose your desired PHP Version and save your settings.'; +$wb['server_php_id_txt'] = 'Versione PHP'; +$wb['server_php_id_invalid_txt'] = 'Versione PHP non corretta.'; +$wb['server_php_id_default_hidden_warning_txt'] = 'Versione PHP impostata al "default" ma tale valore non può più essere selezionato. Scegli il valore di versione PHP che desideri e salva l\'impostazione.'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; -$wb['pm_process_idle_timeout_error_regex'] = 'PHP-FPM pm.process_idle_timeout must be a positive integer value.'; -$wb['pm_max_requests_error_regex'] = 'PHP-FPM pm.max_requests must be an integer value >= 0.'; -$wb['pm_ondemand_hint_txt'] = 'Please note that you must have PHP version >= 5.3.9 in order to use the ondemand process manager. If you select ondemand for an older PHP version, PHP will not start anymore!'; -$wb['generate_password_txt'] = 'Generate Password'; -$wb['repeat_password_txt'] = 'Repeat Password'; -$wb['password_mismatch_txt'] = 'The passwords do not match.'; -$wb['password_match_txt'] = 'The passwords do match.'; -$wb['web_folder_error_regex'] = 'Invalid folder entered. Please do not enter a slash.'; -$wb['web_folder_error_empty'] = 'Web folder cannot be empty. Use /web/ to make the same as the Parent Website'; -$wb['domain_error_autosub'] = 'There is already a subdomain with these settings.'; -$wb['available_php_directive_snippets_txt'] = 'Available PHP Directive Snippets:'; -$wb['available_apache_directive_snippets_txt'] = 'Available Apache Directive Snippets:'; -$wb['available_nginx_directive_snippets_txt'] = 'Available nginx Directive Snippets:'; -$wb['proxy_directives_txt'] = 'Proxy Directives'; -$wb['available_proxy_directive_snippets_txt'] = 'Available Proxy Directive Snippets:'; -$wb['no_server_error'] = 'No server selected.'; -$wb['no_backup_txt'] = 'No backup'; -$wb['daily_backup_txt'] = 'Daily'; -$wb['weekly_backup_txt'] = 'Weekly'; -$wb['monthly_backup_txt'] = 'Monthly'; +$wb['pm_process_idle_timeout_error_regex'] = 'PHP-FPM pm.process_idle_timeout deve essere un valore intero positivo.'; +$wb['pm_max_requests_error_regex'] = 'PHP-FPM pm.max_requests deve essere un valore intero positivo >= 0.'; +$wb['pm_ondemand_hint_txt'] = 'Devi avere una versione PHP >= 5.3.9 per utilizzare il processo on demand. Se selezioni ondemand con una versione PHP più vecchia, PHP non ripartirà più!'; +$wb['generate_password_txt'] = 'Genera una Password'; +$wb['repeat_password_txt'] = 'Ripeti Password'; +$wb['password_mismatch_txt'] = 'Le password sono diverse.'; +$wb['password_match_txt'] = 'Le password coincidono.'; +$wb['web_folder_error_regex'] = 'Cartella non valida. Non inserire la sbarra.'; +$wb['web_folder_error_empty'] = 'La cartella Web non può essere vuota. Usa /web/ per assegnare lo stesso al sito Web genitore'; +$wb['domain_error_autosub'] = 'C\'è già un sottodominio con le stesse impostazioni.'; +$wb['available_php_directive_snippets_txt'] = 'Direttive PHP Snippets disponibili:'; +$wb['available_apache_directive_snippets_txt'] = 'Direttive Apache Snippets disponibili:'; +$wb['available_nginx_directive_snippets_txt'] = 'Direttive nginx Snippets disponibili:'; +$wb['proxy_directives_txt'] = 'Direttive Proxy'; +$wb['available_proxy_directive_snippets_txt'] = 'Direttive Proxy Snippets disponibili:'; +$wb['no_server_error'] = 'Nessun server selezionato.'; +$wb['no_backup_txt'] = 'Nessu backup'; +$wb['daily_backup_txt'] = 'Giornaliero'; +$wb['weekly_backup_txt'] = 'Settimanale'; +$wb['monthly_backup_txt'] = 'Mensile'; $wb['rewrite_rules_txt'] = 'Rewrite Rules'; -$wb['invalid_rewrite_rules_txt'] = 'Invalid Rewrite Rules'; -$wb['allowed_rewrite_rule_directives_txt'] = 'Allowed Directives:'; -$wb['configuration_error_txt'] = 'CONFIGURATION ERROR'; -$wb['web_folder_txt'] = 'Web folder'; -$wb['web_folder_invalid_txt'] = 'The web folder is invalid, please choose a different one.'; -$wb['web_folder_unique_txt'] = 'The web folder is already used, please choose a different one.'; +$wb['invalid_rewrite_rules_txt'] = 'Rewrite Rules non valide'; +$wb['allowed_rewrite_rule_directives_txt'] = 'Directive consentite:'; +$wb['configuration_error_txt'] = 'ERRORE DI CONFIGURAZIONE'; +$wb['web_folder_txt'] = 'Cartella Web'; +$wb['web_folder_invalid_txt'] = 'La cartella web non è valida, usa un percorso differente.'; +$wb['web_folder_unique_txt'] = 'La cartella web è già usata, usa un percorso differente.'; $wb['host_txt'] = 'Hostname'; -$wb['domain_error_wildcard'] = 'Wildcard subdomains are not allowed.'; -$wb['variables_txt'] = 'Variables'; -$wb['added_by_txt'] = 'Added by'; -$wb['added_date_txt'] = 'Added date'; -$wb['backup_excludes_txt'] = 'Excluded Directories'; -$wb['backup_excludes_note_txt'] = '(Separate multiple directories with commas. Example: web/cache/*,web/backup)'; -$wb['backup_excludes_error_regex'] = 'The excluded directories contain invalid characters.'; -$wb['server_chosen_not_ok'] = 'The selected server is not allowed for this account.'; -$wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.'; -$wb['btn_save_txt'] = 'Save'; -$wb['btn_cancel_txt'] = 'Cancel'; -$wb['load_client_data_txt'] = 'Load client details'; -$wb['load_my_data_txt'] = 'Load my contact details'; -$wb['reset_client_data_txt'] = 'Reset data'; -$wb['rewrite_to_https_txt'] = 'Rewrite HTTP to HTTPS'; -$wb['password_strength_txt'] = 'Password strength'; -$wb['directive_snippets_id_txt'] = 'Web server config'; -$wb['http_port_txt'] = 'HTTP Port'; -$wb['https_port_txt'] = 'HTTPS Port'; -$wb['http_port_error_regex'] = 'HTTP Port invalid.'; -$wb['https_port_error_regex'] = 'HTTPS Port invalid.'; -$wb['enable_pagespeed_txt'] = 'Enable PageSpeed'; -$wb['log_retention_txt'] = 'Logfiles retention time'; -$wb['log_retention_error_regex'] = 'Retention time in days (allowed values: min. 0 - max. 9999)'; -$wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; -$wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; -$wb['backup_format_web_txt'] = 'Backup format for web files'; -$wb['backup_format_db_txt'] = 'Backup format for database'; -$wb['backup_missing_utils_txt'] = 'The following formats can not be used because they are not installed on the webserver: '; -$wb['backup_compression_options_txt'] = 'Compression options'; -$wb['backup_encryption_note_txt'] = 'Encryption is only available for 7z, RAR, and zip (not secure).'; -$wb['backup_encryption_options_txt'] = 'Encryption options'; -$wb['backup_enable_encryption_txt'] = 'Enable encryption'; +$wb['domain_error_wildcard'] = 'I sottodomini * non sono consentiti.'; +$wb['variables_txt'] = 'Variabili'; +$wb['added_by_txt'] = 'Aggiunto da'; +$wb['added_date_txt'] = 'Data di inserimento'; +$wb['backup_excludes_txt'] = 'Directory escluse'; +$wb['backup_excludes_note_txt'] = '(Separare le directory con una virgola. Esempio: web/cache/*,web/backup)'; +$wb['backup_excludes_error_regex'] = 'Le directory inserite contengono caratteri non corretti.'; +$wb['server_chosen_not_ok'] = 'Il server selezionato non è abilitato al tuo profilo.'; +$wb['subdomain_error_empty'] = 'Il campo sottodominio è vuoto o contiene caratteri non validi.'; +$wb['btn_save_txt'] = 'Salva'; +$wb['btn_cancel_txt'] = 'Annulla'; +$wb['load_client_data_txt'] = 'Carica i dettagli del cliente'; +$wb['load_my_data_txt'] = 'Carica i dettagli del mio contatto'; +$wb['reset_client_data_txt'] = 'Cancella i dati'; +$wb['rewrite_to_https_txt'] = 'Riscrivi HTTP to HTTPS'; +$wb['password_strength_txt'] = 'Forza della password'; +$wb['directive_snippets_id_txt'] = 'Configurazione Web server'; +$wb['http_port_txt'] = 'Porta HTTP'; +$wb['https_port_txt'] = 'Porta HTTPS'; +$wb['http_port_error_regex'] = 'Porta HTTP non valida.'; +$wb['https_port_error_regex'] = 'Porta HTTPS non valida.'; +$wb['enable_pagespeed_txt'] = 'Abilita PageSpeed'; +$wb['log_retention_txt'] = 'Durata di mantenimento dei file di log'; +$wb['log_retention_error_regex'] = 'Tempo di mantenimento in giorni (valori consentiti: min. 0 - max. 9999)'; +$wb['limit_web_quota_not_0_txt'] = 'Quota disco non può essere 0.'; +$wb['proxy_protocol_txt'] = 'Abilita protocollo PROXY'; +$wb['backup_format_web_txt'] = 'Formato Backup per i file web'; +$wb['backup_format_db_txt'] = 'Formato Backup per il database'; +$wb['backup_missing_utils_txt'] = 'I seguenti formati non possono essere usati perchè non sono installati sul server web: '; +$wb['backup_compression_options_txt'] = 'Opzioni di compressione'; +$wb['backup_encryption_note_txt'] = 'La cifratura è disponibile solo per i formati 7z, RAR e zip (poco sicura).'; +$wb['backup_encryption_options_txt'] = 'Opzioni di cifratura'; +$wb['backup_enable_encryption_txt'] = 'Abilita cifratura'; $wb['backup_password_txt'] = 'Password'; -$wb['backup_format_default_txt'] = 'Default: zip (deflate) or tar (gzip)'; +$wb['backup_format_default_txt'] = 'Default: zip (deflate) o tar (gzip)'; $wb['backup_format_zip_txt'] = 'zip (deflate)'; $wb['backup_format_gzip_txt'] = 'gzip'; $wb['backup_format_bzip2_txt'] = 'bzip2'; @@ -186,19 +186,19 @@ $wb['backup_format_tar_7z_lzma_txt'] = 'tar + 7z (LZMA)'; $wb['backup_format_tar_7z_lzma2_txt'] = 'tar + 7z (LZMA2)'; $wb['backup_format_tar_7z_ppmd_txt'] = 'tar + 7z (PPMd)'; $wb['backup_format_tar_7z_bzip2_txt'] = 'tar + 7z (BZip2)'; -$wb['dependent_domains_txt'] = 'Dependent sub- / aliasdomains'; -$wb['error_ipv4_change_forbidden'] = 'The IP cannot be changed. Please contact your administrator if you want to change the IPv4 address.'; -$wb['error_ipv6_change_forbidden'] = 'The IP cannot be changed. Please contact your administrator if you want to change the IPv6 address.'; -$wb['error_domain_change_forbidden'] = 'The domain name cannot be changed. Please contact your administrator if you want to change the domain name.'; -$wb['error_server_change_not_possible'] = 'The server cannot be changed.'; -$wb['jailkit_chroot_app_sections_txt'] = 'Jailkit chroot app sections'; -$wb['jailkit_chroot_app_programs_txt'] = 'Jailkit chrooted applications'; -$wb['jailkit_chroot_app_sections_error_empty'] = 'Jailkit chroot app sections vuoto.'; -$wb['jailkit_chroot_app_programs_error_empty'] = 'Jailkit chrooted applications vuoto.'; -$wb['jailkit_chroot_app_sections_error_regex'] = 'Invalid jaikit chroot sections.'; -$wb['jailkit_chroot_app_programs_error_regex'] = 'Invalid jaikit chroot app programs.'; -$wb['tooltip_jailkit_chroot_app_sections_txt'] = 'When empty, uses Jailkit chroot app sections from Server Config'; -$wb['tooltip_jailkit_chroot_app_programs_txt'] = 'When empty, uses Jailkit chroot applications from Server Config'; -$wb['delete_unused_jailkit_txt'] = 'Delete unused jailkit chroot'; -$wb['tooltip_delete_unused_jailkit_txt'] = 'Delete the jailkit chroot environment when there are no shell users or cron jobs which require it.'; -$wb['ssl_options_not_for_le_txt'] = 'You have Let\'s Encrypt certificates enabled for this website. Please be aware that all options on this page apply to non-Let\'s Encrypt certificates only. Remember to uncheck Let\'s Encrypt on the main tab if you want to switch to a different certificate.'; +$wb['dependent_domains_txt'] = ' sub- / alias dominio dipendente'; +$wb['error_ipv4_change_forbidden'] = 'Il numero IP non può essere cambiato. Contatta l\'amministratore se vuoi cambiare l\'indirizzo IP v4.'; +$wb['error_ipv6_change_forbidden'] = 'Il numero IP non può essere cambiato. Contatta l\'amministratore se vuoi cambiare l\'indirizzo IP v6.'; +$wb['error_domain_change_forbidden'] = 'Il dominio non può essere cambiato. Contatta l\'amministratore se vuoi cambiare il nome di dominio.'; +$wb['error_server_change_not_possible'] = 'Il server non può essere cambiato.'; +$wb['jailkit_chroot_app_sections_txt'] = 'Sezione Jailkit chroot app'; +$wb['jailkit_chroot_app_programs_txt'] = 'Applicazioni Jailkit chrooted'; +$wb['jailkit_chroot_app_sections_error_empty'] = 'Sezione Jailkit chroot app vuota.'; +$wb['jailkit_chroot_app_programs_error_empty'] = 'Applicazioni Jailkit chrooted vuota.'; +$wb['jailkit_chroot_app_sections_error_regex'] = 'Sezione Jailkit chroot non valida.'; +$wb['jailkit_chroot_app_programs_error_regex'] = 'Programmi Jailkit chroot app non validi.'; +$wb['tooltip_jailkit_chroot_app_sections_txt'] = 'Se vuota, usa la sezione Jailkit chroot app dalle configurazioni del server.'; +$wb['tooltip_jailkit_chroot_app_programs_txt'] = 'Se vuota, usa la sezione Jailkit chroot applications della configurazione del Server'; +$wb['delete_unused_jailkit_txt'] = 'Cancella jailkit chroot non usate'; +$wb['tooltip_delete_unused_jailkit_txt'] = 'Cancella l\'ambiente jailkit chroot quando non sono presenti utenti della shell o job cron che lo richiedono.'; +$wb['ssl_options_not_for_le_txt'] = 'Hai abilitato i certificati Let\'Encrypt per questo sito Web. Considera che tutte le opzioni di questa pagina si applicano a ai certificati non Let\'Encrypt solamente. Ricorda di deselezionare l\'opzione Let\'s Encrypt nella scheda principale se vuoi passare ad certificato differente.'; diff --git a/interface/web/sites/lib/lang/it_web_vhost_domain_admin_list.lng b/interface/web/sites/lib/lang/it_web_vhost_domain_admin_list.lng index 4f07fd858847320507e6139e777fbce2abb646c2..db7fbdb378a55f73f0bef01d1b1399b4a7b81cc8 100644 --- a/interface/web/sites/lib/lang/it_web_vhost_domain_admin_list.lng +++ b/interface/web/sites/lib/lang/it_web_vhost_domain_admin_list.lng @@ -1,14 +1,14 @@ <?php -$wb['sys_groupid_txt'] = 'Client'; -$wb['list_head_txt'] = 'Websites'; +$wb['sys_groupid_txt'] = 'Cliente'; +$wb['list_head_txt'] = 'Sito Web'; $wb['domain_id_txt'] = 'ID'; -$wb['active_txt'] = 'Active'; +$wb['active_txt'] = 'Attivo'; $wb['server_id_txt'] = 'Server'; -$wb['domain_txt'] = 'Domain'; -$wb['add_new_record_txt'] = 'Add new website'; -$wb['add_new_subdomain_txt'] = 'Add new subdomain'; -$wb['add_new_aliasdomain_txt'] = 'Add new aliasdomain'; -$wb['domain_list_head_txt'] = 'Websites'; -$wb['aliasdomain_list_head_txt'] = 'Aliasdomains (Vhost)'; -$wb['subdomain_list_head_txt'] = 'Subdomains (Vhost)'; +$wb['domain_txt'] = 'Dominio'; +$wb['add_new_record_txt'] = 'Aggiungi un sito Web'; +$wb['add_new_subdomain_txt'] = 'Aggiungi un sottodominion'; +$wb['add_new_aliasdomain_txt'] = 'Aggiungi un Alias di dominio'; +$wb['domain_list_head_txt'] = 'Siti Web'; +$wb['aliasdomain_list_head_txt'] = 'dominio Alias (Vhost)'; +$wb['subdomain_list_head_txt'] = 'Sottodominio (Vhost)'; ?> diff --git a/interface/web/sites/lib/lang/it_web_vhost_domain_list.lng b/interface/web/sites/lib/lang/it_web_vhost_domain_list.lng index b1ce2136c2e305dc49e79bbb87eb914b11ae9f94..4093dca27f6058c3ef33943a8302c1873b8ba681 100644 --- a/interface/web/sites/lib/lang/it_web_vhost_domain_list.lng +++ b/interface/web/sites/lib/lang/it_web_vhost_domain_list.lng @@ -6,9 +6,9 @@ $wb['server_id_txt'] = 'Server'; $wb['domain_txt'] = 'Dominio'; $wb['add_new_record_txt'] = 'Aggiungi nuovo sito'; $wb['parent_domain_id_txt'] = 'Website'; -$wb['add_new_subdomain_txt'] = 'Add new subdomain'; -$wb['add_new_aliasdomain_txt'] = 'Add new aliasdomain'; -$wb['domain_list_head_txt'] = 'Websites'; -$wb['aliasdomain_list_head_txt'] = 'Aliasdomains (Vhost)'; -$wb['subdomain_list_head_txt'] = 'Subdomains (Vhost)'; +$wb['add_new_subdomain_txt'] = 'Aggiungi nuovo sottodominio'; +$wb['add_new_aliasdomain_txt'] = 'Aggiungi nuovo alis di dominio'; +$wb['domain_list_head_txt'] = 'Siti Web'; +$wb['aliasdomain_list_head_txt'] = 'Alias dominio (Vhost)'; +$wb['subdomain_list_head_txt'] = 'Subdominio (Vhost)'; ?> diff --git a/interface/web/sites/lib/lang/it_web_vhost_subdomain.lng b/interface/web/sites/lib/lang/it_web_vhost_subdomain.lng index 5366e37bafbb0e78018de210d058aead00a0c912..7caed382ae7d440409b52eec4ebc876f4419eecb 100644 --- a/interface/web/sites/lib/lang/it_web_vhost_subdomain.lng +++ b/interface/web/sites/lib/lang/it_web_vhost_subdomain.lng @@ -1,40 +1,40 @@ <?php -$wb['parent_domain_id_txt'] = 'Parent Website'; +$wb['parent_domain_id_txt'] = 'Website genitore'; $wb['web_folder_txt'] = 'Cartella Web'; -$wb['web_folder_invalid_txt'] = 'La cartella web è errata, indicarne una diversa.'; -$wb['web_folder_unique_txt'] = 'La cartella web è già utilizzata, selezionarne una diversa.'; +$wb['web_folder_invalid_txt'] = 'La cartella web è errata, indicarne una diversa.'; +$wb['web_folder_unique_txt'] = 'La cartella web è già utilizzata, selezionarne una diversa.'; $wb['backup_interval_txt'] = 'Intervallo Backup'; $wb['backup_copies_txt'] = 'Numero copie di backup'; $wb['ssl_state_txt'] = 'Stato'; $wb['ssl_locality_txt'] = 'Città '; $wb['ssl_organisation_txt'] = 'Organizzazione'; -$wb['ssl_organisation_unit_txt'] = 'Unità Organizzazione'; +$wb['ssl_organisation_unit_txt'] = 'Reparto'; $wb['ssl_country_txt'] = 'Codice Nazione'; -$wb['ssl_key_txt'] = 'SSL Key'; -$wb['ssl_request_txt'] = 'SSL Request'; -$wb['ssl_cert_txt'] = 'SSL Certificate'; +$wb['ssl_key_txt'] = 'Chiave SSL'; +$wb['ssl_request_txt'] = 'Richiesta SSL'; +$wb['ssl_cert_txt'] = 'Certificato SSL'; $wb['ssl_bundle_txt'] = 'SSL Bundle'; -$wb['ssl_action_txt'] = 'SSL Action'; -$wb['ssl_domain_txt'] = 'SSL Domain'; +$wb['ssl_action_txt'] = 'Azione SSL'; +$wb['ssl_domain_txt'] = 'Dominio SSL'; $wb['server_id_txt'] = 'Server'; $wb['domain_txt'] = 'Dominio'; $wb['host_txt'] = 'Nome Host'; $wb['web_folder_error_regex'] = 'Cartella inserita non valida. Per favore non inserire uno slash.'; -$wb['web_folder_error_empty'] = 'Web folder cannot be empty. Use /web/ to make the same as the Parent Website'; +$wb['web_folder_error_empty'] = 'La cartella web non può essere vuota. Usare /web/ per la stessa cartella del sito Web genitore'; $wb['type_txt'] = 'Tipo'; $wb['redirect_type_txt'] = 'Tipo reinderizzamento'; -$wb['r_redirect_txt'] = 'R (Temporary redirect)'; -$wb['l_redirect_txt'] = 'L (Last redirect rule)'; -$wb['r_l_redirect_txt'] = 'R,L (Temporary redirect + last rule)'; -$wb['r_301_l_redirect_txt'] = 'R=301,L (Permanent redirect + last rule)'; +$wb['r_redirect_txt'] = 'R (Reindirizzamento temporaneo)'; +$wb['l_redirect_txt'] = 'L (Ultima regola di reindirizzamento)'; +$wb['r_l_redirect_txt'] = 'R,L (Reindirizzamento temporaneo + ultima regola)'; +$wb['r_301_l_redirect_txt'] = 'R=301,L (Reindirizzamento permanente + ultima regola)'; $wb['redirect_path_txt'] = 'Percorso Reinderizzamento'; $wb['active_txt'] = 'Attivo'; -$wb['document_root_txt'] = 'Documentroot'; +$wb['document_root_txt'] = 'Radice dei Documenti'; $wb['system_user_txt'] = 'Linux User'; $wb['system_group_txt'] = 'Linux Group'; $wb['ip_address_txt'] = 'Indirizzo IPv4'; $wb['ipv6_address_txt'] = 'Indirizzo IPv6'; -$wb['vhost_type_txt'] = 'VHost Type'; +$wb['vhost_type_txt'] = 'Tipo VHost'; $wb['hd_quota_txt'] = 'Quota Spazio Disco'; $wb['traffic_quota_txt'] = 'Quota Traffico'; $wb['cgi_txt'] = 'CGI'; @@ -45,35 +45,35 @@ $wb['ssl_txt'] = 'SSL'; $wb['suexec_txt'] = 'SuEXEC'; $wb['php_txt'] = 'PHP'; $wb['client_txt'] = 'Cliente'; -$wb['limit_web_domain_txt'] = 'Hai raggiunto il numero massimo di siti web per il tuo account.'; -$wb['limit_web_aliasdomain_txt'] = 'Hai raggiunto il numero massimo di domini alias per il tuo account.'; -$wb['limit_web_subdomain_txt'] = 'Hai raggiunto il numero massimo di sottodomini per il tuo account.'; +$wb['limit_web_domain_txt'] = 'Hai raggiunto il numero massimo di siti web per il tuo profilo.'; +$wb['limit_web_aliasdomain_txt'] = 'Hai raggiunto il numero massimo di domini alias per il tuo profilo.'; +$wb['limit_web_subdomain_txt'] = 'Hai raggiunto il numero massimo di sottodomini per il tuo profilo.'; $wb['apache_directives_txt'] = 'Direttive Apache'; -$wb['domain_error_empty'] = 'Domain vuoto.'; +$wb['domain_error_empty'] = 'Dominio vuoto.'; $wb['domain_error_unique'] = 'Esiste già un sito o sottodominio / dominio alias con questo nome dominio.'; $wb['domain_error_regex'] = 'Nome dominio non valido.'; -$wb['domain_error_wildcard'] = 'Non sono ammessi sottodomini wildcard.'; +$wb['domain_error_wildcard'] = 'Non sono ammessi sottodomini *.'; $wb['hd_quota_error_empty'] = 'Spazio disco 0 o vuoto.'; $wb['traffic_quota_error_empty'] = 'Quota Traffico vuoto.'; -$wb['error_ssl_state_empty'] = 'SSL State vuoto.'; -$wb['error_ssl_locality_empty'] = 'SSL Locality vuoto.'; -$wb['error_ssl_organisation_empty'] = 'SSL Organisation vuoto.'; -$wb['error_ssl_organisation_unit_empty'] = 'SSL Organisation Unit vuoto.'; -$wb['error_ssl_country_empty'] = 'SSL Country vuoto.'; -$wb['error_ssl_cert_empty'] = 'SSL Certificate field is empty'; +$wb['error_ssl_state_empty'] = 'SSL Stato vuoto.'; +$wb['error_ssl_locality_empty'] = 'SSL Località vuoto.'; +$wb['error_ssl_organisation_empty'] = 'SSL Organizzazione vuoto.'; +$wb['error_ssl_organisation_unit_empty'] = 'SSL Reparto vuoto.'; +$wb['error_ssl_country_empty'] = 'SSL Paese vuoto.'; +$wb['error_ssl_cert_empty'] = 'Campo Certificato SSL vuoto'; $wb['client_group_id_txt'] = 'Cliente'; -$wb['stats_password_txt'] = 'Statistiche Web password'; +$wb['stats_password_txt'] = 'password Statistiche Web'; $wb['allow_override_txt'] = 'Apache AllowOverride'; -$wb['limit_web_quota_free_txt'] = 'Max. available Harddisk Quota'; -$wb['ssl_state_error_regex'] = 'Invalid SSL State. Caratteri ammessi: a-z, 0-9 e .,-_'; -$wb['ssl_locality_error_regex'] = 'Invalid SSL Locality. Caratteri ammessi: a-z, 0-9 e .,-_'; -$wb['ssl_organisation_error_regex'] = 'Invalid SSL Organisation. Caratteri ammessi: a-z, 0-9 e .,-_'; -$wb['ssl_organistaion_unit_error_regex'] = 'Invalid SSL Organisation Unit. Caratteri ammessi: a-z, 0-9 e .,-_'; -$wb['ssl_country_error_regex'] = 'Invalid SSL Country. Valid characters are: A-Z'; -$wb['limit_traffic_quota_free_txt'] = 'Max. available Traffic Quota'; -$wb['redirect_error_regex'] = 'Invalid redirect path. Valid redirects are for example: /test/ or https://www.domain.tld/test/'; +$wb['limit_web_quota_free_txt'] = 'Max. quota disco disponibile'; +$wb['ssl_state_error_regex'] = 'SSL Stato non valido. Caratteri ammessi: a-z, 0-9 e .,-_'; +$wb['ssl_locality_error_regex'] = 'SSL Località non valida. Caratteri ammessi: a-z, 0-9 e .,-_'; +$wb['ssl_organisation_error_regex'] = 'SSL Organizzazione non valida. Caratteri ammessi: a-z, 0-9 e .,-_'; +$wb['ssl_organistaion_unit_error_regex'] = 'SSL Reparto non valido. Caratteri ammessi: a-z, 0-9 e .,-_'; +$wb['ssl_country_error_regex'] = 'SSL Paese non valido. Caratteri ammessi: are: A-Z'; +$wb['limit_traffic_quota_free_txt'] = 'Max. quota Traffico disponibile'; +$wb['redirect_error_regex'] = 'Percorso di reindirizzamento non valido. Esempi di percorsi validi: /test/ o https://www.domain.tld/test/'; $wb['php_open_basedir_txt'] = 'PHP open_basedir'; -$wb['traffic_quota_exceeded_txt'] = 'Traffic quota exceeded'; +$wb['traffic_quota_exceeded_txt'] = 'Quota Traffico superata'; $wb['ruby_txt'] = 'Ruby'; $wb['stats_user_txt'] = 'Statistiche Web nome utente'; $wb['stats_type_txt'] = 'Applicazione Statistiche Web'; @@ -82,14 +82,14 @@ $wb['none_txt'] = 'Nessuno'; $wb['disabled_txt'] = 'Disabilitato '; $wb['no_redirect_txt'] = 'Nessun reinderizzamento'; $wb['no_flag_txt'] = 'No flag'; -$wb['save_certificate_txt'] = 'Save certificate'; -$wb['create_certificate_txt'] = 'Crea certificate'; -$wb['delete_certificate_txt'] = 'Elimina certificate'; -$wb['nginx_directives_txt'] = 'nginx Directives'; -$wb['seo_redirect_txt'] = 'SEO Redirect'; +$wb['save_certificate_txt'] = 'Salva certificato'; +$wb['create_certificate_txt'] = 'Crea certificato'; +$wb['delete_certificate_txt'] = 'Elimina certificato'; +$wb['nginx_directives_txt'] = 'Direttive nginx'; +$wb['seo_redirect_txt'] = 'Reindirizzamento SEO'; $wb['non_www_to_www_txt'] = 'Non-www -> www'; $wb['www_to_non_www_txt'] = 'www -> non-www'; -$wb['php_fpm_use_socket_txt'] = 'Use Socket For PHP-FPM'; +$wb['php_fpm_use_socket_txt'] = 'Usare Socket per PHP-FPM'; $wb['error_no_sni_txt'] = 'SNI per SSL non attivo su questo server. Puoi abilitare un solo certificato SSL per indirizzo IP.'; $wb['python_txt'] = 'Python'; $wb['perl_txt'] = 'Perl'; @@ -97,39 +97,39 @@ $wb['pm_max_children_txt'] = 'PHP-FPM pm.max_children'; $wb['pm_start_servers_txt'] = 'PHP-FPM pm.start_servers'; $wb['pm_min_spare_servers_txt'] = 'PHP-FPM pm.min_spare_servers'; $wb['pm_max_spare_servers_txt'] = 'PHP-FPM pm.max_spare_servers'; -$wb['error_php_fpm_pm_settings_txt'] = 'Values of PHP-FPM pm settings must be as follows: pm.max_children >= pm.max_spare_servers >= pm.start_servers >= pm.min_spare_servers > 0'; -$wb['pm_max_children_error_regex'] = 'PHP-FPM pm.max_children deve essere un valore intero positivo.'; -$wb['pm_start_servers_error_regex'] = 'PHP-FPM pm.start_servers deve essere un valore intero positivo.'; -$wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers deve essere un valore intero positivo.'; -$wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers deve essere un valore intero positivo.'; -$wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; -$wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; -$wb['server_php_id_txt'] = 'PHP Version'; +$wb['error_php_fpm_pm_settings_txt'] = 'Valori di impostazioni PHP-FPM pm devono soddisfare: pm.max_children >= pm.max_spare_servers >= pm.start_servers >= pm.min_spare_servers > 0'; +$wb['pm_max_children_error_regex'] = 'PHP-FPM pm.max_children deve essere un valore intero positivo.'; +$wb['pm_start_servers_error_regex'] = 'PHP-FPM pm.start_servers deve essere un valore intero positivo.'; +$wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers deve essere un valore intero positivo.'; +$wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers deve essere un valore intero positivo.'; +$wb['hd_quota_error_regex'] = 'quota disco non è valido.'; +$wb['traffic_quota_error_regex'] = 'Quota Traffic non valida.'; +$wb['server_php_id_txt'] = 'Versione PHP'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; -$wb['pm_process_idle_timeout_error_regex'] = 'PHP-FPM pm.process_idle_timeout deve essere un valore intero positivo.'; -$wb['pm_max_requests_error_regex'] = 'PHP-FPM pm.max_requests must be an integer value >= 0.'; -$wb['pm_ondemand_hint_txt'] = 'Please note that you must have PHP version >= 5.3.9 in order to use the ondemand process manager. If you select ondemand for an older PHP version, PHP will not start anymore!'; +$wb['pm_process_idle_timeout_error_regex'] = 'PHP-FPM pm.process_idle_timeout deve essere un valore intero positivo.'; +$wb['pm_max_requests_error_regex'] = 'PHP-FPM pm.max_requests deve essere un intero >= 0.'; +$wb['pm_ondemand_hint_txt'] = 'Nota: che devi avere una versione PHP >= 5.3.9 per poter usare il processo ondemand. Se selezioni ondemand con una versione precedente di PHP, PHP non ripartirà più!'; $wb['generate_password_txt'] = 'Genera Password'; $wb['repeat_password_txt'] = 'Ripeti Password'; $wb['password_mismatch_txt'] = 'Le password non coincidono.'; $wb['password_match_txt'] = 'Le password coincidono.'; -$wb['available_php_directive_snippets_txt'] = 'Available PHP Directive Snippets:'; -$wb['available_apache_directive_snippets_txt'] = 'Available Apache Directive Snippets:'; -$wb['available_nginx_directive_snippets_txt'] = 'Available nginx Directive Snippets:'; -$wb['proxy_directives_txt'] = 'Proxy Directives'; -$wb['available_proxy_directive_snippets_txt'] = 'Available Proxy Directive Snippets:'; -$wb['rewrite_rules_txt'] = 'Rewrite Rules'; -$wb['invalid_rewrite_rules_txt'] = 'Invalid Rewrite Rules'; -$wb['allowed_rewrite_rule_directives_txt'] = 'Allowed Directives:'; -$wb['configuration_error_txt'] = 'CONFIGURATION ERROR'; -$wb['variables_txt'] = 'Variables'; -$wb['backup_excludes_txt'] = 'Excluded Directories'; -$wb['backup_excludes_note_txt'] = '(Separate multiple directories with commas. Example: web/cache/*,web/backup)'; -$wb['backup_excludes_error_regex'] = 'The excluded directories contain invalid characters.'; -$wb['subdomain_error_empty'] = 'The subdommain field is empty or contiene caratteri non validi.'; -$wb['http_port_txt'] = 'HTTP Port'; -$wb['https_port_txt'] = 'HTTPS Port'; -$wb['http_port_error_regex'] = 'HTTP Port invalid.'; -$wb['https_port_error_regex'] = 'HTTPS Port invalid.'; +$wb['available_php_directive_snippets_txt'] = 'Direttive PHP Snippets disponibili:'; +$wb['available_apache_directive_snippets_txt'] = 'Direttive Apache Snippets disponibili:'; +$wb['available_nginx_directive_snippets_txt'] = 'Direttive nginx Snippets disponibili:'; +$wb['proxy_directives_txt'] = 'Direttive Proxy'; +$wb['available_proxy_directive_snippets_txt'] = 'Direttive Proxy Snippets disponibili:'; +$wb['rewrite_rules_txt'] = 'Regole di riscrittura'; +$wb['invalid_rewrite_rules_txt'] = 'Regole di riscrittura non valide'; +$wb['allowed_rewrite_rule_directives_txt'] = 'Direttive consentite:'; +$wb['configuration_error_txt'] = 'ERRORE DI CONFIGURAZIONE'; +$wb['variables_txt'] = 'Variabili'; +$wb['backup_excludes_txt'] = 'Cartelle escluse'; +$wb['backup_excludes_note_txt'] = '(Separate le cartelle da virgola. Esempi: web/cache/*,web/backup)'; +$wb['backup_excludes_error_regex'] = 'TLe cartelle escluse contengono caratteri non ammessi.'; +$wb['subdomain_error_empty'] = 'Il campo sottodominio è vuoto o contiene caratteri non validi.'; +$wb['http_port_txt'] = 'Porta HTTP'; +$wb['https_port_txt'] = 'Porta HTTPS'; +$wb['http_port_error_regex'] = 'Porta HTTP non valida.'; +$wb['https_port_error_regex'] = 'Porta HTTPS non valida.'; diff --git a/interface/web/sites/lib/lang/it_webdav_user.lng b/interface/web/sites/lib/lang/it_webdav_user.lng index 37be4c086160d9fa7497e591c748f62cd74a82d3..71d3adc9d36cdbe288b10c7345b3b1862aaba52c 100644 --- a/interface/web/sites/lib/lang/it_webdav_user.lng +++ b/interface/web/sites/lib/lang/it_webdav_user.lng @@ -1,19 +1,19 @@ <?php -$wb['dir_txt'] = 'Direttrice'; +$wb['dir_txt'] = 'Directory'; $wb['server_id_txt'] = 'Server'; $wb['parent_domain_id_txt'] = 'Sito Web'; $wb['username_txt'] = 'Nome Utente'; $wb['password_txt'] = 'Password'; $wb['password_strength_txt'] = 'Livello sicurezza Password'; $wb['active_txt'] = 'Attivo'; -$wb['limit_webdav_user_txt'] = 'Numero massimo utenti webdav per il tuo account,raggiunto.'; +$wb['limit_webdav_user_txt'] = 'Hai raggiunto il numero massimo utenti webdav per il tuo profilo.'; $wb['username_error_empty'] = 'Username vuoto.'; $wb['username_error_unique'] = 'Il nome utente deve essere unico.'; $wb['username_error_regex'] = 'Il nome utente contiene caratteri che non sono consentiti.'; -$wb['directory_error_empty'] = 'Direttrice vuota.'; +$wb['directory_error_empty'] = 'Direttory vuota.'; $wb['parent_domain_id_error_empty'] = 'Nessun sito web selezionato.'; -$wb['dir_dot_error'] = 'No .. in path allowed.'; -$wb['dir_slashdot_error'] = 'No ./ in path allowed.'; +$wb['dir_dot_error'] = 'Non è consentito .. nel percorso.'; +$wb['dir_slashdot_error'] = 'Non è consentito ./ nel percorso.'; $wb['generate_password_txt'] = 'Genera Password'; $wb['repeat_password_txt'] = 'Ripeti Password'; $wb['password_mismatch_txt'] = 'Le password non coincidono.'; diff --git a/interface/web/sites/lib/lang/ja_web_backup_list.lng b/interface/web/sites/lib/lang/ja_web_backup_list.lng index 8f0d3a7469f807d706676c8581e3ea704584baec..0f19d9339ed75bcaaf730ee4b62bacc1cc70e4f9 100644 --- a/interface/web/sites/lib/lang/ja_web_backup_list.lng +++ b/interface/web/sites/lib/lang/ja_web_backup_list.lng @@ -30,6 +30,7 @@ $wb['manual_backup_title_txt'] = 'Manual backup'; $wb['make_backup_web_txt'] = 'Make backup of web files'; $wb['make_backup_database_txt'] = 'Make backup of databases'; $wb['make_backup_confirm_txt'] = 'You are about to start a manual backup process. Manual backups count towards the total number of allowed backup copies: therefore if the limit will be exceeded, then oldest backups may be deleted automatically. Proceed?'; +$wb['final_size_txt'] = 'Final download size may vary depending on selected compression format.'; $wb['yes_txt'] = 'Yes'; $wb['no_txt'] = 'No'; $wb['backup_is_encrypted_txt'] = 'Encrypted'; diff --git a/interface/web/sites/lib/lang/nl_web_backup_list.lng b/interface/web/sites/lib/lang/nl_web_backup_list.lng index 8f0d3a7469f807d706676c8581e3ea704584baec..0f19d9339ed75bcaaf730ee4b62bacc1cc70e4f9 100644 --- a/interface/web/sites/lib/lang/nl_web_backup_list.lng +++ b/interface/web/sites/lib/lang/nl_web_backup_list.lng @@ -30,6 +30,7 @@ $wb['manual_backup_title_txt'] = 'Manual backup'; $wb['make_backup_web_txt'] = 'Make backup of web files'; $wb['make_backup_database_txt'] = 'Make backup of databases'; $wb['make_backup_confirm_txt'] = 'You are about to start a manual backup process. Manual backups count towards the total number of allowed backup copies: therefore if the limit will be exceeded, then oldest backups may be deleted automatically. Proceed?'; +$wb['final_size_txt'] = 'Final download size may vary depending on selected compression format.'; $wb['yes_txt'] = 'Yes'; $wb['no_txt'] = 'No'; $wb['backup_is_encrypted_txt'] = 'Encrypted'; diff --git a/interface/web/sites/lib/lang/pl_web_backup_list.lng b/interface/web/sites/lib/lang/pl_web_backup_list.lng index dfdd53c25f43273ac9717e40ed16f8d91183578d..6185db50a341636a79124757d1171cd4317b11f6 100644 --- a/interface/web/sites/lib/lang/pl_web_backup_list.lng +++ b/interface/web/sites/lib/lang/pl_web_backup_list.lng @@ -30,6 +30,7 @@ $wb['manual_backup_title_txt'] = 'Manual backup'; $wb['make_backup_web_txt'] = 'Make backup of web files'; $wb['make_backup_database_txt'] = 'Make backup of databases'; $wb['make_backup_confirm_txt'] = 'You are about to start a manual backup process. Manual backups count towards the total number of allowed backup copies: therefore if the limit will be exceeded, then oldest backups may be deleted automatically. Proceed?'; +$wb['final_size_txt'] = 'Final download size may vary depending on selected compression format.'; $wb['yes_txt'] = 'Yes'; $wb['no_txt'] = 'No'; $wb['backup_is_encrypted_txt'] = 'Encrypted'; diff --git a/interface/web/sites/lib/lang/pt_web_backup_list.lng b/interface/web/sites/lib/lang/pt_web_backup_list.lng index 8f0d3a7469f807d706676c8581e3ea704584baec..0f19d9339ed75bcaaf730ee4b62bacc1cc70e4f9 100644 --- a/interface/web/sites/lib/lang/pt_web_backup_list.lng +++ b/interface/web/sites/lib/lang/pt_web_backup_list.lng @@ -30,6 +30,7 @@ $wb['manual_backup_title_txt'] = 'Manual backup'; $wb['make_backup_web_txt'] = 'Make backup of web files'; $wb['make_backup_database_txt'] = 'Make backup of databases'; $wb['make_backup_confirm_txt'] = 'You are about to start a manual backup process. Manual backups count towards the total number of allowed backup copies: therefore if the limit will be exceeded, then oldest backups may be deleted automatically. Proceed?'; +$wb['final_size_txt'] = 'Final download size may vary depending on selected compression format.'; $wb['yes_txt'] = 'Yes'; $wb['no_txt'] = 'No'; $wb['backup_is_encrypted_txt'] = 'Encrypted'; diff --git a/interface/web/sites/lib/lang/ro_web_backup_list.lng b/interface/web/sites/lib/lang/ro_web_backup_list.lng index 8f0d3a7469f807d706676c8581e3ea704584baec..0f19d9339ed75bcaaf730ee4b62bacc1cc70e4f9 100644 --- a/interface/web/sites/lib/lang/ro_web_backup_list.lng +++ b/interface/web/sites/lib/lang/ro_web_backup_list.lng @@ -30,6 +30,7 @@ $wb['manual_backup_title_txt'] = 'Manual backup'; $wb['make_backup_web_txt'] = 'Make backup of web files'; $wb['make_backup_database_txt'] = 'Make backup of databases'; $wb['make_backup_confirm_txt'] = 'You are about to start a manual backup process. Manual backups count towards the total number of allowed backup copies: therefore if the limit will be exceeded, then oldest backups may be deleted automatically. Proceed?'; +$wb['final_size_txt'] = 'Final download size may vary depending on selected compression format.'; $wb['yes_txt'] = 'Yes'; $wb['no_txt'] = 'No'; $wb['backup_is_encrypted_txt'] = 'Encrypted'; diff --git a/interface/web/sites/lib/lang/ru_web_backup_list.lng b/interface/web/sites/lib/lang/ru_web_backup_list.lng index 2a92f2761b1d05f012f5ca78edb485bef4877eaa..3569ae7c09f816a78b24b88ab87140697656f53a 100644 --- a/interface/web/sites/lib/lang/ru_web_backup_list.lng +++ b/interface/web/sites/lib/lang/ru_web_backup_list.lng @@ -30,6 +30,7 @@ $wb['manual_backup_title_txt'] = 'Manual backup'; $wb['make_backup_web_txt'] = 'Make backup of web files'; $wb['make_backup_database_txt'] = 'Make backup of databases'; $wb['make_backup_confirm_txt'] = 'You are about to start a manual backup process. Manual backups count towards the total number of allowed backup copies: therefore if the limit will be exceeded, then oldest backups may be deleted automatically. Proceed?'; +$wb['final_size_txt'] = 'Final download size may vary depending on selected compression format.'; $wb['yes_txt'] = 'Yes'; $wb['no_txt'] = 'No'; $wb['backup_is_encrypted_txt'] = 'Encrypted'; diff --git a/interface/web/sites/lib/lang/se_web_backup_list.lng b/interface/web/sites/lib/lang/se_web_backup_list.lng index 8e0167aa136ab0ed482b4864a9b3167d69cea6f5..3f210ecc4298fe1867c926d9c29301abbc48a158 100644 --- a/interface/web/sites/lib/lang/se_web_backup_list.lng +++ b/interface/web/sites/lib/lang/se_web_backup_list.lng @@ -30,6 +30,7 @@ $wb['manual_backup_title_txt'] = 'Manual backup'; $wb['make_backup_web_txt'] = 'Make backup of web files'; $wb['make_backup_database_txt'] = 'Make backup of databases'; $wb['make_backup_confirm_txt'] = 'You are about to start a manual backup process. Manual backups count towards the total number of allowed backup copies: therefore if the limit will be exceeded, then oldest backups may be deleted automatically. Proceed?'; +$wb['final_size_txt'] = 'Final download size may vary depending on selected compression format.'; $wb['yes_txt'] = 'Yes'; $wb['no_txt'] = 'No'; $wb['backup_is_encrypted_txt'] = 'Encrypted'; diff --git a/interface/web/sites/lib/lang/sk_web_backup_list.lng b/interface/web/sites/lib/lang/sk_web_backup_list.lng index 8f0d3a7469f807d706676c8581e3ea704584baec..0f19d9339ed75bcaaf730ee4b62bacc1cc70e4f9 100644 --- a/interface/web/sites/lib/lang/sk_web_backup_list.lng +++ b/interface/web/sites/lib/lang/sk_web_backup_list.lng @@ -30,6 +30,7 @@ $wb['manual_backup_title_txt'] = 'Manual backup'; $wb['make_backup_web_txt'] = 'Make backup of web files'; $wb['make_backup_database_txt'] = 'Make backup of databases'; $wb['make_backup_confirm_txt'] = 'You are about to start a manual backup process. Manual backups count towards the total number of allowed backup copies: therefore if the limit will be exceeded, then oldest backups may be deleted automatically. Proceed?'; +$wb['final_size_txt'] = 'Final download size may vary depending on selected compression format.'; $wb['yes_txt'] = 'Yes'; $wb['no_txt'] = 'No'; $wb['backup_is_encrypted_txt'] = 'Encrypted'; diff --git a/interface/web/sites/lib/lang/tr_web_backup_list.lng b/interface/web/sites/lib/lang/tr_web_backup_list.lng index 51bca34f2e40f292a55f5989de3b41b24c71475c..c61a5ab0180588c2c6320eb7ed3e655c894791fd 100644 --- a/interface/web/sites/lib/lang/tr_web_backup_list.lng +++ b/interface/web/sites/lib/lang/tr_web_backup_list.lng @@ -30,6 +30,7 @@ $wb['manual_backup_title_txt'] = 'Manual backup'; $wb['make_backup_web_txt'] = 'Make backup of web files'; $wb['make_backup_database_txt'] = 'Make backup of databases'; $wb['make_backup_confirm_txt'] = 'You are about to start a manual backup process. Manual backups count towards the total number of allowed backup copies: therefore if the limit will be exceeded, then oldest backups may be deleted automatically. Proceed?'; +$wb['final_size_txt'] = 'Final download size may vary depending on selected compression format.'; $wb['yes_txt'] = 'Yes'; $wb['no_txt'] = 'No'; $wb['backup_is_encrypted_txt'] = 'Encrypted'; diff --git a/interface/web/themes/default/assets/javascripts/ispconfig.js b/interface/web/themes/default/assets/javascripts/ispconfig.js index c634ff7fb2fe314e85c640d8643b850beb47a67c..18940f6f3ba183a8af83e54bab0db50d5d6bf5d8 100644 --- a/interface/web/themes/default/assets/javascripts/ispconfig.js +++ b/interface/web/themes/default/assets/javascripts/ispconfig.js @@ -739,7 +739,7 @@ $(document).on("click", "[data-uncheck-fields] > input[type='checkbox']", functi } }); -$(document).on('ready', function () { +$(document).ready(function() { $.fn.extend({ insertAtCaret: function(myValue){ return this.each(function(i) { diff --git a/interface/web/themes/default/assets/stylesheets/ispconfig.css b/interface/web/themes/default/assets/stylesheets/ispconfig.css index 9d44048e82843cf8fbe5b4fd36e8c2adf9d06adc..b614bebdf5ed1fe4e60fca4a4b1ba4e59e6fb924 100644 --- a/interface/web/themes/default/assets/stylesheets/ispconfig.css +++ b/interface/web/themes/default/assets/stylesheets/ispconfig.css @@ -340,34 +340,30 @@ thead.dark th.tiny-col { text-overflow: ellipsis; } thead.dark th[data-column] { - cursor: pointer; + cursor: pointer; + position: relative; +} + +thead.dark th[data-column]:before { + content: "⇅"; + position: absolute; + right: 15px; + vertical-align: middle; + line-height: inherit; + color: #aaa; } thead.dark th[data-column][data-ordered] { - font-weight: bold; - position: relative; + background: linear-gradient(to top, #57646d, #3e474e); } thead.dark th[data-column][data-ordered]:before { - content: ""; - display: block; - position: absolute; - right: 5px; - top: 16px; - width: 0; - height: 0; - vertical-align: middle; - border-bottom: 5px solid #fff; - border-top: 5px solid transparent; - border-right: 5px solid transparent; - border-left: 6px solid transparent; - line-height: inherit; + color: #fff; + content: "🡫"; } thead.dark th[data-column][data-ordered="desc"]:before { - top: 21px; - border-bottom: 5px solid transparent; - border-top: 5px solid #fff; + content: "🡩"; } thead.dark td input, @@ -802,6 +798,12 @@ input[type="password"].form-control[readonly] { .systemmonitor-state.state-info .statusMsg { display: none; } +.systemmonitor-state .online { + color: green; +} +.systemmonitor-state .offline { + color: red; +} span.notification_text { display: block; diff --git a/interface/web/tools/lib/lang/it_import_ispconfig.lng b/interface/web/tools/lib/lang/it_import_ispconfig.lng index ce47c4da4d24b0709be26b5ec28b82ef2ec33b79..f3b5fccde29eee5faa619d43e020801c50e3b257 100644 --- a/interface/web/tools/lib/lang/it_import_ispconfig.lng +++ b/interface/web/tools/lib/lang/it_import_ispconfig.lng @@ -1,23 +1,23 @@ <?php -$wb['head_txt'] = 'Import email configuration from ISPConfig 3'; -$wb['legend_txt'] = 'Remote server connection details'; -$wb['legend2_txt'] = 'Import email domain'; -$wb['resync_sites_txt'] = 'Resync Websites'; -$wb['resync_ftp_txt'] = 'Resync FTP users'; -$wb['resync_shell_txt'] = 'Resync shell users'; -$wb['resync_cron_txt'] = 'Resync cronjobs'; -$wb['resync_db_txt'] = 'Resync clientdb config'; -$wb['resync_mailbox_txt'] = 'Resync Mailboxes'; -$wb['resync_dns_txt'] = 'Resync DNS records'; -$wb['btn_start_txt'] = 'Start Import'; -$wb['btn_connect_txt'] = 'Connect to remote server'; -$wb['btn_cancel_txt'] = 'Cancel'; -$wb['client_group_id_txt'] = 'Local client'; -$wb['mail_domain_txt'] = 'Remote email domain'; -$wb['import_mailbox_txt'] = 'Import mailbox'; -$wb['import_aliasdomain_txt'] = 'Import alias domain'; -$wb['import_alias_txt'] = 'Import email alias'; -$wb['import_forward_txt'] = 'Import forward'; -$wb['import_user_filter_txt'] = 'Import user filter'; -$wb['import_spamfilter_txt'] = 'Import spamfilter'; +$wb['head_txt'] = 'Importa la configurazione email configuration da ISPConfig 3'; +$wb['legend_txt'] = 'Dettagli della connessione remota'; +$wb['legend2_txt'] = 'Importa dominio email'; +$wb['resync_sites_txt'] = 'Risincronizza siti Web'; +$wb['resync_ftp_txt'] = 'Risincronizza utenti FTP'; +$wb['resync_shell_txt'] = 'Risincronizza utenti shell'; +$wb['resync_cron_txt'] = 'Risincronizza cronjobs'; +$wb['resync_db_txt'] = 'Risincronizza configurazione clientdb'; +$wb['resync_mailbox_txt'] = 'Risincronizza Mailboxes'; +$wb['resync_dns_txt'] = 'Risincronizza record DNS'; +$wb['btn_start_txt'] = 'Avvia Importazione'; +$wb['btn_connect_txt'] = 'Connetti a un server remoto'; +$wb['btn_cancel_txt'] = 'Annulla'; +$wb['client_group_id_txt'] = 'Cliente locale'; +$wb['mail_domain_txt'] = 'Dominio email remoto'; +$wb['import_mailbox_txt'] = 'Importa mailbox'; +$wb['import_aliasdomain_txt'] = 'Importa domini alias'; +$wb['import_alias_txt'] = 'Importa alias email'; +$wb['import_forward_txt'] = 'Importa Inoltri'; +$wb['import_user_filter_txt'] = 'Importa filtri utente'; +$wb['import_spamfilter_txt'] = 'Importa spamfilter'; ?> diff --git a/interface/web/tools/lib/lang/it_import_vpopmail.lng b/interface/web/tools/lib/lang/it_import_vpopmail.lng index 66fe56da1c7b170aaafa907796c2e5902387fc28..96a3ce35cd843d6d1fcb618fa9ed51f848245499 100644 --- a/interface/web/tools/lib/lang/it_import_vpopmail.lng +++ b/interface/web/tools/lib/lang/it_import_vpopmail.lng @@ -1,7 +1,7 @@ <?php -$wb['head_txt'] = 'Import email configuration from Vpopmail'; -$wb['legend_txt'] = 'Remote database server connection details'; -$wb['btn_start_txt'] = 'Start Import'; -$wb['btn_connect_txt'] = 'Connect to remote server'; -$wb['btn_cancel_txt'] = 'Cancel'; +$wb['head_txt'] = 'Importa configurazione email da Vpopmail'; +$wb['legend_txt'] = 'Dettagli connessione al server database'; +$wb['btn_start_txt'] = 'Avvia importazione'; +$wb['btn_connect_txt'] = 'Collega a in seerver remoto'; +$wb['btn_cancel_txt'] = 'Annulla'; ?> diff --git a/interface/web/tools/lib/lang/it_index.lng b/interface/web/tools/lib/lang/it_index.lng index a3ef38f21934a9d02669da2c2722feefc3f64325..ea996c4ff46f0e5ac57f518aa4dbb5a2b22e0816 100644 --- a/interface/web/tools/lib/lang/it_index.lng +++ b/interface/web/tools/lib/lang/it_index.lng @@ -1,4 +1,4 @@ <?php -$wb['page_head_txt'] = 'ISPConfig Tools'; -$wb['page_desc_txt'] = 'Change user settings'; +$wb['page_head_txt'] = 'Strumenti ISPConfig'; +$wb['page_desc_txt'] = 'Cambia impostazioni utente'; ?> diff --git a/interface/web/tools/lib/lang/it_interface.lng b/interface/web/tools/lib/lang/it_interface.lng new file mode 100644 index 0000000000000000000000000000000000000000..151bc2c3f04a3671e9528cb61efd58da5bef1c03 --- /dev/null +++ b/interface/web/tools/lib/lang/it_interface.lng @@ -0,0 +1,7 @@ +<?php +$wb['interface_head_txt'] = 'Impostazioni Interfaccia'; +$wb['interface_desc_txt'] = 'Modifica interfaccia'; +$wb['language_txt'] = 'Lingua pannello'; +$wb['startmodule_txt'] = 'Modulo di avvio'; +$wb['app_theme_txt'] = 'Apparenza'; +?> diff --git a/interface/web/tools/lib/lang/it_resync.lng b/interface/web/tools/lib/lang/it_resync.lng index 42831b890be9d9590be70588fdce332c39ba7ddb..704533c52c8786f02c9b868b53d56663c9ce8f4d 100644 --- a/interface/web/tools/lib/lang/it_resync.lng +++ b/interface/web/tools/lib/lang/it_resync.lng @@ -1,53 +1,53 @@ <?php -$wb['head_txt'] = 'Resync Tool'; -$wb['legend_txt'] = 'Resync'; -$wb['resync_all_txt'] = 'All services'; -$wb['resync_sites_txt'] = 'Websites'; -$wb['resync_ftp_txt'] = 'FTP-Accounts'; -$wb['resync_webdav_txt'] = 'WebDAV-Users'; -$wb['resync_shell_txt'] = 'Shell users'; -$wb['resync_cron_txt'] = 'Cronjobs'; -$wb['resync_db_txt'] = 'Client Database config'; -$wb['resync_mailbox_txt'] = 'Mailboxes'; -$wb['resync_mail_txt'] = 'Maildomains'; -$wb['resync_mailfilter_txt'] = 'Mailfilter'; +$wb['head_txt'] = 'Strumento di risincronizzazione'; +$wb['legend_txt'] = 'Risincronizza'; +$wb['resync_all_txt'] = 'Tutti i servizi'; +$wb['resync_sites_txt'] = 'I sit Web'; +$wb['resync_ftp_txt'] = 'Gli utenti FTP'; +$wb['resync_webdav_txt'] = 'Gli utenti WebDAV'; +$wb['resync_shell_txt'] = 'Gli utenti della Shell'; +$wb['resync_cron_txt'] = 'I job periodici'; +$wb['resync_db_txt'] = 'Configurazione database Clienti'; +$wb['resync_mailbox_txt'] = 'Caselle Email'; +$wb['resync_mail_txt'] = 'Domini Email'; +$wb['resync_mailfilter_txt'] = 'Filtri mail'; $wb['resync_mailinglist_txt'] = 'Mailinglist'; -$wb['resync_dns_txt'] = 'DNS records'; +$wb['resync_dns_txt'] = 'records DNS'; $wb['resync_vserver_txt'] = 'vServer'; -$wb['resync_client_txt'] = 'Client and reseller'; -$wb['all_active_txt'] = 'All active server'; -$wb['all_active_mail_txt'] = 'All active Mail-Server'; -$wb['all_active_web_txt'] = 'All active Web-Server'; -$wb['all_active_dns_txt'] = 'All active DNS-Server'; -$wb['all_active_file_txt'] = 'All active File-Server'; -$wb['all_active_db_txt'] = 'All active Database-Server'; -$wb['all_active_vserver_txt'] = 'All active vServer'; -$wb['do_sites_txt'] = 'Resynced Website'; -$wb['do_ftp_txt'] = 'Resynced FTP user'; -$wb['do_webdav_txt'] = 'Resynced WebDav user'; -$wb['do_shell_txt'] = 'Resynced Shell user'; +$wb['resync_client_txt'] = 'Clienti e rivenditori'; +$wb['all_active_txt'] = 'Tutti i server Attivi'; +$wb['all_active_mail_txt'] = 'Tutti i Mail-Server attivi'; +$wb['all_active_web_txt'] = 'Tutti i server Web attivi'; +$wb['all_active_dns_txt'] = 'Tutti i server DNS attivi'; +$wb['all_active_file_txt'] = 'Tutti i File-Server attivi'; +$wb['all_active_db_txt'] = 'Tutti i server Database attivi'; +$wb['all_active_vserver_txt'] = 'Tutti i vServer attivi'; +$wb['do_sites_txt'] = 'Sit Web risincronizzati'; +$wb['do_ftp_txt'] = 'Utenti FTP risincronizzati'; +$wb['do_webdav_txt'] = 'Utenti WebDav risincronizzati'; +$wb['do_shell_txt'] = 'Utenti Shell risincronizzati'; $wb['do_cron_txt'] = 'Resynced Cronjob'; -$wb['do_db_user_txt'] = 'Resynced Database User'; -$wb['do_db_txt'] = 'Resynced Database'; -$wb['do_mail_txt'] = 'Resynced Maildomain'; -$wb['do_mailbox_txt'] = 'Resynced Mailbox'; -$wb['do_mail_alias_txt'] = 'Resynced Alias'; -$wb['do_mail_access_txt'] = 'Resynced Mail access'; -$wb['do_mail_contentfilter_txt'] = 'Resynced Content Filter'; -$wb['do_mail_userfilter_txt'] = 'Resynced Mail User Filter'; -$wb['do_mailinglist_txt'] = 'Resynced Mailinglist'; -$wb['do_dns_txt'] = 'Resynced DNS zone'; -$wb['do_vserver_txt'] = 'Resynced vServer'; -$wb['do_clients_txt'] = 'Resynced clients and reseller'; -$wb['no_results_txt'] = 'Nothing found'; +$wb['do_db_user_txt'] = 'Utenti Database risincronizzati'; +$wb['do_db_txt'] = 'Database risincronizzati'; +$wb['do_mail_txt'] = 'Domini Mail risincronizzati'; +$wb['do_mailbox_txt'] = 'Caselle Mail risincronizzati'; +$wb['do_mail_alias_txt'] = 'Alias risincronizzati'; +$wb['do_mail_access_txt'] = 'Accessi Mail risincronizzati'; +$wb['do_mail_contentfilter_txt'] = 'Filtri di contenuto risincronizzati'; +$wb['do_mail_userfilter_txt'] = 'Filtri utenti mail risincronizzati'; +$wb['do_mailinglist_txt'] = 'Mailinglist risincronizzate'; +$wb['do_dns_txt'] = 'Zone DNS risincronizzati'; +$wb['do_vserver_txt'] = 'vServer risincronizzati'; +$wb['do_clients_txt'] = 'Clients e rivenditori risincronizzati'; +$wb['no_results_txt'] = 'Niente'; $wb['btn_start_txt'] = 'Start'; -$wb['btn_cancel_txt'] = 'Cancel'; -$wb['do_mail_spamfilter_policy_txt'] = 'Resynced Spamfilter Policies'; -$wb['do_mail_spamfilter_txt'] = 'Resynced Spamfilter'; -$wb['do_mailget_txt'] = 'Resynced Fetchmail'; +$wb['btn_cancel_txt'] = 'Annulla'; +$wb['do_mail_spamfilter_policy_txt'] = 'Politiche Spamfilter risincronizzate'; +$wb['do_mail_spamfilter_txt'] = 'Filtri Spam risincronizzati'; +$wb['do_mailget_txt'] = 'Fetchmail risincronizzati'; $wb['resync_mailget_txt'] = 'Fetchmail'; $wb['resync_mailtransport_txt'] = 'E-Mail Transport'; $wb['resync_mailrelay_txt'] = 'E-Mail Relay'; -$wb['do_mailtransport_txt'] = 'Resynced Mailtransport'; -$wb['do_mailrelay_txt'] = 'Resynced Mailrelay'; +$wb['do_mailtransport_txt'] = 'Mailtransport risincronizzati'; +$wb['do_mailrelay_txt'] = 'Mailrelay risincronizzati'; ?> diff --git a/interface/web/tools/lib/lang/it_tpl_default.lng b/interface/web/tools/lib/lang/it_tpl_default.lng index c06246304d016300490b28f50eb168cff4cdbc4e..aca4cc59e44a23360d67fc6a515172f3b42f782b 100644 --- a/interface/web/tools/lib/lang/it_tpl_default.lng +++ b/interface/web/tools/lib/lang/it_tpl_default.lng @@ -1,7 +1,7 @@ <?php -$wb['list_head_txt'] = 'Default Theme settings'; -$wb['list_desc_txt'] = 'Modify default-theme specific options'; -$wb['no_settings_txt'] = 'There are no settings for the default theme.'; -$wb['btn_start_txt'] = 'Save'; -$wb['btn_cancel_txt'] = 'Back'; +$wb['list_head_txt'] = 'Impostazioni default del tema'; +$wb['list_desc_txt'] = 'Modifica le opzioni specifiche del tema default'; +$wb['no_settings_txt'] = 'Non sono presenti impostazioni per il tema default.'; +$wb['btn_start_txt'] = 'Salva'; +$wb['btn_cancel_txt'] = 'Indietro'; ?> diff --git a/interface/web/tools/lib/lang/it_usersettings.lng b/interface/web/tools/lib/lang/it_usersettings.lng index a1ad8eba871125a2cf17c29a4e70b39f2f2f995d..0f1cefe1bf3411eeb539324b6927dd3ac96dfe26 100644 --- a/interface/web/tools/lib/lang/it_usersettings.lng +++ b/interface/web/tools/lib/lang/it_usersettings.lng @@ -2,14 +2,14 @@ $wb['password_txt'] = 'Password'; $wb['language_txt'] = 'Lingua'; $wb['password_mismatch'] = 'Il secondo campo password non corrisponde con il primo.'; -$wb['Form to edit the user password and language.'] = 'Form per modificare la password e la lingua dellutente.'; +$wb['Form to edit the user password and language.'] = 'Form per modificare la password e la lingua dell\'utente.'; $wb['Settings'] = 'Impostazioni'; $wb['password_strength_txt'] = 'Sicurezza della Password'; -$wb['generate_password_txt'] = 'Generate Password'; -$wb['repeat_password_txt'] = 'Repeat Password'; -$wb['password_mismatch_txt'] = 'The passwords do not match.'; -$wb['password_match_txt'] = 'The passwords do match.'; -$wb['language_txt'] = 'Language'; -$wb['startmodule_txt'] = 'Startmodule'; -$wb['app_theme_txt'] = 'Design'; +$wb['generate_password_txt'] = 'Genera Password'; +$wb['repeat_password_txt'] = 'Ripeti Password'; +$wb['password_mismatch_txt'] = 'Le password sono diverse.'; +$wb['password_match_txt'] = 'Le password coincidono.'; +$wb['language_txt'] = 'Lingua pannello'; +$wb['startmodule_txt'] = 'Modulo di avvio'; +$wb['app_theme_txt'] = 'Apparenza'; ?> diff --git a/interface/web/tools/resync.php b/interface/web/tools/resync.php index ec947421b7bea0044291e94fedb69e3ae82bbd93..0aa6677ac3497d92b95f77377d0243428dbadba7 100644 --- a/interface/web/tools/resync.php +++ b/interface/web/tools/resync.php @@ -93,34 +93,34 @@ class page_action extends tform_actions { if($type == 'mail') { $server_data = array ( - 'mail_domain' => array ( - 'index_field' => 'domain_id', - 'server_type' => 'mail', + 'mail_domain' => array ( + 'index_field' => 'domain_id', + 'server_type' => 'mail', 'server_id' => $server_id, - ), + ), 'mail_get' => array ( 'index_field' => 'mailget_id', 'server_type' => 'mail', 'server_id' => $server_id, ), - 'mail_mailinglist' => array ( - 'index_field' => 'mailinglist_id', - 'server_type' => 'mail', + 'mail_mailinglist' => array ( + 'index_field' => 'mailinglist_id', + 'server_type' => 'mail', 'server_id' => $server_id, - ), - 'mail_user' => array ( - 'index_field' => 'mailuser_id', - 'server_type' => 'mail', + ), + 'mail_user' => array ( + 'index_field' => 'mailuser_id', + 'server_type' => 'mail', 'server_id' => $server_id, ), - 'mail_transport' => array ( - 'index_field' => 'transport_id', - 'server_type' => 'mail', + 'mail_transport' => array ( + 'index_field' => 'transport_id', + 'server_type' => 'mail', 'server_id' => $server_id, ), - 'mail_relay' => array ( - 'index_field' => 'relay_recipient_id', - 'server_type' => 'mail', + 'mail_relay' => array ( + 'index_field' => 'relay_recipient_id', + 'server_type' => 'mail', 'server_id' => $server_id, ), ); @@ -129,17 +129,17 @@ class page_action extends tform_actions { $server_data = array ( 'mail_access' => array ( 'index_field' => 'access_id', - 'server_type' => 'mail', + 'server_type' => 'mail', 'server_id' => $server_id, - ), + ), 'mail_content_filter' => array ( 'index_field' => 'content_filter_id', - 'server_type' => 'mail', - ), + 'server_type' => 'mail', + ), 'mail_user_filter' => array ( 'index_field' => 'filter_id', - 'server_type' => 'mail', - ), + 'server_type' => 'mail', + ), 'spamfilter_policy' => array ( 'index_field' => 'id', 'server_type' => 'mail', @@ -158,26 +158,26 @@ class page_action extends tform_actions { } if($type == 'web' ) { $server_data = array ( - 'web_domain' => array ( - 'index_field' => 'domain_id', - 'server_type' => 'web', + 'web_domain' => array ( + 'index_field' => 'domain_id', + 'server_type' => 'web', 'server_id' => $server_id, - ), - 'shell_user' => array ( - 'index_field' => 'shell_user_id', - 'server_type' => 'web', + ), + 'shell_user' => array ( + 'index_field' => 'shell_user_id', + 'server_type' => 'web', 'server_id' => $server_id, - ), - 'cron' => array ( - 'index_field' => 'id', - 'server_type' => 'cron', + ), + 'cron' => array ( + 'index_field' => 'id', + 'server_type' => 'cron', 'server_id' => $server_id, - ), - 'ftp_user' => array ( - 'index_field' => 'ftp_user_id', - 'server_type' => 'web', + ), + 'ftp_user' => array ( + 'index_field' => 'ftp_user_id', + 'server_type' => 'web', 'server_id' => $server_id, - ), + ), ); } if($type == 'dns' ) { @@ -191,11 +191,11 @@ class page_action extends tform_actions { } if($type == 'file' ) { $server_data = array ( - 'webdav_user' => array ( - 'index_field' => 'webdav_user_id', - 'server_type' => 'file', + 'webdav_user' => array ( + 'index_field' => 'webdav_user_id', + 'server_type' => 'file', 'server_id' => $server_id, - ), + ), ); } if($type == 'db' ) { diff --git a/interface/web/vm/lib/lang/it_openvz_ostemplate.lng b/interface/web/vm/lib/lang/it_openvz_ostemplate.lng index 5b58e7ebc5c30df7f3e5a67f28d5803b20221601..3d5bbda64bae2961a63fd51ae3f71cece0df1f42 100644 --- a/interface/web/vm/lib/lang/it_openvz_ostemplate.lng +++ b/interface/web/vm/lib/lang/it_openvz_ostemplate.lng @@ -1,11 +1,11 @@ <?php -$wb['template_file_txt'] = 'Nome file del Template'; +$wb['template_file_txt'] = 'Nome file del Modello'; $wb['server_id_txt'] = 'Server'; $wb['allservers_txt'] = 'Esiste su tutti i servers'; $wb['active_txt'] = 'Attivo'; $wb['description_txt'] = 'Descrizione'; -$wb['template_name_error_empty'] = 'Template name vuoto.'; -$wb['template_file_error_empty'] = 'Template filename vuoto.'; -$wb['Template'] = 'Template'; -$wb['template_name_txt'] = 'Template name'; +$wb['template_name_error_empty'] = 'Modello nome vuoto.'; +$wb['template_file_error_empty'] = 'Modello filename vuoto.'; +$wb['Template'] = 'Modello'; +$wb['template_name_txt'] = 'Modello nome'; ?> diff --git a/interface/web/vm/lib/lang/it_openvz_ostemplate_list.lng b/interface/web/vm/lib/lang/it_openvz_ostemplate_list.lng index 7df4dc7fe63d8e2b1892bb6eb2fbe301590f7cc4..847ee336cf4483e2053779e5988917b1237beeb4 100644 --- a/interface/web/vm/lib/lang/it_openvz_ostemplate_list.lng +++ b/interface/web/vm/lib/lang/it_openvz_ostemplate_list.lng @@ -4,5 +4,5 @@ $wb['active_txt'] = 'Attivo'; $wb['server_id_txt'] = 'Server'; $wb['allservers_txt'] = 'Esiste su tutti i servers'; $wb['ostemplate_id_txt'] = 'ID'; -$wb['template_name_txt'] = 'Template name'; +$wb['template_name_txt'] = 'Modello name'; ?> diff --git a/interface/web/vm/lib/lang/it_openvz_template.lng b/interface/web/vm/lib/lang/it_openvz_template.lng index b23f8623632c780e5e70f0156de887c00a3700d2..07e6b16281841260935c4518cf34c7da6160d325 100644 --- a/interface/web/vm/lib/lang/it_openvz_template.lng +++ b/interface/web/vm/lib/lang/it_openvz_template.lng @@ -56,7 +56,7 @@ $wb['dcachesize_desc_txt'] = 'Dimensione totale di dentry and inode structures l $wb['numiptent_desc_txt'] = 'Numero di inserimenti NETFILTER (IP packet filtering).'; $wb['swappages_desc_txt'] = 'Dimensione di swap space da mostrare nel contenitore.'; $wb['create_dns_txt'] = 'Crea DNS per questo nome host'; -$wb['template_name_error_empty'] = 'Template name vuoto.'; +$wb['template_name_error_empty'] = 'Modello name vuoto.'; $wb['diskspace_error_empty'] = 'Spazio disco vuoto.'; $wb['ram_error_empty'] = 'RAM (guaranteed) vuoto.'; $wb['ram_burst_error_empty'] = 'RAM (burst) vuoto.'; @@ -87,11 +87,11 @@ $wb['numsiginfo_error_empty'] = 'Numsiginfo vuoto.'; $wb['dcachesize_error_empty'] = 'Dcachesize vuoto.'; $wb['numiptent_error_empty'] = 'Numiptent vuoto.'; $wb['swappages_error_empty'] = 'Swappages vuoto.'; -$wb['Template'] = 'Template'; -$wb['Advanced'] = 'Advanced'; -$wb['template_name_txt'] = 'Template name'; -$wb['features_txt'] = 'Features'; +$wb['Template'] = 'Modello'; +$wb['Advanced'] = 'Avanzate'; +$wb['template_name_txt'] = 'Nome Modello'; +$wb['features_txt'] = 'Caratteristiche'; $wb['iptables_txt'] = 'IP Tables'; -$wb['custom_txt'] = 'Custom settings'; -$wb['custom_error'] = 'Not allowed in Custom settings: '; +$wb['custom_txt'] = 'Impostazioni personalizzate'; +$wb['custom_error'] = 'Non consentito nelle impostazioni personalizzate: '; ?> diff --git a/interface/web/vm/lib/lang/it_openvz_template_list.lng b/interface/web/vm/lib/lang/it_openvz_template_list.lng index f7520680851c11968f134ea1fa881d95cf83af53..d0e815f8f338bf69003f082aa97dca95c7a2ee00 100644 --- a/interface/web/vm/lib/lang/it_openvz_template_list.lng +++ b/interface/web/vm/lib/lang/it_openvz_template_list.lng @@ -1,5 +1,5 @@ <?php -$wb['list_head_txt'] = 'OpenVZ Virtual Machine Template'; +$wb['list_head_txt'] = 'OpenVZ Virtual Machine Modello'; $wb['active_txt'] = 'Attivo'; -$wb['template_name_txt'] = 'Template name'; +$wb['template_name_txt'] = 'Modello name'; ?> diff --git a/interface/web/vm/lib/lang/it_openvz_vm.lng b/interface/web/vm/lib/lang/it_openvz_vm.lng index 8290d94e99935a339ac53ce1b5c64d0b53101a9a..ee32d56e56b9d5c9853eb0cbc7769518446fa102 100644 --- a/interface/web/vm/lib/lang/it_openvz_vm.lng +++ b/interface/web/vm/lib/lang/it_openvz_vm.lng @@ -8,10 +8,10 @@ $wb['cpu_limit_txt'] = 'CPU limite'; $wb['io_priority_txt'] = 'I/O priorita'; $wb['nameserver_txt'] = 'Nameserver(s)'; $wb['nameserver_desc_txt'] = '(separati da spazi)'; -$wb['capability_txt'] = 'Capacita'; +$wb['capability_txt'] = 'Capacità '; $wb['server_id_txt'] = 'Hostserver'; $wb['ostemplate_id_txt'] = 'OSTemplate'; -$wb['template_id_txt'] = 'Template'; +$wb['template_id_txt'] = 'Modello'; $wb['ip_address_txt'] = 'Indirizzo IP '; $wb['hostname_txt'] = 'Hostname'; $wb['vm_password_txt'] = 'VM Password'; @@ -37,9 +37,9 @@ $wb['io_priority_error_empty'] = 'I/O priority vuoto.'; $wb['template_nameserver_error_empty'] = 'Nameserver(s) vuoto.'; $wb['Virtual server'] = 'Virtual server'; $wb['Advanced'] = 'Avanzato'; -$wb['features_txt'] = 'Features'; +$wb['features_txt'] = 'Caratteristiche'; $wb['iptables_txt'] = 'IP Tables'; -$wb['custom_txt'] = 'Custom settings'; -$wb['bootorder_txt'] = 'Boot order priority'; -$wb['bootorder_error_notpositive'] = 'Only positive integers are allowed for Boot order priority'; +$wb['custom_txt'] = 'Impostazioni personalizzate'; +$wb['bootorder_txt'] = 'Ordine di priorità di boot'; +$wb['bootorder_error_notpositive'] = 'Sono consentiti solo numeri interi positivi per ordine di priorità Boot'; ?> diff --git a/interface/web/vm/lib/lang/it_openvz_vm_list.lng b/interface/web/vm/lib/lang/it_openvz_vm_list.lng index 3ed0a012af67354c2de67299b9428c29c21c4507..22d4b00ad9ba730d71c0ac7515206020e5df79b9 100644 --- a/interface/web/vm/lib/lang/it_openvz_vm_list.lng +++ b/interface/web/vm/lib/lang/it_openvz_vm_list.lng @@ -3,7 +3,7 @@ $wb['list_head_txt'] = 'Virtual server'; $wb['active_txt'] = 'Attivo'; $wb['server_id_txt'] = 'Hostserver'; $wb['ostemplate_id_txt'] = 'OSTemplate'; -$wb['template_id_txt'] = 'Template'; +$wb['template_id_txt'] = 'Modello'; $wb['hostname_txt'] = 'Nome Host'; $wb['ip_address_txt'] = 'Indirizzo IP'; $wb['veid_txt'] = 'VEID'; diff --git a/remoting_client/API-docs/dns_a_add.html b/remoting_client/API-docs/dns_a_add.html index eaa7f8eb92313a22ae6def268155fd377402f678..e7217bcdcfd4972e7c10213b07a0da9ea340de9f 100644 --- a/remoting_client/API-docs/dns_a_add.html +++ b/remoting_client/API-docs/dns_a_add.html @@ -22,7 +22,7 @@ <p class="margin"> server_id (<span class="paratype">int(11)</span>)</p> <p class="margin"> zone (<span class="paratype">int(11)</span>)</p> <p class="margin"> name (<span class="paratype">varchar(64)</span>)</p> -<p class="margin"> type (<span class="paratype">enum('a','aaaa','alias','cname','hinfo','mx''naptr','ns','ptr','rp','srv','txt')</span>)</p> +<p class="margin"> type (<span class="paratype">enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ds','ptr','rp','srv','txt')</span>)</p> <p class="margin"> data (<span class="paratype">varchar(255)</span>)</p> <p class="margin"> aux (<span class="paratype">int(11)</span>)</p> <p class="margin"> ttl (<span class="paratype">int(11)</span>)</p> diff --git a/remoting_client/API-docs/dns_a_update.html b/remoting_client/API-docs/dns_a_update.html index b279c6d476cdc980d480bafca9ec036a23c1ed43..ccacab408bd3b3171dfb01e33c21137e95ac7a3b 100644 --- a/remoting_client/API-docs/dns_a_update.html +++ b/remoting_client/API-docs/dns_a_update.html @@ -22,7 +22,7 @@ <p class="margin"> server_id (<span class="paratype">int(11)</span>)</p> <p class="margin"> zone (<span class="paratype">int(11)</span>)</p> <p class="margin"> name (<span class="paratype">varchar(64)</span>)</p> -<p class="margin"> type (<span class="paratype">enum('a','aaaa','alias','cname','hinfo','mx''naptr','ns','ptr','rp','srv','txt')</span>)</p> +<p class="margin"> type (<span class="paratype">enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ds','ptr','rp','srv','txt')</span>)</p> <p class="margin"> data (<span class="paratype">varchar(255)</span>)</p> <p class="margin"> aux (<span class="paratype">int(11)</span>)</p> <p class="margin"> ttl (<span class="paratype">int(11)</span>)</p> diff --git a/remoting_client/API-docs/dns_aaaa_add.html b/remoting_client/API-docs/dns_aaaa_add.html index 0f8e8b61d1c0e2537daecfc7ae11bdf01e8b23a9..ea21b15361cd0fdbe02b547b2e1f2ceb58e69542 100644 --- a/remoting_client/API-docs/dns_aaaa_add.html +++ b/remoting_client/API-docs/dns_aaaa_add.html @@ -22,7 +22,7 @@ <p class="margin"> server_id (<span class="paratype">int(11)</span>)</p> <p class="margin"> zone (<span class="paratype">int(11)</span>)</p> <p class="margin"> name (<span class="paratype">varchar(64)</span>)</p> -<p class="margin"> type (<span class="paratype">enum('a','aaaa','alias','cname','hinfo','mx''naptr','ns','ptr','rp','srv','txt')</span>)</p> +<p class="margin"> type (<span class="paratype">enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ds','ptr','rp','srv','txt')</span>)</p> <p class="margin"> data (<span class="paratype">varchar(255)</span>)</p> <p class="margin"> aux (<span class="paratype">int(11)</span>)</p> <p class="margin"> ttl (<span class="paratype">int(11)</span>)</p> diff --git a/remoting_client/API-docs/dns_aaaa_update.html b/remoting_client/API-docs/dns_aaaa_update.html index 1ad798fd5defce0274dea5cf48274b0c204c54df..94b60f4df4601530b4d0ac3bd63e441ea9da8def 100644 --- a/remoting_client/API-docs/dns_aaaa_update.html +++ b/remoting_client/API-docs/dns_aaaa_update.html @@ -22,7 +22,7 @@ <p class="margin"> server_id (<span class="paratype">int(11)</span>)</p> <p class="margin"> zone (<span class="paratype">int(11)</span>)</p> <p class="margin"> name (<span class="paratype">varchar(64)</span>)</p> -<p class="margin"> type (<span class="paratype">enum('a','aaaa','alias','cname','hinfo','mx''naptr','ns','ptr','rp','srv','txt')</span>)</p> +<p class="margin"> type (<span class="paratype">enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ds','ptr','rp','srv','txt')</span>)</p> <p class="margin"> data (<span class="paratype">varchar(255)</span>)</p> <p class="margin"> aux (<span class="paratype">int(11)</span>)</p> <p class="margin"> ttl (<span class="paratype">int(11)</span>)</p> diff --git a/remoting_client/API-docs/dns_alias_add.html b/remoting_client/API-docs/dns_alias_add.html index d7d68dc64e1868059d1c51a8acf49a8a7933f083..4bea3dea6f2a2b2700cdfc01afad04aff5e657cb 100644 --- a/remoting_client/API-docs/dns_alias_add.html +++ b/remoting_client/API-docs/dns_alias_add.html @@ -22,7 +22,7 @@ <p class="margin"> server_id (<span class="paratype">int(11)</span>)</p> <p class="margin"> zone (<span class="paratype">int(11)</span>)</p> <p class="margin"> name (<span class="paratype">varchar(64)</span>)</p> -<p class="margin"> type (<span class="paratype">enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ptr','rp','srv','txt')</span>)</p> +<p class="margin"> type (<span class="paratype">enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ds','ptr','rp','srv','txt')</span>)</p> <p class="margin"> data (<span class="paratype">varchar(255)</span>)</p> <p class="margin"> aux (<span class="paratype">int(11)</span>)</p> <p class="margin"> ttl (<span class="paratype">int(11)</span>)</p> diff --git a/remoting_client/API-docs/dns_alias_update.html b/remoting_client/API-docs/dns_alias_update.html index e43e5c40f8baaed0bbb860b6237c2748e46c00b0..058654f2f7817bde1a885be060b5a5a6e0e06987 100644 --- a/remoting_client/API-docs/dns_alias_update.html +++ b/remoting_client/API-docs/dns_alias_update.html @@ -22,7 +22,7 @@ <p class="margin"> server_id (<span class="paratype">int(11)</span>)</p> <p class="margin"> zone (<span class="paratype">int(11)</span>)</p> <p class="margin"> name (<span class="paratype">varchar(64)</span>)</p> -<p class="margin"> type (<span class="paratype">enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ptr','rp','srv','txt')</span>)</p> +<p class="margin"> type (<span class="paratype">enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ds','ptr','rp','srv','txt')</span>)</p> <p class="margin"> data (<span class="paratype">varchar(255)</span>)</p> <p class="margin"> aux (<span class="paratype">int(11)</span>)</p> <p class="margin"> ttl (<span class="paratype">int(11)</span>)</p> diff --git a/remoting_client/API-docs/dns_cname_add.html b/remoting_client/API-docs/dns_cname_add.html index 71b585a68e86222ff41867798cb035c9faf4df66..afef2bd75c3d5aa409c127bb4a71a30adbd67945 100644 --- a/remoting_client/API-docs/dns_cname_add.html +++ b/remoting_client/API-docs/dns_cname_add.html @@ -22,7 +22,7 @@ <p class="margin"> server_id (<span class="paratype">int(11)</span>)</p> <p class="margin"> zone (<span class="paratype">int(11)</span>)</p> <p class="margin"> name (<span class="paratype">varchar(64)</span>)</p> -<p class="margin"> type (<span class="paratype">enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ptr','rp','srv','txt')</span>)</p> +<p class="margin"> type (<span class="paratype">enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ds','ptr','rp','srv','txt')</span>)</p> <p class="margin"> data (<span class="paratype">varchar(255)</span>)</p> <p class="margin"> aux (<span class="paratype">int(11)</span>)</p> <p class="margin"> ttl (<span class="paratype">int(11)</span>)</p> diff --git a/remoting_client/API-docs/dns_cname_update.html b/remoting_client/API-docs/dns_cname_update.html index 568091c7db8f59567f4cbffbf0897e8e67f25d7a..f0666331045cc09c0115d7510a3bce1e056b5d0c 100644 --- a/remoting_client/API-docs/dns_cname_update.html +++ b/remoting_client/API-docs/dns_cname_update.html @@ -22,7 +22,7 @@ <p class="margin"> server_id (<span class="paratype">int(11)</span>)</p> <p class="margin"> zone (<span class="paratype">int(11)</span>)</p> <p class="margin"> name (<span class="paratype">varchar(64)</span>)</p> -<p class="margin"> type (<span class="paratype">enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ptr','rp','srv','txt')</span>)</p> +<p class="margin"> type (<span class="paratype">enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ds','ptr','rp','srv','txt')</span>)</p> <p class="margin"> data (<span class="paratype">varchar(255)</span>)</p> <p class="margin"> aux (<span class="paratype">int(11)</span>)</p> <p class="margin"> ttl (<span class="paratype">int(11)</span>)</p> diff --git a/remoting_client/API-docs/dns_ds_add.html b/remoting_client/API-docs/dns_ds_add.html new file mode 100644 index 0000000000000000000000000000000000000000..9a6ffdec04957c680f107c78ce63f1cfb50e5841 --- /dev/null +++ b/remoting_client/API-docs/dns_ds_add.html @@ -0,0 +1,38 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> +<html><head><title>ISPCOnfig 3 remote API documentation</title> + + + + + + <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> + <link rel="stylesheet" type="text/css" href="definitionen.css"> + <style type="text/css"> + </style></head> + +<body> +<div style="padding:40px"> +<h1>dns_ds_add(<span class="var">$session_id</span>, <span class="var">$client_id</span>, <span class="var">$params</span>);</h1> +<br> +<p class="headgrp">Description: </p> +<p class="margin"> Adds a dns authoritative nameserver record if <em>type</em> is <em>ds</em>.</p><br> +<p class="headgrp">Input Variables: </p> +<p class="margin"> <span class="var">$session_id</span>, <span class="var">$client_id</span>, <span class="var">$params</span></p> +<p class="headgrp">Parameters (in <span class="var">$params</span>): </p> +<p class="margin"> server_id (<span class="paratype">int(11)</span>)</p> +<p class="margin"> zone (<span class="paratype">int(11)</span>)</p> +<p class="margin"> name (<span class="paratype">varchar(64)</span>)</p> +<p class="margin"> type (<span class="paratype">enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ds','ptr','rp','srv','txt')</span>)</p> +<p class="margin"> data (<span class="paratype">varchar(255)</span>)</p> +<p class="margin"> aux (<span class="paratype">int(11)</span>)</p> +<p class="margin"> ttl (<span class="paratype">int(11)</span>)</p> +<p class="margin"> active (<span class="paratype">enum('n','y')</span>)</p> +<p class="margin"> stamp (<span class="paratype">timestamp</span>)</p> +<p class="margin"> serial (<span class="paratype">int(10)</span>)</p> +<p class="headgrp">Output: </p> +<p class="margin"> Returns the ID of the newly added ds resource record.</p> +<!--<b>Output:</b> +<p style="margin-left:100px">Gives a record of </p> --> +</div> + +</body></html> diff --git a/remoting_client/API-docs/dns_ds_delete.html b/remoting_client/API-docs/dns_ds_delete.html new file mode 100644 index 0000000000000000000000000000000000000000..6e54496d0a0020fd042ddef3cd09d9ffa3c880b6 --- /dev/null +++ b/remoting_client/API-docs/dns_ds_delete.html @@ -0,0 +1,29 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> +<html><head><title>ISPCOnfig 3 remote API documentation</title> + + + + + + <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> + <link rel="stylesheet" type="text/css" href="definitionen.css"> + <style type="text/css"> + </style></head> + +<body> +<div style="padding:40px"> +<h1>dns_ds_delete(<span class="var">$session_id</span>, <span class="var">$primary_id</span>);</h1> +<br> +<p class="headgrp">Description: </p> +<p class="margin"> Deletes target dns ds resource record.</p><br> +<p class="headgrp">Input Variables: </p> +<p class="margin"> <span class="var">$session_id</span>, <span class="var">$primary_id</span></p> +<p class="headgrp">Parameters (in <span class="var">$params</span>): </p> +<p class="margin"> None</p> +<p class="headgrp">Output: </p> +<p class="margin"> Returns the number of deleted records.</p> +<!--<b>Output:</b> +<p style="margin-left:100px">Gives a record of </p> --> +</div> + +</body></html> diff --git a/remoting_client/API-docs/dns_ds_get.html b/remoting_client/API-docs/dns_ds_get.html new file mode 100644 index 0000000000000000000000000000000000000000..f8d8785b54db3f663f8a4c41e3976e5e3b7265f8 --- /dev/null +++ b/remoting_client/API-docs/dns_ds_get.html @@ -0,0 +1,29 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> +<html><head><title>ISPCOnfig 3 remote API documentation</title> + + + + + + <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> + <link rel="stylesheet" type="text/css" href="definitionen.css"> + <style type="text/css"> + </style></head> + +<body> +<div style="padding:40px"> +<h1>dns_ds_get(<span class="var">$session_id</span>, <span class="var">$primary_id</span>);</h1> +<br> +<p class="headgrp">Description: </p> +<p class="margin"> Retrieves information about target dns ds resource record.</p><br> +<p class="headgrp">Input Variables: </p> +<p class="margin"> <span class="var">$session_id</span>, <span class="var">$primary_id</span></p> +<p class="headgrp">Parameters (in <span class="var">$params</span>): </p> +<p class="margin"> None</p> +<p class="headgrp">Output: </p> +<p class="margin"> Returns all fields and values of the chosen dns ds resource record.</p> +<!--<b>Output:</b> +<p style="margin-left:100px">Gives a record of </p> --> +</div> + +</body></html> diff --git a/remoting_client/API-docs/dns_ds_update.html b/remoting_client/API-docs/dns_ds_update.html new file mode 100644 index 0000000000000000000000000000000000000000..6b04a847b91474be5d72d51ce60f60c8969d4b70 --- /dev/null +++ b/remoting_client/API-docs/dns_ds_update.html @@ -0,0 +1,38 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> +<html><head><title>ISPCOnfig 3 remote API documentation</title> + + + + + + <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> + <link rel="stylesheet" type="text/css" href="definitionen.css"> + <style type="text/css"> + </style></head> + +<body> +<div style="padding:40px"> +<h1>dns_ds_update(<span class="var">$session_id</span>, <span class="var">$client_id</span>, <span class="var">$primary_id</span>, <span class="var">$params</span>);</h1> +<br> +<b>Description: </b> +<p class="margin"> Updates an authoritative nameserver record if <em>type</em> is <em>ds</em>.</p><br> +<b>Input Variables: </b> +<p class="margin"> <span class="var">$session_id</span>, <span class="var">$client_id</span>, <span class="var">$primary_id</span>, <span class="var">$params</span></p> +<b>Parameters (in <span style= "color:#A17FFF">$params</span>): </b> +<p class="margin"> server_id (<span class="paratype">int(11)</span>)</p> +<p class="margin"> zone (<span class="paratype">int(11)</span>)</p> +<p class="margin"> name (<span class="paratype">varchar(64)</span>)</p> +<p class="margin"> type (<span class="paratype">enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ds','ptr','rp','srv','txt')</span>)</p> +<p class="margin"> data (<span class="paratype">varchar(255)</span>)</p> +<p class="margin"> aux (<span class="paratype">int(11)</span>)</p> +<p class="margin"> ttl (<span class="paratype">int(11)</span>)</p> +<p class="margin"> active (<span class="paratype">enum('n','y')</span>)</p> +<p class="margin"> stamp (<span class="paratype">timestamp</span>)</p> +<p class="margin"> serial (<span class="paratype">int(10)</span>)</p> +<b>Output: </b> +<p class="margin"> Returns the number of affected rows.</p> +<!--<b>Output:</b> +<p style="margin-left:100px">Gives a record of </p> --> +</div> + +</body></html> diff --git a/remoting_client/API-docs/dns_hinfo_add.html b/remoting_client/API-docs/dns_hinfo_add.html index c1bac26bddbdbb9ffcba6a9244a554876b9682af..acd89b3d34f857cb8b9e6e6c2d1a16a57edec412 100644 --- a/remoting_client/API-docs/dns_hinfo_add.html +++ b/remoting_client/API-docs/dns_hinfo_add.html @@ -22,7 +22,7 @@ <p class="margin"> server_id (<span class="paratype">int(11)</span>)</p> <p class="margin"> zone (<span class="paratype">int(11)</span>)</p> <p class="margin"> name (<span class="paratype">varchar(64)</span>)</p> -<p class="margin"> type (<span class="paratype">enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ptr','rp','srv','txt')</span>)</p> +<p class="margin"> type (<span class="paratype">enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ds','ptr','rp','srv','txt')</span>)</p> <p class="margin"> data (<span class="paratype">varchar(255)</span>)</p> <p class="margin"> aux (<span class="paratype">int(11)</span>)</p> <p class="margin"> ttl (<span class="paratype">int(11)</span>)</p> diff --git a/remoting_client/API-docs/dns_hinfo_update.html b/remoting_client/API-docs/dns_hinfo_update.html index b2a266cef708950b26067ff3614092194f01cc5a..463b25b84a71b26d4bdab6feff2ec2ea802448e4 100644 --- a/remoting_client/API-docs/dns_hinfo_update.html +++ b/remoting_client/API-docs/dns_hinfo_update.html @@ -22,7 +22,7 @@ <p class="margin"> server_id (<span class="paratype">int(11)</span>)</p> <p class="margin"> zone (<span class="paratype">int(11)</span>)</p> <p class="margin"> name (<span class="paratype">varchar(64)</span>)</p> -<p class="margin"> type (<span class="paratype">enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ptr','rp','srv','txt')</span>)</p> +<p class="margin"> type (<span class="paratype">enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ds','ptr','rp','srv','txt')</span>)</p> <p class="margin"> data (<span class="paratype">varchar(255)</span>)</p> <p class="margin"> aux (<span class="paratype">int(11)</span>)</p> <p class="margin"> ttl (<span class="paratype">int(11)</span>)</p> diff --git a/remoting_client/API-docs/dns_mx_add.html b/remoting_client/API-docs/dns_mx_add.html index d2c08877fea848e63bbbcb5fc4600bc880d2fbe9..e306b81a187ea450b88e0dde71fac0cac17c3750 100644 --- a/remoting_client/API-docs/dns_mx_add.html +++ b/remoting_client/API-docs/dns_mx_add.html @@ -22,7 +22,7 @@ <p class="margin"> server_id (<span class="paratype">int(11)</span>)</p> <p class="margin"> zone (<span class="paratype">int(11)</span>)</p> <p class="margin"> name (<span class="paratype">varchar(64)</span>)</p> -<p class="margin"> type (<span class="paratype">enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ptr','rp','srv','txt')</span>)</p> +<p class="margin"> type (<span class="paratype">enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ds','ptr','rp','srv','txt')</span>)</p> <p class="margin"> data (<span class="paratype">varchar(255)</span>)</p> <p class="margin"> aux (<span class="paratype">int(11)</span>)</p> <p class="margin"> ttl (<span class="paratype">int(11)</span>)</p> diff --git a/remoting_client/API-docs/dns_mx_update.html b/remoting_client/API-docs/dns_mx_update.html index 81acd1f70641fc675f4eb88a35c5dae0d33f3c23..d75a8343d3a42f79b8fb204e4af569d0f5775abb 100644 --- a/remoting_client/API-docs/dns_mx_update.html +++ b/remoting_client/API-docs/dns_mx_update.html @@ -22,7 +22,7 @@ <p class="margin"> server_id (<span class="paratype">int(11)</span>)</p> <p class="margin"> zone (<span class="paratype">int(11)</span>)</p> <p class="margin"> name (<span class="paratype">varchar(64)</span>)</p> -<p class="margin"> type (<span class="paratype">enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ptr','rp','srv','txt')</span>)</p> +<p class="margin"> type (<span class="paratype">enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ds','ptr','rp','srv','txt')</span>)</p> <p class="margin"> data (<span class="paratype">varchar(255)</span>)</p> <p class="margin"> aux (<span class="paratype">int(11)</span>)</p> <p class="margin"> ttl (<span class="paratype">int(11)</span>)</p> diff --git a/remoting_client/API-docs/dns_naptr_add.html b/remoting_client/API-docs/dns_naptr_add.html index d691d65b3a1c2569c73c198fbf8bef151b356be7..a8b5d966bf9306d8ded5cedc17d2161ef0c212ca 100644 --- a/remoting_client/API-docs/dns_naptr_add.html +++ b/remoting_client/API-docs/dns_naptr_add.html @@ -22,7 +22,7 @@ <p class="margin"> server_id (<span class="paratype">int(11)</span>)</p> <p class="margin"> zone (<span class="paratype">int(11)</span>)</p> <p class="margin"> name (<span class="paratype">varchar(64)</span>)</p> -<p class="margin"> type (<span class="paratype">enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ptr','rp','srv','txt')</span>)</p> +<p class="margin"> type (<span class="paratype">enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ds','ptr','rp','srv','txt')</span>)</p> <p class="margin"> data (<span class="paratype">varchar(255)</span>)</p> <p class="margin"> aux (<span class="paratype">int(11)</span>)</p> <p class="margin"> ttl (<span class="paratype">int(11)</span>)</p> diff --git a/remoting_client/API-docs/dns_naptr_update.html b/remoting_client/API-docs/dns_naptr_update.html index 97f40f056f172d133b333e4e3e360f36cae5de49..98c4f031833c66b720f1173cf983e48e9c712478 100644 --- a/remoting_client/API-docs/dns_naptr_update.html +++ b/remoting_client/API-docs/dns_naptr_update.html @@ -22,7 +22,7 @@ <p class="margin"> server_id (<span class="paratype">int(11)</span>)</p> <p class="margin"> zone (<span class="paratype">int(11)</span>)</p> <p class="margin"> name (<span class="paratype">varchar(64)</span>)</p> -<p class="margin"> type (<span class="paratype">enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ptr','rp','srv','txt')</span>)</p> +<p class="margin"> type (<span class="paratype">enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ds','ptr','rp','srv','txt')</span>)</p> <p class="margin"> data (<span class="paratype">varchar(255)</span>)</p> <p class="margin"> aux (<span class="paratype">int(11)</span>)</p> <p class="margin"> ttl (<span class="paratype">int(11)</span>)</p> diff --git a/remoting_client/API-docs/dns_ns_add.html b/remoting_client/API-docs/dns_ns_add.html index d231d37e509ad1256c5c72edc65d163486210dbe..8fd9564bbb4d2907b8e6939166a4c7d5f793598b 100644 --- a/remoting_client/API-docs/dns_ns_add.html +++ b/remoting_client/API-docs/dns_ns_add.html @@ -22,7 +22,7 @@ <p class="margin"> server_id (<span class="paratype">int(11)</span>)</p> <p class="margin"> zone (<span class="paratype">int(11)</span>)</p> <p class="margin"> name (<span class="paratype">varchar(64)</span>)</p> -<p class="margin"> type (<span class="paratype">enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ptr','rp','srv','txt')</span>)</p> +<p class="margin"> type (<span class="paratype">enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ds','ptr','rp','srv','txt')</span>)</p> <p class="margin"> data (<span class="paratype">varchar(255)</span>)</p> <p class="margin"> aux (<span class="paratype">int(11)</span>)</p> <p class="margin"> ttl (<span class="paratype">int(11)</span>)</p> diff --git a/remoting_client/API-docs/dns_ns_update.html b/remoting_client/API-docs/dns_ns_update.html index fa35029efd1bc12a79d46688a9a90db4cf6f1126..32258a1504b7959c9a3b3c75e7975e43b77ac23f 100644 --- a/remoting_client/API-docs/dns_ns_update.html +++ b/remoting_client/API-docs/dns_ns_update.html @@ -22,7 +22,7 @@ <p class="margin"> server_id (<span class="paratype">int(11)</span>)</p> <p class="margin"> zone (<span class="paratype">int(11)</span>)</p> <p class="margin"> name (<span class="paratype">varchar(64)</span>)</p> -<p class="margin"> type (<span class="paratype">enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ptr','rp','srv','txt')</span>)</p> +<p class="margin"> type (<span class="paratype">enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ds','ptr','rp','srv','txt')</span>)</p> <p class="margin"> data (<span class="paratype">varchar(255)</span>)</p> <p class="margin"> aux (<span class="paratype">int(11)</span>)</p> <p class="margin"> ttl (<span class="paratype">int(11)</span>)</p> diff --git a/remoting_client/API-docs/dns_ptr_add.html b/remoting_client/API-docs/dns_ptr_add.html index 8e9a29a74aefd8d984003b36242dc6909ee34fbc..d2331660d2e36713151a883cd5a119e1101dfc5e 100644 --- a/remoting_client/API-docs/dns_ptr_add.html +++ b/remoting_client/API-docs/dns_ptr_add.html @@ -22,7 +22,7 @@ <p class="margin"> server_id (<span class="paratype">int(11)</span>)</p> <p class="margin"> zone (<span class="paratype">int(11)</span>)</p> <p class="margin"> name (<span class="paratype">varchar(64)</span>)</p> -<p class="margin"> type (<span class="paratype">enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ptr','rp','srv','txt')</span>)</p> +<p class="margin"> type (<span class="paratype">enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ds','ptr','rp','srv','txt')</span>)</p> <p class="margin"> data (<span class="paratype">varchar(255)</span>)</p> <p class="margin"> aux (<span class="paratype">int(11)</span>)</p> <p class="margin"> ttl (<span class="paratype">int(11)</span>)</p> diff --git a/remoting_client/API-docs/dns_ptr_update.html b/remoting_client/API-docs/dns_ptr_update.html index 026a44eee17d23b805eec9bed485d786d356ffb9..25097708ae2a929ff927c75e849821caac60127e 100644 --- a/remoting_client/API-docs/dns_ptr_update.html +++ b/remoting_client/API-docs/dns_ptr_update.html @@ -22,7 +22,7 @@ <p class="margin"> server_id (<span class="paratype">int(11)</span>)</p> <p class="margin"> zone (<span class="paratype">int(11)</span>)</p> <p class="margin"> name (<span class="paratype">varchar(64)</span>)</p> -<p class="margin"> type (<span class="paratype">enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ptr','rp','srv','txt')</span>)</p> +<p class="margin"> type (<span class="paratype">enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ds','ptr','rp','srv','txt')</span>)</p> <p class="margin"> data (<span class="paratype">varchar(255)</span>)</p> <p class="margin"> aux (<span class="paratype">int(11)</span>)</p> <p class="margin"> ttl (<span class="paratype">int(11)</span>)</p> diff --git a/remoting_client/API-docs/dns_rp_add.html b/remoting_client/API-docs/dns_rp_add.html index 3f2bde4fce89f9297687002bee228b76900ad51d..e20f5186c3c2efe925f56d6852176bb293f547af 100644 --- a/remoting_client/API-docs/dns_rp_add.html +++ b/remoting_client/API-docs/dns_rp_add.html @@ -22,7 +22,7 @@ <p class="margin"> server_id (<span class="paratype">int(11)</span>)</p> <p class="margin"> zone (<span class="paratype">int(11)</span>)</p> <p class="margin"> name (<span class="paratype">varchar(64)</span>)</p> -<p class="margin"> type (<span class="paratype">enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ptr','rp','srv','txt')</span>)</p> +<p class="margin"> type (<span class="paratype">enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ds','ptr','rp','srv','txt')</span>)</p> <p class="margin"> data (<span class="paratype">varchar(255)</span>)</p> <p class="margin"> aux (<span class="paratype">int(11)</span>)</p> <p class="margin"> ttl (<span class="paratype">int(11)</span>)</p> diff --git a/remoting_client/API-docs/dns_rp_update.html b/remoting_client/API-docs/dns_rp_update.html index a1adbd289ad58ea61e2d69754063c3ae76905d48..1e7a92db1f305293cddffe069220f04bbbc1a188 100644 --- a/remoting_client/API-docs/dns_rp_update.html +++ b/remoting_client/API-docs/dns_rp_update.html @@ -22,7 +22,7 @@ <p class="margin"> server_id (<span class="paratype">int(11)</span>)</p> <p class="margin"> zone (<span class="paratype">int(11)</span>)</p> <p class="margin"> name (<span class="paratype">varchar(64)</span>)</p> -<p class="margin"> type (<span class="paratype">enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ptr','rp','srv','txt')</span>)</p> +<p class="margin"> type (<span class="paratype">enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ds','ptr','rp','srv','txt')</span>)</p> <p class="margin"> data (<span class="paratype">varchar(255)</span>)</p> <p class="margin"> aux (<span class="paratype">int(11)</span>)</p> <p class="margin"> ttl (<span class="paratype">int(11)</span>)</p> diff --git a/remoting_client/API-docs/dns_srv_add.html b/remoting_client/API-docs/dns_srv_add.html index 342965687b89baded754718370044e8b79c6a720..5a2649cadbfb76f7610a8ac9b937c0904072dd3d 100644 --- a/remoting_client/API-docs/dns_srv_add.html +++ b/remoting_client/API-docs/dns_srv_add.html @@ -22,7 +22,7 @@ <p class="margin"> server_id (<span class="paratype">int(11)</span>)</p> <p class="margin"> zone (<span class="paratype">int(11)</span>)</p> <p class="margin"> name (<span class="paratype">varchar(64)</span>)</p> -<p class="margin"> type (<span class="paratype">enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ptr','rp','srv','txt')</span>)</p> +<p class="margin"> type (<span class="paratype">enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ds','ptr','rp','srv','txt')</span>)</p> <p class="margin"> data (<span class="paratype">varchar(255)</span>)</p> <p class="margin"> aux (<span class="paratype">int(11)</span>)</p> <p class="margin"> ttl (<span class="paratype">int(11)</span>)</p> diff --git a/remoting_client/API-docs/dns_srv_update.html b/remoting_client/API-docs/dns_srv_update.html index d7caef2d602d803d1922ba843e47c08569817f56..8a2a6107bfa1073034a5633791f0eb1542f7831f 100644 --- a/remoting_client/API-docs/dns_srv_update.html +++ b/remoting_client/API-docs/dns_srv_update.html @@ -22,7 +22,7 @@ <p class="margin"> server_id (<span class="paratype">int(11)</span>)</p> <p class="margin"> zone (<span class="paratype">int(11)</span>)</p> <p class="margin"> name (<span class="paratype">varchar(64)</span>)</p> -<p class="margin"> type (<span class="paratype">enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ptr','rp','srv','txt')</span>)</p> +<p class="margin"> type (<span class="paratype">enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ds','ptr','rp','srv','txt')</span>)</p> <p class="margin"> data (<span class="paratype">varchar(255)</span>)</p> <p class="margin"> aux (<span class="paratype">int(11)</span>)</p> <p class="margin"> ttl (<span class="paratype">int(11)</span>)</p> diff --git a/remoting_client/API-docs/dns_txt_add.html b/remoting_client/API-docs/dns_txt_add.html index 11c3d89463d4be2c98f75f7dad263e4abae17ffa..d99f79084659482ccbacbcca9d359dc395677324 100644 --- a/remoting_client/API-docs/dns_txt_add.html +++ b/remoting_client/API-docs/dns_txt_add.html @@ -22,7 +22,7 @@ <p class="margin"> server_id (<span class="paratype">int(11)</span>)</p> <p class="margin"> zone (<span class="paratype">int(11)</span>)</p> <p class="margin"> name (<span class="paratype">varchar(64)</span>)</p> -<p class="margin"> type (<span class="paratype">enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ptr','rp','srv','txt')</span>)</p> +<p class="margin"> type (<span class="paratype">enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ds','ptr','rp','srv','txt')</span>)</p> <p class="margin"> data (<span class="paratype">varchar(255)</span>)</p> <p class="margin"> aux (<span class="paratype">int(11)</span>)</p> <p class="margin"> ttl (<span class="paratype">int(11)</span>)</p> diff --git a/remoting_client/API-docs/dns_txt_update.html b/remoting_client/API-docs/dns_txt_update.html index 9bb7f6ac30e70cffabf5312529cebf60c9037d1d..374bede8fb0bf4f203ff5030a9be233448b63dac 100644 --- a/remoting_client/API-docs/dns_txt_update.html +++ b/remoting_client/API-docs/dns_txt_update.html @@ -22,7 +22,7 @@ <p class="margin"> server_id (<span class="paratype">int(11)</span>)</p> <p class="margin"> zone (<span class="paratype">int(11)</span>)</p> <p class="margin"> name (<span class="paratype">varchar(64)</span>)</p> -<p class="margin"> type (<span class="paratype">enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ptr','rp','srv','txt')</span>)</p> +<p class="margin"> type (<span class="paratype">enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ds','ptr','rp','srv','txt')</span>)</p> <p class="margin"> data (<span class="paratype">varchar(255)</span>)</p> <p class="margin"> aux (<span class="paratype">int(11)</span>)</p> <p class="margin"> ttl (<span class="paratype">int(11)</span>)</p> diff --git a/remoting_client/examples/dns_ds_add.php b/remoting_client/examples/dns_ds_add.php new file mode 100644 index 0000000000000000000000000000000000000000..b673150ec1cda6e32ed7164ef41acf542783a3c1 --- /dev/null +++ b/remoting_client/examples/dns_ds_add.php @@ -0,0 +1,47 @@ +<?php + +require 'soap_config.php'; + + +$client = new SoapClient(null, array('location' => $soap_location, + 'uri' => $soap_uri, + 'trace' => 1, + 'exceptions' => 1)); + + +try { + if($session_id = $client->login($username, $password)) { + echo 'Logged successfull. Session ID:'.$session_id.'<br />'; + } + + //* Set the function parameters. + //* 'data' are given for example MUST be edited with appropriate DS record + $client_id = 1; + $params = array( + 'server_id' => 1, + 'zone' => 7, + 'name' => 'nameserver', + 'type' => 'ds', + 'data' => '13456 13 2 0EXD84534054012XFN7880EDFR23Z56Y34GRC64KOY704DFTEV87AE A34ZDC45', + 'aux' => '0', + 'ttl' => '3600', + 'active' => 'y', + 'stamp' => 'CURRENT_TIMESTAMP', + 'serial' => '1', + ); + + $id = $client->dns_ds_add($session_id, $client_id, $params); + + echo "ID: ".$id."<br>"; + + if($client->logout($session_id)) { + echo 'Logged out.<br />'; + } + + +} catch (SoapFault $e) { + echo $client->__getLastResponse(); + die('SOAP Error: '.$e->getMessage()); +} + +?> diff --git a/remoting_client/examples/dns_ds_delete.php b/remoting_client/examples/dns_ds_delete.php new file mode 100644 index 0000000000000000000000000000000000000000..28794ca6fe440053107410431df780e58635c5e3 --- /dev/null +++ b/remoting_client/examples/dns_ds_delete.php @@ -0,0 +1,35 @@ +<?php + +require 'soap_config.php'; + + +$client = new SoapClient(null, array('location' => $soap_location, + 'uri' => $soap_uri, + 'trace' => 1, + 'exceptions' => 1)); + + +try { + if($session_id = $client->login($username, $password)) { + echo 'Logged successfull. Session ID:'.$session_id.'<br />'; + } + + //* Parameters + $id = 8; + + + $affected_rows = $client->dns_ds_delete($session_id, $id); + + echo "Number of records that have been deleted: ".$affected_rows."<br>"; + + if($client->logout($session_id)) { + echo 'Logged out.<br />'; + } + + +} catch (SoapFault $e) { + echo $client->__getLastResponse(); + die('SOAP Error: '.$e->getMessage()); +} + +?> diff --git a/remoting_client/examples/dns_ds_get.php b/remoting_client/examples/dns_ds_get.php new file mode 100644 index 0000000000000000000000000000000000000000..6dffa18c10eabc7a7bb3ca94f01b01334840aa19 --- /dev/null +++ b/remoting_client/examples/dns_ds_get.php @@ -0,0 +1,34 @@ +<?php + +require 'soap_config.php'; + + +$client = new SoapClient(null, array('location' => $soap_location, + 'uri' => $soap_uri, + 'trace' => 1, + 'exceptions' => 1)); + + +try { + if($session_id = $client->login($username, $password)) { + echo 'Logged successfull. Session ID:'.$session_id.'<br />'; + } + + //* Set the function parameters. + $id = 8; + + $dns_record = $client->dns_ds_get($session_id, $id); + + print_r($dns_record); + + if($client->logout($session_id)) { + echo 'Logged out.<br />'; + } + + +} catch (SoapFault $e) { + echo $client->__getLastResponse(); + die('SOAP Error: '.$e->getMessage()); +} + +?> diff --git a/remoting_client/examples/dns_ds_update.php b/remoting_client/examples/dns_ds_update.php new file mode 100644 index 0000000000000000000000000000000000000000..94f5cb10a40dbc29ccf84d9b1f7c296fba8650f6 --- /dev/null +++ b/remoting_client/examples/dns_ds_update.php @@ -0,0 +1,42 @@ +<?php + +require 'soap_config.php'; + + +$client = new SoapClient(null, array('location' => $soap_location, + 'uri' => $soap_uri, + 'trace' => 1, + 'exceptions' => 1)); + + +try { + if($session_id = $client->login($username, $password)) { + echo 'Logged successfull. Session ID:'.$session_id.'<br />'; + } + + //* Parameters + $id = 8; + $client_id = 1; + + + //* Get the dns record + $dns_record = $client->dns_ds_get($session_id, $id); + + //* Change active to inactive + $dns_record['active'] = 'n'; + + $affected_rows = $client->dns_ds_update($session_id, $client_id, $id, $dns_record); + + echo "Number of records that have been changed in the database: ".$affected_rows."<br>"; + + if($client->logout($session_id)) { + echo 'Logged out.<br />'; + } + + +} catch (SoapFault $e) { + echo $client->__getLastResponse(); + die('SOAP Error: '.$e->getMessage()); +} + +?> diff --git a/remoting_client/examples/dns_templatezone_add.php b/remoting_client/examples/dns_templatezone_add.php index aedfc61f5d9be0989bccb31177922b1fb331b446..fa45965b4875522cf0a210afcb474987ca9fa33e 100644 --- a/remoting_client/examples/dns_templatezone_add.php +++ b/remoting_client/examples/dns_templatezone_add.php @@ -32,8 +32,9 @@ try { $ns1 = 'ns1.testhoster.tld'; $ns2 = 'ns2.testhoster.tld'; $email = 'email.test.tld'; + $ipv6 = '2606:2800:220:1:248:1893:25c8:1946'; - $id = $client->dns_templatezone_add($session_id, $client_id, $template_id, $domain, $ip, $ns1, $ns2, $email); + $id = $client->dns_templatezone_add($session_id, $client_id, $template_id, $domain, $ip, $ns1, $ns2, $email, $ipv6); echo "ID: ".$id."<br>"; @@ -47,4 +48,4 @@ try { die('SOAP Error: '.$e->getMessage()); } -?> \ No newline at end of file +?> diff --git a/server/conf/awstats_index.php.master b/server/conf/awstats_index.php.master index b3e694ebbf3441038b45508f8e1e1624c3a0f481..86eec8a73dea0038a4d4e9c77e8088e3d20a44cd 100644 --- a/server/conf/awstats_index.php.master +++ b/server/conf/awstats_index.php.master @@ -43,23 +43,17 @@ if ($handle = opendir('.')) arsort($awprev); $options = ""; -foreach ($awprev as $key => $value) -{ - - if(file_exists($value.'/awsindex.html') && file_exists($value.'/goaindex.html')) { - $awstatsindex = 'awsindex.html'; - } elseif(file_exists($value.'/awsindex.html') && !file_exists($value.'/goaindex.html')) { - $awstatsindex = 'awsindex.html'; - } else { - $awstatsindex = 'goaindex.html'; - } - +foreach ($awprev as $key => $value) { + // Define name for the index file + $awstatsindex = 'awsindex.html'; + if(!file_exists($value.'/awsindex.html') && file_exists($value.'/goaindex.html')) { + $awstatsindex = 'goaindex.html'; + } + // Set name for first entry in month list if($key == $current) $options .= "<option selected=\"selected\" value=\"{$awstatsindex}\">{$value}</option>\n"; else $options .= "<option value=\"{$value}/{$awstatsindex}\">{$value}</option>\n"; } -$awstatsindex = 'awsindex.html'; - $html = "<!DOCTYPE html>\n<html>\n<head>\n<title>Stats</title>\n"; $html .= "<style>\nhtml,body {margin:0px;padding:0px;width:100%;height:100%;background-color: #ccc;}\n"; $html .= "#header\n{\nwidth:100%;margin:0px auto;\nheight:20px;\nposition:fixed;\npadding:4px;\ntext-align:center;\n}\n"; @@ -68,7 +62,7 @@ $html .= $script; $html .= "<div id=\"header\">{$yearmonth_text}\n"; $html .= "<select name=\"awdate\" onchange=\"load_content(this.value)\">\n"; $html .= $options; -$html .= "</select>\n</div>\n<iframe src=\"{$awstatsindex}\" id=\"content\"></iframe>\n"; +$html .= "</select>\n</div>\n<iframe src=\"awsindex.html\" id=\"content\"></iframe>\n"; $html .= "</body></html>"; echo $html; ?> diff --git a/server/conf/bind_pri.domain.master b/server/conf/bind_pri.domain.master index e5af0ca3118401e1cd20853ecd58956685111267..efaa06a28d4242a19e4f636d536c614202a4b66d 100644 --- a/server/conf/bind_pri.domain.master +++ b/server/conf/bind_pri.domain.master @@ -54,7 +54,7 @@ $TTL {tmpl_var name='ttl'} {tmpl_var name='name'} {tmpl_var name='ttl'} SRV {tmpl_var name='aux'} {tmpl_var name='data'} </tmpl_if> <tmpl_if name="type" op='==' value='SSHFP'> -{tmpl_var name='name'} {tmpl_var name='ttl'} SSHFP {tmpl_var name='data'} {tmpl_var name='data'} +{tmpl_var name='name'} {tmpl_var name='ttl'} SSHFP {tmpl_var name='data'} </tmpl_if> <tmpl_if name="type" op='==' value='TLSA'> {tmpl_var name='name'} {tmpl_var name='ttl'} TLSA {tmpl_var name='data'} diff --git a/server/conf/index/standard_index.html_sk b/server/conf/index/standard_index.html_sk new file mode 100644 index 0000000000000000000000000000000000000000..d6edcdeb9f3c73ab85f1292b8d4a320ad8b6fafe --- /dev/null +++ b/server/conf/index/standard_index.html_sk @@ -0,0 +1,60 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + <title>Vitajte!</title> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> + <link rel="shortcut icon" href="/favicon.ico" /> + <meta name="robots" content="noindex" /> + <style type="text/css"><!-- + body { + color: #444444; + background-color: #EEEEEE; + font-family: 'Trebuchet MS', sans-serif; + font-size: 80%; + } + h1 {} + h2 { font-size: 1.2em; } + #page{ + background-color: #FFFFFF; + width: 60%; + margin: 24px auto; + padding: 12px; + } + #header{ + padding: 6px ; + text-align: center; + } + .header{ background-color: #83A342; color: #FFFFFF; } + #content { + padding: 4px 0 24px 0; + } + #footer { + color: #666666; + background: #f9f9f9; + padding: 10px 20px; + border-top: 5px #efefef solid; + font-size: 0.8em; + text-align: center; + } + #footer a { + color: #999999; + } + --></style> +</head> +<body> + <div id="page"> + <div id="header" class="header"> + <h1>Vitajte na <!--ADRESSE//-->VaÅ¡ej webstránke!<!--ADRESSE//--></h1> + </div> + <div id="content"> + <h2>Toto je Å¡tandardná stránka VaÅ¡ej webstránky.</h2> + <p>Môžete ju bez obáv vymazaÅ¥ alebo nahradiÅ¥ iným súborom. Toto je súbor <b>index.html</b> v adresári <b>web</b>.</p> + <p>Ak máte akékoľvek otázky kontaktujte <!--SUPPORT//-->podporu<!--SUPPORT//-->.</p> + </div> + <div id="footer"> + <p>Powered by <a href="https://www.ispconfig.org">ISPConfig</a></p> + </div> + </div> +</body> +</html> diff --git a/server/conf/index/user_standard_index.html_sk b/server/conf/index/user_standard_index.html_sk new file mode 100644 index 0000000000000000000000000000000000000000..36e8e90db844d24a0c23767ec25b1260f249e9ea --- /dev/null +++ b/server/conf/index/user_standard_index.html_sk @@ -0,0 +1,60 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + <title>Vitajte!</title> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> + <link rel="shortcut icon" href="/favicon.ico" /> + <meta name="robots" content="noindex" /> + <style type="text/css"><!-- + body { + color: #444444; + background-color: #EEEEEE; + font-family: 'Trebuchet MS', sans-serif; + font-size: 80%; + } + h1 {} + h2 { font-size: 1.2em; } + #page{ + background-color: #FFFFFF; + width: 60%; + margin: 24px auto; + padding: 12px; + } + #header{ + padding: 6px ; + text-align: center; + } + .header{ background-color: #83A342; color: #FFFFFF; } + #content { + padding: 4px 0 24px 0; + } + #footer { + color: #666666; + background: #f9f9f9; + padding: 10px 20px; + border-top: 5px #efefef solid; + font-size: 0.8em; + text-align: center; + } + #footer a { + color: #999999; + } + --></style> +</head> +<body> + <div id="page"> + <div id="header" class="header"> + <h1>Vitajte na <!--ADRESSE//-->VaÅ¡ej webstránke!<!--ADRESSE//--></h1> + </div> + <div id="content"> + <h2>Toto je Å¡tandardná stránka VaÅ¡ej webstránky <b>{USER_USERNAME}</b></h2> + <p>Môžete ju bez obáv vymazaÅ¥ alebo nahradiÅ¥ iným súborom. Toto je súbor <b>index.html</b> v adresári <b>user/{USER_USERNAME}/web</b>.</p> + <p>Ak máte akékoľvek otázky kontaktujte <!--SUPPORT//-->podporu<!--SUPPORT//-->.</p> + </div> + <div id="footer"> + <p>Powered by <a href="https://www.ispconfig.org">ISPConfig</a></p> + </div> + </div> +</body> +</html> diff --git a/server/conf/mail/db_quota_notification_sk.txt b/server/conf/mail/db_quota_notification_sk.txt new file mode 100644 index 0000000000000000000000000000000000000000..c90c9854073801c943ef39ced9d6b37f6bb18273 --- /dev/null +++ b/server/conf/mail/db_quota_notification_sk.txt @@ -0,0 +1,13 @@ +MIME-Version: 1.0 +Content-type: text/plain; charset=utf-8 +Content-Transfer-Encoding: 8bit +From: {admin_mail} +Reply-To: {admin_mail} +Subject: Upozornenie na veľkosÅ¥ databázy + +Databáza {database_name} je blÃzko alebo prekroÄila limit veľkosti. + +Databáza: {database_name} +Využité miesto: {used} +Limit: {quota} +Percento využitia: {ratio} diff --git a/server/conf/mail/db_quota_ok_notification_sk.txt b/server/conf/mail/db_quota_ok_notification_sk.txt new file mode 100644 index 0000000000000000000000000000000000000000..10dc74ca811fc443c222a336799efb96dc8ba111 --- /dev/null +++ b/server/conf/mail/db_quota_ok_notification_sk.txt @@ -0,0 +1,13 @@ +MIME-Version: 1.0 +Content-type: text/plain; charset=utf-8 +Content-Transfer-Encoding: 8bit +From: {admin_mail} +Reply-To: {admin_mail} +Subject: VeľkosÅ¥ databázy ok + +Databáza {database_name} už nie je blÃzko ani neprekraÄuje limit veľkosti. + +Databáza: {database_name} +Využité miesto: {used} +Limit: {quota} +Percento využitia: {ratio} diff --git a/server/conf/mail/mail_quota_notification_sk.txt b/server/conf/mail/mail_quota_notification_sk.txt new file mode 100644 index 0000000000000000000000000000000000000000..f9abcab03a3785ffa99b2b27eb210984774fac65 --- /dev/null +++ b/server/conf/mail/mail_quota_notification_sk.txt @@ -0,0 +1,14 @@ +MIME-Version: 1.0 +Content-type: text/plain; charset=utf-8 +Content-Transfer-Encoding: 8bit +From: {admin_mail} +Reply-To: {admin_mail} +Subject: Upozornenie na veľkosÅ¥ poÅ¡tovej schránky + +PoÅ¡tová schránka {email} je blÃzko alebo prekroÄila limit veľkosti. + +PoÅ¡tová schránka: {email} +Meno: {name} +Využité miesto: {used} +Limit: {quota} +Percento využitia: {ratio} diff --git a/server/conf/mail/mail_quota_ok_notification_sk.txt b/server/conf/mail/mail_quota_ok_notification_sk.txt new file mode 100644 index 0000000000000000000000000000000000000000..1750a5ecd51902bd0da6d5cf04174de4bbd712b7 --- /dev/null +++ b/server/conf/mail/mail_quota_ok_notification_sk.txt @@ -0,0 +1,14 @@ +MIME-Version: 1.0 +Content-type: text/plain; charset=utf-8 +Content-Transfer-Encoding: 8bit +From: {admin_mail} +Reply-To: {admin_mail} +Subject: VeľkosÅ¥ poÅ¡tovej schránky ok + +PoÅ¡tová schránka {email} už nie je blÃzko ani neprekraÄuje limit veľkosti. + +PoÅ¡tová schránka: {email} +Meno: {name} +Využité miesto: {used} +Limit: {quota} +Percento využitia: {ratio} diff --git a/server/conf/mail/web_quota_notification_sk.txt b/server/conf/mail/web_quota_notification_sk.txt new file mode 100644 index 0000000000000000000000000000000000000000..62a73a7404f44e22853fd1422f589fb3858947e0 --- /dev/null +++ b/server/conf/mail/web_quota_notification_sk.txt @@ -0,0 +1,14 @@ +MIME-Version: 1.0 +Content-type: text/plain; charset=utf-8 +Content-Transfer-Encoding: 8bit +From: {admin_mail} +Reply-To: {admin_mail} +Subject: Upozornenie na veľkosÅ¥ webstránky + +Webstránka {domain} je blÃzko alebo prekroÄila limit veľkosti. + +Doména: {domain} +Využité miesto: {used} +Mäkký limit: {soft} +Tvrdý limit: {hard} +Percento využitia: {ratio} diff --git a/server/conf/mail/web_quota_ok_notification_sk.txt b/server/conf/mail/web_quota_ok_notification_sk.txt new file mode 100644 index 0000000000000000000000000000000000000000..88f36432a0bfbd669cfce24e441ed724a9d7c895 --- /dev/null +++ b/server/conf/mail/web_quota_ok_notification_sk.txt @@ -0,0 +1,14 @@ +MIME-Version: 1.0 +Content-type: text/plain; charset=utf-8 +Content-Transfer-Encoding: 8bit +From: {admin_mail} +Reply-To: {admin_mail} +Subject: VeľkosÅ¥ webstránky ok + +Webstránka {domain} už nie je blÃzko ani neprekraÄuje limit veľkosti. + +Doména: {domain} +Využité miesto: {used} +Mäkký limit: {soft} +Tvrdý limit: {hard} +Percento využitia: {ratio} diff --git a/server/conf/mail/web_traffic_notification_sk.txt b/server/conf/mail/web_traffic_notification_sk.txt new file mode 100644 index 0000000000000000000000000000000000000000..8cac0e96138e92e3ed0520054cbc631c6d7ada77 --- /dev/null +++ b/server/conf/mail/web_traffic_notification_sk.txt @@ -0,0 +1,8 @@ +MIME-Version: 1.0 +Content-type: text/plain; charset=utf-8 +Content-Transfer-Encoding: 8bit +From: {admin_mail} +Reply-To: {admin_mail} +Subject: Upozornenie na dátovú premávku webstránky + +Webstránka {domain} prekroÄila limit dátovej premávky a bola zablokovaná. diff --git a/server/conf/mail/web_traffic_notification_warn_sk.txt b/server/conf/mail/web_traffic_notification_warn_sk.txt new file mode 100644 index 0000000000000000000000000000000000000000..7f83616a5e14472a03509e8839b915456301c212 --- /dev/null +++ b/server/conf/mail/web_traffic_notification_warn_sk.txt @@ -0,0 +1,8 @@ +MIME-Version: 1.0 +Content-type: text/plain; charset=utf-8 +Content-Transfer-Encoding: 8bit +From: {admin_mail} +Reply-To: {admin_mail} +Subject: Upozornenie na dátovú premávku webstránky + +Webstránka {domain} prekroÄila limit dátovej premávky. diff --git a/server/conf/mail/welcome_email_sk.txt b/server/conf/mail/welcome_email_sk.txt new file mode 100644 index 0000000000000000000000000000000000000000..98f6d8ecc668519608bdcd7c7b216e334531b6d4 --- /dev/null +++ b/server/conf/mail/welcome_email_sk.txt @@ -0,0 +1,4 @@ +From: {admin_name} <{admin_mail}> +Subject: Vitajte vo VaÅ¡ej novej emailovej schránke. + +Vitajte vo VaÅ¡ej novej emailovej schránke. Váš správca. diff --git a/server/conf/nginx_apps.vhost.master b/server/conf/nginx_apps.vhost.master index de4842005491ef64b207bbbb85ee347298585638..181f4c807e2ee0761e61ef26f3f0589153703ca2 100644 --- a/server/conf/nginx_apps.vhost.master +++ b/server/conf/nginx_apps.vhost.master @@ -1,6 +1,6 @@ server { - listen {apps_vhost_ip}{apps_vhost_port} {ssl_on} http2; - listen [::]:{apps_vhost_port} {ssl_on} ipv6only=on http2; + listen {apps_vhost_ip}{apps_vhost_port} {ssl_on}; + listen [::]:{apps_vhost_port} {ssl_on} ipv6only=on; {ssl_comment}ssl_protocols TLSv1.2; {ssl_comment}ssl_certificate /usr/local/ispconfig/interface/ssl/ispserver.crt; diff --git a/server/conf/nginx_vhost.conf.master b/server/conf/nginx_vhost.conf.master index d5e457b9e33e3da4313a8260fa4ce58264468d13..1c219f0cd4654ef88356afd1f67a95d3577baab9 100644 --- a/server/conf/nginx_vhost.conf.master +++ b/server/conf/nginx_vhost.conf.master @@ -60,13 +60,13 @@ server { </tmpl_loop> <tmpl_loop name="local_redirects"> if ($http_host <tmpl_var name='local_redirect_operator'> "<tmpl_var name='local_redirect_origin_domain'>") { - rewrite ^<tmpl_var name='local_redirect_exclude'>(.*)$ <tmpl_var name='local_redirect_target'>$1 <tmpl_var name='local_redirect_type'>; + rewrite ^<tmpl_var name='local_redirect_exclude'>(.*)$ <tmpl_var name='local_redirect_target'>$2 <tmpl_var name='local_redirect_type'>; } </tmpl_loop> <tmpl_loop name="own_redirects"> <tmpl_if name='use_rewrite'> - <tmpl_if name='exclude_own_hostname'>if ($http_host != "<tmpl_var name='exclude_own_hostname'>") { </tmpl_if>rewrite ^<tmpl_var name='rewrite_exclude'>(.*)$ <tmpl_var name='rewrite_target'>$1 <tmpl_var name='rewrite_type'>;<tmpl_if name='exclude_own_hostname'> }</tmpl_if> + <tmpl_if name='exclude_own_hostname'>if ($http_host != "<tmpl_var name='exclude_own_hostname'>") { </tmpl_if>rewrite ^<tmpl_var name='rewrite_exclude'>(.*)$ <tmpl_var name='rewrite_target'>$2 <tmpl_var name='rewrite_type'>;<tmpl_if name='exclude_own_hostname'> }</tmpl_if> </tmpl_if> <tmpl_if name='use_proxy'> location / { @@ -355,11 +355,18 @@ server { <tmpl_if name='ipv6_enabled'> listen [<tmpl_var name='ipv6_address'>]:<tmpl_var name='http_port'>; </tmpl_if> +<tmpl_if name='ipv6_wildcard'> + listen [::]:<tmpl_var name='http_port'>; +</tmpl_if> + <tmpl_if name='ssl_enabled'> - listen <tmpl_var name='ip_address'>:<tmpl_var name='https_port'> ssl; + listen <tmpl_var name='ip_address'>:<tmpl_var name='https_port'> ssl http2; <tmpl_if name='ipv6_enabled'> - listen [<tmpl_var name='ipv6_address'>]:<tmpl_var name='https_port'> ssl; + listen [<tmpl_var name='ipv6_address'>]:<tmpl_var name='https_port'> ssl http2; +</tmpl_if> +<tmpl_if name='ipv6_wildcard'> + listen [::]:<tmpl_var name='https_port'> ssl http2; </tmpl_if> ssl_certificate <tmpl_var name='ssl_crt_file'>; ssl_certificate_key <tmpl_var name='ssl_key_file'>; diff --git a/server/conf/rspamd_classifier-bayes.conf.master b/server/conf/rspamd_classifier-bayes.conf.master new file mode 100644 index 0000000000000000000000000000000000000000..0906bfe63e9cd1ab012de20d44d3390de29fe1c5 --- /dev/null +++ b/server/conf/rspamd_classifier-bayes.conf.master @@ -0,0 +1,16 @@ +backend = "redis"; +<tmpl_if name="rspamd_redis_bayes_servers"> +servers = "<tmpl_var name='rspamd_redis_bayes_servers'>"; +</tmpl_if> +<tmpl_if name="rspamd_redis_bayes_password"> +password = "<tmpl_var name='rspamd_redis_bayes_password'>"; +</tmpl_if> +autolearn { + spam_threshold = 6.0; # When to learn spam (score >= threshold and action is reject) + junk_threshold = 4.0; # When to learn spam (score >= threshold and action is rewrite subject or add header, and has two or more positive results) + ham_threshold = -0.5; # When to learn ham (score <= threshold and action is no action, and score is negative or has three or more negative results) + check_balance = true; # Check spam and ham balance + min_balance = 0.9; # Keep diff for spam/ham learns for at least this value +} +per_user = false; +per_language = true; diff --git a/server/conf/rspamd_dkim_signing.conf.master b/server/conf/rspamd_dkim_signing.conf.master new file mode 100644 index 0000000000000000000000000000000000000000..10d89e74952075ce6daa6244ef9dbf5b22fa4a5a --- /dev/null +++ b/server/conf/rspamd_dkim_signing.conf.master @@ -0,0 +1,4 @@ +try_fallback = false; +use_esld = false; +path_map = "/etc/rspamd/local.d/dkim_domains.map"; +selector_map = "/etc/rspamd/local.d/dkim_selectors.map"; diff --git a/server/conf/rspamd_redis.conf.master b/server/conf/rspamd_redis.conf.master new file mode 100644 index 0000000000000000000000000000000000000000..08b7f8ca901cc937a5c47f7b80c78b02121e093c --- /dev/null +++ b/server/conf/rspamd_redis.conf.master @@ -0,0 +1,4 @@ +servers = "<tmpl_var name='rspamd_redis_servers'>"; +<tmpl_if name="rspamd_redis_password"> +password = "<tmpl_var name='rspamd_redis_password'>"; +</tmpl_if> diff --git a/server/conf/sieve_filter.master b/server/conf/sieve_filter.master index 16a39ec1801259d3acd74d6c36be6b1eb431787a..fd216d3d6401bf2e81f35b7239041daabbfd6054 100644 --- a/server/conf/sieve_filter.master +++ b/server/conf/sieve_filter.master @@ -7,7 +7,7 @@ require ["fileinto", "mailbox", "regex", "date", "relational", "vacation", "imap <tmpl_if name="move_junk" op="==" value="y"> # Move spam to spam folder -if anyof (header :contains "X-Spam-Flag" "YES", header :contains ["X-Spam", "X-Spam-Status"] "Yes") { +if anyof (header :is ["X-Spam", "X-Spam-Flag"] "Yes", header :matches "X-Spam-Status" "Yes, *") { fileinto :create "Junk"; # Stop here so that we do not reply on spams stop; @@ -33,7 +33,7 @@ require ["fileinto", "mailbox", "regex", "date", "relational", "vacation", "imap <tmpl_if name="move_junk" op="==" value="a"> # Move spam to spam folder -if anyof (header :contains "X-Spam-Flag" "YES", header :contains ["X-Spam", "X-Spam-Status"] "Yes") { +if anyof (header :is ["X-Spam", "X-Spam-Flag"] "Yes", header :matches "X-Spam-Status" "Yes, *") { fileinto :create "Junk"; # Stop here so that we do not reply on spams stop; @@ -46,7 +46,7 @@ if anyof (header :contains "X-Spam-Flag" "YES", header :contains ["X-Spam", "X-S ################################################################# # Move spam to spam folder -if anyof (header :contains "X-Spam-Flag" "YES", header :contains ["X-Spam", "X-Spam-Status"] "Yes") { +if anyof (header :is ["X-Spam", "X-Spam-Flag"] "Yes", header :matches "X-Spam-Status" "Yes, *") { # Stop here so that we do not reply on spams stop; } diff --git a/server/conf/vhost.conf.master b/server/conf/vhost.conf.master index 5b5e1f059e94f5b58b3fad4c64cf1a4dcd70111d..a1873eab84033afbc75776924ac7414962aeef6a 100644 --- a/server/conf/vhost.conf.master +++ b/server/conf/vhost.conf.master @@ -516,6 +516,13 @@ RewriteCond %{REQUEST_URI} !^/webdav/ RewriteCond %{REQUEST_URI} !^/php-fcgi/ RewriteCond %{REQUEST_URI} !^<tmpl_var name='rewrite_target'> +</tmpl_if> +<tmpl_if name='use_proxy_protocol' op='==' value='y'> +<tmpl_if name='ssl_enabled'> +<tmpl_if name="rewrite_target_is_ssl" op="==" value="y"> + SSLProxyEngine On +</tmpl_if> +</tmpl_if> </tmpl_if> RewriteRule ^/(.*)$ <tmpl_var name='rewrite_target'><tmpl_if name="rewrite_add_path" op="==" value="y">$1</tmpl_if> <tmpl_var name='rewrite_type'> diff --git a/server/lib/app.inc.php b/server/lib/app.inc.php index e0e8c85db2882eff0178e19995aa093f5d9d43a3..ffd20e9fb6129df681a0c5ae158b2d3929557f6a 100644 --- a/server/lib/app.inc.php +++ b/server/lib/app.inc.php @@ -1,7 +1,6 @@ <?php - -/* -Copyright (c) 2007, Till Brehm, projektfarm Gmbh +/** +Copyright (c) 2007-2022, Till Brehm, projektfarm Gmbh All rights reserved. Redistribution and use in source and binary forms, with or without modification, @@ -28,35 +27,56 @@ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -//* Set timezone -if(isset($conf['timezone']) && $conf['timezone'] != '') date_default_timezone_set($conf['timezone']); +if(version_compare(phpversion(), '7.0', '<')) { + require_once 'compatibility.inc.php'; +} -class app { +// Set timezone +if(isset($conf['timezone']) && $conf['timezone'] != '') { // note: !empty($conf['timezone']) should give the same result and is more idiomatic for current versions of PHP (gwyneth 20220315) + date_default_timezone_set($conf['timezone']); +} - var $loaded_modules = array(); - var $loaded_plugins = array(); +/** + * Class for defining (mostly static) methods that are commonly used across the whole application. + * + * @category unknown + * @package server + * @author Till Brehm + * @license bsd-3-clause + * @link empty + **/ +class app { + /** @var array List of modules that have been loaded. */ + var $loaded_modules = []; + /** @var array List of plugins that have been loaded. */ + var $loaded_plugins = []; + /** @var callable Script calling this. */ var $_calling_script = ''; - /** - * @var db - */ + /** @var resource? Database used for ISPConfig3. */ public $db; + /** + * Class constructor, which depends on the global configuration stored in $conf. + * + * @param void + * @return void + */ function __construct() { - + /** @var object Global object storing this application's configuration. */ global $conf; if($conf['start_db'] == true) { - $this->load('db_'.$conf['db_type']); + $this->load('db_' . $conf['db_type']); try { $this->db = new db; - } catch (Exception $e) { + } catch(Exception $e) { $this->db = false; } /* - Initialize the connection to the master DB, - if we are in a multiserver setup - */ + Initialize the connection to the master DB, + if we are in a multiserver setup + */ if($conf['dbmaster_host'] != '' && ($conf['dbmaster_host'] != $conf['db_host'] || ($conf['dbmaster_host'] == $conf['db_host'] && $conf['dbmaster_database'] != $conf['db_database']))) { try { @@ -67,14 +87,19 @@ class app { } else { $this->dbmaster = $this->db; } - - } + } // end constructor - } - + /** + * Getter method for some of the (valid) proprieties. + * + * @param string $name A valid property name to get. Will be checked for validity first! + * + * @return mixed + */ public function __get($name) { - $valid_names = array('functions', 'getconf', 'letsencrypt', 'modules', 'plugins', 'services', 'system'); + /** @var array List of all possible proprieties that are valid to get. */ + $valid_names = ['functions', 'getconf', 'letsencrypt', 'modules', 'plugins', 'services', 'system']; if(!in_array($name, $valid_names)) { trigger_error('Undefined property ' . $name . ' of class app', E_USER_WARNING); } @@ -89,14 +114,37 @@ class app { } } + /** + * Sets the calling script. + * + * @param callable $caller Calling script function. + * + * @return void + */ function setCaller($caller) { $this->_calling_script = $caller; } + /** + * Gets the calling script. + * + * Note that there is no error checking! + * + * @param void + * + * @return callable|null + */ function getCaller() { return $this->_calling_script; } + /** + * Emergency exit funcion. + * + * @param string $errmsg Error message to be displayedby the die() command on exit. + * + * @return void + */ function forceErrorExit($errmsg = 'undefined') { global $conf; @@ -106,16 +154,27 @@ class app { die('Exiting because of error: ' . $errmsg); } + /** + * Dynamic plugin loader and instantiator. + * + * This will include PHP scripts on demand, each representing a class to be loaded, + * and if the process succeeds, it will retrieve an instance for the class. + * + * @param string $classes A list of plugin classes to be loaded (e.g. their files will be included) + * and subsequently instantiated; it's a comma-separated string. + * + * @return void + */ function uses($classes) { - global $conf; + /** @var array|null List of classes to be used, as an array, after successful 'explosion' */ $cl = explode(',', $classes); if(is_array($cl)) { foreach($cl as $classname) { if(!@is_object($this->$classname)) { - if(is_file($conf['classpath'].'/'.$classname.'.inc.php') && (DEVSYSTEM || !is_link($conf['classpath'].'/'.$classname.'.inc.php'))) { - include_once $conf['classpath'].'/'.$classname.'.inc.php'; + if(is_file($conf['classpath'] . '/' . $classname . '.inc.php') && (DEVSYSTEM || !is_link($conf['classpath'] . '/' . $classname . '.inc.php'))) { + include_once $conf['classpath'] . '/' . $classname . '.inc.php'; $this->$classname = new $classname; } } @@ -123,64 +182,119 @@ class app { } } + /** + * Dynamic plugin loader (no instantation). + * + * Similar to uses() but does _not_ instantate a new class; files are merely included. + * die() is called on a failure to include the file for a class. + * + * @param string $classes A list of plugin classes to be loaded (e.g. their files will be included); + * it's a comma-separated string. + * + * @return void + */ function load($classes) { - global $conf; + /** @var array|null List of classes to be loaded, as an array, after successful 'explosion' */ $cl = explode(',', $classes); if(is_array($cl)) { foreach($cl as $classname) { - if(is_file($conf['classpath'].'/'.$classname.'.inc.php') && (DEVSYSTEM || !is_link($conf['classpath'].'/'.$classname.'.inc.php'))) { - include_once $conf['classpath'].'/'.$classname.'.inc.php'; + if(is_file($conf['classpath'] . '/' . $classname . '.inc.php') && (DEVSYSTEM || !is_link($conf['classpath'] . '/' . $classname . '.inc.php'))) { + include_once $conf['classpath'] . '/' . $classname . '.inc.php'; } else { - die('Unable to load: '.$conf['classpath'].'/'.$classname.'.inc.php'); + die('Unable to load: ' . $conf['classpath'] . '/' . $classname . '.inc.php'); } } } } - /* - 0 = DEBUG - 1 = WARNING - 2 = ERROR - */ - + /** + * Logs a message with a certain priority to the different log backends. + * + * This method will check if the priority is equal or larger than what the user has + * defined as the minimum logging level, and will output to several logging facilities: + * - At the very least, the message will _usually_ go to stdout; + * - It may optionally also go to the file log (usually `/var/log/ispconfig/ispconfig.log`) + * which will be created if it doesn't exist; + * - When the $dblog parameter is set to true (the default), the message will also be logged + * to the database; + * - If the system is configured to send email messages to the administrator, + * this method will also handle those (assuming, again, that the priority matches). + * + * Debugging messages will also have the name of the calling module/script as well as a line number + * to assist error tracking (gwyneth 20220315). This incurs in a slight performance hit. + * + * @param string $msg The message to be logged. + * @param int $priority Should be set to 0 = DEBUG, 1 = WARNING or 2 = ERROR; anything else + * will skip setting the priority textual variable. + * @param bool $dblog Should the message also be logged to the database? (Default is _true_) + * + * @return void + * + * @note The error() method below seems to write to an invalid priority (3), which will cause + * no message priority text to be emitted, and will _force_ a database write and/or sending + * an email to the administrator. + */ function log($msg, $priority = 0, $dblog = true) { - global $conf; + /** + * @var string $file_line_caller + * + * For debugging, deal with retrieving caller information from the stack. (gwyneth 20220315) + * See https://stackoverflow.com/q/1252529/1035977 (including the precious comments!) for an explanation + * of how this works. + **/ + $file_line_caller = ""; + /** @var string Defined here because recent versions of PHP are stricter with scoping issues. (gwyneth 20220315) */ + $priority_txt = ''; + switch ($priority) { case 0: - $priority_txt = 'DEBUG'; - break; + $priority_txt = 'DEBUG'; + $bt = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 1); // we don't need _all_ data, so we save some processing time here (gwyneth 20220315) + $caller = array_shift($bt); + if(!empty($caller['file']) && !empty($caller['line'])) { + $file_line_caller = '[' . strtr(basename($caller['file'], '.php'), '_', ' ') . ':' . $caller['line'] . '] '; + } + break; case 1: - $priority_txt = 'WARNING'; - break; + $priority_txt = 'WARNING'; + break; case 2: - $priority_txt = 'ERROR'; - break; + $priority_txt = 'ERROR'; + break; + // Note: $this->error() seems to use case 3 to deliberately skip setting a priority text. + // It will also *force* a write to the logs and/or send emails. (gwyneth 20220315) } - $log_msg = @date('d.m.Y-H:i').' - '.$priority_txt.' - '. $msg; + /** @var string Formatted message to be sent to the logging subsystems. */ + $log_msg = @date('d.m.Y-H:i') . ' - ' . $priority_txt . ' ' . $file_line_caller . '- '. $msg; + + // Check if the user-set priority defines that this message should be output at all. if($priority >= $conf['log_priority']) { - //if (is_writable($conf["log_file"])) { - if (!$fp = fopen($conf['log_file'], 'a')) { + // Prepare to add a line on the logfile, or to create the logfile in + // append mode if it doesn't exist yet. Failure means that die() is called. + + //if(is_writable($conf["log_file"])) { + if(!$fp = fopen($conf['log_file'], 'a')) { die('Unable to open logfile.'); } - if (!fwrite($fp, $log_msg."\r\n")) { + if(!fwrite($fp, $log_msg . "\r\n")) { die('Unable to write to logfile.'); } - echo $log_msg."\n"; + echo $log_msg . "\n"; fclose($fp); - // Log to database + // Log to database. if($dblog === true && isset($this->dbmaster)) { $server_id = $conf['server_id']; $loglevel = $priority; $message = $msg; - $datalog_id = (isset($this->modules->current_datalog_id) && $this->modules->current_datalog_id > 0)?$this->modules->current_datalog_id:0; + $datalog_id = (isset($this->modules->current_datalog_id) && $this->modules->current_datalog_id > 0)? $this->modules->current_datalog_id : 0; if($datalog_id > 0) { $tmp_rec = $this->dbmaster->queryOneRecord("SELECT count(syslog_id) as number FROM sys_log WHERE datalog_id = ? AND loglevel = ?", $datalog_id, LOGLEVEL_ERROR); //* Do not insert duplicate errors into the web log. @@ -198,18 +312,18 @@ class app { // die("Unable to write to logfile."); //} - } // if + // Send an email to the administrator if the current priority demands it. if(isset($conf['admin_notify_priority']) && $priority >= $conf['admin_notify_priority'] && $conf['admin_mail'] != '') { if($conf['hostname'] != 'localhost' && $conf['hostname'] != '') { $hostname = $conf['hostname']; } else { $hostname = exec('hostname -f'); } - // send notification to admin + // Send notification to admin. $mailBody = $hostname . " - " . $log_msg; - $mailSubject = substr("[" . $hostname . "]" . " " . $log_msg, 0, 70).'...'; + $mailSubject = substr("[" . $hostname . "]" . " " . $log_msg, 0, 70) . '...'; $mailHeaders = "MIME-Version: 1.0" . "\n"; $mailHeaders .= "Content-type: text/plain; charset=utf-8" . "\n"; $mailHeaders .= "Content-Transfer-Encoding: 8bit" . "\n"; @@ -218,26 +332,30 @@ class app { mail($conf['admin_mail'], $mailSubject, $mailBody, $mailHeaders); } - } // func - - - /* - 0 = DEBUG - 1 = WARNING - 2 = ERROR - */ + } // func log + /** + * Logs a message with an undefined priority (3) and dies. + * + * This method writes to an invalid/undefined priority level (3), which will cause + * no message priority text to be emitted, but will _force_ a database write and/or sending + * an email to the administrator. + * + * @param string $msg The message to be logged. + * + * @return void + */ function error($msg) { - $this->log($msg, 3); + $this->log($msg, 3); // isn't this supposed to be error code 2? (gwyneth 20220315) die($msg); } - } -/* - Initialize application (app) object -*/ - +/** + * @var \app $app + * + * Initialize application object. + */ $app = new app; ?> diff --git a/server/lib/classes/backup.inc.php b/server/lib/classes/backup.inc.php index 3cdf17d1fc8fe9eacacd440257589507f65b1475..2b6d21e57e3ad5501d69dc1ad83f55fdf2693c1b 100644 --- a/server/lib/classes/backup.inc.php +++ b/server/lib/classes/backup.inc.php @@ -32,6 +32,7 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * Class backup * All code that makes actual backup and restore of web files and database is here. * @author Ramil Valitov <ramilvalitov@gmail.com> + * @author Jorge Muñoz <elgeorge2k@gmail.com> (Repository addition) * @see backup::run_backup() to run a single backup * @see backup::run_all_backups() to run all backups * @see backup::restoreBackupDatabase() to restore a database @@ -93,6 +94,16 @@ class backup } return null; } + /** + * Checks whatever a backup mode is for a repository + * @param $mode Backup mode + * @return bool + * @author Jorge Muñoz <elgeorge2k@gmail.com> + */ + protected static function backupModeIsRepos($mode) + { + return 'borg' === $mode; + } /** * Sets file ownership to $web_user for all files and folders except log, ssl and web/stats @@ -148,6 +159,7 @@ class backup * @return bool true if succeeded * @see backup_plugin::mount_backup_dir() * @author Ramil Valitov <ramilvalitov@gmail.com> + * @author Jorge Muñoz <elgeorge2k@gmail.com> */ public static function restoreBackupDatabase($backup_format, $password, $backup_dir, $filename, $backup_mode, $backup_type) { @@ -155,60 +167,116 @@ class backup //* Load sql dump into db include 'lib/mysql_clientdb.conf'; + if (self::backupModeIsRepos($backup_mode)) { - if (empty($backup_format)) { - $backup_format = self::getDefaultBackupFormat($backup_mode, $backup_type); - } - $extension = self::getBackupDbExtension($backup_format); - if (!empty($extension)) { - //Replace dots for preg_match search - $extension = str_replace('.', '\.', $extension); - } - $success = false; - $full_filename = $backup_dir . '/' . $filename; + $backup_archive = $filename; + + preg_match('@^(manual-)?db_(?P<db>.+)_\d{4}-\d{2}-\d{2}_\d{2}-\d{2}$@', $backup_archive, $matches); + if (isset($matches['db']) && ! empty($matches['db'])) { + $db_name = $matches['db']; + $backup_repos_folder = self::getReposFolder($backup_mode, 'mysql', '_' . $db_name); + $backup_repos_path = $backup_dir . '/' . $backup_repos_folder; + $full_archive_path = $backup_repos_path . '::' . $backup_archive; + + $app->log('Restoring MySQL backup from archive ' . $backup_archive . ', backup mode "' . $backup_mode . '"', LOGLEVEL_DEBUG); + + $archives = self::getReposArchives($backup_mode, $backup_repos_path, $password); + } else { + $app->log('Failed to detect database name during restore of ' . $backup_archive, LOGLEVEL_ERROR); + $db_name = null; + $archives = null; + } + if (is_array($archives)) { + if (in_array($backup_archive, $archives)) { + switch ($backup_mode) { + case "borg": + $command = self::getBorgCommand('borg extract --nobsdflags', $password); + $command .= " --stdout ? stdin | mysql -h ? -u ? -p? ?"; + break; + } + } else { + $app->log('Failed to process MySQL backup ' . $full_archive_path . ' because it does not exist', LOGLEVEL_ERROR); + $command = null; + } + } + if (!empty($command)) { + /** @var string $clientdb_host */ + /** @var string $clientdb_user */ + /** @var string $clientdb_password */ + $app->system->exec_safe($command, $full_archive_path, $clientdb_host, $clientdb_user, $clientdb_password, $db_name); + $retval = $app->system->last_exec_retcode(); + if ($retval == 0) { + $app->log('Restored database backup ' . $full_archive_path, LOGLEVEL_DEBUG); + $success = true; + } else { + $app->log('Failed to restore database backup ' . $full_archive_path . ', exit code ' . $retval, LOGLEVEL_ERROR); + } + } + } else { + if (empty($backup_format)) { + $backup_format = self::getDefaultBackupFormat($backup_mode, $backup_type); + } + $extension = self::getBackupDbExtension($backup_format); + if (!empty($extension)) { + //Replace dots for preg_match search + $extension = str_replace('.', '\.', $extension); + } + $success = false; + $full_filename = $backup_dir . '/' . $filename; - $app->log('Restoring MySQL backup ' . $full_filename . ', backup format "' . $backup_format . '", backup mode "' . $backup_mode . '"', LOGLEVEL_DEBUG); + $app->log('Restoring MySQL backup ' . $full_filename . ', backup format "' . $backup_format . '", backup mode "' . $backup_mode . '"', LOGLEVEL_DEBUG); - if (file_exists($full_filename) && !empty($extension)) { preg_match('@^(manual-)?db_(?P<db>.+)_\d{4}-\d{2}-\d{2}_\d{2}-\d{2}' . $extension . '$@', $filename, $matches); if (!isset($matches['db']) || empty($matches['db'])) { $app->log('Failed to detect database name during restore of ' . $full_filename, LOGLEVEL_ERROR); - return false; + $db_name = null; + } else { + $db_name = $matches['db']; } - $db_name = $matches['db']; - switch ($backup_format) { - case "gzip": - $command = "gunzip --stdout ? | mysql -h ? -u ? -p? ?"; - break; - case "zip": - case "zip_bzip2": - $command = "unzip -qq -p -P " . escapeshellarg($password) . " ? | mysql -h ? -u ? -p? ?"; - break; - case "bzip2": - $command = "bunzip2 -q -c ? | mysql -h ? -u ? -p? ?"; - break; - case "xz": - $command = "unxz -q -q -c ? | mysql -h ? -u ? -p? ?"; - break; - case "rar": + + if ( ! empty($db_name)) { + $file_check = file_exists($full_filename) && !empty($extension); + if ( ! $file_check) { + $app->log('Archive test failed for ' . $full_filename, LOGLEVEL_WARN); + } + } else { + $file_check = false; + } + if ($file_check) { + switch ($backup_format) { + case "gzip": + $command = "gunzip --stdout ? | mysql -h ? -u ? -p? ?"; + break; + case "zip": + case "zip_bzip2": + $command = "unzip -qq -p -P " . escapeshellarg($password) . " ? | mysql -h ? -u ? -p? ?"; + break; + case "bzip2": + $command = "bunzip2 -q -c ? | mysql -h ? -u ? -p? ?"; + break; + case "xz": + $command = "unxz -q -q -c ? | mysql -h ? -u ? -p? ?"; + break; + case "rar": + //First, test that the archive is correct and we have a correct password + $options = self::getUnrarOptions($password); + $app->system->exec_safe("rar t " . $options . " ?", $full_filename); + if ($app->system->last_exec_retcode() == 0) { + $app->log('Archive test passed for ' . $full_filename, LOGLEVEL_DEBUG); + $command = "rar x " . $options. " ? | mysql -h ? -u ? -p? ?"; + } + break; + } + if (strpos($backup_format, "7z_") === 0) { + $options = self::get7zDecompressOptions($password); //First, test that the archive is correct and we have a correct password - $options = self::getUnrarOptions($password); - $app->system->exec_safe("rar t " . $options . " ?", $full_filename); + $app->system->exec_safe("7z t " . $options . " ?", $full_filename); if ($app->system->last_exec_retcode() == 0) { $app->log('Archive test passed for ' . $full_filename, LOGLEVEL_DEBUG); - $command = "rar x " . $options. " ? | mysql -h ? -u ? -p? ?"; - } - break; - } - if (strpos($backup_format, "7z_") === 0) { - $options = self::get7zDecompressOptions($password); - //First, test that the archive is correct and we have a correct password - $app->system->exec_safe("7z t " . $options . " ?", $full_filename); - if ($app->system->last_exec_retcode() == 0) { - $app->log('Archive test passed for ' . $full_filename, LOGLEVEL_DEBUG); - $command = "7z x " . $options . " -so ? | mysql -h ? -u ? -p? ?"; - } else - $command = null; + $command = "7z x " . $options . " -so ? | mysql -h ? -u ? -p? ?"; + } else + $command = null; + } } if (!empty($command)) { /** @var string $clientdb_host */ @@ -220,13 +288,9 @@ class backup $app->log('Restored MySQL backup ' . $full_filename, LOGLEVEL_DEBUG); $success = true; } else { - $app->log('Failed to restore web backup ' . $full_filename . ', exit code ' . $retval, LOGLEVEL_ERROR); + $app->log('Failed to restore MySQL backup ' . $full_filename . ', exit code ' . $retval, LOGLEVEL_ERROR); } - } else { - $app->log('Archive test failed for ' . $full_filename, LOGLEVEL_DEBUG); } - } else { - $app->log('Failed to process MySQL backup ' . $full_filename, LOGLEVEL_ERROR); } unset($clientdb_host); unset($clientdb_user); @@ -250,118 +314,337 @@ class backup * @return bool true if succeed * @see backup_plugin::mount_backup_dir() * @author Ramil Valitov <ramilvalitov@gmail.com> + * @author Jorge Muñoz <elgeorge2k@gmail.com> */ public static function restoreBackupWebFiles($backup_format, $password, $backup_dir, $filename, $backup_mode, $backup_type, $web_root, $web_user, $web_group) { global $app; - if (empty($backup_format)) { - $backup_format = self::getDefaultBackupFormat($backup_mode, $backup_type); - } - $full_filename = $backup_dir . '/' . $filename; $result = false; - $app->log('Restoring web backup ' . $full_filename . ', backup format "' . $backup_format . '", backup mode "' . $backup_mode . '"', LOGLEVEL_DEBUG); + $app->system->web_folder_protection($web_root, false); + if (self::backupModeIsRepos($backup_mode)) { + $backup_archive = $filename; + $backup_repos_folder = self::getReposFolder($backup_mode, 'web'); + $backup_repos_path = $backup_dir . '/' . $backup_repos_folder; + $full_archive_path = $backup_repos_path . '::' . $backup_archive; + + $app->log('Restoring web backup archive ' . $full_archive_path . ', backup mode "' . $backup_mode . '"', LOGLEVEL_DEBUG); + + $archives = self::getReposArchives($backup_mode, $backup_repos_path, $password); + if (is_array($archives) && in_array($backup_archive, $archives)) { + $retval = 0; + switch ($backup_mode) { + case "borg": + $command = 'cd ? && borg extract --nobsdflags ?'; + $app->system->exec_safe($command, $web_root, $full_archive_path); + $retval = $app->system->last_exec_retcode(); + $success = ($retval == 0 || $retval == 1); + break; + } + if ($success) { + $app->log('Restored web backup ' . $full_archive_path, LOGLEVEL_DEBUG); + $result = true; + } else { + $app->log('Failed to restore web backup ' . $full_archive_path . ', exit code ' . $retval, LOGLEVEL_ERROR); + } + } else { + $app->log('Web backup archive does not exist ' . $full_archive_path, LOGLEVEL_ERROR); + } - if (!empty($backup_format)) { - $app->system->web_folder_protection($web_root, false); - if ($backup_mode == 'userzip' || $backup_mode == 'rootgz') { - $user_mode = $backup_mode == 'userzip'; - $filename = $user_mode ? ($web_root . '/backup/' . $filename) : $full_filename; + } elseif ($backup_mode == 'userzip' || $backup_mode == 'rootgz') { - if (file_exists($full_filename) && $web_root != '' && $web_root != '/' && !stristr($full_filename, '..') && !stristr($full_filename, 'etc')) { - if ($user_mode) { - if (file_exists($filename)) rename($filename, $filename . '.bak'); - copy($full_filename, $filename); - chgrp($filename, $web_group); - } - $user_prefix_cmd = $user_mode ? 'sudo -u ' . escapeshellarg($web_user) : ''; - $success = false; - $retval = 0; - switch ($backup_format) { - case "tar_gzip": - case "tar_bzip2": - case "tar_xz": - $command = $user_prefix_cmd . ' tar xf ? --directory ?'; - $app->system->exec_safe($command, $filename, $web_root); - $retval = $app->system->last_exec_retcode(); - $success = ($retval == 0 || $retval == 2); - break; - case "zip": - case "zip_bzip2": - $command = $user_prefix_cmd . ' unzip -qq -P ' . escapeshellarg($password) . ' -o ? -d ? 2> /dev/null'; - $app->system->exec_safe($command, $filename, $web_root); - $retval = $app->system->last_exec_retcode(); - /* - * Exit code 50 can happen when zip fails to overwrite files that do not - * belong to selected user, so we can consider this situation as success - * with warnings. - */ - $success = ($retval == 0 || $retval == 50); - if ($success) { - self::restoreFileOwnership($web_root, $web_user, $web_group); - } - break; - case 'rar': - $options = self::getUnRarOptions($password); - //First, test that the archive is correct and we have a correct password - $command = $user_prefix_cmd . " rar t " . $options . " ? ?"; - //Rar requires trailing slash - $app->system->exec_safe($command, $filename, $web_root . '/'); - $success = ($app->system->last_exec_retcode() == 0); - if ($success) { - //All good, now we can extract - $app->log('Archive test passed for ' . $full_filename, LOGLEVEL_DEBUG); - $command = $user_prefix_cmd . " rar x " . $options . " ? ?"; - //Rar requires trailing slash - $app->system->exec_safe($command, $filename, $web_root . '/'); - $retval = $app->system->last_exec_retcode(); - //Exit code 9 can happen when we have file permission errors, in this case some - //files will be skipped during extraction. - $success = ($retval == 0 || $retval == 1 || $retval == 9); - } else { - $app->log('Archive test failed for ' . $full_filename, LOGLEVEL_DEBUG); - } - break; - } - if (strpos($backup_format, "tar_7z_") === 0) { - $options = self::get7zDecompressOptions($password); + if (empty($backup_format) || $backup_format == 'default') { + $backup_format = self::getDefaultBackupFormat($backup_mode, $backup_type); + } + $full_filename = $backup_dir . '/' . $filename; + + $app->log('Restoring web backup ' . $full_filename . ', backup format "' . $backup_format . '", backup mode "' . $backup_mode . '"', LOGLEVEL_DEBUG); + + $user_mode = $backup_mode == 'userzip'; + $filename = $user_mode ? ($web_root . '/backup/' . $filename) : $full_filename; + + if (file_exists($full_filename) && $web_root != '' && $web_root != '/' && !stristr($full_filename, '..') && !stristr($full_filename, 'etc')) { + if ($user_mode) { + if (file_exists($filename)) rename($filename, $filename . '.bak'); + copy($full_filename, $filename); + chgrp($filename, $web_group); + } + $user_prefix_cmd = $user_mode ? 'sudo -u ' . escapeshellarg($web_user) : ''; + $success = false; + $retval = 0; + switch ($backup_format) { + case "tar_gzip": + case "tar_bzip2": + case "tar_xz": + $command = $user_prefix_cmd . ' tar xf ? --directory ?'; + $app->system->exec_safe($command, $filename, $web_root); + $retval = $app->system->last_exec_retcode(); + $success = ($retval == 0 || $retval == 2); + break; + case "zip": + case "zip_bzip2": + $command = $user_prefix_cmd . ' unzip -qq -P ' . escapeshellarg($password) . ' -o ? -d ? 2> /dev/null'; + $app->system->exec_safe($command, $filename, $web_root); + $retval = $app->system->last_exec_retcode(); + /* + * Exit code 50 can happen when zip fails to overwrite files that do not + * belong to selected user, so we can consider this situation as success + * with warnings. + */ + $success = ($retval == 0 || $retval == 50); + if ($success) { + self::restoreFileOwnership($web_root, $web_user, $web_group); + } + break; + case 'rar': + $options = self::getUnRarOptions($password); //First, test that the archive is correct and we have a correct password - $command = $user_prefix_cmd . " 7z t " . $options . " ?"; - $app->system->exec_safe($command, $filename); + $command = $user_prefix_cmd . " rar t " . $options . " ? ?"; + //Rar requires trailing slash + $app->system->exec_safe($command, $filename, $web_root . '/'); $success = ($app->system->last_exec_retcode() == 0); if ($success) { //All good, now we can extract $app->log('Archive test passed for ' . $full_filename, LOGLEVEL_DEBUG); - $command = $user_prefix_cmd . " 7z x " . $options . " -so ? | tar xf - --directory ?"; - $app->system->exec_safe($command, $filename, $web_root); + $command = $user_prefix_cmd . " rar x " . $options . " ? ?"; + //Rar requires trailing slash + $app->system->exec_safe($command, $filename, $web_root . '/'); $retval = $app->system->last_exec_retcode(); - $success = ($retval == 0 || $retval == 2); + //Exit code 9 can happen when we have file permission errors, in this case some + //files will be skipped during extraction. + $success = ($retval == 0 || $retval == 1 || $retval == 9); } else { $app->log('Archive test failed for ' . $full_filename, LOGLEVEL_DEBUG); } - } - if ($user_mode) { - unlink($filename); - if (file_exists($filename . '.bak')) rename($filename . '.bak', $filename); - } + break; + } + if (strpos($backup_format, "tar_7z_") === 0) { + $options = self::get7zDecompressOptions($password); + //First, test that the archive is correct and we have a correct password + $command = $user_prefix_cmd . " 7z t " . $options . " ?"; + $app->system->exec_safe($command, $filename); + $success = ($app->system->last_exec_retcode() == 0); if ($success) { - $app->log('Restored web backup ' . $full_filename, LOGLEVEL_DEBUG); - $result = true; + //All good, now we can extract + $app->log('Archive test passed for ' . $full_filename, LOGLEVEL_DEBUG); + $command = $user_prefix_cmd . " 7z x " . $options . " -so ? | tar xf - --directory ?"; + $app->system->exec_safe($command, $filename, $web_root); + $retval = $app->system->last_exec_retcode(); + $success = ($retval == 0 || $retval == 2); } else { - $app->log('Failed to restore web backup ' . $full_filename . ', exit code ' . $retval, LOGLEVEL_ERROR); + $app->log('Archive test failed for ' . $full_filename, LOGLEVEL_DEBUG); } } - } else { - $app->log('Failed to restore web backup ' . $full_filename . ', backup mode "' . $backup_mode . '" not recognized.', LOGLEVEL_DEBUG); + if ($user_mode) { + unlink($filename); + if (file_exists($filename . '.bak')) rename($filename . '.bak', $filename); + } + if ($success) { + $app->log('Restored web backup ' . $full_filename, LOGLEVEL_DEBUG); + $result = true; + } else { + $app->log('Failed to restore web backup ' . $full_filename . ', exit code ' . $retval, LOGLEVEL_ERROR); + } } - $app->system->web_folder_protection($web_root, true); } else { - $app->log('Failed to restore web backup ' . $full_filename . ', backup format not recognized.', LOGLEVEL_DEBUG); + $app->log('Failed to restore web backup ' . $full_filename . ', backup mode "' . $backup_mode . '" not recognized.', LOGLEVEL_DEBUG); } + $app->system->web_folder_protection($web_root, true); return $result; } + /** + * Deletes backup copy + * @param string $backup_format + * @param string $backup_password + * @param string $backup_dir + * @param string $filename + * @param string $backup_mode + * @param string $backup_type + * @param int $domain_id + * @param bool true on success + * @author Jorge Muñoz <elgeorge2k@gmail.com> + */ + public static function deleteBackup($backup_format, $backup_password, $backup_dir, $filename, $backup_mode, $backup_type, $domain_id) { + global $app, $conf; + $server_id = $conf['server_id']; + $success = false; + + if (empty($backup_format) || $backup_format == 'default') { + $backup_format = self::getDefaultBackupFormat($backup_mode, $backup_type); + } + if(self::backupModeIsRepos($backup_mode)) { + $repos_password = ''; + $backup_archive = $filename; + $backup_repos_folder = self::getBackupReposFolder($backup_mode, $backup_type); + if ($backup_type != 'web') { + preg_match('@^(manual-)?db_(?P<db>.+)_\d{4}-\d{2}-\d{2}_\d{2}-\d{2}$@', $backup_archive, $matches); + if (!isset($matches['db']) || empty($matches['db'])) { + $app->log('Failed to detect database name during delete of ' . $backup_archive, LOGLEVEL_ERROR); + return false; + } + $db_name = $matches['db']; + $backup_repos_folder .= '_' . $db_name; + } + $backup_repos_path = $backup_dir . '/' . $backup_repos_folder; + $archives = self::getReposArchives($backup_mode, $backup_repos_path, $repos_password); + if (is_array($archives) && in_array($backup_archive, $archives)) { + $success = self::deleteArchive($backup_mode, $backup_repos_path, $backup_archive, $repos_password); + } else { + $success = true; + } + } else { + if(file_exists($backup_dir.'/'.$filename) && !stristr($backup_dir.'/'.$filename, '..') && !stristr($backup_dir.'/'.$filename, 'etc')) { + $success = unlink($backup_dir.'/'.$filename); + } else { + $success = true; + } + } + if ($success) { + $sql = "DELETE FROM web_backup WHERE server_id = ? AND parent_domain_id = ? AND filename = ?"; + $app->db->query($sql, $server_id, $domain_id, $filename); + if($app->db->dbHost != $app->dbmaster->dbHost) + $app->dbmaster->query($sql, $server_id, $domain_id, $filename); + $app->log($sql . ' - ' . json_encode([$server_id, $domain_id, $filename]), LOGLEVEL_DEBUG); + } + return $success; + } + /** + * Downloads the backup copy + * @param string $backup_format + * @param string $password + * @param string $backup_dir + * @param string $filename + * @param string $backup_mode + * @param string $backup_type + * @param array $domain web_domain record + * @param bool true on success + * @author Jorge Muñoz <elgeorge2k@gmail.com> + */ + public static function downloadBackup($backup_format, $password, $backup_dir, $filename, $backup_mode, $backup_type, $domain) + { + global $app; + + $success = false; + + if (self::backupModeIsRepos($backup_mode)) { + $backup_archive = $filename; + //When stored in repos, we first get target backup format to generate final download file + $repos_password = ''; + $server_id = $domain['server_id']; + $password = $domain['backup_encrypt'] == 'y' ? trim($domain['backup_password']) : ''; + $server_config = $app->getconf->get_server_config($server_id, 'server'); + $backup_tmp = trim($server_config['backup_tmp']); + + if ($backup_type == 'web') { + $backup_format = $domain['backup_format_web']; + if (empty($backup_format) || $backup_format == 'default') { + $backup_format = self::getDefaultBackupFormat($server_backup_mode, 'web'); + } + $backup_repos_folder = self::getBackupReposFolder($backup_mode, 'web'); + $extension = self::getBackupWebExtension($backup_format); + } else { + if (preg_match('@^(manual-)?db_(?P<db>.+)_\d{4}-\d{2}-\d{2}_\d{2}-\d{2}$@', $backup_archive, $matches)) { + $db_name = $matches['db']; + $backup_format = $domain['backup_format_db']; + if (empty($backup_format)) { + $backup_format = self::getDefaultBackupFormat($server_backup_mode, $backup_type); + } + $backup_repos_folder = self::getBackupReposFolder($backup_mode, $backup_type) . '_' . $db_name; + $extension = self::getBackupDbExtension($backup_format); + } else { + $app->log('Failed to detect database name during download of ' . $backup_archive, LOGLEVEL_ERROR); + $db_name = null; + } + } + if ( ! empty($extension)) { + $filename .= $extension; + $backup_repos_path = $backup_dir . '/' . $backup_repos_folder; + $full_archive_path = $backup_repos_path . '::' . $backup_archive; + $archives = self::getReposArchives($backup_mode, $backup_repos_path, $repos_password); + } else { + $archives = null; + } + if (is_array($archives)) { + if (in_array($backup_archive, $archives)) { + $app->log('Extracting ' . $backup_type . ' backup from repository archive '.$full_archive_path. ' to ' . $domain['document_root'].'/backup/' . $filename, LOGLEVEL_DEBUG); + switch ($backup_mode) { + case 'borg': + if ($backup_type == 'mysql') { + if (strpos($extension, '.sql.gz') === 0 || strpos($extension, '.sql.bz2') === 0) { + //* .sql.gz and .sql.bz2 don't need a source file, so we can just pipe through the compression command + $ccmd = strpos($extension, '.sql.gz') === 0 ? 'gzip' : 'bzip2'; + $command = self::getBorgCommand('borg extract', $repos_password) . ' --stdout ? stdin | ' . $ccmd . ' -c > ?'; + $success = $app->system->exec_safe($command, $full_archive_path, $domain['document_root'].'/backup/'.$filename) == 0; + } else { + $tmp_extract = $backup_tmp . '/' . $backup_archive . '.sql'; + if (file_exists($tmp_extract)) { + unlink($tmp_extract); + } + $command = self::getBorgCommand('borg extract', $repos_password) . ' --stdout ? stdin > ?'; + $app->system->exec_safe($command, $full_archive_path, $tmp_extract); + } + } else { + if (strpos($extension, '.tar') === 0 && ($password == '' || strpos($extension, '.tar.7z') !== 0)) { + //* .tar.gz, .tar.bz2, etc are supported via borg export-tar, if they don't need encryption + $command = self::getBorgCommand('borg export-tar', $repos_password) . ' ? ?'; + $app->system->exec_safe($command, $full_archive_path, $domain['document_root'].'/backup/'.$filename); + $success = $app->system->last_exec_retcode() == 0; + } else { + $tmp_extract = tempnam($backup_tmp, $backup_archive); + unlink($tmp_extract); + mkdir($tmp_extract); + $command = 'cd ' . $tmp_extract . ' && ' . self::getBorgCommand('borg extract --nobsdflags', $repos_password) . ' ?'; + $app->system->exec_safe($command, $full_archive_path); + if ($app->system->last_exec_retcode() != 0) { + $app->log('Extraction of ' . $full_archive_path . ' into ' . $tmp_extract . ' failed.', LOGLEVEL_ERROR); + $tmp_extract = null; + } + } + } + break; + } + if ( ! empty($tmp_extract)) { + if (is_dir($tmp_extract)) { + $web_config = $app->getconf->get_server_config($server_id, 'web'); + $http_server_user = $web_config['user']; + $success = self::runWebCompression($backup_format, [], 'rootgz', $tmp_extract, $domain['document_root'].'/backup/', $filename, $domain['system_user'], $domain['system_group'], $http_server_user, $backup_tmp, $password); + } else { + self::runDatabaseCompression($backup_format, dirname($tmp_extract), basename($tmp_extract), $filename, $backup_tmp, $password) + AND $success = rename(dirname($tmp_extract) . '/' . $filename, $domain['document_root'].'/backup/'. $filename); + } + if ($success) { + $app->system->exec_safe('rm -Rf ?', $tmp_extract); + } else { + $app->log('Failed to run compression of ' . $tmp_extract . ' into ' . $domain['document_root'].'/backup/' . $filename . ' failed.', LOGLEVEL_ERROR); + } + } + } else { + $app->log('Failed to find archive ' . $full_archive_path . ' for download', LOGLEVEL_ERROR); + } + } + if ($success) { + $app->log('Download of archive ' . $full_archive_path . ' into ' . $domain['document_root'].'/backup/'.$filename . ' succeeded.', LOGLEVEL_DEBUG); + } + } + //* Copy the backup file to the backup folder of the website + elseif(file_exists($backup_dir.'/'.$filename) && file_exists($domain['document_root'].'/backup/') && !stristr($backup_dir.'/'.$filename, '..') && !stristr($backup_dir.'/'.$filename, 'etc')) { + $success = copy($backup_dir.'/'.$filename, $domain['document_root'].'/backup/'.$filename); + } + if (file_exists($domain['document_root'].'/backup/'.$filename)) { + chgrp($domain['document_root'].'/backup/'.$filename, $domain['system_group']); + chown($domain['document_root'].'/backup/'.$filename, $domain['system_user']); + chmod($domain['document_root'].'/backup/'.$filename,0600); + $app->log('Ready '.$domain['document_root'].'/backup/'.$filename, LOGLEVEL_DEBUG); + return true; + } else { + $app->log('Failed download of '.$domain['document_root'].'/backup/'.$filename , LOGLEVEL_ERROR); + return false; + } + } + + /** * Returns a compression method, for example returns bzip2 for tar_7z_bzip2 * @param string $format @@ -688,6 +971,139 @@ class backup return $options; } + /** + * Get borg command with password appended to the base command + * @param $command Base command to add password to + * @param $password Password to add + * @param $is_new Specify if command is for a new borg repository initialization + */ + protected static function getBorgCommand($command, $password, $is_new = false) + { + if ($password) { + if ($is_new) { + return "BORG_NEW_PASSPHRASE='" . escapeshellarg($password) . "' " . $command; + } + return "BORG_PASSPHRASE='" . escapeshellarg($password) . "' " . $command; + } + return $command; + } + /** + * Obtains command line options for "borg create" command. + * @param string $compression Compression options are validated and fixed if necessary. + * See: https://borgbackup.readthedocs.io/en/stable/internals/data-structures.html#compression + * @return string + * @author Jorge Muñoz <elgeorge2k@gmail.com> + */ + protected static function getBorgCreateOptions($compression) + { + global $app; + + //* Validate compression + + $C = explode(',', $compression); + if (count($C) > 2) { + $app->log("Invalid compression option " . $C[2] . " from compression " . $compression . ".", LOGLEVEL_WARN); + $compression = $C[0] . ',' . $C[1]; + $C = [$C[0], $C[1]]; + } + if (count($C) > 1 && ! ctype_digit($C[1])) { + $app->log("Invalid compression option " . $C[1] . " from compression " . $compression . ".", LOGLEVEL_WARN); + $compression = $C[0]; + $C = [$C[0]]; + } + + switch ($C[0]) { + case 'none': + case 'lz4': + if (count($C) > 1) { + $app->log("Invalid compression format " . $compression . '. Defaulting to ' . $C[0] . '.', LOGLEVEL_WARN); + $compression = $C[0]; + } + break; + case 'zstd': + //* Check borg version + list(,$ver) = explode(' ', exec('borg --version')); + if (version_compare($ver, '1.1.4') < 0) { + $app->log("Current borg version " . $ver . " does not support compression format " . $compression . '. Defaulting to zlib.', LOGLEVEL_WARN); + $compression = 'zlib'; + } elseif (count($C) > 1 && ($C[1] < 1 || $C[1] > 22)) { + $app->log("Invalid compression format " . $compression . '. Defaulting to zstd.', LOGLEVEL_WARN); + $compression = 'zstd'; + } + break; + case 'zlib': + case 'lzma': + if (count($C) > 1 && ($C[1] < 0 || $C[1] > 9)) { + $app->log("Invalid compression format " . $compression . '. Defaulting to ' . $C[0] . '.', LOGLEVEL_WARN); + $compression = $C[0]; + } + break; + default: + $app->log("Unsupported borg compression format " . $compression . '. Defaulting to zlib.', LOGLEVEL_WARN); + $compression = 'zlib'; + } + + $options = array( + /** + * -C --compression + */ + '-C ' . $compression, + /** + * Excludes directories that contain CACHEDIR.TAG + */ + '--exclude-caches', + /** + * specify the chunker parameters (CHUNK_MIN_EXP, CHUNK_MAX_EXP, HASH_MASK_BITS, HASH_WINDOW_SIZE). + * @see https://borgbackup.readthedocs.io/en/stable/internals/data-structures.html#chunker-details + * Default: 19,23,21,4095 + */ + //'--chunker-params 19,23,21,4095', + ); + $options = implode(" ", $options); + return $options; + } + + /** + * Gets a list of repository archives + * @param string $backup_mode + * @param string $repos_path absolute path to repository + * @param string $password repository password or empty string if none + * @param string $list_format Supports either 'short' or 'json' + * @return array + * @author Jorge Muñoz <elgeorge2k@gmail.com> + */ + protected static function getReposArchives($backup_mode, $repos_path, $password, $list_format = 'short') + { + global $app; + if ( ! is_dir($repos_path)) { + $app->log("Unknown path " . var_export($repos_path, TRUE) + . ' called from ' . (function() { + $dbt = debug_backtrace(); + return $dbt[1]['file'] . ':' . $dbt[1]['line']; + })(), LOGLEVEL_ERROR); + return FALSE; + } + switch ($backup_mode) { + case 'borg': + + $command = self::getBorgCommand('borg list', $password); + + if ($list_format == 'json') { + $command_opts = '--json'; + } else { + $command_opts = '--short'; + } + + $app->system->exec_safe($command . ' ' . $command_opts . ' ?', $repos_path); + + if ($app->system->last_exec_retcode() == 0) { + return array_map('trim', $app->system->last_exec_out()); + } + break; + } + return FALSE; + } + /** * Clears expired backups. * The backup directory must be mounted before calling this method. @@ -699,36 +1115,108 @@ class backup * @see backup_plugin::backups_garbage_collection() call this method first * @see backup_plugin::mount_backup_dir() * @author Ramil Valitov <ramilvalitov@gmail.com> + * @author Jorge Muñoz <elgeorge2k@gmail.com> */ protected static function clearBackups($server_id, $web_id, $max_backup_copies, $backup_dir, $prefix_list=null) { global $app; - $files = self::get_files($backup_dir, $prefix_list); - usort($files, function ($a, $b) use ($backup_dir) { - $time_a = filemtime($backup_dir . '/' . $a); - $time_b = filemtime($backup_dir . '/' . $b); - return ($time_a > $time_b) ? -1 : 1; - }); + $server_config = $app->getconf->get_server_config($server_id, 'server'); + $backup_mode = $server_config['backup_mode']; + //@todo obtain password from server config + $password = NULL; $db_list = array($app->db); if ($app->db->dbHost != $app->dbmaster->dbHost) array_push($db_list, $app->dbmaster); - //Delete old files that are beyond the limit - for ($n = $max_backup_copies; $n < sizeof($files); $n++) { - $filename = $files[$n]; - $full_filename = $backup_dir . '/' . $filename; - $app->log('Backup file ' . $full_filename . ' is beyond the limit of ' . $max_backup_copies . " copies and will be deleted from disk and database", LOGLEVEL_DEBUG); - $sql = "DELETE FROM web_backup WHERE server_id = ? AND parent_domain_id = ? AND filename = ?"; - foreach ($db_list as $db) { - $db->query($sql, $server_id, $web_id, $filename); + if ($backup_mode == "userzip" || $backup_mode == "rootgz") { + $files = self::get_files($backup_dir, $prefix_list); + usort($files, function ($a, $b) use ($backup_dir) { + $time_a = filemtime($backup_dir . '/' . $a); + $time_b = filemtime($backup_dir . '/' . $b); + return ($time_a > $time_b) ? -1 : 1; + }); + + //Delete old files that are beyond the limit + for ($n = $max_backup_copies; $n < sizeof($files); $n++) { + $filename = $files[$n]; + $full_filename = $backup_dir . '/' . $filename; + $app->log('Backup file ' . $full_filename . ' is beyond the limit of ' . $max_backup_copies . " copies and will be deleted from disk and database", LOGLEVEL_DEBUG); + $sql = "DELETE FROM web_backup WHERE server_id = ? AND parent_domain_id = ? AND filename = ?"; + foreach ($db_list as $db) { + $db->query($sql, $server_id, $web_id, $filename); + } + @unlink($full_filename); + } + } elseif (self::backupModeIsRepos($backup_mode)) { + $repos_archives = self::getAllArchives($backup_dir, $backup_mode, $password); + usort($repos_archives, function ($a, $b) { + return ($a['created_at'] > $b['created_at']) ? -1 : 1; + }); + //Delete old files that are beyond the limit + for ($n = $max_backup_copies; $n < sizeof($repos_archives); $n++) { + $archive = $repos_archives[$n]; + $app->log('Backup archive ' . $archive['archive'] . ' is beyond the limit of ' . $max_backup_copies . " copies and will be deleted from disk and database", LOGLEVEL_DEBUG); + $sql = "DELETE FROM web_backup WHERE server_id = ? AND parent_domain_id = ? AND filename = ?"; + foreach ($db_list as $db) { + $db->query($sql, $server_id, $web_id, $archive['archive']); + } + $backup_repos_path = $backup_dir . '/' . $archive['repos']; + self::deleteArchive($backup_mode, $backup_repos_path, $archive['archive'], $password); } - @unlink($full_filename); } return true; } + protected static function getAllArchives($backup_dir, $backup_mode, $password) + { + $d = dir($backup_dir); + $archives = []; + /** + * $archives[] = [ + * 'repos' => string, + * 'archive' => string, + * 'created_at' => int, + * ]; + */ + while (false !== ($entry = $d->read())) { + if ('.' === $entry || '..' === $entry) { + continue; + } + switch ($backup_mode) { + case 'borg': + $repos_path = $backup_dir . '/' . $entry; + if (is_dir($repos_path) && strncmp('borg_', $entry, 5) === 0) { + $archivesJson = json_decode(implode("", self::getReposArchives($backup_mode, $repos_path, $password, 'json')), TRUE); + foreach ($archivesJson['archives'] as $archive) { + $archives[] = [ + 'repos' => $entry, + 'archive' => $archive['name'], + 'created_at' => strtotime($archive['time']), + ]; + } + } + break; + } + } + return $archives; + } + + protected static function deleteArchive($backup_mode, $backup_repos_path, $backup_archive, $password) + { + global $app; + $app->log("Delete Archive - repos = " . $backup_repos_path . ", archive = " . $backup_archive, LOGLEVEL_DEBUG); + switch ($backup_mode) { + case 'borg': + $app->system->exec_safe('borg delete ?', $backup_repos_path . '::' . $backup_archive); + return $app->system->last_exec_retcode() == 0; + default: + $app->log("Unknown repos type " . $backup_mode, LOGLEVEL_ERROR); + } + return FALSE; + } + /** * Garbage collection: deletes records from database about files that do not exist and deletes untracked files and cleans up backup download directories. * The backup directory must be mounted before calling this method. @@ -748,7 +1236,7 @@ class backup $args_sql_domains_with_backups = array(); $server_config = $app->getconf->get_server_config($server_id, 'server'); $backup_dir = trim($server_config['backup_dir']); - $sql = "SELECT * FROM web_backup WHERE server_id = ?"; + $sql = "SELECT * FROM web_backup WHERE server_id = ? AND backup_mode != 'borg'"; $sql_domains = "SELECT domain_id,document_root,system_user,system_group,backup_interval FROM web_domain WHERE server_id = ? AND (type = 'vhost' OR type = 'vhostsubdomain' OR type = 'vhostalias')"; $sql_domains_with_backups = "SELECT domain_id,document_root,system_user,system_group,backup_interval FROM web_domain WHERE domain_id in (SELECT parent_domain_id FROM web_backup WHERE server_id = ?" . ((!empty($backup_type)) ? " AND backup_type = ?" : "") . ") AND (type = 'vhost' OR type = 'vhostsubdomain' OR type = 'vhostalias')"; array_push($args_sql, $server_id); @@ -772,7 +1260,7 @@ class backup if ($app->db->dbHost != $app->dbmaster->dbHost) array_push($db_list, $app->dbmaster); - // Cleanup web_backup entries for non-existent backup files + // Cleanup web_backup entries for non-existent backup files foreach ($db_list as $db) { $backups = $app->db->queryAllRecords($sql, true, $args_sql); foreach ($backups as $backup) { @@ -785,7 +1273,7 @@ class backup } } - // Cleanup backup files with missing web_backup entries (runs on all servers) + // Cleanup backup files with missing web_backup entries (runs on all servers) $domains = $app->dbmaster->queryAllRecords($sql_domains_with_backups, true, $args_sql_domains_with_backups); foreach ($domains as $rec) { $domain_id = $rec['domain_id']; @@ -795,7 +1283,7 @@ class backup if (!empty($files)) { // leave out server_id here, in case backup storage is shared between servers $sql = "SELECT backup_id, filename FROM web_backup WHERE parent_domain_id = ?"; - $untracked_backup_files = array(); + $untracked_backup_files = array(); foreach ($db_list as $db) { $backups = $db->queryAllRecords($sql, $domain_id); foreach ($backups as $backup) { @@ -804,8 +1292,8 @@ class backup } } } - array_unique( $untracked_backup_files ); - foreach ($untracked_backup_files as $f) { + array_unique( $untracked_backup_files ); + foreach ($untracked_backup_files as $f) { $backup_file = $backup_dir . '/web' . $domain_id . '/' . $f; $app->log('Backup file ' . $backup_file . ' is not contained in database, deleting this file from disk', LOGLEVEL_DEBUG); @unlink($backup_file); @@ -813,7 +1301,7 @@ class backup } } - // This cleanup only runs on web servers + // This cleanup only runs on web servers $domains = $app->db->queryAllRecords($sql_domains, true, $args_sql_domains); foreach ($domains as $rec) { $domain_id = $rec['domain_id']; @@ -856,6 +1344,15 @@ class backup } } + protected static function getReposFolder($backup_mode, $backup_type, $postfix = '') + { + switch ($backup_mode) { + case 'borg': + return 'borg_' . $backup_type . $postfix; + } + return null; + } + /** * Gets list of files in directory * @param string $directory @@ -922,6 +1419,48 @@ class backup return $files; } + /** + * Gets list of directories in directory + * @param string $directory + * @param string[]|null $prefix_list filter files that have one of the prefixes. Use null for default filtering. + * @return string[] + * @author Ramil Valitov <ramilvalitov@gmail.com> + */ + protected static function get_dirs($directory, $prefix_list = null, $endings_list = null) + { + $default_prefix_list = array( + 'borg', + ); + if (is_null($prefix_list)) + $prefix_list = $default_prefix_list; + + if (!is_dir($directory)) { + return array(); + } + + $dir_handle = dir($directory); + $dirs = array(); + while (false !== ($entry = $dir_handle->read())) { + $full_dirname = $directory . '/' . $entry; + if ($entry != '.' && $entry != '..' && is_dir($full_dirname)) { + if (!empty($prefix_list)) { + $add = false; + foreach ($prefix_list as $prefix) { + if (substr($entry, 0, strlen($prefix)) == $prefix) { + $add = true; + break; + } + } + } else + $add = true; + if ($add) + array_push($dirs, $entry); + } + } + $dir_handle->close(); + + return $dirs; + } /** * Generates excludes list for compressors * @param string[] $backup_excludes @@ -935,7 +1474,7 @@ class backup { $excludes = ""; foreach ($backup_excludes as $ex) { - # pass through escapeshellarg if not already done + # pass through escapeshellarg if not already done if ( preg_match( "/^'.+'$/", $ex ) ) { $excludes .= "${arg}${pre}${ex}${post} "; } else { @@ -1167,6 +1706,7 @@ class backup * @param string $backup_job type of backup job: manual or auto * @return bool true if success * @author Ramil Valitov <ramilvalitov@gmail.com> + * @author Jorge Muñoz <elgeorge2k@gmail.com> * @see backup_plugin::run_backup() recommeneded to use if you need to make backups */ protected static function make_database_backup($web_domain, $backup_job) @@ -1176,6 +1716,7 @@ class backup $server_id = intval($web_domain['server_id']); $domain_id = intval($web_domain['domain_id']); $server_config = $app->getconf->get_server_config($server_id, 'server'); + $backup_mode = $server_config['backup_mode']; $backup_dir = trim($server_config['backup_dir']); $backup_tmp = trim($server_config['backup_tmp']); $db_backup_dir = $backup_dir . '/web' . $domain_id; @@ -1200,67 +1741,118 @@ class backup unset($tmp); foreach ($records as $rec) { - $password = ($web_domain['backup_encrypt'] == 'y') ? trim($web_domain['backup_password']) : ''; - $backup_format_db = $web_domain['backup_format_db']; - if (empty($backup_format_db)) { - $backup_format_db = 'gzip'; - } - $backup_extension_db = self::getBackupDbExtension($backup_format_db); - - if (!empty($backup_extension_db)) { - //* Do the mysql database backup with mysqldump + if (self::backupModeIsRepos($backup_mode)) { + //@todo get $password from server config + $repos_password = ''; + //@todo get compression from server config + $compression = 'zlib'; $db_name = $rec['database_name']; - $db_file_prefix = 'db_' . $db_name . '_' . date('Y-m-d_H-i'); - $db_backup_file = $db_file_prefix . '.sql'; - $db_compressed_file = ($backup_job == 'manual' ? 'manual-' : '') . $db_file_prefix . $backup_extension_db; - $command = "mysqldump -h ? -u ? -p? -c --add-drop-table --create-options --quick --max_allowed_packet=512M " . $mysqldump_routines . " --result-file=? ?"; - /** @var string $clientdb_host */ - /** @var string $clientdb_user */ - /** @var string $clientdb_password */ - $app->system->exec_safe($command, $clientdb_host, $clientdb_user, $clientdb_password, $db_backup_dir . '/' . $db_backup_file, $db_name); - $exit_code = $app->system->last_exec_retcode(); - - //* Compress the backup - if ($exit_code == 0) { - $exit_code = self::runDatabaseCompression($backup_format_db, $db_backup_dir, $db_backup_file, $db_compressed_file, $backup_tmp, $password) ? 0 : 1; - if ($exit_code !== 0) - $app->log('Failed to make backup of database ' . $rec['database_name'], LOGLEVEL_ERROR); + $db_repos_folder = self::getBackupReposFolder($backup_mode, 'mysql') . '_' . $db_name; + $backup_repos_path = $db_backup_dir . '/' . $db_repos_folder; + $backup_format_db = ''; + if (self::prepareRepos($backup_mode, $backup_repos_path, $repos_password)) { + $db_backup_archive = ($backup_job == 'manual' ? 'manual-' : '') . 'db_' . $db_name . '_' . date('Y-m-d_H-i'); + $full_archive_path = $backup_repos_path . '::' . $db_backup_archive; + $dump_command = "mysqldump -h ? -u ? -p? -c --add-drop-table --create-options --quick --max_allowed_packet=512M " . $mysqldump_routines . " ?"; + switch ($backup_mode) { + case 'borg': + $borg_cmd = self::getBorgCommand('borg create', $repos_password); + $borg_options = self::getBorgCreateOptions($compression); + $command = $dump_command . ' | ' . $borg_cmd . ' ' . $borg_options . ' ? -'; + /** @var string $clientdb_host */ + /** @var string $clientdb_user */ + /** @var string $clientdb_password */ + $app->system->exec_safe($command, + $clientdb_host, $clientdb_user, $clientdb_password, $db_name, #mysqldump command part + $full_archive_path #borg command part + ); + $exit_code = $app->system->last_exec_retcode(); + break; + } + if ($exit_code == 0) { + $archive_size = self::getReposArchiveSize($backup_mode, $backup_repos_path, $db_backup_archive, $repos_password); + if ($archive_size !== false) { + //* Insert web backup record in database + $sql = "INSERT INTO web_backup (server_id, parent_domain_id, backup_type, backup_mode, backup_format, tstamp, filename, filesize, backup_password) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)"; + //* password is for `Encrypted` column informative purposes, on download password is obtained from web_domain settings + $password = $repos_password ? '*secret*' : ''; + $app->db->query($sql, $server_id, $domain_id, 'mysql', $backup_mode, $backup_format_db, time(), $db_backup_archive, $archive_size, $password); + if ($app->db->dbHost != $app->dbmaster->dbHost) + $app->dbmaster->query($sql, $server_id, $domain_id, 'mysql', $backup_mode, $backup_format_db, time(), $db_backup_archive, $archive_size, $password); + $success = true; + } else { + $app->log('Failed to obtain backup size of ' . $full_archive_path . ' for database ' . $rec['database_name'], LOGLEVEL_ERROR); + return false; + } + } else { + rename($backup_repos_path, $new_path = $backup_repos_path . '_failed_' . uniqid()); + $app->log('Failed to process mysql backup format ' . $backup_format_db . ' for database ' . $rec['database_name'] . ' repos renamed to ' . $new_path, LOGLEVEL_ERROR); + } } else { - $app->log('Failed to make backup of database ' . $rec['database_name'] . ', because mysqldump failed', LOGLEVEL_ERROR); + $app->log('Failed to initialize repository for database ' . $rec['database_name'] . ', folder ' . $backup_repos_path . ', backup mode ' . $backup_mode . '.', LOGLEVEL_ERROR); + } + } else { + $password = ($web_domain['backup_encrypt'] == 'y') ? trim($web_domain['backup_password']) : ''; + $backup_format_db = $web_domain['backup_format_db']; + if (empty($backup_format_db)) { + $backup_format_db = 'gzip'; } + $backup_extension_db = self::getBackupDbExtension($backup_format_db); + + if (!empty($backup_extension_db)) { + //* Do the mysql database backup with mysqldump + $db_name = $rec['database_name']; + $db_file_prefix = 'db_' . $db_name . '_' . date('Y-m-d_H-i'); + $db_backup_file = $db_file_prefix . '.sql'; + $db_compressed_file = ($backup_job == 'manual' ? 'manual-' : '') . $db_file_prefix . $backup_extension_db; + $command = "mysqldump -h ? -u ? -p? -c --add-drop-table --create-options --quick --max_allowed_packet=512M " . $mysqldump_routines . " --result-file=? ?"; + /** @var string $clientdb_host */ + /** @var string $clientdb_user */ + /** @var string $clientdb_password */ + $app->system->exec_safe($command, $clientdb_host, $clientdb_user, $clientdb_password, $db_backup_dir . '/' . $db_backup_file, $db_name); + $exit_code = $app->system->last_exec_retcode(); - if ($exit_code == 0) { - if (is_file($db_backup_dir . '/' . $db_compressed_file)) { - chmod($db_backup_dir . '/' . $db_compressed_file, 0750); - chown($db_backup_dir . '/' . $db_compressed_file, fileowner($db_backup_dir)); - chgrp($db_backup_dir . '/' . $db_compressed_file, filegroup($db_backup_dir)); - - //* Insert web backup record in database - $file_size = filesize($db_backup_dir . '/' . $db_compressed_file); - $sql = "INSERT INTO web_backup (server_id, parent_domain_id, backup_type, backup_mode, backup_format, tstamp, filename, filesize, backup_password) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)"; - //Making compatible with previous versions of ISPConfig: - $sql_mode = ($backup_format_db == 'gzip') ? 'sqlgz' : ('sql' . $backup_format_db); - $app->db->query($sql, $server_id, $domain_id, 'mysql', $sql_mode, $backup_format_db, time(), $db_compressed_file, $file_size, $password); - if ($app->db->dbHost != $app->dbmaster->dbHost) - $app->dbmaster->query($sql, $server_id, $domain_id, 'mysql', $sql_mode, $backup_format_db, time(), $db_compressed_file, $file_size, $password); - $success = true; + //* Compress the backup + if ($exit_code == 0) { + $exit_code = self::runDatabaseCompression($backup_format_db, $db_backup_dir, $db_backup_file, $db_compressed_file, $backup_tmp, $password) ? 0 : 1; + if ($exit_code !== 0) + $app->log('Failed to make backup of database ' . $rec['database_name'], LOGLEVEL_ERROR); + } else { + $app->log('Failed to make backup of database ' . $rec['database_name'] . ', because mysqldump failed', LOGLEVEL_ERROR); } - } else { - if (is_file($db_backup_dir . '/' . $db_compressed_file)) unlink($db_backup_dir . '/' . $db_compressed_file); + + if ($exit_code == 0) { + if (is_file($db_backup_dir . '/' . $db_compressed_file)) { + chmod($db_backup_dir . '/' . $db_compressed_file, 0750); + chown($db_backup_dir . '/' . $db_compressed_file, fileowner($db_backup_dir)); + chgrp($db_backup_dir . '/' . $db_compressed_file, filegroup($db_backup_dir)); + + //* Insert web backup record in database + $file_size = filesize($db_backup_dir . '/' . $db_compressed_file); + $sql = "INSERT INTO web_backup (server_id, parent_domain_id, backup_type, backup_mode, backup_format, tstamp, filename, filesize, backup_password) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)"; + //Making compatible with previous versions of ISPConfig: + $sql_mode = ($backup_format_db == 'gzip') ? 'sqlgz' : ('sql' . $backup_format_db); + $app->db->query($sql, $server_id, $domain_id, 'mysql', $sql_mode, $backup_format_db, time(), $db_compressed_file, $file_size, $password); + if ($app->db->dbHost != $app->dbmaster->dbHost) + $app->dbmaster->query($sql, $server_id, $domain_id, 'mysql', $sql_mode, $backup_format_db, time(), $db_compressed_file, $file_size, $password); + $success = true; + } + } else { + if (is_file($db_backup_dir . '/' . $db_compressed_file)) unlink($db_backup_dir . '/' . $db_compressed_file); + } + //* Remove the uncompressed file + if (is_file($db_backup_dir . '/' . $db_backup_file)) unlink($db_backup_dir . '/' . $db_backup_file); + } else { + $app->log('Failed to process mysql backup format ' . $backup_format_db . ' for database ' . $rec['database_name'], LOGLEVEL_ERROR); } - //* Remove the uncompressed file - if (is_file($db_backup_dir . '/' . $db_backup_file)) unlink($db_backup_dir . '/' . $db_backup_file); - - //* Remove old backups - self::backups_garbage_collection($server_id, 'mysql', $domain_id); - $prefix_list = array( - "db_${db_name}_", - "manual-db_${db_name}_", - ); - self::clearBackups($server_id, $domain_id, intval($rec['backup_copies']), $db_backup_dir, $prefix_list); - } else { - $app->log('Failed to process mysql backup format ' . $backup_format_db . ' for database ' . $rec['database_name'], LOGLEVEL_ERROR); } + //* Remove old backups + self::backups_garbage_collection($server_id, 'mysql', $domain_id); + $prefix_list = array( + "db_${db_name}_", + "manual-db_${db_name}_", + ); + self::clearBackups($server_id, $domain_id, intval($rec['backup_copies']), $db_backup_dir, $prefix_list); } unset($clientdb_host); @@ -1278,6 +1870,7 @@ class backup * @param string $backup_job type of backup job: manual or auto * @return bool true if success * @author Ramil Valitov <ramilvalitov@gmail.com> + * @author Jorge Muñoz <elgeorge2k@gmail.com> * @see backup_plugin::mount_backup_dir() * @see backup_plugin::run_backup() recommeneded to use if you need to make backups */ @@ -1328,11 +1921,11 @@ class backup self::prepare_backup_dir($server_id, $web_domain); $web_backup_dir = $backup_dir . '/web' . $web_id; - # default exclusions - $backup_excludes = array( - './backup*', - './bin', './dev', './etc', './lib', './lib32', './lib64', './opt', './sys', './usr', './var', './proc', './run', './tmp', - ); + # default exclusions + $backup_excludes = array( + './backup*', + './bin', './dev', './etc', './lib', './lib32', './lib64', './opt', './sys', './usr', './var', './proc', './run', './tmp', + ); $b_excludes = explode(',', trim($web_domain['backup_excludes'])); if (is_array($b_excludes) && !empty($b_excludes)) { @@ -1343,43 +1936,217 @@ class backup } } } + if (self::backupModeIsRepos($backup_mode)) { + $backup_format_web = ''; + $web_backup_archive = ($backup_job == 'manual' ? 'manual-' : '') . 'web' . $web_id . '_' . date('Y-m-d_H-i'); + $backup_repos_folder = self::getBackupReposFolder($backup_mode, 'web'); + + $backup_repos_path = $web_backup_dir . '/' . $backup_repos_folder; + $full_archive_path = $backup_repos_path . '::' . $web_backup_archive; + /** + * @todo the internal borg password can't be the backup instance $password because the repos shares all backups + * in a period of time. Instead we'll set the backup password on backup file download. + */ + $repos_password = ''; + //@todo get this from the server config perhaps + $compression = 'zlib'; - $web_backup_file = ($backup_job == 'manual' ? 'manual-' : '') . 'web' . $web_id . '_' . date('Y-m-d_H-i') . $backup_extension_web; - $full_filename = $web_backup_dir . '/' . $web_backup_file; - if (self::runWebCompression($backup_format_web, $backup_excludes, $backup_mode, $web_path, $web_backup_dir, $web_backup_file, $web_user, $web_group, $http_server_user, $backup_tmp, $password)) { - if (is_file($full_filename)) { + if ( ! self::prepareRepos($backup_mode, $backup_repos_path, $repos_password)) { + $app->log('Backup of web files for domain ' . $web_domain['domain'] . ' using path ' . $backup_repos_path . ' failed. Unable to prepare repository for ' . $backup_mode, LOGLEVEL_ERROR); + return FALSE; + } + #we wont use tar to be able to speed up things and extract specific files easily + #$find_user_files = 'cd ? && find . -group ? -or -user ? -print 2> /dev/null'; + $excludes = backup::generateExcludeList($backup_excludes, '--exclude '); + $success = false; + + $app->log('Performing web files backup of ' . $web_path . ', mode ' . $backup_mode, LOGLEVEL_DEBUG); + switch ($backup_mode) { + case 'borg': + $command = self::getBorgCommand('borg create', $repos_password); + $command_opts = self::getBorgCreateOptions($compression); + + $app->system->exec_safe( + 'cd ? && ' . $command . ' ' . $command_opts . ' ' . $excludes . ' ? .', + $web_path, $backup_repos_path . '::' . $web_backup_archive + ); + $success = $app->system->last_exec_retcode() == 0; + } + + if ($success) { $backup_username = ($global_config['backups_include_into_web_quota'] == 'y') ? $web_user : 'root'; $backup_group = ($global_config['backups_include_into_web_quota'] == 'y') ? $web_group : 'root'; - chown($full_filename, $backup_username); - chgrp($full_filename, $backup_group); - chmod($full_filename, 0750); - + //Insert web backup record in database - $file_size = filesize($full_filename); + $archive_size = self::getReposArchiveSize($backup_mode, $backup_repos_path, $web_backup_archive, $repos_password); + $password = $repos_password ? '*secret*' : ''; $sql = "INSERT INTO web_backup (server_id, parent_domain_id, backup_type, backup_mode, backup_format, tstamp, filename, filesize, backup_password) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)"; - $app->db->query($sql, $server_id, $web_id, 'web', $backup_mode, $backup_format_web, time(), $web_backup_file, $file_size, $password); + $backup_time = time(); + $app->db->query($sql, $server_id, $web_id, 'web', $backup_mode, $backup_format_web, $backup_time, $web_backup_archive, $archive_size, $password); if ($app->db->dbHost != $app->dbmaster->dbHost) - $app->dbmaster->query($sql, $server_id, $web_id, 'web', $backup_mode, $backup_format_web, time(), $web_backup_file, $file_size, $password); - unset($file_size); - $app->log('Backup of web files for domain ' . $web_domain['domain'] . ' completed successfully to file ' . $full_filename, LOGLEVEL_DEBUG); + $app->dbmaster->query($sql, $server_id, $web_id, 'web', $backup_mode, $backup_format_web, $backup_time, $web_backup_archive, $archive_size, $password); + unset($archive_size); + $app->log('Backup of web files for domain ' . $web_domain['domain'] . ' completed successfully to archive ' . $full_archive_path, LOGLEVEL_DEBUG); } else { - $app->log('Backup of web files for domain ' . $web_domain['domain'] . ' reported success, but the resulting file ' . $full_filename . ' not found.', LOGLEVEL_ERROR); + $app->log('Backup of web files for domain ' . $web_domain['domain'] . ' using path ' . $web_path . ' failed.', LOGLEVEL_ERROR); } - } else { - if (is_file($full_filename)) - unlink($full_filename); - $app->log('Backup of web files for domain ' . $web_domain['domain'] . ' failed using path ' . $web_path . ' failed.', LOGLEVEL_ERROR); + $web_backup_file = ($backup_job == 'manual' ? 'manual-' : '') . 'web' . $web_id . '_' . date('Y-m-d_H-i') . $backup_extension_web; + $full_filename = $web_backup_dir . '/' . $web_backup_file; + if (self::runWebCompression($backup_format_web, $backup_excludes, $backup_mode, $web_path, $web_backup_dir, $web_backup_file, $web_user, $web_group, $http_server_user, $backup_tmp, $password)) { + if (is_file($full_filename)) { + $backup_username = ($global_config['backups_include_into_web_quota'] == 'y') ? $web_user : 'root'; + $backup_group = ($global_config['backups_include_into_web_quota'] == 'y') ? $web_group : 'root'; + chown($full_filename, $backup_username); + chgrp($full_filename, $backup_group); + chmod($full_filename, 0750); + + //Insert web backup record in database + $file_size = filesize($full_filename); + $sql = "INSERT INTO web_backup (server_id, parent_domain_id, backup_type, backup_mode, backup_format, tstamp, filename, filesize, backup_password) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)"; + $app->db->query($sql, $server_id, $web_id, 'web', $backup_mode, $backup_format_web, time(), $web_backup_file, $file_size, $password); + if ($app->db->dbHost != $app->dbmaster->dbHost) + $app->dbmaster->query($sql, $server_id, $web_id, 'web', $backup_mode, $backup_format_web, time(), $web_backup_file, $file_size, $password); + unset($file_size); + $app->log('Backup of web files for domain ' . $web_domain['domain'] . ' completed successfully to file ' . $full_filename, LOGLEVEL_DEBUG); + } else { + $app->log('Backup of web files for domain ' . $web_domain['domain'] . ' reported success, but the resulting file ' . $full_filename . ' not found.', LOGLEVEL_ERROR); + } + + } else { + if (is_file($full_filename)) + unlink($full_filename); + $app->log('Backup of web files for domain ' . $web_domain['domain'] . ' failed using path ' . $web_path . ' failed.', LOGLEVEL_ERROR); + } } - $prefix_list = array( - 'web', - 'manual-web', - ); + $prefix_list = array( + 'web', + 'manual-web', + ); self::clearBackups($server_id, $web_id, intval($web_domain['backup_copies']), $web_backup_dir, $prefix_list); return true; } + protected static function getBackupReposFolder($backup_mode, $backup_type) + { + switch ($backup_mode) { + case 'borg': return 'borg_' . $backup_type; + } + return null; + } + + /** + * Prepares repository for backup. Initialization, etc. + */ + protected static function prepareRepos($backup_mode, $repos_path, $password) + { + global $app; + if (is_dir($repos_path)) { + self::getReposArchives($backup_mode, $repos_path, $password); + if ($app->system->last_exec_retcode() == 0) { + return true; + } + if ($app->system->last_exec_retcode() == 2 && preg_match('/passphrase supplied in.*is incorrect/', $app->system->last_exec_out()[0])) { + //Password was updated, so we rename folder and alert the event. + $repos_stat = stat($repos_path); + $mtime = $repos_stat['mtime']; + $new_repo_path = $repos_path . '_' . date('Y-m-d_H-i', $mtime); + rename($repos_path, $new_repo_name); + $app->log('Backup of web files for domain ' . $web_domain['domain'] . ' are encrypted under a different password. Original repos was moved to ' . $new_repo_name, LOGLEVEL_WARN); + } else { + return false; + } + } + switch ($backup_mode) { + case 'borg': + if ($password) { + $command = self::getBorgCommand('borg init', $password, true); + $app->system->exec_safe($command . ' --make-parent-dirs -e authenticated ?', $repos_path); + } else { + $app->system->exec_safe('borg init --make-parent-dirs -e none ?', $repos_path); + } + return $app->system->last_exec_retcode() == 0; + } + return false; + } + + /** + * Obtains archive compressed size from specific repository. + * @param string $backup_mode Server backup mode. + * @param string $backup_repos_path Absolute path to repository. + * @param string $backup_archive Name of the archive to obtain size from. + * @param string $password Provide repository password or empty string if there is none. + * @author Jorge Muñoz <elgeorge2k@gmail.com> + */ + protected static function getReposArchiveSize($backup_mode, $backup_repos_path, $backup_archive, $password) + { + $info = self::getReposArchiveInfo($backup_mode, $backup_repos_path, $backup_archive, $password); + if ($info) { + return $info['compressed_size']; + } + return false; + } + /** + * Obtains archive information for specific repository archive. + * @param string $backup_mode Server backup mode. + * @param string $backup_repos_path Absolute path to repository. + * @param string $backup_archive Name of the archive to obtain size from. + * @param string $password Provide repository password or empty string if there is none. + * @return array Can contain one or more of the following keys: + * 'created_at': int unixtime + * 'created_by': string + * 'comment': string + * 'original_size': int + * 'compressed_size': int + * 'deduplicated_size': int + * 'num_files': int + * 'compression': string + * @author Jorge Muñoz <elgeorge2k@gmail.com> + */ + protected static function getReposArchiveInfo($backup_mode, $backup_repos_path, $backup_archive, $password) + { + global $app; + $info = []; + switch ($backup_mode) { + case 'borg': + $command = self::getBorgCommand('borg info', $password); + $full_archive_path = $backup_repos_path . '::' . $backup_archive; + $app->system->exec_safe($command . ' --json ?', $full_archive_path); + if ($app->system->last_exec_retcode() != 0) { + $app->log('Command `borg info` failed for ' . $full_archive_path . '.', LOGLEVEL_ERROR); + } + $out = implode("", $app->system->last_exec_out()); + if ($out) { + $out = json_decode($out, true); + } + if (empty($out)) { + $app->log('No json result could be parsed from `borg info --json` command for repository ' . $full_archive_path . '.', LOGLEVEL_ERROR); + return false; + } + if (empty($out['archives'])) { + $app->log('No archive ' . $backup_archive . ' found for repository ' . $backup_repos_path . '.', LOGLEVEL_WARN); + return false; + } + $info['created_at'] = strtotime($out['archives'][0]['start']); + $info['created_by'] = $out['archives'][0]['username']; + $info['comment'] = $out['archives'][0]['comment']; + $info['original_size'] = (int)$out['archives'][0]['stats']['original_size']; + $info['compressed_size'] = (int)$out['archives'][0]['stats']['compressed_size']; + $info['deduplicated_size'] = (int)$out['archives'][0]['stats']['deduplicated_size']; + $info['num_files'] = (int)$out['archives'][0]['stats']['nfiles']; + $prev_arg = null; + foreach ($out['archives'][0]['command_line'] as $arg) { + if ($prev_arg == '-C' || $prev_arg == '--compression') { + $info['compression'] = $arg; + break; + } + $prev = $arg; + } + } + return $info; + } + /** * Creates and prepares a backup dir * @param int $server_id @@ -1498,7 +2265,7 @@ class backup } } - $sql = "SELECT DISTINCT d.*, db.server_id as `server_id` FROM web_database as db INNER JOIN web_domain as d ON (d.domain_id = db.parent_domain_id) WHERE db.server_id = ? AND db.active = 'y' AND d.backup_interval != 'none' AND d.backup_interval != ''"; + $sql = "SELECT DISTINCT d.*, db.server_id as `server_id` FROM web_database as db INNER JOIN web_domain as d ON (d.domain_id = db.parent_domain_id) WHERE db.server_id = ? AND db.active = 'y' AND d.backup_interval != 'none' AND d.backup_interval != ''"; $databases = $app->dbmaster->queryAllRecords($sql, $server_id); foreach ($databases as $database) { diff --git a/server/lib/classes/cron.d/100-monitor_backup.inc.php b/server/lib/classes/cron.d/100-monitor_backup.inc.php index 40f5362082e262d43d9d62b6d139045cc0b134e9..b90290d7c3f70d9c0f73ea277672ddfa4e2684b2 100644 --- a/server/lib/classes/cron.d/100-monitor_backup.inc.php +++ b/server/lib/classes/cron.d/100-monitor_backup.inc.php @@ -63,7 +63,8 @@ class cronjob_monitor_backup extends cronjob { $type = 'backup_utils'; $missing_utils = array(); - $compressors_list = array( + $util_list = array( + 'borg', 'gzip', 'gunzip', 'zip', @@ -77,9 +78,9 @@ class cronjob_monitor_backup extends cronjob { '7z', 'rar', ); - foreach ($compressors_list as $compressor) { - if (!$app->system->is_installed($compressor)) { - $missing_utils[] = $compressor; + foreach ($util_list as $util) { + if (!$app->system->is_installed($util)) { + $missing_utils[] = $util; } } diff --git a/server/lib/classes/cron.d/300-quota_notify.inc.php b/server/lib/classes/cron.d/300-quota_notify.inc.php index 5e1bb922767e395569a045e394c3b65b555c1445..ac7ae0aa5c70fab9c8e539145f558c950d174563 100644 --- a/server/lib/classes/cron.d/300-quota_notify.inc.php +++ b/server/lib/classes/cron.d/300-quota_notify.inc.php @@ -210,8 +210,8 @@ class cronjob_quota_notify extends cronjob { $rec['hard'] .= ' KB'; } - // send notifications only if 90% or more of the quota are used - if($used_ratio < 0.9) { + // send notifications only if the website is over the quota threshold + if($used_ratio <= $web_config['overquota_notify_threshold'] / 100) { // reset notification date if($rec['last_quota_notification']) $app->dbmaster->datalogUpdate('web_domain', array("last_quota_notification" => null), 'domain_id', $rec['domain_id']); @@ -339,8 +339,8 @@ class cronjob_quota_notify extends cronjob { $rec['used'] = round($rec['used'] / 1048576, 4).' MB'; } - // send notifications only if 90% or more of the quota are used - if($used_ratio < 0.9) { + // send notifications only if the mail account is over the quota threshold + if($used_ratio <= $mail_config['overquota_notify_threshold'] / 100) { // reset notification date if($rec['last_quota_notification']) $app->dbmaster->datalogUpdate('mail_user', array("last_quota_notification" => null), 'mailuser_id', $rec['mailuser_id']); @@ -455,8 +455,8 @@ class cronjob_quota_notify extends cronjob { if ($quota > 0) $used_ratio = $monitor['size'] / $quota; else $used_ratio = 0; - //* send notifications only if 90% or more of the quota are used - if($used_ratio > 0.9 && $used_ratio != 0) { + //* send notifications only if the database is over the quota threshold + if($used_ratio >= $web_config['overquota_db_notify_threshold'] / 100 && $used_ratio != 0) { //* could a notification be sent? $send_notification = false; diff --git a/server/lib/classes/cron.d/500-backup_mail.inc.php b/server/lib/classes/cron.d/500-backup_mail.inc.php index f631f0043cbba060e644ae8a0054dc1d785fe3f0..4dcb1994142065a7e8aed42036578c1a88229c29 100644 --- a/server/lib/classes/cron.d/500-backup_mail.inc.php +++ b/server/lib/classes/cron.d/500-backup_mail.inc.php @@ -126,7 +126,7 @@ class cronjob_backup_mail extends cronjob { if ($rec['maildir_format'] == 'mdbox') { if (empty($this->tmp_backup_dir)) $this->tmp_backup_dir = $rec['maildir']; // Create temporary backup-mailbox - $app->system->exec_safe("su -c ?", 'dsync backup -u "'.$rec["email"].'" mdbox:' . $this->tmp_backup_dir . '/backup'); + $app->system->exec_safe("su -c ?", 'dsync -o plugin/acl= -o plugin/quota= backup -u "'.$rec["email"].'" mdbox:' . $this->tmp_backup_dir . '/backup'); if($backup_mode == 'userzip') { $mail_backup_file.='.zip'; diff --git a/server/lib/classes/cron.d/600-file_cleanup.inc.php b/server/lib/classes/cron.d/600-file_cleanup.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..765b0910414bc588b59af5148a7112bfcdb139ee --- /dev/null +++ b/server/lib/classes/cron.d/600-file_cleanup.inc.php @@ -0,0 +1,143 @@ +<?php + +/* +Copyright (c) 2021, Jesse Norell +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of ISPConfig nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +class cronjob_file_cleanup extends cronjob { + + // job schedule + protected $_schedule = '* * * * *'; + protected $_run_at_new = true; + + public function onBeforeRun() { + global $app; + + /* currently we only cleanup rspamd config files, so bail if not needed */ + if (! is_dir("/etc/rspamd/local.d/users/")) { + return false; + } + + return parent::onBeforeRun(); + } + + public function onRunJob() { + global $app, $conf; + + $server_id = $conf['server_id']; + + /* rspamd config file cleanup */ + if (is_dir("/etc/rspamd/local.d/users/")) { + $mail_access = array(); + $sql = "SELECT access_id as id FROM mail_access WHERE active = 'y' AND server_id = ?"; + $records = $app->db->queryAllRecords($sql, $server_id); + if(is_array($records)) { + foreach($records as $rec){ + $mail_access[$rec['id']] = $rec['id']; + } + } + + $spamfilter_wblist = array(); + $sql = "SELECT wblist_id as id FROM spamfilter_wblist WHERE active = 'y' AND server_id = ?"; + $records = $app->db->queryAllRecords($sql, $server_id); + if(is_array($records)) { + foreach($records as $rec){ + $spamfilter_wblist[$rec['id']] = $rec['id']; + } + } + + $spamfilter_users = array(); + $sql = "SELECT id FROM spamfilter_users WHERE policy_id != 0 AND server_id = ?"; + $records = $app->db->queryAllRecords($sql, $server_id); + if(is_array($records)) { + foreach($records as $rec){ + $spamfilter_users[$rec['id']] = $rec['id']; + } + } + + $mail_user = array(); + $sql = "SELECT mailuser_id as id FROM mail_user WHERE postfix = 'y' AND server_id = ?"; + $records = $app->db->queryAllRecords($sql, $server_id); + if(is_array($records)) { + foreach($records as $rec){ + $mail_user[$rec['id']] = $rec['id']; + } + } + + $mail_forwarding = array(); + $sql = "SELECT forwarding_id as id FROM mail_forwarding WHERE active = 'y' AND server_id = ?"; + $records = $app->db->queryAllRecords($sql, $server_id); + if(is_array($records)) { + foreach($records as $rec){ + $mail_forwarding[$rec['id']] = $rec['id']; + } + } + + foreach (glob('/etc/rspamd/local.d/users/*.conf') as $file) { + if($handle = fopen($file, 'r')) { + if(($line = fgets($handle)) !== false) { + if(preg_match('/^((?:global|spamfilter)_wblist|ispc_(spamfilter_user|mail_user|mail_forwarding))[_-](\d+)\s/', $line, $matches)) { + switch($matches[1]) { + case 'global_wblist': + $remove = isset($mail_access[$matches[3]]) ? false : true; + break; + case 'spamfilter_wblist': + $remove = isset($spamfilter_wblist[$matches[3]]) ? false : true; + break; + case 'ispc_spamfilter_user': + $remove = isset($spamfilter_users[$matches[3]]) ? false : true; + break; + case 'ispc_mail_user': + $remove = isset($mail_user[$matches[3]]) ? false : true; + break; + case 'ispc_mail_forwarding': + $remove = isset($mail_forwarding[$matches[3]]) ? false : true; + break; + default: + $app->log("conf file has unhandled rule naming convention, ignoring: $file", LOGLEVEL_DEBUG); + $remove = false; + } + if($remove) { + $app->log("$matches[1] id $matches[3] not found, removing $file", LOGLEVEL_DEBUG); + unlink($file); + $this->restartServiceDelayed('rspamd', 'reload'); + } + } else { + $app->log("conf file has unknown rule naming convention, ignoring: $file", LOGLEVEL_DEBUG); + } + } + + fclose($handle); + } + } + } + + parent::onRunJob(); + } + +} + diff --git a/server/lib/classes/cron.d/600-jailkit_maintenance.inc.php b/server/lib/classes/cron.d/600-jailkit_maintenance.inc.php index 4ef5835e67c1ae6a74ddc1f48b2d6ef4d502b8e0..e38ee58210fe329c1ef0c9b91804f70615528441 100644 --- a/server/lib/classes/cron.d/600-jailkit_maintenance.inc.php +++ b/server/lib/classes/cron.d/600-jailkit_maintenance.inc.php @@ -34,22 +34,6 @@ class cronjob_jailkit_maintenance extends cronjob { protected $_schedule = '*/5 * * * *'; protected $_run_at_new = true; - //private $_tools = null; - - /* this function is optional if it contains no custom code */ - public function onPrepare() { - global $app; - - parent::onPrepare(); - } - - /* this function is optional if it contains no custom code */ - public function onBeforeRun() { - global $app; - - return parent::onBeforeRun(); - } - public function onRunJob() { global $app, $conf; @@ -66,6 +50,18 @@ class cronjob_jailkit_maintenance extends cronjob { $options = array('allow_hardlink'); } + // force all jails to update every 2 weeks + if (! is_file('/usr/local/ispconfig/server/temp/jailkit_force_update.ts')) { + if(!@is_dir('/usr/local/ispconfig/server/temp')) { + $app->system->mkdirpath('/usr/local/ispconfig/server/temp'); + } + $app->system->touch('/usr/local/ispconfig/server/temp/jailkit_force_update.ts'); + } elseif ( time() - filemtime('/usr/local/ispconfig/server/temp/jailkit_force_update.ts') > 60 * 60 * 24 * 14 ) { + $update_hash = 'force_update'.time(); + $app->db->query("UPDATE web_domain SET last_jailkit_hash = ? WHERE type = 'vhost' AND server_id = ?", $update_hash, $conf['server_id']); + $app->system->touch('/usr/local/ispconfig/server/temp/jailkit_force_update.ts'); + } + // limit the number of jails we update at one time according to time of day $num_jails_to_update = (date('H') < 6) ? 25 : 3; @@ -111,12 +107,12 @@ class cronjob_jailkit_maintenance extends cronjob { sort($last_updated, SORT_STRING); $update_hash = hash('md5', implode(' ', $last_updated)); - if (is_file( $rec['document_root']."/bin/bash" )) { + if (substr($rec['last_jailkit_hash'], 0, strlen('force_update')) === 'force_update') { + $options[] = 'force'; + } elseif (is_file( $rec['document_root']."/bin/bash" )) { # test that /bin/bash functions in the jail -print "chroot --userspec ".$rec['system_user'].":".$rec['system_group']." ".$rec['document_root']." /bin/bash -c true 2>/dev/null\n"; $app->system->exec_safe("chroot --userspec ?:? ? /bin/bash -c true 2>/dev/null", $rec['system_user'], $rec['system_group'], $rec['document_root']); if ($app->system->last_exec_retcode()) { # return 0 means success -print "/bin/bash test failed, forcing update\n"; $options[] = 'force'; # bogus hash will not match, triggering an update $update_hash = 'force_update'.time(); @@ -147,10 +143,5 @@ print "/bin/bash test failed, forcing update\n"; parent::onRunJob(); } - /* this function is optional if it contains no custom code */ - public function onAfterRun() { - parent::onAfterRun(); - } - } diff --git a/server/lib/classes/cronjob.inc.php b/server/lib/classes/cronjob.inc.php index 61d45749a841fb2d8826b0a82dd96588fd816f49..df410042db0c5be4afff122a08747858a42154e1 100644 --- a/server/lib/classes/cronjob.inc.php +++ b/server/lib/classes/cronjob.inc.php @@ -43,6 +43,9 @@ class cronjob { protected $_next_run = null; private $_running = false; + // services for delayed restart/reload + private $_delayed_restart_services = array(); + /** return schedule */ @@ -178,6 +181,12 @@ class cronjob { global $app, $conf; if($conf['log_priority'] <= LOGLEVEL_DEBUG) print "Called onAfterRun() for class " . get_class($this) . "\n"; + + if(is_array($this->_delayed_restart_services)) { + foreach ($this->_delayed_restart_services as $service => $mode) { + $this->restartService($service, $mode); + } + } } // child classes may NOT override this! @@ -188,6 +197,29 @@ class cronjob { $app->db->query("UPDATE `sys_cron` SET `running` = 0 WHERE `name` = ?", get_class($this)); } + // child classes may NOT override this! + protected function restartService($service, $action='restart') { + global $app; + + $app->uses('system'); + + $retval = array('output' => '', 'retval' => 0); + if($action == 'reload') { + exec($app->system->getinitcommand($service, 'reload').' 2>&1', $retval['output'], $retval['retval']); + } else { + exec($app->system->getinitcommand($service, 'restart').' 2>&1', $retval['output'], $retval['retval']); + } + return $retval; + } + + // child classes may NOT override this! + protected function restartServiceDelayed($service, $action='restart') { + $action = ($action == 'reload' ? 'reload' : 'restart'); + + if (is_array($this->_delayed_restart_services)) { + $this->_delayed_restart_services[$service] = $action; + } + } + } -?> diff --git a/server/lib/classes/functions.inc.php b/server/lib/classes/functions.inc.php index 5296c3012b65cb4bf0d9889c893252e99ec9d4a8..34e5943cda865a11fd279c88dcb57785abf810a4 100644 --- a/server/lib/classes/functions.inc.php +++ b/server/lib/classes/functions.inc.php @@ -468,14 +468,16 @@ class functions { global $app; // generate the SSH key pair for the client - $id_rsa_file = '/tmp/'.uniqid('',true); + $app->system->exec_safe('mktemp -dt id_rsa.XXXXXXXX'); + $tmpdir = $app->system->last_exec_out(); + $id_rsa_file = $tmpdir . uniqid('',true); $id_rsa_pub_file = $id_rsa_file.'.pub'; if(file_exists($id_rsa_file)) unset($id_rsa_file); if(file_exists($id_rsa_pub_file)) unset($id_rsa_pub_file); if(!file_exists($id_rsa_file) && !file_exists($id_rsa_pub_file)) { $app->system->exec_safe('ssh-keygen -t rsa -C ? -f ? -N ""', $username.'-rsa-key-'.time(), $id_rsa_file); $app->db->query("UPDATE client SET created_at = UNIX_TIMESTAMP(), id_rsa = ?, ssh_rsa = ? WHERE client_id = ?", $app->system->file_get_contents($id_rsa_file), $app->system->file_get_contents($id_rsa_pub_file), $client_id); - $app->system->exec_safe('rm -f ? ?', $id_rsa_file, $id_rsa_pub_file); + $app->system->rmdir($tmpdir, true); } else { $app->log("Failed to create SSH keypair for ".$username, LOGLEVEL_WARN); } diff --git a/server/lib/classes/letsencrypt.inc.php b/server/lib/classes/letsencrypt.inc.php index 5f918f016d2fab98a8e6a9220bead8c2a8f6c999..6cb0f7927cd23888111359f6eedeb19b1d4eb5fa 100644 --- a/server/lib/classes/letsencrypt.inc.php +++ b/server/lib/classes/letsencrypt.inc.php @@ -44,7 +44,7 @@ class letsencrypt { } public function get_acme_script() { - $acme = explode("\n", shell_exec('which /usr/local/ispconfig/server/scripts/acme.sh /root/.acme.sh/acme.sh')); + $acme = explode("\n", shell_exec('which acme.sh /usr/local/ispconfig/server/scripts/acme.sh /root/.acme.sh/acme.sh')); $acme = reset($acme); if(is_executable($acme)) { return $acme; @@ -80,7 +80,7 @@ class letsencrypt { } public function get_certbot_script() { - $letsencrypt = explode("\n", shell_exec('which letsencrypt certbot /root/.local/share/letsencrypt/bin/letsencrypt /opt/eff.org/certbot/venv/bin/certbot')); + $letsencrypt = explode("\n", shell_exec('which certbot /root/.local/share/letsencrypt/bin/letsencrypt /opt/eff.org/certbot/venv/bin/certbot letsencrypt')); $letsencrypt = reset($letsencrypt); if(is_executable($letsencrypt)) { return $letsencrypt; @@ -373,7 +373,7 @@ class letsencrypt { $temp_domains = array_unique($temp_domains); // check if domains are reachable to avoid letsencrypt verification errors - $le_rnd_file = uniqid('le-') . '.txt'; + $le_rnd_file = uniqid('le-', true) . '.txt'; $le_rnd_hash = md5(uniqid('le-', true)); if(!is_dir('/usr/local/ispconfig/interface/acme/.well-known/acme-challenge/')) { $app->system->mkdir('/usr/local/ispconfig/interface/acme/.well-known/acme-challenge/', false, 0755, true); @@ -415,6 +415,10 @@ class letsencrypt { if($use_acme) { $letsencrypt_cmd = $this->get_acme_command($temp_domains, $key_file, $bundle_file, $crt_file, $server_type); $allow_return_codes = array(2); + // Cleanup ssl cert symlinks, if exists + if(@is_link($key_file)) unlink($key_file); + if(@is_link($bundle_file)) unlink($bundle_file); + if(@is_link($crt_file)) unlink($crt_file); } else { $letsencrypt_cmd = $this->get_certbot_command($temp_domains); umask($old_umask); diff --git a/server/lib/classes/monitor_tools.inc.php b/server/lib/classes/monitor_tools.inc.php index 9d7a22574524c6752466263545ae05baa5dfc529..5d91bf5ace51733753749363d492f12c0b3e4279 100644 --- a/server/lib/classes/monitor_tools.inc.php +++ b/server/lib/classes/monitor_tools.inc.php @@ -221,6 +221,12 @@ class monitor_tools { $distconfid = 'debian100'; $distid = 'debian60'; $distbaseid = 'debian'; + } elseif(substr(trim(file_get_contents('/etc/debian_version')),0,2) == '11') { + $distname = 'Debian'; + $distver = 'Bullseye'; + $distconfid = 'debian110'; + $distid = 'debian60'; + $distbaseid = 'debian'; } elseif(strstr(trim(file_get_contents('/etc/debian_version')), '/sid')) { $distname = 'Debian'; $distver = 'Testing'; @@ -255,8 +261,8 @@ class monitor_tools { $distbaseid = 'opensuse'; } elseif(stristr(file_get_contents('/etc/os-release'), 'opensuse')) { $content = file_get_contents('/etc/os-release'); - preg_match_all('/NAME=\"([\w ]+)\"/m', $content, $name); - preg_match_all('/VERSION_ID=\"([0-9]{1,2})\.?([0-9]{0,2})\.?([0-9]*).$/m', $content, $version); + preg_match_all('/NAME=\"([\w ]+)\"/m', $content, $name); + preg_match_all('/VERSION_ID=\"([0-9]{1,2})\.?([0-9]{0,2})\.?([0-9]*).$/m', $content, $version); $distname = is_array($name) ? $name[1][0] : 'openSUSE'; $distver = is_array($version) ? implode('.', array_filter(array($version[1][0],$version[2][0],$version[3][0]),'strlen')) : 'Unknown'; $distid = 'opensuse112'; @@ -270,84 +276,81 @@ class monitor_tools { } - //** Redhat - elseif(file_exists('/etc/redhat-release')) { + //** RHEL (including compatible clones) & Fedora + elseif(file_exists('/etc/redhat-release') && file_exists('/etc/os-release')) { - $content = file_get_contents('/etc/redhat-release'); + $content = file_get_contents('/etc/os-release'); - if(stristr($content, 'Fedora release 9 (Sulphur)')) { - $distname = 'Fedora'; - $distver = '9'; - $distid = 'fedora9'; - $distbaseid = 'fedora'; - } elseif(stristr($content, 'Fedora release 10 (Cambridge)')) { - $distname = 'Fedora'; - $distver = '10'; - $distid = 'fedora9'; - $distbaseid = 'fedora'; - } elseif(stristr($content, 'Fedora release 10')) { - $distname = 'Fedora'; - $distver = '11'; - $distid = 'fedora9'; - $distbaseid = 'fedora'; - } elseif(stristr($content, 'Fedora release 32 (Thirty Two)')) { + preg_match('/(?<=PRETTY_NAME=\").+?(?=\")/', $content, $prettyname); + preg_match('/(?<=NAME=\").+?(?=\")/', $content, $name); + preg_match('/(?<=VERSION=\").+?(?=\")/', $content, $version); + preg_match('/(?<=VERSION_ID=\").+?(?=\")/', $content, $versionid); + + if(stristr($prettyname[0], 'Fedora 32 (Thirty Two)')) { $distname = 'Fedora'; $distver = '32'; $distid = 'fedora32'; $distbaseid = 'fedora'; - } elseif(stristr($content, 'Fedora release 33 (Thirty Three)')) { + } elseif(stristr($prettyname[0], 'Fedora 33 (Thirty Three)')) { $distname = 'Fedora'; $distver = '33'; $distid = 'fedora33'; $distbaseid = 'fedora'; - } elseif(stristr($content, 'CentOS release 5.2 (Final)')) { - $distname = 'CentOS'; - $distver = '5.2'; - $distid = 'centos52'; - $distbaseid = 'fedora'; - } elseif(stristr($content, 'CentOS release 5.3 (Final)')) { - $distname = 'CentOS'; - $distver = '5.3'; - $distid = 'centos53'; - $distbaseid = 'fedora'; - } elseif(stristr($content, 'CentOS release 5')) { - $distname = 'CentOS'; - $distver = 'Unknown'; - $distid = 'centos53'; - $distbaseid = 'fedora'; - } elseif(stristr($content, 'CentOS Linux release 6') || stristr($content, 'CentOS release 6')) { - $distname = 'CentOS'; - $distver = 'Unknown'; - $distid = 'centos53'; + //** RHEL 7 and compatible clones + } elseif(preg_match('/^(?:7|7\.[0-9]{1,2})$/', $versionid[0])) { + preg_match_all('/([0-9]{1,2})\.?([0-9]{0,2})\.?([0-9]*)/', file_get_contents('/etc/redhat-release'), $centos7_version); + $distname = $name[0]; + $distver = is_array($centos7_version)? implode('.', array_filter(array($centos7_version[1][0],$centos7_version[2][0],$centos7_version[3][0]),'strlen')) : $version[0]; + $distid = 'centos72'; $distbaseid = 'fedora'; - } elseif(stristr($content, 'CentOS Linux release 7')) { - preg_match_all('/([0-9]{1,2})\.?([0-9]{0,2})\.?([0-9]*)/', $content, $version); - $distname = 'CentOS'; - $distver = is_array($version)? implode('.', array_filter(array($version[1][0],$version[2][0],$version[3][0]),'strlen')) :'Unknown'; + //** RHEL 8 and compatible clones + } elseif(preg_match('/^(?:8|8\.[0-9]{1,2})$/', $versionid[0])) { + $distname = $name[0]; + $distver = $version[0]; + $distid = 'centos80'; $distbaseid = 'fedora'; - $var=explode(" ", $content); - $var=explode(".", $var[3]); - $var=$var[0].".".$var[1]; - if($var=='7.0' || $var=='7.1') { - $distid = 'centos70'; - } else { - $distid = 'centos72'; - } - } elseif(stristr($content, 'CentOS Linux release 8')) { - preg_match_all('/([0-9]{1,2})\.?([0-9]{0,2})\.?([0-9]*)/', $content, $version); - $distname = 'CentOS'; - $distver = is_array($version)? implode('.', array_filter(array($version[1][0],$version[2][0],$version[3][0]),'strlen')) :'Unknown'; - $distbaseid = 'fedora'; - $var=explode(" ", $content); - $var=explode(".", $var[3]); - $var=$var[0].".".$var[1]; } else { $distname = 'Redhat'; $distver = 'Unknown'; $distid = 'fedora9'; $distbaseid = 'fedora'; } - } + //** CentOS 6 + } elseif(file_exists('/etc/redhat-release') && !file_exists('/etc/os-release') && !file_exists('/etc/els-release')) { + + $content = file_get_contents('/etc/redhat-release'); + + if(stristr($content, 'CentOS Linux release 6') || stristr($content, 'CentOS release 6')) { + preg_match_all('/(6\.?([0-9]{0,2})\.?(\s)?([a-zA-Z()]+))$/', $content, $centos6_version); + $distname = 'CentOS Linux'; + $distver = $centos6_version[0][0] ? $centos6_version[0][0] : '6'; + $distid = 'centos53'; + $distbaseid = 'fedora'; + } else { + $distname = 'Redhat'; + $distver = 'Unknown'; + $distid = 'fedora9'; + $distbaseid = 'fedora'; + } + //** CentOS 6 Extended Lifecycle Support by CloudLinux + } elseif(file_exists('/etc/redhat-release') && file_exists('/etc/els-release') && !file_exists('/etc/os-release')) { + + $content = file_get_contents('/etc/els-release'); + + if(stristr($content, 'CentOS Linux release 6') || stristr($content, 'CentOS release 6')) { + preg_match_all('/(6)\.?([0-9]{0,2})?\.?\s([a-zA-Z(), ]+)?$/', $content, $centos6_version); + $distname = 'CentOS Linux'; + $distver = $centos6_version[0][0] ? $centos6_version[0][0] : '6'; + $distid = 'centos53'; + $distbaseid = 'fedora'; + } else { + $distname = 'Redhat'; + $distver = 'Unknown'; + $distid = 'fedora9'; + $distbaseid = 'fedora'; + } + } + //** Gentoo elseif(file_exists('/etc/gentoo-release')) { diff --git a/server/lib/classes/system.inc.php b/server/lib/classes/system.inc.php index 5a99bbda20f1d8438cb13d8bae4aff434b5ad4fa..7e4e7ae447c64bbac3c6a3049d6fafc21ed1a56b 100644 --- a/server/lib/classes/system.inc.php +++ b/server/lib/classes/system.inc.php @@ -1371,6 +1371,7 @@ class system{ * Control services to restart etc * */ + /* function daemon_init($daemon, $action){ //* $action = start|stop|restart|reload global $app; @@ -1409,7 +1410,7 @@ class system{ } } } - } + } */ function netmask($netmask){ list($f1, $f2, $f3, $f4) = explode('.', trim($netmask)); @@ -1591,44 +1592,6 @@ class system{ - /** - * Scan the trash for virusses infection - * - */ - function make_trashscan(){ - global $app; - //trashscan erstellen - // Template Öffnen - $app->tpl->clear_all(); - $app->tpl->define( array(table => 'trashscan.master')); - - if(!isset($this->server_conf['virusadmin']) || trim($this->server_conf['virusadmin']) == '') $this->server_conf['virusadmin'] = 'admispconfig@localhost'; - if(substr($this->server_conf['virusadmin'], 0, 1) == '#'){ - $notify = 'no'; - } else { - $notify = 'yes'; - } - - // Variablen zuweisen - $app->tpl->assign( array(VIRUSADMIN => $this->server_conf['virusadmin'], - NOTIFICATION => $notify)); - - $app->tpl->parse(TABLE, table); - - $trashscan_text = $app->tpl->fetch(); - - $datei = '/home/admispconfig/ispconfig/tools/clamav/bin/trashscan'; - $app->file->wf($datei, $trashscan_text); - - chmod($datei, 0755); - chown($datei, 'admispconfig'); - chgrp($datei, 'admispconfig'); - } - - - - - /** * Get the current time * @@ -1744,10 +1707,7 @@ class system{ $out = ''; foreach($lines as $line) { if($strict == 0 && preg_match('/^REGEX:(.*)$/', $search_pattern)) { - if(preg_match(substr($search_pattern, 6), $line)) { - $out .= $new_line."\n"; - $found = 1; - } else { + if(!preg_match(substr($search_pattern, 6), $line)) { $out .= $line; } } elseif($strict == 0) { @@ -2102,36 +2062,103 @@ class system{ } function _getinitcommand($servicename, $action, $init_script_directory = '', $check_service) { - global $conf; + global $conf, $app; + // upstart + /* removed upstart support - deprecated if(is_executable('/sbin/initctl')){ exec('/sbin/initctl version 2>/dev/null | /bin/grep -q upstart', $retval['output'], $retval['retval']); if(intval($retval['retval']) == 0) return 'service '.$servicename.' '.$action; } + */ + + if(!in_array($action,array('restart','reload','force-reload'))) { + $app->log('Invalid init command action '.$action,LOGLEVEL_WARN); + return false; + } - // systemd + //* systemd (now default in all supported OS) if(is_executable('/bin/systemd') || is_executable('/usr/bin/systemctl')){ - if ($check_service) { - $this->exec_safe("systemctl is-enabled ? 2>&1", $servicename); - $ret_val = $this->last_exec_retcode(); - } - if ($ret_val == 0 || !$check_service) { - return 'systemctl '.$action.' '.$servicename.'.service'; + $app->log('Trying to use Systemd to restart service',LOGLEVEL_DEBUG); + + //* Test service name via regex + if(preg_match('/[a-zA-Z0-9\.\-\_]/',$servicename)) { + + //* Test if systemd service is enabled + if ($check_service) { + $this->exec_safe("systemctl is-enabled ? 2>&1", $servicename); + $ret_val = $this->last_exec_retcode(); + } else { + $app->log('Systemd service '.$servicename.' not found or not enabled.',LOGLEVEL_DEBUG); + } + + //* Return service command + if ($ret_val == 0 || !$check_service) { + return 'systemctl '.$action.' '.$servicename.'.service'; + } else { + $app->log('Failed to use Systemd to restart service '.$servicename.', we try init script instead.',LOGLEVEL_DEBUG); + } + } else { + $app->log('Systemd service name contains invalid chars: '.$servicename,LOGLEVEL_DEBUG); } + } else { + $app->log('Not using Systemd to restart services',LOGLEVEL_DEBUG); } - // sysvinit + //* sysvinit fallback + $app->log('Using init script to restart service',LOGLEVEL_DEBUG); + + //* Get init script directory if($init_script_directory == '') $init_script_directory = $conf['init_scripts']; if(substr($init_script_directory, -1) === '/') $init_script_directory = substr($init_script_directory, 0, -1); - if($check_service && is_executable($init_script_directory.'/'.$servicename)) { - return $init_script_directory.'/'.$servicename.' '.$action; + $init_script_directory = realpath($init_script_directory); + + //* Check init script dir + if(!is_dir($init_script_directory)) { + $app->log('Init script directory '.$init_script_directory.' not found',LOGLEVEL_WARN); + return false; + } + + //* Forbidden init script paths + if(substr($init_script_directory,0,4) == '/var' || substr($init_script_directory,0,4) == '/tmp') { + $app->log('Do not put init scripts in /var or /tmp folder.',LOGLEVEL_WARN); + return false; + } + + //* Check init script dir owner + if(fileowner($init_script_directory) !== 0) { + $app->log('Init script directory '.$init_script_directory.' not owned by root user',LOGLEVEL_WARN); + return false; + } + + $full_init_script_path = realpath($init_script_directory.'/'.$servicename); + + if($full_init_script_path == '') { + $app->log('No init script, we quit here.',LOGLEVEL_WARN); + return false; + } + + //* Check init script + if(!is_file($full_init_script_path)) { + $app->log('Init script '.$full_init_script_path.' not found',LOGLEVEL_WARN); + return false; + } + + //* Check init script owner + if(fileowner($full_init_script_path) !== 0) { + $app->log('Init script '.$full_init_script_path.' not owned by root user',LOGLEVEL_WARN); + return false; + } + + if($check_service && is_executable($full_init_script_path)) { + return $full_init_script_path.' '.$action; } if (!$check_service) { - return $init_script_directory.'/'.$servicename.' '.$action; + return $full_init_script_path.' '.$action; } } - function getinitcommand($servicename, $action, $init_script_directory = '', $check_service=false) { + function getinitcommand($servicename, $action, $init_script_directory = '', $check_service=true) { if (is_array($servicename)) { foreach($servicename as $service) { $out = $this->_getinitcommand($service, $action, $init_script_directory, true); diff --git a/server/lib/compatibility.inc.php b/server/lib/compatibility.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..562e07ada42f404cae0708f32105dcf39a84768c --- /dev/null +++ b/server/lib/compatibility.inc.php @@ -0,0 +1,80 @@ +<?php + +/* +Copyright (c) 2021, Jesse Norell <jesse@kci.net> +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of ISPConfig nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* random_bytes can be dropped when php 5.6 support is dropped */ +if (! function_exists('random_bytes')) { + function random_bytes($length) { + return openssl_random_pseudo_bytes($length); + } +} + +/* random_int can be dropped when php 5.6 support is dropped */ +if (! function_exists('random_int')) { + function random_int($min=null, $max=null) { + if (null === $min) { + $min = PHP_INT_MIN; + } + + if (null === $max) { + $min = PHP_INT_MAX; + } + + if (!is_int($min) || !is_int($max)) { + trigger_error('random_int: $min and $max must be integer values', E_USER_NOTICE); + $min = (int)$min; + $max = (int)$max; + } + + if ($min > $max) { + trigger_error('random_int: $max can\'t be lesser than $min', E_USER_WARNING); + return null; + } + + $range = $counter = $max - $min; + $bits = 1; + + while ($counter >>= 1) { + ++$bits; + } + + $bytes = (int)max(ceil($bits/8), 1); + $bitmask = pow(2, $bits) - 1; + + if ($bitmask >= PHP_INT_MAX) { + $bitmask = PHP_INT_MAX; + } + + do { + $result = hexdec(bin2hex(random_bytes($bytes))) & $bitmask; + } while ($result > $range); + + return $result + $min; + } +} diff --git a/server/mods-available/web_module.inc.php b/server/mods-available/web_module.inc.php index 12ad81ef9cd38db186728d0517e8a73422f03904..bb2de0d1deb3a573df2d168ddfd4e48591a6b53a 100644 --- a/server/mods-available/web_module.inc.php +++ b/server/mods-available/web_module.inc.php @@ -54,6 +54,9 @@ class web_module { 'web_backup_insert', 'web_backup_update', 'web_backup_delete', + 'server_php_insert', + 'server_php_update', + 'server_php_delete', 'aps_instance_insert', 'aps_instance_update', 'aps_instance_delete', @@ -112,6 +115,7 @@ class web_module { $app->modules->registerTableHook('web_folder', 'web_module', 'process'); $app->modules->registerTableHook('web_folder_user', 'web_module', 'process'); $app->modules->registerTableHook('web_backup', 'web_module', 'process'); + $app->modules->registerTableHook('server_php', 'web_module', 'process'); $app->modules->registerTableHook('aps_instances', 'web_module', 'process'); $app->modules->registerTableHook('aps_instances_settings', 'web_module', 'process'); $app->modules->registerTableHook('aps_packages', 'web_module', 'process'); @@ -167,6 +171,11 @@ class web_module { if($action == 'u') $app->plugins->raiseEvent('web_backup_update', $data); if($action == 'd') $app->plugins->raiseEvent('web_backup_delete', $data); break; + case 'server_php': + if($action == 'i') $app->plugins->raiseEvent('server_php_insert', $data); + if($action == 'u') $app->plugins->raiseEvent('server_php_update', $data); + if($action == 'd') $app->plugins->raiseEvent('server_php_delete', $data); + break; case 'aps_instances': if($action == 'i') $app->plugins->raiseEvent('aps_instance_insert', $data); if($action == 'u') $app->plugins->raiseEvent('aps_instance_update', $data); @@ -233,15 +242,20 @@ class web_module { return $retval; } } - - exec($cmd.' 2>&1', $retval['output'], $retval['retval']); + + $app->log("Restarting httpd: $cmd", LOGLEVEL_DEBUG); + + if($cmd != '') { + exec($cmd.' 2>&1', $retval['output'], $retval['retval']); + } else { + $app->log('We got no init command, restart or reload of service aborted.',LOGLEVEL_WARN); + } // if restart failed despite successful syntax check => try again if($web_config['server_type'] == 'nginx' && $retval['retval'] > 0){ sleep(2); exec($cmd.' 2>&1', $retval['output'], $retval['retval']); } - $app->log("Restarting httpd: $cmd", LOGLEVEL_DEBUG); // nginx: do a syntax check because on some distributions, the init script always returns 0 - even if the syntax is not ok (how stupid is that?) //if($web_config['server_type'] == 'nginx' && $retval['retval'] == 0){ @@ -298,10 +312,16 @@ class web_module { } */ } - - $retval = array('output' => '', 'retval' => 0); - exec($initcommand.' 2>&1', $retval['output'], $retval['retval']); + $app->log("Restarting php-fpm: $initcommand", LOGLEVEL_DEBUG); + + if($initcommand != '') { + $retval = array('output' => '', 'retval' => 0); + exec($initcommand.' 2>&1', $retval['output'], $retval['retval']); + } else { + $app->log('We got no init command, restart or reload of php-fpm service aborted.',LOGLEVEL_WARN); + } + return $retval; } diff --git a/server/plugins-available/apache2_plugin.inc.php b/server/plugins-available/apache2_plugin.inc.php index 170f8b1b72f9c4c2a52a3f53b06d24a952a5bef3..76573c0e964009e5acdb468ed9cabb68f63e49e8 100644 --- a/server/plugins-available/apache2_plugin.inc.php +++ b/server/plugins-available/apache2_plugin.inc.php @@ -278,7 +278,6 @@ class apache2_plugin { $ssl_dir = $data['new']['document_root'].'/ssl'; $domain = ($data['new']['ssl_domain'] != '') ? $data['new']['ssl_domain'] : $data['new']['domain']; $key_file = $ssl_dir.'/'.$domain.'.key'; - $key_file2 = $ssl_dir.'/'.$domain.'.key.org'; $csr_file = $ssl_dir.'/'.$domain.'.csr'; $crt_file = $ssl_dir.'/'.$domain.'.crt'; $bundle_file = $ssl_dir.'/'.$domain.'.bundle'; @@ -293,24 +292,13 @@ class apache2_plugin { $app->system->rename($key_file, $key_file.'.bak'); $app->system->chmod($key_file.'.bak', 0400); } - if(file_exists($key_file2)){ - $app->system->rename($key_file2, $key_file2.'.bak'); - $app->system->chmod($key_file2.'.bak', 0400); - } if(file_exists($csr_file)) $app->system->rename($csr_file, $csr_file.'.bak'); if(file_exists($crt_file)) $app->system->rename($crt_file, $crt_file.'.bak'); $rand_file = $ssl_dir.'/random_file'; - $rand_data = md5(uniqid(microtime(), 1)); - for($i=0; $i<1000; $i++) { - $rand_data .= md5(uniqid(microtime(), 1)); - $rand_data .= md5(uniqid(microtime(), 1)); - $rand_data .= md5(uniqid(microtime(), 1)); - $rand_data .= md5(uniqid(microtime(), 1)); - } - $app->system->file_put_contents($rand_file, $rand_data); + $app->system->exec_safe('dd if=/dev/urandom of=? bs=256 count=1', $rand_file); - $ssl_password = substr(md5(uniqid(microtime(), 1)), 0, 15); + $ssl_password = bin2hex(random_bytes(12)); $ssl_cnf = " RANDFILE = $rand_file @@ -346,27 +334,19 @@ class apache2_plugin { $ssl_ext_file = $ssl_dir.'/v3.ext'; $app->system->file_put_contents($ssl_ext_file, $ext_cnf); - $rand_file = $rand_file; - $key_file2 = $key_file2; - $openssl_cmd_key_file2 = $key_file2; - if(substr($domain, 0, 2) == '*.' && strpos($key_file2, '/ssl/\*.') !== false) $key_file2 = str_replace('/ssl/\*.', '/ssl/*.', $key_file2); // wildcard certificate - $key_file = $key_file; $openssl_cmd_key_file = $key_file; if(substr($domain, 0, 2) == '*.' && strpos($key_file, '/ssl/\*.') !== false) $key_file = str_replace('/ssl/\*.', '/ssl/*.', $key_file); // wildcard certificate $ssl_days = 3650; - $csr_file = $csr_file; $openssl_cmd_csr_file = $csr_file; if(substr($domain, 0, 2) == '*.' && strpos($csr_file, '/ssl/\*.') !== false) $csr_file = str_replace('/ssl/\*.', '/ssl/*.', $csr_file); // wildcard certificate $config_file = $ssl_cnf_file; - $crt_file = $crt_file; $openssl_cmd_crt_file = $crt_file; if(substr($domain, 0, 2) == '*.' && strpos($crt_file, '/ssl/\*.') !== false) $crt_file = str_replace('/ssl/\*.', '/ssl/*.', $crt_file); // wildcard certificate if(is_file($ssl_cnf_file) && !is_link($ssl_cnf_file)) { - - $app->system->exec_safe("openssl genrsa -des3 -rand ? -passout pass:? -out ? 2048", $rand_file, $ssl_password, $openssl_cmd_key_file2); - $app->system->exec_safe("openssl req -new -sha256 -passin pass:? -passout pass:? -key ? -out ? -days ? -config ?", $ssl_password, $ssl_password, $openssl_cmd_key_file2, $openssl_cmd_csr_file, $ssl_days, $config_file); - $app->system->exec_safe("openssl rsa -passin pass:? -in ? -out ?", $ssl_password, $openssl_cmd_key_file2, $openssl_cmd_key_file); + $openssl_cmd = 'openssl req -nodes -newkey rsa:4096 -x509 -days ? -keyout ? -out ? -config ?'; + $app->system->exec_safe($openssl_cmd, $ssl_days, $openssl_cmd_key_file, $openssl_cmd_crt_file, $config_file); + $app->system->exec_safe("openssl req -new -sha256 -key ? -out ? -days ? -config ?", $openssl_cmd_key_file, $openssl_cmd_csr_file, $ssl_days, $config_file); if(file_exists($web_config['CA_path'].'/openssl.cnf')) { @@ -375,15 +355,14 @@ class apache2_plugin { if(filesize($crt_file) == 0 || !file_exists($crt_file)) { $app->log("CA-Certificate signing failed. openssl ca -out $openssl_cmd_crt_file -config " . $web_config['CA_path'] . "/openssl.cnf -passin pass:" . $web_config['CA_pass'] . " -in $openssl_cmd_csr_file -extfile $ssl_ext_file", LOGLEVEL_ERROR); } - }; + } if (@filesize($crt_file)==0 || !file_exists($crt_file)){ - $app->system->exec_safe("openssl req -x509 -passin pass:? -passout pass:? -key ? -in ? -out ? -days ? -config ? ", $ssl_password, $ssl_password, $openssl_cmd_key_file2, $openssl_cmd_csr_file, $openssl_cmd_crt_file, $ssl_days, $config_file); + $app->system->exec_safe($openssl_cmd, $ssl_days, $openssl_cmd_key_file, $openssl_cmd_crt_file, $config_file); $app->log("Creating self-signed SSL Cert for: $domain", LOGLEVEL_DEBUG); - }; + } } - $app->system->chmod($key_file2, 0400); $app->system->chmod($key_file, 0400); @$app->system->unlink($config_file); @$app->system->unlink($rand_file); @@ -445,10 +424,6 @@ class apache2_plugin { $app->system->copy($key_file, $key_file.'~'); $app->system->chmod($key_file.'~', 0400); } - if(file_exists($key_file2)){ - $app->system->copy($key_file2, $key_file2.'~'); - $app->system->chmod($key_file2.'~', 0400); - } if(file_exists($csr_file)) $app->system->copy($csr_file, $csr_file.'~'); if(file_exists($crt_file)) $app->system->copy($crt_file, $crt_file.'~'); if(file_exists($bundle_file)) $app->system->copy($bundle_file, $bundle_file.'~'); @@ -551,7 +526,7 @@ class apache2_plugin { $app->uses('getconf'); $web_config = $app->getconf->get_server_config($conf['server_id'], 'web'); - //* Check if this is a chrooted setup + //* Check if apache is using a chrooted setup if($web_config['website_basedir'] != '' && @is_file($web_config['website_basedir'].'/etc/passwd')) { $apache_chrooted = true; $app->log('Info: Apache is chrooted.', LOGLEVEL_DEBUG); @@ -565,7 +540,7 @@ class apache2_plugin { } if($app->system->is_allowed_user($data['new']['system_user'], $app->system->is_user($data['new']['system_user']), true) == false || $app->system->is_allowed_group($data['new']['system_group'], $app->system->is_group($data['new']['system_group']), true) == false) { - $app->log('Websites cannot be owned by the root user or group. User: '.$data['new']['system_user'].' Group: '.$data['new']['system_group'], LOGLEVEL_WARN); + $app->log('Problem with website user or group. Websites cannot be owned by root or an existing user/group. User: '.$data['new']['system_user'].' Group: '.$data['new']['system_group'], LOGLEVEL_WARN); return 0; } if(trim($data['new']['domain']) == '') { @@ -659,7 +634,7 @@ class apache2_plugin { $tmp_symlink = str_replace('[website_domain]', $data['old']['domain'], $tmp_symlink); // Remove trailing slash if(substr($tmp_symlink, -1, 1) == '/') $tmp_symlink = substr($tmp_symlink, 0, -1); - // create the symlinks, if not exist + // remove the old symlinks if they exist if(is_link($tmp_symlink)) { $app->system->exec_safe('rm -f ?', $tmp_symlink); $app->log('Removed symlink: rm -f '.$tmp_symlink, LOGLEVEL_DEBUG); @@ -692,9 +667,7 @@ class apache2_plugin { //* Create new base directory, if it does not exist yet if(!is_dir($new_dir)) $app->system->mkdirpath($new_dir); - $app->system->web_folder_protection($data['old']['document_root'], false); $app->system->exec_safe('mv ? ?', $data['old']['document_root'], $new_dir); - //$app->system->rename($data['old']['document_root'],$new_dir); $app->log('Moving site to new document root: mv '.$data['old']['document_root'].' '.$new_dir, LOGLEVEL_DEBUG); // Handle the change in php_open_basedir @@ -714,15 +687,6 @@ class apache2_plugin { if($apache_chrooted) $app->system->exec_safe('chroot ? ?', $web_config['website_basedir'], $command); //* Change the log mount - /* - $fstab_line = '/var/log/ispconfig/httpd/'.$data['old']['domain'].' '.$data['old']['document_root'].'/'.$old_log_folder.' none bind'; - $app->system->removeLine('/etc/fstab', $fstab_line); - $fstab_line = '/var/log/ispconfig/httpd/'.$data['old']['domain'].' '.$data['old']['document_root'].'/'.$old_log_folder.' none bind,nobootwait'; - $app->system->removeLine('/etc/fstab', $fstab_line); - $fstab_line = '/var/log/ispconfig/httpd/'.$data['old']['domain'].' '.$data['old']['document_root'].'/'.$old_log_folder.' none bind,nobootwait'; - $app->system->removeLine('/etc/fstab', $fstab_line); - */ - $fstab_line_old = '/var/log/ispconfig/httpd/'.$data['old']['domain'].' '.$data['old']['document_root'].'/'.$old_log_folder.' none bind'; if($web_config['network_filesystem'] == 'y') { @@ -737,8 +701,6 @@ class apache2_plugin { } - //print_r($data); - // Check if the directories are there and create them if necessary. $app->system->web_folder_protection($data['new']['document_root'], false); @@ -755,6 +717,7 @@ class apache2_plugin { if(!is_dir($data['new']['document_root'].'/cgi-bin')) $app->system->mkdirpath($data['new']['document_root'].'/cgi-bin'); if(!is_dir($data['new']['document_root'].'/tmp')) $app->system->mkdirpath($data['new']['document_root'].'/tmp', 0770); if(!is_dir($data['new']['document_root'].'/webdav')) $app->system->mkdirpath($data['new']['document_root'].'/webdav'); + if(!is_dir($data['new']['document_root'].'/backup')) $app->system->mkdirpath($data['new']['document_root'].'/backup'); if(!is_dir($data['new']['document_root'].'/.ssh')) { $app->system->mkdirpath($data['new']['document_root'].'/.ssh'); @@ -790,8 +753,12 @@ class apache2_plugin { $update_hash = hash('md5', implode(' ', $last_updated)); $check_for_jailkit_updates=false; - // Create jailkit chroot when enabling php_fpm_chroot - if($data['new']['php_fpm_chroot'] == 'y' && $data['old']['php_fpm_chroot'] != 'y' && $data['new']['php'] != 'no') { + $create_jail_conditions= ($data['old']['php_fpm_chroot'] != 'y' || + ! is_dir($data['new']['document_root'].'/etc/jailkit') || + ($data['old']['php'] != $data['new']['php'] && $data['new']['php'] != 'no')); + + // Create jailkit chroot if needed and when enabling php_fpm_chroot + if($data['new']['php_fpm_chroot'] == 'y' && $create_jail_conditions && $data['new']['php'] != 'no') { $website = $app->db->queryOneRecord('SELECT * FROM web_domain WHERE domain_id = ?', $data['new']['domain_id']); $this->website = array_merge($website, $data['new'], array('new_jailkit_hash' => $update_hash)); $this->jailkit_config = $jailkit_config; @@ -893,7 +860,7 @@ class apache2_plugin { $tmp_symlink = str_replace('[website_domain]', $data['old']['domain'], $tmp_symlink); // Remove trailing slash if(substr($tmp_symlink, -1, 1) == '/') $tmp_symlink = substr($tmp_symlink, 0, -1); - // remove the symlinks, if not exist + // remove the old symlinks if they exist if(is_link($tmp_symlink)) { $app->system->exec_safe('rm -f ?', $tmp_symlink); $app->log('Removed symlink: rm -f '.$tmp_symlink, LOGLEVEL_DEBUG); @@ -1196,7 +1163,7 @@ class apache2_plugin { $app->system->chgrp('/var/log/ispconfig/httpd/'.$data['new']['domain'].'/error.log', 'root'); } - //* Write the custom php.ini file, if custom_php_ini fieled is not empty + //* Write the custom php.ini file, if custom_php_ini field is not empty $custom_php_ini_dir = $web_config['website_basedir'].'/conf/'.$data['new']['system_user']; if($data['new']['type'] == 'vhostsubdomain' || $data['new']['type'] == 'vhostalias') $custom_php_ini_dir .= '_' . $web_folder; if(!is_dir($web_config['website_basedir'].'/conf')) $app->system->mkdir($web_config['website_basedir'].'/conf'); @@ -1316,7 +1283,6 @@ class apache2_plugin { $tmp = $app->letsencrypt->get_website_certificate_paths($data); $domain = $tmp['domain']; $key_file = $tmp['key']; - $key_file2 = $tmp['key2']; $csr_file = $tmp['csr']; $crt_file = $tmp['crt']; $bundle_file = $tmp['bundle']; @@ -1400,12 +1366,14 @@ class apache2_plugin { $rewrite_rules[] = array('rewrite_domain' => '^'.$this->_rewrite_quote($data['new']['domain']), 'rewrite_type' => ($data['new']['redirect_type'] == 'no')?'':'['.$data['new']['redirect_type'].']', 'rewrite_target' => $rewrite_target, + 'rewrite_target_is_ssl' => ('https://' === substr($rewrite_target, 0, 8) ? 'y' : 'n'), 'rewrite_target_ssl' => $rewrite_target_ssl, 'rewrite_is_url' => ($this->_is_url($rewrite_target) ? 'y' : 'n'), 'rewrite_add_path' => (substr($rewrite_target, -1) == '/' ? 'y' : 'n')); $rewrite_rules[] = array('rewrite_domain' => '^' . $this->_rewrite_quote('www.'.$data['new']['domain']), 'rewrite_type' => ($data['new']['redirect_type'] == 'no')?'':'['.$data['new']['redirect_type'].']', 'rewrite_target' => $rewrite_target, + 'rewrite_target_is_ssl' => ('https://' === substr($rewrite_target, 0, 8) ? 'y' : 'n'), 'rewrite_target_ssl' => $rewrite_target_ssl, 'rewrite_is_url' => ($this->_is_url($rewrite_target) ? 'y' : 'n'), 'rewrite_add_path' => (substr($rewrite_target, -1) == '/' ? 'y' : 'n')); @@ -1414,6 +1382,7 @@ class apache2_plugin { $rewrite_wildcard_rules[] = array( 'rewrite_domain' => '(^|\.)'.$this->_rewrite_quote($data['new']['domain']), 'rewrite_type' => ($data['new']['redirect_type'] == 'no')?'':'['.$data['new']['redirect_type'].']', 'rewrite_target' => $rewrite_target, + 'rewrite_target_is_ssl' => ('https://' === substr($rewrite_target, 0, 8) ? 'y' : 'n'), 'rewrite_target_ssl' => $rewrite_target_ssl, 'rewrite_is_url' => ($this->_is_url($rewrite_target) ? 'y' : 'n'), 'rewrite_add_path' => (substr($rewrite_target, -1) == '/' ? 'y' : 'n')); @@ -1422,6 +1391,7 @@ class apache2_plugin { $rewrite_rules[] = array( 'rewrite_domain' => '^'.$this->_rewrite_quote($data['new']['domain']), 'rewrite_type' => ($data['new']['redirect_type'] == 'no')?'':'['.$data['new']['redirect_type'].']', 'rewrite_target' => $rewrite_target, + 'rewrite_target_is_ssl' => ('https://' === substr($rewrite_target, 0, 8) ? 'y' : 'n'), 'rewrite_target_ssl' => $rewrite_target_ssl, 'rewrite_is_url' => ($this->_is_url($rewrite_target) ? 'y' : 'n'), 'rewrite_add_path' => (substr($rewrite_target, -1) == '/' ? 'y' : 'n')); @@ -1677,7 +1647,7 @@ class apache2_plugin { $custom_php_fpm_ini_dir = $tmp_php['php_fpm_ini_dir']; $custom_php_fpm_init_script = $tmp_php['php_fpm_init_script']; $custom_php_fpm_pool_dir = $tmp_php['php_fpm_pool_dir']; - $custom_php_fpm_socket_dir = $tmp_php['custom_php_fpm_socket_dir']; + $custom_php_fpm_socket_dir = $tmp_php['php_fpm_socket_dir']; if(substr($custom_php_fpm_ini_dir, -1) != '/') $custom_php_fpm_ini_dir .= '/'; } } @@ -1689,7 +1659,7 @@ class apache2_plugin { $custom_php_fpm_ini_dir = $tmp_php['php_fpm_ini_dir']; $custom_php_fpm_init_script = $tmp_php['php_fpm_init_script']; $custom_php_fpm_pool_dir = $tmp_php['php_fpm_pool_dir']; - $custom_php_fpm_socket_dir = $tmp_php['custom_php_fpm_socket_dir']; + $custom_php_fpm_socket_dir = $tmp_php['php_fpm_socket_dir']; if(substr($custom_php_fpm_ini_dir, -1) != '/') $custom_php_fpm_ini_dir .= '/'; } } @@ -2094,17 +2064,12 @@ class apache2_plugin { $app->system->copy($key_file, $key_file.'.err'); $app->system->chmod($key_file.'.err', 0400); } - if(is_file($key_file2)){ - $app->system->copy($key_file2, $key_file2.'.err'); - $app->system->chmod($key_file2.'.err', 0400); - } if(is_file($csr_file)) $app->system->copy($csr_file, $csr_file.'.err'); if(is_file($crt_file)) $app->system->copy($crt_file, $crt_file.'.err'); if(is_file($bundle_file)) $app->system->copy($bundle_file, $bundle_file.'.err'); //* Restore the ~ backup files if(is_file($key_file.'~')) $app->system->copy($key_file.'~', $key_file); - if(is_file($key_file2.'~')) $app->system->copy($key_file2.'~', $key_file2); if(is_file($crt_file.'~')) $app->system->copy($crt_file.'~', $crt_file); if(is_file($csr_file.'~')) $app->system->copy($csr_file.'~', $csr_file); if(is_file($bundle_file.'~')) $app->system->copy($bundle_file.'~', $bundle_file); @@ -2129,7 +2094,6 @@ class apache2_plugin { $this->ssl_certificate_changed = false; if(@is_file($key_file.'~')) $app->system->unlink($key_file.'~'); - if(@is_file($key_file2.'~')) $app->system->unlink($key_file2.'~'); if(@is_file($crt_file.'~')) $app->system->unlink($crt_file.'~'); if(@is_file($csr_file.'~')) $app->system->unlink($csr_file.'~'); if(@is_file($bundle_file.'~')) $app->system->unlink($bundle_file.'~'); diff --git a/server/plugins-available/apps_vhost_plugin.inc.php b/server/plugins-available/apps_vhost_plugin.inc.php index d391633b625ee482db0720eec97b09b2ca0427c1..6318c519ef70c5c1ef1f9c086e87d64aca98001b 100644 --- a/server/plugins-available/apps_vhost_plugin.inc.php +++ b/server/plugins-available/apps_vhost_plugin.inc.php @@ -209,12 +209,12 @@ class apps_vhost_plugin { /* Check if SSL should be enabled: */ if(is_file('/usr/local/ispconfig/interface/ssl/ispserver.crt') && is_file('/usr/local/ispconfig/interface/ssl/ispserver.key')) { $content = str_replace('{ssl_comment}', '', $content); - $content = str_replace('{ssl_on}', 'ssl', $content); + $content = str_replace('{ssl_on}', 'ssl http2', $content); } else { $content = str_replace('{ssl_comment}', '#', $content); $content = preg_replace('/(\s)\{ssl_on\}/', '', $content); } - + $content = str_replace('{use_tcp}', $use_tcp, $content); $content = str_replace('{use_socket}', $use_socket, $content); @@ -227,11 +227,11 @@ class apps_vhost_plugin { $content = str_replace('{use_rspamd}', $use_rspamd, $content); // Fix socket path on PHP 7 systems - if(file_exists('/var/run/php/php7.0-fpm.sock')) $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.0-fpm.sock', $content); - if(file_exists('/var/run/php/php7.1-fpm.sock')) $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.1-fpm.sock', $content); - if(file_exists('/var/run/php/php7.2-fpm.sock')) $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.2-fpm.sock', $content); - if(file_exists('/var/run/php/php7.3-fpm.sock')) $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.3-fpm.sock', $content); if(file_exists('/var/run/php/php7.4-fpm.sock')) $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.4-fpm.sock', $content); + if(file_exists('/var/run/php/php7.3-fpm.sock')) $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.3-fpm.sock', $content); + if(file_exists('/var/run/php/php7.2-fpm.sock')) $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.2-fpm.sock', $content); + if(file_exists('/var/run/php/php7.1-fpm.sock')) $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.1-fpm.sock', $content); + if(file_exists('/var/run/php/php7.0-fpm.sock')) $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.0-fpm.sock', $content); // PHP-FPM // Dont just copy over the php-fpm pool template but add some custom settings diff --git a/server/plugins-available/backup_plugin.inc.php b/server/plugins-available/backup_plugin.inc.php index a92165ba6d917bf32b4449d926bf180716317eec..8ba345b4c46315939be690a252485f1537997bc9 100644 --- a/server/plugins-available/backup_plugin.inc.php +++ b/server/plugins-available/backup_plugin.inc.php @@ -87,14 +87,7 @@ class backup_plugin { if($backup_dir_is_ready){ //* Make backup available for download if($action_name == 'backup_download') { - //* Copy the backup file to the backup folder of the website - if(file_exists($backup_dir.'/'.$backup['filename']) && file_exists($web['document_root'].'/backup/') && !stristr($backup_dir.'/'.$backup['filename'], '..') && !stristr($backup_dir.'/'.$backup['filename'], 'etc')) { - copy($backup_dir.'/'.$backup['filename'], $web['document_root'].'/backup/'.$backup['filename']); - chgrp($web['document_root'].'/backup/'.$backup['filename'], $web['system_group']); - chown($web['document_root'].'/backup/'.$backup['filename'], $web['system_user']); - chmod($web['document_root'].'/backup/'.$backup['filename'],0600); - $app->log('cp '.$backup_dir.'/'.$backup['filename'].' '.$web['document_root'].'/backup/'.$backup['filename'], LOGLEVEL_DEBUG); - } + backup::downloadBackup($backup['backup_format'], trim($backup['backup_password']), $backup_dir, $backup['filename'], $backup['backup_mode'], $backup['backup_type'], $web); } //* Restore a MongoDB backup @@ -134,14 +127,7 @@ class backup_plugin { } if($action_name == 'backup_delete') { - if(file_exists($backup_dir.'/'.$backup['filename']) && !stristr($backup_dir.'/'.$backup['filename'], '..') && !stristr($backup_dir.'/'.$backup['filename'], 'etc')) { - unlink($backup_dir.'/'.$backup['filename']); - - $sql = "DELETE FROM web_backup WHERE server_id = ? AND parent_domain_id = ? AND filename = ?"; - $app->db->query($sql, $conf['server_id'], $backup['parent_domain_id'], $backup['filename']); - if($app->db->dbHost != $app->dbmaster->dbHost) $app->dbmaster->query($sql, $conf['server_id'], $backup['parent_domain_id'], $backup['filename']); - $app->log('unlink '.$backup_dir.'/'.$backup['filename'], LOGLEVEL_DEBUG); - } + backup::deleteBackup($backup['backup_format'], trim($backup['backup_password']), $backup_dir, $backup['filename'], $backup['backup_mode'], $backup['backup_type'], $backup['parent_domain_id']); } backup::unmount_backup_dir($conf['server_id']); diff --git a/server/plugins-available/bind_plugin.inc.php b/server/plugins-available/bind_plugin.inc.php index 76b358237961017fa919783ef3a779943bd38509..49fd043aff42a89753e81e28196d618468b18fbe 100644 --- a/server/plugins-available/bind_plugin.inc.php +++ b/server/plugins-available/bind_plugin.inc.php @@ -328,10 +328,15 @@ class bind_plugin { $filename = $dns_config['bind_zonefiles_dir'].'/' . $this->zone_file_prefix() . str_replace("/", "_", substr($zone['origin'], 0, -1)); $old_zonefile = @file_get_contents($filename); - file_put_contents($filename, $tpl->grab()); + $rendered_zone = $tpl->grab(); + file_put_contents($filename, $rendered_zone); + chown($filename, $dns_config['bind_user']); chgrp($filename, $dns_config['bind_group']); + // Store also in the db for exports. + $app->dbmaster->query("UPDATE `dns_soa` SET `rendered_zone`=? WHERE id=?", $rendered_zone, $zone['id']); + //* Check the zonefile if(is_file($filename.'.err')) unlink($filename.'.err'); $app->system->exec_safe('named-checkzone ? ?', $zone['origin'], $filename); diff --git a/server/plugins-available/cron_jailkit_plugin.inc.php b/server/plugins-available/cron_jailkit_plugin.inc.php index a186a128867f8d941a4591aa60c35aca72d4eac7..8bd33b3de00fd3853510784770c580666ed4aaef 100644 --- a/server/plugins-available/cron_jailkit_plugin.inc.php +++ b/server/plugins-available/cron_jailkit_plugin.inc.php @@ -339,10 +339,11 @@ class cron_jailkit_plugin { if(!is_dir($this->parent_domain['document_root'].$jailkit_chroot_userhome)) { $app->system->mkdir($this->parent_domain['document_root'].$jailkit_chroot_userhome, 0750, true); - $app->system->chown($this->parent_domain['document_root'].$jailkit_chroot_userhome, $this->parent_domain['system_user']); - $app->system->chgrp($this->parent_domain['document_root'].$jailkit_chroot_userhome, $this->parent_domain['system_group']); } + $app->system->chown($this->parent_domain['document_root'].$jailkit_chroot_userhome, $this->parent_domain['system_user']); + $app->system->chgrp($this->parent_domain['document_root'].$jailkit_chroot_userhome, $this->parent_domain['system_group']); + } function _get_home_dir($username) diff --git a/server/plugins-available/cron_plugin.inc.php b/server/plugins-available/cron_plugin.inc.php index 1d44a849aacf57d5edc6a92c9e8f208e6f275805..331e85f91977a0717d77ecef33ce7563be692cd8 100644 --- a/server/plugins-available/cron_plugin.inc.php +++ b/server/plugins-available/cron_plugin.inc.php @@ -184,12 +184,14 @@ class cron_plugin { if(!$parent_domain) { $tmp = $app->db->queryOneRecord('SELECT * FROM sys_datalog WHERE dbtable = ? AND dbidx = ? AND `action` = ? ORDER BY `datalog_id` DESC', 'web_domain', 'domain_id:' . $data['old']['parent_domain_id'], 'd'); - $tmp = unserialize($tmp); - if($tmp && isset($tmp['old'])) { - $this->parent_domain = $tmp['old']; - } else { - $app->log("Parent domain not found", LOGLEVEL_WARN); - return 0; + if(is_array($tmp) && isset($tmp['data']) && strlen($tmp['data']) > 0) { + $tmp = unserialize($tmp['data']); + if($tmp && isset($tmp['old'])) { + $this->parent_domain = $tmp['old']; + } else { + $app->log("Parent domain not found", LOGLEVEL_WARN); + return 0; + } } } else { $this->parent_domain = $parent_domain; diff --git a/server/plugins-available/mail_plugin.inc.php b/server/plugins-available/mail_plugin.inc.php index 8bd0ea75fdae452c2a4abd9d0b45da09f6162a3b..d943ba139c5afb7e185d7edd18d241c80d0b0d09 100644 --- a/server/plugins-available/mail_plugin.inc.php +++ b/server/plugins-available/mail_plugin.inc.php @@ -364,7 +364,7 @@ class mail_plugin { $app->log('Moved invalid maildir to corrupted Maildirs folder: '.$data['new']['maildir'], LOGLEVEL_WARN); } - //* Create the maildir, if it doesn not exist, set permissions, set quota. + //* Create the maildir, if it does not exist, set permissions, set quota. if(!empty($maildomain_path) && !is_dir($maildomain_path.'/new')) { $app->system->maildirmake($maildomain_path, $user, '', $group); diff --git a/server/plugins-available/nginx_plugin.inc.php b/server/plugins-available/nginx_plugin.inc.php index 92d8bac7f91c9c5857a18fa42ddcb7316369c7db..dd0ad5892146ccd414f5746117240e53adb3576a 100644 --- a/server/plugins-available/nginx_plugin.inc.php +++ b/server/plugins-available/nginx_plugin.inc.php @@ -112,7 +112,6 @@ class nginx_plugin { $ssl_dir = $data['new']['document_root'].'/ssl'; $domain = ($data['new']['ssl_domain'] != '') ? $data['new']['ssl_domain'] : $data['new']['domain']; $key_file = $ssl_dir.'/'.$domain.'.key'; - $key_file2 = $ssl_dir.'/'.$domain.'.key.org'; $csr_file = $ssl_dir.'/'.$domain.'.csr'; $crt_file = $ssl_dir.'/'.$domain.'.crt'; @@ -126,24 +125,14 @@ class nginx_plugin { $app->system->rename($key_file, $key_file.'.bak'); $app->system->chmod($key_file.'.bak', 0400); } - if(file_exists($key_file2)){ - $app->system->rename($key_file2, $key_file2.'.bak'); - $app->system->chmod($key_file2.'.bak', 0400); - } if(file_exists($csr_file)) $app->system->rename($csr_file, $csr_file.'.bak'); if(file_exists($crt_file)) $app->system->rename($crt_file, $crt_file.'.bak'); $rand_file = $ssl_dir.'/random_file'; - $rand_data = md5(uniqid(microtime(), 1)); - for($i=0; $i<1000; $i++) { - $rand_data .= md5(uniqid(microtime(), 1)); - $rand_data .= md5(uniqid(microtime(), 1)); - $rand_data .= md5(uniqid(microtime(), 1)); - $rand_data .= md5(uniqid(microtime(), 1)); - } - $app->system->file_put_contents($rand_file, $rand_data); + $app->system->exec_safe('dd if=/dev/urandom of=? bs=256 count=1', $rand_file); + + $ssl_password = bin2hex(random_bytes(12)); - $ssl_password = substr(md5(uniqid(microtime(), 1)), 0, 15); $ssl_cnf = " RANDFILE = $rand_file @@ -179,42 +168,35 @@ class nginx_plugin { $ssl_ext_file = $ssl_dir.'/v3.ext'; $app->system->file_put_contents($ssl_ext_file, $ext_cnf); - $rand_file = $rand_file; - $key_file2 = $key_file2; - $openssl_cmd_key_file2 = $key_file2; - if(substr($domain, 0, 2) == '*.' && strpos($key_file2, '/ssl/\*.') !== false) $key_file2 = str_replace('/ssl/\*.', '/ssl/*.', $key_file2); // wildcard certificate - $key_file = $key_file; $openssl_cmd_key_file = $key_file; if(substr($domain, 0, 2) == '*.' && strpos($key_file, '/ssl/\*.') !== false) $key_file = str_replace('/ssl/\*.', '/ssl/*.', $key_file); // wildcard certificate $ssl_days = 3650; - $csr_file = $csr_file; $openssl_cmd_csr_file = $csr_file; if(substr($domain, 0, 2) == '*.' && strpos($csr_file, '/ssl/\*.') !== false) $csr_file = str_replace('/ssl/\*.', '/ssl/*.', $csr_file); // wildcard certificate $config_file = $ssl_cnf_file; - $crt_file = $crt_file; $openssl_cmd_crt_file = $crt_file; if(substr($domain, 0, 2) == '*.' && strpos($crt_file, '/ssl/\*.') !== false) $crt_file = str_replace('/ssl/\*.', '/ssl/*.', $crt_file); // wildcard certificate if(is_file($ssl_cnf_file) && !is_link($ssl_cnf_file)) { - - $app->system->exec_safe("openssl genrsa -des3 -rand ? -passout pass:? -out ? 2048", $rand_file, $ssl_password, $openssl_cmd_key_file2); - $app->system->exec_safe("openssl req -new -sha256 -passin pass:? -passout pass:? -key ? -out ? -days ? -config ?", $ssl_password, $ssl_password, $openssl_cmd_key_file2, $openssl_cmd_csr_file, $ssl_days, $config_file); - $app->system->exec_safe("openssl rsa -passin pass:? -in ? -out ?", $ssl_password, $openssl_cmd_key_file2, $openssl_cmd_key_file); + $openssl_cmd = 'openssl req -nodes -newkey rsa:4096 -x509 -days ? -keyout ? -out ? -config ?'; + $app->system->exec_safe($openssl_cmd, $ssl_days, $openssl_cmd_key_file, $openssl_cmd_crt_file, $config_file); + $app->system->exec_safe("openssl req -new -sha256 -key ? -out ? -days ? -config ?", $openssl_cmd_key_file, $openssl_cmd_csr_file, $ssl_days, $config_file); if(file_exists($web_config['CA_path'].'/openssl.cnf')) { $app->system->exec_safe("openssl ca -batch -out ? -config ? -passin pass:? -in ? -extfile ?", $openssl_cmd_crt_file, $web_config['CA_path']."/openssl.cnf", $web_config['CA_pass'], $openssl_cmd_csr_file, $ssl_ext_file); $app->log("Creating CA-signed SSL Cert for: $domain", LOGLEVEL_DEBUG); - if (filesize($crt_file)==0 || !file_exists($crt_file)) $app->log("CA-Certificate signing failed. openssl ca -out $openssl_cmd_crt_file -config ".$web_config['CA_path']."/openssl.cnf -passin pass:".$web_config['CA_pass']." -in $openssl_cmd_csr_file -extfile $ssl_ext_file", LOGLEVEL_ERROR); - }; + if(filesize($crt_file) == 0 || !file_exists($crt_file)) { + $app->log("CA-Certificate signing failed. openssl ca -out $openssl_cmd_crt_file -config " . $web_config['CA_path'] . "/openssl.cnf -passin pass:" . $web_config['CA_pass'] . " -in $openssl_cmd_csr_file -extfile $ssl_ext_file", LOGLEVEL_ERROR); + } + } if (@filesize($crt_file)==0 || !file_exists($crt_file)){ - $app->system->exec_safe("openssl req -x509 -passin pass:? -passout pass:? -key ? -in ? -out ? -days ? -config ?", $ssl_password, $ssl_password, $openssl_cmd_key_file2, $openssl_cmd_csr_file, $openssl_cmd_crt_file, $ssl_days, $config_file); + $app->system->exec_safe($openssl_cmd, $ssl_days, $openssl_cmd_key_file, $openssl_cmd_crt_file, $config_file); $app->log("Creating self-signed SSL Cert for: $domain", LOGLEVEL_DEBUG); - }; + } } - $app->system->chmod($key_file2, 0400); $app->system->chmod($key_file, 0400); @$app->system->unlink($config_file); @$app->system->unlink($rand_file); @@ -276,10 +258,7 @@ class nginx_plugin { $app->system->copy($key_file, $key_file.'~'); $app->system->chmod($key_file.'~', 0400); } - if(file_exists($key_file2)){ - $app->system->copy($key_file2, $key_file2.'~'); - $app->system->chmod($key_file2.'~', 0400); - } + if(file_exists($csr_file)) $app->system->copy($csr_file, $csr_file.'~'); if(file_exists($crt_file)) $app->system->copy($crt_file, $crt_file.'~'); @@ -379,7 +358,7 @@ class nginx_plugin { $app->uses('getconf'); $web_config = $app->getconf->get_server_config($conf['server_id'], 'web'); - //* Check if this is a chrooted setup + //* Check if nginx is using a chrooted setup if($web_config['website_basedir'] != '' && @is_file($web_config['website_basedir'].'/etc/passwd')) { $nginx_chrooted = true; $app->log('Info: nginx is chrooted.', LOGLEVEL_DEBUG); @@ -393,7 +372,7 @@ class nginx_plugin { } if($app->system->is_allowed_user($data['new']['system_user'], $app->system->is_user($data['new']['system_user']), true) == false || $app->system->is_allowed_group($data['new']['system_group'], $app->system->is_group($data['new']['system_group']), true) == false) { - $app->log('Websites cannot be owned by the root user or group. User: '.$data['new']['system_user'].' Group: '.$data['new']['system_group'], LOGLEVEL_WARN); + $app->log('Problem with website user or group. Websites cannot be owned by root or an existing user/group. User: '.$data['new']['system_user'].' Group: '.$data['new']['system_group'], LOGLEVEL_WARN); return 0; } if(trim($data['new']['domain']) == '') { @@ -500,7 +479,7 @@ class nginx_plugin { $tmp_symlink = str_replace('[website_domain]', $data['old']['domain'], $tmp_symlink); // Remove trailing slash if(substr($tmp_symlink, -1, 1) == '/') $tmp_symlink = substr($tmp_symlink, 0, -1); - // create the symlinks, if not exist + // remove the old symlinks if they exist if(is_link($tmp_symlink)) { $app->system->exec_safe('rm -f ?', $tmp_symlink); $app->log('Removed symlink: rm -f '.$tmp_symlink, LOGLEVEL_DEBUG); @@ -508,6 +487,9 @@ class nginx_plugin { } } + //* Remove protection of old folders + $app->system->web_folder_protection($data['old']['document_root'], false); + if($data["new"]["type"] != "vhostsubdomain" && $data["new"]["type"] != "vhostalias") { //* Move the site data $tmp_docroot = explode('/', $data['new']['document_root']); @@ -530,9 +512,7 @@ class nginx_plugin { //* Create new base directory, if it does not exist yet if(!is_dir($new_dir)) $app->system->mkdirpath($new_dir); - $app->system->web_folder_protection($data['old']['document_root'], false); $app->system->exec_safe('mv ? ?', $data['old']['document_root'], $new_dir); - //$app->system->rename($data['old']['document_root'],$new_dir); $app->log('Moving site to new document root: mv '.$data['old']['document_root'].' '.$new_dir, LOGLEVEL_DEBUG); // Handle the change in php_open_basedir @@ -552,15 +532,6 @@ class nginx_plugin { if($nginx_chrooted) $app->system->exec_safe('chroot ? ?', $web_config['website_basedir'], $command); //* Change the log mount - /* - $fstab_line = '/var/log/ispconfig/httpd/'.$data['old']['domain'].' '.$data['old']['document_root'].'/'.$old_log_folder.' none bind'; - $app->system->removeLine('/etc/fstab', $fstab_line); - $fstab_line = '/var/log/ispconfig/httpd/'.$data['old']['domain'].' '.$data['old']['document_root'].'/'.$old_log_folder.' none bind,nobootwait'; - $app->system->removeLine('/etc/fstab', $fstab_line); - $fstab_line = '/var/log/ispconfig/httpd/'.$data['old']['domain'].' '.$data['old']['document_root'].'/'.$old_log_folder.' none bind,nobootwait'; - $app->system->removeLine('/etc/fstab', $fstab_line); - */ - $fstab_line_old = '/var/log/ispconfig/httpd/'.$data['old']['domain'].' '.$data['old']['document_root'].'/'.$old_log_folder.' none bind'; if($web_config['network_filesystem'] == 'y') { @@ -575,8 +546,6 @@ class nginx_plugin { } - //print_r($data); - // Check if the directories are there and create them if necessary. $app->system->web_folder_protection($data['new']['document_root'], false); @@ -592,6 +561,7 @@ class nginx_plugin { if(!is_dir($data['new']['document_root'].'/ssl')) $app->system->mkdirpath($data['new']['document_root'].'/ssl'); if(!is_dir($data['new']['document_root'].'/cgi-bin')) $app->system->mkdirpath($data['new']['document_root'].'/cgi-bin'); if(!is_dir($data['new']['document_root'].'/tmp')) $app->system->mkdirpath($data['new']['document_root'].'/tmp'); + if(!is_dir($data['new']['document_root'].'/backup')) $app->system->mkdirpath($data['new']['document_root'].'/backup'); if(!is_dir($data['new']['document_root'].'/.ssh')) { $app->system->mkdirpath($data['new']['document_root'].'/.ssh'); @@ -628,8 +598,12 @@ class nginx_plugin { $update_hash = hash('md5', implode(' ', $last_updated)); $check_for_jailkit_updates=false; - // Create jailkit chroot when enabling php_fpm_chroot - if($data['new']['php_fpm_chroot'] == 'y' && $data['old']['php_fpm_chroot'] != 'y' && $data['new']['php'] != 'no') { + $create_jail_conditions= ($data['old']['php_fpm_chroot'] != 'y' || + ! is_dir($data['new']['document_root'].'/etc/jailkit') || + ($data['old']['php'] != $data['new']['php'] && $data['new']['php'] != 'no')); + + // Create jailkit chroot if needed and when enabling php_fpm_chroot + if($data['new']['php_fpm_chroot'] == 'y' && $create_jail_conditions && $data['new']['php'] != 'no') { $website = $app->db->queryOneRecord('SELECT * FROM web_domain WHERE domain_id = ?', $data['new']['domain_id']); $this->website = array_merge($website, $data['new'], array('new_jailkit_hash' => $update_hash)); $this->jailkit_config = $jailkit_config; @@ -731,7 +705,7 @@ class nginx_plugin { $tmp_symlink = str_replace('[website_domain]', $data['old']['domain'], $tmp_symlink); // Remove trailing slash if(substr($tmp_symlink, -1, 1) == '/') $tmp_symlink = substr($tmp_symlink, 0, -1); - // remove the symlinks, if not exist + // remove the old symlinks if they exist if(is_link($tmp_symlink)) { $app->system->exec_safe('rm -f ?', $tmp_symlink); $app->log('Removed symlink: rm -f '.$tmp_symlink, LOGLEVEL_DEBUG); @@ -1377,7 +1351,6 @@ class nginx_plugin { $tmp = $app->letsencrypt->get_website_certificate_paths($data); $domain = $tmp['domain']; $key_file = $tmp['key']; - $key_file2 = $tmp['key2']; $csr_file = $tmp['csr']; $crt_file = $tmp['crt']; $bundle_file = $tmp['bundle']; @@ -1499,7 +1472,7 @@ class nginx_plugin { } } else { // external URL - $rewrite_exclude = '(?!\.well-known/acme-challenge)/'; + $rewrite_exclude = '(?!/(\.well-known/acme-challenge))/'; if($data['new']['redirect_type'] == 'proxy'){ $vhost_data['use_proxy'] = 'y'; $rewrite_subdir = $tmp_redirect_path_parts['path']; @@ -1551,7 +1524,7 @@ class nginx_plugin { } } else { // external URL - $rewrite_exclude = '(?!\.well-known/acme-challenge)/'; + $rewrite_exclude = '(?!/(\.well-known/acme-challenge))/'; if($data['new']['redirect_type'] == 'proxy'){ $vhost_data['use_proxy'] = 'y'; $rewrite_subdir = $tmp_redirect_path_parts['path']; @@ -1601,7 +1574,7 @@ class nginx_plugin { } } else { // external URL - $rewrite_exclude = '(?!\.well-known/acme-challenge)/'; + $rewrite_exclude = '(?!/(\.well-known/acme-challenge))/'; if($data['new']['redirect_type'] == 'proxy'){ $vhost_data['use_proxy'] = 'y'; $rewrite_subdir = $tmp_redirect_path_parts['path']; @@ -2080,8 +2053,7 @@ class nginx_plugin { $ssl_dir = $data['new']['document_root'].'/ssl'; $domain = $data['new']['ssl_domain']; - $key_file = $ssl_dir.'/'.$domain.'.key.org'; - $key_file2 = $ssl_dir.'/'.$domain.'.key'; + $key_file = $ssl_dir.'/'.$domain.'.key'; $csr_file = $ssl_dir.'/'.$domain.'.csr'; $crt_file = $ssl_dir.'/'.$domain.'.crt'; //$bundle_file = $ssl_dir.'/'.$domain.'.bundle'; @@ -2091,17 +2063,12 @@ class nginx_plugin { $app->system->copy($key_file, $key_file.'.err'); $app->system->chmod($key_file.'.err', 0400); } - if(is_file($key_file2)){ - $app->system->copy($key_file2, $key_file2.'.err'); - $app->system->chmod($key_file2.'.err', 0400); - } if(is_file($csr_file)) $app->system->copy($csr_file, $csr_file.'.err'); if(is_file($crt_file)) $app->system->copy($crt_file, $crt_file.'.err'); //if(is_file($bundle_file)) $app->system->copy($bundle_file,$bundle_file.'.err'); //* Restore the ~ backup files if(is_file($key_file.'~')) $app->system->copy($key_file.'~', $key_file); - if(is_file($key_file2.'~')) $app->system->copy($key_file2.'~', $key_file2); if(is_file($crt_file.'~')) $app->system->copy($crt_file.'~', $crt_file); if(is_file($csr_file.'~')) $app->system->copy($csr_file.'~', $csr_file); //if(is_file($bundle_file.'~')) $app->system->copy($bundle_file.'~',$bundle_file); @@ -2121,7 +2088,6 @@ class nginx_plugin { $this->ssl_certificate_changed = false; if(@is_file($key_file.'~')) $app->system->unlink($key_file.'~'); - if(@is_file($key_file2.'~')) $app->system->unlink($key_file2.'~'); if(@is_file($crt_file.'~')) $app->system->unlink($crt_file.'~'); if(@is_file($csr_file.'~')) $app->system->unlink($csr_file.'~'); //if(@is_file($bundle_file.'~')) $app->system->unlink($bundle_file.'~'); @@ -2143,7 +2109,7 @@ class nginx_plugin { if($data['old']['type'] == 'vhost' || $data['old']['type'] == 'vhostsubdomain' || $data['old']['type'] == 'vhostalias') $app->system->web_folder_protection($data['old']['document_root'], false); - //* Check if this is a chrooted setup + //* Check if nginx is using a chrooted setup if($web_config['website_basedir'] != '' && @is_file($web_config['website_basedir'].'/etc/passwd')) { $nginx_chrooted = true; } else { diff --git a/server/plugins-available/postfix_server_plugin.inc.php b/server/plugins-available/postfix_server_plugin.inc.php index 8cdb95066bde7cf78a085f9020c62e6dd2e13be0..be81fb62a46c64baf21a94a8d9763fa0b2afea95 100644 --- a/server/plugins-available/postfix_server_plugin.inc.php +++ b/server/plugins-available/postfix_server_plugin.inc.php @@ -72,6 +72,12 @@ class postfix_server_plugin { global $app, $conf; $postfix_restart = false; + // Plugin should only run on mail servers + if(! $data['new']['mail_server']) { + $app->log("postfix_server_plugin: plugin is enabled but this server is not configured as a mail server.", LOGLEVEL_WARN); + return false; + } + // get the config $app->uses("getconf,system"); $old_ini_data = $app->ini_parser->parse_ini_string($data['old']['config']); @@ -138,7 +144,7 @@ class postfix_server_plugin { if ($value == '') continue; if (preg_match('/^reject_rbl_client/', $value)) continue; $new_options[] = $value; - if (preg_match('/^permit_mynetworks/', $value)) { + if (preg_match('/^permit_sasl_authenticated/', $value)) { $new_options = array_merge($new_options, $rbl_options); $rbl_options = array(); // so we don't ever array_merge twice } @@ -326,7 +332,9 @@ class postfix_server_plugin { } } - $quoted_postfix_config_dir = preg_quote($conf['postfix']['config_dir'], '|'); + $config_dir = exec("postconf -h config_directory"); + $quoted_postfix_config_dir = preg_quote($config_dir, '|'); + $new_options = array(); $options = preg_split("/,\s*/", exec("postconf -h smtpd_recipient_restrictions")); foreach ($options as $key => $value) { @@ -337,10 +345,14 @@ class postfix_server_plugin { } $new_options[] = $value; } - if (defined($configure_lmtp) && $configure_lmtp && $mail_config['content_filter'] == 'amavisd') { + if (isset($configure_lmtp) && $configure_lmtp && $mail_config['content_filter'] == 'amavisd') { for ($i = 0; isset($new_options[$i]); $i++) { if ($new_options[$i] == 'reject_unlisted_recipient') { array_splice($new_options, $i+1, 0, array("check_recipient_access proxy:mysql:${quoted_postfix_config_dir}/mysql-verify_recipients.cf")); + + $app->system->exec_safe("postconf -e ?", 'address_verify_virtual_transport = smtp:[127.0.0.1]:10025'); + $app->system->exec_safe("postconf -e ?", 'address_verify_transport_maps = static:smtp:[127.0.0.1]:10025'); + break; } } @@ -351,62 +363,64 @@ class postfix_server_plugin { } exec("postconf -e 'smtpd_recipient_restrictions = ".implode(", ", $new_options)."'"); - if($mail_config['content_filter'] != $old_ini_data['mail']['content_filter']) { - $rslm = ($mail_config['reject_sender_login_mismatch'] == 'y') ? "reject_sender_login_mismatch," : ""; - $raslm = ($mail_config['reject_sender_login_mismatch'] == 'y') ? "reject_authenticated_sender_login_mismatch," : ""; - - if($mail_config['content_filter'] == 'rspamd'){ - exec("postconf -X 'receive_override_options'"); - exec("postconf -X 'content_filter'"); - - exec("postconf -e 'smtpd_milters = inet:localhost:11332'"); - exec("postconf -e 'non_smtpd_milters = inet:localhost:11332'"); - exec("postconf -e 'milter_protocol = 6'"); - exec("postconf -e 'milter_mail_macros = i {mail_addr} {client_addr} {client_name} {auth_authen}'"); - exec("postconf -e 'milter_default_action = accept'"); + $rslm = ($mail_config['reject_sender_login_mismatch'] == 'y') ? "reject_sender_login_mismatch," : ""; + $raslm = ($mail_config['reject_sender_login_mismatch'] == 'y') ? "reject_authenticated_sender_login_mismatch," : ""; - exec("postconf -e 'smtpd_sender_restrictions = ${raslm} permit_mynetworks, check_sender_access proxy:mysql:/etc/postfix/mysql-virtual_sender.cf, ${rslm} permit_sasl_authenticated, reject_non_fqdn_sender, reject_unlisted_sender'"); + if($mail_config['content_filter'] == 'rspamd'){ + exec("postconf -X 'receive_override_options'"); + exec("postconf -X 'content_filter'"); + exec("postconf -X address_verify_virtual_transport"); + exec("postconf -X address_verify_transport_maps"); + exec("postconf -e 'smtpd_milters = inet:localhost:11332'"); + exec("postconf -e 'non_smtpd_milters = inet:localhost:11332'"); + exec("postconf -e 'milter_protocol = 6'"); + exec("postconf -e 'milter_mail_macros = i {mail_addr} {client_addr} {client_name} {auth_authen}'"); + exec("postconf -e 'milter_default_action = accept'"); - $new_options = array(); - $options = preg_split("/,\s*/", exec("postconf -h smtpd_recipient_restrictions")); - foreach ($options as $key => $value) { - $value = trim($value); - if ($value == '') continue; - if (preg_match('/check_policy_service\s+inet:127.0.0.1:10023/', $value)) { - continue; - } - $new_options[] = $value; - } - exec("postconf -e 'smtpd_recipient_restrictions = ".implode(", ", $new_options)."'"); + exec("postconf -e 'smtpd_sender_restrictions = ${raslm} permit_mynetworks, check_sender_access proxy:mysql:/etc/postfix/mysql-virtual_sender.cf, ${rslm} permit_sasl_authenticated, reject_non_fqdn_sender, reject_unlisted_sender'"); - // get all domains that have dkim enabled - if ( substr($mail_config['dkim_path'], strlen($mail_config['dkim_path'])-1) == '/' ) { - $mail_config['dkim_path'] = substr($mail_config['dkim_path'], 0, strlen($mail_config['dkim_path'])-1); + $new_options = array(); + $options = preg_split("/,\s*/", exec("postconf -h smtpd_recipient_restrictions")); + foreach ($options as $key => $value) { + $value = trim($value); + if ($value == '') continue; + if (preg_match('/check_policy_service\s+inet:127.0.0.1:10023/', $value)) { + continue; } - $dkim_domains = $app->db->queryAllRecords('SELECT `dkim_selector`, `domain` FROM `mail_domain` WHERE `dkim` = ? ORDER BY `domain` ASC', 'y'); - $fpp = fopen('/etc/rspamd/local.d/dkim_domains.map', 'w'); - $fps = fopen('/etc/rspamd/local.d/dkim_selectors.map', 'w'); - foreach($dkim_domains as $dkim_domain) { - fwrite($fpp, $dkim_domain['domain'] . ' ' . $mail_config['dkim_path'] . '/' . $dkim_domain['domain'] . '.private' . "\n"); - fwrite($fps, $dkim_domain['domain'] . ' ' . $dkim_domain['dkim_selector'] . "\n"); + if (preg_match("|check_recipient_access\s+proxy:mysql:${quoted_postfix_config_dir}/mysql-verify_recipients.cf|", $value)) { + continue; } - fclose($fpp); - fclose($fps); - unset($dkim_domains); - } else { - exec("postconf -X 'smtpd_milters'"); - exec("postconf -X 'non_smtpd_milters'"); - exec("postconf -X 'milter_protocol'"); - exec("postconf -X 'milter_mail_macros'"); - exec("postconf -X 'milter_default_action'"); - - exec("postconf -e 'receive_override_options = no_address_mappings'"); - exec("postconf -e 'content_filter = " . ($configure_lmtp ? "lmtp" : "amavis" ) . ":[127.0.0.1]:10024'"); + $new_options[] = $value; + } + exec("postconf -e 'smtpd_recipient_restrictions = ".implode(", ", $new_options)."'"); - // fixme: should read this from conf templates - exec("postconf -e 'smtpd_sender_restrictions = ${raslm} check_sender_access regexp:/etc/postfix/tag_as_originating.re, permit_mynetworks, check_sender_access proxy:mysql:/etc/postfix/mysql-virtual_sender.cf, ${rslm} permit_sasl_authenticated, reject_non_fqdn_sender, reject_unlisted_sender, check_sender_access regexp:/etc/postfix/tag_as_foreign.re'"); + // get all domains that have dkim enabled + if ( substr($mail_config['dkim_path'], strlen($mail_config['dkim_path'])-1) == '/' ) { + $mail_config['dkim_path'] = substr($mail_config['dkim_path'], 0, strlen($mail_config['dkim_path'])-1); + } + $dkim_domains = $app->db->queryAllRecords('SELECT `dkim_selector`, `domain` FROM `mail_domain` WHERE `dkim` = ? ORDER BY `domain` ASC', 'y'); + $fpp = fopen('/etc/rspamd/local.d/dkim_domains.map', 'w'); + $fps = fopen('/etc/rspamd/local.d/dkim_selectors.map', 'w'); + foreach($dkim_domains as $dkim_domain) { + fwrite($fpp, $dkim_domain['domain'] . ' ' . $mail_config['dkim_path'] . '/' . $dkim_domain['domain'] . '.private' . "\n"); + fwrite($fps, $dkim_domain['domain'] . ' ' . $dkim_domain['dkim_selector'] . "\n"); } + fclose($fpp); + fclose($fps); + unset($dkim_domains); + } else { + exec("postconf -X 'smtpd_milters'"); + exec("postconf -X 'non_smtpd_milters'"); + exec("postconf -X 'milter_protocol'"); + exec("postconf -X 'milter_mail_macros'"); + exec("postconf -X 'milter_default_action'"); + + exec("postconf -e 'receive_override_options = no_address_mappings'"); + exec("postconf -e 'content_filter = " . ($configure_lmtp ? "lmtp" : "amavis" ) . ":[127.0.0.1]:10024'"); + + // fixme: should read this from conf templates + exec("postconf -e 'smtpd_sender_restrictions = ${raslm} check_sender_access regexp:/etc/postfix/tag_as_originating.re, permit_mynetworks, check_sender_access proxy:mysql:/etc/postfix/mysql-virtual_sender.cf, ${rslm} permit_sasl_authenticated, reject_non_fqdn_sender, reject_unlisted_sender, check_sender_access regexp:/etc/postfix/tag_as_foreign.re'"); } if($mail_config['content_filter'] == 'rspamd' && ($mail_config['rspamd_password'] != $old_ini_data['mail']['rspamd_password'] || $mail_config['content_filter'] != $old_ini_data['mail']['content_filter'])) { diff --git a/server/plugins-available/rspamd_plugin.inc.php b/server/plugins-available/rspamd_plugin.inc.php index 41f6b08f4081e10c18908bede1fb9f60fd7549ff..112020deb7119f6c1c99dc018737239dfc148274 100644 --- a/server/plugins-available/rspamd_plugin.inc.php +++ b/server/plugins-available/rspamd_plugin.inc.php @@ -120,10 +120,14 @@ class rspamd_plugin { $app->plugins->registerEvent('mail_access_update', $this->plugin_name, 'spamfilter_wblist_update'); $app->plugins->registerEvent('mail_access_delete', $this->plugin_name, 'spamfilter_wblist_delete'); + //* server + $app->plugins->registerEvent('server_insert', $this->plugin_name, 'server_update'); + $app->plugins->registerEvent('server_update', $this->plugin_name, 'server_update'); + //* server ip - $app->plugins->registerEvent('server_ip_insert', $this->plugin_name, 'server_ip'); - $app->plugins->registerEvent('server_ip_update', $this->plugin_name, 'server_ip'); - $app->plugins->registerEvent('server_ip_delete', $this->plugin_name, 'server_ip'); + $app->plugins->registerEvent('server_ip_insert', $this->plugin_name, 'server_update'); + $app->plugins->registerEvent('server_ip_update', $this->plugin_name, 'server_update'); + $app->plugins->registerEvent('server_ip_delete', $this->plugin_name, 'server_update'); //* spamfilter_users $app->plugins->registerEvent('spamfilter_users_insert', $this->plugin_name, 'user_settings_update'); @@ -200,6 +204,8 @@ class rspamd_plugin { $is_domain = true; } + $app->log("rspamd: user_settings_update() for $type $email_address", LOGLEVEL_DEBUG); + if($settings_name == '') { // missing settings file name $app->log('Empty rspamd identifier in rspamd_plugin from identifier: ' . $use_data . '/' . $identifier, LOGLEVEL_WARN); @@ -217,7 +223,7 @@ class rspamd_plugin { $entries_to_update['mail_user'] = $mailusers; } - $forwardings = $app->db->queryAllRecords("SELECT mf.* FROM mail_forwarding as mf LEFT JOIN spamfilter_users as su ON (su.email = mf.source) WHERE mf.source LIKE ? AND su.id IS NULL", '%' . $email_address); + $forwardings = $app->db->queryAllRecords("SELECT mf.* FROM mail_forwarding as mf LEFT JOIN spamfilter_users as su ON (su.email = mf.source) WHERE mf.source LIKE ? AND su.id IS NULL", '%_' . $email_address); if(is_array($forwardings) && !empty($forwardings)) { $entries_to_update['mail_forwarding'] = $forwardings; } @@ -237,17 +243,7 @@ class rspamd_plugin { $settings_file = $this->users_config_dir . str_replace('@', '_', $settings_name) . '.conf'; //$app->log('Settings file for rspamd is ' . $settings_file, LOGLEVEL_WARN); if($mode === 'delete') { - $delete_file = true; - if($type === 'spamfilter_user') { - $search_for_policy[] = $email_address; - $search_for_policy[] = substr($email_address, strpos($email_address, '@')); - - $policy = $app->db->queryOneRecord("SELECT p.* FROM spamfilter_users as u INNER JOIN spamfilter_policy as p ON (p.id = u.policy_id) WHERE u.server_id = ? AND u.email IN ? ORDER BY u.priority DESC", $conf['server_id'], $search_for_policy); - if($policy) { - $delete_file = false; - } - } - if($delete_file === true && is_file($settings_file)) { + if(is_file($settings_file)) { unlink($settings_file); } } else { @@ -259,7 +255,12 @@ class rspamd_plugin { // get policy for entry if($type === 'spamfilter_user') { - $policy = $app->db->queryOneRecord("SELECT * FROM spamfilter_policy WHERE id = ?", intval($data['new']['policy_id'])); + if (intval($data['new']['policy_id']) > 0) { + $policy = $app->db->queryOneRecord("SELECT * FROM spamfilter_policy WHERE id = ?", intval($data['new']['policy_id'])); + } else { + $domain = substr($data['new']['email'], strpos($data['new']['email'], '@')); + $policy = $app->db->queryOneRecord("SELECT p.* FROM spamfilter_users as u INNER JOIN spamfilter_policy as p ON (p.id = u.policy_id) WHERE u.server_id = ? AND u.email = ?", $conf['server_id'], $domain); + } $check = $app->db->queryOneRecord('SELECT `greylisting` FROM `mail_user` WHERE `server_id` = ? AND `email` = ? UNION SELECT `greylisting` FROM `mail_forwarding` WHERE `server_id` = ? AND `source` = ? ORDER BY (`greylisting` = ?) DESC', $conf['server_id'], $email_address, $conf['server_id'], $email_address, 'y'); if($check) { @@ -280,7 +281,7 @@ class rspamd_plugin { $app->system->mkdirpath($this->users_config_dir); } - if(!$this->isValidEmail($app->functions->idn_encode($email_address))) { + if((!$this->isValidEmail($app->functions->idn_encode($email_address))) || intval($data['new']['policy_id']) == 0) { if(is_file($settings_file)) { unlink($settings_file); } @@ -289,7 +290,11 @@ class rspamd_plugin { $app->load('tpl'); $tpl = new tpl(); - $tpl->newTemplate('rspamd_users.inc.conf.master'); + if (file_exists($conf['rootpath']."/conf-custom/install/rspamd_users.inc.conf.master")) { + $tpl->newTemplate($conf['rootpath']."/conf-custom/install/rspamd_users.inc.conf.master"); + } else { + $tpl->newTemplate("rspamd_users.inc.conf.master"); + } $tpl->setVar('record_identifier', 'ispc_' . $type . '_' . $entry_id); $tpl->setVar('priority', $settings_priority); @@ -300,11 +305,13 @@ class rspamd_plugin { } else { $tpl->setVar('from_email', $app->functions->idn_encode($email_address)); } + // unneded? $spamfilter appears unused $spamfilter = $data[$use_data]; } else { $tpl->setVar('to_email', $app->functions->idn_encode($email_address)); // need to get matching spamfilter user if any + // unneded? $spamfilter appears unused $spamfilter = $app->db->queryOneRecord('SELECT * FROM spamfilter_users WHERE `email` = ?', $email_address); } @@ -389,6 +396,7 @@ class rspamd_plugin { } else { $record_id = intval($data['new']['wblist_id']); $wblist_file = $this->users_config_dir.'spamfilter_wblist_'.$record_id.'.conf'; + $tmp = $app->db->queryOneRecord("SELECT email FROM spamfilter_users WHERE id = ?", intval($data['new']['rid'])); if($tmp && !empty($tmp)) { $filter = array( @@ -437,7 +445,12 @@ class rspamd_plugin { } } else { $tpl = new tpl(); - $tpl->newTemplate('rspamd_wblist.inc.conf.master'); + if (file_exists($conf['rootpath']."/conf-custom/install/rspamd_wblist.inc.conf.master")) { + $tpl->newTemplate($conf['rootpath']."/conf-custom/install/rspamd_wblist.inc.conf.master"); + } else { + $tpl->newTemplate("rspamd_wblist.inc.conf.master"); + } + $tpl->setVar('list_scope', ($global_filter ? 'global' : 'spamfilter')); $tpl->setVar('record_id', $record_id); // add 30/40 to priority to avoid collisions and prefer white/blacklists above mailbox/domain spamfilter settings @@ -454,7 +467,7 @@ class rspamd_plugin { unlink($wblist_file); } - if($mail_config['content_filter'] == 'rspamd' && is_file('/etc/init.d/rspamd')) { + if($mail_config['content_filter'] == 'rspamd') { $app->services->restartServiceDelayed('rspamd', 'reload'); } } @@ -478,38 +491,69 @@ class rspamd_plugin { } if($mail_config['content_filter'] == 'rspamd'){ - if(is_file('/etc/init.d/rspamd')) $app->services->restartServiceDelayed('rspamd', 'reload'); + $app->services->restartServiceDelayed('rspamd', 'reload'); } } } - function server_ip($event_name, $data) { + function server_update($event_name, $data) { global $app, $conf; - // get the config - $app->uses("getconf,system"); + if(!is_dir('/etc/rspamd')) { + return; + } + $app->load('tpl'); $mail_config = $app->getconf->get_server_config($conf['server_id'], 'mail'); - if(is_dir('/etc/rspamd')) { + $local_addrs = array(); + $ips = $app->db->queryAllRecords('SELECT `ip_address`, `ip_type` FROM ?? WHERE `server_id` = ?', $conf['mysql']['database'].'.server_ip', $conf['server_id']); + if(is_array($ips) && !empty($ips)){ + foreach($ips as $ip){ + $local_addrs[] = array( + 'ip' => $ip['ip_address'], + 'quoted_ip' => "\"".$ip['ip_address']."\",\n", + ); + } + } + + # local.d templates with template tags + # note: ensure these template files are in server/conf/ and symlinked in install/tpl/ + $local_d = array( + 'dkim_signing.conf', + 'options.inc', + 'redis.conf', + 'classifier-bayes.conf', + ); + foreach ($local_d as $f) { $tpl = new tpl(); - $tpl->newTemplate('rspamd_options.inc.master'); + if (file_exists($conf['rootpath']."/conf-custom/install/rspamd_${f}.master")) { + $tpl->newTemplate($conf['rootpath']."/conf-custom/install/rspamd_${f}.master"); + } else { + $tpl->newTemplate("rspamd_${f}.master"); + } - $local_addrs = array(); - $ips = $app->db->queryAllRecords('SELECT `ip_address`, `ip_type` FROM ?? WHERE `server_id` = ?', $conf['mysql']['database'].'.server_ip', $conf['server_id']); - if(is_array($ips) && !empty($ips)){ - foreach($ips as $ip){ - $local_addrs[] = array('quoted_ip' => "\"".$ip['ip_address']."\",\n"); - } + $tpl->setVar('dkim_path', $mail_config['dkim_path']); + $tpl->setVar('rspamd_redis_servers', $mail_config['rspamd_redis_servers']); + $tpl->setVar('rspamd_redis_password', $mail_config['rspamd_redis_password']); + $tpl->setVar('rspamd_redis_bayes_servers', $mail_config['rspamd_redis_bayes_servers']); + $tpl->setVar('rspamd_redis_bayes_password', $mail_config['rspamd_redis_bayes_password']); + if(count($local_addrs) > 0) { + $tpl->setLoop('local_addrs', $local_addrs); } - $tpl->setLoop('local_addrs', $local_addrs); - $app->system->file_put_contents('/etc/rspamd/local.d/options.inc', $tpl->grab()); + + $app->system->file_put_contents("/etc/rspamd/local.d/${f}", $tpl->grab()); if($mail_config['content_filter'] == 'rspamd'){ $app->services->restartServiceDelayed('rspamd', 'reload'); } } + + # protect passwords in these files + exec('chgrp _rspamd /etc/rspamd/local.d/redis.conf /etc/rspamd/local.d/classifier-bayes.conf /etc/rspamd/local.d/worker-controller.inc'); + exec('chmod 640 /etc/rspamd/local.d/redis.conf /etc/rspamd/local.d/classifier-bayes.conf /etc/rspamd/local.d/worker-controller.inc'); + } private function _is_valid_ip_address($ip) { diff --git a/server/plugins-available/shelluser_base_plugin.inc.php b/server/plugins-available/shelluser_base_plugin.inc.php index f9a316d90e195e6e35a68eceba8b67744c08a837..2fc4f0dfc7cdc0b657825dbdfe51fbb299794b53 100755 --- a/server/plugins-available/shelluser_base_plugin.inc.php +++ b/server/plugins-available/shelluser_base_plugin.inc.php @@ -168,6 +168,11 @@ class shelluser_base_plugin { $app->system->chown($homedir.'/.profile', $data['new']['username']); $app->system->chgrp($homedir.'/.profile', $data['new']['pgroup']); + // Create symlinks for conveniance, SFTP user should not land in an empty dir. + symlink('../../web', $homedir.'/web'); + symlink('../../log', $homedir.'/log'); + symlink('../../private', $homedir.'/private'); + //* Disable shell user temporarily if we use jailkit if($data['new']['chroot'] == 'jailkit') { $command = 'usermod -s /bin/false -L ? 2>/dev/null'; diff --git a/server/plugins-available/software_update_plugin.inc.php b/server/plugins-available/software_update_plugin.inc.php index 211951685df5cda1b0e35ce834ec08d677e782d6..18db6dffac871b6cb938683c08fde155c538e6d5 100644 --- a/server/plugins-available/software_update_plugin.inc.php +++ b/server/plugins-available/software_update_plugin.inc.php @@ -39,243 +39,16 @@ class software_update_plugin { global $conf; return true; - } - /* This function is called when the plugin is loaded */ public function onLoad() { global $app; - - /* - Register for the events - */ - - $app->plugins->registerEvent('software_update_inst_insert', $this->plugin_name, 'process'); - //$app->plugins->registerEvent('software_update_inst_update',$this->plugin_name,'process'); - //$app->plugins->registerEvent('software_update_inst_delete',$this->plugin_name,'process'); - //* Register for actions $app->plugins->registerAction('os_update', $this->plugin_name, 'os_update'); - - - } - - private function set_install_status($inst_id, $status) { - global $app; - - $app->db->query("UPDATE software_update_inst SET status = ? WHERE software_update_inst_id = ?", $status, $inst_id); - $app->dbmaster->query("UPDATE software_update_inst SET status = ? WHERE software_update_inst_id = ?", $status, $inst_id); - } - - public function process($event_name, $data) { - global $app, $conf; - - //* Get the info of the package: - $software_update_id = intval($data["new"]["software_update_id"]); - $software_update = $app->db->queryOneRecord("SELECT * FROM software_update WHERE software_update_id = ?", $software_update_id); - $software_package = $app->db->queryOneRecord("SELECT * FROM software_package WHERE package_name = ?", $software_update['package_name']); - - if($software_package['package_type'] == 'ispconfig' && !$conf['software_updates_enabled'] == true) { - $app->log('Software Updates not enabled on this server. To enable updates, set $conf["software_updates_enabled"] = true; in config.inc.php', LOGLEVEL_WARN); - $this->set_install_status($data["new"]["software_update_inst_id"], "failed"); - return false; - } - - $installuser = ''; - if($software_package['package_type'] == 'ispconfig') { - $installuser = ''; - } elseif ($software_package['package_type'] == 'app') { - $installuser = 'ispapps'; - } else { - $app->log('package_type not supported', LOGLEVEL_WARN); - $this->set_install_status($data["new"]["software_update_inst_id"], "failed"); - return false; - } - - $temp_dir = '/tmp/'.md5(uniqid(rand())); - $app->log("The temp dir is $temp_dir", LOGLEVEL_DEBUG); - mkdir($temp_dir); - if($installuser != '') chown($temp_dir, $installuser); - - if(!is_dir($temp_dir)) { - $app->log("Unable to create temp directory.", LOGLEVEL_WARN); - $this->set_install_status($data["new"]["software_update_inst_id"], "failed"); - return false; - } - - //* Replace placeholders in download URL - $software_update["update_url"] = str_replace('{key}', $software_package['package_key'], $software_update["update_url"]); - - //* Download the update package - if($installuser == '') { - $cmd = "cd ? && wget ?"; - $app->system->exec_safe($cmd, $temp_dir, $software_update["update_url"]); - } else { - $cmd = "cd $temp_dir && wget ".$software_update["update_url"]; - $app->system->exec_safe("su -c ? ?", $cmd, $installuser); - } - $app->log("Downloading the update file from: ".$software_update["update_url"], LOGLEVEL_DEBUG); - - //$url_parts = parse_url($software_update["update_url"]); - //$update_filename = basename($url_parts["path"]); - //* Find the name of the zip file which contains the app. - $tmp_dir_handle = dir($temp_dir); - $update_filename = ''; - while (false !== ($t = $tmp_dir_handle->read())) { - if($t != '.' && $t != '..' && is_file($temp_dir.'/'.$t) && substr($t, -4) == '.zip') { - $update_filename = $t; - } - } - $tmp_dir_handle->close(); - unset($tmp_dir_handle); - unset($t); - - if($update_filename == '') { - $app->log("No package file found. Download failed? Installation aborted.", LOGLEVEL_WARN); - $app->system->exec_safe("rm -rf ?", $temp_dir); - $app->log("Deleting the temp directory $temp_dir", LOGLEVEL_DEBUG); - $this->set_install_status($data["new"]["software_update_inst_id"], "failed"); - return false; - } - - $app->log("The update filename is $update_filename", LOGLEVEL_DEBUG); - - if(is_file($temp_dir.'/'.$update_filename)) { - - //* Checking the md5sum - if(md5_file($temp_dir.'/'.$update_filename) != $software_update["update_md5"]) { - $app->log("The md5 sum of the downloaded file is incorrect. Update aborted.", LOGLEVEL_WARN); - $app->system->exec_safe("rm -rf ", $temp_dir); - $app->log("Deleting the temp directory $temp_dir", LOGLEVEL_DEBUG); - $this->set_install_status($data["new"]["software_update_inst_id"], "failed"); - return false; - } else { - $app->log("MD5 checksum of the downloaded file verified.", LOGLEVEL_DEBUG); - } - - - //* unpacking the update - - if($installuser == '') { - $cmd = "cd ? && unzip ?"; - $app->system->exec_safe($cmd, $temp_dir, $update_filename); - } else { - $cmd = "cd $temp_dir && unzip $update_filename"; - $app->system->exec_safe("su -c ? ?", $cmd, $installuser); - } - - //* Create a database, if the package requires one - if($software_package['package_type'] == 'app' && $software_package['package_requires_db'] == 'mysql') { - - $app->uses('ini_parser'); - $package_config = $app->ini_parser->parse_ini_string(stripslashes($software_package['package_config'])); - - $this->create_app_db($package_config['mysql']); - $app->log("Creating the app DB.", LOGLEVEL_DEBUG); - - //* Load the sql dump into the database - if(is_file($temp_dir.'/setup.sql')) { - $db_config = $package_config['mysql']; - if( $db_config['database_user'] != '' && - $db_config['database_password'] != '' && - $db_config['database_name'] != '' && - $db_config['database_host'] != '') { - $app->system->exec_safe("mysql --default-character-set=utf8 --force -h ? -u ? ? < ?", $db_config['database_host'], $db_config['database_user'], $db_config['database_name'], $temp_dir.'/setup.sql'); - $app->log("Loading setup.sql dump into the app db.", LOGLEVEL_DEBUG); - } - } - - } - - //* Save the package config file as app.ini - if($software_package['package_config'] != '') { - file_put_contents($temp_dir.'/app.ini', $software_package['package_config']); - $app->log("Writing ".$temp_dir.'/app.ini', LOGLEVEL_DEBUG); - } - - if(is_file($temp_dir.'/setup.sh')) { - // Execute the setup script - $app->system->exec_safe('chmod +x ?', $temp_dir.'/setup.sh'); - $app->log("Executing setup.sh file in directory $temp_dir", LOGLEVEL_DEBUG); - - if($installuser == '') { - $cmd = 'cd ? && ./setup.sh > package_install.log'; - $app->system->exec_safe($cmd, $temp_dir); - } else { - $cmd = 'cd '.$temp_dir.' && ./setup.sh > package_install.log'; - $app->system->exec_safe("su -c ? ?", $cmd, $installuser); - } - - $log_data = @file_get_contents("{$temp_dir}/package_install.log"); - if(preg_match("'.*\[OK\]\s*$'is", $log_data)) { - $app->log("Installation successful", LOGLEVEL_DEBUG); - $app->log($log_data, LOGLEVEL_DEBUG); - $this->set_install_status($data["new"]["software_update_inst_id"], "installed"); - } else { - $app->log("Installation failed:\n\n" . $log_data, LOGLEVEL_WARN); - $this->set_install_status($data["new"]["software_update_inst_id"], "failed"); - } - } else { - $app->log("setup.sh file not found", LOGLEVEL_ERROR); - $this->set_install_status($data["new"]["software_update_inst_id"], "failed"); - } - } else { - $app->log("Download of the update file failed", LOGLEVEL_WARN); - $this->set_install_status($data["new"]["software_update_inst_id"], "failed"); - } - - if($temp_dir != '' && $temp_dir != '/') $app->system->exec_safe("rm -rf ?", $temp_dir); - $app->log("Deleting the temp directory $temp_dir", LOGLEVEL_DEBUG); - } - - private function create_app_db($db_config) { - global $app, $conf; - - if( $db_config['database_user'] != '' && - $db_config['database_password'] != '' && - $db_config['database_name'] != '' && - $db_config['database_host'] != '') { - - if(!include ISPC_LIB_PATH.'/mysql_clientdb.conf') { - $app->log('Unable to open'.ISPC_LIB_PATH.'/mysql_clientdb.conf', LOGLEVEL_ERROR); - return; - } - - if($db_config['database_user'] == 'root') { - $app->log('User root not allowed for App databases', LOGLEVEL_WARNING); - return; - } - - //* Connect to the database - $link = mysqli_connect($clientdb_host, $clientdb_user, $clientdb_password); - if (!$link) { - $app->log('Unable to connect to the database'.mysqli_connect_error(), LOGLEVEL_ERROR); - return; - } - - $query_charset_table = ''; - - //* Create the new database - if (mysqli_query($link,'CREATE DATABASE '.mysqli_real_escape_string($link, $db_config['database_name']).$query_charset_table, $link)) { - $app->log('Created MySQL database: '.$db_config['database_name'], LOGLEVEL_DEBUG); - } else { - $app->log('Unable to connect to the database'.mysqli_error($link), LOGLEVEL_ERROR); - } - - if(mysqli_query("GRANT ALL ON ".mysqli_real_escape_string($link, $db_config['database_name']).".* TO '".mysqli_real_escape_string($link, $db_config['database_user'])."'@'".$db_config['database_host']."' IDENTIFIED BY '".mysqli_real_escape_string($link, $db_config['database_password'])."';", $link)) { - $app->log('Created MySQL user: '.$db_config['database_user'], LOGLEVEL_DEBUG); - } else { - $app->log('Unable to create database user'.$db_config['database_user'].' '.mysqli_error($link), LOGLEVEL_ERROR); - } - - mysqli_close($link); - - } - } //* Operating system update diff --git a/server/plugins-available/webserver_plugin.inc.php b/server/plugins-available/webserver_plugin.inc.php index 0873826bde4de220e63b8533f965a7f08e511efd..bb884a6e2b18df73165965cab96a89fbde8cbed7 100644 --- a/server/plugins-available/webserver_plugin.inc.php +++ b/server/plugins-available/webserver_plugin.inc.php @@ -28,6 +28,13 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* compatibility for php < 5.5 (centos 7), remove when no longer needed */ +if(!function_exists("array_column")){ + function array_column($array,$column_name){ + return array_map(function($element) use($column_name){return $element[$column_name];}, $array); + } +} + class webserver_plugin { var $plugin_name = 'webserver_plugin'; @@ -37,8 +44,6 @@ class webserver_plugin { * This function is called during ispconfig installation to determine * if a symlink shall be created for this plugin. */ - - public function onInstall() { global $conf; @@ -56,7 +61,11 @@ class webserver_plugin { global $app; $app->plugins->registerAction('server_plugins_loaded', $this->plugin_name, 'check_phpini_changes'); + $app->plugins->registerEvent('server_update', $this->plugin_name, 'server_update'); + + $app->plugins->registerEvent('server_php_insert', $this->plugin_name, 'server_php_update'); + $app->plugins->registerEvent('server_php_update', $this->plugin_name, 'server_php_update'); } /** @@ -92,10 +101,6 @@ class webserver_plugin { 'mode' => 'mod', 'php_version' => 0); // default; - $check_files[] = array('file' => $web_config['php_ini_path_cgi'], - 'mode' => '', // all but 'mod' and 'fast-cgi' - 'php_version' => 0); // default; - if($fastcgi_config["fastcgi_phpini_path"] && $fastcgi_config["fastcgi_phpini_path"] != $web_config['php_ini_path_cgi']) { $check_files[] = array('file' => $fastcgi_config["fastcgi_phpini_path"], 'mode' => 'fast-cgi', @@ -106,6 +111,16 @@ class webserver_plugin { 'php_version' => 0); // default; } + $check_files[] = array('file' => $web_config['php_fpm_ini_path'], + 'mode' => 'php-fpm', + 'php_version' => 0); // default; + + if(!array_search($web_config['php_ini_path_cgi'], array_column($check_files, 'file'))) { + $check_files[] = array('file' => $web_config['php_ini_path_cgi'], + 'mode' => '', // all but 'mod' and 'fast-cgi' + 'php_version' => 0); // default; + } + //** read additional php versions of this server $php_versions = $app->db->queryAllRecords('SELECT server_php_id, php_fastcgi_ini_dir, php_fpm_ini_dir FROM server_php WHERE server_id = ?', $conf['server_id']); @@ -114,7 +129,8 @@ class webserver_plugin { $check_files[] = array('file' => $php['php_fastcgi_ini_dir'] . '/php.ini', 'mode' => 'fast-cgi', 'php_version' => $php['server_php_id']); - } elseif($php['php_fpm_ini_dir'] && $php['php_fpm_ini_dir'] . '/php.ini' != $web_config['php_ini_path_cgi']) { + } + if($php['php_fpm_ini_dir'] && $php['php_fpm_ini_dir'] . '/php.ini' != $web_config['php_fpm_ini_path']) { $check_files[] = array('file' => $php['php_fpm_ini_dir'] . '/php.ini', 'mode' => 'php-fpm', 'php_version' => $php['server_php_id']); @@ -134,6 +150,13 @@ class webserver_plugin { } if(!is_array($php_ini_md5)) $php_ini_md5 = array(); + // verify needed php file settings if that hasn't been done since 15 minutes + $now = time(); + $verify_php_ini=false; + if(!isset($php_ini_md5['last_verify_php_ini']) || ($now - intval($php_ini_md5['last_verify_php_ini']) > 15*60)) { + $verify_php_ini=true; + } + $processed = array(); foreach($check_files as $file) { $file_path = $file['file']; @@ -145,6 +168,11 @@ class webserver_plugin { if(in_array($ident, $processed) == true) continue; $processed[] = $ident; + //** check that needed php.ini settings/changes are made + if($verify_php_ini) { + $this->verify_php_ini($file); + } + //** check if md5sum of file changed $file_md5 = md5_file($file_path); if(array_key_exists($file_path, $php_ini_md5) == false || $php_ini_md5[$file_path] != $file_md5) { @@ -158,13 +186,62 @@ class webserver_plugin { $new_php_ini_md5[$file_path] = $file_md5; } + $new_php_ini_md5['last_verify_php_ini'] = time(); + //** write new md5 sums if something changed - if($php_ini_changed == true) $app->system->file_put_contents(SCRIPT_PATH . '/temp/php.ini.md5sum', base64_encode(serialize($new_php_ini_md5))); + if($php_ini_changed == true || $verify_php_ini == true) $app->system->file_put_contents(SCRIPT_PATH . '/temp/php.ini.md5sum', base64_encode(serialize($new_php_ini_md5))); unset($new_php_ini_md5); unset($php_ini_md5); unset($processed); } + /** + * The method runs each php.ini file through verify_php_ini() + */ + function server_php_update($event_name, $data) { + global $app, $conf; + + if(isset($data['new']['php_fastcgi_ini_dir'])) { + $php_ini = $data['new']['php_fastcgi_ini_dir'] . '/php.ini'; + if(file_exists($php_ini)) { + $this->verify_php_ini(array('file' => $php_ini, + 'mode' => 'fast-cgi', + 'php_version' => $data['new']['server_php_id']) + ); + } else { + $app->log("Cannot verify php.ini, file not found: $php_ini", LOGLEVEL_WARN); + } + } + if(isset($data['new']['php_fpm_ini_dir'])) { + $php_ini = $data['new']['php_fpm_ini_dir'] . '/php.ini'; + if(file_exists($php_ini)) { + $this->verify_php_ini(array('file' => $php_ini, + 'mode' => 'php-fpm', + 'php_version' => $data['new']['server_php_id']) + ); + } else { + $app->log("Cannot verify php.ini, file not found: $php_ini", LOGLEVEL_WARN); + } + } + } + + /** + * The method checks/sets needed php.ini settings + */ + public function verify_php_ini($file) { + global $app; + + if(isset($file['file']) && is_file($file['file'])) { + $php_ini = $file['file']; + // ensure opcache.validate_root = 1 + $app->system->exec_safe('grep ^opcache.validate_root ?', $php_ini); + if($app->system->last_exec_retcode() != 0) { + $app->log('verify_php_ini(): php.ini '.$php_ini.' is missing validate_root', LOGLEVEL_DEBUG); + $sed_script='s/; *opcache\.validate_root *= *.+$/opcache.validate_root = 1/g'; + $app->system->exec_safe('sed -E -i ? ?', $sed_script, $php_ini); + } + } + } /* * Checks for changes to jailkit settings in server config and schedules affected jails to be updated. @@ -245,7 +322,32 @@ class webserver_plugin { } } } + + $check_files = array(); + if ($old['php_ini_path_apache'] != $new['php_ini_path_apache']) { + $check_files[] = array('file' => $new['php_ini_path_apache'], + 'mode' => 'mod', + 'php_version' => 0); + } + + if ($old['fastcgi_phpini_path'] != $new['fastcgi_phpini_path']) { + $check_files[] = array('file' => $new['fastcgi_phpini_path'], + 'mode' => 'fast-cgi', + 'php_version' => 0); + } + if ($old['php_ini_path_cgi'] != $new['php_ini_path_cgi']) { + $check_files[] = array('file' => $new['php_ini_path_cgi'], + 'mode' => 'fast-cgi', + 'php_version' => 0); + } + if ($old['php_fpm_ini_path'] != $new['php_fpm_ini_path']) { + $check_files[] = array('file' => $web_config['php_fpm_ini_path'], + 'mode' => 'php-fpm', + 'php_version' => 0); + } + foreach ($check_files as $file) { + $this->verify_php_ini($file); + } } } -?> diff --git a/server/scripts/letsencrypt_renew_hook.sh b/server/scripts/letsencrypt_renew_hook.sh index 53fc31befd65af69b245347358de7f13c3938f6b..5ec9912f59d87728b83cf0fcd233b78146d2f456 100644 --- a/server/scripts/letsencrypt_renew_hook.sh +++ b/server/scripts/letsencrypt_renew_hook.sh @@ -12,8 +12,12 @@ ## If you need a custom hook file, create a file with the same name in ## /usr/local/ispconfig/server/conf-custom/scripts/ +## +## End the file with 'return 124' to signal that this script should not terminate. if [ -e "/usr/local/ispconfig/server/conf-custom/scripts/letsencrypt_renew_hook.sh" ] ; then - . /usr/local/ispconfig/server/conf-custom/scripts/letsencrypt_renew_hook.sh && exit 0 || exit 1; + . /usr/local/ispconfig/server/conf-custom/scripts/letsencrypt_renew_hook.sh + ret=$? + if [ $ret != 124 ]; then exit $ret; fi fi hostname=$(hostname -f) @@ -32,15 +36,15 @@ if [ -d "$lelive" ]; then pureftpdpem=/etc/ssl/private/pure-ftpd.pem; if [ -e "$pureftpdpem" ]; then chmod 600 $pureftpdpem; fi # For Red Hat, Centos or derivatives if which yum &> /dev/null 2>&1 ; then - if [ rpm -q pure-ftpd ]; then service pure-ftpd restart; fi - if [ rpm -q monit ]; then service monit restart; fi - if [ rpm -q postfix ]; then service postfix restart; fi - if [ rpm -q dovecot ]; then service dovecot restart; fi - if [ rpm -q mysql-server ]; then service mysqld restart; fi - if [ rpm -q mariadb-server ]; then service mariadb restart; fi - if [ rpm -q MariaDB-server ]; then service mysql restart; fi - if [ rpm -q nginx ]; then service nginx restart; fi - if [ rpm -q httpd ]; then service httpd restart; fi + if ( rpm -q pure-ftpd ); then service pure-ftpd restart; fi + if ( rpm -q monit ); then service monit restart; fi + if ( rpm -q postfix ); then service postfix restart; fi + if ( rpm -q dovecot ); then service dovecot restart; fi + if ( rpm -q mysql-server ); then service mysqld restart; fi + if ( rpm -q mariadb-server ); then service mariadb restart; fi + if ( rpm -q MariaDB-server ); then service mysql restart; fi + if ( rpm -q nginx ); then service nginx restart; fi + if ( rpm -q httpd ); then service httpd restart; fi # For Debian, Ubuntu or derivatives elif apt-get -v >/dev/null 2>&1 ; then if [ $(dpkg-query -W -f='${Status}' pure-ftpd-mysql 2>/dev/null | grep -c "ok installed") -eq 1 ]; then service pure-ftpd-mysql restart; fi @@ -52,4 +56,4 @@ if [ -d "$lelive" ]; then if [ $(dpkg-query -W -f='${Status}' nginx 2>/dev/null | grep -c "ok installed") -eq 1 ]; then service nginx restart; fi if [ $(dpkg-query -W -f='${Status}' apache2 2>/dev/null | grep -c "ok installed") -eq 1 ]; then service apache2 restart; fi fi -else echo `/bin/date` "Your Lets Encrypt SSL certs path for your ISPConfig server FQDN is missing.$line" >> /var/log/ispconfig/ispconfig.log; fi \ No newline at end of file +else echo `/bin/date` "Your Lets Encrypt SSL certs path for your ISPConfig server FQDN is missing.$line" >> /var/log/ispconfig/ispconfig.log; fi diff --git a/server/scripts/update_runner.sh b/server/scripts/update_runner.sh index 5647272f3a4831ea661aa2b064d49db710de641b..f3eb684328875efb4fc03ee0cdd45bc16afc885d 100644 --- a/server/scripts/update_runner.sh +++ b/server/scripts/update_runner.sh @@ -26,7 +26,7 @@ if [[ "$SOURCE" == "stable" ]] ; then elif [[ "$SOURCE" == "nightly" ]] ; then URL="https://www.ispconfig.org/downloads/ISPConfig-3-nightly.tar.gz" elif [[ "$SOURCE" == "git-develop" ]] ; then - URL="https://git.ispconfig.org/ispconfig/ispconfig3/repository/archive.tar.gz?ref=develop" + URL="https://git.ispconfig.org/ispconfig/ispconfig3/-/archive/develop/ispconfig3-develop.tar.gz" else echo "Please choose an installation source (stable, nightly, git-develop)" exit 1 @@ -40,19 +40,23 @@ cd /tmp if [ -n "${_UPD}" ] then { + save_umask=`umask` umask 0077 \ && tmpdir=`mktemp -dt "$(basename $0).XXXXXXXXXX"` \ && test -d "${tmpdir}" \ && cd "${tmpdir}" + umask $save_umask } || { echo 'mktemp failed' exit 1 } - wget -O ISPConfig-3.tar.gz "${URL}" + echo "Downloading ISPConfig update." + wget -q -O ISPConfig-3.tar.gz "${URL}" if [ -f ISPConfig-3.tar.gz ] then - tar xvzf ISPConfig-3.tar.gz --strip-components=1 + echo "Unpacking ISPConfig update." + tar xzf ISPConfig-3.tar.gz --strip-components=1 cd install/ php -q \ -d disable_classes= \