diff --git a/.git-scripts/syntax.sh b/.git-scripts/syntax.sh new file mode 100644 index 0000000000000000000000000000000000000000..d66022c7c3b004b711e5e22a1b7c86aadd0ab204 --- /dev/null +++ b/.git-scripts/syntax.sh @@ -0,0 +1,67 @@ +#!/bin/bash + +IFS=$'\n' +EX=0 +ERRS="" ; +WARNS="" ; +ERRCNT=0 ; +WARNCNT=0 ; + +OUTCNT=0 ; +FILECNT=0 ; +DONECNT=0 ; + +CMD="find . -type f \( -name \"*.php\" -o -name \"*.lng\" \) -print" ; + +if [[ "$1" == "commit" ]] ; then + CMD="git diff-tree --no-commit-id --name-only -r ${CI_COMMIT_SHA} | grep -E '\.(php|lng)$'" ; +fi + +FILECNT=$(eval "${CMD} | wc -l") ; + +for F in $(eval "$CMD") ; do + if [[ ! -e "${F}" || ! -f "${F}" ]] ; then + continue ; + fi + R=$(php -d error_reporting=E_ALL -d display_errors=On -l "$F" 2>/dev/null) ; + RET=$? ; + R=$(echo "${R}" | sed "/^$/d") + if [ $RET -gt 0 ] ; then + EX=1 ; + echo -n "E" ; + ERRS="${ERRS}${F}:"$'\n'"${R}"$'\n\n' ; + ERRCNT=$((ERRCNT + 1)) ; + else + if [[ "$R" == "Deprecated: "* ]] ; then + echo -n "W" ; + WARNS="${WARNS}${F}:"$'\n'"${R}"$'\n\n' ; + WARNCNT=$((WARNCNT + 1)) ; + else + echo -n "." ; + fi + fi + OUTCNT=$((OUTCNT + 1)) ; + DONECNT=$((DONECNT + 1)) ; + if [ $OUTCNT -ge 40 ] ; then + OUTCNT=0 ; + echo "[${DONECNT}/${FILECNT}]" ; + fi +done + +echo "" +echo "--------------------------"; +echo "${DONECNT} Files done" +echo "${ERRCNT} Errors" +if [ $ERRCNT -gt 0 ] ; then + echo "${ERRS}" + echo "" +fi + +echo "${WARNCNT} Warnings" +if [ $WARNCNT -gt 0 ] ; then + echo "" + echo "${WARNS}" + echo "" +fi + +exit $EX diff --git a/.gitignore b/.gitignore index d42aee61f4caf9d716977a21353bf598c3092220..c49a12edc170f56db2006f682b46e8ab5401beef 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +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 736fbc308301184948c0984579fafe4306bd6f1d..75301f8723fa7f08c2bc1e39c9942ec806827a9f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,6 +1,9 @@ # Defines stages which are to be executed stages: - syntax + - syntax_diff + - test + - build # ### Stage syntax @@ -8,15 +11,94 @@ stages: syntax:lint: stage: syntax - image: bobey/docker-gitlab-ci-runner-php7 + image: edbizarro/gitlab-ci-pipeline-php:7.2 allow_failure: false only: - schedules - web + - merge_requests + - /^\d+\.\d+\.\d+(p\d+)?$/ script: - - composer require overtrue/phplint - echo "Syntax checking PHP files" - - echo "For more information http://www.icosaedro.it/phplint/" - - vendor/bin/phplint + - bash ./.git-scripts/syntax.sh + +syntax_diff:lint: + stage: syntax + image: edbizarro/gitlab-ci-pipeline-php:7.2 + allow_failure: false + only: + - web + - pushes + - branches + + except: + - schedules + - web + - merge_requests + - /^\d+\.\d+\.\d+(p\d+)?$/ + + script: + - echo "Syntax checking PHP files" + - bash ./.git-scripts/syntax.sh commit + +#syntax:lint: +# stage: syntax +# image: edbizarro/gitlab-ci-pipeline-php:7.2 +# allow_failure: false +# only: +# - schedules +# - web +# - merge_requests +# +# script: +# - composer require overtrue/phplint +# - echo "Syntax checking PHP files" +# - echo "For more information http://www.icosaedro.it/phplint/" +# - vendor/bin/phplint + + +#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/,' --mode='0775' ./* || 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 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? + -## correct behaviour -What should happen instead? +## Summary + -## 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 + + +## Environment +Server OS + version: (Debian 10/Ubuntu 20.04/CentOS 8/...) \ +ISPConfig version: (3.1.15p3/3.2.3/3.2dev/...) + +Software version of the related software: + ``` -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 `#`, e. g. #123 -if you have done a merge request already, please reference it by using `!`, e. g. !12 +## References +if you know of related bugs or feature requests, please reference them by using `#`, e. g. #6105 +if you have done a merge request already, please reference it by using `!`, 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/.phplint.yml b/.phplint.yml index 10fd2a25afd2045c793bba0fd59d188fbbb6edf6..438e3c238d86c5a049fc957e357400ef02cc67bb 100644 --- a/.phplint.yml +++ b/.phplint.yml @@ -1,5 +1,5 @@ path: ./ -jobs: 10 +jobs: 5 cache: .phplint-cache extensions: - php diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f6c528479a75f9dc20e4d7ea070b15d4e02c4be5..3a4a7de71fac0c761db397a24d37111979ada037 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,99 +1,319 @@ -# Which code branch to use +# Contributing to ISPConfig +ISPConfig is a open source project and community contributions are very welcome. To contribute, please stick to the guidelines. -The master branch is used for code (mostly new features) that shall go into the next major release (e.g. 3.2, 3.3 and so on). The stable branch (e.g. stable-3.1, stable-3.2) is the branch for the current intermediate and bugfix releases. Bugfixes shall be committed to the current stable branch and not the master branch. The stable branch is merged to the master automatically from time to time, please do not submit bugfixes a second time against the master. +This document is under development and will be continuously improved. + +# Issues +* Before opening a new issue, use the search function to check if there isn't a bug report / feature request already. +* If you are reporting a bug, please share your OS and PHP (CLI) version. +* 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. +* Give your branch a name, e. g. `6049-update-the-contributing-doc ` where 6049 is the issue number. + +# Merge requests +Please give your merge request a description that shortly states what it is about. Merge requests without a good title or with missing description will get delayed because it is more effort for us to check the meaning of the changes made. +Once again: Do not put multiple things into a single merge request. If you for example fix two issues where one affects apache and one mail users, use separate issues and separate merge requests. +You can group multiple issues in a single merge request if they have the same specific topic, e. g. if you have one issue stating that a language entry in mail users is missing and a second issue that a language entry for server config is missing, you can put both issues into a single branch and merge request. Be sure to include all issue ids (if multiple) into the merge request's description in this case. +* Open a issue for the bug you want to fix / the feature you want to implement +* After opening the issue, commit your changes to your branch +* Note the issue # in every commit +* Update the documentation (New devs will not have access to this. Please send a email to docs@ispconfig.org) +* Add translations for every language +* Use a short title +* Write a clear description - for example, when updating the contributing guidelines with issue #6049: \ +"Update of our contributing guidelines \ +Closes #6049" +* Please be aware that we are not able to accept merge request that do not stick to the coding guidelines. We need to insist on that to keep the code clean and maintainable. # Some guidelines for web development with php. ----------------------------------------------------- -* Unix Line Breaks Only, NO windows breaks please. -* Tabs to indent lines, NO spaces -* no accidental _ no spaces before or after -* error_reporting(E_ALL|E_STRICT), yep PHP 5 -* Magic quotes is gone, get used to it now. config = magic_quotes_gpc() Everything must be quoted -* Don't use ereg, split and other old function -> gone in PHP 5.4 -* Don't use features that are not supported in PHP 5.3, for compatibility with LTS OS releases, ISPConfig must support PHP 5.3+ -* Don't use shorttags. A Shorttag is always usw always use `uses() or $app->load() functions. * Classes for the server are located in server/lib/classes/ and loaded with $app->uses() or $app->load() functions. -* please mark any section that need review or work on with /* TODO: short description */ -* Make function / var names on the following way, first word lower, next word(s) first letter upper like. getFirstResult(); -* always a space but NO newline before opening braces, e. g. -``` -class abc { - public function cde() { - if($a == $b) { - return false; - } - } + +### Indentations + +Indentations are always done with tabs. Do **not** use spaces. +It is recommended to set your IDE to display tabs with a width of 4 spaces. + +### Variable and method / function names + +Methods and functions should always be written in camel-case. Variables and properties should always be lowercase instead. + +**Correct:** +```php +class MyClass { + private $issue_list = []; + + private function getMyValue() { + + } } ``` -* no spaces after function/method or control names, e. g. -``` -function abc($x, $y) { - if($condition == true) { - $x = 2; - } + +**Wrong:** +```php +class my_class { + private $IssueList = []; + + private function get_my_value() { + + } } ``` -and NOT + +### Blocks + +#### Curly braces + +Opening curly braces always have to be in the same line as the preceding condition. They are separated by a single space from the closing paranthesis. +Closing curly braces are always on a separate line after the last statement in the block. The only exception is a do-while block where the logic is inverted. + +Curly braces are **always** to be used. Do not leave them out, even if there is only a single statement in the corresponding block. + +**Correct:** +```php +if($variable === true) { + +} + +while($condition) { + +} + +do { + +} while($condition); ``` -function abc ($x, $y) { - if ( $condition == true ) { - - } + +**Wrong:** +```php +if($variable === true){ + +} + +if($variable === true) +{ + } + +if($variable === true) + $x = 'no braces'; + +while($condition) { } ``` -# Commenting style +#### Short style + +The short style of conditional assignments is allowed to be used, but it must not affect readability, e. g. they shall not be nested. + +**Allowed:** +```php +$a = 0; +if($condition === true) { + $a = 1; +} -The comments break down into the following types +$a = ($condition === true ? 1 : 0); ``` -// is uses for removing lines and debug dev etc -/* - is used to comment out blocks -*/ -/** is used to create documentaion - * thats over - * lines - */ +**Disallowed:** +```php +$x = ($condition === true ? ($further == 'foo' ? true : false) : true); ``` -If you need to block out a section then use + + +#### Spaces and paranthesis + +The rules for using spaces are: +- no space after `if`/`while` etc. and the following opening paranthesis +- single space after closing paranthesis and before opening curly brace +- no spaces at the end of a line +- no spaces after opening paranthesis and before closing paranthesis +- single space before and after comparators + +**Correct:** +```php +if($variable === $condition) { + +} + +while(($condition !== false || $condition2 === true) && $n <= 15) { + $n++; +} ``` -/* -function redundant_code(){ - something here + +**Wrong:** +```php +if ($variable===$condition) { + +} + +while(($condition!==false||$condition2===true))&&$n<=15){ + } -*/ ``` -To block out single lines use // and all // are assumed to be redundant test code and NOT comments -// print_r($foo); +#### Newlines inside of conditions + +Breaking up conditions into separate lines can be done if it positively affects readability. + +```php +if($condition === true && ($state === 'completed' || $state === 'pending') && ($processed_by !== null || $process_time < time())) { -Do not use the phpdoc on every function, eg +} ``` -/** -* Login a user -* @param string user username -* @param string password of user -*/ -function login($user, $pass){ - +can also be written as +```php +if($condition === true + && ($state === 'completed' || $state === 'pending') + && ($processed_by !== null || $process_time < time()) + ) { + } ``` -as this function is self-explaining, the following clean code will suffice +This must not be abused, e. g. the following is not allowed: + +```php +if($a == 1 + || $b == 2) { + + } ``` -function login($user, $pass){ - -} + +### Arrays + +#### Short syntax + +Please **do** use short array syntax. We have deprecated the old-style array syntax. + +**Correct**: +```php +$var = []; + +$var2 = [ + 'conf' => [ + 'setting1' => 'value1' + ] +]; ``` -# Where to store custom settings +**Wrong:** +```php +$var = array(); -## Interface settings +$var2 = array( + 'conf' => array( + 'setting1' => 'value1' + ) +); +``` + +#### Spaces and newlines + +When defining an empty array, both brackets shall be on the same line. When defining an array with values, the style depends on the values you are going to assign. + +##### List of values + +When defining an array with a list of values, e. g. numbers or names, they should be on the same line as the brackets without using new lines, as long as the line does not exceed a total number of characters of about 90. After each comma there has to be a single space. + +##### Nested array + +When defining a nested array onle the opening bracket is to be on the same line. The closing bracket has to be on a separate line indented by `tabs * level of array`. + +##### Examples + +```php +// empty array +$a = []; +// array with list of values +$array = [4, 3, 76, 12]; + +// array with long list of values +$array = [ + 'This is one entry', 'This is a second one', 'Another one', 'Further entries', 'foo', 'bar', 34, 42, $variable, // newline here for better readability + 'Next entry', 'the last entry' +]; + +// nested array +$array = [ + 'conf' => [ + 'level' => 1, + 'settings' => [ + 'window' => 'open', + 'door' => 'closed + ] + ] +]; +``` + +**Not-to-dos:** +```php +$array=[ +]; + +$array = [ + 1, + 4, + 35, + 23, + 345, + 11, + 221, + 'further', + '...' +]; + +$array=['conf'=>['settings'=>['window' => 'open', 'door' => 'closed]]]; +``` + +### Strings + +Whenever possible use single quotes `'` instead of double qoutes `"`. Try not to embedd variables in string. Concatenate them instead. + +**Correct:** +```php +// simple text +$var = 'This is a text'; + +// array index +$array['index'] = 'value'; + +// text with variables +$var = 'This is a text with ' . $value . ' values inside and at the end: ' . $sum_value; + +// dynamic array index +$idx = 'index' . $key; +$value = $array[$idx]; +``` + +**Wrong:** +```php +// simple text +$var = "This is a text"; + +// array index +$array["index"] = 'value'; + +// text with variables +$var = "This is a text with $value values inside and at the end: {$sum_value}"; + +// dynamic array index +$value = $array['index' . $key]; +$value = $array["index{$key}"]; +``` + +# Where to store custom settings +## Interface settings The recommended place to store global interface settings is the ini style global config system (see system.ini.master file in install/tpl/ to set defaults). The settings file gets stored inside the ispconfig database. Settings can be accessed with the function: @@ -109,7 +329,6 @@ fields to the file interface/web/admin/form/system_config.tform.php and the corr tempalte file in the templates subfolder of the admin module. ## Server settings - Server settings are stored in the ini style server config system (see server.ini.master template file) The settings file gets stored inside the ispconfig database in the server table. Settings can be accessed with the function $app->getconf->get_server_config(....) @@ -123,4 +342,4 @@ $web_config = $app->getconf->get_server_config($server_id,'web'); # Learn about the form validators There are form validators in interface/lib/classes/tform.inc.php to make validating forms easier. -Read about: REGEX,UNIQUE,NOTEMPTY,ISEMAIL,ISINT,ISPOSITIVE,ISIPV4,CUSTOM +Read about: REGEX,UNIQUE,NOTEMPTY,ISEMAIL,ISINT,ISPOSITIVE,ISIPV4,ISIPV6,ISIP,CUSTOM diff --git a/LICENSE b/LICENSE index 139b12fc1fcc916a8a9a604e292c6238cca759ef..5b4fffa24b95631ee35bc7210f7b23ecf12ff39b 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2007-2016, Till Brehm, ISPConfig UG +Copyright (c) 2007-2020, Till Brehm, ISPConfig UG All rights reserved. Redistribution and use in source and binary forms, with or without modification, @@ -22,4 +22,4 @@ 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. \ No newline at end of file +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/README.md b/README.md index 5c251c0e28949a84a7b3f41ea500a28d74812358..901cb2a7b9578ba22bd6fc066c2e7842cb2ca685 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,46 @@ # ISPConfig - Hosting Control Panel +![ISPConfig logo](https://www.ispconfig.org/wp-content/themes/ispconfig/images/ispconfig_logo.png "") \ +Development branch: [![pipeline status](https://git.ispconfig.org/ispconfig/ispconfig3/badges/develop/pipeline.svg)](https://git.ispconfig.org/ispconfig/ispconfig3/commits/develop) -Nightly (master): [![pipeline status](https://git.ispconfig.org/ispconfig/ispconfig3/badges/master/pipeline.svg)](https://git.ispconfig.org/ispconfig/ispconfig3/commits/master) -Stable branch: [![pipeline status](https://git.ispconfig.org/ispconfig/ispconfig3/badges/stable-3.1/pipeline.svg)](https://git.ispconfig.org/ispconfig/ispconfig3/commits/stable-3.1) - - +## Functions - Manage multiple servers from one control panel -- Web server management (Apache2 and nginx) -- Mail server management (with virtual mail users) -- DNS server management (BIND and MyDNS) +- Single server, multiserver and mirrored clusters. +- Webserver management +- Mailserver management +- DNS server management - Virtualization (OpenVZ) -- Administrator, reseller and client login -- Configuration mirroring and clusters -- Open Source software (BSD license) \ No newline at end of file +- Administrator, reseller, client and mailuser login +- Open Source software ([BSD license](LICENSE)) + +## Supported daemons +- 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[^1] +- Database: MariaDB and MySQL + +[^1]: not actively tested + +## Supported operating systems +- Debian 9 - 11, and testing +- Ubuntu 16.04 - 20.04 +- CentOS 7 and 8 + +## Auto-install script +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[^2] and Confixx 3). For more information, see https://www.ispconfig.org/add-ons/ispconfig-migration-tool/ + +[^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 read the contributing guidelines: [CONTRIBUTING.MD](CONTRIBUTING.md) + diff --git a/TODO.txt b/TODO.txt index 17f2a20ceb5c3e4cb8a4f9f0d10cabee190d4aaa..407d7d3d4f69cd09989ff599de031b7fd96ce310 100644 --- a/TODO.txt +++ b/TODO.txt @@ -1,4 +1,3 @@ +Please see our GitLab issues for feature requests and bug reports. -Please see issue tracker for feature requests and bug reports. - -http://git.ispconfig.org/ispconfig/ispconfig3/issues \ No newline at end of file +https://git.ispconfig.org/ispconfig/ispconfig3/issues diff --git a/docs/INSTALL.txt b/docs/INSTALL.txt index 5e49c4a4c89f714d8f0e119cf25faa72e40a98b9..c4cc7862ddb5d8f386acce23f3a03b693880fe44 100644 --- a/docs/INSTALL.txt +++ b/docs/INSTALL.txt @@ -1,6 +1,6 @@ The installation instructions for ISPConfig can be found here: -http://www.ispconfig.org/page/en/documentation.html +https://www.ispconfig.org/page/en/documentation.html diff --git a/docs/autoinstall_samples/autoinstall.conf_sample.php b/docs/autoinstall_samples/autoinstall.conf_sample.php index b5f3a577305e2780ae1c5de46138e08d72d53c6b..c8bf209f9fcb2d9284f2fed8b33f96091ec36496 100644 --- a/docs/autoinstall_samples/autoinstall.conf_sample.php +++ b/docs/autoinstall_samples/autoinstall.conf_sample.php @@ -13,6 +13,10 @@ $autoinstall['http_server'] = 'nginx'; // apache (default), nginx $autoinstall['ispconfig_port'] = '8080'; // default: 8080 $autoinstall['ispconfig_use_ssl'] = 'y'; // y (default), n $autoinstall['ispconfig_admin_password'] = 'admin'; // default: admin +$autoinstall['create_ssl_server_certs'] = 'y'; +$autoinstall['ignore_hostname_dns'] = 'n'; +$autoinstall['ispconfig_postfix_ssl_symlink'] = 'y'; +$autoinstall['ispconfig_pureftpd_ssl_symlink'] = 'y'; /* SSL Settings */ $autoinstall['ssl_cert_country'] = 'AU'; @@ -25,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'; @@ -52,6 +56,10 @@ $autoupdate['reconfigure_services'] = 'yes'; // yes (default), no $autoupdate['ispconfig_port'] = '8080'; // default: 8080 $autoupdate['create_new_ispconfig_ssl_cert'] = 'no'; // no (default), yes $autoupdate['reconfigure_crontab'] = 'yes'; // yes (default), no +$autoupdate['create_ssl_server_certs'] = 'y'; +$autoupdate['ignore_hostname_dns'] = 'n'; +$autoupdate['ispconfig_postfix_ssl_symlink'] = 'y'; +$autoupdate['ispconfig_pureftpd_ssl_symlink'] = 'y'; /* These are for service-detection (defaulting to old behaviour where alle changes were automatically accepted) */ $autoupdate['svc_detect_change_mail_server'] = 'yes'; // yes (default), no @@ -62,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/docs/autoinstall_samples/autoinstall.ini.sample b/docs/autoinstall_samples/autoinstall.ini.sample index 74523ffbc3fc152b1c82be92cd4067c95cc8d91d..bf47122074f5f097e3ab5da5fb5a9cdf8770a266 100644 --- a/docs/autoinstall_samples/autoinstall.ini.sample +++ b/docs/autoinstall_samples/autoinstall.ini.sample @@ -12,6 +12,10 @@ http_server=apache ispconfig_port=8080 ispconfig_use_ssl=y ispconfig_admin_password=admin +create_ssl_server_certs=y +ignore_hostname_dns=n +ispconfig_postfix_ssl_symlink=y +ispconfig_pureftpd_ssl_symlink=y [ssl_cert] ssl_cert_country=AU @@ -51,6 +55,10 @@ reconfigure_services=yes ispconfig_port=8080 create_new_ispconfig_ssl_cert=no reconfigure_crontab=yes +create_ssl_server_certs=y +ignore_hostname_dns=n +ispconfig_postfix_ssl_symlink=y +ispconfig_pureftpd_ssl_symlink=y ; These are for service-detection (defaulting to old behaviour where alle changes were automatically accepted) svc_detect_change_mail_server=yes diff --git a/docs/under_development/DEV_CHROOTED_DEBIAN_5.0.txt b/docs/under_development/DEV_CHROOTED_DEBIAN_5.0.txt index df220aaca068db1279864ef1f5809990528c17f2..f43167e6086cbfb8caf24ebcf2310a5efe614a72 100644 --- a/docs/under_development/DEV_CHROOTED_DEBIAN_5.0.txt +++ b/docs/under_development/DEV_CHROOTED_DEBIAN_5.0.txt @@ -96,7 +96,7 @@ echo "ChrootDir /var/www" > /etc/apache2/conf.d/mod_chroot.conf # Install ISPConfig cd /tmp -wget http://www.ispconfig.org/downloads/ISPConfig-3.0.1.4-beta-2.tar.gz +wget https://www.ispconfig.org/downloads/ISPConfig-3.0.1.4-beta-2.tar.gz tar xvfz ISPConfig-3.0.1.4-beta-2.tar.gz cd ispconfig3_install/install/ php -q install.php 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/helper_scripts/test_install_docker.sh b/helper_scripts/test_install_docker.sh new file mode 100755 index 0000000000000000000000000000000000000000..4de61c38957dff6ddd1ce9ae823ca93974cdcd18 --- /dev/null +++ b/helper_scripts/test_install_docker.sh @@ -0,0 +1,21 @@ +#!/bin/sh + +# This script is used from .gitlab-ci.yml to do an automated installation inside a docker container for testing. + +if [ -f /usr/local/ispconfig/interface/lib/config.inc.php ]; then + echo "Found an existing configfile, bailing out!" + exit 1 +fi + +mysql_install_db +service mysql start \ +&& echo "UPDATE mysql.user SET Password = PASSWORD('pass') WHERE User = 'root';" | mysql -u root \ +&& echo "UPDATE mysql.user SET plugin='mysql_native_password' where user='root';" | mysql -u root \ +&& echo "DELETE FROM mysql.user WHERE User='';" | mysql -u root \ +&& echo "DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');" | mysql -u root \ +&& echo "DROP DATABASE IF EXISTS test;" | mysql -u root \ +&& echo "DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%';" | mysql -u root \ +&& echo "FLUSH PRIVILEGES;" | mysql -u root +sed -i "s/^hostname=server1.example.com$/hostname=$HOSTNAME/g" /root/ispconfig3_install/install/autoinstall.ini + +service mysql start && php -q $CI_PROJECT_DIR/install/install.php --autoinstall=/root/ispconfig3_install/install/autoinstall.ini 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 221cc5d7c40cbaf72a014f61bdb2bb2947f646e8..f4a3c937baf7e1bcb42ae5701605458e1465a2af 100644 --- a/install/dist/conf/centos72.conf.php +++ b/install/dist/conf/centos72.conf.php @@ -96,6 +96,9 @@ $conf['web']['apps_vhost_servername'] = ''; $conf['web']['apps_vhost_user'] = 'ispapps'; $conf['web']['apps_vhost_group'] = 'ispapps'; +//* AWStats settings +$conf['awstats']['pl'] = '/usr/share/awstats/wwwroot/cgi-bin/awstats.pl'; + //* Fastcgi $conf['fastcgi']['fastcgi_phpini_path'] = '/etc/'; $conf['fastcgi']['fastcgi_starter_path'] = '/var/www/php-fcgi-scripts/[system_user]/'; @@ -221,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 new file mode 100644 index 0000000000000000000000000000000000000000..1a354d3644f0033739b79a8406ac9a2d188b7c41 --- /dev/null +++ b/install/dist/conf/centos80.conf.php @@ -0,0 +1,230 @@ + 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 @@ + 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 13fd2306543450d27d88f72319388f3ffe07abd8..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 @@ -101,7 +101,7 @@ $conf['web']['apps_vhost_group'] = 'ispapps'; //* Fastcgi $conf['fastcgi']['fastcgi_phpini_path'] = '/etc/php/7.0/cgi/'; $conf['fastcgi']['fastcgi_starter_path'] = '/var/www/php-fcgi-scripts/[system_user]/'; -$conf['fastcgi']['fastcgi_bin'] = '/usr/bin/php-cgi'; +$conf['fastcgi']['fastcgi_bin'] = '/usr/bin/php-cgi7.0'; //* Postfix $conf['postfix']['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 new file mode 100644 index 0000000000000000000000000000000000000000..0280959988e0a2a8ef4ad57d354580dd350aba17 --- /dev/null +++ b/install/dist/conf/fedora32.conf.php @@ -0,0 +1,232 @@ + diff --git a/install/dist/conf/fedora33.conf.php b/install/dist/conf/fedora33.conf.php new file mode 100644 index 0000000000000000000000000000000000000000..677731c01e20c4c184218777e3c6e55f1b303b5e --- /dev/null +++ b/install/dist/conf/fedora33.conf.php @@ -0,0 +1,232 @@ + 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..1252fc7a76fe8ea270cb2da0c1cf2f6bcd91b5b8 100644 --- a/install/dist/conf/gentoo.conf.php +++ b/install/dist/conf/gentoo.conf.php @@ -51,6 +51,8 @@ $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 @@ -63,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)); //* SuPHP $conf['suphp']['config_file'] = '/etc/suphp.conf'; @@ -80,7 +82,7 @@ $conf['apache']['installed'] = false; // will be detected automatically during i $conf['apache']['user'] = 'apache'; $conf['apache']['group'] = 'apache'; $conf['apache']['init_script'] = 'apache2'; -$conf['apache']['version'] = '2.2'; +$conf['apache']['version'] = '2.4'; $conf['apache']['config_dir'] = '/etc/apache2'; $conf['apache']['config_file'] = $conf['apache']['config_dir'] .'/httpd.conf'; $conf['apache']['ssl_dir'] = '/etc/ssl/apache2'; @@ -88,8 +90,8 @@ $conf['apache']['vhost_conf_dir'] = $conf['apache']['config_dir'] . '/vhosts.d'; $conf['apache']['vhost_conf_enabled_dir'] = $conf['apache']['vhost_conf_dir']; $conf['apache']['vhost_default'] = '00_default_vhost.conf'; $conf['apache']['vhost_port'] = '8080'; -$conf['apache']['php_ini_path_apache'] = '/etc/php/apache2-php5/php.ini'; -$conf['apache']['php_ini_path_cgi'] = '/etc/php/cgi-php5/php.ini'; +$conf['apache']['php_ini_path_apache'] = '/etc/php/apache2-php7.4/php.ini'; +$conf['apache']['php_ini_path_cgi'] = '/etc/php/cgi-php7.4/php.ini'; //* Website base settings $conf['web']['website_basedir'] = '/var/www'; @@ -110,7 +112,7 @@ $conf['awstats']['pl'] = '/usr/bin/awstats.pl'; $conf['awstats']['buildstaticpages_pl'] = '/usr/bin/awstats_buildstaticpages.pl'; //* Fastcgi -$conf['fastcgi']['fastcgi_phpini_path'] = '/etc/php/cgi-php5'; +$conf['fastcgi']['fastcgi_phpini_path'] = '/etc/php/cgi-php7.4'; $conf['fastcgi']['fastcgi_starter_path'] = '/var/www/php-fcgi-scripts/[system_user]/'; $conf['fastcgi']['fastcgi_bin'] = '/usr/bin/php-cgi'; @@ -131,6 +133,10 @@ $conf['mailman']['installed'] = false; // will be detected automatically during $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']['user'] = 'getmail'; @@ -176,6 +182,7 @@ $conf['pureftpd']['installed'] = false; // will be detected automatically during $conf['pureftpd']['config_file'] = '/etc/conf.d/pure-ftpd'; $conf['pureftpd']['mysql_config_file'] = '/etc/pureftpd-mysql.conf'; $conf['pureftpd']['init_script'] = 'pure-ftpd'; +$conf['pureftpd']['main_config_file'] = '/etc/pure-ftpd.conf'; //* MyDNS $conf['mydns']['installed'] = false; // will be detected automatically during installation @@ -226,6 +233,13 @@ $conf['nginx']['php_fpm_pool_dir'] = '/etc/php5/fpm/pool.d'; $conf['nginx']['php_fpm_start_port'] = 9010; $conf['nginx']['php_fpm_socket_dir'] = '/var/lib/php5-fpm'; +//* OpenVZ +$conf['openvz']['installed'] = false; + +//*Bastille-Firwall +$conf['bastille']['installed'] = false; +$conf['bastille']['config_dir'] = '/etc/Bastille'; + //* vlogger $conf['vlogger']['config_dir'] = '/etc/vlogger'; @@ -235,7 +249,12 @@ $conf['cron']['crontab_dir'] = '/etc/cron.d'; $conf['cron']['group'] = 'cron'; $conf['cron']['wget'] = '/usr/bin/wget'; -//* OpenVZ -$conf['openvz']['installed'] = false; +//* Metronome XMPP +$conf['xmpp']['installed'] = false; +$conf['xmpp']['init_script'] = 'metronome'; + +// 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 new file mode 100644 index 0000000000000000000000000000000000000000..72bf90d45eefb06f65a54ff05c28057f4e5c12f7 --- /dev/null +++ b/install/dist/conf/ubuntu2004.conf.php @@ -0,0 +1,238 @@ + diff --git a/interface/web/admin/software_package_del.php b/install/dist/lib/centos80.lib.php similarity index 65% rename from interface/web/admin/software_package_del.php rename to install/dist/lib/centos80.lib.php index e1387f39c43459b7261f1d90d19798a78c4a7d3e..3dcd7494d3326bd3618d229c950518e8c200f3e4 100644 --- a/interface/web/admin/software_package_del.php +++ b/install/dist/lib/centos80.lib.php @@ -1,7 +1,7 @@ auth->check_module_permissions('admin'); -$app->auth->check_security_permissions('admin_allow_software_packages'); -if($conf['demo_mode'] == true) $app->error('This function is disabled in demo mode.'); +class installer extends installer_centos { -// Check CSRF Token -$app->auth->csrf_token_check('GET'); - -$software_update_inst_id = $app->functions->intval($_GET['software_update_inst_id']); - -if($software_update_inst_id > 0) { - $app->db->datalogDelete('software_update_inst', 'software_update_inst_id', $software_update_inst_id); - //header('Location: admin/software_package_list.php'); - die('HEADER_REDIRECT: admin/software_package_list.php'); -} else { - die('Invalid ID'); + protected $clamav_socket = '/var/run/clamd.amavisd/clamd.sock'; + + // everything else is inherited from installer_centos class } - - - - - ?> 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 cc234f132e1fb4a66f4d7e5a1b13866617f4bd88..981e6cff92a70216656435bddb10a393f01dca54 100644 --- a/install/dist/lib/debian60.lib.php +++ b/install/dist/lib/debian60.lib.php @@ -33,17 +33,22 @@ class installer extends installer_base { public function configure_dovecot() { global $conf; - + $virtual_transport = 'dovecot'; $configure_lmtp = false; - + + // use lmtp if installed + if($configure_lmtp = (is_file('/usr/lib/dovecot/lmtp') || is_file('/usr/libexec/dovecot/lmtp'))) { + $virtual_transport = 'lmtp:unix:private/dovecot-lmtp'; + } + // check if virtual_transport must be changed if ($this->is_update) { $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; @@ -103,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) { @@ -118,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.'); @@ -138,10 +150,10 @@ class installer extends installer_base { } //remove #2.3+ comment $content = file_get_contents($config_dir.'/'.$configfile); - $content = str_replace('#2.3+','',$content); + $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 ='); @@ -154,12 +166,21 @@ class installer extends installer_base { copy('tpl/debian6_dovecot.conf.master', $config_dir.'/'.$configfile); } } - + + $dovecot_protocols = 'imap pop3'; + //* dovecot-lmtpd if($configure_lmtp) { - replaceLine($config_dir.'/'.$configfile, 'protocols = imap pop3', 'protocols = imap pop3 lmtp', 1, 0); + $dovecot_protocols .= ' lmtp'; } + //* dovecot-managesieved + if(is_file('/usr/lib/dovecot/managesieve') || is_file('/usr/libexec/dovecot/managesieve')) { + $dovecot_protocols .= ' sieve'; + } + + replaceLine($config_dir.'/'.$configfile, 'protocols = imap pop3', "protocols = $dovecot_protocols", 1, 0); + //* dovecot-sql.conf $configfile = 'dovecot-sql.conf'; if(is_file($config_dir.'/'.$configfile)){ @@ -182,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 3af8746908c796967f118a82f83dffda675667f2..71809ac81ea0ec084a5dfa83031e3bb2e7859da2 100644 --- a/install/dist/lib/fedora.lib.php +++ b/install/dist/lib/fedora.lib.php @@ -30,7 +30,7 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. class installer_dist extends installer_base { protected $mailman_group = 'mailman'; - + public function __construct() { //** check apache modules */ $mods = getapachemodules(); @@ -42,259 +42,9 @@ class installer_dist extends installer_base { swriteln($inst->lng(' AllowOverride None')); swriteln($inst->lng(' Require all denied')); swriteln($inst->lng(' '."\n")); - - swriteln($inst->lng(' If it uses the old syntax (deny from all) ISPConfig would fail to work.')); - } - } - - 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."); - } - - //* mysql-virtual_domains.cf - $this->process_postfix_config('mysql-virtual_domains.cf'); - - //* mysql-virtual_forwardings.cf - $this->process_postfix_config('mysql-virtual_forwardings.cf'); - - //* mysql-virtual_mailboxes.cf - $this->process_postfix_config('mysql-virtual_mailboxes.cf'); - - //* mysql-virtual_email2email.cf - $this->process_postfix_config('mysql-virtual_email2email.cf'); - - //* mysql-virtual_transports.cf - $this->process_postfix_config('mysql-virtual_transports.cf'); - - //* mysql-virtual_recipient.cf - $this->process_postfix_config('mysql-virtual_recipient.cf'); - - //* mysql-virtual_sender.cf - $this->process_postfix_config('mysql-virtual_sender.cf'); - - //* mysql-virtual_sender_login_maps.cf - $this->process_postfix_config('mysql-virtual_sender_login_maps.cf'); - - //* mysql-virtual_client.cf - $this->process_postfix_config('mysql-virtual_client.cf'); - - //* mysql-virtual_relaydomains.cf - $this->process_postfix_config('mysql-virtual_relaydomains.cf'); - - //* mysql-virtual_relayrecipientmaps.cf - $this->process_postfix_config('mysql-virtual_relayrecipientmaps.cf'); - - //* mysql-virtual_outgoing_bcc.cf - $this->process_postfix_config('mysql-virtual_outgoing_bcc.cf'); - - //* mysql-virtual_policy_greylist.cf - $this->process_postfix_config('mysql-virtual_policy_greylist.cf'); - - //* mysql-virtual_gids.cf.master - $this->process_postfix_config('mysql-virtual_gids.cf'); - - //* mysql-virtual_uids.cf - $this->process_postfix_config('mysql-virtual_uids.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); - - //* Changing mode and group of the new created config files. - caselog('chmod o= '.$config_dir.'/mysql-virtual_*.cf* &> /dev/null', - __FILE__, __LINE__, 'chmod on mysql-virtual_*.cf*', 'chmod on mysql-virtual_*.cf* failed'); - caselog('chgrp '.$cf['group'].' '.$config_dir.'/mysql-virtual_*.cf* &> /dev/null', - __FILE__, __LINE__, 'chgrp on mysql-virtual_*.cf*', 'chgrp on mysql-virtual_*.cf* failed'); - - //* 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 = ''; - if(isset($server_ini_array['mail']['reject_sender_login_mismatch']) && ($server_ini_array['mail']['reject_sender_login_mismatch'] == 'y')) { - $reject_sender_login_mismatch = ', reject_authenticated_sender_login_mismatch'; - } - unset($server_ini_array); - - $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, - ); - - $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'); - - //* 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.'~'); + swriteln($inst->lng(' If it uses the old syntax (deny from all) ISPConfig would fail to work.')); } - $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() { @@ -368,13 +118,18 @@ class installer_dist extends installer_base { $virtual_transport = 'dovecot'; $configure_lmtp = false; - + + // use lmtp if installed + if($configure_lmtp = (is_file('/usr/lib/dovecot/lmtp') || is_file('/usr/libexec/dovecot/lmtp'))) { + $virtual_transport = 'lmtp:unix:private/dovecot-lmtp'; + } + // check if virtual_transport must be changed if ($this->is_update) { $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; @@ -452,7 +207,7 @@ class installer_dist 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.'); @@ -475,7 +230,7 @@ class installer_dist 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 ='); @@ -502,7 +257,7 @@ class installer_dist extends installer_base { copy("$config_dir/$configfile", "$config_dir/$configfile~"); exec("chmod 400 $config_dir/$configfile~"); } - + if(!@file_exists('/etc/dovecot-sql.conf')) exec('ln -s /etc/dovecot/dovecot-sql.conf /etc/dovecot-sql.conf'); $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/fedora_dovecot-sql.conf.master', "tpl/fedora_dovecot-sql.conf.master"); @@ -520,7 +275,7 @@ class installer_dist extends installer_base { exec("chmod 600 $config_dir/$configfile"); exec("chown root:root $config_dir/$configfile"); - + // Dovecot shall ignore mounts in website directory if(is_installed('doveadm')) exec("doveadm mount add '/var/www/*' ignore > /dev/null 2> /dev/null"); @@ -543,12 +298,12 @@ class installer_dist extends installer_base { $content = str_replace('{amavis_config_dir}', $conf['amavis']['config_dir'], $content); wf($conf["amavis"]["config_dir"].'/amavisd.conf', $content); chmod($conf['amavis']['config_dir'].'/amavisd.conf', 0640); - + if(!is_file($conf['amavis']['config_dir'].'/60-dkim')) { touch($conf['amavis']['config_dir'].'/60-dkim'); chmod($conf['amavis']['config_dir'].'/60-dkim', 0640); } - + // for CentOS 7.2 only if($dist['confid'] == 'centos72') { chmod($conf['amavis']['config_dir'].'/amavisd.conf', 0750); @@ -575,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); @@ -752,16 +504,16 @@ class installer_dist extends installer_base { $tpl = new tpl('apache_ispconfig.conf.master'); $tpl->setVar('apache_version',getapacheversion()); - + if($this->is_update == true) { $tpl->setVar('logging',get_logging_state()); } else { $tpl->setVar('logging','yes'); } - + $records = $this->db->queryAllRecords("SELECT * FROM ?? WHERE server_id = ? AND virtualhost = 'y'", $conf['mysql']['master_database'] . '.server_ip', $conf['server_id']); $ip_addresses = array(); - + if(is_array($records) && count($records) > 0) { foreach($records as $rec) { if($rec['ip_type'] == 'IPv6') { @@ -780,7 +532,7 @@ class installer_dist extends installer_base { } } } - + if(count($ip_addresses) > 0) $tpl->setLoop('ip_adresses',$ip_addresses); wf($vhost_conf_dir.'/ispconfig.conf', $tpl->grab()); @@ -843,7 +595,7 @@ class installer_dist extends installer_base { //* add a sshusers group $command = 'groupadd sshusers'; if(!is_group('sshusers')) caselog($command.' &> /dev/null 2> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - + // add anonymized log option to nginxx.conf file $nginx_conf_file = $conf['nginx']['config_dir'].'/nginx.conf'; if(is_file($nginx_conf_file)) { @@ -853,7 +605,7 @@ class installer_dist extends installer_base { replaceLine($nginx_conf_file, 'http {', "http {\n\n".file_get_contents('tpl/nginx_anonlog.master'), 0, 0); } } - + } public function configure_bastille_firewall() @@ -946,31 +698,20 @@ class installer_dist extends installer_base { //* copy the ISPConfig server part $command = "cp -rf ../server $install_dir"; caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - + //* Make a backup of the security settings if(is_file('/usr/local/ispconfig/security/security_settings.ini')) copy('/usr/local/ispconfig/security/security_settings.ini','/usr/local/ispconfig/security/security_settings.ini~'); - + //* copy the ISPConfig security part $command = 'cp -rf ../security '.$install_dir; caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - - //* Apply changed security_settings.ini values to new security_settings.ini file - if(is_file('/usr/local/ispconfig/security/security_settings.ini~')) { - $security_settings_old = ini_to_array(file_get_contents('/usr/local/ispconfig/security/security_settings.ini~')); - $security_settings_new = ini_to_array(file_get_contents('/usr/local/ispconfig/security/security_settings.ini')); - if(is_array($security_settings_new) && is_array($security_settings_old)) { - foreach($security_settings_new as $section => $sval) { - if(is_array($sval)) { - foreach($sval as $key => $val) { - if(isset($security_settings_old[$section]) && isset($security_settings_old[$section][$key])) { - $security_settings_new[$section][$key] = $security_settings_old[$section][$key]; - } - } - } - } - file_put_contents('/usr/local/ispconfig/security/security_settings.ini',array_to_ini($security_settings_new)); - } + + $configfile = 'security_settings.ini'; + if(is_file($install_dir.'/security/'.$configfile)) { + copy($install_dir.'/security/'.$configfile, $install_dir.'/security/'.$configfile.'~'); } + $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master', 'tpl/'.$configfile.'.master'); + wf($install_dir.'/security/'.$configfile, $content); //* Create a symlink, so ISPConfig is accessible via web // Replaced by a separate vhost definition for port 8080 @@ -1111,15 +852,15 @@ class installer_dist extends installer_base { //* chown the interface files to the ispconfig user and group $command = 'chown -R ispconfig:ispconfig '.$install_dir.'/interface'; caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - + //* chown the server files to the root user and group $command = 'chown -R root:root '.$install_dir.'/server'; caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - + //* chown the security files to the root user and group $command = 'chown -R root:root '.$install_dir.'/security'; caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - + //* chown the security directory and security_settings.ini to root:ispconfig $command = 'chown root:ispconfig '.$install_dir.'/security/security_settings.ini'; caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); @@ -1174,12 +915,12 @@ class installer_dist extends installer_base { exec("chmod 600 $install_dir/server/lib/mysql_clientdb.conf"); exec("chown root:root $install_dir/server/lib/mysql_clientdb.conf"); } - + if(is_dir($install_dir.'/interface/invoices')) { exec('chmod -R 770 '.escapeshellarg($install_dir.'/interface/invoices')); exec('chown -R ispconfig:ispconfig '.escapeshellarg($install_dir.'/interface/invoices')); } - + exec('chown -R root:root /usr/local/ispconfig/interface/ssl'); // TODO: FIXME: add the www-data user to the ispconfig group. This is just for testing @@ -1207,10 +948,10 @@ class installer_dist extends installer_base { caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); if ($this->install_ispconfig_interface == true && isset($conf['interface_password']) && $conf['interface_password']!='admin') { - $sql = "UPDATE sys_user SET passwort = md5(?) WHERE username = 'admin';"; - $this->db->query($sql, $conf['interface_password']); + $sql = "UPDATE sys_user SET passwort = ? WHERE username = 'admin';"; + $this->db->query($sql, $this->crypt_password($conf['interface_password'])); } - + if($conf['apache']['installed'] == true && $this->install_ispconfig_interface == true){ //* Copy the ISPConfig vhost for the controlpanel // TODO: These are missing! should they be "vhost_dist_*_dir" ? @@ -1239,7 +980,7 @@ class installer_dist extends installer_base { } else { $tpl->setVar('ssl_bundle_comment','#'); } - + $tpl->setVar('apache_version',getapacheversion()); wf($vhost_conf_dir.'/ispconfig.vhost', $tpl->grab()); @@ -1252,24 +993,16 @@ class installer_dist extends installer_base { exec("ln -s $vhost_conf_dir/ispconfig.vhost $vhost_conf_enabled_dir/000-ispconfig.vhost"); } - /* - exec('mkdir -p /var/www/php-fcgi-scripts/ispconfig'); - exec('cp tpl/apache_ispconfig_fcgi_starter.master /var/www/php-fcgi-scripts/ispconfig/.php-fcgi-starter'); - exec('chmod +x /var/www/php-fcgi-scripts/ispconfig/.php-fcgi-starter'); - exec('ln -s /usr/local/ispconfig/interface/web /var/www/ispconfig'); - exec('chown -R ispconfig:ispconfig /var/www/php-fcgi-scripts/ispconfig'); - - replaceLine('/var/www/php-fcgi-scripts/ispconfig/.php-fcgi-starter','PHPRC=','PHPRC=/etc/',0,0); - */ - //if(!is_file('/var/www/php-fcgi-scripts/ispconfig/.php-fcgi-starter')) { $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/apache_ispconfig_fcgi_starter.master', 'tpl/apache_ispconfig_fcgi_starter.master'); $content = str_replace('{fastcgi_bin}', $conf['fastcgi']['fastcgi_bin'], $content); $content = str_replace('{fastcgi_phpini_path}', $conf['fastcgi']['fastcgi_phpini_path'], $content); if(!is_dir('/var/www/php-fcgi-scripts/ispconfig')) exec('mkdir -p /var/www/php-fcgi-scripts/ispconfig'); + $this->set_immutable('/var/www/php-fcgi-scripts/ispconfig/.php-fcgi-starter', false); wf('/var/www/php-fcgi-scripts/ispconfig/.php-fcgi-starter', $content); exec('chmod +x /var/www/php-fcgi-scripts/ispconfig/.php-fcgi-starter'); if(!is_link('/var/www/ispconfig')) exec('ln -s /usr/local/ispconfig/interface/web /var/www/ispconfig'); exec('chown -R ispconfig:ispconfig /var/www/php-fcgi-scripts/ispconfig'); + $this->set_immutable('/var/www/php-fcgi-scripts/ispconfig/.php-fcgi-starter', true); //} //} } @@ -1360,6 +1093,7 @@ class installer_dist extends installer_base { //* Create the ispconfig log directory if(!is_dir($conf['ispconfig_log_dir'])) mkdir($conf['ispconfig_log_dir']); if(!is_file($conf['ispconfig_log_dir'].'/ispconfig.log')) exec('touch '.$conf['ispconfig_log_dir'].'/ispconfig.log'); + chmod($conf['ispconfig_log_dir'].'/ispconfig.log', 0600); if(is_user('getmail')) { exec('mv /usr/local/ispconfig/server/scripts/run-getmail.sh /usr/local/bin/run-getmail.sh'); @@ -1384,10 +1118,10 @@ class installer_dist extends installer_base { //* Remove Domain module as its functions are available in the client module now if(@is_dir('/usr/local/ispconfig/interface/web/domain')) exec('rm -rf /usr/local/ispconfig/interface/web/domain'); - + // Add symlink for patch tool if(!is_link('/usr/local/bin/ispconfig_patch')) exec('ln -s /usr/local/ispconfig/server/scripts/ispconfig_patch /usr/local/bin/ispconfig_patch'); - + // Change mode of a few files from amavisd if(is_file($conf['amavis']['config_dir'].'/conf.d/50-user')) chmod($conf['amavis']['config_dir'].'/conf.d/50-user', 0640); if(is_file($conf['amavis']['config_dir'].'/50-user~')) chmod($conf['amavis']['config_dir'].'/50-user~', 0400); diff --git a/install/dist/lib/fedora32.lib.php b/install/dist/lib/fedora32.lib.php new file mode 100644 index 0000000000000000000000000000000000000000..3dcd7494d3326bd3618d229c950518e8c200f3e4 --- /dev/null +++ b/install/dist/lib/fedora32.lib.php @@ -0,0 +1,40 @@ + diff --git a/install/dist/lib/fedora33.lib.php b/install/dist/lib/fedora33.lib.php new file mode 100644 index 0000000000000000000000000000000000000000..3dcd7494d3326bd3618d229c950518e8c200f3e4 --- /dev/null +++ b/install/dist/lib/fedora33.lib.php @@ -0,0 +1,40 @@ + diff --git a/install/dist/lib/gentoo.lib.php b/install/dist/lib/gentoo.lib.php index 5bb0d9df1966347d54e9dd1b39d62dc462977560..c98788e33cc60a3151c277ef4fd57fb360ee21c8 100644 --- a/install/dist/lib/gentoo.lib.php +++ b/install/dist/lib/gentoo.lib.php @@ -63,6 +63,9 @@ class installer extends installer_base $this->process_postfix_config( basename($filename, '.master') ); } + //* mysql-verify_recipients.cf + $this->process_postfix_config('mysql-verify_recipients.cf'); + //* Changing mode and group of the new created config files. caselog('chmod o= '.$config_dir.'/mysql-virtual_*.cf* &> /dev/null', __FILE__, __LINE__, 'chmod on mysql-virtual_*.cf*', 'chmod on mysql-virtual_*.cf* failed'); @@ -100,13 +103,31 @@ class installer extends installer_base 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_authenticated_sender_login_mismatch'; + $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'], @@ -114,6 +135,11 @@ class installer extends installer_base '{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/gentoo_postfix.conf.master', 'tpl/gentoo_postfix.conf.master'); @@ -134,6 +160,7 @@ class installer extends installer_base touch($config_dir.'/mime_header_checks'); touch($config_dir.'/nested_header_checks'); touch($config_dir.'/body_checks'); + touch($config_dir.'/sasl_passwd'); //* Create auxillary postfix conf files $configfile = 'helo_access'; @@ -277,13 +304,13 @@ class installer extends installer_base $virtual_transport = 'dovecot'; $configure_lmtp = false; - + // check if virtual_transport must be changed if ($this->is_update) { $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; @@ -338,6 +365,11 @@ class installer extends installer_base replaceLine($config_dir.'/'.$configfile, 'protocols = imap pop3', 'protocols = imap pop3 lmtp', 1, 0); } + //* Get the dovecot version + exec('dovecot --version', $tmp); + $dovecot_version = $tmp[0]; + unset($tmp); + //* dovecot-sql.conf $configfile = $config_dir.'/dovecot-sql.conf'; $content = $this->get_template_file('debian_dovecot-sql.conf', true, true); @@ -412,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'); @@ -477,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); } @@ -499,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'); } @@ -602,16 +637,16 @@ class installer extends installer_base //* Copy the ISPConfig configuration include $tpl = new tpl('apache_ispconfig.conf.master'); $tpl->setVar('apache_version',getapacheversion()); - + if($this->is_update == true) { $tpl->setVar('logging',get_logging_state()); } else { $tpl->setVar('logging','yes'); } - + $records = $this->db->queryAllRecords("SELECT * FROM ?? WHERE server_id = ? AND virtualhost = 'y'", $conf['mysql']['master_database'] . '.server_ip', $conf['server_id']); $ip_addresses = array(); - + if(is_array($records) && count($records) > 0) { foreach($records as $rec) { if($rec['ip_type'] == 'IPv6') { @@ -630,7 +665,7 @@ class installer extends installer_base } } } - + if(count($ip_addresses) > 0) $tpl->setLoop('ip_adresses',$ip_addresses); wf($conf['apache']['vhost_conf_dir'].'/000-ispconfig.conf', $tpl->grab()); @@ -727,10 +762,11 @@ class installer extends installer_base $content = str_replace('{fastcgi_phpini_path}', $conf['fastcgi']['fastcgi_phpini_path'], $content); mkdir($conf['web']['website_basedir'].'/php-fcgi-scripts/apps', 0755, true); //copy('tpl/apache_apps_fcgi_starter.master',$conf['web']['website_basedir'].'/php-fcgi-scripts/apps/.php-fcgi-starter'); + $this->set_immutable($conf['web']['website_basedir'].'/php-fcgi-scripts/apps/.php-fcgi-starter', false); wf($conf['web']['website_basedir'].'/php-fcgi-scripts/apps/.php-fcgi-starter', $content); exec('chmod +x '.$conf['web']['website_basedir'].'/php-fcgi-scripts/apps/.php-fcgi-starter'); exec('chown -R ispapps:ispapps '.$conf['web']['website_basedir'].'/php-fcgi-scripts/apps'); - + $this->set_immutable($conf['web']['website_basedir'].'/php-fcgi-scripts/apps/.php-fcgi-starter', true); //} } if($conf['nginx']['installed'] == true){ @@ -783,11 +819,11 @@ class installer extends installer_base //$content = str_replace('{fpm_port}', ($conf['nginx']['php_fpm_start_port']+1), $content); $content = str_replace('{fpm_socket}', $fpm_socket, $content); $content = str_replace('{cgi_socket}', $cgi_socket, $content); - + // SSL in apps vhost is off by default. Might change later. $content = str_replace('{ssl_on}', 'ssl', $content); $content = str_replace('{ssl_comment}', '#', $content); - + wf($vhost_conf_dir.'/apps.vhost', $content); // PHP-FPM @@ -843,14 +879,14 @@ class installer extends installer_base //* copy the ISPConfig server part $command = "cp -rf ../server $install_dir"; caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - + //* Make a backup of the security settings if(is_file('/usr/local/ispconfig/security/security_settings.ini')) copy('/usr/local/ispconfig/security/security_settings.ini','/usr/local/ispconfig/security/security_settings.ini~'); - + //* copy the ISPConfig security part $command = 'cp -rf ../security '.$install_dir; caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - + //* Apply changed security_settings.ini values to new security_settings.ini file if(is_file('/usr/local/ispconfig/security/security_settings.ini~')) { $security_settings_old = ini_to_array(file_get_contents('/usr/local/ispconfig/security/security_settings.ini~')); @@ -983,15 +1019,15 @@ class installer extends installer_base //* chown the interface files to the ispconfig user and group $command = 'chown -R ispconfig:ispconfig '.$install_dir.'/interface'; caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - + //* chown the server files to the root user and group $command = 'chown -R root:root '.$install_dir.'/server'; caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - + //* chown the security files to the root user and group $command = 'chown -R root:root '.$install_dir.'/security'; caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - + //* chown the security directory and security_settings.ini to root:ispconfig $command = 'chown root:ispconfig '.$install_dir.'/security/security_settings.ini'; caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); @@ -1005,7 +1041,7 @@ class installer extends installer_base caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); $command = 'chown root:ispconfig '.$install_dir.'/security/nginx_directives.blacklist'; caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - + //* Make the global language file directory group writable exec("chmod -R 770 $install_dir/interface/lib/lang"); @@ -1058,7 +1094,7 @@ class installer extends installer_base exec('chmod -R 770 '.escapeshellarg($install_dir.'/interface/invoices')); exec('chown -R ispconfig:ispconfig '.escapeshellarg($install_dir.'/interface/invoices')); } - + exec('chown -R root:root /usr/local/ispconfig/interface/ssl'); // TODO: FIXME: add the www-data user to the ispconfig group. This is just for testing @@ -1086,10 +1122,10 @@ class installer extends installer_base caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); if ($this->install_ispconfig_interface == true && isset($conf['interface_password']) && $conf['interface_password']!='admin') { - $sql = "UPDATE sys_user SET passwort = md5(?) WHERE username = 'admin';"; - $this->db->query($sql, $conf['interface_password']); + $sql = "UPDATE sys_user SET passwort = ? WHERE username = 'admin';"; + $this->db->query($sql, $this->crypt_password($conf['interface_password'])); } - + if($conf['apache']['installed'] == true && $this->install_ispconfig_interface == true){ //* Copy the ISPConfig vhost for the controlpanel $content = $this->get_template_file("apache_ispconfig.vhost", true); @@ -1121,11 +1157,13 @@ class installer extends installer_base $content = str_replace('{fastcgi_bin}', $conf['fastcgi']['fastcgi_bin'], $content); $content = str_replace('{fastcgi_phpini_path}', $conf['fastcgi']['fastcgi_phpini_path'], $content); @mkdir('/var/www/php-fcgi-scripts/ispconfig', 0755, true); + $this->set_immutable('/var/www/php-fcgi-scripts/ispconfig/.php-fcgi-starter', false); wf('/var/www/php-fcgi-scripts/ispconfig/.php-fcgi-starter', $content); exec('chmod +x /var/www/php-fcgi-scripts/ispconfig/.php-fcgi-starter'); chmod('/var/www/php-fcgi-scripts/ispconfig/.php-fcgi-starter', 0755); @symlink($install_dir.'/interface/web', '/var/www/ispconfig'); exec('chown -R ispconfig:ispconfig /var/www/php-fcgi-scripts/ispconfig'); + $this->set_immutable('/var/www/php-fcgi-scripts/ispconfig/.php-fcgi-starter', true); } } @@ -1221,6 +1259,7 @@ class installer extends installer_base if (!is_file($conf['ispconfig_log_dir'].'/ispconfig.log')) { touch($conf['ispconfig_log_dir'].'/ispconfig.log'); } + chmod($conf['ispconfig_log_dir'].'/ispconfig.log', 0600); //* Create the ispconfig auth log file and set uid/gid if(!is_file($conf['ispconfig_log_dir'].'/auth.log')) { @@ -1238,16 +1277,16 @@ class installer extends installer_base //* Remove Domain module as its functions are available in the client module now if(@is_dir('/usr/local/ispconfig/interface/web/domain')) exec('rm -rf /usr/local/ispconfig/interface/web/domain'); - + // Add symlink for patch tool if(!is_link('/usr/local/bin/ispconfig_patch')) exec('ln -s /usr/local/ispconfig/server/scripts/ispconfig_patch /usr/local/bin/ispconfig_patch'); - + // Change mode of a few files from amavisd if(is_file($conf['amavis']['config_dir'].'/conf.d/50-user')) chmod($conf['amavis']['config_dir'].'/conf.d/50-user', 0640); if(is_file($conf['amavis']['config_dir'].'/50-user~')) chmod($conf['amavis']['config_dir'].'/50-user~', 0400); if(is_file($conf['amavis']['config_dir'].'/amavisd.conf')) chmod($conf['amavis']['config_dir'].'/amavisd.conf', 0640); if(is_file($conf['amavis']['config_dir'].'/amavisd.conf~')) chmod($conf['amavis']['config_dir'].'/amavisd.conf~', 0400); - + } } diff --git a/install/dist/lib/opensuse.lib.php b/install/dist/lib/opensuse.lib.php index 21cfd9f2bad9d929e280f9abd5d091444131bff7..7cc368a14e3fdab0351f06f6c088c9c1d6611257 100644 --- a/install/dist/lib/opensuse.lib.php +++ b/install/dist/lib/opensuse.lib.php @@ -30,7 +30,7 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. class installer_dist extends installer_base { protected $mailman_group = 'mailman'; - + public function __construct() { //** check apache modules */ $mods = getapachemodules(); @@ -42,7 +42,7 @@ class installer_dist extends installer_base { swriteln($inst->lng(' AllowOverride None')); swriteln($inst->lng(' Require all denied')); swriteln($inst->lng(' '."\n")); - + swriteln($inst->lng(' If it uses the old syntax (deny from all) ISPConfig would fail to work.')); } } @@ -57,47 +57,13 @@ class installer_dist extends installer_base { $this->error("The postfix configuration directory '$config_dir' does not exist."); } - //* mysql-virtual_domains.cf - $this->process_postfix_config('mysql-virtual_domains.cf'); - - //* mysql-virtual_forwardings.cf - $this->process_postfix_config('mysql-virtual_forwardings.cf'); - - //* mysql-virtual_mailboxes.cf - $this->process_postfix_config('mysql-virtual_mailboxes.cf'); - - //* mysql-virtual_email2email.cf - $this->process_postfix_config('mysql-virtual_email2email.cf'); - - //* mysql-virtual_transports.cf - $this->process_postfix_config('mysql-virtual_transports.cf'); - - //* mysql-virtual_recipient.cf - $this->process_postfix_config('mysql-virtual_recipient.cf'); - - //* mysql-virtual_sender.cf - $this->process_postfix_config('mysql-virtual_sender.cf'); - - //* mysql-virtual_sender_login_maps.cf - $this->process_postfix_config('mysql-virtual_sender_login_maps.cf'); - - //* mysql-virtual_client.cf - $this->process_postfix_config('mysql-virtual_client.cf'); - - //* mysql-virtual_relaydomains.cf - $this->process_postfix_config('mysql-virtual_relaydomains.cf'); - - //* mysql-virtual_relayrecipientmaps.cf - $this->process_postfix_config('mysql-virtual_relayrecipientmaps.cf'); - - //* mysql-virtual_policy_greylist.cf - $this->process_postfix_config('mysql-virtual_policy_greylist.cf'); - - //* mysql-virtual_gids.cf.master - $this->process_postfix_config('mysql-virtual_gids.cf'); + //* Install virtual mappings + foreach (glob('tpl/mysql-virtual_*.master') as $filename) { + $this->process_postfix_config( basename($filename, '.master') ); + } - //* mysql-virtual_uids.cf - $this->process_postfix_config('mysql-virtual_uids.cf'); + //* mysql-verify_recipients.cf + $this->process_postfix_config('mysql-verify_recipients.cf'); //* postfix-dkim $filename='tag_as_originating.re'; @@ -112,12 +78,6 @@ class installer_dist extends installer_base { $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/postfix-'.$filename.'.master', 'tpl/postfix-'.$filename.'.master'); wf($full_file_name, $content); - //* Changing mode and group of the new created config files. - caselog('chmod o= '.$config_dir.'/mysql-virtual_*.cf* &> /dev/null', - __FILE__, __LINE__, 'chmod on mysql-virtual_*.cf*', 'chmod on mysql-virtual_*.cf* failed'); - caselog('chgrp '.$cf['group'].' '.$config_dir.'/mysql-virtual_*.cf* &> /dev/null', - __FILE__, __LINE__, 'chgrp on mysql-virtual_*.cf*', 'chgrp on mysql-virtual_*.cf* failed'); - if(!is_dir($cf['vmail_mailbox_base'])) mkdir($cf['vmail_mailbox_base']); //* Creating virtual mail user and group @@ -159,13 +119,31 @@ class installer_dist extends installer_base { 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_authenticated_sender_login_mismatch'; + $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'], @@ -173,8 +151,13 @@ class installer_dist extends installer_base { '{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/opensuse_postfix.conf.master', 'tpl/opensuse_postfix.conf.master'); $postconf_tpl = strtr($postconf_tpl, $postconf_placeholders); $postconf_commands = array_filter(explode("\n", $postconf_tpl)); // read and remove empty lines @@ -193,6 +176,7 @@ class installer_dist extends installer_base { 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'); @@ -378,13 +362,13 @@ class installer_dist extends installer_base { $virtual_transport = 'dovecot'; $configure_lmtp = false; - + // check if virtual_transport must be changed if ($this->is_update) { $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; @@ -487,7 +471,7 @@ class installer_dist extends installer_base { exec("chmod 600 $config_dir/$configfile"); exec("chown root:root $config_dir/$configfile"); - + // Dovecot shall ignore mounts in website directory if(is_installed('doveadm')) exec("doveadm mount add '/srv/www/*' ignore > /dev/null 2> /dev/null"); @@ -529,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'); @@ -659,7 +640,7 @@ class installer_dist extends installer_base { if($conf['apache']['installed'] == false) return; //* Create the logging directory for the vhost logfiles exec('mkdir -p /var/log/ispconfig/httpd'); - + //* enable apache logio module exec('a2enmod logio'); @@ -690,16 +671,16 @@ class installer_dist extends installer_base { $tpl = new tpl('apache_ispconfig.conf.master'); $tpl->setVar('apache_version',getapacheversion()); - + if($this->is_update == true) { $tpl->setVar('logging',get_logging_state()); } else { $tpl->setVar('logging','yes'); } - + $records = $this->db->queryAllRecords("SELECT * FROM ?? WHERE server_id = ? AND virtualhost = 'y'", $conf['mysql']['master_database'] . '.server_ip', $conf['server_id']); $ip_addresses = array(); - + if(is_array($records) && count($records) > 0) { foreach($records as $rec) { if($rec['ip_type'] == 'IPv6') { @@ -718,7 +699,7 @@ class installer_dist extends installer_base { } } } - + if(count($ip_addresses) > 0) $tpl->setLoop('ip_adresses',$ip_addresses); wf($vhost_conf_dir.'/ispconfig.conf', $tpl->grab()); @@ -823,7 +804,7 @@ class installer_dist extends installer_base { //* add a sshusers group $command = 'groupadd sshusers'; if(!is_group('sshusers')) caselog($command.' &> /dev/null 2> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - + // add anonymized log option to nginxx.conf file $nginx_conf_file = $conf['nginx']['config_dir'].'/nginx.conf'; if(is_file($nginx_conf_file)) { @@ -925,14 +906,14 @@ class installer_dist extends installer_base { //* copy the ISPConfig server part $command = "cp -rf ../server $install_dir"; caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - + //* Make a backup of the security settings if(is_file('/usr/local/ispconfig/security/security_settings.ini')) copy('/usr/local/ispconfig/security/security_settings.ini','/usr/local/ispconfig/security/security_settings.ini~'); - + //* copy the ISPConfig security part $command = 'cp -rf ../security '.$install_dir; caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - + //* Apply changed security_settings.ini values to new security_settings.ini file if(is_file('/usr/local/ispconfig/security/security_settings.ini~')) { $security_settings_old = ini_to_array(file_get_contents('/usr/local/ispconfig/security/security_settings.ini~')); @@ -1090,15 +1071,15 @@ class installer_dist extends installer_base { //* chown the interface files to the ispconfig user and group $command = 'chown -R ispconfig:ispconfig '.$install_dir.'/interface'; caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - + //* chown the server files to the root user and group $command = 'chown -R root:root '.$install_dir.'/server'; caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - + //* chown the security files to the root user and group $command = 'chown -R root:root '.$install_dir.'/security'; caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - + //* chown the security directory and security_settings.ini to root:ispconfig $command = 'chown root:ispconfig '.$install_dir.'/security/security_settings.ini'; caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); @@ -1112,7 +1093,7 @@ class installer_dist extends installer_base { caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); $command = 'chown root:ispconfig '.$install_dir.'/security/nginx_directives.blacklist'; caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - + //* Make the global language file directory group writable exec("chmod -R 770 $install_dir/interface/lib/lang"); @@ -1153,12 +1134,12 @@ class installer_dist extends installer_base { exec("chmod 600 $install_dir/server/lib/mysql_clientdb.conf"); exec("chown root:root $install_dir/server/lib/mysql_clientdb.conf"); } - + if(is_dir($install_dir.'/interface/invoices')) { exec('chmod -R 770 '.escapeshellarg($install_dir.'/interface/invoices')); exec('chown -R ispconfig:ispconfig '.escapeshellarg($install_dir.'/interface/invoices')); } - + exec('chown -R root:root /usr/local/ispconfig/interface/ssl'); // TODO: FIXME: add the www-data user to the ispconfig group. This is just for testing @@ -1189,10 +1170,10 @@ class installer_dist extends installer_base { caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); if ($this->install_ispconfig_interface == true && isset($conf['interface_password']) && $conf['interface_password']!='admin') { - $sql = "UPDATE sys_user SET passwort = md5(?) WHERE username = 'admin';"; - $this->db->query($sql, $conf['interface_password']); + $sql = "UPDATE sys_user SET passwort = ? WHERE username = 'admin';"; + $this->db->query($sql, $this->crypt_password($conf['interface_password'])); } - + if($conf['apache']['installed'] == true && $this->install_ispconfig_interface == true){ //* Copy the ISPConfig vhost for the controlpanel // TODO: These are missing! should they be "vhost_dist_*_dir" ? @@ -1221,7 +1202,7 @@ class installer_dist extends installer_base { } else { $tpl->setVar('ssl_bundle_comment','#'); } - + $tpl->setVar('apache_version',getapacheversion()); $content = $tpl->grab(); @@ -1233,10 +1214,12 @@ class installer_dist extends installer_base { $content = str_replace('{fastcgi_bin}', $conf['fastcgi']['fastcgi_bin'], $content); $content = str_replace('{fastcgi_phpini_path}', $conf['fastcgi']['fastcgi_phpini_path'], $content); exec('mkdir -p /srv/www/php-fcgi-scripts/ispconfig'); + $this->set_immutable('/srv/www/php-fcgi-scripts/ispconfig/.php-fcgi-starter', false); wf('/srv/www/php-fcgi-scripts/ispconfig/.php-fcgi-starter', $content); exec('chmod +x /srv/www/php-fcgi-scripts/ispconfig/.php-fcgi-starter'); exec('ln -s /usr/local/ispconfig/interface/web /srv/www/ispconfig'); exec('chown -R ispconfig:ispconfig /srv/www/php-fcgi-scripts/ispconfig'); + $this->set_immutable('/srv/www/php-fcgi-scripts/ispconfig/.php-fcgi-starter', true); //} @@ -1341,6 +1324,7 @@ class installer_dist extends installer_base { //* Create the ispconfig log directory if(!is_dir($conf['ispconfig_log_dir'])) mkdir($conf['ispconfig_log_dir']); if(!is_file($conf['ispconfig_log_dir'].'/ispconfig.log')) exec('touch '.$conf['ispconfig_log_dir'].'/ispconfig.log'); + chmod($conf['ispconfig_log_dir'].'/ispconfig.log', 0600); if(is_user('getmail')) { exec('mv /usr/local/ispconfig/server/scripts/run-getmail.sh /usr/local/bin/run-getmail.sh'); @@ -1362,10 +1346,10 @@ class installer_dist extends installer_base { //* Remove Domain module as its functions are available in the client module now if(@is_dir('/usr/local/ispconfig/interface/web/domain')) exec('rm -rf /usr/local/ispconfig/interface/web/domain'); - + // Add symlink for patch tool if(!is_link('/usr/local/bin/ispconfig_patch')) exec('ln -s /usr/local/ispconfig/server/scripts/ispconfig_patch /usr/local/bin/ispconfig_patch'); - + // Change mode of a few files from amavisd if(is_file($conf['amavis']['config_dir'].'/conf.d/50-user')) chmod($conf['amavis']['config_dir'].'/conf.d/50-user', 0640); if(is_file($conf['amavis']['config_dir'].'/50-user~')) chmod($conf['amavis']['config_dir'].'/50-user~', 0400); 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/apache_ispconfig.vhost.master b/install/dist/tpl/gentoo/apache_ispconfig.vhost.master index f4f08d2bb6e878d742ae023de172f9d664b189b1..e885b381bc994bfb973572aa3b9a5bc56fcb98b1 100644 --- a/install/dist/tpl/gentoo/apache_ispconfig.vhost.master +++ b/install/dist/tpl/gentoo/apache_ispconfig.vhost.master @@ -5,10 +5,14 @@ ###################################################### {vhost_port_listen} Listen {vhost_port} -NameVirtualHost *:{vhost_port} + + # NameVirtualHost *:{vhost_port} + ServerAdmin webmaster@localhost + + Alias /mail /var/www/ispconfig/mail DocumentRoot /var/www/ispconfig/ @@ -25,7 +29,7 @@ NameVirtualHost *:{vhost_port} DirectoryIndex index.php - + DocumentRoot /usr/local/ispconfig/interface/web/ AddType application/x-httpd-php .php @@ -37,11 +41,11 @@ NameVirtualHost *:{vhost_port} php_value magic_quotes_gpc 0 - + # ErrorLog /var/log/apache2/error.log # CustomLog /var/log/apache2/access.log combined ServerSignature Off - + SecRuleEngine Off @@ -64,4 +68,3 @@ NameVirtualHost *:{vhost_port} Order Deny,Allow Deny from all - diff --git a/install/dist/tpl/gentoo/jk_init.ini.master b/install/dist/tpl/gentoo/jk_init.ini.master index a2ff3a19517d46019a7843c6189be49698d4684f..267210535b19d07877e101210ed5e2dab8079ce7 100644 --- a/install/dist/tpl/gentoo/jk_init.ini.master +++ b/install/dist/tpl/gentoo/jk_init.ini.master @@ -96,9 +96,11 @@ 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 [apacheutils] comment = htpasswd utility diff --git a/install/install.php b/install/install.php index 9dff3facf2e71a085e1cbc0994eb7cc8e967957b..64d05feecd8093a7df9b42af4ab563b96cfce7b8 100644 --- a/install/install.php +++ b/install/install.php @@ -30,30 +30,30 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* ISPConfig 3 installer. - + ------------------------------------------------------------------------------------- - Interactive install ------------------------------------------------------------------------------------- run: - + php install.php - + ------------------------------------------------------------------------------------- - Noninteractive (autoinstall) mode ------------------------------------------------------------------------------------- - + The autoinstall mode can read the installer questions from a .ini style file or from - a php config file. Examples for both file types are in the docs folder. + a php config file. Examples for both file types are in the docs folder. See autoinstall.ini.sample and autoinstall.conf_sample.php. - + run: - + php install.php --autoinstall=autoinstall.ini - + or - + php install.php --autoinstall=autoinstall.conf.php - + */ error_reporting(E_ALL|E_STRICT); @@ -146,9 +146,10 @@ include_once 'dist/conf/'.$dist['confid'].'.conf.php'; //** Installer Interface //**************************************************************************************************** $inst = new installer(); -if (!$inst->get_php_version()) die('ISPConfig requieres PHP '.$inst->min_php."\n"); $retval=shell_exec("which which"); -if (empty($retval)) die ("ISPConfig requieres which \n"); +if (empty($retval)) die ("ISPConfig requires which \n"); + +$inst->check_prerequisites(); swriteln($inst->lng(' Following will be a few questions for primary configuration so be careful.')); swriteln($inst->lng(' Default values are in [brackets] and can be accepted with .')); @@ -159,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')) { @@ -170,6 +176,11 @@ if(is_dir('/usr/local/ispconfig')) { //** Detect the installed applications $inst->find_installed_apps(); +//* crontab required by ISPConfig +if(!$conf['cron']['installed']) { + die("crontab not found; please install a compatible cron daemon before ISPConfig\n\n"); +} + //** Select the language and set default timezone $conf['language'] = $inst->simple_query('Select language', array('en', 'de'), 'en','language'); $conf['timezone'] = get_system_timezone(); @@ -202,17 +213,17 @@ if(!function_exists('mysqli_connect')) die('No PHP MySQLi functions available. P //** Get MySQL root credentials $finished = false; do { - $tmp_mysql_server_host = $inst->free_query('MySQL server hostname', $conf['mysql']['host'],'mysql_hostname'); + $tmp_mysql_server_host = $inst->free_query('MySQL server hostname', $conf['mysql']['host'],'mysql_hostname'); $tmp_mysql_server_port = $inst->free_query('MySQL server port', $conf['mysql']['port'],'mysql_port'); - $tmp_mysql_server_admin_user = $inst->free_query('MySQL root username', $conf['mysql']['admin_user'],'mysql_root_user'); - $tmp_mysql_server_admin_password = $inst->free_query('MySQL root password', $conf['mysql']['admin_password'],'mysql_root_password'); - $tmp_mysql_server_database = $inst->free_query('MySQL database to create', $conf['mysql']['database'],'mysql_database'); + $tmp_mysql_server_admin_user = $inst->free_query('MySQL root username', $conf['mysql']['admin_user'],'mysql_root_user'); + $tmp_mysql_server_admin_password = $inst->free_query('MySQL root password', $conf['mysql']['admin_password'],'mysql_root_password'); + $tmp_mysql_server_database = $inst->free_query('MySQL database to create', $conf['mysql']['database'],'mysql_database'); $tmp_mysql_server_charset = $inst->free_query('MySQL charset', $conf['mysql']['charset'],'mysql_charset'); - + if($install_mode == 'expert') { swriteln("The next two questions are about the internal ISPConfig database user and password.\nIt is recommended to accept the defaults which are 'ispconfig' as username and a random password.\nIf you use a different password, use only numbers and chars for the password.\n"); - - $conf['mysql']['ispconfig_user'] = $inst->free_query('ISPConfig mysql database username', $conf['mysql']['ispconfig_user'],'mysql_ispconfig_user'); + + $conf['mysql']['ispconfig_user'] = $inst->free_query('ISPConfig mysql database username', $conf['mysql']['ispconfig_user'],'mysql_ispconfig_user'); $conf['mysql']['ispconfig_password'] = $inst->free_query('ISPConfig mysql database password', $conf['mysql']['ispconfig_password'],'mysql_ispconfig_password'); } @@ -262,10 +273,10 @@ if($install_mode == 'expert' && strtolower($inst->simple_query('Shall this serve //** Get MySQL root credentials $finished = false; do { - $tmp_mysql_server_host = $inst->free_query('MySQL master server hostname', $conf['mysql']['master_host'],'mysql_master_hostname'); + $tmp_mysql_server_host = $inst->free_query('MySQL master server hostname', $conf['mysql']['master_host'],'mysql_master_hostname'); $tmp_mysql_server_port = $inst->free_query('MySQL master server port', $conf['mysql']['master_port'],'mysql_master_port'); - $tmp_mysql_server_admin_user = $inst->free_query('MySQL master server root username', $conf['mysql']['master_admin_user'],'mysql_master_root_user'); - $tmp_mysql_server_admin_password = $inst->free_query('MySQL master server root password', $conf['mysql']['master_admin_password'],'mysql_master_root_password'); + $tmp_mysql_server_admin_user = $inst->free_query('MySQL master server root username', $conf['mysql']['master_admin_user'],'mysql_master_root_user'); + $tmp_mysql_server_admin_password = $inst->free_query('MySQL master server root password', $conf['mysql']['master_admin_password'],'mysql_master_root_password'); $tmp_mysql_server_database = $inst->free_query('MySQL master server database name', $conf['mysql']['master_database'],'mysql_master_database'); //* Initialize the MySQL server connection @@ -489,8 +500,17 @@ 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(!isset($conf['firewall']['installed'])) { + $conf['firewall']['installed'] = false; + } if(!$conf['ufw']['installed'] && !$conf['firewall']['installed']) { $conf['ufw']['installed'] = $inst->force_configure_app('Ubuntu Firewall', ($install_mode == 'expert')); $conf['firewall']['installed'] = $inst->force_configure_app('Bastille Firewall', ($install_mode == 'expert')); @@ -534,13 +554,17 @@ if($force) { $inst->configure_fail2ban(); } -if($conf['services']['web'] == true) { - //** Configure apps vhost - swriteln('Configuring Apps vhost'); - $inst->configure_apps_vhost(); +// create acme vhost +if($conf['nginx']['installed'] == true) { + $inst->make_acme_vhost('nginx'); // we need this config file but we don't want nginx to be restarted at this point +} +if($conf['apache']['installed'] == true) { + $inst->make_acme_vhost('apache'); // we need this config file but we don't want apache to be restarted at this point } //** Configure ISPConfig :-) +$issue_asked = false; +$issue_tried = false; $install_ispconfig_interface_default = ($conf['mysql']['master_slave_setup'] == 'y')?'n':'y'; if($install_mode == 'standard' || strtolower($inst->simple_query('Install ISPConfig Web Interface', array('y', 'n'), $install_ispconfig_interface_default,'install_ispconfig_web_interface')) == 'y') { swriteln('Installing ISPConfig'); @@ -565,15 +589,37 @@ if($install_mode == 'standard' || strtolower($inst->simple_query('Install ISPCon if($conf['nginx']['installed'] == true) $conf['nginx']['vhost_port'] = $ispconfig_vhost_port; unset($ispconfig_vhost_port); - if(strtolower($inst->simple_query('Do you want a secure (SSL) connection to the ISPConfig web interface', array('y', 'n'), 'y','ispconfig_use_ssl')) == 'y') { + if(strtolower($inst->simple_query('Do you want a secure (SSL) connection to the ISPConfig web interface', array('y', 'n'), 'y','ispconfig_use_ssl')) == 'y') { $inst->make_ispconfig_ssl_cert(); + $issue_tried = true; } + $issue_asked = true; $inst->install_ispconfig_interface = true; } else { $inst->install_ispconfig_interface = false; } +// Create SSL certs for non-webserver(s)? +if(!$issue_asked) { + if(!file_exists('/usr/local/ispconfig/interface/ssl/ispserver.crt')) { + if(!$issue_tried && strtolower($inst->simple_query('Do you want to create SSL certs for your server?', array('y', 'n'), 'y','create_ssl_server_certs')) == 'y') { + $inst->make_ispconfig_ssl_cert(); + } + } else { + swriteln('Certificate exists. Not creating a new one.'); + } +} + +// update acme.sh if installed +$inst->update_acme(); + +if($conf['services']['web'] == true) { + //** Configure apps vhost + swriteln('Configuring Apps vhost'); + $inst->configure_apps_vhost(); +} + $inst->install_ispconfig(); //* Configure DBServer @@ -582,21 +628,18 @@ $inst->configure_dbserver(); //* Configure ISPConfig swriteln('Installing ISPConfig crontab'); -if($conf['cron']['installed']) { - swriteln('Installing ISPConfig crontab'); - $inst->install_crontab(); -} else swriteln('[ERROR] Cron not found'); +$inst->install_crontab(); swriteln('Detect IP addresses'); $inst->detect_ips(); swriteln('Restarting services ...'); -if($conf['mysql']['installed'] == true && $conf['mysql']['init_script'] != '') system($inst->getinitcommand($conf['mysql']['init_script'], 'restart').' >/dev/null 2>&1'); -if($conf['postfix']['installed'] == true && $conf['postfix']['init_script'] != '') system($inst->getinitcommand($conf['postfix']['init_script'], 'restart')); -if($conf['saslauthd']['installed'] == true && $conf['saslauthd']['init_script'] != '') system($inst->getinitcommand($conf['saslauthd']['init_script'], 'restart')); -if($conf['amavis']['installed'] == true && $conf['amavis']['init_script'] != '') system($inst->getinitcommand($conf['amavis']['init_script'], 'restart')); -if($conf['rspamd']['installed'] == true && $conf['rspamd']['init_script'] != '') system($inst->getinitcommand($conf['rspamd']['init_script'], 'restart')); -if($conf['clamav']['installed'] == true && $conf['clamav']['init_script'] != '') system($inst->getinitcommand($conf['clamav']['init_script'], 'restart')); +if($conf['mysql']['installed'] == true && isset($conf['mysql']['init_script']) && $conf['mysql']['init_script'] != '') system($inst->getinitcommand($conf['mysql']['init_script'], 'restart').' >/dev/null 2>&1'); +if($conf['postfix']['installed'] == true && isset($conf['postfix']['init_script']) && $conf['postfix']['init_script'] != '') system($inst->getinitcommand($conf['postfix']['init_script'], 'restart')); +if($conf['saslauthd']['installed'] == true && isset($conf['saslauthd']['init_script']) && $conf['saslauthd']['init_script'] != '') system($inst->getinitcommand($conf['saslauthd']['init_script'], 'restart')); +if($conf['amavis']['installed'] == true && isset($conf['amavis']['init_script']) && $conf['amavis']['init_script'] != '') system($inst->getinitcommand($conf['amavis']['init_script'], 'restart')); +if($conf['rspamd']['installed'] == true && isset($conf['rspamd']['init_script']) && $conf['rspamd']['init_script'] != '') system($inst->getinitcommand($conf['rspamd']['init_script'], 'restart')); +if($conf['clamav']['installed'] == true && isset($conf['clamav']['init_script']) && $conf['clamav']['init_script'] != '' && $conf['amavis']['installed'] == true) system($inst->getinitcommand($conf['clamav']['init_script'], 'restart')); if($conf['courier']['installed'] == true){ if($conf['courier']['courier-authdaemon'] != '') system($inst->getinitcommand($conf['courier']['courier-authdaemon'], 'restart')); if($conf['courier']['courier-imap'] != '') system($inst->getinitcommand($conf['courier']['courier-imap'], 'restart')); @@ -604,22 +647,22 @@ if($conf['courier']['installed'] == true){ if($conf['courier']['courier-pop'] != '') system($inst->getinitcommand($conf['courier']['courier-pop'], 'restart')); if($conf['courier']['courier-pop-ssl'] != '') system($inst->getinitcommand($conf['courier']['courier-pop-ssl'], 'restart')); } -if($conf['dovecot']['installed'] == true && $conf['dovecot']['init_script'] != '') system($inst->getinitcommand($conf['dovecot']['init_script'], 'restart')); -if($conf['mailman']['installed'] == true && $conf['mailman']['init_script'] != '') system('nohup '.$inst->getinitcommand($conf['mailman']['init_script'], 'restart').' >/dev/null 2>&1 &'); -if($conf['apache']['installed'] == true && $conf['apache']['init_script'] != '') system($inst->getinitcommand($conf['apache']['init_script'], 'restart')); +if($conf['dovecot']['installed'] == true && isset($conf['dovecot']['init_script']) && $conf['dovecot']['init_script'] != '') system($inst->getinitcommand($conf['dovecot']['init_script'], 'restart')); +if($conf['mailman']['installed'] == true && isset($conf['mailman']['init_script']) && $conf['mailman']['init_script'] != '') system('nohup '.$inst->getinitcommand($conf['mailman']['init_script'], 'restart').' >/dev/null 2>&1 &'); +if($conf['apache']['installed'] == true && isset($conf['apache']['init_script']) && $conf['apache']['init_script'] != '') system($inst->getinitcommand($conf['apache']['init_script'], 'restart')); //* Reload is enough for nginx if($conf['nginx']['installed'] == true){ if($conf['nginx']['php_fpm_init_script'] != '') system($inst->getinitcommand($conf['nginx']['php_fpm_init_script'], 'reload')); - if($conf['nginx']['init_script'] != '') system($inst->getinitcommand($conf['nginx']['init_script'], 'reload')); + if(isset($conf['nginx']['init_script']) && $conf['nginx']['init_script'] != '') system($inst->getinitcommand($conf['nginx']['init_script'], 'reload')); } -if($conf['pureftpd']['installed'] == true && $conf['pureftpd']['init_script'] != '') system($inst->getinitcommand($conf['pureftpd']['init_script'], 'restart')); -if($conf['mydns']['installed'] == true && $conf['mydns']['init_script'] != '') system($inst->getinitcommand($conf['mydns']['init_script'], 'restart').' &> /dev/null'); -if($conf['powerdns']['installed'] == true && $conf['powerdns']['init_script'] != '') system($inst->getinitcommand($conf['powerdns']['init_script'], 'restart').' &> /dev/null'); -if($conf['bind']['installed'] == true && $conf['bind']['init_script'] != '') system($inst->getinitcommand($conf['bind']['init_script'], 'restart').' &> /dev/null'); -//if($conf['squid']['installed'] == true && $conf['squid']['init_script'] != '' && is_file($conf['init_scripts'].'/'.$conf['squid']['init_script'])) system($conf['init_scripts'].'/'.$conf['squid']['init_script'].' restart &> /dev/null'); -if($conf['nginx']['installed'] == true && $conf['nginx']['init_script'] != '') system($inst->getinitcommand($conf['nginx']['init_script'], 'restart').' &> /dev/null'); -if($conf['ufw']['installed'] == true && $conf['ufw']['init_script'] != '') system($inst->getinitcommand($conf['ufw']['init_script'], 'restart').' &> /dev/null'); -if($conf['xmpp']['installed'] == true && $conf['xmpp']['init_script'] != '') system($inst->getinitcommand($conf['xmpp']['init_script'], 'restart').' &> /dev/null'); +if($conf['pureftpd']['installed'] == true && isset($conf['pureftpd']['init_script']) && $conf['pureftpd']['init_script'] != '') system($inst->getinitcommand($conf['pureftpd']['init_script'], 'restart')); +if($conf['mydns']['installed'] == true && isset($conf['mydns']['init_script']) && $conf['mydns']['init_script'] != '') system($inst->getinitcommand($conf['mydns']['init_script'], 'restart').' &> /dev/null'); +if($conf['powerdns']['installed'] == true && isset($conf['powerdns']['init_script']) && $conf['powerdns']['init_script'] != '') system($inst->getinitcommand($conf['powerdns']['init_script'], 'restart').' &> /dev/null'); +if($conf['bind']['installed'] == true && isset($conf['bind']['init_script']) && $conf['bind']['init_script'] != '') system($inst->getinitcommand($conf['bind']['init_script'], 'restart').' &> /dev/null'); +//if($conf['squid']['installed'] == true && isset($conf['squid']['init_script']) && $conf['squid']['init_script'] != '' && is_file($conf['init_scripts'].'/'.$conf['squid']['init_script'])) system($conf['init_scripts'].'/'.$conf['squid']['init_script'].' restart &> /dev/null'); +if($conf['nginx']['installed'] == true && isset($conf['nginx']['init_script']) && $conf['nginx']['init_script'] != '') system($inst->getinitcommand($conf['nginx']['init_script'], 'restart').' &> /dev/null'); +if($conf['ufw']['installed'] == true && isset($conf['ufw']['init_script']) && $conf['ufw']['init_script'] != '') system($inst->getinitcommand($conf['ufw']['init_script'], 'restart').' &> /dev/null'); +if($conf['xmpp']['installed'] == true && isset($conf['xmpp']['init_script']) && $conf['xmpp']['init_script'] != '') system($inst->getinitcommand($conf['xmpp']['init_script'], 'restart').' &> /dev/null'); $inst->create_mount_script(); diff --git a/install/lib/classes/tpl.inc.php b/install/lib/classes/tpl.inc.php index 5bd8ded1f8818f2e1bb8b6d473d479facc1a0db0..2bea1e1fd5474a0dcdfcc53da56a67fcf9e031a7 100644 --- a/install/lib/classes/tpl.inc.php +++ b/install/lib/classes/tpl.inc.php @@ -931,7 +931,7 @@ if (!defined('vlibTemplateClassLoaded')) { { array_push($this->_namespace, $varname); $tempvar = count($this->_namespace) - 1; - $retstr = "for (\$_".$tempvar."=0 ; \$_".$tempvar." < count(\$this->_arrvars"; + $retstr = "for (\$_".$tempvar."=0 ; \$_".$tempvar." < \$this->_tpl_count(\$this->_arrvars"; for ($i=0; $i < count($this->_namespace); $i++) { $retstr .= "['".$this->_namespace[$i]."']"; if ($this->_namespace[$i] != $varname) $retstr .= "[\$_".$i."]"; @@ -1170,7 +1170,15 @@ if (!defined('vlibTemplateClassLoaded')) { array_push($this->_currentincludedir, dirname($this->_tmplfilename)); $this->_includedepth++; - $success = @eval($this->_tmplfilep); + try { + $success = @eval($this->_tmplfilep); + } catch(Exception $ex) { + print $this->_tmplfilep; + throw $ex; + } catch(TypeError $ex) { + print $this->_tmplfilep; + throw $ex; + } $this->_includedepth--; array_pop($this->_currentincludedir); @@ -1268,6 +1276,27 @@ if (!defined('vlibTemplateClassLoaded')) { return $return; } + /** + * Used during in evaled code to replace PHP count function for PHP 8 compatibility + * @var variable to be counted + */ + private function _tpl_count($var) + { + $retvar = 0; + if(isset($var)) { + if(is_array($var)) { + $retvar = count($var); + } elseif(is_null($var)) { + $retvar = 0; + } else { + $retvar = 1; + } + } else { + $retvar = 0; + } + return $retvar; + } + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - The following functions have no use and are included just so that if the user is making use of vlibTemplateCache functions, this doesn't crash when changed to 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 @@ + +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 1e49e025ca0360944a5ba6bd0bd12f5a7543dc4f..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'); @@ -95,6 +98,10 @@ function get_distname() { $mainver = current($mainver).'.'.next($mainver); } switch ($mainver){ + case "20.04": + $relname = "(Focal Fossa)"; + $distconfid = 'ubuntu2004'; + break; case "18.04": $relname = "(Bionic Beaver)"; $distconfid = 'ubuntu1804'; @@ -186,7 +193,7 @@ function get_distname() { break; default: $relname = "UNKNOWN"; - $distconfid = 'ubuntu1804'; + $distconfid = 'ubuntu2004'; } $distver = $ver.$lts." ".$relname; swriteln("Operating System: ".$distname.' '.$distver."\n"); @@ -234,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'; @@ -280,75 +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, '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'; - $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'; - $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'; + 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 6 or compatible\n"); - } elseif(stristr($content, 'CentOS Linux release 7')) { - $distname = 'CentOS'; - $distver = 'Unknown'; + 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'; - $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"); - } 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')) { @@ -462,29 +490,38 @@ function rf($file){ } function wf($file, $content){ - mkdirs(dirname($file)); + if(!$ret_val = mkdirs(dirname($file))) return false; if(!$fp = fopen($file, 'wb')){ ilog('WARNING: could not open file '.$file); + // implicitly returned false because the following fwrite and fclose both fail, + // but to be explicit: + $ret_val = false; } - fwrite($fp, $content); - fclose($fp); + fwrite($fp, $content) or $ret_val = false; + fclose($fp) or $ret_val = false; + return $ret_val; } function af($file, $content){ - mkdirs(dirname($file)); + if(!$ret_val = mkdirs(dirname($file))) return false; if(!$fp = fopen($file, 'ab')){ ilog('WARNING: could not open file '.$file); + $ret_val = false; } - fwrite($fp, $content); - fclose($fp); + fwrite($fp, $content) or $ret_val = false; + fclose($fp) or $ret_val = false; + return $ret_val; } function aftsl($file, $content){ + $ret_val = true; if(!$fp = fopen($file, 'ab')){ ilog('WARNING: could not open file '.$file); + $ret_val = false; } - fwrite($fp, $content); - fclose($fp); + fwrite($fp, $content) or $ret_val = false; + fclose($fp) or $ret_val = false; + return $ret_val; } function unix_nl($input){ @@ -669,8 +706,7 @@ function ini_to_array($ini) { //* Converts a config array to a string -function array_to_ini($config_array = '') { - if($config_array == '') $config_array = $this->config; +function array_to_ini($config_array) { $content = ''; foreach($config_array as $section => $data) { $content .= "[$section]\n"; @@ -802,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 { @@ -828,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 { @@ -849,9 +885,8 @@ function get_apps_vhost_port_number() { } /* -* Get the port number of the ISPConfig controlpanel vhost -*/ - + * Check if SSL is anabled in the ISPConfig controlpanel vhost. + */ function is_ispconfig_ssl_enabled() { global $conf; $ispconfig_vhost_file = $conf['apache']['vhost_conf_dir'].'/ispconfig.vhost'; diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php index 513858ca687065a51e9be208bea37e744fb0cab3..b3610db6107140a9a0f7a4bb049e9bdb28ea4536 100644 --- a/install/lib/installer_base.lib.php +++ b/install/lib/installer_base.lib.php @@ -1,7 +1,7 @@ conf = $conf; + } + + private function install_acme() { + $install_cmd = 'wget -O - https://get.acme.sh | sh'; + $ret = null; + $val = 0; + exec($install_cmd . ' 2>&1', $ret, $val); + + 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 2> /dev/null')); + $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. @@ -62,13 +83,13 @@ class installer_base { global $autoinstall, $autoupdate; $finished = false; do { - if($name != '' && $autoinstall[$name] != '') { + if($name != '' && isset($autoinstall[$name]) && $autoinstall[$name] != '') { if($autoinstall[$name] == 'default') { $input = $default; } else { $input = $autoinstall[$name]; } - } elseif($name != '' && $autoupdate[$name] != '') { + } elseif($name != '' && isset($autoupdate[$name]) && $autoupdate[$name] != '') { if($autoupdate[$name] == 'default') { $input = $default; } else { @@ -105,13 +126,13 @@ class installer_base { public function free_query($query, $default, $name = '') { global $autoinstall, $autoupdate; - if($name != '' && $autoinstall[$name] != '') { + if($name != '' && isset($autoinstall[$name]) && $autoinstall[$name] != '') { if($autoinstall[$name] == 'default') { $input = $default; } else { $input = $autoinstall[$name]; } - } elseif($name != '' && $autoupdate[$name] != '') { + } elseif($name != '' && isset($autoupdate[$name]) && $autoupdate[$name] != '') { if($autoupdate[$name] == 'default') { $input = $default; } else { @@ -143,10 +164,43 @@ class installer_base { } */ - //** Detect PHP-Version - public function get_php_version() { - if(version_compare(PHP_VERSION, $this->min_php, '<')) return false; - else return true; + public function set_immutable($path, $enable = true) { + if($path != '' && $path != '/' && strlen($path) > 6 && strpos($path, '..') === false && (is_file($path) || is_dir($path))) { + if($enable) { + exec('chattr +i ' . escapeshellarg($path)); + } else { + exec('chattr -i ' . escapeshellarg($path)); + } + } + } + + public function crypt_password($cleartext_password, $charset = 'UTF-8') { + if($charset != 'UTF-8') { + $cleartext_password = mb_convert_encoding($cleartext_password, $charset, 'UTF-8'); + } + + if(defined('CRYPT_SHA512') && CRYPT_SHA512 == 1) { + $salt = '$6$rounds=5000$'; + $salt_length = 16; + } elseif(defined('CRYPT_SHA256') && CRYPT_SHA256 == 1) { + $salt = '$5$rounds=5000$'; + $salt_length = 16; + } else { + $salt = '$1$'; + $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 { + $base64_alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789./'; + for($n = 0; $n < $salt_length; $n++) { + $salt .= $base64_alphabet[mt_rand(0, 63)]; + } + } + $salt .= "$"; + return crypt($cleartext_password, $salt); } //** Detect installed applications @@ -172,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')) { @@ -184,11 +239,24 @@ class installer_base { // if(is_installed('vlogger')) $conf['vlogger']['installed'] = true; // ISPConfig ships with vlogger, so it is always installed. $conf['vlogger']['installed'] = true; - if(is_installed('cron') || is_installed('anacron')) $conf['cron']['installed'] = true; + if(is_installed('crontab')) $conf['cron']['installed'] = true; if (($conf['apache']['installed'] && is_file($conf['apache']["vhost_conf_enabled_dir"]."/000-ispconfig.vhost")) || ($conf['nginx']['installed'] && is_file($conf['nginx']["vhost_conf_enabled_dir"]."/000-ispconfig.vhost"))) $this->ispconfig_interface_installed = true; } + //** Check prerequisites + public function check_prerequisites() { + $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.2', '>=')) $msg .= "PHP Version 8.2+ 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"; + + if($msg != '') die($msg); + } + public function force_configure_app($service, $enable_force=true) { $force = false; if(AUTOINSTALL == true) return false; @@ -225,21 +293,27 @@ class installer_base { public function configure_database() { global $conf; - //* check sql-mode - /*$check_sql_mode = $this->db->queryOneRecord("SELECT @@sql_mode"); - - if ($check_sql_mode['@@sql_mode'] != '' && $check_sql_mode['@@sql_mode'] != 'NO_ENGINE_SUBSTITUTION') { - echo "Wrong SQL-mode. You should use NO_ENGINE_SUBSTITUTION. Add\n\n"; - echo " sql-mode=\"NO_ENGINE_SUBSTITUTION\"\n\n"; - echo"to the mysqld-section in your mysql-config on this server and restart mysqld afterwards\n"; - die(); - }*/ - - $unwanted_sql_plugins = array('validate_password'); - $sql_plugins = $this->db->queryAllRecords("SELECT plugin_name FROM information_schema.plugins WHERE plugin_status='ACTIVE' AND plugin_name IN ?", $unwanted_sql_plugins); - if(is_array($sql_plugins) && !empty($sql_plugins)) { - foreach ($sql_plugins as $plugin) echo "Login in to MySQL and disable $plugin[plugin_name] with:\n\n UNINSTALL PLUGIN $plugin[plugin_name];"; - die(); + //** Check for unwanted plugins + if ($this->db->getDatabaseType() == 'mysql' && $this->db->getDatabaseVersion(true) >= 8) { + // component approach since MySQL 8.0 + $unwanted_components = [ + 'file://component_validate_password', + ]; + $sql_components = $this->db->queryAllRecords("SELECT * FROM mysql.component where component_urn IN ?", $unwanted_components); + if(is_array($sql_components) && !empty($sql_components)) { + foreach ($sql_components as $component) { + $component_name = parse_url($component['component_urn'], PHP_URL_HOST); + echo "Login in to MySQL and disable '{$component_name}' with:\n\n UNINSTALL COMPONENT '{$component['component_urn']}';\n\n"; + } + die(); + } + } else { + $unwanted_sql_plugins = array('validate_password'); + $sql_plugins = $this->db->queryAllRecords("SELECT plugin_name FROM information_schema.plugins WHERE plugin_status='ACTIVE' AND plugin_name IN ?", $unwanted_sql_plugins); + if(is_array($sql_plugins) && !empty($sql_plugins)) { + foreach ($sql_plugins as $plugin) echo "Login in to MySQL and disable $plugin[plugin_name] with:\n\n UNINSTALL PLUGIN $plugin[plugin_name];"; + die(); + } } //** Create the database @@ -299,6 +373,15 @@ class installer_base { $this->error('Unable to grant databse permissions to user: '.$conf['mysql']['ispconfig_user'].' Error: '.$this->db->errorMessage); } + // add correct administrative rights to IPSConfig user (SUPER is deprecated and unnecessarily powerful) + if ($this->db->getDatabaseType() == 'mysql' && $this->db->getDatabaseVersion(true) >= 8) { + // there might be more needed on replicated db environments, this was not tested + $query = 'GRANT SYSTEM_VARIABLES_ADMIN ON *.* TO ?@?'; + if(!$this->db->query($query, $conf['mysql']['ispconfig_user'], $from_host)) { + $this->error('Unable to grant administrative permissions to user: '.$conf['mysql']['ispconfig_user'].' Error: '.$this->db->errorMessage); + } + } + //* Set the database name in the DB library $this->db->setDBName($conf['mysql']['database']); @@ -356,8 +439,11 @@ class installer_base { } } + // preserve needed values in $conf (should just array_merge $tpl_ini_array into $conf?) + $conf['mail']['content_filter'] = $tpl_ini_array['mail']['content_filter']; + $server_ini_content = array_to_ini($tpl_ini_array); - + $mail_server_enabled = ($conf['services']['mail'])?1:0; $web_server_enabled = ($conf['services']['web'])?1:0; $dns_server_enabled = ($conf['services']['dns'])?1:0; @@ -409,80 +495,92 @@ class installer_base { } - + + public function get_host_ips() { + $out = array(); + exec('hostname --all-ip-addresses', $ret, $val); + if($val == 0) { + if(is_array($ret) && !empty($ret)){ + $temp = (explode(' ', $ret[0])); + foreach($temp as $ip) { + $out[] = $ip; + } + } + } + + return $out; + } + public function detect_ips(){ global $conf; - exec("ip addr show | awk '/global/ { print $2 }' | cut -d '/' -f 1", $output, $retval); - - if($retval == 0){ - if(is_array($output) && !empty($output)){ - foreach($output as $line){ - $line = trim($line); - $ip_type = ''; - if (filter_var($line, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) { - $ip_type = 'IPv4'; - } - if (filter_var($line, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) { - $ip_type = 'IPv6'; - } - if($ip_type == '') continue; - if($this->db->dbHost != $this->dbmaster->dbHost){ - $this->dbmaster->query('INSERT INTO server_ip ( - sys_userid, sys_groupid, sys_perm_user, sys_perm_group, - sys_perm_other, server_id, client_id, ip_type, ip_address, - virtualhost, virtualhost_port - ) VALUES ( - 1, - 1, - "riud", - "riud", - "", - ?, - 0, - ?, - ?, - "y", - "80,443" - )', $conf['server_id'], $ip_type, $line); - $server_ip_id = $this->dbmaster->insertID(); - $this->db->query('INSERT INTO server_ip ( - server_php_id, sys_userid, sys_groupid, sys_perm_user, sys_perm_group, - sys_perm_other, server_id, client_id, ip_type, ip_address, - virtualhost, virtualhost_port - ) VALUES ( - ?, - 1, - 1, - "riud", - "riud", - "", - ?, - 0, - ?, - ?, - "y", - "80,443" - )', $server_ip_id, $conf['server_id'], $ip_type, $line); - } else { - $this->db->query('INSERT INTO server_ip ( - sys_userid, sys_groupid, sys_perm_user, sys_perm_group, - sys_perm_other, server_id, client_id, ip_type, ip_address, - virtualhost, virtualhost_port - ) VALUES ( - 1, - 1, - "riud", - "riud", - "", - ?, - 0, - ?, - ?, - "y", - "80,443" - )', $conf['server_id'], $ip_type, $line); - } + $output = $this->get_host_ips(); + + if(is_array($output) && !empty($output)){ + foreach($output as $line){ + $ip_type = ''; + if (filter_var($line, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) { + $ip_type = 'IPv4'; + } + if (filter_var($line, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) { + $ip_type = 'IPv6'; + } + if($ip_type == '') continue; + if($this->db->dbHost != $this->dbmaster->dbHost){ + $this->dbmaster->query('INSERT INTO server_ip ( + sys_userid, sys_groupid, sys_perm_user, sys_perm_group, + sys_perm_other, server_id, client_id, ip_type, ip_address, + virtualhost, virtualhost_port + ) VALUES ( + 1, + 1, + "riud", + "riud", + "", + ?, + 0, + ?, + ?, + "n", + "80,443" + )', $conf['server_id'], $ip_type, $line); + $server_ip_id = $this->dbmaster->insertID(); + $this->db->query('INSERT INTO server_ip ( + server_php_id, sys_userid, sys_groupid, sys_perm_user, sys_perm_group, + sys_perm_other, server_id, client_id, ip_type, ip_address, + virtualhost, virtualhost_port + ) VALUES ( + ?, + 1, + 1, + "riud", + "riud", + "", + ?, + 0, + ?, + ?, + "n", + "80,443" + )', $server_ip_id, $conf['server_id'], $ip_type, $line); + } else { + $this->db->query('INSERT INTO server_ip ( + sys_userid, sys_groupid, sys_perm_user, sys_perm_group, + sys_perm_other, server_id, client_id, ip_type, ip_address, + virtualhost, virtualhost_port + ) VALUES ( + 1, + 1, + "riud", + "riud", + "", + ?, + 0, + ?, + ?, + "n", + "80,443" + )', $conf['server_id'], $ip_type, $line); } } } @@ -509,15 +607,23 @@ class installer_base { //* insert the ispconfig user in the remote server $from_host = $conf['hostname']; - $from_ip = gethostbyname($conf['hostname']); - $hosts[$from_host]['user'] = $conf['mysql']['master_ispconfig_user']; $hosts[$from_host]['db'] = $conf['mysql']['master_database']; $hosts[$from_host]['pwd'] = $conf['mysql']['master_ispconfig_password']; - $hosts[$from_ip]['user'] = $conf['mysql']['master_ispconfig_user']; - $hosts[$from_ip]['db'] = $conf['mysql']['master_database']; - $hosts[$from_ip]['pwd'] = $conf['mysql']['master_ispconfig_password']; + $host_ips = $this->get_host_ips(); + if(is_array($host_ips) && !empty($host_ips)) { + foreach($host_ips as $ip) { + $hosts[$ip]['user'] = $conf['mysql']['master_ispconfig_user']; + $hosts[$ip]['db'] = $conf['mysql']['master_database']; + $hosts[$ip]['pwd'] = $conf['mysql']['master_ispconfig_password']; + } + } else { + $from_ip = gethostbyname($conf['hostname']); + $hosts[$from_ip]['user'] = $conf['mysql']['master_ispconfig_user']; + $hosts[$from_ip]['db'] = $conf['mysql']['master_database']; + $hosts[$from_ip]['pwd'] = $conf['mysql']['master_ispconfig_password']; + } } else{ /* * it is NOT a master-slave - Setup so we have to find out all clients and their @@ -588,9 +694,6 @@ class installer_base { if ($verbose){ echo $query ."\n"; } - if(!$this->dbmaster->query($query, $value['db'] . '.software_update_inst', $value['user'], $host)) { - $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(`updated`) ON ?? TO ?@?"; if ($verbose){ @@ -608,6 +711,14 @@ 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 ON ?? TO ?@?"; + if ($verbose){ + echo $query ."\n"; + } + if(!$this->dbmaster->query($query, $value['db'] . '.web_database', $value['user'], $host)) { + $this->warning('Unable to set rights of user in master database: '.$value['db']."\n Query: ".$query."\n Error: ".$this->dbmaster->errorMessage); + } + $query = "GRANT SELECT ON ?? TO ?@?"; if ($verbose){ echo $query ."\n"; @@ -655,7 +766,7 @@ class installer_base { if(!$this->dbmaster->query($query, $value['db'] . '.aps_instances', $value['user'], $host)) { $this->warning('Unable to set rights of user in master database: '.$value['db']."\n Query: ".$query."\n Error: ".$this->dbmaster->errorMessage); } - + $query = "GRANT SELECT, DELETE ON ?? TO ?@?"; if ($verbose){ echo $query ."\n"; @@ -679,15 +790,15 @@ class installer_base { if(!$this->dbmaster->query($query, $value['db'] . '.mail_backup', $value['user'], $host)) { $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"; } if(!$this->dbmaster->query($query, $value['db'] . '.dns_soa', $value['user'], $host)) { $this->warning('Unable to set rights of user in master database: '.$value['db']."\n Query: ".$query."\n Error: ".$this->dbmaster->errorMessage); } - + $query = "GRANT SELECT, INSERT, UPDATE ON ?? TO ?@?"; if ($verbose){ echo $query ."\n"; @@ -707,18 +818,45 @@ class installer_base { global $conf; $config_dir = $conf['postfix']['config_dir'].'/'; + $postfix_group = $conf['postfix']['group']; $full_file_name = $config_dir.$configfile; + //* Backup exiting file if(is_file($full_file_name)) { copy($full_file_name, $config_dir.$configfile.'~'); + chmod($config_dir.$configfile.'~',0600); + } + + exec('postconf -h recipient_delimiter 2>/dev/null', $out); + if (strlen($out[0]) > 0) { + // build string like: CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX('%u', '%%', 1), '+', 1), '@%d') + $addr_cleanup = "'%u'"; + foreach (str_split($out[0]) as $delim) { + $recipient_delimiter = $this->db->escape( str_replace('%', '%%', $delim) ); + $addr_cleanup = "SUBSTRING_INDEX(${addr_cleanup}, '${recipient_delimiter}', 1)"; + } + $no_addr_extension = "CONCAT(${addr_cleanup}, '@%d')"; + } else { + $no_addr_extension = "''"; } + unset($out); + + //* Replace variables in config file template $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master', 'tpl/'.$configfile.'.master'); $content = str_replace('{mysql_server_ispconfig_user}', $conf['mysql']['ispconfig_user'], $content); $content = str_replace('{mysql_server_ispconfig_password}', $conf['mysql']['ispconfig_password'], $content); $content = str_replace('{mysql_server_database}', $conf['mysql']['database'], $content); $content = str_replace('{mysql_server_ip}', $conf['mysql']['ip'], $content); $content = str_replace('{server_id}', $conf['server_id'], $content); + $content = str_replace('{address_without_extension}', $no_addr_extension, $content); wf($full_file_name, $content); + + //* Changing mode and group of the new created config file + caselog('chmod u=rw,g=r,o= '.escapeshellarg($full_file_name).' &> /dev/null', + __FILE__, __LINE__, 'chmod on '.$full_file_name, 'chmod on '.$full_file_name.' failed'); + caselog('chgrp '.escapeshellarg($postfix_group).' '.escapeshellarg($full_file_name).' &> /dev/null', + __FILE__, __LINE__, 'chgrp on '.$full_file_name, 'chgrp on '.$full_file_name.' failed'); + } public function configure_jailkit() { @@ -754,6 +892,20 @@ class installer_base { public function configure_mailman($status = 'insert') { global $conf; + // Fix for #6314: bug on Debian 11 systems where Mailman3 is not available and broken routes exist in the Mailman config + $data_dir = '/var/lib/mailman'; + if (($conf['mailman']['installed'] != true) && is_dir($data_dir)) { + rename($data_dir, $data_dir . '-bk'); + //* 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'); + exec('postmap /var/lib/mailman/data/aliases'); + if(!is_file('/var/lib/mailman/data/virtual-mailman')) touch('/var/lib/mailman/data/virtual-mailman'); + exec('postmap /var/lib/mailman/data/virtual-mailman'); + if(!is_file('/var/lib/mailman/data/transport-mailman')) touch('/var/lib/mailman/data/transport-mailman'); + exec('postmap /var/lib/mailman/data/transport-mailman'); + } + $config_dir = $conf['mailman']['config_dir'].'/'; $full_file_name = $config_dir.'mm_cfg.py'; //* Backup exiting file @@ -844,88 +996,122 @@ class installer_base { exec ("postconf -M $service.$type 2> /dev/null", $out, $ret); } $postfix_service = @($out[0]=='')?false:true; - } else { //* fallback - Postfix < 2.9 + } else { //* fallback - Postfix < 2.9 $content = rf($conf['postfix']['config_dir'].'/master.cf'); - $regex = "/^((?!#)".$service.".*".$type.".*)$/m"; - $postfix_service = @(preg_match($regex, $content))?true:false; + $quoted_regex = "^((?!#)".preg_quote($service, '/').".*".preg_quote($type, '/').".*)$"; + $postfix_service = @(preg_match("/$quoted_regex/m", $content))?true:false; } return $postfix_service; } - public function configure_postfix($options = '') { - global $conf,$autoinstall; - $cf = $conf['postfix']; - $config_dir = $cf['config_dir']; + public function remove_postfix_service( $service, $type ) { + global $conf; - if(!is_dir($config_dir)) { - $this->error("The postfix configuration directory '$config_dir' does not exist."); + // nothing to do if the service isn't even defined. + if (! $this->get_postfix_service( $service, $type ) ) { + return true; } - //* mysql-virtual_domains.cf - $this->process_postfix_config('mysql-virtual_domains.cf'); + $postfix_version = `postconf -d mail_version 2>/dev/null`; + $postfix_version = preg_replace( '/mail_version\s*=\s*(.*)\s*/', '$1', $postfix_version ); - //* mysql-virtual_forwardings.cf - $this->process_postfix_config('mysql-virtual_forwardings.cf'); + if ( version_compare( $postfix_version, '2.11', '>=' ) ) { - //* mysql-virtual_mailboxes.cf - $this->process_postfix_config('mysql-virtual_mailboxes.cf'); + exec("postconf -X -M $service/$type 2> /dev/null", $out, $ret); - //* mysql-virtual_email2email.cf - $this->process_postfix_config('mysql-virtual_email2email.cf'); + # reduce 3 or more newlines to 2 + $content = rf($conf['postfix']['config_dir'].'/master.cf'); + $content = preg_replace( '/(\r?\n){3,}/', '$1$1', $content ); + wf( $conf['postfix']['config_dir'].'/master.cf', $content ); - //* mysql-virtual_transports.cf - $this->process_postfix_config('mysql-virtual_transports.cf'); + } else { //* fallback - Postfix < 2.11 - //* mysql-virtual_recipient.cf - $this->process_postfix_config('mysql-virtual_recipient.cf'); + if ( ! $cf = fopen( $conf['postfix']['config_dir'].'/master.cf', 'r' ) ) { + return false; + } - //* mysql-virtual_sender.cf - $this->process_postfix_config('mysql-virtual_sender.cf'); + $out = ""; + $reading_service = false; - //* mysql-virtual_sender_login_maps.cf - $this->process_postfix_config('mysql-virtual_sender_login_maps.cf'); + while ( !feof( $cf ) ) { + $line = fgets( $cf ); - //* mysql-virtual_client.cf - $this->process_postfix_config('mysql-virtual_client.cf'); + $quoted_regex = '^'.preg_quote($service, '/').'\s+'.preg_quote($type, '/'); + if ( $reading_service ) { + # regex matches a new service or "empty" (whitespace) line + if ( preg_match( '/^([^\s#]+.*|\s*)$/', $line ) && + ! preg_match( "/$quoted_regex/", $line ) ) { + $out .= $line; + $reading_service = false; + } - //* mysql-virtual_relaydomains.cf - $this->process_postfix_config('mysql-virtual_relaydomains.cf'); + # $skipped_lines .= $line; - //* mysql-virtual_relayrecipientmaps.cf - $this->process_postfix_config('mysql-virtual_relayrecipientmaps.cf'); - - //* mysql-virtual_outgoing_bcc.cf - $this->process_postfix_config('mysql-virtual_outgoing_bcc.cf'); + # regex matches definition matching service to be removed + } else if ( preg_match( "/$quoted_regex/", $line ) ) { - //* mysql-virtual_policy_greylist.cf - $this->process_postfix_config('mysql-virtual_policy_greylist.cf'); + $reading_service = true; + # $skipped_lines .= $line; - //* mysql-virtual_gids.cf.master - $this->process_postfix_config('mysql-virtual_gids.cf'); + } else { + $out .= $line; + } + } + fclose( $cf ); + + $out = preg_replace( '/(\r?\n){3,}/', '$1$1', $out ); # reduce 3 or more newlines to 2 + + return wf( $conf['postfix']['config_dir'].'/master.cf', $out ); + } + + return true; + } + + public 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."); + } + + //* Get postfix version + exec('postconf -d mail_version 2>&1', $out); + $postfix_version = preg_replace('/.*=\s*/', '', $out[0]); + unset($out); - //* mysql-virtual_uids.cf - $this->process_postfix_config('mysql-virtual_uids.cf'); + //* 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'); + + // test if lmtp if available + $configure_lmtp = $this->get_postfix_service('lmtp','unix'); //* 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'); + if($configure_lmtp) { + $content = preg_replace('/amavis:/', 'lmtp:', $content); + } 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'); + if($configure_lmtp) { + $content = preg_replace('/amavis:/', 'lmtp:', $content); + } wf($full_file_name, $content); - //* Changing mode and group of the new created config files. - caselog('chmod u=rw,g=r,o= '.$config_dir.'/mysql-virtual_*.cf* &> /dev/null', - __FILE__, __LINE__, 'chmod on mysql-virtual_*.cf*', 'chmod on mysql-virtual_*.cf* failed'); - caselog('chgrp '.$cf['group'].' '.$config_dir.'/mysql-virtual_*.cf* &> /dev/null', - __FILE__, __LINE__, 'chgrp on mysql-virtual_*.cf*', 'chgrp on mysql-virtual_*.cf* failed'); - //* 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"); @@ -938,7 +1124,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'])); @@ -953,14 +1139,30 @@ class installer_base { if($conf['postgrey']['installed'] == true) { $greylisting = ', check_recipient_access mysql:/etc/postfix/mysql-virtual_policy_greylist.cf'; } - + $reject_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_authenticated_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); - - $tmp = str_replace('.','\.',$conf['hostname']); + + $myhostname = str_replace('.','\.',$conf['hostname']); $postconf_placeholders = array('{config_dir}' => $config_dir, '{vmail_mailbox_base}' => $cf['vmail_mailbox_base'], @@ -969,13 +1171,52 @@ class installer_base { '{rbl_list}' => $rbl_list, '{greylisting}' => $greylisting, '{reject_slm}' => $reject_sender_login_mismatch, - '{myhostname}' => $tmp, + '{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/debian_postfix.conf.master', 'tpl/debian_postfix.conf.master'); $postconf_tpl = strtr($postconf_tpl, $postconf_placeholders); $postconf_commands = array_filter(explode("\n", $postconf_tpl)); // read and remove empty lines + //* Merge version-specific postfix config + if(version_compare($postfix_version , '2.5', '>=')) { + $configfile = 'postfix_2-5.conf'; + $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master', 'tpl/'.$configfile.'.master'); + $content = strtr($content, $postconf_placeholders); + $postconf_commands = array_merge($postconf_commands, array_filter(explode("\n", $content))); + } + if(version_compare($postfix_version , '2.10', '>=')) { + $configfile = 'postfix_2-10.conf'; + $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master', 'tpl/'.$configfile.'.master'); + $content = strtr($content, $postconf_placeholders); + $postconf_commands = array_merge($postconf_commands, array_filter(explode("\n", $content))); + } + if(version_compare($postfix_version , '3.0', '>=')) { + $configfile = 'postfix_3-0.conf'; + $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master', 'tpl/'.$configfile.'.master'); + $content = strtr($content, $postconf_placeholders); + $postconf_commands = array_merge($postconf_commands, array_filter(explode("\n", $content))); + } + if(version_compare($postfix_version , '3.3', '>=')) { + $configfile = 'postfix_3-3.conf'; + $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master', 'tpl/'.$configfile.'.master'); + $content = strtr($content, $postconf_placeholders); + $postconf_commands = array_merge($postconf_commands, array_filter(explode("\n", $content))); + } + $configfile = 'postfix_custom.conf'; + if(file_exists($conf['ispconfig_install_dir'].'/server/conf-custom/install/' . $configfile . '.master')) { + $content = file_get_contents($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master'); + $content = strtr($content, $postconf_placeholders); + $postconf_commands = array_merge($postconf_commands, array_filter(explode("\n", $content))); + } + + // Remove comment lines, these would give fatal errors when passed to postconf. + $postconf_commands = array_filter($postconf_commands, function($line) { return preg_match('/^[^#]/', $line); }); + //* These postconf commands will be executed on installation only if($this->is_update == false) { $postconf_commands = array_merge($postconf_commands, array( @@ -990,6 +1231,7 @@ class installer_base { 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'); @@ -1050,13 +1292,13 @@ class installer_base { if(is_file('/var/run/courier/authdaemon/')) caselog($command.' &> /dev/null', __FILE__, __LINE__, 'EXECUTED: '.$command, 'Failed to execute the command '.$command); //* Check maildrop service in posfix master.cf - $regex = "/^maildrop unix.*pipe flags=DRhu user=vmail argv=\\/usr\\/bin\\/maildrop -d ".$cf['vmail_username']." \\$\{extension} \\$\{recipient} \\$\{user} \\$\{nexthop} \\$\{sender}/"; + $quoted_regex = '^maildrop unix.*pipe flags=DRhu user=vmail '.preg_quote('argv=/usr/bin/maildrop -d '.$cf['vmail_username'].' ${extension} ${recipient} ${user} ${nexthop} ${sender}', '/'); $configfile = $config_dir.'/master.cf'; if($this->get_postfix_service('maildrop', 'unix')) { exec ("postconf -M maildrop.unix 2> /dev/null", $out, $ret); - $change_maildrop_flags = @(preg_match($regex, $out[0]) && $out[0] !='')?false:true; + $change_maildrop_flags = @(preg_match("/$quoted_regex/", $out[0]) && $out[0] !='')?false:true; } else { - $change_maildrop_flags = @(preg_match($regex, $configfile))?false:true; + $change_maildrop_flags = @(preg_match("/$quoted_regex/", $configfile))?false:true; } if ($change_maildrop_flags) { //* Change maildrop service in posfix master.cf @@ -1097,7 +1339,7 @@ class installer_base { caselog($command." &> /dev/null", __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); } - + public function configure_saslauthd() { global $conf; @@ -1213,17 +1455,22 @@ class installer_base { public function configure_dovecot() { global $conf; - + $virtual_transport = 'dovecot'; $configure_lmtp = false; - + + // use lmtp if installed + if($configure_lmtp = (is_file('/usr/lib/dovecot/lmtp') || is_file('/usr/libexec/dovecot/lmtp'))) { + $virtual_transport = 'lmtp:unix:private/dovecot-lmtp'; + } + // check if virtual_transport must be changed if ($this->is_update) { $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; @@ -1231,6 +1478,9 @@ class installer_base { } $config_dir = $conf['postfix']['config_dir']; + $quoted_config_dir = preg_quote($config_dir, '|'); + $postfix_version = `postconf -d mail_version 2>/dev/null`; + $postfix_version = preg_replace( '/mail_version\s*=\s*(.*)\s*/', '$1', $postfix_version ); //* Configure master.cf and add a line for deliver if(!$this->get_postfix_service('dovecot', 'unix')) { @@ -1242,7 +1492,7 @@ class installer_base { chmod($config_dir.'/master.cf~2', 0400); } //* Configure master.cf and add a line for deliver - $content = rf($conf["postfix"]["config_dir"].'/master.cf'); + $content = rf($config_dir.'/master.cf'); $deliver_content = 'dovecot unix - n n - - pipe'."\n".' flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -f ${sender} -d ${user}@${nexthop}'."\n"; af($config_dir.'/master.cf', $deliver_content); unset($content); @@ -1259,7 +1509,31 @@ class installer_base { ); // Make a backup copy of the main.cf file - copy($conf['postfix']['config_dir'].'/main.cf', $conf['postfix']['config_dir'].'/main.cf~3'); + copy($config_dir.'/main.cf', $config_dir.'/main.cf~3'); + + $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 && (!isset($conf['mail']['content_filter']) || $conf['mail']['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:${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); // Executing the postconf commands foreach($postconf_commands as $cmd) { @@ -1292,6 +1566,13 @@ class installer_base { } else { copy('tpl/debian_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, '<')) { @@ -1307,7 +1588,7 @@ class 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.'); @@ -1327,10 +1608,10 @@ class installer_base { } //remove #2.3+ comment $content = file_get_contents($config_dir.'/'.$configfile); - $content = str_replace('#2.3+','',$content); + $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 ='); @@ -1338,11 +1619,20 @@ class installer_base { } } + $dovecot_protocols = 'imap pop3'; + //* dovecot-lmtpd if($configure_lmtp) { - replaceLine($config_dir.'/'.$configfile, 'protocols = imap pop3', 'protocols = imap pop3 lmtp', 1, 0); + $dovecot_protocols .= ' lmtp'; + } + + //* dovecot-managesieved + if(is_file('/usr/lib/dovecot/managesieve') || is_file('/usr/libexec/dovecot/managesieve')) { + $dovecot_protocols .= ' sieve'; } + replaceLine($config_dir.'/'.$configfile, 'protocols = imap pop3', "protocols = $dovecot_protocols", 1, 0); + //* dovecot-sql.conf $configfile = 'dovecot-sql.conf'; if(is_file($config_dir.'/'.$configfile)) { @@ -1365,7 +1655,7 @@ class 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"); @@ -1374,6 +1664,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 = $conf['services']['mail']; + 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~'); @@ -1386,56 +1682,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'); + + $config_dir = $conf['postfix']['config_dir']; + $quoted_config_dir = preg_quote($config_dir, '|'); - // TODO: chmod and chown on the config file + $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'); + + // Adding the amavisd commands to the postfix configuration + $postconf_commands = array (); + + // 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'; + } + $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); - // Adding the amavisd commands to the postfix configuration - // Add array for no error in foreach and maybe future options - $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']) { - $postconf_commands[] = 'content_filter = amavis:[127.0.0.1]:10024'; - $postconf_commands[] = 'receive_override_options = no_address_mappings'; - } + // 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"); + } - // 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 - // 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"); - } + // backup master.cf + if(is_file($config_dir.'/master.cf')) copy($config_dir.'/master.cf', $config_dir.'/master.cf~'); - $config_dir = $conf['postfix']['config_dir']; + // 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'); - // 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 + // 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); - 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); - } + $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 @@ -1463,16 +1787,23 @@ class installer_base { public function configure_rspamd() { 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 = $conf['services']['mail']; 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'"); @@ -1480,37 +1811,84 @@ class installer_base { exec("postconf -e 'milter_mail_macros = i {mail_addr} {client_addr} {client_name} {auth_authen}'"); exec("postconf -e 'milter_default_action = accept'"); - exec("postconf -e 'smtpd_sender_restrictions = check_sender_access mysql:/etc/postfix/mysql-virtual_sender.cf, permit_mynetworks, permit_sasl_authenticated'"); - + if(! isset($mail_config['reject_sender_login_mismatch'])) { + $mail_config['reject_sender_login_mismatch'] = 'n'; + } + $options = preg_split("/,\s*/", exec("postconf -h smtpd_sender_restrictions")); $new_options = array(); + foreach ($options as $key => $value) { + $value = trim($value); + if ($value == '') continue; + if (preg_match('/tag_as_(originating|foreign)\.re/', $value)) { + continue; + } + if (preg_match('/reject_(authenticated_)?sender_login_mismatch/', $value)) { + continue; + } + $new_options[] = $value; + } + if ($mail_config['reject_sender_login_mismatch'] == 'y') { + // insert before permit_mynetworks + for ($i = 0; isset($new_options[$i]); $i++) { + if ($new_options[$i] == 'permit_mynetworks') { + array_splice($new_options, $i, 0, array('reject_authenticated_sender_login_mismatch')); + break; + } + } + + // insert before permit_sasl_authenticated + for ($i = 0; isset($new_options[$i]); $i++) { + if ($new_options[$i] == 'permit_sasl_authenticated') { + array_splice($new_options, $i, 0, array('reject_sender_login_mismatch')); + break; + } + } + } + exec("postconf -e 'smtpd_sender_restrictions = ".implode(", ", $new_options)."'"); + $options = preg_split("/,\s*/", exec("postconf -h smtpd_recipient_restrictions")); + $new_options = array(); foreach ($options as $value) { - if (!preg_match('/check_policy_service\s+inet:127.0.0.1:10023/', $value)) { - $new_options[] = $value; + $value = trim($value); + if ($value == '') continue; + 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)."'"); - + } if(is_user('_rspamd') && is_group('amavis')) { - exec("usermod -G amavis _rspamd"); + exec("usermod -a -G amavis _rspamd"); } elseif(is_user('rspamd') && is_group('amavis')) { - exec("usermod -G amavis rspamd"); + exec("usermod -a -G amavis rspamd"); } - + 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) == '/' ) { $mail_config['dkim_path'] = substr($mail_config['dkim_path'], 0, strlen($mail_config['dkim_path'])-1); } $dkim_domains = $this->db->queryAllRecords('SELECT `dkim_selector`, `domain` FROM ?? WHERE `dkim` = ? ORDER BY `domain` ASC', $conf['mysql']['database'] . '.mail_domain', 'y'); + # should move maps to local.d/maps.d/ ? $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) { @@ -1521,114 +1899,121 @@ class installer_base { fclose($fps); unset($dkim_domains); - $tpl = new tpl(); - $tpl->newTemplate('rspamd_users.conf.master'); - - $whitelist_ips = array(); - $ips = $this->db->queryAllRecords("SELECT * FROM server_ip WHERE server_id = ?", $conf['server_id']); + # 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){ - $whitelist_ips[] = array('ip' => $ip['ip_address']); + $local_addrs[] = array( + 'ip' => $ip['ip_address'], + 'quoted_ip' => "\"".$ip['ip_address']."\",\n" + ); } } - $tpl->setLoop('whitelist_ips', $whitelist_ips); - wf('/etc/rspamd/local.d/users.conf', $tpl->grab()); - if(file_exists($conf['ispconfig_install_dir'].'/server/conf-custom/install/rspamd_groups.conf.master')) { - exec('cp '.$conf['ispconfig_install_dir'].'/server/conf-custom/install/rspamd_groups.conf.master /etc/rspamd/local.d/groups.conf'); - } else { - exec('cp tpl/rspamd_groups.conf.master /etc/rspamd/local.d/groups.conf'); - } - - if(file_exists($conf['ispconfig_install_dir'].'/server/conf-custom/install/rspamd_antivirus.conf.master')) { - exec('cp '.$conf['ispconfig_install_dir'].'/server/conf-custom/install/rspamd_antivirus.conf.master /etc/rspamd/local.d/antivirus.conf'); - } else { - exec('cp tpl/rspamd_antivirus.conf.master /etc/rspamd/local.d/antivirus.conf'); - } - - if(file_exists($conf['ispconfig_install_dir'].'/server/conf-custom/install/rspamd_classifier-bayes.conf.master')) { - exec('cp '.$conf['ispconfig_install_dir'].'/server/conf-custom/install/rspamd_classifier-bayes.conf.master /etc/rspamd/local.d/classifier-bayes.conf'); - } else { - exec('cp tpl/rspamd_classifier-bayes.conf.master /etc/rspamd/local.d/classifier-bayes.conf'); - } - - if(file_exists($conf['ispconfig_install_dir'].'/server/conf-custom/install/rspamd_greylist.conf.master')) { - exec('cp '.$conf['ispconfig_install_dir'].'/server/conf-custom/install/rspamd_greylist.conf.master /etc/rspamd/local.d/greylist.conf'); - } else { - exec('cp tpl/rspamd_greylist.conf.master /etc/rspamd/local.d/greylist.conf'); - } + # 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"); + } - if(file_exists($conf['ispconfig_install_dir'].'/server/conf-custom/install/rspamd_symbols_antivirus.conf.master')) { - exec('cp '.$conf['ispconfig_install_dir'].'/server/conf-custom/install/rspamd_symbols_antivirus.conf.master /etc/rspamd/local.d/antivirus_group.conf'); - } else { - exec('cp tpl/rspamd_symbols_antivirus.conf.master /etc/rspamd/local.d/antivirus_group.conf'); - } + $tpl->setVar('dkim_path', $mail_config['dkim_path']); + $tpl->setVar('rspamd_redis_servers', (isset($mail_config['rspamd_redis_servers']) ? $mail_config['rspamd_redis_servers'] : '')); + $tpl->setVar('rspamd_redis_password', (isset($mail_config['rspamd_redis_password']) ? $mail_config['rspamd_redis_password'] : '')); + $tpl->setVar('rspamd_redis_bayes_servers', (isset($mail_config['rspamd_redis_bayes_servers']) ? $mail_config['rspamd_redis_bayes_servers'] : '')); + $tpl->setVar('rspamd_redis_bayes_password', (isset($mail_config['rspamd_redis_bayes_password']) ? $mail_config['rspamd_redis_bayes_password'] : '')); + if(count($local_addrs) > 0) { + $tpl->setLoop('local_addrs', $local_addrs); + } - if(file_exists($conf['ispconfig_install_dir'].'/server/conf-custom/install/rspamd_override_rbl.conf.master')) { - exec('cp '.$conf['ispconfig_install_dir'].'/server/conf-custom/install/rspamd_override_rbl.conf.master /etc/rspamd/override.d/rbl_group.conf'); - } else { - exec('cp tpl/rspamd_override_rbl.conf.master /etc/rspamd/override.d/rbl_group.conf'); + wf("/etc/rspamd/local.d/${f}", $tpl->grab()); } - if(file_exists($conf['ispconfig_install_dir'].'/server/conf-custom/install/rspamd_override_surbl.conf.master')) { - exec('cp '.$conf['ispconfig_install_dir'].'/server/conf-custom/install/rspamd_override_surbl.conf.master /etc/rspamd/override.d/surbl_group.conf'); - } else { - exec('cp tpl/rspamd_override_surbl.conf.master /etc/rspamd/override.d/surbl_group.conf'); - } - if(file_exists($conf['ispconfig_install_dir'].'/server/conf-custom/install/rspamd_mx_check.conf.master')) { - exec('cp '.$conf['ispconfig_install_dir'].'/server/conf-custom/install/rspamd_mx_check.conf.master /etc/rspamd/local.d/mx_check.conf'); - } else { - exec('cp tpl/rspamd_mx_check.conf.master /etc/rspamd/local.d/mx_check.conf'); + # local.d templates without template tags + $local_d = array( + 'groups.conf', + 'antivirus.conf', + 'mx_check.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")) { + exec('cp '.$conf['ispconfig_install_dir']."/server/conf-custom/install/rspamd_${f}.master /etc/rspamd/local.d/${f}"); + } else { + exec("cp tpl/rspamd_${f}.master /etc/rspamd/local.d/${f}"); + } } - if(file_exists($conf['ispconfig_install_dir'].'/server/conf-custom/install/rspamd_redis.conf.master')) { - exec('cp '.$conf['ispconfig_install_dir'].'/server/conf-custom/install/rspamd_redis.conf.master /etc/rspamd/local.d/redis.conf'); - } else { - exec('cp tpl/rspamd_redis.conf.master /etc/rspamd/local.d/redis.conf'); + # override.d templates without template tags + $override_d = array( + 'rbl_group.conf', + 'surbl_group.conf', + ); + foreach ($override_d as $f) { + if(file_exists($conf['ispconfig_install_dir']."/server/conf-custom/install/rspamd_${f}.master")) { + exec('cp '.$conf['ispconfig_install_dir']."/server/conf-custom/install/rspamd_${f}.master /etc/rspamd/override.d/${f}"); + } else { + exec("cp tpl/rspamd_${f}.master /etc/rspamd/override.d/${f}"); + } } - if(file_exists($conf['ispconfig_install_dir'].'/server/conf-custom/install/rspamd_milter_headers.conf.master')) { - exec('cp '.$conf['ispconfig_install_dir'].'/server/conf-custom/install/rspamd_milter_headers.conf.master /etc/rspamd/local.d/milter_headers.conf'); - } else { - exec('cp tpl/rspamd_milter_headers.conf.master /etc/rspamd/local.d/milter_headers.conf'); + # local.d/maps.d templates without template tags + $maps_d = array( + '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")) { + exec('cp '.$conf['ispconfig_install_dir']."/server/conf-custom/install/rspamd_${f}.master /etc/rspamd/local.d/maps.d/${f}"); + } else { + exec("cp tpl/rspamd_${f}.master /etc/rspamd/local.d/maps.d/${f}"); + } } - if(file_exists($conf['ispconfig_install_dir'].'/server/conf-custom/install/rspamd_options.inc.master')) { - exec('cp '.$conf['ispconfig_install_dir'].'/server/conf-custom/install/rspamd_options.inc.master /etc/rspamd/local.d/options.inc'); - } else { - exec('cp tpl/rspamd_options.inc.master /etc/rspamd/local.d/options.inc'); + # 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"); } - if(file_exists($conf['ispconfig_install_dir'].'/server/conf-custom/install/rspamd_neural.conf.master')) { - exec('cp '.$conf['ispconfig_install_dir'].'/server/conf-custom/install/rspamd_neural.conf.master /etc/rspamd/local.d/neural.conf'); - } else { - exec('cp tpl/rspamd_neural.conf.master /etc/rspamd/local.d/neural.conf'); - } + 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'); + exec('chmod 640 /etc/rspamd/local.d/redis.conf /etc/rspamd/local.d/classifier-bayes.conf'); - if(file_exists($conf['ispconfig_install_dir'].'/server/conf-custom/install/rspamd_neural_group.conf.master')) { - exec('cp '.$conf['ispconfig_install_dir'].'/server/conf-custom/install/rspamd_neural_group.conf.master /etc/rspamd/local.d/neural_group.conf'); - } else { - exec('cp tpl/rspamd_neural_group.conf.master /etc/rspamd/local.d/neural_group.conf'); + if(file_exists('/etc/rspamd/local.d/worker-controller.inc')) { + exec('chgrp _rspamd /etc/rspamd/local.d/worker-controller.inc'); + exec('chmod 640 /etc/rspamd/local.d/worker-controller.inc'); } - $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()); - - exec('chmod a+r /etc/rspamd/local.d/* /etc/rspamd/override.d/*'); - + # unneccesary, since this was done above? $command = 'usermod -a -G amavis _rspamd'; caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - + if(strpos(rf('/etc/rspamd/rspamd.conf'), '.include "$LOCAL_CONFDIR/local.d/users.conf"') === false){ af('/etc/rspamd/rspamd.conf', '.include "$LOCAL_CONFDIR/local.d/users.conf"'); } - + if(!isset($mail_config['rspamd_password']) || !$mail_config['rspamd_password']) { $mail_config['rspamd_password'] = str_shuffle(bin2hex(openssl_random_pseudo_bytes(12))); - + $server_ini_array['mail']['rspamd_password'] = $mail_config['rspamd_password']; } @@ -1640,10 +2025,19 @@ class installer_base { $this->db->query('UPDATE `server` SET `config` = ? WHERE `server_id` = ?', $server_ini_string, $conf['server_id']); unset($server_ini_array); unset($server_ini_string); - + $tpl = new tpl(); - $tpl->newTemplate('rspamd_worker-controller.inc.master'); - $tpl->setVar('rspamd_password', $mail_config['rspamd_password']); + 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) { + $rspamd_password = $crypted_password; + } + $tpl->setVar('rspamd_password', $rspamd_password); wf('/etc/rspamd/local.d/worker-controller.inc', $tpl->grab()); chmod('/etc/rspamd/local.d/worker-controller.inc', 0644); } @@ -1752,17 +2146,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'); } @@ -1783,14 +2177,14 @@ class installer_base { } - + //** writes bind configuration files public function process_bind_file($configfile, $target='/', $absolute=false) { global $conf; if ($absolute) $full_file_name = $target.$configfile; else $full_file_name = $conf['ispconfig_install_dir'].$target.$configfile; - + //* Backup exiting file if(is_file($full_file_name)) { copy($full_file_name, $config_dir.$configfile.'~'); @@ -1822,7 +2216,7 @@ class installer_base { chown($content, $conf['bind']['bind_user']); chgrp($content, $conf['bind']['bind_group']); chmod($content, 02770); - + //* Install scripts for dnssec implementation $this->process_bind_file('named.conf.options', '/etc/bind/', true); //TODO replace hardcoded path } @@ -1942,12 +2336,12 @@ class installer_base { if(is_file('/etc/apache2/ports.conf')) { // add a line "Listen 443" to ports conf if line does not exist replaceLine('/etc/apache2/ports.conf', 'Listen 443', 'Listen 443', 1); - + // Comment out the namevirtualhost lines, as they were added by ispconfig in ispconfig.conf file again replaceLine('/etc/apache2/ports.conf', 'NameVirtualHost *:80', '# NameVirtualHost *:80', 1); replaceLine('/etc/apache2/ports.conf', 'NameVirtualHost *:443', '# NameVirtualHost *:443', 1); } - + if(is_file('/etc/apache2/mods-available/fcgid.conf')) { // add or modify the parameters for fcgid.conf replaceLine('/etc/apache2/mods-available/fcgid.conf','MaxRequestLen','MaxRequestLen 15728640',1); @@ -1962,7 +2356,7 @@ class installer_base { } } } - + if(is_file('/etc/apache2/apache2.conf')) { if(hasLine('/etc/apache2/apache2.conf', 'Include sites-enabled/', 1) == false && hasLine('/etc/apache2/apache2.conf', 'IncludeOptional sites-enabled/', 1) == false) { if(hasLine('/etc/apache2/apache2.conf', 'Include sites-enabled/*.conf', 1) == true) { @@ -1979,16 +2373,16 @@ class installer_base { $tpl = new tpl('apache_ispconfig.conf.master'); $tpl->setVar('apache_version',getapacheversion()); - + if($this->is_update == true) { $tpl->setVar('logging',get_logging_state()); } else { $tpl->setVar('logging','yes'); } - + $records = $this->db->queryAllRecords("SELECT * FROM ?? WHERE server_id = ? AND virtualhost = 'y'", $conf['mysql']['master_database'] . '.server_ip', $conf['server_id']); $ip_addresses = array(); - + if(is_array($records) && count($records) > 0) { foreach($records as $rec) { if($rec['ip_type'] == 'IPv6') { @@ -2007,9 +2401,9 @@ class installer_base { } } } - + if(count($ip_addresses) > 0) $tpl->setLoop('ip_adresses',$ip_addresses); - + wf($vhost_conf_dir.'/ispconfig.conf', $tpl->grab()); unset($tpl); @@ -2069,7 +2463,7 @@ class installer_base { //* add a sshusers group $command = 'groupadd sshusers'; if(!is_group('sshusers')) caselog($command.' &> /dev/null 2> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - + // add anonymized log option to nginxx.conf file $nginx_conf_file = $conf['nginx']['config_dir'].'/nginx.conf'; if(is_file($nginx_conf_file)) { @@ -2079,7 +2473,7 @@ class installer_base { replaceLine($nginx_conf_file, 'http {', "http {\n\n".file_get_contents('tpl/nginx_anonlog.master'), 0, 0); } } - + } public function configure_fail2ban() { @@ -2105,6 +2499,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) { @@ -2239,7 +2640,7 @@ class installer_base { $vhost_conf_dir = $conf['apache']['vhost_conf_dir']; $vhost_conf_enabled_dir = $conf['apache']['vhost_conf_enabled_dir']; $apps_vhost_servername = ($conf['web']['apps_vhost_servername'] == '')?'':'ServerName '.$conf['web']['apps_vhost_servername']; - + //* Get the apps vhost port if($this->is_update == true) { $conf['web']['apps_vhost_port'] = get_apps_vhost_port_number(); @@ -2252,6 +2653,16 @@ class installer_base { $tpl->setVar('apps_vhost_dir',$conf['web']['website_basedir'].'/apps'); $tpl->setVar('apps_vhost_basedir',$conf['web']['website_basedir']); $tpl->setVar('apps_vhost_servername',$apps_vhost_servername); + if(is_file($conf['ispconfig_install_dir'].'/interface/ssl/ispserver.crt') && is_file($conf['ispconfig_install_dir'].'/interface/ssl/ispserver.key')) { + $tpl->setVar('ssl_comment',''); + } else { + $tpl->setVar('ssl_comment','#'); + } + if(is_file($install_dir.'/interface/ssl/ispserver.crt') && is_file($install_dir.'/interface/ssl/ispserver.key') && is_file($install_dir.'/interface/ssl/ispserver.bundle')) { + $tpl->setVar('ssl_bundle_comment',''); + } else { + $tpl->setVar('ssl_bundle_comment','#'); + } $tpl->setVar('apache_version',getapacheversion()); if($this->is_update == true) { $tpl->setVar('logging',get_logging_state()); @@ -2262,9 +2673,9 @@ class installer_base { if($conf['rspamd']['installed'] == true) { $tpl->setVar('use_rspamd', 'yes'); } - + // comment out the listen directive if port is 80 or 443 - if($conf['web']['apps_vhost_ip'] == 80 or $conf['web']['apps_vhost_ip'] == 443) { + if($conf['web']['apps_vhost_port'] == 80 or $conf['web']['apps_vhost_port'] == 443) { $tpl->setVar('vhost_port_listen','#'); } else { $tpl->setVar('vhost_port_listen',''); @@ -2285,11 +2696,12 @@ class installer_base { $content = str_replace('{fastcgi_bin}', $conf['fastcgi']['fastcgi_bin'], $content); $content = str_replace('{fastcgi_phpini_path}', $conf['fastcgi']['fastcgi_phpini_path'], $content); mkdir($conf['web']['website_basedir'].'/php-fcgi-scripts/apps', 0755, true); + $this->set_immutable($conf['web']['website_basedir'].'/php-fcgi-scripts/apps/.php-fcgi-starter', false); //copy('tpl/apache_apps_fcgi_starter.master',$conf['web']['website_basedir'].'/php-fcgi-scripts/apps/.php-fcgi-starter'); wf($conf['web']['website_basedir'].'/php-fcgi-scripts/apps/.php-fcgi-starter', $content); exec('chmod +x '.$conf['web']['website_basedir'].'/php-fcgi-scripts/apps/.php-fcgi-starter'); exec('chown -R ispapps:ispapps '.$conf['web']['website_basedir'].'/php-fcgi-scripts/apps'); - + $this->set_immutable($conf['web']['website_basedir'].'/php-fcgi-scripts/apps/.php-fcgi-starter', true); } } if($conf['nginx']['installed'] == true){ @@ -2324,6 +2736,15 @@ class installer_base { // Dont just copy over the virtualhost template but add some custom settings $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/nginx_apps.vhost.master', 'tpl/nginx_apps.vhost.master'); + // 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 http2', $content); + $content = str_replace('{ssl_comment}', '', $content); + } else { + $content = str_replace('{ssl_on}', '', $content); + $content = str_replace('{ssl_comment}', '#', $content); + } + if($conf['web']['apps_vhost_ip'] == '_default_'){ $apps_vhost_ip = ''; } else { @@ -2335,7 +2756,7 @@ class installer_base { } else { $content = str_replace('{use_rspamd}', '# ', $content); } - + $socket_dir = escapeshellcmd($conf['nginx']['php_fpm_socket_dir']); if(substr($socket_dir, -1) != '/') $socket_dir .= '/'; if(!is_dir($socket_dir)) exec('mkdir -p '.$socket_dir); @@ -2365,17 +2786,19 @@ class installer_base { } $content = str_replace('{use_tcp}', $use_tcp, $content); $content = str_replace('{use_socket}', $use_socket, $content); - - // SSL in apps vhost is off by default. Might change later. - $content = str_replace('{ssl_on}', '', $content); - $content = str_replace('{ssl_comment}', '#', $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); @@ -2395,34 +2818,502 @@ class installer_base { if(!@is_link($vhost_conf_enabled_dir.'/000-apps.vhost')) { symlink($vhost_conf_dir.'/apps.vhost', $vhost_conf_enabled_dir.'/000-apps.vhost'); } + } + } + private function curl_request($url, $use_ipv6 = false) { + $set_headers = [ + 'Connection: Close', + 'User-Agent: ISPConfig/3', + 'Accept: */*' + ]; + + $ch = curl_init($url); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); + curl_setopt($ch, CURLOPT_FORBID_REUSE, 1); + curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); + curl_setopt($ch, CURLOPT_HTTPHEADER, $set_headers); + curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); + curl_setopt($ch, CURLOPT_MAXREDIRS, 5); + + if($use_ipv6) { + if(defined('CURLOPT_IPRESOLVE') && defined('CURL_IPRESOLVE_V6')) { + curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V6); + } + } else { + if(defined('CURLOPT_IPRESOLVE') && defined('CURL_IPRESOLVE_V4')) { + curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4); + } + } + + $response = curl_exec($ch); + curl_close($ch); + + return $response; + } + + public function make_acme_vhost($server = 'apache') { + global $conf; + + if($conf['hostname'] !== 'localhost' && $conf['hostname'] !== '') { + $server_name = $conf['hostname']; + } else { + $server_name = exec('hostname -f'); + } + + $use_template = 'apache_acme.conf.master'; + $use_symlink = '999-acme.conf'; + $use_name = 'acme.conf'; + if($server === 'nginx') { + $use_template = 'nginx_acme.vhost.master'; + $use_symlink = '999-acme.vhost'; + $use_name = 'acme.vhost'; + } + + $vhost_conf_dir = $conf[$server]['vhost_conf_dir']; + $vhost_conf_enabled_dir = $conf[$server]['vhost_conf_enabled_dir']; + + $tpl = new tpl($use_template); + $tpl->setVar('domain', $server_name); + + if($server !== 'nginx') { + $tpl->setVar('apache_version',getapacheversion()); + } + + $acme_dir = $conf['ispconfig_install_dir'] . '/interface/acme'; + + //* Create the ISPConfig installation directory + if(!@is_dir($acme_dir)) { + $command = "mkdir -p $acme_dir"; + caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); + } + + wf($vhost_conf_dir.'/' . $use_name, $tpl->grab()); + + if(@is_link($vhost_conf_enabled_dir.'/' . $use_symlink)) { + unlink($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); } } public function make_ispconfig_ssl_cert() { - global $conf,$autoinstall; + global $conf, $autoinstall; - $install_dir = $conf['ispconfig_install_dir']; + //* Get hostname from user entry or shell command */ + if($conf['hostname'] !== 'localhost' && $conf['hostname'] !== '') { + $hostname = $conf['hostname']; + } else { + $hostname = exec('hostname -f'); + } - $ssl_crt_file = $install_dir.'/interface/ssl/ispserver.crt'; - $ssl_csr_file = $install_dir.'/interface/ssl/ispserver.csr'; - $ssl_key_file = $install_dir.'/interface/ssl/ispserver.key'; + // Check dns a record exist and its ip equal to server public ip + $svr_ip4 = $this->curl_request('https://ispconfig.org/remoteip.php', false); + $svr_ip6 = $this->curl_request('https://ispconfig.org/remoteip.php', true); - if(!@is_dir($install_dir.'/interface/ssl')) mkdir($install_dir.'/interface/ssl', 0755, true); + if(function_exists('idn_to_ascii')) { + if(defined('IDNA_NONTRANSITIONAL_TO_ASCII') && defined('INTL_IDNA_VARIANT_UTS46') && constant('IDNA_NONTRANSITIONAL_TO_ASCII')) { + $hostname = idn_to_ascii($hostname, IDNA_NONTRANSITIONAL_TO_ASCII, INTL_IDNA_VARIANT_UTS46); + } else { + $hostname = idn_to_ascii($hostname); + } + } + $dns_ips = array(); + if (checkdnsrr($hostname, 'A')) { + $dnsa=dns_get_record($hostname, DNS_A); + if($dnsa) { + foreach ($dnsa as $rec) { + $dns_ips[] = $rec['ip']; + } + } + } + if (checkdnsrr($hostname, 'AAAA')) { + $dnsaaaa=dns_get_record($hostname, DNS_AAAA); + if($dnsaaaa) { + foreach ($dnsaaaa as $rec) { + $dns_ips[] = $rec['ip']; + } + } + } - $ssl_pw = substr(md5(mt_rand()), 0, 6); - exec("openssl genrsa -des3 -passout pass:$ssl_pw -out $ssl_key_file 4096"); - 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"); + //* Define and check ISPConfig SSL folder */ + $ssl_dir = $conf['ispconfig_install_dir'].'/interface/ssl'; + if(!@is_dir($ssl_dir)) { + mkdir($ssl_dir, 0755, true); + } + + $ssl_crt_file = $ssl_dir.'/ispserver.crt'; + $ssl_csr_file = $ssl_dir.'/ispserver.csr'; + $ssl_key_file = $ssl_dir.'/ispserver.key'; + $ssl_pem_file = $ssl_dir.'/ispserver.pem'; + + $date = new DateTime(); + + // Request for certs if no LE SSL folder for server fqdn exist + + swriteln('Checking / creating certificate for ' . $hostname); + + $acme_cert_dir = '/usr/local/ispconfig/server/scripts/' . $hostname; + $check_acme_file = $acme_cert_dir . '/' . $hostname . '.cer'; + if(!@is_dir($acme_cert_dir)) { + $acme_cert_dir = '/root/.acme.sh/' . $hostname; + $check_acme_file = $acme_cert_dir . '/' . $hostname . '.cer'; + if(!@is_dir($acme_cert_dir)) { + $acme_cert_dir = '/etc/letsencrypt/live/' . $hostname; + $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)); + if(strtolower($this->simple_query('Ignore DNS check and continue to request certificate?', array('y', 'n') , 'n','ignore_hostname_dns')) == 'y') { + $ip_address_match = true; + } } else { - exec("openssl req -new -passin pass:$ssl_pw -passout pass:$ssl_pw -key $ssl_key_file -out $ssl_csr_file"); + $ip_address_match = true; } - 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('chown -R root:root /usr/local/ispconfig/interface/ssl'); + + // Get subject and issuer of ispserver.crt to check if it is self-signed cert + if (file_exists($ssl_crt_file)) { + $crt_subject = exec("openssl x509 -in ".escapeshellarg($ssl_crt_file)." -inform PEM -noout -subject"); + $crt_issuer = exec("openssl x509 -in ".escapeshellarg($ssl_crt_file)." -inform PEM -noout -issuer"); + } + + if ((@file_exists($ssl_crt_file) && ($crt_subject == $crt_issuer)) || (!@is_dir($acme_cert_dir) || !@file_exists($check_acme_file) || !@file_exists($ssl_crt_file) || md5_file($check_acme_file) != md5_file($ssl_crt_file)) && $ip_address_match == true) { + + // 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); + } + + // Check http port 80 status as it cannot be determined at post hook stage + $port80_status=exec('true &>/dev/null install_acme(); + if(!$success) { + swriteln('Failed installing acme.sh. Will not be able to issue certificate during install.'); + } else { + $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.'); + } + } + } + + $restore_conf_symlink = false; + + // we only need this for apache, so use fixed conf index + $vhost_conf_dir = $conf['apache']['vhost_conf_dir']; + $vhost_conf_enabled_dir = $conf['apache']['vhost_conf_enabled_dir']; + + // first of all create the acme vhosts if not existing + if($conf['nginx']['installed'] == true) { + swriteln('Using nginx for certificate validation'); + $server = 'nginx'; + } elseif($conf['apache']['installed'] == true) { + swriteln('Using apache for certificate validation'); + if($this->is_update == false && @is_link($vhost_conf_enabled_dir.'/000-ispconfig.conf')) { + $restore_conf_symlink = true; + unlink($vhost_conf_enabled_dir.'/000-ispconfig.conf'); + } + $server = 'apache'; + } + + if($conf[$server]['installed'] == true && $conf[$server]['init_script'] != '') { + if($this->is_update) { + system($this->getinitcommand($conf[$server]['init_script'], 'force-reload').' &> /dev/null || ' . $this->getinitcommand($conf[$server]['init_script'], 'restart').' &> /dev/null'); + } else { + system($this->getinitcommand($conf[$server]['init_script'], 'restart').' &> /dev/null'); + } + } + + $issued_successfully = false; + + // Backup existing ispserver ssl files + // + // 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 + if (is_executable($acme)) { + $acme_cert_dir = dirname($acme) . '/' . $hostname; + + swriteln('acme.sh is installed, overriding certificate path to use ' . $acme_cert_dir); + + # 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 --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 --log $acme_log --standalone -d " . escapeshellarg($hostname) . " $hook", $out, $ret); + } + + if($ret == 0 || ($ret == 2 && file_exists($check_acme_file))) { + // acme.sh returns with 2 on issue for already existing certificate + + $check_acme_file = $ssl_crt_file; + + // Define LE certs name and path, then install them + //$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 --log $acme_log -d " . escapeshellarg($hostname) . " $acme_key $acme_chain"); + $issued_successfully = true; + umask($old_umask); + + // Make temporary backup of self-signed certs permanent + 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/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 { + + // But only if it is otherwise available + if(is_executable($le_client)) { + $out = null; + $ret = null; + + // Get its version info due to be used for webroot arguement issues + $le_info = exec($le_client . ' --version 2>&1', $ret, $val); + if(preg_match('/^(\S+|\w+)\s+(\d+(\.\d+)+)$/', $le_info, $matches)) { + $le_version = $matches[2]; + } + + // Define certbot commands + $acme_version = '--server https://acme-v0' . (($le_version >=0.22) ? '2' : '1') . '.api.letsencrypt.org/directory'; + $certonly = 'certonly --agree-tos --non-interactive --expand --rsa-key-size 4096'; + + // If this is a webserver + if($conf['nginx']['installed'] == true || $conf['apache']['installed'] == true) { + exec("$le_client $certonly $acme_version --authenticator webroot --webroot-path /usr/local/ispconfig/interface/acme --email " . escapeshellarg('postmaster@' . $hostname) . " -d " . escapeshellarg($hostname) . " $renew_hook", $out, $ret); + } + // Else, it is not webserver, so we use standalone + else { + exec("$le_client $certonly $acme_version --standalone --email " . escapeshellarg('postmaster@' . $hostname) . " -d " . escapeshellarg($hostname) . " $hook", $out, $ret); + } + + if($ret == 0) { + // 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 + 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/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 { + swriteln('Did not find any valid acme client (acme.sh or certbot)'); + } + } + + if($restore_conf_symlink) { + if(!@is_link($vhost_conf_enabled_dir.'/000-ispconfig.conf')) { + symlink($vhost_conf_dir.'/ispconfig.conf', $vhost_conf_enabled_dir.'/000-ispconfig.conf'); + } + } + } else { + if($ip_address_match) { + // the directory already exists so we have to assume that it was created previously + $issued_successfully = true; + } + } + + // If the LE SSL certs for this hostname exists + if(!is_dir($acme_cert_dir) || !file_exists($check_acme_file) || !$issued_successfully) { + if(!$issued_successfully) { + swriteln('Could not issue letsencrypt certificate, falling back to self-signed.'); + } else { + swriteln('Issuing certificate seems to have succeeded but ' . $check_acme_file . ' seems to be missing. Falling back to self-signed.'); + } + + // We can still use the old self-signed method + $openssl_cmd = 'openssl req -nodes -newkey rsa:4096 -x509 -days 3650 -keyout ' . escapeshellarg($ssl_key_file) . ' -out ' . escapeshellarg($ssl_crt_file); + if(AUTOINSTALL){ + $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_cmd); + } + + // Build ispserver.pem file and chmod it + if(file_exists($ssl_key_file)) { + exec("cat $ssl_key_file $ssl_crt_file > $ssl_pem_file; chmod 600 $ssl_pem_file"); + + // Extend LE SSL certs to postfix + if ($conf['postfix']['installed'] == true && strtolower($this->simple_query('Symlink ISPConfig SSL certs to Postfix?', array('y', 'n'), 'y','ispconfig_postfix_ssl_symlink')) == 'y') { + + // Define folder, file(s) + $cf = $conf['postfix']; + $postfix_dir = $cf['config_dir']; + if(!is_dir($postfix_dir)) $this->error("The Postfix configuration directory '$postfix_dir' does not exist."); + $smtpd_crt = $postfix_dir.'/smtpd.cert'; + $smtpd_key = $postfix_dir.'/smtpd.key'; + + // Backup existing postfix ssl files + if (file_exists($smtpd_crt)) rename($smtpd_crt, $smtpd_crt . '-' .$date->format('YmdHis') . '.bak'); + if (file_exists($smtpd_key)) rename($smtpd_key, $smtpd_key . '-' .$date->format('YmdHis') . '.bak'); + + // Create symlink to ISPConfig SSL files + symlink($ssl_crt_file, $smtpd_crt); + symlink($ssl_key_file, $smtpd_key); + } + + // Extend LE SSL certs to pureftpd + if ($conf['pureftpd']['installed'] == true && strtolower($this->simple_query('Symlink ISPConfig SSL certs to Pure-FTPd? Creating dhparam file may take some time.', array('y', 'n'), 'y','ispconfig_pureftpd_ssl_symlink')) == 'y') { + + // Define folder, file(s) + $pureftpd_dir = '/etc/ssl/private'; + if(!is_dir($pureftpd_dir)) mkdir($pureftpd_dir, 0755, true); + $pureftpd_pem = $pureftpd_dir.'/pure-ftpd.pem'; + + // Backup existing pureftpd ssl files + if (file_exists($pureftpd_pem)) rename($pureftpd_pem, $pureftpd_pem . '-' .$date->format('YmdHis') . '.bak'); + + // Create symlink to ISPConfig SSL files + symlink($ssl_pem_file, $pureftpd_pem); + if (!file_exists("$pureftpd_dir/pure-ftpd-dhparams.pem")) + exec("cd $pureftpd_dir; openssl dhparam -out dhparam2048.pem 2048; ln -sf dhparam2048.pem pure-ftpd-dhparams.pem"); + } + } + + exec("chown -R root:root $ssl_dir"); } @@ -2451,31 +3342,20 @@ class installer_base { //* copy the ISPConfig server part $command = 'cp -rf ../server '.$install_dir; caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - + //* Make a backup of the security settings if(is_file('/usr/local/ispconfig/security/security_settings.ini')) copy('/usr/local/ispconfig/security/security_settings.ini','/usr/local/ispconfig/security/security_settings.ini~'); - + //* copy the ISPConfig security part $command = 'cp -rf ../security '.$install_dir; caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - - //* Apply changed security_settings.ini values to new security_settings.ini file - if(is_file('/usr/local/ispconfig/security/security_settings.ini~')) { - $security_settings_old = ini_to_array(file_get_contents('/usr/local/ispconfig/security/security_settings.ini~')); - $security_settings_new = ini_to_array(file_get_contents('/usr/local/ispconfig/security/security_settings.ini')); - if(is_array($security_settings_new) && is_array($security_settings_old)) { - foreach($security_settings_new as $section => $sval) { - if(is_array($sval)) { - foreach($sval as $key => $val) { - if(isset($security_settings_old[$section]) && isset($security_settings_old[$section][$key])) { - $security_settings_new[$section][$key] = $security_settings_old[$section][$key]; - } - } - } - } - file_put_contents('/usr/local/ispconfig/security/security_settings.ini',array_to_ini($security_settings_new)); - } + + $configfile = 'security_settings.ini'; + if(is_file($install_dir.'/security/'.$configfile)) { + copy($install_dir.'/security/'.$configfile, $install_dir.'/security/'.$configfile.'~'); } + $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master', 'tpl/'.$configfile.'.master'); + wf($install_dir.'/security/'.$configfile, $content); //* Create a symlink, so ISPConfig is accessible via web // Replaced by a separate vhost definition for port 8080 @@ -2637,15 +3517,15 @@ class installer_base { //* Chmod the files and directories in the acme dir $command = 'chmod -R 755 '.$install_dir.'/interface/acme'; caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - + //* chown the server files to the root user and group $command = 'chown -R root:root '.$install_dir.'/server'; caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - + //* chown the security files to the root user and group $command = 'chown -R root:root '.$install_dir.'/security'; caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - + //* chown the security directory and security_settings.ini to root:ispconfig $command = 'chown root:ispconfig '.$install_dir.'/security/security_settings.ini'; caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); @@ -2659,7 +3539,7 @@ class installer_base { caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); $command = 'chown root:ispconfig '.$install_dir.'/security/nginx_directives.blacklist'; caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - + //* Make the global language file directory group writable exec("chmod -R 770 $install_dir/interface/lib/lang"); @@ -2710,7 +3590,7 @@ class installer_base { exec('chmod -R 770 '.escapeshellarg($install_dir.'/interface/invoices')); exec('chown -R ispconfig:ispconfig '.escapeshellarg($install_dir.'/interface/invoices')); } - + exec('chown -R root:root /usr/local/ispconfig/interface/ssl'); // TODO: FIXME: add the www-data user to the ispconfig group. This is just for testing @@ -2738,8 +3618,8 @@ class installer_base { caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); if ($this->install_ispconfig_interface == true && isset($conf['interface_password']) && $conf['interface_password']!='admin') { - $sql = "UPDATE sys_user SET passwort = md5(?) WHERE username = 'admin';"; - $this->db->query($sql, $conf['interface_password']); + $sql = "UPDATE sys_user SET passwort = ? WHERE username = 'admin';"; + $this->db->query($sql, $this->crypt_password($conf['interface_password'])); } if($conf['apache']['installed'] == true && $this->install_ispconfig_interface == true){ @@ -2768,7 +3648,7 @@ class installer_base { } else { $tpl->setVar('ssl_bundle_comment','#'); } - + $tpl->setVar('apache_version',getapacheversion()); wf($vhost_conf_dir.'/ispconfig.vhost', $tpl->grab()); @@ -2785,10 +3665,12 @@ class installer_base { $content = str_replace('{fastcgi_bin}', $conf['fastcgi']['fastcgi_bin'], $content); $content = str_replace('{fastcgi_phpini_path}', $conf['fastcgi']['fastcgi_phpini_path'], $content); @mkdir('/var/www/php-fcgi-scripts/ispconfig', 0755, true); + $this->set_immutable('/var/www/php-fcgi-scripts/ispconfig/.php-fcgi-starter', false); wf('/var/www/php-fcgi-scripts/ispconfig/.php-fcgi-starter', $content); exec('chmod +x /var/www/php-fcgi-scripts/ispconfig/.php-fcgi-starter'); @symlink($install_dir.'/interface/web', '/var/www/ispconfig'); exec('chown -R ispconfig:ispconfig /var/www/php-fcgi-scripts/ispconfig'); + $this->set_immutable('/var/www/php-fcgi-scripts/ispconfig/.php-fcgi-starter', true); //} } @@ -2802,7 +3684,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 { @@ -2854,6 +3736,20 @@ class installer_base { if(!is_link('/usr/local/bin/ispconfig_update_from_dev.sh')) symlink($install_dir.'/server/scripts/ispconfig_update.sh', '/usr/local/bin/ispconfig_update_from_dev.sh'); if(!is_link('/usr/local/bin/ispconfig_update.sh')) symlink($install_dir.'/server/scripts/ispconfig_update.sh', '/usr/local/bin/ispconfig_update.sh'); + // Make executable then unlink and symlink letsencrypt pre, post and renew hook scripts + chown($install_dir.'/server/scripts/letsencrypt_pre_hook.sh', 'root'); + chown($install_dir.'/server/scripts/letsencrypt_post_hook.sh', 'root'); + chown($install_dir.'/server/scripts/letsencrypt_renew_hook.sh', 'root'); + chmod($install_dir.'/server/scripts/letsencrypt_pre_hook.sh', 0700); + chmod($install_dir.'/server/scripts/letsencrypt_post_hook.sh', 0700); + chmod($install_dir.'/server/scripts/letsencrypt_renew_hook.sh', 0700); + if(is_link('/usr/local/bin/letsencrypt_pre_hook.sh')) unlink('/usr/local/bin/letsencrypt_pre_hook.sh'); + if(is_link('/usr/local/bin/letsencrypt_post_hook.sh')) unlink('/usr/local/bin/letsencrypt_post_hook.sh'); + if(is_link('/usr/local/bin/letsencrypt_renew_hook.sh')) unlink('/usr/local/bin/letsencrypt_renew_hook.sh'); + symlink($install_dir.'/server/scripts/letsencrypt_pre_hook.sh', '/usr/local/bin/letsencrypt_pre_hook.sh'); + symlink($install_dir.'/server/scripts/letsencrypt_post_hook.sh', '/usr/local/bin/letsencrypt_post_hook.sh'); + symlink($install_dir.'/server/scripts/letsencrypt_renew_hook.sh', '/usr/local/bin/letsencrypt_renew_hook.sh'); + //* Make the logs readable for the ispconfig user if(@is_file('/var/log/mail.log')) exec('chmod +r /var/log/mail.log'); if(@is_file('/var/log/mail.warn')) exec('chmod +r /var/log/mail.warn'); @@ -2867,6 +3763,7 @@ class installer_base { if(!is_dir($conf['ispconfig_log_dir'])) mkdir($conf['ispconfig_log_dir'], 0755); touch($conf['ispconfig_log_dir'].'/ispconfig.log'); } + chmod($conf['ispconfig_log_dir'].'/ispconfig.log', 0600); //* Create the ispconfig auth log file and set uid/gid if(!is_file($conf['ispconfig_log_dir'].'/auth.log')) { @@ -2907,16 +3804,16 @@ class installer_base { //* Remove Domain module as its functions are available in the client module now if(@is_dir('/usr/local/ispconfig/interface/web/domain')) exec('rm -rf /usr/local/ispconfig/interface/web/domain'); - + //* Disable rkhunter run and update in debian cronjob as ispconfig is running and updating rkhunter if(is_file('/etc/default/rkhunter')) { replaceLine('/etc/default/rkhunter', 'CRON_DAILY_RUN="yes"', 'CRON_DAILY_RUN="no"', 1, 0); replaceLine('/etc/default/rkhunter', 'CRON_DB_UPDATE="yes"', 'CRON_DB_UPDATE="no"', 1, 0); } - + // Add symlink for patch tool if(!is_link('/usr/local/bin/ispconfig_patch')) exec('ln -s /usr/local/ispconfig/server/scripts/ispconfig_patch /usr/local/bin/ispconfig_patch'); - + // Change mode of a few files from amavisd if(is_file($conf['amavis']['config_dir'].'/conf.d/50-user')) chmod($conf['amavis']['config_dir'].'/conf.d/50-user', 0640); if(is_file($conf['amavis']['config_dir'].'/50-user~')) chmod($conf['amavis']['config_dir'].'/50-user~', 0400); @@ -2972,6 +3869,10 @@ class installer_base { $root_cron_jobs[] = "0 0 * * * ".$install_dir."/server/scripts/create_daily_nginx_access_logs.sh &> /dev/null"; } + if ($conf['services']['mail'] == 1) { + $root_cron_jobs[] = "30 23 * * * ".$install_dir."/server/scripts/handle_mailbox_soft_deleted.sh &> /dev/null"; + } + foreach($root_cron_jobs as $cron_job) { if(!in_array($cron_job."\n", $existing_root_cron_jobs)) { $existing_root_cron_jobs[] = $cron_job."\n"; @@ -3010,12 +3911,12 @@ class installer_base { chmod($conf['ispconfig_log_dir'].'/cron.log', 0660); } - + public function create_mount_script(){ global $app, $conf; $mount_script = '/usr/local/ispconfig/server/scripts/backup_dir_mount.sh'; $mount_command = ''; - + if(is_file($mount_script)) return; if(is_file('/etc/rc.local')){ $rc_local = file('/etc/rc.local'); @@ -3036,25 +3937,25 @@ class installer_base { } } } - + // This function is called at the end of the update process and contains code to clean up parts of old ISPCONfig releases public function cleanup_ispconfig() { global $app,$conf; - + // Remove directories recursively if(is_dir('/usr/local/ispconfig/interface/web/designer')) exec('rm -rf /usr/local/ispconfig/interface/web/designer'); if(is_dir('/usr/local/ispconfig/interface/web/themes/default-304')) exec('rm -rf /usr/local/ispconfig/interface/web/themes/default-304'); - + // Remove files if(is_file('/usr/local/ispconfig/interface/lib/classes/db_firebird.inc.php')) unlink('/usr/local/ispconfig/interface/lib/classes/db_firebird.inc.php'); if(is_file('/usr/local/ispconfig/interface/lib/classes/form.inc.php')) unlink('/usr/local/ispconfig/interface/lib/classes/form.inc.php'); - + // Change mode of a few files from amavisd if(is_file($conf['amavis']['config_dir'].'/conf.d/50-user')) chmod($conf['amavis']['config_dir'].'/conf.d/50-user', 0640); if(is_file($conf['amavis']['config_dir'].'/50-user~')) chmod($conf['amavis']['config_dir'].'/50-user~', 0400); if(is_file($conf['amavis']['config_dir'].'/amavisd.conf')) chmod($conf['amavis']['config_dir'].'/amavisd.conf', 0640); if(is_file($conf['amavis']['config_dir'].'/amavisd.conf~')) chmod($conf['amavis']['config_dir'].'/amavisd.conf~', 0400); - + } public function getinitcommand($servicename, $action, $init_script_directory = ''){ @@ -3126,6 +4027,9 @@ class installer_base { * @return bool */ protected function write_config_file($tConf, $tContents) { + + $args = func_get_args(); + // Backup config file before writing new contents and stat file if ( is_file($tConf) ) { $stat = exec('stat -c \'%a %U %G\' '.escapeshellarg($tConf), $output, $res); @@ -3139,10 +4043,9 @@ class installer_base { } wf($tConf, $tContents); // write file - if (func_num_args() >= 4) // override rights and/or ownership { - $args = func_get_args(); + $output = array_slice($args, 2); switch (sizeof($output)) { @@ -3192,5 +4095,3 @@ class installer_base { } } - -?> diff --git a/install/lib/mysql.lib.php b/install/lib/mysql.lib.php index 2528100cc51c8fc0bd096d1ef28a168a4cf42fec..4d9e71f44a1a8c62758b70915562287964d95000 100644 --- a/install/lib/mysql.lib.php +++ b/install/lib/mysql.lib.php @@ -64,9 +64,11 @@ class db public function __destruct() { if($this->_iConnId) mysqli_close($this->_iConnId); } - + private function do_connect() { global $conf; + + mysqli_report(MYSQLI_REPORT_OFF); if($this->_iConnId) return true; $this->dbHost = $conf['mysql']['host']; @@ -77,7 +79,7 @@ class db $this->dbCharset = $conf["mysql"]["charset"]; $this->dbNewLink = false; $this->dbClientFlags = null; - + $this->_iConnId = mysqli_connect($this->dbHost, $this->dbUser, $this->dbPass, '', (int)$this->dbPort); $try = 0; while((!is_object($this->_iConnId) || mysqli_connect_error()) && $try < 5) { @@ -92,19 +94,19 @@ class db $this->_sqlerror('Zugriff auf Datenbankserver fehlgeschlagen! / Database server not accessible!'); return false; } - + if($this->dbName) $this->setDBName($this->dbName); $this->_setCharset(); } - + public function setDBData($host, $user, $password, $port) { $this->dbHost = $host; $this->dbUser = $user; $this->dbPass = $password; $this->dbPort = $port; } - + public function setDBName($name) { $this->dbName = $name; $this->_iConnId = mysqli_connect($this->dbHost, $this->dbUser, $this->dbPass, '', (int)$this->dbPort); @@ -114,7 +116,7 @@ class db return false; } } - + public function close() { if($this->_iConnId) mysqli_close($this->_iConnId); $this->_iConnId = null; @@ -192,6 +194,8 @@ class db } private function _query($sQuery = '') { + + $aArgs = func_get_args(); $this->do_connect(); if ($sQuery == '') { @@ -227,7 +231,6 @@ class db } } while($ok == false); - $aArgs = func_get_args(); $sQuery = call_user_func_array(array(&$this, '_build_query_string'), $aArgs); $this->_iQueryId = mysqli_query($this->_iConnId, $sQuery); @@ -283,10 +286,17 @@ class db * @return array result row or NULL if none found */ public function queryOneRecord($sQuery = '') { - if(!preg_match('/limit \d+\s*,\s*\d+$/i', $sQuery)) $sQuery .= ' LIMIT 0,1'; $aArgs = func_get_args(); - $oResult = call_user_func_array(array(&$this, 'query'), $aArgs); + if(!empty($aArgs)) { + $sQuery = array_shift($aArgs); + if($sQuery && !preg_match('/limit \d+(\s*,\s*\d+)?$/i', $sQuery)) { + $sQuery .= ' LIMIT 0,1'; + } + array_unshift($aArgs, $sQuery); + } + + $oResult = call_user_func_array([&$this, 'query'], $aArgs); if(!$oResult) return null; $aReturn = $oResult->get(); @@ -526,7 +536,7 @@ class db if($debug == 1) echo "mySQL Error Message: ".$this->errorMessage; } } - + /* TODO: rewrite SQL */ function update($tablename, $form, $bedingung, $debug = 0) { @@ -754,6 +764,41 @@ class db } } + /** + * Get the database type (mariadb or mysql) + * + * @access public + * @return string 'mariadb' or string 'mysql' + */ + + public function getDatabaseType() { + $tmp = $this->queryOneRecord('SELECT VERSION() as version'); + if(stristr($tmp['version'],'mariadb')) { + return 'mariadb'; + } else { + return 'mysql'; + } + } + + /** + * Get the database version + * + * @access public + * @param bool $major_version_only = true will return the major version only, e.g. 8 for MySQL 8 + * @return string version number + */ + + public function getDatabaseVersion($major_version_only = false) { + $tmp = $this->queryOneRecord('SELECT VERSION() as version'); + $version = explode('-', $tmp['version']); + if($major_version_only == true) { + $version_parts = explode('.', $version[0]); + return $version_parts[0]; + } else { + return $version[0]; + } + } + } /** @@ -956,7 +1001,7 @@ class fakedb_result { if(!is_array($this->aLimitedData)) return $aItem; - if(list($vKey, $aItem) = each($this->aLimitedData)) { + foreach($this->aLimitedData as $vKey => $aItem) { if(!$aItem) $aItem = null; } return $aItem; diff --git a/install/lib/update.lib.php b/install/lib/update.lib.php index 4dcb31cff128ddcc5c6f3bd81a4526de13eb5253..d88d64d6cd414f85387f10882b979bf44fbc7e6e 100644 --- a/install/lib/update.lib.php +++ b/install/lib/update.lib.php @@ -185,9 +185,9 @@ function updateDbAndIni() { else $next_db_version = intval($current_db_version + 1); $sql_patch_filename = realpath(dirname(__FILE__).'/../').'/sql/incremental/upd_'.str_pad($next_db_version, 4, '0', STR_PAD_LEFT).'.sql'; $php_patch_filename = realpath(dirname(__FILE__).'/../').'/patches/upd_'.str_pad($next_db_version, 4, '0', STR_PAD_LEFT).'.php'; - + // comma separated list of version numbers were a update has to be done silently - $silent_update_versions = 'dev_collection,75'; + $silent_update_versions = 'dev_collection,75,91'; if(is_file($sql_patch_filename)) { @@ -214,14 +214,14 @@ function updateDbAndIni() { } else { $cmd = "mysql --default-character-set=".escapeshellarg($conf['mysql']['charset'])." --force -h ".escapeshellarg($conf['mysql']['host'])." -u ".escapeshellarg($conf['mysql']['admin_user'])." -P ".escapeshellarg($conf['mysql']['port'])." ".escapeshellarg($conf['mysql']['database'])." < ".$sql_patch_filename; } - + if(in_array($next_db_version,explode(',',$silent_update_versions))) { $cmd .= ' > /dev/null 2> /dev/null'; } else { $cmd .= ' >> /var/log/ispconfig_install.log 2>> /var/log/ispconfig_install.log'; } system($cmd); - + swriteln($inst->lng('Loading SQL patch file').': '.$sql_patch_filename); //* Exec onAfterSQL function @@ -231,7 +231,7 @@ function updateDbAndIni() { if($dev_patch == false) $current_db_version = $next_db_version; else $found = false; - + if(isset($php_patch)) unset($php_patch); } elseif($dev_patch == false) { $dev_patch = true; @@ -416,7 +416,7 @@ function updateDbAndIni() { function setDefaultServers(){ global $inst, $conf; - + // clients $clients = $inst->db->queryAllRecords("SELECT * FROM ".$conf["mysql"]["database"].".client"); if(is_array($clients) && !empty($clients)){ @@ -431,7 +431,7 @@ function setDefaultServers(){ if(trim($client['db_servers']) == '') $inst->db->query("UPDATE ?? SET db_servers = ? WHERE client_id = ?", $conf["mysql"]["database"].".client", trim($client['default_dbserver']), $client['client_id']); } } - + } @@ -442,13 +442,13 @@ function setDefaultServers(){ */ function check_service_config_state($servicename, $detected_value) { global $current_svc_config, $inst, $conf; - + if ($current_svc_config[$servicename] == 1) $current_state = 1; else $current_state = 0; if ($detected_value) $detected_value = 1; else $detected_value = 0; - + if ($detected_value != $current_state) { $answer = $inst->simple_query('Service \''.$servicename.'\' '.($detected_value ? 'has been' : 'has not been').' detected ('.($current_state ? 'strongly recommended, currently enabled' : 'currently disabled').') do you want to '.($detected_value ? 'enable and configure' : 'disable').' it? ', array('yes', 'no'), ($current_state ? 'yes' : 'no'), 'svc_detect_change_'.$servicename); if ($answer == 'yes') return $detected_value; @@ -459,4 +459,64 @@ function check_service_config_state($servicename, $detected_value) { } else return $current_state; } +/** + * Check for existing conf-custom templates and offer to rename them. + */ +function checkAndRenameCustomTemplates($default_prompt='no') { + global $inst; + $ret = true; + + $default_prompt = ($default_prompt == 'yes') ? 'yes' : 'no'; + + $template_directories = array( + '/usr/local/ispconfig/server/conf-custom', + '/usr/local/ispconfig/server/conf-custom/install', + ); + + $override_templates = array( + 'postfix_custom.conf.master', + 'dovecot_custom.conf.master', + ); + + $found_templates = array(); + $found_override_templates = array(); + foreach ($template_directories as $dir) { + if (!is_dir($dir)) { continue; } + foreach (glob("$dir/*.master") as $f) { + if (is_file($f)) { + if (in_array( basename($f), $override_templates )) { + $found_override_templates[] = $f; + } else { + $found_templates[] = $f; + } + } + } + } + + if (count($found_templates) > 0) { + echo "The following custom templates were found:\n\n"; + echo implode("\n", $found_templates) . "\n\n"; + + $answer = $inst->simple_query('Do you want to rename these conf-custom templates now so the default templates are used?', array('yes', 'no'), $default_prompt, 'rename_custom_templates'); + if (strtolower($answer) == 'yes') { + $date=date('-Y-m-d_H-i'); + foreach ($found_templates as $f) { + if (!rename($f, $f.$date)) { + echo "Error renaming template $f\n"; + $ret = false; + } + } + } else { + $ret = null; + } + } + + if (count($found_override_templates) > 0) { + echo "The following local config override templates were found, be sure to incorporate upstream changes if needed:\n\n"; + echo implode("\n", $found_override_templates) . "\n\n"; + } + + return $ret; +} + ?> 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 @@ +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/README.txt b/install/sql/README.txt index fe15ce5403747dd82bd02da4c6989a7a247e1ac0..d1294363c136df10d617f315bc8e5984695dbf4e 100644 --- a/install/sql/README.txt +++ b/install/sql/README.txt @@ -9,18 +9,24 @@ then follow these steps: 1) Add the field or table in the ispconfig3.sql file. This file contains the complete database dump which is used when ISPConfig gets installed. -2) Create a new file in the "incremental" subfolder wich contains the alter - table, or if it is a complete new table then the add table, statement(s) in - MySQL syntax which is/are required to modify the current ispconfig database - during update. The naming scheme of the sql patch update files is - upd_0001.sql, upd_0002.sql, upd_0003.sql etc. Ensure that the number that - you choose for the new file is a +1 increment of the number of the last - existing file and that the number is formatted with 4 digits. +2) Edit the file "incremental/upd_dev_collection.sql" which contains the SQL + statements (alter table, add table, update, etc.) in MySQL syntax which + are required to modify the current ispconfig database during update. + + The upd_dev_collection.sql file contains all db schema modifications + for changes made since the last ISPConfig release. If SQL statements + are already present in the file when you make your additions, add yours + to the end of the file, and do not remove any existing statements. + + When a new ISPConfig update is released, the contents of + upd_dev_collections.sql will move to an sql patch file, using the naming + scheme upd_0001.sql, upd_0002.sql, upd_0003.sql etc. - A patch file may contain one or more alter table statements. Every patch file - gets executed once in the database, so do not modify older (already released) + A patch file may contain one or more SQL modification statements. Every patch + file gets executed once in the database, so do not modify older (already released) patch files, they will not get executed again if the update was already run - once on a system. + once on a system, and will result in missing updates on any system where they + have not run yet. After a patch has been executed, the dbversion field in the server table gets increeased to the version number of the last installed patch. diff --git a/install/sql/incremental/upd_0085.sql b/install/sql/incremental/upd_0085.sql index 1291262ee77de2453ed053c87680c468fbada34c..755143fc4f841d6d9fb2b812e331df3120b3dc33 100644 --- a/install/sql/incremental/upd_0085.sql +++ b/install/sql/incremental/upd_0085.sql @@ -1,3 +1,5 @@ +-- folder_directive_snippets was missing in incremental, inserted for fixing older installations +ALTER TABLE `web_domain` ADD `folder_directive_snippets` TEXT NULL AFTER `https_port`; ALTER TABLE `web_domain` CHANGE `folder_directive_snippets` `folder_directive_snippets` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NULL; ALTER TABLE `web_domain` ADD `log_retention` INT NOT NULL DEFAULT '30' AFTER `https_port`; ALTER TABLE `web_domain` CHANGE `stats_type` `stats_type` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT 'awstats'; diff --git a/install/sql/incremental/upd_0089.sql b/install/sql/incremental/upd_0089.sql new file mode 100644 index 0000000000000000000000000000000000000000..08ae33e1705dc532483a86ef10834147898c221f --- /dev/null +++ b/install/sql/incremental/upd_0089.sql @@ -0,0 +1,77 @@ +-- add new proxy_protocol column +ALTER TABLE `web_domain` + ADD COLUMN `proxy_protocol` ENUM('n','y') NOT NULL DEFAULT 'n' AFTER `log_retention`; + +-- backup format +ALTER TABLE `web_domain` ADD `backup_format_web` VARCHAR( 255 ) NOT NULL default 'default' AFTER `backup_copies`; +ALTER TABLE `web_domain` ADD `backup_format_db` VARCHAR( 255 ) NOT NULL default 'gzip' AFTER `backup_format_web`; +-- end of backup format + +-- backup encryption +ALTER TABLE `web_domain` ADD `backup_encrypt` enum('n','y') NOT NULL DEFAULT 'n' AFTER `backup_format_db`; +ALTER TABLE `web_domain` ADD `backup_password` VARCHAR( 255 ) NOT NULL DEFAULT '' AFTER `backup_encrypt`; +ALTER TABLE `web_backup` ADD `backup_format` VARCHAR( 64 ) NOT NULL DEFAULT '' AFTER `backup_mode`; +ALTER TABLE `web_backup` ADD `backup_password` VARCHAR( 255 ) NOT NULL DEFAULT '' AFTER `filesize`; +-- end of backup encryption + +-- rename Comodo to "Sectigo / Comodo CA" +UPDATE `dns_ssl_ca` SET `ca_name` = 'Sectigo / Comodo CA' WHERE `ca_issue` = 'comodoca.com'; + +-- default php-fpm to ondemand mode +ALTER TABLE `web_domain` ALTER pm SET DEFAULT 'ondemand'; + +ALTER TABLE `mail_user` + ADD `purge_trash_days` INT NOT NULL DEFAULT '0' AFTER `move_junk`, + ADD `purge_junk_days` INT NOT NULL DEFAULT '0' AFTER `purge_trash_days`; + +-- doveadm should be enabled for all mailboxes +UPDATE `mail_user` set `disabledoveadm` = 'n'; + +-- add disablequota-status for quota-status policy daemon +ALTER TABLE `mail_user` ADD `disablequota-status` ENUM('n','y') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'n' AFTER `disabledoveadm`; + +-- add disableindexer-worker for solr search +ALTER TABLE `mail_user` ADD `disableindexer-worker` ENUM('n','y') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'n' AFTER `disablequota-status`; + +-- add SSHFP and DNAME record +ALTER TABLE `dns_rr` CHANGE `type` `type` ENUM('A','AAAA','ALIAS','CNAME','DNAME','CAA','DS','HINFO','LOC','MX','NAPTR','NS','PTR','RP','SRV','SSHFP','TXT','TLSA','DNSKEY') NULL DEFAULT NULL AFTER `name`; + +-- change cc and sender_cc column type +ALTER TABLE `mail_user` CHANGE `cc` `cc` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci; + +-- remove SPDY option +ALTER TABLE `web_domain` DROP COLUMN `enable_spdy`; + +-- was missing in incremental, inserted for fixing older installations +ALTER TABLE `web_domain` ADD `folder_directive_snippets` TEXT NULL AFTER `https_port`; + +ALTER TABLE `web_domain` ADD `server_php_id` INT(11) UNSIGNED NOT NULL DEFAULT 0; + +UPDATE `web_domain` as w LEFT JOIN sys_group as g ON (g.groupid = w.sys_groupid) INNER JOIN `server_php` as p ON (w.fastcgi_php_version = CONCAT(p.name, ':', p.php_fastcgi_binary, ':', p.php_fastcgi_ini_dir) AND p.server_id IN (0, w.server_id) AND p.client_id IN (0, g.client_id)) SET w.server_php_id = p.server_php_id, w.fastcgi_php_version = '' WHERE 1; + +UPDATE `web_domain` as w LEFT JOIN sys_group as g ON (g.groupid = w.sys_groupid) INNER JOIN `server_php` as p ON (w.fastcgi_php_version = CONCAT(p.name, ':', p.php_fpm_init_script, ':', p.php_fpm_ini_dir, ':', p.php_fpm_pool_dir) AND p.server_id IN (0, w.server_id) AND p.client_id IN (0, g.client_id)) SET w.server_php_id = p.server_php_id, w.fastcgi_php_version = '' WHERE 1; + +ALTER TABLE `web_domain` CHANGE `apache_directives` `apache_directives` mediumtext NULL DEFAULT NULL; +ALTER TABLE `web_domain` CHANGE `nginx_directives` `nginx_directives` mediumtext NULL DEFAULT NULL; + +-- add move to junk before/after option, default to after +ALTER TABLE `mail_user` MODIFY `move_junk` enum('y','a','n') NOT NULL DEFAULT 'y'; + +-- Change id_rsa column to TEXT format +ALTER TABLE `client` CHANGE `id_rsa` `id_rsa` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci; + +ALTER TABLE `directive_snippets` ADD `update_sites` ENUM('y','n') NOT NULL DEFAULT 'n' ; + +-- Add DNSSEC Algorithm setting +ALTER TABLE `dns_soa` ADD `dnssec_algo` SET('NSEC3RSASHA1','ECDSAP256SHA256') NULL DEFAULT NULL AFTER `dnssec_wanted`; +UPDATE `dns_soa` SET `dnssec_algo` = 'NSEC3RSASHA1' WHERE `dnssec_algo` IS NULL AND dnssec_initialized = 'Y'; +UPDATE `dns_soa` SET `dnssec_algo` = 'ECDSAP256SHA256' WHERE `dnssec_algo` IS NULL AND dnssec_initialized = 'N'; +ALTER TABLE `dns_soa` CHANGE `dnssec_algo` `dnssec_algo` SET('NSEC3RSASHA1','ECDSAP256SHA256') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'ECDSAP256SHA256'; + +-- Fix issue #5635 +ALTER TABLE `client_template` CHANGE `ssh_chroot` `ssh_chroot` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ''; +ALTER TABLE `client_template` CHANGE `web_php_options` `web_php_options` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ''; + +-- add option to forward in lda, default to forward in mta except for existing forwards +ALTER TABLE `mail_user` ADD `forward_in_lda` enum('n','y') NOT NULL default 'n' AFTER `cc`; +UPDATE `mail_user` set `forward_in_lda` = 'y' where `cc` != ''; \ No newline at end of file diff --git a/install/sql/incremental/upd_0090.sql b/install/sql/incremental/upd_0090.sql new file mode 100644 index 0000000000000000000000000000000000000000..cc7b84067ad6f358da3a826fd0c58c59e4499aa2 --- /dev/null +++ b/install/sql/incremental/upd_0090.sql @@ -0,0 +1,5 @@ +ALTER TABLE `web_domain` ADD `jailkit_chroot_app_sections` mediumtext NULL DEFAULT NULL; +ALTER TABLE `web_domain` ADD `jailkit_chroot_app_programs` mediumtext NULL DEFAULT NULL; +ALTER TABLE `web_domain` ADD `delete_unused_jailkit` enum('n','y') NOT NULL DEFAULT 'n'; +ALTER TABLE `web_domain` ADD `last_jailkit_update` date NULL DEFAULT NULL; +ALTER TABLE `web_domain` ADD `last_jailkit_hash` varchar(255) DEFAULT NULL; \ No newline at end of file diff --git a/install/sql/incremental/upd_0091.sql b/install/sql/incremental/upd_0091.sql new file mode 100644 index 0000000000000000000000000000000000000000..0ff81ac5915ee27e1bac1c2c3f10b721c213724f --- /dev/null +++ b/install/sql/incremental/upd_0091.sql @@ -0,0 +1,20 @@ +-- we need those to fix some installations failing in 0089 and 0090 +ALTER TABLE `web_domain` ROW_FORMAT=DYNAMIC; +ALTER TABLE `mail_user` ROW_FORMAT=DYNAMIC; +ALTER TABLE `web_domain` ADD COLUMN `proxy_protocol` ENUM('n','y') NOT NULL DEFAULT 'n' AFTER `log_retention`; +ALTER TABLE `web_domain` ADD `backup_format_web` VARCHAR( 255 ) NOT NULL default 'default' AFTER `backup_copies`; +ALTER TABLE `web_domain` ADD `backup_format_db` VARCHAR( 255 ) NOT NULL default 'gzip' AFTER `backup_format_web`; +ALTER TABLE `web_domain` ADD `backup_encrypt` enum('n','y') NOT NULL DEFAULT 'n' AFTER `backup_format_db`; +ALTER TABLE `web_domain` ADD `backup_password` VARCHAR( 255 ) NOT NULL DEFAULT '' AFTER `backup_encrypt`; +ALTER TABLE `web_backup` ADD `backup_format` VARCHAR( 64 ) NOT NULL DEFAULT '' AFTER `backup_mode`; +ALTER TABLE `web_backup` ADD `backup_password` VARCHAR( 255 ) NOT NULL DEFAULT '' AFTER `filesize`; +ALTER TABLE `web_domain` ALTER pm SET DEFAULT 'ondemand'; +ALTER TABLE `web_domain` DROP COLUMN `enable_spdy`; +ALTER TABLE `web_domain` ADD `folder_directive_snippets` TEXT NULL AFTER `https_port`; +ALTER TABLE `web_domain` ADD `server_php_id` INT(11) UNSIGNED NOT NULL DEFAULT 0; +ALTER TABLE `web_domain` CHANGE `apache_directives` `apache_directives` mediumtext NULL DEFAULT NULL; +ALTER TABLE `web_domain` CHANGE `nginx_directives` `nginx_directives` mediumtext NULL DEFAULT NULL; +UPDATE `web_domain` as w LEFT JOIN sys_group as g ON (g.groupid = w.sys_groupid) INNER JOIN `server_php` as p ON (w.fastcgi_php_version = CONCAT(p.name, ':', p.php_fastcgi_binary, ':', p.php_fastcgi_ini_dir) AND p.server_id IN (0, w.server_id) AND p.client_id IN (0, g.client_id)) SET w.server_php_id = p.server_php_id, w.fastcgi_php_version = '' WHERE w.server_php_id = 0; +UPDATE `web_domain` as w LEFT JOIN sys_group as g ON (g.groupid = w.sys_groupid) INNER JOIN `server_php` as p ON (w.fastcgi_php_version = CONCAT(p.name, ':', p.php_fpm_init_script, ':', p.php_fpm_ini_dir, ':', p.php_fpm_pool_dir) AND p.server_id IN (0, w.server_id) AND p.client_id IN (0, g.client_id)) SET w.server_php_id = p.server_php_id, w.fastcgi_php_version = '' WHERE w.server_php_id = 0; +ALTER TABLE `mail_user` ADD `forward_in_lda` enum('n','y') NOT NULL default 'n' AFTER `cc`; +-- end of fixes \ No newline at end of file diff --git a/install/sql/incremental/upd_0092.sql b/install/sql/incremental/upd_0092.sql new file mode 100644 index 0000000000000000000000000000000000000000..a12f9d482b0a58f71639d52a6dba96c3f0c17b4a --- /dev/null +++ b/install/sql/incremental/upd_0092.sql @@ -0,0 +1,8 @@ +-- drop old php column because new installations don't have them (fails in multi-server) +ALTER TABLE `web_domain` DROP COLUMN `fastcgi_php_version`; + +-- add php_fpm_socket_dir column to server_php +ALTER TABLE `server_php` ADD `php_fpm_socket_dir` varchar(255) DEFAULT NULL AFTER `php_fpm_pool_dir`; + +-- fix #5939 +UPDATE `ftp_user` SET `expires` = NULL WHERE `expires` = '0000-00-00 00:00:00'; diff --git a/install/sql/incremental/upd_0093.sql b/install/sql/incremental/upd_0093.sql new file mode 100644 index 0000000000000000000000000000000000000000..96c5307f0ed22c0bda2651b41919f66af1a530a2 --- /dev/null +++ b/install/sql/incremental/upd_0093.sql @@ -0,0 +1,25 @@ +ALTER TABLE `remote_user` MODIFY `remote_password` VARCHAR(200) NOT NULL DEFAULT ''; + +ALTER TABLE `client` ADD COLUMN `limit_mail_wblist` INT(11) NOT NULL DEFAULT '0' AFTER `limit_mailrouting`; +ALTER TABLE `client_template` ADD COLUMN `limit_mail_wblist` INT(11) NOT NULL DEFAULT '0' AFTER `limit_mailrouting`; + +ALTER TABLE mail_access DROP CONSTRAINT `server_id`; +SET SESSION old_alter_table=1; +ALTER IGNORE TABLE mail_access ADD UNIQUE KEY `unique_source` (`server_id`,`source`,`type`); +SET SESSION old_alter_table=0; + +ALTER TABLE mail_domain ADD COLUMN `relay_host` varchar(255) NOT NULL default '' AFTER `dkim_public`, + 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`; + +-- Brexit +UPDATE `country` SET `eu` = 'n' WHERE `iso` = 'GB'; + +-- Add limit for per domain relaying +ALTER TABLE `client` ADD `limit_relayhost` ENUM( 'n', 'y' ) NOT NULL DEFAULT 'n' AFTER `limit_spamfilter_policy`; +ALTER TABLE `client_template` ADD `limit_relayhost` ENUM( 'n', 'y' ) NOT NULL DEFAULT 'n' AFTER `limit_spamfilter_policy`; 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/incremental/upd_dev_collection.sql b/install/sql/incremental/upd_dev_collection.sql index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..c99596926b399b22291c617dc1479211de493ea7 100644 --- a/install/sql/incremental/upd_dev_collection.sql +++ b/install/sql/incremental/upd_dev_collection.sql @@ -0,0 +1 @@ +ALTER TABLE `sys_user` ADD `otp_type` SET('none', 'email') NOT NULL DEFAULT 'none' AFTER `lost_password_reqtime`, ADD `otp_data` VARCHAR(255) NULL AFTER `otp_type`, ADD `otp_recovery` VARCHAR(64) NULL AFTER `otp_data`, ADD `otp_attempts` TINYINT NOT NULL DEFAULT '0' AFTER `otp_recovery`; diff --git a/install/sql/ispconfig3.sql b/install/sql/ispconfig3.sql index 18b3ef57ebad6eac601268db1433e17f040b77af..cf340bda0170cb77039941455303d76ee28066ca 100644 --- a/install/sql/ispconfig3.sql +++ b/install/sql/ispconfig3.sql @@ -26,24 +26,24 @@ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ --- Includes --- +-- Includes +-- -- iso_country_list.sql --- +-- -- This will create and then populate a MySQL table with a list of the names and -- ISO 3166 codes for countries in existence as of the date below. --- +-- -- For updates to this file, see http://27.org/isocountrylist/ -- For more about ISO 3166, see http://www.iso.ch/iso/en/prods-services/iso3166ma/02iso-3166-code-lists/list-en1.html --- +-- -- Created by getisocountrylist.pl on Sun Nov 2 14:59:20 2003. -- Wm. Rhodes --- +-- --- +-- -- ISPConfig 3 -- DB-Version: 3.0.0.9 --- +-- SET FOREIGN_KEY_CHECKS = 0; @@ -178,12 +178,15 @@ CREATE TABLE `client` ( `limit_mailforward` int(11) NOT NULL DEFAULT '-1', `limit_mailcatchall` int(11) NOT NULL DEFAULT '-1', `limit_mailrouting` int(11) NOT NULL DEFAULT '0', + `limit_mail_wblist` int(11) NOT NULL DEFAULT '0', `limit_mailfilter` int(11) NOT NULL DEFAULT '-1', `limit_fetchmail` int(11) NOT NULL DEFAULT '-1', `limit_mailquota` int(11) NOT NULL DEFAULT '-1', `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, `limit_xmpp_domain` int(11) NOT NULL DEFAULT '-1', @@ -253,7 +256,7 @@ CREATE TABLE `client` ( `canceled` enum('n','y') NOT NULL DEFAULT 'n', `can_use_api` enum('n','y') NOT NULL DEFAULT 'n', `tmp_data` mediumblob, - `id_rsa` varchar(2000) NOT NULL DEFAULT '', + `id_rsa` text, `ssh_rsa` varchar(600) NOT NULL DEFAULT '', `customer_no_template` varchar(255) DEFAULT 'R[CLIENTID]C[CUSTOMER_NO]', `customer_no_start` int(11) NOT NULL DEFAULT '1', @@ -288,9 +291,9 @@ CREATE TABLE `client_circle` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `client_template` --- +-- CREATE TABLE `client_template` ( `template_id` int(11) unsigned NOT NULL auto_increment, @@ -309,12 +312,15 @@ CREATE TABLE `client_template` ( `limit_mailforward` int(11) NOT NULL default '-1', `limit_mailcatchall` int(11) NOT NULL default '-1', `limit_mailrouting` int(11) NOT NULL default '0', + `limit_mail_wblist` int(11) NOT NULL default '0', `limit_mailfilter` int(11) NOT NULL default '-1', `limit_fetchmail` int(11) NOT NULL default '-1', `limit_mailquota` int(11) NOT NULL default '-1', `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, `limit_xmpp_domain` int(11) NOT NULL DEFAULT '-1', @@ -330,7 +336,7 @@ CREATE TABLE `client_template` ( `limit_web_ip` text, `limit_web_domain` int(11) NOT NULL default '-1', `limit_web_quota` int(11) NOT NULL default '-1', - `web_php_options` varchar(255) NOT NULL DEFAULT 'no', + `web_php_options` varchar(255) NOT NULL DEFAULT '', `limit_cgi` enum('n','y') NOT NULL DEFAULT 'n', `limit_ssi` enum('n','y') NOT NULL DEFAULT 'n', `limit_perl` enum('n','y') NOT NULL DEFAULT 'n', @@ -345,7 +351,7 @@ CREATE TABLE `client_template` ( `limit_web_aliasdomain` int(11) NOT NULL default '-1', `limit_ftp_user` int(11) NOT NULL default '-1', `limit_shell_user` int(11) NOT NULL default '0', - `ssh_chroot` varchar(255) NOT NULL DEFAULT 'no', + `ssh_chroot` varchar(255) NOT NULL DEFAULT '', `limit_webdav_user` int(11) NOT NULL default '0', `limit_backup` ENUM( 'n', 'y' ) NOT NULL DEFAULT 'y', `limit_directive_snippets` ENUM( 'n', 'y' ) NOT NULL DEFAULT 'n', @@ -373,9 +379,9 @@ CREATE TABLE `client_template` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `client_template_assigned` --- +-- CREATE TABLE `client_template_assigned` ( `assigned_template_id` bigint(20) NOT NULL auto_increment, @@ -426,9 +432,9 @@ CREATE TABLE `country` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `cron` --- +-- CREATE TABLE `cron` ( `id` int(11) unsigned NOT NULL auto_increment, `sys_userid` int(11) unsigned NOT NULL default '0', @@ -452,9 +458,9 @@ CREATE TABLE `cron` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `directive_snippets` --- +-- CREATE TABLE IF NOT EXISTS `directive_snippets` ( `directive_snippets_id` int(11) unsigned NOT NULL AUTO_INCREMENT, @@ -470,14 +476,15 @@ CREATE TABLE IF NOT EXISTS `directive_snippets` ( `required_php_snippets` varchar(255) NOT NULL DEFAULT '', `active` enum('n','y') NOT NULL DEFAULT 'y', `master_directive_snippets_id` int(11) unsigned NOT NULL DEFAULT '0', + `update_sites` ENUM('y','n') NOT NULL DEFAULT 'n', PRIMARY KEY (`directive_snippets_id`) ) DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; -- -------------------------------------------------------- --- +-- -- Table structure for table `dns_rr` --- +-- CREATE TABLE `dns_rr` ( `id` int(11) unsigned NOT NULL auto_increment, `sys_userid` int(11) unsigned NOT NULL DEFAULT '0', @@ -488,7 +495,7 @@ CREATE TABLE `dns_rr` ( `server_id` int(11) NOT NULL default '1', `zone` int(11) unsigned NOT NULL DEFAULT '0', `name` varchar(255) NOT NULL DEFAULT '', - `type` enum('A','AAAA','ALIAS','CNAME','CAA','DS','HINFO','LOC','MX','NAPTR','NS','PTR','RP','SRV','TXT','TLSA','DNSKEY') default NULL, + `type` enum('A','AAAA','ALIAS','CNAME','DNAME','CAA','DS','HINFO','LOC','MX','NAPTR','NS','PTR','RP','SRV','SSHFP','TXT','TLSA','DNSKEY') default NULL, `data` TEXT NOT NULL, `aux` int(11) unsigned NOT NULL default '0', `ttl` int(11) unsigned NOT NULL default '3600', @@ -524,9 +531,9 @@ CREATE TABLE `dns_slave` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `dns_ssl_ca` --- +-- CREATE TABLE IF NOT EXISTS `dns_ssl_ca` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, @@ -561,7 +568,7 @@ INSERT INTO `dns_ssl_ca` (`id`, `sys_userid`, `sys_groupid`, `sys_perm_user`, `s (NULL, 1, 1, 'riud', 'riud', '', 'Y', 'certSIGN', 'certsign.ro', 'Y', '', 0), (NULL, 1, 1, 'riud', 'riud', '', 'Y', 'CFCA', 'cfca.com.cn', 'Y', '', 0), (NULL, 1, 1, 'riud', 'riud', '', 'Y', 'Chunghwa Telecom', 'cht.com.tw', 'Y', '', 0), -(NULL, 1, 1, 'riud', 'riud', '', 'Y', 'Comodo', 'comodoca.com', 'Y', '', 0), +(NULL, 1, 1, 'riud', 'riud', '', 'Y', 'Sectigo / Comodo CA', 'comodoca.com', 'Y', '', 0), (NULL, 1, 1, 'riud', 'riud', '', 'Y', 'D-TRUST', 'd-trust.net', 'Y', '', 0), (NULL, 1, 1, 'riud', 'riud', '', 'Y', 'DigiCert', 'digicert.com', 'Y', '', 0), (NULL, 1, 1, 'riud', 'riud', '', 'Y', 'DocuSign', 'docusign.fr', 'Y', '', 0), @@ -598,9 +605,9 @@ INSERT INTO `dns_ssl_ca` (`id`, `sys_userid`, `sys_groupid`, `sys_perm_user`, `s -- -------------------------------------------------------- --- +-- -- Table structure for table `dns_soa` --- +-- CREATE TABLE `dns_soa` ( `id` int(10) unsigned NOT NULL auto_increment, @@ -625,8 +632,10 @@ CREATE TABLE `dns_soa` ( `update_acl` varchar(255) default NULL, `dnssec_initialized` ENUM('Y','N') NOT NULL DEFAULT 'N', `dnssec_wanted` ENUM('Y','N') NOT NULL DEFAULT 'N', + `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`) @@ -634,9 +643,9 @@ CREATE TABLE `dns_soa` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `dns_template` --- +-- CREATE TABLE `dns_template` ( `template_id` int(11) unsigned NOT NULL auto_increment, @@ -670,9 +679,9 @@ CREATE TABLE `domain` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `firewall` --- +-- CREATE TABLE `firewall` ( `firewall_id` int(11) unsigned NOT NULL auto_increment, @@ -690,9 +699,9 @@ CREATE TABLE `firewall` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `ftp_user` --- +-- CREATE TABLE `ftp_user` ( `ftp_user_id` int(11) unsigned NOT NULL auto_increment, @@ -728,9 +737,9 @@ CREATE TABLE `ftp_user` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `ftp_traffic` --- +-- CREATE TABLE `ftp_traffic` ( `hostname` varchar(255) NOT NULL, @@ -801,9 +810,9 @@ CREATE TABLE `iptables` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `mail_access` --- +-- CREATE TABLE `mail_access` ( `access_id` int(11) unsigned NOT NULL auto_increment, @@ -818,7 +827,7 @@ CREATE TABLE `mail_access` ( `type` set('recipient','sender','client') NOT NULL DEFAULT 'recipient', `active` enum('n','y') NOT NULL default 'y', PRIMARY KEY (`access_id`), - KEY `server_id` (`server_id`,`source`) + UNIQUE KEY `unique_source` (`server_id`,`source`,`type`) ) DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; -- -------------------------------------------------------- @@ -841,9 +850,9 @@ CREATE TABLE `mail_backup` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `mail_content_filter` --- +-- CREATE TABLE `mail_content_filter` ( `content_filter_id` int(11) unsigned NOT NULL auto_increment, @@ -863,9 +872,9 @@ CREATE TABLE `mail_content_filter` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `mail_domain` --- +-- CREATE TABLE `mail_domain` ( `domain_id` int(11) unsigned NOT NULL auto_increment, @@ -880,6 +889,9 @@ CREATE TABLE `mail_domain` ( `dkim_selector` varchar(63) NOT NULL DEFAULT 'default', `dkim_private` mediumtext NULL, `dkim_public` mediumtext NULL, + `relay_host` varchar(255) NOT NULL DEFAULT '', + `relay_user` varchar(255) NOT NULL DEFAULT '', + `relay_pass` varchar(255) NOT NULL DEFAULT '', `active` enum('n','y') NOT NULL DEFAULT 'n', PRIMARY KEY (`domain_id`), KEY `server_id` (`server_id`,`domain`), @@ -888,9 +900,9 @@ CREATE TABLE `mail_domain` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `mail_forwarding` --- +-- CREATE TABLE `mail_forwarding` ( `forwarding_id` int(11) unsigned NOT NULL auto_increment, @@ -907,15 +919,15 @@ 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 ; -- -------------------------------------------------------- --- +-- -- Table structure for table `mail_get` --- +-- CREATE TABLE `mail_get` ( `mailget_id` int(11) unsigned NOT NULL auto_increment, @@ -959,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` -- @@ -979,9 +1012,9 @@ CREATE TABLE IF NOT EXISTS `mail_relay_recipient` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `mail_traffic` --- +-- CREATE TABLE `mail_traffic` ( `traffic_id` int(11) unsigned NOT NULL auto_increment, @@ -994,9 +1027,9 @@ CREATE TABLE `mail_traffic` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `mail_transport` --- +-- CREATE TABLE `mail_transport` ( `transport_id` int(11) unsigned NOT NULL auto_increment, @@ -1012,14 +1045,14 @@ 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 ; -- -------------------------------------------------------- --- +-- -- Table structure for table `mail_user` --- +-- CREATE TABLE `mail_user` ( `mailuser_id` int(11) unsigned NOT NULL auto_increment, @@ -1038,7 +1071,8 @@ CREATE TABLE `mail_user` ( `maildir` varchar(255) NOT NULL default '', `maildir_format` varchar(255) NOT NULL default 'maildir', `quota` bigint(20) NOT NULL default '-1', - `cc` varchar(255) NOT NULL default '', + `cc` text, + `forward_in_lda` enum('n','y') NOT NULL default 'n', `sender_cc` varchar(255) NOT NULL default '', `homedir` varchar(255) NOT NULL default '', `autoresponder` enum('n','y') NOT NULL default 'n', @@ -1046,7 +1080,9 @@ CREATE TABLE `mail_user` ( `autoresponder_end_date` datetime NULL default NULL, `autoresponder_subject` varchar(255) NOT NULL default 'Out of office reply', `autoresponder_text` mediumtext NULL, - `move_junk` enum('n','y') NOT NULL default 'n', + `move_junk` enum('y','a','n') NOT NULL default 'y', + `purge_trash_days` INT NOT NULL DEFAULT '0', + `purge_junk_days` INT NOT NULL DEFAULT '0', `custom_mailfilter` mediumtext, `postfix` enum('n','y') NOT NULL default 'y', `greylisting` enum('n','y' ) NOT NULL DEFAULT 'n', @@ -1060,6 +1096,8 @@ CREATE TABLE `mail_user` ( `disablelda` enum('n','y') NOT NULL default 'n', `disablelmtp` enum('n','y') NOT NULL default 'n', `disabledoveadm` enum('n','y') NOT NULL default 'n', + `disablequota-status` enum('n','y') NOT NULL default 'n', + `disableindexer-worker` enum('n','y') NOT NULL default 'n', `last_quota_notification` date NULL default NULL, `backup_interval` VARCHAR( 255 ) NOT NULL default 'none', `backup_copies` INT NOT NULL DEFAULT '1', @@ -1070,9 +1108,9 @@ CREATE TABLE `mail_user` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `mail_user_filter` --- +-- CREATE TABLE `mail_user_filter` ( `filter_id` int(11) unsigned NOT NULL auto_increment, @@ -1291,9 +1329,9 @@ CREATE TABLE IF NOT EXISTS `openvz_vm` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `remote_session` --- +-- CREATE TABLE `remote_session` ( `remote_session` varchar(64) NOT NULL DEFAULT '', @@ -1301,14 +1339,15 @@ 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 ; -- -------------------------------------------------------- --- +-- -- Table structure for table `remote_user` --- +-- CREATE TABLE `remote_user` ( `remote_userid` int(11) unsigned NOT NULL auto_increment, @@ -1318,7 +1357,7 @@ CREATE TABLE `remote_user` ( `sys_perm_group` varchar(5) default NULL, `sys_perm_other` varchar(5) default NULL, `remote_username` varchar(64) NOT NULL DEFAULT '', - `remote_password` varchar(64) NOT NULL DEFAULT '', + `remote_password` varchar(200) NOT NULL DEFAULT '', `remote_access` enum('y','n') NOT NULL DEFAULT 'y', `remote_ips` TEXT, `remote_functions` text, @@ -1327,9 +1366,9 @@ CREATE TABLE `remote_user` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `server` --- +-- CREATE TABLE `server` ( `server_id` int(11) unsigned NOT NULL auto_increment, @@ -1358,9 +1397,9 @@ CREATE TABLE `server` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `server_ip` --- +-- CREATE TABLE `server_ip` ( `server_ip_id` int(11) unsigned NOT NULL auto_increment, @@ -1380,9 +1419,9 @@ CREATE TABLE `server_ip` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `server_ip_map` --- +-- CREATE TABLE `server_ip_map` ( `server_ip_map_id` int(11) unsigned NOT NULL AUTO_INCREMENT, @@ -1419,6 +1458,7 @@ CREATE TABLE `server_php` ( `php_fpm_init_script` varchar(255) DEFAULT NULL, `php_fpm_ini_dir` varchar(255) DEFAULT NULL, `php_fpm_pool_dir` varchar(255) DEFAULT NULL, + `php_fpm_socket_dir` varchar(255) DEFAULT NULL, `active` enum('n','y') NOT NULL DEFAULT 'y', PRIMARY KEY (`server_php_id`) ) DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; @@ -1454,91 +1494,9 @@ CREATE TABLE `shell_user` ( -- -------------------------------------------------------- --- --- Table structure for table `software_package` --- - -CREATE TABLE `software_package` ( - `package_id` int(11) unsigned NOT NULL auto_increment, - `software_repo_id` int(11) unsigned NOT NULL DEFAULT '0', - `package_name` varchar(64) NOT NULL DEFAULT '', - `package_title` varchar(64) NOT NULL DEFAULT '', - `package_description` text, - `package_version` varchar(8) default NULL, - `package_type` enum('ispconfig','app','web') NOT NULL default 'app', - `package_installable` enum('yes','no','key') NOT NULL default 'yes', - `package_requires_db` enum('no','mysql') NOT NULL default 'no', - `package_remote_functions` text, - `package_key` varchar(255) NOT NULL DEFAULT '', - `package_config` text, - PRIMARY KEY (`package_id`), - UNIQUE KEY `package_name` (`package_name`) -) DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; - --- -------------------------------------------------------- - --- --- Table structure for table `software_repo` --- - -CREATE TABLE `software_repo` ( - `software_repo_id` int(11) unsigned NOT NULL auto_increment, - `sys_userid` int(11) unsigned NOT NULL default '0', - `sys_groupid` int(11) unsigned 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, - `repo_name` varchar(64) default NULL, - `repo_url` varchar(255) default NULL, - `repo_username` varchar(64) default NULL, - `repo_password` varchar(64) default NULL, - `active` enum('n','y') NOT NULL default 'y', - PRIMARY KEY (`software_repo_id`) -) DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; - --- -------------------------------------------------------- - --- --- Table structure for table `software_update` --- - -CREATE TABLE `software_update` ( - `software_update_id` int(11) unsigned NOT NULL auto_increment, - `software_repo_id` int(11) unsigned NOT NULL DEFAULT '0', - `package_name` varchar(64) NOT NULL DEFAULT '', - `update_url` varchar(255) NOT NULL DEFAULT '', - `update_md5` varchar(255) NOT NULL DEFAULT '', - `update_dependencies` varchar(255) NOT NULL DEFAULT '', - `update_title` varchar(64) NOT NULL DEFAULT '', - `v1` tinyint(1) NOT NULL default '0', - `v2` tinyint(1) NOT NULL default '0', - `v3` tinyint(1) NOT NULL default '0', - `v4` tinyint(1) NOT NULL default '0', - `type` enum('full','update') NOT NULL default 'full', - PRIMARY KEY (`software_update_id`) -) DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; - --- -------------------------------------------------------- - --- --- Table structure for table `software_update_inst` --- - -CREATE TABLE `software_update_inst` ( - `software_update_inst_id` int(11) unsigned NOT NULL auto_increment, - `software_update_id` int(11) unsigned NOT NULL default '0', - `package_name` varchar(64) NOT NULL DEFAULT '', - `server_id` int(11) unsigned NOT NULL DEFAULT '0', - `status` enum('none','installing','installed','deleting','deleted','failed') NOT NULL default 'none', - PRIMARY KEY (`software_update_inst_id`), - UNIQUE KEY `software_update_id` (`software_update_id`,`package_name`,`server_id`) -) DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; - --- -------------------------------------------------------- - --- +-- -- Table structure for table `spamfilter_policy` --- +-- CREATE TABLE `spamfilter_policy` ( `id` int(11) unsigned NOT NULL auto_increment, @@ -1599,9 +1557,9 @@ CREATE TABLE `spamfilter_policy` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `spamfilter_users` --- +-- CREATE TABLE `spamfilter_users` ( `id` int(11) unsigned NOT NULL auto_increment, @@ -1612,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, @@ -1622,9 +1580,9 @@ CREATE TABLE `spamfilter_users` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `spamfilter_wblist` --- +-- CREATE TABLE `spamfilter_wblist` ( `wblist_id` int(11) unsigned NOT NULL auto_increment, @@ -1644,9 +1602,9 @@ CREATE TABLE `spamfilter_wblist` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `support_message` --- +-- CREATE TABLE `support_message` ( `support_message_id` int(11) unsigned NOT NULL auto_increment, @@ -1716,9 +1674,9 @@ CREATE TABLE `sys_datalog` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `sys_dbsync` --- +-- CREATE TABLE `sys_dbsync` ( `id` int(11) unsigned NOT NULL auto_increment, @@ -1740,9 +1698,9 @@ CREATE TABLE `sys_dbsync` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `sys_filesync` --- +-- CREATE TABLE `sys_filesync` ( `id` int(11) unsigned NOT NULL auto_increment, @@ -1760,9 +1718,9 @@ CREATE TABLE `sys_filesync` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `sys_group` --- +-- CREATE TABLE `sys_group` ( `groupid` int(11) unsigned NOT NULL auto_increment, @@ -1774,9 +1732,9 @@ CREATE TABLE `sys_group` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `sys_ini` --- +-- CREATE TABLE `sys_ini` ( `sysini_id` int(11) unsigned NOT NULL auto_increment, @@ -1788,9 +1746,9 @@ CREATE TABLE `sys_ini` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `sys_log` --- +-- CREATE TABLE `sys_log` ( `syslog_id` int(11) unsigned NOT NULL auto_increment, @@ -1857,9 +1815,9 @@ CREATE TABLE IF NOT EXISTS `sys_theme` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `sys_user` --- +-- CREATE TABLE `sys_user` ( `userid` int(11) unsigned NOT NULL auto_increment, @@ -1884,6 +1842,10 @@ CREATE TABLE `sys_user` ( `lost_password_function` tinyint(1) NOT NULL default '1', `lost_password_hash` VARCHAR(50) NOT NULL default '', `lost_password_reqtime` DATETIME NULL default NULL, + `otp_type` set('none', 'email') NOT NULL DEFAULT 'none', + `otp_data` varchar(255) DEFAULT NULL, + `otp_recovery` varchar(64) DEFAULT NULL, + `otp_attempts` tinyint(4) NOT NULL DEFAULT 0, PRIMARY KEY (`userid`) ) DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; @@ -1922,9 +1884,11 @@ CREATE TABLE `web_backup` ( `parent_domain_id` int(10) unsigned NOT NULL DEFAULT '0', `backup_type` enum('web','mysql','mongodb') NOT NULL DEFAULT 'web', `backup_mode` varchar(64) NOT NULL DEFAULT '', + `backup_format` varchar(64) NOT NULL DEFAULT '', `tstamp` int(10) unsigned NOT NULL DEFAULT '0', `filename` varchar(255) NOT NULL DEFAULT '', `filesize` VARCHAR(20) NOT NULL DEFAULT '', + `backup_password` VARCHAR(255) NOT NULL DEFAULT '', PRIMARY KEY (`backup_id`) ) DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; @@ -1985,9 +1949,9 @@ CREATE TABLE IF NOT EXISTS `web_database_user` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `web_domain` --- +-- CREATE TABLE `web_domain` ( `domain_id` int(11) unsigned NOT NULL auto_increment, @@ -2040,11 +2004,11 @@ CREATE TABLE `web_domain` ( `stats_password` varchar(255) default NULL, `stats_type` varchar(255) default 'awstats', `allow_override` varchar(255) NOT NULL default 'All', - `apache_directives` mediumtext, - `nginx_directives` mediumtext, + `apache_directives` mediumtext NULL DEFAULT NULL, + `nginx_directives` mediumtext NULL DEFAULT NULL, `php_fpm_use_socket` ENUM('n','y') NOT NULL DEFAULT 'y', `php_fpm_chroot` enum('n','y') NOT NULL DEFAULT 'n', - `pm` enum('static','dynamic','ondemand') NOT NULL DEFAULT 'dynamic', + `pm` enum('static','dynamic','ondemand') NOT NULL DEFAULT 'ondemand', `pm_max_children` int(11) NOT NULL DEFAULT '10', `pm_start_servers` int(11) NOT NULL DEFAULT '2', `pm_min_spare_servers` int(11) NOT NULL DEFAULT '1', @@ -2055,12 +2019,14 @@ CREATE TABLE `web_domain` ( `custom_php_ini` mediumtext, `backup_interval` VARCHAR( 255 ) NOT NULL DEFAULT 'none', `backup_copies` INT NOT NULL DEFAULT '1', + `backup_format_web` VARCHAR( 255 ) NOT NULL default 'default', + `backup_format_db` VARCHAR( 255 ) NOT NULL default 'gzip', + `backup_encrypt` enum('n','y') NOT NULL DEFAULT 'n', + `backup_password` VARCHAR( 255 ) NOT NULL DEFAULT '', `backup_excludes` mediumtext, `active` enum('n','y') NOT NULL default 'y', `traffic_quota_lock` enum('n','y') NOT NULL default 'n', - `fastcgi_php_version` varchar(255) DEFAULT NULL, `proxy_directives` mediumtext, - `enable_spdy` ENUM('y','n') NULL DEFAULT 'n', `last_quota_notification` date NULL default NULL, `rewrite_rules` mediumtext, `added_date` date NULL DEFAULT NULL, @@ -2071,9 +2037,16 @@ CREATE TABLE `web_domain` ( `https_port` int(11) unsigned NOT NULL DEFAULT '443', `folder_directive_snippets` text, `log_retention` int(11) NOT NULL DEFAULT '10', + `proxy_protocol` enum('n','y') NOT NULL default 'n', + `server_php_id` INT(11) UNSIGNED NOT NULL DEFAULT 0, + `jailkit_chroot_app_sections` mediumtext NULL DEFAULT NULL, + `jailkit_chroot_app_programs` mediumtext NULL DEFAULT NULL, + `delete_unused_jailkit` enum('n','y') NOT NULL default 'n', + `last_jailkit_update` date NULL DEFAULT NULL, + `last_jailkit_hash` varchar(255) DEFAULT NULL, PRIMARY KEY (`domain_id`), UNIQUE KEY `serverdomain` ( `server_id` , `ip_address`, `domain` ) -) DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; +) ENGINE=InnoDB ROW_FORMAT=DYNAMIC DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; -- -------------------------------------------------------- @@ -2466,7 +2439,7 @@ INSERT INTO `country` (`iso`, `name`, `printable_name`, `iso3`, `numcode`, `eu`) ('UG', 'UGANDA', 'Uganda', 'UGA', 800, 'n'), ('UA', 'UKRAINE', 'Ukraine', 'UKR', 804, 'n'), ('AE', 'UNITED ARAB EMIRATES', 'United Arab Emirates', 'ARE', 784, 'n'), -('GB', 'UNITED KINGDOM', 'United Kingdom', 'GBR', 826, 'y'), +('GB', 'UNITED KINGDOM', 'United Kingdom', 'GBR', 826, 'n'), ('US', 'UNITED STATES', 'United States', 'USA', 840, 'n'), ('UM', 'UNITED STATES MINOR OUTLYING ISLANDS', 'United States Minor Outlying Islands', NULL, NULL, 'n'), ('UY', 'URUGUAY', 'Uruguay', 'URY', 858, 'n'), @@ -2485,83 +2458,75 @@ INSERT INTO `country` (`iso`, `name`, `printable_name`, `iso3`, `numcode`, `eu`) -- -------------------------------------------------------- --- +-- -- Dumping data for table `dns_template` --- +-- -INSERT INTO `dns_template` (`template_id`, `sys_userid`, `sys_groupid`, `sys_perm_user`, `sys_perm_group`, `sys_perm_other`, `name`, `fields`, `template`, `visible`) VALUES (1, 1, 1, 'riud', 'riud', '', 'Default', 'DOMAIN,IP,NS1,NS2,EMAIL,DKIM,DNSSEC', '[ZONE]\norigin={DOMAIN}.\nns={NS1}.\nmbox={EMAIL}.\nrefresh=7200\nretry=540\nexpire=604800\nminimum=3600\nttl=3600\n\n[DNS_RECORDS]\nA|{DOMAIN}.|{IP}|0|3600\nA|www|{IP}|0|3600\nA|mail|{IP}|0|3600\nNS|{DOMAIN}.|{NS1}.|0|3600\nNS|{DOMAIN}.|{NS2}.|0|3600\nMX|{DOMAIN}.|mail.{DOMAIN}.|10|3600\nTXT|{DOMAIN}.|v=spf1 mx a ~all|0|3600', 'y'); +INSERT INTO `dns_template` (`template_id`, `sys_userid`, `sys_groupid`, `sys_perm_user`, `sys_perm_group`, `sys_perm_other`, `name`, `fields`, `template`, `visible`) VALUES (1, 1, 1, 'riud', 'riud', '', 'Default', 'DOMAIN,IP,NS1,NS2,EMAIL,DKIM,DNSSEC', '[ZONE]\norigin={DOMAIN}.\nns={NS1}.\nmbox={EMAIL}.\nrefresh=7200\nretry=540\nexpire=604800\nminimum=3600\nttl=3600\nxfer=\nalso_notify=\ndnssec_wanted=N\ndnssec_algo=ECDSAP256SHA256\n\n[DNS_RECORDS]\nA|{DOMAIN}.|{IP}|0|3600\nA|www|{IP}|0|3600\nA|mail|{IP}|0|3600\nNS|{DOMAIN}.|{NS1}.|0|3600\nNS|{DOMAIN}.|{NS2}.|0|3600\nMX|{DOMAIN}.|mail.{DOMAIN}.|10|3600\nTXT|{DOMAIN}.|v=spf1 mx a ~all|0|3600', 'y'); -- -------------------------------------------------------- --- +-- -- Dumping data for table `help_faq` --- +-- INSERT INTO `help_faq` VALUES (1,1,0,'I would like to know ...','Yes, of course.',1,1,'riud','riud','r'); -- -------------------------------------------------------- --- +-- -- Dumping data for table `help_faq_sections` --- +-- INSERT INTO `help_faq_sections` VALUES (1,'General',0,NULL,NULL,NULL,NULL,NULL); -- -------------------------------------------------------- --- --- Dumping data for table `software_repo` --- - -INSERT INTO `software_repo` (`software_repo_id`, `sys_userid`, `sys_groupid`, `sys_perm_user`, `sys_perm_group`, `sys_perm_other`, `repo_name`, `repo_url`, `repo_username`, `repo_password`, `active`) VALUES (1, 1, 1, 'riud', 'riud', '', 'ISPConfig Addons', 'http://repo.ispconfig.org/addons/', '', '', 'n'); - --- -------------------------------------------------------- - --- +-- -- Dumping data for table `spamfilter_policy` --- +-- INSERT INTO `spamfilter_policy` (`id`, `sys_userid`, `sys_groupid`, `sys_perm_user`, `sys_perm_group`, `sys_perm_other`, `policy_name`, `virus_lover`, `spam_lover`, `banned_files_lover`, `bad_header_lover`, `bypass_virus_checks`, `bypass_spam_checks`, `bypass_banned_checks`, `bypass_header_checks`, `spam_modifies_subj`, `virus_quarantine_to`, `spam_quarantine_to`, `banned_quarantine_to`, `bad_header_quarantine_to`, `clean_quarantine_to`, `other_quarantine_to`, `spam_tag_level`, `spam_tag2_level`, `spam_kill_level`, `spam_dsn_cutoff_level`, `spam_quarantine_cutoff_level`, `addr_extension_virus`, `addr_extension_spam`, `addr_extension_banned`, `addr_extension_bad_header`, `warnvirusrecip`, `warnbannedrecip`, `warnbadhrecip`, `newvirus_admin`, `virus_admin`, `banned_admin`, `bad_header_admin`, `spam_admin`, `spam_subject_tag`, `spam_subject_tag2`, `message_size_limit`, `banned_rulenames`, `rspamd_greylisting`, `rspamd_spam_greylisting_level`, `rspamd_spam_tag_level`, `rspamd_spam_tag_method`, `rspamd_spam_kill_level`) VALUES(1, 1, 0, 'riud', 'riud', 'r', 'Non-paying', 'N', 'N', 'N', 'N', 'Y', 'Y', 'Y', 'N', 'Y', '', '', '', '', '', '', 3, 7, 10, 0, 0, '', '', '', '', 'N', 'N', 'N', '', '', '', '', '', '', '', 0, '', 'n', 6.00, 8.00, 'rewrite_subject', 12.00); -INSERT INTO `spamfilter_policy` (`id`, `sys_userid`, `sys_groupid`, `sys_perm_user`, `sys_perm_group`, `sys_perm_other`, `policy_name`, `virus_lover`, `spam_lover`, `banned_files_lover`, `bad_header_lover`, `bypass_virus_checks`, `bypass_spam_checks`, `bypass_banned_checks`, `bypass_header_checks`, `spam_modifies_subj`, `virus_quarantine_to`, `spam_quarantine_to`, `banned_quarantine_to`, `bad_header_quarantine_to`, `clean_quarantine_to`, `other_quarantine_to`, `spam_tag_level`, `spam_tag2_level`, `spam_kill_level`, `spam_dsn_cutoff_level`, `spam_quarantine_cutoff_level`, `addr_extension_virus`, `addr_extension_spam`, `addr_extension_banned`, `addr_extension_bad_header`, `warnvirusrecip`, `warnbannedrecip`, `warnbadhrecip`, `newvirus_admin`, `virus_admin`, `banned_admin`, `bad_header_admin`, `spam_admin`, `spam_subject_tag`, `spam_subject_tag2`, `message_size_limit`, `banned_rulenames`, `rspamd_greylisting`, `rspamd_spam_greylisting_level`, `rspamd_spam_tag_level`, `rspamd_spam_tag_method`, `rspamd_spam_kill_level`) VALUES(2, 1, 0, 'riud', 'riud', 'r', 'Uncensored', 'Y', 'Y', 'Y', 'Y', 'N', 'N', 'N', 'N', 'N', NULL, NULL, NULL, NULL, NULL, NULL, 3, 999, 999, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'n', 999.00, 999.00, 'rewrite_subject', 999.00); -INSERT INTO `spamfilter_policy` (`id`, `sys_userid`, `sys_groupid`, `sys_perm_user`, `sys_perm_group`, `sys_perm_other`, `policy_name`, `virus_lover`, `spam_lover`, `banned_files_lover`, `bad_header_lover`, `bypass_virus_checks`, `bypass_spam_checks`, `bypass_banned_checks`, `bypass_header_checks`, `spam_modifies_subj`, `virus_quarantine_to`, `spam_quarantine_to`, `banned_quarantine_to`, `bad_header_quarantine_to`, `clean_quarantine_to`, `other_quarantine_to`, `spam_tag_level`, `spam_tag2_level`, `spam_kill_level`, `spam_dsn_cutoff_level`, `spam_quarantine_cutoff_level`, `addr_extension_virus`, `addr_extension_spam`, `addr_extension_banned`, `addr_extension_bad_header`, `warnvirusrecip`, `warnbannedrecip`, `warnbadhrecip`, `newvirus_admin`, `virus_admin`, `banned_admin`, `bad_header_admin`, `spam_admin`, `spam_subject_tag`, `spam_subject_tag2`, `message_size_limit`, `banned_rulenames`, `rspamd_greylisting`, `rspamd_spam_greylisting_level`, `rspamd_spam_tag_level`, `rspamd_spam_tag_method`, `rspamd_spam_kill_level`) VALUES(3, 1, 0, 'riud', 'riud', 'r', 'Wants all spam', 'N', 'Y', 'N', 'N', 'N', 'N', 'N', 'N', 'Y', NULL, NULL, NULL, NULL, NULL, NULL, 3, 999, 999, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'n', 999.00, 999.00, 'rewrite_subject', 999.00); -INSERT INTO `spamfilter_policy` (`id`, `sys_userid`, `sys_groupid`, `sys_perm_user`, `sys_perm_group`, `sys_perm_other`, `policy_name`, `virus_lover`, `spam_lover`, `banned_files_lover`, `bad_header_lover`, `bypass_virus_checks`, `bypass_spam_checks`, `bypass_banned_checks`, `bypass_header_checks`, `spam_modifies_subj`, `virus_quarantine_to`, `spam_quarantine_to`, `banned_quarantine_to`, `bad_header_quarantine_to`, `clean_quarantine_to`, `other_quarantine_to`, `spam_tag_level`, `spam_tag2_level`, `spam_kill_level`, `spam_dsn_cutoff_level`, `spam_quarantine_cutoff_level`, `addr_extension_virus`, `addr_extension_spam`, `addr_extension_banned`, `addr_extension_bad_header`, `warnvirusrecip`, `warnbannedrecip`, `warnbadhrecip`, `newvirus_admin`, `virus_admin`, `banned_admin`, `bad_header_admin`, `spam_admin`, `spam_subject_tag`, `spam_subject_tag2`, `message_size_limit`, `banned_rulenames`, `rspamd_greylisting`, `rspamd_spam_greylisting_level`, `rspamd_spam_tag_level`, `rspamd_spam_tag_method`, `rspamd_spam_kill_level`) VALUES(4, 1, 0, 'riud', 'riud', 'r', 'Wants viruses', 'Y', 'N', 'Y', 'Y', 'N', 'N', 'N', 'N', 'Y', NULL, NULL, NULL, NULL, NULL, NULL, 3, 6.9, 6.9, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'y', 4.00, 6.00, 'rewrite_subject', 10.00); -INSERT INTO `spamfilter_policy` (`id`, `sys_userid`, `sys_groupid`, `sys_perm_user`, `sys_perm_group`, `sys_perm_other`, `policy_name`, `virus_lover`, `spam_lover`, `banned_files_lover`, `bad_header_lover`, `bypass_virus_checks`, `bypass_spam_checks`, `bypass_banned_checks`, `bypass_header_checks`, `spam_modifies_subj`, `virus_quarantine_to`, `spam_quarantine_to`, `banned_quarantine_to`, `bad_header_quarantine_to`, `clean_quarantine_to`, `other_quarantine_to`, `spam_tag_level`, `spam_tag2_level`, `spam_kill_level`, `spam_dsn_cutoff_level`, `spam_quarantine_cutoff_level`, `addr_extension_virus`, `addr_extension_spam`, `addr_extension_banned`, `addr_extension_bad_header`, `warnvirusrecip`, `warnbannedrecip`, `warnbadhrecip`, `newvirus_admin`, `virus_admin`, `banned_admin`, `bad_header_admin`, `spam_admin`, `spam_subject_tag`, `spam_subject_tag2`, `message_size_limit`, `banned_rulenames`, `rspamd_greylisting`, `rspamd_spam_greylisting_level`, `rspamd_spam_tag_level`, `rspamd_spam_tag_method`, `rspamd_spam_kill_level`) VALUES(5, 1, 0, 'riud', 'riud', 'r', 'Normal', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'Y', '', '', '', '', '', '', 1, 4.5, 50, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '', '***SPAM***', NULL, NULL, 'y', 4.00, 6.00, 'rewrite_subject', 10.00); -INSERT INTO `spamfilter_policy` (`id`, `sys_userid`, `sys_groupid`, `sys_perm_user`, `sys_perm_group`, `sys_perm_other`, `policy_name`, `virus_lover`, `spam_lover`, `banned_files_lover`, `bad_header_lover`, `bypass_virus_checks`, `bypass_spam_checks`, `bypass_banned_checks`, `bypass_header_checks`, `spam_modifies_subj`, `virus_quarantine_to`, `spam_quarantine_to`, `banned_quarantine_to`, `bad_header_quarantine_to`, `clean_quarantine_to`, `other_quarantine_to`, `spam_tag_level`, `spam_tag2_level`, `spam_kill_level`, `spam_dsn_cutoff_level`, `spam_quarantine_cutoff_level`, `addr_extension_virus`, `addr_extension_spam`, `addr_extension_banned`, `addr_extension_bad_header`, `warnvirusrecip`, `warnbannedrecip`, `warnbadhrecip`, `newvirus_admin`, `virus_admin`, `banned_admin`, `bad_header_admin`, `spam_admin`, `spam_subject_tag`, `spam_subject_tag2`, `message_size_limit`, `banned_rulenames`, `rspamd_greylisting`, `rspamd_spam_greylisting_level`, `rspamd_spam_tag_level`, `rspamd_spam_tag_method`, `rspamd_spam_kill_level`) VALUES(6, 1, 0, 'riud', 'riud', 'r', 'Trigger happy', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'Y', NULL, NULL, NULL, NULL, NULL, NULL, 3, 5, 5, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'y', 2.00, 4.00, 'rewrite_subject', 8.00); -INSERT INTO `spamfilter_policy` (`id`, `sys_userid`, `sys_groupid`, `sys_perm_user`, `sys_perm_group`, `sys_perm_other`, `policy_name`, `virus_lover`, `spam_lover`, `banned_files_lover`, `bad_header_lover`, `bypass_virus_checks`, `bypass_spam_checks`, `bypass_banned_checks`, `bypass_header_checks`, `spam_modifies_subj`, `virus_quarantine_to`, `spam_quarantine_to`, `banned_quarantine_to`, `bad_header_quarantine_to`, `clean_quarantine_to`, `other_quarantine_to`, `spam_tag_level`, `spam_tag2_level`, `spam_kill_level`, `spam_dsn_cutoff_level`, `spam_quarantine_cutoff_level`, `addr_extension_virus`, `addr_extension_spam`, `addr_extension_banned`, `addr_extension_bad_header`, `warnvirusrecip`, `warnbannedrecip`, `warnbadhrecip`, `newvirus_admin`, `virus_admin`, `banned_admin`, `bad_header_admin`, `spam_admin`, `spam_subject_tag`, `spam_subject_tag2`, `message_size_limit`, `banned_rulenames`, `rspamd_greylisting`, `rspamd_spam_greylisting_level`, `rspamd_spam_tag_level`, `rspamd_spam_tag_method`, `rspamd_spam_kill_level`) VALUES(7, 1, 0, 'riud', 'riud', 'r', 'Permissive', 'N', 'N', 'N', 'Y', 'N', 'N', 'N', 'N', 'Y', NULL, NULL, NULL, NULL, NULL, NULL, 3, 10, 20, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'n', 7.00, 10.00, 'rewrite_subject', 20.00); +INSERT INTO `spamfilter_policy` (`id`, `sys_userid`, `sys_groupid`, `sys_perm_user`, `sys_perm_group`, `sys_perm_other`, `policy_name`, `virus_lover`, `spam_lover`, `banned_files_lover`, `bad_header_lover`, `bypass_virus_checks`, `bypass_spam_checks`, `bypass_banned_checks`, `bypass_header_checks`, `spam_modifies_subj`, `virus_quarantine_to`, `spam_quarantine_to`, `banned_quarantine_to`, `bad_header_quarantine_to`, `clean_quarantine_to`, `other_quarantine_to`, `spam_tag_level`, `spam_tag2_level`, `spam_kill_level`, `spam_dsn_cutoff_level`, `spam_quarantine_cutoff_level`, `addr_extension_virus`, `addr_extension_spam`, `addr_extension_banned`, `addr_extension_bad_header`, `warnvirusrecip`, `warnbannedrecip`, `warnbadhrecip`, `newvirus_admin`, `virus_admin`, `banned_admin`, `bad_header_admin`, `spam_admin`, `spam_subject_tag`, `spam_subject_tag2`, `message_size_limit`, `banned_rulenames`, `rspamd_greylisting`, `rspamd_spam_greylisting_level`, `rspamd_spam_tag_level`, `rspamd_spam_tag_method`, `rspamd_spam_kill_level`) VALUES(2, 1, 0, 'riud', 'riud', 'r', 'Uncensored', 'Y', 'Y', 'Y', 'Y', 'N', 'N', 'N', 'N', 'N', NULL, NULL, NULL, NULL, NULL, NULL, 3, 999, 999, NULL, NULL, NULL, NULL, NULL, NULL, 'N', 'N', 'N', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'n', 999.00, 999.00, 'rewrite_subject', 999.00); +INSERT INTO `spamfilter_policy` (`id`, `sys_userid`, `sys_groupid`, `sys_perm_user`, `sys_perm_group`, `sys_perm_other`, `policy_name`, `virus_lover`, `spam_lover`, `banned_files_lover`, `bad_header_lover`, `bypass_virus_checks`, `bypass_spam_checks`, `bypass_banned_checks`, `bypass_header_checks`, `spam_modifies_subj`, `virus_quarantine_to`, `spam_quarantine_to`, `banned_quarantine_to`, `bad_header_quarantine_to`, `clean_quarantine_to`, `other_quarantine_to`, `spam_tag_level`, `spam_tag2_level`, `spam_kill_level`, `spam_dsn_cutoff_level`, `spam_quarantine_cutoff_level`, `addr_extension_virus`, `addr_extension_spam`, `addr_extension_banned`, `addr_extension_bad_header`, `warnvirusrecip`, `warnbannedrecip`, `warnbadhrecip`, `newvirus_admin`, `virus_admin`, `banned_admin`, `bad_header_admin`, `spam_admin`, `spam_subject_tag`, `spam_subject_tag2`, `message_size_limit`, `banned_rulenames`, `rspamd_greylisting`, `rspamd_spam_greylisting_level`, `rspamd_spam_tag_level`, `rspamd_spam_tag_method`, `rspamd_spam_kill_level`) VALUES(3, 1, 0, 'riud', 'riud', 'r', 'Wants all spam', 'N', 'Y', 'N', 'N', 'N', 'N', 'N', 'N', 'Y', NULL, NULL, NULL, NULL, NULL, NULL, 3, 999, 999, NULL, NULL, NULL, NULL, NULL, NULL, 'N', 'N', 'N', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'n', 999.00, 999.00, 'rewrite_subject', 999.00); +INSERT INTO `spamfilter_policy` (`id`, `sys_userid`, `sys_groupid`, `sys_perm_user`, `sys_perm_group`, `sys_perm_other`, `policy_name`, `virus_lover`, `spam_lover`, `banned_files_lover`, `bad_header_lover`, `bypass_virus_checks`, `bypass_spam_checks`, `bypass_banned_checks`, `bypass_header_checks`, `spam_modifies_subj`, `virus_quarantine_to`, `spam_quarantine_to`, `banned_quarantine_to`, `bad_header_quarantine_to`, `clean_quarantine_to`, `other_quarantine_to`, `spam_tag_level`, `spam_tag2_level`, `spam_kill_level`, `spam_dsn_cutoff_level`, `spam_quarantine_cutoff_level`, `addr_extension_virus`, `addr_extension_spam`, `addr_extension_banned`, `addr_extension_bad_header`, `warnvirusrecip`, `warnbannedrecip`, `warnbadhrecip`, `newvirus_admin`, `virus_admin`, `banned_admin`, `bad_header_admin`, `spam_admin`, `spam_subject_tag`, `spam_subject_tag2`, `message_size_limit`, `banned_rulenames`, `rspamd_greylisting`, `rspamd_spam_greylisting_level`, `rspamd_spam_tag_level`, `rspamd_spam_tag_method`, `rspamd_spam_kill_level`) VALUES(4, 1, 0, 'riud', 'riud', 'r', 'Wants viruses', 'Y', 'N', 'Y', 'Y', 'N', 'N', 'N', 'N', 'Y', NULL, NULL, NULL, NULL, NULL, NULL, 3, 6.9, 6.9, NULL, NULL, NULL, NULL, NULL, NULL, 'N', 'N', 'N', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'y', 4.00, 6.00, 'rewrite_subject', 10.00); +INSERT INTO `spamfilter_policy` (`id`, `sys_userid`, `sys_groupid`, `sys_perm_user`, `sys_perm_group`, `sys_perm_other`, `policy_name`, `virus_lover`, `spam_lover`, `banned_files_lover`, `bad_header_lover`, `bypass_virus_checks`, `bypass_spam_checks`, `bypass_banned_checks`, `bypass_header_checks`, `spam_modifies_subj`, `virus_quarantine_to`, `spam_quarantine_to`, `banned_quarantine_to`, `bad_header_quarantine_to`, `clean_quarantine_to`, `other_quarantine_to`, `spam_tag_level`, `spam_tag2_level`, `spam_kill_level`, `spam_dsn_cutoff_level`, `spam_quarantine_cutoff_level`, `addr_extension_virus`, `addr_extension_spam`, `addr_extension_banned`, `addr_extension_bad_header`, `warnvirusrecip`, `warnbannedrecip`, `warnbadhrecip`, `newvirus_admin`, `virus_admin`, `banned_admin`, `bad_header_admin`, `spam_admin`, `spam_subject_tag`, `spam_subject_tag2`, `message_size_limit`, `banned_rulenames`, `rspamd_greylisting`, `rspamd_spam_greylisting_level`, `rspamd_spam_tag_level`, `rspamd_spam_tag_method`, `rspamd_spam_kill_level`) VALUES(5, 1, 0, 'riud', 'riud', 'r', 'Normal', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'Y', '', '', '', '', '', '', 1, 4.5, 50, 0, 0, NULL, NULL, NULL, NULL, 'N', 'N', 'N', NULL, NULL, NULL, NULL, NULL, '', '***SPAM***', NULL, NULL, 'y', 4.00, 6.00, 'rewrite_subject', 10.00); +INSERT INTO `spamfilter_policy` (`id`, `sys_userid`, `sys_groupid`, `sys_perm_user`, `sys_perm_group`, `sys_perm_other`, `policy_name`, `virus_lover`, `spam_lover`, `banned_files_lover`, `bad_header_lover`, `bypass_virus_checks`, `bypass_spam_checks`, `bypass_banned_checks`, `bypass_header_checks`, `spam_modifies_subj`, `virus_quarantine_to`, `spam_quarantine_to`, `banned_quarantine_to`, `bad_header_quarantine_to`, `clean_quarantine_to`, `other_quarantine_to`, `spam_tag_level`, `spam_tag2_level`, `spam_kill_level`, `spam_dsn_cutoff_level`, `spam_quarantine_cutoff_level`, `addr_extension_virus`, `addr_extension_spam`, `addr_extension_banned`, `addr_extension_bad_header`, `warnvirusrecip`, `warnbannedrecip`, `warnbadhrecip`, `newvirus_admin`, `virus_admin`, `banned_admin`, `bad_header_admin`, `spam_admin`, `spam_subject_tag`, `spam_subject_tag2`, `message_size_limit`, `banned_rulenames`, `rspamd_greylisting`, `rspamd_spam_greylisting_level`, `rspamd_spam_tag_level`, `rspamd_spam_tag_method`, `rspamd_spam_kill_level`) VALUES(6, 1, 0, 'riud', 'riud', 'r', 'Trigger happy', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'Y', NULL, NULL, NULL, NULL, NULL, NULL, 3, 5, 5, NULL, NULL, NULL, NULL, NULL, NULL, 'N', 'N', 'N', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'y', 2.00, 4.00, 'rewrite_subject', 8.00); +INSERT INTO `spamfilter_policy` (`id`, `sys_userid`, `sys_groupid`, `sys_perm_user`, `sys_perm_group`, `sys_perm_other`, `policy_name`, `virus_lover`, `spam_lover`, `banned_files_lover`, `bad_header_lover`, `bypass_virus_checks`, `bypass_spam_checks`, `bypass_banned_checks`, `bypass_header_checks`, `spam_modifies_subj`, `virus_quarantine_to`, `spam_quarantine_to`, `banned_quarantine_to`, `bad_header_quarantine_to`, `clean_quarantine_to`, `other_quarantine_to`, `spam_tag_level`, `spam_tag2_level`, `spam_kill_level`, `spam_dsn_cutoff_level`, `spam_quarantine_cutoff_level`, `addr_extension_virus`, `addr_extension_spam`, `addr_extension_banned`, `addr_extension_bad_header`, `warnvirusrecip`, `warnbannedrecip`, `warnbadhrecip`, `newvirus_admin`, `virus_admin`, `banned_admin`, `bad_header_admin`, `spam_admin`, `spam_subject_tag`, `spam_subject_tag2`, `message_size_limit`, `banned_rulenames`, `rspamd_greylisting`, `rspamd_spam_greylisting_level`, `rspamd_spam_tag_level`, `rspamd_spam_tag_method`, `rspamd_spam_kill_level`) VALUES(7, 1, 0, 'riud', 'riud', 'r', 'Permissive', 'N', 'N', 'N', 'Y', 'N', 'N', 'N', 'N', 'Y', NULL, NULL, NULL, NULL, NULL, NULL, 3, 10, 20, NULL, NULL, NULL, NULL, NULL, NULL, 'N', 'N', 'N', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'n', 7.00, 10.00, 'rewrite_subject', 20.00); -- -------------------------------------------------------- --- +-- -- Dumping data for table `sys_group` --- +-- INSERT INTO `sys_group` (`groupid`, `name`, `description`, `client_id`) VALUES (1, 'admin', 'Administrators group', 0); -- -------------------------------------------------------- --- +-- -- Dumping data for table `sys_ini` --- +-- INSERT INTO `sys_ini` (`sysini_id`, `config`, `default_logo`, `custom_logo`) VALUES (1, '', 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABBCAYAAACU5+uOAAAItUlEQVR42u1dCWwVVRStUJZCK6HsFNAgWpaCJkKICZKApKUFhURQpEnZF4EEUJZYEEpBIamgkQpUQBZRW7YCBqQsggsQEAgKLbIGCYsSCNqyQ8D76h18Hd/MvJk/n/bXc5KT+TNz79vPzNv+/2FhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAe++s0akTsRZxMnE6cGkKcxkwhPofaBPwWRzxxB/EO8UGI8xhxEGoV8EscY8qBKFRcgdoFAhXHC+VUHAbHo5aBQASyrZwL5DoxEjUNeBXI9XIuEMEE1DTgVSA3FA3qIDEtBLnTQiBDUNOAV4EUKhpURojmZQQEAjwKgSwK0bykWQgEU74ABAKBABAIBOIJffoNrkRsS0whDiMO5uNw4gBiSxvfGOJrbDtMOgr2JNa18HmZmETsopnGp4h9xdF0TcQRb8NEPkawTzv2qaWIoybnZYRUBoJD+difGAuBlCy0qsRM4mfERcTFfGygsBUF/xFxE/EQ8RixwIbi/j7il8R3iE8qwuxAXMJxuuFiTvNMYleb/E0gXiI+cOBaISTJrzLxcw2/+8Q5pjjfNNkM0RDILLadpbimw+bsc4DPkxRpuqkZ1orisoBAiguuhkUhPSvZRBA3u6gsK94g9jDFP9aHcAV3EKNNYX8i3RcNJ4M4nTiROJCYykIzbGZKvouk68vYbyS/cUbz+RrJZpzkO5Sv3eajaJhRDvUwg21nKK4VcF5WKPgFH6PZZw/7dJXC6S6lczunfbIQLpeDkZ+lJcoCAikuvChioaLBtfD4JHPiXSFKKexBPoa9Wwr3ael6skMZDGO7K3z+uOSb5OA7mu2KiOGmPH3ADVh8/sohnDS2S1NcG+uiO/kd+8RL146YRWzj359tb0Eg+gIpsHkjFNrQqiF3DZJABDtyuCP5/FuNRlHN8Ofz9nx+XLNR3jR1c4w8TSFGSmnr4FEgU7wKhI51jAeTpv+/ZQGBOAuEu1d/Ku6LV35t9rdigkUjHuMgkHPEecQsxdjjUx4zHbMI+10OdzqfZ2o0iiqSfzgPfMXnzZqN6iTbJ5jytMTU0E97FEhaAAJ5kc/PuJjQOCoIgegJpKbUl5b5vGaBT+A+vOgn5/JYIdFBIOs1wo1kIZl93+P70/h8oUZYFXkmKInPU9h3m2YeT8lvRilPyyWbi3xt4iMWSDc+P4lp3uAIRDxdryjui6dmuujXcr91IDcMmaJv31WISfTrLeJXCUT3yb1a4Ztmalyu61MaZG/XtD9tapRGnpZKNp2lNNZ3KZARAQgk3untBYEEPgbJ92FsIAax34v1AQ2B5Go2BlW60n0QyCC/BWISdJ5LgewWU8k86DdTzMyNh0BKVyAzfB5I93YQyBGeTlW9lQbwIle2Rdgzy7BAxJT6Hb6X6EIgTrznRSCiHli02cwcPor1pbkQiL5AKvOA+ZZPAtkfxFms3j4IZHAwBGJaRPxdjH00BSImJRqKOlEwjtjUo0Dm2pWla4HMzsyqQIxSMKI8C8RkL9YXuhDf5gqcw4NweaZJiGkh8UeLwi+Utkb4KZCrYszkVSDiQRDMN4hkf5DvZ2gKZJyLPJgFkmAjEDEF3EYSWzPeklO8Q8CLQGKJhQquK+eDdLFNZBJxFLEf8XUXFTbcYv2kRhAEIq+vGNO88zTTKVaRzxPrSSvPW11O8yZqCiROSnMsX0sP0ixWops1Hfbx/AaJIz5QcFc5n+ZVNcbxmoWtEsBNB4EU8Tgk32Gv1wneEybeWG1N8RoNbplmOo2neiyxE3/eoun7G9t31hGIqXuzl8/HB0kgxhvhD03/KoEIpIWFQPLK+UJhkWpgKLZP8IKhajNhJg8A7yt8/5K6QoFM8z5mc68Ph3VWM6wTbN+a+AR/vqThV13KYyMXAgmXps9FnK8GSSA17KaXFf7R3gUyd8H/TiBss9fngfQehzfMpkDLgxcS73J4k1y85WrxtTtOjZPuVZA2O55RhLfUId5XpI2UHwZDIHxtp7HtRrVL25SfhWy7z7VAMuYvipszd0FJcfxzHspdrMctGnGcZNPTZ4F0VszqyPSlPHm8JG9f2SDtgF3Nq/rnJZssyXeUdP0CN64c9l/FDfGyZNNNkaeVGmnMM+Vdtd19los8/2e7Ow/E70lxiG7pRmkn8AaeULlcoo4sBDLfKvL0nLUxablfX0hfmfuQ01avI65fUQYEkupRIJHcAMwbDWNNdmLgupV4zeMO3stcIZ1M4aYo4vZt0oO7Locd0ndGTEQofN+QxiZ22+y7W+RpgUb66vOU7232SZXupZqvaYT3Dfu8ZLrejtc47mvkJ9FoVEWKBmW7dyc7ZXD1Nb2TH3JVn5Tqa3r1repzY6/gwWeqhUCGO/XjWSTmjYYVLOzFoP0Z/qJTks033brxrtjmxCbGtK4ivEqKuH2fNuc0tDatIYgna4yGbz2eeTL8WhJbic2aDnmqqpm2KlLeK5vWn0pc0wirGvtUtBkzNdPKDzWe24oGdZX4CzGfWCD4U93GBQdqNSw4Uiny8K9h4buOhlU2scq+Q1G1i233k63hFwBPEfcS04l1FGJoynbH+fgz8ZKFQJLDAMDjk/psCPzw20XxE6mmdLd24d8KNQ14FciUEPl1xHvEhlK6W2j65aOWgUAEUpV4NEREstyDQNqjloFARVKL/xukrAvkGjGC09zGwfYKsQdqF/BTKMnEJcTtxC3EPAU3iic5cRkfjc/ZFvZuuZm4gXjOouG35LQ2Yfutkq/4pfpN/E9TDVCjQGkJqQExho+CjYlRPseRiQE3EIriaMZTw4K3mOJv23J8jme23RsEAMqqQJrb9PnnEbPEVpUAuJD4Mf/PoCqeONQCUJYFElGKf7ojpnqjUQtAWRdJaf1t2w8ofSAUBNKulATSEaUPhIpIRj9icbyFUgdCTSRTeR0i2HwfpQ0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQBnG392D9QU+JXhxAAAAAElFTkSuQmCC', ''); -- -------------------------------------------------------- --- +-- -- Dumping data for table `sys_user` --- +-- INSERT INTO `sys_theme` (`var_id`, `tpl_name`, `username`, `logo_url`) VALUES (NULL, 'default', 'global', 'themes/default/images/header_logo.png'); INSERT INTO `sys_theme` (`var_id`, `tpl_name`, `username`, `logo_url`) VALUES (NULL, 'default-v2', 'global', 'themes/default-v2/images/header_logo.png'); -- -------------------------------------------------------- --- +-- -- Dumping data for table `sys_user` --- +-- -INSERT INTO `sys_user` (`userid`, `sys_userid`, `sys_groupid`, `sys_perm_user`, `sys_perm_group`, `sys_perm_other`, `username`, `passwort`, `modules`, `startmodule`, `app_theme`, `typ`, `active`, `language`, `groups`, `default_group`, `client_id`) VALUES (1, 1, 0, 'riud', 'riud', '', 'admin', '21232f297a57a5a743894a0e4a801fc3', 'dashboard,admin,client,mail,monitor,sites,dns,vm,tools,help', 'dashboard', 'default', 'admin', 1, 'en', '1,2', 1, 0); +INSERT INTO `sys_user` (`userid`, `sys_userid`, `sys_groupid`, `sys_perm_user`, `sys_perm_group`, `sys_perm_other`, `username`, `passwort`, `modules`, `startmodule`, `app_theme`, `typ`, `active`, `language`, `groups`, `default_group`, `client_id`) VALUES (1, 1, 0, 'riud', 'riud', '', 'admin', 'xxx', 'dashboard,admin,client,mail,monitor,sites,dns,vm,tools,help', 'dashboard', 'default', 'admin', 1, 'en', '1,2', 1, 0); -- -------------------------------------------------------- @@ -2569,7 +2534,7 @@ INSERT INTO `sys_user` (`userid`, `sys_userid`, `sys_groupid`, `sys_perm_user`, -- Dumping data for table `sys_config` -- -INSERT INTO sys_config VALUES ('db','db_version','3.1dev'); +INSERT INTO sys_config VALUES ('db','db_version','3.2dev'); INSERT INTO sys_config VALUES ('interface','session_timeout','0'); SET FOREIGN_KEY_CHECKS = 1; 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_acme.conf.master b/install/tpl/apache_acme.conf.master new file mode 100644 index 0000000000000000000000000000000000000000..38a68d29ead9db31af97623650f51f64bd59952f --- /dev/null +++ b/install/tpl/apache_acme.conf.master @@ -0,0 +1,13 @@ +Alias /.well-known/acme-challenge /usr/local/ispconfig/interface/acme/.well-known/acme-challenge + + + Require all granted + + Order allow,deny + Allow from all + + + AssignUserId ispconfig ispconfig + + + diff --git a/install/tpl/apache_apps.vhost.master b/install/tpl/apache_apps.vhost.master deleted file mode 100644 index 9cccf8d38ed0e3f6adf7466396803a2856c886cb..0000000000000000000000000000000000000000 --- a/install/tpl/apache_apps.vhost.master +++ /dev/null @@ -1,91 +0,0 @@ - -###################################################### -# This virtual host contains the configuration -# for the ISPConfig apps vhost -###################################################### - -{tmpl_var name='vhost_port_listen'} Listen {tmpl_var name='apps_vhost_port'} -# NameVirtualHost *:{tmpl_var name='apps_vhost_port'} - - - ServerAdmin webmaster@localhost - {tmpl_var name='apps_vhost_servername'} - - - SetHandler None - - - - RequestHeader unset Proxy early - - - {tmpl_if name="enable_spdy" op="==" value="y"} - - SpdyEnabled on - - {/tmpl_if} - - - DocumentRoot {tmpl_var name='apps_vhost_dir'} - AddType application/x-httpd-php .php - - Options FollowSymLinks - AllowOverride None - - Require all granted - - Order allow,deny - Allow from all - - - - - - DocumentRoot {tmpl_var name='apps_vhost_dir'} - AddType application/x-httpd-php .php - - Options FollowSymLinks - AllowOverride None - - Require all granted - - Order allow,deny - Allow from all - - - - - - DocumentRoot {tmpl_var name='apps_vhost_dir'} - SuexecUserGroup ispapps ispapps - - Options +Indexes +FollowSymLinks +MultiViews +ExecCGI - AllowOverride AuthConfig Indexes Limit Options FileInfo - - SetHandler fcgid-script - - FCGIWrapper {tmpl_var name='apps_vhost_basedir'}/php-fcgi-scripts/apps/.php-fcgi-starter .php - - Require all granted - - Order allow,deny - Allow from all - - - - -{tmpl_if name="use_rspamd"} - - Order allow,deny - Allow from all - - RewriteEngine On - RewriteRule ^/rspamd$ /rspamd/ [R,L] - RewriteRule ^/rspamd/(.*) http://127.0.0.1:11334/$1 [P] -{/tmpl_if} - - - - - - diff --git a/install/tpl/apache_apps.vhost.master b/install/tpl/apache_apps.vhost.master new file mode 120000 index 0000000000000000000000000000000000000000..a2fefe5c926292f5d2f954788eeda1e76d1798b4 --- /dev/null +++ b/install/tpl/apache_apps.vhost.master @@ -0,0 +1 @@ +server/conf/apache_apps.vhost.master \ No newline at end of file diff --git a/install/tpl/apache_ispconfig.conf.master b/install/tpl/apache_ispconfig.conf.master index 84eec5c5540c9b2f3f4c4ef159417cc96ff55cfb..c968abf3679777acd99fa6b8ddbee89524d43956 100644 --- a/install/tpl/apache_ispconfig.conf.master +++ b/install/tpl/apache_ispconfig.conf.master @@ -1,3 +1,12 @@ +# Important: A copy of this file exists in server/conf/ folder. +# Edit both files when applying changes. + +################################################ +# ISPConfig General Apache Options +################################################ +ServerTokens ProductOnly +ServerSignature Off +DirectoryIndex index.html index.cgi index.pl index.php index.xhtml index.htm standard_index.html ################################################ # ISPConfig Logfile configuration for vlogger @@ -7,10 +16,10 @@ SetEnvIf Request_URI "^/datalogstatus.php$" dontlog LogFormat "%v %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined_ispconfig -CustomLog "| /usr/local/ispconfig/server/scripts/vlogger -p -s access.log -t \"%Y%m%d-access.log\" /var/log/ispconfig/httpd" combined_ispconfig env=!dontlog +CustomLog "| /usr/local/ispconfig/server/scripts/vlogger -p -s access.log -t \"%Y%m%d-access.log\" /var/log/ispconfig/httpd" combined_ispconfig -CustomLog "| /usr/local/ispconfig/server/scripts/vlogger -s access.log -t \"%Y%m%d-access.log\" /var/log/ispconfig/httpd" combined_ispconfig env=!dontlog +CustomLog "| /usr/local/ispconfig/server/scripts/vlogger -s access.log -t \"%Y%m%d-access.log\" /var/log/ispconfig/httpd" combined_ispconfig @@ -35,6 +44,10 @@ CustomLog "| /usr/local/ispconfig/server/scripts/vlogger -s access.log -t \"%Y%m + + Options -Indexes + + AllowOverride None @@ -123,22 +136,36 @@ CustomLog "| /usr/local/ispconfig/server/scripts/vlogger -s access.log -t \"%Y%m Alias /awstats-icon "/usr/share/awstats/icon" -Alias /.well-known/acme-challenge /usr/local/ispconfig/interface/acme/.well-known/acme-challenge - - - Require all granted - - Order allow,deny - Allow from all - - - AssignUserId www-data www-data - - + + NameVirtualHost *:80 + NameVirtualHost *:443 + + NameVirtualHost {tmpl_var name="ip_address"}:{tmpl_var name="port"} + + -NameVirtualHost *:80 -NameVirtualHost *:443 - -NameVirtualHost {tmpl_var name="ip_address"}:{tmpl_var name="port"} - + + + SSLStaplingCache shmcb:/var/run/ocsp(128000) + + + + + AllowOverride None + + Require all denied + + Order Deny,Allow + Deny from all + + + + AllowOverride None + + Require all denied + + Order Deny,Allow + Deny from all + + diff --git a/install/tpl/apache_ispconfig.vhost.master b/install/tpl/apache_ispconfig.vhost.master index d8c56de22d1163ee7e148192dbd71680f5e4a7d7..df0b98fda7da7c7c4ff5896742a65ad1f8476350 100644 --- a/install/tpl/apache_ispconfig.vhost.master +++ b/install/tpl/apache_ispconfig.vhost.master @@ -9,6 +9,8 @@ NameVirtualHost *: > ServerAdmin webmaster@localhost + Alias /mail /var/www/ispconfig/mail + SetHandler None @@ -70,7 +72,7 @@ NameVirtualHost *: # SSL Configuration SSLEngine On - SSLProtocol All -SSLv3 + SSLProtocol All -SSLv3 -TLSv1 -TLSv1.1 SSLProtocol All -SSLv2 -SSLv3 @@ -78,7 +80,7 @@ NameVirtualHost *: SSLCertificateKeyFile /usr/local/ispconfig/interface/ssl/ispserver.key SSLCACertificateFile /usr/local/ispconfig/interface/ssl/ispserver.bundle - SSLCipherSuite ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS + SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384 SSLHonorCipherOrder On SSLCompression Off @@ -89,11 +91,13 @@ NameVirtualHost *: # ISPConfig 3.1 currently requires unsafe-line for both scripts and styles, as well as unsafe-eval + Header set Content-Security-Policy "default-src 'self' 'unsafe-inline' 'unsafe-eval'; img-src 'self' data:; object-src 'none'" Header set Content-Security-Policy "default-src 'self' 'unsafe-inline' 'unsafe-eval'; img-src 'self' data:; object-src 'none'; upgrade-insecure-requests" Header set X-Content-Type-Options: nosniff Header set X-Frame-Options: SAMEORIGIN Header set X-XSS-Protection: "1; mode=block" - Header always edit Set-Cookie (.*) "$1; HTTPOnly; Secure" + Header always edit Set-Cookie (.*) "$1; HTTPOnly" + Header always edit Set-Cookie (.*) "$1; Secure" = 2.4.7> Header setifempty Strict-Transport-Security "max-age=15768000" @@ -108,30 +112,8 @@ NameVirtualHost *: SSLStaplingResponderTimeout 5 SSLStaplingReturnResponderErrors Off - - - - SSLStaplingCache shmcb:/var/run/ocsp(128000) - - - - - AllowOverride None - - Require all denied - - Order Deny,Allow - Deny from all - - + # Redirect http to https + ErrorDocument 400 "

Error 400 - trying to redirect

" - - AllowOverride None - - Require all denied - - Order Deny,Allow - Deny from all - - +
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/config.inc.php.master b/install/tpl/config.inc.php.master index 02a7b2f65ccccde2db89cfcaac24e86307e88843..aa9329fb7b2a6625fe1fbcf76dce81922c8eaf5e 100644 --- a/install/tpl/config.inc.php.master +++ b/install/tpl/config.inc.php.master @@ -33,11 +33,11 @@ if( !empty($_SERVER['DOCUMENT_ROOT']) ) { Header("Pragma: no-cache"); Header("Cache-Control: no-store, no-cache, max-age=0, must-revalidate"); Header("Content-Type: text/html; charset=utf-8"); - + //** Set a few php.ini values ini_set('register_globals',0); ini_set('magic_quotes_gpc', 0); - + if (isset($_REQUEST['GLOBALS']) || isset($_FILES['GLOBALS']) || isset($_REQUEST['s']) || isset($_REQUEST['s_old']) || isset($_REQUEST['conf'])) { die('Internal Error: var override attempt detected'); exit; @@ -45,7 +45,6 @@ if( !empty($_SERVER['DOCUMENT_ROOT']) ) { } //** Set a few php.ini values -if(get_magic_quotes_runtime()) set_magic_quotes_runtime(false); if(isset($app)) unset($app); if(isset($conf)) unset($conf); @@ -56,8 +55,8 @@ $revision = str_replace(array('Revision:','$',' '), '', $svn_revision); //** Application define('ISPC_APP_TITLE', 'ISPConfig'); -define('ISPC_APP_VERSION', '3.1dev'); -define('DEVSYSTEM', 0); +define('ISPC_APP_VERSION', '3.2dev'); +define('DEVSYSTEM', false); //** Database @@ -118,7 +117,7 @@ define('CLASSES_ROOT',INCLUDE_ROOT.FS_DIV.'classes'); //** Server $conf['app_title'] = ISPC_APP_TITLE; $conf['app_version'] = ISPC_APP_VERSION; -$conf['app_link'] = 'http://www.ispconfig.org/'; +$conf['app_link'] = 'https://www.ispconfig.org/'; $conf['modules_available'] = 'dashboard,admin,mail,sites,monitor,client,dns,help'; $conf['server_id'] = '{server_id}'; $conf['init_scripts'] = '/etc/init.d'; @@ -128,8 +127,8 @@ $conf['init_scripts'] = '/etc/init.d'; $conf['interface_modules_enabled'] = 'dashboard,mail,sites,dns,tools,help'; //** Demo mode -/* The demo mode is an option to restrict certain actions in the interface like -* changing the password of users with sys_userid < 3 etc. to be +/* The demo mode is an option to restrict certain actions in the interface like +* changing the password of users with sys_userid < 3 etc. to be * able to run the ISPConfig interface as online demo. It does not * affect the server part. The demo mode should be always set to false * on every normal installation @@ -142,10 +141,6 @@ $conf['log_file'] = $conf['ispconfig_log_dir'].$conf['fs_div'].'ispconfig.log'; $conf['log_priority'] = {ispconfig_log_priority}; // 0 = Debug, 1 = Warning, 2 = Error -//** Allow software package installations -$conf['software_updates_enabled'] = false; - - //** Themes $conf['theme'] = '{theme}'; $conf['html_content_encoding'] = 'utf-8'; // example: utf-8, iso-8859-1, ... diff --git a/install/tpl/debian6_dovecot-sql.conf.master b/install/tpl/debian6_dovecot-sql.conf.master index e05330dc26a4216d28e5d85f2918d005558232f4..d0b5269e13fc8519b1a41d6608c2ae2495421fdb 100644 --- a/install/tpl/debian6_dovecot-sql.conf.master +++ b/install/tpl/debian6_dovecot-sql.conf.master @@ -1,22 +1,14 @@ # http://wiki.dovecot.org/AuthDatabase/SQL -# -# CREATE TABLE users ( -# userid VARCHAR(128) NOT NULL, -# password VARCHAR(64) NOT NULL, -# home VARCHAR(255) NOT NULL, -# uid INTEGER NOT NULL, -# gid INTEGER NOT NULL, -# active CHAR(1) DEFAULT 'Y' NOT NULL -# ); driver = mysql connect = host={mysql_server_host} dbname={mysql_server_database} user={mysql_server_ispconfig_user} password={mysql_server_ispconfig_password} port={mysql_server_port} default_pass_scheme = CRYPT # password-query with prefetch -password_query = SELECT email as user, password, maildir as userdb_home, CONCAT( maildir_format, ':', maildir, '/', IF(maildir_format='maildir','Maildir',maildir_format)) as userdb_mail, uid as userdb_uid, gid as userdb_gid, CONCAT('*:storage=', quota, 'B') AS userdb_quota_rule, CONCAT(maildir, '/.sieve') as userdb_sieve FROM mail_user WHERE (login = '%u' OR email = '%u') AND `disable%Ls` = 'n' AND server_id = '{server_id}' +password_query = SELECT email as user, password, maildir as userdb_home, CONCAT( maildir_format, ':', maildir, '/', IF(maildir_format='maildir','Maildir',maildir_format)) as userdb_mail, uid as userdb_uid, gid as userdb_gid, CONCAT('*:storage=', quota, 'B') AS userdb_quota_rule, CONCAT(maildir, '/.sieve') as userdb_sieve FROM mail_user WHERE (login = '%u' OR email = '%u') AND `disable%Ls` = 'n' AND server_id = '{server_id}' AND NOT EXISTS (SELECT domain_id FROM mail_domain WHERE domain = '%d' AND active = 'n' AND server_id = {server_id}) + user_query = SELECT email as user, maildir as home, CONCAT( maildir_format, ':', maildir, '/', IF(maildir_format='maildir','Maildir',maildir_format)) as mail, uid, gid, CONCAT('*:storage=', quota, 'B') AS quota_rule, CONCAT(maildir, '/.sieve') as sieve FROM mail_user WHERE (login = '%u' OR email = '%u') AND `disable%Ls` = 'n' AND server_id = '{server_id}' # The iterate_query is required for the doveadm command only and works only on dovecot 2 servers. # Do not enable it on Dovecot 1.x servers -# iterate_query = SELECT email as user FROM mail_user WHERE server_id = '{server_id}' +# iterate_query = SELECT email as user FROM mail_user WHERE disabledoveadm='n' AND server_id = '{server_id}' diff --git a/install/tpl/debian6_dovecot.conf.master b/install/tpl/debian6_dovecot.conf.master index 4286689cd448ef52004801a89570730b3ac36384..f1df2e241e855df746a3b4d7eea5498c8bdf6ba9 100644 --- a/install/tpl/debian6_dovecot.conf.master +++ b/install/tpl/debian6_dovecot.conf.master @@ -57,7 +57,14 @@ plugin { # the maildir quota does not need to be set. # You do not need: quota = maildir + # no longer needed, as 'sieve' is in userdb extra fields: sieve=/var/vmail/%d/%n/.sieve + + sieve_before=/var/vmail/%d/%n/.ispconfig-before.sieve + sieve_after=/var/vmail/%d/%n/.ispconfig.sieve + sieve_max_script_size = 2M + sieve_max_actions = 100 + sieve_max_redirects = 25 } diff --git a/install/tpl/debian6_dovecot2.conf.master b/install/tpl/debian6_dovecot2.conf.master index 777280f044eb6739965d602f7c19122d636b3f86..36ae86fa6df7023218ba12d686fdb6a6c964ec38 100644 --- a/install/tpl/debian6_dovecot2.conf.master +++ b/install/tpl/debian6_dovecot2.conf.master @@ -1,3 +1,6 @@ +# Do not change this file, as changes will be overwritten by any ISPConfig update. +# Put your custom settings in /usr/local/ispconfig/server/conf-custom/install/dovecot_custom.conf.master. +# To start using those changes, do a force upgrade and let it reconfigure your services. (ispconfig_update.sh --force) listen = *,[::] protocols = imap pop3 auth_mechanisms = plain login @@ -7,9 +10,12 @@ mail_privileged_group = vmail ssl_cert = > /etc/jailkit/jk_init.ini + +[coreutils] +comment = non-sbin progs from coreutils +paths = cat, chgrp, chmod, chown, cp, date, dd, df, dir, echo, false, ln, ls, mkdir, mknod, mktemp, mv, pwd, readlink, rm, rmdir, sleep, stty, sync, touch, true, uname, vdir, [, arch, b2sum, base32, base64, basename, chcon, cksum, comm, csplit, cut, dircolors, dirname, du, env, expand, expr, factor, fmt, fold, groups, head, hostid, id, install, join, link, logname, md5sum, mkfifo, nice, nl, nohup, nproc, numfmt, od, paste, pathchk, pinky, pr, printenv, printf, ptx, realpath, runcon, seq, sha1sum, sha224sum, sha256sum, sha384sum, sha512sum, shred, shuf, sort, split, stat, stdbuf, sum, tac, tail, tee, test, timeout, tr, truncate, tsort, tty, unexpand, uniq, unlink, users, wc, who, whoami, yes, md5sum.textutils + +[wp] +comment = WordPress Command Line +paths = wp, which, mysqlcheck, tput, unrar, /usr/local/bin/php +includesections = php, mysql-client + +[mysql-client] +comment = mysql client +paths = mysql, mysqldump, mysqlshow, /usr/lib/libmysqlclient.so, /usr/lib/i386-linux-gnu/libmariadb.so.3, /usr/lib/i386-linux-gnu/mariadb19, /usr/lib/x86_64-linux-gnu/libmariadb.so.3, /usr/lib/x86_64-linux-gnu/mariadb19, /usr/lib/arm-linux-gnueabihf/libmariadb.so.3, /usr/lib/arm-linux-gnueabihf/mariadb19, /usr/lib/aarch64-linux-gnu/libmariadb.so.3, /usr/lib/aarch64-linux-gnu/mariadb19 +includesections = netbasics + +[composer] +comment = composer +paths = composer, /usr/local/bin/composer, /usr/share/doc/composer +includesections = php, uidbasics, netbasics + +[node] +comment = NodeJS +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 +paths = env + +# Debian 10 default php version is 7.3 (Debian 9 is 7.0) +# Todo: set default version in ISPConfig installer, +# but install the php cli version matching the website +[php] +comment = default php version and libraries +paths = /usr/bin/php +includesections = php_common, php7_3 + +[php_common] +comment = common php directories and libraries +# notice: potential information leak +# do not add all of /etc/php/ or any of the fpm directories +# or the php config (which includes custom php snippets) from *all* +# sites which use fpm will be copied to *every* jailkit +paths = /usr/bin/php, /usr/lib/php/, /usr/share/php/, /usr/share/zoneinfo/ +includesections = env, logbasics, netbasics + +[php5_6] +comment = php version 5.6 +paths = /usr/bin/php5.6, /usr/lib/php/5.6/, /usr/lib/php/20131226/, /usr/share/php/5.6/, /etc/php/5.6/cli/, /etc/php/5.6/mods-available/ +includesections = php_common + +[php7_0] +comment = php version 7.0 +paths = /usr/bin/php7.0, /usr/lib/php/7.0/, /usr/lib/php/20151012/, /usr/share/php/7.0/, /etc/php/7.0/cli/, /etc/php/7.0/mods-available/ +includesections = php_common + +[php7_1] +comment = php version 7.1 +paths = /usr/bin/php7.1, /usr/lib/php/7.1/, /usr/lib/php/20160303/, /usr/share/php/7.1/, /etc/php/7.1/cli/, /etc/php/7.1/mods-available/ +includesections = php_common + +[php7_2] +comment = php version 7.2 +paths = /usr/bin/php7.2, /usr/lib/php/7.2/, /usr/lib/php/20170718/, /usr/share/php/7.2/, /etc/php/7.2/cli/, /etc/php/7.2/mods-available/ +includesections = php_common + +[php7_3] +comment = php version 7.3 +paths = /usr/bin/php7.3, /usr/lib/php/7.3/, /usr/lib/php/20180731/, /usr/share/php/7.3/, /etc/php/7.3/cli/, /etc/php/7.3/mods-available/ +includesections = php_common + +[php7_4] +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 + +[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 43f362d5c0f43b8c39f95db09ede9ac90c840fd9..68d4561494b0568c7b4bbac4e6d51ad13c1f66f2 100644 --- a/install/tpl/master_cf_amavis10025.master +++ b/install/tpl/master_cf_amavis10025.master @@ -8,9 +8,12 @@ -o smtpd_helo_restrictions= -o smtpd_sender_restrictions= -o smtpd_recipient_restrictions=permit_mynetworks,reject + -o smtpd_end_of_data_restrictions= -o mynetworks=127.0.0.0/8 -o strict_rfc821_envelopes=yes -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 f9fdf1cf6045faca63eab27d6f8774a689bac44a..d3a07a8bce45d1e2c415f1a6085323faa9066261 100644 --- a/install/tpl/master_cf_amavis10027.master +++ b/install/tpl/master_cf_amavis10027.master @@ -8,11 +8,14 @@ -o smtpd_helo_restrictions= -o smtpd_sender_restrictions= -o smtpd_recipient_restrictions=permit_mynetworks,reject + -o smtpd_end_of_data_restrictions= -o mynetworks=127.0.0.0/8 -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-verify_recipients.cf.master b/install/tpl/mysql-verify_recipients.cf.master new file mode 100644 index 0000000000000000000000000000000000000000..2b433491d8e3d9817d20f2d6d9674200410ade96 --- /dev/null +++ b/install/tpl/mysql-verify_recipients.cf.master @@ -0,0 +1,5 @@ +user = {mysql_server_ispconfig_user} +password = {mysql_server_ispconfig_password} +dbname = {mysql_server_database} +hosts = {mysql_server_ip} +query = SELECT 'reject_unverified_recipient' FROM mail_domain WHERE domain = '%s' AND active = 'y' AND server_id = {server_id} diff --git a/install/tpl/mysql-virtual_alias_domains.cf.master b/install/tpl/mysql-virtual_alias_domains.cf.master new file mode 100644 index 0000000000000000000000000000000000000000..26b14ac00da538ba9253fe937cb6a4f79bec5942 --- /dev/null +++ b/install/tpl/mysql-virtual_alias_domains.cf.master @@ -0,0 +1,7 @@ +user = {mysql_server_ispconfig_user} +password = {mysql_server_ispconfig_password} +dbname = {mysql_server_database} +hosts = {mysql_server_ip} +query = SELECT SUBSTRING_INDEX(destination, '@', -1) FROM mail_forwarding + WHERE source = '@%s' AND type = 'aliasdomain' AND active = 'y' AND server_id = {server_id} + diff --git a/install/tpl/mysql-virtual_alias_maps.cf.master b/install/tpl/mysql-virtual_alias_maps.cf.master new file mode 100644 index 0000000000000000000000000000000000000000..e55fd8ea8df088457ba43a01c8df62a33e888b6f --- /dev/null +++ b/install/tpl/mysql-virtual_alias_maps.cf.master @@ -0,0 +1,6 @@ +user = {mysql_server_ispconfig_user} +password = {mysql_server_ispconfig_password} +dbname = {mysql_server_database} +hosts = {mysql_server_ip} +query = SELECT destination FROM mail_forwarding + WHERE source = '@%d' AND type = 'aliasdomain' AND active = 'y' AND server_id = {server_id} diff --git a/install/tpl/mysql-virtual_client.cf.master b/install/tpl/mysql-virtual_client.cf.master index bad0cb9655db1fcb2924438f51b073de7b61f6db..106b647e4ae6aca74a46ecf3ca4a2cce29ff0995 100644 --- a/install/tpl/mysql-virtual_client.cf.master +++ b/install/tpl/mysql-virtual_client.cf.master @@ -1,8 +1,5 @@ user = {mysql_server_ispconfig_user} password = {mysql_server_ispconfig_password} dbname = {mysql_server_database} -table = mail_access -select_field = access -where_field = source -additional_conditions = and type = 'client' and active = 'y' -hosts = {mysql_server_ip} \ No newline at end of file +hosts = {mysql_server_ip} +query = select access from mail_access where source = '%s' and type = 'client' and active = 'y' diff --git a/install/tpl/mysql-virtual_domains.cf.master b/install/tpl/mysql-virtual_domains.cf.master index 5b711422f257b4eeb9b0ea998a11346aa4c4330e..11ccb046ef0a37a9bd2a3f33437a5efbe4e7b428 100644 --- a/install/tpl/mysql-virtual_domains.cf.master +++ b/install/tpl/mysql-virtual_domains.cf.master @@ -1,8 +1,6 @@ user = {mysql_server_ispconfig_user} password = {mysql_server_ispconfig_password} dbname = {mysql_server_database} -table = mail_domain -select_field = domain -where_field = domain -additional_conditions = and active = 'y' and server_id = {server_id} -hosts = {mysql_server_ip} \ No newline at end of file +hosts = {mysql_server_ip} +query = SELECT domain FROM mail_domain WHERE domain = '%s' AND active = 'y' AND server_id = {server_id} + AND NOT EXISTS (SELECT source FROM mail_forwarding WHERE source = '@%s' AND type = 'aliasdomain' AND active = 'y' AND server_id = {server_id}) diff --git a/install/tpl/mysql-virtual_email2email.cf.master b/install/tpl/mysql-virtual_email2email.cf.master index e18ef2407e80040c1f0e7875753902c1de61f342..21d5146f2c129485c237fcc980f06ccf473c8e25 100644 --- a/install/tpl/mysql-virtual_email2email.cf.master +++ b/install/tpl/mysql-virtual_email2email.cf.master @@ -1,8 +1,9 @@ user = {mysql_server_ispconfig_user} password = {mysql_server_ispconfig_password} dbname = {mysql_server_database} -table = mail_user -select_field = email -where_field = email -additional_conditions = and postfix = 'y' and server_id = {server_id} -hosts = {mysql_server_ip} \ No newline at end of file +hosts = {mysql_server_ip} +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} + AND EXISTS (SELECT domain_id FROM mail_domain WHERE domain = SUBSTRING_INDEX('%s', '@', -1) AND active = 'y' AND server_id = {server_id}) diff --git a/install/tpl/mysql-virtual_forwardings.cf.master b/install/tpl/mysql-virtual_forwardings.cf.master index 7d5c2e2a472049a2765f0298019ad7c19c5c95f2..8607735c932b18f95a458ed3dcbd297d7120f8ea 100644 --- a/install/tpl/mysql-virtual_forwardings.cf.master +++ b/install/tpl/mysql-virtual_forwardings.cf.master @@ -1,9 +1,11 @@ user = {mysql_server_ispconfig_user} password = {mysql_server_ispconfig_password} dbname = {mysql_server_database} -table = mail_forwarding -select_field = destination -where_field = source -# additional_conditions = and type != 'aliasdomain' and active = 'y' and server_id = {server_id} -additional_conditions = and active = 'y' and server_id = {server_id} -hosts = {mysql_server_ip} \ No newline at end of file +hosts = {mysql_server_ip} +query = SELECT s.destination AS target FROM mail_forwarding AS s + WHERE (s.source = '%s' OR s.source = {address_without_extension}) AND s.type IN ('alias', 'forward') AND s.active = 'y' AND s.server_id = {server_id} + UNION + SELECT s.destination AS target FROM mail_forwarding AS s + WHERE s.source = '@%d' AND s.type = 'catchall' AND s.active = 'y' AND s.server_id = {server_id} + AND NOT EXISTS (SELECT email FROM mail_user WHERE (email = '%s' OR email = {address_without_extension}) AND EXISTS (SELECT domain_id FROM mail_domain WHERE domain = SUBSTRING_INDEX('%s', '@', -1) AND active = 'y' AND server_id = {server_id}) AND server_id = {server_id}) + AND NOT EXISTS (SELECT source FROM mail_forwarding WHERE (source = '%s' OR source = {address_without_extension}) AND active = 'y' AND server_id = {server_id}) diff --git a/install/tpl/mysql-virtual_gids.cf.master b/install/tpl/mysql-virtual_gids.cf.master index 7c7d995fc98bb334e087f3a0e307a793f8cc1b9b..0bd2c8ec6964267a3a78516e451a1760de15ad73 100644 --- a/install/tpl/mysql-virtual_gids.cf.master +++ b/install/tpl/mysql-virtual_gids.cf.master @@ -1,8 +1,6 @@ user = {mysql_server_ispconfig_user} password = {mysql_server_ispconfig_password} dbname = {mysql_server_database} -table = mail_user -select_field = gid -where_field = email -additional_conditions = and postfix = 'y' and server_id = {server_id} -hosts = {mysql_server_ip} \ No newline at end of file +hosts = {mysql_server_ip} +query = SELECT gid FROM mail_user WHERE email = '%s' 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}) diff --git a/install/tpl/mysql-virtual_mailboxes.cf.master b/install/tpl/mysql-virtual_mailboxes.cf.master index 2fe47bbdf5d85c9765141208a7b43f844f44429e..76cc05f46433a547860fd4b86c8e045722c64bb5 100644 --- a/install/tpl/mysql-virtual_mailboxes.cf.master +++ b/install/tpl/mysql-virtual_mailboxes.cf.master @@ -1,8 +1,6 @@ user = {mysql_server_ispconfig_user} password = {mysql_server_ispconfig_password} dbname = {mysql_server_database} -table = mail_user -select_field = CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') -where_field = login -additional_conditions = and postfix = 'y' and server_id = {server_id} hosts = {mysql_server_ip} +query = SELECT CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') FROM mail_user WHERE email = '%s' AND postfix = 'y' AND disabledeliver = 'n' 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}) diff --git a/install/tpl/mysql-virtual_outgoing_bcc.cf b/install/tpl/mysql-virtual_outgoing_bcc.cf deleted file mode 100644 index 78fca41a2f54013ac500613691dc8319cd1ab289..0000000000000000000000000000000000000000 --- a/install/tpl/mysql-virtual_outgoing_bcc.cf +++ /dev/null @@ -1,8 +0,0 @@ -user = {mysql_server_ispconfig_user} -password = {mysql_server_ispconfig_password} -dbname = {mysql_server_database} -table = mail_user -select_field = sender_cc -where_field = email -additional_conditions = and postfix = 'y' and disabledeliver = 'n' and disables$ -hosts = {mysql_server_ip} \ No newline at end of file diff --git a/install/tpl/mysql-virtual_outgoing_bcc.cf.master b/install/tpl/mysql-virtual_outgoing_bcc.cf.master index 53afa531062d2cadcfbdf5ee57464f366dbb7446..1501154e161d63a26d27a265c557e396ae18b92f 100644 --- a/install/tpl/mysql-virtual_outgoing_bcc.cf.master +++ b/install/tpl/mysql-virtual_outgoing_bcc.cf.master @@ -1,8 +1,19 @@ user = {mysql_server_ispconfig_user} password = {mysql_server_ispconfig_password} dbname = {mysql_server_database} -table = mail_user -select_field = sender_cc -where_field = email -additional_conditions = and postfix = 'y' and disabledeliver = 'n' and disablesmtp = 'n' and sender_cc != '' -hosts = {mysql_server_ip} \ No newline at end of file +hosts = {mysql_server_ip} +query = SELECT sender_cc FROM ( + SELECT SUBSTRING_INDEX(sender_cc, ',', 1) AS sender_cc + FROM mail_user + WHERE email = '%s' AND disablesmtp = 'n' AND sender_cc != '' 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 SUBSTRING_INDEX(u.sender_cc, ',', 1) AS sender_cc + FROM mail_user u, mail_forwarding f + WHERE f.destination REGEXP CONCAT( '((^|\\n)[[:blank:]]*,?|[[:alnum:]][[:blank:]]*,)[[:blank:]]*', + REPLACE( REPLACE(u.email, '+', '\\+'), '.', '\\.' ), + '[[:blank:]]*(,[[:blank:]]*[[:alnum:]]|,?[[:blank:]]*(\\r?\\n|$))' ) + AND u.disablesmtp = 'n' AND u.sender_cc != '' AND u.server_id = {server_id} + AND f.source = '%s' AND f.allow_send_as = 'y' AND f.active = 'y' AND f.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}) + ) table1 WHERE sender_cc != '' LIMIT 1 diff --git a/install/tpl/mysql-virtual_policy_greylist.cf.master b/install/tpl/mysql-virtual_policy_greylist.cf.master index 55378b29cae4ebbe59815fedfed235c61632a4a1..8896b823a7778523d87505e31d24cbf826e86200 100644 --- a/install/tpl/mysql-virtual_policy_greylist.cf.master +++ b/install/tpl/mysql-virtual_policy_greylist.cf.master @@ -1,10 +1,14 @@ user = {mysql_server_ispconfig_user} password = {mysql_server_ispconfig_password} dbname = {mysql_server_database} +hosts = {mysql_server_ip} query = SELECT 'greylisting' FROM - (SELECT `greylisting`, 1 as `prio` FROM `mail_user` WHERE `server_id` = {server_id} AND `email` = '%s' - UNION SELECT `greylisting`, 2 as `prio` FROM `mail_forwarding` WHERE `server_id` = {server_id} AND `source` = '%s' - UNION SELECT `greylisting`, 3 as `prio` FROM `mail_forwarding` WHERE `server_id` = {server_id} AND `source` = '@%d' ORDER BY `prio` ASC LIMIT 1) as rules + ( + SELECT `greylisting`, 1 as `prio` FROM `mail_user` WHERE `server_id` = {server_id} AND `email` = '%s' + AND EXISTS (SELECT domain_id FROM mail_domain WHERE domain = SUBSTRING_INDEX('%s', '@', -1) AND active = 'y' AND server_id = {server_id}) + UNION + SELECT `greylisting`, 2 as `prio` FROM `mail_forwarding` WHERE `server_id` = {server_id} AND `source` = '%s' AND active = 'y' + UNION + SELECT `greylisting`, 3 as `prio` FROM `mail_forwarding` WHERE `server_id` = {server_id} AND `source` = '@%d' AND active = 'y' ORDER BY `prio` ASC LIMIT 1 + ) AS rules WHERE rules.greylisting = 'y' - -hosts = {mysql_server_ip} diff --git a/install/tpl/mysql-virtual_recipient.cf.master b/install/tpl/mysql-virtual_recipient.cf.master index 49024f3ebd262cc8929fc947e373b21d5a56fac6..2099966df2411b223ec21b14f251056eeaf12f38 100644 --- a/install/tpl/mysql-virtual_recipient.cf.master +++ b/install/tpl/mysql-virtual_recipient.cf.master @@ -1,8 +1,5 @@ user = {mysql_server_ispconfig_user} password = {mysql_server_ispconfig_password} dbname = {mysql_server_database} -table = mail_access -select_field = access -where_field = source -additional_conditions = and type = 'recipient' and active = 'y' and server_id = {server_id} -hosts = {mysql_server_ip} \ No newline at end of file +hosts = {mysql_server_ip} +query = select access from mail_access where source = '%s' and type = 'recipient' and active = 'y' and server_id = {server_id} diff --git a/install/tpl/mysql-virtual_relaydomains.cf.master b/install/tpl/mysql-virtual_relaydomains.cf.master index fb7bec1a3a60d53ee9103f0a8bb32cc280bc8797..c27596d1e75d56e522ad5c40a67399af406cec29 100644 --- a/install/tpl/mysql-virtual_relaydomains.cf.master +++ b/install/tpl/mysql-virtual_relaydomains.cf.master @@ -1,8 +1,5 @@ user = {mysql_server_ispconfig_user} password = {mysql_server_ispconfig_password} dbname = {mysql_server_database} -table = mail_transport -select_field = domain -where_field = domain -additional_conditions = and active = 'y' and server_id = {server_id} -hosts = {mysql_server_ip} \ No newline at end of file +hosts = {mysql_server_ip} +query = select domain from mail_relay_domain where domain = '%s' and active = 'y' and server_id = {server_id} diff --git a/install/tpl/mysql-virtual_relayrecipientmaps.cf.master b/install/tpl/mysql-virtual_relayrecipientmaps.cf.master index a6304fe3234ff6ff70dbb5c594b6882ad8955ea0..ea67220215dcb3ec12d0a862e78cba08592ee75d 100644 --- a/install/tpl/mysql-virtual_relayrecipientmaps.cf.master +++ b/install/tpl/mysql-virtual_relayrecipientmaps.cf.master @@ -1,8 +1,5 @@ user = {mysql_server_ispconfig_user} password = {mysql_server_ispconfig_password} dbname = {mysql_server_database} -table = mail_relay_recipient -select_field = access -where_field = source -additional_conditions = and active = 'y' and server_id = {server_id} -hosts = {mysql_server_ip} \ No newline at end of file +hosts = {mysql_server_ip} +query = select access from mail_relay_recipient where source = '%s' and active = 'y' and server_id = {server_id} diff --git a/install/tpl/mysql-virtual_sender-relayauth.cf.master b/install/tpl/mysql-virtual_sender-relayauth.cf.master new file mode 100644 index 0000000000000000000000000000000000000000..413607c763f616d65263e86eb063cfcd0f5c5b2a --- /dev/null +++ b/install/tpl/mysql-virtual_sender-relayauth.cf.master @@ -0,0 +1,10 @@ +user = {mysql_server_ispconfig_user} +password = {mysql_server_ispconfig_password} +dbname = {mysql_server_database} +hosts = {mysql_server_ip} +query = SELECT CONCAT(relay_user,':',relay_pass) as credential + FROM mail_domain + WHERE domain = '%d' + AND active = 'y' + AND concat(relay_host,relay_user,relay_pass) != '' + AND server_id = {server_id} diff --git a/install/tpl/mysql-virtual_sender-relayhost.cf.master b/install/tpl/mysql-virtual_sender-relayhost.cf.master new file mode 100644 index 0000000000000000000000000000000000000000..3bb4c81330bc071d484446c25a1eb3d40ccf6ebd --- /dev/null +++ b/install/tpl/mysql-virtual_sender-relayhost.cf.master @@ -0,0 +1,10 @@ +user = {mysql_server_ispconfig_user} +password = {mysql_server_ispconfig_password} +dbname = {mysql_server_database} +hosts = {mysql_server_ip} +query = SELECT relay_host as relayhost + FROM mail_domain + WHERE domain = '%d' + AND active = 'y' + AND concat(relay_host,relay_user,relay_pass) != '' + AND server_id = {server_id} diff --git a/install/tpl/mysql-virtual_sender.cf.master b/install/tpl/mysql-virtual_sender.cf.master index 0ef634aec762547e1e92113d3e6be1499c8b9a1a..1a5c4cb877626f05b6ecfa8253b4aaed26144cf4 100644 --- a/install/tpl/mysql-virtual_sender.cf.master +++ b/install/tpl/mysql-virtual_sender.cf.master @@ -1,8 +1,5 @@ user = {mysql_server_ispconfig_user} password = {mysql_server_ispconfig_password} dbname = {mysql_server_database} -table = mail_access -select_field = access -where_field = source -additional_conditions = and type = 'sender' and active = 'y' and server_id = {server_id} -hosts = {mysql_server_ip} \ No newline at end of file +hosts = {mysql_server_ip} +query = select access from mail_access where source = '%s' and type = 'sender' and active = 'y' and server_id = {server_id} diff --git a/install/tpl/mysql-virtual_sender_login_maps.cf.master b/install/tpl/mysql-virtual_sender_login_maps.cf.master index 5b7f144f8cb94c5686a388f950651a86d1c9a618..7342cf87faaa978fec482f2f7a67eeeaf092a00a 100644 --- a/install/tpl/mysql-virtual_sender_login_maps.cf.master +++ b/install/tpl/mysql-virtual_sender_login_maps.cf.master @@ -1,5 +1,14 @@ user = {mysql_server_ispconfig_user} password = {mysql_server_ispconfig_password} dbname = {mysql_server_database} -query = SELECT destination FROM mail_forwarding WHERE source = '%s' AND active = 'y' AND allow_send_as = 'y' AND server_id = {server_id} UNION SELECT email FROM mail_user WHERE email = '%s' AND disablesmtp = 'n' AND server_id = {server_id}; -hosts = {mysql_server_ip} \ No newline at end of file +hosts = {mysql_server_ip} +query = SELECT destination FROM mail_forwarding WHERE source = '%s' AND active = 'y' AND allow_send_as = 'y' AND server_id = {server_id} + UNION + SELECT email FROM mail_user WHERE email = '%s' AND disablesmtp = 'n' 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 login FROM mail_user WHERE email = '%s' AND disablesmtp = 'n' AND server_id = {server_id} + AND EXISTS (SELECT domain_id FROM mail_domain WHERE domain = SUBSTRING_INDEX(email, '@', -1) AND active = 'y' AND server_id = {server_id}) + UNION + SELECT cc FROM mail_user WHERE email = '%s' AND disablesmtp = 'n' AND disabledeliver = 'y' AND server_id = {server_id} + AND EXISTS (SELECT domain_id FROM mail_domain WHERE domain = SUBSTRING_INDEX(email, '@', -1) AND active = 'y' AND server_id = {server_id}) diff --git a/install/tpl/mysql-virtual_transports.cf.master b/install/tpl/mysql-virtual_transports.cf.master index 048a7a81ac85deec4ae936a74515dc9f5cf2748c..e9585ca6cc1b1dc848104094da890710908e00bf 100644 --- a/install/tpl/mysql-virtual_transports.cf.master +++ b/install/tpl/mysql-virtual_transports.cf.master @@ -1,8 +1,5 @@ user = {mysql_server_ispconfig_user} password = {mysql_server_ispconfig_password} dbname = {mysql_server_database} -table = mail_transport -select_field = transport -where_field = domain -additional_conditions = and active = 'y' and server_id = {server_id} -hosts = {mysql_server_ip} \ No newline at end of file +hosts = {mysql_server_ip} +query = select transport from mail_transport where domain = '%s' and active = 'y' and server_id = {server_id} diff --git a/install/tpl/mysql-virtual_uids.cf.master b/install/tpl/mysql-virtual_uids.cf.master index da3cd7c2a0936dc181a478d568a12a3a7aed7347..6fa041bae5569be38e721161ed494a33f8a8b38d 100644 --- a/install/tpl/mysql-virtual_uids.cf.master +++ b/install/tpl/mysql-virtual_uids.cf.master @@ -1,8 +1,6 @@ user = {mysql_server_ispconfig_user} password = {mysql_server_ispconfig_password} dbname = {mysql_server_database} -table = mail_user -select_field = uid -where_field = email -additional_conditions = and postfix = 'y' and server_id = {server_id} hosts = {mysql_server_ip} +query = SELECT uid FROM mail_user WHERE email = '%s' 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}) diff --git a/install/tpl/named.conf.options.master b/install/tpl/named.conf.options.master index f13976ffd6db31f72447c1d0d57be7d2935a556d..588488c1815e82587b2113953040e3f1138b8ea6 100644 --- a/install/tpl/named.conf.options.master +++ b/install/tpl/named.conf.options.master @@ -5,9 +5,9 @@ options { // to talk to, you may need to fix the firewall to allow multiple // ports to talk. See http://www.kb.cert.org/vuls/id/800113 - // If your ISP provided one or more IP addresses for stable - // nameservers, you probably want to use them as forwarders. - // Uncomment the following block, and insert the addresses replacing + // If your ISP provided one or more IP addresses for stable + // nameservers, you probably want to use them as forwarders. + // Uncomment the following block, and insert the addresses replacing // the all-0's placeholder. // forwarders { @@ -18,11 +18,11 @@ 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 listen-on-v6 { any; }; }; - diff --git a/install/tpl/nginx_acme.vhost.master b/install/tpl/nginx_acme.vhost.master new file mode 100644 index 0000000000000000000000000000000000000000..d7c576b04d35e06180cea48db6ff933914ec917c --- /dev/null +++ b/install/tpl/nginx_acme.vhost.master @@ -0,0 +1,25 @@ +server { + listen 80; + listen [::]:80; + + server_name ; + + root /usr/local/ispconfig/interface/acme; + + autoindex off; + index index.html; + + ## Disable .htaccess and other hidden files + location ~ / { + deny all; + } + + ## Allow access for .well-known/acme-challenge + location ^~ /.well-known/acme-challenge/ { + access_log off; + log_not_found off; + auth_basic off; + root /usr/local/ispconfig/interface/acme/; + try_files $uri $uri/ =404; + } +} \ No newline at end of file diff --git a/install/tpl/nginx_apps.vhost.master b/install/tpl/nginx_apps.vhost.master index 871dff8c57dddff8f6a45193345928e90c1dcb4a..181f4c807e2ee0761e61ef26f3f0589153703ca2 100644 --- a/install/tpl/nginx_apps.vhost.master +++ b/install/tpl/nginx_apps.vhost.master @@ -1,13 +1,13 @@ server { - listen {apps_vhost_port} {ssl_on}; + listen {apps_vhost_ip}{apps_vhost_port} {ssl_on}; listen [::]:{apps_vhost_port} {ssl_on} ipv6only=on; - {ssl_comment}ssl_protocols TLSv1 TLSv1.1 TLSv1.2; + {ssl_comment}ssl_protocols TLSv1.2; {ssl_comment}ssl_certificate /usr/local/ispconfig/interface/ssl/ispserver.crt; {ssl_comment}ssl_certificate_key /usr/local/ispconfig/interface/ssl/ispserver.key; # redirect to https if accessed with http - {ssl_comment}error_page 497 https://$host:{vhost_port}$request_uri; + {ssl_comment}error_page 497 https://$host:{apps_vhost_port}$request_uri; server_name {apps_vhost_servername}; @@ -99,7 +99,7 @@ server { fastcgi_param REDIRECT_STATUS 200; # To access phpMyAdmin, the default user (like www-data on Debian/Ubuntu) must be used {use_tcp}fastcgi_pass 127.0.0.1:9000; - {use_socket}fastcgi_pass unix:/var/run/php5-fpm.sock; + {use_socket}fastcgi_pass unix:{fpm_socket}; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_buffer_size 128k; @@ -115,7 +115,7 @@ server { location /phpMyAdmin { rewrite ^/* /phpmyadmin last; } - + location /squirrelmail { root /usr/share/; index index.php index.html index.htm; @@ -149,7 +149,7 @@ server { fastcgi_param REDIRECT_STATUS 200; # To access SquirrelMail, the default user (like www-data on Debian/Ubuntu) must be used {use_tcp}fastcgi_pass 127.0.0.1:9000; - {use_socket}fastcgi_pass unix:/var/run/php5-fpm.sock; + {use_socket}fastcgi_pass unix:{fpm_socket}; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_buffer_size 128k; @@ -200,7 +200,7 @@ server { fastcgi_pass unix:{cgi_socket}; } - location /images/mailman { + location ^~ /images/mailman { alias /usr/share/images/mailman; } diff --git a/install/tpl/nginx_ispconfig.vhost.master b/install/tpl/nginx_ispconfig.vhost.master index aad670e97a8a74d022eb3c0c11927c559bd858d6..dbe44d7064861eae187731a39e5ced7d120affd3 100644 --- a/install/tpl/nginx_ispconfig.vhost.master +++ b/install/tpl/nginx_ispconfig.vhost.master @@ -1,13 +1,13 @@ server { listen {vhost_port} {ssl_on}; listen [::]:{vhost_port} {ssl_on} ipv6only=on; - - {ssl_comment}ssl_protocols TLSv1 TLSv1.1 TLSv1.2; + + {ssl_comment}ssl_protocols TLSv1.2; {ssl_comment}ssl_certificate /usr/local/ispconfig/interface/ssl/ispserver.crt; {ssl_comment}ssl_certificate_key /usr/local/ispconfig/interface/ssl/ispserver.key; {ssl_comment}ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS'; {ssl_comment}ssl_prefer_server_ciphers on; - + # redirect to https if accessed with http {ssl_comment}error_page 497 https://$host:{vhost_port}$request_uri; @@ -44,7 +44,7 @@ server { location ~ /\. { deny all; } - + # location /phpmyadmin { # root /usr/share/; # index index.php index.html index.htm; @@ -64,7 +64,7 @@ server { # location /phpMyAdmin { # rewrite ^/* /phpmyadmin last; # } -# +# # location /squirrelmail { # root /usr/share/; # index index.php index.html index.htm; 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_dovecot-sql.conf.master b/install/tpl/opensuse_dovecot-sql.conf.master index 5d06d51e5d541447326fd90cc63c45dcd25d5bfb..d0b5269e13fc8519b1a41d6608c2ae2495421fdb 100644 --- a/install/tpl/opensuse_dovecot-sql.conf.master +++ b/install/tpl/opensuse_dovecot-sql.conf.master @@ -1,142 +1,14 @@ -# This file is opened as root, so it should be owned by root and mode 0600. -# # http://wiki.dovecot.org/AuthDatabase/SQL -# -# For the sql passdb module, you'll need a database with a table that -# contains fields for at least the username and password. If you want to -# use the user@domain syntax, you might want to have a separate domain -# field as well. -# -# If your users all have the same uig/gid, and have predictable home -# directories, you can use the static userdb module to generate the home -# dir based on the username and domain. In this case, you won't need fields -# for home, uid, or gid in the database. -# -# If you prefer to use the sql userdb module, you'll want to add fields -# for home, uid, and gid. Here is an example table: -# -# CREATE TABLE users ( -# username VARCHAR(128) NOT NULL, -# domain VARCHAR(128) NOT NULL, -# password VARCHAR(64) NOT NULL, -# home VARCHAR(255) NOT NULL, -# uid INTEGER NOT NULL, -# gid INTEGER NOT NULL, -# active CHAR(1) DEFAULT 'Y' NOT NULL -# ); - -# Database driver: mysql, pgsql, sqlite -#driver = - -# Database connection string. This is driver-specific setting. -# -# pgsql: -# For available options, see the PostgreSQL documention for the -# PQconnectdb function of libpq. -# -# mysql: -# Basic options emulate PostgreSQL option names: -# host, port, user, password, dbname -# -# But also adds some new settings: -# client_flags - See MySQL manual -# ssl_ca, ssl_ca_path - Set either one or both to enable SSL -# ssl_cert, ssl_key - For sending client-side certificates to server -# ssl_cipher - Set minimum allowed cipher security (default: HIGH) -# option_file - Read options from the given file instead of -# the default my.cnf location -# option_group - Read options from the given group (default: client) -# -# You can connect to UNIX sockets by using host: host=/var/run/mysql.sock -# Note that currently you can't use spaces in parameters. -# -# MySQL supports multiple host parameters for load balancing / HA. -# -# sqlite: -# The path to the database file. -# -# Examples: -# connect = host=192.168.1.1 dbname=users -# connect = host=sql.example.com dbname=virtual user=virtual password=blarg -# connect = /etc/dovecot/authdb.sqlite -# -#connect = - -# Default password scheme. -# -# List of supported schemes is in -# http://wiki.dovecot.org/Authentication/PasswordSchemes -# -#default_pass_scheme = MD5 - -# passdb query to retrieve the password. It can return fields: -# password - The user's password. This field must be returned. -# user - user@domain from the database. Needed with case-insensitive lookups. -# username and domain - An alternative way to represent the "user" field. -# -# The "user" field is often necessary with case-insensitive lookups to avoid -# e.g. "name" and "nAme" logins creating two different mail directories. If -# your user and domain names are in separate fields, you can return "username" -# and "domain" fields instead of "user". -# -# The query can also return other fields which have a special meaning, see -# http://wiki.dovecot.org/PasswordDatabase/ExtraFields -# -# Commonly used available substitutions (see http://wiki.dovecot.org/Variables -# for full list): -# %u = entire user@domain -# %n = user part of user@domain -# %d = domain part of user@domain -# -# Note that these can be used only as input to SQL query. If the query outputs -# any of these substitutions, they're not touched. Otherwise it would be -# difficult to have eg. usernames containing '%' characters. -# -# Example: -# password_query = SELECT userid AS user, pw AS password \ -# FROM users WHERE userid = '%u' AND active = 'Y' -# -#password_query = \ -# SELECT username, domain, password \ -# FROM users WHERE username = '%n' AND domain = '%d' - -# userdb query to retrieve the user information. It can return fields: -# uid - System UID (overrides mail_uid setting) -# gid - System GID (overrides mail_gid setting) -# home - Home directory -# mail - Mail location (overrides mail_location setting) -# -# None of these are strictly required. If you use a single UID and GID, and -# home or mail directory fits to a template string, you could use userdb static -# instead. For a list of all fields that can be returned, see -# http://wiki.dovecot.org/UserDatabase/ExtraFields -# -# Examples: -# user_query = SELECT home, uid, gid FROM users WHERE userid = '%u' -# user_query = SELECT dir AS home, user AS uid, group AS gid FROM users where userid = '%u' -# user_query = SELECT home, 501 AS uid, 501 AS gid FROM users WHERE userid = '%u' -# -#user_query = \ -# SELECT home, uid, gid \ -# FROM users WHERE username = '%n' AND domain = '%d' - -# If you wish to avoid two SQL lookups (passdb + userdb), you can use -# userdb prefetch instead of userdb sql in dovecot.conf. In that case you'll -# also have to return userdb fields in password_query prefixed with "userdb_" -# string. For example: -#password_query = \ -# SELECT userid AS user, password, \ -# home AS userdb_home, uid AS userdb_uid, gid AS userdb_gid \ -# FROM users WHERE userid = '%u' driver = mysql connect = host={mysql_server_host} dbname={mysql_server_database} user={mysql_server_ispconfig_user} password={mysql_server_ispconfig_password} port={mysql_server_port} default_pass_scheme = CRYPT # password-query with prefetch -password_query = SELECT email as user, password, maildir as userdb_home, CONCAT( maildir_format, ':', maildir, '/', IF(maildir_format='maildir','Maildir',maildir_format)) as userdb_mail, uid as userdb_uid, gid as userdb_gid, CONCAT('*:storage=', quota, 'B') AS userdb_quota_rule, CONCAT(maildir, '/.sieve') as userdb_sieve FROM mail_user WHERE (login = '%u' OR email = '%u') AND `disable%Ls` = 'n' AND server_id = '{server_id}' +password_query = SELECT email as user, password, maildir as userdb_home, CONCAT( maildir_format, ':', maildir, '/', IF(maildir_format='maildir','Maildir',maildir_format)) as userdb_mail, uid as userdb_uid, gid as userdb_gid, CONCAT('*:storage=', quota, 'B') AS userdb_quota_rule, CONCAT(maildir, '/.sieve') as userdb_sieve FROM mail_user WHERE (login = '%u' OR email = '%u') AND `disable%Ls` = 'n' AND server_id = '{server_id}' AND NOT EXISTS (SELECT domain_id FROM mail_domain WHERE domain = '%d' AND active = 'n' AND server_id = {server_id}) + user_query = SELECT email as user, maildir as home, CONCAT( maildir_format, ':', maildir, '/', IF(maildir_format='maildir','Maildir',maildir_format)) as mail, uid, gid, CONCAT('*:storage=', quota, 'B') AS quota_rule, CONCAT(maildir, '/.sieve') as sieve FROM mail_user WHERE (login = '%u' OR email = '%u') AND `disable%Ls` = 'n' AND server_id = '{server_id}' # The iterate_query is required for the doveadm command only and works only on dovecot 2 servers. # Do not enable it on Dovecot 1.x servers -# iterate_query = SELECT email as user FROM mail_user WHERE server_id = '{server_id}' +# iterate_query = SELECT email as user FROM mail_user WHERE disabledoveadm='n' AND server_id = '{server_id}' diff --git a/install/tpl/opensuse_dovecot.conf.master b/install/tpl/opensuse_dovecot.conf.master index 9d345fa911af48198caf1d322b32ca460d99be59..4a4d5e319ca62e05a3286c250c76b0e7134ac481 100644 --- a/install/tpl/opensuse_dovecot.conf.master +++ b/install/tpl/opensuse_dovecot.conf.master @@ -1274,11 +1274,17 @@ plugin { # # Location of the active script. When ManageSieve is used this is actually # a symlink pointing to the active script in the sieve storage directory. - sieve=~/.dovecot.sieve - # + sieve=~/.sieve + # The path to the directory where the personal Sieve scripts are stored. For # ManageSieve this is where the uploaded scripts are stored. sieve_dir=~/sieve + + sieve_before=/var/vmail/%d/%n/.ispconfig-before.sieve + sieve_after=/var/vmail/%d/%n/.ispconfig.sieve + sieve_max_script_size = 2M + sieve_max_actions = 100 + sieve_max_redirects = 25 } # Config files can also be included. deliver doesn't support them currently. diff --git a/install/tpl/opensuse_dovecot2.conf.master b/install/tpl/opensuse_dovecot2.conf.master index f615cf335494ef1307706d9a3a1a55adf6228218..fbbb102e1abcc605a329765ffe64db12e9054ea6 100644 --- a/install/tpl/opensuse_dovecot2.conf.master +++ b/install/tpl/opensuse_dovecot2.conf.master @@ -6,7 +6,10 @@ log_timestamp = "%Y-%m-%d %H:%M:%S " mail_privileged_group = vmail ssl_cert = NOW()) +MYSQLGetPW SELECT password FROM ftp_user WHERE active = 'y' AND server_id = '{server_id}' AND username="\L" AND (expires IS NULL OR expires > NOW()) # Query to execute in order to fetch the system user name or uid -MYSQLGetUID SELECT uid FROM ftp_user WHERE active = 'y' AND server_id = '{server_id}' AND username="\L" AND (expires IS NULL OR expires="0000-00-00 00:00:00" OR expires > NOW()) +MYSQLGetUID SELECT uid FROM ftp_user WHERE active = 'y' AND server_id = '{server_id}' AND username="\L" AND (expires IS NULL OR expires > NOW()) # Optional : default UID - if set this overrides MYSQLGetUID @@ -74,7 +74,7 @@ MYSQLGetUID SELECT uid FROM ftp_user WHERE active = 'y' AND server_id = '{se # Query to execute in order to fetch the system user group or gid -MYSQLGetGID SELECT gid FROM ftp_user WHERE active = 'y' AND server_id = '{server_id}' AND username="\L" AND (expires IS NULL OR expires="0000-00-00 00:00:00" OR expires > NOW()) +MYSQLGetGID SELECT gid FROM ftp_user WHERE active = 'y' AND server_id = '{server_id}' AND username="\L" AND (expires IS NULL OR expires > NOW()) # Optional : default GID - if set this overrides MYSQLGetGID @@ -84,34 +84,34 @@ MYSQLGetGID SELECT gid FROM ftp_user WHERE active = 'y' AND server_id = '{se # Query to execute in order to fetch the home directory -MYSQLGetDir SELECT dir FROM ftp_user WHERE active = 'y' AND server_id = '{server_id}' AND username="\L" AND (expires IS NULL OR expires="0000-00-00 00:00:00" OR expires > NOW()) +MYSQLGetDir SELECT dir FROM ftp_user WHERE active = 'y' AND server_id = '{server_id}' AND username="\L" AND (expires IS NULL OR expires > NOW()) -# Optional : query to get the maximal number of files +# Optional : query to get the maximal number of files # Pure-FTPd must have been compiled with virtual quotas support. -MySQLGetQTAFS SELECT quota_files FROM ftp_user WHERE active = 'y' AND server_id = '{server_id}' AND quota_files != '-1' AND username="\L" AND (expires IS NULL OR expires="0000-00-00 00:00:00" OR expires > NOW()) +MySQLGetQTAFS SELECT quota_files FROM ftp_user WHERE active = 'y' AND server_id = '{server_id}' AND quota_files != '-1' AND username="\L" AND (expires IS NULL OR expires > NOW()) # Optional : query to get the maximal disk usage (virtual quotas) # The number should be in Megabytes. # Pure-FTPd must have been compiled with virtual quotas support. -MySQLGetQTASZ SELECT quota_size FROM ftp_user WHERE active = 'y' AND server_id = '{server_id}' AND quota_size != '-1' AND username="\L" AND (expires IS NULL OR expires="0000-00-00 00:00:00" OR expires > NOW()) +MySQLGetQTASZ SELECT quota_size FROM ftp_user WHERE active = 'y' AND server_id = '{server_id}' AND quota_size != '-1' AND username="\L" AND (expires IS NULL OR expires > NOW()) # Optional : ratios. The server has to be compiled with ratio support. -MySQLGetRatioUL SELECT ul_ratio FROM ftp_user WHERE active = 'y' AND server_id = '{server_id}' AND ul_ratio != '-1' AND username="\L" AND (expires IS NULL OR expires="0000-00-00 00:00:00" OR expires > NOW()) -MySQLGetRatioDL SELECT dl_ratio FROM ftp_user WHERE active = 'y' AND server_id = '{server_id}' AND dl_ratio != '-1' AND username="\L" AND (expires IS NULL OR expires="0000-00-00 00:00:00" OR expires > NOW()) +MySQLGetRatioUL SELECT ul_ratio FROM ftp_user WHERE active = 'y' AND server_id = '{server_id}' AND ul_ratio != '-1' AND username="\L" AND (expires IS NULL OR expires > NOW()) +MySQLGetRatioDL SELECT dl_ratio FROM ftp_user WHERE active = 'y' AND server_id = '{server_id}' AND dl_ratio != '-1' AND username="\L" AND (expires IS NULL OR expires > NOW()) # Optional : bandwidth throttling. # The server has to be compiled with throttling support. # Values are in KB/s . -MySQLGetBandwidthUL SELECT ul_bandwidth FROM ftp_user WHERE active = 'y' AND server_id = '{server_id}' AND ul_bandwidth != '-1' AND username="\L" AND (expires IS NULL OR expires="0000-00-00 00:00:00" OR expires > NOW()) -MySQLGetBandwidthDL SELECT dl_bandwidth FROM ftp_user WHERE active = 'y' AND server_id = '{server_id}' AND dl_bandwidth != '-1' AND username="\L" AND (expires IS NULL OR expires="0000-00-00 00:00:00" OR expires > NOW()) +MySQLGetBandwidthUL SELECT ul_bandwidth FROM ftp_user WHERE active = 'y' AND server_id = '{server_id}' AND ul_bandwidth != '-1' AND username="\L" AND (expires IS NULL OR expires > NOW()) +MySQLGetBandwidthDL SELECT dl_bandwidth FROM ftp_user WHERE active = 'y' AND server_id = '{server_id}' AND dl_bandwidth != '-1' AND username="\L" AND (expires IS NULL OR expires > NOW()) # Enable ~ expansion. NEVER ENABLE THIS BLINDLY UNLESS : # 1) You know what you are doing. 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_symbols_antivirus.conf.master b/install/tpl/rspamd_antivirus_group.conf.master similarity index 100% rename from install/tpl/rspamd_symbols_antivirus.conf.master rename to install/tpl/rspamd_antivirus_group.conf.master 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 1688d57e217673cdfa50ff36c31f4beb782aae70..0000000000000000000000000000000000000000 --- a/install/tpl/rspamd_classifier-bayes.conf.master +++ /dev/null @@ -1,3 +0,0 @@ -autolearn = [-0.01, 5.00]; -per_user = true; -per_language = true; \ No newline at end of file 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 ed9abe40eebb060bc0a2eeec1da55074dc4eeaf7..0000000000000000000000000000000000000000 --- a/install/tpl/rspamd_dkim_signing.conf.master +++ /dev/null @@ -1,3 +0,0 @@ -try_fallback = false; -path_map = "/etc/rspamd/local.d/dkim_domains.map"; -selector_map = "/etc/rspamd/local.d/dkim_selectors.map"; \ No newline at end of file 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.ispc.master b/install/tpl/rspamd_dkim_whitelist.inc.ispc.master new file mode 100644 index 0000000000000000000000000000000000000000..e9049c3ea89d44a222bf85dac37b32708cbb0295 --- /dev/null +++ b/install/tpl/rspamd_dkim_whitelist.inc.ispc.master @@ -0,0 +1,5 @@ +# Domain whitelist via valid DKIM policy +# (Prefer to spf_dkim_whitelist for domains that use both SPF and DKIM.) + +ispconfig.org + diff --git a/install/tpl/rspamd_dmarc_whitelist.inc.ispc.master b/install/tpl/rspamd_dmarc_whitelist.inc.ispc.master new file mode 100644 index 0000000000000000000000000000000000000000..498fbc971f4e240f786b019da22a512c8a0d8336 --- /dev/null +++ b/install/tpl/rspamd_dmarc_whitelist.inc.ispc.master @@ -0,0 +1,8 @@ +# Domain whitelist via valid DMARC policy (aligned SPF and/or aligned DKIM) + +comodo.com +geotrust.com +geotrusteurope.com +howtoforge.com +ispconfig.org + 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 d399bbf4ecc37e39ff900260a4884335767e9957..c9ef9fa2d0a517602706b54d37626517e23df285 100644 --- a/install/tpl/rspamd_milter_headers.conf.master +++ b/install/tpl/rspamd_milter_headers.conf.master @@ -1,2 +1,13 @@ -use = ["x-spamd-bar", "x-spam-level", "authentication-results"]; -authenticated_headers = ["authentication-results"]; \ No newline at end of file +use = ["x-spamd-bar", "x-spam-level", "x-spam-status", "authentication-results", "remove-headers"]; +authenticated_headers = ["authentication-results"]; +routines { + remove-headers { + 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_options.inc.master b/install/tpl/rspamd_options.inc.master deleted file mode 100644 index 69e40365b7dc653b046b6e3cb3ff0539936a816e..0000000000000000000000000000000000000000 --- a/install/tpl/rspamd_options.inc.master +++ /dev/null @@ -1,5 +0,0 @@ -local_addrs = "127.0.0.0/8, ::1"; - -dns { - nameserver = ["127.0.0.1:53:10"]; -} diff --git a/install/tpl/rspamd_options.inc.master b/install/tpl/rspamd_options.inc.master new file mode 120000 index 0000000000000000000000000000000000000000..7cc72e81b24bd21306280236067c3400c6b61b1a --- /dev/null +++ b/install/tpl/rspamd_options.inc.master @@ -0,0 +1 @@ +../../server/conf/rspamd_options.inc.master \ No newline at end of file diff --git a/install/tpl/rspamd_override_rbl.conf.master b/install/tpl/rspamd_rbl_group.conf.master similarity index 100% rename from install/tpl/rspamd_override_rbl.conf.master rename to install/tpl/rspamd_rbl_group.conf.master 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.ispc.master b/install/tpl/rspamd_spf_dkim_whitelist.inc.ispc.master new file mode 100644 index 0000000000000000000000000000000000000000..42d5c8fd85577fb807ea52816c57c02517817a57 --- /dev/null +++ b/install/tpl/rspamd_spf_dkim_whitelist.inc.ispc.master @@ -0,0 +1,9 @@ +# Domain whitelist via valid SPF policy AND valid DKIM policy +# (Prefer to spf_whitelist or dkim_whitelist for domains that use both SPF and DKIM.) + +comodo.com +geotrust.com +geotrusteurope.com +# letsencrypt is in rspamd's default spf_dkim_whitelist, only needed if strict: +#letsencrypt.org both:1.0 + diff --git a/install/tpl/rspamd_spf_whitelist.inc.ispc.master b/install/tpl/rspamd_spf_whitelist.inc.ispc.master new file mode 100644 index 0000000000000000000000000000000000000000..8eda01c8d6de5db16f42f62be3246e956776bff4 --- /dev/null +++ b/install/tpl/rspamd_spf_whitelist.inc.ispc.master @@ -0,0 +1,6 @@ +# Domain whitelist via valid SPF policy +# (Prefer to spf_dkim_whitelist for domains that use both SPF and DKIM.) + +howtoforge.com +ispconfig.org + diff --git a/install/tpl/rspamd_override_surbl.conf.master b/install/tpl/rspamd_surbl_group.conf.master similarity index 100% rename from install/tpl/rspamd_override_surbl.conf.master rename to install/tpl/rspamd_surbl_group.conf.master diff --git a/install/tpl/rspamd_users.conf.master b/install/tpl/rspamd_users.conf.master deleted file mode 120000 index 3aa7af31851003f5b742ab52de226af706cf7466..0000000000000000000000000000000000000000 --- a/install/tpl/rspamd_users.conf.master +++ /dev/null @@ -1 +0,0 @@ -../../server/conf/rspamd_users.conf.master \ No newline at end of file diff --git a/install/tpl/rspamd_users.conf.master b/install/tpl/rspamd_users.conf.master new file mode 100644 index 0000000000000000000000000000000000000000..ba16bc8b12978d101134ab7058630b7f98f5e2d6 --- /dev/null +++ b/install/tpl/rspamd_users.conf.master @@ -0,0 +1,19 @@ +settings { + authenticated { + priority = 10; + authenticated = yes; + apply "default" { + symbols_disabled = []; + groups_disabled = ["rbl", "spf"]; + } + } + whitelist { + priority = 5; + rcpt = "postmaster"; + rcpt = "hostmaster"; + rcpt = "abuse"; + want_spam = yes; + } + .include(try=true; glob=true) "$LOCAL_CONFDIR/local.d/users/*.conf" + .include(try=true; priority=1,duplicate=merge) "$LOCAL_CONFDIR/local.d/users.local.conf" +} diff --git a/install/tpl/rspamd_users.inc.conf.master b/install/tpl/rspamd_users.inc.conf.master deleted file mode 120000 index 30bb52fd8e22d629bca9e28459d4d04e44e08ea0..0000000000000000000000000000000000000000 --- a/install/tpl/rspamd_users.inc.conf.master +++ /dev/null @@ -1 +0,0 @@ -../../server/conf/rspamd_users.inc.conf.master \ No newline at end of file diff --git a/install/tpl/rspamd_whitelist.conf.master b/install/tpl/rspamd_whitelist.conf.master new file mode 100644 index 0000000000000000000000000000000000000000..6b4647a94831a5ba7a9828345504d8353bba7906 --- /dev/null +++ b/install/tpl/rspamd_whitelist.conf.master @@ -0,0 +1,38 @@ +rules { + "ISPC_WHITELIST_SPF" = { + valid_spf = true; + domains = [ + "$LOCAL_CONFDIR/local.d/maps.d/spf_whitelist.inc.ispc" + ]; + score = -2.0 + inverse_symbol = "ISPC_BLACKLIST_SPF"; + } + + "ISPC_WHITELIST_DKIM" = { + valid_dkim = true; + domains = [ + "$LOCAL_CONFDIR/local.d/maps.d/dkim_whitelist.inc.ispc" + ]; + score = -2.0; + inverse_symbol = "ISPC_BLACKLIST_DKIM"; + } + + "ISPC_WHITELIST_SPF_DKIM" = { + valid_spf = true; + valid_dkim = true; + domains = [ + "$LOCAL_CONFDIR/local.d/maps.d/spf_dkim_whitelist.inc.ispc" + ]; + score = -4.0; + inverse_symbol = "ISPC_BLACKLIST_SPF_DKIM"; + } + + "ISPC_WHITELIST_DMARC" = { + valid_dmarc = true; + domains = [ + "$LOCAL_CONFDIR/local.d/maps.d/dmarc_whitelist.inc.ispc" + ]; + score = -7.0; + inverse_symbol = "ISPC_BLACKLIST_DMARC"; + } +} diff --git a/security/security_settings.ini b/install/tpl/security_settings.ini.master similarity index 93% rename from security/security_settings.ini rename to install/tpl/security_settings.ini.master index c135652e17cf15aa650168c206b44ff3725b3345..02b1058074810b1b9bfde9a173f9fb864093c92c 100644 --- a/security/security_settings.ini +++ b/install/tpl/security_settings.ini.master @@ -12,8 +12,6 @@ admin_allow_del_cpuser=superadmin admin_allow_cpuser_group=superadmin admin_allow_firewall_config=superadmin admin_allow_osupdate=superadmin -admin_allow_software_packages=superadmin -admin_allow_software_repo=superadmin remote_api_allowed=yes password_reset_allowed=yes session_regenerate_id=yes @@ -44,4 +42,3 @@ warn_new_admin=yes warn_passwd_change=no warn_shadow_change=no warn_group_change=no - diff --git a/install/tpl/server.ini.master b/install/tpl/server.ini.master index 3786fc2ca35544961c3cdafd25653972e9bbfc1f..521e418f6c6be9f635b5954f291ae79cf97e9699 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 @@ -52,13 +56,17 @@ relayhost_user= relayhost_password= mailbox_size_limit=0 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_reseller=y overquota_notify_client=y overquota_notify_freq=7 overquota_notify_onok=n sendmail_path=/usr/sbin/sendmail +rspamd_url= [getmail] getmail_config_dir=/etc/getmail @@ -94,10 +102,10 @@ php_ini_path_apache=/etc/php5/apache2/php.ini php_ini_path_cgi=/etc/php5/cgi/php.ini check_apache_config=y enable_sni=y -enable_spdy=n skip_le_check=n enable_ip_wildcard=y overtraffic_notify_admin=y +overtraffic_notify_reseller=y overtraffic_notify_client=y nginx_cgi_socket=/var/run/fcgiwrap.socket php_fpm_init_script=php5-fpm @@ -105,6 +113,7 @@ php_fpm_ini_path=/etc/php5/fpm/php.ini php_fpm_pool_dir=/etc/php5/fpm/pool.d php_fpm_start_port=9010 php_fpm_socket_dir=/var/lib/php5-fpm +php_default_hide=n php_default_name=Default set_folder_permissions_on_update=n add_web_users_to_sshusers_group=y @@ -112,19 +121,26 @@ connect_userid_to_webid=n 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_reseller=y overquota_notify_client=y overquota_notify_freq=7 +overquota_db_notify_threshold=90 overquota_db_notify_admin=y +overquota_db_notify_reseller=y overquota_db_notify_client=y overquota_notify_onok=n logging=yes php_fpm_reload_mode=reload +php_fpm_default_chroot=n [dns] bind_user=root bind_group=bind bind_zonefiles_dir=/etc/bind +bind_keyfiles_dir=/etc/bind named_conf_path=/etc/bind/named.conf named_conf_local_path=/etc/bind/named.conf.local disable_bind_log=n @@ -141,10 +157,11 @@ 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 [vlogger] config_dir=/etc diff --git a/install/tpl/system.ini.master b/install/tpl/system.ini.master index c916a6254792bb55369f825a462ad9e40b22f997..6ea6f4f9705818712067a9a6d5ac49b419d284f2 100644 --- a/install/tpl/system.ini.master +++ b/install/tpl/system.ini.master @@ -8,6 +8,7 @@ [mail] enable_custom_login=n +show_per_domain_relay_options=n mailbox_show_autoresponder_tab=y mailbox_show_mail_filter_tab=y mailbox_show_custom_rules_tab=y @@ -16,6 +17,7 @@ webmail_url=/webmail dkim_path=/var/lib/amavis/dkim smtp_enabled=y smtp_host=localhost +enable_welcome_mail=y [monitor] @@ -34,6 +36,10 @@ client_username_web_check_disabled=n backups_include_into_web_quota=n reseller_can_use_options=n web_php_options=no,fast-cgi,mod,php-fpm +show_aps_menu=n +client_protection=y +ssh_authentication= +le_caa_autocreate_options=y [tools] @@ -49,12 +55,13 @@ custom_login_link= dashboard_atom_url_admin=https://www.ispconfig.org/atom dashboard_atom_url_reseller=https://www.ispconfig.org/atom dashboard_atom_url_client=https://www.ispconfig.org/atom -monitor_key= tab_change_discard=n tab_change_warning=n use_loadindicator=y use_combobox=y +show_support_messages=y maintenance_mode=n +maintenance_mode_exclude_ips= admin_dashlets_left= admin_dashlets_right= reseller_dashlets_left= diff --git a/install/uninstall.php b/install/uninstall.php index c565d4653d71c2667dfc6c8e6cef70fcfb502450..01543a64ffb222dbf8e4904d1dbcacb359719d2d 100644 --- a/install/uninstall.php +++ b/install/uninstall.php @@ -70,31 +70,36 @@ if($do_uninstall == 'yes') { if (!$result) echo "Unable to remove the ispconfig-database-user ".$conf['db_user']." ".mysqli_error($link)."\n"; } mysqli_close($link); - + // Deleting the symlink in /var/www // Apache @unlink("/etc/apache2/sites-enabled/000-ispconfig.vhost"); @unlink("/etc/apache2/sites-available/ispconfig.vhost"); @unlink("/etc/apache2/sites-enabled/000-apps.vhost"); @unlink("/etc/apache2/sites-available/apps.vhost"); - + // nginx @unlink("/etc/nginx/sites-enabled/000-ispconfig.vhost"); @unlink("/etc/nginx/sites-available/ispconfig.vhost"); @unlink("/etc/nginx/sites-enabled/000-apps.vhost"); @unlink("/etc/nginx/sites-available/apps.vhost"); - + // Delete the ispconfig files exec('rm -rf /usr/local/ispconfig'); - + // Delete various other files + @unlink("/usr/local/bin/letsencrypt_post_hook.sh"); + @unlink("/usr/local/bin/letsencrypt_pre_hook.sh"); + @unlink("/usr/local/bin/letsencrypt_renew_hook.sh"); @unlink("/usr/local/bin/ispconfig_update.sh"); @unlink("/usr/local/bin/ispconfig_update_from_svn.sh"); @unlink("/var/spool/mail/ispconfig"); @unlink("/var/www/ispconfig"); - @unlink("/var/www/php-fcgi-scripts/ispconfig"); + @exec('chattr -i /var/www/php-fcgi-scripts/ispconfig/.php-fcgi-starter'); @unlink("/var/www/php-fcgi-scripts/ispconfig/.php-fcgi-starter"); - + @unlink("/var/www/php-fcgi-scripts/ispconfig"); + @unlink("/etc/ssl/private/pure-ftpd.pem"); + echo "Backups in /var/backup/ and log files in /var/log/ispconfig are not deleted."; echo "Finished uninstalling.\n"; diff --git a/install/update.php b/install/update.php index 3b3cf969ef3cefa8e8ad76c6eed31a0da75969e0..35a68cccb6b70a4fc9d977431ca5d52f67fee3b1 100644 --- a/install/update.php +++ b/install/update.php @@ -30,30 +30,30 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* ISPConfig 3 updater. - + ------------------------------------------------------------------------------------- - Interactive update ------------------------------------------------------------------------------------- run: - + php update.php - + ------------------------------------------------------------------------------------- - Noninteractive (autoupdate) mode ------------------------------------------------------------------------------------- - + The autoupdate mode can read the updater questions from a .ini style file or from - a php config file. Examples for both file types are in the docs folder. + a php config file. Examples for both file types are in the docs folder. See autoinstall.ini.sample and autoinstall.conf_sample.php. - + run: - + php update.php --autoinstall=autoinstall.ini - + or - + php update.php --autoinstall=autoinstall.conf.php - + */ error_reporting(E_ALL|E_STRICT); @@ -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 @@ -185,9 +189,10 @@ $conf['server_id'] = intval($conf_old["server_id"]); $conf['ispconfig_log_priority'] = $conf_old["log_priority"]; $inst = new installer(); -if (!$inst->get_php_version()) die('ISPConfig requieres PHP '.$inst->min_php."\n"); $inst->is_update = true; +$inst->check_prerequisites(); + echo "This application will update ISPConfig 3 on your server.\n\n"; //* Make a backup before we start the update @@ -211,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"); } @@ -253,6 +271,8 @@ prepareDBDump(); //* initialize the database $inst->db = new db(); +$inst->db->setDBData($conf['mysql']["host"], $conf['mysql']["ispconfig_user"], $conf['mysql']["ispconfig_password"], $conf['mysql']["port"]); +$inst->db->setDBName($conf['mysql']['database']); //* initialize the master DB, if we have a multiserver setup if($conf['mysql']['master_slave_setup'] == 'y') { @@ -261,7 +281,7 @@ if($conf['mysql']['master_slave_setup'] == 'y') { do { $tmp_mysql_server_host = $inst->free_query('MySQL master server hostname', $conf['mysql']['master_host'],'mysql_master_hostname'); $tmp_mysql_server_port = $inst->free_query('MySQL master server port', $conf['mysql']['master_port'],'mysql_master_port'); - $tmp_mysql_server_admin_user = $inst->free_query('MySQL master server root username', $conf['mysql']['master_admin_user'],'mysql_master_root_user'); + $tmp_mysql_server_admin_user = $inst->free_query('MySQL master server root username', $conf['mysql']['master_admin_user'],'mysql_master_root_user'); $tmp_mysql_server_admin_password = $inst->free_query('MySQL master server root password', $conf['mysql']['master_admin_password'],'mysql_master_root_password'); $tmp_mysql_server_database = $inst->free_query('MySQL master server database name', $conf['mysql']['master_database'],'mysql_master_database'); @@ -359,15 +379,21 @@ if($conf['mysql']['master_slave_setup'] == 'y') { if($conf['apache']['installed'] == true){ if(!is_file($conf['apache']['vhost_conf_dir'].'/ispconfig.vhost')) $inst->install_ispconfig_interface = false; } -if($conf['nginx']['installed'] == true){ +elseif($conf['nginx']['installed'] == true){ if(!is_file($conf['nginx']['vhost_conf_dir'].'/ispconfig.vhost')) $inst->install_ispconfig_interface = false; } +else { + // If neither webserver is installed then this can't be the server that hosts the ispconfig interface. + $inst->install_ispconfig_interface = false; +} //** Shall the services be reconfigured during update $reconfigure_services_answer = $inst->simple_query('Reconfigure Services?', array('yes', 'no', 'selected'), 'yes','reconfigure_services'); if($reconfigure_services_answer == 'yes' || $reconfigure_services_answer == 'selected') { + checkAndRenameCustomTemplates(); + if($conf['services']['mail']) { //** Configure postfix @@ -472,7 +498,7 @@ if($reconfigure_services_answer == 'yes' || $reconfigure_services_answer == 'sel $inst->configure_apps_vhost(); } else swriteln('Skipping config of Apps vhost'); } - + //* Configure Jailkit if($inst->reconfigure_app('Jailkit', $reconfigure_services_answer)) { swriteln('Configuring Jailkit'); @@ -481,10 +507,16 @@ if($reconfigure_services_answer == 'yes' || $reconfigure_services_answer == 'sel } - if($conf['services']['xmpp'] && $inst->reconfigure_app('XMPP', $reconfigure_services_answer)) { - //** Configure Metronome XMPP - $inst->configure_xmpp('dont-create-certs'); - } + if($conf['services']['xmpp'] && $inst->reconfigure_app('XMPP', $reconfigure_services_answer)) { + //** Configure Metronome XMPP + $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) { @@ -517,10 +549,20 @@ if($reconfigure_services_answer == 'yes' || $reconfigure_services_answer == 'sel //** Configure ISPConfig swriteln('Updating ISPConfig'); +$issue_asked = false; +$issue_tried = false; +// create acme vhost +if($conf['nginx']['installed'] == true) { + $inst->make_acme_vhost('nginx'); // we need this config file but we don't want nginx to be restarted at this point +} +if($conf['apache']['installed'] == true) { + $inst->make_acme_vhost('apache'); // we need this config file but we don't want apache to be restarted at this point +} + if ($inst->install_ispconfig_interface) { //** Customise the port ISPConfig runs on $ispconfig_port_number = get_ispconfig_port_number(); - if($autoupdate['ispconfig_port'] == 'default') $autoupdate['ispconfig_port'] = $ispconfig_port_number; + if(isset($autoupdate['ispconfig_port']) && $autoupdate['ispconfig_port'] == 'default') $autoupdate['ispconfig_port'] = $ispconfig_port_number; if($conf['webserver']['server_type'] == 'nginx'){ $conf['nginx']['vhost_port'] = $inst->free_query('ISPConfig Port', $ispconfig_port_number,'ispconfig_port'); } else { @@ -531,9 +573,25 @@ if ($inst->install_ispconfig_interface) { // $ispconfig_ssl_default = (is_ispconfig_ssl_enabled() == true)?'y':'n'; if(strtolower($inst->simple_query('Create new ISPConfig SSL certificate', array('yes', 'no'), 'no','create_new_ispconfig_ssl_cert')) == 'yes') { $inst->make_ispconfig_ssl_cert(); + $issue_tried = true; } + $issue_asked = true; +} + +// Create SSL certs for non-webserver(s)? +if(!$issue_asked) { + if(!file_exists('/usr/local/ispconfig/interface/ssl/ispserver.crt')) { + if(!$issue_tried && strtolower($inst->simple_query('Do you want to create SSL certs for your server?', array('y', 'n'), 'y','create_ssl_server_certs')) == 'y') { + $inst->make_ispconfig_ssl_cert(); + } + } else { + swriteln('Certificate exists. Not creating a new one.'); + } } +// update acme.sh if installed +$inst->update_acme(); + $inst->install_ispconfig(); // Cleanup @@ -549,13 +607,13 @@ if($update_crontab_answer == 'yes') { //** Restart services: if($reconfigure_services_answer == 'yes') { swriteln('Restarting services ...'); - if($conf['mysql']['installed'] == true && $conf['mysql']['init_script'] != '') system($inst->getinitcommand($conf['mysql']['init_script'], 'restart').' >/dev/null 2>&1'); + if($conf['mysql']['installed'] == true && isset($conf['mysql']['init_script']) && $conf['mysql']['init_script'] != '') system($inst->getinitcommand($conf['mysql']['init_script'], 'restart').' >/dev/null 2>&1'); if($conf['services']['mail']) { - if($conf['postfix']['installed'] == true && $conf['postfix']['init_script'] != '') system($inst->getinitcommand($conf['postfix']['init_script'], 'restart')); - if($conf['saslauthd']['installed'] == true && $conf['saslauthd']['init_script'] != '') system($inst->getinitcommand($conf['saslauthd']['init_script'], 'restart')); - if($conf['amavis']['installed'] == true && $conf['amavis']['init_script'] != '') system($inst->getinitcommand($conf['amavis']['init_script'], 'restart')); - if($conf['rspamd']['installed'] == true && $conf['rspamd']['init_script'] != '') system($inst->getinitcommand($conf['rspamd']['init_script'], 'restart')); - if($conf['clamav']['installed'] == true && $conf['clamav']['init_script'] != '') system($inst->getinitcommand($conf['clamav']['init_script'], 'restart')); + if($conf['postfix']['installed'] == true && isset($conf['postfix']['init_script']) && $conf['postfix']['init_script'] != '') system($inst->getinitcommand($conf['postfix']['init_script'], 'restart')); + if($conf['saslauthd']['installed'] == true && isset($conf['saslauthd']['init_script']) && $conf['saslauthd']['init_script'] != '') system($inst->getinitcommand($conf['saslauthd']['init_script'], 'restart')); + if($conf['amavis']['installed'] == true && isset($conf['amavis']['init_script']) && $conf['amavis']['init_script'] != '') system($inst->getinitcommand($conf['amavis']['init_script'], 'restart')); + if($conf['rspamd']['installed'] == true && isset($conf['rspamd']['init_script']) && $conf['rspamd']['init_script'] != '') system($inst->getinitcommand($conf['rspamd']['init_script'], 'restart')); + if($conf['clamav']['installed'] == true && isset($conf['clamav']['init_script']) && $conf['clamav']['init_script'] != '' && $conf['amavis']['installed'] == true) system($inst->getinitcommand($conf['clamav']['init_script'], 'restart')); if($conf['courier']['installed'] == true){ if($conf['courier']['courier-authdaemon'] != '') system($inst->getinitcommand($conf['courier']['courier-authdaemon'], 'restart')); if($conf['courier']['courier-imap'] != '') system($inst->getinitcommand($conf['courier']['courier-imap'], 'restart')); @@ -563,8 +621,8 @@ if($reconfigure_services_answer == 'yes') { if($conf['courier']['courier-pop'] != '') system($inst->getinitcommand($conf['courier']['courier-pop'], 'restart')); if($conf['courier']['courier-pop-ssl'] != '') system($inst->getinitcommand($conf['courier']['courier-pop-ssl'], 'restart')); } - if($conf['dovecot']['installed'] == true && $conf['dovecot']['init_script'] != '') system($inst->getinitcommand($conf['dovecot']['init_script'], 'restart')); - if($conf['mailman']['installed'] == true && $conf['mailman']['init_script'] != '') system('nohup '.$inst->getinitcommand($conf['mailman']['init_script'], 'restart').' >/dev/null 2>&1 &'); + if($conf['dovecot']['installed'] == true && isset($conf['dovecot']['init_script']) && $conf['dovecot']['init_script'] != '') system($inst->getinitcommand($conf['dovecot']['init_script'], 'restart')); + if($conf['mailman']['installed'] == true && isset($conf['mailman']['init_script']) && $conf['mailman']['init_script'] != '') system('nohup '.$inst->getinitcommand($conf['mailman']['init_script'], 'restart').' >/dev/null 2>&1 &'); } if($conf['services']['web'] || $inst->install_ispconfig_interface) { if($conf['webserver']['server_type'] == 'apache') { @@ -578,27 +636,27 @@ if($reconfigure_services_answer == 'yes') { //* Reload is enough for nginx if($conf['webserver']['server_type'] == 'nginx'){ if($conf['nginx']['php_fpm_init_script'] != '') system($inst->getinitcommand($conf['nginx']['php_fpm_init_script'], 'reload')); - if($conf['nginx']['init_script'] != '') system($inst->getinitcommand($conf['nginx']['init_script'], 'reload')); + if(isset($conf['nginx']['init_script']) && $conf['nginx']['init_script'] != '') system($inst->getinitcommand($conf['nginx']['init_script'], 'reload')); } - if($conf['pureftpd']['installed'] == true && $conf['pureftpd']['init_script'] != '') system($inst->getinitcommand($conf['pureftpd']['init_script'], 'restart')); + if($conf['pureftpd']['installed'] == true && isset($conf['pureftpd']['init_script']) && $conf['pureftpd']['init_script'] != '') system($inst->getinitcommand($conf['pureftpd']['init_script'], 'restart')); } if($conf['services']['dns']) { - if($conf['mydns']['installed'] == true && $conf['mydns']['init_script'] != '') system($inst->getinitcommand($conf['mydns']['init_script'], 'restart').' &> /dev/null'); - if($conf['powerdns']['installed'] == true && $conf['powerdns']['init_script'] != '') system($inst->getinitcommand($conf['powerdns']['init_script'], 'restart').' &> /dev/null'); - if($conf['bind']['installed'] == true && $conf['bind']['init_script'] != '') system($inst->getinitcommand($conf['bind']['init_script'], 'restart').' &> /dev/null'); + if($conf['mydns']['installed'] == true && isset($conf['mydns']['init_script']) && $conf['mydns']['init_script'] != '') system($inst->getinitcommand($conf['mydns']['init_script'], 'restart').' &> /dev/null'); + if($conf['powerdns']['installed'] == true && isset($conf['powerdns']['init_script']) && $conf['powerdns']['init_script'] != '') system($inst->getinitcommand($conf['powerdns']['init_script'], 'restart').' &> /dev/null'); + if($conf['bind']['installed'] == true && isset($conf['bind']['init_script']) && $conf['bind']['init_script'] != '') system($inst->getinitcommand($conf['bind']['init_script'], 'restart').' &> /dev/null'); } if($conf['services']['xmpp']) { - if($conf['xmpp']['installed'] == true && $conf['xmpp']['init_script'] != '') system($inst->getinitcommand($conf['xmpp']['init_script'], 'restart').' &> /dev/null'); + if($conf['xmpp']['installed'] == true && isset($conf['xmpp']['init_script']) && $conf['xmpp']['init_script'] != '') system($inst->getinitcommand($conf['xmpp']['init_script'], 'restart').' &> /dev/null'); } if($conf['services']['proxy']) { - // if($conf['squid']['installed'] == true && $conf['squid']['init_script'] != '' && is_executable($conf['init_scripts'].'/'.$conf['squid']['init_script'])) system($conf['init_scripts'].'/'.$conf['squid']['init_script'].' restart &> /dev/null'); - if($conf['nginx']['installed'] == true && $conf['nginx']['init_script'] != '') system($inst->getinitcommand($conf['nginx']['init_script'], 'restart').' &> /dev/null'); + // if($conf['squid']['installed'] == true && isset($conf['squid']['init_script']) && $conf['squid']['init_script'] != '' && is_executable($conf['init_scripts'].'/'.$conf['squid']['init_script'])) system($conf['init_scripts'].'/'.$conf['squid']['init_script'].' restart &> /dev/null'); + if($conf['nginx']['installed'] == true && isset($conf['nginx']['init_script']) && $conf['nginx']['init_script'] != '') system($inst->getinitcommand($conf['nginx']['init_script'], 'restart').' &> /dev/null'); } if($conf['services']['firewall']) { - if($conf['ufw']['installed'] == true && $conf['ufw']['init_script'] != '' && is_executable($conf['init_scripts'].'/'.$conf['ufw']['init_script'])) system($conf['init_scripts'].'/'.$conf['ufw']['init_script'].' restart &> /dev/null'); + if($conf['ufw']['installed'] == true && isset($conf['ufw']['init_script']) && $conf['ufw']['init_script'] != '' && is_executable($conf['init_scripts'].'/'.$conf['ufw']['init_script'])) system($conf['init_scripts'].'/'.$conf['ufw']['init_script'].' restart &> /dev/null'); } } @@ -612,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/index.htm b/interface/index.htm deleted file mode 100644 index 9e38208a2d2e5bf54750ea3ed68dea120ad39b0a..0000000000000000000000000000000000000000 --- a/interface/index.htm +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/interface/lib/app.inc.php b/interface/lib/app.inc.php old mode 100755 new mode 100644 index e341a57943cc65d364cdd7296030fab76dd2c8da..0350e28051af0ed1f70a057fad759d7c0806632f --- 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'); @@ -35,8 +39,8 @@ ob_start('ob_gzhandler'); if(isset($conf['timezone']) && $conf['timezone'] != '') date_default_timezone_set($conf['timezone']); //* Set error reporting level when we are not on a developer system -if(DEVSYSTEM == 0) { - @ini_set('error_reporting', E_ALL & ~E_NOTICE & ~E_DEPRECATED); +if(DEVSYSTEM !== true) { + @ini_set('error_reporting', E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_WARNING); } /* @@ -49,7 +53,7 @@ class app { private $_loaded_classes = array(); private $_conf; private $_security_config; - + public $loaded_plugins = array(); public function __construct() { @@ -58,7 +62,7 @@ class app { if (isset($_REQUEST['GLOBALS']) || isset($_FILES['GLOBALS']) || isset($_REQUEST['s']) || isset($_REQUEST['s_old']) || isset($_REQUEST['conf'])) { die('Internal Error: var override attempt detected'); } - + $this->_conf = $conf; if($this->_conf['start_db'] == true) { $this->load('db_'.$this->_conf['db_type']); @@ -70,21 +74,21 @@ class app { } $this->uses('functions'); // we need this before all others! $this->uses('auth,plugin,ini_parser,getconf'); - + } public function __get($prop) { if(property_exists($this, $prop)) return $this->{$prop}; - + $this->uses($prop); if(property_exists($this, $prop)) return $this->{$prop}; else trigger_error('Undefined property ' . $prop . ' of class app', E_USER_WARNING); } - + public function __destruct() { session_write_close(); } - + public function initialize_session() { //* Start the session if($this->_conf['start_session'] == true) { @@ -118,7 +122,7 @@ class app { } else { session_set_cookie_params(0,'/',$cookie_domain,$cookie_secure,true); // until browser is closed } - + session_set_save_handler( array($this->session, 'open'), array($this->session, 'close'), array($this->session, 'read'), @@ -126,16 +130,19 @@ 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']; } } - + public function uses($classes) { $cl = explode(',', $classes); if(is_array($cl)) { @@ -160,7 +167,7 @@ class app { } } } - + public function conf($plugin, $key, $value = null) { if(is_null($value)) { $tmpconf = $this->db->queryOneRecord("SELECT `value` FROM `sys_config` WHERE `group` = ? AND `name` = ?", $plugin, $key); @@ -205,6 +212,12 @@ class app { } } + public function auth_log($msg) { + $authlog_handle = fopen($this->_conf['ispconfig_log_dir'].'/auth.log', 'a'); + fwrite($authlog_handle, $msg . PHP_EOL); + fclose($authlog_handle); + } + /** Priority values are: 0 = DEBUG, 1 = WARNING, 2 = ERROR */ public function error($msg, $next_link = '', $stop = true, $priority = 1) { //$this->uses("error"); @@ -284,6 +297,7 @@ class app { $this->tpl->setVar('datalog_changes_end_txt', $this->lng('datalog_changes_end_txt')); $this->tpl->setVar('datalog_changes_count', $datalog['count']); $this->tpl->setLoop('datalog_changes', $datalog['entries']); + $this->tpl->setVar('datalog_changes_close_txt', $this->lng('datalog_changes_close_txt')); } else { $this->tpl->setVar('app_version', ''); } @@ -333,7 +347,23 @@ class app { $this->tpl->setVar('globalsearch_noresults_limit_txt', $this->lng('globalsearch_noresults_limit_txt')); $this->tpl->setVar('globalsearch_searchfield_watermark_txt', $this->lng('globalsearch_searchfield_watermark_txt')); } - + + public function is_under_maintenance() { + $system_config_misc = $this->getconf->get_global_config('misc'); + $maintenance_mode = 'n'; + $maintenance_mode_exclude_ips = []; + + if (!empty($system_config_misc['maintenance_mode'])) { + $maintenance_mode = $system_config_misc['maintenance_mode']; + } + + if (!empty($system_config_misc['maintenance_mode_exclude_ips'])) { + $maintenance_mode_exclude_ips = array_map('trim', explode(',', $system_config_misc['maintenance_mode_exclude_ips'])); + } + + return 'y' === $maintenance_mode && !in_array($_SERVER['REMOTE_ADDR'], $maintenance_mode_exclude_ips); + } + private function get_cookie_domain() { $sec_config = $this->getconf->get_security_config('permissions'); $proxy_panel_allowed = $sec_config['reverse_proxy_panel_allowed']; @@ -356,15 +386,15 @@ class app { $forwarded_host = (isset($_SERVER['HTTP_X_FORWARDED_HOST']) ? $_SERVER['HTTP_X_FORWARDED_HOST'] : null ); if($forwarded_host !== null && $forwarded_host !== $cookie_domain) { // Just check for complete domain name and not auto subdomains - $sql = "SELECT domain_id from web_domain where domain = '$forwarded_host'"; - $recs = $this->db->queryOneRecord($sql); + $sql = "SELECT domain_id from web_domain where domain = ?"; + $recs = $this->db->queryOneRecord($sql, $forwarded_host); if($recs !== null) { $cookie_domain = $forwarded_host; } unset($forwarded_host); } } - + return $cookie_domain; } @@ -373,7 +403,7 @@ class app { //** Initialize application (app) object //* possible future = new app($conf); $app = new app(); -/* +/* split session creation out of constructor is IMHO better. otherwise we have some circular references to global $app like in getconfig property of App - RA @@ -382,7 +412,7 @@ $app->initialize_session(); // load and enable PHP Intrusion Detection System (PHPIDS) $ids_security_config = $app->getconf->get_security_config('ids'); - + if(is_dir(ISPC_CLASS_PATH.'/IDS') && !defined('REMOTE_API_CALL') && ($ids_security_config['ids_anon_enabled'] == 'yes' || $ids_security_config['ids_user_enabled'] == 'yes' || $ids_security_config['ids_admin_enabled'] == 'yes')) { $app->uses('ids'); $app->ids->start(); diff --git a/interface/lib/classes/aps_guicontroller.inc.php b/interface/lib/classes/aps_guicontroller.inc.php index 8a764a9c5c776618156be1023cdb5ca2a9f4f590..036bef7f05dcb53a3fe471b495250779f5033384 100644 --- a/interface/lib/classes/aps_guicontroller.inc.php +++ b/interface/lib/classes/aps_guicontroller.inc.php @@ -53,7 +53,7 @@ class ApsGUIController extends ApsBase if (substr($domain, 0, 4) == 'www.') $domain = substr($domain, 4); return $domain; } - + /** * Reads in a package metadata file and registers it's namespaces @@ -220,7 +220,7 @@ class ApsGUIController extends ApsBase $params[] = $client_id; } $params[] = $id; - + $result = $app->db->queryOneRecord('SELECT id FROM aps_instances WHERE '.$sql_ext.' id = ?', true, $params); if(!$result) return false; @@ -229,18 +229,18 @@ class ApsGUIController extends ApsBase public function createDatabaseForPackageInstance(&$settings, $websrv) { global $app; - + $app->uses('tools_sites'); - + $global_config = $app->getconf->get_global_config('sites'); - + $tmp = array(); $tmp['parent_domain_id'] = $websrv['domain_id']; $tmp['sys_groupid'] = $websrv['sys_groupid']; $dbname_prefix = $app->tools_sites->replacePrefix($global_config['dbname_prefix'], $tmp); $dbuser_prefix = $app->tools_sites->replacePrefix($global_config['dbuser_prefix'], $tmp); unset($tmp); - + // get information if the webserver is a db server, too $web_server = $app->db->queryOneRecord("SELECT server_id,server_name,db_server FROM server WHERE server_id = ?", $websrv['server_id']); if($web_server['db_server'] == 1) { @@ -276,14 +276,14 @@ class ApsGUIController extends ApsBase * although this does not present any error message to the user. */ return false; - + /*$mysql_db_server_id = $websrv['server_id']; $settings['main_database_host'] = 'localhost'; $mysql_db_remote_access = 'n'; $mysql_db_remote_ips = '';*/ } } - + if (empty($settings['main_database_name'])) { //* Find a free db name for the app for($n = 1; $n <= 1000; $n++) { @@ -302,7 +302,7 @@ class ApsGUIController extends ApsBase } $settings['main_database_login'] = $mysql_db_user; } - + //* Create the mysql database user if not existing $tmp = $app->db->queryOneRecord("SELECT database_user_id FROM web_database_user WHERE database_user = ?", $settings['main_database_login']); if(!$tmp) { @@ -320,7 +320,7 @@ class ApsGUIController extends ApsBase $mysql_db_user_id = $app->db->datalogInsert('web_database_user', $insert_data, 'database_user_id'); } else $mysql_db_user_id = $tmp['database_user_id']; - + //* Create the mysql database if not existing $tmp = $app->db->queryOneRecord("SELECT count(database_id) as number FROM web_database WHERE database_name = ?", $settings['main_database_name']); if($tmp['number'] == 0) { @@ -340,15 +340,15 @@ class ApsGUIController extends ApsBase "remote_access" => $mysql_db_remote_access, "remote_ips" => $mysql_db_remote_ips, "backup_copies" => $websrv['backup_copies'], - "active" => 'y', + "active" => 'y', "backup_interval" => $websrv['backup_interval'] ); $app->db->datalogInsert('web_database', $insert_data, 'database_id'); } - + return true; } - + /** * Creates a new database record for the package instance and * an install task @@ -396,7 +396,7 @@ class ApsGUIController extends ApsBase // mysql-database-name is updated inside if not set already if (!$this->createDatabaseForPackageInstance($settings, $websrv)) return false; } - + //* Insert new package instance $insert_data = array( "sys_userid" => $websrv['sys_userid'], @@ -426,7 +426,7 @@ class ApsGUIController extends ApsBase //* Set package status to install afetr we inserted the settings $app->db->datalogUpdate('aps_instances', array("instance_status" => INSTANCE_INSTALL), 'id', $InstanceID); - + return $InstanceID; } @@ -444,7 +444,7 @@ class ApsGUIController extends ApsBase $sql = "SELECT web_database.database_id as database_id, web_database.database_user_id as `database_user_id` FROM aps_instances_settings, web_database WHERE aps_instances_settings.value = web_database.database_name AND aps_instances_settings.name = 'main_database_name' AND aps_instances_settings.instance_id = ? LIMIT 0,1"; $tmp = $app->db->queryOneRecord($sql, $instanceid); if($tmp['database_id'] > 0) $app->db->datalogDelete('web_database', 'database_id', $tmp['database_id']); - + $database_user = $tmp['database_user_id']; $tmp = $app->db->queryOneRecord("SELECT COUNT(*) as `cnt` FROM `web_database` WHERE `database_user_id` = ? OR `database_ro_user_id` = ?", $database_user, $database_user); if($tmp['cnt'] < 1) $app->db->datalogDelete('web_database_user', 'database_user_id', $database_user); @@ -637,11 +637,27 @@ class ApsGUIController extends ApsBase // The location might be empty but the DB return must not be false! if($location_for_domain) $used_path .= $location_for_domain['value']; + // If user is trying to install into exactly the same path, give an error if($new_path == $used_path) { $temp_errstr = $app->lng('error_used_location'); break; } + + // If the new path is _below_ an existing path, give an error because the + // installation will delete the files of the existing APS installation + if (mb_substr($used_path, 0, mb_strlen($new_path)) === $new_path) { + $temp_errstr = $app->lng('error_used_location'); + break; + } + + // If the new path is _within_ an existing path, give an error. Even if + // installation would proceed fine in theory, deleting the "lower" package + // in the future would also inadvertedly delete the "nested" package + if (mb_substr($new_path, 0, mb_strlen($used_path)) === $used_path) { + $temp_errstr = $app->lng('error_used_location'); + break; + } } } } @@ -667,7 +683,7 @@ class ApsGUIController extends ApsBase if (isset($postinput['main_database_host'])) $input['main_database_host'] = $postinput['main_database_host']; if (isset($postinput['main_database_name'])) $input['main_database_name'] = $postinput['main_database_name']; if (isset($postinput['main_database_login'])) $input['main_database_login'] = $postinput['main_database_login']; - + if(isset($postinput['main_database_password'])) { if($postinput['main_database_password'] == '') $error[] = $app->lng('error_no_database_pw'); diff --git a/interface/lib/classes/auth.inc.php b/interface/lib/classes/auth.inc.php index 2075c7b90d10aaf8f14cc4648bf75a727f14ebb7..3a4cc1603cca1972f8711c7e09ff19f7c53cc8f9 100644 --- a/interface/lib/classes/auth.inc.php +++ b/interface/lib/classes/auth.inc.php @@ -58,7 +58,7 @@ class auth { $userid = $app->functions->intval($userid); $client = $app->db->queryOneRecord("SELECT client.limit_client FROM sys_user, client WHERE sys_user.userid = ? AND sys_user.client_id = client.client_id", $userid); - if($client['limit_client'] != 0) { + if(is_array($client) && $client['limit_client'] != 0) { return true; } else { return false; @@ -141,12 +141,18 @@ class auth { } } - public function check_module_permissions($module) { + + /** + * Check that the user has access to the given module. + * + * @return boolean + */ + public function verify_module_permissions($module) { // Check if the current user has the permissions to access this module $module = trim(preg_replace('@\s+@', '', $module)); $user_modules = explode(',',$_SESSION["s"]["user"]["modules"]); + $can_use_module = false; if(strpos($module, ',') !== false){ - $can_use_module = false; $tmp_modules = explode(',', $module); if(is_array($tmp_modules) && !empty($tmp_modules)){ foreach($tmp_modules as $tmp_module){ @@ -158,17 +164,21 @@ class auth { } } } - if(!$can_use_module){ - // echo "LOGIN_REDIRECT:/index.php"; - header("Location: /index.php"); - exit; - } - } else { - if(!in_array($module,$user_modules)) { - // echo "LOGIN_REDIRECT:/index.php"; - header("Location: /index.php"); - exit; - } + } + elseif(in_array($module,$user_modules)) { + $can_use_module = true; + } + return $can_use_module; + } + + /** + * Check that the user has access to the given module, redirect and exit on failure. + */ + public function check_module_permissions($module) { + if(!$this->verify_module_permissions($module)) { + // echo "LOGIN_REDIRECT:/index.php"; + header("Location: /index.php"); + exit; } } @@ -188,10 +198,40 @@ class auth { } + /** + * Get the minimum password length. + */ + public function get_min_password_length() { + global $app; + $server_config_array = $app->getconf->get_global_config(); + $min_password_length = 8; + if(isset($server_config_array['misc']['min_password_length'])) $min_password_length = $server_config_array['misc']['min_password_length']; + return $min_password_length; + } + + /** + * Get the minimum password strength. + */ + public function get_min_password_strength() { + global $app; + $server_config_array = $app->getconf->get_global_config(); + $min_password_strength = 0; + if(isset($server_config_array['misc']['min_password_strength'])) $min_password_strength = $server_config_array['misc']['min_password_strength']; + return $min_password_strength; + } + + /** + * Generate a ranmdom password. + * + * @param int $minLength + * Minimum number of characters. + * @param boolean $special + * Include special characters, like # and ! + */ 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"; @@ -200,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); @@ -258,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/cmstree.inc.php b/interface/lib/classes/cmstree.inc.php deleted file mode 100644 index ead780ebf26c65fd01d97a10a5f0f640ca54e9be..0000000000000000000000000000000000000000 --- a/interface/lib/classes/cmstree.inc.php +++ /dev/null @@ -1,117 +0,0 @@ -db->queryAllRecords('SELECT * FROM media_cat order by sort, name'); - - $optionlist = array(); - $my0 = new nodetree(); - - foreach($nodes as $row) { - - $id = 'my'.$row['media_cat_id']; - $btext = $row['name']; - $ordner = 'my'.$row['parent']; - if(!is_object($$id)) $$id = new nodetree(); - $$id->btext = $btext; - $$id->id = $row['media_cat_id']; - - if(is_object($$ordner)) { - $$ordner->childs[] = &$$id; - } else { - $$ordner = new nodetree(); - $$ordner->childs[] = &$$id; - } - } - - $this->ptree($my0, 0, $optionlist); - return is_array($nodes) ? $optionlist : false; - } - - private function ptree($myobj, $tiefe, &$optionlist){ - global $_SESSION; - $tiefe += 1; - $id = $myobj->id; - - if(is_array($myobj->childs) and ($_SESSION['s']['cat_open'][$id] == 1 or $tiefe <= 1)) { - foreach($myobj->childs as $val) { - // kategorie => str_repeat('-  ',$tiefe) . $val->btext, - - // Ergebnisse Formatieren - /* - if($tiefe == 0) { - $kategorie = ""; - } elseif ($tiefe == 1) { - $kategorie = ""; - } else { - $kategorie = ""; - } - */ - $val_id = $val->id; - if($_SESSION['s']['cat_open'][$val_id] == 1) { - $kategorie = ""; - } else { - $kategorie = ""; - } - - $optionlist[] = array( media_cat => $kategorie, - media_cat_id => $val->id, - depth => $tiefe); - $this->ptree($val, $tiefe, $optionlist); - } - } - } - -} -?> diff --git a/interface/lib/classes/custom_datasource.inc.php b/interface/lib/classes/custom_datasource.inc.php index c50d5850278483e6841e8eae202a99d6c4f7a7f1..3158fdde1a0e0183548a832438793819626fd366 100644 --- a/interface/lib/classes/custom_datasource.inc.php +++ b/interface/lib/classes/custom_datasource.inc.php @@ -161,9 +161,10 @@ class custom_datasource { $sql = "SELECT $server_type as server_id FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?"; $client = $app->db->queryOneRecord($sql, $client_group_id); if($client['server_id'] > 0) { - //* Select the default server for the client - $sql = "SELECT server_id,server_name FROM server WHERE server_id = ?"; - $records = $app->db->queryAllRecords($sql, $client['server_id']); + ///* Select the available servers for the client + $clientservers = explode(',',$client['server_id']); + $sql = "SELECT server_id,server_name FROM server WHERE server_id IN ? ORDER BY server_name"; + $records = $app->db->queryAllRecords($sql,$clientservers); } else { //* Not able to find the clients defaults, use this as fallback and add a warning message to the log $app->log('Unable to find default server for client in custom_datasource.inc.php', 1); diff --git a/interface/lib/classes/db_mysql.inc.php b/interface/lib/classes/db_mysql.inc.php index 9c7269e568624cb7ae2f696929130ad1817b9e63..78eee8c9971a7353cb0517889b16f7b2cba247ac 100644 --- a/interface/lib/classes/db_mysql.inc.php +++ b/interface/lib/classes/db_mysql.inc.php @@ -82,6 +82,8 @@ class db $this->dbClientFlags = ($flags !== NULL) ? $flags : $conf['db_client_flags']; $this->_iConnId = mysqli_init(); + mysqli_report(MYSQLI_REPORT_OFF); + mysqli_real_connect($this->_iConnId, $this->dbHost, $this->dbUser, $this->dbPass, '', (int)$this->dbPort, NULL, $this->dbClientFlags); for($try=0;(!is_object($this->_iConnId) || mysqli_connect_errno()) && $try < 5;++$try) { sleep($try); @@ -171,14 +173,10 @@ class db } elseif(is_null($sValue) || (is_string($sValue) && (strcmp($sValue, '#NULL#') == 0))) { $sTxt = 'NULL'; } elseif(is_array($sValue)) { - if(isset($sValue['SQL'])) { - $sTxt = $sValue['SQL']; - } else { - $sTxt = ''; - foreach($sValue as $sVal) $sTxt .= ',\'' . $this->escape($sVal) . '\''; - $sTxt = '(' . substr($sTxt, 1) . ')'; - if($sTxt == '()') $sTxt = '(0)'; - } + $sTxt = ''; + foreach($sValue as $sVal) $sTxt .= ',\'' . $this->escape($sVal) . '\''; + $sTxt = '(' . substr($sTxt, 1) . ')'; + if($sTxt == '()') $sTxt = '(0)'; } else { $sTxt = '\'' . $this->escape($sValue) . '\''; } @@ -259,6 +257,8 @@ class db private function _query($sQuery = '') { global $app; + $aArgs = func_get_args(); + if ($sQuery == '') { $this->_sqlerror('Keine Anfrage angegeben / No query given'); return false; @@ -297,7 +297,6 @@ class db } } while($ok == false); - $aArgs = func_get_args(); $sQuery = call_user_func_array(array(&$this, '_build_query_string'), $aArgs); $this->securityScan($sQuery); $this->_iQueryId = mysqli_query($this->_iConnId, $sQuery); @@ -353,10 +352,17 @@ class db * @return array result row or NULL if none found */ public function queryOneRecord($sQuery = '') { - if(!preg_match('/limit \d+\s*(,\s*\d+)?$/i', $sQuery)) $sQuery .= ' LIMIT 0,1'; $aArgs = func_get_args(); - $oResult = call_user_func_array(array(&$this, 'query'), $aArgs); + if(!empty($aArgs)) { + $sQuery = array_shift($aArgs); + if($sQuery && !preg_match('/limit \d+(\s*,\s*\d+)?$/i', $sQuery)) { + $sQuery .= ' LIMIT 0,1'; + } + array_unshift($aArgs, $sQuery); + } + + $oResult = call_user_func_array([&$this, 'query'], $aArgs); if(!$oResult) return null; $aReturn = $oResult->get(); @@ -520,7 +526,7 @@ class db $sString = ''; } - $cur_encoding = mb_detect_encoding($sString); + $cur_encoding = mb_detect_encoding($sString, "auto"); if($cur_encoding != "UTF-8") { if($cur_encoding != 'ASCII') { if(is_object($app) && method_exists($app, 'log')) $app->log('String ' . substr($sString, 0, 25) . '... is ' . $cur_encoding . '.', LOGLEVEL_DEBUG); @@ -742,7 +748,7 @@ class db foreach($insert_data as $key => $val) { $key_str .= '??,'; $params[] = $key; - + $val_str .= '?,'; $v_params[] = $val; } @@ -756,7 +762,7 @@ class db $this->query("INSERT INTO ?? $insert_data_str", $tablename); $app->log("deprecated use of passing values to datalogInsert() - table " . $tablename, 1); } - + $old_rec = array(); $index_value = $this->insertID(); if(!$index_value && isset($insert_data[$index_field])) { @@ -1098,6 +1104,76 @@ class db } } + /** + * Get the database type (mariadb or mysql) + * + * @access public + * @return string 'mariadb' or string 'mysql' + */ + + public function getDatabaseType() { + $tmp = $this->queryOneRecord('SELECT VERSION() as version'); + if(stristr($tmp['version'],'mariadb')) { + return 'mariadb'; + } else { + return 'mysql'; + } + } + + /** + * Get the database version + * + * @access public + * @param bool $major_version_only = true will return the major version only, e.g. 8 for MySQL 8 + * @return string version number + */ + + public function getDatabaseVersion($major_version_only = false) { + $tmp = $this->queryOneRecord('SELECT VERSION() as version'); + $version = explode('-', $tmp['version']); + if($major_version_only == true) { + $version_parts = explode('.', $version[0]); + return $version_parts[0]; + } else { + return $version[0]; + } + } + + /** + * Get a mysql password hash + * + * @access public + * @param string cleartext password + * @return string Password hash + */ + + public function getPasswordHash($password) { + + $password_type = 'password'; + + /* Disabled until caching_sha2_password is implemented + if($this->getDatabaseType() == 'mysql' && $this->getDatabaseVersion(true) >= 8) { + // we are in MySQL 8 mode + $tmp = $this->queryOneRecord("show variables like 'default_authentication_plugin'"); + if($tmp['default_authentication_plugin'] == 'caching_sha2_password') { + $password_type = 'caching_sha2_password'; + } + } + */ + + if($password_type == 'caching_sha2_password') { + /* + caching_sha2_password hashing needs to be implemented, have not + found valid PHP implementation for the new password hash type. + */ + } else { + $password_hash = '*'.strtoupper(sha1(sha1($password, true))); + } + + return $password_hash; + } + + } /** @@ -1300,7 +1376,7 @@ class fakedb_result { if(!is_array($this->aLimitedData)) return $aItem; - if(list($vKey, $aItem) = each($this->aLimitedData)) { + foreach($this->aLimitedData as $vKey => $aItem) { if(!$aItem) $aItem = null; } return $aItem; diff --git a/interface/lib/classes/functions.inc.php b/interface/lib/classes/functions.inc.php index 03e331f0f14c22db8632e191e9e6a5346401b693..629da2fb0e21ad9ecc9dc92f99e29f1665d908c7 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. @@ -61,7 +63,7 @@ class functions { if(is_string($to) && strpos($to, ',') !== false) { $to = preg_split('/\s*,\s*/', $to); } - + $app->ispcmail->send($to); $app->ispcmail->finish(); @@ -234,7 +236,7 @@ class functions { if(preg_match($regex, $result['ip'])) $ips[] = $result['ip']; } } - + $results = $app->db->queryAllRecords("SELECT remote_ips FROM web_database WHERE remote_ips != ''"); if(!empty($results) && is_array($results)){ foreach($results as $result){ @@ -290,6 +292,34 @@ class functions { return round(pow(1024, $base-floor($base)), $precision).$suffixes[floor($base)]; } + + /** + * Normalize a path and strip duplicate slashes from it + * + * This will also remove all /../ from the path, reducing the preceding path elements + * + * @param string $path + * @return string + */ + public function normalize_path($path) { + $path = preg_replace('~[/]{2,}~', '/', $path); + $parts = explode('/', $path); + $return_parts = array(); + + foreach($parts as $current_part) { + if($current_part === '..') { + if(!empty($return_parts) && end($return_parts) !== '') { + array_pop($return_parts); + } + } else { + $return_parts[] = $current_part; + } + } + + return implode('/', $return_parts); + } + + /** IDN converter wrapper. * all converter classes should be placed in ISPC_CLASS_PATH.'/idn/' */ @@ -304,6 +334,14 @@ class functions { $domain = substr($domain, strrpos($domain, '@') + 1); } + // idn_to_* chokes on leading dots, but we need them for amavis, so remove it for later + if(substr($domain, 0, 1) === '.') { + $leading_dot = true; + $domain = substr($domain, 1); + } else { + $leading_dot = false; + } + if($encode == true) { if(function_exists('idn_to_ascii')) { if(defined('IDNA_NONTRANSITIONAL_TO_ASCII') && defined('INTL_IDNA_VARIANT_UTS46') && constant('IDNA_NONTRANSITIONAL_TO_ASCII')) { @@ -348,6 +386,10 @@ class functions { } } + if($leading_dot == true) { + $domain = '.' . $domain; + } + if($user_part !== false) return $user_part . '@' . $domain; else return $domain; } @@ -370,49 +412,49 @@ class functions { public function is_allowed_user($username, $restrict_names = false) { global $app; - + $name_blacklist = array('root','ispconfig','vmail','getmail'); if(in_array($username,$name_blacklist)) return false; - + if(preg_match('/^[a-zA-Z0-9\.\-_]{1,32}$/', $username) == false) return false; - + if($restrict_names == true && preg_match('/^web\d+$/', $username) == false) return false; - + return true; } - + public function is_allowed_group($groupname, $restrict_names = false) { global $app; - + $name_blacklist = array('root','ispconfig','vmail','getmail'); if(in_array($groupname,$name_blacklist)) return false; - + if(preg_match('/^[a-zA-Z0-9\.\-_]{1,32}$/', $groupname) == false) return false; - + if($restrict_names == true && preg_match('/^client\d+$/', $groupname) == false) return false; - + return true; } - + public function getimagesizefromstring($string){ if (!function_exists('getimagesizefromstring')) { $uri = 'data://application/octet-stream;base64,' . base64_encode($string); return getimagesize($uri); } else { return getimagesizefromstring($string); - } + } } - + public function password($minLength = 10, $special = false){ global $app; - + $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; } @@ -427,10 +469,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. @@ -438,27 +476,30 @@ class functions { while($app->db->queryOneRecord("SELECT client_id FROM client WHERE customer_no = ?", $customer_no)) { $customer_no = mt_rand(100000, 999999); } - + return $customer_no; } - + public function generate_ssh_key($client_id, $username = ''){ 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); } } - + public function htmlentities($value) { global $conf; @@ -474,10 +515,10 @@ class functions { } else { $out = htmlentities($value, ENT_QUOTES, $conf["html_content_encoding"]); } - + return $out; } - + // Function to check paths before we use it as include. Use with absolute paths only. public function check_include_path($path) { if(strpos($path,'//') !== false) die('Include path seems to be an URL: '.$this->htmlentities($path)); @@ -488,7 +529,7 @@ class functions { if(substr($path,0,strlen(ISPC_ROOT_PATH)) != ISPC_ROOT_PATH) die('Path '.$this->htmlentities($path).' is outside of ISPConfig installation directory.'); return $path; } - + // Function to check language strings public function check_language($language) { global $app; @@ -496,10 +537,121 @@ class functions { return $language; } else { $app->log('Wrong language string: '.$this->htmlentities($language),1); - return 'en'; + return 'en'; } } - + + // 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/getconf.inc.php b/interface/lib/classes/getconf.inc.php index ef9e0702d212db0b3a773b4c5a0dc900af8e4153..bbb57d60147f4478ec4dca1ba1ccd859fd2edd6f 100644 --- a/interface/lib/classes/getconf.inc.php +++ b/interface/lib/classes/getconf.inc.php @@ -65,7 +65,7 @@ class getconf { } else { $app->uses('ini_parser'); $security_config_path = '/usr/local/ispconfig/security/security_settings.ini'; - if(!is_file($security_config_path)) $security_config_path = realpath(ISPC_ROOT_PATH.'/../security/security_settings.ini'); + if(!is_readable($security_config_path)) $security_config_path = realpath(ISPC_ROOT_PATH.'/../security/security_settings.ini'); $this->security_config = $app->ini_parser->parse_ini_string(file_get_contents($security_config_path)); return ($section == '') ? $this->security_config : $this->security_config[$section]; diff --git a/interface/lib/classes/ids.inc.php b/interface/lib/classes/ids.inc.php index abdf32b30251543045b0302158378748eba17d8b..ffa24a294e75ca7d1988bc822f387bdc79273340 100644 --- a/interface/lib/classes/ids.inc.php +++ b/interface/lib/classes/ids.inc.php @@ -68,7 +68,7 @@ class ids { // Get whitelist $whitelist_path = '/usr/local/ispconfig/security/ids.whitelist'; - if(is_file('/usr/local/ispconfig/security/ids.whitelist.custom')) $whitelist_path = '/usr/local/ispconfig/security/ids.whitelist.custom'; + if(is_readable('/usr/local/ispconfig/security/ids.whitelist.custom')) $whitelist_path = '/usr/local/ispconfig/security/ids.whitelist.custom'; if(!is_file($whitelist_path)) $whitelist_path = realpath(ISPC_ROOT_PATH.'/../security/ids.whitelist'); $whitelist_lines = file($whitelist_path); @@ -77,7 +77,7 @@ class ids { $line = trim($line); if(substr($line,0,1) != '#') { list($user,$path,$varname) = explode(':',$line); - if($current_script_name == $path) { + if($current_script_name == $path || $path == '*') { if($user = 'any' || ($user == 'user' && ($_SESSION['s']['user']['typ'] == 'user' || $_SESSION['s']['user']['typ'] == 'admin')) || ($user == 'admin' && $_SESSION['s']['user']['typ'] == 'admin')) { @@ -91,7 +91,7 @@ class ids { // Get HTML fields $htmlfield_path = '/usr/local/ispconfig/security/ids.htmlfield'; - if(is_file('/usr/local/ispconfig/security/ids.htmlfield.custom')) $htmlfield_path = '/usr/local/ispconfig/security/ids.htmlfield.custom'; + if(is_readable('/usr/local/ispconfig/security/ids.htmlfield.custom')) $htmlfield_path = '/usr/local/ispconfig/security/ids.htmlfield.custom'; if(!is_file($htmlfield_path)) $htmlfield_path = realpath(ISPC_ROOT_PATH.'/../security/ids.htmlfield'); $htmlfield_lines = file($htmlfield_path); @@ -100,7 +100,7 @@ class ids { $line = trim($line); if(substr($line,0,1) != '#') { list($user,$path,$varname) = explode(':',$line); - if($current_script_name == $path) { + if($current_script_name == $path || $path == '*') { if($user = 'any' || ($user == 'user' && ($_SESSION['s']['user']['typ'] == 'user' || $_SESSION['s']['user']['typ'] == 'admin')) || ($user == 'admin' && $_SESSION['s']['user']['typ'] == 'admin')) { diff --git a/interface/lib/classes/ispcmail.inc.php b/interface/lib/classes/ispcmail.inc.php index 522fd1a71b6f0e6bf4beebbff0c9e2ba4a06aac7..f5aa35957753ec1c6ff65d6a9eb555cff747065e 100644 --- a/interface/lib/classes/ispcmail.inc.php +++ b/interface/lib/classes/ispcmail.inc.php @@ -169,7 +169,7 @@ class ispcmail { $this->smtp_host = $value; break; case 'smtp_port': - $this->smtp_port = $value; + if(intval($value) > 0) $this->smtp_port = $value; break; case 'smtp_user': $this->smtp_user = $value; @@ -586,8 +586,8 @@ class ispcmail { */ private function _smtp_login() { $this->_smtp_conn = fsockopen(($this->smtp_crypt == 'ssl' ? 'tls://' : '') . $this->smtp_host, $this->smtp_port, $errno, $errstr, 30); - $response = fgets($this->_smtp_conn, 515); if(empty($this->_smtp_conn)) return false; + $response = fgets($this->_smtp_conn, 515); //Say Hello to SMTP if($this->smtp_helo == '') $this->detectHelo(); @@ -607,8 +607,14 @@ class ispcmail { } stream_context_set_option($this->_smtp_conn, 'ssl', 'verify_host', false); stream_context_set_option($this->_smtp_conn, 'ssl', 'verify_peer', false); + stream_context_set_option($this->_smtp_conn, 'ssl', 'verify_peer_name', false); stream_context_set_option($this->_smtp_conn, 'ssl', 'allow_self_signed', true); - stream_socket_enable_crypto($this->_smtp_conn, true, $crypto_method); + if (stream_socket_enable_crypto($this->_smtp_conn, true, $crypto_method) != true) { + return false; + } + + fputs($this->_smtp_conn, 'HELO ' . $this->smtp_helo . $this->_crlf); + $response = fgets($this->_smtp_conn, 515); } //AUTH LOGIN @@ -821,8 +827,7 @@ class ispcmail { else $rec_string .= $recip; } $to = $this->_encodeHeader($rec_string, $this->mail_charset); - //$result = mail($to, $subject, $this->body, implode($this->_crlf, $headers)); - $result = mail($to, $enc_subject, $this->body, implode($this->_crlf, $headers)); + $result = mail($to, $enc_subject, $this->body, implode($this->_crlf, $headers), "-f $this->_mail_sender"); } // Reset the subject in case mail is resent diff --git a/interface/lib/classes/json_handler.inc.php b/interface/lib/classes/json_handler.inc.php index de8dd5ba0dd254053821ae910f3a868ba943597f..fb0811d31420f6dd6833857194a1914d6543f242 100644 --- a/interface/lib/classes/json_handler.inc.php +++ b/interface/lib/classes/json_handler.inc.php @@ -30,45 +30,7 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -class ISPConfigJSONHandler { - private $methods = array(); - private $classes = array(); - - public function __construct() { - global $app; - - // load main remoting file - $app->load('remoting'); - - // load all remote classes and get their methods - $dir = dirname(realpath(__FILE__)) . '/remote.d'; - $d = opendir($dir); - while($f = readdir($d)) { - if($f == '.' || $f == '..') continue; - if(!is_file($dir . '/' . $f) || substr($f, strrpos($f, '.')) != '.php') continue; - - $name = substr($f, 0, strpos($f, '.')); - - include $dir . '/' . $f; - $class_name = 'remoting_' . $name; - if(class_exists($class_name, false)) { - $this->classes[$class_name] = new $class_name(); - foreach(get_class_methods($this->classes[$class_name]) as $method) { - $this->methods[$method] = $class_name; - } - } - } - closedir($d); - - // add main methods - $this->methods['login'] = 'remoting'; - $this->methods['logout'] = 'remoting'; - $this->methods['get_function_list'] = 'remoting'; - - // create main class - $this->classes['remoting'] = new remoting(array_keys($this->methods)); - } - +class ISPConfigJSONHandler extends ISPConfigRemotingHandlerBase { private function _return_json($code, $message, $data = false) { $ret = new stdClass; $ret->code = $code; diff --git a/interface/lib/classes/listform.inc.php b/interface/lib/classes/listform.inc.php index 4b92daa73c2cba5cc8b7ec01ee170a452e20a3c8..1206e3668a88bc3cc7133ac194188e1c07caa277 100644 --- a/interface/lib/classes/listform.inc.php +++ b/interface/lib/classes/listform.inc.php @@ -80,7 +80,7 @@ class listform { private function getDatasourceData($field) { - global $app; + global $app, $api; $values = array(); if($field['datasource']['type'] == 'SQL') { @@ -97,7 +97,8 @@ class listform { $querystring = str_replace("{AUTHSQL}", $app->tform->getAuthSQL('r'), $querystring); $querystring = str_replace("{AUTHSQL-A}", $app->tform->getAuthSQL('r', 'a'), $querystring); $querystring = str_replace("{AUTHSQL-B}", $app->tform->getAuthSQL('r', 'b'), $querystring); - $querystring = preg_replace_callback('@{AUTHSQL::(.+?)}@', create_function('$matches','global $app; $tmp = $app->tform->getAuthSQL("r", $matches[1]); return $tmp;'), $querystring); + //$querystring = preg_replace_callback('@{AUTHSQL::(.+?)}@', create_function('$matches','global $app; $tmp = $app->tform->getAuthSQL("r", $matches[1]); return $tmp;'), $querystring); + $querystring = preg_replace_callback('@{AUTHSQL::(.+?)}@', function($matches) {global $app; $tmp = $app->tform->getAuthSQL("r", $matches[1]); return $tmp;}, $querystring); //* Getting the records $tmp_records = $app->db->queryAllRecords($querystring); @@ -195,9 +196,9 @@ class listform { if(@is_array($this->listDef['item'])) { foreach($this->listDef['item'] as $i) { $field = $i['field']; - $table = $i['table']; + $table = (isset($i['table']))?$i['table']:''; - $searchval = $_SESSION['search'][$list_name][$search_prefix.$field]; + $searchval = (isset($_SESSION['search'][$list_name][$search_prefix.$field]))?$_SESSION['search'][$list_name][$search_prefix.$field]:''; // IDN if($searchval != ''){ if(is_array($i['filters'])) { @@ -325,7 +326,7 @@ class listform { if($this->searchChanged == 1) $_SESSION['search'][$list_name]['page'] = 0; $sql_von = $app->functions->intval($_SESSION['search'][$list_name]['page'] * $records_per_page); - $record_count = $app->db->queryOneRecord("SELECT count(*) AS anzahl FROM ??".($app->listform->listDef['additional_tables'] != ''? ','.$app->listform->listDef['additional_tables'] : '')." WHERE $sql_where", $table); + $record_count = $app->db->queryOneRecord("SELECT count(*) AS anzahl FROM ??".(isset($app->listform->listDef['additional_tables']) && $app->listform->listDef['additional_tables'] != ''? ','.$app->listform->listDef['additional_tables'] : '')." WHERE $sql_where", $table); $pages = $app->functions->intval(($record_count['anzahl'] - 1) / $records_per_page); diff --git a/interface/lib/classes/listform_actions.inc.php b/interface/lib/classes/listform_actions.inc.php index 4a463fe01508e196363ed1095a5d41654398164f..7ffc84c32b90f36d8c4e71df9890aefbc5140f4e 100644 --- a/interface/lib/classes/listform_actions.inc.php +++ b/interface/lib/classes/listform_actions.inc.php @@ -39,6 +39,7 @@ class listform_actions { private $sortKeys; private function _sort($aOne, $aTwo) { + $suffixes=array('k' => 1, 'M' => 1024, 'G' => 1048576, 'T' => 1099511627776); if(!is_array($aOne) || !is_array($aTwo)) return 0; if(!is_array($this->sortKeys)) $this->sortKeys = array($this->sortKeys); @@ -49,6 +50,15 @@ class listform_actions { } $a = $aOne[$sKey]; $b = $aTwo[$sKey]; + + if(preg_match('/(\d+\.?\d*) ([kMGT])B/', $a, $match)) { + $a = $match[1] * $suffixes[$match[2]]; + } + + if(preg_match('/(\d+\.?\d*) ([kMGT])B/', $b, $match)) { + $b = $match[1] * $suffixes[$match[2]]; + } + if(is_string($a)) $a = strtolower($a); if(is_string($b)) $b = strtolower($b); if($a < $b) return $sDir == 'DESC' ? 1 : -1; @@ -125,11 +135,11 @@ class listform_actions { } } - if($_SESSION['search'][$_SESSION['s']['module']['name'].$app->listform->listDef["name"].$app->listform->listDef['table']]['order_in_php']) $php_sort = true; + if(@$_SESSION['search'][$_SESSION['s']['module']['name'].$app->listform->listDef["name"].$app->listform->listDef['table']]['order_in_php']) $php_sort = true; // Getting Datasets from DB $records = $app->db->queryAllRecords($this->getQueryString($php_sort)); - + $csrf_token = $app->auth->csrf_token_get($app->listform->listDef['name']); $_csrf_id = $csrf_token['csrf_id']; $_csrf_key = $csrf_token['csrf_key']; @@ -179,10 +189,11 @@ class listform_actions { //* substitute value for select fields if(is_array($app->listform->listDef['item']) && count($app->listform->listDef['item']) > 0) { foreach($app->listform->listDef['item'] as $field) { + if(isset($rec['active']) && $rec['active'] == 'n') $rec['warn_inactive'] = 'y'; $key = $field['field']; if(isset($field['formtype']) && $field['formtype'] == 'SELECT') { if(strtolower($rec[$key]) == 'y' or strtolower($rec[$key]) == 'n') { - // Set a additional image variable for bolean fields + // Set a additional image variable for boolean fields $rec['_'.$key.'_'] = (strtolower($rec[$key]) == 'y')?'x16/tick_circle.png':'x16/cross_circle.png'; } //* substitute value for select field @@ -215,7 +226,7 @@ class listform_actions { } $sql_where = $app->listform->getSearchSQL($sql_where); - if($app->listform->listDef['join_sql']) $sql_where .= ' AND '.$app->listform->listDef['join_sql']; + if(isset($app->listform->listDef['join_sql'])) $sql_where .= ' AND '.$app->listform->listDef['join_sql']; $app->tpl->setVar($app->listform->searchValues); $order_by_sql = $this->SQLOrderBy; @@ -234,8 +245,9 @@ class listform_actions { $table_selects = array(); $table_selects[] = trim($app->listform->listDef['table']).'.*'; - $app->listform->listDef['additional_tables'] = trim($app->listform->listDef['additional_tables']); - if($app->listform->listDef['additional_tables'] != ''){ + + if(isset($app->listform->listDef['additional_tables']) && trim($app->listform->listDef['additional_tables']) != ''){ + $app->listform->listDef['additional_tables'] = trim($app->listform->listDef['additional_tables']); $additional_tables = explode(',', $app->listform->listDef['additional_tables']); foreach($additional_tables as $additional_table){ $table_selects[] = trim($additional_table).'.*'; @@ -243,7 +255,7 @@ class listform_actions { } $select = implode(', ', $table_selects); - $sql = 'SELECT '.$select.$extselect.' FROM '.$app->listform->listDef['table'].($app->listform->listDef['additional_tables'] != ''? ','.$app->listform->listDef['additional_tables'] : '')."$join WHERE $sql_where $order_by_sql"; + $sql = 'SELECT '.$select.$extselect.' FROM '.$app->listform->listDef['table'].(isset($app->listform->listDef['additional_tables']) && $app->listform->listDef['additional_tables'] != ''? ','.$app->listform->listDef['additional_tables'] : '')."$join WHERE $sql_where $order_by_sql"; if($no_limit == false) $sql .= " $limit_sql"; //echo $sql; return $sql; diff --git a/interface/lib/classes/plugin_backuplist.inc.php b/interface/lib/classes/plugin_backuplist.inc.php index e96be012e3d6847d43ba990cd9b79c82c3f247f3..b2fdd006d291bac48626a2909c2277480716ce63 100644 --- a/interface/lib/classes/plugin_backuplist.inc.php +++ b/interface/lib/classes/plugin_backuplist.inc.php @@ -37,6 +37,46 @@ class plugin_backuplist extends plugin_base { var $formdef; var $options; + /** + * Process request to make a backup. This request is triggered manually by the user in the ISPConfig interface. + * @param string $message + * @param string $error + * @param string[] $wb language text + * @author Ramil Valitov + * @uses backup_plugin::make_backup_callback() this method is called later in the plugin to run the backup + */ + protected function makeBackup(&$message, &$error, $wb) + { + global $app; + + $mode = $_GET['make_backup']; + $action_type = ($mode == 'web') ? 'backup_web_files' : 'backup_database'; + $domain_id = intval($this->form->id); + + $sql = "SELECT count(action_id) as number FROM sys_remoteaction WHERE action_state = 'pending' AND action_type = ? AND action_param = ?"; + $tmp = $app->db->queryOneRecord($sql, $action_type, $domain_id); + if ($tmp['number'] == 0) { + if($action_type === 'backup_database') { + // get all server ids of databases for this domain + $sql = 'SELECT DISTINCT `server_id` FROM `web_database` WHERE `parent_domain_id` = ?'; + $result = $app->db->query($sql, $domain_id); + while(($cur = $result->get())) { + $server_id = $cur['server_id']; + $sql = "INSERT INTO sys_remoteaction (server_id, tstamp, action_type, action_param, action_state, response) VALUES (?, UNIX_TIMESTAMP(), ?, ?, 'pending', '')"; + $app->db->query($sql, $server_id, $action_type, $domain_id); + } + $result->free(); + } else { + $server_id = $this->form->dataRecord['server_id']; + $sql = "INSERT INTO sys_remoteaction (server_id, tstamp, action_type, action_param, action_state, response) VALUES (?, UNIX_TIMESTAMP(), ?, ?, 'pending', '')"; + $app->db->query($sql, $server_id, $action_type, $domain_id); + } + $message .= $wb['backup_info_txt']; + } else { + $error .= $wb['backup_pending_txt']; + } + } + function onShow() { global $app; @@ -52,6 +92,10 @@ class plugin_backuplist extends plugin_base { $message = ''; $error = ''; + if (isset($_GET['make_backup'])) { + $this->makeBackup($message, $error, $wb); + } + if(isset($_GET['backup_action'])) { $backup_id = $app->functions->intval($_GET['backup_id']); @@ -116,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)){ @@ -137,13 +181,67 @@ class plugin_backuplist extends plugin_base { $rec["bgcolor"] = $bgcolor; $rec['date'] = date($app->lng('conf_format_datetime'), $rec['tstamp']); - $rec['backup_type'] = $wb[('backup_type_'.$rec['backup_type'])]; - + + $backup_format = $rec['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': + $backup_format = 'gzip'; + break; + case 'web': + $backup_format = ($rec['backup_mode'] == 'userzip') ? 'zip' : 'tar_gzip'; + break; + default: + $app->log('Unsupported backup type "' . $rec['backup_type'] . '" for backup id ' . $rec['backup_id'], LOGLEVEL_ERROR); + break; + } + } + $rec['backup_type'] = $wb[('backup_type_' . $rec['backup_type'])]; + $backup_format = (!empty($backup_format)) ? $wb[('backup_format_' . $backup_format . '_txt')] : $wb["backup_format_unknown_txt"]; + if (empty($backup_format)) + $backup_format = $wb["backup_format_unknown_txt"]; + + $rec['backup_format'] = $backup_format; + $rec['backup_encrypted'] = empty($rec['backup_password']) ? $wb["no_txt"] : $wb["yes_txt"]; + $backup_manual_prefix = 'manual-'; + $rec['backup_job'] = (substr($rec['filename'], 0, strlen($backup_manual_prefix)) == $backup_manual_prefix) ? $wb["backup_job_manual_txt"] : $wb["backup_job_auto_txt"]; + $rec['download_available'] = true; 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'] = '*' + . $rec['filesize']; + } } $records_new[] = $rec; @@ -168,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 + */ + 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 + */ + 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 3946b216dd1af6cfe7da05e292a915164e5c0ffa..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 $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'); - if($sites[$i]['hard'] == " KB") $sites[$i]['hard'] = $app->lng('unlimited'); - - if($sites[$i]['soft'] == '0 B' || $sites[$i]['soft'] == '0 KB' || $sites[$i]['soft'] == '0') $sites[$i]['soft'] = $app->lng('unlimited'); - if($sites[$i]['hard'] == '0 B' || $sites[$i]['hard'] == '0 KB' || $sites[$i]['hard'] == '0') $sites[$i]['hard'] = $app->lng('unlimited'); - + + 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;$ifunctions->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'); + $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 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'); + $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/admin.inc.php b/interface/lib/classes/remote.d/admin.inc.php index 793f9ed33966874010ecf7f6d50c618f06d6db3d..479b991b7b77d53595a69cf67f51c39ee71840ef 100644 --- a/interface/lib/classes/remote.d/admin.inc.php +++ b/interface/lib/classes/remote.d/admin.inc.php @@ -131,11 +131,10 @@ class remoting_admin extends remoting { /** Get the values of the system configuration @param int session id - @param string section of the config field in the table. Could be 'web', 'dns', 'mail', 'dns', 'cron', etc - @param string key of the option that you want to set - @param string option value that you want to set + @param string section of the config field in the table. Could be 'web', 'dns', 'mail', 'dns', 'cron', etc + @param string|null key of the option that you want to get */ - public function system_config_get($session_id, $section, $key) { + public function system_config_get($session_id, $section, $key = null) { global $app; if(!$this->checkPerm($session_id, 'system_config_get')) { throw new SoapFault('permission_denied', 'You do not have the permissions to access this function.'); diff --git a/interface/lib/classes/remote.d/client.inc.php b/interface/lib/classes/remote.d/client.inc.php index e07e227e60626c3dca9fdc4c4a078fee28db195c..b5a0b421d72869b74809b0140ca791ae812a62fb 100644 --- a/interface/lib/classes/remote.d/client.inc.php +++ b/interface/lib/classes/remote.d/client.inc.php @@ -108,7 +108,7 @@ class remoting_client extends remoting { if(isset($rec['client_id'])) { return $app->functions->intval($rec['client_id']); } else { - throw new SoapFault('no_client_found', 'There is no sysuser account for this client ID.'); + throw new SoapFault('no_client_found', 'There is no sys_user account with this userid.'); return false; } @@ -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; } @@ -257,7 +266,7 @@ class remoting_client extends remoting { if(@is_numeric($client_id)) { $sql = "SELECT * FROM `client_template_assigned` WHERE `client_id` = ?"; - return $app->db->queryOneRecord($sql, $client_id); + return $app->db->queryAllRecords($sql, $client_id); } else { throw new SoapFault('The ID must be an integer.'); return array(); @@ -388,6 +397,8 @@ class remoting_client extends remoting { return false; } + // DUPLICATE CODE IN interface/web/client/client_del.php + $client_id = $app->functions->intval($client_id); if($client_id > 0) { @@ -404,7 +415,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_forwarding,mail_get,mail_user,mail_user_filter,shell_user,spamfilter_users,mail_domain,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 434af6a98364c134e993575281a2a5e7fcfde481..67b97e722d32c4be4acd9b990275f3614be6a1a2 100644 --- a/interface/lib/classes/remote.d/dns.inc.php +++ b/interface/lib/classes/remote.d/dns.inc.php @@ -42,11 +42,10 @@ 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.'); - return false; } $client = $app->db->queryOneRecord("SELECT default_dnsserver FROM client WHERE client_id = ?", $client_id); @@ -57,13 +56,14 @@ class remoting_dns extends remoting { $app->uses('tform'); $app->tform->loadFormDef($tform_def_file); $app->uses('tpl,validate_dns,remoting_lib'); - + $app->remoting_lib->loadUserProfile($client_id); //* replace template placeholders $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); @@ -197,7 +197,7 @@ class remoting_dns extends remoting { $app->remoting_lib->loadFormDef('../dns/form/dns_soa.tform.php'); return $app->remoting_lib->getDataRecord($primary_id); } - + //* Get slave zone details public function dns_slave_get($session_id, $primary_id) { global $app; @@ -211,16 +211,16 @@ class remoting_dns extends remoting { return $app->remoting_lib->getDataRecord($primary_id); } - + //* Add a slave zone - public function dns_slave_add($session_id, $client_id, $params) { + public function dns_slave_add($session_id, $client_id, $params) { if(!$this->checkPerm($session_id, 'dns_zone_add')) { throw new SoapFault('permission_denied', 'You do not have the permissions to access this function.'); return false; } return $this->insertQuery('../dns/form/dns_slave.tform.php', $client_id, $params); - } - + } + //* Update a slave zone public function dns_slave_update($session_id, $client_id, $primary_id, $params) { if(!$this->checkPerm($session_id, 'dns_zone_update')) { @@ -231,14 +231,14 @@ class remoting_dns extends remoting { return $affected_rows; } - //* Delete a slave zone - public function dns_slave_delete($session_id, $primary_id) { + //* Delete a slave zone + public function dns_slave_delete($session_id, $primary_id) { if(!$this->checkPerm($session_id, 'dns_zone_delete')) { throw new SoapFault('permission_denied', 'You do not have the permissions to access this function.'); return false; } return $this->deleteQuery('../dns/form/dns_slave.tform.php', $primary_id); - } + } //* Get record id by origin public function dns_zone_get_id($session_id, $origin) { @@ -249,7 +249,7 @@ class remoting_dns extends remoting { return false; } - if(!preg_match('/^[a-z0-9][a-z0-9\-]+[a-z0-9](\.[a-z]{2,4})+$/i', $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; } @@ -296,12 +296,12 @@ class remoting_dns extends remoting { private function dns_rr_get($session_id, $primary_id, $rr_type = 'A') { global $app; - + $rr_type = strtolower($rr_type); if(!preg_match('/^[a-z]+$/', $rr_type)) { throw new SoapFault('permission denied', 'Invalid rr type'); } - + if(!$this->checkPerm($session_id, 'dns_' . $rr_type . '_get')) { throw new SoapFault('permission_denied', 'You do not have the permissions to access this function.'); } @@ -309,14 +309,14 @@ class remoting_dns extends remoting { $app->remoting_lib->loadFormDef('../dns/form/dns_' . $rr_type . '.tform.php'); return $app->remoting_lib->getDataRecord($primary_id); } - + //* Add a record private function dns_rr_add($session_id, $client_id, $params, $update_serial=false, $rr_type = 'A') { $rr_type = strtolower($rr_type); if(!preg_match('/^[a-z]+$/', $rr_type)) { throw new SoapFault('permission denied', 'Invalid rr type'); } - + if(!$this->checkPerm($session_id, 'dns_' . $rr_type . '_add')) { throw new SoapFault('permission_denied', 'You do not have the permissions to access this function.'); } @@ -332,7 +332,7 @@ class remoting_dns extends remoting { if(!preg_match('/^[a-z]+$/', $rr_type)) { throw new SoapFault('permission denied', 'Invalid rr type'); } - + if(!$this->checkPerm($session_id, 'dns_' . $rr_type . '_update')) { throw new SoapFault('permission_denied', 'You do not have the permissions to access this function.'); return false; @@ -343,7 +343,7 @@ class remoting_dns extends remoting { } return $affected_rows; } - + //* Delete a record private function dns_rr_delete($session_id, $primary_id, $update_serial=false, $rr_type = 'A') { $rr_type = strtolower($rr_type); @@ -359,9 +359,9 @@ class remoting_dns extends remoting { $affected_rows = $this->deleteQuery('../dns/form/dns_' . $rr_type . '.tform.php', $primary_id); return $affected_rows; } - + // ---------------------------------------------------------------------------------------------------------------- - + //* Get record details public function dns_aaaa_get($session_id, $primary_id) { return $this->dns_rr_get($session_id, $primary_id, 'AAAA'); @@ -428,6 +428,28 @@ class remoting_dns extends remoting { // ---------------------------------------------------------------------------------------------------------------- + //* Get record details + public function dns_caa_get($session_id, $primary_id) { + return $this->dns_rr_get($session_id, $primary_id, 'CAA'); + } + + //* Add a record + public function dns_caa_add($session_id, $client_id, $params, $update_serial=false) { + return $this->dns_rr_add($session_id, $client_id, $params, $update_serial, 'CAA'); + } + + //* Update a record + public function dns_caa_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, 'CAA'); + } + + //* Delete a record + public function dns_caa_delete($session_id, $primary_id, $update_serial=false) { + return $this->dns_rr_delete($session_id, $primary_id, $update_serial, 'CAA'); + } + + // ---------------------------------------------------------------------------------------------------------------- + //* Get record details public function dns_cname_get($session_id, $primary_id) { return $this->dns_rr_get($session_id, $primary_id, 'CNAME'); @@ -450,6 +472,28 @@ class remoting_dns extends remoting { // ---------------------------------------------------------------------------------------------------------------- + //* Get record details + public function dns_dname_get($session_id, $primary_id) { + return $this->dns_rr_get($session_id, $primary_id, 'DNAME'); + } + + //* Add a record + public function dns_dname_add($session_id, $client_id, $params, $update_serial=false) { + return $this->dns_rr_add($session_id, $client_id, $params, $update_serial, 'DNAME'); + } + + //* Update a record + public function dns_dname_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, 'DNAME'); + } + + //* Delete a record + public function dns_dname_delete($session_id, $primary_id, $update_serial=false) { + return $this->dns_rr_delete($session_id, $primary_id, $update_serial, 'DNAME'); + } + + // ---------------------------------------------------------------------------------------------------------------- + //* Get record details public function dns_hinfo_get($session_id, $primary_id) { return $this->dns_rr_get($session_id, $primary_id, 'HINFO'); @@ -470,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 @@ -494,6 +561,28 @@ class remoting_dns extends remoting { // ---------------------------------------------------------------------------------------------------------------- + //* Get record details + public function dns_naptr_get($session_id, $primary_id) { + return $this->dns_rr_get($session_id, $primary_id, 'NAPTR'); + } + + //* Add a record + public function dns_naptr_add($session_id, $client_id, $params, $update_serial=false) { + return $this->dns_rr_add($session_id, $client_id, $params, $update_serial, 'NAPTR'); + } + + //* Update a record + public function dns_naptr_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, 'NAPTR'); + } + + //* Delete a record + public function dns_naptr_delete($session_id, $primary_id, $update_serial=false) { + return $this->dns_rr_delete($session_id, $primary_id, $update_serial, 'NAPTR'); + } + + // ---------------------------------------------------------------------------------------------------------------- + //* Get record details public function dns_ns_get($session_id, $primary_id) { return $this->dns_rr_get($session_id, $primary_id, 'NS'); @@ -516,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'); @@ -582,6 +693,50 @@ class remoting_dns extends remoting { // ---------------------------------------------------------------------------------------------------------------- + //* Get record details + public function dns_sshfp_get($session_id, $primary_id) { + return $this->dns_rr_get($session_id, $primary_id, 'SSHFP'); + } + + //* Add a record + public function dns_sshfp_add($session_id, $client_id, $params, $update_serial=false) { + return $this->dns_rr_add($session_id, $client_id, $params, $update_serial, 'SSHFP'); + } + + //* Update a record + public function dns_sshfp_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, 'SSHFP'); + } + + //* Delete a record + public function dns_sshfp_delete($session_id, $primary_id, $update_serial=false) { + return $this->dns_rr_delete($session_id, $primary_id, $update_serial, 'SSHFP'); + } + + // ---------------------------------------------------------------------------------------------------------------- + + //* Get record details + public function dns_tlsa_get($session_id, $primary_id) { + return $this->dns_rr_get($session_id, $primary_id, 'TLSA'); + } + + //* Add a record + public function dns_tlsa_add($session_id, $client_id, $params, $update_serial=false) { + return $this->dns_rr_add($session_id, $client_id, $params, $update_serial, 'TLSA'); + } + + //* Update a record + public function dns_tlsa_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, 'TLSA'); + } + + //* Delete a record + public function dns_tlsa_delete($session_id, $primary_id, $update_serial=false) { + return $this->dns_rr_delete($session_id, $primary_id, $update_serial, 'TLSA'); + } + + // ---------------------------------------------------------------------------------------------------------------- + //* Get record details public function dns_txt_get($session_id, $primary_id) { return $this->dns_rr_get($session_id, $primary_id, 'TXT'); @@ -626,6 +781,24 @@ class remoting_dns extends remoting { + //* Get All DNS Zones Templates by etruel and thom + public function dns_templatezone_get_all($session_id) { + global $app, $conf; + if(!$this->checkPerm($session_id, 'dns_templatezone_add')) { + $this->server->fault('permission_denied', 'You do not have the permissions to access this function.'); + return false; + } + $sql ="SELECT * FROM dns_template"; + $result = $app->db->queryAllRecords($sql); + if(isset($result)) { + return $result; + } + else { + throw new SoapFault('template_id_error', 'There is no DNS templates.'); + return false; + } + } + /** * Get all dns records for a zone * @param int session id diff --git a/interface/lib/classes/remote.d/mail.inc.php b/interface/lib/classes/remote.d/mail.inc.php index 477743dfc3f52c839765ee8180e805c67f66a857..dfbad2759581518228cdd5f3805c6421ace0e652 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; } @@ -196,6 +196,24 @@ class remoting_mail extends remoting { return $app->remoting_lib->getDataRecord($primary_id); } + //* Get mail user details for all account that belong to a client. + public function mail_user_get_all_by_client($session_id, $client_id) + { + global $app; + + if(!$this->checkPerm($session_id, 'mail_user_get_all_by_client')) { + throw new SoapFault('permission_denied', 'You do not have the permissions to access this function.'); + return false; + } + $app->uses('remoting_lib'); + $sql = "SELECT u.* FROM `mail_user` u + LEFT JOIN `sys_group` g ON (u.sys_groupid=g.groupid) + WHERE g.client_id=?"; + $params[] = $client_id; + + $result = $app->db->queryAllRecords($sql, true, $params); + return $result; + } //* Add mail domain public function mail_user_add($session_id, $client_id, $params){ @@ -205,12 +223,15 @@ class remoting_mail extends remoting { throw new SoapFault('permission_denied', 'You do not have the permissions to access this function.'); return false; } + + // Email addresses must always be lower case + $params['email'] = strtolower($params['email']); //* Check if mail domain exists $email_parts = explode('@', $params['email']); - $tmp = $app->db->queryOneRecord("SELECT domain FROM mail_domain WHERE domain = ?", $email_parts[1]); + $tmp = $app->db->queryOneRecord("SELECT domain FROM mail_domain WHERE domain = ? AND domain NOT IN (SELECT SUBSTR(source,2) FROM mail_forwarding WHERE type = 'aliasdomain')", $email_parts[1]); if($tmp['domain'] != $email_parts[1]) { - throw new SoapFault('mail_domain_does_not_exist', 'Mail domain - '.$email_parts[1].' - does not exist.'); + throw new SoapFault('mail_domain_does_not_exist', 'Mail domain - '.$email_parts[1].' - does not exist as primary.'); return false; } @@ -219,8 +240,8 @@ class remoting_mail extends remoting { if (!isset($params['gid'])) $params['gid'] = -1; if (!isset($params['maildir_format'])) $params['maildir_format'] = 'maildir'; - $affected_rows = $this->insertQuery('../mail/form/mail_user.tform.php', $client_id, $params); - return $affected_rows; + $mailuser_id = $this->insertQuery('../mail/form/mail_user.tform.php', $client_id, $params, 'mail:mail_user:on_after_insert'); + return $mailuser_id; } //* Update mail user @@ -234,15 +255,15 @@ class remoting_mail extends remoting { return false; } - //* Check if mail domain exists + //* Check if mail domain exists, and is not used as aliasdomain $email_parts = explode('@', $params['email']); - $tmp = $app->db->queryOneRecord("SELECT domain FROM mail_domain WHERE domain = ?", $email_parts[1]); + $tmp = $app->db->queryOneRecord("SELECT domain FROM mail_domain WHERE domain = ? AND domain NOT IN (SELECT SUBSTR(source,2) FROM mail_forwarding WHERE type = 'aliasdomain')", $email_parts[1]); if($tmp['domain'] != $email_parts[1]) { - throw new SoapFault('mail_domain_does_not_exist', 'Mail domain - '.$email_parts[1].' - does not exist.'); + throw new SoapFault('mail_domain_does_not_exist', 'Mail domain - '.$email_parts[1].' - does not exist as primary.'); 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; } @@ -255,7 +276,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; } @@ -410,7 +431,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; } @@ -432,7 +453,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; } @@ -443,7 +464,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; } @@ -469,7 +490,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; } @@ -481,7 +502,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; } @@ -493,7 +514,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; } @@ -660,7 +681,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')) @@ -760,7 +781,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')) diff --git a/interface/lib/classes/remote.d/server.inc.php b/interface/lib/classes/remote.d/server.inc.php index 77649d1bb4c9385dc26cbfffdc175d79ffb026b0..ba057f3775e92029c8d634d256e0e991b42f30fa 100644 --- a/interface/lib/classes/remote.d/server.inc.php +++ b/interface/lib/classes/remote.d/server.inc.php @@ -105,7 +105,7 @@ class remoting_server extends remoting { $affected_rows = $this->deleteQuery('../admin/form/server_ip.tform.php', $ip_id); return $affected_rows; } - + /** Gets the server configuration @param int session id @@ -141,7 +141,7 @@ class remoting_server extends remoting { return false; } } - + /** Set a value in the server configuration @param int session id @@ -169,7 +169,7 @@ class remoting_server extends remoting { return false; } } - + /** Gets a list of all servers @param int session_id @@ -191,7 +191,7 @@ class remoting_server extends remoting { return false; } } - + /** Gets the server_id by server_name @param int session_id @@ -213,7 +213,7 @@ class remoting_server extends remoting { return false; } } - + /** Gets the functions of a server by server_id @param int session_id @@ -227,7 +227,7 @@ class remoting_server extends remoting { throw new SoapFault('permission_denied', 'You do not have the permissions to access this function.'); return false; } - if (!empty($session_id) && !empty($server_id)) { + if (!empty($session_id) && !empty($server_id)) { $sql = "SELECT mail_server, web_server, dns_server, file_server, db_server, vserver_server, proxy_server, firewall_server, mirror_server_id FROM server WHERE server_id = ?"; $all = $app->db->queryOneRecord($sql, $server_id); return $all; @@ -257,7 +257,7 @@ class remoting_server extends remoting { } } - public function server_get_php_versions($session_id, $server_id, $php) + public function server_get_php_versions($session_id, $server_id, $php, $get_full_data = false) { global $app; if(!$this->checkPerm($session_id, 'server_get')) { @@ -272,15 +272,23 @@ class remoting_server extends remoting { if ($php === 'php-fpm' || ($php === 'hhvm' && $server_type === 'nginx')) { $php_records = $app->db->queryAllRecords("SELECT * FROM server_php WHERE php_fpm_init_script != '' AND php_fpm_ini_dir != '' AND php_fpm_pool_dir != '' AND server_id = ? AND (client_id = 0)", $server_id); foreach ($php_records as $php_record) { - $php_version = $php_record['name'].':'.$php_record['php_fpm_init_script'].':'.$php_record['php_fpm_ini_dir'].':'.$php_record['php_fpm_pool_dir']; - $php_versions[] = $php_version; + if($get_full_data) { + $php_versions[] = $php_record; + } else { + $php_version = $php_record['name'].':'.$php_record['php_fpm_init_script'].':'.$php_record['php_fpm_ini_dir'].':'.$php_record['php_fpm_pool_dir']; + $php_versions[] = $php_version; + } } } if ($php === 'fast-cgi') { $php_records = $app->db->queryAllRecords("SELECT * FROM server_php WHERE php_fastcgi_binary != '' AND php_fastcgi_ini_dir != '' AND server_id = ? AND (client_id = 0)", $server_id); foreach ($php_records as $php_record) { - $php_version = $php_record['name'].':'.$php_record['php_fastcgi_binary'].':'.$php_record['php_fastcgi_ini_dir']; - $php_versions[] = $php_version; + if($get_full_data) { + $php_versions[] = $php_record; + } else { + $php_version = $php_record['name'].':'.$php_record['php_fastcgi_binary'].':'.$php_record['php_fastcgi_ini_dir']; + $php_versions[] = $php_version; + } } } return $php_versions; diff --git a/interface/lib/classes/remote.d/sites.inc.php b/interface/lib/classes/remote.d/sites.inc.php index 59c2e371f34f89a7d25714e610cc7a252b761980..10fc028e645f80b96e2b8461f95894b1b23d9d36 100644 --- a/interface/lib/classes/remote.d/sites.inc.php +++ b/interface/lib/classes/remote.d/sites.inc.php @@ -102,7 +102,7 @@ class remoting_sites extends remoting { $app->remoting_lib->loadFormDef('../sites/form/database.tform.php'); return $app->remoting_lib->getDataRecord($primary_id); } - + /* TODO: secure queries! */ //* Add a record public function sites_database_add($session_id, $client_id, $params) @@ -130,15 +130,17 @@ class remoting_sites extends remoting { $retval = $this->insertQueryExecute($sql, $params); $app->sites_database_plugin->processDatabaseInsert($this); - + // set correct values for backup_interval and backup_copies - if(isset($params['backup_interval']) || isset($params['backup_copies'])){ + if(isset($params['backup_interval']) || isset($params['backup_copies']) || isset($params['backup_format_web']) || isset($params['backup_format_db'])){ $sql_set = array(); if(isset($params['backup_interval'])) $sql_set[] = "backup_interval = '".$app->db->quote($params['backup_interval'])."'"; if(isset($params['backup_copies'])) $sql_set[] = "backup_copies = ".$app->functions->intval($params['backup_copies']); + if(isset($params['backup_format_web'])) $sql_set[] = "backup_format_web = ".$app->functions->intval($params['backup_format_web']); + if(isset($params['backup_format_db'])) $sql_set[] = "backup_format_db = ".$app->functions->intval($params['backup_format_db']); $this->updateQueryExecute("UPDATE web_database SET ".implode(', ', $sql_set)." WHERE database_id = ".$retval, $retval, $params); } - + return $retval; } @@ -163,15 +165,17 @@ class remoting_sites extends remoting { $this->dataRecord = $params; $app->sites_database_plugin->processDatabaseUpdate($this); $retval = $this->updateQueryExecute($sql, $primary_id, $params); - + // set correct values for backup_interval and backup_copies - if(isset($params['backup_interval']) || isset($params['backup_copies'])){ + if(isset($params['backup_interval']) || isset($params['backup_copies']) || isset($params['backup_format_web']) || isset($params['backup_format_db'])){ $sql_set = array(); if(isset($params['backup_interval'])) $sql_set[] = "backup_interval = '".$app->db->quote($params['backup_interval'])."'"; if(isset($params['backup_copies'])) $sql_set[] = "backup_copies = ".$app->functions->intval($params['backup_copies']); + if(isset($params['backup_format_web'])) $sql_set[] = "backup_format_web = ".$app->functions->intval($params['backup_format_web']); + if(isset($params['backup_format_db'])) $sql_set[] = "backup_format_db = ".$app->functions->intval($params['backup_format_db']); $this->updateQueryExecute("UPDATE web_database SET ".implode(', ', $sql_set)." WHERE database_id = ".$primary_id, $primary_id, $params); } - + return $retval; } @@ -423,7 +427,7 @@ class remoting_sites extends remoting { $params['client_group_id'] = $rec['groupid']; } - //* Set a few params to "not empty" values which get overwritten by the sites_web_domain_plugin + //* Set a few params to "not empty" values which get overwritten by the sites_web_vhost_domain_plugin if($params['document_root'] == '') $params['document_root'] = '-'; if($params['system_user'] == '') $params['system_user'] = '-'; if($params['system_group'] == '') $params['system_group'] = '-'; @@ -448,7 +452,7 @@ class remoting_sites extends remoting { throw new SoapFault('permission_denied', 'You do not have the permissions to access this function.'); return false; } - + if($params['log_retention'] == '') $params['log_retention'] = 30; //* Set a few defaults for nginx servers @@ -520,7 +524,7 @@ class remoting_sites extends remoting { throw new SoapFault('permission_denied', 'You do not have the permissions to access this function.'); return false; } - + if($params['log_retention'] == '') $params['log_retention'] = 30; //* Set a few defaults for nginx servers @@ -592,7 +596,7 @@ class remoting_sites extends remoting { throw new SoapFault('permission_denied', 'You do not have the permissions to access this function.'); return false; } - + if($params['log_retention'] == '') $params['log_retention'] = 30; //* Set a few defaults for nginx servers @@ -876,7 +880,7 @@ class remoting_sites extends remoting { $app->remoting_lib->loadFormDef('../sites/form/web_vhost_domain.tform.php'); $params = $app->remoting_lib->getDataRecord($primary_id); $params['active'] = $status; - + $affected_rows = $this->updateQuery('../sites/form/web_vhost_domain.tform.php', 0, $primary_id, $params); return $affected_rows; } else { @@ -901,57 +905,57 @@ class remoting_sites extends remoting { $all = $app->db->queryAllRecords($sql, $client_id); return $all; } - + //** backup functions ----------------------------------------------------------------------------------- public function sites_web_domain_backup_list($session_id, $site_id = null) { global $app; - + if(!$this->checkPerm($session_id, 'sites_web_domain_backup')) { throw new SoapFault('permission_denied', 'You do not have the permissions to access this function.'); return false; } - + $result = $app->db->queryAllRecords("SELECT * FROM web_backup".(($site_id != null)?' WHERE parent_domain_id = ?':''), $site_id); return $result; } - + //* Backup download and restoration by Abdi Joseph public function sites_web_domain_backup($session_id, $primary_id, $action_type) { global $app; - + if(!$this->checkPerm($session_id, 'sites_web_domain_backup')) { throw new SoapFault('permission_denied', 'You do not have the permissions to access this function.'); return false; } - + //*Set variables $backup_record = $app->db->queryOneRecord("SELECT * FROM `web_backup` WHERE `backup_id`= ?", $primary_id); $server_id = $backup_record['server_id']; - + //*Set default action state $action_state = "pending"; $tstamp = time(); - + //* Basic validation of variables if ($server_id <= 0) { throw new SoapFault('invalid_backup_id', "Invalid or non existant backup_id $primary_id"); return false; } - + if ($action_type != 'backup_download' and $action_type != 'backup_restore' and $action_type != 'backup_delete') { throw new SoapFault('invalid_action', "Invalid action_type $action_type"); return false; } - + //* Validate instance $instance_record = $app->db->queryOneRecord("SELECT * FROM `sys_remoteaction` WHERE `action_param`= ? and `action_type`= ? and `action_state`= ?", $primary_id, $action_type, 'pending'); if ($instance_record['action_id'] >= 1) { throw new SoapFault('duplicate_action', "There is already a pending $action_type action"); return false; } - + //* Save the record if ($app->db->query("INSERT INTO `sys_remoteaction` SET `server_id` = ?, `tstamp` = ?, `action_type` = ?, `action_param` = ?, `action_state` = ?", $server_id, $tstamp, $action_type, $primary_id, $action_state)) { return true; @@ -959,64 +963,64 @@ class remoting_sites extends remoting { return false; } } - + //** quota functions ----------------------------------------------------------------------------------- public function quota_get_by_user($session_id, $client_id) { global $app; $app->uses('quota_lib'); - + if(!$this->checkPerm($session_id, 'quota_get_by_user')) { throw new SoapFault('permission_denied', 'You do not have the permissions to access this function.'); return false; } - + return $app->quota_lib->get_quota_data($client_id, false); } - + public function trafficquota_get_by_user($session_id, $client_id, $lastdays = 0) { global $app; $app->uses('quota_lib'); - + if(!$this->checkPerm($session_id, 'trafficquota_get_by_user')) { throw new SoapFault('permission_denied', 'You do not have the permissions to access this function.'); return false; } if ($client_id != null) $client_id = $app->functions->intval($client_id); - + return $app->quota_lib->get_trafficquota_data($client_id, $lastdays); } - + public function ftptrafficquota_data($session_id, $client_id, $lastdays = 0) { global $app; $app->uses('quota_lib'); - + if(!$this->checkPerm($session_id, 'trafficquota_get_by_user')) { throw new SoapFault('permission_denied', 'You do not have the permissions to access this function.'); return false; } if ($client_id != null) $client_id = $app->functions->intval($client_id); - + return $app->quota_lib->get_ftptrafficquota_data($client_id, $lastdays); } - + public function databasequota_get_by_user($session_id, $client_id) { global $app; $app->uses('quota_lib'); - + if(!$this->checkPerm($session_id, 'databasequota_get_by_user')) { throw new SoapFault('permission_denied', 'You do not have the permissions to access this function.'); return false; } - + return $app->quota_lib->get_databasequota_data($client_id, false); } - + // ---------------------------------------------------------------------------------------------------------- //* Get record details @@ -1066,8 +1070,8 @@ class remoting_sites extends remoting { $affected_rows = $this->deleteQuery('../sites/form/webdav_user.tform.php', $primary_id); return $affected_rows; } - - + + } ?> diff --git a/interface/lib/classes/remoting.inc.php b/interface/lib/classes/remoting.inc.php index e1fc1ada863f1cdc02c89a68dafe6f703096dee9..7bd39645af4ca7ae37bab872a651be07268609ac 100644 --- a/interface/lib/classes/remoting.inc.php +++ b/interface/lib/classes/remoting.inc.php @@ -59,11 +59,6 @@ class remoting { $app->uses('remoting_lib'); $this->_methods = $methods; - - /* - $this->app = $app; - $this->conf = $conf; - */ } //* remote login function @@ -72,9 +67,7 @@ class remoting { global $app, $conf; // Maintenance mode - $app->uses('ini_parser,getconf'); - $server_config_array = $app->getconf->get_global_config('misc'); - if($server_config_array['maintenance_mode'] == 'y'){ + if($app->is_under_maintenance()){ throw new SoapFault('maintenance_mode', 'This ISPConfig installation is currently under maintenance. We should be back shortly. Thank you for your patience.'); return false; } @@ -92,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']); @@ -111,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) { @@ -125,23 +138,42 @@ 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, $tstamp)'; - $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 = ? and remote_password = md5(?)"; - $remote_user = $app->db->queryOneRecord($sql, $username, $password); - if($remote_user['remote_userid'] > 0) { + $sql = "SELECT * FROM remote_user WHERE remote_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']) { + $remote_user = null; + } + } 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), (string)$username); + } else { + $remote_user = null; + } + } + if($remote_user && $remote_user['remote_userid'] > 0) { if (trim($remote_user['remote_ips']) != '') { $allowed_ips = explode(',',$remote_user['remote_ips']); - foreach($allowed_ips as $i => $allowed) { - if(!filter_var($allowed, FILTER_VALIDATE_IP)) { + foreach($allowed_ips as $i => $allowed) { + if(!filter_var($allowed, FILTER_VALIDATE_IP)) { // get the ip for a hostname unset($allowed_ips[$i]); $temp=dns_get_record($allowed, DNS_A+DNS_AAAA); @@ -164,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; } @@ -176,18 +208,35 @@ class remoting { if(!$remote_allowed) { throw new SoapFault('login_failed', 'The login is not allowed from '.$_SERVER['REMOTE_ADDR']); 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; } @@ -206,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; @@ -375,22 +424,22 @@ class remoting { //* Load the form definition $app->remoting_lib->loadFormDef($formdef_file); - + //* get old record and merge with params, so only new values have to be set in $params $old_rec = $app->remoting_lib->getDataRecord($primary_id, $client_id); - + foreach ($app->remoting_lib->formDef['fields'] as $fieldName => $fieldConf) { if ($fieldConf['formtype'] === 'PASSWORD' && empty($params[$fieldName])) { unset($old_rec[$fieldName]); } } - + $params = $app->functions->array_merge($old_rec,$params); //* Get the SQL query $sql = $app->remoting_lib->getSQL($params, 'UPDATE', $primary_id); - + // throw new SoapFault('debug', $sql); if($app->remoting_lib->errorMessage != '') { throw new SoapFault('data_processing_error', $app->remoting_lib->errorMessage); @@ -516,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; } @@ -553,7 +651,7 @@ class remoting { return false; } } - + /** Gets a list of all servers @param int session_id diff --git a/interface/lib/classes/remoting_handler_base.inc.php b/interface/lib/classes/remoting_handler_base.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..6393959df8b2c38e5f206f0ab5841a63a397ac4c --- /dev/null +++ b/interface/lib/classes/remoting_handler_base.inc.php @@ -0,0 +1,75 @@ +load('remoting'); + + // load all remoting classes and get their methods + $this->load_remoting_classes(realpath(__DIR__) . '/remote.d/*.inc.php'); + + // load all remoting classes from modules + $this->load_remoting_classes(realpath(__DIR__) . '/../../web/*/lib/classes/remote.d/*.inc.php'); + + // add main methods + $this->methods['login'] = 'remoting'; + $this->methods['logout'] = 'remoting'; + $this->methods['get_function_list'] = 'remoting'; + + // create main class + $this->classes['remoting'] = new remoting(array_keys($this->methods)); + } + + private function load_remoting_classes($glob_pattern) + { + $files = glob($glob_pattern); + + foreach ($files as $file) { + $name = str_replace('.inc.php', '', basename($file)); + $class_name = 'remoting_' . $name; + + include_once $file; + if(class_exists($class_name, false)) { + $this->classes[$class_name] = new $class_name(); + foreach(get_class_methods($this->classes[$class_name]) as $method) { + $this->methods[$method] = $class_name; + } + } + } + } +} diff --git a/interface/lib/classes/remoting_lib.inc.php b/interface/lib/classes/remoting_lib.inc.php index 62ccd506c889002cc99066e8f68ed7998d93528c..c496cb7e2233eb9fa85ad22eed9ce5faaa35b7d5 100644 --- a/interface/lib/classes/remoting_lib.inc.php +++ b/interface/lib/classes/remoting_lib.inc.php @@ -131,7 +131,7 @@ class remoting_lib extends tform_base { $this->sys_userid = $user['userid']; $this->sys_default_group = $user['default_group']; $this->sys_groups = $user['groups']; - // we have to force admin priveliges for the remoting API as some function calls might fail otherwise. + // we have to force admin privileges for the remoting API as some function calls might fail otherwise. if($client_login == false) $_SESSION["s"]["user"]["typ"] = 'admin'; } @@ -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'; @@ -309,6 +309,7 @@ class remoting_lib extends tform_base { $username = $params["username"]; $clear_password = $params["password"]; $language = $params['language']; + $modules = $params['modules']; $client_id = $app->functions->intval($client_id); if(!isset($params['_ispconfig_pw_crypted']) || $params['_ispconfig_pw_crypted'] != 1) $password = $app->auth->crypt_password(stripslashes($clear_password)); @@ -327,8 +328,14 @@ class remoting_lib extends tform_base { $params[] = $language; } + $modulesstring = ''; + if (!empty($modules)) { + $modulesstring = ', modules = ?'; + $params[] = $modules; + } + $params[] = $client_id; - $sql = "UPDATE sys_user set username = ? $pwstring $langstring WHERE client_id = ?"; + $sql = "UPDATE sys_user set username = ? $pwstring $langstring $modulesstring WHERE client_id = ?"; $app->db->query($sql, true, $params); } diff --git a/interface/lib/classes/rest_handler.inc.php b/interface/lib/classes/rest_handler.inc.php index ceaa7c63be32fc95198769c0398a6f46cc1e4b31..ae3e443d48848e924e830e74fc2748ecd0fc8473 100644 --- a/interface/lib/classes/rest_handler.inc.php +++ b/interface/lib/classes/rest_handler.inc.php @@ -30,46 +30,8 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -class ISPConfigRESTHandler { - private $methods = array(); - private $classes = array(); - +class ISPConfigRESTHandler extends ISPConfigRemotingHandlerBase { private $api_version = 1; - - public function __construct() { - global $app; - - // load main remoting file - $app->load('remoting'); - - // load all remote classes and get their methods - $dir = dirname(realpath(__FILE__)) . '/remote.d'; - $d = opendir($dir); - while($f = readdir($d)) { - if($f == '.' || $f == '..') continue; - if(!is_file($dir . '/' . $f) || substr($f, strrpos($f, '.')) != '.php') continue; - - $name = substr($f, 0, strpos($f, '.')); - - include $dir . '/' . $f; - $class_name = 'remoting_' . $name; - if(class_exists($class_name, false)) { - $this->classes[$class_name] = new $class_name(); - foreach(get_class_methods($this->classes[$class_name]) as $method) { - $this->methods[$method] = $class_name; - } - } - } - closedir($d); - - // add main methods - $this->methods['login'] = 'remoting'; - $this->methods['logout'] = 'remoting'; - $this->methods['get_function_list'] = 'remoting'; - - // create main class - $this->classes['remoting'] = new remoting(array_keys($this->methods)); - } private function _return_error($code, $codename, $message) { header('HTTP/1.1 ' . $code . ' ' . $codename); 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/simplepie.inc.php b/interface/lib/classes/simplepie.inc.php index 626e801e426242351a7e29034808486800332ac6..64f4d946f9ae58e8a4d358ce0b246264ab7efd16 100644 --- a/interface/lib/classes/simplepie.inc.php +++ b/interface/lib/classes/simplepie.inc.php @@ -735,7 +735,7 @@ class simplepie * @param string $cache_location This is where you want the cache to be stored. * @param int $cache_duration This is the number of seconds that you want to store the cache file for. */ - function SimplePie($feed_url = null, $cache_location = null, $cache_duration = null) + function __construct($feed_url = null, $cache_location = null, $cache_duration = null) { // Other objects, instances created here so we can set options on them $this->sanitize = new SimplePie_Sanitize; @@ -3165,7 +3165,7 @@ class SimplePie_Item var $feed; var $data = array(); - function SimplePie_Item($feed, $data) + function __construct($feed, $data) { $this->feed = $feed; $this->data = $data; @@ -5789,7 +5789,7 @@ class SimplePie_Source var $item; var $data = array(); - function SimplePie_Source($item, $data) + function __construct($item, $data) { $this->item = $item; $this->data = $data; @@ -6344,7 +6344,7 @@ class SimplePie_Author var $email; // Constructor, used to input the data - function SimplePie_Author($name = null, $link = null, $email = null) + function __construct($name = null, $link = null, $email = null) { $this->name = $name; $this->link = $link; @@ -6402,7 +6402,7 @@ class SimplePie_Category var $label; // Constructor, used to input the data - function SimplePie_Category($term = null, $scheme = null, $label = null) + function __construct($term = null, $scheme = null, $label = null) { $this->term = $term; $this->scheme = $scheme; @@ -6484,7 +6484,7 @@ class SimplePie_Enclosure var $width; // Constructor, used to input the data - function SimplePie_Enclosure($link = null, $type = null, $length = null, $javascript = null, $bitrate = null, $captions = null, $categories = null, $channels = null, $copyright = null, $credits = null, $description = null, $duration = null, $expression = null, $framerate = null, $hashes = null, $height = null, $keywords = null, $lang = null, $medium = null, $player = null, $ratings = null, $restrictions = null, $samplingrate = null, $thumbnails = null, $title = null, $width = null) + function __construct($link = null, $type = null, $length = null, $javascript = null, $bitrate = null, $captions = null, $categories = null, $channels = null, $copyright = null, $credits = null, $description = null, $duration = null, $expression = null, $framerate = null, $hashes = null, $height = null, $keywords = null, $lang = null, $medium = null, $player = null, $ratings = null, $restrictions = null, $samplingrate = null, $thumbnails = null, $title = null, $width = null) { $this->bitrate = $bitrate; $this->captions = $captions; @@ -7419,7 +7419,7 @@ class SimplePie_Caption var $text; // Constructor, used to input the data - function SimplePie_Caption($type = null, $lang = null, $startTime = null, $endTime = null, $text = null) + function __construct($type = null, $lang = null, $startTime = null, $endTime = null, $text = null) { $this->type = $type; $this->lang = $lang; @@ -7503,7 +7503,7 @@ class SimplePie_Credit var $name; // Constructor, used to input the data - function SimplePie_Credit($role = null, $scheme = null, $name = null) + function __construct($role = null, $scheme = null, $name = null) { $this->role = $role; $this->scheme = $scheme; @@ -7560,7 +7560,7 @@ class SimplePie_Copyright var $label; // Constructor, used to input the data - function SimplePie_Copyright($url = null, $label = null) + function __construct($url = null, $label = null) { $this->url = $url; $this->label = $label; @@ -7604,7 +7604,7 @@ class SimplePie_Rating var $value; // Constructor, used to input the data - function SimplePie_Rating($scheme = null, $value = null) + function __construct($scheme = null, $value = null) { $this->scheme = $scheme; $this->value = $value; @@ -7649,7 +7649,7 @@ class SimplePie_Restriction var $value; // Constructor, used to input the data - function SimplePie_Restriction($relationship = null, $type = null, $value = null) + function __construct($relationship = null, $type = null, $value = null) { $this->relationship = $relationship; $this->type = $type; @@ -7715,7 +7715,7 @@ class SimplePie_File var $error; var $method = SIMPLEPIE_FILE_SOURCE_NONE; - function SimplePie_File($url, $timeout = 10, $redirects = 5, $headers = null, $useragent = null, $force_fsockopen = false) + function __construct($url, $timeout = 10, $redirects = 5, $headers = null, $useragent = null, $force_fsockopen = false) { if (class_exists('idna_convert')) { @@ -8036,7 +8036,7 @@ class SimplePie_HTTP_Parser * @access public * @param string $data Input data */ - function SimplePie_HTTP_Parser($data) + function __construct($data) { $this->data = $data; $this->data_length = strlen($this->data); @@ -8512,7 +8512,7 @@ class SimplePie_gzdecode * * @access public */ - function SimplePie_gzdecode($data) + function __construct($data) { $this->compressed_data = $data; $this->compressed_size = strlen($data); @@ -8705,7 +8705,7 @@ class SimplePie_Cache * * @access private */ - function SimplePie_Cache() + function __construct() { trigger_error('Please call SimplePie_Cache::create() instead of the constructor', E_USER_ERROR); } @@ -8743,7 +8743,7 @@ class SimplePie_Cache_File var $extension; var $name; - function SimplePie_Cache_File($location, $filename, $extension) + function __construct($location, $filename, $extension) { $this->location = $location; $this->filename = $filename; @@ -8905,7 +8905,7 @@ class SimplePie_Cache_MySQL extends SimplePie_Cache_DB var $options; var $id; - function SimplePie_Cache_MySQL($mysql_location, $name, $extension) + function __construct($mysql_location, $name, $extension) { $host = $mysql_location->get_host(); if (SimplePie_Misc::stripos($host, 'unix(') === 0 && substr($host, -1) === ')') @@ -11532,7 +11532,7 @@ class SimplePie_Decode_HTML_Entities * @access public * @param string $data Input data */ - function SimplePie_Decode_HTML_Entities($data) + function __construct($data) { $this->data = $data; } @@ -11795,7 +11795,7 @@ class SimplePie_IRI * @param string $iri * @return SimplePie_IRI */ - function SimplePie_IRI($iri) + function __construct($iri) { $iri = (string) $iri; if ($iri !== '') @@ -13184,10 +13184,10 @@ class SimplePie_Parse_Date * * @access private */ - function SimplePie_Parse_Date() + function __construct() { - $this->day_pcre = '(' . implode(array_keys($this->day), '|') . ')'; - $this->month_pcre = '(' . implode(array_keys($this->month), '|') . ')'; + $this->day_pcre = '(' . implode('|', array_keys($this->day)) . ')'; + $this->month_pcre = '(' . implode('|', array_keys($this->month)) . ')'; static $cache; if (!isset($cache[get_class($this)])) @@ -13338,9 +13338,9 @@ class SimplePie_Parse_Date } // Convert the number of seconds to an integer, taking decimals into account - $second = @round($match[6] + $match[7] / @pow(10, strlen($match[7]))); + $second = @round((int)$match[6] + (int)$match[7] / @pow(10, strlen($match[7]))); - return gmmktime($match[4], $match[5], $second, $match[2], $match[3], $match[1]) - $timezone; + return gmmktime((int)$match[4], (int)$match[5], (int)$second, (int)$match[2], (int)$match[3], (int)$match[1]) - $timezone; } else { @@ -13658,7 +13658,7 @@ class SimplePie_Content_Type_Sniffer * @access public * @param SimplePie_Content_Type_Sniffer $file Input file */ - function SimplePie_Content_Type_Sniffer($file) + function __construct($file) { $this->file = $file; } @@ -13990,7 +13990,7 @@ class SimplePie_XML_Declaration_Parser * @access public * @param string $data Input data */ - function SimplePie_XML_Declaration_Parser($data) + function __construct($data) { $this->data = $data; $this->data_length = strlen($this->data); @@ -14259,7 +14259,7 @@ class SimplePie_Locator var $max_checked_feeds = 10; var $content_type_sniffer_class = 'SimplePie_Content_Type_Sniffer'; - function SimplePie_Locator(&$file, $timeout = 10, $useragent = null, $file_class = 'SimplePie_File', $max_checked_feeds = 10, $content_type_sniffer_class = 'SimplePie_Content_Type_Sniffer') + function __construct(&$file, $timeout = 10, $useragent = null, $file_class = 'SimplePie_File', $max_checked_feeds = 10, $content_type_sniffer_class = 'SimplePie_Content_Type_Sniffer') { $this->file =& $file; $this->file_class = $file_class; diff --git a/interface/lib/classes/sites_database_plugin.inc.php b/interface/lib/classes/sites_database_plugin.inc.php index 89cb7ce9c278a649d610a2a8ef4891cafbb47ebd..68421d6083ddd0eafaf56c539bcb040d4917fe2c 100644 --- a/interface/lib/classes/sites_database_plugin.inc.php +++ b/interface/lib/classes/sites_database_plugin.inc.php @@ -45,6 +45,8 @@ class sites_database_plugin { //* The Database user shall be owned by the same group then the website $sys_groupid = $app->functions->intval($web['sys_groupid']); $backup_interval = $web['backup_interval']; + $backup_format_web = $web['backup_format_web']; + $backup_format_db = $web['backup_format_db']; $backup_copies = $app->functions->intval($web['backup_copies']); $sql = "UPDATE web_database SET sys_groupid = ?, backup_interval = ?, backup_copies = ? WHERE database_id = ?"; diff --git a/interface/lib/classes/soap_handler.inc.php b/interface/lib/classes/soap_handler.inc.php index 704e21b20ba282fc45d661dd2d1b78c66981e0ba..16693e12c92e0d032dbe93dca0950cb186150bf1 100644 --- a/interface/lib/classes/soap_handler.inc.php +++ b/interface/lib/classes/soap_handler.inc.php @@ -30,45 +30,7 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -class ISPConfigSoapHandler { - private $methods = array(); - private $classes = array(); - - public function __construct() { - global $app; - - // load main remoting file - $app->load('remoting'); - - // load all remote classes and get their methods - $dir = dirname(realpath(__FILE__)) . '/remote.d'; - $d = opendir($dir); - while($f = readdir($d)) { - if($f == '.' || $f == '..') continue; - if(!is_file($dir . '/' . $f) || substr($f, strrpos($f, '.')) != '.php') continue; - - $name = substr($f, 0, strpos($f, '.')); - - include_once $dir . '/' . $f; - $class_name = 'remoting_' . $name; - if(class_exists($class_name, false)) { - $this->classes[$class_name] = new $class_name(); - foreach(get_class_methods($this->classes[$class_name]) as $method) { - $this->methods[$method] = $class_name; - } - } - } - closedir($d); - - // add main methods - $this->methods['login'] = 'remoting'; - $this->methods['logout'] = 'remoting'; - $this->methods['get_function_list'] = 'remoting'; - - // create main class - $this->classes['remoting'] = new remoting(array_keys($this->methods)); - } - +class ISPConfigSoapHandler extends ISPConfigRemotingHandlerBase { public function __call($method, $params) { if(array_key_exists($method, $this->methods) == false) { throw new SoapFault('invalid_method', 'Method ' . $method . ' does not exist'); diff --git a/interface/lib/classes/system.inc.php b/interface/lib/classes/system.inc.php index 0be2b6b1e9a7c774601c95caf94b5ad12f9282d3..c33137d6c1791fc3b9a77344ffed0b0fb3a0e8fa 100644 --- a/interface/lib/classes/system.inc.php +++ b/interface/lib/classes/system.inc.php @@ -33,12 +33,25 @@ class system { var $client_service = null; private $_last_exec_out = null; private $_last_exec_retcode = null; + private $server_count = null; public function has_service($userid, $service) { global $app; if(!preg_match('/^[a-z]+$/', $service)) $app->error('Invalid service '.$service); + // Check the servers table to see which kinds of servers we actually have enabled. + // simple query cache + if($this->server_count === null) { + $this->server_count = $app->db->queryOneRecord("SELECT SUM(mail_server) as mail, SUM(web_server) AS web, SUM(dns_server) AS dns, SUM(file_server) AS file, + SUM(db_server) AS db, SUM(vserver_server) AS vserver, SUM(proxy_server) AS proxy, SUM(firewall_server) AS firewall, SUM(xmpp_server) AS xmpp + FROM `server` WHERE mirror_server_id = 0"); + } + // Check if we have the service enabled. + if ($this->server_count[$service] == 0) { + return FALSE; + } + if(isset($_SESSION['s']['user']) && $_SESSION['s']['user']['typ'] == 'admin') return true; //* We do not check admin-users // simple query cache @@ -55,29 +68,68 @@ class system { } } + public function is_blacklisted_web_path($path) { + $blacklist = array('bin', 'cgi-bin', 'dev', 'etc', 'home', 'lib', 'lib64', 'log', 'ssl', 'usr', 'var', 'proc', 'net', 'sys', 'srv', 'sbin', 'run'); + + $path = ltrim($path, '/'); + $parts = explode('/', $path); + if(in_array(strtolower($parts[0]), $blacklist, true)) { + return true; + } + + 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; } - + public function last_exec_retcode() { return $this->_last_exec_retcode; } - + public function exec_safe($cmd) { $arg_count = func_num_args(); + $args = func_get_args(); + if($arg_count != substr_count($cmd, '?') + 1) { trigger_error('Placeholder count not matching argument list.', E_USER_WARNING); return false; } if($arg_count > 1) { - $args = func_get_args(); array_shift($args); - + $pos = 0; $a = 0; foreach($args as $value) { $a++; - + $pos = strpos($cmd, '?', $pos); if($pos === false) { break; @@ -87,15 +139,27 @@ class system { $pos += strlen($value); } } - + $this->_last_exec_out = null; $this->_last_exec_retcode = null; return exec($cmd, $this->_last_exec_out, $this->_last_exec_retcode); } - + public function system_safe($cmd) { call_user_func_array(array($this, 'exec_safe'), func_get_args()); return implode("\n", $this->_last_exec_out); - } - + } + + //* Check if a application is installed + public function is_installed($appname) { + $this->exec_safe('which ? 2> /dev/null', $appname); + $out = $this->last_exec_out(); + $returncode = $this->last_exec_retcode(); + if(isset($out[0]) && stristr($out[0], $appname) && $returncode == 0) { + return true; + } else { + return false; + } + } + } //* End Class diff --git a/interface/lib/classes/tform_actions.inc.php b/interface/lib/classes/tform_actions.inc.php index d83ec0d3d78a89bebedb1e1011158ed22aae7b5c..0053be26634e0b8e172d143c48b7eb7653b541de 100644 --- a/interface/lib/classes/tform_actions.inc.php +++ b/interface/lib/classes/tform_actions.inc.php @@ -141,6 +141,8 @@ class tform_actions { $app->tform->datalogSave('UPDATE', $this->id, $this->oldDataRecord, $new_data_record); unset($new_data_record); unset($old_data_record); + + $this->onAfterDatalogSave(); } if($_REQUEST["next_tab"] == '') { @@ -222,6 +224,7 @@ class tform_actions { $new_data_record = $app->tform->getDataRecord($this->id); $app->tform->datalogSave('INSERT', $this->id, array(), $new_data_record); unset($new_data_record); + $this->onAfterDatalogSave(true); } @@ -264,21 +267,19 @@ class tform_actions { } function onBeforeUpdate() { - global $app, $conf; } function onBeforeInsert() { - global $app, $conf; } function onAfterUpdate() { - global $app, $conf; } function onAfterInsert() { - global $app, $conf; } + function onAfterDatalogSave($insert = false) { + } /** * Function called on data insert or update error @@ -297,7 +298,7 @@ class tform_actions { */ function onDelete() { global $app, $conf, $list_def_file, $tform_def_file; - + // Check CSRF Token $app->auth->csrf_token_check('GET'); diff --git a/interface/lib/classes/tform_base.inc.php b/interface/lib/classes/tform_base.inc.php index 15219c5110ff07c256dd5198b69559fb29449ab6..9e22a1e86827d9fec4ca76ce44e0d1941174145c 100644 --- a/interface/lib/classes/tform_base.inc.php +++ b/interface/lib/classes/tform_base.inc.php @@ -152,9 +152,9 @@ class tform_base { $wb = $app->functions->array_merge($wb_global, $wb); } if(isset($wb_global)) unset($wb_global); - + $this->wordbook = $wb; - + $app->plugin->raiseEvent($_SESSION['s']['module']['name'].':'.$app->tform->formDef['name'] . ':on_after_formdef', $this); $this->dateformat = $app->lng('conf_format_dateshort'); @@ -276,7 +276,8 @@ class tform_base { unset($tmp_recordid); $querystring = str_replace("{AUTHSQL}", $this->getAuthSQL('r'), $querystring); - $querystring = preg_replace_callback('@{AUTHSQL::(.+?)}@', create_function('$matches','global $app; $tmp = $app->tform->getAuthSQL("r", $matches[1]); return $tmp;'), $querystring); + //$querystring = preg_replace_callback('@{AUTHSQL::(.+?)}@', create_function('$matches','global $app; $tmp = $app->tform->getAuthSQL("r", $matches[1]); return $tmp;'), $querystring); + $querystring = preg_replace_callback('@{AUTHSQL::(.+?)}@', function($matches) {global $app; $tmp = $app->tform->getAuthSQL("r", $matches[1]); return $tmp;}, $querystring); // Getting the records $tmp_records = $app->db->queryAllRecords($querystring); @@ -323,7 +324,7 @@ class tform_base { return $this->getAuthSQL('r', $matches[1]); } */ - + /** * Get the key => value array of a form filled from a datasource definitiom * @@ -336,15 +337,15 @@ class tform_base { } //* If the parameter 'valuelimit' is set - function applyValueLimit($limit, $values, $current_value = '') { + function applyValueLimit($formtype, $limit, $values, $current_value = '') { global $app; - - // we mas have multiple limits, therefore we explode by ; first + + // we may have multiple limits, therefore we explode by ; first // Example: "system:sites:web_php_options;client:web_php_options" $limits = explode(';',$limit); - - + + foreach($limits as $limit) { $limit_parts = explode(':', $limit); @@ -399,17 +400,30 @@ class tform_base { $tmp_key = $limit_parts[2]; $allowed = $allowed = explode(',',$tmp_conf[$tmp_key]); } - - // add the current value to the allowed array - $allowed[] = $current_value; - - // remove all values that are not allowed - $values_new = array(); - foreach($values as $key => $val) { - if(in_array($key, $allowed)) $values_new[$key] = $val; - } - $values = $values_new; + if($formtype == 'CHECKBOX') { + if(strstr($limit,'force_')) { + // Force the checkbox field to be ticked and enabled + if($allowed[0] == $values[1]) { + $values = 'on'; + } + } else { + // Force the checkbox field to be unchecked and disabled + if($allowed[0] == $values[0]) { + $values = 'off'; + } + } + } else { + // add the current value to the allowed array + $allowed[] = $current_value; + + // remove all values that are not allowed + $values_new = array(); + foreach($values as $key => $val) { + if(in_array($key, $allowed)) $values_new[$key] = $val; + } + $values = $values_new; + } } @@ -438,7 +452,7 @@ class tform_base { $csrf_token = $app->auth->csrf_token_get($this->formDef['name']); $_csrf_id = $csrf_token['csrf_id']; $_csrf_value = $csrf_token['csrf_key']; - + $this->formDef['tabs'][$tab]['fields']['_csrf_id'] = array( 'datatype' => 'VARCHAR', 'formtype' => 'TEXT', @@ -454,7 +468,7 @@ class tform_base { $record['_csrf_id'] = $_csrf_id; $record['_csrf_key'] = $_csrf_value; /* CSRF PROTECTION */ - + $new_record = array(); if($action == 'EDIT') { $record = $this->decode($record, $tab); @@ -479,7 +493,7 @@ class tform_base { // If a limitation for the values is set if(isset($field['valuelimit']) && is_array($field["value"])) { - $field["value"] = $this->applyValueLimit($field['valuelimit'], $field["value"], $val); + $field["value"] = $this->applyValueLimit($field['formtype'], $field['valuelimit'], $field["value"], $val); } switch ($field['formtype']) { @@ -521,8 +535,14 @@ class tform_base { break; case 'CHECKBOX': - $checked = ($val == $field['value'][1])?' CHECKED':''; - $new_record[$key] = "\r\n"; + if($field["value"] == 'off') { + $new_record[$key] = "\r\n"; + } elseif ($field["value"] == 'on') { + $new_record[$key] = "\r\n"; + } else { + $checked = ($val == $field['value'][1])?' CHECKED':''; + $new_record[$key] = "\r\n"; + } break; case 'CHECKBOXARRAY': @@ -541,7 +561,13 @@ class tform_base { if(trim($tvl) == trim($k)) $checked = ' CHECKED'; } // $out .= "\r\n"; - $out .= "
\r\n"; + $out .= ""; + if (isset($field['render_inline']) && $field['render_inline'] == 'n') { + $out .= "
\r\n"; + } + else { + $out .= " \r\n"; + } $elementNo++; } } @@ -589,7 +615,7 @@ class tform_base { $new_record[$key] = $this->_getDateHTML($key, $dt_value); break; - + default: if(isset($record[$key])) { $new_record[$key] = $app->functions->htmlentities($record[$key]); @@ -614,7 +640,7 @@ class tform_base { // If a limitation for the values is set if(isset($field['valuelimit']) && is_array($field["value"])) { - $field["value"] = $this->applyValueLimit($field['valuelimit'], $field["value"], $field['default']); + $field["value"] = $this->applyValueLimit($field['formtype'], $field['valuelimit'], $field["value"], $field['default']); } switch ($field['formtype']) { @@ -651,9 +677,15 @@ class tform_base { break; case 'CHECKBOX': - // $checked = (empty($field["default"]))?'':' CHECKED'; - $checked = ($field["default"] == $field['value'][1])?' CHECKED':''; - $new_record[$key] = "\r\n"; + if($field["value"] == 'off') { + $new_record[$key] = "\r\n"; + } elseif ($field["value"] == 'on') { + $new_record[$key] = "\r\n"; + } else { + // $checked = (empty($field["default"]))?'':' CHECKED'; + $checked = ($field["default"] == $field['value'][1])?' CHECKED':''; + $new_record[$key] = "\r\n"; + } break; case 'CHECKBOXARRAY': @@ -672,7 +704,13 @@ class tform_base { if(trim($tvl) == trim($k)) $checked = ' CHECKED'; } // $out .= "\r\n"; - $out .= "  \r\n"; + $out .= ""; + if (isset($field['render_inline']) && $field['render_inline'] == 'n') { + $out .= "
\r\n"; + } + else { + $out .= " \r\n"; + } $elementNo++; } } @@ -701,7 +739,7 @@ class tform_base { $new_record[$key] = $this->_getDateTimeHTML($key, $dt_value, $display_seconds); break; - + case 'DATE': $dt_value = (isset($field['default'])) ? $field['default'] : 0; @@ -750,7 +788,7 @@ class tform_base { unset($_POST); unset($record); } - + if(isset($_SESSION['_csrf_timeout']) && is_array($_SESSION['_csrf_timeout'])) { $to_unset = array(); foreach($_SESSION['_csrf_timeout'] as $_csrf_id => $timeout) { @@ -767,7 +805,7 @@ class tform_base { } /* CSRF PROTECTION */ } - + $new_record = array(); if(is_array($record)) { foreach($fields as $key => $field) { @@ -933,6 +971,9 @@ class tform_base { case 'STRIPNL': $returnval = str_replace(array("\n","\r"),'', $returnval); break; + case 'NORMALIZEPATH': + $returnval = $app->functions->normalize_path($returnval); + break; default: $this->errorMessage .= "Unknown Filter: ".$filter['type']; break; @@ -1065,6 +1106,29 @@ class tform_base { } unset($error); break; + case 'ISEMAILADDRESS': + $error = false; + if($validator['allowempty'] != 'y') $validator['allowempty'] = 'n'; + if($validator['allowempty'] == 'y' && $field_value == '') { + //* Do nothing + } else { + if(function_exists('filter_var')) { + if(filter_var($field_value, FILTER_VALIDATE_EMAIL) === false) { + $error = true; + } + if ($error) { + $errmsg = $validator['errmsg']; + if(isset($this->wordbook[$errmsg])) { + $this->errorMessage .= $this->wordbook[$errmsg]."
\r\n"; + } else { + $this->errorMessage .= $errmsg."
\r\n"; + } + } + + } else $this->errorMessage .= "function filter_var missing
\r\n"; + } + unset($error); + break; case 'ISINT': if(function_exists('filter_var') && $field_value < PHP_INT_MAX) { //if($field_value != '' && filter_var($field_value, FILTER_VALIDATE_INT, array("options" => array('min_range'=>0))) === false) { @@ -1198,7 +1262,7 @@ class tform_base { } } break; - + case 'ISDATETIME': /* Checks a datetime value against the date format of the current language */ if($validator['allowempty'] != 'y') $validator['allowempty'] = 'n'; @@ -1216,7 +1280,7 @@ class tform_base { } } break; - + case 'RANGE': //* Checks if the value is within the given range or above / below a value //* Range examples: < 10 = ":10", between 2 and 10 = "2:10", above 5 = "5:". @@ -1281,7 +1345,7 @@ class tform_base { $sql_update = ''; $record = $this->encode($record, $tab, true); - + if(($this->primary_id_override > 0)) { $sql_insert_key .= '`'.$this->formDef["db_table_idx"].'`, '; $sql_insert_val .= $this->primary_id_override.", "; @@ -1310,8 +1374,7 @@ class tform_base { $record[$key] = $app->auth->crypt_password(stripslashes($record[$key]),'ISO-8859-1'); $sql_insert_val .= "'".$app->db->quote($record[$key])."', "; } elseif (isset($field['encryption']) && $field['encryption'] == 'MYSQL') { - $tmp = $app->db->queryOneRecord("SELECT PASSWORD(?) as `crypted`", stripslashes($record[$key])); - $record[$key] = $tmp['crypted']; + $record[$key] = $app->db->getPasswordHash($record[$key]); $sql_insert_val .= "'".$app->db->quote($record[$key])."', "; } else { $record[$key] = md5(stripslashes($record[$key])); @@ -1342,8 +1405,7 @@ class tform_base { $record[$key] = $app->auth->crypt_password(stripslashes($record[$key]),'ISO-8859-1'); $sql_update .= "`$key` = '".$app->db->quote($record[$key])."', "; } elseif (isset($field['encryption']) && $field['encryption'] == 'MYSQL') { - $tmp = $app->db->queryOneRecord("SELECT PASSWORD(?) as `crypted`", stripslashes($record[$key])); - $record[$key] = $tmp['crypted']; + $record[$key] = $app->db->getPasswordHash($record[$key]); $sql_update .= "`$key` = '".$app->db->quote($record[$key])."', "; } else { $record[$key] = md5(stripslashes($record[$key])); @@ -1523,7 +1585,7 @@ class tform_base { // Set form title $form_hint = $this->lng($this->formDef["title"]); - if($this->formDef["description"] != '') $form_hint .= '
'.$this->lng($this->formDef["description"]).'
'; + if(isset($this->formDef["description"]) && $this->formDef["description"] != '') $form_hint .= '
'.$this->lng($this->formDef["description"]).'
'; $app->tpl->setVar('form_hint', $form_hint); // Set Wordbook for this form diff --git a/interface/lib/classes/tools_monitor.inc.php b/interface/lib/classes/tools_monitor.inc.php index ce3ffca1eba13e81ab2565eb6665fb0e4da31201..91040174683f42e4f27530ff31cfc9270a45c991 100644 --- a/interface/lib/classes/tools_monitor.inc.php +++ b/interface/lib/classes/tools_monitor.inc.php @@ -184,9 +184,10 @@ class tools_monitor { foreach($data as $key => $value) { if ($key != '') { + $memory = $app->functions->formatBytes($value); $html .= ' ' . $key . ': - ' . $value . ' + ' . $memory . ' '; } } @@ -489,7 +490,7 @@ class tools_monitor { if ($data == '') { $html .= '

'. 'fail2ban is not installed on this server.
' . - 'See more (for debian) here...'. + 'See more (for debian) here...'. '

'; } else { @@ -567,7 +568,7 @@ class tools_monitor { if(isset($record['data'])) { $data = unserialize($record['data']); - $html = nl2br($data['output']); + $html = '
' . htmlspecialchars($data['output']) . '
'; } else { $html = '

'.$app->lng("no_data_mailq_txt").'

'; } diff --git a/interface/lib/classes/tpl.inc.php b/interface/lib/classes/tpl.inc.php index efaf4c072a8ceac226b9fb5d243fdadb4fa0d9f7..977ed0901d1d5c0573cc736208d2f05cc339cc00 100644 --- a/interface/lib/classes/tpl.inc.php +++ b/interface/lib/classes/tpl.inc.php @@ -1121,7 +1121,7 @@ if (!defined('vlibTemplateClassLoaded')) { { array_push($this->_namespace, $varname); $tempvar = count($this->_namespace) - 1; - $retstr = "for (\$_".$tempvar."=0 ; \$_".$tempvar." < count(\$this->_arrvars"; + $retstr = "for (\$_".$tempvar."=0 ; \$_".$tempvar." < \$this->_tpl_count(\$this->_arrvars"; for ($i=0; $i < count($this->_namespace); $i++) { $retstr .= "['".$this->_namespace[$i]."']"; if ($this->_namespace[$i] != $varname) $retstr .= "[\$_".$i."]"; @@ -1461,6 +1461,27 @@ if (!defined('vlibTemplateClassLoaded')) { return $return; } + /** + * Used during in evaled code to replace PHP count function for PHP 8 compatibility + * @var variable to be counted + */ + private function _tpl_count($var) + { + $retvar = 0; + if(isset($var)) { + if(is_array($var)) { + $retvar = count($var); + } elseif(is_null($var)) { + $retvar = 0; + } else { + $retvar = 1; + } + } else { + $retvar = 0; + } + return $retvar; + } + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - The following functions have no use and are included just so that if the user is making use of vlibTemplateCache functions, this doesn't crash when changed to diff --git a/interface/lib/classes/validate_autoresponder.inc.php b/interface/lib/classes/validate_autoresponder.inc.php index 25db68bdd97226ea9be48d3e93c1e064b676666f..48ee3778833f90625d2629b7740c04f192da2678 100755 --- a/interface/lib/classes/validate_autoresponder.inc.php +++ b/interface/lib/classes/validate_autoresponder.inc.php @@ -31,25 +31,11 @@ include_once 'validate_datetime.inc.php'; class validate_autoresponder extends validate_datetime { - function start_date($field_name, $field_value, $validator) - { - global $app; - - // save field value for later use in end_date() - $this->start_date = $field_value; - - if($_POST['autoresponder'] == 'y' && $field_value == '') { - // we need a start date when autoresponder is on - return $app->tform->lng($validator['errmsg']).'
'; - } - } - function end_date($field_name, $field_value, $validator) { global $app; - $start_date = $this->start_date; - //$start_date = $app->tform_actions->dataRecord['autoresponder_start_date']; + $start_date = $app->tform_actions->dataRecord['autoresponder_start_date']; // Parse date $datetimeformat = (isset($app->remoting_lib) ? $app->remoting_lib->datetimeformat : $app->tform->datetimeformat); @@ -60,8 +46,8 @@ class validate_autoresponder extends validate_datetime $start_date_tstamp = mktime($start_date_array['hour'], $start_date_array['minute'], $start_date_array['second'], $start_date_array['month'], $start_date_array['day'], $start_date_array['year']); $end_date_tstamp = mktime($end_date_array['hour'], $end_date_array['minute'], $end_date_array['second'], $end_date_array['month'], $end_date_array['day'], $end_date_array['year']); - // End date has to be > start date - if($end_date_tstamp <= $start_date_tstamp && ($start_date || $field_value)) { + // If both are set, end date has to be > start date + if($start_date && $field_value && $end_date_tstamp <= $start_date_tstamp) { return $app->tform->lng($validator['errmsg']).'
'; } } 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_cron.inc.php b/interface/lib/classes/validate_cron.inc.php index 9a2af803663f84f1b93734890b1da9edf2ee1cb2..888fdd5cb718c2d084aa6db8a49b2851cd03aedd 100644 --- a/interface/lib/classes/validate_cron.inc.php +++ b/interface/lib/classes/validate_cron.inc.php @@ -52,7 +52,7 @@ class validate_cron { if($parsed["scheme"] != "http" && $parsed["scheme"] != "https") return $this->get_error($validator['errmsg']); - if(preg_match("'^([a-z0-9][a-z0-9_\-]{0,62}\.)+([A-Za-z0-9\-]{2,30})$'i", $parsed["host"]) == false) return $this->get_error($validator['errmsg']); + if(preg_match("'^([a-z0-9][a-z0-9_\-]{0,62}\.)+([A-Za-z0-9\-]{2,63})$'i", $parsed["host"]) == false) return $this->get_error($validator['errmsg']); } if(strpos($field_value, "\n") !== false || strpos($field_value, "\r") !== false || strpos($field_value, chr(0)) !== false) { return $this->get_error($validator['errmsg']); diff --git a/interface/lib/classes/validate_datetime.inc.php b/interface/lib/classes/validate_datetime.inc.php index 2cb35f44e99385d5ecdf0ca0cebd1a94d0fff1b7..055c0e25a089d33a4f741a7253bcaf70db2052b9 100755 --- a/interface/lib/classes/validate_datetime.inc.php +++ b/interface/lib/classes/validate_datetime.inc.php @@ -42,7 +42,7 @@ class validate_datetime { if (is_array($field_value) && count($field_value) >= 5) { - $result = array_filter($field_value, create_function('$dt_unit', 'return ($dt_unit > 0);')); + $result = array_filter($field_value, function($dt_unit) {return ($dt_unit > 0);}); return count($result) !== 0; } @@ -86,7 +86,7 @@ class validate_datetime { if(!is_array($field_value)) return 0; $second = 0; - $filtered_values = array_map(create_function('$item', 'return (int)$item;'), $field_value); + $filtered_values = array_map(function($item) {return (int)$item;}, $field_value); extract($filtered_values, EXTR_OVERWRITE); return mktime($hour, $minute, $second, $month, $day, $year); diff --git a/interface/lib/classes/validate_dns.inc.php b/interface/lib/classes/validate_dns.inc.php index 48759286a865b5e9b9b79d1f641a86931aa6fdbf..15d670d84a4162057d19cee22ac38fe1e85361e0 100644 --- a/interface/lib/classes/validate_dns.inc.php +++ b/interface/lib/classes/validate_dns.inc.php @@ -283,33 +283,57 @@ class validate_dns { } return $new_serial; } - - function validate_xfer($field_name, $field_value, $validator) { + + function validate_ip($field_name, $field_value, $validator) { global $app; - + $errorMessage = ''; - + if($validator['allowempty'] != 'y') $validator['allowempty'] = 'n'; if($validator['allowempty'] == 'y' && $field_value == '') { //* Do nothing } elseif ($field_value == 'any') { //* Do nothing } else { - //* Check if its a IPv4 or IPv6 address + //* Check if its a IPv4 or IPv6 address/range if(isset($validator['separator']) && $validator['separator'] != '') { //* When the field may contain several IP addresses, split them by the char defined as separator $field_value_array = explode($validator['separator'], $field_value); } else { $field_value_array[] = $field_value; } + // Check if it's a valid input foreach($field_value_array as $field_value) { - $field_value = trim($field_value); + // Check if the IP is valid without range + $subnet = ''; + $ip = trim($field_value); + if(strpos($ip, '/') !== false) { + list($ip, $subnet) = explode('/', $ip, 2); + $ip = trim($ip); + } if(function_exists('filter_var')) { - if(!filter_var($field_value, FILTER_VALIDATE_IP)) { + if(!filter_var($ip, FILTER_VALIDATE_IP)) { $errmsg = $validator['errmsg']; $errorMessage .= $app->tform->lng($errmsg)."
\r\n"; } } else $this->errorMessage .= "function filter_var missing
\r\n"; + // Check if the range is valid + if ($subnet !== '') { + if (!is_numeric($subnet)) { + $errmsg = $validator['errmsg']; + $errorMessage .= $app->tform->lng($errmsg)."
\r\n"; + } + elseif (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) { + if ($subnet < 1 || $subnet > 128) { + $errmsg = $validator['errmsg']; + $errorMessage .= $app->tform->lng($errmsg)."
\r\n"; + } + } + elseif ($subnet < 1 || $subnet > 32) { + $errmsg = $validator['errmsg']; + $errorMessage .= $app->tform->lng($errmsg)."
\r\n"; + } + } } } return $errorMessage; diff --git a/interface/lib/classes/validate_domain.inc.php b/interface/lib/classes/validate_domain.inc.php index 57187805cf926289f450b31088cf3540b36a7fb8..3555135eae028efd7163769ff41c6e6808500da9 100644 --- a/interface/lib/classes/validate_domain.inc.php +++ b/interface/lib/classes/validate_domain.inc.php @@ -51,7 +51,7 @@ class validate_domain { $result = $this->_check_unique($field_value); if(!$result) return $this->get_error('domain_error_unique'); - + $pattern = '/\.acme\.invalid$/'; if(preg_match($pattern, $field_value)) return $this->get_error('domain_error_acme_invalid'); } @@ -68,7 +68,7 @@ class validate_domain { $result = $this->_check_unique($field_value); if(!$result) return $this->get_error('domain_error_unique'); - + $pattern = '/\.acme\.invalid$/'; if(preg_match($pattern, $field_value)) return $this->get_error('domain_error_acme_invalid'); } @@ -83,7 +83,7 @@ class validate_domain { $result = $this->_check_unique($field_value); if(!$result) return $this->get_error('domain_error_unique'); - + $pattern = '/\.acme\.invalid$/'; if(preg_match($pattern, $field_value)) return $this->get_error('domain_error_acme_invalid'); } @@ -98,7 +98,7 @@ class validate_domain { } else { $check_domain = $_POST['domain']; } - + $app->uses('ini_parser,getconf'); $settings = $app->getconf->get_global_config('domains'); if ($settings['use_domain_module'] == 'y') { @@ -111,30 +111,33 @@ class validate_domain { $result = $this->_check_unique($field_value . '.' . $check_domain, true); if(!$result) return $this->get_error('domain_error_autosub'); } - + /* Check apache directives */ function web_apache_directives($field_name, $field_value, $validator) { global $app; - + if(trim($field_value) != '') { $security_config = $app->getconf->get_security_config('ids'); - + if($security_config['apache_directives_scan_enabled'] == 'yes') { - + // Get blacklist $blacklist_path = '/usr/local/ispconfig/security/apache_directives.blacklist'; if(is_file('/usr/local/ispconfig/security/apache_directives.blacklist.custom')) $blacklist_path = '/usr/local/ispconfig/security/apache_directives.blacklist.custom'; if(!is_file($blacklist_path)) $blacklist_path = realpath(ISPC_ROOT_PATH.'/../security/apache_directives.blacklist'); - + $directives = explode("\n",$field_value); $regex = explode("\n",file_get_contents($blacklist_path)); $blocked = false; $blocked_line = ''; - + if(is_array($directives) && is_array($regex)) { foreach($directives as $directive) { $directive = trim($directive); foreach($regex as $r) { + if(trim($r) == '') { + continue; + } if(preg_match(trim($r),$directive)) { $blocked = true; $blocked_line .= $directive.'
'; @@ -144,31 +147,31 @@ class validate_domain { } } } - + if($blocked === true) { return $this->get_error('apache_directive_blocked_error').' '.$blocked_line; } } - + /* Check nginx directives */ function web_nginx_directives($field_name, $field_value, $validator) { global $app; - + if(trim($field_value) != '') { $security_config = $app->getconf->get_security_config('ids'); - + if($security_config['nginx_directives_scan_enabled'] == 'yes') { - + // Get blacklist $blacklist_path = '/usr/local/ispconfig/security/nginx_directives.blacklist'; if(is_file('/usr/local/ispconfig/security/nginx_directives.blacklist.custom')) $blacklist_path = '/usr/local/ispconfig/security/nginx_directives.blacklist.custom'; if(!is_file($blacklist_path)) $blacklist_path = realpath(ISPC_ROOT_PATH.'/../security/nginx_directives.blacklist'); - + $directives = explode("\n",$field_value); $regex = explode("\n",file_get_contents($blacklist_path)); $blocked = false; $blocked_line = ''; - + if(is_array($directives) && is_array($regex)) { foreach($directives as $directive) { $directive = trim($directive); @@ -182,16 +185,16 @@ class validate_domain { } } } - + if($blocked === true) { return $this->get_error('nginx_directive_blocked_error').' '.$blocked_line; } } - + /* internal validator function to match regexp */ function _regex_validate($domain_name, $allow_wildcard = false) { - $pattern = '/^' . ($allow_wildcard == true ? '(\*\.)?' : '') . '[\w\.\-]{1,255}\.[a-zA-Z0-9\-]{2,30}$/'; + $pattern = '/^' . ($allow_wildcard == true ? '(\*\.)?' : '') . '[\w\.\-]{1,255}\.[a-zA-Z0-9\-]{2,63}$/'; return preg_match($pattern, $domain_name); } @@ -229,8 +232,8 @@ class validate_domain { $domain_params[] = $aliassubdomain['domain']; } } - - + + $qrystr = "SELECT d.domain_id, IF(d.parent_domain_id != 0 AND p.domain_id IS NOT NULL, p.ip_address, d.ip_address) as `ip_address`, IF(d.parent_domain_id != 0 AND p.domain_id IS NOT NULL, p.ipv6_address, d.ipv6_address) as `ipv6_address` FROM `web_domain` as d LEFT JOIN `web_domain` as p ON (p.domain_id = d.parent_domain_id) WHERE (d.domain = ?" . $additional_sql1 . ") AND d.server_id = ? AND d.domain_id != ?" . ($primary_id ? " AND d.parent_domain_id != ?" : ""); $params = array_merge(array($domain_name), $domain_params, array($domain['server_id'], $primary_id, $primary_id)); $checks = $app->db->queryAllRecords($qrystr, true, $params); @@ -242,7 +245,7 @@ class validate_domain { if($domain['ipv6_address'] != '' && $check['ipv6_address'] == $domain['ipv6_address']) return false; } } - + if($only_domain == false) { $qrystr = "SELECT d.domain_id, IF(d.parent_domain_id != 0 AND p.domain_id IS NOT NULL, p.ip_address, d.ip_address) as `ip_address`, IF(d.parent_domain_id != 0 AND p.domain_id IS NOT NULL, p.ipv6_address, d.ipv6_address) as `ipv6_address` FROM `web_domain` as d LEFT JOIN `web_domain` as p ON (p.domain_id = d.parent_domain_id) WHERE (CONCAT(d.subdomain, '.', d.domain) = ?" . $additional_sql2 . ") AND d.server_id = ? AND d.domain_id != ?" . ($primary_id ? " AND d.parent_domain_id != ?" : ""); $params = array_merge(array($domain_name), $domain_params, array($domain['server_id'], $primary_id, $primary_id)); @@ -256,7 +259,7 @@ class validate_domain { } } } - + return true; } @@ -274,6 +277,6 @@ class validate_domain { } return true; // admin may always add wildcard domain } - + } 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 @@ + +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]."
\r\n"; + } else { + return $errmsg."
\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 @@ + +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]."
\r\n"; + } else { + return $errmsg."
\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/classes/validate_password.inc.php b/interface/lib/classes/validate_password.inc.php index a0f6de2e969f3d21fec6546f41f01d5790d07a47..fc7b9698436bc41902bc8ddd3decbcf24c752e7c 100644 --- a/interface/lib/classes/validate_password.inc.php +++ b/interface/lib/classes/validate_password.inc.php @@ -111,10 +111,8 @@ class validate_password { $app->uses('ini_parser,getconf'); $server_config_array = $app->getconf->get_global_config(); - $min_password_strength = 0; - $min_password_length = 5; - if(isset($server_config_array['misc']['min_password_length'])) $min_password_length = $server_config_array['misc']['min_password_length']; - if(isset($server_config_array['misc']['min_password_strength'])) $min_password_strength = $server_config_array['misc']['min_password_strength']; + $min_password_length = $app->auth->get_min_password_length(); + $min_password_strength = $app->auth->get_min_password_strength(); if($min_password_strength > 0) { $lng_text = $app->lng('weak_password_txt'); diff --git a/interface/lib/classes/validate_server_directive_snippets.inc.php b/interface/lib/classes/validate_server_directive_snippets.inc.php new file mode 100755 index 0000000000000000000000000000000000000000..b122f0106e07857e2ceec38cb71c86f8f0ce8684 --- /dev/null +++ b/interface/lib/classes/validate_server_directive_snippets.inc.php @@ -0,0 +1,53 @@ +tform->wordbook[$errmsg])) { + return $app->tform->wordbook[$errmsg]."
\r\n"; + } else { + return $errmsg."
\r\n"; + } + } + + function validate_snippet($field_name, $field_value, $validator) { + global $app; + $id = (isset($app->remoting_lib->dataRecord['directive_snippets_id']))?$app->remoting_lib->dataRecord['directive_snippets_id']:$_POST['id']; + $type=(isset($app->remoting_lib->dataRecord['type']))?$app->remoting_lib->dataRecord['type']:$_POST['type']; + $types = array('apache','nginx','php','proxy'); + if(!in_array($type,$types)) return $this->get_error('directive_snippets_invalid_type'); + $check = $app->db->queryAllRecords('SELECT * FROM directive_snippets WHERE name = ? AND type = ? AND directive_snippets_id != ?', $field_value, $type, $id); + if(!empty($check)) return $this->get_error('directive_snippets_name_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 @@ + +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 3c534f3f2144ec3e1d2af0b45b77f0b33fbf9d74..73e8273cbf042ae8565377c4e0790e0662609bbd 100644 --- a/interface/lib/config.inc.php +++ b/interface/lib/config.inc.php @@ -45,8 +45,8 @@ $revision = str_replace(array('Revision:', '$', ' '), '', $svn_revision); //** Application define('ISPC_APP_TITLE', 'ISPConfig'); -define('ISPC_APP_VERSION', '3.1dev'); -define('DEVSYSTEM', 0); +define('ISPC_APP_VERSION', '3.2dev'); +define('DEVSYSTEM', false); //** Database @@ -105,7 +105,7 @@ define('CLASSES_ROOT', INCLUDE_ROOT.FS_DIV.'classes'); //** Server $conf['app_title'] = ISPC_APP_TITLE; $conf['app_version'] = ISPC_APP_VERSION; -$conf['app_link'] = 'http://www.howtoforge.com/forums/showthread.php?t=26988'; +$conf['app_link'] = 'https://www.howtoforge.com/forums/showthread.php?t=26988'; $conf['modules_available'] = 'admin,mail,sites,monitor,client,dns,help'; $conf['server_id'] = '1'; @@ -128,10 +128,6 @@ $conf['log_file'] = $conf['ispconfig_log_dir'].'/ispconfig.log'; $conf['log_priority'] = 0; // 0 = Debug, 1 = Warning, 2 = Error -//** Allow software package installations -$conf['software_updates_enabled'] = false; - - //** Themes $conf['theme'] = 'default'; $conf['html_content_encoding'] = 'utf-8'; // example: utf-8, iso-8859-1, ... @@ -163,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 25dd92083138df99e34cf3d1f6cb5057af80c3b1..4aa87ee5aa3b5095ab8f4b233811930e515e6921 100644 --- a/interface/lib/lang/ar.lng +++ b/interface/lib/lang/ar.lng @@ -109,8 +109,19 @@ $wb['datalog_status_d_dns_rr'] = 'Delete DNS record'; $wb['datalog_status_i_dns_soa'] = 'Create DNS zone'; $wb['datalog_status_u_dns_soa'] = 'Update DNS zone'; $wb['datalog_status_d_dns_soa'] = 'Delete DNS zone'; +$wb['datalog_status_i_dns_slave'] = 'Create new secondary DNS zone'; +$wb['datalog_status_u_dns_slave'] = 'Update secondary DNS zone'; +$wb['datalog_status_d_dns_slave'] = 'Delete secondary DNS zone'; +$wb['datalog_status_i_firewall'] = 'Create new firewall rule'; +$wb['datalog_status_u_firewall'] = 'Update firewall rule'; +$wb['datalog_status_d_firewall'] = 'Delete firewall rule'; +$wb['datalog_status_u_server'] = 'Update server settings'; +$wb['datalog_status_d_server'] = 'Delete server'; $wb['datalog_status_i_cron'] = 'Create cron job'; $wb['datalog_status_u_cron'] = 'Update cron job'; +$wb['datalog_status_i_server_ip'] = 'Add server IP'; +$wb['datalog_status_u_server_ip'] = 'Update server IP'; +$wb['datalog_status_d_server_ip'] = 'Delete server IP'; $wb['datalog_status_d_cron'] = 'Delete cron job'; $wb['datalog_status_i_mail_get'] = 'Create mail fetcher account'; $wb['datalog_status_u_mail_get'] = 'Update mail fetcher account'; @@ -158,4 +169,9 @@ $wb['datalog_status_d_xmpp_domain'] = 'Delete XMPP domain'; $wb['datalog_status_i_xmpp_user'] = 'Create XMPP user'; $wb['datalog_status_u_xmpp_user'] = 'Update XMPP user'; $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'; +$wb['copy_to_clipboard_txt'] = 'Copy to clipboard'; ?> diff --git a/interface/lib/lang/bg.lng b/interface/lib/lang/bg.lng index ff1e39fe34d9ba526550d6276e425f8d12d9a3a4..67c2b67b6f8cab74042d96a0cab6d4310679c7e3 100644 --- a/interface/lib/lang/bg.lng +++ b/interface/lib/lang/bg.lng @@ -74,88 +74,104 @@ $wb['submit_confirmation'] = 'Наистина ли си съгласен с т $wb['top_menu_mailuser'] = 'Mailuser'; $wb['globalsearch_resultslimit_of_txt'] = 'of'; $wb['globalsearch_resultslimit_results_txt'] = 'results'; -$wb['globalsearch_noresults_text_txt'] = 'No results.'; -$wb['globalsearch_noresults_limit_txt'] = '0 results'; -$wb['globalsearch_searchfield_watermark_txt'] = 'Search'; -$wb['globalsearch_suggestions_text_txt'] = 'Suggestions'; -$wb['global_tabchange_warning_txt'] = 'Changed data in this tab will be changed if you press OK. On cancel they will be discarded.'; -$wb['global_tabchange_discard_txt'] = 'You have unsaved changes in this tab. Changes will be discarded if you continue.'; -$wb['datalog_changes_txt'] = 'The following changes are not yet populated to all servers:'; -$wb['datalog_changes_end_txt'] = 'Storing updates can take up to one minute. Please be patient.'; -$wb['datalog_status_i_web_database'] = 'Create new database'; -$wb['datalog_status_u_web_database'] = 'Update database'; -$wb['datalog_status_d_web_database'] = 'Delete database'; -$wb['datalog_status_i_web_database_user'] = 'Create database user for database'; -$wb['datalog_status_u_web_database_user'] = 'Update database user'; -$wb['datalog_status_d_web_database_user'] = 'Delete database user'; -$wb['datalog_status_i_web_domain'] = 'Create new website'; -$wb['datalog_status_u_web_domain'] = 'Update website settings'; -$wb['datalog_status_d_web_domain'] = 'Delete website'; -$wb['datalog_status_i_ftp_user'] = 'Create FTP user'; -$wb['datalog_status_u_ftp_user'] = 'Update FTP user'; -$wb['datalog_status_d_ftp_user'] = 'Delete FTP user'; -$wb['datalog_status_i_mail_domain'] = 'Create email domain'; -$wb['datalog_status_u_mail_domain'] = 'Update email domain'; -$wb['datalog_status_d_mail_domain'] = 'Delete email domain'; -$wb['datalog_status_i_mail_user'] = 'Create email user'; -$wb['datalog_status_u_mail_user'] = 'Update email user'; -$wb['datalog_status_d_mail_user'] = 'Delete email user'; -$wb['datalog_status_i_mail_forwarding'] = 'Create email address'; -$wb['datalog_status_u_mail_forwarding'] = 'Update email address'; -$wb['datalog_status_d_mail_forwarding'] = 'Delete email address'; -$wb['datalog_status_i_dns_rr'] = 'Create DNS record'; -$wb['datalog_status_u_dns_rr'] = 'Update DNS record'; -$wb['datalog_status_d_dns_rr'] = 'Delete DNS record'; -$wb['datalog_status_i_dns_soa'] = 'Create DNS zone'; -$wb['datalog_status_u_dns_soa'] = 'Update DNS zone'; -$wb['datalog_status_d_dns_soa'] = 'Delete DNS zone'; -$wb['datalog_status_i_cron'] = 'Create cron job'; -$wb['datalog_status_u_cron'] = 'Update cron job'; -$wb['datalog_status_d_cron'] = 'Delete cron job'; -$wb['datalog_status_i_mail_get'] = 'Create mail fetcher account'; -$wb['datalog_status_u_mail_get'] = 'Update mail fetcher account'; -$wb['datalog_status_d_mail_get'] = 'Delete mail fetcher account'; -$wb['datalog_status_i_mail_mailinglist'] = 'Create mailing list'; -$wb['datalog_status_u_mail_mailinglist'] = 'Update mailing list'; -$wb['datalog_status_d_mail_mailinglist'] = 'Delete mailing list'; -$wb['datalog_status_i_shell_user'] = 'Create shell user'; -$wb['datalog_status_u_shell_user'] = 'Update shell user'; -$wb['datalog_status_d_shell_user'] = 'Delete shell user'; -$wb['datalog_status_i_web_folder'] = 'Create folder protection'; -$wb['datalog_status_u_web_folder'] = 'Update folder protection'; -$wb['datalog_status_d_web_folder'] = 'Delete folder protection'; -$wb['datalog_status_i_web_folder_user'] = 'Create folder protection user'; -$wb['datalog_status_u_web_folder_user'] = 'Update folder protection user'; -$wb['datalog_status_d_web_folder_user'] = 'Delete folder protection user'; -$wb['datalog_status_i_spamfilter_users'] = 'Create spam filter settings'; -$wb['datalog_status_u_spamfilter_users'] = 'Update spam filter settings'; -$wb['datalog_status_d_spamfilter_users'] = 'Delete spam filter settings'; -$wb['login_as_txt'] = 'Log in as'; -$wb['no_domain_perm'] = 'You have no permission for this domain.'; -$wb['no_destination_perm'] = 'You have no permission for this destination.'; -$wb['client_you_are_locked'] = 'You have no permission to change any settings.'; -$wb['gender_m_txt'] = 'Mr.'; -$wb['gender_f_txt'] = 'Ms.'; -$wb['client_cannot_be_deleted_because_of_billing_module_txt'] = 'This client has records in the billing module, therefore he cannot be deleted.'; -$wb['yes_txt'] = 'Yes'; -$wb['no_txt'] = 'No'; -$wb['None'] = 'None'; -$wb['strength_1'] = 'Weak'; -$wb['strength_2'] = 'Fair'; -$wb['strength_3'] = 'Good'; -$wb['strength_4'] = 'Strong'; -$wb['strength_5'] = 'Very Strong'; +$wb['globalsearch_noresults_text_txt'] = 'Няма намерени резултати.'; +$wb['globalsearch_noresults_limit_txt'] = '0 резултата'; +$wb['globalsearch_searchfield_watermark_txt'] = 'Търсене'; +$wb['globalsearch_suggestions_text_txt'] = 'Предложения'; +$wb['global_tabchange_warning_txt'] = 'Промените в тази секция бъдат запазени ако натиснете OK. При отмяна ще бъдат отхвърлени.'; +$wb['global_tabchange_discard_txt'] = 'Направили сте промени, които не са запазени. Промените ще бъдат отхвърлени, ако продължите.'; +$wb['datalog_changes_txt'] = 'Следните промени все още не са отразени на всички сървъри:'; +$wb['datalog_changes_end_txt'] = 'Запазването на промените може да отнеме до една минута. Моля, бъдете търпеливи.'; +$wb['datalog_status_i_web_database'] = 'Създай нова база данни'; +$wb['datalog_status_u_web_database'] = 'Обнови база данни'; +$wb['datalog_status_d_web_database'] = 'Изтрий база данни'; +$wb['datalog_status_i_web_database_user'] = 'Създай потребител за база данни'; +$wb['datalog_status_u_web_database_user'] = 'Обнови потребител за база данни'; +$wb['datalog_status_d_web_database_user'] = 'Изтрий потребител за база данни'; +$wb['datalog_status_i_web_domain'] = 'Създай нов уебсайт'; +$wb['datalog_status_u_web_domain'] = 'Обнови уебсайт настройките'; +$wb['datalog_status_d_web_domain'] = 'Изтрий уебсайт'; +$wb['datalog_status_i_ftp_user'] = 'Създай FTP потребител'; +$wb['datalog_status_u_ftp_user'] = 'Обнови FTP потребител'; +$wb['datalog_status_d_ftp_user'] = 'Изтрий FTP потребител'; +$wb['datalog_status_i_mail_domain'] = 'Създай имейл домейн'; +$wb['datalog_status_u_mail_domain'] = 'Обнови имейл домейн'; +$wb['datalog_status_d_mail_domain'] = 'Изтрий имейл домейн'; +$wb['datalog_status_i_mail_user'] = 'Създай имейл потребител'; +$wb['datalog_status_u_mail_user'] = 'Обнови имейл потребител'; +$wb['datalog_status_d_mail_user'] = 'Изтрий имейл потребител'; +$wb['datalog_status_i_mail_forwarding'] = 'Създай имейл адрес'; +$wb['datalog_status_u_mail_forwarding'] = 'Обнови имейл адрес'; +$wb['datalog_status_d_mail_forwarding'] = 'Изтрий имейл адрес'; +$wb['datalog_status_i_dns_rr'] = 'Създай DNS запис'; +$wb['datalog_status_u_dns_rr'] = 'Обнови DNS запис'; +$wb['datalog_status_d_dns_rr'] = 'Изтрий DNS запис'; +$wb['datalog_status_i_dns_soa'] = 'Създай DNS зона'; +$wb['datalog_status_u_dns_soa'] = 'Обнови DNS зона'; +$wb['datalog_status_d_dns_soa'] = 'Изтрий DNS зона'; +$wb['datalog_status_i_dns_slave'] = 'Create new secondary DNS zone'; +$wb['datalog_status_u_dns_slave'] = 'Update secondary DNS zone'; +$wb['datalog_status_d_dns_slave'] = 'Delete secondary DNS zone'; +$wb['datalog_status_i_firewall'] = 'Create new firewall rule'; +$wb['datalog_status_u_firewall'] = 'Update firewall rule'; +$wb['datalog_status_d_firewall'] = 'Delete firewall rule'; +$wb['datalog_status_u_server'] = 'Update server settings'; +$wb['datalog_status_d_server'] = 'Delete server'; +$wb['datalog_status_i_cron'] = 'Създай автоматична задача'; +$wb['datalog_status_u_cron'] = 'Обнови автоматична задача'; +$wb['datalog_status_i_server_ip'] = 'Add server IP'; +$wb['datalog_status_u_server_ip'] = 'Update server IP'; +$wb['datalog_status_d_server_ip'] = 'Delete server IP'; +$wb['datalog_status_d_cron'] = 'Изтрий автоматична задача'; +$wb['datalog_status_i_mail_get'] = 'Създай имейл акаунт за извличане на поща'; +$wb['datalog_status_u_mail_get'] = 'Обнови имейл акаунт за извличане на поща'; +$wb['datalog_status_d_mail_get'] = 'Изтрий имейл акаунт за извличане на поща'; +$wb['datalog_status_i_mail_mailinglist'] = 'Създай пощенски списък'; +$wb['datalog_status_u_mail_mailinglist'] = 'Обнови пощенски списък'; +$wb['datalog_status_d_mail_mailinglist'] = 'Изтрий пощенски списък'; +$wb['datalog_status_i_shell_user'] = 'Създай shell потребител'; +$wb['datalog_status_u_shell_user'] = 'Обнови shell потребител'; +$wb['datalog_status_d_shell_user'] = 'Изтрий shell потребител'; +$wb['datalog_status_i_web_folder'] = 'Създай защитена директория'; +$wb['datalog_status_u_web_folder'] = 'Обнови защитена директория'; +$wb['datalog_status_d_web_folder'] = 'Изтрий защитена директория'; +$wb['datalog_status_i_web_folder_user'] = 'Създай потребител за защитена директория'; +$wb['datalog_status_u_web_folder_user'] = 'Обнови потребител за защитена директория'; +$wb['datalog_status_d_web_folder_user'] = 'Изтрий потребител за защитена директория'; +$wb['datalog_status_i_spamfilter_users'] = 'Създай спам филтър настройки'; +$wb['datalog_status_u_spamfilter_users'] = 'Обнови спам филтър настройки'; +$wb['datalog_status_d_spamfilter_users'] = 'Изтрий спам филтър настройки'; +$wb['login_as_txt'] = 'Логнат като'; +$wb['no_domain_perm'] = 'Нямате права върху този домейн.'; +$wb['no_destination_perm'] = 'Нямате права върху тази дестинация.'; +$wb['client_you_are_locked'] = 'Нямате права да променяте каквито и да било настройки.'; +$wb['gender_m_txt'] = 'Г-н'; +$wb['gender_f_txt'] = 'Г-жа'; +$wb['client_cannot_be_deleted_because_of_billing_module_txt'] = 'Този клиент не може да бъде изтрит, тъй като за него съществуват записи в билинг системата.'; +$wb['yes_txt'] = 'Да'; +$wb['no_txt'] = 'Не'; +$wb['None'] = 'Без'; +$wb['strength_1'] = 'Слаба'; +$wb['strength_2'] = 'Лесна'; +$wb['strength_3'] = 'Добра'; +$wb['strength_4'] = 'Сложна'; +$wb['strength_5'] = 'Много сложна'; $wb['weak_password_txt'] = 'The chosen password does not match the security guidelines. It has to be at least {chars} chars in length and have a strength of \\"{strength}\\".'; $wb['weak_password_length_txt'] = 'The chosen password does not match the security guidelines. It has to be at least {chars} chars in length.'; $wb['security_check1_txt'] = 'Check for security permission:'; $wb['security_check2_txt'] = 'failed.'; -$wb['err_csrf_attempt_blocked'] = 'CSRF attempt blocked.'; -$wb['select_directive_snippet_txt'] = 'Directive Snippets'; -$wb['select_master_directive_snippet_txt'] = 'Master Directive Snippets'; -$wb['datalog_status_i_xmpp_domain'] = 'Create XMPP domain'; -$wb['datalog_status_u_xmpp_domain'] = 'Update XMPP domain'; -$wb['datalog_status_d_xmpp_domain'] = 'Delete XMPP domain'; -$wb['datalog_status_i_xmpp_user'] = 'Create XMPP user'; -$wb['datalog_status_u_xmpp_user'] = 'Update XMPP user'; -$wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user'; +$wb['err_csrf_attempt_blocked'] = 'CSRF опитът е блокиран.'; +$wb['select_directive_snippet_txt'] = 'Извлечения от директивите'; +$wb['select_master_directive_snippet_txt'] = 'Мастър Извлечения от директивите'; +$wb['datalog_status_i_xmpp_domain'] = 'Създай XMPP домейн'; +$wb['datalog_status_u_xmpp_domain'] = 'Обнови XMPP домейн'; +$wb['datalog_status_d_xmpp_domain'] = 'Изтрий XMPP домейн'; +$wb['datalog_status_i_xmpp_user'] = 'Създай XMPP потребител'; +$wb['datalog_status_u_xmpp_user'] = 'Обнови XMPP потребител'; +$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'; +$wb['copy_to_clipboard_txt'] = 'Copy to clipboard'; ?> diff --git a/interface/lib/lang/br.lng b/interface/lib/lang/br.lng index 60a0dcf9109eab72c233cbf2be1309f1bf0679b1..02f4697deeb4a34dc94a71989ba7723a44355ce2 100644 --- a/interface/lib/lang/br.lng +++ b/interface/lib/lang/br.lng @@ -11,10 +11,10 @@ $wb['number_format_dec_point'] = '.'; $wb['number_format_thousands_sep'] = '.'; $wb['error_301'] = 'Módulo não permitido para o usuário atual.'; $wb['error_302'] = 'Módulo inválido.'; -$wb['error_1001'] = 'Usuário e/ou senha está em branco!'; -$wb['error_1002'] = 'Usuário e/ou senha incorretos!'; +$wb['error_1001'] = 'Usuário e/ou senha está vazio!'; +$wb['error_1002'] = 'Usuário e/ou senha incorreto!'; $wb['error_1003'] = 'Usuário desabilitado!'; -$wb['delete_confirmation'] = 'Você tem certeza que deseja remover o registro?'; +$wb['delete_confirmation'] = 'Você tem certeza que deseja remover este registro?'; $wb['error_no_view_permission'] = 'Você não tem permissão para visualizar este registro ou o registro não existe!'; $wb['error_no_delete_permission'] = 'Você não tem permissão para remover este registro!'; $wb['page_txt'] = 'Página'; @@ -29,14 +29,14 @@ $wb['btn_save_txt'] = 'Salvar'; $wb['btn_cancel_txt'] = 'Cancelar'; $wb['top_menu_system'] = 'Sistema'; $wb['top_menu_client'] = 'Clientes'; -$wb['top_menu_email'] = 'e-Mail'; +$wb['top_menu_email'] = 'eMail'; $wb['top_menu_monitor'] = 'Monitor'; $wb['top_menu_sites'] = 'Sites'; $wb['top_menu_dns'] = 'DNS'; $wb['top_menu_tools'] = 'Ferramentas'; $wb['top_menu_help'] = 'Ajuda'; $wb['top_menu_billing'] = 'Faturamento'; -$wb['top_menu_mailuser'] = 'Contas de e-mail'; +$wb['top_menu_mailuser'] = 'Contas de email'; $wb['top_menu_domain'] = 'Domínios'; $wb['top_menu_dashboard'] = 'Início'; $wb['top_menu_vm'] = 'VPS'; @@ -78,69 +78,80 @@ $wb['globalsearch_noresults_text_txt'] = 'Sem resultados.'; $wb['globalsearch_noresults_limit_txt'] = '0 resultados'; $wb['globalsearch_searchfield_watermark_txt'] = 'Pesquisar'; $wb['globalsearch_suggestions_text_txt'] = 'Sugestões'; -$wb['global_tabchange_warning_txt'] = 'Para alterar dados nesta aba clique OK. Cancelar descarta todas as alterações.'; -$wb['global_tabchange_discard_txt'] = 'Você não salvou as alterações nesta aba. Todas as alterações serão descartadas caso prossiga.'; -$wb['datalog_changes_txt'] = 'As alterações ainda não propagaram em todos os servidores:'; -$wb['datalog_changes_end_txt'] = 'Gravar alterações pode levar alguns minutos. Por favor, seja paciente.'; +$wb['global_tabchange_warning_txt'] = 'Para modificar dados nesta aba clique OK. Cancelar descarta todas as modificações.'; +$wb['global_tabchange_discard_txt'] = 'Você não salvou as modificações nesta aba. Todas as modificações serão descartadas caso prossiga.'; +$wb['datalog_changes_txt'] = 'As modificações ainda não propagaram em todos os servidores:'; +$wb['datalog_changes_end_txt'] = 'Gravar modificações pode levar alguns minutos. Por favor, seja paciente.'; $wb['datalog_status_i_web_database'] = 'Adicionar novo banco de dados'; $wb['datalog_status_u_web_database'] = 'Atualizar banco de dados'; $wb['datalog_status_d_web_database'] = 'Remover banco de dados'; -$wb['datalog_status_i_web_database_user'] = 'Adicionar novo usuário de banco de dados'; -$wb['datalog_status_u_web_database_user'] = 'Atualizar usuário de banco de dados'; -$wb['datalog_status_d_web_database_user'] = 'Remover usuário de banco de dados'; +$wb['datalog_status_i_web_database_user'] = 'Adicionar novo usuário do Banco de Dados'; +$wb['datalog_status_u_web_database_user'] = 'Atualizar usuário do Banco de Dados'; +$wb['datalog_status_d_web_database_user'] = 'Remover usuário do Banco de Dados'; $wb['datalog_status_i_web_domain'] = 'Adicionar site'; $wb['datalog_status_u_web_domain'] = 'Atualizar site'; $wb['datalog_status_d_web_domain'] = 'Remover site'; -$wb['datalog_status_i_ftp_user'] = 'Adicionar usuário ftp'; -$wb['datalog_status_u_ftp_user'] = 'Atualizar usuário ftp'; -$wb['datalog_status_d_ftp_user'] = 'Remover usuário ftp'; -$wb['datalog_status_i_mail_domain'] = 'Adicionar domínio de e-mail'; -$wb['datalog_status_u_mail_domain'] = 'Atualizar domínio de e-mail'; -$wb['datalog_status_d_mail_domain'] = 'Remover domínio de e-mail'; -$wb['datalog_status_i_mail_user'] = 'Adicionar conta de e-mail'; -$wb['datalog_status_u_mail_user'] = 'Atualizar conta de e-mail'; -$wb['datalog_status_d_mail_user'] = 'Remover conta de e-mail'; +$wb['datalog_status_i_ftp_user'] = 'Adicionar usuário FTP'; +$wb['datalog_status_u_ftp_user'] = 'Atualizar usuário FTP'; +$wb['datalog_status_d_ftp_user'] = 'Remover usuário FTP'; +$wb['datalog_status_i_mail_domain'] = 'Adicionar domínio de email'; +$wb['datalog_status_u_mail_domain'] = 'Atualizar domínio de email'; +$wb['datalog_status_d_mail_domain'] = 'Remover domínio de email'; +$wb['datalog_status_i_mail_user'] = 'Adicionar conta de email'; +$wb['datalog_status_u_mail_user'] = 'Atualizar conta de email'; +$wb['datalog_status_d_mail_user'] = 'Remover conta de email'; $wb['datalog_status_i_spamfilter_users'] = 'Adicionar filtros anti-spam'; $wb['datalog_status_u_spamfilter_users'] = 'Atualizar filtros anti-spam'; $wb['datalog_status_d_spamfilter_users'] = 'Remover filtros anti-spam'; -$wb['datalog_status_i_mail_forwarding'] = 'Adicionar endereço de e-mail'; -$wb['datalog_status_u_mail_forwarding'] = 'Atualizar endereço de e-mail'; -$wb['datalog_status_d_mail_forwarding'] = 'Remover endereço de e-mail'; -$wb['datalog_status_i_dns_rr'] = 'Adicionar registro dns'; -$wb['datalog_status_u_dns_rr'] = 'Atualizar registro dns'; -$wb['datalog_status_d_dns_rr'] = 'Remover registro dns'; -$wb['datalog_status_i_dns_soa'] = 'Adicionar zona dns'; -$wb['datalog_status_u_dns_soa'] = 'Atualizar zona dns'; -$wb['datalog_status_d_dns_soa'] = 'Remover zona dns'; -$wb['datalog_status_i_cron'] = 'Adicionar tarefa no cron'; -$wb['datalog_status_u_cron'] = 'Atualizar tarefa no cron'; -$wb['datalog_status_d_cron'] = 'Remover tarefa no cron'; -$wb['datalog_status_i_mail_get'] = 'Adicionar conta de busca de e-mail'; -$wb['datalog_status_u_mail_get'] = 'Atualizar conta de busca de e-mail'; -$wb['datalog_status_d_mail_get'] = 'Remover conta de busca de e-mail'; -$wb['datalog_status_i_mail_mailinglist'] = 'Adicionar lista de e-mails'; -$wb['datalog_status_u_mail_mailinglist'] = 'Atualizar lista de e-mails'; -$wb['datalog_status_d_mail_mailinglist'] = 'Remover lista de e-mails'; -$wb['datalog_status_i_shell_user'] = 'Adicionar usuário do shell'; -$wb['datalog_status_u_shell_user'] = 'Atualizar usuário do shell'; -$wb['datalog_status_d_shell_user'] = 'Remover usuário do shell'; -$wb['datalog_status_i_web_folder'] = 'Adicionar pasta protegida'; -$wb['datalog_status_u_web_folder'] = 'Atualizar pasta protegida'; -$wb['datalog_status_d_web_folder'] = 'Remover pasta protegida'; -$wb['datalog_status_i_web_folder_user'] = 'Adicionar usuário de pasta protegida'; -$wb['datalog_status_u_web_folder_user'] = 'Atualizar usuário de pasta protegida'; -$wb['datalog_status_d_web_folder_user'] = 'Remover usuário de pasta protegida'; -$wb['datalog_status_i_xmpp_domain'] = 'Adicionar domínio xmpp'; -$wb['datalog_status_u_xmpp_domain'] = 'Atualizar domínio xmpp'; -$wb['datalog_status_d_xmpp_domain'] = 'Remover domínio xmpp'; -$wb['datalog_status_i_xmpp_user'] = 'Adicionar usuário xmpp'; -$wb['datalog_status_u_xmpp_user'] = 'Atualizar usuário xmpp'; -$wb['datalog_status_d_xmpp_user'] = 'Remover usuário xmpp'; +$wb['datalog_status_i_mail_forwarding'] = 'Adicionar endereço de email'; +$wb['datalog_status_u_mail_forwarding'] = 'Atualizar endereço de email'; +$wb['datalog_status_d_mail_forwarding'] = 'Remover endereço de email'; +$wb['datalog_status_i_dns_rr'] = 'Adicionar registro DNS'; +$wb['datalog_status_u_dns_rr'] = 'Atualizar registro DNS'; +$wb['datalog_status_d_dns_rr'] = 'Remover registro DNS'; +$wb['datalog_status_i_dns_soa'] = 'Adicionar zona DNS'; +$wb['datalog_status_u_dns_soa'] = 'Atualizar zona DNS'; +$wb['datalog_status_d_dns_soa'] = 'Remover zona DNS'; +$wb['datalog_status_i_dns_slave'] = 'Adicionar nova zona DNS secundária'; +$wb['datalog_status_u_dns_slave'] = 'Atualizar zona DNS secundária'; +$wb['datalog_status_d_dns_slave'] = 'Remover zona DNS secundária'; +$wb['datalog_status_i_firewall'] = 'Adicionar nova regra de Firewall'; +$wb['datalog_status_u_firewall'] = 'Atualizar regra de Firewall'; +$wb['datalog_status_d_firewall'] = 'Remover regra de Firewall'; +$wb['datalog_status_u_server'] = 'Atualizar configurações do servidor'; +$wb['datalog_status_d_server'] = 'Remover servidor'; +$wb['datalog_status_i_cron'] = 'Adicionar tarefa no Cron'; +$wb['datalog_status_u_cron'] = 'Atualizar tarefa no Cron'; +$wb['datalog_status_i_server_ip'] = 'Add server IP'; +$wb['datalog_status_u_server_ip'] = 'Update server IP'; +$wb['datalog_status_d_server_ip'] = 'Delete server IP'; +$wb['datalog_status_d_cron'] = 'Remover tarefa no Cron'; +$wb['datalog_status_i_mail_get'] = 'Adicionar conta de busca de emails'; +$wb['datalog_status_u_mail_get'] = 'Atualizar conta de busca de emails'; +$wb['datalog_status_d_mail_get'] = 'Remover conta de busca de emails'; +$wb['datalog_status_i_mail_mailinglist'] = 'Adicionar lista de emails'; +$wb['datalog_status_u_mail_mailinglist'] = 'Atualizar lista de emails'; +$wb['datalog_status_d_mail_mailinglist'] = 'Remover lista de emails'; +$wb['datalog_status_i_shell_user'] = 'Adicionar usuário Shell'; +$wb['datalog_status_u_shell_user'] = 'Atualizar usuário Shell'; +$wb['datalog_status_d_shell_user'] = 'Remover usuário Shell'; +$wb['datalog_status_i_web_folder'] = 'Adicionar pasta Web'; +$wb['datalog_status_u_web_folder'] = 'Atualizar pasta Web'; +$wb['datalog_status_d_web_folder'] = 'Remover pasta Web'; +$wb['datalog_status_i_web_folder_user'] = 'Adicionar usuário de pasta Web'; +$wb['datalog_status_u_web_folder_user'] = 'Atualizar usuário de pasta Web'; +$wb['datalog_status_d_web_folder_user'] = 'Remover usuário de pasta Web'; +$wb['datalog_status_i_xmpp_domain'] = 'Adicionar domínio XMPP'; +$wb['datalog_status_u_xmpp_domain'] = 'Atualizar domínio XMPP'; +$wb['datalog_status_d_xmpp_domain'] = 'Remover domínio XMPP'; +$wb['datalog_status_i_xmpp_user'] = 'Adicionar usuário XMPP'; +$wb['datalog_status_u_xmpp_user'] = 'Atualizar usuário XMPP'; +$wb['datalog_status_d_xmpp_user'] = 'Remover usuário XMPP'; $wb['err_csrf_attempt_blocked'] = 'Tentativa de CSRF bloqueada.'; $wb['login_as_txt'] = 'Acessar como'; $wb['no_domain_perm'] = 'Você não tem permissão para este domínio.'; $wb['no_destination_perm'] = 'Você não tem permissão para este destino.'; -$wb['client_you_are_locked'] = 'Você não tem permissão para alterar nenhuma configuração.'; +$wb['client_you_are_locked'] = 'Você não tem permissão para modificar qualquer configuração.'; $wb['gender_m_txt'] = 'Sr.'; $wb['gender_f_txt'] = 'Sra.'; $wb['client_cannot_be_deleted_because_of_billing_module_txt'] = 'Este cliente possui registros no módulo de faturamento, portanto não pode ser removido.'; @@ -152,10 +163,15 @@ $wb['strength_2'] = 'Razoável'; $wb['strength_3'] = 'Boa'; $wb['strength_4'] = 'Forte'; $wb['strength_5'] = 'Muito Forte'; -$wb['weak_password_txt'] = 'A senha configurada não obedece as diretivas de segurança. A senha deve possuir ao menos {chars} caracteres e ao menos um caractere maiúsculoe um caractere especial e dificuldade "{strength}".'; +$wb['weak_password_txt'] = 'A senha configurada não obedece as diretivas de segurança. A senha deve possuir ao menos {chars} caracteres e ao menos um caractere maiúsculo e um caractere especial e dificuldade "{strength}".'; $wb['weak_password_length_txt'] = 'A senha configurada não obedece as diretivas de segurança. A senha deve possuir ao menos {chars} de comprimento.'; $wb['security_check1_txt'] = 'Verifique as permissões de segurança:'; $wb['security_check2_txt'] = 'falhou.'; $wb['select_directive_snippet_txt'] = 'Diretiva de trechos de código'; $wb['select_master_directive_snippet_txt'] = 'Diretiva mestre de trechos de código'; +$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'; +$wb['copy_to_clipboard_txt'] = 'Copy to clipboard'; ?> diff --git a/interface/lib/lang/ca.lng b/interface/lib/lang/ca.lng index c39cd0db272fcd0861f0fad0b5d448a6a119c202..0aa69997e543e3fe4f1c576310343bb6fdf5028a 100644 --- a/interface/lib/lang/ca.lng +++ b/interface/lib/lang/ca.lng @@ -112,8 +112,19 @@ $wb['datalog_status_d_dns_rr'] = 'Supprimer un enregistrement DNS'; $wb['datalog_status_i_dns_soa'] = 'Créer une zone DNS'; $wb['datalog_status_u_dns_soa'] = 'Modifier une zone DNS'; $wb['datalog_status_d_dns_soa'] = 'Supprimer une zone DNS'; +$wb['datalog_status_i_dns_slave'] = 'Create new secondary DNS zone'; +$wb['datalog_status_u_dns_slave'] = 'Update secondary DNS zone'; +$wb['datalog_status_d_dns_slave'] = 'Delete secondary DNS zone'; +$wb['datalog_status_i_firewall'] = 'Create new firewall rule'; +$wb['datalog_status_u_firewall'] = 'Update firewall rule'; +$wb['datalog_status_d_firewall'] = 'Delete firewall rule'; +$wb['datalog_status_u_server'] = 'Update server settings'; +$wb['datalog_status_d_server'] = 'Delete server'; $wb['datalog_status_i_cron'] = 'Créer une tâche cron'; $wb['datalog_status_u_cron'] = 'Modifier une tâche cron'; +$wb['datalog_status_i_server_ip'] = 'Add server IP'; +$wb['datalog_status_u_server_ip'] = 'Update server IP'; +$wb['datalog_status_d_server_ip'] = 'Delete server IP'; $wb['datalog_status_d_cron'] = 'Supprimer une tâche cron'; $wb['datalog_status_i_mail_get'] = 'Créer un compte mail récupérateur'; $wb['datalog_status_u_mail_get'] = 'Modifier un compte mail récupérateur'; @@ -158,4 +169,9 @@ $wb['datalog_status_d_xmpp_domain'] = 'Delete XMPP domain'; $wb['datalog_status_i_xmpp_user'] = 'Create XMPP user'; $wb['datalog_status_u_xmpp_user'] = 'Update XMPP user'; $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'; +$wb['non_admin_error'] = 'Requires administrator level permissions'; +$wb['copy_to_clipboard_txt'] = 'Copy to clipboard'; ?> diff --git a/interface/lib/lang/cz.lng b/interface/lib/lang/cz.lng index eeb0819292eac0260fbfdc5121b8c5a252640a73..1eccd3c8e58331dacddc1d05852f694a911f2a6b 100644 --- a/interface/lib/lang/cz.lng +++ b/interface/lib/lang/cz.lng @@ -28,7 +28,7 @@ $wb['btn_save_txt'] = 'Uložit'; $wb['btn_cancel_txt'] = 'Zrušit'; $wb['top_menu_system'] = 'Systém'; $wb['top_menu_client'] = 'Klienti'; -$wb['top_menu_email'] = 'E-mail'; +$wb['top_menu_email'] = 'Pošta'; $wb['top_menu_monitor'] = 'Monitor'; $wb['top_menu_sites'] = 'Stránky'; $wb['top_menu_dns'] = 'DNS'; @@ -112,8 +112,19 @@ $wb['datalog_status_d_dns_rr'] = 'Odstranění DNS záznamu'; $wb['datalog_status_i_dns_soa'] = 'Vytvoření DNS zóny'; $wb['datalog_status_u_dns_soa'] = 'Aktualizace nastavení DNS zóny'; $wb['datalog_status_d_dns_soa'] = 'Odstranění DNS zóny'; +$wb['datalog_status_i_dns_slave'] = 'Vytvořit sekundární DNS zonu'; +$wb['datalog_status_u_dns_slave'] = 'Aktualizovat sekundární DNS zonu'; +$wb['datalog_status_d_dns_slave'] = 'Smazat sekundární DNS zonu'; +$wb['datalog_status_i_firewall'] = 'Vytvořit pravidlo firewallu'; +$wb['datalog_status_u_firewall'] = 'Aktualizovat pravidlo firewallu'; +$wb['datalog_status_d_firewall'] = 'Smazat pravidlo firewallu'; +$wb['datalog_status_u_server'] = 'Update server settings'; +$wb['datalog_status_d_server'] = 'Delete server'; $wb['datalog_status_i_cron'] = 'Vytvoření shell uživatele'; $wb['datalog_status_u_cron'] = 'Aktualizace nastavení shell uživatele'; +$wb['datalog_status_i_server_ip'] = 'Add server IP'; +$wb['datalog_status_u_server_ip'] = 'Update server IP'; +$wb['datalog_status_d_server_ip'] = 'Delete server IP'; $wb['datalog_status_d_cron'] = 'Odstranění shell uživatele'; $wb['datalog_status_i_mail_get'] = 'Vytvoření účtu pro získávání externí e-mailové pošty'; $wb['datalog_status_u_mail_get'] = 'Aktualizace nastavení účtu pro získávání externí e-mailové pošty'; @@ -145,7 +156,7 @@ $wb['strength_2'] = 'Podprůměrná'; $wb['strength_3'] = 'Dobrá'; $wb['strength_4'] = 'Silná'; $wb['strength_5'] = 'Velmi silná'; -$wb['weak_password_txt'] = 'Zvolené heslo neodpovídá požadavkům zásad pro tvorbu hesel. Heslo musí být alespoň {chars} znaků dlouhé a mající sílu \\"{strength}\\".'; +$wb['weak_password_txt'] = 'Zvolené heslo neodpovídá požadavkům zásad pro tvorbu hesel. Heslo musí být alespoň {chars} znaků dlouhé a mající sílu \"{strength}\".'; $wb['weak_password_length_txt'] = 'Zvolené heslo neodpovídá požadavkům zásad pro tvorbu hesel. Heslo musí být alespoň {chars} znaků dlouhé.'; $wb['security_check1_txt'] = 'Check for security permission:'; $wb['security_check2_txt'] = 'failed.'; @@ -158,4 +169,9 @@ $wb['datalog_status_d_xmpp_domain'] = 'Smazat XMPP doménu'; $wb['datalog_status_i_xmpp_user'] = 'Vytvořit XMPP uživatele'; $wb['datalog_status_u_xmpp_user'] = 'Aktualizovat XMPP uživatele'; $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'; +$wb['copy_to_clipboard_txt'] = 'Copy to clipboard'; ?> diff --git a/interface/lib/lang/de.lng b/interface/lib/lang/de.lng index 61551ceeab566d7472f5d4f41687703edf63a34a..d6cef498d367270e0b33722c9ebd20a401cf9ee2 100644 --- a/interface/lib/lang/de.lng +++ b/interface/lib/lang/de.lng @@ -113,8 +113,19 @@ $wb['datalog_status_d_dns_rr'] = 'DNS Eintrag löschen'; $wb['datalog_status_i_dns_soa'] = 'DNS Zone anlegen'; $wb['datalog_status_u_dns_soa'] = 'DNS Zone ändern'; $wb['datalog_status_d_dns_soa'] = 'DNS Zone löschen'; +$wb['datalog_status_i_dns_slave'] = 'Create new secondary DNS zone'; +$wb['datalog_status_u_dns_slave'] = 'Update secondary DNS zone'; +$wb['datalog_status_d_dns_slave'] = 'Delete secondary DNS zone'; +$wb['datalog_status_i_firewall'] = 'Create new firewall rule'; +$wb['datalog_status_u_firewall'] = 'Update firewall rule'; +$wb['datalog_status_d_firewall'] = 'Delete firewall rule'; +$wb['datalog_status_u_server'] = 'Update server settings'; +$wb['datalog_status_d_server'] = 'Delete server'; $wb['datalog_status_i_cron'] = 'Cronjob anlegen'; $wb['datalog_status_u_cron'] = 'Cronjob ändern'; +$wb['datalog_status_i_server_ip'] = 'Add server IP'; +$wb['datalog_status_u_server_ip'] = 'Update server IP'; +$wb['datalog_status_d_server_ip'] = 'Delete server IP'; $wb['datalog_status_d_cron'] = 'Cronjob löschen'; $wb['datalog_status_i_mail_get'] = 'E-Mailabruf anlegen'; $wb['datalog_status_u_mail_get'] = 'E-Mailabruf ändern'; @@ -158,4 +169,9 @@ $wb['security_check1_txt'] = 'Sicherheitsüberprüfung für:'; $wb['security_check2_txt'] = 'fehlgeschlagen.'; $wb['select_directive_snippet_txt'] = 'Direktiven Schnipsel'; $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'; +$wb['non_admin_error'] = 'Requires administrator level permissions'; +$wb['copy_to_clipboard_txt'] = 'Copy to clipboard'; ?> diff --git a/interface/lib/lang/dk.lng b/interface/lib/lang/dk.lng index 798d2ccd451ef6d6f3d02cb7fbe4869de621754d..85cee5865942261351b84e04021edd9674a25ac2 100644 --- a/interface/lib/lang/dk.lng +++ b/interface/lib/lang/dk.lng @@ -112,8 +112,19 @@ $wb['datalog_status_d_dns_rr'] = 'Slet DNS-post'; $wb['datalog_status_i_dns_soa'] = 'Opret DNS zone'; $wb['datalog_status_u_dns_soa'] = 'Opdater DNS zone'; $wb['datalog_status_d_dns_soa'] = 'Slet DNS zone'; +$wb['datalog_status_i_dns_slave'] = 'Create new secondary DNS zone'; +$wb['datalog_status_u_dns_slave'] = 'Update secondary DNS zone'; +$wb['datalog_status_d_dns_slave'] = 'Delete secondary DNS zone'; +$wb['datalog_status_i_firewall'] = 'Create new firewall rule'; +$wb['datalog_status_u_firewall'] = 'Update firewall rule'; +$wb['datalog_status_d_firewall'] = 'Delete firewall rule'; +$wb['datalog_status_u_server'] = 'Update server settings'; +$wb['datalog_status_d_server'] = 'Delete server'; $wb['datalog_status_i_cron'] = 'Opret cron job'; $wb['datalog_status_u_cron'] = 'Opdater cron job'; +$wb['datalog_status_i_server_ip'] = 'Add server IP'; +$wb['datalog_status_u_server_ip'] = 'Update server IP'; +$wb['datalog_status_d_server_ip'] = 'Delete server IP'; $wb['datalog_status_d_cron'] = 'Slet cron job'; $wb['datalog_status_i_mail_get'] = 'Opret mail-hentnings konto'; $wb['datalog_status_u_mail_get'] = 'Opdater mail-hentnings konto'; @@ -158,4 +169,9 @@ $wb['datalog_status_d_xmpp_domain'] = 'Delete XMPP domain'; $wb['datalog_status_i_xmpp_user'] = 'Create XMPP user'; $wb['datalog_status_u_xmpp_user'] = 'Update XMPP user'; $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'; +$wb['non_admin_error'] = 'Requires administrator level permissions'; +$wb['copy_to_clipboard_txt'] = 'Copy to clipboard'; ?> diff --git a/interface/lib/lang/el.lng b/interface/lib/lang/el.lng index 382bf4a75839c737702cb9124cd900d739c044f8..d5b980722a43d7c111428445a15eabb9ccea7154 100644 --- a/interface/lib/lang/el.lng +++ b/interface/lib/lang/el.lng @@ -109,8 +109,19 @@ $wb['datalog_status_d_dns_rr'] = 'Delete DNS record'; $wb['datalog_status_i_dns_soa'] = 'Create DNS zone'; $wb['datalog_status_u_dns_soa'] = 'Update DNS zone'; $wb['datalog_status_d_dns_soa'] = 'Delete DNS zone'; +$wb['datalog_status_i_dns_slave'] = 'Create new secondary DNS zone'; +$wb['datalog_status_u_dns_slave'] = 'Update secondary DNS zone'; +$wb['datalog_status_d_dns_slave'] = 'Delete secondary DNS zone'; +$wb['datalog_status_i_firewall'] = 'Create new firewall rule'; +$wb['datalog_status_u_firewall'] = 'Update firewall rule'; +$wb['datalog_status_d_firewall'] = 'Delete firewall rule'; +$wb['datalog_status_u_server'] = 'Update server settings'; +$wb['datalog_status_d_server'] = 'Delete server'; $wb['datalog_status_i_cron'] = 'Create cron job'; $wb['datalog_status_u_cron'] = 'Update cron job'; +$wb['datalog_status_i_server_ip'] = 'Add server IP'; +$wb['datalog_status_u_server_ip'] = 'Update server IP'; +$wb['datalog_status_d_server_ip'] = 'Delete server IP'; $wb['datalog_status_d_cron'] = 'Delete cron job'; $wb['datalog_status_i_mail_get'] = 'Create mail fetcher account'; $wb['datalog_status_u_mail_get'] = 'Update mail fetcher account'; @@ -158,4 +169,9 @@ $wb['datalog_status_d_xmpp_domain'] = 'Delete XMPP domain'; $wb['datalog_status_i_xmpp_user'] = 'Create XMPP user'; $wb['datalog_status_u_xmpp_user'] = 'Update XMPP user'; $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'; +$wb['non_admin_error'] = 'Requires administrator level permissions'; +$wb['copy_to_clipboard_txt'] = 'Copy to clipboard'; ?> diff --git a/interface/lib/lang/en.lng b/interface/lib/lang/en.lng index 66f4ee3811efc6c82b08b4338cfafc33c5013d9e..6024cc69a74e74c977e80715f9e1e787c63e057b 100644 --- a/interface/lib/lang/en.lng +++ b/interface/lib/lang/en.lng @@ -1,32 +1,32 @@ \ No newline at end of file +$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'; +$wb['copy_to_clipboard_txt'] = 'Copy to clipboard'; +?> diff --git a/interface/lib/lang/es.lng b/interface/lib/lang/es.lng index 3b1bae0b469eb7e9e1a904c6d41e320e0b980efc..e3ba1d41e067e1246daf7105810cc817328a27e9 100644 --- a/interface/lib/lang/es.lng +++ b/interface/lib/lang/es.lng @@ -112,8 +112,19 @@ $wb['datalog_status_d_dns_rr'] = 'Borrar registro de DNS'; $wb['datalog_status_i_dns_soa'] = 'Añadir zona de DNS'; $wb['datalog_status_u_dns_soa'] = 'Actualizar zona de DNS'; $wb['datalog_status_d_dns_soa'] = 'Borrar zona de DNS'; +$wb['datalog_status_i_dns_slave'] = 'Create new secondary DNS zone'; +$wb['datalog_status_u_dns_slave'] = 'Update secondary DNS zone'; +$wb['datalog_status_d_dns_slave'] = 'Delete secondary DNS zone'; +$wb['datalog_status_i_firewall'] = 'Create new firewall rule'; +$wb['datalog_status_u_firewall'] = 'Update firewall rule'; +$wb['datalog_status_d_firewall'] = 'Delete firewall rule'; +$wb['datalog_status_u_server'] = 'Update server settings'; +$wb['datalog_status_d_server'] = 'Delete server'; $wb['datalog_status_i_cron'] = 'Añadir cron job'; $wb['datalog_status_u_cron'] = 'Actualizar cron job'; +$wb['datalog_status_i_server_ip'] = 'Add server IP'; +$wb['datalog_status_u_server_ip'] = 'Update server IP'; +$wb['datalog_status_d_server_ip'] = 'Delete server IP'; $wb['datalog_status_d_cron'] = 'Borrar cron job'; $wb['datalog_status_i_mail_get'] = 'Añadir cuenta de rescatador de correo'; $wb['datalog_status_u_mail_get'] = 'Actualizar cuenta de rescatador de correo'; @@ -152,10 +163,15 @@ $wb['security_check1_txt'] = 'Verificar permisos de seguridad:'; $wb['security_check2_txt'] = 'ha fallado.'; $wb['select_directive_snippet_txt'] = 'Directive Snippets'; $wb['select_master_directive_snippet_txt'] = 'Master Directive Snippets'; -$wb['datalog_status_i_xmpp_domain'] = 'Create XMPP domain'; -$wb['datalog_status_u_xmpp_domain'] = 'Update XMPP domain'; -$wb['datalog_status_d_xmpp_domain'] = 'Delete XMPP domain'; -$wb['datalog_status_i_xmpp_user'] = 'Create XMPP user'; -$wb['datalog_status_u_xmpp_user'] = 'Update XMPP user'; -$wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user'; +$wb['datalog_status_i_xmpp_domain'] = 'Crear dominio XMPP'; +$wb['datalog_status_u_xmpp_domain'] = 'Actualizar dominio XMPP'; +$wb['datalog_status_d_xmpp_domain'] = 'Borrar dominio XMPP'; +$wb['datalog_status_i_xmpp_user'] = 'Crear usuario XMPP'; +$wb['datalog_status_u_xmpp_user'] = 'Actualizar usuario XMPP'; +$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'; +$wb['copy_to_clipboard_txt'] = 'Copy to clipboard'; ?> diff --git a/interface/lib/lang/fi.lng b/interface/lib/lang/fi.lng old mode 100755 new mode 100644 index d4c23ca777a6388718c07c4be4f6883b99392476..87f2dc24edd263eb58ecd961aa5ed5b4c2896d02 --- a/interface/lib/lang/fi.lng +++ b/interface/lib/lang/fi.lng @@ -109,8 +109,19 @@ $wb['datalog_status_d_dns_rr'] = 'Delete DNS record'; $wb['datalog_status_i_dns_soa'] = 'Create DNS zone'; $wb['datalog_status_u_dns_soa'] = 'Update DNS zone'; $wb['datalog_status_d_dns_soa'] = 'Delete DNS zone'; +$wb['datalog_status_i_dns_slave'] = 'Create new secondary DNS zone'; +$wb['datalog_status_u_dns_slave'] = 'Update secondary DNS zone'; +$wb['datalog_status_d_dns_slave'] = 'Delete secondary DNS zone'; +$wb['datalog_status_i_firewall'] = 'Create new firewall rule'; +$wb['datalog_status_u_firewall'] = 'Update firewall rule'; +$wb['datalog_status_d_firewall'] = 'Delete firewall rule'; +$wb['datalog_status_u_server'] = 'Update server settings'; +$wb['datalog_status_d_server'] = 'Delete server'; $wb['datalog_status_i_cron'] = 'Create cron job'; $wb['datalog_status_u_cron'] = 'Update cron job'; +$wb['datalog_status_i_server_ip'] = 'Add server IP'; +$wb['datalog_status_u_server_ip'] = 'Update server IP'; +$wb['datalog_status_d_server_ip'] = 'Delete server IP'; $wb['datalog_status_d_cron'] = 'Delete cron job'; $wb['datalog_status_i_mail_get'] = 'Create mail fetcher account'; $wb['datalog_status_u_mail_get'] = 'Update mail fetcher account'; @@ -158,4 +169,9 @@ $wb['datalog_status_d_xmpp_domain'] = 'Delete XMPP domain'; $wb['datalog_status_i_xmpp_user'] = 'Create XMPP user'; $wb['datalog_status_u_xmpp_user'] = 'Update XMPP user'; $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'; +$wb['copy_to_clipboard_txt'] = 'Copy to clipboard'; ?> diff --git a/interface/lib/lang/fr.lng b/interface/lib/lang/fr.lng index 3e9bfa8daa4521f3c5a568df8ff0e4a6932115a3..7f8413d11c1a2b5906deff3033755a3c594dd932 100644 --- a/interface/lib/lang/fr.lng +++ b/interface/lib/lang/fr.lng @@ -112,8 +112,19 @@ $wb['datalog_status_d_dns_rr'] = 'Supprimer un enregistrement DNS'; $wb['datalog_status_i_dns_soa'] = 'Créer une zone DNS'; $wb['datalog_status_u_dns_soa'] = 'Modifier une zone DNS'; $wb['datalog_status_d_dns_soa'] = 'Supprimer une zone DNS'; +$wb['datalog_status_i_dns_slave'] = 'Create new secondary DNS zone'; +$wb['datalog_status_u_dns_slave'] = 'Update secondary DNS zone'; +$wb['datalog_status_d_dns_slave'] = 'Delete secondary DNS zone'; +$wb['datalog_status_i_firewall'] = 'Create new firewall rule'; +$wb['datalog_status_u_firewall'] = 'Update firewall rule'; +$wb['datalog_status_d_firewall'] = 'Delete firewall rule'; +$wb['datalog_status_u_server'] = 'Update server settings'; +$wb['datalog_status_d_server'] = 'Delete server'; $wb['datalog_status_i_cron'] = 'Créer une tâche cron'; $wb['datalog_status_u_cron'] = 'Modifier une tâche cron'; +$wb['datalog_status_i_server_ip'] = 'Add server IP'; +$wb['datalog_status_u_server_ip'] = 'Update server IP'; +$wb['datalog_status_d_server_ip'] = 'Delete server IP'; $wb['datalog_status_d_cron'] = 'Supprimer une tâche cron'; $wb['datalog_status_i_mail_get'] = 'Créer un compte mail récupérateur'; $wb['datalog_status_u_mail_get'] = 'Modifier un compte mail récupérateur'; @@ -158,4 +169,9 @@ $wb['datalog_status_d_xmpp_domain'] = 'Delete XMPP domain'; $wb['datalog_status_i_xmpp_user'] = 'Create XMPP user'; $wb['datalog_status_u_xmpp_user'] = 'Update XMPP user'; $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'; +$wb['non_admin_error'] = 'Requires administrator level permissions'; +$wb['copy_to_clipboard_txt'] = 'Copy to clipboard'; ?> diff --git a/interface/lib/lang/hr.lng b/interface/lib/lang/hr.lng index 310371be479f1ea8d250aa7956dd7da305318817..167073f837b63bf9d3058507ab26d7f22549ff7c 100644 --- a/interface/lib/lang/hr.lng +++ b/interface/lib/lang/hr.lng @@ -109,8 +109,19 @@ $wb['datalog_status_d_dns_rr'] = 'Obriši DNS zapis'; $wb['datalog_status_i_dns_soa'] = 'Kreiraj DNS zonu'; $wb['datalog_status_u_dns_soa'] = 'Podesi DNS zonu'; $wb['datalog_status_d_dns_soa'] = 'Obriši DNS zonu'; +$wb['datalog_status_i_dns_slave'] = 'Create new secondary DNS zone'; +$wb['datalog_status_u_dns_slave'] = 'Update secondary DNS zone'; +$wb['datalog_status_d_dns_slave'] = 'Delete secondary DNS zone'; +$wb['datalog_status_i_firewall'] = 'Create new firewall rule'; +$wb['datalog_status_u_firewall'] = 'Update firewall rule'; +$wb['datalog_status_d_firewall'] = 'Delete firewall rule'; +$wb['datalog_status_u_server'] = 'Update server settings'; +$wb['datalog_status_d_server'] = 'Delete server'; $wb['datalog_status_i_cron'] = 'Kreiraj cron zadatak'; $wb['datalog_status_u_cron'] = 'Podesi cron zadatak'; +$wb['datalog_status_i_server_ip'] = 'Add server IP'; +$wb['datalog_status_u_server_ip'] = 'Update server IP'; +$wb['datalog_status_d_server_ip'] = 'Delete server IP'; $wb['datalog_status_d_cron'] = 'Obriši cron zadatak'; $wb['datalog_status_i_mail_get'] = 'Kreiraj mail fetcher račun'; $wb['datalog_status_u_mail_get'] = 'Podesi mail fetcher račun'; @@ -158,4 +169,9 @@ $wb['datalog_status_d_xmpp_domain'] = 'Delete XMPP domain'; $wb['datalog_status_i_xmpp_user'] = 'Create XMPP user'; $wb['datalog_status_u_xmpp_user'] = 'Update XMPP user'; $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'; +$wb['non_admin_error'] = 'Requires administrator level permissions'; +$wb['copy_to_clipboard_txt'] = 'Copy to clipboard'; ?> diff --git a/interface/lib/lang/hu.lng b/interface/lib/lang/hu.lng index dd4cce79b3bffd015b61ffc7c06379148e78b677..a07c6810ce77c10add4de441f6008e2eee732b0c 100644 --- a/interface/lib/lang/hu.lng +++ b/interface/lib/lang/hu.lng @@ -109,8 +109,19 @@ $wb['datalog_status_d_dns_rr'] = 'Delete DNS record'; $wb['datalog_status_i_dns_soa'] = 'Create DNS zone'; $wb['datalog_status_u_dns_soa'] = 'Update DNS zone'; $wb['datalog_status_d_dns_soa'] = 'Delete DNS zone'; +$wb['datalog_status_i_dns_slave'] = 'Create new secondary DNS zone'; +$wb['datalog_status_u_dns_slave'] = 'Update secondary DNS zone'; +$wb['datalog_status_d_dns_slave'] = 'Delete secondary DNS zone'; +$wb['datalog_status_i_firewall'] = 'Create new firewall rule'; +$wb['datalog_status_u_firewall'] = 'Update firewall rule'; +$wb['datalog_status_d_firewall'] = 'Delete firewall rule'; +$wb['datalog_status_u_server'] = 'Update server settings'; +$wb['datalog_status_d_server'] = 'Delete server'; $wb['datalog_status_i_cron'] = 'Create cron job'; $wb['datalog_status_u_cron'] = 'Update cron job'; +$wb['datalog_status_i_server_ip'] = 'Add server IP'; +$wb['datalog_status_u_server_ip'] = 'Update server IP'; +$wb['datalog_status_d_server_ip'] = 'Delete server IP'; $wb['datalog_status_d_cron'] = 'Delete cron job'; $wb['datalog_status_i_mail_get'] = 'Create mail fetcher account'; $wb['datalog_status_u_mail_get'] = 'Update mail fetcher account'; @@ -158,4 +169,9 @@ $wb['datalog_status_d_xmpp_domain'] = 'Delete XMPP domain'; $wb['datalog_status_i_xmpp_user'] = 'Create XMPP user'; $wb['datalog_status_u_xmpp_user'] = 'Update XMPP user'; $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'; +$wb['non_admin_error'] = 'Requires administrator level permissions'; +$wb['copy_to_clipboard_txt'] = 'Copy to clipboard'; ?> diff --git a/interface/lib/lang/id.lng b/interface/lib/lang/id.lng index bd90fd5a1b5e10cb294cec6ff7486a3365bb61e4..51e1fd6aef00388230029ca8f704d1bb1361fc30 100644 --- a/interface/lib/lang/id.lng +++ b/interface/lib/lang/id.lng @@ -109,8 +109,19 @@ $wb['datalog_status_d_dns_rr'] = 'Delete DNS record'; $wb['datalog_status_i_dns_soa'] = 'Create DNS zone'; $wb['datalog_status_u_dns_soa'] = 'Update DNS zone'; $wb['datalog_status_d_dns_soa'] = 'Delete DNS zone'; +$wb['datalog_status_i_dns_slave'] = 'Create new secondary DNS zone'; +$wb['datalog_status_u_dns_slave'] = 'Update secondary DNS zone'; +$wb['datalog_status_d_dns_slave'] = 'Delete secondary DNS zone'; +$wb['datalog_status_i_firewall'] = 'Create new firewall rule'; +$wb['datalog_status_u_firewall'] = 'Update firewall rule'; +$wb['datalog_status_d_firewall'] = 'Delete firewall rule'; +$wb['datalog_status_u_server'] = 'Update server settings'; +$wb['datalog_status_d_server'] = 'Delete server'; $wb['datalog_status_i_cron'] = 'Create cron job'; $wb['datalog_status_u_cron'] = 'Update cron job'; +$wb['datalog_status_i_server_ip'] = 'Add server IP'; +$wb['datalog_status_u_server_ip'] = 'Update server IP'; +$wb['datalog_status_d_server_ip'] = 'Delete server IP'; $wb['datalog_status_d_cron'] = 'Delete cron job'; $wb['datalog_status_i_mail_get'] = 'Create mail fetcher account'; $wb['datalog_status_u_mail_get'] = 'Update mail fetcher account'; @@ -158,4 +169,9 @@ $wb['datalog_status_d_xmpp_domain'] = 'Delete XMPP domain'; $wb['datalog_status_i_xmpp_user'] = 'Create XMPP user'; $wb['datalog_status_u_xmpp_user'] = 'Update XMPP user'; $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'; +$wb['non_admin_error'] = 'Requires administrator level permissions'; +$wb['copy_to_clipboard_txt'] = 'Copy to clipboard'; ?> diff --git a/interface/lib/lang/it.lng b/interface/lib/lang/it.lng index 33d16c3d5f66d055bfabf69dc69e4dbc7a16ae51..a56224e6d538b545f1758be32789cf37095a348c 100644 --- a/interface/lib/lang/it.lng +++ b/interface/lib/lang/it.lng @@ -108,8 +108,19 @@ $wb['datalog_status_d_dns_rr'] = 'Elimina record DNS'; $wb['datalog_status_i_dns_soa'] = 'Crea zona DNS'; $wb['datalog_status_u_dns_soa'] = 'Aggiorna zona DNS'; $wb['datalog_status_d_dns_soa'] = 'Elimina DNS zone'; +$wb['datalog_status_i_dns_slave'] = 'Create new secondary DNS zone'; +$wb['datalog_status_u_dns_slave'] = 'Update secondary DNS zone'; +$wb['datalog_status_d_dns_slave'] = 'Delete secondary DNS zone'; +$wb['datalog_status_i_firewall'] = 'Create new firewall rule'; +$wb['datalog_status_u_firewall'] = 'Update firewall rule'; +$wb['datalog_status_d_firewall'] = 'Delete firewall rule'; +$wb['datalog_status_u_server'] = 'Update server settings'; +$wb['datalog_status_d_server'] = 'Delete server'; $wb['datalog_status_i_cron'] = 'Crea cron job'; $wb['datalog_status_u_cron'] = 'Aggiorna cron job'; +$wb['datalog_status_i_server_ip'] = 'Add server IP'; +$wb['datalog_status_u_server_ip'] = 'Update server IP'; +$wb['datalog_status_d_server_ip'] = 'Delete server IP'; $wb['datalog_status_d_cron'] = 'Elimina cron job'; $wb['datalog_status_i_mail_mailinglist'] = 'Crea mailing list'; $wb['datalog_status_u_mail_mailinglist'] = 'Aggiorna mailing list'; @@ -142,20 +153,25 @@ $wb['weak_password_txt'] = 'La password indicata non segue le impostazioni di si $wb['weak_password_length_txt'] = 'La password indicata non segue le impostazioni di sicurezza. Deve essere lunga almeno {chars} caratteri.'; $wb['security_check1_txt'] = 'Verifica permessi di sicurezza:'; $wb['security_check2_txt'] = 'fallito.'; -$wb['global_tabchange_warning_txt'] = 'Changed data in this tab will be changed if you press OK. On cancel they will be discarded.'; -$wb['datalog_status_i_mail_get'] = 'Create mail fetcher account'; -$wb['datalog_status_u_mail_get'] = 'Update mail fetcher account'; -$wb['datalog_status_d_mail_get'] = 'Delete mail fetcher account'; -$wb['datalog_status_i_web_folder_user'] = 'Create folder protection user'; -$wb['datalog_status_u_web_folder_user'] = 'Update folder protection user'; -$wb['datalog_status_d_web_folder_user'] = 'Delete folder protection user'; -$wb['err_csrf_attempt_blocked'] = 'CSRF attempt blocked.'; -$wb['select_directive_snippet_txt'] = 'Directive Snippets'; +$wb['global_tabchange_warning_txt'] = 'Cliccando OK le modifiche effettuate in questo tab verranno salvate. Cancel per non salvare le modifiche.'; +$wb['datalog_status_i_mail_get'] = 'Crea account mail fetcher'; +$wb['datalog_status_u_mail_get'] = 'Aggiorna account mail fetcher'; +$wb['datalog_status_d_mail_get'] = 'Elimina account mail fetcher'; +$wb['datalog_status_i_web_folder_user'] = 'Crea protezione cartella'; +$wb['datalog_status_u_web_folder_user'] = 'Aggiorna protezione cartella'; +$wb['datalog_status_d_web_folder_user'] = 'Elimina protezione cartella'; +$wb['err_csrf_attempt_blocked'] = 'Tentativo CSRF bloccato.'; +$wb['select_directive_snippet_txt'] = 'Snippets direttiva'; $wb['select_master_directive_snippet_txt'] = 'Master Directive Snippets'; -$wb['datalog_status_i_xmpp_domain'] = 'Create XMPP domain'; -$wb['datalog_status_u_xmpp_domain'] = 'Update XMPP domain'; -$wb['datalog_status_d_xmpp_domain'] = 'Delete XMPP domain'; -$wb['datalog_status_i_xmpp_user'] = 'Create XMPP user'; -$wb['datalog_status_u_xmpp_user'] = 'Update XMPP user'; -$wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user'; +$wb['datalog_status_i_xmpp_domain'] = 'Crea dominio XMPP'; +$wb['datalog_status_u_xmpp_domain'] = 'Aggiorna dominio XMPP'; +$wb['datalog_status_d_xmpp_domain'] = 'Elimina dominio XMPP'; +$wb['datalog_status_i_xmpp_user'] = 'Crea utente XMPP'; +$wb['datalog_status_u_xmpp_user'] = 'Aggiorna utente XMPP'; +$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'; +$wb['copy_to_clipboard_txt'] = 'Copy to clipboard'; ?> diff --git a/interface/lib/lang/ja.lng b/interface/lib/lang/ja.lng index 2a56e77399dc0a7d9f98fabba751d7e909082525..00db30317075d490d0b6d8e1b502e217f8260990 100644 --- a/interface/lib/lang/ja.lng +++ b/interface/lib/lang/ja.lng @@ -109,8 +109,19 @@ $wb['datalog_status_d_dns_rr'] = 'Delete DNS record'; $wb['datalog_status_i_dns_soa'] = 'Create DNS zone'; $wb['datalog_status_u_dns_soa'] = 'Update DNS zone'; $wb['datalog_status_d_dns_soa'] = 'Delete DNS zone'; +$wb['datalog_status_i_dns_slave'] = 'Create new secondary DNS zone'; +$wb['datalog_status_u_dns_slave'] = 'Update secondary DNS zone'; +$wb['datalog_status_d_dns_slave'] = 'Delete secondary DNS zone'; +$wb['datalog_status_i_firewall'] = 'Create new firewall rule'; +$wb['datalog_status_u_firewall'] = 'Update firewall rule'; +$wb['datalog_status_d_firewall'] = 'Delete firewall rule'; +$wb['datalog_status_u_server'] = 'Update server settings'; +$wb['datalog_status_d_server'] = 'Delete server'; $wb['datalog_status_i_cron'] = 'Create cron job'; $wb['datalog_status_u_cron'] = 'Update cron job'; +$wb['datalog_status_i_server_ip'] = 'Add server IP'; +$wb['datalog_status_u_server_ip'] = 'Update server IP'; +$wb['datalog_status_d_server_ip'] = 'Delete server IP'; $wb['datalog_status_d_cron'] = 'Delete cron job'; $wb['datalog_status_i_mail_get'] = 'Create mail fetcher account'; $wb['datalog_status_u_mail_get'] = 'Update mail fetcher account'; @@ -158,4 +169,9 @@ $wb['datalog_status_d_xmpp_domain'] = 'Delete XMPP domain'; $wb['datalog_status_i_xmpp_user'] = 'Create XMPP user'; $wb['datalog_status_u_xmpp_user'] = 'Update XMPP user'; $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'; +$wb['copy_to_clipboard_txt'] = 'Copy to clipboard'; ?> diff --git a/interface/lib/lang/nl.lng b/interface/lib/lang/nl.lng index 888f9c020098702b7d3c1e4b8e9a956419bbee71..582c5ffe53b222ce8bd434d025bef88826de011f 100644 --- a/interface/lib/lang/nl.lng +++ b/interface/lib/lang/nl.lng @@ -109,8 +109,19 @@ $wb['datalog_status_d_dns_rr'] = 'Verwijderen DNS record'; $wb['datalog_status_i_dns_soa'] = 'Aanmaken DNS zone'; $wb['datalog_status_u_dns_soa'] = 'Bijwerken DNS zone'; $wb['datalog_status_d_dns_soa'] = 'Verwijderen DNS zone'; +$wb['datalog_status_i_dns_slave'] = 'Create new secondary DNS zone'; +$wb['datalog_status_u_dns_slave'] = 'Update secondary DNS zone'; +$wb['datalog_status_d_dns_slave'] = 'Delete secondary DNS zone'; +$wb['datalog_status_i_firewall'] = 'Create new firewall rule'; +$wb['datalog_status_u_firewall'] = 'Update firewall rule'; +$wb['datalog_status_d_firewall'] = 'Delete firewall rule'; +$wb['datalog_status_u_server'] = 'Update server settings'; +$wb['datalog_status_d_server'] = 'Delete server'; $wb['datalog_status_i_cron'] = 'Aanmaken cron job'; $wb['datalog_status_u_cron'] = 'Bijwerken cron job'; +$wb['datalog_status_i_server_ip'] = 'Add server IP'; +$wb['datalog_status_u_server_ip'] = 'Update server IP'; +$wb['datalog_status_d_server_ip'] = 'Delete server IP'; $wb['datalog_status_d_cron'] = 'Verwijderen cron job'; $wb['datalog_status_i_mail_get'] = 'Create mail fetcher account'; $wb['datalog_status_u_mail_get'] = 'Update mail fetcher account'; @@ -140,11 +151,11 @@ $wb['client_cannot_be_deleted_because_of_billing_module_txt'] = 'This client has $wb['yes_txt'] = 'Ja'; $wb['no_txt'] = 'Nee'; $wb['None'] = 'Geen'; -$wb['strength_1'] = 'Weak'; +$wb['strength_1'] = 'Zwak'; $wb['strength_2'] = 'Fair'; -$wb['strength_3'] = 'Good'; -$wb['strength_4'] = 'Strong'; -$wb['strength_5'] = 'Very Strong'; +$wb['strength_3'] = 'Goed'; +$wb['strength_4'] = 'Sterk'; +$wb['strength_5'] = 'Zeer sterk'; $wb['weak_password_txt'] = 'The chosen password does not match the security guidelines. It has to be at least {chars} chars in length and have a strength of \\"{strength}\\".'; $wb['weak_password_length_txt'] = 'The chosen password does not match the security guidelines. It has to be at least {chars} chars in length.'; $wb['security_check1_txt'] = 'Check for security permission:'; @@ -158,4 +169,9 @@ $wb['datalog_status_d_xmpp_domain'] = 'Delete XMPP domain'; $wb['datalog_status_i_xmpp_user'] = 'Create XMPP user'; $wb['datalog_status_u_xmpp_user'] = 'Update XMPP user'; $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'; +$wb['copy_to_clipboard_txt'] = 'Kopieer naar klembord'; ?> diff --git a/interface/lib/lang/pl.lng b/interface/lib/lang/pl.lng index b5b62c816dd9a20b699ee7eaef9bc076d7af3c6b..d22b0d485029a8c681b298d0865b883bd5e2c57a 100644 --- a/interface/lib/lang/pl.lng +++ b/interface/lib/lang/pl.lng @@ -112,8 +112,19 @@ $wb['datalog_status_d_dns_rr'] = 'Usuń wpis DNS'; $wb['datalog_status_i_dns_soa'] = 'Utwórz strefę DNS'; $wb['datalog_status_u_dns_soa'] = 'Edytuj strefę DNS'; $wb['datalog_status_d_dns_soa'] = 'Usuń strefę DNS'; +$wb['datalog_status_i_dns_slave'] = 'Create new secondary DNS zone'; +$wb['datalog_status_u_dns_slave'] = 'Update secondary DNS zone'; +$wb['datalog_status_d_dns_slave'] = 'Delete secondary DNS zone'; +$wb['datalog_status_i_firewall'] = 'Create new firewall rule'; +$wb['datalog_status_u_firewall'] = 'Update firewall rule'; +$wb['datalog_status_d_firewall'] = 'Delete firewall rule'; +$wb['datalog_status_u_server'] = 'Update server settings'; +$wb['datalog_status_d_server'] = 'Delete server'; $wb['datalog_status_i_cron'] = 'Utwórz zadanie Cron'; $wb['datalog_status_u_cron'] = 'Edytuj zadanie Cron'; +$wb['datalog_status_i_server_ip'] = 'Add server IP'; +$wb['datalog_status_u_server_ip'] = 'Update server IP'; +$wb['datalog_status_d_server_ip'] = 'Delete server IP'; $wb['datalog_status_d_cron'] = 'Usuń zadanie Cron'; $wb['datalog_status_i_mail_get'] = 'Utwórz konto mail fetcher'; $wb['datalog_status_u_mail_get'] = 'Edytuj konto mail fetcher'; @@ -158,4 +169,9 @@ $wb['datalog_status_d_xmpp_domain'] = 'Delete XMPP domain'; $wb['datalog_status_i_xmpp_user'] = 'Create XMPP user'; $wb['datalog_status_u_xmpp_user'] = 'Update XMPP user'; $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'; +$wb['non_admin_error'] = 'Requires administrator level permissions'; +$wb['copy_to_clipboard_txt'] = 'Copy to clipboard'; ?> diff --git a/interface/lib/lang/pt.lng b/interface/lib/lang/pt.lng index 7845520a5bb8db428dab5d281e2bfe476eb725c3..23b1cd2079584cfbe6798026b6e59c02535b15cb 100644 --- a/interface/lib/lang/pt.lng +++ b/interface/lib/lang/pt.lng @@ -109,8 +109,19 @@ $wb['datalog_status_d_dns_rr'] = 'Delete DNS record'; $wb['datalog_status_i_dns_soa'] = 'Create DNS zone'; $wb['datalog_status_u_dns_soa'] = 'Update DNS zone'; $wb['datalog_status_d_dns_soa'] = 'Delete DNS zone'; +$wb['datalog_status_i_dns_slave'] = 'Create new secondary DNS zone'; +$wb['datalog_status_u_dns_slave'] = 'Update secondary DNS zone'; +$wb['datalog_status_d_dns_slave'] = 'Delete secondary DNS zone'; +$wb['datalog_status_i_firewall'] = 'Create new firewall rule'; +$wb['datalog_status_u_firewall'] = 'Update firewall rule'; +$wb['datalog_status_d_firewall'] = 'Delete firewall rule'; +$wb['datalog_status_u_server'] = 'Update server settings'; +$wb['datalog_status_d_server'] = 'Delete server'; $wb['datalog_status_i_cron'] = 'Create cron job'; $wb['datalog_status_u_cron'] = 'Update cron job'; +$wb['datalog_status_i_server_ip'] = 'Add server IP'; +$wb['datalog_status_u_server_ip'] = 'Update server IP'; +$wb['datalog_status_d_server_ip'] = 'Delete server IP'; $wb['datalog_status_d_cron'] = 'Delete cron job'; $wb['datalog_status_i_mail_get'] = 'Create mail fetcher account'; $wb['datalog_status_u_mail_get'] = 'Update mail fetcher account'; @@ -158,4 +169,9 @@ $wb['datalog_status_d_xmpp_domain'] = 'Delete XMPP domain'; $wb['datalog_status_i_xmpp_user'] = 'Create XMPP user'; $wb['datalog_status_u_xmpp_user'] = 'Update XMPP user'; $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'; +$wb['copy_to_clipboard_txt'] = 'Copy to clipboard'; ?> diff --git a/interface/lib/lang/ro.lng b/interface/lib/lang/ro.lng index 613f2377a12bfe152ad2bcc0764ed4480cc8ac51..b4da89bc12e4b077a1e871ac3c1257b3dbd0a87d 100644 --- a/interface/lib/lang/ro.lng +++ b/interface/lib/lang/ro.lng @@ -109,8 +109,19 @@ $wb['datalog_status_d_dns_rr'] = 'Delete DNS record'; $wb['datalog_status_i_dns_soa'] = 'Create DNS zone'; $wb['datalog_status_u_dns_soa'] = 'Update DNS zone'; $wb['datalog_status_d_dns_soa'] = 'Delete DNS zone'; +$wb['datalog_status_i_dns_slave'] = 'Create new secondary DNS zone'; +$wb['datalog_status_u_dns_slave'] = 'Update secondary DNS zone'; +$wb['datalog_status_d_dns_slave'] = 'Delete secondary DNS zone'; +$wb['datalog_status_i_firewall'] = 'Create new firewall rule'; +$wb['datalog_status_u_firewall'] = 'Update firewall rule'; +$wb['datalog_status_d_firewall'] = 'Delete firewall rule'; +$wb['datalog_status_u_server'] = 'Update server settings'; +$wb['datalog_status_d_server'] = 'Delete server'; $wb['datalog_status_i_cron'] = 'Create cron job'; $wb['datalog_status_u_cron'] = 'Update cron job'; +$wb['datalog_status_i_server_ip'] = 'Add server IP'; +$wb['datalog_status_u_server_ip'] = 'Update server IP'; +$wb['datalog_status_d_server_ip'] = 'Delete server IP'; $wb['datalog_status_d_cron'] = 'Delete cron job'; $wb['datalog_status_i_mail_get'] = 'Create mail fetcher account'; $wb['datalog_status_u_mail_get'] = 'Update mail fetcher account'; @@ -158,4 +169,9 @@ $wb['datalog_status_d_xmpp_domain'] = 'Delete XMPP domain'; $wb['datalog_status_i_xmpp_user'] = 'Create XMPP user'; $wb['datalog_status_u_xmpp_user'] = 'Update XMPP user'; $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'; +$wb['copy_to_clipboard_txt'] = 'Copy to clipboard'; ?> diff --git a/interface/lib/lang/ru.lng b/interface/lib/lang/ru.lng index e5e8ce627824d16df119106f9ec94c5dce8e8bce..cfd805010b094c43689cfdf9f79e42ef72c9c1f3 100644 --- a/interface/lib/lang/ru.lng +++ b/interface/lib/lang/ru.lng @@ -109,8 +109,19 @@ $wb['datalog_status_d_dns_rr'] = 'Удалить DNS-запись'; $wb['datalog_status_i_dns_soa'] = 'Создать DNS-зону'; $wb['datalog_status_u_dns_soa'] = 'Обновить DNS-зону'; $wb['datalog_status_d_dns_soa'] = 'Удалить DNS-зону'; +$wb['datalog_status_i_dns_slave'] = 'Create new secondary DNS zone'; +$wb['datalog_status_u_dns_slave'] = 'Update secondary DNS zone'; +$wb['datalog_status_d_dns_slave'] = 'Delete secondary DNS zone'; +$wb['datalog_status_i_firewall'] = 'Create new firewall rule'; +$wb['datalog_status_u_firewall'] = 'Update firewall rule'; +$wb['datalog_status_d_firewall'] = 'Delete firewall rule'; +$wb['datalog_status_u_server'] = 'Update server settings'; +$wb['datalog_status_d_server'] = 'Delete server'; $wb['datalog_status_i_cron'] = 'Создать задание Пданировщика задач'; $wb['datalog_status_u_cron'] = 'Обновить задание Пданировщика задач'; +$wb['datalog_status_i_server_ip'] = 'Add server IP'; +$wb['datalog_status_u_server_ip'] = 'Update server IP'; +$wb['datalog_status_d_server_ip'] = 'Delete server IP'; $wb['datalog_status_d_cron'] = 'Удалить задание Пданировщика задач'; $wb['datalog_status_i_mail_get'] = 'Создать аккаунт сборщика почты'; $wb['datalog_status_u_mail_get'] = 'Обновить аккаунт сборщика почты'; @@ -158,4 +169,9 @@ $wb['datalog_status_d_xmpp_domain'] = 'Удалить домен XMPP'; $wb['datalog_status_i_xmpp_user'] = 'Создать пользователя XMPP'; $wb['datalog_status_u_xmpp_user'] = 'Обновить пользователя XMPP'; $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'; +$wb['copy_to_clipboard_txt'] = 'Copy to clipboard'; ?> diff --git a/interface/lib/lang/se.lng b/interface/lib/lang/se.lng index b6767144df9eaaca9528a3666128a2a6af85f114..03d818ec560ddd2eb9c2d95c00740a28466de0cb 100644 --- a/interface/lib/lang/se.lng +++ b/interface/lib/lang/se.lng @@ -109,8 +109,19 @@ $wb['datalog_status_d_dns_rr'] = 'Radera DNS-inlägg'; $wb['datalog_status_i_dns_soa'] = 'Skapa DNS-zon'; $wb['datalog_status_u_dns_soa'] = 'Uppdatera DNS-zon'; $wb['datalog_status_d_dns_soa'] = 'Radera DNS-zon'; +$wb['datalog_status_i_dns_slave'] = 'Create new secondary DNS zone'; +$wb['datalog_status_u_dns_slave'] = 'Update secondary DNS zone'; +$wb['datalog_status_d_dns_slave'] = 'Delete secondary DNS zone'; +$wb['datalog_status_i_firewall'] = 'Create new firewall rule'; +$wb['datalog_status_u_firewall'] = 'Update firewall rule'; +$wb['datalog_status_d_firewall'] = 'Delete firewall rule'; +$wb['datalog_status_u_server'] = 'Update server settings'; +$wb['datalog_status_d_server'] = 'Delete server'; $wb['datalog_status_i_cron'] = 'Skapa cron-jobb'; $wb['datalog_status_u_cron'] = 'Uppdatera cron-jobb'; +$wb['datalog_status_i_server_ip'] = 'Add server IP'; +$wb['datalog_status_u_server_ip'] = 'Update server IP'; +$wb['datalog_status_d_server_ip'] = 'Delete server IP'; $wb['datalog_status_d_cron'] = 'Radera cron-jobb'; $wb['datalog_status_i_mail_get'] = 'Skapa eposthämtarkonto'; $wb['datalog_status_u_mail_get'] = 'Uppdatera eposthämtarkonto'; @@ -158,4 +169,9 @@ $wb['datalog_status_d_xmpp_domain'] = 'Delete XMPP domain'; $wb['datalog_status_i_xmpp_user'] = 'Create XMPP user'; $wb['datalog_status_u_xmpp_user'] = 'Update XMPP user'; $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'; +$wb['non_admin_error'] = 'Requires administrator level permissions'; +$wb['copy_to_clipboard_txt'] = 'Copy to clipboard'; ?> diff --git a/interface/lib/lang/sk.lng b/interface/lib/lang/sk.lng index 6b4ef7676f8f38e29409f6b649a3b063670c6853..dfad74552bff2a6ae80935dccd92be7fcc27624d 100644 --- a/interface/lib/lang/sk.lng +++ b/interface/lib/lang/sk.lng @@ -109,8 +109,19 @@ $wb['datalog_status_d_dns_rr'] = 'Delete DNS record'; $wb['datalog_status_i_dns_soa'] = 'Create DNS zone'; $wb['datalog_status_u_dns_soa'] = 'Update DNS zone'; $wb['datalog_status_d_dns_soa'] = 'Delete DNS zone'; +$wb['datalog_status_i_dns_slave'] = 'Create new secondary DNS zone'; +$wb['datalog_status_u_dns_slave'] = 'Update secondary DNS zone'; +$wb['datalog_status_d_dns_slave'] = 'Delete secondary DNS zone'; +$wb['datalog_status_i_firewall'] = 'Create new firewall rule'; +$wb['datalog_status_u_firewall'] = 'Update firewall rule'; +$wb['datalog_status_d_firewall'] = 'Delete firewall rule'; +$wb['datalog_status_u_server'] = 'Update server settings'; +$wb['datalog_status_d_server'] = 'Delete server'; $wb['datalog_status_i_cron'] = 'Create cron job'; $wb['datalog_status_u_cron'] = 'Update cron job'; +$wb['datalog_status_i_server_ip'] = 'Add server IP'; +$wb['datalog_status_u_server_ip'] = 'Update server IP'; +$wb['datalog_status_d_server_ip'] = 'Delete server IP'; $wb['datalog_status_d_cron'] = 'Delete cron job'; $wb['datalog_status_i_mail_get'] = 'Create mail fetcher account'; $wb['datalog_status_u_mail_get'] = 'Update mail fetcher account'; @@ -158,4 +169,9 @@ $wb['datalog_status_d_xmpp_domain'] = 'Delete XMPP domain'; $wb['datalog_status_i_xmpp_user'] = 'Create XMPP user'; $wb['datalog_status_u_xmpp_user'] = 'Update XMPP user'; $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'; +$wb['copy_to_clipboard_txt'] = 'Copy to clipboard'; ?> diff --git a/interface/lib/lang/tr.lng b/interface/lib/lang/tr.lng index cf4491ad5d963701364a3f3005ca24a36b0d695a..5b7afc3afa7b5db68f82763be2f092ed1178afda 100644 --- a/interface/lib/lang/tr.lng +++ b/interface/lib/lang/tr.lng @@ -113,8 +113,19 @@ $wb['datalog_status_d_dns_rr'] = 'DNS Kaydını Sil'; $wb['datalog_status_i_dns_soa'] = 'DNS Bölgesi Ekle'; $wb['datalog_status_u_dns_soa'] = 'DNS Bölgesini Güncelle'; $wb['datalog_status_d_dns_soa'] = 'DNS Bölgesini Sil'; +$wb['datalog_status_i_dns_slave'] = 'Create new secondary DNS zone'; +$wb['datalog_status_u_dns_slave'] = 'Update secondary DNS zone'; +$wb['datalog_status_d_dns_slave'] = 'Delete secondary DNS zone'; +$wb['datalog_status_i_firewall'] = 'Create new firewall rule'; +$wb['datalog_status_u_firewall'] = 'Update firewall rule'; +$wb['datalog_status_d_firewall'] = 'Delete firewall rule'; +$wb['datalog_status_u_server'] = 'Update server settings'; +$wb['datalog_status_d_server'] = 'Delete server'; $wb['datalog_status_i_cron'] = 'Zamanlanmış Görev Ekle'; $wb['datalog_status_u_cron'] = 'Zamanlanmış Görevi Güncelle'; +$wb['datalog_status_i_server_ip'] = 'Add server IP'; +$wb['datalog_status_u_server_ip'] = 'Update server IP'; +$wb['datalog_status_d_server_ip'] = 'Delete server IP'; $wb['datalog_status_d_cron'] = 'Zamanlanmış Görevi Sil'; $wb['datalog_status_i_mail_get'] = 'E-posta Alma Hesabı Ekle'; $wb['datalog_status_u_mail_get'] = 'E-posta Alma Hesabını Güncelle'; @@ -159,4 +170,9 @@ $wb['security_check1_txt'] = 'Güvenlik iznini denetle:'; $wb['security_check2_txt'] = 'başarısız.'; $wb['select_directive_snippet_txt'] = 'Yönerge Kod Parçaları'; $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'; +$wb['non_admin_error'] = 'Requires administrator level permissions'; +$wb['copy_to_clipboard_txt'] = 'Copy to clipboard'; ?> 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/lib/plugins/mail_user_filter_plugin.inc.php b/interface/lib/plugins/mail_user_filter_plugin.inc.php index 26c0b02b83dcc646495a0056a79b20f71a72cc53..a6fe968e4379b625cf9deeaffc6acca62c58eeef 100644 --- a/interface/lib/plugins/mail_user_filter_plugin.inc.php +++ b/interface/lib/plugins/mail_user_filter_plugin.inc.php @@ -80,7 +80,7 @@ class mail_user_filter_plugin { } } - // We did not found our rule, so we add it now as first rule. + // We did not find our rule, so we add it now as first rule. if($found == false && $page_form->dataRecord["active"] == 'y') { $new_rule = $this->mail_user_filter_get_rule($page_form); $out = $new_rule . $out; @@ -92,7 +92,7 @@ class mail_user_filter_plugin { } /* - * Remove the rendered filter from custom_mailfilter when a mail_user_filter is deleted + * Remove the rendered filter from custom_mailfilter when a mail_user_filter is deleted. */ function mail_user_filter_del($event_name, $page_form) { global $app, $conf; @@ -137,8 +137,13 @@ class mail_user_filter_plugin { $content = ''; $content .= '### BEGIN FILTER_ID:'.$page_form->id."\n"; - //$content .= 'require ["fileinto", "regex", "vacation"];'."\n"; - + if($page_form->dataRecord["source"] == 'Header') { + $parts = explode(':',trim($page_form->dataRecord["searchterm"])); + $page_form->dataRecord["source"] = trim(array_shift($parts)); + $page_form->dataRecord["searchterm"] = trim(implode(':',$parts)); + unset($parts); + } + if($page_form->dataRecord["op"] == 'domain') { $content .= 'if address :domain :is "'.strtolower($page_form->dataRecord["source"]).'" "'.$page_form->dataRecord["searchterm"].'" {'."\n"; } elseif ($page_form->dataRecord["op"] == 'localpart') { @@ -152,33 +157,50 @@ class mail_user_filter_plugin { $content .= 'if size :over '.intval($page_form->dataRecord["searchterm"]).$unit.' {'."\n"; } else { - if($page_form->dataRecord["source"] == 'Header') { - $parts = explode(':',trim($page_form->dataRecord["searchterm"])); - $page_form->dataRecord["source"] = trim($parts[0]); - unset($parts[0]); - $page_form->dataRecord["searchterm"] = trim(implode(':',$parts)); - unset($parts); - } + $content .= 'if header :regex "'.strtolower($page_form->dataRecord["source"]).'" ["'; + + # special chars in sieve regex must be escaped with double-backslash + if($page_form->dataRecord["op"] == 'regex') { + # if providing a regex, special chars must already be quoted as intended; + # we will simply try to check for an obviously unquoted double-quote and handle that. + $patterns = array( '/([^\\\\]{2})"/', '/([^\\\\])\\\\"/' ); + $replace = array( '${1}\\\\\\\\"', '${1}\\\\\\\\"' ); + $searchterm = preg_replace( $patterns, $replace, $page_form->dataRecord["searchterm"] ); + } else { + $sieve_regex_escape = array( + '\\' => '\\\\\\', + '+' => '\\\\+', + '*' => '\\\\*', + '?' => '\\\\?', + '[' => '\\\\[', + '^' => '\\\\^', + ']' => '\\\\]', + '$' => '\\\\$', + '(' => '\\\\(', + ')' => '\\\\)', + '{' => '\\\\{', + '}' => '\\\\}', + '|' => '\\\\|', + '.' => '\\\\.', + # these (from preg_quote) should not be needed + #'=' => '\\\\=', + #'!' => '\\\\!', + #'<' => '\\\\<', + #'>' => '\\\\>', + #':' => '\\\\:', + #'-' => '\\\\-', + #'#' => '\\\\#', + ); + $searchterm = strtr( $page_form->dataRecord["searchterm"], $sieve_regex_escape ); - $content .= 'if header :regex ["'.strtolower($page_form->dataRecord["source"]).'"] ["'; - - $searchterm = preg_quote($page_form->dataRecord["searchterm"]); - $searchterm = str_replace( - array( - '"', - '\\[', - '\\]' - ), - array( - '\\"', - '\\\\[', - '\\\\]' - ), $searchterm); + } if($page_form->dataRecord["op"] == 'contains') { $content .= ".*".$searchterm; } elseif ($page_form->dataRecord["op"] == 'is') { $content .= "^".$searchterm."$"; + } elseif ($page_form->dataRecord["op"] == 'regex') { + $content .= $searchterm; } elseif ($page_form->dataRecord["op"] == 'begins') { $content .= "^".$searchterm.""; } elseif ($page_form->dataRecord["op"] == 'ends') { @@ -195,7 +217,7 @@ class mail_user_filter_plugin { } elseif ($page_form->dataRecord["action"] == 'stop') { $content .= " stop;\n"; } elseif ($page_form->dataRecord["action"] == 'reject') { - $content .= ' reject "'.$page_form->dataRecord["target"].'"; stop;\n\n'; + $content .= ' reject "'.$page_form->dataRecord["target"].'";' . "\n stop;\n"; } else { $content .= " discard;\n stop;\n"; } diff --git a/interface/lib/plugins/sites_web_vhost_domain_plugin.inc.php b/interface/lib/plugins/sites_web_vhost_domain_plugin.inc.php index 2d1ce3794ac2407f67a73c28c79dc6ab124505bd..56dc825fd41b75b6acc03d9e07824f30b5150919 100644 --- a/interface/lib/plugins/sites_web_vhost_domain_plugin.inc.php +++ b/interface/lib/plugins/sites_web_vhost_domain_plugin.inc.php @@ -46,12 +46,20 @@ class sites_web_vhost_domain_plugin { $vhostdomain_type = 'domain'; if($page_form->dataRecord['type'] == 'vhostalias') $vhostdomain_type = 'aliasdomain'; elseif($page_form->dataRecord['type'] == 'vhostsubdomain') $vhostdomain_type = 'subdomain'; - - // make sure that the record belongs to the clinet group and not the admin group when a dmin inserts it - // also make sure that the user can not delete domain created by a admin + + // make sure that the record belongs to the client group and not the admin group when a admin inserts it + // also make sure that the user can not delete domain created by a admin if client protection is enabled 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"]); - $app->db->query("UPDATE web_domain SET sys_groupid = ?, sys_perm_group = 'ru' WHERE domain_id = ?", $client_group_id, $page_form->id); + $app->uses('getconf'); + $global_config = $app->getconf->get_global_config('sites'); + if($global_config['client_protection'] == 'y') { + $app->db->query("UPDATE web_domain SET sys_groupid = ?, sys_perm_group = 'ru' WHERE domain_id = ?", $client_group_id, $page_form->id); + } else { + $sysuser = $app->db->queryOneRecord('SELECT userid FROM sys_user WHERE default_group = ?',$client_group_id); + $sysuser_id = (is_array($sysuser) && isset($sysuser['userid']) && $sysuser['userid'] > 0)?$sysuser['userid']:1; + $app->db->query("UPDATE web_domain SET sys_userid = ?, sys_groupid = ?, sys_perm_group = 'riud' WHERE domain_id = ?", $sysuser_id, $client_group_id, $page_form->id); + } } if($app->auth->has_clients($_SESSION['s']['user']['userid']) && isset($page_form->dataRecord["client_group_id"])) { $client_group_id = $app->functions->intval($page_form->dataRecord["client_group_id"]); @@ -62,7 +70,7 @@ class sites_web_vhost_domain_plugin { $web_config = $app->getconf->get_server_config($app->functions->intval($page_form->dataRecord['server_id']), 'web'); if(isset($app->tform) && is_object($app->tform)) $web_rec = $app->tform->getDataRecord($page_form->id); else $web_rec = $app->remoting_lib->getDataRecord($page_form->id); - + if($vhostdomain_type == 'domain') { $document_root = str_replace("[website_id]", $page_form->id, $web_config["website_path"]); $document_root = str_replace("[website_idhash_1]", $this->id_hash($page_form->id, 1), $document_root); @@ -97,7 +105,7 @@ class sites_web_vhost_domain_plugin { $document_root = str_replace("[client_idhash_2]", $this->id_hash($client_id, 2), $document_root); $document_root = str_replace("[client_idhash_3]", $this->id_hash($client_id, 3), $document_root); $document_root = str_replace("[client_idhash_4]", $this->id_hash($client_id, 4), $document_root); - + if($event_name == 'sites:web_vhost_domain:on_after_update') { if(($_SESSION["s"]["user"]["typ"] == 'admin' || $app->auth->has_clients($_SESSION['s']['user']['userid'])) && isset($page_form->dataRecord["client_group_id"]) && $page_form->dataRecord["client_group_id"] != $page_form->oldDataRecord["sys_groupid"]) { @@ -249,10 +257,12 @@ class sites_web_vhost_domain_plugin { } //* Change database backup options when web backup options have been changed - if(isset($page_form->dataRecord['backup_interval']) && ($page_form->dataRecord['backup_interval'] != $page_form->oldDataRecord['backup_interval'] || $page_form->dataRecord['backup_copies'] != $page_form->oldDataRecord['backup_copies'])) { + if(isset($page_form->dataRecord['backup_interval']) && ($page_form->dataRecord['backup_interval'] != $page_form->oldDataRecord['backup_interval'] || $page_form->dataRecord['backup_copies'] != $page_form->oldDataRecord['backup_copies'] || $page_form->dataRecord['backup_format_web'] != $page_form->oldDataRecord['backup_format_web'] || $page_form->dataRecord['backup_format_db'] != $page_form->oldDataRecord['backup_format_db'])) { //* Update all databases $backup_interval = $page_form->dataRecord['backup_interval']; $backup_copies = $app->functions->intval($page_form->dataRecord['backup_copies']); + $backup_format_web = $page_form->dataRecord['backup_format_web']; + $backup_format_db = $page_form->dataRecord['backup_format_db']; $records = $app->db->queryAllRecords("SELECT database_id FROM web_database WHERE parent_domain_id = ".$page_form->id); foreach($records as $rec) { $app->db->datalogUpdate('web_database', array("backup_interval" => $backup_interval, "backup_copies" => $backup_copies), 'database_id', $rec['database_id']); @@ -261,6 +271,8 @@ class sites_web_vhost_domain_plugin { unset($rec); unset($backup_copies); unset($backup_interval); + unset($backup_format_web); + unset($backup_format_db); } //* Change vhost subdomain and alias ip/ipv6 if domain ip/ipv6 has changed @@ -276,7 +288,7 @@ class sites_web_vhost_domain_plugin { $php_open_basedir = str_replace("[website_path]", $document_root, $web_config["php_open_basedir"]); $php_open_basedir = str_replace("[website_domain]", $app->functions->idn_encode($page_form->dataRecord['domain']), $php_open_basedir); $htaccess_allow_override = $web_config["htaccess_allow_override"]; - + $sql = "UPDATE web_domain SET system_user = ?, system_group = ?, document_root = ?, allow_override = ?, php_open_basedir = ? WHERE domain_id = ?"; $app->db->query($sql, $system_user, $system_group, $document_root, $htaccess_allow_override, $php_open_basedir, $page_form->id); } diff --git a/interface/lib/plugins/system_config_dns_ca_plugin.inc.php b/interface/lib/plugins/system_config_dns_ca_plugin.inc.php index c35934e5bfa542b9d5540802100eec148306f74c..ba28ca0641e04a0d1d95bd275ef796cba01c86e3 100644 --- a/interface/lib/plugins/system_config_dns_ca_plugin.inc.php +++ b/interface/lib/plugins/system_config_dns_ca_plugin.inc.php @@ -65,9 +65,11 @@ class system_config_dns_ca_plugin { } function web_vhost_domain_edit($event_name, $page_form) { - global $app; + global $app, $conf; + + $global_config = $app->getconf->get_global_config('sites'); - if($page_form->dataRecord['ssl_letsencrypt'] == 'y') { + if(($page_form->dataRecord['ssl_letsencrypt'] == 'y') && ($global_config['le_caa_autocreate_options'] != 'n')) { $domain = $page_form->dataRecord['domain']; $subdomain = $page_form->dataRecord['subdomain']; $temp=$app->db->queryAllRecords("SELECT * FROM dns_rr WHERE type = 'CAA' AND (name = ? OR name = ?) AND data like ?", $domain.'.', $subdomain.'.'.$domain.'.', '%letsencrypt%'); diff --git a/interface/web/admin/directive_snippets_del.php b/interface/web/admin/directive_snippets_del.php index 551634f0a8664891eefe10e733e8acc350ca7d40..91dae44155ea1bdd23da0d9151909cc146d963a7 100644 --- a/interface/web/admin/directive_snippets_del.php +++ b/interface/web/admin/directive_snippets_del.php @@ -45,7 +45,31 @@ require_once '../../lib/app.inc.php'; //* Check permissions for module $app->auth->check_module_permissions('admin'); -$app->uses("tform_actions"); -$app->tform_actions->onDelete(); +$app->load("tform_actions"); + +class page_action extends tform_actions { + function onBeforeDelete() { + global $app; + + if($this->dataRecord['type'] === 'php') { + $rlike = $this->dataRecord['directive_snippets_id'].'|,'.$this->dataRecord['directive_snippets_id'].'|'.$this->dataRecord['directive_snippets_id'].','; + $affected_snippets = $app->db->queryAllRecords('SELECT directive_snippets_id FROM directive_snippets WHERE required_php_snippets REGEXP ?', $rlike); + if(is_array($affected_snippets) && !empty($affected_snippets)) { + foreach($affected_snippets as $snippet) { + $sql_in[] = $snippet['directive_snippets_id']; + } + $affected_sites = $app->db->queryAllRecords('SELECT domain_id FROM web_domain WHERE directive_snippets_id IN ?', $sql_in); + } + } elseif($this->dataRecord['type'] === 'apache' || $this->dataRecord['type'] === 'nginx') { + $affected_sites = $app->db->queryAllRecords('SELECT domain_id FROM web_domain WHERE directive_snippets_id = ?', $this->dataRecord['directive_snippets_id']); + } + + if(!empty($affected_sites)) { + $app->error($app->tform->lng('error_delete_snippet_active_sites')); + } + } +} + +$page = new page_action(); +$page->onDelete(); -?> diff --git a/interface/web/admin/directive_snippets_edit.php b/interface/web/admin/directive_snippets_edit.php index b12da0a79bf28f000b0c11103db13482557608ad..14a2807f49f2b037596b00d01c7b349aa1be73ea 100644 --- a/interface/web/admin/directive_snippets_edit.php +++ b/interface/web/admin/directive_snippets_edit.php @@ -49,54 +49,58 @@ $app->uses('tpl,tform,tform_actions'); class page_action extends tform_actions { - function onShow() { - global $app, $conf; - - if($this->id > 0){ - $record = $app->db->queryOneRecord("SELECT * FROM directive_snippets WHERE directive_snippets_id = ?", $this->id); - if($record['master_directive_snippets_id'] > 0){ - unset($app->tform->formDef["tabs"]['directive_snippets']['fields']['name'], $app->tform->formDef["tabs"]['directive_snippets']['fields']['type'], $app->tform->formDef["tabs"]['directive_snippets']['fields']['snippet'], $app->tform->formDef["tabs"]['directive_snippets']['fields']['required_php_snippets']); + private function getAffectedSites() { + global $app; + + if($this->dataRecord['type'] === 'php') { + $rlike = $this->dataRecord['id'].'|,'.$this->dataRecord['id'].'|'.$this->dataRecord['id'].','; + $affected_snippets = $app->db->queryAllRecords('SELECT directive_snippets_id FROM directive_snippets WHERE required_php_snippets REGEXP ?', $rlike); + if(is_array($affected_snippets) && !empty($affected_snippets)) { + foreach($affected_snippets as $snippet) { + $sql_in[] = $snippet['directive_snippets_id']; + } + $affected_sites = $app->db->queryAllRecords('SELECT domain_id FROM web_domain WHERE directive_snippets_id IN ?', $sql_in); } - unset($record); + } elseif($this->dataRecord['type'] === 'apache' || $this->dataRecord['type'] === 'nginx') { + $affected_sites = $app->db->queryAllRecords('SELECT domain_id FROM web_domain WHERE directive_snippets_id = ?', $this->dataRecord['id']); } - - parent::onShow(); + + return $affected_sites; } - - function onShowEnd() { - global $app, $conf; - - $is_master = false; - if($this->id > 0){ - if($this->dataRecord['master_directive_snippets_id'] > 0){ - $is_master = true; - $app->tpl->setVar("name", $this->dataRecord['name'], true); - $app->tpl->setVar("type", $this->dataRecord['type'], true); - $app->tpl->setVar("snippet", $this->dataRecord['snippet'], true); + + public function onBeforeUpdate() { + global $app; + + $oldRecord = $app->tform->getDataRecord($this->id); + + if($this->dataRecord['active'] !== 'y' && $oldRecord['active'] === 'y') { + $affected_sites = $this->getAffectedSites(); + if(!empty($affected_sites)) { + $app->tform->errorMessage .= $app->tform->lng('error_disable_snippet_active_sites'); + } + } elseif($this->dataRecord['customer_viewable'] !== 'y' && $oldRecord['customer_viewable'] === 'y') { + $affected_sites = $this->getAffectedSites(); + if(!empty($affected_sites)) { + $app->tform->errorMessage .= $app->tform->lng('error_hide_snippet_active_sites'); } } - $app->tpl->setVar("is_master", $is_master); - - parent::onShowEnd(); } - - function onSubmit() { - global $app, $conf; - - if($this->id > 0){ - $record = $app->db->queryOneRecord("SELECT * FROM directive_snippets WHERE directive_snippets_id = ?", $this->id); - if($record['master_directive_snippets_id'] > 0){ - unset($app->tform->formDef["tabs"]['directive_snippets']['fields']['name'], $app->tform->formDef["tabs"]['directive_snippets']['fields']['type'], $app->tform->formDef["tabs"]['directive_snippets']['fields']['snippet'], $app->tform->formDef["tabs"]['directive_snippets']['fields']['required_php_snippets']); + + public function onAfterUpdate() { + global $app; + + if(isset($this->dataRecord['update_sites']) && $this->dataRecord['update_sites'] === 'y' && $this->dataRecord['active'] === 'y') { + $affected_sites = $this->getAffectedSites(); + + if(is_array($affected_sites) && !empty($affected_sites)) { + foreach($affected_sites as $site) { + $website = $app->db->queryOneRecord('SELECT * FROM web_domain WHERE domain_id = ?', $site['domain_id']); + $app->db->datalogUpdate('web_domain', $website, 'domain_id', $site['domain_id'], true); + } } - unset($record); } - - parent::onSubmit(); } - } $page = new page_action; -$page->onLoad(); - -?> +$page->onLoad(); \ No newline at end of file diff --git a/interface/web/admin/directive_snippets_list.php b/interface/web/admin/directive_snippets_list.php index 1376ef02f6509aad4d33d0e3c8e2cc60d978b69e..97cdc449a7c338ff4a14435d7eaaef065dc920df 100644 --- a/interface/web/admin/directive_snippets_list.php +++ b/interface/web/admin/directive_snippets_list.php @@ -57,8 +57,6 @@ class list_action extends listform_actions { //* Alternating datarow colors $this->DataRowColor = ($this->DataRowColor == '#FFFFFF') ? '#EEEEEE' : '#FFFFFF'; $rec['bgcolor'] = $this->DataRowColor; - - $rec['is_master'] = $rec['master_directive_snippets_id']; //* substitute value for select fields if(is_array($app->listform->listDef['item']) && count($app->listform->listDef['item']) > 0) { @@ -79,15 +77,8 @@ class list_action extends listform_actions { $rec['id'] = $rec[$this->idx_key]; return $rec; } - + } $list = new list_action; $list->SQLOrderBy = 'ORDER BY directive_snippets.name'; $list->onLoad(); - -//$app->listform_actions->SQLExtWhere = 'master_directive_snippets_id = 0'; -/* -$app->listform_actions->SQLOrderBy = 'ORDER BY directive_snippets.name'; -$app->listform_actions->onLoad(); -*/ -?> diff --git a/interface/web/admin/form/dbsync.tform.php b/interface/web/admin/form/dbsync.tform.php index 8a4181b88870045b8b839c686bb67913db67bd6f..b854db81f93238575135def343cc38f603b8a988 100644 --- a/interface/web/admin/form/dbsync.tform.php +++ b/interface/web/admin/form/dbsync.tform.php @@ -94,7 +94,7 @@ unset($form); $form['title'] = 'DB sync'; -$form['description'] = 'ISPConfig database synchronisation tool.'; +//$form['description'] = 'ISPConfig database synchronisation tool.'; $form['name'] = 'dbsync'; $form['action'] = 'dbsync_edit.php'; $form['db_table'] = 'sys_dbsync'; diff --git a/interface/web/admin/form/directive_snippets.tform.php b/interface/web/admin/form/directive_snippets.tform.php index d451a5079594eb41fe5ba10bbdee36b90324e387..bf4463d2b7fb3f37be1c87e3c63f1da255a2ce8d 100644 --- a/interface/web/admin/form/directive_snippets.tform.php +++ b/interface/web/admin/form/directive_snippets.tform.php @@ -66,10 +66,9 @@ $form["tabs"]['directive_snippets'] = array ( 'name' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'TEXT', - 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', - 'errmsg'=> 'directive_snippets_name_empty'), - 1 => array ( 'type' => 'UNIQUE', - 'errmsg'=> 'directive_snippets_name_error_unique'), + 'validators' => array ( + 0 => array ( 'type' => 'NOTEMPTY', 'errmsg'=> 'directive_snippets_name_empty'), + 1 => array ( 'type' => 'CUSTOM', 'class' => 'validate_server_directive_snippets', 'function' => 'validate_snippet'), ), 'filters' => array( 0 => array( 'event' => 'SAVE', @@ -111,12 +110,18 @@ $form["tabs"]['directive_snippets'] = array ( 'default' => 'y', 'value' => array(0 => 'n', 1 => 'y') ), + 'update_sites' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n', 1 => 'y') + ), 'required_php_snippets' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOXARRAY', 'default' => '', 'datasource' => array ( 'type' => 'SQL', - 'querystring' => "SELECT directive_snippets_id,name FROM directive_snippets WHERE type = 'php' AND active = 'y' AND master_directive_snippets_id = 0 ORDER BY name", + 'querystring' => "SELECT directive_snippets_id,name FROM directive_snippets WHERE type = 'php' AND active = 'y' ORDER BY name", 'keyfield' => 'directive_snippets_id', 'valuefield' => 'name' ), diff --git a/interface/web/admin/form/firewall.tform.php b/interface/web/admin/form/firewall.tform.php index e136b345be40b4cc6e48d0c16d1f98d1ef48a104..90614bac55394582cd661649b72810c32b9d7219 100644 --- a/interface/web/admin/form/firewall.tform.php +++ b/interface/web/admin/form/firewall.tform.php @@ -76,10 +76,10 @@ $form["tabs"]['firewall'] = array ( 'datatype' => 'VARCHAR', 'formtype' => 'TEXT', 'validators' => array ( 0 => array ( 'type' => 'REGEX', - 'regex' => '/^[\s0-9\,\:]{0,255}$/', + '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' @@ -88,10 +88,10 @@ $form["tabs"]['firewall'] = array ( 'datatype' => 'VARCHAR', 'formtype' => 'TEXT', 'validators' => array ( 0 => array ( 'type' => 'REGEX', - 'regex' => '/^[\s0-9\,\:]{0,255}$/', - 'errmsg'=> 'tcp_ports_error_regex'), + '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/groups.tform.php b/interface/web/admin/form/groups.tform.php index 5bcbe6279f7a82a3e5d49c4b08c67f9e313c7266..6a2b3acb9f82d70bd9def77294cb997870bcc2ec 100644 --- a/interface/web/admin/form/groups.tform.php +++ b/interface/web/admin/form/groups.tform.php @@ -60,7 +60,7 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ $form["title"] = "Groups"; -$form["description"] = "groups_description"; +//$form["description"] = "groups_description"; $form["name"] = "groups"; $form["action"] = "groups_edit.php"; $form["db_table"] = "sys_group"; diff --git a/interface/web/admin/form/iptables.tform.php b/interface/web/admin/form/iptables.tform.php index 76d747020d3966a7390d141c7df50c2262687764..d36ade42b8637e02a333120e2d57b72ff11ae55f 100644 --- a/interface/web/admin/form/iptables.tform.php +++ b/interface/web/admin/form/iptables.tform.php @@ -1,7 +1,7 @@ "Remote User", + 'title' => "remote_user_txt", 'width' => 100, 'template' => "templates/remote_user_edit.htm", 'fields' => array ( @@ -109,7 +109,7 @@ $form["tabs"]['remote_user'] = array ( 'errmsg' => 'weak_password_txt' ) ), - 'encryption' => 'MD5', + 'encryption' => 'CRYPT', 'default' => '', 'value' => '', 'width' => '30', @@ -124,11 +124,11 @@ $form["tabs"]['remote_user'] = array ( 'remote_ips' => array ( 'datatype' => 'TEXT', 'formtype' => 'TEXT', - 'validators' => array ( + 'validators' => array ( 0 => array ( - 'type' => 'CUSTOM', - 'class' => 'validate_remote_user', - 'function' => 'valid_remote_ip', + 'type' => 'CUSTOM', + 'class' => 'validate_remote_user', + 'function' => 'valid_remote_ip', 'errmsg' => 'remote_user_error_ips'), ), 'default' => '', @@ -146,6 +146,7 @@ $form["tabs"]['remote_user'] = array ( 'separator' => ';', 'width' => '', 'maxlength' => '', + 'render_inline' => 'n', 'rows' => '5', 'cols' => '30' ) diff --git a/interface/web/admin/form/server_config.tform.php b/interface/web/admin/form/server_config.tform.php index c6022e6bc2f12c3a9f2f5ed4c171517a4e6b9144..679ebb2b7fae5ddcff4706d56bd391b3142f7bb3 100644 --- a/interface/web/admin/form/server_config.tform.php +++ b/interface/web/admin/form/server_config.tform.php @@ -33,8 +33,8 @@ */ -$form["title"] = "Server Config"; -$form["description"] = ""; +$form["title"] = "server_config"; +//$form["description"] = ""; $form["name"] = "server_config"; $form["action"] = "server_config_edit.php"; $form["db_table"] = "server"; @@ -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,30}$/', + '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' ), @@ -456,11 +456,13 @@ $form["tabs"]['mail'] = array( 'datatype' => 'VARCHAR', 'formtype' => 'TEXT', 'default' => '/home/vmail/', - 'validators' => array( 0 => array('type' => 'NOTEMPTY', - 'errmsg' => 'homedir_path_error_empty'), - 1 => array ( 'type' => 'REGEX', - 'regex' => '/^\/[a-zA-Z0-9\.\-\_\/]{5,128}$/', - 'errmsg'=> 'homedir_path_error_regex'), + 'validators' => array( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg' => 'homedir_path_error_empty' + ), + 1 => array ( 'type' => 'REGEX', + 'regex' => '/^\/[a-zA-Z0-9\.\-\_\/]{5,128}$/', + 'errmsg'=> 'homedir_path_error_regex' + ), ), 'value' => '', 'width' => '40', @@ -479,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( @@ -638,6 +689,17 @@ $form["tabs"]['mail'] = array( 'default' => 'n', 'value' => array(0 => 'n', 1 => 'y') ), + 'reject_unknown' => array( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => 'helo', + 'value' => array( + 'helo' => 'reject_unknown_helo_txt', + 'client' => 'reject_unknown_client_txt', + 'client_helo' => 'reject_unknown_client_helo_txt', + 'none' => 'disabled_txt', + ) + ), 'mailbox_size_limit' => array( 'datatype' => 'INTEGER', 'formtype' => 'TEXT', @@ -654,12 +716,6 @@ $form["tabs"]['mail'] = array( 'width' => '10', 'maxlength' => '15' ), - 'mailbox_quota_stats' => array ( - 'datatype' => 'VARCHAR', - 'formtype' => 'CHECKBOX', - 'default' => 'y', - 'value' => array(0 => 'n', 1 => 'y') - ), 'realtime_blackhole_list' => array( 'datatype' => 'VARCHAR', 'formtype' => 'TEXT', @@ -672,12 +728,48 @@ $form["tabs"]['mail'] = array( 'width' => '40', 'maxlength' => '255' ), + 'stress_adaptive' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n', 1 => 'y') + ), + 'mailbox_soft_delete' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'n', + 'value' => array(0 => 'n', 1 => 'y') + ), + 'mailbox_quota_stats' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + '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', 'default' => 'y', 'value' => array(0 => 'n', 1 => 'y') ), + 'overquota_notify_reseller' => array( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n', 1 => 'y') + ), 'overquota_notify_client' => array( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', @@ -698,6 +790,18 @@ $form["tabs"]['mail'] = array( 'default' => 'n', 'value' => array(0 => 'n', 1 => 'y') ), + 'rspamd_url' => array( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'filters' => array( + 0 => array( 'event' => 'SAVE', 'type' => 'IDNTOASCII'), + 1 => array( 'event' => 'SHOW', 'type' => 'IDNTOUTF8') + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), //################################# // END Datatable fields //################################# @@ -820,6 +924,28 @@ $form["tabs"]['web'] = array( 'default' => 'n', 'value' => array(0 => 'n',1 => 'y') ), + 'vhost_proxy_protocol_enabled' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'n', + 'value' => array(0 => 'n',1 => 'y') + ), + 'vhost_proxy_protocol_http_port' => array( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '880', + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'vhost_proxy_protocol_https_port' => array( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '8443', + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), 'vhost_conf_dir' => array( 'datatype' => 'VARCHAR', 'formtype' => 'TEXT', @@ -968,30 +1094,78 @@ $form["tabs"]['web'] = array( 'default' => 'y', 'value' => array(0 => 'n', 1 => 'y') ), + 'overtraffic_notify_reseller' => array( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n', 1 => 'y') + ), 'overtraffic_notify_client' => array( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'y', 'value' => array(0 => 'n', 1 => 'y') ), + 'overtraffic_disable_web' => array( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + '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', 'default' => 'y', 'value' => array(0 => 'n', 1 => 'y') ), + 'overquota_notify_reseller' => array( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n', 1 => 'y') + ), 'overquota_notify_client' => array( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', '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', 'default' => 'y', 'value' => array(0 => 'n', 1 => 'y') ), + 'overquota_db_notify_reseller' => array( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n', 1 => 'y') + ), 'overquota_db_notify_client' => array( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', @@ -1129,6 +1303,12 @@ $form["tabs"]['web'] = array( 'width' => '40', 'maxlength' => '255' ), + 'php_default_hide' => array( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'n', + 'value' => array(0 => 'n', 1 => 'y') + ), 'php_default_name' => array( 'datatype' => 'VARCHAR', 'formtype' => 'TEXT', @@ -1246,6 +1426,12 @@ $form["tabs"]['web'] = array( 'value' => array('no' => 'disabled_txt', 'fast-cgi' => 'Fast-CGI', 'cgi' => 'CGI', 'mod' => 'Mod-PHP', 'suphp' => 'SuPHP', 'php-fpm' => 'PHP-FPM', 'hhvm' => 'HHVM'), 'searchable' => 2 ), + 'php_fpm_default_chroot' => array( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'n', + 'value' => array(0 => 'n', 1 => 'y') + ), 'php_fpm_incron_reload' => array( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', @@ -1283,15 +1469,6 @@ $form["tabs"]['web'] = array( 'width' => '40', 'maxlength' => '255' ), - 'enable_spdy' => array ( - 'datatype' => 'VARCHAR', - 'formtype' => 'CHECKBOX', - 'default' => 'y', - 'value' => array ( - 0 => 'n', - 1 => 'y' - ) - ), 'apps_vhost_enabled' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', @@ -1475,6 +1652,20 @@ $form["tabs"]['dns'] = array( 'width' => '40', 'maxlength' => '255' ), + 'bind_keyfiles_dir' => array( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array( 0 => array('type' => 'NOTEMPTY', + 'errmsg' => 'bind_keyfiles_dir_error_empty'), + 1 => array ( 'type' => 'REGEX', + 'regex' => '/^\/[a-zA-Z0-9\.\-\_\/]{1,128}$/', + 'errmsg'=> 'bind_keyfiles_dir_error_regex'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), 'named_conf_path' => array( 'datatype' => 'VARCHAR', 'formtype' => 'TEXT', @@ -1740,7 +1931,7 @@ $form["tabs"]['jailkit'] = array( 'validators' => array( 0 => array('type' => 'NOTEMPTY', 'errmsg' => 'jailkit_chroot_home_error_empty'), 1 => array ( 'type' => 'REGEX', - 'regex' => '/^\/[a-zA-Z0-9\.\-\_\/\[\]]{1,128}$/', + 'regex' => '/^\/[a-zA-Z0-9\.\-\_\/\[\]]{1,}$/', 'errmsg'=> 'jailkit_chroot_home_error_regex'), ), 'value' => '', @@ -1754,7 +1945,7 @@ $form["tabs"]['jailkit'] = array( 'validators' => array( 0 => array('type' => 'NOTEMPTY', 'errmsg' => 'jailkit_chroot_app_sections_error_empty'), 1 => array ( 'type' => 'REGEX', - 'regex' => '/^[a-zA-Z0-9\-\_\ ]{1,128}$/', + 'regex' => '/^[a-zA-Z0-9\.\-\_\ ]{1,}$/', 'errmsg'=> 'jailkit_chroot_app_sections_error_regex'), ), 'value' => '', @@ -1789,6 +1980,28 @@ $form["tabs"]['jailkit'] = array( 'width' => '40', 'maxlength' => '1000' ), + 'jailkit_chroot_authorized_keys_template' => array( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'validators' => array( 0 => array ( 'type' => 'REGEX', + 'regex' => '/^[a-zA-Z0-9\.\-\_\/\ ]*$/', + 'errmsg'=> 'jailkit_chroot_authorized_keys_template_error_regex'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '1000' + ), + 'jailkit_hardlinks' => array( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => 'allow', + 'value' => array( + 'allow' => 'jailkit_hardlinks_allow_txt', + 'no' => 'jailkit_hardlinks_no_txt', + 'yes' => 'jailkit_hardlinks_yes_txt', + ) + ), //################################# // END Datatable fields //################################# @@ -1994,4 +2207,4 @@ if(!isset($mail_config['rspamd_available']) || $mail_config['rspamd_available'] $form['tabs']['mail']['fields']['content_filter']['default'] = 'amavisd'; unset($form['tabs']['mail']['fields']['content_filter']['value']['rspamd']); unset($form['tabs']['mail']['fields']['rspamd_password']); -}*/ \ No newline at end of file +}*/ diff --git a/interface/web/admin/form/server_ip.tform.php b/interface/web/admin/form/server_ip.tform.php index cd7190ebc6923c74d82f8abddd3aa2421e8f381f..920e55119190a8b77d96a146e50f990704d3619f 100644 --- a/interface/web/admin/form/server_ip.tform.php +++ b/interface/web/admin/form/server_ip.tform.php @@ -64,8 +64,8 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -$form["title"] = "IP Addresses"; -$form["description"] = "Form to edit system IP Addresses"; +$form["title"] = "server_ip_edit_title"; +//$form["description"] = "server_ip_edit_desc"; $form["name"] = "server_ip"; $form["action"] = "server_ip_edit.php"; $form["db_table"] = "server_ip"; diff --git a/interface/web/admin/form/server_ip_map.tform.php b/interface/web/admin/form/server_ip_map.tform.php index 4f7ed3d28c55e3744605d2d390da8e0eeec1006a..1f611d1dad8aa6f2b8d241f9c64506607c755c23 100644 --- a/interface/web/admin/form/server_ip_map.tform.php +++ b/interface/web/admin/form/server_ip_map.tform.php @@ -28,8 +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. */ -$form["title"] = "IPv4 Address mapping"; -$form["description"] = "Form to map IPv4-addresses for Web-Server"; +$form["title"] = "server_ip_map_title"; +//$form["description"] = "server_ip_map_desc"; $form["name"] = "server_ip_map"; $form["action"] = "server_ip_map_edit.php"; $form["db_table"] = "server_ip_map"; @@ -46,7 +46,7 @@ $form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, $form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete $form["tabs"]['server_ip_map'] = array ( - 'title' => "IP Address Mapping", + 'title' => "server_ip_map_title", 'width' => 80, 'template' => "templates/server_ip_map_edit.htm", 'fields' => array ( @@ -59,7 +59,7 @@ $form["tabs"]['server_ip_map'] = array ( 'source_ip' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'SELECT', - 'validators' => array ( + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', 'errmsg'=> 'source_ip_empty'), ), 'default' => '', @@ -68,7 +68,7 @@ $form["tabs"]['server_ip_map'] = array ( 'destination_ip' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'TEXT', - 'validators' => array ( + 'validators' => array ( 0 => array ( 'type' => 'ISIPV4', 'errmsg'=> 'ip_error_wrong'), 1 => array ( 'type' => 'NOTEMPTY', 'errmsg'=> 'destination_ip_empty'), ), diff --git a/interface/web/admin/form/server_php.tform.php b/interface/web/admin/form/server_php.tform.php index 6d443e8d50a939f5807e1ec2c9d08de382e9ba04..2a37a1e6d1e66ecaebe10c8eeef22e77f1c27902 100644 --- a/interface/web/admin/form/server_php.tform.php +++ b/interface/web/admin/form/server_php.tform.php @@ -60,7 +60,7 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ $form["title"] = "Additional PHP Versions"; -$form["description"] = "Form to edit additional PHP versions"; +//$form["description"] = "Form to edit additional PHP versions"; $form["name"] = "server_php"; $form["action"] = "server_php_edit.php"; $form["db_table"] = "server_php"; @@ -229,6 +229,20 @@ $form["tabs"]['php_fpm'] = array( 'width' => '40', 'maxlength' => '255' ), + 'php_fpm_socket_dir' => array( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'filters' => array( + 0 => array( 'event' => 'SAVE', + 'type' => 'STRIPTAGS'), + 1 => array( 'event' => 'SAVE', + 'type' => 'STRIPNL') + ), + 'default' => '', + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), //################################# // END Datatable fields //################################# diff --git a/interface/web/admin/form/software_package.tform.php b/interface/web/admin/form/software_package.tform.php deleted file mode 100644 index b8368d545751d19216fac8c69c588dc62b1cad48..0000000000000000000000000000000000000000 --- a/interface/web/admin/form/software_package.tform.php +++ /dev/null @@ -1,128 +0,0 @@ - 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"]['software_package'] = array ( - 'title' => "Software Package", - 'width' => 80, - 'template' => "templates/software_package_edit.htm", - 'fields' => array ( - //################################# - // Beginn Datenbankfelder - //################################# - 'package_title' => array ( - 'datatype' => 'VARCHAR', - 'formtype' => 'TEXT', - 'filters' => array( - 0 => array( 'event' => 'SAVE', - 'type' => 'STRIPTAGS'), - 1 => array( 'event' => 'SAVE', - 'type' => 'STRIPNL') - ), - 'validators' => '', - 'default' => '', - 'value' => '', - 'separator' => '', - 'width' => '40', - 'maxlength' => '40', - 'rows' => '', - 'cols' => '' - ), - 'package_key' => array ( - 'datatype' => 'VARCHAR', - 'formtype' => 'TEXT', - 'filters' => array( - 0 => array( 'event' => 'SAVE', - 'type' => 'STRIPTAGS'), - 1 => array( 'event' => 'SAVE', - 'type' => 'STRIPNL') - ), - 'validators' => '', - 'default' => '', - 'value' => '', - 'separator' => '', - 'width' => '40', - 'maxlength' => '40', - 'rows' => '', - 'cols' => '' - ), - //################################# - // ENDE Datenbankfelder - //################################# - ) -); -?> diff --git a/interface/web/admin/form/system_config.tform.php b/interface/web/admin/form/system_config.tform.php index cb37cbefdd241ef9227eb596a4d64dc4ee6132df..22212b8b749eedb6fd492a21139ed3cdce10f3b6 100644 --- a/interface/web/admin/form/system_config.tform.php +++ b/interface/web/admin/form/system_config.tform.php @@ -33,8 +33,8 @@ */ -$form["title"] = "System Config"; -$form["description"] = "system_config_desc_txt"; +$form["title"] = "system_config_title"; +//$form["description"] = "system_config_desc_txt"; $form["name"] = "system_config"; $form["action"] = "system_config_edit.php"; $form["db_table"] = "sys_ini"; @@ -148,6 +148,12 @@ $form["tabs"]['sites'] = array ( 'width' => '30', 'maxlength' => '255' ), + 'client_protection' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n', 1 => 'y') + ), 'vhost_subdomains' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', @@ -178,6 +184,12 @@ $form["tabs"]['sites'] = array ( 'default' => 'n', 'value' => array(0 => 'n', 1 => 'y') ), + 'show_aps_menu' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'n', + 'value' => array(0 => 'n', 1 => 'y') + ), 'default_webserver' => array ( 'datatype' => 'INTEGER', 'formtype' => 'SELECT', @@ -200,6 +212,25 @@ $form["tabs"]['sites'] = array ( 'value' => '', 'name' => 'default_dbserver' ), + 'disable_client_remote_dbserver' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'n', + 'value' => array(0 => 'n', 1 => 'y') + ), + 'default_remote_dbserver' => array ( + 'datatype' => 'TEXT', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'CUSTOM', + 'class' => 'validate_database', + 'function' => 'valid_ip_list', + 'errmsg' => 'database_remote_error_ips'), + ), + 'default' => '', + 'value' => '', + 'width' => '60', + 'searchable' => 2 + ), 'web_php_options' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOXARRAY', @@ -210,6 +241,18 @@ $form["tabs"]['sites'] = array ( 'separator' => ',', 'value' => array('no' => 'Disabled', 'fast-cgi' => 'Fast-CGI', 'cgi' => 'CGI', 'mod' => 'Mod-PHP', 'suphp' => 'SuPHP', 'php-fpm' => 'PHP-FPM', 'hhvm' => 'HHVM') ), + 'ssh_authentication' => array( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => array('' => 'ssh_authentication_password_key', 'password' => 'ssh_authentication_password', 'key' => 'ssh_authentication_key') + ), + 'le_caa_autocreate_options' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n', 1 => 'y') + ), //################################# // END Datatable fields //################################# @@ -230,6 +273,18 @@ $form["tabs"]['mail'] = array ( 'default' => 'n', 'value' => array(0 => 'n', 1 => 'y') ), + 'enable_welcome_mail' => array( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n', 1 => 'y') + ), + 'show_per_domain_relay_options' => array( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'n', + 'value' => array(0 => 'n', 1 => 'y') + ), 'mailbox_show_autoresponder_tab' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', @@ -432,6 +487,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 //################################# @@ -543,7 +604,7 @@ $form["tabs"]['misc'] = array ( 1 => array( 'event' => 'SAVE', 'type' => 'STRIPNL') ), - 'default' => 'http://www.ispconfig.org/atom', + 'default' => 'https://www.ispconfig.org/atom', 'value' => '' ), 'dashboard_atom_url_reseller' => array ( @@ -555,7 +616,7 @@ $form["tabs"]['misc'] = array ( 1 => array( 'event' => 'SAVE', 'type' => 'STRIPNL') ), - 'default' => 'http://www.ispconfig.org/atom', + 'default' => 'https://www.ispconfig.org/atom', 'value' => '' ), 'dashboard_atom_url_client' => array ( @@ -567,13 +628,7 @@ $form["tabs"]['misc'] = array ( 1 => array( 'event' => 'SAVE', 'type' => 'STRIPNL') ), - 'default' => 'http://www.ispconfig.org/atom', - 'value' => '' - ), - 'monitor_key' => array ( - 'datatype' => 'VARCHAR', - 'formtype' => 'TEXT', - 'default' => '', + 'default' => 'https://www.ispconfig.org/atom', 'value' => '' ), 'tab_change_discard' => array ( @@ -600,12 +655,32 @@ $form["tabs"]['misc'] = array ( 'default' => 'y', 'value' => array(0 => 'n', 1 => 'y') ), + 'show_support_messages' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n', 1 => 'y') + ), 'maintenance_mode' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', 'value' => array(0 => 'n', 1 => 'y') ), + 'maintenance_mode_exclude_ips' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array( + 0 => array ( + 'type' => 'ISIP', + 'allowempty' => true, + 'separator' => ',', + 'errmsg'=> 'maintenance_mode_exclude_ips_error_isip' + ), + ), + 'default' => '', + 'value' => '' + ), 'admin_dashlets_left' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'TEXT', @@ -756,5 +831,3 @@ $form['tabs']['dns_ca'] = array ( ) ) ); - -?> diff --git a/interface/web/admin/form/tpl_default.tform.php b/interface/web/admin/form/tpl_default.tform.php index baa84d7b309ecb999de03f7098a10c5a17f790be..804cfd95423615e36fab4ff5715f2d96275ff50e 100644 --- a/interface/web/admin/form/tpl_default.tform.php +++ b/interface/web/admin/form/tpl_default.tform.php @@ -60,7 +60,7 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ $form["title"] = "tpl_default_head_txt"; -$form["description"] = "tpl_default_desc_txt"; +//$form["description"] = "tpl_default_desc_txt"; $form["name"] = "tpl_default"; $form["action"] = "tpl_default.php"; $form["db_table"] = "sys_theme"; diff --git a/interface/web/admin/form/users.tform.php b/interface/web/admin/form/users.tform.php index be77122b103a1cae9f0f9bc9f6fa0bf86a514598..05e88e2e2bd11d7d311eab32fe4c307435a67913 100644 --- a/interface/web/admin/form/users.tform.php +++ b/interface/web/admin/form/users.tform.php @@ -60,8 +60,8 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -$form['title'] = 'Users'; -$form['description'] = 'Form to edit systemusers.'; +$form['title'] = 'users_txt'; +//$form['description'] = 'Form to edit systemusers.'; $form['name'] = 'users'; $form['action'] = 'users_edit.php'; $form['db_table'] = 'sys_user'; @@ -94,6 +94,11 @@ while ($file = @readdir($handle)) { } } +$otp_method_list = array( + 'none' => 'none', + 'email' => 'email', +); + //* Load themes $themes_list = array(); $handle = @opendir(ISPC_THEMES_PATH); @@ -129,7 +134,7 @@ if(is_array($tmp_records)) { } $form['tabs']['users'] = array ( - 'title' => 'Users', + 'title' => 'users_txt', 'width' => 80, 'template' => 'templates/users_user_edit.htm', 'fields' => array ( @@ -246,7 +251,7 @@ $form['tabs']['users'] = array ( 'formtype' => 'CHECKBOX', 'regex' => '', 'errmsg' => '', - 'default' => '', + 'default' => '1', 'value' => array(0 => 0, 1 => 1), 'separator' => '', 'width' => '30', @@ -254,6 +259,25 @@ $form['tabs']['users'] = array ( 'rows' => '', 'cols' => '' ), + 'otp_type' => array( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'otp_auth_empty'), + 1 => array ( 'type' => 'REGEX', + 'regex' => '/^[a-z0-9\_]{0,64}$/', + 'errmsg'=> 'otp_auth_regex'), + ), + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => $otp_method_list, + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), 'language' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'SELECT', diff --git a/interface/web/admin/lib/lang/ar_directive_snippets.lng b/interface/web/admin/lib/lang/ar_directive_snippets.lng index 0616afad8b6c76c9eb284f57a673f6c35d286310..0f83e9415955f939b35dec4b9cd8023aa19b0968 100644 --- a/interface/web/admin/lib/lang/ar_directive_snippets.lng +++ b/interface/web/admin/lib/lang/ar_directive_snippets.lng @@ -8,5 +8,8 @@ $wb['directive_snippets_name_empty'] = 'Please specify a name for the snippet.'; $wb['directive_snippets_name_error_unique'] = 'There is already a directive snippet with this name.'; $wb['variables_txt'] = 'Variables'; $wb['customer_viewable_txt'] = 'Customer viewable'; -$wb['required_php_snippets_txt'] = 'Requiered PHP Snippet'; -?> +$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 diff --git a/interface/web/admin/lib/lang/ar_firewall.lng b/interface/web/admin/lib/lang/ar_firewall.lng index e626345d3c1ee3bbce74ffd70c36fcc7ff3297c2..4b1efe7540a4d997bb0a814a68f437082f768122 100644 --- a/interface/web/admin/lib/lang/ar_firewall.lng +++ b/interface/web/admin/lib/lang/ar_firewall.lng @@ -6,6 +6,6 @@ $wb['tcp_port_help_txt'] = 'Separated by comma'; $wb['udp_port_help_txt'] = 'Separated by comma'; $wb['active_txt'] = 'Active'; $wb['firewall_error_unique'] = 'There is already a firewall record for this server.'; -$wb['tcp_ports_error_regex'] = 'Character not allowed in tcp port definition. Allowed characters are numbers, : and ,.'; -$wb['udp_ports_error_regex'] = 'Character not allowed in udp port definition. Allowed characters are numbers, : and ,.'; +$wb['tcp_ports_error_regex'] = 'Character not allowed in TCP port definition. Allowed characters are numbers, colons (:) and commas.'; +$wb['udp_ports_error_regex'] = 'Character not allowed in UDP port definition. Allowed characters are numbers, colons (:) and commas.'; ?> diff --git a/interface/web/admin/lib/lang/ar_language_add.lng b/interface/web/admin/lib/lang/ar_language_add.lng index dc6b2d1b725f9fc83a09377176200713adf99cb0..7c9464f47a31515213e738c04a8460b97c3674ad 100644 --- a/interface/web/admin/lib/lang/ar_language_add.lng +++ b/interface/web/admin/lib/lang/ar_language_add.lng @@ -2,7 +2,7 @@ $wb['list_head_txt'] = 'Add new language'; $wb['language_select_txt'] = 'Select language basis'; $wb['language_new_txt'] = 'New language'; -$wb['language_new_hint_txt'] = '2 characters ISO 639-1 language-code (See http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)'; +$wb['language_new_hint_txt'] = '2 characters ISO 639-1 language-code (See https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)'; $wb['btn_save_txt'] = 'Create new language file set'; $wb['btn_cancel_txt'] = 'Back'; ?> diff --git a/interface/web/admin/lib/lang/ar_remote_action.lng b/interface/web/admin/lib/lang/ar_remote_action.lng index 3fc3eaf81f5d63a057aa0eecf965bfbdaf6af701..dfe56b616d5b3d18abd7eb9965b8c5602cb4354c 100644 --- a/interface/web/admin/lib/lang/ar_remote_action.lng +++ b/interface/web/admin/lib/lang/ar_remote_action.lng @@ -2,11 +2,11 @@ $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.

USE THIS AT YOUR OWN RISK!'; +$wb['do_osupdate_desc'] = 'This Action does a apt -y upgrade at your selected server.

USE THIS AT YOUR OWN RISK!'; $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.

USE THIS AT YOUR OWN RISK!'; $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

ispconfig_update.sh

to start the ISPConfig update.

Click here for detailed update instructions'; +$wb['ispconfig_update_text'] = 'Login as root user on the shell of your server and execute the command

ispconfig_update.sh

to start the ISPConfig update.

Click here for detailed update instructions'; ?> diff --git a/interface/web/admin/lib/lang/ar_remote_user.lng b/interface/web/admin/lib/lang/ar_remote_user.lng index d0504005e310ec5464c4c9fda2eb637bd008f75a..98670aea070653a7d752c9724c08db8efbf97196 100644 --- a/interface/web/admin/lib/lang/ar_remote_user.lng +++ b/interface/web/admin/lib/lang/ar_remote_user.lng @@ -1,4 +1,5 @@ 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'; @@ -303,4 +324,23 @@ $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'; +$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['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/ar_server_ip.lng b/interface/web/admin/lib/lang/ar_server_ip.lng index 88d8a2f6043c7655289f1cc985fa40a20aa36393..1947d3ec371178e804086ad8b872b8bdeccb538f 100644 --- a/interface/web/admin/lib/lang/ar_server_ip.lng +++ b/interface/web/admin/lib/lang/ar_server_ip.lng @@ -1,4 +1,6 @@ diff --git a/interface/web/admin/lib/lang/ar_server_php_list.lng b/interface/web/admin/lib/lang/ar_server_php_list.lng index 62cbe6168714b18ba4fca490280c30c945e09e7c..291302cbb72f6b6ac12dc3e6cb95f18e9dcde90f 100644 --- a/interface/web/admin/lib/lang/ar_server_php_list.lng +++ b/interface/web/admin/lib/lang/ar_server_php_list.lng @@ -5,4 +5,5 @@ $wb['add_new_record_txt'] = 'Add new PHP version'; $wb['client_id_txt'] = 'Client'; $wb['name_txt'] = 'PHP Name'; $wb['active_txt'] = 'Active'; +$wb['usage_txt'] = 'Usage count'; ?> diff --git a/interface/web/admin/lib/lang/ar_software_package.lng b/interface/web/admin/lib/lang/ar_software_package.lng deleted file mode 100644 index faffe38217fb9cac04020e73e473c6c46e3caaa1..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/ar_software_package.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/ar_software_package_install.lng b/interface/web/admin/lib/lang/ar_software_package_install.lng deleted file mode 100644 index 5c8b756434ce27d67e479a96383bbee01bce4f1f..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/ar_software_package_install.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/ar_software_package_list.lng b/interface/web/admin/lib/lang/ar_software_package_list.lng deleted file mode 100644 index 9fa53867bc70f653a4410da5dc70988beebfdcdb..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/ar_software_package_list.lng +++ /dev/null @@ -1,13 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/ar_software_repo.lng b/interface/web/admin/lib/lang/ar_software_repo.lng deleted file mode 100644 index f2cbbb2c25776ab5f1794e7102ad264a98144049..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/ar_software_repo.lng +++ /dev/null @@ -1,8 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/ar_software_repo_list.lng b/interface/web/admin/lib/lang/ar_software_repo_list.lng deleted file mode 100644 index b7a219ffa8e2f6d389fabdc5386286a24fc2a11a..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/ar_software_repo_list.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/ar_software_update_list.lng b/interface/web/admin/lib/lang/ar_software_update_list.lng deleted file mode 100644 index fe7639125cd2634fa809d9a6592e9e9fb21e84bb..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/ar_software_update_list.lng +++ /dev/null @@ -1,9 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/ar_system_config.lng b/interface/web/admin/lib/lang/ar_system_config.lng index 0a830014d8459104d5d61eccab6720f609b1bdd6..4ae8ad3416b7d0a084dd880830c7ab17797145ee 100644 --- a/interface/web/admin/lib/lang/ar_system_config.lng +++ b/interface/web/admin/lib/lang/ar_system_config.lng @@ -1,4 +1,5 @@ diff --git a/interface/web/admin/lib/lang/ar_users.lng b/interface/web/admin/lib/lang/ar_users.lng index dcbc4f4727145c78a9a6a70b4ac3cca5b3ecc0c7..d4acbf4e807d1a9ad740c14e6c5bfbdd12d1d594 100644 --- a/interface/web/admin/lib/lang/ar_users.lng +++ b/interface/web/admin/lib/lang/ar_users.lng @@ -1,9 +1,10 @@ diff --git a/interface/web/admin/lib/lang/ar_users_list.lng b/interface/web/admin/lib/lang/ar_users_list.lng index c59b544d19b1b684f500e2253d9b23bc22f1a9f2..84869c062694fdd70076f76f84fcdbeb41d86fd8 100644 --- a/interface/web/admin/lib/lang/ar_users_list.lng +++ b/interface/web/admin/lib/lang/ar_users_list.lng @@ -4,6 +4,6 @@ $wb['username_txt'] = 'Username'; $wb['client_id_txt'] = 'Client ID'; $wb['active_txt'] = 'Active'; $wb['add_new_record_txt'] = 'Add new user'; -$wb['warning_txt'] = 'WARNING: Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +$wb['warning_txt'] = 'WARNING: Do not edit or modify any client user settings here. Use the client- and reseller settings in the client module instead. Modifying or changing client users or groups here may cause data loss!'; $wb['groups_txt'] = 'Groups'; ?> diff --git a/interface/web/admin/lib/lang/bg_directive_snippets.lng b/interface/web/admin/lib/lang/bg_directive_snippets.lng index 0616afad8b6c76c9eb284f57a673f6c35d286310..0f83e9415955f939b35dec4b9cd8023aa19b0968 100644 --- a/interface/web/admin/lib/lang/bg_directive_snippets.lng +++ b/interface/web/admin/lib/lang/bg_directive_snippets.lng @@ -8,5 +8,8 @@ $wb['directive_snippets_name_empty'] = 'Please specify a name for the snippet.'; $wb['directive_snippets_name_error_unique'] = 'There is already a directive snippet with this name.'; $wb['variables_txt'] = 'Variables'; $wb['customer_viewable_txt'] = 'Customer viewable'; -$wb['required_php_snippets_txt'] = 'Requiered PHP Snippet'; -?> +$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 diff --git a/interface/web/admin/lib/lang/bg_language_add.lng b/interface/web/admin/lib/lang/bg_language_add.lng index 037d5458c2ff13efa7bbe8cb49c5c3042508c579..5171446e435ff4b6595539f777c6e70da5c28345 100644 --- a/interface/web/admin/lib/lang/bg_language_add.lng +++ b/interface/web/admin/lib/lang/bg_language_add.lng @@ -4,5 +4,5 @@ $wb['language_select_txt'] = 'Изберете изходен език'; $wb['language_new_txt'] = 'Нов език'; $wb['btn_save_txt'] = 'Създаване на файловете за новия език'; $wb['btn_cancel_txt'] = 'Отказ'; -$wb['language_new_hint_txt'] = '2 знака ISO 639-1 език, код (Виж http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)'; +$wb['language_new_hint_txt'] = '2 знака ISO 639-1 език, код (Виж https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)'; ?> diff --git a/interface/web/admin/lib/lang/bg_remote_action.lng b/interface/web/admin/lib/lang/bg_remote_action.lng index 48f35054fc43c2408dd6037e5ebd6fd35a03634e..8d6e441d852736b08b183efc2b178fabcab91c53 100644 --- a/interface/web/admin/lib/lang/bg_remote_action.lng +++ b/interface/web/admin/lib/lang/bg_remote_action.lng @@ -2,11 +2,11 @@ $wb['select_server_txt'] = 'Избери сървър'; $wb['btn_do_txt'] = 'Изпълни действие'; $wb['do_osupdate_caption'] = 'Направете OS - Актуализация на отдалечен сървър'; -$wb['do_osupdate_desc'] = 'Това действие прави за aptitude-y ъпгрейд на избрания от Вас сървър.

ИЗПОЛЗВАШ ТОВА НА ТВОЙ РИСК!'; +$wb['do_osupdate_desc'] = 'Това действие прави за apt-y ъпгрейд на избрания от Вас сървър.

ИЗПОЛЗВАШ ТОВА НА ТВОЙ РИСК!'; $wb['do_ispcupdate_caption'] = 'Do ISPConfig 3 - Update at remote server'; $wb['do_ispcupdate_desc'] = 'Това действие прави ISPConfig 3 обновяване на избрания от Вас сървър.

ИЗПОЛЗВАШ ТОВА НА ТВОЙ РИСК!'; $wb['action_scheduled'] = 'Това действие е насрочено за изпълнение'; $wb['select_all_server'] = 'Целия сървър'; $wb['ispconfig_update_title'] = 'ISPConfig ъпдейт инструкции'; -$wb['ispconfig_update_text'] = 'Логнете се като root потребител през шелла на вашият сървър използвайте командата

ispconfig_update.sh

за да стартирате ISPConfig обновяване.

Click here for detailed update instructions'; +$wb['ispconfig_update_text'] = 'Логнете се като root потребител през шелла на вашият сървър използвайте командата

ispconfig_update.sh

за да стартирате ISPConfig обновяване.

Click here for detailed update instructions'; ?> diff --git a/interface/web/admin/lib/lang/bg_remote_user.lng b/interface/web/admin/lib/lang/bg_remote_user.lng index 6eac31e4fe33008bf87047588e55969d450fa76c..f52283d908f6b746aeea7234ea80b828e2e197be 100644 --- a/interface/web/admin/lib/lang/bg_remote_user.lng +++ b/interface/web/admin/lib/lang/bg_remote_user.lng @@ -1,4 +1,5 @@ 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'; @@ -303,4 +324,23 @@ $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'; +$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['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/bg_server_ip.lng b/interface/web/admin/lib/lang/bg_server_ip.lng index 733757775479d18b80bda5618fb57e95b86fb0c6..70f428a6342becd816ccf937523ee4be4ed4226c 100644 --- a/interface/web/admin/lib/lang/bg_server_ip.lng +++ b/interface/web/admin/lib/lang/bg_server_ip.lng @@ -1,4 +1,6 @@ diff --git a/interface/web/admin/lib/lang/bg_server_php_list.lng b/interface/web/admin/lib/lang/bg_server_php_list.lng index 62cbe6168714b18ba4fca490280c30c945e09e7c..291302cbb72f6b6ac12dc3e6cb95f18e9dcde90f 100644 --- a/interface/web/admin/lib/lang/bg_server_php_list.lng +++ b/interface/web/admin/lib/lang/bg_server_php_list.lng @@ -5,4 +5,5 @@ $wb['add_new_record_txt'] = 'Add new PHP version'; $wb['client_id_txt'] = 'Client'; $wb['name_txt'] = 'PHP Name'; $wb['active_txt'] = 'Active'; +$wb['usage_txt'] = 'Usage count'; ?> diff --git a/interface/web/admin/lib/lang/bg_software_package.lng b/interface/web/admin/lib/lang/bg_software_package.lng deleted file mode 100644 index faffe38217fb9cac04020e73e473c6c46e3caaa1..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/bg_software_package.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/bg_software_package_install.lng b/interface/web/admin/lib/lang/bg_software_package_install.lng deleted file mode 100644 index 0c9bd116c37c4378c7e84b41215accb29e06e68f..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/bg_software_package_install.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/bg_software_package_list.lng b/interface/web/admin/lib/lang/bg_software_package_list.lng deleted file mode 100644 index e251c95fbd2a3d9bd3f8d01e883e8111fd489813..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/bg_software_package_list.lng +++ /dev/null @@ -1,13 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/bg_software_repo.lng b/interface/web/admin/lib/lang/bg_software_repo.lng deleted file mode 100644 index f5156543451cdbd127b34dfed1798a2c6dc5c58c..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/bg_software_repo.lng +++ /dev/null @@ -1,8 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/bg_software_repo_list.lng b/interface/web/admin/lib/lang/bg_software_repo_list.lng deleted file mode 100644 index 6471d706143866e7e1d94c76de6470d85cba5056..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/bg_software_repo_list.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/bg_software_update_list.lng b/interface/web/admin/lib/lang/bg_software_update_list.lng deleted file mode 100644 index c7fa6e07f5741e21f04f6c78c5bef8eb8f329210..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/bg_software_update_list.lng +++ /dev/null @@ -1,9 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/bg_system_config.lng b/interface/web/admin/lib/lang/bg_system_config.lng index 130cb596aabd7c6bf2b268293d0fbb16cd12f335..2029f38ed2299bdc44dda1fca784414558e9be5a 100644 --- a/interface/web/admin/lib/lang/bg_system_config.lng +++ b/interface/web/admin/lib/lang/bg_system_config.lng @@ -1,4 +1,5 @@ diff --git a/interface/web/admin/lib/lang/bg_users.lng b/interface/web/admin/lib/lang/bg_users.lng index e8dc631a59b6d652228c0eb9d311c93cdc63daba..3bd134b40ba3fd2b52502329e1e409dac4f5f4fe 100644 --- a/interface/web/admin/lib/lang/bg_users.lng +++ b/interface/web/admin/lib/lang/bg_users.lng @@ -1,9 +1,10 @@ diff --git a/interface/web/admin/lib/lang/br.lng b/interface/web/admin/lib/lang/br.lng index b558a1510ea75b28c592710886d259ca93be5366..12db8395a41c5a9060a60a0c1ebf99922b2dc8d8 100644 --- a/interface/web/admin/lib/lang/br.lng +++ b/interface/web/admin/lib/lang/br.lng @@ -1,5 +1,5 @@ diff --git a/interface/web/admin/lib/lang/br_directive_snippets.lng b/interface/web/admin/lib/lang/br_directive_snippets.lng index 43c46c69b972189158871e363aed78e153f57121..d1ec8239f7ec78ca52f19f773436efb249bb5415 100644 --- a/interface/web/admin/lib/lang/br_directive_snippets.lng +++ b/interface/web/admin/lib/lang/br_directive_snippets.lng @@ -8,5 +8,8 @@ $wb['directive_snippets_name_empty'] = 'Por favor, insira um nome para a diretiv $wb['directive_snippets_name_error_unique'] = 'Já existe uma diretiva com este nome.'; $wb['variables_txt'] = 'Variáveis'; $wb['customer_viewable_txt'] = 'Visualização personalizada'; -$wb['required_php_snippets_txt'] = 'Trecho de código exige php'; -?> +$wb['required_php_snippets_txt'] = 'Trecho de código exige PHP'; +$wb['update_sites_txt'] = 'Atualizar sites usando este trecho de código'; +$wb['error_hide_snippet_active_sites'] = 'Você não pode ocultar este trecho de código dos clientes, pois ele é usado por sites existentes.'; +$wb['error_disable_snippet_active_sites'] = 'Você não pode desativar este trecho de código, pois ele é usado por sites existentes.'; +$wb['error_delete_snippet_active_sites'] = 'Você não pode excluir este trecho de código, pois ele é usado por sites existentes.'; diff --git a/interface/web/admin/lib/lang/br_directive_snippets_list.lng b/interface/web/admin/lib/lang/br_directive_snippets_list.lng index 70af844dd6fe7bba21c201e79ce7c9427e0a95d6..d74c9f47c90e0e85d57f1dbc862ca8429e27b23c 100644 --- a/interface/web/admin/lib/lang/br_directive_snippets_list.lng +++ b/interface/web/admin/lib/lang/br_directive_snippets_list.lng @@ -5,4 +5,3 @@ $wb['name_txt'] = 'Nome da diretiva'; $wb['type_txt'] = 'Tipo'; $wb['add_new_record_txt'] = 'Adicionar diretiva'; $wb['customer_viewable_txt'] = 'Visível para o cliente'; -?> diff --git a/interface/web/admin/lib/lang/br_firewall.lng b/interface/web/admin/lib/lang/br_firewall.lng index da0936b007ed9c79766690839374599ecd208e37..9a3eadb4a474a689ad7c03391a611969cf5f3f34 100644 --- a/interface/web/admin/lib/lang/br_firewall.lng +++ b/interface/web/admin/lib/lang/br_firewall.lng @@ -1,11 +1,10 @@ +$wb['firewall_error_unique'] = 'Já existe uma regra de Firewall idêntica para este servidor.'; +$wb['tcp_ports_error_regex'] = 'Caractere não permitido para configuração de porta TCP: Caracteres permitidos são números, ":" e ",".'; +$wb['udp_ports_error_regex'] = 'Caractere não permitido para configuração de porta UDP: Caracteres permitidos são números, ":" e ",".'; diff --git a/interface/web/admin/lib/lang/br_firewall_list.lng b/interface/web/admin/lib/lang/br_firewall_list.lng index 94ef3aab7d61e48ec2d428211bb97357bb00072a..885491f344b1c7a3eb7b526db79cca316b3895c4 100644 --- a/interface/web/admin/lib/lang/br_firewall_list.lng +++ b/interface/web/admin/lib/lang/br_firewall_list.lng @@ -2,7 +2,6 @@ $wb['list_head_txt'] = 'Firewall'; $wb['active_txt'] = 'Ativo'; $wb['server_id_txt'] = 'Servidor'; -$wb['tcp_port_txt'] = 'Portas tcp abertas'; -$wb['udp_port_txt'] = 'Portas udp abertas'; +$wb['tcp_port_txt'] = 'Portas TCP abertas'; +$wb['udp_port_txt'] = 'Portas UDP abertas'; $wb['add_new_record_txt'] = 'Adicionar nova regra'; -?> diff --git a/interface/web/admin/lib/lang/br_groups.lng b/interface/web/admin/lib/lang/br_groups.lng index 22a1a5c63dda5fd91fdd9435c0c4ab51b447678f..4cad10699123207ee68848a696ef7fe78e250f47 100644 --- a/interface/web/admin/lib/lang/br_groups.lng +++ b/interface/web/admin/lib/lang/br_groups.lng @@ -2,4 +2,3 @@ $wb['description_txt'] = 'Descrição'; $wb['name_txt'] = 'Grupo'; $wb['name_err'] = 'O grupo deve conter no mínimo 1 e no máximo 30 caracteres.'; -?> diff --git a/interface/web/admin/lib/lang/br_groups_list.lng b/interface/web/admin/lib/lang/br_groups_list.lng index 74a414f52d54be8206805124d1ebbae0cf54537f..9d256d5dff75874c12b2d1176610c60e51edbf48 100644 --- a/interface/web/admin/lib/lang/br_groups_list.lng +++ b/interface/web/admin/lib/lang/br_groups_list.lng @@ -3,5 +3,4 @@ $wb['list_head_txt'] = 'Grupos'; $wb['description_txt'] = 'Descrição'; $wb['name_txt'] = 'Grupo'; $wb['add_new_record_txt'] = 'Adicionar novo grupo'; -$wb['warning_txt'] = 'ALERTA: Não editar ou alterar qualquer configuração de usuário aqui. Use o módulo de clientes e revendas para isso. Editar ou alterar usuários ou grupos aqui pode causar perda de dados!'; -?> +$wb['warning_txt'] = 'ALERTA: Não editar ou modificar qualquer configuração de usuário aqui. Use o módulo de clientes e revendas para isso. Editar ou modificar usuários ou grupos aqui pode causar perda de dados!'; diff --git a/interface/web/admin/lib/lang/br_iptables.lng b/interface/web/admin/lib/lang/br_iptables.lng index f899d53178891b5e0c96685bbd6c1890b247accf..839c060996d924073416c46ac68504f585f35ba5 100644 --- a/interface/web/admin/lib/lang/br_iptables.lng +++ b/interface/web/admin/lib/lang/br_iptables.lng @@ -1,6 +1,6 @@ +$wb['iptables_error_unique'] = 'Já existe uma regra de Firewall idêntica para este servidor.'; diff --git a/interface/web/admin/lib/lang/br_iptables_list.lng b/interface/web/admin/lib/lang/br_iptables_list.lng index 3326ac060aa85f4cb29484fe0337bfcefa872aa3..68edbe360249a6efd48df1182cf1c488385f1ed1 100644 --- a/interface/web/admin/lib/lang/br_iptables_list.lng +++ b/interface/web/admin/lib/lang/br_iptables_list.lng @@ -1,6 +1,6 @@ diff --git a/interface/web/admin/lib/lang/br_language_add.lng b/interface/web/admin/lib/lang/br_language_add.lng index f63441c55dea31b4a503f78a564a5ceb514a9cfe..11af4161709450e4b55d957518921c83f3232ace 100644 --- a/interface/web/admin/lib/lang/br_language_add.lng +++ b/interface/web/admin/lib/lang/br_language_add.lng @@ -2,7 +2,6 @@ $wb['list_head_txt'] = 'Adicionar novo idioma'; $wb['language_select_txt'] = 'Selecionar idioma base'; $wb['language_new_txt'] = 'Novo idioma'; -$wb['language_new_hint_txt'] = '2 caracteres ISO 639-1 para o código do idioma (veja em http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)'; +$wb['language_new_hint_txt'] = '2 caracteres ISO 639-1 para o código do idioma (veja em https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)'; $wb['btn_save_txt'] = 'Adicionar novo conjunto de idiomas'; $wb['btn_cancel_txt'] = 'Voltar'; -?> diff --git a/interface/web/admin/lib/lang/br_language_complete.lng b/interface/web/admin/lib/lang/br_language_complete.lng index cb0ea2eb241110c83d7d0630f5c5166c137d3db1..a2d203fcd1431e964c254c8d5129b5dd597cd6ca 100644 --- a/interface/web/admin/lib/lang/br_language_complete.lng +++ b/interface/web/admin/lib/lang/br_language_complete.lng @@ -4,4 +4,3 @@ $wb['list_desc_txt'] = 'Mesclar o arquivo de idioma selecionado com o arquivo de $wb['language_select_txt'] = 'Selecionar idioma'; $wb['btn_save_txt'] = 'Mesclar arquivos agora'; $wb['btn_cancel_txt'] = 'Voltar'; -?> diff --git a/interface/web/admin/lib/lang/br_language_edit.lng b/interface/web/admin/lib/lang/br_language_edit.lng index ed0e6bb84d57124d82ebd3cee9a2a62e1acb4762..f99c6a2690500de7b2204e8929e43e0f2d648db4 100644 --- a/interface/web/admin/lib/lang/br_language_edit.lng +++ b/interface/web/admin/lib/lang/br_language_edit.lng @@ -5,4 +5,3 @@ $wb['module_txt'] = 'Módulo'; $wb['lang_file_txt'] = 'Arquivo de idioma'; $wb['btn_save_txt'] = 'Salvar'; $wb['btn_cancel_txt'] = 'Voltar'; -?> diff --git a/interface/web/admin/lib/lang/br_language_export.lng b/interface/web/admin/lib/lang/br_language_export.lng index 7d75f7b6dd90483fd3db5ccfddb4befd9953b58f..f7478233c385fbf640338bd8af6f7521d3138374 100644 --- a/interface/web/admin/lib/lang/br_language_export.lng +++ b/interface/web/admin/lib/lang/br_language_export.lng @@ -3,4 +3,3 @@ $wb['list_head_txt'] = 'Exportar arquivos de idioma'; $wb['language_select_txt'] = 'Selecionar idioma'; $wb['btn_save_txt'] = 'Exportar arquivo de idioma selecionado'; $wb['btn_cancel_txt'] = 'Voltar'; -?> diff --git a/interface/web/admin/lib/lang/br_language_import.lng b/interface/web/admin/lib/lang/br_language_import.lng index 99db3398125213340740f71d3a97dd7020c6bd8e..236ffc4f50adde269dcacba38cfdc8863ae88f66 100644 --- a/interface/web/admin/lib/lang/br_language_import.lng +++ b/interface/web/admin/lib/lang/br_language_import.lng @@ -6,4 +6,3 @@ $wb['btn_save_txt'] = 'Importar arquivo de idioma selecionado'; $wb['language_overwrite_txt'] = 'Sobrescrever arquivo, se existir.'; $wb['btn_cancel_txt'] = 'Voltar'; $wb['ignore_version_txt'] = 'Ignorar verificação da versão do ISPConfig'; -?> diff --git a/interface/web/admin/lib/lang/br_language_list.lng b/interface/web/admin/lib/lang/br_language_list.lng index 37941c4472d18eda4e1ce419a55e81e6d63ae0e5..977dbdba8d7deae163efc247e310706bcdbcd1d2 100644 --- a/interface/web/admin/lib/lang/br_language_list.lng +++ b/interface/web/admin/lib/lang/br_language_list.lng @@ -4,4 +4,3 @@ $wb['language_select_txt'] = 'Selecionar idioma'; $wb['module_txt'] = 'Módulo'; $wb['lang_file_txt'] = 'Arquivo de idioma'; $wb['lang_file_date_txt'] = 'Última modificação'; -?> diff --git a/interface/web/admin/lib/lang/br_package_install.lng b/interface/web/admin/lib/lang/br_package_install.lng index bbe518549aed1e40a5cf8395cbf2110b21508a9e..d1677d2f49b0a7037f465049c9554bb156192f3e 100644 --- a/interface/web/admin/lib/lang/br_package_install.lng +++ b/interface/web/admin/lib/lang/br_package_install.lng @@ -4,4 +4,3 @@ $wb['repo_url_txt'] = 'URL'; $wb['repo_username_txt'] = 'Usário (opcional)'; $wb['repo_password_txt'] = 'Senha (opcional)'; $wb['active_txt'] = 'Ativo'; -?> diff --git a/interface/web/admin/lib/lang/br_remote_action.lng b/interface/web/admin/lib/lang/br_remote_action.lng index 80d3a05c53a19e767bd43ed2ea1d9cd4b3651173..84e928dbd9134cf4482133657f611378d8373a4e 100644 --- a/interface/web/admin/lib/lang/br_remote_action.lng +++ b/interface/web/admin/lib/lang/br_remote_action.lng @@ -2,11 +2,10 @@ $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.

UTILIZE POR SUA CONTA E RISCO!'; +$wb['do_osupdate_desc'] = 'Esta ação fará o comando \'apt -y upgrade\' no servidor selecionado.

UTILIZE POR SUA CONTA E RISCO!'; $wb['do_ispcupdate_caption'] = 'Atualizar ISPConfig 3 - Atualizar o servidor remoto'; $wb['do_ispcupdate_desc'] = 'Esta ação atualizará o ISPConfig3 no servidor selecionado.

UTILIZE POR SUA CONTA E RISCO!'; $wb['action_scheduled'] = 'A ação foi agendada.'; $wb['select_all_server'] = 'Todos os servidores'; $wb['ispconfig_update_title'] = 'Instruções de atualização do ISPConfig'; -$wb['ispconfig_update_text'] = 'Acesse com o usuário root no shell do servidor e execute o comando

ispconfig_update.sh

para iniciar a atualização do ISPConfig.

Clique aqui para instruções detalhadas'; -?> +$wb['ispconfig_update_text'] = 'Acesse com o usuário root no shell do servidor e execute o comando

ispconfig_update.sh

para iniciar a atualização do ISPConfig.

Clique aqui para instruções detalhadas'; diff --git a/interface/web/admin/lib/lang/br_remote_user.lng b/interface/web/admin/lib/lang/br_remote_user.lng index fcaa6732c86aa2ce527b9ac796bd69c2f7b99d0a..86002f5146c0a9f2144ce1f22edb570b142501c3 100644 --- a/interface/web/admin/lib/lang/br_remote_user.lng +++ b/interface/web/admin/lib/lang/br_remote_user.lng @@ -1,68 +1,72 @@ qualquer um)'; +$wb['remote_ips_txt'] = 'Endereços IPs ou nome(s) do(s) host(s) para acesso remoto (separado por vírgula e deixar vazio para qualquer um)'; $wb['remote_user_error_ips'] = 'Ao menos um endereço IP ou nome do host informado é inválido.'; -?> +$wb['DNS caa functions'] = 'Funções de registro DNS CAA'; +$wb['DNS dname functions'] = 'Funções de registro DNS DNAME'; +$wb['DNS sshfp functions'] = 'Funções de registro DNS SSHFP'; diff --git a/interface/web/admin/lib/lang/br_remote_user_list.lng b/interface/web/admin/lib/lang/br_remote_user_list.lng index 0f0381a6f4a87b81abc7b6672669a835c5ea79d7..9ef8c2f57073f5b9ca075c1ddbe52e4b12a7c491 100644 --- a/interface/web/admin/lib/lang/br_remote_user_list.lng +++ b/interface/web/admin/lib/lang/br_remote_user_list.lng @@ -4,4 +4,3 @@ $wb['list_desc_txt'] = 'Usuário remoto'; $wb['add_new_record_txt'] = 'Adicionar novo usuário'; $wb['parent_remote_userid_txt'] = 'ID do usuário'; $wb['username_txt'] = 'Nome'; -?> diff --git a/interface/web/admin/lib/lang/br_server.lng b/interface/web/admin/lib/lang/br_server.lng index a896d0b49ae377aad39c6737e51ebca246aaf1ff..20a2eddbb61dd23cbc3ae41749ea19d833ba2638 100644 --- a/interface/web/admin/lib/lang/br_server.lng +++ b/interface/web/admin/lib/lang/br_server.lng @@ -1,16 +1,15 @@ +$wb['xmpp_server_txt'] = 'Servidor XMPP'; diff --git a/interface/web/admin/lib/lang/br_server_config.lng b/interface/web/admin/lib/lang/br_server_config.lng index c12a1a7dad6ea7dfd973cfba771f85d59f840077..1041676ceb8e7768b22f4fad64451671ba6596fd 100644 --- a/interface/web/admin/lib/lang/br_server_config.lng +++ b/interface/web/admin/lib/lang/br_server_config.lng @@ -1,4 +1,8 @@ Informação: Se o serviço mysql for desligado e estiver selecionado "Desabilitar monitoramento do mysql" aguarde entre 2 e 3 minutos sem abandonar a aba.
Se não aguardar o sistema de recuperação de falhas tentará reiniciar o mysql!'; +$wb['backup_dir_error_empty'] = 'Diretório de backup está vazio.'; +$wb['maildir_path_error_empty'] = 'Caminho do Maildir está vazio.'; +$wb['homedir_path_error_empty'] = 'Caminho do Homedir está vazio.'; +$wb['mailuser_uid_error_empty'] = 'UID do Mailuser UID está vazio.'; +$wb['mailuser_gid_error_empty'] = 'GID do Mailuser GID está vazio.'; +$wb['mailuser_name_error_empty'] = 'Usuário do Mailuser está vazio.'; +$wb['mailuser_group_error_empty'] = 'Grupo do Mailuser Group está vazio.'; +$wb['getmail_config_dir_error_empty'] = 'Diretório de configurações do Getmail está vazio.'; +$wb['website_basedir_error_empty'] = 'Diretório basedir de sites está vazio.'; +$wb['website_path_error_empty'] = 'Caminho do site está vazio.'; +$wb['website_symlinks_error_empty'] = 'Links simbólicos de site está vazio.'; +$wb['vhost_conf_dir_error_empty'] = 'Diretório de configurações do vhost está vazio.'; +$wb['vhost_conf_enabled_dir_error_empty'] = 'Diretório de configurações vhost habilitadas está vazio.'; +$wb['nginx_vhost_conf_dir_error_empty'] = 'Diretório de configurações vhost nginx está vazio.'; +$wb['nginx_vhost_conf_enabled_dir_error_empty'] = 'Diretório de configurações vhost nginx habilitadas está vazio.'; +$wb['apache_user_error_empty'] = 'Usuário do Apache está vazio.'; +$wb['apache_group_error_empty'] = 'Grupo do Apache está vazio.'; +$wb['nginx_user_error_empty'] = 'Usuário do nginx está vazio.'; +$wb['nginx_group_error_empty'] = 'Grupo do nginx está vazio.'; +$wb['php_ini_path_apache_error_empty'] = 'Caminho PHP.ini Apache está vazio.'; +$wb['php_ini_path_cgi_error_empty'] = 'Caminho PHP.ini CGI está vazio.'; +$wb['nginx_cgi_socket_empty'] = 'O socket CGI nginx está vazio.'; +$wb['apps_vhost_port_error_empty'] = 'Portas de apps-vhost está vazio.'; +$wb['apps_vhost_ip_error_empty'] = 'IP do apps-vhost está vazio.'; +$wb['fastcgi_starter_path_error_empty'] = 'Caminho do script de inicialização FastCGI está vazio.'; +$wb['fastcgi_starter_script_error_empty'] = 'Script de inicialização FastCGI está vazio.'; +$wb['fastcgi_alias_error_empty'] = 'Alias FastCGI está vazio.'; +$wb['fastcgi_phpini_path_error_empty'] = 'O caminho PHP.ini FastCGI está vazio.'; +$wb['fastcgi_children_error_empty'] = 'Os processos filhos FastCGI está vazio.'; +$wb['fastcgi_max_requests_error_empty'] = 'O limite de requisições FastCGI está vazio.'; +$wb['fastcgi_bin_error_empty'] = 'O binário FastCGI está vazio.'; +$wb['jailkit_chroot_home_error_empty'] = 'O home em chroot Jailkit está vazio.'; +$wb['jailkit_chroot_app_sections_error_empty'] = 'Seções de aplicações chroot Jailkit está vazio.'; +$wb['jailkit_chroot_app_programs_error_empty'] = 'Aplicações chroot Jailkit está vazio.'; +$wb['jailkit_chroot_cron_programs_error_empty'] = 'Tarefas de aplicações chroot Jailkit está vazio.'; +$wb['vlogger_config_dir_error_empty'] = 'Diretório de configuração está vazio.'; +$wb['cron_init_script_error_empty'] = 'Script de inicialização do cron está vazio.'; +$wb['crontab_dir_error_empty'] = 'Caminho para tarefas individuais no Cron está vazio.'; +$wb['cron_wget_error_empty'] = 'Caminho do binário wget está vazio.'; +$wb['php_fpm_init_script_txt'] = 'Script de inicialização PHP-FPM'; +$wb['php_fpm_init_script_error_empty'] = 'Script de inicialização PHP-FPM está vazio.'; +$wb['php_fpm_ini_path_txt'] = 'Caminho PHP.ini PHP-FPM'; +$wb['php_fpm_ini_path_error_empty'] = 'Caminho PHP.ini PHP-FPM está vazio.'; +$wb['php_fpm_pool_dir_txt'] = 'Diretório da pool PHP-FPM'; +$wb['php_fpm_pool_dir_error_empty'] = 'Diretório da pool PHP-FPM está vazio.'; +$wb['php_fpm_start_port_txt'] = 'Porta PHP-FPM'; +$wb['php_fpm_start_port_error_empty'] = 'Porta PHP-FPM está vazio.'; +$wb['php_fpm_socket_dir_txt'] = 'Diretório do socket PHP-FPM'; +$wb['php_fpm_socket_dir_error_empty'] = 'O diretório do socket PHP-FPM está vazio.'; +$wb['try_rescue_txt'] = 'Habilitar monitoramento e reiniciar em caso de falha'; +$wb['do_not_try_rescue_httpd_txt'] = 'Desabilitar monitoramento do HTTPD'; +$wb['do_not_try_rescue_mongodb_txt'] = 'Desabilitar monitoramento do MongoDB'; +$wb['do_not_try_rescue_mysql_txt'] = 'Desabilitar monitoramento do MySQL'; +$wb['do_not_try_rescue_mail_txt'] = 'Desabilitar monitoramento do servidor de emails'; +$wb['rescue_description_txt'] = 'Informação: Se o serviço MySQL for desligado e estiver selecionado "Desabilitar monitoramento do MySQL" aguarde entre 2 e 3 minutos sem abandonar a aba.
Se não aguardar o sistema de recuperação de falhas tentará reiniciar o MySQL!'; $wb['enable_sni_txt'] = 'Habilitar SNI'; $wb['set_folder_permissions_on_update_txt'] = 'Configurar permissões de pasta quando atualizar'; -$wb['add_web_users_to_sshusers_group_txt'] = 'Adicionar novos usuários web para o grupo ssh'; +$wb['add_web_users_to_sshusers_group_txt'] = 'Adicionar novos usuários Web para o grupo SSH'; $wb['connect_userid_to_webid_txt'] = 'Conectar o UID do usuário no sistema para webID'; $wb['connect_userid_to_webid_start_txt'] = 'Conexão do ID inicial do usuário com o webID'; $wb['realtime_blackhole_list_txt'] = 'Lista RBL em tempo real'; $wb['realtime_blackhole_list_note_txt'] = '(separar as RBLs com vírgulas)'; +$wb['stress_adaptive_txt'] = 'Adaptar-se a picos de carga temporários'; +$wb['tooltip_stress_adaptive_txt'] = 'Ativa o comportamento adaptativo ao estresse do Postfix.'; $wb['ssl_settings_txt'] = 'Configurações SSL'; $wb['permissions_txt'] = 'Permissões'; -$wb['php_settings_txt'] = 'Configurações php'; +$wb['php_settings_txt'] = 'Configurações PHP'; $wb['apps_vhost_settings_txt'] = 'Configurações de apps vhost'; -$wb['awstats_settings_txt'] = 'Configurações do awstats'; +$wb['awstats_settings_txt'] = 'Configurações do AWStats'; $wb['firewall_txt'] = 'Firewall'; -$wb['mailbox_quota_stats_txt'] = 'Estatísticas das cotas das contas de e-mail'; -$wb['enable_ip_wildcard_txt'] = 'Habilitar curingas de IP (*)'; -$wb['web_folder_protection_txt'] = 'Tornar pastas web imutáveis (atributos estendidos)'; +$wb['mailbox_quota_stats_txt'] = 'Estatísticas das cotas para contas de email'; +$wb['enable_ip_wildcard_txt'] = 'Habilitar curingas IP (*)'; +$wb['web_folder_protection_txt'] = 'Tornar pastas Web imutáveis (atributos estendidos)'; $wb['overtraffic_notify_admin_txt'] = 'Enviar notificação de tráfego excedido para o administrador'; +$wb['overtraffic_notify_reseller_txt'] = 'Send overtraffic notification to reseller'; $wb['overtraffic_notify_client_txt'] = 'Enviar notificação de tráfego excedido para o cliente'; -$wb['rbl_error_regex'] = 'Por favor, nomes de host válidos para RBLs.'; +$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_reseller_txt'] = 'Send quota warnings to reseller'; $wb['overquota_notify_client_txt'] = 'Enviar alerta da cota para o cliente'; $wb['overquota_notify_onok_txt'] = 'Enviar mensagem da cota para o cliente'; -$wb['overquota_notify_freq_txt'] = 'Enviar alerta da cota a cada X dias'; +$wb['overquota_notify_freq_txt'] = 'Enviar alerta da cota a cada N dias'; $wb['overquota_notify_freq_note_txt'] = '0 = enviar mensagem apenas uma vez, sem repetir'; -$wb['admin_notify_events_txt'] = 'Enviar e-mail para o administrador iniciando com o seguinte nível'; +$wb['admin_notify_events_txt'] = 'Enviar email para o administrador iniciando com o seguinte nível:'; $wb['no_notifications_txt'] = 'Sem notificações'; -$wb['monit_url_txt'] = 'URL de monitoramento do monit'; -$wb['monit_user_txt'] = 'Usuário do monit'; -$wb['monit_password_txt'] = 'Senha do monit'; -$wb['monit_url_error_regex'] = 'URL do monit é inválida'; +$wb['monit_url_txt'] = 'URL de monitoramento do Monit'; +$wb['monit_user_txt'] = 'Usuário do Monit'; +$wb['monit_password_txt'] = 'Senha do Monit'; +$wb['monit_url_error_regex'] = 'URL do Monit inválida'; $wb['monit_url_note_txt'] = 'Área reservada:'; -$wb['munin_url_txt'] = 'URL do munin'; -$wb['munin_user_txt'] = 'Usuário do munin'; -$wb['munin_password_txt'] = 'Senda do munin'; -$wb['munin_url_error_regex'] = 'URL do munin e inválida'; +$wb['munin_url_txt'] = 'URL do Munin'; +$wb['munin_user_txt'] = 'Usuário do Munin'; +$wb['munin_password_txt'] = 'Senha do Munin'; +$wb['munin_url_error_regex'] = 'URL do Munin inválida'; $wb['munin_url_note_txt'] = 'Área reservada:'; $wb['v6_prefix_txt'] = 'Prefixo IPv6'; $wb['vhost_rewrite_v6_txt'] = 'Reescrever IPv6 no espelho'; @@ -211,96 +229,118 @@ $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_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['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_reseller_txt'] = 'Send DB quota warnings to reseller'; +$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'; -$wb['php_handler_txt'] = 'Manipulador padrão do php'; -$wb['php_fpm_incron_reload_txt'] = 'Instale o arquivo de disparo do incron para recarregar o php-fpm.'; +$wb['php_handler_txt'] = 'Manipulador padrão PHP'; +$wb['php_fpm_default_chroot_txt'] = 'Definir PHP-FPM em chroot'; +$wb['php_fpm_incron_reload_txt'] = 'Instale o arquivo de disparo do incron para recarregar o PHP-FPM.'; $wb['disabled_txt'] = 'Desabilitado'; $wb['dkim_strength_txt'] = 'Dificuldade do DKIM'; -$wb['monitor_system_updates_txt'] = 'Verificar por atualizações do sistema'; -$wb['invalid_apache_user_txt'] = 'Usuário do apache é inválido.'; -$wb['invalid_apache_group_txt'] = 'Grupo do apache é inválido.'; -$wb['backup_dir_error_regex'] = 'Diretório de backup é inválido.'; -$wb['maildir_path_error_regex'] = 'Caminho do maildir é inválido.'; -$wb['homedir_path_error_regex'] = 'Caminho do homedir é inválido.'; -$wb['mailuser_name_error_regex'] = 'Caminho do mailuser é inválido.'; -$wb['mailuser_group_name_error_regex'] = 'Grupo do mailuser é inválido.'; -$wb['mailuser_uid_error_range'] = 'A UID do mailuser deve ser >= 2000.'; -$wb['mailuser_gid_error_range'] = 'A GID do mailuser deve ser >= 2000.'; -$wb['getmail_config_dir_error_regex'] = 'Diretório de configurações do getmail é inválido.'; -$wb['website_basedir_error_regex'] = 'Caminho do basedir para sites é inválido. Comprimento mínimo 5 caracteres.'; -$wb['website_symlinks_error_regex'] = 'Links simbólicos para site são inválidos.'; -$wb['vhost_conf_dir_error_regex'] = 'Diretório de configurações vhost é inválido.'; -$wb['vhost_conf_enabled_dir_error_regex'] = 'Diretório de configuração vhost habilitado é inválido.'; -$wb['nginx_vhost_conf_dir_error_regex'] = 'Diretório de configurações do nginx é inválido.'; -$wb['nginx_vhost_conf_enabled_dir_error_regex'] = 'Diretório de configurações do nginx habilitado é inválido.'; -$wb['ca_path_error_regex'] = 'Caminho da CA é inválido.'; -$wb['invalid_nginx_user_txt'] = 'Usuário do nginx é inválido.'; -$wb['invalid_nginx_group_txt'] = 'Grupo do nginx é inválido.'; -$wb['php_ini_path_apache_error_regex'] = 'Caminho do php.ini do apache é inválido.'; -$wb['php_ini_path_cgi_error_regex'] = 'Caminho do php.ini do cgi é inválido.'; -$wb['php_fpm_init_script_error_regex'] = 'Script de inicialização do php-fpm é inválido.'; -$wb['php_fpm_ini_path_error_regex'] = 'Caminho de inicialização do php-fpm é inválido.'; -$wb['php_fpm_pool_dir_error_regex'] = 'Caminho do diretório de faixas do php-fpm é inválido.'; -$wb['php_fpm_socket_dir_error_regex'] = 'Caminho do diretório de socket do php-fpm é inválido.'; -$wb['php_open_basedir_error_regex'] = 'Caminho do open_basedir do php é inválido.'; -$wb['awstats_data_dir_empty'] = 'O diretório de dados do awstats está em branco.'; -$wb['awstats_data_dir_error_regex'] = 'O diretório de dados do awstats é inválido.'; -$wb['awstats_pl_empty'] = 'A configuração do awstats.pl está em branco.'; -$wb['awstats_pl_error_regex'] = 'O caminho do awstats.pl é inválido.'; -$wb['awstats_buildstaticpages_pl_empty'] = 'O awstats_buildstaticpages.pl está em branco'; -$wb['awstats_buildstaticpages_pl_error_regex'] = 'O caminho do awstats_buildstaticpages.pl é inválido.'; -$wb['invalid_bind_user_txt'] = 'O usuário do bind é inválido.'; -$wb['invalid_bind_group_txt'] = 'O grupo do bind é inválido.'; -$wb['bind_zonefiles_dir_error_regex'] = 'O diretório de zonas do bind é inválido.'; -$wb['named_conf_path_error_regex'] = 'O caminho do named.conf é inválido.'; -$wb['named_conf_local_path_error_regex'] = 'O caminho do named.conf.local é inválido.'; -$wb['fastcgi_starter_path_error_regex'] = 'O caminho do script de inicialização do fastcgi é inválido.'; -$wb['fastcgi_starter_script_error_regex'] = 'O script de inicialização do fastcgi é inválido.'; -$wb['fastcgi_alias_error_regex'] = 'O alias do fastcgi é inválido.'; -$wb['fastcgi_phpini_path_error_regex'] = 'O caminho do fastcgi é inválido.'; -$wb['fastcgi_bin_error_regex'] = 'O binário do fastcgi é inválido.'; -$wb['jailkit_chroot_home_error_regex'] = 'O diretório home em chroot do jailkit é inválido.'; -$wb['jailkit_chroot_app_sections_error_regex'] = 'As seções de aplicações no jaikit são inválidas.'; -$wb['jailkit_chroot_app_programs_error_regex'] = 'As aplicações em chroot no jailkit são inválidas.'; -$wb['jailkit_chroot_cron_programs_error_regex'] = 'As tarefas de aplicações em chroot no jailkit são inválidas.'; -$wb['vlogger_config_dir_error_regex'] = 'Diretório de configurações do vlogger é inválido.'; -$wb['cron_init_script_error_regex'] = 'Script de inicialização do cron é inválido.'; -$wb['crontab_dir_error_regex'] = 'Diretório do cron é inválido.'; -$wb['cron_wget_error_regex'] = 'Caminho do wget no cron é inválido.'; +$wb['invalid_apache_user_txt'] = 'Usuário do Apache inválido.'; +$wb['invalid_apache_group_txt'] = 'Grupo do Apache inválido.'; +$wb['backup_dir_error_regex'] = 'Diretório de backup inválido.'; +$wb['maildir_path_error_regex'] = 'Caminho do Maildir inválido.'; +$wb['homedir_path_error_regex'] = 'Caminho do Homedir inválido.'; +$wb['mailuser_name_error_regex'] = 'Caminho do Mailuser inválido.'; +$wb['mailuser_group_name_error_regex'] = 'Grupo do Mailuser inválido.'; +$wb['mailuser_uid_error_range'] = 'A UID do Mailuser deve ser >= 2000.'; +$wb['mailuser_gid_error_range'] = 'A GID do Mailuser deve ser >= 2000.'; +$wb['getmail_config_dir_error_regex'] = 'Diretório de configurações do Getmail inválido.'; +$wb['website_basedir_error_regex'] = 'Caminho do basedir para sites inválido. Comprimento mínimo 5 caracteres.'; +$wb['website_symlinks_error_regex'] = 'Links simbólicos para site inválidos.'; +$wb['vhost_conf_dir_error_regex'] = 'Diretório de configurações vhost inválido.'; +$wb['vhost_conf_enabled_dir_error_regex'] = 'Diretório de configuração vhost habilitado inválido.'; +$wb['nginx_vhost_conf_dir_error_regex'] = 'Diretório de configurações do nginx inválido.'; +$wb['nginx_vhost_conf_enabled_dir_error_regex'] = 'Diretório de configurações do nginx habilitado inválido.'; +$wb['ca_path_error_regex'] = 'Caminho da CA inválido.'; +$wb['invalid_nginx_user_txt'] = 'Usuário do nginx inválido.'; +$wb['invalid_nginx_group_txt'] = 'Grupo do nginx inválido.'; +$wb['php_ini_path_apache_error_regex'] = 'Caminho PHP.ini Apache inválido.'; +$wb['php_ini_path_cgi_error_regex'] = 'Caminho PHP.ini CGI inválido.'; +$wb['php_fpm_init_script_error_regex'] = 'Script de inicialização PHP-FPM inválido.'; +$wb['php_fpm_ini_path_error_regex'] = 'Caminho de inicialização PHP-FPM inválido.'; +$wb['php_fpm_pool_dir_error_regex'] = 'Caminho do diretório de pools PHP-FPM inválido.'; +$wb['php_fpm_socket_dir_error_regex'] = 'Caminho do diretório de socket PHP-FPM inválido.'; +$wb['php_open_basedir_error_regex'] = 'Caminho do open_basedir PHP inválido.'; +$wb['awstats_data_dir_empty'] = 'Diretório de dados do AWStats está vazio.'; +$wb['awstats_data_dir_error_regex'] = 'Diretório de dados do AWStats inválido.'; +$wb['awstats_pl_empty'] = 'A configuração do awstats.pl está vazia.'; +$wb['awstats_pl_error_regex'] = 'Caminho do awstats.pl inválido.'; +$wb['awstats_buildstaticpages_pl_empty'] = 'O awstats_buildstaticpages.pl está vazio'; +$wb['awstats_buildstaticpages_pl_error_regex'] = 'Caminho do awstats_buildstaticpages.pl inválido.'; +$wb['invalid_bind_user_txt'] = 'Usuário Bind inválido.'; +$wb['invalid_bind_group_txt'] = 'Grupo Bind inválido.'; +$wb['bind_zonefiles_dir_error_regex'] = 'Diretório de zonas do Bind inválido.'; +$wb['named_conf_path_error_regex'] = 'Caminho do named.conf inválido.'; +$wb['named_conf_local_path_error_regex'] = 'Caminho do named.conf.local inválido.'; +$wb['fastcgi_starter_path_error_regex'] = 'Caminho do script de inicialização FastCGI inválido.'; +$wb['fastcgi_starter_script_error_regex'] = 'Script de inicialização FastCGI inválido.'; +$wb['fastcgi_alias_error_regex'] = 'Alias FastCGI inválido.'; +$wb['fastcgi_phpini_path_error_regex'] = 'Caminho do fastcgi inválido.'; +$wb['fastcgi_bin_error_regex'] = 'Binário do fastcgi inválido.'; +$wb['jailkit_chroot_home_error_regex'] = 'Diretório home em chroot Jailkit inválido.'; +$wb['jailkit_chroot_app_sections_error_regex'] = 'Seções de aplicações em chroot Jailkit inválidas.'; +$wb['jailkit_chroot_app_programs_error_regex'] = 'Aplicações em chroot Jailkit inválidas.'; +$wb['jailkit_chroot_cron_programs_error_regex'] = 'Tarefas de aplicações em chroot Jailkit inválidas.'; +$wb['vlogger_config_dir_error_regex'] = 'Diretório de configurações do vlogger inválido.'; +$wb['cron_init_script_error_regex'] = 'Script de inicialização do cron inválido.'; +$wb['crontab_dir_error_regex'] = 'Diretório do cron inválido.'; +$wb['cron_wget_error_regex'] = 'Caminho do wget no Cron inválido.'; $wb['network_filesystem_txt'] = 'Sistema de arquivos de rede'; -$wb['php_ini_check_minutes_txt'] = 'Verificar alterações no php.ini a cada X minutos'; -$wb['php_ini_check_minutes_error_empty'] = 'Por favor, insira um valor para verificação de alterações no php.ini.'; +$wb['php_ini_check_minutes_txt'] = 'Verificar modificações no php.ini a cada N minutos'; +$wb['php_ini_check_minutes_error_empty'] = 'Por favor, insira um valor para verificação de modificações no php.ini.'; $wb['php_ini_check_minutes_info_txt'] = '0 = sem verificações'; -$wb['enable_spdy_txt'] = 'Tornar SPDY/HTTP2 disponível'; -$wb['web_settings_txt'] = 'Servidor web'; -$wb['xmpp_server_txt'] = 'Servidor xmpp'; +$wb['web_settings_txt'] = 'Servidor Web'; +$wb['xmpp_server_txt'] = 'Servidor XMPP'; $wb['xmpp_use_ipv6_txt'] = 'Usar IPv6'; $wb['xmpp_bosh_max_inactivity_txt'] = 'Tempo de inatividade do BOSH'; -$wb['xmpp_bosh_timeout_range_wrong'] = 'Por favor, insira um valor para o timeout do bosh entre 15 e 360.'; +$wb['xmpp_bosh_timeout_range_wrong'] = 'Por favor, insira um valor para o tempo de inatividade do BOSH, entre 15 e 360.'; $wb['xmpp_module_saslauth'] = 'Autenticação SASL'; $wb['xmpp_server_admins_txt'] = 'Administradores do servidor (JIDs)'; $wb['xmpp_modules_enabled_txt'] = 'Plugins habilitados no servidor (um por linha)'; $wb['xmpp_ports_txt'] = 'Portas dos componentes'; -$wb['xmpp_port_http_txt'] = 'http'; -$wb['xmpp_port_https_txt'] = 'https'; +$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'] = 'Desabilitar mensagens de alerta do bind9'; +$wb['disable_bind_log_txt'] = 'Desabilitar mensagens de alerta do Bind9'; $wb['apps_vhost_enabled_txt'] = 'Habilitar apps-vhost'; -$wb['skip_le_check_txt'] = 'Ignorar verificação do Lets Encrypt'; +$wb['skip_le_check_txt'] = 'Ignorar verificação do Let\'s Encrypt'; $wb['migration_mode_txt'] = 'Modo migração de servidor'; $wb['nginx_enable_pagespeed_txt'] = 'Tornar pagespeed disponível'; $wb['logging_txt'] = 'Gravar logs de acesso e erros de sites'; $wb['logging_desc_txt'] = 'Usar Ferramentas > Sicronizar para aplicar mudanças em sites existentes. Para o Apache, os logs de acesso e erros podem ser anonimizados. Para o nginx, apenas o log de acesso é anonimizado, o log de erros conterá endereços IP.'; $wb['log_retention_txt'] = 'Tempo de retenção do log (dias)'; $wb['log_retention_error_ispositive'] = 'O tempo de retenção do log deve ser um número > 0.'; -$wb['php_default_name_txt'] = 'Descrição da versão padrão do php'; -$wb['php_default_name_error_empty'] = 'A descrição da versão padrão do php está em branco.'; -$wb['error_mailbox_message_size_txt'] = 'O tamanho da cota da conta de e-mail deve ser maior ou igual o tamanho da cota de mensagens.'; -$wb['php_fpm_reload_mode_txt'] = 'Modo da recarga do php-fpm'; +$wb['php_default_hide_txt'] = 'Ocultar versão padrao PHP na caixa de seleção'; +$wb['php_default_name_txt'] = 'Descrição da versão padrão PHP'; +$wb['php_default_name_error_empty'] = 'A descrição da versão padrão PHP está vazia.'; +$wb['error_mailbox_message_size_txt'] = 'O tamanho da cota da conta de email deve ser maior ou igual o tamanho da cota de mensagens.'; +$wb['php_fpm_reload_mode_txt'] = 'Modo da recarga PHP-FPM'; $wb['content_filter_txt'] = 'Filtro de conteúdo'; -$wb['rspamd_url_txt'] = 'URL do rspamd'; -$wb['rspamd_user_txt'] = 'Usuário do rspamd'; -$wb['rspamd_password_txt'] = 'Senha do rspamd'; +$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'; +$wb['jailkit_chroot_authorized_keys_template_txt'] = 'Gabarito authorized_keys Jailkit'; +$wb['jailkit_chroot_authorized_keys_template_error_regex'] = 'Arquivo do gabarito authorized_keys Jailkit inválido.'; +$wb['jailkit_hardlinks_txt'] = 'Links físicos (hardlinks) em chroot Jailkit'; +$wb['tooltip_jailkit_hardlinks_txt'] = 'Usar links físicos é inseguro, mas economiza espaço em disco.'; +$wb['jailkit_hardlinks_allow_txt'] = 'Permitir links físicos enjaulados'; +$wb['jailkit_hardlinks_no_txt'] = 'Não, remover arquivos de links físicos'; +$wb['jailkit_hardlinks_yes_txt'] = 'Sim, usar links físicos quando possível'; +$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/br_server_config_list.lng b/interface/web/admin/lib/lang/br_server_config_list.lng index b9329de9b43c76dafa0063a5774fcc173df880b1..ecb3ce1e0adb608ce33560346e5f5d255294c0ca 100644 --- a/interface/web/admin/lib/lang/br_server_config_list.lng +++ b/interface/web/admin/lib/lang/br_server_config_list.lng @@ -1,4 +1,3 @@ diff --git a/interface/web/admin/lib/lang/br_server_ip.lng b/interface/web/admin/lib/lang/br_server_ip.lng index b9bbd47949189bf6a58262417a3b9fc7a333b859..135cf8ca6667347769d42b18aaf7e7823767a18d 100644 --- a/interface/web/admin/lib/lang/br_server_ip.lng +++ b/interface/web/admin/lib/lang/br_server_ip.lng @@ -1,11 +1,12 @@ +$wb['error_port_syntax'] = 'Caracteres inválidos para porta HTTP, por favor, insira apenas uma porta ou separe portas por vírgula. Exemplo: 80,443.'; diff --git a/interface/web/admin/lib/lang/br_server_ip_list.lng b/interface/web/admin/lib/lang/br_server_ip_list.lng index 0ae892af876a82f35308158569db43f0dab338f1..97edd7bc4d2e011fb0f4610756a748190c70a5cf 100644 --- a/interface/web/admin/lib/lang/br_server_ip_list.lng +++ b/interface/web/admin/lib/lang/br_server_ip_list.lng @@ -4,7 +4,6 @@ $wb['server_id_txt'] = 'Servidor'; $wb['client_id_txt'] = 'Cliente'; $wb['ip_address_txt'] = 'Endereço IP'; $wb['add_new_record_txt'] = 'Adicionar novo endereço IP'; -$wb['virtualhost_txt'] = 'Virtual host http'; -$wb['virtualhost_port_txt'] = 'Portas http'; +$wb['virtualhost_txt'] = 'Virtual host HTTP'; +$wb['virtualhost_port_txt'] = 'Portas HTTP'; $wb['ip_type_txt'] = 'Tipo'; -?> diff --git a/interface/web/admin/lib/lang/br_server_ip_map.lng b/interface/web/admin/lib/lang/br_server_ip_map.lng index 81a2bb4b961b2cb771f0a1a282376442345641ce..287ae957ad743b5490793521156e2ef974a5d725 100644 --- a/interface/web/admin/lib/lang/br_server_ip_map.lng +++ b/interface/web/admin/lib/lang/br_server_ip_map.lng @@ -1,12 +1,13 @@ +$wb['ip_mapping_error'] = 'Endereço IP de origem não pode ser o IP do servidor a ser reescrito '; diff --git a/interface/web/admin/lib/lang/br_server_ip_map_list.lng b/interface/web/admin/lib/lang/br_server_ip_map_list.lng index 8cb0a1e20fda3ca0355af4112acc20ae9f1297e9..044270fa2e751e589d22fa2de8e1304cb421d7b0 100644 --- a/interface/web/admin/lib/lang/br_server_ip_map_list.lng +++ b/interface/web/admin/lib/lang/br_server_ip_map_list.lng @@ -4,4 +4,3 @@ $wb['server_id_txt'] = 'Servidor'; $wb['source_ip_txt'] = 'Endereço de origem'; $wb['destination_ip_txt'] = 'Endereço de destino'; $wb['active_txt'] = 'Ativo'; -?> diff --git a/interface/web/admin/lib/lang/br_server_list.lng b/interface/web/admin/lib/lang/br_server_list.lng index ae3bb528105819fba1f2e301b7edfc6cda305799..1bd6c31563267595fe62df03621a459b6d94ec68 100644 --- a/interface/web/admin/lib/lang/br_server_list.lng +++ b/interface/web/admin/lib/lang/br_server_list.lng @@ -1,14 +1,13 @@ diff --git a/interface/web/admin/lib/lang/br_server_php.lng b/interface/web/admin/lib/lang/br_server_php.lng index 377763ce45c79b68b43b0f8e54eaadfcb2bd3c8f..d0a1015833f82dfd9c183a1928e02dacfd690e8c 100644 --- a/interface/web/admin/lib/lang/br_server_php.lng +++ b/interface/web/admin/lib/lang/br_server_php.lng @@ -1,17 +1,20 @@ diff --git a/interface/web/admin/lib/lang/br_server_php_list.lng b/interface/web/admin/lib/lang/br_server_php_list.lng index 38ebdd3568c080c477198261230a264d9f7aeda8..423f1237598ecb2ef0c54d666a8af3141bc1ca95 100644 --- a/interface/web/admin/lib/lang/br_server_php_list.lng +++ b/interface/web/admin/lib/lang/br_server_php_list.lng @@ -1,8 +1,8 @@ +$wb['usage_txt'] = 'Contador de utilização'; diff --git a/interface/web/admin/lib/lang/br_software_package.lng b/interface/web/admin/lib/lang/br_software_package.lng deleted file mode 100644 index 94ccc930de4d58a4827f7c48934e6a64e7031589..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/br_software_package.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/br_software_package_install.lng b/interface/web/admin/lib/lang/br_software_package_install.lng deleted file mode 100644 index 0fcccf939e11abe9d865e733ee70a903ecf82a9a..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/br_software_package_install.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/br_software_package_list.lng b/interface/web/admin/lib/lang/br_software_package_list.lng deleted file mode 100644 index de62e3d305978b4856ed4e0c1af72feb0f13c1bb..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/br_software_package_list.lng +++ /dev/null @@ -1,13 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/br_software_repo.lng b/interface/web/admin/lib/lang/br_software_repo.lng deleted file mode 100644 index dbc14e203210c50d1a1c0b32069b29aae045b217..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/br_software_repo.lng +++ /dev/null @@ -1,8 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/br_software_repo_list.lng b/interface/web/admin/lib/lang/br_software_repo_list.lng deleted file mode 100644 index 6941c7f1470f06d93ed5c4b5a2436e8ec593356a..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/br_software_repo_list.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/br_software_update_list.lng b/interface/web/admin/lib/lang/br_software_update_list.lng deleted file mode 100644 index 0dff3a245c45d3cc985a0583f9da49dafd6545a2..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/br_software_update_list.lng +++ /dev/null @@ -1,9 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/br_system_config.lng b/interface/web/admin/lib/lang/br_system_config.lng index 98bd4c9614c6732f9df036b7884606fe4f1d40cd..1128081d2de44f5f1d2767aa8f700e330093973d 100644 --- a/interface/web/admin/lib/lang/br_system_config.lng +++ b/interface/web/admin/lib/lang/br_system_config.lng @@ -1,58 +1,62 @@ +$wb['web_php_options_txt'] = 'Manipulador PHP (Somente apache)'; +$wb['client_protection_txt'] = 'Proteção de Cliente'; +$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['monitor_key_txt'] = 'Senha do Monitor'; +$wb['dns_show_zoneexport_txt'] = 'Show zone export.'; +$wb['le_caa_autocreate_options_txt'] = 'Enable automatic creation of CAA record on issuing LE'; diff --git a/interface/web/admin/lib/lang/br_tpl_default_admin.lng b/interface/web/admin/lib/lang/br_tpl_default_admin.lng index dbad6b17668dcae270bd642a01f06dd5e91bf030..74daca0f3336c69b32087ab6e4f3631180d41727 100644 --- a/interface/web/admin/lib/lang/br_tpl_default_admin.lng +++ b/interface/web/admin/lib/lang/br_tpl_default_admin.lng @@ -3,16 +3,15 @@ $wb['tpl_default_admin_head_txt'] = 'Configurações globais do tema padrão'; $wb['tpl_default_admin_desc_txt'] = 'Descrição'; $wb['server_id_txt'] = 'Servidor'; $wb['client_id_txt'] = 'Cliente'; -$wb['name_txt'] = 'Nome da versão do php'; +$wb['name_txt'] = 'Nome da versão PHP'; $wb['Name'] = 'Nome'; $wb['FastCGI Settings'] = 'Configurações FastCGI'; $wb['PHP-FPM Settings'] = 'Configurações PHP-FPM'; -$wb['Additional PHP Versions'] = 'Versões adicionais do php'; -$wb['Form to edit additional PHP versions'] = 'Editar versões adicionais do php'; -$wb['server_php_name_error_empty'] = 'O nome está em branco.'; -$wb['php_fastcgi_binary_txt'] = 'Caminho do binário do FastCGI'; -$wb['php_fastcgi_ini_dir_txt'] = 'Caminho do diretório do php.ini'; -$wb['php_fpm_init_script_txt'] = 'Caminho do script de inicialização php-fpm'; -$wb['php_fpm_ini_dir_txt'] = 'Caminho do diretório do php.ini'; -$wb['php_fpm_pool_dir_txt'] = 'Caminho do diretório de faixas php-fpm'; -?> +$wb['Additional PHP Versions'] = 'Versões adicionais PHP'; +$wb['Form to edit additional PHP versions'] = 'Editar versões adicionais PHP'; +$wb['server_php_name_error_empty'] = 'O nome está vazio.'; +$wb['php_fastcgi_binary_txt'] = 'Caminho do binário FastCGI'; +$wb['php_fastcgi_ini_dir_txt'] = 'Caminho do diretório para php.ini'; +$wb['php_fpm_init_script_txt'] = 'Caminho do script de inicialização para PHP-FPM'; +$wb['php_fpm_ini_dir_txt'] = 'Caminho do diretório para php.ini'; +$wb['php_fpm_pool_dir_txt'] = 'Caminho do diretório para pool PHP-FPM'; diff --git a/interface/web/admin/lib/lang/br_users.lng b/interface/web/admin/lib/lang/br_users.lng index 6d71a39e4c78e7ca376c2323520fb932b68cb39f..022d723c97720740209c2897b0b80ab0854440be 100644 --- a/interface/web/admin/lib/lang/br_users.lng +++ b/interface/web/admin/lib/lang/br_users.lng @@ -1,9 +1,10 @@ +$wb['startmodule_empty'] = 'O módulo inicial está vazio.'; +$wb['startmodule_regex'] = 'Caracteres inválidos no módulo inicial.'; +$wb['app_theme_empty'] = 'Tema está vazio.'; +$wb['app_theme_regex'] = 'Caracteres inválidos no tema.'; +$wb['otp_auth_txt'] = '2-Factor Authentication'; diff --git a/interface/web/admin/lib/lang/br_users_list.lng b/interface/web/admin/lib/lang/br_users_list.lng index 26910186c5ef5cbc6d521fa151c9f5a70c322057..c1258d0b07749efee6ee42dadac20f7a9c8db3d0 100644 --- a/interface/web/admin/lib/lang/br_users_list.lng +++ b/interface/web/admin/lib/lang/br_users_list.lng @@ -5,5 +5,4 @@ $wb['client_id_txt'] = 'ID do usuário'; $wb['active_txt'] = 'Ativo'; $wb['groups_txt'] = 'Grupos'; $wb['add_new_record_txt'] = 'Adicionar novo usuário'; -$wb['warning_txt'] = 'ALERTA: Não editar ou alterar qualquer configuração de usuário aqui. Use o módulo de clientes e revendas para isso. Editar ou alterar usuários ou grupos aqui pode causar perda de dados!'; -?> +$wb['warning_txt'] = 'ALERTA: Não editar ou modificar qualquer configuração de usuário aqui. Use o módulo de clientes e revendas para isso. Editar ou modificar usuários ou grupos aqui pode causar perda de dados!'; diff --git a/interface/web/admin/lib/lang/ca_directive_snippets.lng b/interface/web/admin/lib/lang/ca_directive_snippets.lng index 0616afad8b6c76c9eb284f57a673f6c35d286310..0f83e9415955f939b35dec4b9cd8023aa19b0968 100644 --- a/interface/web/admin/lib/lang/ca_directive_snippets.lng +++ b/interface/web/admin/lib/lang/ca_directive_snippets.lng @@ -8,5 +8,8 @@ $wb['directive_snippets_name_empty'] = 'Please specify a name for the snippet.'; $wb['directive_snippets_name_error_unique'] = 'There is already a directive snippet with this name.'; $wb['variables_txt'] = 'Variables'; $wb['customer_viewable_txt'] = 'Customer viewable'; -$wb['required_php_snippets_txt'] = 'Requiered PHP Snippet'; -?> +$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 diff --git a/interface/web/admin/lib/lang/ca_firewall.lng b/interface/web/admin/lib/lang/ca_firewall.lng index 06a51c80cfded45c5d62e1a3618ec061033ae025..b81149e1c063da036681d55103a3430bb445fadd 100644 --- a/interface/web/admin/lib/lang/ca_firewall.lng +++ b/interface/web/admin/lib/lang/ca_firewall.lng @@ -6,6 +6,6 @@ $wb['tcp_port_help_txt'] = 'Separated by comma'; $wb['udp_port_help_txt'] = 'Separated by comma'; $wb['active_txt'] = 'Active'; $wb['firewall_error_unique'] = 'There is already a firewall record for this server.'; -$wb['tcp_ports_error_regex'] = 'Character not allowed in tcp port definition. Allowed characters are numbers, \\":\\" and \\",\\".'; -$wb['udp_ports_error_regex'] = 'Character not allowed in udp port definition. Allowed characters are numbers, \\":\\" and \\",\\".'; +$wb['tcp_ports_error_regex'] = 'Character not allowed in TCP port definition. Allowed characters are numbers, \\":\\" and \\",\\".'; +$wb['udp_ports_error_regex'] = 'Character not allowed in UDP port definition. Allowed characters are numbers, \\":\\" and \\",\\".'; ?> diff --git a/interface/web/admin/lib/lang/ca_language_add.lng b/interface/web/admin/lib/lang/ca_language_add.lng index dc6b2d1b725f9fc83a09377176200713adf99cb0..7c9464f47a31515213e738c04a8460b97c3674ad 100644 --- a/interface/web/admin/lib/lang/ca_language_add.lng +++ b/interface/web/admin/lib/lang/ca_language_add.lng @@ -2,7 +2,7 @@ $wb['list_head_txt'] = 'Add new language'; $wb['language_select_txt'] = 'Select language basis'; $wb['language_new_txt'] = 'New language'; -$wb['language_new_hint_txt'] = '2 characters ISO 639-1 language-code (See http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)'; +$wb['language_new_hint_txt'] = '2 characters ISO 639-1 language-code (See https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)'; $wb['btn_save_txt'] = 'Create new language file set'; $wb['btn_cancel_txt'] = 'Back'; ?> diff --git a/interface/web/admin/lib/lang/ca_remote_action.lng b/interface/web/admin/lib/lang/ca_remote_action.lng index a3fff837b81d0b56ddb20ece485411b1c7cadcd2..667f382fbbdbafeab52971e520bd57655a7f4487 100644 --- a/interface/web/admin/lib/lang/ca_remote_action.lng +++ b/interface/web/admin/lib/lang/ca_remote_action.lng @@ -2,11 +2,11 @@ $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.

USE THIS AT YOUR OWN RISK!'; +$wb['do_osupdate_desc'] = 'This Action does a \'apt -y upgrade\' at your selected server.

USE THIS AT YOUR OWN RISK!'; $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.

USE THIS AT YOUR OWN RISK!'; $wb['action_scheduled'] = 'The action is scheduled for execution'; $wb['select_all_server'] = 'All servers'; $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

ispconfig_update.sh

to start the ISPConfig update.

Click here for detailed update instructions'; +$wb['ispconfig_update_text'] = 'Login as root user on the shell of your server and execute the command

ispconfig_update.sh

to start the ISPConfig update.

Click here for detailed update instructions'; ?> diff --git a/interface/web/admin/lib/lang/ca_remote_user.lng b/interface/web/admin/lib/lang/ca_remote_user.lng index 2fc633b555d240c15457f3ec2fdd48d9e55a756e..e0b911afe5e3cb61cbdb9b8dd3b8d1d0617fc8f1 100644 --- a/interface/web/admin/lib/lang/ca_remote_user.lng +++ b/interface/web/admin/lib/lang/ca_remote_user.lng @@ -1,4 +1,5 @@ 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'; @@ -303,4 +324,23 @@ $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'; +$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['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/ca_server_ip.lng b/interface/web/admin/lib/lang/ca_server_ip.lng index f06b6be78ac8fb73e4f641dea73880615fd03df1..8f7738e51f49de67459ebc6f36d0c38aeb14691f 100644 --- a/interface/web/admin/lib/lang/ca_server_ip.lng +++ b/interface/web/admin/lib/lang/ca_server_ip.lng @@ -1,4 +1,6 @@ diff --git a/interface/web/admin/lib/lang/ca_server_php_list.lng b/interface/web/admin/lib/lang/ca_server_php_list.lng index 62cbe6168714b18ba4fca490280c30c945e09e7c..291302cbb72f6b6ac12dc3e6cb95f18e9dcde90f 100644 --- a/interface/web/admin/lib/lang/ca_server_php_list.lng +++ b/interface/web/admin/lib/lang/ca_server_php_list.lng @@ -5,4 +5,5 @@ $wb['add_new_record_txt'] = 'Add new PHP version'; $wb['client_id_txt'] = 'Client'; $wb['name_txt'] = 'PHP Name'; $wb['active_txt'] = 'Active'; +$wb['usage_txt'] = 'Usage count'; ?> diff --git a/interface/web/admin/lib/lang/ca_software_package.lng b/interface/web/admin/lib/lang/ca_software_package.lng deleted file mode 100644 index faffe38217fb9cac04020e73e473c6c46e3caaa1..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/ca_software_package.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/ca_software_package_install.lng b/interface/web/admin/lib/lang/ca_software_package_install.lng deleted file mode 100644 index 5c8b756434ce27d67e479a96383bbee01bce4f1f..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/ca_software_package_install.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/ca_software_package_list.lng b/interface/web/admin/lib/lang/ca_software_package_list.lng deleted file mode 100644 index 2909d8376e51f4a801bf99fb0e0a3f191558d2a4..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/ca_software_package_list.lng +++ /dev/null @@ -1,13 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/ca_software_repo.lng b/interface/web/admin/lib/lang/ca_software_repo.lng deleted file mode 100644 index f2cbbb2c25776ab5f1794e7102ad264a98144049..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/ca_software_repo.lng +++ /dev/null @@ -1,8 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/ca_software_repo_list.lng b/interface/web/admin/lib/lang/ca_software_repo_list.lng deleted file mode 100644 index b7a219ffa8e2f6d389fabdc5386286a24fc2a11a..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/ca_software_repo_list.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/ca_software_update_list.lng b/interface/web/admin/lib/lang/ca_software_update_list.lng deleted file mode 100644 index fe7639125cd2634fa809d9a6592e9e9fb21e84bb..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/ca_software_update_list.lng +++ /dev/null @@ -1,9 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/ca_system_config.lng b/interface/web/admin/lib/lang/ca_system_config.lng index cc3c11c6c5ac86fe60180a49430fbc1963f9675e..0c025306087190f150de459d187a808d4b0e1461 100644 --- a/interface/web/admin/lib/lang/ca_system_config.lng +++ b/interface/web/admin/lib/lang/ca_system_config.lng @@ -1,4 +1,5 @@ diff --git a/interface/web/admin/lib/lang/ca_users.lng b/interface/web/admin/lib/lang/ca_users.lng index dcbc4f4727145c78a9a6a70b4ac3cca5b3ecc0c7..d4acbf4e807d1a9ad740c14e6c5bfbdd12d1d594 100644 --- a/interface/web/admin/lib/lang/ca_users.lng +++ b/interface/web/admin/lib/lang/ca_users.lng @@ -1,9 +1,10 @@ diff --git a/interface/web/admin/lib/lang/ca_users_list.lng b/interface/web/admin/lib/lang/ca_users_list.lng index 00128b512788558211283104b74166ba1b54b19d..fb1c7bc6ddb8acdcf6dc66b9572f516b935fbf63 100644 --- a/interface/web/admin/lib/lang/ca_users_list.lng +++ b/interface/web/admin/lib/lang/ca_users_list.lng @@ -5,5 +5,5 @@ $wb['client_id_txt'] = 'User ID'; $wb['active_txt'] = 'Active'; $wb['groups_txt'] = 'Groups'; $wb['add_new_record_txt'] = 'Add new user'; -$wb['warning_txt'] = 'WARNING: Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +$wb['warning_txt'] = 'WARNING: Do not edit or modify any client user settings here. Use the client- and reseller settings in the client module instead. Modifying or changing client users or groups here may cause data loss!'; ?> diff --git a/interface/web/admin/lib/lang/cz.lng b/interface/web/admin/lib/lang/cz.lng index 957ddffebf24f2573eff609ccf4f45b87486cd7a..71ed4372d385ff78e12e916c5f4e3543d3ed67e1 100644 --- a/interface/web/admin/lib/lang/cz.lng +++ b/interface/web/admin/lib/lang/cz.lng @@ -1,6 +1,6 @@ +$wb['2'] = 'Uživatelské jméno nebo heslo je prázdné.'; +$wb['3'] = 'Uživatelské jméno nebo heslo je nesprávné.'; diff --git a/interface/web/admin/lib/lang/cz_directive_snippets.lng b/interface/web/admin/lib/lang/cz_directive_snippets.lng index 1fd316583b0720863e5bd30660e01c702e242b20..1f008dc93a2c3103b6f8b67f6eb0209ffab380e5 100644 --- a/interface/web/admin/lib/lang/cz_directive_snippets.lng +++ b/interface/web/admin/lib/lang/cz_directive_snippets.lng @@ -9,4 +9,7 @@ $wb['directive_snippets_name_error_unique'] = 'There is already a directive snip $wb['variables_txt'] = 'Proměnné'; $wb['customer_viewable_txt'] = 'Dostupná volba pro klienta'; $wb['required_php_snippets_txt'] = 'Requiered 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.'; diff --git a/interface/web/admin/lib/lang/cz_directive_snippets_list.lng b/interface/web/admin/lib/lang/cz_directive_snippets_list.lng index a4a365c0a8eb0662a35d179aa4d8232d6ffad43a..8059270ab109f87f0049fd4972aa963ada75ed94 100644 --- a/interface/web/admin/lib/lang/cz_directive_snippets_list.lng +++ b/interface/web/admin/lib/lang/cz_directive_snippets_list.lng @@ -5,4 +5,3 @@ $wb['name_txt'] = 'Název části prog. kódu'; $wb['type_txt'] = 'Verze'; $wb['add_new_record_txt'] = 'Add Directive Snippet'; $wb['customer_viewable_txt'] = 'Dostupná volba pro klienta'; -?> diff --git a/interface/web/admin/lib/lang/cz_firewall.lng b/interface/web/admin/lib/lang/cz_firewall.lng index c6146ae93d5abd8dcd55c348c570a6490aa146fd..a75b9ed594caf515258cfdccb79bc12c60e2dbc1 100644 --- a/interface/web/admin/lib/lang/cz_firewall.lng +++ b/interface/web/admin/lib/lang/cz_firewall.lng @@ -8,4 +8,3 @@ $wb['active_txt'] = 'Aktivní'; $wb['firewall_error_unique'] = 'Pro tento server již existuje záznam firewallu.'; $wb['tcp_ports_error_regex'] = 'Znak není povole v definici TCP portu. Povolené symboly jsou čísla, : a ,.'; $wb['udp_ports_error_regex'] = 'Znak není povole v definici UDP portu. Povolené symboly jsou čísla, : a ,.'; -?> diff --git a/interface/web/admin/lib/lang/cz_firewall_list.lng b/interface/web/admin/lib/lang/cz_firewall_list.lng index c350ddc418cc343cbb78d7eb5775784c5c0500ea..7ae9ac4725ac73cbd55e23e4fc03a920951e4ebd 100644 --- a/interface/web/admin/lib/lang/cz_firewall_list.lng +++ b/interface/web/admin/lib/lang/cz_firewall_list.lng @@ -5,4 +5,3 @@ $wb['server_id_txt'] = 'Server'; $wb['tcp_port_txt'] = 'Otevřené TCP porty'; $wb['udp_port_txt'] = 'Otevřené UDP porty'; $wb['add_new_record_txt'] = 'Vytvořit záznam'; -?> diff --git a/interface/web/admin/lib/lang/cz_groups.lng b/interface/web/admin/lib/lang/cz_groups.lng index a6281be247dd655b73a2c79aeb4b5a2d78ac5f47..0dce6cbd59d7b6d707d72d85359036b3b371fbca 100644 --- a/interface/web/admin/lib/lang/cz_groups.lng +++ b/interface/web/admin/lib/lang/cz_groups.lng @@ -2,4 +2,3 @@ $wb['description_txt'] = 'Popis'; $wb['name_txt'] = 'Skupina'; $wb['name_err'] = 'Skupina musí mít min. 1, max. 30 znaků.'; -?> diff --git a/interface/web/admin/lib/lang/cz_groups_list.lng b/interface/web/admin/lib/lang/cz_groups_list.lng index 967e3ec0f7704f96b3b2776f97baee153a433f2d..8db04d86a0c8ab26136fba5e9604b4c100b83094 100644 --- a/interface/web/admin/lib/lang/cz_groups_list.lng +++ b/interface/web/admin/lib/lang/cz_groups_list.lng @@ -4,4 +4,3 @@ $wb['description_txt'] = 'Popis'; $wb['name_txt'] = 'Skupina'; $wb['add_new_record_txt'] = 'Vytvořit skupinu'; $wb['warning_txt'] = 'VAROVÁNÍ: Zde neupravujte uživatelská nastavení. Použijte klientská a distributorská nastavení v klientském modulu. Úprava uživatelů nebo skupin zde může způsobit ztrátu dat!'; -?> diff --git a/interface/web/admin/lib/lang/cz_iptables.lng b/interface/web/admin/lib/lang/cz_iptables.lng index a40fc0490f86c20e3c38f874633659306ae192e4..45bda7499a4f5aa14e0c962a4e1c4657ba846392 100644 --- a/interface/web/admin/lib/lang/cz_iptables.lng +++ b/interface/web/admin/lib/lang/cz_iptables.lng @@ -10,4 +10,3 @@ $wb['destination_ip_txt'] = 'Cílové adresy'; $wb['source_ip_txt'] = 'Zdrojové adresy'; $wb['active_txt'] = 'Aktivní'; $wb['iptables_error_unique'] = 'Stejný záznam pro firewall je již na tomto serveru použit.'; -?> diff --git a/interface/web/admin/lib/lang/cz_iptables_list.lng b/interface/web/admin/lib/lang/cz_iptables_list.lng index 65cef7507eeda94dd43925ee61cfb70c455a3690..bfac4c29fad7dd71297a5146f9134d042eb6e11d 100644 --- a/interface/web/admin/lib/lang/cz_iptables_list.lng +++ b/interface/web/admin/lib/lang/cz_iptables_list.lng @@ -12,4 +12,3 @@ $wb['destination_ip_txt'] = 'Cílové adresy'; $wb['source_ip_txt'] = 'Zdrojové adresy'; $wb['active_txt'] = 'Aktivní'; $wb['iptables_error_unique'] = 'Stejný záznam pro firewall je již na tomto serveru použit.'; -?> diff --git a/interface/web/admin/lib/lang/cz_language_add.lng b/interface/web/admin/lib/lang/cz_language_add.lng index 21dcf629497af8d98a03879da07182cf88f019b8..1873038ef2597cfaa64ec347ab6ce2acd09db160 100644 --- a/interface/web/admin/lib/lang/cz_language_add.lng +++ b/interface/web/admin/lib/lang/cz_language_add.lng @@ -5,4 +5,3 @@ $wb['language_new_txt'] = 'Název nového jazyka'; $wb['language_new_hint_txt'] = '2 znakové ISO 639-1 jazykové kódy (Viz: http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)'; $wb['btn_save_txt'] = 'Vytvořit novou jazykovou sadu souborů'; $wb['btn_cancel_txt'] = 'Zrušit'; -?> diff --git a/interface/web/admin/lib/lang/cz_language_complete.lng b/interface/web/admin/lib/lang/cz_language_complete.lng index e63b3301f22a1756f00251151e26657a6e959824..1b4ad4fd73dcb5bd60e1851ee9ccf64a5f4bc6fc 100644 --- a/interface/web/admin/lib/lang/cz_language_complete.lng +++ b/interface/web/admin/lib/lang/cz_language_complete.lng @@ -4,4 +4,3 @@ $wb['list_desc_txt'] = 'Sloučit vybraný jazykový soubor s hlavním anglickým $wb['language_select_txt'] = 'Vybrat jazyk k doplnění'; $wb['btn_save_txt'] = 'Sloučit / doplnit jazykový soubor'; $wb['btn_cancel_txt'] = 'Zrušit'; -?> diff --git a/interface/web/admin/lib/lang/cz_language_edit.lng b/interface/web/admin/lib/lang/cz_language_edit.lng index 3efa7e30372bcd909fd81ee0f5f3c90dd86d031b..0bb3938cd9d9ae64d7e16605afdacd763efa887b 100644 --- a/interface/web/admin/lib/lang/cz_language_edit.lng +++ b/interface/web/admin/lib/lang/cz_language_edit.lng @@ -5,4 +5,3 @@ $wb['module_txt'] = 'Modul'; $wb['lang_file_txt'] = 'Jazykový soubor'; $wb['btn_save_txt'] = 'Uložit'; $wb['btn_cancel_txt'] = 'Zrušit'; -?> diff --git a/interface/web/admin/lib/lang/cz_language_export.lng b/interface/web/admin/lib/lang/cz_language_export.lng index e02f86173890194883cac9c248d3bd4015fbc740..8d0654c3f77ecf0b8033364fa87a9ab20e4dfc6e 100644 --- a/interface/web/admin/lib/lang/cz_language_export.lng +++ b/interface/web/admin/lib/lang/cz_language_export.lng @@ -3,4 +3,3 @@ $wb['list_head_txt'] = 'Exportovat jazykové soubory'; $wb['language_select_txt'] = 'Vybrat jazykovou sadu'; $wb['btn_save_txt'] = 'Uložit vybranou jazykovou sadu do souboru'; $wb['btn_cancel_txt'] = 'Zrušit'; -?> diff --git a/interface/web/admin/lib/lang/cz_language_import.lng b/interface/web/admin/lib/lang/cz_language_import.lng index 5dc4ccac3835509dc7b470655ea8c9e1d7cea03d..e68efb5c571f3fa4e735c4b5a74fea3bf95f1d4f 100644 --- a/interface/web/admin/lib/lang/cz_language_import.lng +++ b/interface/web/admin/lib/lang/cz_language_import.lng @@ -6,4 +6,3 @@ $wb['language_overwrite_txt'] = 'Přepsat soubor, pokud existuje.'; $wb['btn_cancel_txt'] = 'Zrušit'; $wb['ignore_version_txt'] = 'Přeskočit kontrolu verze ISPConfigu.'; $wb['list_desc_txt'] = 'VAROVÁNÍ: Nepoužívejte import souborů jazyku z nedůvěryhodných zdrojů.'; -?> diff --git a/interface/web/admin/lib/lang/cz_language_list.lng b/interface/web/admin/lib/lang/cz_language_list.lng index b2a78637155d78161423ec338a12165f86010f68..1612b8682ad1c9283e3096345fcc625918401068 100644 --- a/interface/web/admin/lib/lang/cz_language_list.lng +++ b/interface/web/admin/lib/lang/cz_language_list.lng @@ -4,4 +4,3 @@ $wb['language_select_txt'] = 'Vybrat jazyk'; $wb['module_txt'] = 'Modul'; $wb['lang_file_txt'] = 'Jazykový soubor'; $wb['lang_file_date_txt'] = 'Poslední úprava'; -?> diff --git a/interface/web/admin/lib/lang/cz_package_install.lng b/interface/web/admin/lib/lang/cz_package_install.lng index 2bdc9df31573f41ea296df77994d3611e9434e01..72379faca09a2cd25065ab1203e26dfb9d77cc70 100644 --- a/interface/web/admin/lib/lang/cz_package_install.lng +++ b/interface/web/admin/lib/lang/cz_package_install.lng @@ -4,4 +4,3 @@ $wb['repo_url_txt'] = 'URL'; $wb['repo_username_txt'] = 'Uživatel (volitelné)'; $wb['repo_password_txt'] = 'Heslo (volitelné)'; $wb['active_txt'] = 'Aktivní'; -?> diff --git a/interface/web/admin/lib/lang/cz_remote_action.lng b/interface/web/admin/lib/lang/cz_remote_action.lng index e1908e2d04fe0259ee7258ae0be1506dc6a7982c..5f7fb604fcbd7e59871dd8397bd77ffc975a4aa3 100644 --- a/interface/web/admin/lib/lang/cz_remote_action.lng +++ b/interface/web/admin/lib/lang/cz_remote_action.lng @@ -2,11 +2,10 @@ $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.

POUŽITÍ TÉTO AKCE NA VLASTNÍ NEBEZPEČÍ !'; +$wb['do_osupdate_desc'] = 'Tato akce provede \"apt -y\" aktualizaci na vybraném serveru.

POUŽITÍ TÉTO AKCE NA VLASTNÍ NEBEZPEČÍ !'; $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.

POUŽITÍ TÉTO AKCE NA VLASTNÍ NEBEZPEČÍ !'; +$wb['do_ispcupdate_desc'] = 'Tato akce provede \"ISPConfig 3\" aktualizaci na vašem vybraném serveru.

POUŽITÍ TÉTO AKCE NA VLASTNÍ NEBEZPEČÍ !'; $wb['action_scheduled'] = 'Akce je naplánována na provedení'; $wb['select_all_server'] = 'Všechny servery'; $wb['ispconfig_update_title'] = 'ISPConfig pokyny k aktualizaci'; $wb['ispconfig_update_text'] = 'Přihlaste se jako uživatel root na terminal (shell) serveru a proveďte příkaz

ispconfig_update.sh

spustí se ISPConfig aktualizace.

Klikněte zde pro podrobnější informace o provedení aktualizace'; -?> diff --git a/interface/web/admin/lib/lang/cz_remote_user.lng b/interface/web/admin/lib/lang/cz_remote_user.lng index aeacc442ca975da331d2d6df8d3248a5fb5a0465..81ee2253834ff6b3bf2f79da84519e980ca6682f 100644 --- a/interface/web/admin/lib/lang/cz_remote_user.lng +++ b/interface/web/admin/lib/lang/cz_remote_user.lng @@ -1,4 +1,5 @@ any)'; $wb['remote_user_error_ips'] = 'At least one of the entered ip addresses or hostnames is invalid.'; -?> diff --git a/interface/web/admin/lib/lang/cz_remote_user_list.lng b/interface/web/admin/lib/lang/cz_remote_user_list.lng index 3f4a008f395514440f429f698a0d22640c425a86..a462d0fb5edd26f31a321144b8feae20ba6c0338 100644 --- a/interface/web/admin/lib/lang/cz_remote_user_list.lng +++ b/interface/web/admin/lib/lang/cz_remote_user_list.lng @@ -4,4 +4,3 @@ $wb['list_desc_txt'] = ''; $wb['add_new_record_txt'] = 'Vytvořit uživatele'; $wb['parent_remote_userid_txt'] = 'ID'; $wb['username_txt'] = 'Uživatel'; -?> diff --git a/interface/web/admin/lib/lang/cz_server.lng b/interface/web/admin/lib/lang/cz_server.lng index 8b86caf76bb0ea6d85349e4e349824b3d5f3bb04..e213853198ed14a1e48d70c6974b8f95a3259bca 100644 --- a/interface/web/admin/lib/lang/cz_server.lng +++ b/interface/web/admin/lib/lang/cz_server.lng @@ -1,8 +1,8 @@ diff --git a/interface/web/admin/lib/lang/cz_server_config.lng b/interface/web/admin/lib/lang/cz_server_config.lng index 2b42cf6691e1dd68e8205cac0a301cd8bef0c280..bdc1152cbc8fb47580f456932221a30c8567cc04 100644 --- a/interface/web/admin/lib/lang/cz_server_config.lng +++ b/interface/web/admin/lib/lang/cz_server_config.lng @@ -1,4 +1,8 @@ Informace: Pokud chcete např. vypnout MySQL službu zatrhněte políčko \\"Zakázat MySQL monitorování\\" změna se provede do 2-3 minut.
Pokud nepočkáte 2-3 minuty, monitorování nastartuje službu MySQL automaticky znovu !'; +$wb['rescue_description_txt'] = 'Informace: Pokud chcete např. vypnout MySQL službu zatrhněte políčko \"Zakázat MySQL monitorování\" změna se provede do 2-3 minut.
Pokud nepočkáte 2-3 minuty, monitorování nastartuje službu MySQL automaticky znovu !'; $wb['enable_sni_txt'] = 'Aktivovat SNI (Server Name Indication)'; $wb['do_not_try_rescue_httpd_txt'] = 'Zakázat HTTPD monitorování'; $wb['set_folder_permissions_on_update_txt'] = 'Nastavení oprávnění složky při aktualizaci'; @@ -158,8 +162,12 @@ $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'; +$wb['tooltip_stress_adaptive_txt'] = 'Enables Postfix stress-adaptive behavior.'; $wb['ssl_settings_txt'] = 'SSL Nastavení'; $wb['permissions_txt'] = 'Nastavit oprávnění'; $wb['php_settings_txt'] = 'PHP Nastavení'; @@ -170,9 +178,14 @@ $wb['mailbox_quota_stats_txt'] = 'Statistika kvóty poštovní schránky'; $wb['enable_ip_wildcard_txt'] = 'Aktivovat IP wildcard (*)'; $wb['web_folder_protection_txt'] = 'Make web folders immutable (extended attributes)'; $wb['overtraffic_notify_admin_txt'] = 'Při překročení limitu přenesených dat, poslat oznámení adminovi'; +$wb['overtraffic_notify_reseller_txt'] = 'Send overtraffic notification to reseller'; $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_reseller_txt'] = 'Send quota warnings to reseller'; $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'; $wb['overquota_notify_freq_txt'] = 'Poslat varování o kvótách každý X dní'; @@ -189,7 +202,7 @@ $wb['munin_user_txt'] = 'Munin uživatel'; $wb['munin_password_txt'] = 'Munin heslo'; $wb['munin_url_error_regex'] = 'Invalid Munin URL'; $wb['munin_url_note_txt'] = 'Zástupný symbol'; -$wb['backup_dir_is_mount_txt'] = 'Připojit adresář pro zálohy ?'; +$wb['backup_dir_is_mount_txt'] = 'Připojit adresář pro zálohy'; $wb['monitor_system_updates_txt'] = 'Kontrolovat aktualizace Linuxu'; $wb['invalid_apache_user_txt'] = 'Invalid apache user.'; $wb['invalid_apache_group_txt'] = 'Invalid apache group.'; @@ -250,23 +263,30 @@ $wb['mailbox_virtual_uidgid_maps_info_txt'] = 'only in single web and mail-serve $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['do_not_try_rescue_mongodb_txt'] = 'Zakázat MongoDB monitorování'; +$wb['reject_sender_login_mismatch_txt'] = 'Odmítnout při nesouladu odesílatele s jeho přihlášením'; +$wb['reject_unknown_txt'] = 'Odmítat hostitele s neznámým jménem'; +$wb['tooltip_reject_unknown_txt'] = 'Vyžaduje jména hostitelů již zadaných v DNS pro úspěšnou zpětnou kontrolu v DNS. Kontrola se neprovádí u ověřených uživatelů.'; +$wb['reject_unknown_helo_txt'] = 'reject_unknown_helo_hostname - Odmítne požadavek, pokud název hostitele HELO nebo EHLO nemá žádný záznam DNS A nebo MX.'; +$wb['reject_unknown_client_txt'] = 'reject_unknown_client_hostname - Odmítne požadavek, když 1) IP adresa klienta->nelze přeložit na DNS jmeno, nebo 2) DNS jmeno->nelze přeložit na IP adresu, nebo 3) DNS jmeno->překlad DNS adresy neodpovídá IP adrese klienta.'; +$wb['reject_unknown_client_helo_txt'] = 'Reject unknown helo and client hostnames'; +$wb['do_not_try_rescue_mongodb_txt'] = 'Zakázat MongoDB monitorování'; $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'] = '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_reseller_txt'] = 'Send DB quota warnings to reseller'; $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'; +$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'] = 'Vypnuto'; $wb['php_ini_check_minutes_txt'] = 'Provádět kontrolu změny obsahu souboru php.ini každých X minut'; $wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; -$wb['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; -$wb['web_settings_txt'] = 'Web Server'; +$wb['web_settings_txt'] = 'Webový Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Použít IPv6'; $wb['xmpp_bosh_max_inactivity_txt'] = 'Max. BOSH inactivity time'; @@ -279,28 +299,48 @@ $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['disable_bind_log_txt'] = 'Zakázat zprávy bind9 pro Loglevel WARN'; $wb['apps_vhost_enabled_txt'] = 'Apps-vhost enabled'; $wb['hostname_txt'] = 'Název hostitele'; $wb['hostname_error_empty'] = 'Název hostitele je prázdný'; $wb['hostname_error_regex'] = 'Neplatný název hostitele.'; $wb['backup_time_txt'] = 'Spustit zálohovaní v'; -$wb['skip_le_check_txt'] = 'Skip Lets Encrypt Check'; -$wb['migration_mode_txt'] = 'Server Migration Mode'; +$wb['skip_le_check_txt'] = 'Vynechat Lets Encrypt kontrolu '; +$wb['migration_mode_txt'] = 'Režim migrace serveru '; $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['backup_tmp_txt'] = 'Pracovní tmp adresář při vytváření zip záloh'; +$wb['tmpdir_path_error_empty'] = 'Cesta k pracovnímu tmp adresáři je prázdná.'; +$wb['tmpdir_path_error_regex'] = 'Neplatná cesta k pracovnímu tmp adresáři.'; +$wb['logging_txt'] = 'Povolit přístupové a chybové protokoly webových stránek'; +$wb['logging_desc_txt'] = 'Chcete-li uplatnit změny již u stávajících webových stránek, použijte Nástroje > Znovu synchronizovat. U Apache lze přístup a protokol chyb anonymizovat. U nginx je anonymizován pouze protokol přístupu, protokol chyb bude obsahovat IP adresy.'; +$wb['log_retention_txt'] = 'Zachování protokolu (dny)'; $wb['log_retention_error_ispositive'] = 'Log retention must be a number > 0'; -$wb['php_default_name_txt'] = 'Description Default PHP-Version'; -$wb['php_default_name_error_empty'] = 'Description Default PHP-Version must not be empty'; +$wb['php_default_hide_txt'] = 'Skrýt výchozí verzi PHP při volbě výběru verze PHP'; +$wb['php_default_name_txt'] = 'Popis výchozí verze PHP'; +$wb['php_default_name_error_empty'] = 'Popis výchozí verze PHP nesmí být prázdný'; $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['content_filter_txt'] = 'Filtr obsahu'; $wb['rspamd_url_txt'] = 'Rspamd URL'; $wb['rspamd_user_txt'] = 'Rspamd User'; -$wb['rspamd_password_txt'] = 'Rspamd Password'; -?> +$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'; +$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'] = 'Pevné odkazy v rámci 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'] = 'Ne, odstranit soubory s pevným odkazem'; +$wb['jailkit_hardlinks_yes_txt'] = 'Ano, pokud je to možné, použijte pevné odkazy'; +$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/cz_server_config_list.lng b/interface/web/admin/lib/lang/cz_server_config_list.lng index 2118c35357cc0b40228eb0153adfda86f36cfdae..29d42a20ed21c0d90cde81c6548224e56375cbb5 100644 --- a/interface/web/admin/lib/lang/cz_server_config_list.lng +++ b/interface/web/admin/lib/lang/cz_server_config_list.lng @@ -1,4 +1,3 @@ diff --git a/interface/web/admin/lib/lang/cz_server_ip.lng b/interface/web/admin/lib/lang/cz_server_ip.lng index 43a382a64609539c266810b73f30a2ce4a3c6878..5de51014aae5c5e67155a19bc610a88b5a7e5b7d 100644 --- a/interface/web/admin/lib/lang/cz_server_ip.lng +++ b/interface/web/admin/lib/lang/cz_server_ip.lng @@ -1,4 +1,6 @@ diff --git a/interface/web/admin/lib/lang/cz_server_ip_list.lng b/interface/web/admin/lib/lang/cz_server_ip_list.lng index a0c10060b3811cc4261d6fb19da040ca124c2be3..076c433fee97e40cd2c41b72345ee54042d62c7e 100644 --- a/interface/web/admin/lib/lang/cz_server_ip_list.lng +++ b/interface/web/admin/lib/lang/cz_server_ip_list.lng @@ -7,4 +7,3 @@ $wb['client_id_txt'] = 'Klient'; $wb['virtualhost_txt'] = 'HTTP Vhost'; $wb['virtualhost_port_txt'] = 'HTTP Ports'; $wb['ip_type_txt'] = 'Verze'; -?> diff --git a/interface/web/admin/lib/lang/cz_server_ip_map.lng b/interface/web/admin/lib/lang/cz_server_ip_map.lng index 683451d1d8fcb8d77a215ebcee5c95029b824cb0..d82d4f9878b8245bbd2544d17ed6445b26525660 100644 --- a/interface/web/admin/lib/lang/cz_server_ip_map.lng +++ b/interface/web/admin/lib/lang/cz_server_ip_map.lng @@ -1,4 +1,6 @@ diff --git a/interface/web/admin/lib/lang/cz_server_ip_map_list.lng b/interface/web/admin/lib/lang/cz_server_ip_map_list.lng index 9997bb477b25dae08afcf6adae969f9b2e164071..1ca4104dc9c1f10ab2f49b1ebf217e880b2ab686 100644 --- a/interface/web/admin/lib/lang/cz_server_ip_map_list.lng +++ b/interface/web/admin/lib/lang/cz_server_ip_map_list.lng @@ -4,4 +4,3 @@ $wb['server_id_txt'] = 'Server'; $wb['source_ip_txt'] = 'Zdrojová IP adresa'; $wb['destination_ip_txt'] = 'Cílová IP adresa'; $wb['active_txt'] = 'Aktivní'; -?> diff --git a/interface/web/admin/lib/lang/cz_server_list.lng b/interface/web/admin/lib/lang/cz_server_list.lng index 8aaea041f4b690dd18ab546111979b2520d0778e..662b17c1d4bf41f00dbf4c15a0e26c948a3699e9 100644 --- a/interface/web/admin/lib/lang/cz_server_list.lng +++ b/interface/web/admin/lib/lang/cz_server_list.lng @@ -11,4 +11,3 @@ $wb['add_new_record_txt'] = 'Vytvořit server'; $wb['proxy_server_txt'] = 'Proxy'; $wb['firewall_server_txt'] = 'Firewall'; $wb['xmpp_server_txt'] = 'XMPP'; -?> diff --git a/interface/web/admin/lib/lang/cz_server_php.lng b/interface/web/admin/lib/lang/cz_server_php.lng index e3268703409b81751d095a13e1f8d8da655d2030..c1c67f05ef6673858a11f164aa5a2e0f6d483c0c 100644 --- a/interface/web/admin/lib/lang/cz_server_php.lng +++ b/interface/web/admin/lib/lang/cz_server_php.lng @@ -13,5 +13,8 @@ $wb['php_fastcgi_ini_dir_txt'] = 'Cesta k php.ini adresáři'; $wb['php_fpm_init_script_txt'] = 'Cesta k PHP-FPM init script'; $wb['php_fpm_ini_dir_txt'] = 'Cesta k php.ini adresáři'; $wb['php_fpm_pool_dir_txt'] = 'Cesta k PHP-FPM pool adresáři'; +$wb['php_fpm_socket_dir_txt'] = 'PHP-FPM socket directory'; $wb['active_txt'] = 'Aktivní'; +$wb['php_in_use_error'] = 'This PHP-Version is in use.'; +$wb['php_name_in_use_error'] = 'The name can not be changed.'; ?> diff --git a/interface/web/admin/lib/lang/cz_server_php_list.lng b/interface/web/admin/lib/lang/cz_server_php_list.lng index abe4f750ff53f710decd2bd98b0e67460a60f091..cc7f4ee57ebc077c88866ecb662ce07ada6aa956 100644 --- a/interface/web/admin/lib/lang/cz_server_php_list.lng +++ b/interface/web/admin/lib/lang/cz_server_php_list.lng @@ -5,4 +5,4 @@ $wb['add_new_record_txt'] = 'Přidat verzi PHP'; $wb['client_id_txt'] = 'Klient'; $wb['name_txt'] = 'Verze PHP'; $wb['active_txt'] = 'Aktivní'; -?> +$wb['usage_txt'] = 'Usage count'; diff --git a/interface/web/admin/lib/lang/cz_software_package.lng b/interface/web/admin/lib/lang/cz_software_package.lng deleted file mode 100644 index faffe38217fb9cac04020e73e473c6c46e3caaa1..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/cz_software_package.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/cz_software_package_install.lng b/interface/web/admin/lib/lang/cz_software_package_install.lng deleted file mode 100644 index 0d079ef6d38552240273b77c39b91bc86fd541fd..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/cz_software_package_install.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/cz_software_package_list.lng b/interface/web/admin/lib/lang/cz_software_package_list.lng deleted file mode 100644 index 6896a9feb49237af9b4ef878836ad79b80afa639..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/cz_software_package_list.lng +++ /dev/null @@ -1,13 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/cz_software_repo.lng b/interface/web/admin/lib/lang/cz_software_repo.lng deleted file mode 100644 index bd7bc9d0f2b3e7cf47c11c189c91716bc48713d0..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/cz_software_repo.lng +++ /dev/null @@ -1,8 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/cz_software_repo_list.lng b/interface/web/admin/lib/lang/cz_software_repo_list.lng deleted file mode 100644 index ca04f41dcf2d76f3108c8fb2d68bdabbddafdd94..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/cz_software_repo_list.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/cz_software_update_list.lng b/interface/web/admin/lib/lang/cz_software_update_list.lng deleted file mode 100644 index c48ad8ce30ec1b6fd8a643204e52cfa503501edd..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/cz_software_update_list.lng +++ /dev/null @@ -1,9 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/cz_system_config.lng b/interface/web/admin/lib/lang/cz_system_config.lng index 3660e1b689ff41613eb360826e4776321ab69700..fb0e65d5e7cdc4fc1d8276d1a1a23c54212e61fd 100644 --- a/interface/web/admin/lib/lang/cz_system_config.lng +++ b/interface/web/admin/lib/lang/cz_system_config.lng @@ -1,4 +1,5 @@ +$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['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.'; +$wb['le_caa_autocreate_options_txt'] = 'Enable automatic creation of CAA record on issuing LE'; diff --git a/interface/web/admin/lib/lang/cz_tpl_default_admin.lng b/interface/web/admin/lib/lang/cz_tpl_default_admin.lng index 480d5044215ccee6020d840bf403e3cc11a616bf..9ba5257374ae33374e052d5bf0e04da30380ef9b 100644 --- a/interface/web/admin/lib/lang/cz_tpl_default_admin.lng +++ b/interface/web/admin/lib/lang/cz_tpl_default_admin.lng @@ -15,4 +15,3 @@ $wb['php_fastcgi_ini_dir_txt'] = 'Cesta k php.ini adresáři'; $wb['php_fpm_init_script_txt'] = 'Cesta k PHP-FPM init script'; $wb['php_fpm_ini_dir_txt'] = 'Cesta k php.ini adresáři'; $wb['php_fpm_pool_dir_txt'] = 'Cesta k PHP-FPM pool adresáři'; -?> diff --git a/interface/web/admin/lib/lang/cz_users.lng b/interface/web/admin/lib/lang/cz_users.lng index b517d7329096cb130e610db0e968d13e0ce4cefc..6ad957242a28ffa42c4929c4ada7b55f542949bd 100644 --- a/interface/web/admin/lib/lang/cz_users.lng +++ b/interface/web/admin/lib/lang/cz_users.lng @@ -1,9 +1,10 @@ +$wb['startmodule_empty'] = 'Startmodule empty.'; +$wb['startmodule_regex'] = 'Invalid chars in Startmodule.'; +$wb['app_theme_empty'] = 'App theme empty.'; +$wb['app_theme_regex'] = 'Invalid chars in App theme.'; +$wb['otp_auth_txt'] = '2-Factor Authentication'; diff --git a/interface/web/admin/lib/lang/cz_users_list.lng b/interface/web/admin/lib/lang/cz_users_list.lng index 5f2b9d68807c39ffc6c9d46a3ac28fba31140b40..7ff861b9281bfcbe04fbea953c141a44a6343387 100644 --- a/interface/web/admin/lib/lang/cz_users_list.lng +++ b/interface/web/admin/lib/lang/cz_users_list.lng @@ -6,4 +6,3 @@ $wb['active_txt'] = 'Aktivní'; $wb['add_new_record_txt'] = 'Vytvořit uživatele'; $wb['warning_txt'] = 'VAROVÁNÍ: Zde neupravujte uživatelská nastavení. Použijte klientská a distributorská nastavení v klientském modulu. Úprava uživatelů nebo skupin zde může způsobit ztrátu dat!'; $wb['groups_txt'] = 'Skupiny'; -?> diff --git a/interface/web/admin/lib/lang/de_directive_snippets.lng b/interface/web/admin/lib/lang/de_directive_snippets.lng index 9e369f4b514708b62098bd0f4796b338c0b24df6..0f7fb8dfb7c233fd5840120f33795cdbb72a5066 100644 --- a/interface/web/admin/lib/lang/de_directive_snippets.lng +++ b/interface/web/admin/lib/lang/de_directive_snippets.lng @@ -8,5 +8,8 @@ $wb['directive_snippets_name_empty'] = 'Bitte geben Sie einen Namen für den Sch $wb['directive_snippets_name_error_unique'] = 'Es existiert schon ein Direktiven-Schnipsel mit diesem Namen.'; $wb['variables_txt'] = 'Variablen'; $wb['customer_viewable_txt'] = 'Sichtbar für Kunden'; -$wb['required_php_snippets_txt'] = 'Requiered PHP Snippet'; -?> +$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 diff --git a/interface/web/admin/lib/lang/de_language_add.lng b/interface/web/admin/lib/lang/de_language_add.lng index 2973bf17381570691f4900aeb4116e563276e483..c8eb7973f1d31a1a6344ba9b8c7a0117a3fa429a 100644 --- a/interface/web/admin/lib/lang/de_language_add.lng +++ b/interface/web/admin/lib/lang/de_language_add.lng @@ -2,7 +2,7 @@ $wb['list_head_txt'] = 'Neue Sprache hinzufügen'; $wb['language_select_txt'] = 'Sprachbasis auswählen'; $wb['language_new_txt'] = 'Neue Sprache'; -$wb['language_new_hint_txt'] = '2 Buchstaben ISO 639-1 Sprachcode (siehe http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)'; +$wb['language_new_hint_txt'] = '2 Buchstaben ISO 639-1 Sprachcode (siehe https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)'; $wb['btn_save_txt'] = 'Neues Sprachdateiset erstellen'; $wb['btn_cancel_txt'] = 'Abbrechen'; ?> diff --git a/interface/web/admin/lib/lang/de_remote_action.lng b/interface/web/admin/lib/lang/de_remote_action.lng index 786f03e0ad2c08353348499b054113c1a44ed923..324c18331154f059f02f56308b2c2897eff7584d 100644 --- a/interface/web/admin/lib/lang/de_remote_action.lng +++ b/interface/web/admin/lib/lang/de_remote_action.lng @@ -2,11 +2,11 @@ $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.

DIES GESCHIEHT AUF IHRE EIGENE VERANTWORTUNG!'; +$wb['do_osupdate_desc'] = 'Diese Aktion wird ein apt -y upgrade auf dem ausgewählten Server ausführen.

DIES GESCHIEHT AUF IHRE EIGENE VERANTWORTUNG!'; $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.

DIES GESCHIEHT AUF IHRE EIGENE VERANTWORTUNG!'; $wb['action_scheduled'] = 'Die Aktion wurde zur Ausführung vorgemerkt'; $wb['select_all_server'] = 'Alle Server'; $wb['ispconfig_update_title'] = 'ISPConfig 3 Update Anweisungen'; -$wb['ispconfig_update_text'] = 'Melden Sie sich auf Ihrem Server als root an und führen Sie folgendes Kommando auf der Shell aus

ispconfig_update.sh

um das ISPConfig Update zu starten.

Klicken Sie hier um eine detailierte Beschreibung zu erhalten'; +$wb['ispconfig_update_text'] = 'Melden Sie sich auf Ihrem Server als root an und führen Sie folgendes Kommando auf der Shell aus

ispconfig_update.sh

um das ISPConfig Update zu starten.

Klicken Sie hier um eine detailierte Beschreibung zu erhalten'; ?> diff --git a/interface/web/admin/lib/lang/de_remote_user.lng b/interface/web/admin/lib/lang/de_remote_user.lng index 164a0fb81a4597f506a04a6484f29aefa66bbeab..a1ffd4aa3db4edea698cede7f78466cbb600bb86 100644 --- a/interface/web/admin/lib/lang/de_remote_user.lng +++ b/interface/web/admin/lib/lang/de_remote_user.lng @@ -1,4 +1,5 @@ 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'] = 'Beschreibung Standard PHP'; $wb['php_default_name_error_empty'] = 'Beschreibung Standard PHP ist leer.'; $wb['error_mailbox_message_size_txt'] = 'Mailboxgröße muss gleich oder größer als max. Nachrichtengröße sein.'; @@ -303,4 +324,23 @@ $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'; +$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['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/de_server_ip.lng b/interface/web/admin/lib/lang/de_server_ip.lng index 5757b165cbf47391c513ed10567d3a58208bcfa6..88f23ebc15e3efadf29fd2f8cf23c2883212ffab 100644 --- a/interface/web/admin/lib/lang/de_server_ip.lng +++ b/interface/web/admin/lib/lang/de_server_ip.lng @@ -1,4 +1,6 @@ diff --git a/interface/web/admin/lib/lang/de_server_php_list.lng b/interface/web/admin/lib/lang/de_server_php_list.lng index fe9a72ea150a4fc513dfea3f1ddf6c1ad1933f9b..f9da54d84c90b58a7b97bb8f9bd6439be9b8f933 100644 --- a/interface/web/admin/lib/lang/de_server_php_list.lng +++ b/interface/web/admin/lib/lang/de_server_php_list.lng @@ -5,4 +5,5 @@ $wb['add_new_record_txt'] = 'Neue PHP Version hinzufügen'; $wb['client_id_txt'] = 'Kunde'; $wb['name_txt'] = 'PHP Name'; $wb['active_txt'] = 'Aktiv'; +$wb['usage_txt'] = 'Usage count'; ?> diff --git a/interface/web/admin/lib/lang/de_software_package.lng b/interface/web/admin/lib/lang/de_software_package.lng deleted file mode 100644 index 13b3d996c30489a23bf3c02ab9f2935463bf8e5a..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/de_software_package.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/de_software_package_install.lng b/interface/web/admin/lib/lang/de_software_package_install.lng deleted file mode 100644 index 1ef69d13d32b0fd9cebc50cefc2e3b7b61623513..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/de_software_package_install.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/de_software_package_list.lng b/interface/web/admin/lib/lang/de_software_package_list.lng deleted file mode 100644 index 75b7504390489492a4d84de033807463aaef0540..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/de_software_package_list.lng +++ /dev/null @@ -1,13 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/de_software_repo.lng b/interface/web/admin/lib/lang/de_software_repo.lng deleted file mode 100644 index 242611cd08616fc1159c5dca536282ce672098f8..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/de_software_repo.lng +++ /dev/null @@ -1,8 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/de_software_repo_list.lng b/interface/web/admin/lib/lang/de_software_repo_list.lng deleted file mode 100644 index db6f49fd4edd70c55ebc84f05dc84fc704e861ce..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/de_software_repo_list.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/de_software_update_list.lng b/interface/web/admin/lib/lang/de_software_update_list.lng deleted file mode 100644 index cf31e88154c60bfcdc82fb9b9f778dbbf737eb9b..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/de_software_update_list.lng +++ /dev/null @@ -1,9 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/de_system_config.lng b/interface/web/admin/lib/lang/de_system_config.lng index 76910e1db38f08283a060c67429355118ad643f6..ed4c26f61de5a9b9ac276afc12d1c9c109f150bb 100644 --- a/interface/web/admin/lib/lang/de_system_config.lng +++ b/interface/web/admin/lib/lang/de_system_config.lng @@ -1,4 +1,5 @@ web.'; $wb['backups_include_into_web_quota_txt'] = 'Backups in Web Quota hinzuzählen.'; +$wb['show_per_domain_relay_options_txt'] = 'Show per domain relay options'; $wb['mailbox_show_autoresponder_tab_txt'] = 'Zeige Autoresponder Reiter in E-Mail Kontodetails'; $wb['mailbox_show_mail_filter_tab_txt'] = 'Zeige E-Mail Filter Reiter in E-Mail Kontodetails'; $wb['mailbox_show_custom_rules_tab_txt'] = 'Zeige Benutzerregel Reiter in E-Mail Kontodetails'; @@ -72,6 +76,10 @@ $wb['session_allow_endless_txt'] = '"Eingeloggt bleiben" aktivieren'; $wb['No'] = 'Nein'; $wb['min_password_length_txt'] = 'Minimale Passwortlänge'; $wb['min_password_strength_txt'] = 'Minimale Passwortstärke'; +$wb['ssh_authentication_txt'] = 'Erlaubte SSH Authentifizierung'; +$wb['ssh_authentication_password_key'] = 'Passwort & Schlüssel'; +$wb['ssh_authentication_password'] = 'Passwort'; +$wb['ssh_authentication_key'] = 'Schlüssel'; $wb['company_name_txt'] = 'Firmenname fuer den Seitentitel'; $wb['custom_login_text_txt'] = 'Custom Text on Login-Page'; $wb['custom_login_link_txt'] = 'Custom Link on Login-Page'; @@ -81,6 +89,8 @@ $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['default_remote_dbserver_txt'] = 'Default DB Remote servers'; +$wb['disable_client_remote_dbserver_txt'] = 'Disable DB Remote sections for Clients'; $wb['ca_name_txt'] = 'Name'; $wb['ca_issue_txt'] = 'Issue'; $wb['ca_wildcard_txt'] = 'Wildcard verwenden'; @@ -90,4 +100,11 @@ $wb['active_txt'] = 'Aktiv'; $wb['btn_save_txt'] = 'Speichern'; $wb['btn_cancel_txt'] = 'Abbrechen'; $wb['web_php_options_txt'] = 'PHP Handler (Nur Apache)'; +$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['show_aps_menu_note_url_txt'] = 'Click here for more information.'; +$wb['dns_show_zoneexport_txt'] = 'Show zone export.'; +$wb['le_caa_autocreate_options_txt'] = 'Automatische Erstellung des CAA-Records bei LE Ausstellung aktivieren'; ?> diff --git a/interface/web/admin/lib/lang/de_users.lng b/interface/web/admin/lib/lang/de_users.lng index 255e7bca0bfa5b7161d651766dd3d2247198c327..2747595da72aaf30b5f8beffa0bb233d8bb9bfbc 100644 --- a/interface/web/admin/lib/lang/de_users.lng +++ b/interface/web/admin/lib/lang/de_users.lng @@ -1,7 +1,8 @@ web oder diff --git a/interface/web/admin/lib/lang/dk_directive_snippets.lng b/interface/web/admin/lib/lang/dk_directive_snippets.lng index 7b43dcd40b8059b344ca2155647296bab1fe13dd..3b86e8cd957191ce234653de4f86ba4a2cde7ec7 100644 --- a/interface/web/admin/lib/lang/dk_directive_snippets.lng +++ b/interface/web/admin/lib/lang/dk_directive_snippets.lng @@ -8,5 +8,8 @@ $wb['directive_snippets_name_empty'] = 'Angiv et navn til uddrag.'; $wb['directive_snippets_name_error_unique'] = 'Der er allerede et direktiv uddrag med dette navn.'; $wb['variables_txt'] = 'Variabler'; $wb['customer_viewable_txt'] = 'Customer viewable'; -$wb['required_php_snippets_txt'] = 'Requiered PHP Snippet'; -?> +$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 diff --git a/interface/web/admin/lib/lang/dk_firewall.lng b/interface/web/admin/lib/lang/dk_firewall.lng index 96608b2830ad4e755d195023c45083f03f658b7d..8137f0560a66a098ecceb5bb307a34144a0ab31e 100644 --- a/interface/web/admin/lib/lang/dk_firewall.lng +++ b/interface/web/admin/lib/lang/dk_firewall.lng @@ -6,6 +6,6 @@ $wb['tcp_port_help_txt'] = 'Adskilt af komma'; $wb['udp_port_help_txt'] = 'Adskilt af komma'; $wb['active_txt'] = 'Aktiv'; $wb['firewall_error_unique'] = 'Der er allerede en firewall post for denne server.'; -$wb['tcp_ports_error_regex'] = 'Tegn ikke tilladt i tcp port definition. Tilladt tegn er tal, \\":\\" og \\",\\".'; -$wb['udp_ports_error_regex'] = 'Tegn ikke tilladt i udp port definition. Tilladt tegn er tal, \\":\\" og \\",\\".'; +$wb['tcp_ports_error_regex'] = 'Tegn ikke tilladt i TCP port definition. Tilladt tegn er tal, \\":\\" og \\",\\".'; +$wb['udp_ports_error_regex'] = 'Tegn ikke tilladt i UDP port definition. Tilladt tegn er tal, \\":\\" og \\",\\".'; ?> diff --git a/interface/web/admin/lib/lang/dk_language_add.lng b/interface/web/admin/lib/lang/dk_language_add.lng index c9bb1a0b43b4809f2f397994c840bcc838277cea..f0cc6857d13fa095862695204e786a64f57b5783 100644 --- a/interface/web/admin/lib/lang/dk_language_add.lng +++ b/interface/web/admin/lib/lang/dk_language_add.lng @@ -2,7 +2,7 @@ $wb['list_head_txt'] = 'Tilføj nyt sprog'; $wb['language_select_txt'] = 'Vælg basis sprog'; $wb['language_new_txt'] = 'Nyt sprog'; -$wb['language_new_hint_txt'] = '2 karakters ISO 639-1 sprog-kode (See http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)'; +$wb['language_new_hint_txt'] = '2 karakters ISO 639-1 sprog-kode (See https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)'; $wb['btn_save_txt'] = 'Opret nyt sprog fil-sæt'; $wb['btn_cancel_txt'] = 'Tilbage'; ?> diff --git a/interface/web/admin/lib/lang/dk_remote_action.lng b/interface/web/admin/lib/lang/dk_remote_action.lng index 5a118264abd154621560fca1cbc1d2646510a109..53c12f6adfb2d3fe5daf95764f544597f21f4392 100644 --- a/interface/web/admin/lib/lang/dk_remote_action.lng +++ b/interface/web/admin/lib/lang/dk_remote_action.lng @@ -2,11 +2,11 @@ $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.

BRUG DETTE PÅ EGEN RISIKO!'; +$wb['do_osupdate_desc'] = 'Denne Handling udfør en \'apt -y upgrade\' på den valgte server.

BRUG DETTE PÅ EGEN RISIKO!'; $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.

BRUG DETTE PÅ EGEN RISIKO!'; $wb['action_scheduled'] = 'Handlingen er planlagt til udførelse'; $wb['select_all_server'] = 'Alle servere'; $wb['ispconfig_update_title'] = 'ISPConfig opdateringsinstruktioner'; -$wb['ispconfig_update_text'] = 'Log ind som root-bruger på Shell af din server og udføre kommandoen

ispconfig_update.sh

for at starte ISPConfig opdateringen.

Klik her for detaljerede opdateringsinstruktioner'; +$wb['ispconfig_update_text'] = 'Log ind som root-bruger på Shell af din server og udføre kommandoen

ispconfig_update.sh

for at starte ISPConfig opdateringen.

Klik her for detaljerede opdateringsinstruktioner'; ?> diff --git a/interface/web/admin/lib/lang/dk_remote_user.lng b/interface/web/admin/lib/lang/dk_remote_user.lng index 80f61c8929202a85fbd89c972fb8bd111c840653..aae5089aa137a6440b6170e9d489a22cce816a89 100644 --- a/interface/web/admin/lib/lang/dk_remote_user.lng +++ b/interface/web/admin/lib/lang/dk_remote_user.lng @@ -1,4 +1,5 @@ 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'; @@ -303,4 +324,23 @@ $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'; +$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['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/dk_server_ip.lng b/interface/web/admin/lib/lang/dk_server_ip.lng index ba1586644d4312f738d81488807c668121dd5d32..a6ba3ba045b338cd2953eea372988bcd87c8a84e 100644 --- a/interface/web/admin/lib/lang/dk_server_ip.lng +++ b/interface/web/admin/lib/lang/dk_server_ip.lng @@ -1,4 +1,6 @@ diff --git a/interface/web/admin/lib/lang/dk_server_php_list.lng b/interface/web/admin/lib/lang/dk_server_php_list.lng index 43fb5fe2110addd46f8c25ae2a53b5b8dca3c80e..65869ce2ed3dd1f042a4d9e5e27427fbdeed1c4a 100644 --- a/interface/web/admin/lib/lang/dk_server_php_list.lng +++ b/interface/web/admin/lib/lang/dk_server_php_list.lng @@ -5,4 +5,5 @@ $wb['add_new_record_txt'] = 'Tilføj ny PHP version'; $wb['client_id_txt'] = 'Kunde'; $wb['name_txt'] = 'PHP Navn'; $wb['active_txt'] = 'Active'; +$wb['usage_txt'] = 'Usage count'; ?> diff --git a/interface/web/admin/lib/lang/dk_software_package.lng b/interface/web/admin/lib/lang/dk_software_package.lng deleted file mode 100644 index 86f45dc91ef21cd0c1f506379c272d5dc71921e9..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/dk_software_package.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/dk_software_package_install.lng b/interface/web/admin/lib/lang/dk_software_package_install.lng deleted file mode 100644 index fd9211652c73e2f188f48de99b97f2bff8738cee..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/dk_software_package_install.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/dk_software_package_list.lng b/interface/web/admin/lib/lang/dk_software_package_list.lng deleted file mode 100644 index 3fb5399eaecb8a650547e99648e532aa95a6ccfa..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/dk_software_package_list.lng +++ /dev/null @@ -1,13 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/dk_software_repo.lng b/interface/web/admin/lib/lang/dk_software_repo.lng deleted file mode 100644 index 2c506cdc6b6d9decbf8dda1827104b17c0aaf6b7..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/dk_software_repo.lng +++ /dev/null @@ -1,8 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/dk_software_repo_list.lng b/interface/web/admin/lib/lang/dk_software_repo_list.lng deleted file mode 100644 index aa33919cbd6b8e088b3e5dd5fc9b371b97c405f7..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/dk_software_repo_list.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/dk_software_update_list.lng b/interface/web/admin/lib/lang/dk_software_update_list.lng deleted file mode 100644 index 8a8e8686af47c83de5cb82922cac2bd30f4709a9..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/dk_software_update_list.lng +++ /dev/null @@ -1,9 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/dk_system_config.lng b/interface/web/admin/lib/lang/dk_system_config.lng index 26b0fe7e78d1ba19b2799749ec357bdd17f2c71c..971253aae773517e8cd56f0a0fbd1503e5508d88 100644 --- a/interface/web/admin/lib/lang/dk_system_config.lng +++ b/interface/web/admin/lib/lang/dk_system_config.lng @@ -1,4 +1,5 @@ diff --git a/interface/web/admin/lib/lang/dk_users.lng b/interface/web/admin/lib/lang/dk_users.lng index 2e86ab4ca9b497646bc4a2759eca5c379940d9c4..351cd091afce3513693700c8d09a8a704b9d65fb 100644 --- a/interface/web/admin/lib/lang/dk_users.lng +++ b/interface/web/admin/lib/lang/dk_users.lng @@ -1,9 +1,10 @@ diff --git a/interface/web/admin/lib/lang/el_directive_snippets.lng b/interface/web/admin/lib/lang/el_directive_snippets.lng index 0616afad8b6c76c9eb284f57a673f6c35d286310..0f83e9415955f939b35dec4b9cd8023aa19b0968 100644 --- a/interface/web/admin/lib/lang/el_directive_snippets.lng +++ b/interface/web/admin/lib/lang/el_directive_snippets.lng @@ -8,5 +8,8 @@ $wb['directive_snippets_name_empty'] = 'Please specify a name for the snippet.'; $wb['directive_snippets_name_error_unique'] = 'There is already a directive snippet with this name.'; $wb['variables_txt'] = 'Variables'; $wb['customer_viewable_txt'] = 'Customer viewable'; -$wb['required_php_snippets_txt'] = 'Requiered PHP Snippet'; -?> +$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 diff --git a/interface/web/admin/lib/lang/el_language_add.lng b/interface/web/admin/lib/lang/el_language_add.lng index 604f3a7aba386c6d4efdfec24e94d88a4f32fc9a..576767d71b485f52270b5a43867fb1e97c5fb170 100644 --- a/interface/web/admin/lib/lang/el_language_add.lng +++ b/interface/web/admin/lib/lang/el_language_add.lng @@ -2,7 +2,7 @@ $wb['list_head_txt'] = 'Νέα Γλώσσα'; $wb['language_select_txt'] = 'Επιλογή βασικής γλώσσας'; $wb['language_new_txt'] = 'Νέα Γλώσσα'; -$wb['language_new_hint_txt'] = 'Κωδικός γλώσσας 2 χαρακτήρων κατά ISO 639-1 (δείτε http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)'; +$wb['language_new_hint_txt'] = 'Κωδικός γλώσσας 2 χαρακτήρων κατά ISO 639-1 (δείτε https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)'; $wb['btn_save_txt'] = 'Νέα ομάδα αρχείων γλώσσας'; $wb['btn_cancel_txt'] = 'Επιστροφή'; ?> diff --git a/interface/web/admin/lib/lang/el_remote_action.lng b/interface/web/admin/lib/lang/el_remote_action.lng index e4f97cb228c1702267b178ff7f3f3b763f133d37..18363323251764dd4f1e2bf6d29eca23b3bb2ec5 100644 --- a/interface/web/admin/lib/lang/el_remote_action.lng +++ b/interface/web/admin/lib/lang/el_remote_action.lng @@ -2,11 +2,11 @@ $wb['select_server_txt'] = 'Επιλογή Server'; $wb['btn_do_txt'] = 'Εκτέλεση ενέργειας'; $wb['do_osupdate_caption'] = 'Εκκίνηση αναβάθμισης λειτουργικού συστήματος στον απομακρυσμένο server'; -$wb['do_osupdate_desc'] = 'Αυτή η ενέργεια εκτελεί την εντολή aptitude -y upgrade στον επιλεγμένο σας server.

ΧΡΗΣΙΜΟΠΟΙΗΣΤΕ ΤΟ ΜΕ ΔΙΚΗ ΣΑΣ ΕΥΘΥΝΗ!'; +$wb['do_osupdate_desc'] = 'Αυτή η ενέργεια εκτελεί την εντολή apt -y upgrade στον επιλεγμένο σας server.

ΧΡΗΣΙΜΟΠΟΙΗΣΤΕ ΤΟ ΜΕ ΔΙΚΗ ΣΑΣ ΕΥΘΥΝΗ!'; $wb['do_ispcupdate_caption'] = 'Εκκίνηση αναβάθμισης ISPConfig 3 στον απομακρυσμένο server'; $wb['do_ispcupdate_desc'] = 'Αυτή η ενέργεια κάνει αναβάθμιση στο ISPConfig3 στον επιλεγμένο σας server.

ΧΡΗΣΙΜΟΠΟΙΗΣΤΕ ΤΟ ΜΕ ΔΙΚΗ ΣΑΣ ΕΥΘΥΝΗ!'; $wb['action_scheduled'] = 'Η ενέργεια προγραμματίστηκε για εκτέλεση'; $wb['select_all_server'] = 'Σε όλους τους servers'; $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

ispconfig_update.sh

to start the ISPConfig update.

Click here for detailed update instructins'; +$wb['ispconfig_update_text'] = 'Login as root user on the shell of your server and execute the command

ispconfig_update.sh

to start the ISPConfig update.

Click here for detailed update instructins'; ?> diff --git a/interface/web/admin/lib/lang/el_remote_user.lng b/interface/web/admin/lib/lang/el_remote_user.lng index c38f1de2f05ff525cbcc2f89e13327e71078d4e2..65efbd8f961a7e476ecb3d104a5660a40fcec8dc 100644 --- a/interface/web/admin/lib/lang/el_remote_user.lng +++ b/interface/web/admin/lib/lang/el_remote_user.lng @@ -1,4 +1,5 @@ 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'; @@ -303,4 +324,23 @@ $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'; +$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['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/el_server_ip.lng b/interface/web/admin/lib/lang/el_server_ip.lng index 212f432793c0ef23131d64fa34939bb3dd6e7681..f00925fc62dbeab86126a67f60ccda7ff59b2aa9 100644 --- a/interface/web/admin/lib/lang/el_server_ip.lng +++ b/interface/web/admin/lib/lang/el_server_ip.lng @@ -1,4 +1,6 @@ diff --git a/interface/web/admin/lib/lang/el_server_php_list.lng b/interface/web/admin/lib/lang/el_server_php_list.lng index 62cbe6168714b18ba4fca490280c30c945e09e7c..291302cbb72f6b6ac12dc3e6cb95f18e9dcde90f 100644 --- a/interface/web/admin/lib/lang/el_server_php_list.lng +++ b/interface/web/admin/lib/lang/el_server_php_list.lng @@ -5,4 +5,5 @@ $wb['add_new_record_txt'] = 'Add new PHP version'; $wb['client_id_txt'] = 'Client'; $wb['name_txt'] = 'PHP Name'; $wb['active_txt'] = 'Active'; +$wb['usage_txt'] = 'Usage count'; ?> diff --git a/interface/web/admin/lib/lang/el_software_package.lng b/interface/web/admin/lib/lang/el_software_package.lng deleted file mode 100644 index faffe38217fb9cac04020e73e473c6c46e3caaa1..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/el_software_package.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/el_software_package_install.lng b/interface/web/admin/lib/lang/el_software_package_install.lng deleted file mode 100644 index 5e3d0fd4022ce48fac39c9379b5de0774c46510b..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/el_software_package_install.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/el_software_package_list.lng b/interface/web/admin/lib/lang/el_software_package_list.lng deleted file mode 100644 index 1553ea1ceafeca4b43be5bd163c9b3fc47ae9864..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/el_software_package_list.lng +++ /dev/null @@ -1,13 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/el_software_repo.lng b/interface/web/admin/lib/lang/el_software_repo.lng deleted file mode 100644 index 3b12d3fd874fd4e1945f6ce2f234e2f3d619ae24..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/el_software_repo.lng +++ /dev/null @@ -1,8 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/el_software_repo_list.lng b/interface/web/admin/lib/lang/el_software_repo_list.lng deleted file mode 100644 index deb896a719c990ba6df4b00d5114b8dc1ac62f43..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/el_software_repo_list.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/el_software_update_list.lng b/interface/web/admin/lib/lang/el_software_update_list.lng deleted file mode 100644 index 42100d0c8903ad84f65f8f5137feee995b83d3d5..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/el_software_update_list.lng +++ /dev/null @@ -1,9 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/el_system_config.lng b/interface/web/admin/lib/lang/el_system_config.lng index 640d6f00a9e13e73a37b2e3797b48f1300d66cda..8bfe8012de1d9c98b30a55ebdd1cc051480b31a7 100644 --- a/interface/web/admin/lib/lang/el_system_config.lng +++ b/interface/web/admin/lib/lang/el_system_config.lng @@ -1,4 +1,5 @@ diff --git a/interface/web/admin/lib/lang/el_users.lng b/interface/web/admin/lib/lang/el_users.lng index f0307b95eca8d9ab65a653fc96032eb67b64e0a4..0b46b3a52247913458c777f15ec09637d11db65b 100644 --- a/interface/web/admin/lib/lang/el_users.lng +++ b/interface/web/admin/lib/lang/el_users.lng @@ -1,9 +1,10 @@ diff --git a/interface/web/admin/lib/lang/en.lng b/interface/web/admin/lib/lang/en.lng index 0d075c1165f313999869728b14aad2be41a21b67..6d145dd5d44abb7f30ef4d63138074553ece0f26 100644 --- a/interface/web/admin/lib/lang/en.lng +++ b/interface/web/admin/lib/lang/en.lng @@ -1,7 +1,7 @@ \ No newline at end of file +$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 diff --git a/interface/web/admin/lib/lang/en_directive_snippets_list.lng b/interface/web/admin/lib/lang/en_directive_snippets_list.lng index 7a4db54ea422270ce4b0456d3d4f9958ca65cfa9..c8779ef90aaf6045720d2035f00bbb9535d18211 100644 --- a/interface/web/admin/lib/lang/en_directive_snippets_list.lng +++ b/interface/web/admin/lib/lang/en_directive_snippets_list.lng @@ -1,8 +1,8 @@ \ No newline at end of file diff --git a/interface/web/admin/lib/lang/en_firewall.lng b/interface/web/admin/lib/lang/en_firewall.lng index 025108bebefa2484e16f8a59b4cd7776d69ef61e..4b1efe7540a4d997bb0a814a68f437082f768122 100644 --- a/interface/web/admin/lib/lang/en_firewall.lng +++ b/interface/web/admin/lib/lang/en_firewall.lng @@ -1,12 +1,11 @@ \ No newline at end of file +$wb['server_id_txt'] = 'Server'; +$wb['tcp_port_txt'] = 'Open TCP ports'; +$wb['udp_port_txt'] = 'Open UDP ports'; +$wb['tcp_port_help_txt'] = 'Separated by comma'; +$wb['udp_port_help_txt'] = 'Separated by comma'; +$wb['active_txt'] = 'Active'; +$wb['firewall_error_unique'] = 'There is already a firewall record for this server.'; +$wb['tcp_ports_error_regex'] = 'Character not allowed in TCP port definition. Allowed characters are numbers, colons (:) and commas.'; +$wb['udp_ports_error_regex'] = 'Character not allowed in UDP port definition. Allowed characters are numbers, colons (:) and commas.'; +?> diff --git a/interface/web/admin/lib/lang/en_firewall_list.lng b/interface/web/admin/lib/lang/en_firewall_list.lng index d16e1c7dfcb8fac81462da0217b2a0355be8fdcc..f1b91d94951157c079e2521c43bc543fe3faed31 100644 --- a/interface/web/admin/lib/lang/en_firewall_list.lng +++ b/interface/web/admin/lib/lang/en_firewall_list.lng @@ -1,8 +1,8 @@ \ No newline at end of file diff --git a/interface/web/admin/lib/lang/en_groups.lng b/interface/web/admin/lib/lang/en_groups.lng index a504f9913ef4fa30dd76004a1d3365622803d763..d9a3daaf95b3ff22b2f2337640f1802d44f6e2dc 100644 --- a/interface/web/admin/lib/lang/en_groups.lng +++ b/interface/web/admin/lib/lang/en_groups.lng @@ -1,5 +1,5 @@ \ No newline at end of file diff --git a/interface/web/admin/lib/lang/en_groups_list.lng b/interface/web/admin/lib/lang/en_groups_list.lng index ba1831836ae442a56bceef72c91cb808814ec842..d569e52b64f93639a2c57cc4438fe191ad1838bd 100644 --- a/interface/web/admin/lib/lang/en_groups_list.lng +++ b/interface/web/admin/lib/lang/en_groups_list.lng @@ -1,7 +1,7 @@ WARNING:
Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +$wb['list_head_txt'] = 'Systemuser groups'; +$wb['description_txt'] = 'Description'; +$wb['name_txt'] = 'Group'; +$wb['add_new_record_txt'] = 'Add new Group'; +$wb['warning_txt'] = 'WARNING: Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; ?> \ No newline at end of file diff --git a/interface/web/admin/lib/lang/en_iptables.lng b/interface/web/admin/lib/lang/en_iptables.lng index c675592f962ae5f14289b551d9cbe85208d0e10d..343c735d3979ec4e2a707a0e96b08478753f0261 100644 --- a/interface/web/admin/lib/lang/en_iptables.lng +++ b/interface/web/admin/lib/lang/en_iptables.lng @@ -1,15 +1,15 @@ diff --git a/interface/web/admin/lib/lang/en_iptables_list.lng b/interface/web/admin/lib/lang/en_iptables_list.lng index 229374adf47cf5a75b1545213e65831876b5f5b0..d4e8a2be9f826958d7d39e19ad59a261577f3608 100644 --- a/interface/web/admin/lib/lang/en_iptables_list.lng +++ b/interface/web/admin/lib/lang/en_iptables_list.lng @@ -18,18 +18,18 @@ templates/iptables_list.htm: {tmpl_var name="fi templates/iptables_list.htm: {tmpl_var name='delete_txt'} */ -$wb["list_head_txt"] = 'IPTables'; -$wb["add_new_rule_txt"] = 'Add IPTables Rule'; -$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["active_txt"] = 'Active'; -$wb["iptables_error_unique"] = 'There is already a firewall record for this server.'; +$wb['list_head_txt'] = 'IPTables'; +$wb['add_new_rule_txt'] = 'Add IPTables Rule'; +$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['active_txt'] = 'Active'; +$wb['iptables_error_unique'] = 'There is already a firewall record for this server.'; ?> diff --git a/interface/web/admin/lib/lang/en_language_add.lng b/interface/web/admin/lib/lang/en_language_add.lng index 2b5e5a40f89e8977436a8b3aa315504224297b8b..6a36344f1fce0425655404e08238aa64a30d6acf 100644 --- a/interface/web/admin/lib/lang/en_language_add.lng +++ b/interface/web/admin/lib/lang/en_language_add.lng @@ -1,8 +1,8 @@ \ No newline at end of file diff --git a/interface/web/admin/lib/lang/en_language_complete.lng b/interface/web/admin/lib/lang/en_language_complete.lng index 15438775fca485d0441d073001fe9970c7f6daa2..60aafb3ba4c5f9490f36d21cac131bf046b8af58 100644 --- a/interface/web/admin/lib/lang/en_language_complete.lng +++ b/interface/web/admin/lib/lang/en_language_complete.lng @@ -1,7 +1,7 @@ This adds missing strings from the english master language files to the selected language.'; -$wb["language_select_txt"] = 'Select language'; +$wb['list_head_txt'] = 'Merge language'; +$wb['list_desc_txt'] = 'Merge the selected language file with the english master language file.
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['btn_cancel_txt'] = 'Back'; ?> \ No newline at end of file diff --git a/interface/web/admin/lib/lang/en_language_export.lng b/interface/web/admin/lib/lang/en_language_export.lng index 791fc894d31731be124b3cc083e4ace7661f9aa7..17b8ac79e337d3e8cb7175e70b3a6a7b9312ee78 100644 --- a/interface/web/admin/lib/lang/en_language_export.lng +++ b/interface/web/admin/lib/lang/en_language_export.lng @@ -1,6 +1,6 @@ \ No newline at end of file diff --git a/interface/web/admin/lib/lang/en_language_import.lng b/interface/web/admin/lib/lang/en_language_import.lng index 0314af1d7714e98ae3b07c2949d65fd289c56f63..7133444265dee4fef7f77f7a451ae7e6a9d1fb17 100644 --- a/interface/web/admin/lib/lang/en_language_import.lng +++ b/interface/web/admin/lib/lang/en_language_import.lng @@ -1,9 +1,9 @@ \ No newline at end of file diff --git a/interface/web/admin/lib/lang/en_language_list.lng b/interface/web/admin/lib/lang/en_language_list.lng index e70f09f8eaf3c7df8c8e82d10c0d6c8a27f9883e..1c784edf6d06b268c72b43ab0e4c14e8e325905a 100644 --- a/interface/web/admin/lib/lang/en_language_list.lng +++ b/interface/web/admin/lib/lang/en_language_list.lng @@ -1,7 +1,7 @@ diff --git a/interface/web/admin/lib/lang/en_package_install.lng b/interface/web/admin/lib/lang/en_package_install.lng index 7968b000fddc0b703bdeb64d4faf940401899a33..fb87e7bfcb496f5742b43930b21d57d6d6212f83 100644 --- a/interface/web/admin/lib/lang/en_package_install.lng +++ b/interface/web/admin/lib/lang/en_package_install.lng @@ -1,7 +1,7 @@ \ No newline at end of file diff --git a/interface/web/admin/lib/lang/en_remote_action.lng b/interface/web/admin/lib/lang/en_remote_action.lng index 18c01863605cf2d45d9ab98420a7989abdd3ad3f..16b45fada9adeb35902c30d5d84cc473af855fa1 100644 --- a/interface/web/admin/lib/lang/en_remote_action.lng +++ b/interface/web/admin/lib/lang/en_remote_action.lng @@ -2,11 +2,11 @@ $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.

USE THIS AT YOUR OWN RISK!"; +$wb['do_osupdate_desc'] = 'This Action does a "apt -y upgrade" at your selected server.

USE THIS AT YOUR OWN RISK!'; $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.

USE THIS AT YOUR OWN RISK!"; -$wb['action_scheduled'] = "The action is scheduled for execution"; -$wb['select_all_server'] = "All servers"; -$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

ispconfig_update.sh

to start the ISPConfig update.

Click here for detailed update instructions"; +$wb['do_ispcupdate_desc'] = 'This action does a ISPConfig3 update at your selected server.

USE THIS AT YOUR OWN RISK!'; +$wb['action_scheduled'] = 'The action is scheduled for execution'; +$wb['select_all_server'] = 'All servers'; +$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

ispconfig_update.sh

to start the ISPConfig update.

Click here for detailed update instructions'; ?> diff --git a/interface/web/admin/lib/lang/en_remote_user.lng b/interface/web/admin/lib/lang/en_remote_user.lng index 2fc633b555d240c15457f3ec2fdd48d9e55a756e..e0b911afe5e3cb61cbdb9b8dd3b8d1d0617fc8f1 100644 --- a/interface/web/admin/lib/lang/en_remote_user.lng +++ b/interface/web/admin/lib/lang/en_remote_user.lng @@ -1,4 +1,5 @@ diff --git a/interface/web/admin/lib/lang/en_server.lng b/interface/web/admin/lib/lang/en_server.lng index 1f36bc718ef1402b752c9f0d9326ae68cb35fb60..d85a16d3a933e9e479503694bcc7ff91b5997bb8 100644 --- a/interface/web/admin/lib/lang/en_server.lng +++ b/interface/web/admin/lib/lang/en_server.lng @@ -1,17 +1,17 @@ \ No newline at end of file diff --git a/interface/web/admin/lib/lang/en_server_config.lng b/interface/web/admin/lib/lang/en_server_config.lng index 1d2bf74ec9c67ff9cfaa89fe629ca310ee53bbb8..363f528fba2d713e819e112578797a15b7c1b782 100644 --- a/interface/web/admin/lib/lang/en_server_config.lng +++ b/interface/web/admin/lib/lang/en_server_config.lng @@ -1,196 +1,222 @@ Information:
If you want to shut down mysql you have to select the "Disable MySQL monitor" checkbox and then wait 2-3 minutes.
If you do not wait 2-3 minutes, rescue will try to restart mysql!'; -$wb["enable_sni_txt"] = 'Enable SNI'; -$wb["set_folder_permissions_on_update_txt"] = 'Set folder permissions on update'; -$wb["add_web_users_to_sshusers_group_txt"] = 'Add web users to -sshusers- group'; -$wb["connect_userid_to_webid_txt"] = 'Connect Linux userid to webid'; -$wb["connect_userid_to_webid_start_txt"] = 'Start ID for userid/webid connect'; -$wb["realtime_blackhole_list_txt"] = 'Real-time Blackhole List'; -$wb["realtime_blackhole_list_note_txt"] = '(Separate RBL\'s with commas)'; -$wb["ssl_settings_txt"] = 'SSL Settings'; -$wb["permissions_txt"] = 'Permissions'; -$wb["php_settings_txt"] = 'PHP Settings'; -$wb["apps_vhost_settings_txt"] = 'Apps Vhost Settings'; -$wb["awstats_settings_txt"] = 'AWStats Settings'; -$wb["firewall_txt"] = 'Firewall'; -$wb["mailbox_quota_stats_txt"] = 'Mailbox quota statistics'; -$wb["enable_ip_wildcard_txt"] = 'Enable IP wildcard (*)'; -$wb["web_folder_protection_txt"] = 'Make web folders immutable (extended attributes)'; -$wb["overtraffic_notify_admin_txt"] = 'Send overtraffic notification to admin'; -$wb["overtraffic_notify_client_txt"] = 'Send overtraffic notification to client'; -$wb["rbl_error_regex"] = 'Please specify valid RBL hostnames.'; -$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'; +$wb['backup_time_txt'] = 'Backup time'; +$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'; +$wb['nginx_user_txt'] = 'Nginx user'; +$wb['nginx_group_txt'] = 'Nginx group'; +$wb['nginx_cgi_socket_txt'] = 'Nginx CGI Socket'; +$wb['backup_dir_error_empty'] = 'Backup directory is empty.'; +$wb['maildir_path_error_empty'] = 'Maildir Path is empty.'; +$wb['homedir_path_error_empty'] = 'Homedir Path is empty.'; +$wb['mailuser_uid_error_empty'] = 'Mailuser UID is empty.'; +$wb['mailuser_gid_error_empty'] = 'Mailuser GID is empty.'; +$wb['mailuser_name_error_empty'] = 'Mailuser Name is empty.'; +$wb['mailuser_group_error_empty'] = 'Mailuser Group is empty.'; +$wb['getmail_config_dir_error_empty'] = 'Getmail config dir is empty.'; +$wb['website_basedir_error_empty'] = 'Website basedir is empty.'; +$wb['website_path_error_empty'] = 'Website path is empty.'; +$wb['website_symlinks_error_empty'] = 'Website symlinks is empty.'; +$wb['vhost_conf_dir_error_empty'] = 'Vhost config dir is empty.'; +$wb['vhost_conf_enabled_dir_error_empty'] = 'Vhost config enabled dir is empty.'; +$wb['nginx_vhost_conf_dir_error_empty'] = 'Nginx Vhost config dir is empty.'; +$wb['nginx_vhost_conf_enabled_dir_error_empty'] = 'Nginx Vhost config enabled dir is empty.'; +$wb['apache_user_error_empty'] = 'Apache user is empty.'; +$wb['apache_group_error_empty'] = 'Apache group is empty.'; +$wb['nginx_user_error_empty'] = 'Nginx user is empty.'; +$wb['nginx_group_error_empty'] = 'Nginx group is empty.'; +$wb['php_ini_path_apache_error_empty'] = 'Apache php.ini path is empty.'; +$wb['php_ini_path_cgi_error_empty'] = 'CGI php.ini path is empty.'; +$wb['nginx_cgi_socket_empty'] = 'Nginx CGI Socket is empty.'; +$wb['apps_vhost_port_error_empty'] = 'Apps-vhost port is empty.'; +$wb['apps_vhost_ip_error_empty'] = 'Apps-vhost IP is empty.'; +$wb['fastcgi_starter_path_error_empty'] = 'FastCGI starter path is empty.'; +$wb['fastcgi_starter_script_error_empty'] = 'FastCGI starter script is empty.'; +$wb['fastcgi_alias_error_empty'] = 'FastCGI Alias is empty.'; +$wb['fastcgi_phpini_path_error_empty'] = 'FastCGI php.ini Path is empty.'; +$wb['fastcgi_children_error_empty'] = 'FastCGI Children is empty.'; +$wb['fastcgi_max_requests_error_empty'] = 'FastCGI max. Requests is empty.'; +$wb['fastcgi_bin_error_empty'] = 'FastCGI Bin is empty.'; +$wb['jailkit_chroot_home_error_empty'] = 'Jailkit chroot home is empty.'; +$wb['jailkit_chroot_app_sections_error_empty'] = 'Jailkit chroot app sections is empty.'; +$wb['jailkit_chroot_app_programs_error_empty'] = 'Jailkit chrooted applications is empty.'; +$wb['jailkit_chroot_cron_programs_error_empty'] = 'Jailkit cron chrooted applications is empty.'; +$wb['vlogger_config_dir_error_empty'] = 'Config directory is empty.'; +$wb['cron_init_script_error_empty'] = 'Cron init script name is empty.'; +$wb['crontab_dir_error_empty'] = 'Path for individual crontabs is empty.'; +$wb['cron_wget_error_empty'] = 'Path to wget program is empty.'; +$wb['php_fpm_init_script_txt'] = 'PHP-FPM init script'; +$wb['php_fpm_init_script_error_empty'] = 'PHP-FPM init script is empty.'; +$wb['php_fpm_ini_path_txt'] = 'PHP-FPM php.ini path'; +$wb['php_fpm_ini_path_error_empty'] = 'PHP-FPM php.ini path is empty.'; +$wb['php_fpm_pool_dir_txt'] = 'PHP-FPM pool directory'; +$wb['php_fpm_pool_dir_error_empty'] = 'PHP-FPM pool directory is empty.'; +$wb['php_fpm_start_port_txt'] = 'PHP-FPM start port'; +$wb['php_fpm_start_port_error_empty'] = 'PHP-FPM start port is empty.'; +$wb['php_fpm_socket_dir_txt'] = 'PHP-FPM socket directory'; +$wb['php_fpm_socket_dir_error_empty'] = 'PHP-FPM socket directory is empty.'; +$wb['try_rescue_txt'] = 'Enable service monitoring and restart on failure'; +$wb['do_not_try_rescue_httpd_txt'] = 'Disable HTTPD monitoring'; +$wb['do_not_try_rescue_mongodb_txt'] = 'Disable MongoDB monitoring'; +$wb['do_not_try_rescue_mysql_txt'] = 'Disable MySQL monitoring'; +$wb['do_not_try_rescue_mail_txt'] = 'Disable Email monitoring'; +$wb['rescue_description_txt'] = 'If you want to shut down MySQL you have to select the "Disable MySQL monitor" checkbox and then wait 2-3 minutes. If you do not wait 2-3 minutes, rescue will try to restart MySQL!'; +$wb['enable_sni_txt'] = 'Enable SNI'; +$wb['set_folder_permissions_on_update_txt'] = 'Set folder permissions on update'; +$wb['add_web_users_to_sshusers_group_txt'] = 'Add web users to -sshusers- group'; +$wb['connect_userid_to_webid_txt'] = 'Connect Linux userid to webid'; +$wb['connect_userid_to_webid_start_txt'] = 'Start ID for userid/webid connect'; +$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'; +$wb['tooltip_stress_adaptive_txt'] = 'Enables Postfix stress-adaptive behavior.'; +$wb['ssl_settings_txt'] = 'SSL Settings'; +$wb['permissions_txt'] = 'Permissions'; +$wb['php_settings_txt'] = 'PHP Settings'; +$wb['apps_vhost_settings_txt'] = 'Apps Vhost Settings'; +$wb['awstats_settings_txt'] = 'AWStats Settings'; +$wb['firewall_txt'] = 'Firewall'; +$wb['mailbox_quota_stats_txt'] = 'Mailbox quota statistics'; +$wb['enable_ip_wildcard_txt'] = 'Enable IP wildcard (*)'; +$wb['web_folder_protection_txt'] = 'Make web folders immutable (extended attributes)'; +$wb['overtraffic_notify_admin_txt'] = 'Send overtraffic notification to admin'; +$wb['overtraffic_notify_reseller_txt'] = 'Send overtraffic notification to reseller'; +$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_reseller_txt'] = 'Send quota warnings to reseller'; +$wb['overquota_notify_client_txt'] = 'Send quota warnings to client'; +$wb['overquota_notify_onok_txt'] = 'Send quota ok message to client'; $wb['overquota_notify_freq_txt'] = 'Send quota warning each X days'; $wb['overquota_notify_freq_note_txt'] = '0 = send message just once, no repeated messages'; $wb['admin_notify_events_txt'] = 'Send email to admin starting with the following level'; @@ -205,16 +231,19 @@ $wb['munin_user_txt'] = 'Munin User'; $wb['munin_password_txt'] = 'Munin Password'; $wb['munin_url_error_regex'] = 'Invalid Munin URL'; $wb['munin_url_note_txt'] = 'Placeholder:'; -$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['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_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_admin_txt"] = 'Send DB quota warnings to admin'; -$wb["overquota_db_notify_client_txt"] = 'Send DB quota warnings to client'; +$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_reseller_txt'] = 'Send DB quota warnings to reseller'; +$wb['overquota_db_notify_client_txt'] = 'Send DB quota warnings to client'; $wb['monitor_system_updates_txt'] = 'Check for Linux updates'; -$wb['php_handler_txt'] = "Default PHP Handler"; +$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'; @@ -254,6 +283,7 @@ $wb['awstats_buildstaticpages_pl_error_regex'] = 'Invalid awstats_buildstaticpag $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['bind_keyfiles_dir_error_regex'] = 'Invalid BIND keyfiles 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.'; @@ -265,6 +295,7 @@ $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['jailkit_chroot_authorized_keys_template_error_regex'] = 'Invalid jaikit chroot authorized_keys template file.'; $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.'; @@ -273,7 +304,6 @@ $wb['network_filesystem_txt'] = 'Network Filesystem'; $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_ini_check_minutes_info_txt'] = '0 = no check'; -$wb['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Use IPv6'; @@ -287,8 +317,8 @@ $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['disable_bind_log_txt'] = 'Disable bind9 messages for Loglevel WARN'; +$wb['apps_vhost_enabled_txt'] = 'Apps-vhost enabled'; $wb['skip_le_check_txt'] = 'Skip Lets Encrypt Check'; $wb['migration_mode_txt'] = 'Server Migration Mode'; $wb['nginx_enable_pagespeed_txt'] = 'Makes Pagespeed available'; @@ -296,6 +326,7 @@ $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'; @@ -304,3 +335,21 @@ $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'; +$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['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/en_server_config_list.lng b/interface/web/admin/lib/lang/en_server_config_list.lng index 4d8a3f6a59645c3da2e611a07994613d263d87b1..bf5d4e4f916e2939e48f4eaa4a30ea459bd15c58 100644 --- a/interface/web/admin/lib/lang/en_server_config_list.lng +++ b/interface/web/admin/lib/lang/en_server_config_list.lng @@ -1,4 +1,4 @@ \ No newline at end of file diff --git a/interface/web/admin/lib/lang/en_server_ip.lng b/interface/web/admin/lib/lang/en_server_ip.lng index fd91fc30d644fc9d7786a9736bf80858c3f939c1..8f7738e51f49de67459ebc6f36d0c38aeb14691f 100644 --- a/interface/web/admin/lib/lang/en_server_ip.lng +++ b/interface/web/admin/lib/lang/en_server_ip.lng @@ -1,11 +1,13 @@ \ No newline at end of file +$wb['server_ip_edit_title'] = 'IP Adresses'; +$wb['server_ip_edit_desc'] = 'Form to edit system IP adresses'; +$wb['server_id_txt'] = 'Server'; +$wb['client_id_txt'] = 'Client'; +$wb['ip_type_txt'] = 'Type'; +$wb['ip_address_txt'] = 'IP Address'; +$wb['virtualhost_txt'] = 'HTTP NameVirtualHost'; +$wb['virtualhost_port_txt'] = 'HTTP Ports'; +$wb['ip_error_wrong'] = 'The IP address is invalid'; +$wb['ip_error_unique'] = 'The IP address must be unique'; +$wb['error_port_syntax'] = 'Invalid chars in port field, please enter only comma separated numbers. Example: 80,443'; +?> diff --git a/interface/web/admin/lib/lang/en_server_ip_list.lng b/interface/web/admin/lib/lang/en_server_ip_list.lng index 489967b20e8b028b6d9d13dd17ebd118e5c6d41d..f3543cb5192dbeb84601b3fd165267b98d009325 100644 --- a/interface/web/admin/lib/lang/en_server_ip_list.lng +++ b/interface/web/admin/lib/lang/en_server_ip_list.lng @@ -1,10 +1,10 @@ \ No newline at end of file diff --git a/interface/web/admin/lib/lang/en_server_ip_map.lng b/interface/web/admin/lib/lang/en_server_ip_map.lng index 94508abb79482826e697520969cf9948b1dc61e4..f02bdafd848b900e9960346c10c6e927221b10f7 100644 --- a/interface/web/admin/lib/lang/en_server_ip_map.lng +++ b/interface/web/admin/lib/lang/en_server_ip_map.lng @@ -1,12 +1,14 @@ diff --git a/interface/web/admin/lib/lang/en_server_ip_map_list.lng b/interface/web/admin/lib/lang/en_server_ip_map_list.lng index 60c6815fdae8ec344ef0811616e750653a17580a..1fedc10b2e2590cb4c252d9c0ff90eeaf565d68b 100644 --- a/interface/web/admin/lib/lang/en_server_ip_map_list.lng +++ b/interface/web/admin/lib/lang/en_server_ip_map_list.lng @@ -1,7 +1,7 @@ diff --git a/interface/web/admin/lib/lang/en_server_list.lng b/interface/web/admin/lib/lang/en_server_list.lng index 89a81fa43b06af831857246ace6ed47bd1460b06..9bbf31d489c4b7c4a94fdf1f6d1d30b3c737e17c 100644 --- a/interface/web/admin/lib/lang/en_server_list.lng +++ b/interface/web/admin/lib/lang/en_server_list.lng @@ -1,15 +1,15 @@ \ No newline at end of file diff --git a/interface/web/admin/lib/lang/en_server_php.lng b/interface/web/admin/lib/lang/en_server_php.lng index 179a8fc357142ea401cd663697ef817237957d10..491be1aae2ecd613527e187940420d748137ed86 100644 --- a/interface/web/admin/lib/lang/en_server_php.lng +++ b/interface/web/admin/lib/lang/en_server_php.lng @@ -13,5 +13,8 @@ $wb['php_fastcgi_ini_dir_txt'] = 'Path to the php.ini directory'; $wb['php_fpm_init_script_txt'] = 'Path to the PHP-FPM init script'; $wb['php_fpm_ini_dir_txt'] = 'Path to the php.ini directory'; $wb['php_fpm_pool_dir_txt'] = 'Path to the 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.'; ?> diff --git a/interface/web/admin/lib/lang/en_server_php_list.lng b/interface/web/admin/lib/lang/en_server_php_list.lng index 62cbe6168714b18ba4fca490280c30c945e09e7c..291302cbb72f6b6ac12dc3e6cb95f18e9dcde90f 100644 --- a/interface/web/admin/lib/lang/en_server_php_list.lng +++ b/interface/web/admin/lib/lang/en_server_php_list.lng @@ -5,4 +5,5 @@ $wb['add_new_record_txt'] = 'Add new PHP version'; $wb['client_id_txt'] = 'Client'; $wb['name_txt'] = 'PHP Name'; $wb['active_txt'] = 'Active'; +$wb['usage_txt'] = 'Usage count'; ?> diff --git a/interface/web/admin/lib/lang/en_software_package.lng b/interface/web/admin/lib/lang/en_software_package.lng deleted file mode 100644 index 62ef734079c5dd66dfb5b02390e23398a09233a8..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/en_software_package.lng +++ /dev/null @@ -1,6 +0,0 @@ - \ No newline at end of file diff --git a/interface/web/admin/lib/lang/en_software_package_install.lng b/interface/web/admin/lib/lang/en_software_package_install.lng deleted file mode 100644 index 7986035adf5c58597f6cac5d66ad388771d9ea62..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/en_software_package_install.lng +++ /dev/null @@ -1,6 +0,0 @@ - \ No newline at end of file diff --git a/interface/web/admin/lib/lang/en_software_package_list.lng b/interface/web/admin/lib/lang/en_software_package_list.lng deleted file mode 100644 index 2909d8376e51f4a801bf99fb0e0a3f191558d2a4..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/en_software_package_list.lng +++ /dev/null @@ -1,13 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/en_software_repo.lng b/interface/web/admin/lib/lang/en_software_repo.lng deleted file mode 100644 index 1b50bb7975fe489f31f30a4c6d78660ceae0515a..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/en_software_repo.lng +++ /dev/null @@ -1,8 +0,0 @@ - \ No newline at end of file diff --git a/interface/web/admin/lib/lang/en_software_repo_list.lng b/interface/web/admin/lib/lang/en_software_repo_list.lng deleted file mode 100644 index f0a0b309205c4f6204a062a91707de60c49b2661..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/en_software_repo_list.lng +++ /dev/null @@ -1,6 +0,0 @@ - \ No newline at end of file diff --git a/interface/web/admin/lib/lang/en_software_update_list.lng b/interface/web/admin/lib/lang/en_software_update_list.lng deleted file mode 100644 index fe7639125cd2634fa809d9a6592e9e9fb21e84bb..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/en_software_update_list.lng +++ /dev/null @@ -1,9 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/en_system_config.lng b/interface/web/admin/lib/lang/en_system_config.lng index ef34493c9daed786fa16f342b056de52c3b58234..9cf04103bbec468911d70dcf98f79eadcd743010 100644 --- a/interface/web/admin/lib/lang/en_system_config.lng +++ b/interface/web/admin/lib/lang/en_system_config.lng @@ -1,45 +1,46 @@ diff --git a/interface/web/admin/lib/lang/en_users.lng b/interface/web/admin/lib/lang/en_users.lng index 931c73e8ebf6354e0196b70af94af3ed81d7708e..855146d171063b86d81b3b2835090e266d9f5a1a 100644 --- a/interface/web/admin/lib/lang/en_users.lng +++ b/interface/web/admin/lib/lang/en_users.lng @@ -1,30 +1,31 @@ diff --git a/interface/web/admin/lib/lang/en_users_list.lng b/interface/web/admin/lib/lang/en_users_list.lng index 9860ab403961fc16a951a225eff8c920f136cab1..fb1c7bc6ddb8acdcf6dc66b9572f516b935fbf63 100644 --- a/interface/web/admin/lib/lang/en_users_list.lng +++ b/interface/web/admin/lib/lang/en_users_list.lng @@ -1,9 +1,9 @@ WARNING:
Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; -?> \ No newline at end of file +$wb['list_head_txt'] = 'Users'; +$wb['username_txt'] = 'Username'; +$wb['client_id_txt'] = 'User ID'; +$wb['active_txt'] = 'Active'; +$wb['groups_txt'] = 'Groups'; +$wb['add_new_record_txt'] = 'Add new user'; +$wb['warning_txt'] = 'WARNING: Do not edit or modify any client user settings here. Use the client- and reseller settings in the client module instead. Modifying or changing client users or groups here may cause data loss!'; +?> diff --git a/interface/web/admin/lib/lang/es.lng b/interface/web/admin/lib/lang/es.lng old mode 100755 new mode 100644 diff --git a/interface/web/admin/lib/lang/es_directive_snippets.lng b/interface/web/admin/lib/lang/es_directive_snippets.lng old mode 100755 new mode 100644 index 8e2a9270791b70c7a2a9d287496dc1645dd3420e..99d695aa73b6f65b79d0def6eb3d99964e53a3bf --- a/interface/web/admin/lib/lang/es_directive_snippets.lng +++ b/interface/web/admin/lib/lang/es_directive_snippets.lng @@ -8,5 +8,8 @@ $wb['name_txt'] = 'Nombre del fragmento'; $wb['snippet_txt'] = 'Fragmento'; $wb['type_txt'] = 'Tipo'; $wb['variables_txt'] = 'Variables'; -$wb['required_php_snippets_txt'] = 'Requiered PHP Snippet'; -?> +$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 diff --git a/interface/web/admin/lib/lang/es_directive_snippets_list.lng b/interface/web/admin/lib/lang/es_directive_snippets_list.lng old mode 100755 new mode 100644 diff --git a/interface/web/admin/lib/lang/es_firewall.lng b/interface/web/admin/lib/lang/es_firewall.lng old mode 100755 new mode 100644 diff --git a/interface/web/admin/lib/lang/es_firewall_list.lng b/interface/web/admin/lib/lang/es_firewall_list.lng old mode 100755 new mode 100644 diff --git a/interface/web/admin/lib/lang/es_groups.lng b/interface/web/admin/lib/lang/es_groups.lng old mode 100755 new mode 100644 diff --git a/interface/web/admin/lib/lang/es_groups_list.lng b/interface/web/admin/lib/lang/es_groups_list.lng old mode 100755 new mode 100644 diff --git a/interface/web/admin/lib/lang/es_iptables.lng b/interface/web/admin/lib/lang/es_iptables.lng old mode 100755 new mode 100644 diff --git a/interface/web/admin/lib/lang/es_iptables_list.lng b/interface/web/admin/lib/lang/es_iptables_list.lng old mode 100755 new mode 100644 diff --git a/interface/web/admin/lib/lang/es_language_add.lng b/interface/web/admin/lib/lang/es_language_add.lng old mode 100755 new mode 100644 index 00ec3a860e646ce9e400b36076917d7aa0d47f1c..97d4f04584256778700f6f6b8e913495603d98b7 --- a/interface/web/admin/lib/lang/es_language_add.lng +++ b/interface/web/admin/lib/lang/es_language_add.lng @@ -1,7 +1,7 @@
¡USE ESTO BAJO SU PROPIA RESPONSABILIDAD!'; $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.

¡USE ESTO BAJO SU PROPIA RESPONSABILIDAD!'; +$wb['do_osupdate_desc'] = 'Esta acción realizará un \'apt -y upgrade\' en el servidor seleccionado.

¡USE ESTO BAJO SU PROPIA RESPONSABILIDAD!'; $wb['ispconfig_update_text'] = 'Inicie sesión como root en el shell de su servidor y ejecute el comando

ispconfig_update.sh

para iniciar la actualización de ISPConfig.

Pulse aquí para ver una descripción detallada de cómo actualizar'; $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_remote_user.lng b/interface/web/admin/lib/lang/es_remote_user.lng old mode 100755 new mode 100644 index 7cefa1e5dbebcabb655413e0f1f8c91ab379edbe..bb52540f4cfd98fc69b20755f8a6e781b3477291 --- a/interface/web/admin/lib/lang/es_remote_user.lng +++ b/interface/web/admin/lib/lang/es_remote_user.lng @@ -1,4 +1,5 @@ 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'; @@ -303,4 +324,23 @@ $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'; +$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['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/es_server_config_list.lng b/interface/web/admin/lib/lang/es_server_config_list.lng old mode 100755 new mode 100644 diff --git a/interface/web/admin/lib/lang/es_server_ip.lng b/interface/web/admin/lib/lang/es_server_ip.lng old mode 100755 new mode 100644 index 5cd2d77e52bb66cbbb93724dfb1d847e0b1bdb00..ba4d06d0982826bbca32ef64ec7797ca545b0bb9 --- a/interface/web/admin/lib/lang/es_server_ip.lng +++ b/interface/web/admin/lib/lang/es_server_ip.lng @@ -1,4 +1,6 @@ diff --git a/interface/web/admin/lib/lang/es_server_php_list.lng b/interface/web/admin/lib/lang/es_server_php_list.lng old mode 100755 new mode 100644 index 111628b7200f80898ac231b030e0ef6d353e8cd3..8d62ee891926fd8ee2b32de02b10ae8bc3b6c093 --- a/interface/web/admin/lib/lang/es_server_php_list.lng +++ b/interface/web/admin/lib/lang/es_server_php_list.lng @@ -5,4 +5,5 @@ $wb['list_head_txt'] = 'Versiones adicionales de PHP'; $wb['name_txt'] = 'Versión de PHP'; $wb['server_id_txt'] = 'Servidor'; $wb['active_txt'] = 'Active'; +$wb['usage_txt'] = 'Usage count'; ?> diff --git a/interface/web/admin/lib/lang/es_software_package.lng b/interface/web/admin/lib/lang/es_software_package.lng deleted file mode 100755 index af80e4a47930c8e36e56eb77562ad336903dfed2..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/es_software_package.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/es_software_package_install.lng b/interface/web/admin/lib/lang/es_software_package_install.lng deleted file mode 100755 index 838af344ecf3247fb4f49d96bd3a405d79edd36e..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/es_software_package_install.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/es_software_package_list.lng b/interface/web/admin/lib/lang/es_software_package_list.lng deleted file mode 100755 index c1837c7a8248a5dd8649e64d431253967cab659e..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/es_software_package_list.lng +++ /dev/null @@ -1,13 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/es_software_repo.lng b/interface/web/admin/lib/lang/es_software_repo.lng deleted file mode 100755 index 26382bd50330f5dd9646ac1a61b8ad39d85543dd..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/es_software_repo.lng +++ /dev/null @@ -1,8 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/es_software_repo_list.lng b/interface/web/admin/lib/lang/es_software_repo_list.lng deleted file mode 100755 index f6a624bd7d93b26e788f1d45d9d61270691a41aa..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/es_software_repo_list.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/es_software_update_list.lng b/interface/web/admin/lib/lang/es_software_update_list.lng deleted file mode 100755 index 827c60e2999d9449e066a37dc09d1e0998ca7111..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/es_software_update_list.lng +++ /dev/null @@ -1,9 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/es_system_config.lng b/interface/web/admin/lib/lang/es_system_config.lng old mode 100755 new mode 100644 index 043c52cfddc3b983f8d53b8f0bdeae6b5fa24b8f..844c19db5884f2efbbd62eb6fc8ed40338d775f9 --- a/interface/web/admin/lib/lang/es_system_config.lng +++ b/interface/web/admin/lib/lang/es_system_config.lng @@ -1,4 +1,5 @@ diff --git a/interface/web/admin/lib/lang/es_tpl_default_admin.lng b/interface/web/admin/lib/lang/es_tpl_default_admin.lng old mode 100755 new mode 100644 diff --git a/interface/web/admin/lib/lang/es_users.lng b/interface/web/admin/lib/lang/es_users.lng old mode 100755 new mode 100644 index 65baeb666f1930be22896b18c4fce3ad52b8622d..44c67b1832cc45f978d257efaa64eb49c26eaf09 --- a/interface/web/admin/lib/lang/es_users.lng +++ b/interface/web/admin/lib/lang/es_users.lng @@ -1,4 +1,5 @@ diff --git a/interface/web/admin/lib/lang/es_users_list.lng b/interface/web/admin/lib/lang/es_users_list.lng old mode 100755 new mode 100644 diff --git a/interface/web/admin/lib/lang/fi.lng b/interface/web/admin/lib/lang/fi.lng old mode 100755 new mode 100644 diff --git a/interface/web/admin/lib/lang/fi_directive_snippets.lng b/interface/web/admin/lib/lang/fi_directive_snippets.lng index 0616afad8b6c76c9eb284f57a673f6c35d286310..0f83e9415955f939b35dec4b9cd8023aa19b0968 100644 --- a/interface/web/admin/lib/lang/fi_directive_snippets.lng +++ b/interface/web/admin/lib/lang/fi_directive_snippets.lng @@ -8,5 +8,8 @@ $wb['directive_snippets_name_empty'] = 'Please specify a name for the snippet.'; $wb['directive_snippets_name_error_unique'] = 'There is already a directive snippet with this name.'; $wb['variables_txt'] = 'Variables'; $wb['customer_viewable_txt'] = 'Customer viewable'; -$wb['required_php_snippets_txt'] = 'Requiered PHP Snippet'; -?> +$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 diff --git a/interface/web/admin/lib/lang/fi_firewall.lng b/interface/web/admin/lib/lang/fi_firewall.lng old mode 100755 new mode 100644 diff --git a/interface/web/admin/lib/lang/fi_firewall_list.lng b/interface/web/admin/lib/lang/fi_firewall_list.lng old mode 100755 new mode 100644 diff --git a/interface/web/admin/lib/lang/fi_groups.lng b/interface/web/admin/lib/lang/fi_groups.lng old mode 100755 new mode 100644 diff --git a/interface/web/admin/lib/lang/fi_groups_list.lng b/interface/web/admin/lib/lang/fi_groups_list.lng old mode 100755 new mode 100644 diff --git a/interface/web/admin/lib/lang/fi_language_add.lng b/interface/web/admin/lib/lang/fi_language_add.lng old mode 100755 new mode 100644 index 24efb7e4e09ebc32c7d53d529c477321c808fb94..d933f52ef8aefd974b9d6eecd3f4dc0d3ac03b01 --- a/interface/web/admin/lib/lang/fi_language_add.lng +++ b/interface/web/admin/lib/lang/fi_language_add.lng @@ -4,5 +4,5 @@ $wb['language_select_txt'] = 'Valitse peruskieli'; $wb['language_new_txt'] = 'Lisää uusi kieli'; $wb['btn_save_txt'] = 'Luo uudet kielitiedostot'; $wb['btn_cancel_txt'] = 'Keskeytä'; -$wb['language_new_hint_txt'] = '2-merkkinen ISO 639-1 kielikoodi (Katso http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)'; +$wb['language_new_hint_txt'] = '2-merkkinen ISO 639-1 kielikoodi (Katso https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)'; ?> diff --git a/interface/web/admin/lib/lang/fi_language_complete.lng b/interface/web/admin/lib/lang/fi_language_complete.lng old mode 100755 new mode 100644 diff --git a/interface/web/admin/lib/lang/fi_language_edit.lng b/interface/web/admin/lib/lang/fi_language_edit.lng old mode 100755 new mode 100644 diff --git a/interface/web/admin/lib/lang/fi_language_export.lng b/interface/web/admin/lib/lang/fi_language_export.lng old mode 100755 new mode 100644 diff --git a/interface/web/admin/lib/lang/fi_language_import.lng b/interface/web/admin/lib/lang/fi_language_import.lng old mode 100755 new mode 100644 diff --git a/interface/web/admin/lib/lang/fi_language_list.lng b/interface/web/admin/lib/lang/fi_language_list.lng old mode 100755 new mode 100644 diff --git a/interface/web/admin/lib/lang/fi_remote_action.lng b/interface/web/admin/lib/lang/fi_remote_action.lng index 3fc3eaf81f5d63a057aa0eecf965bfbdaf6af701..dfe56b616d5b3d18abd7eb9965b8c5602cb4354c 100644 --- a/interface/web/admin/lib/lang/fi_remote_action.lng +++ b/interface/web/admin/lib/lang/fi_remote_action.lng @@ -2,11 +2,11 @@ $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.

USE THIS AT YOUR OWN RISK!'; +$wb['do_osupdate_desc'] = 'This Action does a apt -y upgrade at your selected server.

USE THIS AT YOUR OWN RISK!'; $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.

USE THIS AT YOUR OWN RISK!'; $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

ispconfig_update.sh

to start the ISPConfig update.

Click here for detailed update instructions'; +$wb['ispconfig_update_text'] = 'Login as root user on the shell of your server and execute the command

ispconfig_update.sh

to start the ISPConfig update.

Click here for detailed update instructions'; ?> diff --git a/interface/web/admin/lib/lang/fi_remote_user.lng b/interface/web/admin/lib/lang/fi_remote_user.lng index 2ae3420d621c94c3168d9b04d73806aae6e37d2c..7bdb977afd1993515c1e7bca8b23f6c853b6f4c2 100644 --- a/interface/web/admin/lib/lang/fi_remote_user.lng +++ b/interface/web/admin/lib/lang/fi_remote_user.lng @@ -1,4 +1,5 @@ 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'; @@ -303,4 +324,23 @@ $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'; +$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['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/fi_server_config_list.lng b/interface/web/admin/lib/lang/fi_server_config_list.lng old mode 100755 new mode 100644 diff --git a/interface/web/admin/lib/lang/fi_server_ip.lng b/interface/web/admin/lib/lang/fi_server_ip.lng old mode 100755 new mode 100644 index 7d2b642fc2dec76fee3c2ced9edb69e5f4404928..a9f49cc124404c787ee0bdc1ecabc558815f47b1 --- a/interface/web/admin/lib/lang/fi_server_ip.lng +++ b/interface/web/admin/lib/lang/fi_server_ip.lng @@ -1,4 +1,6 @@ diff --git a/interface/web/admin/lib/lang/fi_server_php_list.lng b/interface/web/admin/lib/lang/fi_server_php_list.lng index 62cbe6168714b18ba4fca490280c30c945e09e7c..291302cbb72f6b6ac12dc3e6cb95f18e9dcde90f 100644 --- a/interface/web/admin/lib/lang/fi_server_php_list.lng +++ b/interface/web/admin/lib/lang/fi_server_php_list.lng @@ -5,4 +5,5 @@ $wb['add_new_record_txt'] = 'Add new PHP version'; $wb['client_id_txt'] = 'Client'; $wb['name_txt'] = 'PHP Name'; $wb['active_txt'] = 'Active'; +$wb['usage_txt'] = 'Usage count'; ?> diff --git a/interface/web/admin/lib/lang/fi_software_package.lng b/interface/web/admin/lib/lang/fi_software_package.lng deleted file mode 100644 index faffe38217fb9cac04020e73e473c6c46e3caaa1..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/fi_software_package.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/fi_software_package_install.lng b/interface/web/admin/lib/lang/fi_software_package_install.lng deleted file mode 100644 index 5c8b756434ce27d67e479a96383bbee01bce4f1f..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/fi_software_package_install.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/fi_software_package_list.lng b/interface/web/admin/lib/lang/fi_software_package_list.lng deleted file mode 100755 index 87a9e193b5af46ab72dd14323f5d181e74e9907a..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/fi_software_package_list.lng +++ /dev/null @@ -1,13 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/fi_software_repo.lng b/interface/web/admin/lib/lang/fi_software_repo.lng deleted file mode 100755 index f875f428b61f390155ef162d7e27f404328627b2..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/fi_software_repo.lng +++ /dev/null @@ -1,8 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/fi_software_repo_list.lng b/interface/web/admin/lib/lang/fi_software_repo_list.lng deleted file mode 100755 index bde844c99f8d8ea61c5e7b4b1dd98c831ae57a92..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/fi_software_repo_list.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/fi_software_update_list.lng b/interface/web/admin/lib/lang/fi_software_update_list.lng deleted file mode 100755 index 7871958353e51a7265e5910c7273e825a04ddb76..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/fi_software_update_list.lng +++ /dev/null @@ -1,9 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/fi_system_config.lng b/interface/web/admin/lib/lang/fi_system_config.lng index c0972c49d87434a1ee1425df1258c4d9d759c612..4b4bf32cc03589a7f93bf697bbe51af1e618d5e7 100644 --- a/interface/web/admin/lib/lang/fi_system_config.lng +++ b/interface/web/admin/lib/lang/fi_system_config.lng @@ -1,4 +1,5 @@ diff --git a/interface/web/admin/lib/lang/fi_users.lng b/interface/web/admin/lib/lang/fi_users.lng old mode 100755 new mode 100644 index 199601f5207d7889a1aaffe66660cdc77e990a35..02bc863bb7f49e178a8645b39f53b2c5e4564e36 --- a/interface/web/admin/lib/lang/fi_users.lng +++ b/interface/web/admin/lib/lang/fi_users.lng @@ -1,9 +1,10 @@ diff --git a/interface/web/admin/lib/lang/fi_users_list.lng b/interface/web/admin/lib/lang/fi_users_list.lng old mode 100755 new mode 100644 diff --git a/interface/web/admin/lib/lang/fr_directive_snippets.lng b/interface/web/admin/lib/lang/fr_directive_snippets.lng index 0616afad8b6c76c9eb284f57a673f6c35d286310..0f83e9415955f939b35dec4b9cd8023aa19b0968 100644 --- a/interface/web/admin/lib/lang/fr_directive_snippets.lng +++ b/interface/web/admin/lib/lang/fr_directive_snippets.lng @@ -8,5 +8,8 @@ $wb['directive_snippets_name_empty'] = 'Please specify a name for the snippet.'; $wb['directive_snippets_name_error_unique'] = 'There is already a directive snippet with this name.'; $wb['variables_txt'] = 'Variables'; $wb['customer_viewable_txt'] = 'Customer viewable'; -$wb['required_php_snippets_txt'] = 'Requiered PHP Snippet'; -?> +$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 diff --git a/interface/web/admin/lib/lang/fr_language_add.lng b/interface/web/admin/lib/lang/fr_language_add.lng index f60bdacc362c352d7d7af5d6b0cb15aba290b8f2..b554d42dfcc8826746f7f76f25dae2f08dbbabfc 100644 --- a/interface/web/admin/lib/lang/fr_language_add.lng +++ b/interface/web/admin/lib/lang/fr_language_add.lng @@ -4,5 +4,5 @@ $wb['language_select_txt'] = 'Sélectionnez la base du langage'; $wb['language_new_txt'] = 'Nouveau langage'; $wb['btn_save_txt'] = 'Créer un nouveau fichier de langue'; $wb['btn_cancel_txt'] = 'Précédent'; -$wb['language_new_hint_txt'] = 'Code langage à 2 caractères ISO 639-1 (Voir http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)'; +$wb['language_new_hint_txt'] = 'Code langage à 2 caractères ISO 639-1 (Voir https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)'; ?> diff --git a/interface/web/admin/lib/lang/fr_remote_action.lng b/interface/web/admin/lib/lang/fr_remote_action.lng index bb3443b40a40f7477e7ebaa22997240ed969a0b2..ca4dc85dddfe078c32937eb68db369e7f3a16446 100644 --- a/interface/web/admin/lib/lang/fr_remote_action.lng +++ b/interface/web/admin/lib/lang/fr_remote_action.lng @@ -2,11 +2,11 @@ $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é.

UTILISEZ A VOS RISQUES ET PERILS !'; +$wb['do_osupdate_desc'] = 'Cette action effectue apt -y upgrade sur le serveur sélectionné.

UTILISEZ A VOS RISQUES ET PERILS !'; $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é.

UTILISEZ A VOS RISQUES ET PERILS !'; $wb['action_scheduled'] = 'L’action est marquée pour exécution'; $wb['select_all_server'] = 'Tout serveur'; $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

ispconfig_update.sh

to start the ISPConfig update.

Click here for detailed update instructions'; +$wb['ispconfig_update_text'] = 'Login as root user on the shell of your server and execute the command

ispconfig_update.sh

to start the ISPConfig update.

Click here for detailed update instructions'; ?> diff --git a/interface/web/admin/lib/lang/fr_remote_user.lng b/interface/web/admin/lib/lang/fr_remote_user.lng index 1594e60fb4c8baacc2e1e0cba5152de0e4a73419..7eae30dff3da86361090e9d810fcde00482a4b71 100644 --- a/interface/web/admin/lib/lang/fr_remote_user.lng +++ b/interface/web/admin/lib/lang/fr_remote_user.lng @@ -1,4 +1,5 @@ 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'; @@ -303,4 +324,23 @@ $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'; +$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['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/fr_server_ip.lng b/interface/web/admin/lib/lang/fr_server_ip.lng index 471abb87ae2e34555568327895aaffe220df50eb..1289cd755ab173a0f0e0a3f86396633e3740b8b8 100644 --- a/interface/web/admin/lib/lang/fr_server_ip.lng +++ b/interface/web/admin/lib/lang/fr_server_ip.lng @@ -1,4 +1,6 @@ diff --git a/interface/web/admin/lib/lang/fr_server_php_list.lng b/interface/web/admin/lib/lang/fr_server_php_list.lng index 62cbe6168714b18ba4fca490280c30c945e09e7c..291302cbb72f6b6ac12dc3e6cb95f18e9dcde90f 100644 --- a/interface/web/admin/lib/lang/fr_server_php_list.lng +++ b/interface/web/admin/lib/lang/fr_server_php_list.lng @@ -5,4 +5,5 @@ $wb['add_new_record_txt'] = 'Add new PHP version'; $wb['client_id_txt'] = 'Client'; $wb['name_txt'] = 'PHP Name'; $wb['active_txt'] = 'Active'; +$wb['usage_txt'] = 'Usage count'; ?> diff --git a/interface/web/admin/lib/lang/fr_software_package.lng b/interface/web/admin/lib/lang/fr_software_package.lng deleted file mode 100644 index faffe38217fb9cac04020e73e473c6c46e3caaa1..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/fr_software_package.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/fr_software_package_install.lng b/interface/web/admin/lib/lang/fr_software_package_install.lng deleted file mode 100644 index 39f643d3e65cc933abfe042042a4b4c333629590..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/fr_software_package_install.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/fr_software_package_list.lng b/interface/web/admin/lib/lang/fr_software_package_list.lng deleted file mode 100644 index 405b9e296fb191f3b337bf4f54ee0a8213748d4a..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/fr_software_package_list.lng +++ /dev/null @@ -1,13 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/fr_software_repo.lng b/interface/web/admin/lib/lang/fr_software_repo.lng deleted file mode 100644 index f65c955d52d18927304af8fd78f1148091496408..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/fr_software_repo.lng +++ /dev/null @@ -1,8 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/fr_software_repo_list.lng b/interface/web/admin/lib/lang/fr_software_repo_list.lng deleted file mode 100644 index 56749896bb0bf5c6b876cc1646a07ee273380656..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/fr_software_repo_list.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/fr_software_update_list.lng b/interface/web/admin/lib/lang/fr_software_update_list.lng deleted file mode 100644 index 8fb67a03104596fa99c9e79560ccab14b00f50cb..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/fr_software_update_list.lng +++ /dev/null @@ -1,9 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/fr_system_config.lng b/interface/web/admin/lib/lang/fr_system_config.lng index 18f0dbbed4e3dad9d5afc722473f3158f8525633..801c27b5dfdc71104a4ed7dc09a070967b08f9bf 100644 --- a/interface/web/admin/lib/lang/fr_system_config.lng +++ b/interface/web/admin/lib/lang/fr_system_config.lng @@ -1,4 +1,5 @@ diff --git a/interface/web/admin/lib/lang/fr_users.lng b/interface/web/admin/lib/lang/fr_users.lng index 6cc3e116b4dd6e0533bd76f9ddf34e0f7adcdbcb..5013698f16b97b52e29cb3dc21e6ce8592149c64 100644 --- a/interface/web/admin/lib/lang/fr_users.lng +++ b/interface/web/admin/lib/lang/fr_users.lng @@ -1,7 +1,8 @@ diff --git a/interface/web/admin/lib/lang/hr_directive_snippets.lng b/interface/web/admin/lib/lang/hr_directive_snippets.lng index 077896577db3f9b8aec8aad5f33966bd1780ea6c..350e60d43f3c58989cc20fe988f9283d856fc33a 100644 --- a/interface/web/admin/lib/lang/hr_directive_snippets.lng +++ b/interface/web/admin/lib/lang/hr_directive_snippets.lng @@ -8,5 +8,8 @@ $wb['directive_snippets_name_empty'] = 'Molimo vas specificirajte naziv direktiv $wb['directive_snippets_name_error_unique'] = 'Već postoji direktiva sa tim imenom.'; $wb['variables_txt'] = 'Varijable'; $wb['customer_viewable_txt'] = 'Customer viewable'; -$wb['required_php_snippets_txt'] = 'Requiered PHP Snippet'; -?> +$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 diff --git a/interface/web/admin/lib/lang/hr_language_add.lng b/interface/web/admin/lib/lang/hr_language_add.lng index d4a3e1bd85405a96273a70d848b51cbb5b5631ec..8fa97caa963176ff38464fd3444320338e8d3ff4 100644 --- a/interface/web/admin/lib/lang/hr_language_add.lng +++ b/interface/web/admin/lib/lang/hr_language_add.lng @@ -2,7 +2,7 @@ $wb['list_head_txt'] = 'Dodaj novi jezik'; $wb['language_select_txt'] = 'Izaberi bazični jezik'; $wb['language_new_txt'] = 'Novi jezik'; -$wb['language_new_hint_txt'] = '2 znaka ISO 639-1 jezičnog-koda (Pogledaj http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)'; +$wb['language_new_hint_txt'] = '2 znaka ISO 639-1 jezičnog-koda (Pogledaj https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)'; $wb['btn_save_txt'] = 'Kreiraj novu jezičnu datoteku'; $wb['btn_cancel_txt'] = 'Natrag'; ?> diff --git a/interface/web/admin/lib/lang/hr_remote_action.lng b/interface/web/admin/lib/lang/hr_remote_action.lng index fd1444fbdd39e3046af7bb2b5e2cba8f5177c5eb..d36e61de86750702369587c7cfdb1f7dbaa51006 100644 --- a/interface/web/admin/lib/lang/hr_remote_action.lng +++ b/interface/web/admin/lib/lang/hr_remote_action.lng @@ -2,11 +2,11 @@ $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.

KORISTITE NA VLASTITU ODGOVORNOST!'; +$wb['do_osupdate_desc'] = 'Ovime pokrećete \'apt -y upgrade\' na izabranom serveru.

KORISTITE NA VLASTITU ODGOVORNOST!'; $wb['do_ispcupdate_caption'] = 'Nadogradi ISPConfig 3 na udaljenom serveru'; $wb['do_ispcupdate_desc'] = 'Ovime pokrećete nadogradnju ISPConfig3-a na izabranom serveru.

KORISTITE NA VLASTITU ODGOVORNOST!'; $wb['action_scheduled'] = 'Nadogradnja je dodana u planer poslova'; $wb['select_all_server'] = 'Svi serveri'; $wb['ispconfig_update_title'] = 'Upute za ISPConfig nadogradnju'; -$wb['ispconfig_update_text'] = 'Logiraj se kao root korisnik na server (SSH) i pokreni:

ispconfig_update.sh

Pogledaj detaljne upute ovdje'; +$wb['ispconfig_update_text'] = 'Logiraj se kao root korisnik na server (SSH) i pokreni:

ispconfig_update.sh

Pogledaj detaljne upute ovdje'; ?> diff --git a/interface/web/admin/lib/lang/hr_remote_user.lng b/interface/web/admin/lib/lang/hr_remote_user.lng index 069177e5ed09db186cdbb8dc2de65f498ab5e031..fecbd7e33c47a59a1f98c56485fc4a8fb0158642 100644 --- a/interface/web/admin/lib/lang/hr_remote_user.lng +++ b/interface/web/admin/lib/lang/hr_remote_user.lng @@ -1,4 +1,5 @@ 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'; @@ -303,4 +324,23 @@ $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'; +$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['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/hr_server_ip.lng b/interface/web/admin/lib/lang/hr_server_ip.lng index 0ddf8be14cc68d95c529dbf220098722d4e0e98e..f26fd720ca1342dc779d954cc8b5c707bb387216 100644 --- a/interface/web/admin/lib/lang/hr_server_ip.lng +++ b/interface/web/admin/lib/lang/hr_server_ip.lng @@ -1,4 +1,6 @@ diff --git a/interface/web/admin/lib/lang/hr_server_php_list.lng b/interface/web/admin/lib/lang/hr_server_php_list.lng index 9e9c0de986aed34eae1572404516a65fd4d6b5a6..1851ac8395305bf7c9aac965656ac56cbe766b12 100644 --- a/interface/web/admin/lib/lang/hr_server_php_list.lng +++ b/interface/web/admin/lib/lang/hr_server_php_list.lng @@ -5,4 +5,5 @@ $wb['add_new_record_txt'] = 'Add new PHP version'; $wb['client_id_txt'] = 'Klijent'; $wb['name_txt'] = 'PHP Name'; $wb['active_txt'] = 'Active'; +$wb['usage_txt'] = 'Usage count'; ?> diff --git a/interface/web/admin/lib/lang/hr_software_package.lng b/interface/web/admin/lib/lang/hr_software_package.lng deleted file mode 100644 index faffe38217fb9cac04020e73e473c6c46e3caaa1..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/hr_software_package.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/hr_software_package_install.lng b/interface/web/admin/lib/lang/hr_software_package_install.lng deleted file mode 100644 index 22d7e0ce7a68bb864877ecaa7274034f9dc970bb..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/hr_software_package_install.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/hr_software_package_list.lng b/interface/web/admin/lib/lang/hr_software_package_list.lng deleted file mode 100644 index 3722c5cff47ab2f4fc138fe036a087aa8226de13..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/hr_software_package_list.lng +++ /dev/null @@ -1,13 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/hr_software_repo.lng b/interface/web/admin/lib/lang/hr_software_repo.lng deleted file mode 100644 index bbfb2e2db29084c137cfd29804fc6be4ea2960ca..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/hr_software_repo.lng +++ /dev/null @@ -1,8 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/hr_software_repo_list.lng b/interface/web/admin/lib/lang/hr_software_repo_list.lng deleted file mode 100644 index b79045bd76e8c2bdd363617f56efde702ebf5c92..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/hr_software_repo_list.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/hr_software_update_list.lng b/interface/web/admin/lib/lang/hr_software_update_list.lng deleted file mode 100644 index 2250a186a33ca4e7cfa2f2882b9100047aed4a9b..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/hr_software_update_list.lng +++ /dev/null @@ -1,9 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/hr_system_config.lng b/interface/web/admin/lib/lang/hr_system_config.lng index a7735647b17077ee3c84639d791fb1057959f3bc..87fcfff64580e1243f284a794e102e625b15a513 100644 --- a/interface/web/admin/lib/lang/hr_system_config.lng +++ b/interface/web/admin/lib/lang/hr_system_config.lng @@ -1,4 +1,5 @@ diff --git a/interface/web/admin/lib/lang/hr_users.lng b/interface/web/admin/lib/lang/hr_users.lng index 7be3f968f27d22f0a6c1aef99cd5312dc2593d80..e317aa923a6fc456bc6380bb85bb9ae6e898e951 100644 --- a/interface/web/admin/lib/lang/hr_users.lng +++ b/interface/web/admin/lib/lang/hr_users.lng @@ -1,9 +1,10 @@ diff --git a/interface/web/admin/lib/lang/hu_directive_snippets.lng b/interface/web/admin/lib/lang/hu_directive_snippets.lng index 0616afad8b6c76c9eb284f57a673f6c35d286310..0f83e9415955f939b35dec4b9cd8023aa19b0968 100644 --- a/interface/web/admin/lib/lang/hu_directive_snippets.lng +++ b/interface/web/admin/lib/lang/hu_directive_snippets.lng @@ -8,5 +8,8 @@ $wb['directive_snippets_name_empty'] = 'Please specify a name for the snippet.'; $wb['directive_snippets_name_error_unique'] = 'There is already a directive snippet with this name.'; $wb['variables_txt'] = 'Variables'; $wb['customer_viewable_txt'] = 'Customer viewable'; -$wb['required_php_snippets_txt'] = 'Requiered PHP Snippet'; -?> +$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 diff --git a/interface/web/admin/lib/lang/hu_firewall.lng b/interface/web/admin/lib/lang/hu_firewall.lng index 461c16d324eda9154ddf9ef35fe07ca27f7ecf8e..1346d37657e86c288f3713f34795a623e7a0230e 100644 --- a/interface/web/admin/lib/lang/hu_firewall.lng +++ b/interface/web/admin/lib/lang/hu_firewall.lng @@ -6,6 +6,6 @@ $wb['tcp_port_help_txt'] = 'Vesszővel elválasztva'; $wb['udp_port_help_txt'] = 'Vesszővel elválasztva'; $wb['active_txt'] = 'Aktív'; $wb['firewall_error_unique'] = 'There is already a firewall record for this server.'; -$wb['tcp_ports_error_regex'] = 'Character not allowed in tcp port definition. Allowed characters are numbers, : and ,.'; -$wb['udp_ports_error_regex'] = 'Character not allowed in udp port definition. Allowed characters are numbers, : and ,.'; +$wb['tcp_ports_error_regex'] = 'Character not allowed in TCP port definition. Allowed characters are numbers, colons (:) and commas.'; +$wb['udp_ports_error_regex'] = 'Character not allowed in UDP port definition. Allowed characters are numbers, colons (:) and commas.'; ?> diff --git a/interface/web/admin/lib/lang/hu_language_add.lng b/interface/web/admin/lib/lang/hu_language_add.lng index a4370bc91664f7bdc79c30e051975b8e97a6abeb..94ed5d3fb7583ca604e5b99ed09b5bd092c3c226 100644 --- a/interface/web/admin/lib/lang/hu_language_add.lng +++ b/interface/web/admin/lib/lang/hu_language_add.lng @@ -4,5 +4,5 @@ $wb['language_select_txt'] = 'Válasszony nyelvet'; $wb['language_new_txt'] = 'Új nyelv'; $wb['btn_save_txt'] = 'Új nyelvi csomag összeállítása'; $wb['btn_cancel_txt'] = 'Vissza'; -$wb['language_new_hint_txt'] = '2 karakteres ISO 639-1 nyelvi kód (Lásd http://hu.wikipedia.org/wiki/ISO_639-1)'; +$wb['language_new_hint_txt'] = '2 karakteres ISO 639-1 nyelvi kód (Lásd https://hu.wikipedia.org/wiki/ISO_639-1)'; ?> diff --git a/interface/web/admin/lib/lang/hu_remote_action.lng b/interface/web/admin/lib/lang/hu_remote_action.lng index 6ef0ebe02e70b59cca765dd4537ff336f5813e22..03d94116b9f6047c100c304a977309083460bad3 100644 --- a/interface/web/admin/lib/lang/hu_remote_action.lng +++ b/interface/web/admin/lib/lang/hu_remote_action.lng @@ -2,11 +2,11 @@ $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.

USE THIS AT YOUR OWN RISK!'; +$wb['do_osupdate_desc'] = 'This Action does a apt -y upgrade at your selected server.

USE THIS AT YOUR OWN RISK!'; $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.

USE THIS AT YOUR OWN RISK!'; $wb['action_scheduled'] = 'The action is scheduled for execution'; $wb['select_all_server'] = 'Összes szerver'; $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

ispconfig_update.sh

to start the ISPConfig update.

Click here for detailed update instructions'; +$wb['ispconfig_update_text'] = 'Login as root user on the shell of your server and execute the command

ispconfig_update.sh

to start the ISPConfig update.

Click here for detailed update instructions'; ?> diff --git a/interface/web/admin/lib/lang/hu_remote_user.lng b/interface/web/admin/lib/lang/hu_remote_user.lng index bae9d82f53ceaac588e1baa311655edec36fc7cb..6a32f3cea7803db41819c825f6ba1badcacee36d 100644 --- a/interface/web/admin/lib/lang/hu_remote_user.lng +++ b/interface/web/admin/lib/lang/hu_remote_user.lng @@ -1,4 +1,5 @@ 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'; @@ -303,4 +324,23 @@ $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'; +$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['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/hu_server_ip.lng b/interface/web/admin/lib/lang/hu_server_ip.lng index 33be4f514ef0276a693e04cf692aff34b7626381..2e8f88a2f714b58a29ac45384a419ebcf3a3925a 100644 --- a/interface/web/admin/lib/lang/hu_server_ip.lng +++ b/interface/web/admin/lib/lang/hu_server_ip.lng @@ -1,4 +1,6 @@ diff --git a/interface/web/admin/lib/lang/hu_server_php_list.lng b/interface/web/admin/lib/lang/hu_server_php_list.lng index 62cbe6168714b18ba4fca490280c30c945e09e7c..291302cbb72f6b6ac12dc3e6cb95f18e9dcde90f 100644 --- a/interface/web/admin/lib/lang/hu_server_php_list.lng +++ b/interface/web/admin/lib/lang/hu_server_php_list.lng @@ -5,4 +5,5 @@ $wb['add_new_record_txt'] = 'Add new PHP version'; $wb['client_id_txt'] = 'Client'; $wb['name_txt'] = 'PHP Name'; $wb['active_txt'] = 'Active'; +$wb['usage_txt'] = 'Usage count'; ?> diff --git a/interface/web/admin/lib/lang/hu_software_package.lng b/interface/web/admin/lib/lang/hu_software_package.lng deleted file mode 100644 index faffe38217fb9cac04020e73e473c6c46e3caaa1..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/hu_software_package.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/hu_software_package_install.lng b/interface/web/admin/lib/lang/hu_software_package_install.lng deleted file mode 100644 index 6dc8be3f899c18a4a3796440fccbd743a203d51e..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/hu_software_package_install.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/hu_software_package_list.lng b/interface/web/admin/lib/lang/hu_software_package_list.lng deleted file mode 100644 index 430583ce8a807b7741947c3a561baa6ef165b74d..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/hu_software_package_list.lng +++ /dev/null @@ -1,13 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/hu_software_repo.lng b/interface/web/admin/lib/lang/hu_software_repo.lng deleted file mode 100644 index 3c578e3694e64e0bb61e2042a7af189fbb633b8b..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/hu_software_repo.lng +++ /dev/null @@ -1,8 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/hu_software_repo_list.lng b/interface/web/admin/lib/lang/hu_software_repo_list.lng deleted file mode 100644 index f5e7aabcb2dd935dc28ee9649aa2e33e85356a04..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/hu_software_repo_list.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/hu_software_update_list.lng b/interface/web/admin/lib/lang/hu_software_update_list.lng deleted file mode 100644 index c2edc83217d879d6cfc829de25c24afb3a1964ef..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/hu_software_update_list.lng +++ /dev/null @@ -1,9 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/hu_system_config.lng b/interface/web/admin/lib/lang/hu_system_config.lng index cee497fe19daec3e77a93771dcddd9bca237eb63..cdb31136622768878f44c3055f435975dd6be2aa 100644 --- a/interface/web/admin/lib/lang/hu_system_config.lng +++ b/interface/web/admin/lib/lang/hu_system_config.lng @@ -1,4 +1,5 @@ diff --git a/interface/web/admin/lib/lang/hu_users.lng b/interface/web/admin/lib/lang/hu_users.lng index e2cf25fb79521f342e6a167e339f2fa1fdb0109d..dc1089b76fdb295707d737c7c973cbf7aa1812dd 100644 --- a/interface/web/admin/lib/lang/hu_users.lng +++ b/interface/web/admin/lib/lang/hu_users.lng @@ -1,9 +1,10 @@ diff --git a/interface/web/admin/lib/lang/id_directive_snippets.lng b/interface/web/admin/lib/lang/id_directive_snippets.lng index 0616afad8b6c76c9eb284f57a673f6c35d286310..0f83e9415955f939b35dec4b9cd8023aa19b0968 100644 --- a/interface/web/admin/lib/lang/id_directive_snippets.lng +++ b/interface/web/admin/lib/lang/id_directive_snippets.lng @@ -8,5 +8,8 @@ $wb['directive_snippets_name_empty'] = 'Please specify a name for the snippet.'; $wb['directive_snippets_name_error_unique'] = 'There is already a directive snippet with this name.'; $wb['variables_txt'] = 'Variables'; $wb['customer_viewable_txt'] = 'Customer viewable'; -$wb['required_php_snippets_txt'] = 'Requiered PHP Snippet'; -?> +$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 diff --git a/interface/web/admin/lib/lang/id_firewall.lng b/interface/web/admin/lib/lang/id_firewall.lng index 34e13422593ac323a2383909417eececf6b899d8..f335c3f94f806f4151d32786f3eb098036825e74 100644 --- a/interface/web/admin/lib/lang/id_firewall.lng +++ b/interface/web/admin/lib/lang/id_firewall.lng @@ -6,6 +6,6 @@ $wb['tcp_port_help_txt'] = 'Dipisahkan oleh koma'; $wb['udp_port_help_txt'] = 'Dipisahkan oleh koma'; $wb['active_txt'] = 'Aktif'; $wb['firewall_error_unique'] = 'Telah ada record firewall untuk server ini.'; -$wb['tcp_ports_error_regex'] = 'Karakter di definisi port tcp tidak diperbolehkan. Karakter yang diizinkan adalah angka, : dan ,.'; -$wb['udp_ports_error_regex'] = 'Karakter di definisi port udp tidak diperbolehkan. Karakter yang diizinkan adalah angka, : dan ,.'; +$wb['tcp_ports_error_regex'] = 'Karakter di definisi port TCP tidak diperbolehkan. Karakter yang diizinkan adalah angka, : dan ,.'; +$wb['udp_ports_error_regex'] = 'Karakter di definisi port UDP tidak diperbolehkan. Karakter yang diizinkan adalah angka, : dan ,.'; ?> diff --git a/interface/web/admin/lib/lang/id_language_add.lng b/interface/web/admin/lib/lang/id_language_add.lng index 5f44d5e6b194f689f9be75eb6bf77b8bbe18c1f8..8a8a4f75ad637f63e0f1d7f704ab7747cecb64f2 100644 --- a/interface/web/admin/lib/lang/id_language_add.lng +++ b/interface/web/admin/lib/lang/id_language_add.lng @@ -2,7 +2,7 @@ $wb['list_head_txt'] = 'Tambah Bahasa Baru'; $wb['language_select_txt'] = 'Pilih basis bahasa'; $wb['language_new_txt'] = 'Bahasa baru'; -$wb['language_new_hint_txt'] = '2 karakter kode bahasa ISO 639-1 (Lihat http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)'; +$wb['language_new_hint_txt'] = '2 karakter kode bahasa ISO 639-1 (Lihat https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)'; $wb['btn_save_txt'] = 'Buat kumpulan berkas bahasa baru'; $wb['btn_cancel_txt'] = 'Kembali'; ?> diff --git a/interface/web/admin/lib/lang/id_remote_action.lng b/interface/web/admin/lib/lang/id_remote_action.lng index bfe758aeaf88bde6e64c75b93f4d345488a2d8c6..2ddc957f630d7aff9bf3e177ff452b612226a430 100644 --- a/interface/web/admin/lib/lang/id_remote_action.lng +++ b/interface/web/admin/lib/lang/id_remote_action.lng @@ -2,11 +2,11 @@ $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.

PENGGUNAANNYA MENJADI TANGGUNG JAWAB ANDA SENDIRI!'; +$wb['do_osupdate_desc'] = 'Tindakan ini menjalankan apt -y upgrade di server yang dipilih.

PENGGUNAANNYA MENJADI TANGGUNG JAWAB ANDA SENDIRI!'; $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.

PENGGUNAANNYA MENJADI TANGGUNG JAWAB ANDA SENDIRI!'; $wb['action_scheduled'] = 'Tindakan dijadwalkan untuk dijalankan'; $wb['select_all_server'] = 'Semua 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

ispconfig_update.sh

to start the ISPConfig update.

Click here for detailed update instructions'; +$wb['ispconfig_update_text'] = 'Login as root user on the shell of your server and execute the command

ispconfig_update.sh

to start the ISPConfig update.

Click here for detailed update instructions'; ?> diff --git a/interface/web/admin/lib/lang/id_remote_user.lng b/interface/web/admin/lib/lang/id_remote_user.lng index cc6efb627ac03112e9204fcb1299126812d0da66..0b148796867cc9e22c37dc51e5b9a3e347c4dcf2 100644 --- a/interface/web/admin/lib/lang/id_remote_user.lng +++ b/interface/web/admin/lib/lang/id_remote_user.lng @@ -1,4 +1,5 @@ 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'; @@ -303,4 +324,23 @@ $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'; +$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['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/id_server_ip.lng b/interface/web/admin/lib/lang/id_server_ip.lng index c6d99a121239da80568579a40160d76afb8089af..00cecf50262d718301bb1d0656002946a1165e41 100644 --- a/interface/web/admin/lib/lang/id_server_ip.lng +++ b/interface/web/admin/lib/lang/id_server_ip.lng @@ -1,4 +1,6 @@ diff --git a/interface/web/admin/lib/lang/id_server_php_list.lng b/interface/web/admin/lib/lang/id_server_php_list.lng index 62cbe6168714b18ba4fca490280c30c945e09e7c..291302cbb72f6b6ac12dc3e6cb95f18e9dcde90f 100644 --- a/interface/web/admin/lib/lang/id_server_php_list.lng +++ b/interface/web/admin/lib/lang/id_server_php_list.lng @@ -5,4 +5,5 @@ $wb['add_new_record_txt'] = 'Add new PHP version'; $wb['client_id_txt'] = 'Client'; $wb['name_txt'] = 'PHP Name'; $wb['active_txt'] = 'Active'; +$wb['usage_txt'] = 'Usage count'; ?> diff --git a/interface/web/admin/lib/lang/id_software_package.lng b/interface/web/admin/lib/lang/id_software_package.lng deleted file mode 100644 index faffe38217fb9cac04020e73e473c6c46e3caaa1..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/id_software_package.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/id_software_package_install.lng b/interface/web/admin/lib/lang/id_software_package_install.lng deleted file mode 100644 index 9e966893caefed15e144571afc07f91705df52ea..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/id_software_package_install.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/id_software_package_list.lng b/interface/web/admin/lib/lang/id_software_package_list.lng deleted file mode 100644 index 02642be6e2c75183a8a08800207bf82f36424fb5..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/id_software_package_list.lng +++ /dev/null @@ -1,13 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/id_software_repo.lng b/interface/web/admin/lib/lang/id_software_repo.lng deleted file mode 100644 index 1c3b0305b4f25e5b09952507b4eb9c200dbc71bd..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/id_software_repo.lng +++ /dev/null @@ -1,8 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/id_software_repo_list.lng b/interface/web/admin/lib/lang/id_software_repo_list.lng deleted file mode 100644 index 63444907f31569d6926313329d15939bf2b9979c..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/id_software_repo_list.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/id_software_update_list.lng b/interface/web/admin/lib/lang/id_software_update_list.lng deleted file mode 100644 index f789a0e72c472d55b27e254771c57d98bfcae3fd..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/id_software_update_list.lng +++ /dev/null @@ -1,9 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/id_system_config.lng b/interface/web/admin/lib/lang/id_system_config.lng index 344185b84db08846103736929e6a8e341aa60799..f9b3f87a00f2945e355f155f7c5332a799a43438 100644 --- a/interface/web/admin/lib/lang/id_system_config.lng +++ b/interface/web/admin/lib/lang/id_system_config.lng @@ -1,4 +1,5 @@ diff --git a/interface/web/admin/lib/lang/id_users.lng b/interface/web/admin/lib/lang/id_users.lng index f9e961192c09a9bc6e68ccb8d0c2a90e68e8f1ec..032613d1e543049aad7ffedd6ac1d4ee61c1a4d3 100644 --- a/interface/web/admin/lib/lang/id_users.lng +++ b/interface/web/admin/lib/lang/id_users.lng @@ -1,9 +1,10 @@ diff --git a/interface/web/admin/lib/lang/it_directive_snippets.lng b/interface/web/admin/lib/lang/it_directive_snippets.lng index 5598aacecc152ca4c07d07a7e9ad5cd0e6af4c28..1e7d3109a1692aa2e60fcf74c713c4273a4c7028 100644 --- a/interface/web/admin/lib/lang/it_directive_snippets.lng +++ b/interface/web/admin/lib/lang/it_directive_snippets.lng @@ -7,6 +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'] = 'Requiered PHP Snippet'; -?> +$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 @@ diff --git a/interface/web/admin/lib/lang/it_firewall.lng b/interface/web/admin/lib/lang/it_firewall.lng index 95a4336dae81c06b19c7dfb7d869311085780c71..d523ea79f7bf2a66efa47f9d093efff87a56a49f 100644 --- a/interface/web/admin/lib/lang/it_firewall.lng +++ b/interface/web/admin/lib/lang/it_firewall.lng @@ -6,6 +6,6 @@ $wb['tcp_port_help_txt'] = 'Separate dalla virgola'; $wb['udp_port_help_txt'] = 'Separate dalle virgola'; $wb['active_txt'] = 'Attivo'; $wb['firewall_error_unique'] = 'Esiste già un record firewall per questo server.'; -$wb['tcp_ports_error_regex'] = 'Carattere non ammesso nella definizione di tcp port. Caratteri ammessi sono numeri, : e ,.'; -$wb['udp_ports_error_regex'] = 'Carattere non ammesso nella definizione di udp port. Caratteri ammessi sono numeri, : and ,.'; +$wb['tcp_ports_error_regex'] = 'Carattere non ammesso nella definizione di TCP port. Caratteri ammessi sono numeri, : e ,.'; +$wb['udp_ports_error_regex'] = 'Carattere non ammesso nella definizione di UDP port. Caratteri ammessi sono numeri, : and ,.'; ?> 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'] = 'ATTENZIONE: 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'] = 'ATTENZIONE: 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 @@ 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_add.lng b/interface/web/admin/lib/lang/it_language_add.lng index d157e08f6f7b7a2b9788f849efb1d7974edfa1e7..a5219f6d2c728032f5ac9d5f1f592c4b39628c43 100644 --- a/interface/web/admin/lib/lang/it_language_add.lng +++ b/interface/web/admin/lib/lang/it_language_add.lng @@ -4,5 +4,5 @@ $wb['language_select_txt'] = 'Seleziona lingua base'; $wb['language_new_txt'] = 'Nuova lingua'; $wb['btn_save_txt'] = 'Crea file della nuova lingua'; $wb['btn_cancel_txt'] = 'Annulla'; -$wb['language_new_hint_txt'] = '2 characters ISO 639-1 language-code (See http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)'; +$wb['language_new_hint_txt'] = '2 characters ISO 639-1 language-code (See https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)'; ?> 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 @@ 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.
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.
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.
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 @@ 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 7a3abe9bfd0e9eb43e082a196754e075029503cd..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 @@
USE THIS AT YOUR OWN RISK!'; -$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.

USE THIS AT YOUR OWN RISK!'; -$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

ispconfig_update.sh

to start the ISPConfig update.

Click here for detailed update instructins'; +$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.

USI QUESTA FUNZIONE A TUO RISCHIO E PERICOLO!'; +$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.

USI QUESTA FUNZIONE A TUO RISCHIO E PERICOLO!'; +$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

ispconfig_update.sh

per iniziare il processo di aggiornamento.

Clicca qui per le istruzioni dettagliate di aggiornamento (in inglese)'; ?> diff --git a/interface/web/admin/lib/lang/it_remote_user.lng b/interface/web/admin/lib/lang/it_remote_user.lng index caef58a8c68b35ac6445cf6ec47485f16c89c985..f3bdba77371ae983c8ac94e2fa9abda79d056c3f 100644 --- a/interface/web/admin/lib/lang/it_remote_user.lng +++ b/interface/web/admin/lib/lang/it_remote_user.lng @@ -1,11 +1,12 @@ any)'; -$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 qualunque)'; +$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 2d7d9e9ddb6513aec59e84737f35003de876940f..4d01d70b22a266f1f3be3472b759a01f2318597a 100644 --- a/interface/web/admin/lib/lang/it_server_config.lng +++ b/interface/web/admin/lib/lang/it_server_config.lng @@ -1,23 +1,27 @@ Informazione: Se desideri fermare MySQL devi selezionare la spunta per Disabilitare monitor MySQL ed attendere 2-3 minuti.
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'] = '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'; @@ -172,9 +180,14 @@ $wb['mailbox_quota_stats_txt'] = 'Statistiche Quota Casella di Posta'; $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_reseller_txt'] = 'Send overtraffic notification to reseller'; $wb['overtraffic_notify_client_txt'] = 'Trasmetti notifiche superamento traffico al cliente'; +$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_reseller_txt'] = 'Send quota warnings to reseller'; $wb['overquota_notify_client_txt'] = 'Trasmetti allarmi quota al cliente'; $wb['overquota_notify_onok_txt'] = 'Trasmetti messaggio quota ok al cliente'; $wb['overquota_notify_freq_txt'] = 'Trasmetti allarmi quota ogni X giorni'; @@ -185,12 +198,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.'; @@ -209,98 +222,124 @@ $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['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_reseller_txt'] = 'Send DB quota warnings to reseller'; +$wb['overquota_db_notify_client_txt'] = 'Invia avviso di quota DB al cliente'; $wb['php_handler_txt'] = 'Default PHP Handler'; -$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_default_chroot_txt'] = 'Default chrooted PHP-FPM'; +$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['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; $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_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['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 0d36ac79c36b077a8781a86cbc9203b3d0830080..42cecce91ad41bc51f2d77d7869409eab946d4c1 100644 --- a/interface/web/admin/lib/lang/it_server_ip.lng +++ b/interface/web/admin/lib/lang/it_server_ip.lng @@ -1,11 +1,13 @@ 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 68b196fb23a8a805455d768e32ed419d405f9ecb..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,12 +1,14 @@ 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 @@ diff --git a/interface/web/admin/lib/lang/it_server_php.lng b/interface/web/admin/lib/lang/it_server_php.lng index 805528f376d582be160fd802b36c26530f8b3e22..7569ba9b5215c7bbdb3ecfd5eab10c5a2b8e544f 100644 --- a/interface/web/admin/lib/lang/it_server_php.lng +++ b/interface/web/admin/lib/lang/it_server_php.lng @@ -1,17 +1,20 @@ diff --git a/interface/web/admin/lib/lang/it_server_php_list.lng b/interface/web/admin/lib/lang/it_server_php_list.lng index 296de9d0a55df5e48d11f09a5082d497ca5f7d41..5ff1ebe31460dad547308f710edbd3e25769195b 100644 --- a/interface/web/admin/lib/lang/it_server_php_list.lng +++ b/interface/web/admin/lib/lang/it_server_php_list.lng @@ -5,4 +5,5 @@ $wb['add_new_record_txt'] = 'Aggiungi una nuova versione PHP'; $wb['client_id_txt'] = 'Cliente'; $wb['name_txt'] = 'Nome PHP'; $wb['active_txt'] = 'Active'; +$wb['usage_txt'] = 'Usage count'; ?> diff --git a/interface/web/admin/lib/lang/it_software_package.lng b/interface/web/admin/lib/lang/it_software_package.lng index d2e123cf85abc3c9fce3de2d5b6f3d5fa3c85459..4125430c567a8b712d6356182400efa4bfede986 100644 --- a/interface/web/admin/lib/lang/it_software_package.lng +++ b/interface/web/admin/lib/lang/it_software_package.lng @@ -1,6 +1,6 @@ diff --git a/interface/web/admin/lib/lang/it_software_repo_list.lng b/interface/web/admin/lib/lang/it_software_repo_list.lng index 4db52118ec6bd564032ac437355c68aa5e17cf78..be378f3ca8e32d75cf538e74d04631a7eb4e1bd7 100644 --- a/interface/web/admin/lib/lang/it_software_repo_list.lng +++ b/interface/web/admin/lib/lang/it_software_repo_list.lng @@ -2,5 +2,5 @@ $wb['list_head_txt'] = 'Repository'; $wb['active_txt'] = 'Attivo'; $wb['repo_name_txt'] = 'Repository'; -$wb['repo_url_txt'] = 'Indirizzo'; +$wb['repo_url_txt'] = 'URL del Repository'; ?> diff --git a/interface/web/admin/lib/lang/it_system_config.lng b/interface/web/admin/lib/lang/it_system_config.lng index 311b7c957c4f813008dfd9654cd6675f82d5a8b0..2f8950d7a31245434fb140b4dfb53f02d6364490 100644 --- a/interface/web/admin/lib/lang/it_system_config.lng +++ b/interface/web/admin/lib/lang/it_system_config.lng @@ -1,93 +1,111 @@ 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 @@ diff --git a/interface/web/admin/lib/lang/it_users.lng b/interface/web/admin/lib/lang/it_users.lng index 1bde73a67ba192ed59c1f0100ddb116fa3dbfb61..57a462394aa55abfe9f5c0e8c32c04a4b6b51d26 100644 --- a/interface/web/admin/lib/lang/it_users.lng +++ b/interface/web/admin/lib/lang/it_users.lng @@ -1,12 +1,13 @@ 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'] = 'ATTENZIONE: 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_directive_snippets.lng b/interface/web/admin/lib/lang/ja_directive_snippets.lng index 0616afad8b6c76c9eb284f57a673f6c35d286310..0f83e9415955f939b35dec4b9cd8023aa19b0968 100644 --- a/interface/web/admin/lib/lang/ja_directive_snippets.lng +++ b/interface/web/admin/lib/lang/ja_directive_snippets.lng @@ -8,5 +8,8 @@ $wb['directive_snippets_name_empty'] = 'Please specify a name for the snippet.'; $wb['directive_snippets_name_error_unique'] = 'There is already a directive snippet with this name.'; $wb['variables_txt'] = 'Variables'; $wb['customer_viewable_txt'] = 'Customer viewable'; -$wb['required_php_snippets_txt'] = 'Requiered PHP Snippet'; -?> +$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 diff --git a/interface/web/admin/lib/lang/ja_language_add.lng b/interface/web/admin/lib/lang/ja_language_add.lng index c704242c92eaba0b83c224d9e677044e484cfaee..e9b4c09ed1c743c2be80f26cda4ecf832a9b44ee 100644 --- a/interface/web/admin/lib/lang/ja_language_add.lng +++ b/interface/web/admin/lib/lang/ja_language_add.lng @@ -2,7 +2,7 @@ $wb['list_head_txt'] = '新しい言語を追加する'; $wb['language_select_txt'] = 'ベースにする言語を選んでください'; $wb['language_new_txt'] = '新しい言語'; -$wb['language_new_hint_txt'] = '2文字の ISO 639-1 言語コード(http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes を参照してください)'; +$wb['language_new_hint_txt'] = '2文字の ISO 639-1 言語コード(https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes を参照してください)'; $wb['btn_save_txt'] = '新しい言語ファイルセットを作る'; $wb['btn_cancel_txt'] = '戻る'; ?> diff --git a/interface/web/admin/lib/lang/ja_remote_action.lng b/interface/web/admin/lib/lang/ja_remote_action.lng index 3fc3eaf81f5d63a057aa0eecf965bfbdaf6af701..dfe56b616d5b3d18abd7eb9965b8c5602cb4354c 100644 --- a/interface/web/admin/lib/lang/ja_remote_action.lng +++ b/interface/web/admin/lib/lang/ja_remote_action.lng @@ -2,11 +2,11 @@ $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.

USE THIS AT YOUR OWN RISK!'; +$wb['do_osupdate_desc'] = 'This Action does a apt -y upgrade at your selected server.

USE THIS AT YOUR OWN RISK!'; $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.

USE THIS AT YOUR OWN RISK!'; $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

ispconfig_update.sh

to start the ISPConfig update.

Click here for detailed update instructions'; +$wb['ispconfig_update_text'] = 'Login as root user on the shell of your server and execute the command

ispconfig_update.sh

to start the ISPConfig update.

Click here for detailed update instructions'; ?> diff --git a/interface/web/admin/lib/lang/ja_remote_user.lng b/interface/web/admin/lib/lang/ja_remote_user.lng index 2b9ce2bbf046a25245ffce724be6aa0053488d5a..9b8ca0f9c97f7b9510d0e526733927ea326e87b8 100644 --- a/interface/web/admin/lib/lang/ja_remote_user.lng +++ b/interface/web/admin/lib/lang/ja_remote_user.lng @@ -1,4 +1,5 @@ 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'; @@ -303,4 +324,23 @@ $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'; +$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['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/ja_server_ip.lng b/interface/web/admin/lib/lang/ja_server_ip.lng index fdd8681ebb3c1f13a5564e6a1509b91fbcd93cb7..982d797760e61bdef90587faf1e618da91f956d4 100644 --- a/interface/web/admin/lib/lang/ja_server_ip.lng +++ b/interface/web/admin/lib/lang/ja_server_ip.lng @@ -1,4 +1,6 @@ diff --git a/interface/web/admin/lib/lang/ja_server_php_list.lng b/interface/web/admin/lib/lang/ja_server_php_list.lng index 62cbe6168714b18ba4fca490280c30c945e09e7c..291302cbb72f6b6ac12dc3e6cb95f18e9dcde90f 100644 --- a/interface/web/admin/lib/lang/ja_server_php_list.lng +++ b/interface/web/admin/lib/lang/ja_server_php_list.lng @@ -5,4 +5,5 @@ $wb['add_new_record_txt'] = 'Add new PHP version'; $wb['client_id_txt'] = 'Client'; $wb['name_txt'] = 'PHP Name'; $wb['active_txt'] = 'Active'; +$wb['usage_txt'] = 'Usage count'; ?> diff --git a/interface/web/admin/lib/lang/ja_software_package.lng b/interface/web/admin/lib/lang/ja_software_package.lng deleted file mode 100644 index faffe38217fb9cac04020e73e473c6c46e3caaa1..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/ja_software_package.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/ja_software_package_install.lng b/interface/web/admin/lib/lang/ja_software_package_install.lng deleted file mode 100644 index 5c8b756434ce27d67e479a96383bbee01bce4f1f..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/ja_software_package_install.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/ja_software_package_list.lng b/interface/web/admin/lib/lang/ja_software_package_list.lng deleted file mode 100644 index e5352e91e7cf91fe7472f0797853dc7d9b77c1d9..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/ja_software_package_list.lng +++ /dev/null @@ -1,13 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/ja_software_repo.lng b/interface/web/admin/lib/lang/ja_software_repo.lng deleted file mode 100644 index c95399a54ebba86be6c0d10e24e1bdecb0f737cb..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/ja_software_repo.lng +++ /dev/null @@ -1,8 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/ja_software_repo_list.lng b/interface/web/admin/lib/lang/ja_software_repo_list.lng deleted file mode 100644 index a7d06d8fdec5616b64fbd9e572d0d37b11b0a337..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/ja_software_repo_list.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/ja_software_update_list.lng b/interface/web/admin/lib/lang/ja_software_update_list.lng deleted file mode 100644 index f0ecf5711bfbe603072a559a54073ea008303770..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/ja_software_update_list.lng +++ /dev/null @@ -1,9 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/ja_system_config.lng b/interface/web/admin/lib/lang/ja_system_config.lng index aa5cc6a7a3e69963e8204e22aff4ff6f2fc756e9..744d83a705615f40c5e43c8e29fb3975bddf0eee 100644 --- a/interface/web/admin/lib/lang/ja_system_config.lng +++ b/interface/web/admin/lib/lang/ja_system_config.lng @@ -1,4 +1,5 @@ diff --git a/interface/web/admin/lib/lang/ja_users.lng b/interface/web/admin/lib/lang/ja_users.lng index 64f8339ffa9a4c9bbfbad023cd10cc3b96754089..9786f8b57647670f316bd266fbc365923d480bde 100644 --- a/interface/web/admin/lib/lang/ja_users.lng +++ b/interface/web/admin/lib/lang/ja_users.lng @@ -1,9 +1,10 @@ diff --git a/interface/web/admin/lib/lang/ja_users_list.lng b/interface/web/admin/lib/lang/ja_users_list.lng index 6a3fac468ff3f6c0620639a51e6d623fea06e1b3..8896b8ccbd3ccd53f68e4f6d4539d8fc9077358d 100644 --- a/interface/web/admin/lib/lang/ja_users_list.lng +++ b/interface/web/admin/lib/lang/ja_users_list.lng @@ -4,6 +4,6 @@ $wb['username_txt'] = 'ユーザー名'; $wb['client_id_txt'] = 'Client ID'; $wb['active_txt'] = 'Active'; $wb['add_new_record_txt'] = 'ユーザーを追加する'; -$wb['warning_txt'] = 'WARNING: Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +$wb['warning_txt'] = 'WARNING: Do not edit or modify any client user settings here. Use the client- and reseller settings in the client module instead. Modifying or changing client users or groups here may cause data loss!'; $wb['groups_txt'] = 'Groups'; ?> diff --git a/interface/web/admin/lib/lang/nl.lng b/interface/web/admin/lib/lang/nl.lng index 26d231ffcd67ba0f376ea4a79eacdcfcec116d02..99a4b53da1e8879b7802a87f57f03a78f0010442 100644 --- a/interface/web/admin/lib/lang/nl.lng +++ b/interface/web/admin/lib/lang/nl.lng @@ -1,6 +1,6 @@ +$wb['directive_snippets_name_empty'] = 'Geef de Directive Snippet een naam.'; +$wb['directive_snippets_name_error_unique'] = 'Er is al een Directive Snippet met deze naam.'; +$wb['variables_txt'] = 'Variabelen'; +$wb['customer_viewable_txt'] = 'Zichtbaar voor klanten'; +$wb['required_php_snippets_txt'] = 'Vereiste 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 diff --git a/interface/web/admin/lib/lang/nl_directive_snippets_list.lng b/interface/web/admin/lib/lang/nl_directive_snippets_list.lng index 8e189f9f7909f34b06b76eca63a2316b2543f366..5c12ac4808a1ec2c5af4beba9ad589849fa6ebf8 100644 --- a/interface/web/admin/lib/lang/nl_directive_snippets_list.lng +++ b/interface/web/admin/lib/lang/nl_directive_snippets_list.lng @@ -1,8 +1,8 @@ diff --git a/interface/web/admin/lib/lang/nl_firewall.lng b/interface/web/admin/lib/lang/nl_firewall.lng index 443aca29e630be25b9ad4f9f97c4a6b3ff8800e1..284af5c435588938b6a0470f6064d502cdd09211 100644 --- a/interface/web/admin/lib/lang/nl_firewall.lng +++ b/interface/web/admin/lib/lang/nl_firewall.lng @@ -6,6 +6,6 @@ $wb['tcp_port_help_txt'] = 'Gescheiden door komma'; $wb['udp_port_help_txt'] = 'Gescheiden door komma'; $wb['active_txt'] = 'Actief'; $wb['firewall_error_unique'] = 'Er is al een firewall record voor deze server.'; -$wb['tcp_ports_error_regex'] = 'Karakter niet toegestaan in tcp port definitie. Toegestane karakters zijn nummers, : en ,.'; -$wb['udp_ports_error_regex'] = 'Karakter niet toegestaan in udp port definitie. Toegestane karakters zijn nummers, : en ,.'; +$wb['tcp_ports_error_regex'] = 'Karakter niet toegestaan in TCP port definitie. Toegestane karakters zijn nummers, : en ,.'; +$wb['udp_ports_error_regex'] = 'Karakter niet toegestaan in UDP port definitie. Toegestane karakters zijn nummers, : en ,.'; ?> diff --git a/interface/web/admin/lib/lang/nl_firewall_list.lng b/interface/web/admin/lib/lang/nl_firewall_list.lng index 394d093493187c737f5f41665fa869b789343fd5..11746c6e5b42a5cc2e683f0a72f745e1d200c984 100644 --- a/interface/web/admin/lib/lang/nl_firewall_list.lng +++ b/interface/web/admin/lib/lang/nl_firewall_list.lng @@ -4,5 +4,5 @@ $wb['active_txt'] = 'Actief'; $wb['server_id_txt'] = 'Server'; $wb['tcp_port_txt'] = 'Open TCP poorten'; $wb['udp_port_txt'] = 'Open UDP poorten'; -$wb['add_new_record_txt'] = 'Toevoegen Firewall record'; +$wb['add_new_record_txt'] = 'Firewall regel toevoegen'; ?> diff --git a/interface/web/admin/lib/lang/nl_groups.lng b/interface/web/admin/lib/lang/nl_groups.lng index e3ec317a4e6981127decc8540e7d0d5a35ac9bd9..cdc75880ceb5944a7893e68364a105c66ca244ce 100644 --- a/interface/web/admin/lib/lang/nl_groups.lng +++ b/interface/web/admin/lib/lang/nl_groups.lng @@ -1,5 +1,5 @@ diff --git a/interface/web/admin/lib/lang/nl_language_add.lng b/interface/web/admin/lib/lang/nl_language_add.lng index c7463518275ccb5538bc671e92e67ddf9c111d9e..acb120e60ba1763db37c799d1e62f29ec0bb54cb 100644 --- a/interface/web/admin/lib/lang/nl_language_add.lng +++ b/interface/web/admin/lib/lang/nl_language_add.lng @@ -1,8 +1,8 @@ diff --git a/interface/web/admin/lib/lang/nl_language_import.lng b/interface/web/admin/lib/lang/nl_language_import.lng index ae407efecbe3bbaf413e644ba0408c4b0c958187..bec27a95286faf3bc7c43d0f5041ed3cad9ea97a 100644 --- a/interface/web/admin/lib/lang/nl_language_import.lng +++ b/interface/web/admin/lib/lang/nl_language_import.lng @@ -5,5 +5,5 @@ $wb['btn_save_txt'] = 'Importeer het geselecteerde taalbestand'; $wb['language_overwrite_txt'] = 'Overschrijf bestand, als dit bestaat.'; $wb['btn_cancel_txt'] = 'Terug'; $wb['ignore_version_txt'] = 'Sla ISPConfig versie controle over'; -$wb['list_desc_txt'] = 'WARNING: Do not import language files from untrustworthy sources.'; +$wb['list_desc_txt'] = 'Waarschuwing: Importeer geen taalbestanden van onvertrouwde bronnen.'; ?> diff --git a/interface/web/admin/lib/lang/nl_remote_action.lng b/interface/web/admin/lib/lang/nl_remote_action.lng index ae286d9ea401105080acada056852d64ed816458..146bbc6bfb7b89afeae5f0bd836b447697cb327d 100644 --- a/interface/web/admin/lib/lang/nl_remote_action.lng +++ b/interface/web/admin/lib/lang/nl_remote_action.lng @@ -2,11 +2,11 @@ $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.

GEBRUIK OP EIGEN RISICO!'; +$wb['do_osupdate_desc'] = 'Deze actie voert een apt -y upgrade uit op de door u geselecteerde server.

GEBRUIK OP EIGEN RISICO!'; $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.

GEBRUIK OP EIGEN RISICO!'; $wb['action_scheduled'] = 'Deze actie is ingepland om uitgevoerd te worden'; $wb['select_all_server'] = 'Alle servers'; $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

ispconfig_update.sh

to start the ISPConfig update.

Click here for detailed update instructions'; +$wb['ispconfig_update_text'] = 'Login as root user on the shell of your server and execute the command

ispconfig_update.sh

to start the ISPConfig update.

Click here for detailed update instructions'; ?> diff --git a/interface/web/admin/lib/lang/nl_remote_user.lng b/interface/web/admin/lib/lang/nl_remote_user.lng index f049116094a7d7f194552141667e0d147c50240e..8165c5fd130c067e2b339365c6b34e2b3ab5fc5d 100644 --- a/interface/web/admin/lib/lang/nl_remote_user.lng +++ b/interface/web/admin/lib/lang/nl_remote_user.lng @@ -1,4 +1,5 @@ any)'; $wb['remote_user_error_ips'] = 'At least one of the entered ip addresses or hostnames is invalid.'; diff --git a/interface/web/admin/lib/lang/nl_server_config.lng b/interface/web/admin/lib/lang/nl_server_config.lng index 542add696bbcd4f2397a1e51ad65750b0055bd93..8ea60a21a8149f93d439e81e914ac1d55a5b56cb 100644 --- a/interface/web/admin/lib/lang/nl_server_config.lng +++ b/interface/web/admin/lib/lang/nl_server_config.lng @@ -1,4 +1,8 @@ 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'; @@ -303,4 +324,23 @@ $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'; +$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['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/nl_server_ip.lng b/interface/web/admin/lib/lang/nl_server_ip.lng index 3b281d60a049456c4dc95d0d9b821aab392abcf1..1fd397e01b83f7e0406ddfb3030625f60cac628d 100644 --- a/interface/web/admin/lib/lang/nl_server_ip.lng +++ b/interface/web/admin/lib/lang/nl_server_ip.lng @@ -1,4 +1,6 @@ diff --git a/interface/web/admin/lib/lang/nl_server_php_list.lng b/interface/web/admin/lib/lang/nl_server_php_list.lng index 62cbe6168714b18ba4fca490280c30c945e09e7c..291302cbb72f6b6ac12dc3e6cb95f18e9dcde90f 100644 --- a/interface/web/admin/lib/lang/nl_server_php_list.lng +++ b/interface/web/admin/lib/lang/nl_server_php_list.lng @@ -5,4 +5,5 @@ $wb['add_new_record_txt'] = 'Add new PHP version'; $wb['client_id_txt'] = 'Client'; $wb['name_txt'] = 'PHP Name'; $wb['active_txt'] = 'Active'; +$wb['usage_txt'] = 'Usage count'; ?> diff --git a/interface/web/admin/lib/lang/nl_software_package.lng b/interface/web/admin/lib/lang/nl_software_package.lng deleted file mode 100644 index faffe38217fb9cac04020e73e473c6c46e3caaa1..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/nl_software_package.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/nl_software_package_install.lng b/interface/web/admin/lib/lang/nl_software_package_install.lng deleted file mode 100644 index 87150b8cf190777da50b76bb1c1010aa108009c0..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/nl_software_package_install.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/nl_software_package_list.lng b/interface/web/admin/lib/lang/nl_software_package_list.lng deleted file mode 100644 index 44aaa563ad06f472796aa96a31d9a241c9cee4fc..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/nl_software_package_list.lng +++ /dev/null @@ -1,13 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/nl_software_repo.lng b/interface/web/admin/lib/lang/nl_software_repo.lng deleted file mode 100644 index 665c4197a24af7dd5caa4cc89e2e599f4a9a953e..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/nl_software_repo.lng +++ /dev/null @@ -1,8 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/nl_software_repo_list.lng b/interface/web/admin/lib/lang/nl_software_repo_list.lng deleted file mode 100644 index fc05fc269b9d6bdf36e7d0fb2d2f4f25822e33aa..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/nl_software_repo_list.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/nl_software_update_list.lng b/interface/web/admin/lib/lang/nl_software_update_list.lng deleted file mode 100644 index 0d05c855943aad9b9933f72c91130efe5d17622f..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/nl_software_update_list.lng +++ /dev/null @@ -1,9 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/nl_system_config.lng b/interface/web/admin/lib/lang/nl_system_config.lng index 44a58b7646e09c8fc06c112f3c1aa19dbeb9a7b4..b40ce962851776e9c6a918ee5fcc65c82ed9d68b 100644 --- a/interface/web/admin/lib/lang/nl_system_config.lng +++ b/interface/web/admin/lib/lang/nl_system_config.lng @@ -1,4 +1,5 @@ diff --git a/interface/web/admin/lib/lang/nl_users.lng b/interface/web/admin/lib/lang/nl_users.lng index 1e6d4ef586166171b18e799ce2f73c2d93d11bec..9013af5901e530ef3654c209092a1086d343b780 100644 --- a/interface/web/admin/lib/lang/nl_users.lng +++ b/interface/web/admin/lib/lang/nl_users.lng @@ -1,9 +1,10 @@ diff --git a/interface/web/admin/lib/lang/pl_directive_snippets.lng b/interface/web/admin/lib/lang/pl_directive_snippets.lng index 4902bf3282ce2e1148d5e5a40c9c73c998c3ccdc..f28620333d82201f04b6238474994d0e19cb7f5e 100644 --- a/interface/web/admin/lib/lang/pl_directive_snippets.lng +++ b/interface/web/admin/lib/lang/pl_directive_snippets.lng @@ -8,5 +8,8 @@ $wb['directive_snippets_name_empty'] = 'Wybierz nazwę dla zestawu dyrektyw'; $wb['directive_snippets_name_error_unique'] = 'Istnieje już zestaw dyrektyw o podanej nazwie'; $wb['variables_txt'] = 'Variables'; $wb['customer_viewable_txt'] = 'Customer viewable'; -$wb['required_php_snippets_txt'] = 'Requiered PHP Snippet'; -?> +$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 diff --git a/interface/web/admin/lib/lang/pl_language_add.lng b/interface/web/admin/lib/lang/pl_language_add.lng index 82e42ef720eea1c0c5e7387249693933b41b68bc..cc84c68bfdd4d315cbc0a7defb88653982ecda61 100644 --- a/interface/web/admin/lib/lang/pl_language_add.lng +++ b/interface/web/admin/lib/lang/pl_language_add.lng @@ -2,7 +2,7 @@ $wb['list_head_txt'] = 'Dodaj nowy język'; $wb['language_select_txt'] = 'Wybierz domyślny język'; $wb['language_new_txt'] = 'Nowy język'; -$wb['language_new_hint_txt'] = '2 znakowe kodowanie języka ISO 639-1 (Zobacz http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)'; +$wb['language_new_hint_txt'] = '2 znakowe kodowanie języka ISO 639-1 (Zobacz https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)'; $wb['btn_save_txt'] = 'Utwórz nowy zbiór plików z językami'; $wb['btn_cancel_txt'] = 'Wróć'; ?> diff --git a/interface/web/admin/lib/lang/pl_remote_action.lng b/interface/web/admin/lib/lang/pl_remote_action.lng index 83fbc9e282a01a83ca99b4b1d15d6395af0613ed..884b2047d54293e9aae795e8c5737567c7022d54 100644 --- a/interface/web/admin/lib/lang/pl_remote_action.lng +++ b/interface/web/admin/lib/lang/pl_remote_action.lng @@ -2,11 +2,11 @@ $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 aptitude -y upgrade na wybranym serwerze.

UŻYWASZ JEJ NA WŁASNĄ ODPOWIEDZIALNOŚĆ!'; +$wb['do_osupdate_desc'] = 'Ta akcja wykona polecenie apt -y upgrade na wybranym serwerze.

UŻYWASZ JEJ NA WŁASNĄ ODPOWIEDZIALNOŚĆ!'; $wb['do_ispcupdate_caption'] = 'Wykonaj zdalną aktualizację ISPConfig 3 na serwerze'; $wb['do_ispcupdate_desc'] = 'Ta akcja przeprowadzi aktualizację ISPConfig3 na wybranym serwerze.

UŻYWASZ JEJ NA WŁASNĄ ODPOWIEDZIALNOŚĆ!'; $wb['action_scheduled'] = 'Akcja zaplanowana do wykonania'; $wb['select_all_server'] = 'Wszystkie serwery'; $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

ispconfig_update.sh

to start the ISPConfig update.

Click here for detailed update instructions'; +$wb['ispconfig_update_text'] = 'Login as root user on the shell of your server and execute the command

ispconfig_update.sh

to start the ISPConfig update.

Click here for detailed update instructions'; ?> diff --git a/interface/web/admin/lib/lang/pl_remote_user.lng b/interface/web/admin/lib/lang/pl_remote_user.lng index 5df48fb29b83bb7dbc667feb6af6963bc4332ea0..e5274930953f227946b8da0da480e5e0a9cca4a7 100644 --- a/interface/web/admin/lib/lang/pl_remote_user.lng +++ b/interface/web/admin/lib/lang/pl_remote_user.lng @@ -1,4 +1,5 @@ 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'; @@ -303,4 +324,23 @@ $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'; +$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['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/pl_server_ip.lng b/interface/web/admin/lib/lang/pl_server_ip.lng index cb16e104d5822d4b794b1a0d6410dd666545de8c..0e31866078b2f18d9315731f78e1d492ec57a379 100644 --- a/interface/web/admin/lib/lang/pl_server_ip.lng +++ b/interface/web/admin/lib/lang/pl_server_ip.lng @@ -1,4 +1,6 @@ diff --git a/interface/web/admin/lib/lang/pl_server_php_list.lng b/interface/web/admin/lib/lang/pl_server_php_list.lng index 62cbe6168714b18ba4fca490280c30c945e09e7c..291302cbb72f6b6ac12dc3e6cb95f18e9dcde90f 100644 --- a/interface/web/admin/lib/lang/pl_server_php_list.lng +++ b/interface/web/admin/lib/lang/pl_server_php_list.lng @@ -5,4 +5,5 @@ $wb['add_new_record_txt'] = 'Add new PHP version'; $wb['client_id_txt'] = 'Client'; $wb['name_txt'] = 'PHP Name'; $wb['active_txt'] = 'Active'; +$wb['usage_txt'] = 'Usage count'; ?> diff --git a/interface/web/admin/lib/lang/pl_software_package.lng b/interface/web/admin/lib/lang/pl_software_package.lng deleted file mode 100644 index faffe38217fb9cac04020e73e473c6c46e3caaa1..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/pl_software_package.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/pl_software_package_install.lng b/interface/web/admin/lib/lang/pl_software_package_install.lng deleted file mode 100644 index fd2f2930dde345143a239e3755d6c6e0bfe32470..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/pl_software_package_install.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/pl_software_package_list.lng b/interface/web/admin/lib/lang/pl_software_package_list.lng deleted file mode 100644 index cb47abc46d380b691323486a72343a62f531b3ce..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/pl_software_package_list.lng +++ /dev/null @@ -1,13 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/pl_software_repo.lng b/interface/web/admin/lib/lang/pl_software_repo.lng deleted file mode 100644 index 1cc3dbb61c0846e040754b5462bb40ccf7cad308..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/pl_software_repo.lng +++ /dev/null @@ -1,8 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/pl_software_repo_list.lng b/interface/web/admin/lib/lang/pl_software_repo_list.lng deleted file mode 100644 index 7ca6af9f9f43559891103a0c50ebd189da3f795b..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/pl_software_repo_list.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/pl_software_update_list.lng b/interface/web/admin/lib/lang/pl_software_update_list.lng deleted file mode 100644 index aa49fba4e72ce46c22c3ca7a2d0a23ee6728a8f9..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/pl_software_update_list.lng +++ /dev/null @@ -1,9 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/pl_system_config.lng b/interface/web/admin/lib/lang/pl_system_config.lng index a809251ec1bb6d301742d7f0f2c216db7a8f2f00..54312139770491061be918d60e0ab8b43ad5aec3 100644 --- a/interface/web/admin/lib/lang/pl_system_config.lng +++ b/interface/web/admin/lib/lang/pl_system_config.lng @@ -1,4 +1,5 @@ diff --git a/interface/web/admin/lib/lang/pl_users.lng b/interface/web/admin/lib/lang/pl_users.lng index e6dfcb57b294981b74b31cf62f96e1c5ad80885e..b879f671e298d52c7eb0b12136a074d5293fe35f 100644 --- a/interface/web/admin/lib/lang/pl_users.lng +++ b/interface/web/admin/lib/lang/pl_users.lng @@ -1,9 +1,10 @@ diff --git a/interface/web/admin/lib/lang/pt_directive_snippets.lng b/interface/web/admin/lib/lang/pt_directive_snippets.lng index 0616afad8b6c76c9eb284f57a673f6c35d286310..0f83e9415955f939b35dec4b9cd8023aa19b0968 100644 --- a/interface/web/admin/lib/lang/pt_directive_snippets.lng +++ b/interface/web/admin/lib/lang/pt_directive_snippets.lng @@ -8,5 +8,8 @@ $wb['directive_snippets_name_empty'] = 'Please specify a name for the snippet.'; $wb['directive_snippets_name_error_unique'] = 'There is already a directive snippet with this name.'; $wb['variables_txt'] = 'Variables'; $wb['customer_viewable_txt'] = 'Customer viewable'; -$wb['required_php_snippets_txt'] = 'Requiered PHP Snippet'; -?> +$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 diff --git a/interface/web/admin/lib/lang/pt_language_add.lng b/interface/web/admin/lib/lang/pt_language_add.lng index 7924ca3dc77e9f94f3359a0e20f8b3000550689e..4b0af663d0b3a240c80c94693fd352756a382fa5 100644 --- a/interface/web/admin/lib/lang/pt_language_add.lng +++ b/interface/web/admin/lib/lang/pt_language_add.lng @@ -2,7 +2,7 @@ $wb['list_head_txt'] = 'Adicionar Idioma'; $wb['language_select_txt'] = 'Seleccione o idioma base'; $wb['language_new_txt'] = 'Novo Idioma'; -$wb['language_new_hint_txt'] = '2 letras código ISO 639-1 (Veja http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)'; +$wb['language_new_hint_txt'] = '2 letras código ISO 639-1 (Veja https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)'; $wb['btn_save_txt'] = 'Criar um novo conjunto de idioma'; $wb['btn_cancel_txt'] = 'Voltar'; ?> diff --git a/interface/web/admin/lib/lang/pt_remote_action.lng b/interface/web/admin/lib/lang/pt_remote_action.lng index 3fc3eaf81f5d63a057aa0eecf965bfbdaf6af701..dfe56b616d5b3d18abd7eb9965b8c5602cb4354c 100644 --- a/interface/web/admin/lib/lang/pt_remote_action.lng +++ b/interface/web/admin/lib/lang/pt_remote_action.lng @@ -2,11 +2,11 @@ $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.

USE THIS AT YOUR OWN RISK!'; +$wb['do_osupdate_desc'] = 'This Action does a apt -y upgrade at your selected server.

USE THIS AT YOUR OWN RISK!'; $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.

USE THIS AT YOUR OWN RISK!'; $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

ispconfig_update.sh

to start the ISPConfig update.

Click here for detailed update instructions'; +$wb['ispconfig_update_text'] = 'Login as root user on the shell of your server and execute the command

ispconfig_update.sh

to start the ISPConfig update.

Click here for detailed update instructions'; ?> diff --git a/interface/web/admin/lib/lang/pt_remote_user.lng b/interface/web/admin/lib/lang/pt_remote_user.lng index f23a6abd5c5b37f78b84f0ebe93cd570f65bd8f8..24b4a5eac8bd1576773f866d482d27d3a09323d0 100644 --- a/interface/web/admin/lib/lang/pt_remote_user.lng +++ b/interface/web/admin/lib/lang/pt_remote_user.lng @@ -1,4 +1,5 @@ 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'; @@ -303,4 +324,23 @@ $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'; +$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['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/pt_server_ip.lng b/interface/web/admin/lib/lang/pt_server_ip.lng index 62f9ad351a5ce8a9d02f83d970c1e55782f382b4..8a3d00be6132edba87b2fdeefa7ed6aeffbe3821 100644 --- a/interface/web/admin/lib/lang/pt_server_ip.lng +++ b/interface/web/admin/lib/lang/pt_server_ip.lng @@ -1,4 +1,6 @@ diff --git a/interface/web/admin/lib/lang/pt_server_php_list.lng b/interface/web/admin/lib/lang/pt_server_php_list.lng index 62cbe6168714b18ba4fca490280c30c945e09e7c..291302cbb72f6b6ac12dc3e6cb95f18e9dcde90f 100644 --- a/interface/web/admin/lib/lang/pt_server_php_list.lng +++ b/interface/web/admin/lib/lang/pt_server_php_list.lng @@ -5,4 +5,5 @@ $wb['add_new_record_txt'] = 'Add new PHP version'; $wb['client_id_txt'] = 'Client'; $wb['name_txt'] = 'PHP Name'; $wb['active_txt'] = 'Active'; +$wb['usage_txt'] = 'Usage count'; ?> diff --git a/interface/web/admin/lib/lang/pt_software_package.lng b/interface/web/admin/lib/lang/pt_software_package.lng deleted file mode 100644 index faffe38217fb9cac04020e73e473c6c46e3caaa1..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/pt_software_package.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/pt_software_package_install.lng b/interface/web/admin/lib/lang/pt_software_package_install.lng deleted file mode 100644 index 5c8b756434ce27d67e479a96383bbee01bce4f1f..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/pt_software_package_install.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/pt_software_package_list.lng b/interface/web/admin/lib/lang/pt_software_package_list.lng deleted file mode 100644 index 1ec77bdd15f5403cd7bae71e328b56c5666f21ae..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/pt_software_package_list.lng +++ /dev/null @@ -1,13 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/pt_software_repo.lng b/interface/web/admin/lib/lang/pt_software_repo.lng deleted file mode 100644 index 436758e6871176d63b44f4eb812ebe2b945dc187..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/pt_software_repo.lng +++ /dev/null @@ -1,8 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/pt_software_repo_list.lng b/interface/web/admin/lib/lang/pt_software_repo_list.lng deleted file mode 100644 index 5afba6d5e354b883e14193e3b1e45af361fbd135..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/pt_software_repo_list.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/pt_software_update_list.lng b/interface/web/admin/lib/lang/pt_software_update_list.lng deleted file mode 100644 index 12fd9e2fa9106e1b1e6087fe06fc4dc641b1f71e..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/pt_software_update_list.lng +++ /dev/null @@ -1,9 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/pt_system_config.lng b/interface/web/admin/lib/lang/pt_system_config.lng index 6fc26344c002abc772de985e3a2b835fad1d5b94..8c995047b4f00b45eab26d1b8d85ba810c87e977 100644 --- a/interface/web/admin/lib/lang/pt_system_config.lng +++ b/interface/web/admin/lib/lang/pt_system_config.lng @@ -1,4 +1,5 @@ diff --git a/interface/web/admin/lib/lang/pt_users.lng b/interface/web/admin/lib/lang/pt_users.lng index 67cfe4f572cdce0ad2f301cf0000a069bf1f7a32..f1cf858176002e2589ad2ead532bbe05a6574ea9 100644 --- a/interface/web/admin/lib/lang/pt_users.lng +++ b/interface/web/admin/lib/lang/pt_users.lng @@ -1,9 +1,10 @@ diff --git a/interface/web/admin/lib/lang/ro_directive_snippets.lng b/interface/web/admin/lib/lang/ro_directive_snippets.lng index 0616afad8b6c76c9eb284f57a673f6c35d286310..0f83e9415955f939b35dec4b9cd8023aa19b0968 100644 --- a/interface/web/admin/lib/lang/ro_directive_snippets.lng +++ b/interface/web/admin/lib/lang/ro_directive_snippets.lng @@ -8,5 +8,8 @@ $wb['directive_snippets_name_empty'] = 'Please specify a name for the snippet.'; $wb['directive_snippets_name_error_unique'] = 'There is already a directive snippet with this name.'; $wb['variables_txt'] = 'Variables'; $wb['customer_viewable_txt'] = 'Customer viewable'; -$wb['required_php_snippets_txt'] = 'Requiered PHP Snippet'; -?> +$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 diff --git a/interface/web/admin/lib/lang/ro_firewall.lng b/interface/web/admin/lib/lang/ro_firewall.lng index e626345d3c1ee3bbce74ffd70c36fcc7ff3297c2..4b1efe7540a4d997bb0a814a68f437082f768122 100644 --- a/interface/web/admin/lib/lang/ro_firewall.lng +++ b/interface/web/admin/lib/lang/ro_firewall.lng @@ -6,6 +6,6 @@ $wb['tcp_port_help_txt'] = 'Separated by comma'; $wb['udp_port_help_txt'] = 'Separated by comma'; $wb['active_txt'] = 'Active'; $wb['firewall_error_unique'] = 'There is already a firewall record for this server.'; -$wb['tcp_ports_error_regex'] = 'Character not allowed in tcp port definition. Allowed characters are numbers, : and ,.'; -$wb['udp_ports_error_regex'] = 'Character not allowed in udp port definition. Allowed characters are numbers, : and ,.'; +$wb['tcp_ports_error_regex'] = 'Character not allowed in TCP port definition. Allowed characters are numbers, colons (:) and commas.'; +$wb['udp_ports_error_regex'] = 'Character not allowed in UDP port definition. Allowed characters are numbers, colons (:) and commas.'; ?> diff --git a/interface/web/admin/lib/lang/ro_language_add.lng b/interface/web/admin/lib/lang/ro_language_add.lng index dc6b2d1b725f9fc83a09377176200713adf99cb0..7c9464f47a31515213e738c04a8460b97c3674ad 100644 --- a/interface/web/admin/lib/lang/ro_language_add.lng +++ b/interface/web/admin/lib/lang/ro_language_add.lng @@ -2,7 +2,7 @@ $wb['list_head_txt'] = 'Add new language'; $wb['language_select_txt'] = 'Select language basis'; $wb['language_new_txt'] = 'New language'; -$wb['language_new_hint_txt'] = '2 characters ISO 639-1 language-code (See http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)'; +$wb['language_new_hint_txt'] = '2 characters ISO 639-1 language-code (See https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)'; $wb['btn_save_txt'] = 'Create new language file set'; $wb['btn_cancel_txt'] = 'Back'; ?> diff --git a/interface/web/admin/lib/lang/ro_remote_action.lng b/interface/web/admin/lib/lang/ro_remote_action.lng index 3fc3eaf81f5d63a057aa0eecf965bfbdaf6af701..dfe56b616d5b3d18abd7eb9965b8c5602cb4354c 100644 --- a/interface/web/admin/lib/lang/ro_remote_action.lng +++ b/interface/web/admin/lib/lang/ro_remote_action.lng @@ -2,11 +2,11 @@ $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.

USE THIS AT YOUR OWN RISK!'; +$wb['do_osupdate_desc'] = 'This Action does a apt -y upgrade at your selected server.

USE THIS AT YOUR OWN RISK!'; $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.

USE THIS AT YOUR OWN RISK!'; $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

ispconfig_update.sh

to start the ISPConfig update.

Click here for detailed update instructions'; +$wb['ispconfig_update_text'] = 'Login as root user on the shell of your server and execute the command

ispconfig_update.sh

to start the ISPConfig update.

Click here for detailed update instructions'; ?> diff --git a/interface/web/admin/lib/lang/ro_remote_user.lng b/interface/web/admin/lib/lang/ro_remote_user.lng index d0504005e310ec5464c4c9fda2eb637bd008f75a..98670aea070653a7d752c9724c08db8efbf97196 100644 --- a/interface/web/admin/lib/lang/ro_remote_user.lng +++ b/interface/web/admin/lib/lang/ro_remote_user.lng @@ -1,4 +1,5 @@ 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'; @@ -303,4 +324,23 @@ $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'; +$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['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/ro_server_ip.lng b/interface/web/admin/lib/lang/ro_server_ip.lng index 88d8a2f6043c7655289f1cc985fa40a20aa36393..1947d3ec371178e804086ad8b872b8bdeccb538f 100644 --- a/interface/web/admin/lib/lang/ro_server_ip.lng +++ b/interface/web/admin/lib/lang/ro_server_ip.lng @@ -1,4 +1,6 @@ diff --git a/interface/web/admin/lib/lang/ro_server_php_list.lng b/interface/web/admin/lib/lang/ro_server_php_list.lng index 62cbe6168714b18ba4fca490280c30c945e09e7c..291302cbb72f6b6ac12dc3e6cb95f18e9dcde90f 100644 --- a/interface/web/admin/lib/lang/ro_server_php_list.lng +++ b/interface/web/admin/lib/lang/ro_server_php_list.lng @@ -5,4 +5,5 @@ $wb['add_new_record_txt'] = 'Add new PHP version'; $wb['client_id_txt'] = 'Client'; $wb['name_txt'] = 'PHP Name'; $wb['active_txt'] = 'Active'; +$wb['usage_txt'] = 'Usage count'; ?> diff --git a/interface/web/admin/lib/lang/ro_software_package.lng b/interface/web/admin/lib/lang/ro_software_package.lng deleted file mode 100644 index faffe38217fb9cac04020e73e473c6c46e3caaa1..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/ro_software_package.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/ro_software_package_install.lng b/interface/web/admin/lib/lang/ro_software_package_install.lng deleted file mode 100644 index 5c8b756434ce27d67e479a96383bbee01bce4f1f..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/ro_software_package_install.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/ro_software_package_list.lng b/interface/web/admin/lib/lang/ro_software_package_list.lng deleted file mode 100644 index 4a8dcbcbf09d1141554f5f73e6a0cea790911448..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/ro_software_package_list.lng +++ /dev/null @@ -1,13 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/ro_software_repo.lng b/interface/web/admin/lib/lang/ro_software_repo.lng deleted file mode 100644 index f2cbbb2c25776ab5f1794e7102ad264a98144049..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/ro_software_repo.lng +++ /dev/null @@ -1,8 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/ro_software_repo_list.lng b/interface/web/admin/lib/lang/ro_software_repo_list.lng deleted file mode 100644 index b7a219ffa8e2f6d389fabdc5386286a24fc2a11a..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/ro_software_repo_list.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/ro_software_update_list.lng b/interface/web/admin/lib/lang/ro_software_update_list.lng deleted file mode 100644 index 1e85d6de5f373ca10133099e354f59a3debe33f1..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/ro_software_update_list.lng +++ /dev/null @@ -1,9 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/ro_system_config.lng b/interface/web/admin/lib/lang/ro_system_config.lng index 2a39a454e8cde25155f4e6cbf2c0abfd9212a692..9fd8e4d587774a0cddee588a167634ed9f3267cb 100644 --- a/interface/web/admin/lib/lang/ro_system_config.lng +++ b/interface/web/admin/lib/lang/ro_system_config.lng @@ -1,4 +1,5 @@ diff --git a/interface/web/admin/lib/lang/ro_users.lng b/interface/web/admin/lib/lang/ro_users.lng index dcbc4f4727145c78a9a6a70b4ac3cca5b3ecc0c7..d4acbf4e807d1a9ad740c14e6c5bfbdd12d1d594 100644 --- a/interface/web/admin/lib/lang/ro_users.lng +++ b/interface/web/admin/lib/lang/ro_users.lng @@ -1,9 +1,10 @@ diff --git a/interface/web/admin/lib/lang/ro_users_list.lng b/interface/web/admin/lib/lang/ro_users_list.lng index 13d839ec42b7f6b9772c8ac0b7c6912f4c7d990f..a69fd3dccf08c306532bbfe1fc7206bff8cdc085 100644 --- a/interface/web/admin/lib/lang/ro_users_list.lng +++ b/interface/web/admin/lib/lang/ro_users_list.lng @@ -4,6 +4,6 @@ $wb['username_txt'] = 'Username'; $wb['client_id_txt'] = 'Client ID'; $wb['active_txt'] = 'Active'; $wb['add_new_record_txt'] = 'Add user nou'; -$wb['warning_txt'] = 'WARNING: Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +$wb['warning_txt'] = 'WARNING: Do not edit or modify any client user settings here. Use the client- and reseller settings in the client module instead. Modifying or changing client users or groups here may cause data loss!'; $wb['groups_txt'] = 'Groups'; ?> diff --git a/interface/web/admin/lib/lang/ru_directive_snippets.lng b/interface/web/admin/lib/lang/ru_directive_snippets.lng index cfa09a02fcb1ea396c0c8a7257ae673a31e281fa..eb1b8c884cc252ab4ea946181b74ff9473dc96de 100644 --- a/interface/web/admin/lib/lang/ru_directive_snippets.lng +++ b/interface/web/admin/lib/lang/ru_directive_snippets.lng @@ -9,4 +9,7 @@ $wb['directive_snippets_name_error_unique'] = 'Уже есть заготовк $wb['variables_txt'] = 'Переменные:'; $wb['customer_viewable_txt'] = 'Видимый клиентам'; $wb['required_php_snippets_txt'] = 'Обязательная PHP-заготовка'; -?> +$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 diff --git a/interface/web/admin/lib/lang/ru_firewall.lng b/interface/web/admin/lib/lang/ru_firewall.lng index 70beb30437001e94beb6109e8c518019a5d6059f..179ad739bad695d6b349d19177273cc8f2c2c75f 100644 --- a/interface/web/admin/lib/lang/ru_firewall.lng +++ b/interface/web/admin/lib/lang/ru_firewall.lng @@ -6,6 +6,6 @@ $wb['tcp_port_help_txt'] = 'Перечислить порты TCP через з $wb['udp_port_help_txt'] = 'Перечислить порты UDP через запятую'; $wb['active_txt'] = 'Активно'; $wb['firewall_error_unique'] = 'Уже есть такая запись брандмауэра для этого сервера.'; -$wb['tcp_ports_error_regex'] = 'Недопустимый символ в указании tcp порта. Корректные сиволы - цифры, \\":\\" и \\",\\"'; +$wb['tcp_ports_error_regex'] = 'Недопустимый символ в указании TCP порта. Корректные сиволы - цифры, \\":\\" и \\",\\"'; $wb['udp_ports_error_regex'] = 'Некорректный символ в указании UDP порта. Допустимые сиволы - цифры, \\":\\" и \\",\\"'; ?> diff --git a/interface/web/admin/lib/lang/ru_remote_action.lng b/interface/web/admin/lib/lang/ru_remote_action.lng index fdd0037fabfef10eb712ea7650f099cdb8c20779..f9d10afc53873d8670b06aba9649012d29690ced 100644 --- a/interface/web/admin/lib/lang/ru_remote_action.lng +++ b/interface/web/admin/lib/lang/ru_remote_action.lng @@ -2,11 +2,11 @@ $wb['select_server_txt'] = 'Выбор сервера'; $wb['btn_do_txt'] = 'Выполнить действие'; $wb['do_osupdate_caption'] = 'Обновление ОС на удалённом сервере'; -$wb['do_osupdate_desc'] = 'Это действие выполнит aptitude -y upgrade на выбранном сервере.

ИСПОЛЬЗУЙТЕ ЭТО НА СВОЙ СТРАХ И РИСК!'; +$wb['do_osupdate_desc'] = 'Это действие выполнит apt -y upgrade на выбранном сервере.

ИСПОЛЬЗУЙТЕ ЭТО НА СВОЙ СТРАХ И РИСК!'; $wb['do_ispcupdate_caption'] = 'Запуск обновления ISPConfig 3 на удалённом сервере'; $wb['do_ispcupdate_desc'] = 'Это действие выполнит обновление ISPConfig 3 на выбранном сервере.

ИСПОЛЬЗУЙТЕ ЭТО НА СВОЙ СТРАХ И РИСК!'; $wb['action_scheduled'] = 'Действие запланировано на выполнение'; $wb['select_all_server'] = 'Все сервера'; $wb['ispconfig_update_title'] = 'Инструкции по обновлению ISPConfig'; -$wb['ispconfig_update_text'] = 'Войдите в систему вашего сервера как корневой пользователь Shell и выполнить команду

ispconfig_update.sh

чтобы начать обновление ISPConfig.

Нажмите здесь для получения подробных инструкций по обновлению'; +$wb['ispconfig_update_text'] = 'Войдите в систему вашего сервера как корневой пользователь Shell и выполнить команду

ispconfig_update.sh

чтобы начать обновление ISPConfig.

Нажмите здесь для получения подробных инструкций по обновлению'; ?> diff --git a/interface/web/admin/lib/lang/ru_remote_user.lng b/interface/web/admin/lib/lang/ru_remote_user.lng index 2d556b0800746f8a59543fd95b05a69f5697260a..ea3d502a6a86adc888b77de87158fa6264157b22 100644 --- a/interface/web/admin/lib/lang/ru_remote_user.lng +++ b/interface/web/admin/lib/lang/ru_remote_user.lng @@ -1,4 +1,5 @@ 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'; @@ -303,4 +324,23 @@ $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'; +$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['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/ru_server_ip.lng b/interface/web/admin/lib/lang/ru_server_ip.lng index fd82e2efa17cb5d0eda5af34950995c9f1a6417a..f874ba1bbddda825ddebcad91d7b3861a3d77ea0 100644 --- a/interface/web/admin/lib/lang/ru_server_ip.lng +++ b/interface/web/admin/lib/lang/ru_server_ip.lng @@ -1,4 +1,6 @@ diff --git a/interface/web/admin/lib/lang/ru_server_php_list.lng b/interface/web/admin/lib/lang/ru_server_php_list.lng index 5c84917f1595a92c227b67e6a66749da72e1e835..5be582f23daf324d4ba7e90203d074a73a081641 100644 --- a/interface/web/admin/lib/lang/ru_server_php_list.lng +++ b/interface/web/admin/lib/lang/ru_server_php_list.lng @@ -5,4 +5,5 @@ $wb['add_new_record_txt'] = 'Добавить новую версию PHP'; $wb['client_id_txt'] = 'ID Клиента'; $wb['name_txt'] = 'Имя PHP'; $wb['active_txt'] = 'Active'; +$wb['usage_txt'] = 'Usage count'; ?> diff --git a/interface/web/admin/lib/lang/ru_software_package.lng b/interface/web/admin/lib/lang/ru_software_package.lng deleted file mode 100644 index 490184dd9273e48d69c9cecfdd313c95684a75f3..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/ru_software_package.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/ru_software_package_install.lng b/interface/web/admin/lib/lang/ru_software_package_install.lng deleted file mode 100644 index 21efc7d5629d6f3eb9f561786eff2858d8afd2c8..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/ru_software_package_install.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/ru_software_package_list.lng b/interface/web/admin/lib/lang/ru_software_package_list.lng deleted file mode 100644 index 791cfa33aed4e3141df8a82bf1c4a0f6d9dbb27f..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/ru_software_package_list.lng +++ /dev/null @@ -1,13 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/ru_software_repo.lng b/interface/web/admin/lib/lang/ru_software_repo.lng deleted file mode 100644 index 5aec8763c173d4ac73419c725857b0978e1b8743..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/ru_software_repo.lng +++ /dev/null @@ -1,8 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/ru_software_repo_list.lng b/interface/web/admin/lib/lang/ru_software_repo_list.lng deleted file mode 100644 index ed307454aef1042f662726326029eb9ed541340f..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/ru_software_repo_list.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/ru_software_update_list.lng b/interface/web/admin/lib/lang/ru_software_update_list.lng deleted file mode 100644 index dde28811d537a8d95b07736564cae1f6d81659cd..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/ru_software_update_list.lng +++ /dev/null @@ -1,9 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/ru_system_config.lng b/interface/web/admin/lib/lang/ru_system_config.lng index baed497b0eb238c8e3709656bbabc5a0842711c7..55c87315158fe9aab11d24c8608829b9db1040cf 100644 --- a/interface/web/admin/lib/lang/ru_system_config.lng +++ b/interface/web/admin/lib/lang/ru_system_config.lng @@ -1,4 +1,5 @@ diff --git a/interface/web/admin/lib/lang/ru_users.lng b/interface/web/admin/lib/lang/ru_users.lng index 63f081f91707cd8faab397f0c0679fdbe73de4ed..5d67479d701ba0f83803f00a81a8e1a3c2bb0d7f 100644 --- a/interface/web/admin/lib/lang/ru_users.lng +++ b/interface/web/admin/lib/lang/ru_users.lng @@ -1,7 +1,8 @@ diff --git a/interface/web/admin/lib/lang/se_directive_snippets.lng b/interface/web/admin/lib/lang/se_directive_snippets.lng index 0616afad8b6c76c9eb284f57a673f6c35d286310..0f83e9415955f939b35dec4b9cd8023aa19b0968 100644 --- a/interface/web/admin/lib/lang/se_directive_snippets.lng +++ b/interface/web/admin/lib/lang/se_directive_snippets.lng @@ -8,5 +8,8 @@ $wb['directive_snippets_name_empty'] = 'Please specify a name for the snippet.'; $wb['directive_snippets_name_error_unique'] = 'There is already a directive snippet with this name.'; $wb['variables_txt'] = 'Variables'; $wb['customer_viewable_txt'] = 'Customer viewable'; -$wb['required_php_snippets_txt'] = 'Requiered PHP Snippet'; -?> +$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 diff --git a/interface/web/admin/lib/lang/se_firewall.lng b/interface/web/admin/lib/lang/se_firewall.lng index 123a648300bc9d158e2ca319a1819619f4f96c52..fdbfa5ee14b33f90408c356e6d6868b6e3d8d030 100644 --- a/interface/web/admin/lib/lang/se_firewall.lng +++ b/interface/web/admin/lib/lang/se_firewall.lng @@ -6,6 +6,6 @@ $wb['tcp_port_help_txt'] = 'Kommaseparerade'; $wb['udp_port_help_txt'] = 'Kommaseparerade'; $wb['active_txt'] = 'Aktiv'; $wb['firewall_error_unique'] = 'Det finns redan ett brandväggsinlägg för den här servern'; -$wb['tcp_ports_error_regex'] = 'Character not allowed in tcp port definition. Allowed characters are numbers, : and ,.'; -$wb['udp_ports_error_regex'] = 'Character not allowed in udp port definition. Allowed characters are numbers, : and ,.'; +$wb['tcp_ports_error_regex'] = 'Character not allowed in TCP port definition. Allowed characters are numbers, colons (:) and commas.'; +$wb['udp_ports_error_regex'] = 'Character not allowed in UDP port definition. Allowed characters are numbers, colons (:) and commas.'; ?> diff --git a/interface/web/admin/lib/lang/se_language_add.lng b/interface/web/admin/lib/lang/se_language_add.lng index 59dbeeed35038e102bc698f94b3b5424d257d549..ccf696d7bf5d6bad9601e6049220a14f0fba124f 100644 --- a/interface/web/admin/lib/lang/se_language_add.lng +++ b/interface/web/admin/lib/lang/se_language_add.lng @@ -4,5 +4,5 @@ $wb['language_select_txt'] = 'Välj språkbas'; $wb['language_new_txt'] = 'Nytt språk'; $wb['btn_save_txt'] = 'Skapa nya språkfiler'; $wb['btn_cancel_txt'] = 'Tillbaka'; -$wb['language_new_hint_txt'] = '2 characters ISO 639-1 language-code (See http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)'; +$wb['language_new_hint_txt'] = '2 characters ISO 639-1 language-code (See https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)'; ?> diff --git a/interface/web/admin/lib/lang/se_remote_action.lng b/interface/web/admin/lib/lang/se_remote_action.lng index 68d2bbd4c3aa3ffde593609e81df370c381fc0d5..9aeb7d9ba3c3e193cbd625b3aebcc1bcbb2e9f97 100644 --- a/interface/web/admin/lib/lang/se_remote_action.lng +++ b/interface/web/admin/lib/lang/se_remote_action.lng @@ -2,11 +2,11 @@ $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.

USE THIS AT YOUR OWN RISK!'; +$wb['do_osupdate_desc'] = 'This Action does a apt -y upgrade at your selected server.

USE THIS AT YOUR OWN RISK!'; $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.

USE THIS AT YOUR OWN RISK!'; $wb['action_scheduled'] = 'Handlingen är schemalagd att utföras'; $wb['select_all_server'] = 'Alla servrar'; $wb['ispconfig_update_title'] = 'ISPConfig uppdateringsinstruktioner'; -$wb['ispconfig_update_text'] = 'Logga in som root på din server och kör kommandot

ispconfig_update.sh

för att påbörja ISPConfig-uppdateringen.

Klicka här för detaljerade instruktioner'; +$wb['ispconfig_update_text'] = 'Logga in som root på din server och kör kommandot

ispconfig_update.sh

för att påbörja ISPConfig-uppdateringen.

Klicka här för detaljerade instruktioner'; ?> diff --git a/interface/web/admin/lib/lang/se_remote_user.lng b/interface/web/admin/lib/lang/se_remote_user.lng index 657e5878f1ad5af6ea9fa6e5a470574164713430..f6600173fe6300f4780ddfefdfbfb5038d6cd651 100644 --- a/interface/web/admin/lib/lang/se_remote_user.lng +++ b/interface/web/admin/lib/lang/se_remote_user.lng @@ -1,4 +1,5 @@ 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'; @@ -303,4 +324,23 @@ $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'; +$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['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/se_server_ip.lng b/interface/web/admin/lib/lang/se_server_ip.lng index c6f92d8b60d66a1d1726f1c872baf5a60acecbb7..09bc3b593a126b37cd9700515c8428ed1fa6d53c 100644 --- a/interface/web/admin/lib/lang/se_server_ip.lng +++ b/interface/web/admin/lib/lang/se_server_ip.lng @@ -1,4 +1,6 @@ diff --git a/interface/web/admin/lib/lang/se_server_php_list.lng b/interface/web/admin/lib/lang/se_server_php_list.lng index 451236d1ca04167a47fa44e8ff1e0ac74cf8e9e1..b2f8b5511219e8538d8e1ad32d24d01c0d656245 100644 --- a/interface/web/admin/lib/lang/se_server_php_list.lng +++ b/interface/web/admin/lib/lang/se_server_php_list.lng @@ -5,4 +5,5 @@ $wb['add_new_record_txt'] = 'Lägg till ny PHP-version'; $wb['client_id_txt'] = 'Kund'; $wb['name_txt'] = 'PHP-namn'; $wb['active_txt'] = 'Active'; +$wb['usage_txt'] = 'Usage count'; ?> diff --git a/interface/web/admin/lib/lang/se_software_package.lng b/interface/web/admin/lib/lang/se_software_package.lng deleted file mode 100644 index 086902db0cbddab5c57150f462e0583e020903a6..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/se_software_package.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/se_software_package_install.lng b/interface/web/admin/lib/lang/se_software_package_install.lng deleted file mode 100644 index 434fc4bc98139ec1e01a513bd4cd8036e446edb7..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/se_software_package_install.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/se_software_package_list.lng b/interface/web/admin/lib/lang/se_software_package_list.lng deleted file mode 100644 index c0222e1ba4fb975e56722d0080afde3d734e0cfb..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/se_software_package_list.lng +++ /dev/null @@ -1,13 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/se_software_repo.lng b/interface/web/admin/lib/lang/se_software_repo.lng deleted file mode 100644 index a0e0de6822419055beee042cb8df66b7532d9984..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/se_software_repo.lng +++ /dev/null @@ -1,8 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/se_software_repo_list.lng b/interface/web/admin/lib/lang/se_software_repo_list.lng deleted file mode 100644 index b7a219ffa8e2f6d389fabdc5386286a24fc2a11a..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/se_software_repo_list.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/se_software_update_list.lng b/interface/web/admin/lib/lang/se_software_update_list.lng deleted file mode 100644 index 0cf7c0eddc2c9c336c80085af3a5cb98b0f0d806..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/se_software_update_list.lng +++ /dev/null @@ -1,9 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/se_system_config.lng b/interface/web/admin/lib/lang/se_system_config.lng index 74ae16734fcf6936765dc7b6f59eab95a86a8f23..d3de89aa55885efa8990e9caf4c095acaf7c20d7 100644 --- a/interface/web/admin/lib/lang/se_system_config.lng +++ b/interface/web/admin/lib/lang/se_system_config.lng @@ -1,4 +1,5 @@ diff --git a/interface/web/admin/lib/lang/se_users.lng b/interface/web/admin/lib/lang/se_users.lng index ac56cdf083565792415fdd170f839eddfc6e7743..a8baa7ee79886fdcd1cb201adef121b9637e42c0 100644 --- a/interface/web/admin/lib/lang/se_users.lng +++ b/interface/web/admin/lib/lang/se_users.lng @@ -1,7 +1,8 @@ diff --git a/interface/web/admin/lib/lang/se_users_list.lng b/interface/web/admin/lib/lang/se_users_list.lng index a6580d3089ca9caa7b40a1cbe11109f187e9292d..a778d44a2e2268ddcdb2a68e43d38e02f1b0f8c2 100644 --- a/interface/web/admin/lib/lang/se_users_list.lng +++ b/interface/web/admin/lib/lang/se_users_list.lng @@ -4,6 +4,6 @@ $wb['username_txt'] = 'Användarnamn'; $wb['client_id_txt'] = 'Kund-ID'; $wb['active_txt'] = 'Aktiv'; $wb['add_new_record_txt'] = 'Lägg till ny användare'; -$wb['warning_txt'] = 'VARNING: Ändra inte några användarinställningar här. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +$wb['warning_txt'] = 'VARNING: Ändra inte några användarinställningar här. Use the Client- and Reseller settings in the Client module instead. Modifying or changing users or groups here may cause data loss!'; $wb['groups_txt'] = 'Grupper'; ?> diff --git a/interface/web/admin/lib/lang/sk_directive_snippets.lng b/interface/web/admin/lib/lang/sk_directive_snippets.lng index 0616afad8b6c76c9eb284f57a673f6c35d286310..0f83e9415955f939b35dec4b9cd8023aa19b0968 100644 --- a/interface/web/admin/lib/lang/sk_directive_snippets.lng +++ b/interface/web/admin/lib/lang/sk_directive_snippets.lng @@ -8,5 +8,8 @@ $wb['directive_snippets_name_empty'] = 'Please specify a name for the snippet.'; $wb['directive_snippets_name_error_unique'] = 'There is already a directive snippet with this name.'; $wb['variables_txt'] = 'Variables'; $wb['customer_viewable_txt'] = 'Customer viewable'; -$wb['required_php_snippets_txt'] = 'Requiered PHP Snippet'; -?> +$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 diff --git a/interface/web/admin/lib/lang/sk_language_add.lng b/interface/web/admin/lib/lang/sk_language_add.lng index d7dbd28fbcd7ad36b86778af8d6e493097a8c754..484fa384562856a58c995924ee5fef1e31d9ce47 100644 --- a/interface/web/admin/lib/lang/sk_language_add.lng +++ b/interface/web/admin/lib/lang/sk_language_add.lng @@ -2,7 +2,7 @@ $wb['list_head_txt'] = 'Pridať nový jazyk'; $wb['language_select_txt'] = 'Vyberte základ jazyka'; $wb['language_new_txt'] = 'Nový jazyk'; -$wb['language_new_hint_txt'] = '2 znaky ISO 639-1 jazyka-kódu (See http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)'; +$wb['language_new_hint_txt'] = '2 znaky ISO 639-1 jazyka-kódu (See https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)'; $wb['btn_save_txt'] = 'Vytvoriť nový jazykový súbor'; $wb['btn_cancel_txt'] = 'Späť'; ?> diff --git a/interface/web/admin/lib/lang/sk_remote_action.lng b/interface/web/admin/lib/lang/sk_remote_action.lng index 3fc3eaf81f5d63a057aa0eecf965bfbdaf6af701..dfe56b616d5b3d18abd7eb9965b8c5602cb4354c 100644 --- a/interface/web/admin/lib/lang/sk_remote_action.lng +++ b/interface/web/admin/lib/lang/sk_remote_action.lng @@ -2,11 +2,11 @@ $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.

USE THIS AT YOUR OWN RISK!'; +$wb['do_osupdate_desc'] = 'This Action does a apt -y upgrade at your selected server.

USE THIS AT YOUR OWN RISK!'; $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.

USE THIS AT YOUR OWN RISK!'; $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

ispconfig_update.sh

to start the ISPConfig update.

Click here for detailed update instructions'; +$wb['ispconfig_update_text'] = 'Login as root user on the shell of your server and execute the command

ispconfig_update.sh

to start the ISPConfig update.

Click here for detailed update instructions'; ?> diff --git a/interface/web/admin/lib/lang/sk_remote_user.lng b/interface/web/admin/lib/lang/sk_remote_user.lng index 200cd288613a6e1a0e6144ac11dccdf5d2685313..d6cee727572c01f4c89a9fcdbc6848af5b6b235f 100644 --- a/interface/web/admin/lib/lang/sk_remote_user.lng +++ b/interface/web/admin/lib/lang/sk_remote_user.lng @@ -1,4 +1,5 @@ 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'; @@ -303,4 +324,23 @@ $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'; +$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['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/sk_server_ip.lng b/interface/web/admin/lib/lang/sk_server_ip.lng index 65915cc56b803ee0291d9514d2410eb2a6c885e7..02f84ded4c462f04133eae562e404561d48c03b3 100644 --- a/interface/web/admin/lib/lang/sk_server_ip.lng +++ b/interface/web/admin/lib/lang/sk_server_ip.lng @@ -1,4 +1,6 @@ diff --git a/interface/web/admin/lib/lang/sk_server_php_list.lng b/interface/web/admin/lib/lang/sk_server_php_list.lng index 62cbe6168714b18ba4fca490280c30c945e09e7c..291302cbb72f6b6ac12dc3e6cb95f18e9dcde90f 100644 --- a/interface/web/admin/lib/lang/sk_server_php_list.lng +++ b/interface/web/admin/lib/lang/sk_server_php_list.lng @@ -5,4 +5,5 @@ $wb['add_new_record_txt'] = 'Add new PHP version'; $wb['client_id_txt'] = 'Client'; $wb['name_txt'] = 'PHP Name'; $wb['active_txt'] = 'Active'; +$wb['usage_txt'] = 'Usage count'; ?> diff --git a/interface/web/admin/lib/lang/sk_software_package.lng b/interface/web/admin/lib/lang/sk_software_package.lng deleted file mode 100644 index faffe38217fb9cac04020e73e473c6c46e3caaa1..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/sk_software_package.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/sk_software_package_install.lng b/interface/web/admin/lib/lang/sk_software_package_install.lng deleted file mode 100644 index 5c8b756434ce27d67e479a96383bbee01bce4f1f..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/sk_software_package_install.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/sk_software_package_list.lng b/interface/web/admin/lib/lang/sk_software_package_list.lng deleted file mode 100644 index 502a3a2237707e5c196a6b6523743c118fb02870..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/sk_software_package_list.lng +++ /dev/null @@ -1,13 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/sk_software_repo.lng b/interface/web/admin/lib/lang/sk_software_repo.lng deleted file mode 100644 index 263614f50c2b62177cdaf21eb27de6d42b6adc64..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/sk_software_repo.lng +++ /dev/null @@ -1,8 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/sk_software_repo_list.lng b/interface/web/admin/lib/lang/sk_software_repo_list.lng deleted file mode 100644 index c77d4a3846eb7cbcdd5aa639f7c63e96aba501ee..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/sk_software_repo_list.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/sk_software_update_list.lng b/interface/web/admin/lib/lang/sk_software_update_list.lng deleted file mode 100644 index 9a04707c3ed2dc48e79ece8016eab73babe8f86e..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/sk_software_update_list.lng +++ /dev/null @@ -1,9 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/sk_system_config.lng b/interface/web/admin/lib/lang/sk_system_config.lng index 90418e87d5562c20909e541fa9bcfcdf0fc1f0db..1e85adca8c12ef1437dc598ef610d33c526436ab 100644 --- a/interface/web/admin/lib/lang/sk_system_config.lng +++ b/interface/web/admin/lib/lang/sk_system_config.lng @@ -1,4 +1,5 @@ diff --git a/interface/web/admin/lib/lang/sk_users.lng b/interface/web/admin/lib/lang/sk_users.lng index d71952fa3ed2dc9379579b758e330e93a2cc77df..f0c863d749ed2190a06956dd65b6c7f2c6a99c5b 100644 --- a/interface/web/admin/lib/lang/sk_users.lng +++ b/interface/web/admin/lib/lang/sk_users.lng @@ -1,9 +1,10 @@ diff --git a/interface/web/admin/lib/lang/sk_users_list.lng b/interface/web/admin/lib/lang/sk_users_list.lng index 52bfd29d57304db1e3d5bc88d93b4a02a83f1c73..49746bddaf252d746f2b72a12ff4e77f83185617 100644 --- a/interface/web/admin/lib/lang/sk_users_list.lng +++ b/interface/web/admin/lib/lang/sk_users_list.lng @@ -4,6 +4,6 @@ $wb['username_txt'] = 'Užívateľské meno'; $wb['client_id_txt'] = 'Client ID'; $wb['active_txt'] = 'Active'; $wb['add_new_record_txt'] = 'Pridať nového užívateľa'; -$wb['warning_txt'] = 'WARNING: Do not edit or modify any user settings here. Use the Client- and Reseller settings in the Client module instead. Modifying or changing Users or groups here may cause data loss!'; +$wb['warning_txt'] = 'WARNING: Do not edit or modify any client user settings here. Use the client- and reseller settings in the client module instead. Modifying or changing client users or groups here may cause data loss!'; $wb['groups_txt'] = 'Groups'; ?> diff --git a/interface/web/admin/lib/lang/tr_directive_snippets.lng b/interface/web/admin/lib/lang/tr_directive_snippets.lng index 448d4536723307c96f69f5a704e7b9a889072536..d9efa8031b9d34057fec55de68a11eb1079c5628 100644 --- a/interface/web/admin/lib/lang/tr_directive_snippets.lng +++ b/interface/web/admin/lib/lang/tr_directive_snippets.lng @@ -9,4 +9,7 @@ $wb['directive_snippets_name_error_unique'] = 'Aynı adlı bir yönerge kod par $wb['variables_txt'] = 'Değişkenler'; $wb['customer_viewable_txt'] = 'Müşteri görebilir'; $wb['required_php_snippets_txt'] = 'Gerekli PHP Parçası'; -?> +$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 diff --git a/interface/web/admin/lib/lang/tr_language_add.lng b/interface/web/admin/lib/lang/tr_language_add.lng index deaf9c141a280a1c1231ae3e740df5d7d4281c01..1480a69573fecb4a6be6fdb67ba52f09e612f128 100644 --- a/interface/web/admin/lib/lang/tr_language_add.lng +++ b/interface/web/admin/lib/lang/tr_language_add.lng @@ -2,7 +2,7 @@ $wb['list_head_txt'] = 'Dil Ekleme'; $wb['language_select_txt'] = 'Dil Kaynağını Seçin'; $wb['language_new_txt'] = 'Eklenecek Dil Kodu'; -$wb['language_new_hint_txt'] = '2 karakterden oluşan ISO 639-1 dil kodu (Ayrıntılı bilgi almak için: http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)'; +$wb['language_new_hint_txt'] = '2 karakterden oluşan ISO 639-1 dil kodu (Ayrıntılı bilgi almak için: https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)'; $wb['btn_save_txt'] = 'Dil Paketi Oluştur'; $wb['btn_cancel_txt'] = 'Geri'; ?> diff --git a/interface/web/admin/lib/lang/tr_remote_user.lng b/interface/web/admin/lib/lang/tr_remote_user.lng index a713cad0d44a15f1741480fbdd6aad2062d23632..5c2746f7ccf0c88ffd72c0694547576d8374b34c 100644 --- a/interface/web/admin/lib/lang/tr_remote_user.lng +++ b/interface/web/admin/lib/lang/tr_remote_user.lng @@ -1,4 +1,5 @@ Yeniden Eşitle komutunu kullanın. Apache için, erişim ve hata günlükleri anonimleştirilebilir. nginx için, only erişim günlüğü anonimleştirilebilir, hata günlüğüne IP adresleri kaydedilir.'; $wb['log_retention_txt'] = 'Günlük Tutma Süresi (Gün)'; $wb['log_retention_error_ispositive'] = 'Günlük tutma süresi 0 değerinden büyük bir sayı olmalıdır'; +$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'; +$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['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/tr_server_ip.lng b/interface/web/admin/lib/lang/tr_server_ip.lng index 4b2cb1187d410b70e40e8d71611bb16b82557865..1f31bd39325a3b1f913389120f3bba560529fd23 100644 --- a/interface/web/admin/lib/lang/tr_server_ip.lng +++ b/interface/web/admin/lib/lang/tr_server_ip.lng @@ -1,4 +1,6 @@ diff --git a/interface/web/admin/lib/lang/tr_server_php_list.lng b/interface/web/admin/lib/lang/tr_server_php_list.lng index 06319e9855ce0a8f4971c5b9c858c191daaca84c..4468e7ead9ba1e7695c6c5125884a91c12624e51 100644 --- a/interface/web/admin/lib/lang/tr_server_php_list.lng +++ b/interface/web/admin/lib/lang/tr_server_php_list.lng @@ -5,4 +5,5 @@ $wb['add_new_record_txt'] = 'PHP Sürümü Ekle'; $wb['client_id_txt'] = 'Müşteri'; $wb['name_txt'] = 'PHP Adı'; $wb['active_txt'] = 'Etkin'; +$wb['usage_txt'] = 'Usage count'; ?> diff --git a/interface/web/admin/lib/lang/tr_software_package.lng b/interface/web/admin/lib/lang/tr_software_package.lng deleted file mode 100644 index addda60195a1bb25f115b50b835b59153eea8030..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/tr_software_package.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/tr_software_package_install.lng b/interface/web/admin/lib/lang/tr_software_package_install.lng deleted file mode 100644 index fe7dd26e735ac376fc846b932c0cc806d9347eed..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/tr_software_package_install.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/tr_software_package_list.lng b/interface/web/admin/lib/lang/tr_software_package_list.lng deleted file mode 100644 index 1838ff94cfc3b7f0e87cfd68f1bb25da551f4988..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/tr_software_package_list.lng +++ /dev/null @@ -1,13 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/tr_software_repo.lng b/interface/web/admin/lib/lang/tr_software_repo.lng deleted file mode 100644 index 13e113967fad2f6fe9ef10ee1d190abc9ab7fd23..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/tr_software_repo.lng +++ /dev/null @@ -1,8 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/tr_software_repo_list.lng b/interface/web/admin/lib/lang/tr_software_repo_list.lng deleted file mode 100644 index 5e2fdf5b928950f51e2da6d597739afef36d1d11..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/tr_software_repo_list.lng +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/tr_software_update_list.lng b/interface/web/admin/lib/lang/tr_software_update_list.lng deleted file mode 100644 index a462d90faa7dc79180330f9ebe69d176cdc5117d..0000000000000000000000000000000000000000 --- a/interface/web/admin/lib/lang/tr_software_update_list.lng +++ /dev/null @@ -1,9 +0,0 @@ - diff --git a/interface/web/admin/lib/lang/tr_system_config.lng b/interface/web/admin/lib/lang/tr_system_config.lng index 3ef8e26875e8b9bb38cf765a9c226e53ab62c220..6054bebc888c57cb47e6d49c0fb83ba73271ead0 100644 --- a/interface/web/admin/lib/lang/tr_system_config.lng +++ b/interface/web/admin/lib/lang/tr_system_config.lng @@ -1,4 +1,5 @@ diff --git a/interface/web/admin/lib/lang/tr_users.lng b/interface/web/admin/lib/lang/tr_users.lng index 72aa9d1813bdcb4574c45990a8974aa512ff0909..3483c48fb984f665d575428e3a766bb528753424 100644 --- a/interface/web/admin/lib/lang/tr_users.lng +++ b/interface/web/admin/lib/lang/tr_users.lng @@ -1,9 +1,10 @@ diff --git a/interface/web/admin/lib/module.conf.php b/interface/web/admin/lib/module.conf.php index 124656b7f302df41d02cd388e21354f7d9688fbb..59b2e1ffc170909c060f93a4db265f965e04a3e5 100644 --- a/interface/web/admin/lib/module.conf.php +++ b/interface/web/admin/lib/module.conf.php @@ -92,30 +92,6 @@ $module['nav'][] = array( 'title' => 'Interface', 'items' => $items); -// cleanup -unset($items); - - -$items[] = array( 'title' => 'Repositories', - 'target' => 'content', - 'link' => 'admin/software_repo_list.php', - 'html_id' => 'software_repo_list'); - -$items[] = array( 'title' => 'Packages', - 'target' => 'content', - 'link' => 'admin/software_package_list.php', - 'html_id' => 'software_package_list'); - -$items[] = array( 'title' => 'Updates', - 'target' => 'content', - 'link' => 'admin/software_update_list.php', - 'html_id' => 'software_update_list'); - -$module['nav'][] = array( 'title' => 'Software', - 'open' => 1, - 'items' => $items); - - // cleanup unset($items); diff --git a/interface/web/admin/lib/remote.conf.php b/interface/web/admin/lib/remote.conf.php index a1067a992f8c035e727355e503e517180430f540..fd94b6275ec4ec3f360d4c3dba7e6e1a842cc5f4 100644 --- a/interface/web/admin/lib/remote.conf.php +++ b/interface/web/admin/lib/remote.conf.php @@ -3,4 +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' +// +$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/list/directive_snippets.list.php b/interface/web/admin/list/directive_snippets.list.php index 31332e5ecf7232b25e1cc38e12b5a5d129f5fbd0..0faaf089643c80ee18a865b2e0940c28be8baa7b 100644 --- a/interface/web/admin/list/directive_snippets.list.php +++ b/interface/web/admin/list/directive_snippets.list.php @@ -74,7 +74,7 @@ $liste["item"][] = array( 'field' => "type", 'suffix' => "", 'width' => "", 'value' => array('apache' => 'Apache', 'nginx' => 'nginx', 'php' => 'PHP', 'proxy' => 'Proxy')); - + $liste["item"][] = array( 'field' => "customer_viewable", 'datatype' => "VARCHAR", 'formtype' => "SELECT", @@ -83,14 +83,3 @@ $liste["item"][] = array( 'field' => "customer_viewable", 'suffix' => "", 'width' => "", 'value' => array('y' => $app->lng('yes_txt'), 'n' => $app->lng('no_txt'))); - -$liste["item"][] = array( 'field' => "master_directive_snippets_id", - 'datatype' => "BOOLEAN", - 'formtype' => "SELECT", - 'op' => "IS", - 'prefix' => "", - 'suffix' => "", - 'width' => "", - 'value' => array(0 => $app->lng('select_directive_snippet_txt'), 1 => $app->lng('select_master_directive_snippet_txt'))); - -?> diff --git a/interface/web/admin/list/software_repo.list.php b/interface/web/admin/list/software_repo.list.php deleted file mode 100644 index 0e172ace99ad7bf2bf53234922d2aa7432a90fb3..0000000000000000000000000000000000000000 --- a/interface/web/admin/list/software_repo.list.php +++ /dev/null @@ -1,78 +0,0 @@ - "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' => "repo_name", - 'datatype' => "VARCHAR", - 'formtype' => "TEXT", - 'op' => "like", - 'prefix' => "%", - 'suffix' => "%", - 'width' => "", - 'value' => ""); - - -$liste["item"][] = array( 'field' => "repo_url", - 'datatype' => "VARCHAR", - 'formtype' => "TEXT", - 'op' => "like", - 'prefix' => "%", - 'suffix' => "%", - 'width' => "", - 'value' => ""); - -?> diff --git a/interface/web/admin/server_config_edit.php b/interface/web/admin/server_config_edit.php index f311f6b1a58e558baaa41ee452d4f08e23be0f1c..32aa270893f467ea3448a0d3940a6cc7832fec81 100644 --- a/interface/web/admin/server_config_edit.php +++ b/interface/web/admin/server_config_edit.php @@ -57,13 +57,29 @@ class page_action extends tform_actions { // get the config $app->uses('getconf'); - $web_config = $app->getconf->get_server_config($conf['server_id'], 'web'); + $web_config = $app->getconf->get_server_config($this->id, 'web'); if($web_config['server_type'] == 'nginx'){ 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(); } @@ -79,7 +95,7 @@ class page_action extends tform_actions { function onShowEdit() { global $app, $conf; - if($_SESSION["s"]["user"]["typ"] != 'admin') die('This function needs admin priveliges'); + if($_SESSION["s"]["user"]["typ"] != 'admin') die('This function needs admin privileges'); if($app->tform->errorMessage == '') { $app->uses('ini_parser,getconf'); @@ -90,8 +106,12 @@ class page_action extends tform_actions { $this->dataRecord = $app->getconf->get_server_config($server_id, $section); if($section == 'mail'){ - $server_config = $app->getconf->get_server_config($server_id, 'server'); - $rspamd_url = 'https://'.$server_config['hostname'].':8081/rspamd/'; + if(trim($this->dataRecord['rspamd_url'] == '')) { + $server_config = $app->getconf->get_server_config($server_id, 'server'); + $rspamd_url = 'https://'.$server_config['hostname'].':8081/rspamd/'; + } else { + $rspamd_url = $this->dataRecord['rspamd_url']; + } } } @@ -115,7 +135,7 @@ class page_action extends tform_actions { function onUpdateSave($sql) { global $app, $conf; - if($_SESSION["s"]["user"]["typ"] != 'admin') die('This function needs admin priveliges'); + if($_SESSION["s"]["user"]["typ"] != 'admin') die('This function needs admin privileges'); $app->uses('ini_parser,getconf'); if($conf['demo_mode'] != true) { @@ -143,9 +163,19 @@ class page_action extends tform_actions { if($app->tform->errorMessage == '') { $server_config_array[$section] = $app->tform->encode($this->dataRecord, $section); - $server_config_str = $app->ini_parser->get_ini_string($server_config_array); + if ((! is_array($server_config_array[$section])) || count($server_config_array[$section]) == 0 ) { + $errMsg = sprintf( $app->tform->lng("server_config_error_section_not_updated"), $section ); + $app->tpl->setVar('error', $errMsg); + } else { + $server_config_str = $app->ini_parser->get_ini_string($server_config_array); - $app->db->datalogUpdate('server', array("config" => $server_config_str), 'server_id', $server_id); + if (count($server_config_array) == 0 || $server_config_str == '') { + $app->tpl->setVar('error', $app->tform->lng("server_config_error_not_updated")); + } else { + $app->db->datalogUpdate('server', array("config" => $server_config_str), 'server_id', $server_id); + $app->tpl->setVar('error', ''); + } + } } else { $app->error('Security breach!'); } @@ -182,10 +212,11 @@ class page_action extends tform_actions { $app->db->datalogUpdate('mail_user', $mail_user, 'mailuser_id', $mail_user["mailuser_id"], true); $mail_user['autoresponder'] = 'y'; $app->db->datalogUpdate('mail_user', $mail_user, 'mailuser_id', $mail_user["mailuser_id"], true); - } elseif($mail_user['move_junk'] == 'y') { + } elseif($mail_user['move_junk'] != 'n') { + $save = $mail_user['move_junk']; $mail_user['move_junk'] = 'n'; $app->db->datalogUpdate('mail_user', $mail_user, 'mailuser_id', $mail_user["mailuser_id"], true); - $mail_user['move_junk'] = 'y'; + $mail_user['move_junk'] = $save; $app->db->datalogUpdate('mail_user', $mail_user, 'mailuser_id', $mail_user["mailuser_id"], true); } else { $app->db->datalogUpdate('mail_user', $mail_user, 'mailuser_id', $mail_user["mailuser_id"], true); diff --git a/interface/web/admin/server_php_del.php b/interface/web/admin/server_php_del.php index 6848eea8d472a0c787e011558b7429375fc7965e..82b4c8a17de3a5233d5b8caedd4449f774d43248 100644 --- a/interface/web/admin/server_php_del.php +++ b/interface/web/admin/server_php_del.php @@ -46,7 +46,24 @@ require_once '../../lib/app.inc.php'; $app->auth->check_module_permissions('admin'); $app->auth->check_security_permissions('admin_allow_server_php'); -$app->uses("tform_actions"); -$app->tform_actions->onDelete(); +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onBeforeDelete() { + global $app; + + $sql = 'SELECT domain_id FROM web_domain WHERE server_id = ? AND server_php_id = ?'; + $web_domains = $app->db->queryAllRecords($sql, $this->dataRecord['server_id'], $this->id); + + if(!empty($web_domains)) { + $app->error($app->tform->lng('php_in_use_error')); + } + } + +} + +$page = new page_action; +$page->onDelete(); -?> diff --git a/interface/web/admin/server_php_edit.php b/interface/web/admin/server_php_edit.php index 12aacf60b92a687c75c71f33fad9abe5b83cad5a..a9e7b38bbb5b0d10335bffea920a847dd5347b9f 100644 --- a/interface/web/admin/server_php_edit.php +++ b/interface/web/admin/server_php_edit.php @@ -50,9 +50,11 @@ $app->uses('tpl,tform,tform_actions'); $app->load('tform_actions'); class page_action extends tform_actions { - + function onSubmit() { + parent::onSubmit(); + } function onBeforeUpdate() { - global $app, $conf; + global $app; //* Check if the server has been changed // We do this only for the admin or reseller users, as normal clients can not change the server ID anyway @@ -71,5 +73,3 @@ class page_action extends tform_actions { $page = new page_action; $page->onLoad(); - -?> diff --git a/interface/web/admin/server_php_list.php b/interface/web/admin/server_php_list.php index 7d69ab7d25c19e803e46b61031007e0889e74a01..11ef881792cb76965e3a5aed2dcfce98808127ea 100644 --- a/interface/web/admin/server_php_list.php +++ b/interface/web/admin/server_php_list.php @@ -48,7 +48,15 @@ $app->uses('listform_actions'); $app->listform_actions->SQLOrderBy = "ORDER BY server_php.server_id, server_php.name"; -$app->listform_actions->onLoad(); +$app->listform_actions->SQLExtSelect = "(SELECT + COUNT(w.server_id) + FROM + server_php s LEFT JOIN web_domain w ON (w.server_php_id = s.server_php_id AND s.server_id=w.server_id) + WHERE + server_php.server_php_id=s.server_php_id + GROUP BY + server_php.server_php_id +) AS 'usage'"; +$app->listform_actions->onLoad(); -?> diff --git a/interface/web/admin/software_package_install.php b/interface/web/admin/software_package_install.php deleted file mode 100644 index 6a5326d51a1bed56d1d1b2faf862d8aa38533f3d..0000000000000000000000000000000000000000 --- a/interface/web/admin/software_package_install.php +++ /dev/null @@ -1,179 +0,0 @@ -auth->check_module_permissions('admin'); -$app->auth->check_security_permissions('admin_allow_software_packages'); - -//* This is only allowed for administrators -if(!$app->auth->is_admin()) die('only allowed for administrators.'); - -// Check CSRF Token -if(count($_POST) > 0) { - $app->auth->csrf_token_check('POST'); -} else { - $app->auth->csrf_token_check('GET'); -} - -$package_name = $_REQUEST['package']; -$install_server_id = $app->functions->intval($_REQUEST['server_id']); -$install_key = trim($_REQUEST['install_key']); - -$package = $app->db->queryOneRecord("SELECT * FROM software_package WHERE package_name = ?", $package_name); - -$install_key_verified = false; -$message_err = ''; -$message_ok = ''; - -//* verify the key -if($package['package_installable'] == 'key' && $install_key != '') { - - $repo = $app->db->queryOneRecord("SELECT * FROM software_repo WHERE software_repo_id = ?", $package['software_repo_id']); - - $client = new SoapClient(null, array('location' => $repo['repo_url'], - 'uri' => $repo['repo_url'])); - - $install_key_verified = $client->check_installable($package_name, $install_key, $repo['repo_username'], $repo['repo_password']); - - if($install_key_verified == false) { - //$install_key = ''; - $message_err = 'Verification of the key failed.'; - } else { - // Store the verified key into the database - $app->db->datalogUpdate('software_package', array("package_key" => $install_key), 'package_id', $package['package_id']); - } -} else { - $message_ok = 'Please enter the software key for the package.'; -} - -//* Install packages, if all requirements are fullfilled. -if($install_server_id > 0 && $package_name != '' && ($package['package_installable'] == 'yes' || $install_key_verified == true)) { - $sql = "SELECT software_update_id, package_name, update_title FROM software_update WHERE type = 'full' AND package_name = ? ORDER BY v1 DESC, v2 DESC, v3 DESC, v4 DESC LIMIT 0,1"; - $tmp = $app->db->queryOneRecord($sql, $package_name); - $software_update_id = $tmp['software_update_id']; - - //* if package requires a DB and there is no data for a db in config, then we create this data now - if($package['package_requires_db'] == 'mysql') { - $app->uses('ini_parser,getconf'); - - $package_config_array = array(); - if(trim($package['package_config']) != '') { - $package_config_array = $app->ini_parser->parse_ini_string(stripslashes($package['package_config'])); - } - - if(!isset($package_config_array['mysql'])) { - $package_config_array['mysql'] = array( 'database_name' => 'ispapp'.$package['package_id'], - 'database_user' => 'ispapp'.$package['package_id'], - 'database_password' => md5(mt_rand()), - 'database_host' => 'localhost'); - $package_config_str = $app->ini_parser->get_ini_string($package_config_array); - $package['package_config'] = $package_config_str; - $app->db->datalogUpdate('software_package', array("package_config" => $package_config_str), 'package_id', $package['package_id']); - } - } - - //* If the packages requires a remote user - if($package['package_remote_functions'] != '') { - - if(trim($package['package_config']) != '') { - $package_config_array = $app->ini_parser->parse_ini_string(stripslashes($package['package_config'])); - } - - if(!isset($package_config_array['remote_api'])) { - $remote_user = 'ispapp'.$package['package_id']; - $remote_password = md5(mt_rand()); - $remote_functions = $package['package_remote_functions']; - - $package_config_array['remote_api'] = array( - 'remote_hostname' => $_SERVER['HTTP_HOST'], - 'remote_user' => $remote_user, - 'remote_password' => $remote_password - ); - - $package_config_str = $app->ini_parser->get_ini_string($package_config_array); - $package['package_config'] = $package_config_str; - $remote_password_md5 = md5($remote_password); - $app->db->datalogUpdate('software_package', array("package_config" => $package_config_str), 'package_id', $package['package_id']); - - $sql = "INSERT INTO `remote_user` (`sys_userid`, `sys_groupid`, `sys_perm_user`, `sys_perm_group`, `sys_perm_other`, `remote_username`, `remote_password`, `remote_functions`) VALUES - (1, 1, 'riud', 'riud', '', ?, ?, ?)"; - $app->db->query($sql, $remote_user, $remote_password_md5, $remote_functions); - - } - - } - - //* Add the record to start the install process - $insert_data = array( - "package_name" => $package_name, - "server_id" => $install_server_id, - "software_update_id" => $software_update_id, - "status" => 'installing' - ); - $app->db->datalogInsert('software_update_inst', $insert_data, 'software_update_inst_id'); - $message_ok = 'Starting package installation '."".$app->lng('next').""; - -} - -if(count($_POST) > 2 && $install_key == '') { - $message_ok = 'Please enter the software key.'; -} - -//* Show key input form -if($package['package_installable'] == 'key' && !$install_key_verified) { - $insert_key = true; -} else { - $insert_key = false; -} - -// Loading the template -$app->uses('tpl'); -$app->tpl->newTemplate("form.tpl.htm"); -$app->tpl->setInclude('content_tpl', 'templates/software_package_install.htm'); - -$app->tpl->setVar('message_ok', $message_ok); -$app->tpl->setVar('message_err', $message_err); -$app->tpl->setVar('insert_key', $insert_key); -$app->tpl->setVar('install_key', $install_key); -$app->tpl->setVar('package_name', $package_name); -$app->tpl->setVar('server_id', $install_server_id); - - -include_once 'lib/lang/en_software_package_install.lng'; -$app->tpl->setVar($wb); - - -$app->tpl_defaults(); -$app->tpl->pparse(); - -?> diff --git a/interface/web/admin/software_package_list.php b/interface/web/admin/software_package_list.php deleted file mode 100644 index 8a21696c7f398600ba7083b3f95d3e8f548de825..0000000000000000000000000000000000000000 --- a/interface/web/admin/software_package_list.php +++ /dev/null @@ -1,200 +0,0 @@ -auth->check_module_permissions('admin'); - -//* This is only allowed for administrators -if(!$app->auth->is_admin()) die('only allowed for administrators.'); - -//* Get the latest packages from the repositorys and insert them in the local database -$packages_added = 0; -$repos = $app->db->queryAllRecords("SELECT software_repo_id, repo_url, repo_username, repo_password FROM software_repo WHERE active = 'y'"); -if(is_array($repos) && isset($_GET['action']) && $_GET['action'] == 'repoupdate' ) { - foreach($repos as $repo) { - $client = new SoapClient(null, array('location' => $repo['repo_url'], - 'uri' => $repo['repo_url'])); - - $packages = $client->get_packages($repo['repo_username'], $repo['repo_password']); - if(is_array($packages)) { - foreach($packages as $p) { - $package_name = $p['name']; - $tmp = $app->db->queryOneRecord("SELECT package_id FROM software_package WHERE package_name = ?", $package_name); - - $package_title = $p['title']; - $package_description = $p['description']; - $software_repo_id = $app->functions->intval($repo['software_repo_id']); - $package_type = $p['type']; - $package_installable = $p['installable']; - $package_requires_db = $p['requires_db']; - $package_remote_functions = $p['remote_functions']; - - if(empty($tmp['package_id'])) { - $insert_data = array( - "software_repo_id" => $software_repo_id, - "package_name" => $package_name, - "package_title" => $package_title, - "package_description" => $package_description, - "package_type" => $package_type, - "package_installable" => $package_installable, - "package_requires_db" => $package_requires_db, - "package_remote_functions" => $package_remote_functions - ); - $app->db->datalogInsert('software_package', $insert_data, 'package_id'); - $packages_added++; - } else { - $update_data = array( - "software_repo_id" => $software_repo_id, - "package_title" => $package_title, - "package_description" => $package_description, - "package_type" => $package_type, - "package_installable" => $package_installable, - "package_requires_db" => $package_requires_db, - "package_remote_functions" => $package_remote_functions - ); - //echo $update_data; - $app->db->datalogUpdate('software_package', $update_data, 'package_id', $tmp['package_id']); - } - } - } - - $packages = $app->db->queryAllRecords("SELECT software_package.package_name, v1, v2, v3, v4 FROM software_package LEFT JOIN software_update ON ( software_package.package_name = software_update.package_name ) GROUP BY package_name ORDER BY v1 DESC , v2 DESC , v3 DESC , v4 DESC"); - if(is_array($packages)) { - foreach($packages as $p) { - - $version = $p['v1'].'.'.$p['v2'].'.'.$p['v3'].'.'.$p['v4']; - $updates = $client->get_updates($p['package_name'], $version, $repo['repo_username'], $repo['repo_password']); - - if(is_array($updates)) { - foreach($updates as $u) { - - $version_array = explode('.', $u['version']); - $v1 = $app->functions->intval($version_array[0]); - $v2 = $app->functions->intval($version_array[1]); - $v3 = $app->functions->intval($version_array[2]); - $v4 = $app->functions->intval($version_array[3]); - - $package_name = $u['package_name']; - $software_repo_id = $app->functions->intval($repo['software_repo_id']); - $update_url = $u['url']; - $update_md5 = $u['md5']; - $update_dependencies = (isset($u['dependencies']))?$u['dependencies']:''; - $update_title = $u['title']; - $type = $u['type']; - - // Check that we do not have this update in the database yet - $sql = "SELECT * FROM software_update WHERE package_name = ? and v1 = ? and v2 = ? and v3 = ? and v4 = ?"; - $tmp = $app->db->queryOneRecord($sql, $package_name, $v1, $v2, $v3, $v4); - if(!isset($tmp['software_update_id'])) { - $insert_data = array( - "software_repo_id" => $software_repo_id, - "package_name" => $package_name, - "update_url" => $update_url, - "update_md5" => $update_md5, - "update_dependencies" => $update_dependencies, - "update_title" => $update_title, - "v1" => $v1, - "v2" => $v2, - "v3" => $v3, - "v4" => $v4, - "type" => $type - ); - $app->db->datalogInsert('software_update', $insert_data, 'software_update_id'); - } - - } - } - } - } - } -} - -// Show the list in the interface -// Loading the template -$app->uses('tpl'); -$app->tpl->newTemplate("form.tpl.htm"); -$app->tpl->setInclude('content_tpl', 'templates/software_package_list.htm'); - -$csrf_token = $app->auth->csrf_token_get('software_package_list'); -$_csrf_id = $csrf_token['csrf_id']; -$_csrf_key = $csrf_token['csrf_key']; - -$servers = $app->db->queryAllRecords('SELECT server_id, server_name FROM server ORDER BY server_name'); -$packages = $app->db->queryAllRecords('SELECT * FROM software_package'); -if(is_array($packages) && count($packages) > 0) { - foreach($packages as $key => $p) { - $installed_txt = ''; - foreach($servers as $s) { - $inst = $app->db->queryOneRecord("SELECT * FROM software_update, software_update_inst WHERE software_update_inst.software_update_id = software_update.software_update_id AND software_update_inst.package_name = ? AND server_id = ?", $p["package_name"], $s["server_id"]); - $version = $inst['v1'].'.'.$inst['v2'].'.'.$inst['v3'].'.'.$inst['v4']; - - if($inst['status'] == 'installed') { - $installed_txt .= $s['server_name'].": ".$app->lng("Installed version $version")."
"; - } elseif ($inst['status'] == 'installing') { - $installed_txt .= $s['server_name'].": ".$app->lng("Installation in progress")."
"; - } elseif ($inst['status'] == 'failed') { - $installed_txt .= $s['server_name'].": ".$app->lng("Installation failed")."
"; - } elseif ($inst['status'] == 'deleting') { - $installed_txt .= $s['server_name'].": ".$app->lng("Deletion in progress")."
"; - } else { - if($p['package_installable'] == 'no') { - $installed_txt .= $s['server_name'].": ".$app->lng("Package can not be installed.")."
"; - } else { - $installed_txt .= $s['server_name'].": Install now
"; - } - } - } - $packages[$key]['software_update_inst_id'] = intval($inst['software_update_inst_id']); - $packages[$key]['installed'] = $installed_txt; - $packages[$key]['csrf_id'] = $_csrf_id; - $packages[$key]['csrf_key'] = $_csrf_key; - } - $app->tpl->setVar('has_packages', 1); -} else { - $app->tpl->setVar('has_packages', 0); -} - - - -$app->tpl->setLoop('records', $packages); - -$language = (isset($_SESSION['s']['language']))?$_SESSION['s']['language']:$conf['language']; -include_once 'lib/lang/'.$app->functions->check_language($language).'_software_package_list.lng'; -$app->tpl->setVar($wb); - - -$app->tpl_defaults(); -$app->tpl->pparse(); - - -?> diff --git a/interface/web/admin/software_update_list.php b/interface/web/admin/software_update_list.php deleted file mode 100644 index 6d680c0ec1ce613db0e448866dbd0036a30c78fa..0000000000000000000000000000000000000000 --- a/interface/web/admin/software_update_list.php +++ /dev/null @@ -1,204 +0,0 @@ -auth->check_module_permissions('admin'); -$app->auth->check_security_permissions('admin_allow_software_packages'); - -//* This is only allowed for administrators -if(!$app->auth->is_admin()) die('only allowed for administrators.'); - -//* Get the latest updates from the repositorys and insert them in the local database -$updates_added = 0; -$repos = $app->db->queryAllRecords("SELECT software_repo_id, repo_url, repo_username, repo_password FROM software_repo WHERE active = 'y'"); -if(is_array($repos)) { - foreach($repos as $repo) { - - /* - SELECT software_package.package_name, v1, v2, v3, v4 - FROM software_package - LEFT JOIN software_update ON ( software_package.package_name = software_update.package_name ) - LEFT JOIN software_update_inst ON ( software_update.software_update_id = software_update_inst.software_update_id ) - GROUP BY package_name - ORDER BY v1 DESC , v2 DESC , v3 DESC , v4 DESC - */ - - $client = new SoapClient(null, array('location' => $repo['repo_url'], - 'uri' => $repo['repo_url'])); - - $packages = $app->db->queryAllRecords("SELECT software_package.package_name, v1, v2, v3, v4 FROM software_package LEFT JOIN software_update ON ( software_package.package_name = software_update.package_name ) GROUP BY package_name ORDER BY v1 DESC , v2 DESC , v3 DESC , v4 DESC"); - if(is_array($packages)) { - foreach($packages as $p) { - - $version = $p['v1'].'.'.$p['v2'].'.'.$p['v3'].'.'.$p['v4']; - $updates = $client->get_updates($p['package_name'], $version, $repo['repo_username'], $repo['repo_password']); - - if(is_array($updates)) { - foreach($updates as $u) { - - $version_array = explode('.', $u['version']); - $v1 = $app->functions->intval($version_array[0]); - $v2 = $app->functions->intval($version_array[1]); - $v3 = $app->functions->intval($version_array[2]); - $v4 = $app->functions->intval($version_array[3]); - - $package_name = $u['package_name']; - $software_repo_id = $app->functions->intval($repo['software_repo_id']); - $update_url = $u['url']; - $update_md5 = $u['md5']; - $update_dependencies = (isset($u['dependencies']))?$u['dependencies']:''; - $update_title = $u['title']; - $type = $u['type']; - - // Check that we do not have this update in the database yet - $sql = "SELECT * FROM software_update WHERE package_name = ? and v1 = ? and v2 = ? and v3 = ? and v4 = ?"; - $tmp = $app->db->queryOneRecord($sql, $package_name, $v1, $v2, $v3, $v4); - if(!isset($tmp['software_update_id'])) { - // Insert the update in the datbase - $sql = "INSERT INTO software_update (software_repo_id, package_name, update_url, update_md5, update_dependencies, update_title, v1, v2, v3, v4, type) - VALUES ($software_repo_id, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; - //die($sql); - $app->db->query($sql, $package_name, $update_url, $update_md5, $update_dependencies, $update_title, $v1, $v2, $v3, $v4, $type); - } - - } - } - } - } - } -} - - -//* Install packages, if GET Request -if(isset($_GET['action']) && $_GET['action'] == 'install' && $_GET['package'] != '' && $_GET['server_id'] > 0) { - $package_name = $_GET['package']; - $server_id = $app->functions->intval($_GET['server_id']); - $software_update_id = $app->functions->intval($_GET['id']); - - $insert_data = array( - "package_name" => $package_name, - "server_id" => $server_id, - "software_update_id" => $software_update_id, - "status" => 'installing' - ); - $app->db->datalogInsert('software_update_inst', $insert_data, 'software_update_inst_id'); - -} - - - -// Show the list in the interface -// Loading the template -$app->uses('tpl'); -$app->tpl->newTemplate("form.tpl.htm"); -$app->tpl->setInclude('content_tpl', 'templates/software_update_list.htm'); - -/* -SELECT software_package.package_name, software_package.package_title, software_update.update_title, v1, v2, v3, v4, software_update_inst.status - FROM software_package - LEFT JOIN software_update ON ( software_package.package_name = software_update.package_name ) - LEFT JOIN software_update_inst ON ( software_update.software_update_id = software_update_inst.software_update_id ) -GROUP BY software_update.software_update_id - ORDER BY v1 DESC , v2 DESC , v3 DESC , v4 DESC -*/ - - - -if(isset($_POST["server_id"]) && $_POST["server_id"] > 0) { - $server_id = $app->functions->intval($_POST["server_id"]); -} else { - $server_id = 1; -} - -$servers = $app->db->queryAllRecords('SELECT server_id, server_name FROM server ORDER BY server_name'); -foreach($servers as $key => $server) { - if($server['server_id'] == $server_id) { - $servers[$key]['selected'] = 'selected'; - } else { - $servers[$key]['selected'] = ''; - } -} - -$app->tpl->setLoop('servers', $servers); - -$sql = "SELECT v1, v2, v3, v4, software_update.update_title, software_update.software_update_id, software_update.package_name, v1, v2, v3, v4, software_update_inst.status - FROM software_update LEFT JOIN software_update_inst ON ( software_update.software_update_id = software_update_inst.software_update_id ) - WHERE server_id = $server_id - GROUP BY software_update.package_name - ORDER BY software_update.package_name ASC, v1 DESC , v2 DESC , v3 DESC , v4 DESC"; - -$installed_packages = $app->db->queryAllRecords($sql); - - -$records_out = array(); - -if(is_array($installed_packages)) { - foreach($installed_packages as $ip) { - - // Get version number of the latest installed version - $sql = "SELECT v1, v2, v3, v4 FROM software_update, software_update_inst WHERE software_update.software_update_id = software_update_inst.software_update_id AND server_id = ? ORDER BY v1 DESC , v2 DESC , v3 DESC , v4 DESC LIMIT 0,1"; - $lu = $app->db->queryOneRecord($sql, $server_id); - - // Get all installable updates - $sql = "SELECT * FROM software_update WHERE v1 >= ? AND v2 >= ? AND v3 >= ? AND v4 >= ? AND package_name = ? ORDER BY v1 DESC , v2 DESC , v3 DESC , v4 DESC"; - $updates = $app->db->queryAllRecords($sql, $lu['v1'], $lu['v2'], $lu['v3'], $lu['v4'], $ip['package_name']); - //die($sql); - - if(is_array($updates)) { - // Delete the last record as it is already installed - unset($updates[count($updates)-1]); - - foreach($updates as $key => $u) { - $version = $u['v1'].'.'.$u['v2'].'.'.$u['v3'].'.'.$u['v4']; - $installed_txt = "Install Update
"; - $records_out[] = array('version' => $version, 'update_title' => $u["update_title"], 'installed' => $installed_txt); - - } - } - } -} - - - -$app->tpl->setLoop('records', $records_out); - -$language = (isset($_SESSION['s']['language']))?$_SESSION['s']['language']:$conf['language']; -include_once 'lib/lang/'.$app->functions->check_language($language).'_software_update_list.lng'; -$app->tpl->setVar($wb); - - -$app->tpl_defaults(); -$app->tpl->pparse(); - - -?> diff --git a/interface/web/admin/system_config_edit.php b/interface/web/admin/system_config_edit.php index 04db6717b0d3eb37aca9ae625d3d1a8154a0c982..941f6e0bbe90adbad455c37b270115477fcb666f 100644 --- a/interface/web/admin/system_config_edit.php +++ b/interface/web/admin/system_config_edit.php @@ -56,7 +56,7 @@ class page_action extends tform_actions { function onShowEdit() { global $app, $conf; - if($_SESSION["s"]["user"]["typ"] != 'admin') die('This function needs admin priveliges'); + if($_SESSION["s"]["user"]["typ"] != 'admin') die('This function needs admin privileges'); if($app->tform->errorMessage == '') { $app->uses('ini_parser,getconf'); @@ -96,7 +96,7 @@ class page_action extends tform_actions { if($available_dashlets_txt == '') $available_dashlets_txt = '------'; $app->tpl->setVar("available_dashlets_txt", $available_dashlets_txt); - + // Logo $sys_ini = $app->db->queryOneRecord("SELECT * FROM sys_ini WHERE sysini_id = ?", $this->id); if($sys_ini['custom_logo'] != ''){ @@ -133,7 +133,7 @@ class page_action extends tform_actions { function onUpdateSave($sql) { global $app, $conf; - if($_SESSION["s"]["user"]["typ"] != 'admin') die('This function needs admin priveliges'); + if($_SESSION["s"]["user"]["typ"] != 'admin') die('This function needs admin privileges'); $app->uses('ini_parser,getconf'); $section = $app->tform->getCurrentTab(); @@ -156,6 +156,13 @@ class page_action extends tform_actions { */ $new_config = $app->tform->encode($this->dataRecord, $section); + + if($section == 'sites' && $new_config['client_protection'] != 'y' && $server_config_array['sites']['client_protection'] == 'y') { + $app->db->query("UPDATE `web_domain` SET `sys_userid` = (select `userid` FROM `sys_user` WHERE `default_group` = `web_domain`.`sys_groupid`), `sys_perm_group` = 'riud' WHERE `added_by` = 'admin' and sys_groupid > 0"); + } elseif($section == 'sites' && $new_config['client_protection'] != 'n' && $server_config_array['sites']['client_protection'] == 'n') { + $app->db->query("UPDATE `web_domain` SET `sys_userid` = 1, `sys_perm_group` = 'ru' WHERE `added_by` = 'admin'"); + } + if($section == 'sites' && $new_config['vhost_subdomains'] != 'y' && $server_config_array['sites']['vhost_subdomains'] == 'y') { // check for existing vhost subdomains, if found the mode cannot be disabled $check = $app->db->queryOneRecord("SELECT COUNT(*) as `cnt` FROM `web_domain` WHERE `type` = 'vhostsubdomain'"); @@ -198,13 +205,13 @@ class page_action extends tform_actions { "FROM dns_soa"; $app->db->query($sql); } - + //die(print_r($_FILES)); // Logo /* if(isset($_FILES['file']['name']) && is_uploaded_file($_FILES['file']['tmp_name'])){ //print_r($_FILES); - + $path= $_FILES['file']['tmp_name']; $type = pathinfo($path, PATHINFO_EXTENSION); $data = file_get_contents($path); diff --git a/interface/web/admin/templates/directive_snippets_edit.htm b/interface/web/admin/templates/directive_snippets_edit.htm index 72eb82369c485c5b6bc44bfe89a0baccfd774b2f..4f8adfa1641bc3764ce286481d843bf8def98c46 100644 --- a/interface/web/admin/templates/directive_snippets_edit.htm +++ b/interface/web/admin/templates/directive_snippets_edit.htm @@ -1,36 +1,28 @@ - -

- - -
-
{tmpl_var name='name'}
+
-
{tmpl_var name='type'}
{tmpl_var name='type'} -
+
-
{tmpl_var name='snippet'}
-   Nginx {tmpl_var name='variables_txt'}: {DOCROOT}, {FASTCGIPASS}, {PHPFALLBACKFASTCGIPASS}
-   Apache {tmpl_var name='variables_txt'}: {DOCROOT}, {DOCROOT_CLIENT} -
+
+   Nginx {tmpl_var name='variables_txt'}: {DOCROOT}, {DOMAIN}, {FASTCGIPASS}, {PHPFALLBACKFASTCGIPASS}
+   Apache {tmpl_var name='variables_txt'}: {DOCROOT}, {DOCROOT_CLIENT}, {DOMAIN}
+   PHP {tmpl_var name='variables_txt'}: {WEBROOT} +
- -
+
{tmpl_var name='required_php_snippets'}
- -
+
{tmpl_var name='customer_viewable'} @@ -42,22 +34,25 @@ {tmpl_var name='active'}
- - +
+ +
{tmpl_var name='update_sites'}
+
+ - +
\ No newline at end of file + + diff --git a/interface/web/admin/templates/directive_snippets_list.htm b/interface/web/admin/templates/directive_snippets_list.htm index 84332824960fa233023d47aba017f6f47af7171a..c1cfc64ceed29e15ee23f35064f87ad43ba6eadd 100644 --- a/interface/web/admin/templates/directive_snippets_list.htm +++ b/interface/web/admin/templates/directive_snippets_list.htm @@ -17,7 +17,6 @@ - {tmpl_var name='search_limit'} @@ -25,7 +24,6 @@ - @@ -38,22 +36,21 @@ {tmpl_var name="name"} {tmpl_var name="type"} {tmpl_var name="customer_viewable"} - {tmpl_var name="master_directive_snippets_id"} - + - {tmpl_var name='globalsearch_noresults_text_txt'} + {tmpl_var name='globalsearch_noresults_text_txt'} - + diff --git a/interface/web/admin/templates/firewall_edit.htm b/interface/web/admin/templates/firewall_edit.htm index cd643a8cafb67e8e06160805fb5b23243c327a1d..07fe3d0ff52e3e3a8e0748b1e13a0b9674aa2b02 100644 --- a/interface/web/admin/templates/firewall_edit.htm +++ b/interface/web/admin/templates/firewall_edit.htm @@ -1,10 +1,3 @@ - -

- - -
+ {tmpl_var name='language_option'} +
+
+
+ +
+

{tmpl_var name='language_new_hint_txt'}

+
- Language Add -
- -
-
-
- -

{tmpl_var name='language_new_hint_txt'}

-
- + - - -
- - -
\ No newline at end of file +
+
+ + +
+
+
diff --git a/interface/web/admin/templates/language_complete.htm b/interface/web/admin/templates/language_complete.htm index 5205b285d5a3fae570e76945e21563938bd6987b..0da59e11776ec422217e2432d3e8aa538b2fd016 100644 --- a/interface/web/admin/templates/language_complete.htm +++ b/interface/web/admin/templates/language_complete.htm @@ -1,32 +1,39 @@ -

+
+

+ +

+
+ +
+ +
+
+ +
+ +
+
- -
-
- -
-
- -
- Language Complete -
- -
-
-
+
+
+ +
+ +
+
+
+
-
- - - -
+
+
+
-
\ No newline at end of file +
diff --git a/interface/web/admin/templates/language_edit.htm b/interface/web/admin/templates/language_edit.htm index d3830494dac7577aed6126206e39dbbc81be6079..c42ebaa51e4bfa8f93f600d4ac749bf0b7eb9606 100644 --- a/interface/web/admin/templates/language_edit.htm +++ b/interface/web/admin/templates/language_edit.htm @@ -4,16 +4,20 @@

-
Language File Edit: {tmpl_var name="file_path"} +
{tmpl_var name="lang_file_txt"}: {tmpl_var name="file_path"} - -
-
-
-
- +
+ + +
+ + + +
+ + @@ -22,4 +26,4 @@
-
\ No newline at end of file + diff --git a/interface/web/admin/templates/language_export.htm b/interface/web/admin/templates/language_export.htm index b00a204b29a470a911e248ca066cf4f1d6024b15..bb9eb49164dc609533cf55ed6b3dedda562343c3 100644 --- a/interface/web/admin/templates/language_export.htm +++ b/interface/web/admin/templates/language_export.htm @@ -1,25 +1,35 @@ -

+

+ +

+
+
+
+ +
+
+ +
+

+ +

+
+
- Language Export -
- -
-
- - - -

-
- - - -
- - -
+ + +
+
+ + +
+
+
+
diff --git a/interface/web/admin/templates/language_import.htm b/interface/web/admin/templates/language_import.htm index 8bd653c13e8a33217e830ba187233bd1034c709d..963da26a4667b63ac87b4991f32397c6a3e83bcd 100644 --- a/interface/web/admin/templates/language_import.htm +++ b/interface/web/admin/templates/language_import.htm @@ -1,34 +1,54 @@ -

+
+
+
+

+ +

+
+
+ + +
+
+ +
+
+
+ +
+
- Language Import -
- - -
-
- -
-
-
- -
-
- - - -

-
- -

-
- - - -
- - -
\ No newline at end of file + +
+

+ +

+
+
+ +
+

+ +

+
    + +
+
+
+ + + +
+
+ + +
+
+
+
diff --git a/interface/web/admin/templates/language_list.htm b/interface/web/admin/templates/language_list.htm index 33897be0a150d4c9137f24bbb0d50657cb7ea02f..0a80e5391c0598b706e66e6a8486761a861ce523 100644 --- a/interface/web/admin/templates/language_list.htm +++ b/interface/web/admin/templates/language_list.htm @@ -3,8 +3,6 @@

- - Tools
@@ -43,4 +41,4 @@
- \ No newline at end of file + diff --git a/interface/web/admin/templates/remote_action_ispcupdate.htm b/interface/web/admin/templates/remote_action_ispcupdate.htm index cbd2899bea9c1668dff1bbde4a60fef4205e2fd6..944ccb3ce14f3dfb98675aedca8e42d71dfbabf1 100644 --- a/interface/web/admin/templates/remote_action_ispcupdate.htm +++ b/interface/web/admin/templates/remote_action_ispcupdate.htm @@ -6,14 +6,18 @@ --> -

- -
- -
- -
- -
\ No newline at end of file + + + diff --git a/interface/web/admin/templates/remote_action_osupdate.htm b/interface/web/admin/templates/remote_action_osupdate.htm index d5fa2fffd5c1c8d7dc3cbfdeef4acee489f8c5ec..e32ae2c652e211d0270772af493206b6ddccc3a7 100644 --- a/interface/web/admin/templates/remote_action_osupdate.htm +++ b/interface/web/admin/templates/remote_action_osupdate.htm @@ -1,22 +1,34 @@ -

+
+
+
+

+ +

+
+
+ +
+
+ +
+

+ +

+
+
- {tmpl_var name='do_osupdate_caption'} -
- -
-
- - - -

-
- -
- -
\ No newline at end of file +
+
+ +
+
+
+
diff --git a/interface/web/admin/templates/remote_user_edit.htm b/interface/web/admin/templates/remote_user_edit.htm index 099af58eb50c946f59bed638e56c9e07b5d25c3b..723c3e6966b9c6967281443ab996d14b0eaf2324 100644 --- a/interface/web/admin/templates/remote_user_edit.htm +++ b/interface/web/admin/templates/remote_user_edit.htm @@ -1,10 +1,3 @@ - -

- - -
diff --git a/interface/web/admin/templates/server_config_cron_edit.htm b/interface/web/admin/templates/server_config_cron_edit.htm index 62e6efea76bc85d734cf1d214c38b40f4e22a80d..c337d43a5b6a8284fd716547661a1581c6a8bc99 100644 --- a/interface/web/admin/templates/server_config_cron_edit.htm +++ b/interface/web/admin/templates/server_config_cron_edit.htm @@ -1,10 +1,5 @@ - -

+

{tmpl_var name='server_name'}

- -
@@ -14,10 +9,10 @@
- - + + - +
diff --git a/interface/web/admin/templates/server_config_dns_edit.htm b/interface/web/admin/templates/server_config_dns_edit.htm index a4f7a26adef5ebe754dde5c9afe1fa95376ced93..dcc7328e2c10cb4241ac8ff55a046ffbf3c3a6c2 100644 --- a/interface/web/admin/templates/server_config_dns_edit.htm +++ b/interface/web/admin/templates/server_config_dns_edit.htm @@ -1,10 +1,7 @@ - -

+

{tmpl_var name='server_name'}

+ -
@@ -14,6 +11,9 @@
+
+ +
@@ -23,9 +23,9 @@
{tmpl_var name='disable_bind_log'}
- + - +
diff --git a/interface/web/admin/templates/server_config_fastcgi_edit.htm b/interface/web/admin/templates/server_config_fastcgi_edit.htm index c36b482e725b69399afc657065c3b0ade563ca02..eb89e21f74143a9520df7b2f69b6eeaa2f8032d9 100644 --- a/interface/web/admin/templates/server_config_fastcgi_edit.htm +++ b/interface/web/admin/templates/server_config_fastcgi_edit.htm @@ -1,10 +1,7 @@ - -

+

{tmpl_var name='server_name'}

+ -
@@ -32,10 +29,10 @@ {tmpl_var name='fastcgi_config_syntax'}
- - + + - +
diff --git a/interface/web/admin/templates/server_config_getmail_edit.htm b/interface/web/admin/templates/server_config_getmail_edit.htm index 84ca1ec73ffbac9a7f4901a2e75a39d220eabb2c..04217f9e840d51c8c85718e56576c17cbf13e040 100644 --- a/interface/web/admin/templates/server_config_getmail_edit.htm +++ b/interface/web/admin/templates/server_config_getmail_edit.htm @@ -1,17 +1,14 @@ - -

+

{tmpl_var name='server_name'}

+ -
- - + + - +
diff --git a/interface/web/admin/templates/server_config_jailkit_edit.htm b/interface/web/admin/templates/server_config_jailkit_edit.htm index b7a749147654c6fab6105400cafb7ec691d980c8..f64a848b89f013b4fcefb120c5591b5924ca88be 100644 --- a/interface/web/admin/templates/server_config_jailkit_edit.htm +++ b/interface/web/admin/templates/server_config_jailkit_edit.htm @@ -1,10 +1,7 @@ - -

+

{tmpl_var name='server_name'}

+ -
@@ -17,10 +14,18 @@
- - +
+ +
+
+ +
+
+ - +
diff --git a/interface/web/admin/templates/server_config_mail_edit.htm b/interface/web/admin/templates/server_config_mail_edit.htm index 6ba37104ef111f91d555c2fd8610e88f7dae6660..84683191c804141cc6024a207dd92d3e1cb47af4 100644 --- a/interface/web/admin/templates/server_config_mail_edit.htm +++ b/interface/web/admin/templates/server_config_mail_edit.htm @@ -1,10 +1,7 @@ - -

+

{tmpl_var name='server_name'}

+ -
+ + + +
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
@@ -99,6 +122,30 @@
 MB
+
+ +
 {tmpl_var name='realtime_blackhole_list_note_txt'} +
+
+ + +
+
+ + +
+
+ +
+ {tmpl_var name='mailbox_soft_delete'} {tmpl_var name='mailbox_soft_delete_info_txt'} +
+
@@ -106,15 +153,22 @@
- -
 {tmpl_var name='realtime_blackhole_list_note_txt'} -
-
+ +
+
%
+
+
{tmpl_var name='overquota_notify_admin'}
+
+ +
+ {tmpl_var name='overquota_notify_reseller'} +
+
@@ -131,10 +185,10 @@ {tmpl_var name='overquota_notify_onok'}
- - + + - +
@@ -144,13 +198,13 @@ var pword = password(8, false, 1); jQuery('#rspamd_password').val(pword); } - + if($('#content_filter').val() === 'rspamd'){ $('.rspamd').show(); } else { $('.rspamd').hide(); } - + $('#content_filter').change(function(){ if($(this).val() === 'rspamd'){ $('.rspamd').show(); diff --git a/interface/web/admin/templates/server_config_rescue_edit.htm b/interface/web/admin/templates/server_config_rescue_edit.htm index df8aa97c0714ce4e5ac94a73e978c8a2e71d1f03..eb4a289c81e0f6505b1ca2d53d67e7149a5e6c29 100644 --- a/interface/web/admin/templates/server_config_rescue_edit.htm +++ b/interface/web/admin/templates/server_config_rescue_edit.htm @@ -1,7 +1,4 @@ - -

+

{tmpl_var name='server_name'}

Rescue @@ -37,9 +34,9 @@ {tmpl_var name='do_not_try_rescue_mail'}
- - + +
diff --git a/interface/web/admin/templates/server_config_server_edit.htm b/interface/web/admin/templates/server_config_server_edit.htm index 66ead08996f49b6cea69ce5762563b26d27a05f2..1898f2bc556ef4d516abf11dd30fb22cfdc13c81 100644 --- a/interface/web/admin/templates/server_config_server_edit.htm +++ b/interface/web/admin/templates/server_config_server_edit.htm @@ -1,10 +1,12 @@ - -

+

{tmpl_var name='server_name'}

+ +
+ {tmpl_var name='backup_missing_utils_txt'} {tmpl_var name='missing_utils'} +
+
+ -
@@ -115,10 +117,10 @@ {tmpl_var name='migration_mode'}
- - + + - +
diff --git a/interface/web/admin/templates/server_config_ufw_edit.htm b/interface/web/admin/templates/server_config_ufw_edit.htm index 85e9c782973dc69cc465323d4ac2d6e22440374d..9a52245d11139b1157c644a916ae4067e1852496 100644 --- a/interface/web/admin/templates/server_config_ufw_edit.htm +++ b/interface/web/admin/templates/server_config_ufw_edit.htm @@ -1,7 +1,4 @@ - -

+

{tmpl_var name='server_name'}

UFW Firewall @@ -53,10 +50,10 @@ {tmpl_var name='ufw_log_level'}
- - + + - +
diff --git a/interface/web/admin/templates/server_config_vlogger_edit.htm b/interface/web/admin/templates/server_config_vlogger_edit.htm index a53ab7667682a6942b3733525f87929c33a17749..d79d84387d2bc841638bb413b80695ea7f527497 100644 --- a/interface/web/admin/templates/server_config_vlogger_edit.htm +++ b/interface/web/admin/templates/server_config_vlogger_edit.htm @@ -1,17 +1,14 @@ - -

+

{tmpl_var name='server_name'}

+ -
- - + + - +
diff --git a/interface/web/admin/templates/server_config_web_edit.htm b/interface/web/admin/templates/server_config_web_edit.htm index 97dc0557fcf4f6181d5a63746230d417eed3f98f..2161907cb5d76790f06e1daf94b5eb1d33070bef 100644 --- a/interface/web/admin/templates/server_config_web_edit.htm +++ b/interface/web/admin/templates/server_config_web_edit.htm @@ -1,7 +1,4 @@ - -

+

{tmpl_var name='server_name'}

@@ -54,6 +51,20 @@ {tmpl_var name='vhost_rewrite_v6'}
+
+ +
+ {tmpl_var name='vhost_proxy_protocol_enabled'} +
+
+
+ +
+
+
+ +
+
@@ -78,7 +89,7 @@ {tmpl_var name='security_level'}
-
+
{tmpl_var name='check_apache_config'} @@ -122,11 +133,28 @@ {tmpl_var name='overtraffic_notify_admin'}
+
+ +
+ {tmpl_var name='overtraffic_notify_reseller'} +
+
{tmpl_var name='overtraffic_notify_client'}
+
+
+ +
+ {tmpl_var name='overtraffic_disable_web'} +
+
+
+ +
+
%
@@ -134,11 +162,22 @@ {tmpl_var name='overquota_notify_admin'}
+
+ +
+ {tmpl_var name='overquota_notify_reseller'} +
+
{tmpl_var name='overquota_notify_client'}
+
+
+ +
+
%
@@ -146,10 +185,16 @@ {tmpl_var name='overquota_db_notify_admin'}
+
+ +
+ {tmpl_var name='overquota_db_notify_reseller'} +
+
- {tmpl_var name='overquota_db_notify_client'} + {tmpl_var name='overquota_db_notify_client'}
@@ -183,14 +228,6 @@ {tmpl_var name='enable_sni'}
-
- -
- -
-
@@ -243,7 +280,7 @@
- +
@@ -258,7 +295,13 @@
- + +
+ +
+ {tmpl_var name='php_default_hide'} +
+
@@ -296,6 +339,12 @@ {tmpl_var name='php_handler'}
+
+ +
+ {tmpl_var name='php_fpm_default_chroot'} +
+
@@ -335,7 +384,7 @@
- +
@@ -363,15 +412,15 @@
- +
- + - +
@@ -384,7 +433,7 @@ serverType = $(this).val(); adjustForm(); }); - + function adjustForm(){ if(serverType == "nginx"){ jQuery('.nginx').show(); diff --git a/interface/web/admin/templates/server_config_xmpp_edit.htm b/interface/web/admin/templates/server_config_xmpp_edit.htm index 4e6eaf0018a21b52ea4c84eb55ed85c4dcc42732..ae9895d15e4d894a37559bccd92d8eb5d05e0e6e 100644 --- a/interface/web/admin/templates/server_config_xmpp_edit.htm +++ b/interface/web/admin/templates/server_config_xmpp_edit.htm @@ -1,7 +1,4 @@ - -

+

{tmpl_var name='server_name'}

diff --git a/interface/web/admin/templates/server_edit_services.htm b/interface/web/admin/templates/server_edit_services.htm index 2775e029d3d6a1b85ab3012e40b6e0ca2b0b8ba9..b0aca56b17b0b842cb8e9c07b9f54c083fd16673 100644 --- a/interface/web/admin/templates/server_edit_services.htm +++ b/interface/web/admin/templates/server_edit_services.htm @@ -1,10 +1,3 @@ - -

- - -
diff --git a/interface/web/admin/templates/server_ip_edit.htm b/interface/web/admin/templates/server_ip_edit.htm index 9e895eac04f724d7884a4c4f1307454177bc514e..f0e0eb78d78b6c72b0a0185c2fe3399899bfc83f 100644 --- a/interface/web/admin/templates/server_ip_edit.htm +++ b/interface/web/admin/templates/server_ip_edit.htm @@ -1,10 +1,3 @@ - -

- - - IP Address
@@ -18,4 +11,4 @@
-
\ No newline at end of file +
diff --git a/interface/web/admin/templates/server_php_fpm_edit.htm b/interface/web/admin/templates/server_php_fpm_edit.htm index 4186584f0fc2860bbf3147613e69350c2838de79..c3369f1fdb2a94224ef4b73ddaf02c3d1b8948c3 100644 --- a/interface/web/admin/templates/server_php_fpm_edit.htm +++ b/interface/web/admin/templates/server_php_fpm_edit.htm @@ -1,10 +1,3 @@ - -

- - -
@@ -14,11 +7,14 @@
- - +
+ +
+ + - +
-
\ No newline at end of file + diff --git a/interface/web/admin/templates/server_php_list.htm b/interface/web/admin/templates/server_php_list.htm index 9833eb1e7ee35e1f18dcaee356628d82c62b63af..a2595a84741a2b729a1f55e12af7e5b1f09ce3f1 100644 --- a/interface/web/admin/templates/server_php_list.htm +++ b/interface/web/admin/templates/server_php_list.htm @@ -19,6 +19,7 @@ + {tmpl_var name='search_limit'} @@ -26,6 +27,7 @@ + @@ -38,6 +40,7 @@ {tmpl_var name="server_id"} {tmpl_var name="client_id"} {tmpl_var name="name"} + {tmpl_var name="usage"} @@ -45,13 +48,13 @@ - {tmpl_var name='globalsearch_noresults_text_txt'} + {tmpl_var name='globalsearch_noresults_text_txt'} - + diff --git a/interface/web/admin/templates/server_php_name_edit.htm b/interface/web/admin/templates/server_php_name_edit.htm index cfdaab63f9a220bd8bd210c615d67cf0624f0f4c..ab1d889ef94155e1a142df3ce2577a0a13b39403 100644 --- a/interface/web/admin/templates/server_php_name_edit.htm +++ b/interface/web/admin/templates/server_php_name_edit.htm @@ -1,10 +1,3 @@ - -

- - -
-
-
- -
- - - - -
- - -
\ No newline at end of file diff --git a/interface/web/admin/templates/software_package_install.htm b/interface/web/admin/templates/software_package_install.htm deleted file mode 100644 index 8524b3c08755982c38b050d12e8b45ee1d955d72..0000000000000000000000000000000000000000 --- a/interface/web/admin/templates/software_package_install.htm +++ /dev/null @@ -1,31 +0,0 @@ - -

- -
- -
-
- -
-
- -
- -

 

-
- -
- - - -

 

-
- - -
- -
-
-
\ No newline at end of file diff --git a/interface/web/admin/templates/software_package_list.htm b/interface/web/admin/templates/software_package_list.htm deleted file mode 100644 index e69e3780af4e3ccff25906c9a5867f46b8b19f5c..0000000000000000000000000000000000000000 --- a/interface/web/admin/templates/software_package_list.htm +++ /dev/null @@ -1,55 +0,0 @@ - -

- - -

{tmpl_var name="toolsarea_head_txt"}

- - - - - - -

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
{tmpl_var name='search_limit'}
{tmpl_var name="installed"}{tmpl_var name="package_title"}{tmpl_var name="package_description"}ispapp{tmpl_var name="package_id"} - - -
{tmpl_var name='no_packages_txt'}
-
- - \ No newline at end of file diff --git a/interface/web/admin/templates/software_repo_edit.htm b/interface/web/admin/templates/software_repo_edit.htm deleted file mode 100644 index 3aa6c61fc600a6e9cf5383f56cebc68601bc591a..0000000000000000000000000000000000000000 --- a/interface/web/admin/templates/software_repo_edit.htm +++ /dev/null @@ -1,33 +0,0 @@ - -

- - - -
- -
-
- -
-
- -
-
- -
-
- -
- {tmpl_var name='active'} -
-
- - - - -
- - -
\ No newline at end of file diff --git a/interface/web/admin/templates/software_repo_list.htm b/interface/web/admin/templates/software_repo_list.htm deleted file mode 100644 index d408896de6f943ba0a5d23240f37eefb58dc858a..0000000000000000000000000000000000000000 --- a/interface/web/admin/templates/software_repo_list.htm +++ /dev/null @@ -1,58 +0,0 @@ - -

- - -

{tmpl_var name="toolsarea_head_txt"}

- - - - - - -

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 
- -
{tmpl_var name="active"}{tmpl_var name="repo_name"}{tmpl_var name="repo_url"} - -
{tmpl_var name='globalsearch_noresults_text_txt'}
-
- - \ No newline at end of file diff --git a/interface/web/admin/templates/software_update_list.htm b/interface/web/admin/templates/software_update_list.htm deleted file mode 100644 index 6776b66a7a04ea4d3feb66fbe99dcf9b3e072b98..0000000000000000000000000000000000000000 --- a/interface/web/admin/templates/software_update_list.htm +++ /dev/null @@ -1,53 +0,0 @@ - -

- - - Tools - -
- -
- - -
- - -

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
{tmpl_var name="installed"}{tmpl_var name="update_title"}{tmpl_var name="version"}
{tmpl_var name='no_updates_txt'}
-
- - \ No newline at end of file diff --git a/interface/web/admin/templates/system_config_dns_ca_edit.htm b/interface/web/admin/templates/system_config_dns_ca_edit.htm index 739c3f93fea5c3dac21b9e902d6f9d02d7aa0de2..5567f60d538176624dbd11a852ea23a33144834a 100644 --- a/interface/web/admin/templates/system_config_dns_ca_edit.htm +++ b/interface/web/admin/templates/system_config_dns_ca_edit.htm @@ -35,7 +35,7 @@
- - + +
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'} + +
+ +
+ {tmpl_var name='dns_show_zoneexport'} +
+
+
-
\ No newline at end of file + diff --git a/interface/web/admin/templates/system_config_mail_edit.htm b/interface/web/admin/templates/system_config_mail_edit.htm index 526da2502a84d7c5756744f7f7f0c7a8b32fd1ab..ac9271a9cf2c11854ad253d917d13fa06a6985ef 100644 --- a/interface/web/admin/templates/system_config_mail_edit.htm +++ b/interface/web/admin/templates/system_config_mail_edit.htm @@ -1,16 +1,21 @@ - -

- - -
{tmpl_var name='enable_custom_login'}
+
+ +
+ {tmpl_var name='enable_welcome_mail'} +
+
+
+ +
+ {tmpl_var name='show_per_domain_relay_options'} +
+
@@ -84,10 +89,10 @@ {tmpl_var name='default_mailserver'}
- - + + - +
diff --git a/interface/web/admin/templates/system_config_misc_edit.htm b/interface/web/admin/templates/system_config_misc_edit.htm index 45bdfcd2758b8a757f12b589e7ded692b1f284a5..5c57eeb9a668fcdcfffa93dffaef4a406552a641 100644 --- a/interface/web/admin/templates/system_config_misc_edit.htm +++ b/interface/web/admin/templates/system_config_misc_edit.htm @@ -1,196 +1,230 @@ - -

- -
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
{tmpl_var name='available_dashlets_note_txt'} {tmpl_var name="available_dashlets_txt"} -
-
- -
{tmpl_var name='available_dashlets_note_txt'} {tmpl_var name="available_dashlets_txt"} -
-
- -
{tmpl_var name='available_dashlets_note_txt'} {tmpl_var name="available_dashlets_txt"} -
-
- -
{tmpl_var name='available_dashlets_note_txt'} {tmpl_var name="available_dashlets_txt"} -
-
- -
{tmpl_var name='available_dashlets_note_txt'} {tmpl_var name="available_dashlets_txt"} -
-
- -
{tmpl_var name='available_dashlets_note_txt'} {tmpl_var name="available_dashlets_txt"} -
-
- -
- {tmpl_var name='tab_change_discard'} -
-
-
- -
- {tmpl_var name='tab_change_warning'}
{tmpl_var name='tab_change_warning_note_txt'} -
-
-
- -
- {tmpl_var name='use_loadindicator'}
{tmpl_var name='f5_to_reload_js_txt'} -
-
-
- -
- {tmpl_var name='use_combobox'}
{tmpl_var name='f5_to_reload_js_txt'} -
-
-
- -
-
- -
-
- -
-
- -
-
- -
- {tmpl_var name='session_allow_endless'} -
-
-
- -
-
- -
-
-
- -
- {tmpl_var name='maintenance_mode'} -
-
- - -

-
- -

-
- - -
- - -
+ +
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+ +
{tmpl_var name='available_dashlets_note_txt'} {tmpl_var name="available_dashlets_txt"} +
+
+
+ +
{tmpl_var name='available_dashlets_note_txt'} {tmpl_var name="available_dashlets_txt"} +
+
+
+ +
{tmpl_var name='available_dashlets_note_txt'} {tmpl_var name="available_dashlets_txt"} +
+
+
+ +
{tmpl_var name='available_dashlets_note_txt'} {tmpl_var name="available_dashlets_txt"} +
+
+
+ +
{tmpl_var name='available_dashlets_note_txt'} {tmpl_var name="available_dashlets_txt"} +
+
+
+ +
{tmpl_var name='available_dashlets_note_txt'} {tmpl_var name="available_dashlets_txt"} +
+
+
+ +
+ {tmpl_var name='tab_change_discard'} +
+
+
+ +
+ {tmpl_var name='tab_change_warning'}
{tmpl_var name='tab_change_warning_note_txt'} +
+
+
+ +
+ {tmpl_var name='use_loadindicator'}
{tmpl_var name='f5_to_reload_js_txt'} +
+
+
+ +
+ {tmpl_var name='use_combobox'}
{tmpl_var name='f5_to_reload_js_txt'} +
+
+
+ +
+ {tmpl_var name='show_support_messages'} +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+ {tmpl_var name='session_allow_endless'} +
+
+
+ +
+
+
+ +
+
+
+
+ +
+ {tmpl_var name='maintenance_mode'} +
+
+
+ +
+ +
+
+ +
+

+ +

+
+
+ +
+
+ +
+
+
    + +
+
+
+
+ +
+
+ + +
+
+ --> diff --git a/interface/web/admin/templates/system_config_sites_edit.htm b/interface/web/admin/templates/system_config_sites_edit.htm index a0f95e479a36bcdf336a5b723a6bae4a2c04cc7a..9a36e3275ee2dcf9348cc559f76e89c63171f1e3 100644 --- a/interface/web/admin/templates/system_config_sites_edit.htm +++ b/interface/web/admin/templates/system_config_sites_edit.htm @@ -1,10 +1,3 @@ - -

- - -
@@ -33,6 +26,12 @@
+
+ +
+ {tmpl_var name='client_protection'} +
+
@@ -62,6 +61,12 @@
{tmpl_var name='reseller_can_use_options'}
+
+
+ +
+ {tmpl_var name='show_aps_menu'} {tmpl_var name='show_aps_menu_note_txt'} {tmpl_var name='show_aps_menu_note_url_txt'} +
@@ -81,9 +86,32 @@ {tmpl_var name='default_dbserver'}
- +
+ +
+ {tmpl_var name='disable_client_remote_dbserver'} +
+
+
+ +
+
+
+ +
+
+
+
+ +
+ {tmpl_var name='le_caa_autocreate_options'} +
+
+ - +
diff --git a/interface/web/admin/templates/users_groups_edit.htm b/interface/web/admin/templates/users_groups_edit.htm index 5f09bfa8eaa4081b7244162f73e45c2c933b975f..112791dc4c7ac34644733fa4c66445cfc89bbe9a 100644 --- a/interface/web/admin/templates/users_groups_edit.htm +++ b/interface/web/admin/templates/users_groups_edit.htm @@ -1,10 +1,3 @@ - -

- - -
-
- -
 
{tmpl_var name='generate_password_txt'} -
+
+ +
+
+ + + + +
+
+
@@ -28,6 +28,15 @@
+
+ +
+ +
+
+
@@ -70,10 +79,10 @@ {tmpl_var name='lost_password_function'}
- - + + - +
diff --git a/interface/web/capp.php b/interface/web/capp.php index 39392691f8908276dd660d63988b387dee9320d7..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}$/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 d92dc5600849f4353eef4ed030fe67d362973ee3..d28e14a5c2bd175f0e613cf077a0dc641d678f23 100644 --- a/interface/web/client/client_del.php +++ b/interface/web/client/client_del.php @@ -51,6 +51,34 @@ $app->load('tform_actions'); class page_action extends tform_actions { + // db_table => info_field for onDelete - empty = show only the amount + private $tables = array( + 'cron' => '', + 'client' => 'contact_name', + 'dns_rr' => '', + 'dns_soa' => 'origin', + 'dns_slave' => 'origin', + 'domain' => 'domain', + 'ftp_user' => 'username', + 'mail_access' => 'source', + 'mail_content_filter' => '', + 'mail_forwarding' => '', + 'mail_get' => '', + 'mail_mailinglist' => 'listname', + 'mail_user' => 'email', + 'mail_user_filter' => '', + 'mail_domain' => 'domain', + 'shell_user' => 'username', + 'spamfilter_users' => '', + 'spamfilter_wblist' => '', + 'support_message' => '', + 'web_domain' => 'domain', + 'web_folder' => 'path', + 'web_folder_user' => 'username', + 'web_database_user' => 'database_user', + 'web_database' => 'database_name', + ); + function onDelete() { global $app, $conf, $list_def_file, $tform_def_file; @@ -80,19 +108,27 @@ class page_action extends tform_actions { $this->dataRecord = $app->tform->getDataRecord($this->id); $client_id = $app->functions->intval($this->dataRecord['client_id']); $client_group = $app->db->queryOneRecord("SELECT groupid FROM sys_group WHERE client_id = ?", $client_id); - - // Get all records (sub-clients, mail, web, etc....) of this client. - $tables = 'cron,client,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'; - $tables_array = explode(',', $tables); - $client_group_id = $app->functions->intval($client_group['groupid']); - $table_list = array(); + $client_group_id = $app->functions->intval($client_group['groupid']); if($client_group_id > 1) { - foreach($tables_array as $table) { + + $client = $app->db->queryOneRecord("SELECT CONCAT(IF(client.company_name != '', CONCAT(client.company_name, ' :: '), ''), IF(client.contact_firstname != '', CONCAT(client.contact_firstname, ' '), ''), client.contact_name, ' (', client.username, IF(client.customer_no != '', CONCAT(', ', client.customer_no), ''), ')') as contactname FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $client_group_id); + + $app->tpl->setVar('contactname', $client['contactname']); + + foreach($this->tables as $table => $field) { if($table != '') { $records = $app->db->queryAllRecords("SELECT * FROM ?? WHERE sys_groupid = ?", $table, $client_group_id); - $number = count($records); - if($number > 0) $table_list[] = array('table' => $table."(".$number.")"); + if(is_array($records) && !empty($records) && $field !== false) { + $data = array(); + $number = count($records); + foreach($records as $rec) { + if($field != '' && $field !== false) $data['data'] .= '
  • '.$rec[$field].'
  • '; + } + $data['count'] = $number; + $data['table'] = $table; + $table_list[] = $data; + } } } } @@ -100,7 +136,6 @@ class page_action extends tform_actions { $app->tpl->setVar('id', $this->id); $app->tpl->setVar('number_records', $number); $app->tpl->setLoop('records', $table_list); - //* load language file $lng_file = 'lib/lang/'.$app->functions->check_language($_SESSION['s']['language']).'_client_del.lng'; include $lng_file; @@ -122,6 +157,8 @@ class page_action extends tform_actions { function onBeforeDelete() { global $app, $conf; + // DUPLICATE CODE IN interface/lib/classes/remote.d/client.inc.php + $client_id = $app->functions->intval($this->dataRecord['client_id']); if($client_id > 0) { @@ -138,11 +175,9 @@ class page_action extends tform_actions { $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,client,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_folder,web_folder_user,domain,mail_mailinglist,spamfilter_wblist'; - $tables_array = explode(',', $tables); $client_group_id = $app->functions->intval($client_group['groupid']); if($client_group_id > 1) { - foreach($tables_array as $table) { + foreach($this->tables as $table => $field) { if($table != '') { //* find the primary ID of the table $table_info = $app->db->tableInfo($table); @@ -150,6 +185,7 @@ class page_action extends tform_actions { foreach($table_info as $tmp) { if($tmp['option'] == 'primary') $index_field = $tmp['name']; } + //* Delete the records if($index_field != '') { $records = $app->db->queryAllRecords("SELECT * FROM ?? WHERE sys_groupid = ? ORDER BY ?? DESC", $table, $client_group_id, $index_field); @@ -181,6 +217,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 c5fc6be61087eff42abd4b32fb3aacd7d2f28936..6004e593d4b4f730df07245233b0548717a13a56 100644 --- a/interface/web/client/client_edit.php +++ b/interface/web/client/client_edit.php @@ -116,7 +116,7 @@ class page_action extends tform_actions { } } } - + //* Resellers shall not be able to create another reseller if($_SESSION["s"]["user"]["typ"] == 'user') { $this->dataRecord['limit_client'] = 0; @@ -143,7 +143,7 @@ class page_action extends tform_actions { $this->oldTemplatesAssigned = array(); } - $this->_template_additional = explode('/', $this->dataRecord['template_additional']); + $this->_template_additional = (isset($this->dataRecord['template_additional']) && $this->dataRecord['template_additional'] != '')?explode('/', $this->dataRecord['template_additional']):array(); $this->dataRecord['template_additional'] = ''; parent::onSubmit(); @@ -193,7 +193,7 @@ class page_action extends tform_actions { // old style $sql = "SELECT template_additional FROM client WHERE client_id = ?"; $result = $app->db->queryOneRecord($sql, $this->id); - $tplAdd = explode("/", $result['template_additional']); + $tplAdd = (isset($result['template_additional']) && $result['template_additional'] != '')?explode("/", $result['template_additional']):array(); $text = ''; foreach($tplAdd as $item){ if (trim($item) != ''){ @@ -205,18 +205,35 @@ class page_action extends tform_actions { $app->tpl->setVar('template_additional_list', $text); $app->tpl->setVar('app_module', 'client'); - + + // Check wether per domain relaying is enabled or not + $global_config = $app->getconf->get_global_config('mail'); + if($global_config['show_per_domain_relay_options'] == 'y') { + $app->tpl->setVar("show_per_domain_relay_options", 1); + } 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); + } + + //* Set the 'customer no' default value if($this->id == 0) { - + if($app->auth->is_admin()) { //* Logged in User is admin //* get the system config $app->uses('getconf'); $system_config = $app->getconf->get_global_config(); if($system_config['misc']['customer_no_template'] != '') { - + //* Set customer no default $customer_no = $app->functions->intval($system_config['misc']['customer_no_start']+$system_config['misc']['customer_no_counter']); $customer_no_string = str_replace('[CUSTOMER_NO]',$customer_no,$system_config['misc']['customer_no_template']); @@ -227,7 +244,7 @@ class page_action extends tform_actions { //* get the record of the reseller $client_group_id = $app->functions->intval($_SESSION["s"]["user"]["default_group"]); $reseller = $app->db->queryOneRecord("SELECT client.client_id, client.customer_no_template, client.customer_no_counter, client.customer_no_start FROM sys_group,client WHERE client.client_id = sys_group.client_id and sys_group.groupid = ?", $client_group_id); - + if($reseller['customer_no_template'] != '') { if(isset($this->dataRecord['customer_no'])&& $this->dataRecord['customer_no']!='') $customer_no_string = $this->dataRecord['customer_no']; else { @@ -239,7 +256,7 @@ class page_action extends tform_actions { } } } - + if($app->auth->is_admin()) { // Fill the client select field $sql = "SELECT client.client_id, sys_group.groupid, sys_group.name, CONCAT(IF(client.company_name != '', CONCAT(client.company_name, ' :: '), ''), client.contact_name, ' (', client.username, IF(client.customer_no != '', CONCAT(', ', client.customer_no), ''), ')') as contactname FROM sys_group, client WHERE sys_group.client_id = client.client_id AND sys_group.client_id > 0 AND client.limit_client != 0 ORDER BY client.company_name, client.contact_name, sys_group.name"; @@ -258,7 +275,7 @@ class page_action extends tform_actions { } $app->tpl->setVar("parent_client_id", $client_select); } - + parent::onShowEnd(); } @@ -300,7 +317,7 @@ class page_action extends tform_actions { $app->auth->add_group_to_user($_SESSION['s']['user']['userid'], $groupid); $app->db->query("UPDATE client SET parent_client_id = ? WHERE client_id = ?", $_SESSION['s']['user']['client_id'], $this->id); } else { - if($this->dataRecord['parent_client_id'] > 0) { + if(isset($this->dataRecord['parent_client_id']) && $this->dataRecord['parent_client_id'] > 0) { //* get userid of the reseller and add it to the group of the client $tmp = $app->db->queryOneRecord("SELECT sys_user.userid FROM sys_user,sys_group WHERE sys_user.default_group = sys_group.groupid AND sys_group.client_id = ?", $this->dataRecord['parent_client_id']); $app->auth->add_group_to_user($tmp['userid'], $groupid); @@ -311,14 +328,14 @@ class page_action extends tform_actions { //* Set the default servers $tmp = $app->getconf->get_global_config('mail'); - $default_mailserver = $app->functions->intval($tmp['default_mailserver']); + $default_mailserver = (isset($tmp['default_mailserver']))?$app->functions->intval($tmp['default_mailserver']):0; if (!$default_mailserver) { $tmp = $app->db->queryOneRecord('SELECT server_id FROM server WHERE mail_server = 1 AND mirror_server_id = 0 LIMIT 0,1'); $default_mailserver = $app->functions->intval($tmp['server_id']); } $tmp = $app->getconf->get_global_config('sites'); - $default_webserver = $app->functions->intval($tmp['default_webserver']); - $default_dbserver = $app->functions->intval($tmp['default_dbserver']); + $default_webserver = (isset($tmp['default_webserver']))?$app->functions->intval($tmp['default_webserver']):0; + $default_dbserver = (isset($tmp['default_dbserver']))?$app->functions->intval($tmp['default_dbserver']):0; if (!$default_webserver) { $tmp = $app->db->queryOneRecord('SELECT server_id FROM server WHERE web_server = 1 AND mirror_server_id = 0 LIMIT 0,1'); $default_webserver = $app->functions->intval($tmp['server_id']); @@ -328,7 +345,7 @@ class page_action extends tform_actions { $default_dbserver = $app->functions->intval($tmp['server_id']); } $tmp = $app->getconf->get_global_config('dns'); - $default_dnsserver = $app->functions->intval($tmp['default_dnsserver']); + $default_dnsserver = (isset($tmp['default_dnsserver']))?$app->functions->intval($tmp['default_dnsserver']):0; if (!$default_dnsserver) { $tmp = $app->db->queryOneRecord('SELECT server_id FROM server WHERE dns_server = 1 AND mirror_server_id = 0 LIMIT 0,1'); $default_dnsserver = $app->functions->intval($tmp['server_id']); @@ -341,7 +358,7 @@ class page_action extends tform_actions { $app->uses('client_templates'); $app->client_templates->update_client_templates($this->id, $this->_template_additional); } - + if($this->dataRecord['customer_no'] == $this->dataRecord['customer_no_org']) { if($app->auth->is_admin()) { //* Logged in User is admin @@ -349,7 +366,7 @@ class page_action extends tform_actions { $app->uses('getconf'); $system_config = $app->getconf->get_global_config(); if($system_config['misc']['customer_no_template'] != '') { - + //* save new counter value $system_config['misc']['customer_no_counter']++; $system_config_str = $app->ini_parser->get_ini_string($system_config); @@ -360,7 +377,7 @@ class page_action extends tform_actions { //* get the record of the reseller $client_group_id = $app->functions->intval($_SESSION["s"]["user"]["default_group"]); $reseller = $app->db->queryOneRecord("SELECT client.client_id, client.customer_no_template, client.customer_no_counter, client.customer_no_start FROM sys_group,client WHERE client.client_id = sys_group.client_id and sys_group.groupid = ?", $client_group_id); - + if($reseller['customer_no_template'] != '') { //* save new counter value $customer_no_counter = $app->functions->intval($reseller['customer_no_counter']+1); @@ -368,7 +385,7 @@ class page_action extends tform_actions { } } } - + //* Send welcome email $client_group_id = $app->functions->intval($_SESSION["s"]["user"]["default_group"]); $sql = "SELECT * FROM client_message_template WHERE template_type = 'welcome' AND sys_groupid = ?"; @@ -393,7 +410,7 @@ class page_action extends tform_actions { $subject = str_replace('{'.$key.'}', $val, $subject); } } - + //* Get sender address if($app->auth->is_admin()) { $app->uses('getconf'); @@ -408,7 +425,7 @@ class page_action extends tform_actions { //* Send the email $app->functions->mail($client['email'], $subject, $message, $from); } - + parent::onAfterInsert(); } @@ -441,122 +458,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 @@ -575,14 +486,14 @@ class page_action extends tform_actions { $sql = "UPDATE sys_user SET modules = ? WHERE client_id = ?"; $app->db->query($sql, $modules, $client_id); } - + //* Client has been moved to another reseller if($_SESSION['s']['user']['typ'] == 'admin' && isset($this->dataRecord['parent_client_id']) && $this->dataRecord['parent_client_id'] != $this->oldDataRecord['parent_client_id']) { //* Get groupid of the client $tmp = $app->db->queryOneRecord("SELECT groupid FROM sys_group WHERE client_id = ?", $this->id); $groupid = $tmp['groupid']; unset($tmp); - + //* Remove sys_user of old reseller from client group if($this->oldDataRecord['parent_client_id'] > 0) { //* get userid of the old reseller remove it from the group of the client @@ -590,7 +501,7 @@ class page_action extends tform_actions { $app->auth->remove_group_from_user($tmp['userid'], $groupid); unset($tmp); } - + //* Add sys_user of new reseller to client group if($this->dataRecord['parent_client_id'] > 0) { //* get userid of the reseller and add it to the group of the client diff --git a/interface/web/client/client_template_edit.php b/interface/web/client/client_template_edit.php index 8ae08b965ed2e321ee546eca8a01f3c2260695b2..7cc3ab5ff9742bd1d8b48bf0120a8399b6b1c954 100644 --- a/interface/web/client/client_template_edit.php +++ b/interface/web/client/client_template_edit.php @@ -51,19 +51,38 @@ $app->load('tform_actions'); class page_action extends tform_actions { - + function onSubmit() { global $app; - + //* Resellers shall not be able to create another reseller or set reseller specific settings if($_SESSION["s"]["user"]["typ"] == 'user') { $this->dataRecord['limit_client'] = 0; $this->dataRecord['limit_domainmodule'] = 0; } - + parent::onSubmit(); } - + + function onShowEnd() { + global $app; + // Check wether per domain relaying is enabled or not + $global_config = $app->getconf->get_global_config('mail'); + if($global_config['show_per_domain_relay_options'] == 'y') { + $app->tpl->setVar("show_per_domain_relay_options", 1); + } 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(); + } + function onBeforeUpdate() { global $app; diff --git a/interface/web/client/domain_edit.php b/interface/web/client/domain_edit.php index 094e1899be3b8b7eb16f0c1b322d092884d5e851..af7b900b9109a475b20b238c4060f4d5135c635f 100644 --- a/interface/web/client/domain_edit.php +++ b/interface/web/client/domain_edit.php @@ -67,7 +67,7 @@ class page_action extends tform_actions { function onShowEnd() { global $app, $conf, $wb; - + if($_SESSION["s"]["user"]["typ"] != 'admin' && $this->id == 0) { if(!$app->tform->checkClientLimit('limit_domainmodule')) { $app->uses('ini_parser,getconf'); @@ -100,7 +100,7 @@ class page_action extends tform_actions { $client_group_id = $app->functions->intval($_SESSION["s"]["user"]["default_group"]); $client = $app->db->queryOneRecord("SELECT client.client_id, client.contact_name, CONCAT(IF(client.company_name != '', CONCAT(client.company_name, ' :: '), ''), client.contact_name, ' (', client.username, IF(client.customer_no != '', CONCAT(', ', client.customer_no), ''), ')') as contactname, sys_group.name FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $client_group_id); $client = $app->functions->htmlentities($client); - + // Fill the client select field $sql = "SELECT sys_group.groupid, sys_group.name, CONCAT(IF(client.company_name != '', CONCAT(client.company_name, ' :: '), ''), client.contact_name, ' (', client.username, IF(client.customer_no != '', CONCAT(', ', client.customer_no), ''), ')') as contactname FROM sys_group, client WHERE sys_group.client_id = client.client_id AND client.parent_client_id = ? ORDER BY client.company_name, client.contact_name, sys_group.name"; //die($sql); diff --git a/interface/web/client/form/client.tform.php b/interface/web/client/form/client.tform.php index 57d7ae1833415dd93d95b8e57e7c035f9cef6461..e49103d0b7e2be95634d6dc7b95acc5f50f0fe0f 100644 --- a/interface/web/client/form/client.tform.php +++ b/interface/web/client/form/client.tform.php @@ -325,7 +325,7 @@ $form["tabs"]['address'] = array ( 'country' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'SELECT', - 'default' => (isset($conf['language']) ? strtoupper($conf['language']) : ''), + 'default' => (isset($conf['default_country'])) ? strtoupper($conf['default_country']) : ((isset($conf['language'])) ? strtoupper($conf['language']) : ''), 'datasource' => array ( 'type' => 'SQL', 'querystring' => 'SELECT iso,printable_name FROM country ORDER BY printable_name ASC', 'keyfield' => 'iso', @@ -397,8 +397,8 @@ $form["tabs"]['address'] = array ( 2 => array( 'event' => 'SAVE', 'type' => 'TOLOWER') ), - 'validators' => array ( - 0 => array ( 'type' => 'ISEMAIL', 'errmsg'=> 'email_error_isemail'), + 'validators' => array ( + 0 => array ( 'type' => 'ISEMAILADDRESS', 'errmsg'=> 'email_error_isemail'), 1 => array ( 'type' => 'NOTEMPTY', 'errmsg'=> 'email_error_empty'), ), @@ -420,7 +420,7 @@ $form["tabs"]['address'] = array ( 1 => array( 'event' => 'SAVE', 'type' => 'STRIPNL') ), - 'default' => 'http://', + 'default' => 'https://', 'value' => '', 'separator' => '', 'width' => '30', @@ -628,7 +628,7 @@ $form["tabs"]['address'] = array ( 'type' => 'TOLOWER') ), 'validators' => array ( - 0 => array ( 'type' => 'ISEMAIL', 'allowempty' => 'y', 'errmsg'=> 'email_error_isemail'), + 0 => array ( 'type' => 'ISEMAILADDRESS', 'allowempty' => 'y', 'errmsg'=> 'email_error_isemail'), ), 'default' => '', 'value' => '', @@ -847,6 +847,20 @@ $form["tabs"]['limits'] = array ( 'rows' => '', 'cols' => '' ), + 'limit_mail_wblist' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_mail_wblist_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), 'limit_mailfilter' => array ( 'datatype' => 'INTEGER', 'formtype' => 'TEXT', @@ -931,6 +945,20 @@ $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', + 'default' => 'n', + 'valuelimit' => 'client:limit_relayhost', + 'value' => array(0 => 'n', 1 => 'y') + ), 'default_xmppserver' => array ( 'datatype' => 'INTEGER', 'formtype' => 'SELECT', @@ -992,42 +1020,49 @@ $form["tabs"]['limits'] = array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_xmpp_muc', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_xmpp_anon' => array( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_xmpp_anon', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_xmpp_vjud' => array( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_xmpp_vjud', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_xmpp_proxy' => array( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_xmpp_proxy', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_xmpp_status' => array( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_xmpp_status', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_xmpp_pastebin' => array( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_xmpp_pastebin', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_xmpp_httparchive' => array( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_xmpp_httparchive', 'value' => array(0 => 'n', 1 => 'y') ), 'default_webserver' => array ( @@ -1094,67 +1129,77 @@ $form["tabs"]['limits'] = array ( ), 'default' => '', 'separator' => ',', - 'valuelimit' => 'system:sites:web_php_options', + 'valuelimit' => 'system:sites:web_php_options;client:web_php_options', 'value' => array('no' => 'Disabled', 'fast-cgi' => 'Fast-CGI', 'cgi' => 'CGI', 'mod' => 'Mod-PHP', 'suphp' => 'SuPHP', 'php-fpm' => 'PHP-FPM', 'hhvm' => 'HHVM') ), 'limit_cgi' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_cgi', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_ssi' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_ssi', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_perl' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_perl', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_ruby' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_ruby', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_python' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_python', 'value' => array(0 => 'n', 1 => 'y') ), 'force_suexec' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'y', + 'valuelimit' => 'client:force_suexec', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_hterror' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_hterror', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_wildcard' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_wildcard', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_ssl' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_ssl', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_ssl_letsencrypt' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_ssl_letsencrypt', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_web_aliasdomain' => array ( @@ -1242,12 +1287,14 @@ $form["tabs"]['limits'] = array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'y', + 'valuelimit' => 'client:limit_backup', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_directive_snippets' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_directive_snippets', 'value' => array(0 => 'n', 1 => 'y') ), 'default_dnsserver' => array ( @@ -1433,6 +1480,7 @@ $form["tabs"]['limits'] = array ( 'datatype' => 'VARCHAR', 'formtype' => 'SELECT', 'default' => '', + 'valuelimit' => 'client:limit_cron_type', 'value' => array('full' => 'Full Cron', 'chrooted' => 'Chrooted Cron', 'url' => 'URL Cron') ), 'limit_cron_frequency' => array ( @@ -1486,6 +1534,7 @@ $form["tabs"]['limits'] = array ( 'keyfield'=> 'template_id', 'valuefield'=> 'template_name' ), + 'valuelimit' => 'client:limit_openvz_vm_template_id', 'value' => array(0 => ' ') ), 'limit_aps' => array ( diff --git a/interface/web/client/form/client_template.tform.php b/interface/web/client/form/client_template.tform.php index 1da5cdafcd845b83401eeda28b0ceb7a00d2f0de..adf72670f8f01f97a1bc02e8a9e35b797191b09c 100644 --- a/interface/web/client/form/client_template.tform.php +++ b/interface/web/client/form/client_template.tform.php @@ -256,6 +256,20 @@ $form["tabs"]['limits'] = array ( 'rows' => '', 'cols' => '' ), + 'limit_mail_wblist' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_mail_wblist_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), 'limit_mailfilter' => array ( 'datatype' => 'INTEGER', 'formtype' => 'TEXT', @@ -339,7 +353,22 @@ $form["tabs"]['limits'] = array ( 'maxlength' => '10', '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', + 'default' => 'n', + 'valuelimit' => 'client:limit_relayhost', + 'value' => array(0 => 'n', 1 => 'y') + ), + /* 'default_xmppserver' => array ( 'datatype' => 'INTEGER', 'formtype' => 'SELECT', @@ -401,42 +430,49 @@ $form["tabs"]['limits'] = array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_xmpp_muc', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_xmpp_anon' => array( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_xmpp_anon', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_xmpp_vjud' => array( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_xmpp_vjud', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_xmpp_proxy' => array( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_xmpp_proxy', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_xmpp_status' => array( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_xmpp_status', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_xmpp_pastebin' => array( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_xmpp_pastebin', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_xmpp_httparchive' => array( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_xmpp_httparchive', 'value' => array(0 => 'n', 1 => 'y') ),/* 'default_webserver' => array ( @@ -495,67 +531,77 @@ $form["tabs"]['limits'] = array ( 'formtype' => 'CHECKBOXARRAY', 'default' => '', 'separator' => ',', - 'valuelimit' => 'system:sites:web_php_options', + 'valuelimit' => 'system:sites:web_php_options;client:web_php_options', 'value' => array('no' => 'Disabled', 'fast-cgi' => 'Fast-CGI', 'cgi' => 'CGI', 'mod' => 'Mod-PHP', 'suphp' => 'SuPHP', 'php-fpm' => 'PHP-FPM', 'hhvm' => 'HHVM') ), 'limit_cgi' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_cgi', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_ssi' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_ssi', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_perl' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_perl', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_ruby' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_ruby', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_python' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_python', 'value' => array(0 => 'n', 1 => 'y') ), 'force_suexec' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'y', + 'valuelimit' => 'client:force_suexec', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_hterror' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_hterror', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_wildcard' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_wildcard', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_ssl' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_ssl', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_ssl_letsencrypt' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_ssl_letsencrypt', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_web_aliasdomain' => array ( @@ -646,12 +692,14 @@ $form["tabs"]['limits'] = array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'y', + 'valuelimit' => 'client:limit_backup', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_directive_snippets' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_directive_snippets', 'value' => array(0 => 'n', 1 => 'y') ),/* 'default_dnsserver' => array ( @@ -830,6 +878,7 @@ $form["tabs"]['limits'] = array ( 'datatype' => 'VARCHAR', 'formtype' => 'SELECT', 'default' => '', + 'valuelimit' => 'client:limit_cron_type', 'value' => array('full' => 'Full Cron', 'chrooted' => 'Chrooted Cron', 'url' => 'URL Cron') ), 'limit_cron_frequency' => array ( @@ -883,6 +932,7 @@ $form["tabs"]['limits'] = array ( 'keyfield'=> 'template_id', 'valuefield'=> 'template_name' ), + 'valuelimit' => 'client:limit_openvz_vm_template_id', 'value' => array(0 => ' ') ), 'limit_aps' => array ( diff --git a/interface/web/client/form/domain.tform.php b/interface/web/client/form/domain.tform.php index 2d3e1dbdd1781145ea9d06140333879c5fdd1ac6..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,30}$/', + '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 174c18081df4ff04139ec21642e045d71c1d899a..d48dea62299ca28d4b82c3fc65c337dd87b693c9 100644 --- a/interface/web/client/form/reseller.tform.php +++ b/interface/web/client/form/reseller.tform.php @@ -411,7 +411,7 @@ $form["tabs"]['address'] = array ( 1 => array( 'event' => 'SAVE', 'type' => 'STRIPNL') ), - 'default' => 'http://', + 'default' => 'https://', 'value' => '', 'separator' => '', 'width' => '30', @@ -838,6 +838,20 @@ $form["tabs"]['limits'] = array ( 'rows' => '', 'cols' => '' ), + 'limit_mail_wblist' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'ISINT', + 'errmsg'=> 'limit_mail_wblist_error_notint'), + ), + 'default' => '-1', + 'value' => '', + 'separator' => '', + 'width' => '10', + 'maxlength' => '10', + 'rows' => '', + 'cols' => '' + ), 'limit_mailfilter' => array ( 'datatype' => 'INTEGER', 'formtype' => 'TEXT', @@ -922,6 +936,18 @@ $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', + 'default' => 'n', + 'value' => array(0 => 'n', 1 => 'y') + ), 'default_xmppserver' => array ( 'datatype' => 'INTEGER', 'formtype' => 'SELECT', diff --git a/interface/web/client/lib/lang/ar.lng b/interface/web/client/lib/lang/ar.lng index 245991ff9df7799883342f9d8680b8150fc605a7..f129f4273fe0211b5a16dd15dcc92c44fc18c242 100644 --- a/interface/web/client/lib/lang/ar.lng +++ b/interface/web/client/lib/lang/ar.lng @@ -17,6 +17,7 @@ $wb['Messaging'] = 'Messaging'; $wb['Send email'] = 'Send Email'; $wb['Edit Client Circle'] = 'Edit Client Circle'; $wb['Domains'] = 'Domains'; +$wb['Add Domain'] = 'Add Domain'; $wb['domain_txt'] = 'Domain'; $wb['client_txt'] = 'Client'; $wb['error_domain_in mailuse'] = 'This domain cannot be deleted, because it is in use as mail-domain'; diff --git a/interface/web/client/lib/lang/ar_client.lng b/interface/web/client/lib/lang/ar_client.lng index 71bc0fc1f7ce18f4dfcfaeea894684445c1d4d12..8b6ff765c9692163f0320df1fe9acc6e3a3bdfc9 100644 --- a/interface/web/client/lib/lang/ar_client.lng +++ b/interface/web/client/lib/lang/ar_client.lng @@ -6,12 +6,14 @@ $wb['limit_mailaliasdomain_txt'] = 'Max. number of domain 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['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'; @@ -37,6 +39,7 @@ $wb['company_txt'] = 'Company'; $wb['title_txt'] = 'Title'; $wb['firstname_txt'] = 'Firstname'; $wb['surname_txt'] = 'Surname'; +$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'; @@ -68,6 +71,7 @@ $wb['limit_mailaliasdomain_error_notint'] = 'The email domain alias limit must b $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.'; @@ -107,7 +111,7 @@ $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 SSH 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'] = 'Delete additional template'; @@ -146,7 +150,7 @@ $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 all webs etc.)'; +$wb['locked_txt'] = 'Locked (disables everything except DNS)'; $wb['canceled_txt'] = 'Canceled (disables client login)'; $wb['gender_txt'] = 'Title'; $wb['gender_m_txt'] = 'Mr.'; @@ -200,5 +204,5 @@ $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'; -?> diff --git a/interface/web/client/lib/lang/ar_client_del.lng b/interface/web/client/lib/lang/ar_client_del.lng index 0932e9568ac478948a00b84b0c50acaf2ce0c7c2..21ddcb9ea44905b316d6830ae688abda9125eaef 100644 --- a/interface/web/client/lib/lang/ar_client_del.lng +++ b/interface/web/client/lib/lang/ar_client_del.lng @@ -4,4 +4,7 @@ $wb['delete_explanation'] = 'This action will delete the following number of rec $wb['btn_save_txt'] = 'Delete the client'; $wb['btn_cancel_txt'] = 'Cancel without deleting the client'; $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'; ?> diff --git a/interface/web/client/lib/lang/ar_client_message.lng b/interface/web/client/lib/lang/ar_client_message.lng index 6b2a872f10af4cb357413ee297331408c740a6c2..c211860f82ae12e9bb90b20eac64d34734505444 100644 --- a/interface/web/client/lib/lang/ar_client_message.lng +++ b/interface/web/client/lib/lang/ar_client_message.lng @@ -10,7 +10,7 @@ $wb['sender_invalid_error'] = 'Sender email invalid.'; $wb['subject_invalid_error'] = 'Subject is empty.'; $wb['message_invalid_error'] = 'Message is empty.'; $wb['email_sent_to_txt'] = 'Email sent to:'; -$wb['page_head_txt'] = 'Send customer information'; +$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'; diff --git a/interface/web/client/lib/lang/ar_client_template.lng b/interface/web/client/lib/lang/ar_client_template.lng index eb073b00e527789a9eddb1c92812bac751c3163a..464f1426bec1b804c03ffc63190f639cf8df4467 100644 --- a/interface/web/client/lib/lang/ar_client_template.lng +++ b/interface/web/client/lib/lang/ar_client_template.lng @@ -1,4 +1,5 @@ diff --git a/interface/web/client/lib/lang/ar_reseller.lng b/interface/web/client/lib/lang/ar_reseller.lng index 68e8a950f36cc62cc603e077401a697e6d8ea509..9f3ce64e8007a6dd75590e1e68f32586827d9561 100644 --- a/interface/web/client/lib/lang/ar_reseller.lng +++ b/interface/web/client/lib/lang/ar_reseller.lng @@ -5,12 +5,14 @@ $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['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'; @@ -36,6 +38,7 @@ $wb['company_txt'] = 'Company'; $wb['title_txt'] = 'Title'; $wb['firstname_txt'] = 'Firstname'; $wb['surname_txt'] = 'Surname'; +$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'; @@ -66,6 +69,7 @@ $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.'; @@ -107,7 +111,7 @@ $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 SSH 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'] = 'Delete additional template'; @@ -203,5 +207,6 @@ $wb['limit_database_quota_error_notint'] = 'The database quota limit must be a n $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'; -?> diff --git a/interface/web/client/lib/lang/bg.lng b/interface/web/client/lib/lang/bg.lng index c18e2e8fbd2bf71baf98c1a00441b913d682b626..e23521e598d670e7dc1a45f2fb738a996e7ef8fe 100644 --- a/interface/web/client/lib/lang/bg.lng +++ b/interface/web/client/lib/lang/bg.lng @@ -17,6 +17,7 @@ $wb['Messaging'] = 'Messaging'; $wb['Send email'] = 'Send Email'; $wb['Edit Client Circle'] = 'Edit Client Circle'; $wb['Domains'] = 'Domains'; +$wb['Add Domain'] = 'Add Domain'; $wb['domain_txt'] = 'Domain'; $wb['client_txt'] = 'Client'; $wb['error_domain_in mailuse'] = 'This domain cannot be deleted, because it is in use as mail-domain'; diff --git a/interface/web/client/lib/lang/bg_client.lng b/interface/web/client/lib/lang/bg_client.lng index 36da0a04229be37d60d8affd0ab35d0308672d07..233a7c9b2733733bfad7d03bb56a3e308e4aa733 100644 --- a/interface/web/client/lib/lang/bg_client.lng +++ b/interface/web/client/lib/lang/bg_client.lng @@ -5,12 +5,14 @@ $wb['limit_mailalias_txt'] = 'Макс. брой email aliases'; $wb['limit_mailforward_txt'] = 'Макс. брой email forwarders'; $wb['limit_mailcatchall_txt'] = 'Макс. брой email catchall accounts'; $wb['limit_mailrouting_txt'] = 'Макс. брой email routes'; +$wb['limit_mail_wblist_txt'] = 'Max. number of email white / blacklist entries'; $wb['limit_mailfilter_txt'] = 'Макс. брой email filters'; $wb['limit_fetchmail_txt'] = 'Макс. брой fetchmail accounts'; $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'; @@ -37,6 +39,7 @@ $wb['title_txt'] = 'Обръщение'; $wb['firstname_txt'] = 'Име'; $wb['surname_txt'] = 'Фамилия'; $wb['limit_client_txt'] = 'Макс. брой клиенти'; +$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'; @@ -63,6 +66,7 @@ $wb['limit_mailalias_error_notint'] = ' The email alias трябва да е ч $wb['limit_mailforward_error_notint'] = 'The email forward трябва да е число'; $wb['limit_mailcatchall_error_notint'] = 'The email catchall трябва да е число'; $wb['limit_mailrouting_error_notint'] = 'The email routing трябва да е число'; +$wb['limit_mail_wblist_error_notint'] = 'The email white / blacklist limit must be a number.'; $wb['limit_mailfilter_error_notint'] = 'The email filter трябва да е число'; $wb['limit_mailfetchmail_error_notint'] = 'The fetchmail трябва да е число'; $wb['limit_mailquota_error_notint'] = 'Размерът на пощенските кутии трябва да е число.'; @@ -107,7 +111,7 @@ $wb['limit_openvz_vm_txt'] = 'Макс. брой на Виртуалните с $wb['limit_openvz_vm_template_id_txt'] = 'Force virtual server template'; $wb['limit_openvz_vm_error_notint'] = 'The virtual server трябва да е число'; $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 SSH option.'; +$wb['ssh_chroot_notempty'] = 'No SSH chroot option selected. Select at least one option.'; $wb['add_additional_template_txt'] = 'Add additional template'; $wb['delete_additional_template_txt'] = 'Delete additional template'; $wb['username_error_collision'] = 'The username may not start with the word -web- or -web- followed by a number.'; @@ -146,7 +150,7 @@ $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 all webs etc.)'; +$wb['locked_txt'] = 'Locked (disables everything except DNS)'; $wb['canceled_txt'] = 'Canceled (disables client login)'; $wb['gender_txt'] = 'Title'; $wb['gender_m_txt'] = 'Mr.'; @@ -200,5 +204,5 @@ $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'; -?> diff --git a/interface/web/client/lib/lang/bg_client_del.lng b/interface/web/client/lib/lang/bg_client_del.lng index 54d4831d776453b5ab0fbc3e143640a00e127f3d..418abdc20ceb40fd31bc53d1bbadb792ac269f98 100644 --- a/interface/web/client/lib/lang/bg_client_del.lng +++ b/interface/web/client/lib/lang/bg_client_del.lng @@ -4,4 +4,7 @@ $wb['delete_explanation'] = 'This action will delete the following number of rec $wb['btn_save_txt'] = 'Изтрии клиента'; $wb['btn_cancel_txt'] = 'Отказ, без изтриване на клиента'; $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'; ?> diff --git a/interface/web/client/lib/lang/bg_client_message.lng b/interface/web/client/lib/lang/bg_client_message.lng index 671d454304146f1b47ab4d57838f88f504ed5b9e..c010372a38717c551edee7e5e089bb0b15c80f39 100644 --- a/interface/web/client/lib/lang/bg_client_message.lng +++ b/interface/web/client/lib/lang/bg_client_message.lng @@ -10,7 +10,7 @@ $wb['sender_invalid_error'] = 'Sender email invalid.'; $wb['subject_invalid_error'] = 'Полето с Тема е празно.'; $wb['message_invalid_error'] = 'Полето с съобщение е празно.'; $wb['email_sent_to_txt'] = 'Изпрати до:'; -$wb['page_head_txt'] = 'Send customer information'; +$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'; diff --git a/interface/web/client/lib/lang/bg_client_template.lng b/interface/web/client/lib/lang/bg_client_template.lng index 82c6c582a10e59b51e27c91a5e55d565495bb34a..393af633eb323c27eddf094195a82c82f95682d5 100644 --- a/interface/web/client/lib/lang/bg_client_template.lng +++ b/interface/web/client/lib/lang/bg_client_template.lng @@ -1,4 +1,5 @@ diff --git a/interface/web/client/lib/lang/bg_reseller.lng b/interface/web/client/lib/lang/bg_reseller.lng index 211b6daf93b0915d434bc4054161eb6a5f3622e0..bd25475c64b7d53f9039ee404fb9d352eca2db9f 100644 --- a/interface/web/client/lib/lang/bg_reseller.lng +++ b/interface/web/client/lib/lang/bg_reseller.lng @@ -5,12 +5,14 @@ $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'] = 'Квота на пощенската кутия'; $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'; @@ -36,6 +38,7 @@ $wb['company_txt'] = 'Компания'; $wb['title_txt'] = 'Обръщение'; $wb['firstname_txt'] = 'Първо име '; $wb['surname_txt'] = 'Фамилия'; +$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'; @@ -66,6 +69,7 @@ $wb['limit_mailalias_error_notint'] = 'The email alias трябва да е чи $wb['limit_mailforward_error_notint'] = 'The email forward трябва да е число'; $wb['limit_mailcatchall_error_notint'] = 'The email catchall трябва да е число'; $wb['limit_mailrouting_error_notint'] = 'The email routing трябва да е число'; +$wb['limit_mail_wblist_error_notint'] = 'The email white / blacklist limit must be a number.'; $wb['limit_mailfilter_error_notint'] = 'The email filter трябва да е число'; $wb['limit_mailfetchmail_error_notint'] = 'The fetchmail трябва да е число'; $wb['limit_mailquota_error_notint'] = 'The email quota трябва да е число'; @@ -107,7 +111,7 @@ $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 трябва да е число'; $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 SSH option.'; +$wb['ssh_chroot_notempty'] = 'No SSH chroot option selected. Select at least one option.'; $wb['add_additional_template_txt'] = 'Add additional template'; $wb['delete_additional_template_txt'] = 'Delete additional template'; $wb['username_error_collision'] = 'The username may not start with the word -web- or -web- followed by a number.'; @@ -203,5 +207,6 @@ $wb['limit_database_quota_error_notint'] = 'The database quota limit must be a n $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'; -?> diff --git a/interface/web/client/lib/lang/br.lng b/interface/web/client/lib/lang/br.lng index 538a3e2e85416715d0cc35ea3776f7026c5990c4..ebc3055eaa1fabd81356dd43c19b377b59804f57 100644 --- a/interface/web/client/lib/lang/br.lng +++ b/interface/web/client/lib/lang/br.lng @@ -14,16 +14,16 @@ $wb['error_has_clients'] = 'Esta revenda possui clientes associados. Certifique- $wb['add_additional_template_txt'] = 'Adicionar gabarito personalizado'; $wb['delete_additional_template_txt'] = 'Remover gabarito personalizado'; $wb['Messaging'] = 'Mensagens'; -$wb['Send email'] = 'Enviar e-mail'; +$wb['Send email'] = 'Enviar email'; $wb['Edit Client Circle'] = 'Editar círculo de clientes'; $wb['Domains'] = 'Domínios'; +$wb['Add Domain'] = 'Adicionar domínio'; $wb['domain_txt'] = 'Domínio'; $wb['client_txt'] = 'Cliente'; -$wb['error_domain_in dnsuse'] = 'Este domínio não pode ser removido pois é utilizado em uma zona dns.'; -$wb['error_domain_in dnsslaveuse'] = 'Este domínio não pode ser removido pois é utilizado em uma zona dns secundária.'; -$wb['error_domain_in mailuse'] = 'Este domínio não pode ser removido pois é utilizado como um domínio de e-mail.'; +$wb['error_domain_in dnsuse'] = 'Este domínio não pode ser removido pois é utilizado em uma zona DNS.'; +$wb['error_domain_in dnsslaveuse'] = 'Este domínio não pode ser removido pois é utilizado em uma zona DNS secundária.'; +$wb['error_domain_in mailuse'] = 'Este domínio não pode ser removido pois é utilizado como um domínio de email.'; $wb['error_domain_in webuse'] = 'Este domínio não pode ser removido pois é utilizado como um domínio de site.'; $wb['error_client_can_not_add_domain'] = 'Você não tem permissão para adicionar novos domínios.'; $wb['error_client_group_id_empty'] = 'Você deve selecionar um cliente.'; -$wb['Email-Templates'] = 'Gabaritos de e-mail'; -?> +$wb['Email-Templates'] = 'Gabaritos de email'; diff --git a/interface/web/client/lib/lang/br_client.lng b/interface/web/client/lib/lang/br_client.lng index c640be54fbe1d0220865606d75d6fb273b7bc263..58557a3a00860c55e399213c506b594d8d60d90f 100644 --- a/interface/web/client/lib/lang/br_client.lng +++ b/interface/web/client/lib/lang/br_client.lng @@ -1,18 +1,20 @@ diff --git a/interface/web/client/lib/lang/br_client_circle.lng b/interface/web/client/lib/lang/br_client_circle.lng index 6c6cb132718096bfddefebf37f4f7aae72ba0216..e0a745ed90adf391f608d19e7326e73dc4e6b753 100644 --- a/interface/web/client/lib/lang/br_client_circle.lng +++ b/interface/web/client/lib/lang/br_client_circle.lng @@ -6,4 +6,3 @@ $wb['circle_name_txt'] = 'Nome do círculo'; $wb['client_ids_txt'] = 'Clientes/Revendas'; $wb['description_txt'] = 'Descrição'; $wb['active_txt'] = 'Ativo'; -?> diff --git a/interface/web/client/lib/lang/br_client_circle_list.lng b/interface/web/client/lib/lang/br_client_circle_list.lng index 1c1a43f49aad36796541c4c268f0f80ff65f0496..5f7c0172644e1ab6dfd2fa99b3747fe73ba42a06 100644 --- a/interface/web/client/lib/lang/br_client_circle_list.lng +++ b/interface/web/client/lib/lang/br_client_circle_list.lng @@ -7,4 +7,3 @@ $wb['add_new_record_txt'] = 'Adicionar novo círculo'; $wb['filter_txt'] = 'Filtro'; $wb['delete_txt'] = 'Remover'; $wb['active_txt'] = 'Ativo'; -?> diff --git a/interface/web/client/lib/lang/br_client_del.lng b/interface/web/client/lib/lang/br_client_del.lng index 880c12c36a2ea0c936c8c319090b69f5e052cea1..ce138c609a5c02bca1c07d816a323e292332ae3a 100644 --- a/interface/web/client/lib/lang/br_client_del.lng +++ b/interface/web/client/lib/lang/br_client_del.lng @@ -4,4 +4,6 @@ $wb['delete_explanation'] = 'Esta ação removerá os seguintes registros associ $wb['btn_save_txt'] = 'Remover o cliente'; $wb['btn_cancel_txt'] = 'Cancelar sem remover o cliente'; $wb['confirm_client_delete_txt'] = 'Você tem certeza que deseja remover este cliente?'; -?> +$wb['list_head_txt'] = 'Remover cliente'; +$wb['table_txt'] = 'Tabela'; +$wb['data_txt'] = 'Dados'; diff --git a/interface/web/client/lib/lang/br_client_message.lng b/interface/web/client/lib/lang/br_client_message.lng index 75aa3480c5af620a875cd30b700928b9e0f0074c..a0b3c199405100111d6170c0be577d813ee47007 100644 --- a/interface/web/client/lib/lang/br_client_message.lng +++ b/interface/web/client/lib/lang/br_client_message.lng @@ -1,20 +1,19 @@ diff --git a/interface/web/client/lib/lang/br_client_message_template.lng b/interface/web/client/lib/lang/br_client_message_template.lng index 8fb0934837872af9fd6eebfe68ba219e382b96b2..dcf08c32a20156b9c440d3f69d8505981f5f41a4 100644 --- a/interface/web/client/lib/lang/br_client_message_template.lng +++ b/interface/web/client/lib/lang/br_client_message_template.lng @@ -1,13 +1,12 @@ +$wb['variables_description_txt'] = '(Variáveis de usuário e senha só estão disponíveis em email de boas-vindas.)'; +$wb['duplicate_welcome_error'] = 'Só pode existir um gabarito de email de boas-vindas. Edite o modelo existente ao invés de adicionar um novo.'; +$wb['subject_error_empty'] = 'Assunto está vazio.'; +$wb['message_error_empty'] = 'Mensagem está vazia.'; diff --git a/interface/web/client/lib/lang/br_client_message_template_list.lng b/interface/web/client/lib/lang/br_client_message_template_list.lng index 36737693548ded01de015f277df8c59104f881cd..3f9aef7b3a595e845681b67c2fbf26319dd9ae73 100644 --- a/interface/web/client/lib/lang/br_client_message_template_list.lng +++ b/interface/web/client/lib/lang/br_client_message_template_list.lng @@ -1,5 +1,4 @@ diff --git a/interface/web/client/lib/lang/br_client_template.lng b/interface/web/client/lib/lang/br_client_template.lng index c09c622bb2794a0cdf689ea31849ee75da65cf92..92bff5cb06e629bb1b83ccf4bdf2802fc2496fdc 100644 --- a/interface/web/client/lib/lang/br_client_template.lng +++ b/interface/web/client/lib/lang/br_client_template.lng @@ -1,80 +1,84 @@ +$wb['Client-Templates'] = 'Gabaritos de clientes'; +$wb['Template'] = 'Gabarito'; diff --git a/interface/web/client/lib/lang/br_client_template_list.lng b/interface/web/client/lib/lang/br_client_template_list.lng index 47bd2e5779ed45cbeef57ed9d7021b33bda5b7f3..7a81d5c907c658f0c1ac274a1b78fd8d1e256f9d 100644 --- a/interface/web/client/lib/lang/br_client_template_list.lng +++ b/interface/web/client/lib/lang/br_client_template_list.lng @@ -4,4 +4,3 @@ $wb['template_type_txt'] = 'Tipo'; $wb['template_name_txt'] = 'Nome do gabarito'; $wb['template_id_txt'] = 'ID do gabarito'; $wb['sys_groupid_txt'] = 'Revenda'; -?> diff --git a/interface/web/client/lib/lang/br_clients_list.lng b/interface/web/client/lib/lang/br_clients_list.lng index 8016151a9bd270bd389fce43947b3c19f14f5f69..a4047fd4d27ce58f0c08303c2aa4ff73251e678b 100644 --- a/interface/web/client/lib/lang/br_clients_list.lng +++ b/interface/web/client/lib/lang/br_clients_list.lng @@ -11,4 +11,3 @@ $wb['customer_no_txt'] = 'Código do cliente'; $wb['locked_txt'] = 'Bloqueado'; $wb['yes_txt'] = 'Sim'; $wb['no_txt'] = 'Não'; -?> diff --git a/interface/web/client/lib/lang/br_domain.lng b/interface/web/client/lib/lang/br_domain.lng index 988976d2ce5ef0da5f79ae5c6349505e9ffda855..0ebd82d63c921bed761c65e4a9cb986a4cd937a5 100644 --- a/interface/web/client/lib/lang/br_domain.lng +++ b/interface/web/client/lib/lang/br_domain.lng @@ -1,6 +1,5 @@ diff --git a/interface/web/client/lib/lang/br_domain_list.lng b/interface/web/client/lib/lang/br_domain_list.lng index 57ec6c10646e581fab6ce2ef160ec2a48b97182e..2d7db28a659a6cfc6349ca02b06b935eb27a6a2c 100644 --- a/interface/web/client/lib/lang/br_domain_list.lng +++ b/interface/web/client/lib/lang/br_domain_list.lng @@ -3,4 +3,3 @@ $wb['list_head_txt'] = 'Domínios'; $wb['add_new_record_txt'] = 'Adicionar novo domínio'; $wb['domain_txt'] = 'Domínio'; $wb['user_txt'] = 'Cliente'; -?> diff --git a/interface/web/client/lib/lang/br_reseller.lng b/interface/web/client/lib/lang/br_reseller.lng index 12a8a2953fbde3fa482f181e8a7839d8773577fc..fea2945178b27515760599e835e6a117f2c7fdf8 100644 --- a/interface/web/client/lib/lang/br_reseller.lng +++ b/interface/web/client/lib/lang/br_reseller.lng @@ -1,18 +1,20 @@ diff --git a/interface/web/client/lib/lang/br_resellers_list.lng b/interface/web/client/lib/lang/br_resellers_list.lng index 1f67e7f5934437c8f433c718738c6432bd5dc816..4417a64a19d1d5686bce627015b997c006949fdf 100644 --- a/interface/web/client/lib/lang/br_resellers_list.lng +++ b/interface/web/client/lib/lang/br_resellers_list.lng @@ -8,4 +8,3 @@ $wb['country_txt'] = 'País'; $wb['add_new_record_txt'] = 'Adicionar nova revenda'; $wb['customer_no_txt'] = 'Código do cliente'; $wb['username_txt'] = 'Usuário'; -?> diff --git a/interface/web/client/lib/lang/ca.lng b/interface/web/client/lib/lang/ca.lng index 730bd2de994eb13a09c15a3fbd17d11af5771d9a..c51dd2e83958ba48de80705d06c5fc4a9aea12c6 100644 --- a/interface/web/client/lib/lang/ca.lng +++ b/interface/web/client/lib/lang/ca.lng @@ -14,6 +14,7 @@ $wb['delete_additional_template_txt'] = 'Supprimer un modèle'; $wb['Messaging'] = 'Messagerie'; $wb['Edit Client Circle'] = 'Editer les groupes clients'; $wb['Domains'] = 'Domaines'; +$wb['Add Domain'] = 'Add Domain'; $wb['domain_txt'] = 'Domaine'; $wb['client_txt'] = 'Client'; $wb['error_domain_in mailuse'] = 'Ce domaine ne peut pas être supprimé, il est utilisé par un compte courriel'; diff --git a/interface/web/client/lib/lang/ca_client.lng b/interface/web/client/lib/lang/ca_client.lng index bfa38a340139fc3ecd84284828669a76937649e6..4482b8f2415cd068bdf22d9ea8e8bb1494b15cd2 100644 --- a/interface/web/client/lib/lang/ca_client.lng +++ b/interface/web/client/lib/lang/ca_client.lng @@ -5,12 +5,14 @@ $wb['limit_mailalias_txt'] = 'Nombre maximal d\'alias d\'email'; $wb['limit_mailforward_txt'] = 'Nombre maximal de routeurs d\'email'; $wb['limit_mailcatchall_txt'] = 'Nombre maximal de comptes collecteurs'; $wb['limit_mailrouting_txt'] = 'Nombre maximal de routes d\'email'; +$wb['limit_mail_wblist_txt'] = 'Max. number of email white / blacklist entries'; $wb['limit_mailfilter_txt'] = 'Nombre maximal de filtres d\'emails'; $wb['limit_fetchmail_txt'] = 'Nombre maximal de comptes récupérateur courriel'; $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'; @@ -36,6 +38,7 @@ $wb['title_txt'] = 'Titre'; $wb['firstname_txt'] = 'Prénom'; $wb['surname_txt'] = 'Nom'; $wb['limit_client_txt'] = 'Nombre maximal de clients'; +$wb['limit_relayhost_txt'] = 'Show SMTP relay host options'; $wb['limit_domain_txt'] = 'Nombre maximal de domaines'; $wb['limit_subdomain_txt'] = 'Nombre maximal de sous-domaines'; $wb['limit_webquota_txt'] = 'Limite du quota web'; @@ -61,6 +64,7 @@ $wb['limit_mailalias_error_notint'] = 'La limite d\'alias d\'email doit être un $wb['limit_mailforward_error_notint'] = 'La limite de routeurs d\'email doit être un nombre.'; $wb['limit_mailcatchall_error_notint'] = 'La limite de comptes collecteurs doit être un nombre.'; $wb['limit_mailrouting_error_notint'] = 'La limite de routes d\'email doit être un nombre.'; +$wb['limit_mail_wblist_error_notint'] = 'The email white / blacklist limit must be a number.'; $wb['limit_mailfilter_error_notint'] = 'La limite de filtres d\'email doit être un nombre.'; $wb['limit_mailfetchmail_error_notint'] = 'La limite de comptes récupérateur courriel doit être un nombre.'; $wb['limit_mailquota_error_notint'] = 'La limite du quota des boites d\'email doit être un nombre.'; @@ -144,7 +148,7 @@ $wb['aps_limits_txt'] = 'Nombre max d\'Installeur APS'; $wb['limit_aps_txt'] = 'Nombre max d\'instances APS'; $wb['limit_aps_error_notint'] = 'La limite d\'instances APS doit être un nombre'; $wb['default_slave_dnsserver_txt'] = 'Serveur DNS secondaire par défaut'; -$wb['locked_txt'] = 'Vérouillé (Désactive web, etc.)'; +$wb['locked_txt'] = 'Locked (disables everything except DNS)'; $wb['canceled_txt'] = 'Canceled (Désactive connexion Ispconfig)'; $wb['gender_txt'] = 'Title'; $wb['gender_m_txt'] = 'Mr.'; @@ -200,5 +204,5 @@ $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'; -?> diff --git a/interface/web/client/lib/lang/ca_client_del.lng b/interface/web/client/lib/lang/ca_client_del.lng index 2ec2d877bf8a49d7760ebb9b638834042e200341..4c4506c99b6cb480ea5b660857bd036631f7fd33 100644 --- a/interface/web/client/lib/lang/ca_client_del.lng +++ b/interface/web/client/lib/lang/ca_client_del.lng @@ -4,4 +4,7 @@ $wb['delete_explanation'] = 'Cette action va supprimer le nombre d\'enregistreme $wb['btn_save_txt'] = 'Effacer le client'; $wb['btn_cancel_txt'] = 'Annuler sans effacer le client'; $wb['confirm_client_delete_txt'] = 'Confirmez-vous la suppression de ce client ?'; +$wb['list_head_txt'] = 'Delete Client'; +$wb['table_txt'] = 'Table'; +$wb['data_txt'] = 'Data'; ?> diff --git a/interface/web/client/lib/lang/ca_client_template.lng b/interface/web/client/lib/lang/ca_client_template.lng index 6827753b5707b1043e0708242847fa3dbfb78a2d..2a0f6eac455066350e28e2cf2d6169dd4159ed0a 100644 --- a/interface/web/client/lib/lang/ca_client_template.lng +++ b/interface/web/client/lib/lang/ca_client_template.lng @@ -1,4 +1,5 @@ diff --git a/interface/web/client/lib/lang/ca_reseller.lng b/interface/web/client/lib/lang/ca_reseller.lng index f83d3aaff7f2cc3b9f4d626baf726b1f6519eedf..7d92ced9888ab9105744d8b615c37721955c464e 100644 --- a/interface/web/client/lib/lang/ca_reseller.lng +++ b/interface/web/client/lib/lang/ca_reseller.lng @@ -5,12 +5,14 @@ $wb['limit_mailalias_txt'] = 'Nombre maximal d\'alias d\'email'; $wb['limit_mailforward_txt'] = 'Nombre maximal de routeurs d\'email'; $wb['limit_mailcatchall_txt'] = 'Nombre maximal de comptes collecteurs'; $wb['limit_mailrouting_txt'] = 'Nombre maximal de routes d\'emails'; +$wb['limit_mail_wblist_txt'] = 'Max. number of email white / blacklist entries'; $wb['limit_mailfilter_txt'] = 'Nombre maximal de filtres d\'emails'; $wb['limit_fetchmail_txt'] = 'Nombre maximal de comptes récupérateur courriel'; $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'; @@ -35,6 +37,7 @@ $wb['company_txt'] = 'Entreprise'; $wb['title_txt'] = 'Titre'; $wb['firstname_txt'] = 'Prénom'; $wb['surname_txt'] = 'Nom'; +$wb['limit_relayhost_txt'] = 'Show SMTP relay host options'; $wb['limit_domain_txt'] = 'Nombre maximal de domaines'; $wb['limit_subdomain_txt'] = 'Nombre maximal de sous-domaines'; $wb['limit_webquota_txt'] = 'Limite du quota web'; @@ -64,6 +67,7 @@ $wb['limit_mailalias_error_notint'] = 'La limite d\'alias d\'email doit être un $wb['limit_mailforward_error_notint'] = 'La limite de routeurs d\'email doit être un nombre.'; $wb['limit_mailcatchall_error_notint'] = 'La limite de comptes collecteurs doit être un nombre.'; $wb['limit_mailrouting_error_notint'] = 'La limite de routes d\'email doit être un nombre.'; +$wb['limit_mail_wblist_error_notint'] = 'The email white / blacklist limit must be a number.'; $wb['limit_mailfilter_error_notint'] = 'La limite de filtres d\'email doit être un nombre.'; $wb['limit_mailfetchmail_error_notint'] = 'La limite de comptes récupérateur courriel doit être un nombre.'; $wb['limit_mailquota_error_notint'] = 'La limite du quota des boites d\'email doit être un nombre.'; @@ -203,5 +207,6 @@ $wb['limit_database_quota_error_notint'] = 'The database quota limit must be a n $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'; -?> diff --git a/interface/web/client/lib/lang/cz.lng b/interface/web/client/lib/lang/cz.lng index 447810f9401ae7f7f5adc0db53bb260232827e6d..f0c18e31fc6d0f4477eae0e800f9d813bb141abb 100644 --- a/interface/web/client/lib/lang/cz.lng +++ b/interface/web/client/lib/lang/cz.lng @@ -17,13 +17,13 @@ $wb['Messaging'] = 'Odesílání zpráv'; $wb['Send email'] = 'Odeslat e-mail'; $wb['Edit Client Circle'] = 'Upravit skupinu klientů'; $wb['Domains'] = 'Domény'; +$wb['Add Domain'] = 'Přidat doménu'; $wb['domain_txt'] = 'Doména'; $wb['client_txt'] = 'Klient'; $wb['error_domain_in mailuse'] = 'Tato doména nelze odstranit, protože je v používána jako poštovní doména'; $wb['error_domain_in webuse'] = 'Tato doména nelze odstranit, protože je v používána jako webová doména'; $wb['error_client_can_not_add_domain'] = 'Nemůžete přidat novou doménu'; $wb['error_client_group_id_empty'] = 'Musíte vybrat zákazníka
    '; -$wb['error_domain_in dnsuse'] = 'This domain cannot be deleted, because it is in use as dns zone'; -$wb['error_domain_in dnsslaveuse'] = 'This domain cannot be deleted, because it is in use as secondary dns zone'; -$wb['Email-Templates'] = 'E-mailové šablony'; -?> +$wb['error_domain_in dnsuse'] = 'Tuto doménu nelze odstranit, protože se používá jako zóna DNS'; +$wb['error_domain_in dnsslaveuse'] = 'Tuto doménu nelze odstranit, protože se používá jako sekundární dns zóna'; +$wb['Email-Templates'] = 'Poštovní šablony'; diff --git a/interface/web/client/lib/lang/cz_client.lng b/interface/web/client/lib/lang/cz_client.lng index 3351ac58e10e8732180d414ab3198f66aba5fc2e..691bac508a09cdf18debf37c3878096e3835757d 100644 --- a/interface/web/client/lib/lang/cz_client.lng +++ b/interface/web/client/lib/lang/cz_client.lng @@ -1,17 +1,19 @@ diff --git a/interface/web/client/lib/lang/cz_client_circle.lng b/interface/web/client/lib/lang/cz_client_circle.lng index f26e2d6d4b790622e0ba7809095d7063205bfe03..24b624a88ededb670b6024c9f98119799926ff91 100644 --- a/interface/web/client/lib/lang/cz_client_circle.lng +++ b/interface/web/client/lib/lang/cz_client_circle.lng @@ -6,4 +6,3 @@ $wb['circle_name_txt'] = 'Název skupiny'; $wb['client_ids_txt'] = 'Klienti/Distributoři'; $wb['description_txt'] = 'Popis'; $wb['active_txt'] = 'Aktivní'; -?> diff --git a/interface/web/client/lib/lang/cz_client_circle_list.lng b/interface/web/client/lib/lang/cz_client_circle_list.lng index e1e0da1443ab9ffbed85c3fb2a25520c5f3dec65..70f60728cfe7d045d79cc04d4fc514e41b67dd1c 100644 --- a/interface/web/client/lib/lang/cz_client_circle_list.lng +++ b/interface/web/client/lib/lang/cz_client_circle_list.lng @@ -7,4 +7,3 @@ $wb['add_new_record_txt'] = 'Vytvořit skupinu'; $wb['filter_txt'] = 'Filtr'; $wb['delete_txt'] = 'Smazat'; $wb['active_txt'] = 'Aktivní'; -?> diff --git a/interface/web/client/lib/lang/cz_client_del.lng b/interface/web/client/lib/lang/cz_client_del.lng index 5374ea6f75f593de74d8c1f7b55eb794f6db8d7d..406dd0a91cef3b8b9fc1f2bb7ec15978bdb2a6d4 100644 --- a/interface/web/client/lib/lang/cz_client_del.lng +++ b/interface/web/client/lib/lang/cz_client_del.lng @@ -4,4 +4,6 @@ $wb['delete_explanation'] = 'Tato akce smaže následující počet záznamů p $wb['btn_save_txt'] = 'Smazat klienta'; $wb['btn_cancel_txt'] = 'Zrušit bez smazání klienta'; $wb['confirm_client_delete_txt'] = 'Jste si jisti, že chcete smazat tohoto klienta ?'; -?> +$wb['list_head_txt'] = 'Delete Client'; +$wb['table_txt'] = 'Table'; +$wb['data_txt'] = 'Data'; diff --git a/interface/web/client/lib/lang/cz_client_message.lng b/interface/web/client/lib/lang/cz_client_message.lng index 3710cbd254f546ab067c2c43f1158bf3c97867fd..4f05afc2c719115cdfb2940892c56ca1a0d2a5a4 100644 --- a/interface/web/client/lib/lang/cz_client_message.lng +++ b/interface/web/client/lib/lang/cz_client_message.lng @@ -17,4 +17,3 @@ $wb['all_clients_txt'] = 'Všichni klienti'; $wb['variables_txt'] = 'Výběr (možnosti):'; $wb['gender_m_txt'] = 'Pan'; $wb['gender_f_txt'] = 'Paní'; -?> diff --git a/interface/web/client/lib/lang/cz_client_message_template.lng b/interface/web/client/lib/lang/cz_client_message_template.lng index b1d730c06718101e23581f616d4f5899b7f8bcc0..9c770d03abd4a7c9600f9df039616ae9e4fcb2fa 100644 --- a/interface/web/client/lib/lang/cz_client_message_template.lng +++ b/interface/web/client/lib/lang/cz_client_message_template.lng @@ -10,4 +10,3 @@ $wb['variables_description_txt'] = 'Proměnné uživatelské jméno a heslo jsou $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['subject_error_empty'] = 'Subject is empty'; $wb['message_error_empty'] = 'Message is empty'; -?> diff --git a/interface/web/client/lib/lang/cz_client_message_template_list.lng b/interface/web/client/lib/lang/cz_client_message_template_list.lng index d4c2f638579d8a9f4b063ffe0b954264ea6bcf4a..3dd0a7cd40bbb9665c55445bef051c941bfa1539 100644 --- a/interface/web/client/lib/lang/cz_client_message_template_list.lng +++ b/interface/web/client/lib/lang/cz_client_message_template_list.lng @@ -1,5 +1,4 @@ diff --git a/interface/web/client/lib/lang/cz_client_template.lng b/interface/web/client/lib/lang/cz_client_template.lng index 1f5d03df62cb19b29a2ebfb9306bab4fdc28ffea..f927e7bffdcd3b2acf51f25b20d9ae936d84dac6 100644 --- a/interface/web/client/lib/lang/cz_client_template.lng +++ b/interface/web/client/lib/lang/cz_client_template.lng @@ -1,18 +1,21 @@ diff --git a/interface/web/client/lib/lang/cz_client_template_list.lng b/interface/web/client/lib/lang/cz_client_template_list.lng index 28a5d3bf63ff2509eba0e910ba6591d2a6047650..e7914073eae4069ac8d338ab20d1feda6d45d956 100644 --- a/interface/web/client/lib/lang/cz_client_template_list.lng +++ b/interface/web/client/lib/lang/cz_client_template_list.lng @@ -3,5 +3,4 @@ $wb['list_head_txt'] = 'Klientské šablony'; $wb['template_type_txt'] = 'Typ'; $wb['template_name_txt'] = 'Název šablony'; $wb['template_id_txt'] = 'ID šablony'; -$wb['sys_groupid_txt'] = 'Reseller'; -?> +$wb['sys_groupid_txt'] = 'Prodejce'; diff --git a/interface/web/client/lib/lang/cz_clients_list.lng b/interface/web/client/lib/lang/cz_clients_list.lng index 270da3674db2c36b250ce6c8b70b282561d4115f..92ebc7e2d7c3ffcdc8795d7dfa4011e6fdfa8a17 100644 --- a/interface/web/client/lib/lang/cz_clients_list.lng +++ b/interface/web/client/lib/lang/cz_clients_list.lng @@ -11,4 +11,3 @@ $wb['customer_no_txt'] = 'Zákaznické číslo'; $wb['locked_txt'] = 'Zamčené'; $wb['yes_txt'] = 'Ano'; $wb['no_txt'] = 'Ne'; -?> diff --git a/interface/web/client/lib/lang/cz_domain.lng b/interface/web/client/lib/lang/cz_domain.lng index 08b113fc4d755e75090fd20498cd7445e0b7897f..33d634d8e34fc2dc4bafac47154329b6cc594c73 100644 --- a/interface/web/client/lib/lang/cz_domain.lng +++ b/interface/web/client/lib/lang/cz_domain.lng @@ -3,4 +3,3 @@ $wb['domain_error_empty'] = 'Doménové jméno je prázdné'; $wb['domain_error_unique'] = 'Doména již existuje'; $wb['domain_error_regex'] = 'Toto doménové jméno je zakázáno'; $wb['Domain'] = 'Doména'; -?> diff --git a/interface/web/client/lib/lang/cz_domain_list.lng b/interface/web/client/lib/lang/cz_domain_list.lng index 25adf20c251b2203cdc311fd0e03afcadfa5e8b3..220ab3d9e12dae828f54445fa47136cf46a4592f 100644 --- a/interface/web/client/lib/lang/cz_domain_list.lng +++ b/interface/web/client/lib/lang/cz_domain_list.lng @@ -3,4 +3,3 @@ $wb['list_head_txt'] = 'Domény'; $wb['add_new_record_txt'] = 'Vytvořit doménu'; $wb['domain_txt'] = 'Doména'; $wb['user_txt'] = 'Klient'; -?> diff --git a/interface/web/client/lib/lang/cz_reseller.lng b/interface/web/client/lib/lang/cz_reseller.lng index adfea62ac5555e06f2c26ef8b275e126de329643..3b137a11bc9999b1b1c299dbab0807dc491f93bc 100644 --- a/interface/web/client/lib/lang/cz_reseller.lng +++ b/interface/web/client/lib/lang/cz_reseller.lng @@ -1,16 +1,18 @@ 0 or -1 (unlimited)'; @@ -203,5 +207,6 @@ $wb['limit_database_user_error_notint'] = 'Limit databázové kvóty musí být $wb['limit_database_quota_txt'] = 'Databázové kvóty'; $wb['limit_database_quota_error_notint'] = 'Limit databázové kvóty musí být číslo.'; $wb['password_click_to_set_txt'] = 'Pro nastavení klikni zde'; +$wb['Reseller'] = 'Prodejce'; +$wb['Address'] = 'Adresa'; $wb['Limits'] = 'Limity'; -?> diff --git a/interface/web/client/lib/lang/cz_resellers_list.lng b/interface/web/client/lib/lang/cz_resellers_list.lng index 13202ff743eee19864a9613f95102e917520ba1f..8d7d2a89fe87a0a3fc1d256d2181e39ff78d6d1d 100644 --- a/interface/web/client/lib/lang/cz_resellers_list.lng +++ b/interface/web/client/lib/lang/cz_resellers_list.lng @@ -8,4 +8,3 @@ $wb['country_txt'] = 'Stát'; $wb['add_new_record_txt'] = 'Vytvořit distributora'; $wb['customer_no_txt'] = 'Zákaznické číslo'; $wb['username_txt'] = 'Uživatelské jméno'; -?> diff --git a/interface/web/client/lib/lang/de.lng b/interface/web/client/lib/lang/de.lng index 87b85eed71779045f8aea625c7dce1f13e79e6b6..b55397999a62f91b1b91e6f8cc85d798cb5cc3fc 100644 --- a/interface/web/client/lib/lang/de.lng +++ b/interface/web/client/lib/lang/de.lng @@ -17,6 +17,7 @@ $wb['Messaging'] = 'Benachrichtigungen'; $wb['Send email'] = 'E-Mail versenden'; $wb['Edit Client Circle'] = 'Kundenkreis bearbeiten'; $wb['Domains'] = 'Domains'; +$wb['Add Domain'] = 'Add Domain'; $wb['domain_txt'] = 'Domain'; $wb['client_txt'] = 'Kunde'; $wb['error_domain_in mailuse'] = 'Diese Domain kann nicht gelöscht werden, weil sie als E-Mail Domain verwendet wird'; diff --git a/interface/web/client/lib/lang/de_client.lng b/interface/web/client/lib/lang/de_client.lng index b051d713052af90bdb680d4d0e8c26a604fe7550..c75f3263a02360a77b8d144b11a49e220eb98e2e 100644 --- a/interface/web/client/lib/lang/de_client.lng +++ b/interface/web/client/lib/lang/de_client.lng @@ -5,12 +5,14 @@ $wb['limit_mailalias_txt'] = 'Max. Anzahl an E-Mail Aliase'; $wb['limit_mailforward_txt'] = 'Max. Anzahl an E-Mail Weiterleitungen'; $wb['limit_mailcatchall_txt'] = 'Max. Anzahl an E-Mail Catchall Konten'; $wb['limit_mailrouting_txt'] = 'Max. Anzahl an E-Mail Routen'; +$wb['limit_mail_wblist_txt'] = 'Max. number of email white / blacklist entries'; $wb['limit_mailfilter_txt'] = 'Max. Anzahl an E-Mail Filter'; $wb['limit_fetchmail_txt'] = 'Max. Anzahl an Fetchmail Konten'; $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'; @@ -36,6 +38,7 @@ $wb['title_txt'] = 'Titel'; $wb['firstname_txt'] = 'Vorname'; $wb['surname_txt'] = 'Nachname'; $wb['limit_client_txt'] = 'Max. Anzahl an Kunden'; +$wb['limit_relayhost_txt'] = 'Show SMTP relay host options'; $wb['limit_domain_txt'] = 'Max. Anzahl an Domains'; $wb['limit_subdomain_txt'] = 'Max. Anzahl an Subdomains'; $wb['limit_webquota_txt'] = 'Max. Webbeschränkung'; @@ -64,6 +67,7 @@ $wb['limit_mailalias_error_notint'] = 'Das E-Mail Alias Limit muss eine Zahl sei $wb['limit_mailforward_error_notint'] = 'Das E-Mail Weiterleitung Limit muss eine Zahl sein.'; $wb['limit_mailcatchall_error_notint'] = 'Das E-Mail Catchall Limit muss eine Zahl sein.'; $wb['limit_mailrouting_error_notint'] = 'Das E-Mail Routing Limit muss eine Zahl sein.'; +$wb['limit_mail_wblist_error_notint'] = 'The email white / blacklist limit must be a number.'; $wb['limit_mailfilter_error_notint'] = 'Das E-Mail Filter Limit muss eine Zahl sein.'; $wb['limit_mailfetchmail_error_notint'] = 'Das Fetchmail Limit muss eine Zahl sein.'; $wb['limit_mailquota_error_notint'] = 'Das E-Mailbeschränkungs Limit muss eine Zahl sein.'; @@ -147,7 +151,7 @@ $wb['aps_limits_txt'] = 'APS Installationsassistent Limits'; $wb['limit_aps_txt'] = 'Max. Anzahl an APS-Instanzen'; $wb['limit_aps_error_notint'] = 'Das APS Instanzen Limit muss eine Zahl sein.'; $wb['default_slave_dnsserver_txt'] = 'Standard Secondary DNS Server'; -$wb['locked_txt'] = 'Gesperrt (deaktiviert alle Webs, etc.)'; +$wb['locked_txt'] = 'Locked (disables everything except DNS)'; $wb['canceled_txt'] = 'Gekündigt (verhindert Kundenlogin)'; $wb['gender_txt'] = 'Anrede'; $wb['gender_m_txt'] = 'Herr'; @@ -200,5 +204,5 @@ $wb['limit_database_user_txt'] = 'Max. Database users'; $wb['limit_database_user_error_notint'] = 'The database user limit must be a number.'; $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'; -?> diff --git a/interface/web/client/lib/lang/de_client_del.lng b/interface/web/client/lib/lang/de_client_del.lng index d13fcfa8fc99e9c5d1ab8b01b025bed44208deec..53aa0973c4522163ce8d8c2b730975d3ebce8ca7 100644 --- a/interface/web/client/lib/lang/de_client_del.lng +++ b/interface/web/client/lib/lang/de_client_del.lng @@ -3,5 +3,8 @@ $wb['confirm_action_txt'] = 'Aktion bestätigen'; $wb['delete_explanation'] = 'Diese Aktion wird folgende Anzahl an Datensätzen des Kunden löschen'; $wb['btn_save_txt'] = 'Kunden löschen'; $wb['btn_cancel_txt'] = 'Abbrechen, ohne den Kunden zu löschen'; -$wb['confirm_client_delete_txt'] = 'Sind Sie sicher, daß Sie den Kunden löschen möchten?'; +$wb['confirm_client_delete_txt'] = 'Sind Sie sicher, dass Sie den Kunden löschen möchte'; +$wb['table_txt'] = 'Tabelle'; +$wb['data_txt'] = 'Daten'; +$wb['list_head_txt'] = 'Kunde löschen'; ?> diff --git a/interface/web/client/lib/lang/de_client_template.lng b/interface/web/client/lib/lang/de_client_template.lng index a26ef401cf909724116c1efe1973cbd0fff3a13a..f985e19847c23a23596b0cb2f1443adfa74548ff 100644 --- a/interface/web/client/lib/lang/de_client_template.lng +++ b/interface/web/client/lib/lang/de_client_template.lng @@ -1,4 +1,5 @@ diff --git a/interface/web/client/lib/lang/de_reseller.lng b/interface/web/client/lib/lang/de_reseller.lng index e37ca395af70a76fbd97efb189ac3c1b850a7a40..108cf7cd95100009633196d244341a47983109e2 100644 --- a/interface/web/client/lib/lang/de_reseller.lng +++ b/interface/web/client/lib/lang/de_reseller.lng @@ -5,12 +5,14 @@ $wb['limit_mailalias_txt'] = 'Max. Anzahl an E-Mail Aliasse'; $wb['limit_mailforward_txt'] = 'Max. Anzahl an E-Mail Weiterleitungen'; $wb['limit_mailcatchall_txt'] = 'Max. Anzahl an E-Mail Catchall Konten'; $wb['limit_mailrouting_txt'] = 'Max. Anzahl an E-Mail Routen'; +$wb['limit_mail_wblist_txt'] = 'Max. number of email white / blacklist entries'; $wb['limit_mailfilter_txt'] = 'Max. Anzahl an E-Mail Filtern'; $wb['limit_fetchmail_txt'] = 'Max. Anzahl an Fetchmail Konten'; $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'; @@ -36,6 +38,7 @@ $wb['company_txt'] = 'Firma'; $wb['title_txt'] = 'Titel'; $wb['firstname_txt'] = 'Vorname'; $wb['surname_txt'] = 'Nachname'; +$wb['limit_relayhost_txt'] = 'Show SMTP relay host options'; $wb['limit_domain_txt'] = 'Max. Anzahl an Domains'; $wb['limit_subdomain_txt'] = 'Max. Anzahl an Subdomains'; $wb['limit_webquota_txt'] = 'Max. Speicherplatzbeschränkung'; @@ -65,6 +68,7 @@ $wb['limit_mailalias_error_notint'] = 'Das E-Mail Alias Limit muss eine Zahl sei $wb['limit_mailforward_error_notint'] = 'Das E-Mail Weiterleitungs Limit muss eine Zahl sein.'; $wb['limit_mailcatchall_error_notint'] = 'Das E-Mail Catchall Limit muss eine Zahl sein.'; $wb['limit_mailrouting_error_notint'] = 'Das E-Mail Routing Limit muss eine Zahl sein.'; +$wb['limit_mail_wblist_error_notint'] = 'The email white / blacklist limit must be a number.'; $wb['limit_mailfilter_error_notint'] = 'Das E-Mail Filter Limit muss eine Zahl sein.'; $wb['limit_mailfetchmail_error_notint'] = 'Das Fetchmail Limit muss eine Zahl sein.'; $wb['limit_mailquota_error_notint'] = 'Das E-Mail Beschräkungs Limit muss eine Zahl sein.'; @@ -203,5 +207,6 @@ $wb['limit_database_user_error_notint'] = 'The database user limit must be a num $wb['limit_database_quota_txt'] = 'Database quota'; $wb['limit_database_quota_error_notint'] = 'The database quota limit must be a number.'; $wb['password_click_to_set_txt'] = 'Click to set'; +$wb['Reseller'] = 'Reseller'; +$wb['Address'] = 'Address'; $wb['Limits'] = 'Limits'; -?> diff --git a/interface/web/client/lib/lang/dk.lng b/interface/web/client/lib/lang/dk.lng index 0d498a483cbe514aa1bd7497ab0f816f8c6ddd3c..920b3f880578803d2f2ef51a70a803460b7b84a3 100644 --- a/interface/web/client/lib/lang/dk.lng +++ b/interface/web/client/lib/lang/dk.lng @@ -17,6 +17,7 @@ $wb['Messaging'] = 'Meddelelser'; $wb['Send email'] = 'Send E-mail'; $wb['Edit Client Circle'] = 'Rediger Kunde Cirkel'; $wb['Domains'] = 'Domæner'; +$wb['Add Domain'] = 'Add Domain'; $wb['domain_txt'] = 'Domæne'; $wb['client_txt'] = 'Kunde'; $wb['error_domain_in mailuse'] = 'Dette domæne kan ikke slettes, da det er i brug som mail-domæne'; diff --git a/interface/web/client/lib/lang/dk_client.lng b/interface/web/client/lib/lang/dk_client.lng index b944e03175971a37eb99d9d933f8dcd3a89a1bc8..c5154dac5d95889718361249f70da1e499b4d19c 100644 --- a/interface/web/client/lib/lang/dk_client.lng +++ b/interface/web/client/lib/lang/dk_client.lng @@ -7,12 +7,14 @@ $wb['limit_mailaliasdomain_txt'] = 'Max. antal af domæne aliaser'; $wb['limit_mailforward_txt'] = 'Max. antal af e-mail forwarders'; $wb['limit_mailcatchall_txt'] = 'Max. antal af e-mail catchall konti'; $wb['limit_mailrouting_txt'] = 'Max. antal af e-mail routes'; +$wb['limit_mail_wblist_txt'] = 'Max. number of email white / blacklist entries'; $wb['limit_mailfilter_txt'] = 'Max. antal af e-mail filtere'; $wb['limit_fetchmail_txt'] = 'Max. antal af fetchmail konti'; $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'; @@ -37,6 +39,7 @@ $wb['company_txt'] = 'Firma'; $wb['title_txt'] = 'Titel'; $wb['firstname_txt'] = 'Fornavn'; $wb['surname_txt'] = 'Efternavn'; +$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_webkvote'; @@ -70,6 +73,7 @@ $wb['limit_mailaliasdomain_error_notint'] = 'E-mail domæne alias grænse skal v $wb['limit_mailforward_error_notint'] = 'E-mail forward grænse skal være et tal.'; $wb['limit_mailcatchall_error_notint'] = 'E-mail catchall grænse skal være et tal.'; $wb['limit_mailrouting_error_notint'] = 'E-mail routing grænse skal være et tal.'; +$wb['limit_mail_wblist_error_notint'] = 'The email white / blacklist limit must be a number.'; $wb['limit_mailfilter_error_notint'] = 'E-mail filter grænse skal være et tal.'; $wb['limit_mailfetchmail_error_notint'] = 'Fetchmail grænse skal være et tal.'; $wb['limit_mailquota_error_notint'] = 'E-mail kvote grænse skal være et tal.'; @@ -144,7 +148,7 @@ $wb['aps_limits_txt'] = 'APS Installer Begrænsninger'; $wb['limit_aps_txt'] = 'Max. antal af APS forekomster'; $wb['limit_aps_error_notint'] = 'APS forekomster grænse skal være et tal.'; $wb['default_slave_dnsserver_txt'] = 'Standard Sekundær DNS Server'; -$wb['locked_txt'] = 'Låst (deaktiverer alle webs mv)'; +$wb['locked_txt'] = 'Locked (disables everything except DNS)'; $wb['canceled_txt'] = 'Annulleret (deaktivere kunde log ind)'; $wb['gender_txt'] = 'Titel'; $wb['gender_m_txt'] = 'Hr.'; @@ -200,5 +204,5 @@ $wb['invalid_vat_id'] = 'The VAT ID is invalid.'; $wb['email_error_empty'] = 'Email is empty'; $wb['limit_directive_snippets_txt'] = 'Show web server config selection'; $wb['limit_dns_record_error_notint'] = 'The dns record limit must be a number.'; +$wb['Address'] = 'Address'; $wb['Limits'] = 'Limits'; -?> diff --git a/interface/web/client/lib/lang/dk_client_del.lng b/interface/web/client/lib/lang/dk_client_del.lng index ba5f5922196943fa0c247ff4aef2e396e2418487..9bb157cdf4d4b62fafc6488e48dabe5a054a27c9 100644 --- a/interface/web/client/lib/lang/dk_client_del.lng +++ b/interface/web/client/lib/lang/dk_client_del.lng @@ -4,4 +4,7 @@ $wb['delete_explanation'] = 'Denne handling vil slette følgende antal poster fo $wb['btn_save_txt'] = 'Slet kunden'; $wb['btn_cancel_txt'] = 'Annullere uden at slette kunden'; $wb['confirm_client_delete_txt'] = 'Er du sikker på at du vil slette denne kunde?'; +$wb['list_head_txt'] = 'Delete Client'; +$wb['table_txt'] = 'Table'; +$wb['data_txt'] = 'Data'; ?> diff --git a/interface/web/client/lib/lang/dk_client_template.lng b/interface/web/client/lib/lang/dk_client_template.lng index 501d9e2841aa38c10a227fbdf7627ed8e0c7ad80..daacc207e49901281a688a0d197266210c662e3d 100644 --- a/interface/web/client/lib/lang/dk_client_template.lng +++ b/interface/web/client/lib/lang/dk_client_template.lng @@ -1,4 +1,5 @@ diff --git a/interface/web/client/lib/lang/dk_reseller.lng b/interface/web/client/lib/lang/dk_reseller.lng index b06301ccdd896fed8f47681c7b2c3f67ca030b23..816d9a35ef2768afe2ef23ac53b3b0b849f02eea 100644 --- a/interface/web/client/lib/lang/dk_reseller.lng +++ b/interface/web/client/lib/lang/dk_reseller.lng @@ -7,12 +7,14 @@ $wb['limit_mailaliasdomain_txt'] = 'Max. antal af domæne aliaser'; $wb['limit_mailforward_txt'] = 'Max. antal af e-mail forwarders'; $wb['limit_mailcatchall_txt'] = 'Max. antal af e-mail catchall konti'; $wb['limit_mailrouting_txt'] = 'Max. antal af e-mail routes'; +$wb['limit_mail_wblist_txt'] = 'Max. number of email white / blacklist entries'; $wb['limit_mailfilter_txt'] = 'Max. antal af e-mail filtere'; $wb['limit_fetchmail_txt'] = 'Max. antal af fetchmail konti'; $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'; @@ -37,6 +39,7 @@ $wb['company_txt'] = 'Firma'; $wb['title_txt'] = 'Titel'; $wb['firstname_txt'] = 'Fornavn'; $wb['surname_txt'] = 'Efternavn'; +$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_webkvote'; @@ -69,6 +72,7 @@ $wb['limit_mailalias_error_notint'] = 'E-mail alias grænse skal være et tal.'; $wb['limit_mailforward_error_notint'] = 'E-mail forward grænse skal være et tal.'; $wb['limit_mailcatchall_error_notint'] = 'E-mail catchall grænse skal være et tal.'; $wb['limit_mailrouting_error_notint'] = 'E-mail routing grænse skal være et tal.'; +$wb['limit_mail_wblist_error_notint'] = 'The email white / blacklist limit must be a number.'; $wb['limit_mailfilter_error_notint'] = 'E-mail filter grænse skal være et tal.'; $wb['limit_mailfetchmail_error_notint'] = 'Fetchmail grænse skal være et tal.'; $wb['limit_mailquota_error_notint'] = 'E-mail kvote grænse skal være et tal.'; @@ -203,5 +207,6 @@ $wb['limit_directive_snippets_txt'] = 'Show web server config selection'; $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['Reseller'] = 'Reseller'; +$wb['Address'] = 'Address'; $wb['Limits'] = 'Limits'; -?> diff --git a/interface/web/client/lib/lang/el.lng b/interface/web/client/lib/lang/el.lng index 8c7463d61c768a954fae8024ff6bc3105088dd2a..992bfdcd1c23c99aadff7217293755e9443c1259 100644 --- a/interface/web/client/lib/lang/el.lng +++ b/interface/web/client/lib/lang/el.lng @@ -15,6 +15,7 @@ $wb['Messaging'] = 'Messaging'; $wb['Send email'] = 'Send Email'; $wb['Edit Client Circle'] = 'Edit Client Circle'; $wb['Domains'] = 'Domains'; +$wb['Add Domain'] = 'Add Domain'; $wb['domain_txt'] = 'Domain'; $wb['client_txt'] = 'Client'; $wb['error_domain_in mailuse'] = 'This domain cannot be deleted, because it is in use as mail-domain'; diff --git a/interface/web/client/lib/lang/el_client.lng b/interface/web/client/lib/lang/el_client.lng index b85f653d4eab545c652dfa298306bafe0e8f5fe3..373c751a520fef1438b9127481716da653f92bf5 100644 --- a/interface/web/client/lib/lang/el_client.lng +++ b/interface/web/client/lib/lang/el_client.lng @@ -6,12 +6,14 @@ $wb['limit_mailaliasdomain_txt'] = 'Όριο ψευδωνύμων domain'; $wb['limit_mailforward_txt'] = 'Όριο email forwarders'; $wb['limit_mailcatchall_txt'] = 'Όριο λογαριασμών email catchall'; $wb['limit_mailrouting_txt'] = 'Όριο δρομολογήσεων των email'; +$wb['limit_mail_wblist_txt'] = 'Max. number of email white / blacklist entries'; $wb['limit_mailfilter_txt'] = 'Όριο φίλτρων email'; $wb['limit_fetchmail_txt'] = 'Όριο λογαριασμών fetchmail'; $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'; @@ -37,6 +39,7 @@ $wb['company_txt'] = 'Εταιρία'; $wb['title_txt'] = 'Τίτλος'; $wb['firstname_txt'] = 'Όνομα'; $wb['surname_txt'] = 'Επίθετο'; +$wb['limit_relayhost_txt'] = 'Show SMTP relay host options'; $wb['limit_domain_txt'] = 'Όριο domain'; $wb['limit_subdomain_txt'] = 'Όριο subdomain'; $wb['limit_webquota_txt'] = 'Όριο χώρου web'; @@ -70,6 +73,7 @@ $wb['limit_mailaliasdomain_error_notint'] = 'Το όριο των ψευδωνύ $wb['limit_mailforward_error_notint'] = 'Το όριο των email forward πρέπει να είναι αριθμός'; $wb['limit_mailcatchall_error_notint'] = 'Το όριο των email catchall πρέπει να είναι αριθμός'; $wb['limit_mailrouting_error_notint'] = 'Το όριο των δρομολογήσεων email πρέπει να είναι αριθμός'; +$wb['limit_mail_wblist_error_notint'] = 'The email white / blacklist limit must be a number.'; $wb['limit_mailfilter_error_notint'] = 'Το όριο των email filter πρέπει να είναι αριθμός'; $wb['limit_mailfetchmail_error_notint'] = 'Το όριο των fetchmail πρέπει να είναι αριθμός'; $wb['limit_mailquota_error_notint'] = 'Το όριο μεγέθους των email πρέπει να είναι αριθμός'; @@ -107,7 +111,7 @@ $wb['limit_openvz_vm_txt'] = 'Μέγιστο πλήθος εικονικών ser $wb['limit_openvz_vm_template_id_txt'] = 'Εξαναγκασμός προτύπου εικονικού server'; $wb['limit_openvz_vm_error_notint'] = 'Το όριο εικονικών server πρέπει να είναι αριθμός.'; $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 SSH 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'] = 'Delete additional template'; @@ -146,7 +150,7 @@ $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 all webs etc.)'; +$wb['locked_txt'] = 'Locked (disables everything except DNS)'; $wb['canceled_txt'] = 'Canceled (disables client login)'; $wb['gender_txt'] = 'Title'; $wb['gender_m_txt'] = 'Mr.'; @@ -200,5 +204,5 @@ $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'; -?> diff --git a/interface/web/client/lib/lang/el_client_del.lng b/interface/web/client/lib/lang/el_client_del.lng index 60ebd617d0a8b76b79a0b805d0bc2b3f2e188682..3f91a5c2b0108996a5a91fa5392f5a3cdc7cb634 100644 --- a/interface/web/client/lib/lang/el_client_del.lng +++ b/interface/web/client/lib/lang/el_client_del.lng @@ -4,4 +4,7 @@ $wb['delete_explanation'] = 'Η ενέργεια θα διαγράψει τις $wb['btn_save_txt'] = 'Διαγραφή πελάτη'; $wb['btn_cancel_txt'] = 'Ακύρωση χωρίς διαγραφή πελάτη'; $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'; ?> diff --git a/interface/web/client/lib/lang/el_client_message.lng b/interface/web/client/lib/lang/el_client_message.lng index 6b2a872f10af4cb357413ee297331408c740a6c2..c211860f82ae12e9bb90b20eac64d34734505444 100644 --- a/interface/web/client/lib/lang/el_client_message.lng +++ b/interface/web/client/lib/lang/el_client_message.lng @@ -10,7 +10,7 @@ $wb['sender_invalid_error'] = 'Sender email invalid.'; $wb['subject_invalid_error'] = 'Subject is empty.'; $wb['message_invalid_error'] = 'Message is empty.'; $wb['email_sent_to_txt'] = 'Email sent to:'; -$wb['page_head_txt'] = 'Send customer information'; +$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'; diff --git a/interface/web/client/lib/lang/el_client_template.lng b/interface/web/client/lib/lang/el_client_template.lng index e5f50f513e32d11d0ecc87f39250c29c8a7071a7..bd0097b3dfe1b548ad6fba74daa26e0d04847637 100644 --- a/interface/web/client/lib/lang/el_client_template.lng +++ b/interface/web/client/lib/lang/el_client_template.lng @@ -1,4 +1,5 @@ diff --git a/interface/web/client/lib/lang/el_reseller.lng b/interface/web/client/lib/lang/el_reseller.lng index b409c169e6bc122c0bcbeea991f9fb969f7a8ecf..512351c8f0374ae136a7bf642a753016b50fc2d9 100644 --- a/interface/web/client/lib/lang/el_reseller.lng +++ b/interface/web/client/lib/lang/el_reseller.lng @@ -5,12 +5,14 @@ $wb['limit_mailalias_txt'] = 'Όριο ψευδωνύμων email'; $wb['limit_mailforward_txt'] = 'Όριο email forwarders'; $wb['limit_mailcatchall_txt'] = 'Όριο λογαριασμών email catchall'; $wb['limit_mailrouting_txt'] = 'Όριο δρομολογήσεων email'; +$wb['limit_mail_wblist_txt'] = 'Max. number of email white / blacklist entries'; $wb['limit_mailfilter_txt'] = 'Όριο φίλτρων email'; $wb['limit_fetchmail_txt'] = 'Όριο λογαριασμών fetchmail'; $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'; @@ -36,6 +38,7 @@ $wb['company_txt'] = 'Εταιρία'; $wb['title_txt'] = 'Τίτλος'; $wb['firstname_txt'] = 'Όνομα'; $wb['surname_txt'] = 'Επίθετο'; +$wb['limit_relayhost_txt'] = 'Show SMTP relay host options'; $wb['limit_domain_txt'] = 'Όριο Domain'; $wb['limit_subdomain_txt'] = 'Όριο Subdomain'; $wb['limit_webquota_txt'] = 'Όριο Χώρου Web'; @@ -66,6 +69,7 @@ $wb['limit_mailalias_error_notint'] = 'Το όριο ψευδωνύμων email $wb['limit_mailforward_error_notint'] = 'Το όριο email forward πρέπει να είναι αριθμός.'; $wb['limit_mailcatchall_error_notint'] = 'Το όριο email catchall πρέπει να είναι αριθμός.'; $wb['limit_mailrouting_error_notint'] = 'Το όριο δρομολογήσεων email πρέπει να είναι αριθμός.'; +$wb['limit_mail_wblist_error_notint'] = 'The email white / blacklist limit must be a number.'; $wb['limit_mailfilter_error_notint'] = 'Το όριο φίλτρων email πρέπει να είναι αριθμός.'; $wb['limit_mailfetchmail_error_notint'] = 'Το όριο fetchmail πρέπει να είναι αριθμός.'; $wb['limit_mailquota_error_notint'] = 'Το όριο χώρου email πρέπει να είναι αριθμός.'; @@ -107,7 +111,7 @@ $wb['limit_openvz_vm_txt'] = 'Μέγιστο πλήθος εικονικών ser $wb['limit_openvz_vm_template_id_txt'] = 'Εξαναγκασμός προτύπου εικονικού server'; $wb['limit_openvz_vm_error_notint'] = 'Το όριο εικονικών server πρέπει να είναι αριθμός.'; $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 SSH 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'] = 'Delete additional template'; @@ -203,5 +207,6 @@ $wb['limit_database_quota_error_notint'] = 'The database quota limit must be a n $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'; -?> diff --git a/interface/web/client/lib/lang/en.lng b/interface/web/client/lib/lang/en.lng index 743516c96cf4db5a74d987adeabca9cd254b89ef..4e3f05cf2735a47557ccb801ffe79216404b8e9b 100644 --- a/interface/web/client/lib/lang/en.lng +++ b/interface/web/client/lib/lang/en.lng @@ -10,13 +10,14 @@ $wb['Limit-Templates'] = 'Limit-Templates'; $wb['Add Reseller'] = 'Add Reseller'; $wb['Edit Reseller'] = 'Edit Reseller'; $wb['Resellers'] = 'Resellers'; -$wb["error_has_clients"] = 'This reseller has clients. Delete the clients of the reseller first.'; +$wb['error_has_clients'] = 'This reseller has clients. Delete the clients of the reseller first.'; $wb['add_additional_template_txt'] = 'Add additional template'; $wb['delete_additional_template_txt'] = 'Delete additional template'; $wb['Messaging'] = 'Messaging'; $wb['Send email'] = 'Send Email'; $wb['Edit Client Circle'] = 'Edit Client Circle'; $wb['Domains'] = 'Domains'; +$wb['Add Domain'] = 'Add Domain'; $wb['domain_txt'] = 'Domain'; $wb['client_txt'] = 'Client'; $wb['error_domain_in dnsuse'] = 'This domain cannot be deleted, because it is in use as dns zone'; @@ -27,4 +28,4 @@ $wb['error_client_can_not_add_domain'] = 'You cannot add a new domain'; $wb['domain_txt'] = 'Domain'; $wb['error_client_group_id_empty'] = 'You have to select a customer
    '; $wb['Email-Templates'] = 'Email-Templates'; -?> \ No newline at end of file +?> diff --git a/interface/web/client/lib/lang/en_client.lng b/interface/web/client/lib/lang/en_client.lng index 3cc323fd4b543d7ea197ded8ee532b7743403c3c..acaafeb390e9ae7c62180f35fa615dbc49ad9870 100644 --- a/interface/web/client/lib/lang/en_client.lng +++ b/interface/web/client/lib/lang/en_client.lng @@ -1,180 +1,184 @@ diff --git a/interface/web/client/lib/lang/en_client_circle.lng b/interface/web/client/lib/lang/en_client_circle.lng index 80fd704c08fc38f5842c68f3e0fb32d80366bbae..30e71caa602fc4f24ce729e4d44b9af4f0faa58f 100644 --- a/interface/web/client/lib/lang/en_client_circle.lng +++ b/interface/web/client/lib/lang/en_client_circle.lng @@ -1,9 +1,9 @@ \ No newline at end of file diff --git a/interface/web/client/lib/lang/en_client_circle_list.lng b/interface/web/client/lib/lang/en_client_circle_list.lng index 266aced82927da5551dbb838185a1cf627df8527..82c9448268b9acc0bccb6d8a7e6f0ec0dd94bfbe 100644 --- a/interface/web/client/lib/lang/en_client_circle_list.lng +++ b/interface/web/client/lib/lang/en_client_circle_list.lng @@ -1,10 +1,10 @@ \ No newline at end of file diff --git a/interface/web/client/lib/lang/en_client_del.lng b/interface/web/client/lib/lang/en_client_del.lng index 7b1bbf9d70ae60b458df57118687705d1fd3616c..21ddcb9ea44905b316d6830ae688abda9125eaef 100644 --- a/interface/web/client/lib/lang/en_client_del.lng +++ b/interface/web/client/lib/lang/en_client_del.lng @@ -1,7 +1,10 @@ diff --git a/interface/web/client/lib/lang/en_client_message.lng b/interface/web/client/lib/lang/en_client_message.lng index c04bd6cda2353e73de5b53f97e21317e1485389e..6f95d8c0df5ae88bc7a5186a5154120d9da6b696 100644 --- a/interface/web/client/lib/lang/en_client_message.lng +++ b/interface/web/client/lib/lang/en_client_message.lng @@ -1,20 +1,20 @@ diff --git a/interface/web/client/lib/lang/en_client_message_template.lng b/interface/web/client/lib/lang/en_client_message_template.lng index 0606f537584fa59c24ae58f70e5ac75257dcd233..acf2ae400ef37ad76cbf357c19265dd7ea939760 100644 --- a/interface/web/client/lib/lang/en_client_message_template.lng +++ b/interface/web/client/lib/lang/en_client_message_template.lng @@ -1,8 +1,8 @@ \ No newline at end of file diff --git a/interface/web/client/lib/lang/en_client_template.lng b/interface/web/client/lib/lang/en_client_template.lng index 786daee90dc9c144f430520044b941587e46174c..ad20fc5699b774a50588513119ad21c7ed9e9457 100644 --- a/interface/web/client/lib/lang/en_client_template.lng +++ b/interface/web/client/lib/lang/en_client_template.lng @@ -1,97 +1,102 @@ diff --git a/interface/web/client/lib/lang/en_client_template_list.lng b/interface/web/client/lib/lang/en_client_template_list.lng index a0442c835c152dbc00b79613abeae1bc5732c025..189b30a7ef07948f289cac2e52dc38bfbaece139 100644 --- a/interface/web/client/lib/lang/en_client_template_list.lng +++ b/interface/web/client/lib/lang/en_client_template_list.lng @@ -1,7 +1,7 @@ diff --git a/interface/web/client/lib/lang/en_clients_list.lng b/interface/web/client/lib/lang/en_clients_list.lng index 8d8bac7730864e0afbf2822ecf45090293ef5a2e..416a8aa7bbb3adb82ce82889064bba9976e60f9c 100644 --- a/interface/web/client/lib/lang/en_clients_list.lng +++ b/interface/web/client/lib/lang/en_clients_list.lng @@ -1,13 +1,13 @@ 0 or -1 (unlimited)'; -$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["vat_id_txt"] = 'VAT ID'; -$wb["required_fields_txt"] = '* Required fields'; -$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 SSH option.'; -$wb["username_error_collision"] = 'The username may not start with the word -web- or -web- followed by a number.'; -$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['limit_client_txt'] = 'Max. number of Clients'; +$wb['username_error_empty'] = 'Username is empty.'; +$wb['username_error_unique'] = 'The username must be unique.'; +$wb['limit_maildomain_error_notint'] = 'The email domain limit must be a number.'; +$wb['limit_mailmailinglist_error_notint'] = 'The mailing list record 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_webdav_user_error_notint'] = 'The webdav 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 zone 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_client_error_notint'] = 'The sub client limit must be a number.'; +$wb['default_dbserver_txt'] = 'Default Database Server'; +$wb['limit_database_txt'] = 'Max. number of Databases'; +$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 characters.'; +$wb['template_master_txt'] = 'Master template'; +$wb['template_additional_txt'] = 'Addon template'; +$wb['add_additional_template_txt'] = 'Add additional template'; +$wb['delete_additional_template_txt'] = 'Delete additional template'; +$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['limit_ssl_letsencrypt_txt'] = 'Let\'s Encrypt available'; +$wb['limit_client_error'] = 'The max. number of clients is reached.'; +$wb['limit_client_error_positive_or_unlimited'] = 'The number of clients must be > 0 or -1 (unlimited)'; +$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['vat_id_txt'] = 'VAT ID'; +$wb['required_fields_txt'] = '* Required fields'; +$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['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['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['email_error_isemail'] = 'Please enter a valid email address.'; -$wb["customer_no_error_unique"] = 'The customer no. must be unique (or empty).'; +$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["bank_account_iban_txt"] = 'IBAN'; -$wb["bank_account_swift_txt"] = 'BIC / Swift'; +$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['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['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["web_servers_txt"] = 'Webservers'; -$wb["web_servers_placeholder"] = 'Select Webservers'; +$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["dns_servers_txt"] = 'DNS Server'; -$wb["dns_servers_placeholder"] = 'Select DNS Servers'; +$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["db_servers_txt"] = 'Database Server'; -$wb["db_servers_placeholder"] = 'Select Database Servers'; +$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["mail_servers_txt"] = 'Mailservers'; -$wb["mail_servers_placeholder"] = 'Select Mailservers'; +$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['customer_no_template_txt'] = 'Customer No. template'; @@ -176,9 +180,9 @@ $wb['customer_no_template_error_regex_txt'] = 'The customer No. template contain $wb['customer_no_start_txt'] = 'Customer No. start value'; $wb['customer_no_counter_txt'] = 'Customer No. counter'; -$wb["xmpp_limits_txt"] = 'XMPP Limits'; -$wb["xmpp_servers_txt"] = 'XMPP Servers'; -$wb["xmpp_servers_placeholder"] = 'Select XMPP Servers'; +$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.'; @@ -199,13 +203,14 @@ $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['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['btn_save_txt'] = 'Save'; +$wb['btn_cancel_txt'] = 'Cancel'; +$wb['email_error_empty'] = 'Email is empty'; $wb['limit_directive_snippets_txt'] = 'Show web server config selection'; $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['Reseller'] = 'Reseller'; +$wb['Address'] = 'Address'; $wb['Limits'] = 'Limits'; -?> diff --git a/interface/web/client/lib/lang/en_resellers_list.lng b/interface/web/client/lib/lang/en_resellers_list.lng old mode 100755 new mode 100644 index a7d2537a1d66d147d8fd1df10797eb7bd0b26edf..2a47cc915e1e0478661103866e92ccacd562d51a --- a/interface/web/client/lib/lang/en_resellers_list.lng +++ b/interface/web/client/lib/lang/en_resellers_list.lng @@ -1,11 +1,11 @@ \ No newline at end of file diff --git a/interface/web/client/lib/lang/es.lng b/interface/web/client/lib/lang/es.lng old mode 100755 new mode 100644 index 9b8b2a3edb0dd27103cf82d3449542013d5b6244..9dc7ad813f08706cdb643be2528ebdfb94666f48 --- a/interface/web/client/lib/lang/es.lng +++ b/interface/web/client/lib/lang/es.lng @@ -25,5 +25,6 @@ $wb['Messaging'] = 'Mensajería'; $wb['Resellers'] = 'Revendedores'; $wb['Send email'] = 'Enviar correo'; $wb['Templates'] = 'Plantillas'; -$wb['Email-Templates'] = 'Email-Templates'; +$wb['Add Domain'] = 'Add Domain'; +$wb['domain_txt'] = 'Email-Templates'; ?> diff --git a/interface/web/client/lib/lang/es_client.lng b/interface/web/client/lib/lang/es_client.lng old mode 100755 new mode 100644 index 75125024fb4a9a01beedb2876781e174a85398ba..d9210b8ec36b1a97b2acafda4bc12684f1833d11 --- 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'; @@ -79,6 +80,7 @@ $wb['limit_dns_slave_zone_error_notint'] = 'El límite de zonas esclavas de dns $wb['limit_dns_slave_zone_txt'] = 'Cantidad máxima de zonas secundarias de DNS'; $wb['limit_dns_zone_error_notint'] = 'El límite de zonas DNS debe ser un número.'; $wb['limit_dns_zone_txt'] = 'Cantidad máxima de zonas DNS'; +$wb['limit_relayhost_txt'] = 'Show SMTP relay host options'; $wb['limit_domain_txt'] = 'limit_domain'; $wb['limit_fetchmail_txt'] = 'Cantidad máx. de recogedores de correo'; $wb['limit_ftp_user_error_notint'] = 'El límite de usuarios de FTP debe ser un número.'; @@ -105,6 +107,8 @@ $wb['limit_mailquota_error_notint'] = 'El límite de cuota de correo debe ser un $wb['limit_mailquota_txt'] = 'Cuota de buzones de correo'; $wb['limit_mailrouting_error_notint'] = 'El límite de enrutadores de correo debe ser un número.'; $wb['limit_mailrouting_txt'] = 'Cantidad máx. de enrutadores de correos'; +$wb['limit_mail_wblist_error_notint'] = 'The email white / blacklist limit must be a number.'; +$wb['limit_mail_wblist_txt'] = 'Max. number of email white / blacklist entries'; $wb['limit_openvz_vm_error_notint'] = 'El límite de servidores virtuales debe ser un número.'; $wb['limit_openvz_vm_template_id_txt'] = 'Forzar plantilla para servidor virtual'; $wb['limit_openvz_vm_txt'] = 'Cantidad máxima de servidores virtuales'; @@ -146,7 +150,7 @@ $wb['limit_xmpp_status_txt'] = 'Host de estado disponible'; $wb['limit_xmpp_user_error_notint'] = 'El límite de usuarios XMPP debe ser un número.'; $wb['limit_xmpp_user_txt'] = 'Número máximo de cuentas XMPP'; $wb['limit_xmpp_vjud_txt'] = 'Directorio de usuarios VJUD disponible'; -$wb['locked_txt'] = 'Bloqueado (desactivar sitios web etc.)'; +$wb['locked_txt'] = 'Locked (disables everything except DNS)'; $wb['mail_servers_placeholder'] = 'Seleccionar servidores de correo'; $wb['mail_servers_txt'] = 'Servidores de correo'; $wb['mail_servers_used'] = 'El servidor que está intentando borrar de este cliente está siendo utilizado como servidor de correo. Por favor asegúrese de que este servidor no esté siendo utilizado por este cliente antes de borrarlo.'; @@ -200,5 +204,5 @@ $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'; -?> diff --git a/interface/web/client/lib/lang/es_client_circle.lng b/interface/web/client/lib/lang/es_client_circle.lng old mode 100755 new mode 100644 diff --git a/interface/web/client/lib/lang/es_client_circle_list.lng b/interface/web/client/lib/lang/es_client_circle_list.lng old mode 100755 new mode 100644 diff --git a/interface/web/client/lib/lang/es_client_del.lng b/interface/web/client/lib/lang/es_client_del.lng old mode 100755 new mode 100644 index ff7c09c191d2057b25443906e985ebc51245001b..9496eb8146773b6d85951ceb55852866a57da303 --- a/interface/web/client/lib/lang/es_client_del.lng +++ b/interface/web/client/lib/lang/es_client_del.lng @@ -4,4 +4,7 @@ $wb['btn_save_txt'] = 'Borrar el cliente'; $wb['confirm_action_txt'] = 'Confirmar acción'; $wb['confirm_client_delete_txt'] = '¿Está seguro de que desea borrar el cliente?'; $wb['delete_explanation'] = 'Esta acción eliminará el siguiente número de registros asociados con este cliente'; +$wb['list_head_txt'] = 'Delete Client'; +$wb['table_txt'] = 'Table'; +$wb['data_txt'] = 'Data'; ?> diff --git a/interface/web/client/lib/lang/es_client_message.lng b/interface/web/client/lib/lang/es_client_message.lng old mode 100755 new mode 100644 diff --git a/interface/web/client/lib/lang/es_client_message_template.lng b/interface/web/client/lib/lang/es_client_message_template.lng old mode 100755 new mode 100644 diff --git a/interface/web/client/lib/lang/es_client_message_template_list.lng b/interface/web/client/lib/lang/es_client_message_template_list.lng old mode 100755 new mode 100644 diff --git a/interface/web/client/lib/lang/es_client_template.lng b/interface/web/client/lib/lang/es_client_template.lng old mode 100755 new mode 100644 index 4fd6f650f3bfd55aa0a35aecacd791a858f59a47..2099173c191006baf1c7d7e1fd0e3f191335c1fb --- a/interface/web/client/lib/lang/es_client_template.lng +++ b/interface/web/client/lib/lang/es_client_template.lng @@ -1,10 +1,12 @@ diff --git a/interface/web/client/lib/lang/es_client_template_list.lng b/interface/web/client/lib/lang/es_client_template_list.lng old mode 100755 new mode 100644 diff --git a/interface/web/client/lib/lang/es_clients_list.lng b/interface/web/client/lib/lang/es_clients_list.lng old mode 100755 new mode 100644 diff --git a/interface/web/client/lib/lang/es_domain.lng b/interface/web/client/lib/lang/es_domain.lng old mode 100755 new mode 100644 diff --git a/interface/web/client/lib/lang/es_domain_list.lng b/interface/web/client/lib/lang/es_domain_list.lng old mode 100755 new mode 100644 diff --git a/interface/web/client/lib/lang/es_reseller.lng b/interface/web/client/lib/lang/es_reseller.lng old mode 100755 new mode 100644 index 5a94b9e8033bbee191faf75891310a41de010501..9fe710e6e327e33656ca2821ccc7a50507d1c11d --- 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'; @@ -85,6 +86,7 @@ $wb['limit_dns_slave_zone_error_notint'] = 'El límite de zonas esclavas de dns $wb['limit_dns_slave_zone_txt'] = 'Cantidad máxima de zonas secundarias de DNS'; $wb['limit_dns_zone_error_notint'] = 'El límite de zonas DNS debe ser un número.'; $wb['limit_dns_zone_txt'] = 'Cantidad máxima de zonas DNS'; +$wb['limit_relayhost_txt'] = 'Show SMTP relay host options'; $wb['limit_domain_txt'] = 'limit_domain'; $wb['limit_domainmodule_error_notint'] = 'El límite del módulo de dominio debe ser un número.'; $wb['limit_domainmodule_txt'] = 'Límites del módulo de dominio'; @@ -112,6 +114,8 @@ $wb['limit_mailquota_error_notint'] = 'El límite de cuota de correo debe ser un $wb['limit_mailquota_txt'] = 'Cuota de buzones de correo'; $wb['limit_mailrouting_error_notint'] = 'El límite de enrutadores de correo debe ser un número.'; $wb['limit_mailrouting_txt'] = 'Cantidad máx. de enrutadores de correos'; +$wb['limit_mail_wblist_error_notint'] = 'The email white / blacklist limit must be a number.'; +$wb['limit_mail_wblist_txt'] = 'Max. number of email white / blacklist entries'; $wb['limit_openvz_vm_error_notint'] = 'El límite del servidor virtual debe ser un número.'; $wb['limit_openvz_vm_template_id_txt'] = 'Forzar plantilla de servidor virtual'; $wb['limit_openvz_vm_txt'] = 'Cantidad máx. de servidores virtuales'; @@ -203,5 +207,6 @@ $wb['zip_txt'] = 'Código postal'; $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'; -?> diff --git a/interface/web/client/lib/lang/fi.lng b/interface/web/client/lib/lang/fi.lng old mode 100755 new mode 100644 index 52dba3949f1d1529f5247b3ff2f77bd0af33f278..812ff1860f447857a3a90991b96857f664678f8f --- a/interface/web/client/lib/lang/fi.lng +++ b/interface/web/client/lib/lang/fi.lng @@ -17,6 +17,7 @@ $wb['Messaging'] = 'Messaging'; $wb['Send email'] = 'Send Email'; $wb['Edit Client Circle'] = 'Edit Client Circle'; $wb['Domains'] = 'Domains'; +$wb['Add Domain'] = 'Add Domain'; $wb['domain_txt'] = 'Domain'; $wb['client_txt'] = 'Client'; $wb['error_domain_in mailuse'] = 'This domain cannot be deleted, because it is in use as mail-domain'; diff --git a/interface/web/client/lib/lang/fi_client.lng b/interface/web/client/lib/lang/fi_client.lng old mode 100755 new mode 100644 index 6df30e77536bca786b99d92e46893d2c815268a1..68058e1ab5a4c87365db95dc285519b21feb9216 --- a/interface/web/client/lib/lang/fi_client.lng +++ b/interface/web/client/lib/lang/fi_client.lng @@ -5,12 +5,14 @@ $wb['limit_mailalias_txt'] = 'Postisoitteiden aliastunnuksien määrä'; $wb['limit_mailforward_txt'] = 'Edelleenlähetysosoitteiden määrä'; $wb['limit_mailcatchall_txt'] = 'Postiverkkotunnuksien Catchall-tilien määrä'; $wb['limit_mailrouting_txt'] = 'Postireititysten määrä'; +$wb['limit_mail_wblist_txt'] = 'Max. number of email white / blacklist entries'; $wb['limit_mailfilter_txt'] = 'Roskapostisuodattimien määrä'; $wb['limit_fetchmail_txt'] = 'Noudettavien postilaatikoiden määrä'; $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'; @@ -36,6 +38,7 @@ $wb['title_txt'] = 'Otsikko'; $wb['firstname_txt'] = 'Etunimi'; $wb['surname_txt'] = 'Sukunimi'; $wb['limit_client_txt'] = 'Asiakkaiden määrä'; +$wb['limit_relayhost_txt'] = 'Show SMTP relay host options'; $wb['limit_domain_txt'] = 'Verkkotunnuksien määrä'; $wb['limit_subdomain_txt'] = 'Aliverkkotunnuksien määrä'; $wb['limit_webquota_txt'] = 'Kotisivutila'; @@ -62,6 +65,7 @@ $wb['limit_mailalias_error_notint'] = 'Postin aliastunnuksien raja-arvon pitää $wb['limit_mailforward_error_notint'] = 'Postin edelleenlähetysten raja-arvon pitää olla numero.'; $wb['limit_mailcatchall_error_notint'] = 'Postiverkkotunnuksien catchall-tunnuksien raja-arvon pitää olla numero.'; $wb['limit_mailrouting_error_notint'] = 'Postireititysten raja-arvon pitää olla numero.'; +$wb['limit_mail_wblist_error_notint'] = 'The email white / blacklist limit must be a number.'; $wb['limit_mailfilter_error_notint'] = 'Roskapostisuodattimien raja-arvon pitää olla numero.'; $wb['limit_mailfetchmail_error_notint'] = 'Noudettavien postilaatikoiden raja-arvon pitää olla numero.'; $wb['limit_mailquota_error_notint'] = 'Postilaatikon koon raja-arvon pitää olla numero.'; @@ -107,7 +111,7 @@ $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 SSH 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'] = 'Delete additional template'; @@ -146,7 +150,7 @@ $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 all webs etc.)'; +$wb['locked_txt'] = 'Locked (disables everything except DNS)'; $wb['canceled_txt'] = 'Canceled (disables client login)'; $wb['gender_txt'] = 'Title'; $wb['gender_m_txt'] = 'Mr.'; @@ -200,5 +204,5 @@ $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'; -?> diff --git a/interface/web/client/lib/lang/fi_client_del.lng b/interface/web/client/lib/lang/fi_client_del.lng index b87895b8c0496e4e9ca9e46f6076c67cad908b87..4336b765d3940020280f8f1c96b930658dba785e 100644 --- a/interface/web/client/lib/lang/fi_client_del.lng +++ b/interface/web/client/lib/lang/fi_client_del.lng @@ -4,4 +4,7 @@ $wb['delete_explanation'] = 'Tämä toiminto alla olevan määrän tämän asiak $wb['btn_save_txt'] = 'Poista käyttäjä'; $wb['btn_cancel_txt'] = 'Keskeytä poistamatta asiakasta'; $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'; ?> diff --git a/interface/web/client/lib/lang/fi_client_message.lng b/interface/web/client/lib/lang/fi_client_message.lng index 6b2a872f10af4cb357413ee297331408c740a6c2..c211860f82ae12e9bb90b20eac64d34734505444 100644 --- a/interface/web/client/lib/lang/fi_client_message.lng +++ b/interface/web/client/lib/lang/fi_client_message.lng @@ -10,7 +10,7 @@ $wb['sender_invalid_error'] = 'Sender email invalid.'; $wb['subject_invalid_error'] = 'Subject is empty.'; $wb['message_invalid_error'] = 'Message is empty.'; $wb['email_sent_to_txt'] = 'Email sent to:'; -$wb['page_head_txt'] = 'Send customer information'; +$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'; diff --git a/interface/web/client/lib/lang/fi_client_template.lng b/interface/web/client/lib/lang/fi_client_template.lng old mode 100755 new mode 100644 index 1e36b01fd9a0d1559bc623141e4c24d75bbdb285..46ce6e6a8d03a0a96d6964adf46253d8aa2820bb --- a/interface/web/client/lib/lang/fi_client_template.lng +++ b/interface/web/client/lib/lang/fi_client_template.lng @@ -1,4 +1,5 @@ diff --git a/interface/web/client/lib/lang/fi_client_template_list.lng b/interface/web/client/lib/lang/fi_client_template_list.lng old mode 100755 new mode 100644 diff --git a/interface/web/client/lib/lang/fi_clients_list.lng b/interface/web/client/lib/lang/fi_clients_list.lng old mode 100755 new mode 100644 diff --git a/interface/web/client/lib/lang/fi_reseller.lng b/interface/web/client/lib/lang/fi_reseller.lng index 58af2fdf0dba52638a28af3af5de513d0dc16582..5c16e702644e8586b5aff5795f7aac8c3e2857f8 100644 --- a/interface/web/client/lib/lang/fi_reseller.lng +++ b/interface/web/client/lib/lang/fi_reseller.lng @@ -5,12 +5,14 @@ $wb['limit_mailalias_txt'] = 'Sähköpostin aliastunnuksien enimmäismäärä'; $wb['limit_mailforward_txt'] = 'Edelleenlähetettävien sähköpostitunnuksien enimmäismäärä'; $wb['limit_mailcatchall_txt'] = 'Sähköpostin catchall-tilien enimmäismäärä'; $wb['limit_mailrouting_txt'] = 'Sähköpostireitityksien enimmäismäärä'; +$wb['limit_mail_wblist_txt'] = 'Max. number of email white / blacklist entries'; $wb['limit_mailfilter_txt'] = 'Sähköpostisuodattimien enimmäismäärä'; $wb['limit_fetchmail_txt'] = 'Noudettavien sähköpotilaatikoiden enimmäismäärä'; $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'; @@ -36,6 +38,7 @@ $wb['company_txt'] = 'Yritys'; $wb['title_txt'] = 'Titteli'; $wb['firstname_txt'] = 'Etunimi'; $wb['surname_txt'] = 'Sukunimi'; +$wb['limit_relayhost_txt'] = 'Show SMTP relay host options'; $wb['limit_domain_txt'] = 'Verkkotunnusraja'; $wb['limit_subdomain_txt'] = 'Aliverkkotunnusraja'; $wb['limit_webquota_txt'] = 'WWW-levytila'; @@ -65,6 +68,7 @@ $wb['limit_mailalias_error_notint'] = 'Sähköpostialiaksien rajan pitää olla $wb['limit_mailforward_error_notint'] = 'Sähköpostin edelleenlähetyksen rajan pitää olla numeerinen.'; $wb['limit_mailcatchall_error_notint'] = 'Catchall-tunnuksien rajan pitää olla numeerinen.'; $wb['limit_mailrouting_error_notint'] = 'Sähköpostireittien rajan pitää olla numeerinen.'; +$wb['limit_mail_wblist_error_notint'] = 'The email white / blacklist limit must be a number.'; $wb['limit_mailfilter_error_notint'] = 'Sähköpostisuodattimien rajan pitää olla numeerinen.'; $wb['limit_mailfetchmail_error_notint'] = 'Noudettavien laatikoiden rajan pitää olla numeerinen.'; $wb['limit_mailquota_error_notint'] = 'Sähköpostin levytilan rajan pitää olla numeerinen.'; @@ -107,7 +111,7 @@ $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 SSH 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'] = 'Delete additional template'; @@ -203,5 +207,6 @@ $wb['limit_database_quota_error_notint'] = 'The database quota limit must be a n $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'; -?> diff --git a/interface/web/client/lib/lang/fr.lng b/interface/web/client/lib/lang/fr.lng index 4538bfb0dbcac6b7c7a0ef36ead07808d388d1ce..d4efa24b7a88e9f681a52bb7a72728b881dbd6c6 100644 --- a/interface/web/client/lib/lang/fr.lng +++ b/interface/web/client/lib/lang/fr.lng @@ -14,6 +14,7 @@ $wb['delete_additional_template_txt'] = 'Supprimer un modèle'; $wb['Messaging'] = 'Messagerie'; $wb['Edit Client Circle'] = 'Modifier les groupes clients'; $wb['Domains'] = 'Domaines'; +$wb['Add Domain'] = 'Add Domain'; $wb['domain_txt'] = 'Domaine'; $wb['client_txt'] = 'Client'; $wb['error_domain_in mailuse'] = 'Ce domaine ne peut pas être supprimé, il est utilisé par un compte e-mail'; diff --git a/interface/web/client/lib/lang/fr_client.lng b/interface/web/client/lib/lang/fr_client.lng index 61612ccbe0fc53a4485b9dc24218c154a85fb1e3..fc96c0d3195dab0b51bc75225e646395c2f14e03 100644 --- a/interface/web/client/lib/lang/fr_client.lng +++ b/interface/web/client/lib/lang/fr_client.lng @@ -5,12 +5,14 @@ $wb['limit_mailalias_txt'] = 'Nombre maximal d’alias d’e-mail'; $wb['limit_mailforward_txt'] = 'Nombre maximal de routeurs d’e-mail'; $wb['limit_mailcatchall_txt'] = 'Nombre maximal de comptes collecteurs'; $wb['limit_mailrouting_txt'] = 'Nombre maximal de routes d’e-mail'; +$wb['limit_mail_wblist_txt'] = 'Max. number of email white / blacklist entries'; $wb['limit_mailfilter_txt'] = 'Nombre maximal de filtres d’e-mails'; $wb['limit_fetchmail_txt'] = 'Nombre maximal de comptes récupérateur e-mail'; $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'; @@ -36,6 +38,7 @@ $wb['title_txt'] = 'Titre'; $wb['firstname_txt'] = 'Prénom'; $wb['surname_txt'] = 'Nom'; $wb['limit_client_txt'] = 'Nombre maximal de clients'; +$wb['limit_relayhost_txt'] = 'Show SMTP relay host options'; $wb['limit_domain_txt'] = 'Nombre maximal de domaines'; $wb['limit_subdomain_txt'] = 'Nombre maximal de sous-domaines'; $wb['limit_webquota_txt'] = 'Limite du quota web'; @@ -61,6 +64,7 @@ $wb['limit_mailalias_error_notint'] = 'La limite d’alias d’e-mail doit être $wb['limit_mailforward_error_notint'] = 'La limite de routeurs d’e-mail doit être un nombre.'; $wb['limit_mailcatchall_error_notint'] = 'La limite de comptes collecteurs doit être un nombre.'; $wb['limit_mailrouting_error_notint'] = 'La limite de routes d’e-mail doit être un nombre.'; +$wb['limit_mail_wblist_error_notint'] = 'The email white / blacklist limit must be a number.'; $wb['limit_mailfilter_error_notint'] = 'La limite de filtres d’e-mail doit être un nombre.'; $wb['limit_mailfetchmail_error_notint'] = 'La limite de comptes récupérateur e-mail doit être un nombre.'; $wb['limit_mailquota_error_notint'] = 'La limite du quota des boîtes d’e-mail doit être un nombre.'; @@ -144,7 +148,7 @@ $wb['aps_limits_txt'] = 'Nombre max d’Installeur APS'; $wb['limit_aps_txt'] = 'Nombre max d’instances APS'; $wb['limit_aps_error_notint'] = 'La limite d’instances APS doit être un nombre'; $wb['default_slave_dnsserver_txt'] = 'Serveur DNS secondaire par défaut'; -$wb['locked_txt'] = 'Locked (disables all webs etc.)'; +$wb['locked_txt'] = 'Locked (disables everything except DNS)'; $wb['canceled_txt'] = 'Canceled (disables client login)'; $wb['gender_txt'] = 'Titre'; $wb['gender_m_txt'] = 'Monsieur'; @@ -200,5 +204,5 @@ $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'; -?> diff --git a/interface/web/client/lib/lang/fr_client_del.lng b/interface/web/client/lib/lang/fr_client_del.lng index 4fdb5dac772136b3526544d9f69bfffad119f890..051c840fb2ec5a0b3702f75a9af79d391a604dfa 100644 --- a/interface/web/client/lib/lang/fr_client_del.lng +++ b/interface/web/client/lib/lang/fr_client_del.lng @@ -4,4 +4,7 @@ $wb['delete_explanation'] = 'Cette action va supprimer le nombre d’enregistrem $wb['btn_save_txt'] = 'Effacer le client'; $wb['btn_cancel_txt'] = 'Annuler sans effacer le client'; $wb['confirm_client_delete_txt'] = 'Confirmez-vous la suppression de ce client ?'; +$wb['list_head_txt'] = 'Delete Client'; +$wb['table_txt'] = 'Table'; +$wb['data_txt'] = 'Data'; ?> diff --git a/interface/web/client/lib/lang/fr_client_template.lng b/interface/web/client/lib/lang/fr_client_template.lng index 24bb88fee42c4b860f1eccd446720c093c38cff3..33548deba4979d017765df6fd9a6eebbe787c742 100644 --- a/interface/web/client/lib/lang/fr_client_template.lng +++ b/interface/web/client/lib/lang/fr_client_template.lng @@ -1,4 +1,5 @@ diff --git a/interface/web/client/lib/lang/fr_reseller.lng b/interface/web/client/lib/lang/fr_reseller.lng index f30fcd48c6b5be7f129cbca39fd6c526b8190209..867e9d5da06ff6320e8389d42f9bb41934679317 100644 --- a/interface/web/client/lib/lang/fr_reseller.lng +++ b/interface/web/client/lib/lang/fr_reseller.lng @@ -5,12 +5,14 @@ $wb['limit_mailalias_txt'] = 'Nombre maximal d’alias d’e-mail'; $wb['limit_mailforward_txt'] = 'Nombre maximal de routeurs d’e-mail'; $wb['limit_mailcatchall_txt'] = 'Nombre maximal de comptes collecteurs'; $wb['limit_mailrouting_txt'] = 'Nombre maximal de routes d’e-mails'; +$wb['limit_mail_wblist_txt'] = 'Max. number of email white / blacklist entries'; $wb['limit_mailfilter_txt'] = 'Nombre maximal de filtres d’e-mails'; $wb['limit_fetchmail_txt'] = 'Nombre maximal de comptes récupérateur e-mail'; $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'; @@ -35,6 +37,7 @@ $wb['company_txt'] = 'Entreprise'; $wb['title_txt'] = 'Titre'; $wb['firstname_txt'] = 'Prénom'; $wb['surname_txt'] = 'Nom'; +$wb['limit_relayhost_txt'] = 'Show SMTP relay host options'; $wb['limit_domain_txt'] = 'Nombre maximal de domaines'; $wb['limit_subdomain_txt'] = 'Nombre maximal de sous-domaines'; $wb['limit_webquota_txt'] = 'Limite du quota web'; @@ -64,6 +67,7 @@ $wb['limit_mailalias_error_notint'] = 'La limite d’alias d’e-mail doit être $wb['limit_mailforward_error_notint'] = 'La limite de routeurs d’e-mail doit être un nombre.'; $wb['limit_mailcatchall_error_notint'] = 'La limite de comptes collecteurs doit être un nombre.'; $wb['limit_mailrouting_error_notint'] = 'La limite de routes d’e-mail doit être un nombre.'; +$wb['limit_mail_wblist_error_notint'] = 'The email white / blacklist limit must be a number.'; $wb['limit_mailfilter_error_notint'] = 'La limite de filtres d’e-mail doit être un nombre.'; $wb['limit_mailfetchmail_error_notint'] = 'La limite de comptes récupérateur e-mail doit être un nombre.'; $wb['limit_mailquota_error_notint'] = 'La limite du quota des boîtes d’e-mail doit être un nombre.'; @@ -203,5 +207,6 @@ $wb['limit_database_quota_error_notint'] = 'The database quota limit must be a n $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'; -?> diff --git a/interface/web/client/lib/lang/hr.lng b/interface/web/client/lib/lang/hr.lng index 48c78e2bf18f791c5e544a425a55ba1a78b02088..a9e293840c33efe9eee51d36efb183be187fc316 100644 --- a/interface/web/client/lib/lang/hr.lng +++ b/interface/web/client/lib/lang/hr.lng @@ -16,6 +16,7 @@ $wb['Messaging'] = 'Slanje poruka'; $wb['Send email'] = 'Pošalji email'; $wb['Edit Client Circle'] = 'Promijeni krug klijenata'; $wb['Domains'] = 'Domene'; +$wb['Add Domain'] = 'Add Domain'; $wb['domain_txt'] = 'Domena'; $wb['client_txt'] = 'Klijent'; $wb['error_domain_in mailuse'] = 'Ova domena ne može biti obrisana jer se koristi kao mail domena'; diff --git a/interface/web/client/lib/lang/hr_client.lng b/interface/web/client/lib/lang/hr_client.lng index ec5b73d9405a71e0a95cc434e9df5f1dd51486dd..ed00a5c5202ee427218c3f7dfbc3af6a54f7421c 100644 --- a/interface/web/client/lib/lang/hr_client.lng +++ b/interface/web/client/lib/lang/hr_client.lng @@ -6,12 +6,14 @@ $wb['limit_mailaliasdomain_txt'] = 'Maksimalan broj aliasa email domena'; $wb['limit_mailforward_txt'] = 'Maksimalan broj email forwardera'; $wb['limit_mailcatchall_txt'] = 'Maksimalan broj email catchall računa'; $wb['limit_mailrouting_txt'] = 'Maksimalan broj email ruta'; +$wb['limit_mail_wblist_txt'] = 'Max. number of email white / blacklist entries'; $wb['limit_mailfilter_txt'] = 'Maksimalan broj email filtera'; $wb['limit_fetchmail_txt'] = 'Maksimalan broj fetchmail računa'; $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'; @@ -37,6 +39,7 @@ $wb['company_txt'] = 'Poduzeće'; $wb['title_txt'] = 'Naziv'; $wb['firstname_txt'] = 'Ime'; $wb['surname_txt'] = 'Prezime'; +$wb['limit_relayhost_txt'] = 'Show SMTP relay host options'; $wb['limit_domain_txt'] = 'limit_domena'; $wb['limit_subdomain_txt'] = 'limit_poddomena'; $wb['limit_webquota_txt'] = 'limit_prostora'; @@ -70,6 +73,7 @@ $wb['limit_mailaliasdomain_error_notint'] = 'Maksimalan broj email alias domena $wb['limit_mailforward_error_notint'] = 'Limit email forwarda mora biti znamenka.'; $wb['limit_mailcatchall_error_notint'] = 'Limit email catchalla mora biti znamenka.'; $wb['limit_mailrouting_error_notint'] = 'Limit email ruta mora biti znamenka.'; +$wb['limit_mail_wblist_error_notint'] = 'The email white / blacklist limit must be a number.'; $wb['limit_mailfilter_error_notint'] = 'Limit email filtera mora biti znamenka.'; $wb['limit_mailfetchmail_error_notint'] = 'Limit fetchmaila mora biti znamenka.'; $wb['limit_mailquota_error_notint'] = 'Veličina mailboxa mora biti znamenka.'; @@ -146,7 +150,7 @@ $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 all webs etc.)'; +$wb['locked_txt'] = 'Locked (disables everything except DNS)'; $wb['canceled_txt'] = 'Canceled (disables client login)'; $wb['gender_txt'] = 'Title'; $wb['gender_m_txt'] = 'Mr.'; @@ -200,5 +204,5 @@ $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'; -?> diff --git a/interface/web/client/lib/lang/hr_client_del.lng b/interface/web/client/lib/lang/hr_client_del.lng index 939cc59fb6c411ab7e7e93ae21fbddfb705f54f6..5f06b870082a20a03752b44a9e81acf8fdbac019 100644 --- a/interface/web/client/lib/lang/hr_client_del.lng +++ b/interface/web/client/lib/lang/hr_client_del.lng @@ -4,4 +4,7 @@ $wb['delete_explanation'] = 'Ukoliko potvrdite izbrisati će se svi zapisi povez $wb['btn_save_txt'] = 'Obriši klijenta'; $wb['btn_cancel_txt'] = 'Prekini i ne briši klijenta'; $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'; ?> diff --git a/interface/web/client/lib/lang/hr_client_template.lng b/interface/web/client/lib/lang/hr_client_template.lng index be39d96cffeb52208d78edb184af519d9cb32843..ce5b3e8ebc874b95612da325d18f4a3add305157 100644 --- a/interface/web/client/lib/lang/hr_client_template.lng +++ b/interface/web/client/lib/lang/hr_client_template.lng @@ -1,4 +1,5 @@ diff --git a/interface/web/client/lib/lang/hr_reseller.lng b/interface/web/client/lib/lang/hr_reseller.lng index 9188b6861b2318ac9e851d4b668784b123cf0f93..aaedd0b1c5e35e98b5fef8510a81839e0e5da42d 100644 --- a/interface/web/client/lib/lang/hr_reseller.lng +++ b/interface/web/client/lib/lang/hr_reseller.lng @@ -6,12 +6,14 @@ $wb['limit_mailaliasdomain_txt'] = 'Maksimalan broj aliasa email domena'; $wb['limit_mailforward_txt'] = 'Maksimalan broj email forwardera'; $wb['limit_mailcatchall_txt'] = 'Maksimalan broj email catchall računa'; $wb['limit_mailrouting_txt'] = 'Maksimalan broj email ruta'; +$wb['limit_mail_wblist_txt'] = 'Max. number of email white / blacklist entries'; $wb['limit_mailfilter_txt'] = 'Maksimalan broj email filtera'; $wb['limit_fetchmail_txt'] = 'Maksimalan broj fetchmail računa'; $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'; @@ -37,6 +39,7 @@ $wb['company_txt'] = 'Poduzeće'; $wb['title_txt'] = 'Naziv'; $wb['firstname_txt'] = 'Ime'; $wb['surname_txt'] = 'Prezime'; +$wb['limit_relayhost_txt'] = 'Show SMTP relay host options'; $wb['limit_domain_txt'] = 'limit_domena'; $wb['limit_subdomain_txt'] = 'limit_poddomena'; $wb['limit_webquota_txt'] = 'limit_prostora'; @@ -69,6 +72,7 @@ $wb['limit_mailalias_error_notint'] = 'Maksimalan broj email aliasa mora biti zn $wb['limit_mailforward_error_notint'] = 'Limit email forwarda mora biti znamenka.'; $wb['limit_mailcatchall_error_notint'] = 'Limit email catchalla mora biti znamenka.'; $wb['limit_mailrouting_error_notint'] = 'Limit email ruta mora biti znamenka.'; +$wb['limit_mail_wblist_error_notint'] = 'The email white / blacklist limit must be a number.'; $wb['limit_mailfilter_error_notint'] = 'Limit email filtera mora biti znamenka.'; $wb['limit_mailfetchmail_error_notint'] = 'Limit fetchmaila mora biti znamenka.'; $wb['limit_mailquota_error_notint'] = 'Veličina mailboxa mora biti znamenka.'; @@ -203,5 +207,6 @@ $wb['limit_database_quota_error_notint'] = 'The database quota limit must be a n $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'; -?> diff --git a/interface/web/client/lib/lang/hu.lng b/interface/web/client/lib/lang/hu.lng index 6b988dcee20c6be09870b0477a365e14594d4709..5e673985503ebe0e9fada9c1c3ee457963c9da9f 100644 --- a/interface/web/client/lib/lang/hu.lng +++ b/interface/web/client/lib/lang/hu.lng @@ -17,6 +17,7 @@ $wb['Messaging'] = 'Messaging'; $wb['Send email'] = 'Send Email'; $wb['Edit Client Circle'] = 'Edit Client Circle'; $wb['Domains'] = 'Domains'; +$wb['Add Domain'] = 'Add Domain'; $wb['domain_txt'] = 'Domain'; $wb['client_txt'] = 'Client'; $wb['error_domain_in mailuse'] = 'This domain cannot be deleted, because it is in use as mail-domain'; diff --git a/interface/web/client/lib/lang/hu_client.lng b/interface/web/client/lib/lang/hu_client.lng index 10993601c0f980eb09a2290de723e54179881ae9..9e6ad94a7b80c65bae8def8c4b09e87e773bab5a 100644 --- a/interface/web/client/lib/lang/hu_client.lng +++ b/interface/web/client/lib/lang/hu_client.lng @@ -5,12 +5,14 @@ $wb['limit_mailalias_txt'] = 'Maximálisan létrehozható email alias-ok száma' $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 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'; @@ -36,6 +38,7 @@ $wb['title_txt'] = 'Titulus'; $wb['firstname_txt'] = 'Keresztnév'; $wb['surname_txt'] = 'Vezetéknév'; $wb['limit_client_txt'] = 'Max. number of Clients'; +$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'; @@ -62,6 +65,7 @@ $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.'; @@ -107,7 +111,7 @@ $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 SSH 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'] = 'Delete additional template'; @@ -146,7 +150,7 @@ $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 all webs etc.)'; +$wb['locked_txt'] = 'Locked (disables everything except DNS)'; $wb['canceled_txt'] = 'Canceled (disables client login)'; $wb['gender_txt'] = 'Title'; $wb['gender_m_txt'] = 'Mr.'; @@ -200,5 +204,5 @@ $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'; -?> diff --git a/interface/web/client/lib/lang/hu_client_del.lng b/interface/web/client/lib/lang/hu_client_del.lng index 0932e9568ac478948a00b84b0c50acaf2ce0c7c2..21ddcb9ea44905b316d6830ae688abda9125eaef 100644 --- a/interface/web/client/lib/lang/hu_client_del.lng +++ b/interface/web/client/lib/lang/hu_client_del.lng @@ -4,4 +4,7 @@ $wb['delete_explanation'] = 'This action will delete the following number of rec $wb['btn_save_txt'] = 'Delete the client'; $wb['btn_cancel_txt'] = 'Cancel without deleting the client'; $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'; ?> diff --git a/interface/web/client/lib/lang/hu_client_message.lng b/interface/web/client/lib/lang/hu_client_message.lng index 6b2a872f10af4cb357413ee297331408c740a6c2..c211860f82ae12e9bb90b20eac64d34734505444 100644 --- a/interface/web/client/lib/lang/hu_client_message.lng +++ b/interface/web/client/lib/lang/hu_client_message.lng @@ -10,7 +10,7 @@ $wb['sender_invalid_error'] = 'Sender email invalid.'; $wb['subject_invalid_error'] = 'Subject is empty.'; $wb['message_invalid_error'] = 'Message is empty.'; $wb['email_sent_to_txt'] = 'Email sent to:'; -$wb['page_head_txt'] = 'Send customer information'; +$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'; diff --git a/interface/web/client/lib/lang/hu_client_template.lng b/interface/web/client/lib/lang/hu_client_template.lng index 49f443c737a842b16a2ecb3444b0b5393c5f7e20..74d37e7589486816faa3462e85e7ae1257c5cf47 100644 --- a/interface/web/client/lib/lang/hu_client_template.lng +++ b/interface/web/client/lib/lang/hu_client_template.lng @@ -1,4 +1,5 @@ diff --git a/interface/web/client/lib/lang/hu_reseller.lng b/interface/web/client/lib/lang/hu_reseller.lng index dd9290885ae739f08bb49eb88fdb158c28329654..26fffbc7e35a00eece5f249f943667fe516cea11 100644 --- a/interface/web/client/lib/lang/hu_reseller.lng +++ b/interface/web/client/lib/lang/hu_reseller.lng @@ -5,12 +5,14 @@ $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['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'; @@ -36,6 +38,7 @@ $wb['company_txt'] = 'Cég'; $wb['title_txt'] = 'Titulus'; $wb['firstname_txt'] = 'Keresztnév'; $wb['surname_txt'] = 'Vezetéknév'; +$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'; @@ -66,6 +69,7 @@ $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.'; @@ -107,7 +111,7 @@ $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 SSH 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'] = 'Delete additional template'; @@ -203,5 +207,6 @@ $wb['limit_database_quota_error_notint'] = 'The database quota limit must be a n $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'; -?> diff --git a/interface/web/client/lib/lang/id.lng b/interface/web/client/lib/lang/id.lng index a393cb77473a8343184b3a7183914c567145ce48..6fe64545f42b8fe3748f79cd55a76e58184d2245 100644 --- a/interface/web/client/lib/lang/id.lng +++ b/interface/web/client/lib/lang/id.lng @@ -17,6 +17,7 @@ $wb['Messaging'] = 'Messaging'; $wb['Send email'] = 'Send Email'; $wb['Edit Client Circle'] = 'Edit Client Circle'; $wb['Domains'] = 'Domains'; +$wb['Add Domain'] = 'Add Domain'; $wb['domain_txt'] = 'Domain'; $wb['client_txt'] = 'Client'; $wb['error_domain_in mailuse'] = 'This domain cannot be deleted, because it is in use as mail-domain'; diff --git a/interface/web/client/lib/lang/id_client.lng b/interface/web/client/lib/lang/id_client.lng index c84e6251f438c168bf4ca01d440ed1bc11a622cc..47f8971b1fdec6b1dd36c9ce145319b19cffcd7d 100644 --- a/interface/web/client/lib/lang/id_client.lng +++ b/interface/web/client/lib/lang/id_client.lng @@ -6,12 +6,14 @@ $wb['limit_mailaliasdomain_txt'] = 'Jumlah maks alias domain'; $wb['limit_mailforward_txt'] = 'Jumlah maks forwarder email'; $wb['limit_mailcatchall_txt'] = 'Jumlah maks akun catchall email'; $wb['limit_mailrouting_txt'] = 'Jumlah maks rute email'; +$wb['limit_mail_wblist_txt'] = 'Max. number of email white / blacklist entries'; $wb['limit_mailfilter_txt'] = 'Jumlah maks penyaringan email'; $wb['limit_fetchmail_txt'] = 'Jumlah maks akun fetchmail'; $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'; @@ -37,6 +39,7 @@ $wb['company_txt'] = 'Perusahaan'; $wb['title_txt'] = 'Judul'; $wb['firstname_txt'] = 'Nama depan'; $wb['surname_txt'] = 'Nama belakang'; +$wb['limit_relayhost_txt'] = 'Show SMTP relay host options'; $wb['limit_domain_txt'] = 'batasan domain'; $wb['limit_subdomain_txt'] = 'batasan subdomain'; $wb['limit_webquota_txt'] = 'batasan kuota web'; @@ -67,6 +70,7 @@ $wb['limit_mailaliasdomain_error_notint'] = 'Batasan alias domain email harus be $wb['limit_mailforward_error_notint'] = 'Batasan forward email harus berupa angka.'; $wb['limit_mailcatchall_error_notint'] = 'Batasan catchall email harus berupa angka.'; $wb['limit_mailrouting_error_notint'] = 'Batasan routing email harus berupa angka.'; +$wb['limit_mail_wblist_error_notint'] = 'The email white / blacklist limit must be a number.'; $wb['limit_mailfilter_error_notint'] = 'Batasan penyaringan email harus berupa angka.'; $wb['limit_mailfetchmail_error_notint'] = 'Batasan fetchmail harus berupa angka.'; $wb['limit_mailquota_error_notint'] = 'Batasan kuota email harus berupa angka.'; @@ -107,7 +111,7 @@ $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 SSH 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'] = 'Delete additional template'; @@ -146,7 +150,7 @@ $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 all webs etc.)'; +$wb['locked_txt'] = 'Locked (disables everything except DNS)'; $wb['canceled_txt'] = 'Canceled (disables client login)'; $wb['gender_txt'] = 'Title'; $wb['gender_m_txt'] = 'Mr.'; @@ -200,5 +204,5 @@ $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'; -?> diff --git a/interface/web/client/lib/lang/id_client_del.lng b/interface/web/client/lib/lang/id_client_del.lng index 1adf18bd7d016c5c90f161daea0152305d6cf3bd..2a8c6e32a158b407f8f50a4468399189ff6405c5 100644 --- a/interface/web/client/lib/lang/id_client_del.lng +++ b/interface/web/client/lib/lang/id_client_del.lng @@ -4,4 +4,7 @@ $wb['delete_explanation'] = 'Tindakan ini akan menghapus sejumlah record yang te $wb['btn_save_txt'] = 'Hapus Klien'; $wb['btn_cancel_txt'] = 'Batalkan Tanpa Menghapus Klien'; $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'; ?> diff --git a/interface/web/client/lib/lang/id_client_message.lng b/interface/web/client/lib/lang/id_client_message.lng index 6b2a872f10af4cb357413ee297331408c740a6c2..c211860f82ae12e9bb90b20eac64d34734505444 100644 --- a/interface/web/client/lib/lang/id_client_message.lng +++ b/interface/web/client/lib/lang/id_client_message.lng @@ -10,7 +10,7 @@ $wb['sender_invalid_error'] = 'Sender email invalid.'; $wb['subject_invalid_error'] = 'Subject is empty.'; $wb['message_invalid_error'] = 'Message is empty.'; $wb['email_sent_to_txt'] = 'Email sent to:'; -$wb['page_head_txt'] = 'Send customer information'; +$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'; diff --git a/interface/web/client/lib/lang/id_client_template.lng b/interface/web/client/lib/lang/id_client_template.lng index f48ba15bdb62175c16aa2c49238d736c4ee2421c..b4367236f73c9f09c1a35c92490d8867737184b1 100644 --- a/interface/web/client/lib/lang/id_client_template.lng +++ b/interface/web/client/lib/lang/id_client_template.lng @@ -1,4 +1,5 @@ diff --git a/interface/web/client/lib/lang/id_reseller.lng b/interface/web/client/lib/lang/id_reseller.lng index 821a35e3cde0939fee7818f317a9da2f534af6e1..01195a244c3eb45d6fad9134d7d3abd44e452281 100644 --- a/interface/web/client/lib/lang/id_reseller.lng +++ b/interface/web/client/lib/lang/id_reseller.lng @@ -5,12 +5,14 @@ $wb['limit_mailalias_txt'] = 'Jumlah maks alias email'; $wb['limit_mailforward_txt'] = 'Jumlah maks forwarder email'; $wb['limit_mailcatchall_txt'] = 'Jumlah maks akun catchall email'; $wb['limit_mailrouting_txt'] = 'Jumlah maks rute email'; +$wb['limit_mail_wblist_txt'] = 'Max. number of email white / blacklist entries'; $wb['limit_mailfilter_txt'] = 'Jumlah maks penyaringan email'; $wb['limit_fetchmail_txt'] = 'Jumlah maks akun fetchmail'; $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'; @@ -36,6 +38,7 @@ $wb['company_txt'] = 'Perusahaan'; $wb['title_txt'] = 'Judul'; $wb['firstname_txt'] = 'Nama Depan'; $wb['surname_txt'] = 'Nama Belakang'; +$wb['limit_relayhost_txt'] = 'Show SMTP relay host options'; $wb['limit_domain_txt'] = 'batasan domain'; $wb['limit_subdomain_txt'] = 'batasan subdomain'; $wb['limit_webquota_txt'] = 'batasan kuota web'; @@ -65,6 +68,7 @@ $wb['limit_mailalias_error_notint'] = 'Batasan alias email harus berupa angka.'; $wb['limit_mailforward_error_notint'] = 'Batasan forward email harus berupa angka.'; $wb['limit_mailcatchall_error_notint'] = 'Batasan catchall email harus berupa angka.'; $wb['limit_mailrouting_error_notint'] = 'Batasan routing email harus berupa angka.'; +$wb['limit_mail_wblist_error_notint'] = 'The email white / blacklist limit must be a number.'; $wb['limit_mailfilter_error_notint'] = 'Batasan penyaringan email harus berupa angka.'; $wb['limit_mailfetchmail_error_notint'] = 'Batasan fetchmail harus berupa angka.'; $wb['limit_mailquota_error_notint'] = 'Batasan kuota email harus berupa angka.'; @@ -107,7 +111,7 @@ $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 SSH 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'] = 'Delete additional template'; @@ -203,5 +207,6 @@ $wb['limit_database_quota_error_notint'] = 'The database quota limit must be a n $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'; -?> diff --git a/interface/web/client/lib/lang/it.lng b/interface/web/client/lib/lang/it.lng index ff740790b00191b1cb2412167e1f8e44298a83e1..257dca805d5be49a47cb6198e4d64cc8f0e99b32 100644 --- a/interface/web/client/lib/lang/it.lng +++ b/interface/web/client/lib/lang/it.lng @@ -15,6 +15,7 @@ $wb['Messaging'] = 'Messaging'; $wb['Send email'] = 'Send Email'; $wb['Edit Client Circle'] = 'Edit Client Circle'; $wb['Domains'] = 'Domains'; +$wb['Add Domain'] = 'Add Domain'; $wb['domain_txt'] = 'Dominio'; $wb['client_txt'] = 'Cliente'; $wb['error_domain_in mailuse'] = 'This domain cannot be deleted, because it is in use as mail-domain'; diff --git a/interface/web/client/lib/lang/it_client.lng b/interface/web/client/lib/lang/it_client.lng index 0f75d849d66aa85dee50f2a67cf44574b26740e5..9b2e6492cf55b41963b6d7718f251839651b00d1 100644 --- a/interface/web/client/lib/lang/it_client.lng +++ b/interface/web/client/lib/lang/it_client.lng @@ -3,14 +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'; @@ -35,12 +37,13 @@ $wb['title_txt'] = 'Titolo'; $wb['firstname_txt'] = 'Nome'; $wb['surname_txt'] = 'Cognome'; $wb['limit_client_txt'] = 'Numero 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_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'; @@ -58,94 +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_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 SSH 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'] = 'Bloccato (disables all webs etc.)'; -$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'; @@ -153,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['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 @@ 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 @@ diff --git a/interface/web/client/lib/lang/it_client_del.lng b/interface/web/client/lib/lang/it_client_del.lng index 49811c377ea4cdb0ce3f3ba5c894c7083c2e3c1d..ec0e31aa3c801de2c700d9fca6a137ac7dc4a121 100644 --- a/interface/web/client/lib/lang/it_client_del.lng +++ b/interface/web/client/lib/lang/it_client_del.lng @@ -3,5 +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['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 f5f93c22940eb23d8675001fd45229c05b255e4b..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 @@ 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 @@ 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 @@ diff --git a/interface/web/client/lib/lang/it_client_template.lng b/interface/web/client/lib/lang/it_client_template.lng index ecbf7c9e080ea8a32722b4b2acfa562b38d1d9ba..418bb033c7784802089f3915e7109c5a38ac382b 100644 --- a/interface/web/client/lib/lang/it_client_template.lng +++ b/interface/web/client/lib/lang/it_client_template.lng @@ -1,21 +1,24 @@ 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 @@ diff --git a/interface/web/client/lib/lang/it_reseller.lng b/interface/web/client/lib/lang/it_reseller.lng index 2cef293265ac55e86d43c40b16269a754c7100d1..2acac2cb609c9aa20161f460ab8970a28d32a8c8 100644 --- a/interface/web/client/lib/lang/it_reseller.lng +++ b/interface/web/client/lib/lang/it_reseller.lng @@ -1,23 +1,25 @@ 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['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.lng b/interface/web/client/lib/lang/ja.lng index c5ce289f700568be4fc93f44c276e90f90f45a64..b34cf49559e50c24ae68e9089ca0185b2b76bf56 100644 --- a/interface/web/client/lib/lang/ja.lng +++ b/interface/web/client/lib/lang/ja.lng @@ -17,6 +17,7 @@ $wb['Messaging'] = 'Messaging'; $wb['Send email'] = 'Send Email'; $wb['Edit Client Circle'] = 'Edit Client Circle'; $wb['Domains'] = 'Domains'; +$wb['Add Domain'] = 'Add Domain'; $wb['domain_txt'] = 'Domain'; $wb['client_txt'] = 'Client'; $wb['error_domain_in mailuse'] = 'This domain cannot be deleted, because it is in use as mail-domain'; diff --git a/interface/web/client/lib/lang/ja_client.lng b/interface/web/client/lib/lang/ja_client.lng index 33aa6ab4e9a6fffefc8bfe656690b0946964e3ee..4639125717189e1184ce60564d6cf5ea501b7eca 100644 --- a/interface/web/client/lib/lang/ja_client.lng +++ b/interface/web/client/lib/lang/ja_client.lng @@ -5,12 +5,14 @@ $wb['limit_mailalias_txt'] = 'メールエイリアスの最大数'; $wb['limit_mailforward_txt'] = 'メールフォワードの最大数'; $wb['limit_mailcatchall_txt'] = 'キャッチオール・メールアカウントの最大数'; $wb['limit_mailrouting_txt'] = 'メール配送経路の最大数'; +$wb['limit_mail_wblist_txt'] = 'Max. number of email white / blacklist entries'; $wb['limit_mailfilter_txt'] = 'メールフィルターの最大数'; $wb['limit_fetchmail_txt'] = 'fetchmailアカウントの最大数'; $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'; @@ -36,6 +38,7 @@ $wb['company_txt'] = '社名'; $wb['title_txt'] = '役職'; $wb['firstname_txt'] = '名'; $wb['surname_txt'] = '姓'; +$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'; @@ -66,6 +69,7 @@ $wb['limit_mailalias_error_notint'] = 'メールエイリアスの最大数は $wb['limit_mailforward_error_notint'] = 'メールフォワードの最大数は数字で指定してください。'; $wb['limit_mailcatchall_error_notint'] = 'キャッチオール・メールアドレスの最大数は数字で指定してください。'; $wb['limit_mailrouting_error_notint'] = 'メールの配送経路の最大数は数字で指定してください。'; +$wb['limit_mail_wblist_error_notint'] = 'The email white / blacklist limit must be a number.'; $wb['limit_mailfilter_error_notint'] = 'メールフィルターの最大数は数字で指定してください。'; $wb['limit_mailfetchmail_error_notint'] = 'fetchmailアカウントの最大数は数字で指定してください。'; $wb['limit_mailquota_error_notint'] = 'メールボックスの最大容量は数字で指定してください。'; @@ -107,7 +111,7 @@ $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 SSH 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'] = 'Delete additional template'; @@ -146,7 +150,7 @@ $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 all webs etc.)'; +$wb['locked_txt'] = 'Locked (disables everything except DNS)'; $wb['canceled_txt'] = 'Canceled (disables client login)'; $wb['gender_txt'] = 'Title'; $wb['gender_m_txt'] = 'Mr.'; @@ -200,5 +204,5 @@ $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'; -?> diff --git a/interface/web/client/lib/lang/ja_client_del.lng b/interface/web/client/lib/lang/ja_client_del.lng index 0932e9568ac478948a00b84b0c50acaf2ce0c7c2..21ddcb9ea44905b316d6830ae688abda9125eaef 100644 --- a/interface/web/client/lib/lang/ja_client_del.lng +++ b/interface/web/client/lib/lang/ja_client_del.lng @@ -4,4 +4,7 @@ $wb['delete_explanation'] = 'This action will delete the following number of rec $wb['btn_save_txt'] = 'Delete the client'; $wb['btn_cancel_txt'] = 'Cancel without deleting the client'; $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'; ?> diff --git a/interface/web/client/lib/lang/ja_client_message.lng b/interface/web/client/lib/lang/ja_client_message.lng index 6b2a872f10af4cb357413ee297331408c740a6c2..c211860f82ae12e9bb90b20eac64d34734505444 100644 --- a/interface/web/client/lib/lang/ja_client_message.lng +++ b/interface/web/client/lib/lang/ja_client_message.lng @@ -10,7 +10,7 @@ $wb['sender_invalid_error'] = 'Sender email invalid.'; $wb['subject_invalid_error'] = 'Subject is empty.'; $wb['message_invalid_error'] = 'Message is empty.'; $wb['email_sent_to_txt'] = 'Email sent to:'; -$wb['page_head_txt'] = 'Send customer information'; +$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'; diff --git a/interface/web/client/lib/lang/ja_client_template.lng b/interface/web/client/lib/lang/ja_client_template.lng index b0396932e3c3d0c3753cd4a926adbf725545c3cc..a871199051c506aaccf96f3111b827c16bbc9d18 100644 --- a/interface/web/client/lib/lang/ja_client_template.lng +++ b/interface/web/client/lib/lang/ja_client_template.lng @@ -1,4 +1,5 @@ diff --git a/interface/web/client/lib/lang/ja_reseller.lng b/interface/web/client/lib/lang/ja_reseller.lng index 7edf836f39c999bee35f248ab6ed14cc5a7718a6..041174da1bffb74ca02a52c37cf03d27a866143a 100644 --- a/interface/web/client/lib/lang/ja_reseller.lng +++ b/interface/web/client/lib/lang/ja_reseller.lng @@ -5,12 +5,14 @@ $wb['limit_mailalias_txt'] = 'メールエイリアスの最大数'; $wb['limit_mailforward_txt'] = 'メールフォワードの最大数'; $wb['limit_mailcatchall_txt'] = 'キャッチオール・メールアカウントの最大数'; $wb['limit_mailrouting_txt'] = 'メール配送経路の最大数'; +$wb['limit_mail_wblist_txt'] = 'Max. number of email white / blacklist entries'; $wb['limit_mailfilter_txt'] = 'メールフィルターの最大数'; $wb['limit_fetchmail_txt'] = 'Fetchmail アカウントの最大数'; $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'; @@ -36,6 +38,7 @@ $wb['company_txt'] = '社名'; $wb['title_txt'] = '役職'; $wb['firstname_txt'] = '名'; $wb['surname_txt'] = '姓'; +$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'; @@ -66,6 +69,7 @@ $wb['limit_mailalias_error_notint'] = 'メールエイリアスの最大数は $wb['limit_mailforward_error_notint'] = 'メールフォワードの最大数は数字で指定してください。'; $wb['limit_mailcatchall_error_notint'] = 'キャッチオール・メールアドレスの最大数は数字で指定してください。'; $wb['limit_mailrouting_error_notint'] = 'メールの配送経路の最大数は数字で指定してください。'; +$wb['limit_mail_wblist_error_notint'] = 'The email white / blacklist limit must be a number.'; $wb['limit_mailfilter_error_notint'] = 'メールフィルターの最大数は数字で指定してください。'; $wb['limit_mailfetchmail_error_notint'] = 'fetchmailアカウントの最大数は数字で指定してください。'; $wb['limit_mailquota_error_notint'] = 'メールボックスの最大容量は数字で指定してください。'; @@ -107,7 +111,7 @@ $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 SSH 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'] = 'Delete additional template'; @@ -203,5 +207,6 @@ $wb['limit_database_quota_error_notint'] = 'The database quota limit must be a n $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'; -?> diff --git a/interface/web/client/lib/lang/nl.lng b/interface/web/client/lib/lang/nl.lng index cf2307e6aa49fe4ee1581946f2366c8ec0da7fd9..dab8ba3c3c0a7148ab46335e51f17f77ebe57dfb 100644 --- a/interface/web/client/lib/lang/nl.lng +++ b/interface/web/client/lib/lang/nl.lng @@ -17,6 +17,7 @@ $wb['Messaging'] = 'Berichten'; $wb['Send email'] = 'Verstuur e-mail'; $wb['Edit Client Circle'] = 'Klanten collectie bewerken'; $wb['Domains'] = 'Domeinen'; +$wb['Add Domain'] = 'Domein toevoegen'; $wb['domain_txt'] = 'Domein'; $wb['client_txt'] = 'Klant'; $wb['error_domain_in mailuse'] = 'This domain cannot be deleted, because it is in use as mail-domain'; diff --git a/interface/web/client/lib/lang/nl_client.lng b/interface/web/client/lib/lang/nl_client.lng index 188a37f4fd4f2a858cec1857198bf8739702a64b..593d5dbdff1fb904284899a65accc379d58b2e02 100644 --- a/interface/web/client/lib/lang/nl_client.lng +++ b/interface/web/client/lib/lang/nl_client.lng @@ -6,12 +6,14 @@ $wb['limit_mailaliasdomain_txt'] = 'Max. number of domain aliassen'; $wb['limit_mailforward_txt'] = 'Max. aantal e-mail forwarders'; $wb['limit_mailcatchall_txt'] = 'Max. aantal email catchall accounts'; $wb['limit_mailrouting_txt'] = 'Max. aantal e-mail routes'; +$wb['limit_mail_wblist_txt'] = 'Max. number of email white / blacklist entries'; $wb['limit_mailfilter_txt'] = 'Max. aantal e-mail filters'; $wb['limit_fetchmail_txt'] = 'Max. aantal fetchmail accounts'; $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'; @@ -38,6 +40,7 @@ $wb['company_txt'] = 'Bedrijfsnaam'; $wb['title_txt'] = 'Titel'; $wb['firstname_txt'] = 'Voornaam'; $wb['surname_txt'] = 'Achternaam'; +$wb['limit_relayhost_txt'] = 'Show SMTP relay host options'; $wb['limit_domain_txt'] = 'limiet_domein'; $wb['limit_subdomain_txt'] = 'limiet_subdomein'; $wb['limit_webquota_txt'] = 'limiet_webquota'; @@ -71,6 +74,7 @@ $wb['limit_mailaliasdomain_error_notint'] = 'De e-mail domein alias limiet moet $wb['limit_mailforward_error_notint'] = 'De e-mail forward limiet moet een numerieke waarde zijn.'; $wb['limit_mailcatchall_error_notint'] = 'De e-mail catchall limiet moet een numerieke waarde zijn.'; $wb['limit_mailrouting_error_notint'] = 'De em-ail routing limiet moet een numerieke waarde zijn.'; +$wb['limit_mail_wblist_error_notint'] = 'The email white / blacklist limit must be a number.'; $wb['limit_mailfilter_error_notint'] = 'De e-mail filter limiet moet een numerieke waarde zijn.'; $wb['limit_mailfetchmail_error_notint'] = 'De fetchmail limiet moet een numerieke waarde zijn.'; $wb['limit_mailquota_error_notint'] = 'De e-mail quota limiet moet een numerieke waarde zijn.'; @@ -108,7 +112,7 @@ $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 SSH 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'] = 'Delete additional template'; @@ -147,14 +151,14 @@ $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 all webs etc.)'; +$wb['locked_txt'] = 'Locked (disables everything except DNS)'; $wb['canceled_txt'] = 'Canceled (disables client login)'; $wb['gender_txt'] = 'Title'; $wb['gender_m_txt'] = 'Mr.'; $wb['gender_f_txt'] = 'Ms.'; $wb['added_by_txt'] = 'Added by'; $wb['added_date_txt'] = 'Added date'; -$wb['parent_client_id_txt'] = 'Client of reseller'; +$wb['parent_client_id_txt'] = 'Client van reseller'; $wb['none_txt'] = 'none'; $wb['email_error_empty'] = 'Email is empty'; $wb['xmpp_limits_txt'] = 'XMPP Limits'; @@ -200,5 +204,5 @@ $wb['limit_database_user_error_notint'] = 'The database user limit must be a num $wb['limit_ssl_letsencrypt_txt'] = 'Let\'s Encrypt available'; $wb['limit_directive_snippets_txt'] = 'Show web server config selection'; $wb['limit_dns_record_error_notint'] = 'The dns record limit must be a number.'; +$wb['Address'] = 'Address'; $wb['Limits'] = 'Limits'; -?> diff --git a/interface/web/client/lib/lang/nl_client_del.lng b/interface/web/client/lib/lang/nl_client_del.lng index 294fb5011b4538ba2d05f757199b4576ef8e7625..9b9e5d5bc3ba57416232d646af55a9f29ce7cde7 100644 --- a/interface/web/client/lib/lang/nl_client_del.lng +++ b/interface/web/client/lib/lang/nl_client_del.lng @@ -4,4 +4,7 @@ $wb['delete_explanation'] = 'Deze actie verwijderd het volgende aantal aan recor $wb['btn_save_txt'] = 'Verwijder de klant'; $wb['btn_cancel_txt'] = 'Annuleren zonder de klant te verwijderen'; $wb['confirm_client_delete_txt'] = 'Weet je zeker dat je deze klant wil verwijderen ?'; +$wb['list_head_txt'] = 'Delete Client'; +$wb['table_txt'] = 'Table'; +$wb['data_txt'] = 'Data'; ?> diff --git a/interface/web/client/lib/lang/nl_client_message.lng b/interface/web/client/lib/lang/nl_client_message.lng index aaa93be1b8da1785450faa9a06fe0473aa3df229..2a0a42eff46eb7666ca0a2681d0a09e60856a327 100644 --- a/interface/web/client/lib/lang/nl_client_message.lng +++ b/interface/web/client/lib/lang/nl_client_message.lng @@ -10,7 +10,7 @@ $wb['sender_invalid_error'] = 'Sender email invalid.'; $wb['subject_invalid_error'] = 'Onderwerp is leeg.'; $wb['message_invalid_error'] = 'Bericht is leeg.'; $wb['email_sent_to_txt'] = 'E-mail verstuurd aan:'; -$wb['page_head_txt'] = 'Send customer information'; +$wb['page_head_txt'] = 'Send email message to clients and resellers'; $wb['recipient_txt'] = 'Ontvanger'; $wb['all_clients_resellers_txt'] = 'Alle klanten en resellers'; $wb['all_clients_txt'] = 'Alle klanten'; diff --git a/interface/web/client/lib/lang/nl_client_template.lng b/interface/web/client/lib/lang/nl_client_template.lng index 60e8092792ebab1559a230c4889c019ccfffb127..c31638c1327e4f56b8cd6029825dfd19b38cc6c3 100644 --- a/interface/web/client/lib/lang/nl_client_template.lng +++ b/interface/web/client/lib/lang/nl_client_template.lng @@ -1,4 +1,5 @@ diff --git a/interface/web/client/lib/lang/nl_domain_list.lng b/interface/web/client/lib/lang/nl_domain_list.lng index 130345f388c85af4f0478fa069c623819bca5f2b..802917f9230eb3c8d44a4cfa98b74630c75f3e5b 100644 --- a/interface/web/client/lib/lang/nl_domain_list.lng +++ b/interface/web/client/lib/lang/nl_domain_list.lng @@ -1,6 +1,6 @@ diff --git a/interface/web/client/lib/lang/nl_reseller.lng b/interface/web/client/lib/lang/nl_reseller.lng index 9953880bec94b4baaa4ceb1c745ebb7d5a289e21..e67e560e93b091dfe3fe57e92a8069b01777d040 100644 --- a/interface/web/client/lib/lang/nl_reseller.lng +++ b/interface/web/client/lib/lang/nl_reseller.lng @@ -5,12 +5,14 @@ $wb['limit_mailalias_txt'] = 'Max. aantal e-mail aliassen'; $wb['limit_mailforward_txt'] = 'Max. aantal e-mail forwarders'; $wb['limit_mailcatchall_txt'] = 'Max. aantal e-mail catchall accounts'; $wb['limit_mailrouting_txt'] = 'Max. aantal e-mail routes'; +$wb['limit_mail_wblist_txt'] = 'Max. number of email white / blacklist entries'; $wb['limit_mailfilter_txt'] = 'Max. aantal e-mail filters'; $wb['limit_fetchmail_txt'] = 'Max. aantal fetchmail accounts'; $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'; @@ -37,6 +39,7 @@ $wb['company_txt'] = 'Bedrijfnaam'; $wb['title_txt'] = 'Titel'; $wb['firstname_txt'] = 'Voornaam'; $wb['surname_txt'] = 'Achternaam'; +$wb['limit_relayhost_txt'] = 'Show SMTP relay host options'; $wb['limit_domain_txt'] = 'limiet_domein'; $wb['limit_subdomain_txt'] = 'limiet_subdomein'; $wb['limit_webquota_txt'] = 'limiet_webquota'; @@ -67,6 +70,7 @@ $wb['limit_mailalias_error_notint'] = 'De e-mail alias limiet moet een numerieke $wb['limit_mailforward_error_notint'] = 'De e-mail forward limiet moet een numerieke waarde zijn.'; $wb['limit_mailcatchall_error_notint'] = 'De e-mail catchall limiet moet een numerieke waarde zijn.'; $wb['limit_mailrouting_error_notint'] = 'De e-mail routing limiet moet een numerieke waarde zijn.'; +$wb['limit_mail_wblist_error_notint'] = 'The email white / blacklist limit must be a number.'; $wb['limit_mailfilter_error_notint'] = 'De e-mail filter limiet moet een numerieke waarde zijn.'; $wb['limit_mailfetchmail_error_notint'] = 'De fetchmail limiet moet een numerieke waarde zijn.'; $wb['limit_mailquota_error_notint'] = 'De email quota limiet moet een numerieke waarde zijn.'; @@ -108,7 +112,7 @@ $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 SSH 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'] = 'Delete additional template'; @@ -203,5 +207,6 @@ $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['Reseller'] = 'Reseller'; +$wb['Address'] = 'Address'; $wb['Limits'] = 'Limits'; -?> diff --git a/interface/web/client/lib/lang/pl.lng b/interface/web/client/lib/lang/pl.lng index ca1563e8b840e13b5f44b072f33e60ee477de5ee..da8b3b1526d9cc04b6aa112a5470763df2d3fda2 100644 --- a/interface/web/client/lib/lang/pl.lng +++ b/interface/web/client/lib/lang/pl.lng @@ -5,8 +5,8 @@ $wb['Limits'] = 'Limity'; $wb['Add Client'] = 'Dodaj klienta'; $wb['Edit Client'] = 'Edytuj klienta'; $wb['Clients'] = 'Klienci'; -$wb['Templates'] = 'Templates'; -$wb['Limit-Templates'] = 'Limit-Templates'; +$wb['Templates'] = 'Szablony'; +$wb['Limit-Templates'] = 'Szablony limitów'; $wb['Add Reseller'] = 'Dodaj Resellera'; $wb['Edit Reseller'] = 'Edytuj Resellera'; $wb['Resellers'] = 'Resellerzy'; @@ -17,13 +17,14 @@ $wb['Messaging'] = 'Wiadomości dla klientów'; $wb['Send email'] = 'Wyślij email'; $wb['Edit Client Circle'] = 'Edytuj grupy klientów'; $wb['Domains'] = 'Domeny'; +$wb['Add Domain'] = 'Add Domain'; $wb['domain_txt'] = 'Domena'; $wb['client_txt'] = 'Klient'; $wb['error_domain_in mailuse'] = 'Ta domena nie może zostać usunięta ponieważ jest używana jako domena dla poczty email.'; $wb['error_domain_in webuse'] = 'Ta domena nie może zostać usunięta ponieważ jest używana jako domena dla strony www.'; $wb['error_client_can_not_add_domain'] = 'Nie możesz dodać nowej domeny'; $wb['error_client_group_id_empty'] = 'Musisz wybrać klienta
    '; -$wb['error_domain_in dnsuse'] = 'This domain cannot be deleted, because it is in use as dns zone'; -$wb['error_domain_in dnsslaveuse'] = 'This domain cannot be deleted, because it is in use as secondary dns zone'; -$wb['Email-Templates'] = 'Email-Templates'; +$wb['error_domain_in dnsuse'] = 'Nie można usunąć tej domeny, ponieważ jest ona używana jako strefa dns'; +$wb['error_domain_in dnsslaveuse'] = 'Ta domena nie może zostać usunięta, ponieważ jest ona używana jako druga strefa dns'; +$wb['Email-Templates'] = 'Szablony email'; ?> diff --git a/interface/web/client/lib/lang/pl_client.lng b/interface/web/client/lib/lang/pl_client.lng index f1a1e1e6e7da66785975f87555ca6a3c9ed05225..6943deef9502488431195fc80af074cea5a51c26 100644 --- a/interface/web/client/lib/lang/pl_client.lng +++ b/interface/web/client/lib/lang/pl_client.lng @@ -5,12 +5,14 @@ $wb['limit_mailalias_txt'] = 'Maksymalna ilość aliasów e-mail'; $wb['limit_mailforward_txt'] = 'Maksymalna ilość przekierowań e-mail'; $wb['limit_mailcatchall_txt'] = 'Maksymalna ilość kont e-mail catchall'; $wb['limit_mailrouting_txt'] = 'Maksymalna ilość ścieżek e-mail'; +$wb['limit_mail_wblist_txt'] = 'Max. number of email white / blacklist entries'; $wb['limit_mailfilter_txt'] = 'Maksymalna ilość filtrów e-mail'; $wb['limit_fetchmail_txt'] = 'Maksymalna ilość kont z fetchmail'; $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'; @@ -36,6 +38,7 @@ $wb['company_txt'] = 'Firma'; $wb['title_txt'] = 'Tytuł'; $wb['firstname_txt'] = 'Imię'; $wb['surname_txt'] = 'Nazwisko'; +$wb['limit_relayhost_txt'] = 'Show SMTP relay host options'; $wb['limit_domain_txt'] = 'Limit domen'; $wb['limit_subdomain_txt'] = 'Limit subdomen'; $wb['limit_webquota_txt'] = 'Limit pojemności www'; @@ -66,6 +69,7 @@ $wb['limit_mailalias_error_notint'] = 'Limit aliasów e-mail musi być liczbą.' $wb['limit_mailforward_error_notint'] = 'Limit przekierowań musi być liczbą.'; $wb['limit_mailcatchall_error_notint'] = 'Limit e-mail catchall musi być liczbą.'; $wb['limit_mailrouting_error_notint'] = 'Limit ścieżek e-mail musi być liczbą.'; +$wb['limit_mail_wblist_error_notint'] = 'The email white / blacklist limit must be a number.'; $wb['limit_mailfilter_error_notint'] = 'Limit filtrów e-mail musi być liczbą.'; $wb['limit_mailfetchmail_error_notint'] = 'Limit fetchmail musi być liczbą.'; $wb['limit_mailquota_error_notint'] = 'Limit pojemności skrzynki musi być liczbą.'; @@ -146,7 +150,7 @@ $wb['aps_limits_txt'] = 'Limity Instalatora APS'; $wb['limit_aps_txt'] = 'Maks. liczba instalacji APS'; $wb['limit_aps_error_notint'] = 'Limit instalacji APS musi być liczbą'; $wb['default_slave_dnsserver_txt'] = 'Default Secondary DNS Server'; -$wb['locked_txt'] = 'Locked (disables all webs etc.)'; +$wb['locked_txt'] = 'Locked (disables everything except DNS)'; $wb['canceled_txt'] = 'Canceled (disables client login)'; $wb['gender_txt'] = 'Title'; $wb['gender_m_txt'] = 'Mr.'; @@ -200,5 +204,5 @@ $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'; -?> diff --git a/interface/web/client/lib/lang/pl_client_del.lng b/interface/web/client/lib/lang/pl_client_del.lng index 429c61b4c72b3d22814c5659ef1cbe46d86fcf62..4e5a2386f910ec8f325ed7d1c96f3f6465f9136e 100644 --- a/interface/web/client/lib/lang/pl_client_del.lng +++ b/interface/web/client/lib/lang/pl_client_del.lng @@ -4,4 +4,7 @@ $wb['delete_explanation'] = 'Ta akcja usunie następującą liczbę rekordów po $wb['btn_save_txt'] = 'Usuń klienta'; $wb['btn_cancel_txt'] = 'Anuluj bez usuwania klienta'; $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'; ?> diff --git a/interface/web/client/lib/lang/pl_client_template.lng b/interface/web/client/lib/lang/pl_client_template.lng index f3be8247fb6a8604a31a61cd17ada947770db275..614bf2757584bab00c4c83b74c486da935bd0a11 100644 --- a/interface/web/client/lib/lang/pl_client_template.lng +++ b/interface/web/client/lib/lang/pl_client_template.lng @@ -1,4 +1,5 @@ diff --git a/interface/web/client/lib/lang/pl_reseller.lng b/interface/web/client/lib/lang/pl_reseller.lng index 9b2cf58f7526364c4158aa5d1483ce1656fb0be6..da566ab4c6c14fdc8674a0bd06fb2057cec38851 100644 --- a/interface/web/client/lib/lang/pl_reseller.lng +++ b/interface/web/client/lib/lang/pl_reseller.lng @@ -5,12 +5,14 @@ $wb['limit_mailalias_txt'] = 'Maksymalna ilość aliasów e-mail'; $wb['limit_mailforward_txt'] = 'Maksymalna ilość przekierowań e-mail'; $wb['limit_mailcatchall_txt'] = 'Maksymalna ilość kont e-mail catchall'; $wb['limit_mailrouting_txt'] = 'Maksymalna ilość ścieżek e-mail'; +$wb['limit_mail_wblist_txt'] = 'Max. number of email white / blacklist entries'; $wb['limit_mailfilter_txt'] = 'Maksymalna ilość filtrów e-mail'; $wb['limit_fetchmail_txt'] = 'Maksymalna ilość kont fetchmail'; $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'; @@ -36,6 +38,7 @@ $wb['company_txt'] = 'Firma'; $wb['title_txt'] = 'Tytuł'; $wb['firstname_txt'] = 'Imię'; $wb['surname_txt'] = 'Nazwisko'; +$wb['limit_relayhost_txt'] = 'Show SMTP relay host options'; $wb['limit_domain_txt'] = 'limit_domen'; $wb['limit_subdomain_txt'] = 'limit_subdomen'; $wb['limit_webquota_txt'] = 'limit_pojemnosci_www'; @@ -66,6 +69,7 @@ $wb['limit_mailalias_error_notint'] = 'Limit aliasów e-mail musi być liczbą.' $wb['limit_mailforward_error_notint'] = 'Limit przekierowań e-mail musi być liczbą.'; $wb['limit_mailcatchall_error_notint'] = 'Limit kont e-mail catchall musi być liczbą.'; $wb['limit_mailrouting_error_notint'] = 'Limit ścieżek e-mail musi być liczbą.'; +$wb['limit_mail_wblist_error_notint'] = 'The email white / blacklist limit must be a number.'; $wb['limit_mailfilter_error_notint'] = 'Limit filtrów e-mail musi być liczbą.'; $wb['limit_mailfetchmail_error_notint'] = 'Limit kont fetchmail musi być liczbą.'; $wb['limit_mailquota_error_notint'] = 'Limit pojemności konta e-mail musi być liczbą.'; @@ -203,5 +207,6 @@ $wb['limit_database_quota_error_notint'] = 'The database quota limit must be a n $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'; -?> diff --git a/interface/web/client/lib/lang/pt.lng b/interface/web/client/lib/lang/pt.lng index 1be427e8200496fb726491d91ebe82ab8349335d..1f837aa963d6e13cc6845b8bd410033dba038443 100644 --- a/interface/web/client/lib/lang/pt.lng +++ b/interface/web/client/lib/lang/pt.lng @@ -17,6 +17,7 @@ $wb['Messaging'] = 'Messaging'; $wb['Send email'] = 'Send Email'; $wb['Edit Client Circle'] = 'Edit Client Circle'; $wb['Domains'] = 'Domains'; +$wb['Add Domain'] = 'Add Domain'; $wb['domain_txt'] = 'Domain'; $wb['client_txt'] = 'Client'; $wb['error_domain_in mailuse'] = 'This domain cannot be deleted, because it is in use as mail-domain'; diff --git a/interface/web/client/lib/lang/pt_client.lng b/interface/web/client/lib/lang/pt_client.lng index ae3e45b24d343e36e512e71455665cb214ad4ff8..2b90c823ca93407a2f80b3f172babc97c0ce87e2 100644 --- a/interface/web/client/lib/lang/pt_client.lng +++ b/interface/web/client/lib/lang/pt_client.lng @@ -5,12 +5,14 @@ $wb['limit_mailalias_txt'] = 'Número máximo de aliases de correio'; $wb['limit_mailforward_txt'] = 'Número máximo de redireccionamento de correio'; $wb['limit_mailcatchall_txt'] = 'Número máximo de catchall de correio'; $wb['limit_mailrouting_txt'] = 'Número máximo de rotas de correio'; +$wb['limit_mail_wblist_txt'] = 'Max. number of email white / blacklist entries'; $wb['limit_mailfilter_txt'] = 'Número máximo de filtros de correio'; $wb['limit_fetchmail_txt'] = 'Número máximo de fetchmail de correio'; $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'; @@ -36,6 +38,7 @@ $wb['company_txt'] = 'Empresa'; $wb['title_txt'] = 'Título'; $wb['firstname_txt'] = 'Nome'; $wb['surname_txt'] = 'Sobrenome'; +$wb['limit_relayhost_txt'] = 'Show SMTP relay host options'; $wb['limit_domain_txt'] = 'limite_dominio'; $wb['limit_subdomain_txt'] = 'limit_subdominio'; $wb['limit_webquota_txt'] = 'limit_webquota'; @@ -63,6 +66,7 @@ $wb['limit_mailalias_error_notint'] = 'Limite do alias de correio deve ser um n $wb['limit_mailforward_error_notint'] = 'Limite de redireccionamento de correio deve ser um número'; $wb['limit_mailcatchall_error_notint'] = 'Limite de catchall deve ser um número.'; $wb['limit_mailrouting_error_notint'] = 'Limite de rotas de correio deve ser um número.'; +$wb['limit_mail_wblist_error_notint'] = 'The email white / blacklist limit must be a number.'; $wb['limit_mailfilter_error_notint'] = 'Limite de filtros de correio deve ser um número.'; $wb['limit_mailfetchmail_error_notint'] = 'Limite de fetchmail deve ser um número.'; $wb['limit_mailquota_error_notint'] = 'A quota de correio deve ser um número'; @@ -107,7 +111,7 @@ $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 SSH 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'] = 'Delete additional template'; @@ -146,7 +150,7 @@ $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 all webs etc.)'; +$wb['locked_txt'] = 'Locked (disables everything except DNS)'; $wb['canceled_txt'] = 'Canceled (disables client login)'; $wb['gender_txt'] = 'Title'; $wb['gender_m_txt'] = 'Mr.'; @@ -200,5 +204,5 @@ $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'; -?> diff --git a/interface/web/client/lib/lang/pt_client_del.lng b/interface/web/client/lib/lang/pt_client_del.lng index ef71fa91e5e0436c4cc3f38f65652c003a815905..7b56473550e0bf3d392a72035ae3ac4f748e3fe5 100644 --- a/interface/web/client/lib/lang/pt_client_del.lng +++ b/interface/web/client/lib/lang/pt_client_del.lng @@ -4,4 +4,7 @@ $wb['delete_explanation'] = 'Atenção: está acção ira remover todos os objec $wb['btn_save_txt'] = 'Remover o cliente'; $wb['btn_cancel_txt'] = 'Cancelar sem remover o 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'; ?> diff --git a/interface/web/client/lib/lang/pt_client_message.lng b/interface/web/client/lib/lang/pt_client_message.lng index 6b2a872f10af4cb357413ee297331408c740a6c2..c211860f82ae12e9bb90b20eac64d34734505444 100644 --- a/interface/web/client/lib/lang/pt_client_message.lng +++ b/interface/web/client/lib/lang/pt_client_message.lng @@ -10,7 +10,7 @@ $wb['sender_invalid_error'] = 'Sender email invalid.'; $wb['subject_invalid_error'] = 'Subject is empty.'; $wb['message_invalid_error'] = 'Message is empty.'; $wb['email_sent_to_txt'] = 'Email sent to:'; -$wb['page_head_txt'] = 'Send customer information'; +$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'; diff --git a/interface/web/client/lib/lang/pt_client_template.lng b/interface/web/client/lib/lang/pt_client_template.lng index 814d7c417f39608541c0eb6f495e4d6b12f63a2f..7f63af0df32217c2291abb807e942d6eb43890f5 100644 --- a/interface/web/client/lib/lang/pt_client_template.lng +++ b/interface/web/client/lib/lang/pt_client_template.lng @@ -1,4 +1,5 @@ diff --git a/interface/web/client/lib/lang/pt_reseller.lng b/interface/web/client/lib/lang/pt_reseller.lng index e021cd251142fb58245d3bfc068f641ec04db19a..22c4f107a8d0030bd1536898d66ccd21f87ade81 100644 --- a/interface/web/client/lib/lang/pt_reseller.lng +++ b/interface/web/client/lib/lang/pt_reseller.lng @@ -5,12 +5,14 @@ $wb['limit_mailalias_txt'] = 'Número máximo de aliases de correio'; $wb['limit_mailforward_txt'] = 'Número máximo de encaminhamentos de correio'; $wb['limit_mailcatchall_txt'] = 'Número máximo de contas catchall'; $wb['limit_mailrouting_txt'] = 'Número máximo de rotas de correio'; +$wb['limit_mail_wblist_txt'] = 'Max. number of email white / blacklist entries'; $wb['limit_mailfilter_txt'] = 'Número máximo de filtros de correio'; $wb['limit_fetchmail_txt'] = 'Número máximo de contas fetchmail '; $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'; @@ -36,6 +38,7 @@ $wb['company_txt'] = 'Empresa'; $wb['title_txt'] = 'Título'; $wb['firstname_txt'] = 'Nome'; $wb['surname_txt'] = 'Sobrenome'; +$wb['limit_relayhost_txt'] = 'Show SMTP relay host options'; $wb['limit_domain_txt'] = 'limite_domínio'; $wb['limit_subdomain_txt'] = 'limite_subdomínio'; $wb['limit_webquota_txt'] = 'limite_webquota'; @@ -66,6 +69,7 @@ $wb['limit_mailalias_error_notint'] = 'O limite de aliases de correio deve ser u $wb['limit_mailforward_error_notint'] = 'O limite de encaminhamentos de correio deve ser um número.'; $wb['limit_mailcatchall_error_notint'] = 'O limite de contas catchall deve ser um número.'; $wb['limit_mailrouting_error_notint'] = 'O limite de rotas de correio deve ser um número.'; +$wb['limit_mail_wblist_error_notint'] = 'The email white / blacklist limit must be a number.'; $wb['limit_mailfilter_error_notint'] = 'O filtro de correio deve ser um número.'; $wb['limit_mailfetchmail_error_notint'] = 'O limite de fetchmail deve ser um número.'; $wb['limit_mailquota_error_notint'] = 'O limite de quota de correio deve ser um número.'; @@ -107,7 +111,7 @@ $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 SSH 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'] = 'Delete additional template'; @@ -203,5 +207,6 @@ $wb['limit_database_quota_error_notint'] = 'The database quota limit must be a n $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'; -?> diff --git a/interface/web/client/lib/lang/ro.lng b/interface/web/client/lib/lang/ro.lng index 245991ff9df7799883342f9d8680b8150fc605a7..f129f4273fe0211b5a16dd15dcc92c44fc18c242 100644 --- a/interface/web/client/lib/lang/ro.lng +++ b/interface/web/client/lib/lang/ro.lng @@ -17,6 +17,7 @@ $wb['Messaging'] = 'Messaging'; $wb['Send email'] = 'Send Email'; $wb['Edit Client Circle'] = 'Edit Client Circle'; $wb['Domains'] = 'Domains'; +$wb['Add Domain'] = 'Add Domain'; $wb['domain_txt'] = 'Domain'; $wb['client_txt'] = 'Client'; $wb['error_domain_in mailuse'] = 'This domain cannot be deleted, because it is in use as mail-domain'; diff --git a/interface/web/client/lib/lang/ro_client.lng b/interface/web/client/lib/lang/ro_client.lng index 034c4d0e44b5669c04e6b6aa90b4b94834c36efb..70407714a8fbe67e51c83474c909fcd43c077f68 100644 --- a/interface/web/client/lib/lang/ro_client.lng +++ b/interface/web/client/lib/lang/ro_client.lng @@ -5,12 +5,14 @@ $wb['limit_mailalias_txt'] = 'Numar maxim de email alias-uri'; $wb['limit_mailforward_txt'] = 'Numar maxim de mail forward'; $wb['limit_mailcatchall_txt'] = 'numar maxim de mail catch all'; $wb['limit_mailrouting_txt'] = 'Numar maxim de mail rute'; +$wb['limit_mail_wblist_txt'] = 'Max. number of email white / blacklist entries'; $wb['limit_mailfilter_txt'] = 'Numar maxim de filtre mail'; $wb['limit_fetchmail_txt'] = 'Numar maxim de conturi fetchmail'; $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'; @@ -36,6 +38,7 @@ $wb['company_txt'] = 'Companie'; $wb['title_txt'] = 'Titlu'; $wb['firstname_txt'] = 'Prenume'; $wb['surname_txt'] = 'Nume'; +$wb['limit_relayhost_txt'] = 'Show SMTP relay host options'; $wb['limit_domain_txt'] = 'limita_domeniu'; $wb['limit_subdomain_txt'] = 'limita_subdomeniu'; $wb['limit_webquota_txt'] = 'limit_webquota'; @@ -63,6 +66,7 @@ $wb['limit_mailalias_error_notint'] = 'Numarul maxim de alias-uri email trebuie $wb['limit_mailforward_error_notint'] = 'Numarul limta de forward-uri email trebuie sa fie un numar intreg'; $wb['limit_mailcatchall_error_notint'] = 'numarul limta de email catch all trebuie sa fie un numar intreg'; $wb['limit_mailrouting_error_notint'] = 'numarul maxim de rute email trebuie sa fie un numar intreg'; +$wb['limit_mail_wblist_error_notint'] = 'The email white / blacklist limit must be a number.'; $wb['limit_mailfilter_error_notint'] = 'numarul maxim de filtre email trebuie sa fie un numar intreg'; $wb['limit_mailfetchmail_error_notint'] = 'numarul maxim de fetchmail trebuie sa fie un numar intreg'; $wb['limit_mailquota_error_notint'] = 'The email quota limit must be a number.'; @@ -107,7 +111,7 @@ $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 SSH 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'] = 'Delete additional template'; @@ -146,7 +150,7 @@ $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 all webs etc.)'; +$wb['locked_txt'] = 'Locked (disables everything except DNS)'; $wb['canceled_txt'] = 'Canceled (disables client login)'; $wb['gender_txt'] = 'Title'; $wb['gender_m_txt'] = 'Mr.'; @@ -200,5 +204,5 @@ $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'; -?> diff --git a/interface/web/client/lib/lang/ro_client_del.lng b/interface/web/client/lib/lang/ro_client_del.lng index 0932e9568ac478948a00b84b0c50acaf2ce0c7c2..21ddcb9ea44905b316d6830ae688abda9125eaef 100644 --- a/interface/web/client/lib/lang/ro_client_del.lng +++ b/interface/web/client/lib/lang/ro_client_del.lng @@ -4,4 +4,7 @@ $wb['delete_explanation'] = 'This action will delete the following number of rec $wb['btn_save_txt'] = 'Delete the client'; $wb['btn_cancel_txt'] = 'Cancel without deleting the client'; $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'; ?> diff --git a/interface/web/client/lib/lang/ro_client_message.lng b/interface/web/client/lib/lang/ro_client_message.lng index 6b2a872f10af4cb357413ee297331408c740a6c2..c211860f82ae12e9bb90b20eac64d34734505444 100644 --- a/interface/web/client/lib/lang/ro_client_message.lng +++ b/interface/web/client/lib/lang/ro_client_message.lng @@ -10,7 +10,7 @@ $wb['sender_invalid_error'] = 'Sender email invalid.'; $wb['subject_invalid_error'] = 'Subject is empty.'; $wb['message_invalid_error'] = 'Message is empty.'; $wb['email_sent_to_txt'] = 'Email sent to:'; -$wb['page_head_txt'] = 'Send customer information'; +$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'; diff --git a/interface/web/client/lib/lang/ro_client_template.lng b/interface/web/client/lib/lang/ro_client_template.lng index 08632bc7e97d83b6150769dbe101d335a17c350e..abd9f64eb123a7333335f5066125d6d7a7852b62 100644 --- a/interface/web/client/lib/lang/ro_client_template.lng +++ b/interface/web/client/lib/lang/ro_client_template.lng @@ -1,4 +1,5 @@ diff --git a/interface/web/client/lib/lang/ro_reseller.lng b/interface/web/client/lib/lang/ro_reseller.lng index 68e8a950f36cc62cc603e077401a697e6d8ea509..9f3ce64e8007a6dd75590e1e68f32586827d9561 100644 --- a/interface/web/client/lib/lang/ro_reseller.lng +++ b/interface/web/client/lib/lang/ro_reseller.lng @@ -5,12 +5,14 @@ $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['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'; @@ -36,6 +38,7 @@ $wb['company_txt'] = 'Company'; $wb['title_txt'] = 'Title'; $wb['firstname_txt'] = 'Firstname'; $wb['surname_txt'] = 'Surname'; +$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'; @@ -66,6 +69,7 @@ $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.'; @@ -107,7 +111,7 @@ $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 SSH 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'] = 'Delete additional template'; @@ -203,5 +207,6 @@ $wb['limit_database_quota_error_notint'] = 'The database quota limit must be a n $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'; -?> diff --git a/interface/web/client/lib/lang/ru.lng b/interface/web/client/lib/lang/ru.lng index c8558a3982bf4db62a0e989381eb18b66258d154..2dabf4c6f3c0f46c6c6757da5971d62ffc2cc1d1 100644 --- a/interface/web/client/lib/lang/ru.lng +++ b/interface/web/client/lib/lang/ru.lng @@ -17,6 +17,7 @@ $wb['Messaging'] = 'Обмен сообщениями'; $wb['Send email'] = 'Отправить почту'; $wb['Edit Client Circle'] = 'Изменить клиента Группы'; $wb['Domains'] = 'Домены'; +$wb['Add Domain'] = 'Add Domain'; $wb['domain_txt'] = 'Домен'; $wb['client_txt'] = 'Клиент'; $wb['error_domain_in mailuse'] = 'Этот домен не может быть удален, так как он используется в качестве почтового домена.'; diff --git a/interface/web/client/lib/lang/ru_client.lng b/interface/web/client/lib/lang/ru_client.lng index befd6b15bf44a07631ff822be2ea15b718f082e2..d8cd5e4788e4cfa8607d21697777cd7c2ab53de6 100644 --- a/interface/web/client/lib/lang/ru_client.lng +++ b/interface/web/client/lib/lang/ru_client.lng @@ -5,12 +5,14 @@ $wb['limit_mailalias_txt'] = 'Макс. количество почтовых а $wb['limit_mailforward_txt'] = 'Макс.чисо почтовых пересылок'; $wb['limit_mailcatchall_txt'] = 'Макс. количество учётных записей сводных почтовых ящиков'; $wb['limit_mailrouting_txt'] = 'Макс. количество почтовых маршрутов'; +$wb['limit_mail_wblist_txt'] = 'Max. number of email white / blacklist entries'; $wb['limit_mailfilter_txt'] = 'Макс. количество почтовых фильтров'; $wb['limit_fetchmail_txt'] = 'Макс. количество учётных записей сборщиков почты'; $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'] = 'Имя контакта'; @@ -36,6 +38,7 @@ $wb['title_txt'] = 'Заголовок'; $wb['firstname_txt'] = 'Имя'; $wb['surname_txt'] = 'Фамилия'; $wb['limit_client_txt'] = 'Макс. количество клиентов'; +$wb['limit_relayhost_txt'] = 'Show SMTP relay host options'; $wb['limit_domain_txt'] = 'Лимит доменов'; $wb['limit_subdomain_txt'] = 'Лимит поддоменов'; $wb['limit_webquota_txt'] = 'Лимит Web-квоты'; @@ -62,6 +65,7 @@ $wb['limit_mailalias_error_notint'] = 'Лимит почтовых алиасо $wb['limit_mailforward_error_notint'] = 'Лимит почтовых пересылок должен быть числом.'; $wb['limit_mailcatchall_error_notint'] = 'Лимит сводных почтовых ящиков должен быть числом.'; $wb['limit_mailrouting_error_notint'] = 'Лимит почтовых маршрутов должен быть числом.'; +$wb['limit_mail_wblist_error_notint'] = 'The email white / blacklist limit must be a number.'; $wb['limit_mailfilter_error_notint'] = 'Лимит почтовых фильтров должен быть числом.'; $wb['limit_mailfetchmail_error_notint'] = 'Лимит сборщиков почты должен быть числом.'; $wb['limit_mailquota_error_notint'] = 'Лимит почтовой квоты должен быть числом.'; @@ -146,7 +150,7 @@ $wb['aps_limits_txt'] = 'Лимиты Установщика APS'; $wb['limit_aps_txt'] = 'Макс. количество экземпляров APS'; $wb['limit_aps_error_notint'] = 'Лимит экземпляров APS должен быть числом.'; $wb['default_slave_dnsserver_txt'] = 'Вторичный DNS-сервер по умолчанию'; -$wb['locked_txt'] = 'Заблокировано (Отключены все web-сайты и т.д.)'; +$wb['locked_txt'] = 'Locked (disables everything except DNS)'; $wb['canceled_txt'] = 'Отменено (отключен вход для клиентов)'; $wb['gender_txt'] = 'Обращение'; $wb['gender_m_txt'] = 'Г-н.'; @@ -200,5 +204,5 @@ $wb['limit_ssl_letsencrypt_txt'] = 'Let\'s Encrypt доступен'; $wb['limit_directive_snippets_txt'] = 'Показать выбор конфигурации веб-сервера'; $wb['password_click_to_set_txt'] = 'Клик для установки'; $wb['limit_dns_record_error_notint'] = 'Лимит вторичных DNS-зон должен быть числом.'; +$wb['Address'] = 'Address'; $wb['Limits'] = 'Лимиты'; -?> diff --git a/interface/web/client/lib/lang/ru_client_del.lng b/interface/web/client/lib/lang/ru_client_del.lng index 94a05acca0d1cf7d222e19db3009232c8dae6e97..cf371efeb91e8f6c51355bbd95e7fbf1581257c7 100644 --- a/interface/web/client/lib/lang/ru_client_del.lng +++ b/interface/web/client/lib/lang/ru_client_del.lng @@ -4,4 +4,7 @@ $wb['delete_explanation'] = 'Это действие удалит следующ $wb['btn_save_txt'] = 'Удалить клиента'; $wb['btn_cancel_txt'] = 'Отменить без удаления'; $wb['confirm_client_delete_txt'] = 'Вы уверены, что хотите удалить этот клиента?'; +$wb['list_head_txt'] = 'Delete Client'; +$wb['table_txt'] = 'Table'; +$wb['data_txt'] = 'Data'; ?> diff --git a/interface/web/client/lib/lang/ru_client_template.lng b/interface/web/client/lib/lang/ru_client_template.lng index 1b27951e7ce4022858d6eb149034a8c9ad0c5dad..65397933ff0069216bbe2975df9ae26a13a5d459 100644 --- a/interface/web/client/lib/lang/ru_client_template.lng +++ b/interface/web/client/lib/lang/ru_client_template.lng @@ -1,4 +1,5 @@ diff --git a/interface/web/client/lib/lang/ru_reseller.lng b/interface/web/client/lib/lang/ru_reseller.lng index 998a88699051ce145e3b053e583eb651f055d934..3447e52070648f84a820cb9efb5a5da4753a58f9 100644 --- a/interface/web/client/lib/lang/ru_reseller.lng +++ b/interface/web/client/lib/lang/ru_reseller.lng @@ -5,12 +5,14 @@ $wb['limit_mailalias_txt'] = 'Макс. количество почтовых а $wb['limit_mailforward_txt'] = 'Макс. количество почтовых пересылок'; $wb['limit_mailcatchall_txt'] = 'Макс. количество учётных записей сводных почтовых ящиков'; $wb['limit_mailrouting_txt'] = 'Максимальное количество почтовых маршрутов'; +$wb['limit_mail_wblist_txt'] = 'Max. number of email white / blacklist entries'; $wb['limit_mailfilter_txt'] = 'Макс. количество почтовых фильтров'; $wb['limit_fetchmail_txt'] = 'Макс. количество учётных записей сборщиков почты'; $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'] = 'Имя контакта'; @@ -36,6 +38,7 @@ $wb['company_txt'] = 'Компания'; $wb['title_txt'] = 'Заголовок'; $wb['firstname_txt'] = 'Имя'; $wb['surname_txt'] = 'Фамилия'; +$wb['limit_relayhost_txt'] = 'Show SMTP relay host options'; $wb['limit_domain_txt'] = 'Лимит доменов'; $wb['limit_subdomain_txt'] = 'Лимит поддоменов'; $wb['limit_webquota_txt'] = 'Лимит Web-квоты'; @@ -66,6 +69,7 @@ $wb['limit_mailalias_error_notint'] = 'Лимит почтовых алиасо $wb['limit_mailforward_error_notint'] = 'Лимит почтовых пересылок должен быть числом.'; $wb['limit_mailcatchall_error_notint'] = 'Лимит сводных почтовых ящиков должен быть числом.'; $wb['limit_mailrouting_error_notint'] = 'Лимит почтовых маршрутов должен быть числом.'; +$wb['limit_mail_wblist_error_notint'] = 'The email white / blacklist limit must be a number.'; $wb['limit_mailfilter_error_notint'] = 'Лимит почтовых фильтров должен быть числом.'; $wb['limit_mailfetchmail_error_notint'] = 'Лимит сборщиков почты должен быть числомм.'; $wb['limit_mailquota_error_notint'] = 'Лимит почтовой квоты должен быть числом.'; @@ -203,5 +207,6 @@ $wb['limit_database_quota_error_notint'] = 'Лимит квоты базы да $wb['limit_ssl_letsencrypt_txt'] = 'Let\'s Encrypt доступен'; $wb['limit_directive_snippets_txt'] = 'Показать выбор конфигурации веб-сервера'; $wb['password_click_to_set_txt'] = 'Клик для установки'; +$wb['Reseller'] = 'Reseller'; +$wb['Address'] = 'Address'; $wb['Limits'] = 'Лимиты'; -?> diff --git a/interface/web/client/lib/lang/se.lng b/interface/web/client/lib/lang/se.lng index 3845b9c57a97cc8d58e40bde8a3807cd6d97980b..adceb746d622e6fb1712f783c47154812be18da5 100644 --- a/interface/web/client/lib/lang/se.lng +++ b/interface/web/client/lib/lang/se.lng @@ -17,6 +17,7 @@ $wb['Messaging'] = 'Meddelanden'; $wb['Send email'] = 'Skicka epost'; $wb['Edit Client Circle'] = 'Redigera kundcirkel'; $wb['Domains'] = 'Domäner'; +$wb['Add Domain'] = 'Add Domain'; $wb['domain_txt'] = 'Domän'; $wb['client_txt'] = 'Kund'; $wb['error_domain_in mailuse'] = 'Den här domänen kan inte tas bort då den används som epostdomän'; diff --git a/interface/web/client/lib/lang/se_client.lng b/interface/web/client/lib/lang/se_client.lng index 2884302c18fc9d7d0f096dfa6f08fdcfd69cff58..41aca6a6bb5d978681ff70caf33927360558fce6 100644 --- a/interface/web/client/lib/lang/se_client.lng +++ b/interface/web/client/lib/lang/se_client.lng @@ -5,12 +5,14 @@ $wb['limit_mailalias_txt'] = 'Max antal epostalias'; $wb['limit_mailforward_txt'] = 'Max antal vidarebefordringar'; $wb['limit_mailcatchall_txt'] = 'Max. number of email catchall accounts'; $wb['limit_mailrouting_txt'] = 'Max antal epostrutter'; +$wb['limit_mail_wblist_txt'] = 'Max. number of email white / blacklist entries'; $wb['limit_mailfilter_txt'] = 'Max antal epostfilter'; $wb['limit_fetchmail_txt'] = 'Max. number of fetchmail accounts'; $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'; @@ -37,6 +39,7 @@ $wb['title_txt'] = 'Titel'; $wb['firstname_txt'] = 'Förnamn'; $wb['surname_txt'] = 'Efternamn'; $wb['limit_client_txt'] = 'Max antal kunder'; +$wb['limit_relayhost_txt'] = 'Show SMTP relay host options'; $wb['limit_domain_txt'] = 'domängräns'; $wb['limit_subdomain_txt'] = 'underdomängräns'; $wb['limit_webquota_txt'] = 'webbsideskvot'; @@ -63,6 +66,7 @@ $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.'; @@ -107,7 +111,7 @@ $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 SSH 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'] = 'Delete additional template'; @@ -146,7 +150,7 @@ $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'] = 'Förvald sekundär DNS-server'; -$wb['locked_txt'] = 'Låst (disables all webs etc.)'; +$wb['locked_txt'] = 'Locked (disables everything except DNS)'; $wb['canceled_txt'] = 'Uppsagd (disables client login)'; $wb['gender_txt'] = 'Titel'; $wb['gender_m_txt'] = 'Herr'; @@ -200,5 +204,5 @@ $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'; -?> diff --git a/interface/web/client/lib/lang/se_client_del.lng b/interface/web/client/lib/lang/se_client_del.lng index 99aa9d8a42291116d2d2ce160f48e09e021f6d82..56f2f0d9d790af9103b93997817f8299061ec680 100644 --- a/interface/web/client/lib/lang/se_client_del.lng +++ b/interface/web/client/lib/lang/se_client_del.lng @@ -4,4 +4,7 @@ $wb['delete_explanation'] = 'This action will delete the following number of rec $wb['btn_save_txt'] = 'Radera kunden'; $wb['btn_cancel_txt'] = 'Avbryt utan att radera kunden'; $wb['confirm_client_delete_txt'] = 'Är du säker på att du vill radera den här kunden?'; +$wb['list_head_txt'] = 'Delete Client'; +$wb['table_txt'] = 'Table'; +$wb['data_txt'] = 'Data'; ?> diff --git a/interface/web/client/lib/lang/se_client_template.lng b/interface/web/client/lib/lang/se_client_template.lng index 4b00ecd407d23db44bd88cc9303decc7c4ec9569..a1a6f9457b3138d1cfa5994abc1efab1baf0de3f 100644 --- a/interface/web/client/lib/lang/se_client_template.lng +++ b/interface/web/client/lib/lang/se_client_template.lng @@ -1,4 +1,5 @@ diff --git a/interface/web/client/lib/lang/se_reseller.lng b/interface/web/client/lib/lang/se_reseller.lng index 68e8a950f36cc62cc603e077401a697e6d8ea509..9f3ce64e8007a6dd75590e1e68f32586827d9561 100644 --- a/interface/web/client/lib/lang/se_reseller.lng +++ b/interface/web/client/lib/lang/se_reseller.lng @@ -5,12 +5,14 @@ $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['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'; @@ -36,6 +38,7 @@ $wb['company_txt'] = 'Company'; $wb['title_txt'] = 'Title'; $wb['firstname_txt'] = 'Firstname'; $wb['surname_txt'] = 'Surname'; +$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'; @@ -66,6 +69,7 @@ $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.'; @@ -107,7 +111,7 @@ $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 SSH 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'] = 'Delete additional template'; @@ -203,5 +207,6 @@ $wb['limit_database_quota_error_notint'] = 'The database quota limit must be a n $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'; -?> diff --git a/interface/web/client/lib/lang/sk.lng b/interface/web/client/lib/lang/sk.lng index f3bfd3e2f66371469ab922e73f2b5841c7589128..7058583a3284d5a4c33ca754d92a56f2400bd084 100644 --- a/interface/web/client/lib/lang/sk.lng +++ b/interface/web/client/lib/lang/sk.lng @@ -17,6 +17,7 @@ $wb['Messaging'] = 'Messaging'; $wb['Send email'] = 'Send Email'; $wb['Edit Client Circle'] = 'Edit Client Circle'; $wb['Domains'] = 'Domains'; +$wb['Add Domain'] = 'Add Domain'; $wb['domain_txt'] = 'Domain'; $wb['client_txt'] = 'Client'; $wb['error_domain_in mailuse'] = 'This domain cannot be deleted, because it is in use as mail-domain'; diff --git a/interface/web/client/lib/lang/sk_client.lng b/interface/web/client/lib/lang/sk_client.lng index 3edec417cf07d51e0245b97063ece6409be3a5d7..5ca58b5b0e9aeb7af32a0b504714d33cf2f41786 100644 --- a/interface/web/client/lib/lang/sk_client.lng +++ b/interface/web/client/lib/lang/sk_client.lng @@ -5,12 +5,14 @@ $wb['limit_mailalias_txt'] = 'Max. počet e-mailových aliasov'; $wb['limit_mailforward_txt'] = 'Max. počet e-mailových preposielaní'; $wb['limit_mailcatchall_txt'] = 'Max. počet e-mailových doménových košov'; $wb['limit_mailrouting_txt'] = 'Max. počet e-mailových smerovaní'; +$wb['limit_mail_wblist_txt'] = 'Max. number of email white / blacklist entries'; $wb['limit_mailfilter_txt'] = 'Max. počet e-mailových filtrov'; $wb['limit_fetchmail_txt'] = 'Max. počet účtov fetchmail'; $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'; @@ -36,6 +38,7 @@ $wb['company_txt'] = 'Spoločnosť'; $wb['title_txt'] = 'Názov'; $wb['firstname_txt'] = 'Krstné meno'; $wb['surname_txt'] = 'Priezvisko'; +$wb['limit_relayhost_txt'] = 'Show SMTP relay host options'; $wb['limit_domain_txt'] = 'limit_domén'; $wb['limit_subdomain_txt'] = 'limit_subdomén'; $wb['limit_webquota_txt'] = 'limit_webkvóta'; @@ -65,6 +68,7 @@ $wb['limit_mailalias_error_notint'] = 'Limit email alias musí byť číslo.'; $wb['limit_mailforward_error_notint'] = 'Limit email preposielaní musí byť číslo.'; $wb['limit_mailcatchall_error_notint'] = 'Limit doménových košov musí byť číslo.'; $wb['limit_mailrouting_error_notint'] = 'Limit email smerovaní musí byť číslo.'; +$wb['limit_mail_wblist_error_notint'] = 'The email white / blacklist limit must be a number.'; $wb['limit_mailfilter_error_notint'] = 'Limit email filter musí byť číslo.'; $wb['limit_mailfetchmail_error_notint'] = 'Limit fetchmail musí byť číslo.'; $wb['limit_mailquota_error_notint'] = 'Limit email kvót musí byť číslo.'; @@ -107,7 +111,7 @@ $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 SSH 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'] = 'Delete additional template'; @@ -146,7 +150,7 @@ $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 all webs etc.)'; +$wb['locked_txt'] = 'Locked (disables everything except DNS)'; $wb['canceled_txt'] = 'Canceled (disables client login)'; $wb['gender_txt'] = 'Title'; $wb['gender_m_txt'] = 'Mr.'; @@ -200,5 +204,5 @@ $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'; -?> diff --git a/interface/web/client/lib/lang/sk_client_del.lng b/interface/web/client/lib/lang/sk_client_del.lng index 0932e9568ac478948a00b84b0c50acaf2ce0c7c2..21ddcb9ea44905b316d6830ae688abda9125eaef 100644 --- a/interface/web/client/lib/lang/sk_client_del.lng +++ b/interface/web/client/lib/lang/sk_client_del.lng @@ -4,4 +4,7 @@ $wb['delete_explanation'] = 'This action will delete the following number of rec $wb['btn_save_txt'] = 'Delete the client'; $wb['btn_cancel_txt'] = 'Cancel without deleting the client'; $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'; ?> diff --git a/interface/web/client/lib/lang/sk_client_message.lng b/interface/web/client/lib/lang/sk_client_message.lng index 6b2a872f10af4cb357413ee297331408c740a6c2..c211860f82ae12e9bb90b20eac64d34734505444 100644 --- a/interface/web/client/lib/lang/sk_client_message.lng +++ b/interface/web/client/lib/lang/sk_client_message.lng @@ -10,7 +10,7 @@ $wb['sender_invalid_error'] = 'Sender email invalid.'; $wb['subject_invalid_error'] = 'Subject is empty.'; $wb['message_invalid_error'] = 'Message is empty.'; $wb['email_sent_to_txt'] = 'Email sent to:'; -$wb['page_head_txt'] = 'Send customer information'; +$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'; diff --git a/interface/web/client/lib/lang/sk_client_template.lng b/interface/web/client/lib/lang/sk_client_template.lng index e27315539837f53edcb5f5a20ec365095fe14473..21acadd651d85f63a8e8fa469e7d46fbacece76d 100644 --- a/interface/web/client/lib/lang/sk_client_template.lng +++ b/interface/web/client/lib/lang/sk_client_template.lng @@ -1,4 +1,5 @@ diff --git a/interface/web/client/lib/lang/sk_reseller.lng b/interface/web/client/lib/lang/sk_reseller.lng index 4ae3ef5b976ac3223f9eef29177589278296fa07..a00b1a4156eb4d3b6dc668b0d59338ea37fbf327 100644 --- a/interface/web/client/lib/lang/sk_reseller.lng +++ b/interface/web/client/lib/lang/sk_reseller.lng @@ -5,12 +5,14 @@ $wb['limit_mailalias_txt'] = 'Max. počet e-mailových aliasov'; $wb['limit_mailforward_txt'] = 'Max. počet e-mailových preposielaní'; $wb['limit_mailcatchall_txt'] = 'Max. počet e-mailových doménových košov'; $wb['limit_mailrouting_txt'] = 'Max. počet e-mailových smerovaní'; +$wb['limit_mail_wblist_txt'] = 'Max. number of email white / blacklist entries'; $wb['limit_mailfilter_txt'] = 'Max. počet e-mailových filtrov'; $wb['limit_fetchmail_txt'] = 'Max. počet účtov fetchmail'; $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'; @@ -36,6 +38,7 @@ $wb['company_txt'] = 'Spoločnosť'; $wb['title_txt'] = 'Nadpis'; $wb['firstname_txt'] = 'Krstné meno'; $wb['surname_txt'] = 'Priezvisko'; +$wb['limit_relayhost_txt'] = 'Show SMTP relay host options'; $wb['limit_domain_txt'] = 'limit_domén'; $wb['limit_subdomain_txt'] = 'limit_subdomén'; $wb['limit_webquota_txt'] = 'limit_webkvóta'; @@ -65,6 +68,7 @@ $wb['limit_mailalias_error_notint'] = 'Limit Email alias musí byť číslo.'; $wb['limit_mailforward_error_notint'] = 'Limit E-mail preposielanie musí byť číslo.'; $wb['limit_mailcatchall_error_notint'] = 'Limit E-mail doménový kôš musí byť číslo.'; $wb['limit_mailrouting_error_notint'] = 'Limit E-mail smerovania musí byť číslo.'; +$wb['limit_mail_wblist_error_notint'] = 'The email white / blacklist limit must be a number.'; $wb['limit_mailfilter_error_notint'] = 'Limit email filter musí byť číslo.'; $wb['limit_mailfetchmail_error_notint'] = 'Limit fetchmail musí byť číslo.'; $wb['limit_mailquota_error_notint'] = 'Limit email kvóta musí byť číslo.'; @@ -107,7 +111,7 @@ $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 SSH 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'] = 'Delete additional template'; @@ -203,5 +207,6 @@ $wb['limit_database_quota_error_notint'] = 'The database quota limit must be a n $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'; -?> diff --git a/interface/web/client/lib/lang/tr.lng b/interface/web/client/lib/lang/tr.lng index cc2e8aa022f685152be1a76ce7f6a1df034ad8bf..6f5f55e702efd0c6658a1cbe99b297ae9c45254a 100644 --- a/interface/web/client/lib/lang/tr.lng +++ b/interface/web/client/lib/lang/tr.lng @@ -17,6 +17,7 @@ $wb['Messaging'] = 'İletişim'; $wb['Send email'] = 'E-posta Gönderimi'; $wb['Edit Client Circle'] = 'Müşteri Grubu Düzenleme'; $wb['Domains'] = 'Etki Alanları'; +$wb['Add Domain'] = 'Add Domain'; $wb['domain_txt'] = 'Etki Alanı'; $wb['client_txt'] = 'Müşteri'; $wb['error_domain_in dnsuse'] = 'Bu etki alanı birincil DNS bölgesi olarak kullanıldığından silinemez'; diff --git a/interface/web/client/lib/lang/tr_client.lng b/interface/web/client/lib/lang/tr_client.lng index f0711709661cf126bc041fd7daef2e3239c1a5e3..ca1e2f74293e0f9064719c1670bfcaf4e7dd5075 100644 --- a/interface/web/client/lib/lang/tr_client.lng +++ b/interface/web/client/lib/lang/tr_client.lng @@ -7,12 +7,14 @@ $wb['limit_mailaliasdomain_txt'] = 'En Fazla Takma Etki Alanı Sayısı'; $wb['limit_mailforward_txt'] = 'En Fazla E-posta Yönlendirme Sayısı'; $wb['limit_mailcatchall_txt'] = 'En Fazla Tümünü Al Hesabı Sayısı'; $wb['limit_mailrouting_txt'] = 'En Fazla E-posta Yöneltici Sayısı'; +$wb['limit_mail_wblist_txt'] = 'Max. number of email white / blacklist entries'; $wb['limit_mailfilter_txt'] = 'En Fazla E-posta Süzgeci Sayısı'; $wb['limit_fetchmail_txt'] = 'En Fazla E-posta Alma Hesabı Sayısı'; $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ı'; @@ -39,6 +41,7 @@ $wb['company_txt'] = 'Kuruluş'; $wb['title_txt'] = 'Unvan'; $wb['firstname_txt'] = 'Ad'; $wb['surname_txt'] = 'Soyad'; +$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'; @@ -73,6 +76,7 @@ $wb['limit_mailaliasdomain_error_notint'] = 'E-posta takma etki alanı sınırı $wb['limit_mailforward_error_notint'] = 'E-posta yönlendirme sınırı bir sayı olmalıdır.'; $wb['limit_mailcatchall_error_notint'] = 'E-posta tümünü al hesabı sınırı bir sayı olmalıdır.'; $wb['limit_mailrouting_error_notint'] = 'E-posta yöneltici sınırı bir sayı olmalıdır.'; +$wb['limit_mail_wblist_error_notint'] = 'The email white / blacklist limit must be a number.'; $wb['limit_mailfilter_error_notint'] = 'E-posta süzgeci sınırı bir sayı olmalıdır.'; $wb['limit_mailfetchmail_error_notint'] = 'E-posta alma sınırı bir sayı olmalıdır.'; $wb['limit_mailquota_error_notint'] = 'E-posta kota sınırı bir sayı olmalıdır.'; @@ -151,7 +155,7 @@ $wb['aps_limits_txt'] = 'APS Yükleyici Sınırları'; $wb['limit_aps_txt'] = 'En Fazla APS Kopyası Sayısı'; $wb['limit_aps_error_notint'] = 'APS kopya sayısı sınırı bir sayı olmalıdır.'; $wb['default_slave_dnsserver_txt'] = 'Varsayılan İkincil DNS Sunucusu'; -$wb['locked_txt'] = 'Kilitli
    (tüm web vb. devre dışı)'; +$wb['locked_txt'] = 'Locked (disables everything except DNS)'; $wb['canceled_txt'] = 'İptal
    (müşteri oturumu devre dışı)'; $wb['gender_txt'] = 'Unvan'; $wb['gender_m_txt'] = 'Bay'; @@ -202,5 +206,5 @@ $wb['btn_cancel_txt'] = 'İptal'; $wb['invalid_vat_id'] = 'Vergi numarası geçersiz.'; $wb['email_error_empty'] = 'E-posta boş olamaz.'; $wb['limit_directive_snippets_txt'] = 'Web Sunucu Yapılandırma Seçimi Görüntülensin'; +$wb['Address'] = 'Address'; $wb['Limits'] = 'Sınırlar'; -?> diff --git a/interface/web/client/lib/lang/tr_client_del.lng b/interface/web/client/lib/lang/tr_client_del.lng index b93579998bdf19e7f1d4b542b94987cb29c3fd0a..82f00ba9d56815691e03d3485f236afca48515e6 100644 --- a/interface/web/client/lib/lang/tr_client_del.lng +++ b/interface/web/client/lib/lang/tr_client_del.lng @@ -4,4 +4,7 @@ $wb['delete_explanation'] = 'Bu işlem bu müşteri ile ilgili şu kayıtları s $wb['btn_save_txt'] = 'Müşteriyi sil'; $wb['btn_cancel_txt'] = 'Müşteriyi silmeden iptal et'; $wb['confirm_client_delete_txt'] = 'Bu müşteriyi silmek istediğinize emin misiniz?'; +$wb['list_head_txt'] = 'Delete Client'; +$wb['table_txt'] = 'Table'; +$wb['data_txt'] = 'Data'; ?> diff --git a/interface/web/client/lib/lang/tr_client_template.lng b/interface/web/client/lib/lang/tr_client_template.lng index 30911764483f05a10fbc7b0c62ce6c83c58b6dd4..3d5edfeeba178c393661f8251189d3d52e13961b 100644 --- a/interface/web/client/lib/lang/tr_client_template.lng +++ b/interface/web/client/lib/lang/tr_client_template.lng @@ -1,7 +1,9 @@ diff --git a/interface/web/client/lib/lang/tr_reseller.lng b/interface/web/client/lib/lang/tr_reseller.lng index e042301400928d353f6fda56acf588f36e83760e..31da0d1bc42672253f6013a456924016c8a1052c 100644 --- a/interface/web/client/lib/lang/tr_reseller.lng +++ b/interface/web/client/lib/lang/tr_reseller.lng @@ -7,12 +7,14 @@ $wb['limit_mailaliasdomain_txt'] = 'En Fazla Takma Etki Alanı Sayısı'; $wb['limit_mailforward_txt'] = 'En Fazla E-posta Yönlendirici Sayısı'; $wb['limit_mailcatchall_txt'] = 'En Fazla E-posta Tümünü Al Hesabı Sayısı'; $wb['limit_mailrouting_txt'] = 'En Fazla E-posta Yöneltici Sayısı'; +$wb['limit_mail_wblist_txt'] = 'Max. number of email white / blacklist entries'; $wb['limit_mailfilter_txt'] = 'En Fazla E-posta Süzgeci Sayısı'; $wb['limit_fetchmail_txt'] = 'En Fazla E-posta Alma Hesabı Sayısı'; $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ı'; @@ -39,6 +41,7 @@ $wb['company_txt'] = 'Kuruluş'; $wb['title_txt'] = 'Unvan'; $wb['firstname_txt'] = 'Adı'; $wb['surname_txt'] = 'Soyadı'; +$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'; @@ -73,6 +76,7 @@ $wb['limit_mailalias_error_notint'] = 'Takma e-posta sınırı bir sayı olmalı $wb['limit_mailforward_error_notint'] = 'E-posta yönlendirici sınırı bir sayı olmalıdır.'; $wb['limit_mailcatchall_error_notint'] = 'E-posta tümünü al hesabı sınırı bir sayı olmalıdır.'; $wb['limit_mailrouting_error_notint'] = 'E-posta yöneltici sınırı bir sayı olmalıdır.'; +$wb['limit_mail_wblist_error_notint'] = 'The email white / blacklist limit must be a number.'; $wb['limit_mailfilter_error_notint'] = 'E-posta süzgeci sınırı bir sayı olmalıdır.'; $wb['limit_mailfetchmail_error_notint'] = 'E-posta alıcısı sınırı bir sayı olmalıdır.'; $wb['limit_mailquota_error_notint'] = 'E-posta kota sınırı bir sayı olmalıdır.'; @@ -207,5 +211,6 @@ $wb['limit_database_user_txt'] = 'En Fazla Veritabanı Kullanıcısı Sayısı'; $wb['limit_database_user_error_notint'] = 'Veritabanı kullanıcı sınırı bir sayı olmalıdır.'; $wb['limit_database_quota_txt'] = 'Veritabanı Kotası'; $wb['limit_database_quota_error_notint'] = 'Veritabanı kotası sınırı bir sayı olmalıdır.'; +$wb['Reseller'] = 'Reseller'; +$wb['Address'] = 'Address'; $wb['Limits'] = 'Sınırlar'; -?> diff --git a/interface/web/client/lib/module.conf.php b/interface/web/client/lib/module.conf.php index 2603550c9b507b715dfe320bfd1553f73e98d124..2203571381023be16ef3656fdbf3cf45685ed2c1 100644 --- a/interface/web/client/lib/module.conf.php +++ b/interface/web/client/lib/module.conf.php @@ -87,6 +87,10 @@ if ($settings['use_domain_module'] == 'y') { 'target' => 'content', 'link' => 'client/domain_list.php'); + $items[] = array( 'title' => 'Add Domain', + 'target' => 'content', + 'link' => 'client/domain_edit.php'); + $module['nav'][] = array( 'title' => 'Domains', 'open' => 1, 'items' => $items); diff --git a/interface/web/client/reseller_edit.php b/interface/web/client/reseller_edit.php index 3078e01fbc47a8c71f1ec1734fa03f642c4b6baf..7cbd6687bc40eefad4f0beaf174cad996595ea17 100644 --- a/interface/web/client/reseller_edit.php +++ b/interface/web/client/reseller_edit.php @@ -94,7 +94,7 @@ class page_action extends tform_actions { } } } - + if($this->id != 0) { $this->oldTemplatesAssigned = $app->db->queryAllRecords('SELECT * FROM `client_template_assigned` WHERE `client_id` = ?', $this->id); if(!is_array($this->oldTemplatesAssigned) || count($this->oldTemplatesAssigned) < 1) { @@ -175,21 +175,37 @@ class page_action extends tform_actions { $app->tpl->setVar('template_additional_list', $text); $app->tpl->setVar('app_module', 'client'); - + + // Check wether per domain relaying is enabled or not + $global_config = $app->getconf->get_global_config('mail'); + if($global_config['show_per_domain_relay_options'] == 'y') { + $app->tpl->setVar("show_per_domain_relay_options", 1); + } 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); + } + //* Set the 'customer no' default value if($this->id == 0) { //* get the system config $app->uses('getconf'); $system_config = $app->getconf->get_global_config(); if($system_config['misc']['customer_no_template'] != '') { - + //* Set customer no default $customer_no = $app->functions->intval($system_config['misc']['customer_no_start']+$system_config['misc']['customer_no_counter']); $customer_no_string = str_replace('[CUSTOMER_NO]',$customer_no,$system_config['misc']['customer_no_template']); $app->tpl->setVar('customer_no',$customer_no_string); } } - + parent::onShowEnd(); } @@ -200,9 +216,9 @@ class page_action extends tform_actions { */ function onAfterInsert() { global $app, $conf; - + $app->uses('auth'); - + // Create the group for the reseller $groupid = $app->db->datalogInsert('sys_group', array("name" => $this->dataRecord["username"], "description" => '', "client_id" => $this->id), 'groupid'); $groups = $groupid; @@ -217,7 +233,7 @@ class page_action extends tform_actions { $language = $this->dataRecord["language"]; $password = $app->auth->crypt_password(stripslashes($password)); - + // Create the controlpaneluser for the reseller $sql = "INSERT INTO sys_user (`username`,`passwort`,`modules`,`startmodule`,`app_theme`,`typ`, `active`,`language`,`groups`,`default_group`,`client_id`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; @@ -238,26 +254,26 @@ class page_action extends tform_actions { $sql = "UPDATE client SET default_mailserver = ?, default_webserver = ?, default_dnsserver = ?, default_slave_dnsserver = ?, default_dbserver = ? WHERE client_id = ?"; $app->db->query($sql, $default_mailserver, $default_webserver, $default_dnsserver, $default_dnsserver, $default_dbserver, $this->id); - + if(isset($this->dataRecord['template_master'])) { $app->uses('client_templates'); $app->client_templates->update_client_templates($this->id, $this->_template_additional); } - + if($this->dataRecord['customer_no'] == $this->dataRecord['customer_no_org']) { //* get the system config $app->uses('getconf'); $system_config = $app->getconf->get_global_config(); if($system_config['misc']['customer_no_template'] != '') { - + //* save new counter value $system_config['misc']['customer_no_counter']++; $system_config_str = $app->ini_parser->get_ini_string($system_config); $app->db->datalogUpdate('sys_ini', array("config" => $system_config_str), 'sysini_id', 1); - + } } - + //* Send welcome email $client_group_id = $app->functions->intval($_SESSION["s"]["user"]["default_group"]); $sql = "SELECT * FROM client_message_template WHERE template_type = 'welcome' AND sys_groupid = ?"; @@ -283,7 +299,7 @@ class page_action extends tform_actions { $subject = str_replace('{'.$key.'}', $val, $subject); } } - + //* Get sender address if($app->auth->is_admin()) { $app->uses('getconf'); @@ -311,7 +327,7 @@ class page_action extends tform_actions { global $app, $conf; $app->uses('auth'); - + // username changed if(isset($conf['demo_mode']) && $conf['demo_mode'] != true && isset($this->dataRecord['username']) && $this->dataRecord['username'] != '' && $this->oldDataRecord['username'] != $this->dataRecord['username']) { $username = $this->dataRecord["username"]; @@ -328,7 +344,7 @@ class page_action extends tform_actions { if(isset($conf['demo_mode']) && $conf['demo_mode'] != true && isset($this->dataRecord["password"]) && $this->dataRecord["password"] != '') { $password = $this->dataRecord["password"]; $client_id = $this->id; - + $password = $app->auth->crypt_password(stripslashes($password)); $sql = "UPDATE sys_user SET passwort = ? WHERE client_id = ?"; $app->db->query($sql, $password, $client_id); @@ -357,12 +373,12 @@ class page_action extends tform_actions { $sql = "UPDATE sys_user SET modules = ? WHERE client_id = ?"; $app->db->query($sql, $modules, $client_id); } - + if(isset($this->dataRecord['template_master'])) { $app->uses('client_templates'); $app->client_templates->update_client_templates($this->id, $this->_template_additional); } - + 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 */ @@ -412,7 +428,7 @@ class page_action extends tform_actions { $active_col = 'disablesmtp'; $reverse = true; } - + if(!isset($prev_active[$current])) $prev_active[$current] = array(); if(!isset($prev_sysuser[$current])) $prev_sysuser[$current] = array(); @@ -444,7 +460,7 @@ class page_action extends tform_actions { $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'); @@ -469,7 +485,7 @@ class page_action extends tform_actions { unset($entries); unset($to_disable); } - + 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') { diff --git a/interface/web/client/templates/client_del.htm b/interface/web/client/templates/client_del.htm index e24ca768c2a94047f4ed7be8bfabdc7f8f534af0..3fbd16643a3fccab380936503b0dd2979617dfce 100644 --- a/interface/web/client/templates/client_del.htm +++ b/interface/web/client/templates/client_del.htm @@ -1,24 +1,32 @@ - -

    - -
    - - :

    - - , - - -

    -
    -
    -   -
    -   - - -
    - - -
    \ No newline at end of file + + + :

    +
    + + + + + + + + + + + + + + + +
    {tmpl_var name="table"} ({tmpl_var name="count"}){tmpl_var name="data"}
    +
    + +

    +
    +  +
    +  + +
    + + +
    diff --git a/interface/web/client/templates/client_edit_address.htm b/interface/web/client/templates/client_edit_address.htm index 86393c8e9d3a92fd5123629142d6746989dce6c8..835b2644003257b9538d7c357d11ed30309f390a 100644 --- a/interface/web/client/templates/client_edit_address.htm +++ b/interface/web/client/templates/client_edit_address.htm @@ -1,13 +1,7 @@ - -

    - - - Address -
    +
    -
    +
    +
    diff --git a/interface/web/client/templates/client_edit_limits.htm b/interface/web/client/templates/client_edit_limits.htm index c8cf74e328b2b03aea5fcbc679d584c582a75f25..9a2578b697b20e8424aee5dee86fa531c3cf261d 100644 --- a/interface/web/client/templates/client_edit_limits.htm +++ b/interface/web/client/templates/client_edit_limits.htm @@ -1,14 +1,7 @@ - - - -

    -
    - +
    -
    {tmpl_var name="Limits"} +
    +
    + +
    @@ -239,6 +235,20 @@
    +
    + +
    + {tmpl_var name='limit_mail_backup'} +
    +
    + +
    + +
    + {tmpl_var name='limit_relayhost'} +
    +
    +
    @@ -368,7 +378,7 @@
    - +
    @@ -429,6 +439,7 @@
    +
    +
    diff --git a/interface/web/client/templates/client_message.htm b/interface/web/client/templates/client_message.htm index 7e1b1da70183a46853d19ccf9caa98ffd075f437..d934d5f6d2f82f3524433f64562238c98cbda219 100644 --- a/interface/web/client/templates/client_message.htm +++ b/interface/web/client/templates/client_message.htm @@ -1,15 +1,20 @@ -

    - - - {tmpl_var name='form_legend_txt'}

    -

    +
    +
    + +
    +
    +
      + +
    +
    +
    @@ -28,8 +33,8 @@
    {tmpl_var name='variables_txt'}: {tmpl_var name="message_variables"}
    {tmpl_var name='variables_description_txt'}
    - +
    -
    \ No newline at end of file + diff --git a/interface/web/client/templates/client_template_edit_limits.htm b/interface/web/client/templates/client_template_edit_limits.htm index df5501602b4aed8fc9e781e0337c1324b5c4e22f..ef15d18358f7b91fedbe5cee94030577c3ea25f2 100644 --- a/interface/web/client/templates/client_template_edit_limits.htm +++ b/interface/web/client/templates/client_template_edit_limits.htm @@ -1,11 +1,3 @@ - -

    - - - {tmpl_var name="Limits"} -
    -
    +
    {tmpl_var name='limit_ssl'}
    -
    +
    {tmpl_var name='limit_ssl_letsencrypt'}
    @@ -177,6 +169,9 @@
    +
    + +
    @@ -197,6 +192,20 @@
    +
    + +
    + {tmpl_var name='limit_mail_backup'} +
    +
    + +
    + +
    + {tmpl_var name='limit_relayhost'} +
    +
    +
    @@ -326,7 +335,7 @@
    - + @@ -388,6 +397,7 @@ +
    +
    diff --git a/interface/web/client/templates/client_template_edit_template.htm b/interface/web/client/templates/client_template_edit_template.htm index e06d07792d9b5e45a7271378a485a71430f98de9..181dedd20f019b8e26f86d9790099d654f8c89f2 100644 --- a/interface/web/client/templates/client_template_edit_template.htm +++ b/interface/web/client/templates/client_template_edit_template.htm @@ -1,12 +1,3 @@ - - - -

    - - - Template
    diff --git a/interface/web/client/templates/reseller_edit_address.htm b/interface/web/client/templates/reseller_edit_address.htm index 69b6552938673ecff837ca53c1c99c3776a15646..eb2760dc3d6aeac4228df02bd36cb64bf5b3d6fc 100644 --- a/interface/web/client/templates/reseller_edit_address.htm +++ b/interface/web/client/templates/reseller_edit_address.htm @@ -1,10 +1,3 @@ - -

    - - - Address
    diff --git a/interface/web/client/templates/reseller_edit_limits.htm b/interface/web/client/templates/reseller_edit_limits.htm index 7a4dc090411d77d6f9daa9307b4a8c0711737852..eee685ac518bb8d6051f43ff931d1312de2ba3ac 100644 --- a/interface/web/client/templates/reseller_edit_limits.htm +++ b/interface/web/client/templates/reseller_edit_limits.htm @@ -1,14 +1,6 @@ - - - -

    -
    - {tmpl_var name="Limits"}
    @@ -135,13 +127,13 @@
    -
    +
    {tmpl_var name='limit_ssl'}
    -
    +
    {tmpl_var name='limit_ssl_letsencrypt'}
    @@ -221,6 +213,9 @@
    +
    + +
    @@ -241,6 +236,20 @@
    +
    + +
    + {tmpl_var name='limit_mail_backup'} +
    +
    + +
    + +
    + {tmpl_var name='limit_relayhost'} +
    +
    +
    @@ -370,7 +379,7 @@
    - +
    @@ -432,6 +441,7 @@ +
    +
    diff --git a/interface/web/dashboard/dashlets/templates/limits.htm b/interface/web/dashboard/dashlets/templates/limits.htm index cc98f78e8cec9073be1077a7f0b4065def344407..7b462063352779a8886f9ae3df88cceee23d7756 100644 --- a/interface/web/dashboard/dashlets/templates/limits.htm +++ b/interface/web/dashboard/dashlets/templates/limits.htm @@ -1,26 +1,34 @@ -
    - +
    +
    - - - - - - - - - - + + + - + + + + + + + {tmpl_if name="progressbar" op="!=" value="-1"} + + {/tmpl_if} + + -
    {tmpl_var name='limits_txt'}
      
    {tmpl_var name='field_txt'}{tmpl_var name='usage'} {tmpl_var name='of_txt'} {tmpl_var name='value'} -
    -
    - {tmpl_var name='usage'} {tmpl_var name='of_txt'} {tmpl_var name='value'} -
    -
    -
       
    {tmpl_var name='field_txt'}{tmpl_var name='usage'} {tmpl_var name='of_txt'} {tmpl_var name='value'} +
    +
    + {tmpl_var name="percentage"}% + {tmpl_var name='usage'} {tmpl_var name='of_txt'} {tmpl_var + name='value'} +
    +
    +
    -
    + +
    \ No newline at end of file diff --git a/interface/web/dashboard/dashlets/templates/mailquota.htm b/interface/web/dashboard/dashlets/templates/mailquota.htm index 3573ef1ab9aea76697e574ee0b7cb3f5d7289880..9013c7ac3bc781797a3fa10fc480bcfa9c80a330 100644 --- a/interface/web/dashboard/dashlets/templates/mailquota.htm +++ b/interface/web/dashboard/dashlets/templates/mailquota.htm @@ -1,30 +1,30 @@ -
    - - - +
    +
    {tmpl_var name='mailquota_txt'}
    + + + + + + + + + + + - - - - + + + + + {tmpl_if name="quota_raw" op="!=" value="0"}{tmpl_else}{/tmpl_if} - - - - - - - - - - - - -
    {tmpl_var name='mailquota_txt'}
    {tmpl_var name='email_txt'}{tmpl_var name='name_txt'}{tmpl_var name='used_txt'}{tmpl_var name='quota_txt'}
    {tmpl_var name='email_txt'}{tmpl_var name='name_txt'}{tmpl_var name='used_txt'}{tmpl_var name='quota_txt'}{tmpl_var name='email'}{tmpl_var name='name'}{tmpl_var name='used'}{tmpl_var name='quota'} +
    +
    {tmpl_var name="used_percentage"}% + {tmpl_var name='used'} {tmpl_var name='of_txt'} {tmpl_var name='quota'} +
    +
    +
    {tmpl_var name='email'}{tmpl_var name='name'}{tmpl_var name='used'}{tmpl_var name='quota'} -
    -
    - {tmpl_var name='used'} {tmpl_var name='of_txt'} {tmpl_var name='quota'} -
    -
    -
    -
    \ No newline at end of file + + + + diff --git a/interface/web/dashboard/dashlets/templates/quota.htm b/interface/web/dashboard/dashlets/templates/quota.htm index 4152ee074d21c3bab033ac51ec95788b060ceb54..fe006c2087e20852abd0a0889c6cd5452aa2abda 100644 --- a/interface/web/dashboard/dashlets/templates/quota.htm +++ b/interface/web/dashboard/dashlets/templates/quota.htm @@ -1,30 +1,34 @@ -
    - +
    +
    - - - - - - - - - - - - - - + + + + - + + + + + + + + + {tmpl_if name="progressbar" op="!=" value="-1"}{tmpl_else}{/tmpl_if} + + -
    {tmpl_var name='quota_txt'}
    {tmpl_var name='domain_txt'}{tmpl_var name='used_txt'}{tmpl_var name='soft_txt'}{tmpl_var name='hard_txt'}
    {tmpl_var name='domain'}{tmpl_var name='used'}{tmpl_var name='soft'}{tmpl_var name='hard'} -
    -
    - {tmpl_var name='used'} {tmpl_var name='of_txt'} {tmpl_var name='soft'} -
    -
    -
    {tmpl_var name='domain_txt'}{tmpl_var name='used_txt'}{tmpl_var name='soft_txt'}{tmpl_var name='hard_txt'}
    {tmpl_var name='domain'}{tmpl_var name='used'}{tmpl_var name='soft'}{tmpl_var name='hard'} +
    +
    {tmpl_var name="used_percentage"}% + {tmpl_var name='used'} {tmpl_var name='of_txt'} {tmpl_var + name='soft'} +
    +
    +
    -
    + + \ No newline at end of file diff --git a/interface/web/dashboard/lib/lang/ar_dashlet_limits.lng b/interface/web/dashboard/lib/lang/ar_dashlet_limits.lng index 6ec82aad5bd18a38c636383f0f415a0b172c5c96..7f87485dfe46dcf18c2b41f75eafc9266e2eedc2 100644 --- a/interface/web/dashboard/lib/lang/ar_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/ar_dashlet_limits.lng @@ -1,7 +1,6 @@ diff --git a/interface/web/dashboard/lib/lang/bg_dashlet_limits.lng b/interface/web/dashboard/lib/lang/bg_dashlet_limits.lng index dad751aaf08f94d1233419e933c66db400597314..78f68a031250d111c57d261c8331beb1a54001f6 100644 --- a/interface/web/dashboard/lib/lang/bg_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/bg_dashlet_limits.lng @@ -1,7 +1,6 @@ diff --git a/interface/web/dashboard/lib/lang/br.lng b/interface/web/dashboard/lib/lang/br.lng index 4ad7fc9c3ccf392b622e73010820e78be60b3b06..df1c23908750258cec3962d528356067a1f84c57 100644 --- a/interface/web/dashboard/lib/lang/br.lng +++ b/interface/web/dashboard/lib/lang/br.lng @@ -1,4 +1,3 @@ diff --git a/interface/web/dashboard/lib/lang/br_dashlet_customer.lng b/interface/web/dashboard/lib/lang/br_dashlet_customer.lng index 8c110cc29b12d16bd000349438e7375a71e6abbc..6bfd8fef29b7fe77e3d455081239653385bea9f6 100644 --- a/interface/web/dashboard/lib/lang/br_dashlet_customer.lng +++ b/interface/web/dashboard/lib/lang/br_dashlet_customer.lng @@ -1,4 +1,3 @@ diff --git a/interface/web/dashboard/lib/lang/br_dashlet_databasequota.lng b/interface/web/dashboard/lib/lang/br_dashlet_databasequota.lng index 9279d2230a2172ce862b52c28228f6dc136e773e..a682d966e0e0502995a1d4ef3931ca418f8a2622 100644 --- a/interface/web/dashboard/lib/lang/br_dashlet_databasequota.lng +++ b/interface/web/dashboard/lib/lang/br_dashlet_databasequota.lng @@ -1,7 +1,6 @@ diff --git a/interface/web/dashboard/lib/lang/br_dashlet_donate.lng b/interface/web/dashboard/lib/lang/br_dashlet_donate.lng index a8ae8a69ef5a21e96542953d054d047c64e43059..b970e2883914a88d0f70ad74ddcc8eb65ea96934 100644 --- a/interface/web/dashboard/lib/lang/br_dashlet_donate.lng +++ b/interface/web/dashboard/lib/lang/br_dashlet_donate.lng @@ -4,4 +4,3 @@ $wb['donate2_txt'] = 'O valor da doação pode ser 5 EUR ou mais, o qual é esco $wb['hide_btn_txt'] = 'Ocultar'; $wb['donate_btn_txt'] = 'Doar para ISPConfig e receber o manual'; $wb['more_btn_txt'] = 'Mais'; -?> diff --git a/interface/web/dashboard/lib/lang/br_dashlet_invoice_client_settings.lng b/interface/web/dashboard/lib/lang/br_dashlet_invoice_client_settings.lng index 1ac4ee2fae26549856762b1cc321d77b5946cb8d..6cea8cb62d18585ff12761f22cbb5ebaab68b71e 100644 --- a/interface/web/dashboard/lib/lang/br_dashlet_invoice_client_settings.lng +++ b/interface/web/dashboard/lib/lang/br_dashlet_invoice_client_settings.lng @@ -1,4 +1,3 @@ diff --git a/interface/web/dashboard/lib/lang/br_dashlet_invoices.lng b/interface/web/dashboard/lib/lang/br_dashlet_invoices.lng index 545c6994a620a9a273e6ad53477d2cf67dc5f50c..acc6e6e592054587abfb51e7987469a78c3d9894 100644 --- a/interface/web/dashboard/lib/lang/br_dashlet_invoices.lng +++ b/interface/web/dashboard/lib/lang/br_dashlet_invoices.lng @@ -15,4 +15,3 @@ $wb['invoice_type_invoice_txt'] = 'Fatura'; $wb['invoice_type_proforma_txt'] = 'Proforma'; $wb['invoice_type_refund_txt'] = 'Reembolso'; $wb['invoice_type_reminder_txt'] = 'Lembrar'; -?> diff --git a/interface/web/dashboard/lib/lang/br_dashlet_limits.lng b/interface/web/dashboard/lib/lang/br_dashlet_limits.lng index 72558f5797f462adac944a2d4a43b6f3bb956ea1..1b336fe02b3cdd3d87d61953897b8ac177e899e3 100644 --- a/interface/web/dashboard/lib/lang/br_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/br_dashlet_limits.lng @@ -1,34 +1,33 @@ +$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/br_dashlet_mailquota.lng b/interface/web/dashboard/lib/lang/br_dashlet_mailquota.lng index d164a35661c264480757acaf6ae003623494bad5..a513f387a8587796e336bc357ee1d4329a119320 100644 --- a/interface/web/dashboard/lib/lang/br_dashlet_mailquota.lng +++ b/interface/web/dashboard/lib/lang/br_dashlet_mailquota.lng @@ -1,8 +1,7 @@ +$wb['no_email_accounts_txt'] = 'Nenhuma conta de email encontrada.'; diff --git a/interface/web/dashboard/lib/lang/br_dashlet_modules.lng b/interface/web/dashboard/lib/lang/br_dashlet_modules.lng index 905d3d600723704273e3dc7a47107befcda6f59f..398d8b2a785072e1ae368aaae8be1e5285dbfca6 100644 --- a/interface/web/dashboard/lib/lang/br_dashlet_modules.lng +++ b/interface/web/dashboard/lib/lang/br_dashlet_modules.lng @@ -1,4 +1,3 @@ diff --git a/interface/web/dashboard/lib/lang/br_dashlet_products.lng b/interface/web/dashboard/lib/lang/br_dashlet_products.lng index c750052ad7182178dbaa61c25ddeb8cced63676c..aceb3074540408916b5fbaa995daca8171a8aa08 100644 --- a/interface/web/dashboard/lib/lang/br_dashlet_products.lng +++ b/interface/web/dashboard/lib/lang/br_dashlet_products.lng @@ -6,4 +6,3 @@ $wb['next_payment_date_txt'] = 'Próxima fatura'; $wb['no_products_txt'] = 'Nenhum produto encontrado.'; $wb['edit_txt'] = 'Editar'; $wb['cancellation_date_txt'] = 'Cancelado por'; -?> diff --git a/interface/web/dashboard/lib/lang/br_dashlet_quota.lng b/interface/web/dashboard/lib/lang/br_dashlet_quota.lng index 589e3dca3ec8e245430c195e8b1fcce96cafa877..492d70c1b32eb9f7b7b598278558f833e953ed11 100644 --- a/interface/web/dashboard/lib/lang/br_dashlet_quota.lng +++ b/interface/web/dashboard/lib/lang/br_dashlet_quota.lng @@ -5,4 +5,3 @@ $wb['used_txt'] = 'Espaço utilizado'; $wb['hard_txt'] = 'Limite para bloqueio'; $wb['soft_txt'] = 'Limite para alerta'; $wb['no_sites_txt'] = 'Nenhum site encontrado.'; -?> diff --git a/interface/web/dashboard/lib/lang/br_dashlet_shop.lng b/interface/web/dashboard/lib/lang/br_dashlet_shop.lng index 9fd37d5250f046f988c48c2accbb51a867ea993b..a7854c8c9bc32348b64999e9316ff4f9c5759291 100644 --- a/interface/web/dashboard/lib/lang/br_dashlet_shop.lng +++ b/interface/web/dashboard/lib/lang/br_dashlet_shop.lng @@ -5,4 +5,3 @@ $wb['price_txt'] = 'Preço'; $wb['setup_fee_txt'] = 'Taxa criada'; $wb['no_products_txt'] = 'Nenhum produto encontrado.'; $wb['order_txt'] = 'Ordem'; -?> diff --git a/interface/web/dashboard/lib/lang/ca_dashlet_limits.lng b/interface/web/dashboard/lib/lang/ca_dashlet_limits.lng index f482b47e38b0bab17dd6d0c0d2b4c169c8d9b904..6a443950a423ca320e7fb2dbb1d7118df3975a79 100644 --- a/interface/web/dashboard/lib/lang/ca_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/ca_dashlet_limits.lng @@ -1,7 +1,6 @@ diff --git a/interface/web/dashboard/lib/lang/cz.lng b/interface/web/dashboard/lib/lang/cz.lng index 9d2a3211cb0d4cabaade52c01f42a146df72eafb..ba718be0b63e8fdb50e4356f3b327454215f55d4 100644 --- a/interface/web/dashboard/lib/lang/cz.lng +++ b/interface/web/dashboard/lib/lang/cz.lng @@ -1,4 +1,3 @@ diff --git a/interface/web/dashboard/lib/lang/cz_dashlet_customer.lng b/interface/web/dashboard/lib/lang/cz_dashlet_customer.lng index f337141de6195bf1fefd0fa85cf0b60fceae659a..3197df795916bb902ad79542fde426a0d71e0950 100644 --- a/interface/web/dashboard/lib/lang/cz_dashlet_customer.lng +++ b/interface/web/dashboard/lib/lang/cz_dashlet_customer.lng @@ -1,4 +1,3 @@ diff --git a/interface/web/dashboard/lib/lang/cz_dashlet_databasequota.lng b/interface/web/dashboard/lib/lang/cz_dashlet_databasequota.lng index 93be2e34255b99985d3711f37988e70ae91fd202..c060befe540ef5fdf1ec124ad2ae80169469576c 100644 --- a/interface/web/dashboard/lib/lang/cz_dashlet_databasequota.lng +++ b/interface/web/dashboard/lib/lang/cz_dashlet_databasequota.lng @@ -4,4 +4,3 @@ $wb['used_txt'] = 'Využité místo'; $wb['quota_txt'] = 'Kvóta'; $wb['no_database_accounts_txt'] = 'Nebyla nalezena žádná databáze.'; $wb['databasequota_txt'] = 'Kvóty databází'; -?> diff --git a/interface/web/dashboard/lib/lang/cz_dashlet_donate.lng b/interface/web/dashboard/lib/lang/cz_dashlet_donate.lng index c3e857d85aa197092b2fd4be74ecdd35ccb46008..bf9c968609a658c7fa07c1fad95abc19875b39fb 100644 --- a/interface/web/dashboard/lib/lang/cz_dashlet_donate.lng +++ b/interface/web/dashboard/lib/lang/cz_dashlet_donate.lng @@ -4,4 +4,3 @@ $wb['donate2_txt'] = 'Výše daru může být 5 EUR nebo více, částku si zvol $wb['hide_btn_txt'] = 'Skrýt'; $wb['donate_btn_txt'] = 'Podpořit ISPConfig a získat manuál'; $wb['more_btn_txt'] = 'Více'; -?> diff --git a/interface/web/dashboard/lib/lang/cz_dashlet_invoice_client_settings.lng b/interface/web/dashboard/lib/lang/cz_dashlet_invoice_client_settings.lng index 113d919c00a6ce8fff725c6ed79951fd37d5e41a..d4ee2e264db142c7d86db0730e77630828ed1357 100644 --- a/interface/web/dashboard/lib/lang/cz_dashlet_invoice_client_settings.lng +++ b/interface/web/dashboard/lib/lang/cz_dashlet_invoice_client_settings.lng @@ -1,4 +1,3 @@ diff --git a/interface/web/dashboard/lib/lang/cz_dashlet_invoices.lng b/interface/web/dashboard/lib/lang/cz_dashlet_invoices.lng index ab093825c60f1890b862021d2977528c7aa3878d..f7dd19b0dd95391e133b6f43372da56e1f709357 100644 --- a/interface/web/dashboard/lib/lang/cz_dashlet_invoices.lng +++ b/interface/web/dashboard/lib/lang/cz_dashlet_invoices.lng @@ -15,4 +15,3 @@ $wb['invoice_type_invoice_txt'] = 'Invoice'; $wb['invoice_type_proforma_txt'] = 'Proforma'; $wb['invoice_type_refund_txt'] = 'Refund'; $wb['invoice_type_reminder_txt'] = 'Reminder'; -?> diff --git a/interface/web/dashboard/lib/lang/cz_dashlet_limits.lng b/interface/web/dashboard/lib/lang/cz_dashlet_limits.lng index a7aecc4a539beb0a074f7744ece25e94068dab5e..7ad586e7c62cf446d51ff035e57659c27c51aba6 100644 --- a/interface/web/dashboard/lib/lang/cz_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/cz_dashlet_limits.lng @@ -1,7 +1,6 @@ +$wb['limit_mail_wblist_txt'] = 'Number of email white / blacklist entries'; diff --git a/interface/web/dashboard/lib/lang/cz_dashlet_mailquota.lng b/interface/web/dashboard/lib/lang/cz_dashlet_mailquota.lng index 742721c5ff4b0af42d7eb085eb9d58132884fe5f..432e9b5a841e2fc3e3c3c5ffce035b7d980461da 100644 --- a/interface/web/dashboard/lib/lang/cz_dashlet_mailquota.lng +++ b/interface/web/dashboard/lib/lang/cz_dashlet_mailquota.lng @@ -5,4 +5,3 @@ $wb['name_txt'] = 'Jméno'; $wb['used_txt'] = 'Využité místo'; $wb['quota_txt'] = 'Kvóta'; $wb['no_email_accounts_txt'] = 'Nenalezeny žádné e-mailové účty.'; -?> diff --git a/interface/web/dashboard/lib/lang/cz_dashlet_modules.lng b/interface/web/dashboard/lib/lang/cz_dashlet_modules.lng index b4cade4795b21fb9287138d0fb9c2703a95a893e..3c715ae22962b67861d81321972a5910108cf3f9 100644 --- a/interface/web/dashboard/lib/lang/cz_dashlet_modules.lng +++ b/interface/web/dashboard/lib/lang/cz_dashlet_modules.lng @@ -1,4 +1,3 @@ diff --git a/interface/web/dashboard/lib/lang/cz_dashlet_products.lng b/interface/web/dashboard/lib/lang/cz_dashlet_products.lng index 187bc359335aa778ba4c1e9ec3cfa8dbe83ed4c3..01b1ee5174c4de8d9d982f293f6b6354b54bd5b0 100644 --- a/interface/web/dashboard/lib/lang/cz_dashlet_products.lng +++ b/interface/web/dashboard/lib/lang/cz_dashlet_products.lng @@ -6,4 +6,3 @@ $wb['next_payment_date_txt'] = 'Next Invoice'; $wb['no_products_txt'] = 'Nebyly nalezeny žádné produkty.'; $wb['edit_txt'] = 'Editovat'; $wb['cancellation_date_txt'] = 'Cancelled by'; -?> diff --git a/interface/web/dashboard/lib/lang/cz_dashlet_quota.lng b/interface/web/dashboard/lib/lang/cz_dashlet_quota.lng index 0c2074a9965d78e32d73d2bf562edeb5acf61fdd..457cce103bc05257effb541338d0498c935e55b9 100644 --- a/interface/web/dashboard/lib/lang/cz_dashlet_quota.lng +++ b/interface/web/dashboard/lib/lang/cz_dashlet_quota.lng @@ -5,4 +5,3 @@ $wb['used_txt'] = 'Využité místo'; $wb['hard_txt'] = 'Kvóta max. obsazení'; $wb['soft_txt'] = 'Kvóta pro upozornění'; $wb['no_sites_txt'] = 'Nenalezeny žádné webové stránky.'; -?> diff --git a/interface/web/dashboard/lib/lang/cz_dashlet_shop.lng b/interface/web/dashboard/lib/lang/cz_dashlet_shop.lng index 79c306dc45ad58dfcb656a4f5ca71b563847f2b0..cead774ac2805b0a710d35b8d5c45e617e795697 100644 --- a/interface/web/dashboard/lib/lang/cz_dashlet_shop.lng +++ b/interface/web/dashboard/lib/lang/cz_dashlet_shop.lng @@ -5,4 +5,3 @@ $wb['price_txt'] = 'Cena'; $wb['setup_fee_txt'] = 'Setup Fee'; $wb['no_products_txt'] = 'Nebyly nalezeny žádné produkty.'; $wb['order_txt'] = 'Order'; -?> diff --git a/interface/web/dashboard/lib/lang/de_dashlet_limits.lng b/interface/web/dashboard/lib/lang/de_dashlet_limits.lng index 335c17ca85afd24f86e155de0dfe5743cf8f3490..07a84bef10e5493dc1090433c70913615aa72da8 100644 --- a/interface/web/dashboard/lib/lang/de_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/de_dashlet_limits.lng @@ -1,7 +1,6 @@ +$wb['limit_mailquota_txt'] = 'Zugewiesenes Postfach-Speicherkontingent'; +$wb['limit_web_quota_txt'] = 'Zugewiesenes Webspace-Speicherkontingent'; +$wb['limit_database_quota_txt'] = 'Zugewiesenes Datenbank-Speicherkontingent'; +$wb['limit_mail_wblist_txt'] = 'Anzahl der Email white / blacklist Einträge'; + diff --git a/interface/web/dashboard/lib/lang/de_dashlet_mailquota.lng b/interface/web/dashboard/lib/lang/de_dashlet_mailquota.lng index 92168811936d835f41d660899cfea011015efa1f..1e69b5777b620c0514fb58c067d15908f7843ce3 100644 --- a/interface/web/dashboard/lib/lang/de_dashlet_mailquota.lng +++ b/interface/web/dashboard/lib/lang/de_dashlet_mailquota.lng @@ -1,5 +1,5 @@ diff --git a/interface/web/dashboard/lib/lang/el_dashlet_limits.lng b/interface/web/dashboard/lib/lang/el_dashlet_limits.lng index dac3b556232f3a3199b4220f66e3c787590c9e64..fe9d66391d2a5ef357b8816b73f2430e67699b57 100644 --- a/interface/web/dashboard/lib/lang/el_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/el_dashlet_limits.lng @@ -1,7 +1,6 @@ diff --git a/interface/web/dashboard/lib/lang/en.lng b/interface/web/dashboard/lib/lang/en.lng index 177fad0416a8a85f1be052efcd0973a08e572968..246054599fc1e41cbac86df2f063020ae5299c81 100644 --- a/interface/web/dashboard/lib/lang/en.lng +++ b/interface/web/dashboard/lib/lang/en.lng @@ -1,4 +1,4 @@ diff --git a/interface/web/dashboard/lib/lang/en_dashlet_invoices.lng b/interface/web/dashboard/lib/lang/en_dashlet_invoices.lng index b085406e1d043ec56879db45d34c4472d2913941..a680daa8f623ad5af726dffd8eb1e1c0b1ce9b4e 100644 --- a/interface/web/dashboard/lib/lang/en_dashlet_invoices.lng +++ b/interface/web/dashboard/lib/lang/en_dashlet_invoices.lng @@ -1,18 +1,18 @@ diff --git a/interface/web/dashboard/lib/lang/en_dashlet_limits.lng b/interface/web/dashboard/lib/lang/en_dashlet_limits.lng index 5d504c8e9b6e91dd62aa181fcd354781b5470567..0306e6ead3eca62b86d5fb8f48909917f07eec1b 100644 --- a/interface/web/dashboard/lib/lang/en_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/en_dashlet_limits.lng @@ -1,34 +1,34 @@ diff --git a/interface/web/dashboard/lib/lang/en_dashlet_mailquota.lng b/interface/web/dashboard/lib/lang/en_dashlet_mailquota.lng index 2c2b6cd7ae1ee489bcc69c5d5716383a9442634a..c2223368cee16cfe870c79b86c9e7f842cd26843 100644 --- a/interface/web/dashboard/lib/lang/en_dashlet_mailquota.lng +++ b/interface/web/dashboard/lib/lang/en_dashlet_mailquota.lng @@ -1,8 +1,8 @@ \ No newline at end of file diff --git a/interface/web/dashboard/lib/lang/en_dashlet_modules.lng b/interface/web/dashboard/lib/lang/en_dashlet_modules.lng index ef088a3bf4e8060cbd49f0a17e8f7c893c28f8d0..af9fb0294cc0608690a87196e411943b190ce177 100644 --- a/interface/web/dashboard/lib/lang/en_dashlet_modules.lng +++ b/interface/web/dashboard/lib/lang/en_dashlet_modules.lng @@ -1,4 +1,4 @@ diff --git a/interface/web/dashboard/lib/lang/en_dashlet_quota.lng b/interface/web/dashboard/lib/lang/en_dashlet_quota.lng index 8b2e3d43d00117f0bb31345990c2a13fd386721a..d029e6859c271c9104479c251fd9f4f902cfb716 100644 --- a/interface/web/dashboard/lib/lang/en_dashlet_quota.lng +++ b/interface/web/dashboard/lib/lang/en_dashlet_quota.lng @@ -1,8 +1,8 @@ \ No newline at end of file diff --git a/interface/web/dashboard/lib/lang/es.lng b/interface/web/dashboard/lib/lang/es.lng old mode 100755 new mode 100644 diff --git a/interface/web/dashboard/lib/lang/es_dashlet_customer.lng b/interface/web/dashboard/lib/lang/es_dashlet_customer.lng old mode 100755 new mode 100644 diff --git a/interface/web/dashboard/lib/lang/es_dashlet_invoice_client_settings.lng b/interface/web/dashboard/lib/lang/es_dashlet_invoice_client_settings.lng old mode 100755 new mode 100644 diff --git a/interface/web/dashboard/lib/lang/es_dashlet_invoices.lng b/interface/web/dashboard/lib/lang/es_dashlet_invoices.lng old mode 100755 new mode 100644 diff --git a/interface/web/dashboard/lib/lang/es_dashlet_limits.lng b/interface/web/dashboard/lib/lang/es_dashlet_limits.lng old mode 100755 new mode 100644 index da6cd6b513fb9fa4f5f3ec258be6ac2ade7c95ab..5e04a1ba61d9879d1992a703d63d105060db35df --- a/interface/web/dashboard/lib/lang/es_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/es_dashlet_limits.lng @@ -27,8 +27,8 @@ $wb['limit_web_subdomain_txt'] = 'Cantidad de sub-dominios'; $wb['limit_webdav_user_txt'] = 'Cantidad de usuarios Webdav'; $wb['limits_txt'] = 'Límites de la cuenta'; $wb['of_txt'] = 'de'; -$wb['unlimited_txt'] = 'Ilimitado'; $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/es_dashlet_mailquota.lng b/interface/web/dashboard/lib/lang/es_dashlet_mailquota.lng old mode 100755 new mode 100644 diff --git a/interface/web/dashboard/lib/lang/es_dashlet_modules.lng b/interface/web/dashboard/lib/lang/es_dashlet_modules.lng old mode 100755 new mode 100644 diff --git a/interface/web/dashboard/lib/lang/es_dashlet_products.lng b/interface/web/dashboard/lib/lang/es_dashlet_products.lng old mode 100755 new mode 100644 diff --git a/interface/web/dashboard/lib/lang/es_dashlet_quota.lng b/interface/web/dashboard/lib/lang/es_dashlet_quota.lng old mode 100755 new mode 100644 diff --git a/interface/web/dashboard/lib/lang/es_dashlet_shop.lng b/interface/web/dashboard/lib/lang/es_dashlet_shop.lng old mode 100755 new mode 100644 diff --git a/interface/web/dashboard/lib/lang/fi_dashlet_limits.lng b/interface/web/dashboard/lib/lang/fi_dashlet_limits.lng index 6ec82aad5bd18a38c636383f0f415a0b172c5c96..7f87485dfe46dcf18c2b41f75eafc9266e2eedc2 100644 --- a/interface/web/dashboard/lib/lang/fi_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/fi_dashlet_limits.lng @@ -1,7 +1,6 @@ diff --git a/interface/web/dashboard/lib/lang/fr_dashlet_limits.lng b/interface/web/dashboard/lib/lang/fr_dashlet_limits.lng index 525249f6d44ce91a5c54d43448f593096ce43e27..7d46a22e6f83d356d88267730dbddd07bdfcba6d 100644 --- a/interface/web/dashboard/lib/lang/fr_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/fr_dashlet_limits.lng @@ -1,7 +1,6 @@ diff --git a/interface/web/dashboard/lib/lang/hr_dashlet_limits.lng b/interface/web/dashboard/lib/lang/hr_dashlet_limits.lng index 1a3db42a24c7711caa7634567a94b92ccfb9a169..6eada3538ef2c702c7d11f0ee00aaf670ad4d62a 100644 --- a/interface/web/dashboard/lib/lang/hr_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/hr_dashlet_limits.lng @@ -1,7 +1,6 @@ diff --git a/interface/web/dashboard/lib/lang/hu_dashlet_limits.lng b/interface/web/dashboard/lib/lang/hu_dashlet_limits.lng index 13c5a4e45029a8c48a919ede5a071cfe2db3d8ab..67049d5137577216c4e98bf660c97666bb6e162e 100644 --- a/interface/web/dashboard/lib/lang/hu_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/hu_dashlet_limits.lng @@ -1,7 +1,6 @@ diff --git a/interface/web/dashboard/lib/lang/id_dashlet_limits.lng b/interface/web/dashboard/lib/lang/id_dashlet_limits.lng index 8079b742b790194010abaaa99426d1f4c88a1492..0e34d0e13d6d81702710e66ac4795771a077deea 100644 --- a/interface/web/dashboard/lib/lang/id_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/id_dashlet_limits.lng @@ -1,7 +1,6 @@ diff --git a/interface/web/dashboard/lib/lang/it_dashlet_customer.lng b/interface/web/dashboard/lib/lang/it_dashlet_customer.lng index 4fe6cb0ef7db195cb03d4e73c5ba9b232a7d58bb..bb6c2c5a6d04aee882bf54ea1ceda24ef81ec242 100644 --- a/interface/web/dashboard/lib/lang/it_dashlet_customer.lng +++ b/interface/web/dashboard/lib/lang/it_dashlet_customer.lng @@ -1,4 +1,4 @@ diff --git a/interface/web/dashboard/lib/lang/it_dashlet_databasequota.lng b/interface/web/dashboard/lib/lang/it_dashlet_databasequota.lng index bd2402dbf6c113dde8190fbbdec29490f948d725..61ab6d9b21a40b3959e1d3a798c72b7cbd01f113 100644 --- a/interface/web/dashboard/lib/lang/it_dashlet_databasequota.lng +++ b/interface/web/dashboard/lib/lang/it_dashlet_databasequota.lng @@ -1,7 +1,7 @@ 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 @@ 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 @@ 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 @@ diff --git a/interface/web/dashboard/lib/lang/it_dashlet_limits.lng b/interface/web/dashboard/lib/lang/it_dashlet_limits.lng index a1a2000edf88d00db8e8ee9b876265901bed1821..b09fbaabc81c6050765dd5876fb2136f84cb2143 100644 --- a/interface/web/dashboard/lib/lang/it_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/it_dashlet_limits.lng @@ -1,16 +1,15 @@ diff --git a/interface/web/dashboard/lib/lang/it_dashlet_mailquota.lng b/interface/web/dashboard/lib/lang/it_dashlet_mailquota.lng index 1ab1e66658fbcab9841ac79a17eb76deb42e40a7..6b7fc62c1e669363d2212bb1ff7e0be1ed3d77c0 100644 --- a/interface/web/dashboard/lib/lang/it_dashlet_mailquota.lng +++ b/interface/web/dashboard/lib/lang/it_dashlet_mailquota.lng @@ -1,8 +1,8 @@ diff --git a/interface/web/dashboard/lib/lang/it_dashlet_modules.lng b/interface/web/dashboard/lib/lang/it_dashlet_modules.lng index 69d5c079978cda232d9826df38b6bea5b946b266..a80b302092d013bde2177ddb5491912712d5c7a2 100644 --- a/interface/web/dashboard/lib/lang/it_dashlet_modules.lng +++ b/interface/web/dashboard/lib/lang/it_dashlet_modules.lng @@ -1,4 +1,4 @@ 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 @@ diff --git a/interface/web/dashboard/lib/lang/it_dashlet_quota.lng b/interface/web/dashboard/lib/lang/it_dashlet_quota.lng index de7b5a893612c6c8abb9117bfe933d0eddd782af..63799d2ee3dfa48e7e0177ec64abafab2cd13f8c 100644 --- a/interface/web/dashboard/lib/lang/it_dashlet_quota.lng +++ b/interface/web/dashboard/lib/lang/it_dashlet_quota.lng @@ -1,8 +1,8 @@ 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 @@ diff --git a/interface/web/dashboard/lib/lang/ja_dashlet_limits.lng b/interface/web/dashboard/lib/lang/ja_dashlet_limits.lng index 6ec82aad5bd18a38c636383f0f415a0b172c5c96..7f87485dfe46dcf18c2b41f75eafc9266e2eedc2 100644 --- a/interface/web/dashboard/lib/lang/ja_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/ja_dashlet_limits.lng @@ -1,7 +1,6 @@ diff --git a/interface/web/dashboard/lib/lang/nl_dashlet_limits.lng b/interface/web/dashboard/lib/lang/nl_dashlet_limits.lng index 10d1e8283713a6f5ed63e94116bce6baff1378fe..9f00b2eeeb3a3fbf676e4c2ec41cc854bb4b8332 100644 --- a/interface/web/dashboard/lib/lang/nl_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/nl_dashlet_limits.lng @@ -1,7 +1,6 @@ diff --git a/interface/web/dashboard/lib/lang/pl_dashlet_limits.lng b/interface/web/dashboard/lib/lang/pl_dashlet_limits.lng index 4d5b971469952abfef8425650c7f7ae1e511ab11..b4cdeb1d7ae1501f56127d822284435f22633965 100644 --- a/interface/web/dashboard/lib/lang/pl_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/pl_dashlet_limits.lng @@ -1,7 +1,6 @@ diff --git a/interface/web/dashboard/lib/lang/pt_dashlet_limits.lng b/interface/web/dashboard/lib/lang/pt_dashlet_limits.lng index 6ec82aad5bd18a38c636383f0f415a0b172c5c96..7f87485dfe46dcf18c2b41f75eafc9266e2eedc2 100644 --- a/interface/web/dashboard/lib/lang/pt_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/pt_dashlet_limits.lng @@ -1,7 +1,6 @@ diff --git a/interface/web/dashboard/lib/lang/ro_dashlet_limits.lng b/interface/web/dashboard/lib/lang/ro_dashlet_limits.lng index 6ec82aad5bd18a38c636383f0f415a0b172c5c96..7f87485dfe46dcf18c2b41f75eafc9266e2eedc2 100644 --- a/interface/web/dashboard/lib/lang/ro_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/ro_dashlet_limits.lng @@ -1,7 +1,6 @@ diff --git a/interface/web/dashboard/lib/lang/ru_dashlet_limits.lng b/interface/web/dashboard/lib/lang/ru_dashlet_limits.lng index 19295b65e378928825bfe97a34d7338862d7f2c7..c97f090052652905f920be2c2960caf469757dbe 100644 --- a/interface/web/dashboard/lib/lang/ru_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/ru_dashlet_limits.lng @@ -1,7 +1,6 @@ diff --git a/interface/web/dashboard/lib/lang/se_dashlet_limits.lng b/interface/web/dashboard/lib/lang/se_dashlet_limits.lng index d1f38b1b0deb8bc41d5e9078f1022a16536e076c..7cbd24f2fbe41b09d1ab7b4a242f0e2a91e5841f 100644 --- a/interface/web/dashboard/lib/lang/se_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/se_dashlet_limits.lng @@ -1,7 +1,6 @@ diff --git a/interface/web/dashboard/lib/lang/sk_dashlet_limits.lng b/interface/web/dashboard/lib/lang/sk_dashlet_limits.lng index 6ec82aad5bd18a38c636383f0f415a0b172c5c96..7f87485dfe46dcf18c2b41f75eafc9266e2eedc2 100644 --- a/interface/web/dashboard/lib/lang/sk_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/sk_dashlet_limits.lng @@ -1,7 +1,6 @@ diff --git a/interface/web/dashboard/lib/lang/tr_dashlet_limits.lng b/interface/web/dashboard/lib/lang/tr_dashlet_limits.lng index 9fa1fb5b90595d9bd20405927d4536876d82d76e..b48a81377a912ab4d2d4f7736362e6584f3a18ed 100644 --- a/interface/web/dashboard/lib/lang/tr_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/tr_dashlet_limits.lng @@ -1,7 +1,6 @@ diff --git a/interface/web/dns/dns_a_edit.php b/interface/web/dns/dns_a_edit.php index 595ebcc92c4c0bfad88970f31f1b9be830be81fd..ae5be448c5b6bbbb042cc839918be9b057a6dfeb 100644 --- a/interface/web/dns/dns_a_edit.php +++ b/interface/web/dns/dns_a_edit.php @@ -48,7 +48,7 @@ class page_action extends dns_page_action { protected function checkDuplicate() { global $app; //* Check for duplicates where IP and hostname are the same - $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE (type = 'A' AND name = ? AND zone = ? and data = ? and id != ?) OR (type = 'CNAME' AND name = ? AND zone = ? and id != ?)", $this->dataRecord["name"], $this->dataRecord["zone"], $this->dataRecord["data"], $this->id, $this->dataRecord["name"], $this->dataRecord["zone"], $this->id); + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE (type = 'A' AND name = ? AND zone = ? and data = ? and id != ?) OR (type = 'CNAME' AND name = ? AND zone = ? and id != ?) OR (type = 'ALIAS' AND name = ? AND zone = ? and id != ?)", $this->dataRecord["name"], $this->dataRecord["zone"], $this->dataRecord["data"], $this->id, $this->dataRecord["name"], $this->dataRecord["zone"], $this->id, $this->dataRecord["name"], $this->dataRecord["zone"], $this->id); if($tmp['number'] > 0) return true; return false; } diff --git a/interface/web/dns/dns_aaaa_edit.php b/interface/web/dns/dns_aaaa_edit.php index 006e71cf4cfa0b31724b1f6b354e0f896a7e0ee5..07bddeb0504dfa55df17dca1a6a23a513d750f84 100644 --- a/interface/web/dns/dns_aaaa_edit.php +++ b/interface/web/dns/dns_aaaa_edit.php @@ -45,6 +45,14 @@ require_once './dns_edit_base.php'; // Loading classes class page_action extends dns_page_action { + protected function checkDuplicate() { + global $app; + //* Check for duplicates where IP and hostname are the same + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE (type = 'AAAA' AND name = ? AND zone = ? and data = ? and id != ?) OR (type = 'CNAME' AND name = ? AND zone = ? and id != ?) OR (type = 'ALIAS' AND name = ? AND zone = ? and id != ?)", $this->dataRecord["name"], $this->dataRecord["zone"], $this->dataRecord["data"], $this->id, $this->dataRecord["name"], $this->dataRecord["zone"], $this->id, $this->dataRecord["name"], $this->dataRecord["zone"], $this->id); + if($tmp['number'] > 0) return true; + return false; + } + } $page = new page_action; diff --git a/interface/web/dns/dns_alias_edit.php b/interface/web/dns/dns_alias_edit.php index 68f2743fe16dfc02dd7a7d5bd4a8aa0878bf074d..3dfb59dead91b58f8fe3c12bd1f192144ff3cdbf 100644 --- a/interface/web/dns/dns_alias_edit.php +++ b/interface/web/dns/dns_alias_edit.php @@ -44,7 +44,24 @@ require_once './dns_edit_base.php'; // Loading classes class page_action extends dns_page_action { + protected function checkDuplicate() { + global $app; + //* Check for duplicates where IP and hostname are the same + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE (type = 'A' AND name = ? AND zone = ? and id != ?) OR (type = 'AAAA' AND name = ? AND zone = ? and id != ?) OR (type = 'CNAME' AND name = ? AND zone = ? and id != ?) OR (type = 'DNAME' AND name = ? AND zone = ? and id != ?) OR (type = 'ALIAS' AND name = ? AND zone = ? and id != ?)", $this->dataRecord["name"], $this->dataRecord["zone"], $this->id, $this->dataRecord["name"], $this->dataRecord["zone"], $this->id, $this->dataRecord["name"], $this->dataRecord["zone"], $this->id, $this->dataRecord["name"], $this->dataRecord["zone"], $this->id, $this->dataRecord["name"], $this->dataRecord["zone"], $this->id); + if($tmp['number'] > 0) return true; + return false; + } + function onSubmit() { + global $app, $conf; + // Get the parent soa record of the domain + $soa = $app->db->queryOneRecord("SELECT * FROM dns_soa WHERE id = ? AND " . $app->tform->getAuthSQL('r'), $_POST["zone"]); + // Replace @ to example.com. in data field + if($this->dataRecord["data"] === '@') { + $this->dataRecord["data"] = $soa['origin']; + } + parent::onSubmit(); + } } $page = new page_action; diff --git a/interface/web/dns/dns_cname_edit.php b/interface/web/dns/dns_cname_edit.php index 403650c1c444481d54bb26edef94f60251a74bb2..e2fde267d22a0008b5e30787a5af95292e11f1f6 100644 --- a/interface/web/dns/dns_cname_edit.php +++ b/interface/web/dns/dns_cname_edit.php @@ -48,11 +48,21 @@ class page_action extends dns_page_action { protected function checkDuplicate() { global $app; //* Check for duplicates where IP and hostname are the same - $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE (type = 'A' AND name = ? AND zone = ? and id != ?) OR (type = 'CNAME' AND name = ? AND zone = ? and id != ?)", $this->dataRecord["name"], $this->dataRecord["zone"], $this->id, $this->dataRecord["name"], $this->dataRecord["zone"], $this->id); + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE (type = 'A' AND name = ? AND zone = ? and id != ?) OR (type = 'AAAA' AND name = ? AND zone = ? and id != ?) OR (type = 'CNAME' AND name = ? AND zone = ? and id != ?) OR (type = 'DNAME' AND name = ? AND zone = ? and id != ?) OR (type = 'ALIAS' AND name = ? AND zone = ? and id != ?)", $this->dataRecord["name"], $this->dataRecord["zone"], $this->id, $this->dataRecord["name"], $this->dataRecord["zone"], $this->id, $this->dataRecord["name"], $this->dataRecord["zone"], $this->id, $this->dataRecord["name"], $this->dataRecord["zone"], $this->id, $this->dataRecord["name"], $this->dataRecord["zone"], $this->id); if($tmp['number'] > 0) return true; return false; } + function onSubmit() { + global $app, $conf; + // Get the parent soa record of the domain + $soa = $app->db->queryOneRecord("SELECT * FROM dns_soa WHERE id = ? AND " . $app->tform->getAuthSQL('r'), $_POST["zone"]); + // Replace @ to example.com. in data field + if($this->dataRecord["data"] === '@') { + $this->dataRecord["data"] = $soa['origin']; + } + parent::onSubmit(); + } } $page = new page_action; diff --git a/interface/web/dns/dns_dkim_edit.php b/interface/web/dns/dns_dkim_edit.php index 5c95b2033d78d5211d62d3590676add744a10d39..520d3822816d738a94067c40e32a813a7747d435 100644 --- a/interface/web/dns/dns_dkim_edit.php +++ b/interface/web/dns/dns_dkim_edit.php @@ -126,6 +126,7 @@ class page_action extends tform_actions { $this->dataRecord["stamp"] = date('Y-m-d H:i:s'); // check for duplicate entry + // Should NOT include data in this check? it must be unique for zone/name (selector)/type, regardless of data $check=$app->db->queryOneRecord("SELECT * FROM dns_rr WHERE zone = ? AND type = ? AND data = ? AND name = ?", $this->dataRecord["zone"], $this->dataRecord["type"], $this->dataRecord["data"], $this->dataRecord['name']); if ($check!='') $app->tform->errorMessage .= $app->tform->wordbook["record_exists_txt"]; if (empty($this->dataRecord['data'])) $app->tform->errorMessage .= $app->tform->wordbook["dkim_disabled_txt"]; diff --git a/interface/web/dns/dns_dmarc_edit.php b/interface/web/dns/dns_dmarc_edit.php index 6b720c0f38c9486b5f901ff7ab8a21630499a70f..e194aeb835ca21720b69a453044e90145097858e 100644 --- a/interface/web/dns/dns_dmarc_edit.php +++ b/interface/web/dns/dns_dmarc_edit.php @@ -88,13 +88,13 @@ class page_action extends tform_actions { $dmarc_sp = 'same'; //* check for an existing dmarc-record - $sql = "SELECT data, active FROM dns_rr WHERE data LIKE 'v=DMARC1%' AND zone = ? AND name = ? AND " . $app->tform->getAuthSQL('r'); - $rec = $app->db->queryOneRecord($sql, $zone, '_dmarc.'.$domain_name.'.'); - if ( isset($rec) && !empty($rec) ) { + $sql = "SELECT data, active FROM dns_rr WHERE data LIKE 'v=DMARC1%' AND zone = ? AND name LIKE ? AND " . $app->tform->getAuthSQL('r') . " ORDER BY (name = ?) DESC"; + $rec = $app->db->queryOneRecord($sql, $zone, '_dmarc%', '_dmarc.'.$domain_name.'.'); + if (isset($rec) && !empty($rec) ) { $this->id = 1; $old_data = strtolower($rec['data']); $app->tpl->setVar("data", $old_data, true); - if ($rec['active'] == 'Y') $app->tpl->setVar("active", "CHECKED"); else $app->tpl->setVar("active", "UNCHECKED"); + //if ($rec['active'] == 'Y') $app->tpl->setVar("active", "CHECKED"); else $app->tpl->setVar("active", "UNCHECKED"); $dmarc_rua = ''; $dmarc_ruf = ''; $dmac_rf = ''; @@ -120,13 +120,13 @@ class page_action extends tform_actions { if (preg_match("/^pct=/", $part)) $dmarc_pct = str_replace('pct=', '', $part); if (preg_match("/^ri=/", $part)) $dmarc_ri = str_replace('ri=', '', $part); } - } + } //set html-values $app->tpl->setVar('domain', $domain_name, true); //create dmarc-policy-list - $dmarc_policy_value = array( + $dmarc_policy_value = array( 'none' => 'dmarc_policy_none_txt', 'quarantine' => 'dmarc_policy_quarantine_txt', 'reject' => 'dmarc_policy_reject_txt', @@ -152,7 +152,7 @@ class page_action extends tform_actions { unset($temp); //create dmarc-adkim-list - $dmarc_adkim_value = array( + $dmarc_adkim_value = array( 'r' => 'dmarc_adkim_r_txt', 's' => 'dmarc_adkim_s_txt', ); @@ -164,7 +164,7 @@ class page_action extends tform_actions { $app->tpl->setVar('dmarc_adkim', $dmarc_adkim_list); //create dmarc-aspf-list - $dmarc_aspf_value = array( + $dmarc_aspf_value = array( 'r' => 'dmarc_aspf_r_txt', 's' => 'dmarc_aspf_s_txt', ); @@ -183,7 +183,7 @@ class page_action extends tform_actions { $app->tpl->setVar("dmarc_ri", $dmarc_ri, true); //create dmarc-sp-list - $dmarc_sp_value = array( + $dmarc_sp_value = array( 'same' => 'dmarc_sp_same_txt', 'none' => 'dmarc_sp_none_txt', 'quarantine' => 'dmarc_sp_quarantine_txt', @@ -226,16 +226,20 @@ class page_action extends tform_actions { $domain_name = rtrim($soa['origin'], '.'); // DMARC requieres at least one active dkim-record... - $sql = "SELECT * FROM dns_rr WHERE name LIKE ? AND type='TXT' AND data like 'v=DKIM1;%' AND active='Y'"; - $temp = $app->db->queryAllRecords($sql, '%._domainkey.'.$domain_name.'.'); + $sql = "SELECT * FROM dns_rr + LEFT JOIN dns_soa ON (dns_rr.zone=dns_soa.id) + WHERE dns_soa.origin = ? AND dns_rr.name LIKE ? AND type='TXT' AND data like 'v=DKIM1;%' AND dns_rr.active='Y'"; + $temp = $app->db->queryAllRecords($sql, $soa['origin'], '%._domainkey%'); if (empty($temp)) { if (isset($app->tform->errorMessage )) $app->tform->errorMessage = '
    ' . $app->tform->errorMessage; $app->tform->errorMessage .= $app->tform->wordbook['dmarc_no_dkim_txt'].$email; } // ... and an active spf-record (this breaks the current draft but DMARC is useless if you use DKIM or SPF - $sql = "SELECT * FROM dns_rr WHERE name LIKE ? AND type='TXT' AND (data LIKE 'v=spf1%' AND active = 'y')"; - $temp = $app->db->queryAllRecords($sql, $domain_name.'.'); + $sql = "SELECT * FROM dns_rr + LEFT JOIN dns_soa ON (dns_rr.zone=dns_soa.id) + WHERE dns_soa.origin = ? AND (dns_rr.name LIKE ? OR dns_rr.name = '') AND type='TXT' AND data like 'v=spf1%' AND dns_rr.active='Y'"; + $temp = $app->db->queryAllRecords($sql, $soa['origin'], $soa['origin']); // abort if more than 1 active spf-records (backward-compatibility) if (is_array($temp[1])) { if (isset($app->tform->errorMessage )) $app->tform->errorMessage = '
    ' . $app->tform->errorMessage; @@ -251,7 +255,7 @@ class page_action extends tform_actions { $this->dataRecord['dmarc_pct'] = $app->functions->intval($this->dataRecord['dmarc_pct']); if ($this->dataRecord['dmarc_pct'] < 0) $this->dataRecord['dmarc_pct'] = 0; if ($this->dataRecord['dmarc_pct'] > 100) $this->dataRecord['dmarc_pct'] = 100; - + //create dmarc-record $dmarc_record[] = 'p='.$this->dataRecord['dmarc_policy']; @@ -270,7 +274,7 @@ class page_action extends tform_actions { unset ($dmarc_rua); unset($temp); } - + if (!empty($this->dataRecord['dmarc_ruf'])) { $dmarc_ruf = explode(' ', $this->dataRecord['dmarc_ruf']); $dmarc_ruf = array_filter($dmarc_ruf); @@ -286,7 +290,7 @@ class page_action extends tform_actions { unset ($dmarc_ruf); unset($temp); } - + $fo_rec = array(); if (isset($this->dataRecord['dmarc_fo0'])) $fo_rec[] = '0'; if (isset($this->dataRecord['dmarc_fo1'])) $fo_rec[] = '1'; @@ -328,7 +332,7 @@ class page_action extends tform_actions { $this->dataRecord['name'] = '_dmarc.' . $soa['origin']; if (isset($this->dataRecord['active'])) $this->dataRecord['active'] = 'Y'; - + // Set the server ID of the rr record to the same server ID as the parent record. $this->dataRecord["server_id"] = $soa["server_id"]; diff --git a/interface/web/dns/dns_dname_edit.php b/interface/web/dns/dns_dname_edit.php new file mode 100644 index 0000000000000000000000000000000000000000..4e97a8632c541bf3d48a9878297ff3b08be8dd2b --- /dev/null +++ b/interface/web/dns/dns_dname_edit.php @@ -0,0 +1,71 @@ +db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE (type = 'CNAME' AND name = ? AND zone = ? and id != ?) OR (type = 'DNAME' AND name = ? AND zone = ? and id != ?) OR (type = 'ALIAS' AND name = ? AND zone = ? and id != ?)", $this->dataRecord["name"], $this->dataRecord["zone"], $this->id, $this->dataRecord["name"], $this->dataRecord["zone"], $this->id, $this->dataRecord["name"], $this->dataRecord["zone"], $this->id); + if($tmp['number'] > 0) return true; + return false; + } + + function onSubmit() { + global $app, $conf; + // Get the parent soa record of the domain + $soa = $app->db->queryOneRecord("SELECT * FROM dns_soa WHERE id = ? AND " . $app->tform->getAuthSQL('r'), $_POST["zone"]); + // Replace @ to example.com. in data field + if($this->dataRecord["data"] === '@') { + $this->dataRecord["data"] = $soa['origin']; + } + parent::onSubmit(); + } +} + +$page = new page_action; +$page->onLoad(); + +?> diff --git a/interface/web/dns/dns_edit_base.php b/interface/web/dns/dns_edit_base.php index 9cea8b6ae20b7dc56ef26f592b40b200c983d7e4..61c08f6576a9f6eff032b249728d2a0e2210d56e 100644 --- a/interface/web/dns/dns_edit_base.php +++ b/interface/web/dns/dns_edit_base.php @@ -44,6 +44,29 @@ class dns_page_action extends tform_actions { return false; } + protected function zoneFileEscape( $str ) { + // escape backslash and double quotes + $ret = str_replace( '\\', '\\\\', $str ); + $ret = str_replace( '"', '\\"', $ret ); + return $ret; + } + + protected function zoneFileUnescape( $str ) { + // escape sequence can be rfc 1035 '\DDD' (backslash, 3 digits) or '\X' (backslash, non-digit char) + return preg_replace_callback( '/\\\\(\d\d\d|\D)/', + function( $Matches ) { + if (preg_match( '/\d{3}/', $Matches[1] )) { + return chr( $Matches[1] ); + } elseif (preg_match( '/\D/', $Matches[1])) { + return $Matches[1]; + } else { + return $Matches[0]; + } + }, + $str + ); + } + function onShowNew() { global $app, $conf; @@ -81,7 +104,7 @@ class dns_page_action extends tform_actions { $client_group_id = intval($_SESSION["s"]["user"]["default_group"]); $client = $app->db->queryOneRecord("SELECT limit_dns_record 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 record. if($this->id == 0 && $client["limit_dns_record"] >= 0) { $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE sys_groupid = ?", $client_group_id); if($tmp["number"] >= $client["limit_dns_record"]) { @@ -89,7 +112,17 @@ class dns_page_action extends tform_actions { } } } // end if user is not admin - + + // Replace @ to example.com. + if($this->dataRecord["name"] === '@') { + $this->dataRecord["name"] = $soa['origin']; + } + + // Replace * to *.example.com. + if($this->dataRecord["name"] === '*') { + $this->dataRecord["name"] = '*.' . $soa['origin']; + } + if($this->checkDuplicate()) $app->tform->errorMessage .= $app->tform->lng("data_error_duplicate")."
    "; // Set the server ID of the rr record to the same server ID as the parent record. diff --git a/interface/web/dns/dns_import.php b/interface/web/dns/dns_import.php index 540a731ba24d53f805d35838b801ef2f83ad16d1..b0c19bfff0f9d8228fb557667c99dd08da112ac2 100644 --- a/interface/web/dns/dns_import.php +++ b/interface/web/dns/dns_import.php @@ -34,8 +34,9 @@ require_once '../../lib/app.inc.php'; //* Check permissions for module $app->auth->check_module_permissions('dns'); -$msg = ''; -$error = ''; +$msg = []; +$warn = []; +$error = []; // Loading the template $app->uses('tform,tpl,validate_dns'); @@ -208,6 +209,40 @@ $lng_file = 'lib/lang/'.$app->functions->check_language($_SESSION['s']['language include $lng_file; $app->tpl->setVar($wb); +/** Returns shortest name for an owner with giving $origin in effect */ +function origin_name( $owner, $origin ) { + if ($owner == "@") { return ''; } + if ($owner == "*") { return $owner; } + if ($owner == "") { return $origin; } + if ($origin == "") { return $owner; } + if (substr($owner, -1) == ".") { + if (substr($origin, -1) == ".") { + return substr_replace( $owner, '', 0 - (strlen($origin) + 1) ); + } else { + return $owner; + } + } + if ($origin == ".") { + return "${owner}."; + } + if (substr($origin, -1) != ".") { + // should be an erorr, + // only "." terminated $origin can be handled determinately + return "${owner}.${origin}"; + } + return $owner; + +} + +/** Returns full name for an owner with given $origin in effect */ +function fqdn_name( $owner, $origin ) { + if (substr($owner, -1) == ".") { + return $owner; + } + $name = origin_name( $owner, $origin ); + return $name . (strlen($name) > 0 ? "." : "") . $origin; +} + // Import the zone-file //if(1=="1") if(isset($_FILES['file']['name']) && is_uploaded_file($_FILES['file']['tmp_name'])){ @@ -227,26 +262,34 @@ if(isset($_FILES['file']['name']) && is_uploaded_file($_FILES['file']['tmp_name' // Remove empty lines, comments, whitespace, tabs, etc. $new_lines = array(); foreach($lines as $line){ - $line = trim($line); + $line = rtrim($line); + $line = preg_replace('/^\s+/', ' ', $line); if ($line != '' && substr($line, 0, 1) != ';'){ - if(strpos($line, ";") !== FALSE) { - if(!preg_match("/\"[^\"]+;[^\"]*\"/", $line)) { - $line = substr($line, 0, strpos($line, ";")); + if(preg_match("/\sNAPTR\s/i", $line)) { + // NAPTR contains regex strings, there's not much we can safely clean up. + // remove a comment if found after the ending period (and comment doesn't contain period) + $line = preg_replace( '/^(.+\.)(\s*;[^\.]*)$/', '\1', $line ); + } else { + if(strpos($line, ";") !== FALSE) { + if(!preg_match("/\"[^\"]+;[^\"]*\"/", $line)) { + $line = substr($line, 0, strpos($line, ";")); + } } - } - if(strpos($line, "(") !== FALSE ) { - if (!preg_match("/v=DKIM/",$line)) { - $line = substr($line, 0, strpos($line, "(")); + if(strpos($line, "(") !== FALSE ) { + if (!preg_match("/v=DKIM/",$line)) { + $line = substr($line, 0, strpos($line, "(")); + } } - } - if(strpos($line, ")") !== FALSE ) { - if (!preg_match("/v=DKIM/",$line)) { - $line = substr($line, 0, strpos($line, ")")); + if(strpos($line, ")") !== FALSE ) { + if (!preg_match("/v=DKIM/",$line)) { + $line = substr($line, 0, strpos($line, ")")); + } } } - $line = trim($line); + $line = rtrim($line); if ($line != ''){ + // this of course breaks TXT when it includes whitespace $sPattern = '/\s+/m'; $sReplace = ' '; $new_lines[] = preg_replace($sPattern, $sReplace, $line); @@ -257,29 +300,42 @@ if(isset($_FILES['file']['name']) && is_uploaded_file($_FILES['file']['tmp_name' $lines = $new_lines; unset($new_lines); - //$lines = file("apriqot.se.txt"); - $name = str_replace("txt", "", $_FILES['file']['name']); - $name = str_replace("zone", "", $name); - if ($domain !== NULL){ - $name = $domain; - } - - if (substr($name, -1) != "."){ - $name .= "."; + // SOA name will be the specified domain + $name = origin_name( $domain, '.' ); + } else { + // SOA name will be read from SOA record + $name = '.'; } $i = 0; - $origin_exists = FALSE; + $ttl = 3600; + $soa_ttl = '86400'; $soa_array_key = -1; $soa = array(); $soa['name'] = $name; + $origin = $name; + $owner = $name; $r = 0; $dns_rr = array(); + $add_default_ns = TRUE; + $found_soa = FALSE; foreach($lines as $line){ $parts = explode(' ', $line); + // leading whitespace means same owner as previous record + if ($parts[0] == '') { + // SOA is (only) read from multiple lines + if($i > ($soa_array_key) && $i <= ($soa_array_key + 5)) { + array_shift($parts); + } else { + $parts[0] = $owner; + } + } elseif (strpos( $parts[0], '$' ) !== 0) { + $owner = fqdn_name( $parts[0], $origin ); + } + // make elements lowercase $new_parts = array(); foreach($parts as $part){ @@ -297,46 +353,75 @@ if(isset($_FILES['file']['name']) && is_uploaded_file($_FILES['file']['tmp_name' $parts = $new_parts; unset($new_parts); - // if ORIGIN exists, overwrite $soa['name'] + // Set current $ORIGIN (note: value in file can be a name relative to current origin) if($parts[0] == '$origin'){ - $soa['name'] = $parts[1]; - $origin_exists = TRUE; + $origin = fqdn_name( $parts[1], $origin ); } // TTL if($parts[0] == '$ttl'){ $time_format = strtolower(substr($parts[1], -1)); switch ($time_format) { case 's': - $soa['ttl'] = $app->functions->intval(substr($parts[1], 0, -1)); + $ttl = $app->functions->intval(substr($parts[1], 0, -1)); break; case 'm': - $soa['ttl'] = $app->functions->intval(substr($parts[1], 0, -1)) * 60; + $ttl = $app->functions->intval(substr($parts[1], 0, -1)) * 60; break; case 'h': - $soa['ttl'] = $app->functions->intval(substr($parts[1], 0, -1)) * 3600; + $ttl = $app->functions->intval(substr($parts[1], 0, -1)) * 3600; break; case 'd': - $soa['ttl'] = $app->functions->intval(substr($parts[1], 0, -1)) * 86400; + $ttl = $app->functions->intval(substr($parts[1], 0, -1)) * 86400; break; case 'w': - $soa['ttl'] = $app->functions->intval(substr($parts[1], 0, -1)) * 604800; + $ttl = $app->functions->intval(substr($parts[1], 0, -1)) * 604800; break; default: - $soa['ttl'] = $app->functions->intval($parts[1]); + $ttl = $app->functions->intval($parts[1]); } + $soa_ttl = $ttl; unset($time_format); } // SOA if(in_array("soa", $parts)){ - $soa['mbox'] = array_pop($parts); - //$soa['ns'] = array_pop($parts); - $soa['ns'] = $servers[0]['server_name']; - // if domain is part of SOA, overwrite $soa['name'] - if($parts[0] != '@' && $parts[0] != 'in' && $parts[0] != 'soa' && $origin_exists === FALSE){ - $soa['name'] = $parts[0]; + // Check for multiple SOA records in file + if($found_soa && $soa_array_key != -1){ + // we could just skip any SOA which doesn't match the domain name, + // which would allow concating zone files (sub1.d.tld, sub2.d.tld, d.tld) together for import + $error[] = $wb['zone_file_multiple_soa']; + $valid_zone_file = FALSE; + } else { + $soa['mbox'] = array_pop($parts); + + //$soa['ns'] = array_pop($parts); + $soa['ns'] = $servers[0]['server_name']; + + // $parts[0] will always be owner name + $soa_domain = fqdn_name( $parts[0], $origin ); + + if ($domain !== NULL){ + // domain was given, check that domain and SOA domain share some root + if ( ( strpos( $soa_domain, origin_name( $domain, '.' ) ) !== FALSE ) + || ( strpos( origin_name( $domain, '.' ), $soa_domain ) !== FALSE ) ) { + $valid_zone_file = TRUE; + } + } else { + // domain not given, use domain from SOA + if($soa_domain != ".") { + $soa['name'] = $soa_domain; + $valid_zone_file = TRUE; + } + } + + if(is_numeric($parts[1])){ + $soa['ttl'] = $app->functions->intval($parts[1]); + } else { + $soa['ttl'] = $soa_ttl; + } + + $found_soa = TRUE; + $soa_array_key = $i; } - $soa_array_key = $i; - $valid_zone_file = TRUE; } // SERIAL if($i == ($soa_array_key + 1)) $soa['serial'] = $app->functions->intval($parts[0]); @@ -438,197 +523,120 @@ if(isset($_FILES['file']['name']) && is_uploaded_file($_FILES['file']['tmp_name' } // RESOURCE RECORDS if($i > ($soa_array_key + 5)){ - if(substr($parts[0], -1) == '.' || $parts[0] == '@' || ($parts[0] != 'a' && $parts[0] != 'aaaa' && $parts[0] != 'ns' && $parts[0] != 'cname' && $parts[0] != 'hinfo' && $parts[0] != 'mx' && $parts[0] != 'naptr' && $parts[0] != 'ptr' && $parts[0] != 'rp' && $parts[0] != 'srv' && $parts[0] != 'txt')){ - if(is_numeric($parts[1])){ - if($parts[2] == 'in'){ - $resource_type = $parts[3]; - $pkey = 3; - } else { - $resource_type = $parts[2]; - $pkey = 2; - } - } else { - if($parts[1] == 'in'){ - $resource_type = $parts[2]; - $pkey = 2; - } else { - $resource_type = $parts[1]; - $pkey = 1; - } - } - $dns_rr[$r]['type'] = $resource_type; - if($parts[0] == '@' || $parts[0] == '.'){ - $dns_rr[$r]['name'] = $soa['name']; - } else { - $dns_rr[$r]['name'] = $parts[0]; - } - if(is_numeric($parts[1])){ - $dns_rr[$r]['ttl'] = $app->functions->intval($parts[1]); - } else { - $dns_rr[$r]['ttl'] = $soa['ttl']; - } - switch ($resource_type) { - case 'mx': - case 'srv': - $dns_rr[$r]['aux'] = $app->functions->intval($parts[$pkey+1]); - $dns_rr[$r]['data'] = implode(' ', array_slice($parts, $pkey+2)); - break; - case 'txt': - $dns_rr[$r]['aux'] = 0; - $dns_rr[$r]['data'] = implode(' ', array_slice($parts, $pkey+1)); - if(substr($dns_rr[$r]['data'], 0, 1) == '"') $dns_rr[$r]['data'] = substr($dns_rr[$r]['data'], 1); - if(substr($dns_rr[$r]['data'], -1) == '"') $dns_rr[$r]['data'] = substr($dns_rr[$r]['data'], 0, -1); - break; - default: - $dns_rr[$r]['aux'] = 0; - $dns_rr[$r]['data'] = implode(' ', array_slice($parts, $pkey+1)); - } + + $dns_rr[$r]['name'] = fqdn_name( $owner, $soa['name'] ); + array_shift($parts); // shift record owner from $parts[0] + + if(is_numeric($parts[0])) { + $dns_rr[$r]['ttl'] = $app->functions->intval($parts[0]); + array_shift($parts); // shift ttl from $parts[0] } else { - // a 3600 IN A 1.2.3.4 - if(is_numeric($parts[1]) && $parts[2] == 'in' && ($parts[3] == 'a' || $parts[3] == 'aaaa' || $parts[3] == 'ns'|| $parts[3] == 'cname' || $parts[3] == 'hinfo' || $parts[3] == 'mx' || $parts[3] == 'naptr' || $parts[3] == 'ptr' || $parts[3] == 'rp' || $parts[3] == 'srv' || $parts[3] == 'txt')){ - $resource_type = $parts[3]; - $pkey = 3; - $dns_rr[$r]['type'] = $resource_type; - $dns_rr[$r]['name'] = $parts[0]; - $dns_rr[$r]['ttl'] = $app->functions->intval($parts[1]); - switch ($resource_type) { - case 'mx': - case 'srv': - $dns_rr[$r]['aux'] = $app->functions->intval($parts[$pkey+1]); - $dns_rr[$r]['data'] = implode(' ', array_slice($parts, $pkey+2)); - break; - case 'txt': - $dns_rr[$r]['aux'] = 0; - $dns_rr[$r]['data'] = implode(' ', array_slice($parts, $pkey+1)); - if(substr($dns_rr[$r]['data'], 0, 1) == '"') $dns_rr[$r]['data'] = substr($dns_rr[$r]['data'], 1); - if(substr($dns_rr[$r]['data'], -1) == '"') $dns_rr[$r]['data'] = substr($dns_rr[$r]['data'], 0, -1); - break; - default: - $dns_rr[$r]['aux'] = 0; - $dns_rr[$r]['data'] = implode(' ', array_slice($parts, $pkey+1)); - } - } - // a IN A 1.2.3.4 - elseif($parts[1] == 'in' && ($parts[2] == 'a' || $parts[2] == 'aaaa' || $parts[2] == 'ns'|| $parts[2] == 'cname' || $parts[2] == 'hinfo' || $parts[2] == 'mx' || $parts[2] == 'naptr' || $parts[2] == 'ptr' || $parts[2] == 'rp' || $parts[2] == 'srv' || $parts[2] == 'txt')){ - $resource_type = $parts[2]; - $pkey = 2; - $dns_rr[$r]['type'] = $resource_type; - $dns_rr[$r]['name'] = $parts[0]; - $dns_rr[$r]['ttl'] = $soa['ttl']; - switch ($resource_type) { - case 'mx': - case 'srv': - $dns_rr[$r]['aux'] = $app->functions->intval($parts[$pkey+1]); - $dns_rr[$r]['data'] = implode(' ', array_slice($parts, $pkey+2)); - break; - case 'txt': - $dns_rr[$r]['aux'] = 0; - $dns_rr[$r]['data'] = implode(' ', array_slice($parts, $pkey+1)); - if(substr($dns_rr[$r]['data'], 0, 1) == '"') $dns_rr[$r]['data'] = substr($dns_rr[$r]['data'], 1); - if(substr($dns_rr[$r]['data'], -1) == '"') $dns_rr[$r]['data'] = substr($dns_rr[$r]['data'], 0, -1); - break; - default: - $dns_rr[$r]['aux'] = 0; - $dns_rr[$r]['data'] = implode(' ', array_slice($parts, $pkey+1)); - } - } - // a 3600 A 1.2.3.4 - elseif(is_numeric($parts[1]) && ($parts[2] == 'a' || $parts[2] == 'aaaa' || $parts[2] == 'ns'|| $parts[2] == 'cname' || $parts[2] == 'hinfo' || $parts[2] == 'mx' || $parts[2] == 'naptr' || $parts[2] == 'ptr' || $parts[2] == 'rp' || $parts[2] == 'srv' || $parts[2] == 'txt')){ - $resource_type = $parts[2]; - $pkey = 2; - $dns_rr[$r]['type'] = $resource_type; - $dns_rr[$r]['name'] = $parts[0]; - $dns_rr[$r]['ttl'] = $app->functions->intval($parts[1]); - switch ($resource_type) { - case 'mx': - case 'srv': - $dns_rr[$r]['aux'] = $app->functions->intval($parts[$pkey+1]); - $dns_rr[$r]['data'] = implode(' ', array_slice($parts, $pkey+2)); - break; - case 'txt': - $dns_rr[$r]['aux'] = 0; - $dns_rr[$r]['data'] = implode(' ', array_slice($parts, $pkey+1)); - if(substr($dns_rr[$r]['data'], 0, 1) == '"') $dns_rr[$r]['data'] = substr($dns_rr[$r]['data'], 1); - if(substr($dns_rr[$r]['data'], -1) == '"') $dns_rr[$r]['data'] = substr($dns_rr[$r]['data'], 0, -1); - break; - default: - $dns_rr[$r]['aux'] = 0; - $dns_rr[$r]['data'] = implode(' ', array_slice($parts, $pkey+1)); - } - } - // A 1.2.3.4 - // MX 10 mail - // TXT "v=spf1 a mx ptr -all" - else { - $resource_type = $parts[0]; - $pkey = 0; - $dns_rr[$r]['type'] = $resource_type; - $dns_rr[$r]['name'] = $soa['name']; - $dns_rr[$r]['ttl'] = $soa['ttl']; - switch ($resource_type) { - case 'mx': - case 'srv': - $dns_rr[$r]['aux'] = $app->functions->intval($parts[$pkey+1]); - $dns_rr[$r]['data'] = implode(' ', array_slice($parts, $pkey+2)); - break; - case 'txt': - $dns_rr[$r]['aux'] = 0; - $dns_rr[$r]['data'] = implode(' ', array_slice($parts, $pkey+1)); - if(substr($dns_rr[$r]['data'], 0, 1) == '"') $dns_rr[$r]['data'] = substr($dns_rr[$r]['data'], 1); - if(substr($dns_rr[$r]['data'], -1) == '"') $dns_rr[$r]['data'] = substr($dns_rr[$r]['data'], 0, -1); - break; - default: - $dns_rr[$r]['aux'] = 0; - $dns_rr[$r]['data'] = implode(' ', array_slice($parts, $pkey+1)); - } - } + $dns_rr[$r]['ttl'] = $ttl; } - $dns_rr[$r]['type'] = strtoupper($dns_rr[$r]['type']); - if($dns_rr[$r]['type'] == 'NS' && $dns_rr[$r]['name'] == $soa['name']){ + + if($parts[0] == 'in'){ + array_shift($parts); // shift class from $parts[0] + } elseif (in_array( $parts[0], [ 'ch', 'hs', ] )) { + $warn[] = $wb['ignore_record_not_class_in'] . " ($owner " . strtoupper($parts[0]) . ")"; unset($dns_rr[$r]); + continue; } - - $valid = true; + + // A 1.2.3.4 + // MX 10 mail + // TXT "v=spf1 a mx ptr -all" + $resource_type = array_shift($parts); + switch ($resource_type) { + case 'mx': + case 'srv': + case 'naptr': + $dns_rr[$r]['aux'] = $app->functions->intval(array_shift($parts)); + $dns_rr[$r]['data'] = implode(' ', $parts); + break; + case 'txt': + $dns_rr[$r]['aux'] = 0; + $dns_rr[$r]['data'] = implode(' ', $parts); + $dns_rr[$r]['data'] = preg_replace( [ '/^\"/', '/\"$/' ], '', $dns_rr[$r]['data']); + break; + default: + $dns_rr[$r]['aux'] = 0; + $dns_rr[$r]['data'] = implode(' ', $parts); + } + + $dns_rr[$r]['type'] = strtoupper($resource_type); + + if($dns_rr[$r]['type'] == 'NS' && fqdn_name( $dns_rr[$r]['name'], $soa['name'] ) == $soa['name']){ + $add_default_ns = FALSE; + } + $dns_rr[$r]['ttl'] = $app->functions->intval($dns_rr[$r]['ttl']); $dns_rr[$r]['aux'] = $app->functions->intval($dns_rr[$r]['aux']); - $dns_rr[$r]['data'] = strip_tags($dns_rr[$r]['data']); - if(!preg_match('/^[a-zA-Z0-9\.\-\*]{0,64}$/',$dns_rr[$r]['name'])) $valid == false; - if(!in_array(strtoupper($dns_rr[$r]['type']),array('A','AAAA','ALIAS','CNAME','DS','HINFO','LOC','MX','NAPTR','NS','PTR','RP','SRV','TXT','TLSA','DNSKEY'))) $valid == false; - if($valid == false) unset($dns_rr[$r]); + + // this really breaks NAPTR .. conceivably TXT, too. + // just make sure data is encoded when saved and escaped when displayed/used + if(!in_array($dns_rr[$r]['type'],array('NAPTR','TXT',))) { + $dns_rr[$r]['data'] = strip_tags($dns_rr[$r]['data']); + } + + // regex based on https://stackoverflow.com/questions/3026957/how-to-validate-a-domain-name-using-regex-php + // probably should find something better that covers valid syntax, moreso than just valid hostnames + if(!preg_match('/^(|@|\*|(?!\-)(?:(\*|(?:[a-zA-Z\d_][a-zA-Z\d\-_]{0,61})?[a-zA-Z\d_])\.){1,126}(?!\d+)[a-zA-Z\d_]{1,63}\.?)$/',$dns_rr[$r]['name'])) { + $error[] = $wb['ignore_record_invalid_owner'] . " (" . htmlspecialchars($dns_rr[$r]['name']) . ")"; + unset( $dns_rr[$r] ); + continue; + } + + if(!in_array($dns_rr[$r]['type'],array('A','AAAA','ALIAS','CNAME','DS','HINFO','LOC','MX','NAPTR','NS','PTR','RP','SRV','TXT','TLSA','DNSKEY'))) { + $error[] = $wb['ignore_record_unknown_type'] . " (" . htmlspecialchars($dns_rr[$r]['type']) . ")"; + unset( $dns_rr[$r] ); + continue; + } $r++; } $i++; } - foreach ($servers as $server){ - $dns_rr[$r]['name'] = $soa['name']; - $dns_rr[$r]['type'] = 'NS'; - $dns_rr[$r]['data'] = $server['server_name']; - $dns_rr[$r]['aux'] = 0; - $dns_rr[$r]['ttl'] = $soa['ttl']; - $r++; + if ( $add_default_ns ) { + foreach ($servers as $server){ + $dns_rr[$r]['name'] = $soa['name']; + $dns_rr[$r]['type'] = 'NS'; + $dns_rr[$r]['data'] = $server['server_name']; + $dns_rr[$r]['aux'] = 0; + $dns_rr[$r]['ttl'] = $soa['ttl']; + $r++; + } } //print('
    ');
     	//print_r($dns_rr);
     	//print('
    '); + if (!$found_soa) { + $valid_zone_file = false; + $error[] = $wb['zone_file_missing_soa']; + } + if (intval($soa['serial']) == 0 + || (intval($soa['refresh']) == 0 && intval($soa['retry']) == 0 && intval($soa['expire']) == 0 && intval($soa['minimum']) == 0 ) + ) { + $valid_zone_file = false; + $error[] = $wb['zone_file_soa_parser']; +$error[] = print_r( $soa, true ); + } + if ($settings['use_domain_module'] == 'y' && ! $app->tools_sites->checkDomainModuleDomain($soa['name']) ) { + $valid_zone_file = false; + $error[] = $wb['zone_not_allowed']; + } // Insert the soa record $sys_userid = $_SESSION['s']['user']['userid']; - $origin = $soa['name']; - $ns = $soa['ns']; - $mbox = $soa['mbox']; - $refresh = $soa['refresh']; - $retry = $soa['retry']; - $expire = $soa['expire']; - $minimum = $soa['minimum']; - $ttl = isset($soa['ttl']) ? $soa['ttl'] : '86400'; $xfer = ''; $serial = $app->functions->intval($soa['serial']+1); //print_r($soa); //die(); - if($valid_zone_file){ + $records = $app->db->queryAllRecords("SELECT id FROM dns_soa WHERE origin = ?", $soa['name']); + if (count($records) > 0) { + $error[] = $wb['zone_already_exists']; + } elseif ($valid_zone_file) { $insert_data = array( "sys_userid" => $sys_userid, "sys_groupid" => $sys_groupid, @@ -636,15 +644,15 @@ if(isset($_FILES['file']['name']) && is_uploaded_file($_FILES['file']['tmp_name' "sys_perm_group" => 'riud', "sys_perm_other" => '', "server_id" => $server_id, - "origin" => $origin, - "ns" => $ns, - "mbox" => $mbox, + "origin" => $soa['name'], + "ns" => $soa['ns'], + "mbox" => $soa['mbox'], "serial" => $serial, - "refresh" => $refresh, - "retry" => $retry, - "expire" => $expire, - "minimum" => $minimum, - "ttl" => $ttl, + "refresh" => $soa['refresh'], + "retry" => $soa['retry'], + "expire" => $soa['expire'], + "minimum" => $soa['minimum'], + "ttl" => $soa['ttl'], "active" => 'Y', "xfer" => $xfer ); @@ -655,6 +663,11 @@ if(isset($_FILES['file']['name']) && is_uploaded_file($_FILES['file']['tmp_name' { foreach($dns_rr as $rr) { + // ensure record name is within $soa['name'] zone + if(fqdn_name( $rr['name'], $soa['name'] ) != $soa['name'] + && (strpos( fqdn_name( $rr['name'], $soa['name'] ), ".".$soa['name'] ) === FALSE ) ){ + continue; + } $insert_data = array( "sys_userid" => $sys_userid, "sys_groupid" => $sys_groupid, @@ -663,7 +676,7 @@ if(isset($_FILES['file']['name']) && is_uploaded_file($_FILES['file']['tmp_name' "sys_perm_other" => '', "server_id" => $server_id, "zone" => $dns_soa_id, - "name" => $rr['name'], + "name" => origin_name( $rr['name'], $soa['name'] ), "type" => $rr['type'], "data" => $rr['data'], "aux" => $rr['aux'], @@ -672,21 +685,39 @@ if(isset($_FILES['file']['name']) && is_uploaded_file($_FILES['file']['tmp_name' ); $dns_rr_id = $app->db->datalogInsert('dns_rr', $insert_data, 'id'); } + + $msg[] = $wb['zone_file_successfully_imported_txt']; + } elseif (is_array($dns_rr)) { + $error[] = $wb['zone_file_import_fail']; + } else { + $msg[] = $wb['zone_file_successfully_imported_txt']; } - $msg .= $wb['zone_file_successfully_imported_txt']; } else { - $error .= $wb['error_no_valid_zone_file_txt']; + $error[] = $wb['error_no_valid_zone_file_txt']; } //header('Location: /dns/dns_soa_edit.php?id='.$dns_soa_id); } else { if(isset($_FILES['file']['name'])) { - $error = $wb['no_file_uploaded_error']; + $error[] = $wb['no_file_uploaded_error']; } } +$_error=''; +if (count($error) > 0) { + // this markup should really be moved to ispconfig.js + $_error = '
    ' . implode( '
    ', $error) . '
    '; +} +if (count($warn) > 0) { + // and add a 'warn' variable to templates and ispconfig.js + $_error = '
    ' . implode( '
    ', $warn) . '
    '; +} +$app->tpl->setVar('error', $_error); -$app->tpl->setVar('msg', $msg); -$app->tpl->setVar('error', $error); +$_msg=''; +if (count($msg) > 0) { + $_msg = '
    ' . implode( '
    ', $msg) . '
    '; +} +$app->tpl->setVar('msg', $_msg); $app->tpl_defaults(); $app->tpl->pparse(); diff --git a/interface/web/dns/dns_naptr_edit.php b/interface/web/dns/dns_naptr_edit.php new file mode 100644 index 0000000000000000000000000000000000000000..99001ac8c528abf17691359afc76c2dd2f9a70c5 --- /dev/null +++ b/interface/web/dns/dns_naptr_edit.php @@ -0,0 +1,100 @@ +dataRecord['data'] = $this->dataRecord['pref'] .' '. + '"'. $this->zoneFileEscape( $this->dataRecord['flags'] ) .'" '. + '"'. $this->zoneFileEscape( $this->dataRecord['service'] ) .'" '. + '"'. $this->zoneFileEscape( $this->dataRecord['regexp'] ) .'" '. + $this->dataRecord['replacement'] . (substr( $this->dataRecord['replacement'], -1 ) == '.' ? '' : '.'); + + $this->dataRecord['aux'] = $this->dataRecord['order']; + + parent::onSubmit(); + } + + + function onShowEnd() { + global $app, $conf; + + // Split the parts of NAPTR record, unescape (backslashes), and unquote to edit. + // + // Examples: + // ;; order pref flags service regexp replacement + // IN NAPTR 100 10 "" "" "!^cid:.+@([^\.]+\.)(.*)$!\2!i" . + // + // ;; order pref flags service regexp replacement + // IN NAPTR 100 100 "s" "thttp+L2R" "" thttp.example.com. + // IN NAPTR 100 100 "s" "ftp+L2R" "" ftp.example.com. + // + // 'order' in stored in 'aux' column, + // all of 'pref "flags" "service" "regexp" replacement.' is here in 'data' + // + $matched = preg_match('/^\s*(\d+)\s+"([a-zA-Z0-9]*)"\s+"([^"]*)"\s+"(.*)"\s+([^\s]*\.)\s*$/', $this->dataRecord['data'], $matches); + + if ($matched === FALSE || is_array($matches) && count($matches) == 0) { + if ( isset($app->tform->errorMessage) ) { + $app->tform->errorMessage .= '
    ' . $app->tform->wordbook["record_parse_error"]; + } + } else { + $app->tpl->setVar('pref', $matches[1], true); + $app->tpl->setVar('flags', $this->zoneFileUnescape($matches[2]), true); + $app->tpl->setVar('service', $this->zoneFileUnescape($matches[3]), true); + $app->tpl->setVar('regexp', $this->zoneFileUnescape($matches[4]), true); + $app->tpl->setVar('replacement', $matches[5], true); + } + + parent::onShowEnd(); + } + +} + +$page = new page_action; +$page->onLoad(); + +?> diff --git a/interface/web/dns/dns_slave_edit.php b/interface/web/dns/dns_slave_edit.php index 117b101b875de812e10160b1bfe37031164cecb8..020a044593154d85bfc011a9e52f106e4db8b04c 100644 --- a/interface/web/dns/dns_slave_edit.php +++ b/interface/web/dns/dns_slave_edit.php @@ -124,7 +124,7 @@ class page_action extends tform_actions { * The domain-module is in use. */ $domains = $app->tools_sites->getDomainModuleDomains("dns_slave", $this->dataRecord["origin"]); - $domain_select = ''; + $domain_select = ""; if(is_array($domains) && sizeof($domains) > 0) { /* We have domains in the list, so create the drop-down-list */ foreach( $domains as $domain) { diff --git a/interface/web/dns/dns_soa_edit.php b/interface/web/dns/dns_soa_edit.php index 9b36daee1500fb07ecf1c8b5f43668be3a063c96..e17571e73612e8db511c303479aa3c87aed0ae8c 100644 --- a/interface/web/dns/dns_soa_edit.php +++ b/interface/web/dns/dns_soa_edit.php @@ -192,7 +192,7 @@ class page_action extends tform_actions { * The domain-module is in use. */ $domains = $app->tools_sites->getDomainModuleDomains("dns_soa", $this->dataRecord["origin"]); - $domain_select = ''; + $domain_select = ""; if(is_array($domains) && sizeof($domains) > 0) { /* We have domains in the list, so create the drop-down-list */ foreach( $domains as $domain) { @@ -296,12 +296,17 @@ function onSubmit() { $this->dataRecord["xfer"] = preg_replace('/\s+/', '', $this->dataRecord["xfer"]); $this->dataRecord["also_notify"] = preg_replace('/\s+/', '', $this->dataRecord["also_notify"]); + + if(isset($this->dataRecord['dnssec_wanted']) && $this->dataRecord['dnssec_wanted'] == 'Y' && $this->dataRecord['dnssec_algo'] == '') $this->dataRecord['dnssec_algo'] = 'ECDSAP256SHA256'; //* Check if a secondary zone with the same name already exists $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_slave WHERE origin = ? AND server_id = ?", $this->dataRecord["origin"], $this->dataRecord["server_id"]); if($tmp["number"] > 0) { $app->error($app->tform->wordbook["origin_error_unique"]); } + + //* 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(); } diff --git a/interface/web/dns/dns_spf_edit.php b/interface/web/dns/dns_spf_edit.php index 94096662a1e8e0af7e0e228d322d0c955076b8f2..20626ba159add3f79aeda33fc70502642b2c614f 100644 --- a/interface/web/dns/dns_spf_edit.php +++ b/interface/web/dns/dns_spf_edit.php @@ -72,13 +72,16 @@ class page_action extends tform_actions { } function onShowEnd() { - global $app, $conf; + global $app; + + $id = $app->functions->intval($_GET['id']); - $zone = $app->functions->intval($_GET['zone']); + // if there is no existing SPF record, assume we want a new active record + $app->tpl->setVar('active', 'CHECKED'); //* check for an existing spf-record - $sql = "SELECT data, active FROM dns_rr WHERE data LIKE 'v=spf1%' AND zone = ? AND " . $app->tform->getAuthSQL('r'); - $rec = $app->db->queryOneRecord($sql, $zone); + $sql = "SELECT data, active FROM dns_rr WHERE id = ? AND " . $app->tform->getAuthSQL('r'); + $rec = $app->db->queryOneRecord($sql, $id); if ( isset($rec) && !empty($rec) ) { $this->id = 1; $old_data = strtolower($rec['data']); @@ -132,7 +135,6 @@ class page_action extends tform_actions { function onSubmit() { global $app, $conf; - // Get the parent soa record of the domain $soa = $app->db->queryOneRecord("SELECT * FROM dns_soa WHERE id = ? AND " . $app->tform->getAuthSQL('r'), $app->functions->intval($_POST["zone"])); @@ -153,8 +155,34 @@ class page_action extends tform_actions { } } } // end if user is not admin + + // Check that the record does not yet exist + $existing_records = $app->db->queryAllRecords("SELECT id FROM dns_rr WHERE zone = ? AND name = ? AND type = 'TXT' AND data LIKE 'v=spf1%'", $_POST['zone'], $_POST['name']); + if (!empty($existing_records)) { + if (count($existing_records) > 1) { + $multiple_existing_records_error_txt = $app->tform->wordbook['spf_record_exists_multiple_txt']; + $multiple_existing_records_error_txt = str_replace('{hostname}', $_POST['name'], $multiple_existing_records_error_txt); + + $app->error($multiple_existing_records_error_txt); + } + + // If there is just one existing record, three things can be going on: + // - if we are adding a new record, show a warning that it already exists and offer to edit it + // - if we are editing an existing record and changing its 'name' field to one that is already existing, also show the warning + // - otherwise we are just editing the existing the record, so there is no need for a warning + $existing_record = array_pop($existing_records); + if (empty($this->dataRecord['id']) || ($this->dataRecord['id'] !== $existing_record['id'])) { + $existing_record_error_txt = $app->tform->wordbook['spf_record_exists_txt']; + $existing_record_error_txt = str_replace('{hostname}', $_POST['name'], $existing_record_error_txt); + $existing_record_error_txt = str_replace('{existing_record_id}', $existing_record['id'], $existing_record_error_txt); + + $app->error($existing_record_error_txt); + } + } + + // Create spf-record + $spf_record = array(); - //create spf-record if (!empty($this->dataRecord['spf_mx'])) { $spf_record[] = 'mx'; } @@ -217,7 +245,6 @@ class page_action extends tform_actions { else $this->dataRecord['data'] = 'v=spf1 ' . $this->dataRecord['spf_mechanism'] . 'all'; unset($temp); - $this->dataRecord['name'] = $soa['origin']; if (isset($this->dataRecord['active'])) $this->dataRecord['active'] = 'Y'; // Set the server ID of the rr record to the same server ID as the parent record. @@ -228,10 +255,6 @@ class page_action extends tform_actions { $this->dataRecord["serial"] = $app->validate_dns->increase_serial($soa["serial"]); $this->dataRecord["stamp"] = date('Y-m-d H:i:s'); - // always update an existing entry - $check=$app->db->queryOneRecord("SELECT * FROM dns_rr WHERE zone = ? AND type = ? AND data LIKE 'v=spf1%' AND name = ?", $this->dataRecord["zone"], $this->dataRecord["type"], $this->dataRecord['name']); - $this->id = $check['id']; - if (!isset($this->dataRecord['active'])) $this->dataRecord['active'] = 'N'; parent::onSubmit(); diff --git a/interface/web/admin/software_repo_edit.php b/interface/web/dns/dns_sshfp_edit.php similarity index 80% rename from interface/web/admin/software_repo_edit.php rename to interface/web/dns/dns_sshfp_edit.php index 6d52da2b56799f0274239b42bba857bd4388ec8b..adce9af9a1a1fa4d97f0d7e83707c20fcd04c4b5 100644 --- a/interface/web/admin/software_repo_edit.php +++ b/interface/web/dns/dns_sshfp_edit.php @@ -1,6 +1,7 @@ auth->check_module_permissions('admin'); -$app->auth->check_security_permissions('admin_allow_software_repo'); -if($conf['demo_mode'] == true) $app->error('This function is disabled in demo mode.'); +require_once './dns_edit_base.php'; // Loading classes -$app->uses('tpl,tform,tform_actions'); -$app->load('tform_actions'); - -class page_action extends tform_actions { +class page_action extends dns_page_action { } diff --git a/interface/web/dns/dns_txt_edit.php b/interface/web/dns/dns_txt_edit.php index 8f61d2bfe725e218df4a2c3d28b06f040e6ca570..7caa27d040c38955bd93d4fedc09b46df9091edd 100644 --- a/interface/web/dns/dns_txt_edit.php +++ b/interface/web/dns/dns_txt_edit.php @@ -44,7 +44,22 @@ require_once './dns_edit_base.php'; // Loading classes class page_action extends dns_page_action { + function onLoad() { + parent::onLoad(); + + // The SPF wizard has a button to edit a record as TXT. We need this to prevent a redirect loop. + if (!empty($_GET['edit_raw'])) { + return; + } + // Redirect to SPF wizard if we detect a SPF record + if ('GET' === $_SERVER['REQUEST_METHOD'] && !empty($this->dataRecord['data'])) { + if ('v=spf1' === mb_substr($this->dataRecord['data'], 0, 6)) { + header(sprintf('Location: dns_spf_edit.php?id=%d', $this->dataRecord['id'])); + exit; + } + } + } } $page = new page_action; diff --git a/interface/web/dns/dns_wizard.php b/interface/web/dns/dns_wizard.php index 17d767550c5555320bf8e5fe19481032c6d26864..90e2fef1c46935ae47968f376d659b0a27cc90d5 100644 --- a/interface/web/dns/dns_wizard.php +++ b/interface/web/dns/dns_wizard.php @@ -197,7 +197,7 @@ if ($domains_settings['use_domain_module'] == 'y') { * The domain-module is in use. */ $domains = $app->tools_sites->getDomainModuleDomains("dns_soa", 'domain'); - $domain_select = ''; + $domain_select = ""; if(is_array($domains) && sizeof($domains) > 0) { /* We have domains in the list, so create the drop-down-list */ foreach( $domains as $domain) { @@ -220,10 +220,10 @@ if ($domains_settings['use_domain_module'] == 'y') { } if($_POST['create'] == 1) { - + //* CSRF Check $app->auth->csrf_token_check(); - + $error = ''; if ($post_server_id) @@ -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').'
    '; - elseif(isset($_POST['domain']) && !preg_match('/^[\w\.\-]{2,64}\.[a-zA-Z0-9\-]{2,30}$/', $_POST['domain'])) $error .= $app->lng('error_domain_regex').'
    '; + elseif(isset($_POST['domain']) && !preg_match('/^[\w\.\-]{1,64}\.[a-zA-Z0-9\-]{2,63}$/', $_POST['domain'])) $error .= $app->lng('error_domain_regex').'
    '; if(isset($_POST['ip']) && $_POST['ip'] == '') $error .= $app->lng('error_ip_empty').'
    '; if(isset($_POST['ipv6']) && $_POST['ipv6'] == '') $error .= $app->lng('error_ipv6_empty').'
    '; + # fixme: this regex is pretty poor for hostname validation if(isset($_POST['ns1']) && $_POST['ns1'] == '') $error .= $app->lng('error_ns1_empty').'
    '; - elseif(isset($_POST['ns1']) && !preg_match('/^[\w\.\-]{2,64}\.[a-zA-Z0-9]{2,30}$/', $_POST['ns1'])) $error .= $app->lng('error_ns1_regex').'
    '; + elseif(isset($_POST['ns1']) && !preg_match('/^[\w\.\-]{1,64}\.[a-zA-Z0-9]{2,63}$/', $_POST['ns1'])) $error .= $app->lng('error_ns1_regex').'
    '; if(isset($_POST['ns2']) && $_POST['ns2'] == '') $error .= $app->lng('error_ns2_empty').'
    '; - elseif(isset($_POST['ns2']) && !preg_match('/^[\w\.\-]{2,64}\.[a-zA-Z0-9]{2,30}$/', $_POST['ns2'])) $error .= $app->lng('error_ns2_regex').'
    '; + elseif(isset($_POST['ns2']) && !preg_match('/^[\w\.\-]{1,64}\.[a-zA-Z0-9]{2,63}$/', $_POST['ns2'])) $error .= $app->lng('error_ns2_regex').'
    '; if(isset($_POST['email']) && $_POST['email'] == '') $error .= $app->lng('error_email_empty').'
    '; elseif(isset($_POST['email']) && filter_var($_POST['email'], FILTER_VALIDATE_EMAIL) === false) $error .= $app->lng('error_email_regex').'
    '; @@ -323,8 +325,10 @@ if($_POST['create'] == 1) { if($_POST['ns1'] != '') $tpl_content = str_replace('{NS1}', $_POST['ns1'], $tpl_content); if($_POST['ns2'] != '') $tpl_content = str_replace('{NS2}', $_POST['ns2'], $tpl_content); if($_POST['email'] != '') $tpl_content = str_replace('{EMAIL}', $_POST['email'], $tpl_content); - $enable_dnssec = (($_POST['dnssec'] == 'Y') ? 'Y' : 'N'); - if(isset($_POST['dkim']) && preg_match('/^[\w\.\-\/]{2,255}\.[a-zA-Z0-9\-]{2,30}[\.]{0,1}$/', $_POST['domain'])) { + // $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\.\-\/]{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!='') { @@ -339,6 +343,8 @@ if($_POST['create'] == 1) { $section = ''; $vars = array(); $vars['xfer']=''; + $vars['dnssec_wanted']='N'; + $vars['dnssec_algo']='ECDSAP256SHA256'; $dns_rr = array(); foreach($tpl_rows as $row) { $row = trim($row); @@ -398,6 +404,8 @@ if($_POST['create'] == 1) { $xfer = $vars['xfer']; $also_notify = $vars['also_notify']; $update_acl = $vars['update_acl']; + $dnssec_wanted = $vars['dnssec_wanted']; + $dnssec_algo = $vars['dnssec_algo']; $serial = $app->validate_dns->increase_serial(0); $insert_data = array( @@ -420,7 +428,8 @@ if($_POST['create'] == 1) { "xfer" => $xfer, "also_notify" => $also_notify, "update_acl" => $update_acl, - "dnssec_wanted" => $enable_dnssec + "dnssec_wanted" => $dnssec_wanted, + "dnssec_algo" => $dnssec_algo ); $dns_soa_id = $app->db->datalogInsert('dns_soa', $insert_data, 'id'); if($dns_soa_id > 0) $app->plugin->raiseEvent('dns:wizard:on_after_insert', $dns_soa_id); diff --git a/interface/web/dns/form/dns_dname.tform.php b/interface/web/dns/form/dns_dname.tform.php new file mode 100644 index 0000000000000000000000000000000000000000..c78f2dcae03cc7f511a7dbdf54b407234e372f6a --- /dev/null +++ b/interface/web/dns/form/dns_dname.tform.php @@ -0,0 +1,178 @@ + 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"]['dns'] = array ( + 'title' => "DNS DNAME", + 'width' => 100, + 'template' => "templates/dns_dname_edit.htm", + 'fields' => array ( + //################################# + // Begin Datatable fields + //################################# + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'zone' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => @$app->functions->intval($_REQUEST["zone"]), + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'name' => 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') + ), + 'validators' => array ( 0 => array ( 'type' => 'REGEX', + 'regex' => '/^[a-zA-Z0-9\.\-\*\_]{0,255}$/', + 'errmsg'=> 'name_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => 'DNAME', + 'value' => '', + 'width' => '5', + 'maxlength' => '5' + ), + 'data' => 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') + ), + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'data_error_empty'), + 1 => array ( 'type' => 'REGEX', + 'regex' => '/^[a-zA-Z0-9\.\-\_]{1,255}$/', + 'errmsg'=> 'data_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + /* + 'aux' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '0', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + */ + 'ttl' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'RANGE', + 'range' => '60:', + 'errmsg'=> 'ttl_range_error'), + ), + 'default' => '3600', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'Y', + 'value' => array(0 => 'N', 1 => 'Y') + ), + 'stamp' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'serial' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + //################################# + // END Datatable fields + //################################# + ) +); + + + +?> diff --git a/interface/web/dns/form/dns_naptr.tform.php b/interface/web/dns/form/dns_naptr.tform.php new file mode 100644 index 0000000000000000000000000000000000000000..24531dba2c4e8cf3165bb1cb36484acbca2b5f54 --- /dev/null +++ b/interface/web/dns/form/dns_naptr.tform.php @@ -0,0 +1,174 @@ + 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"]['dns'] = array ( + 'title' => "DNS NAPTR", + 'width' => 100, + 'template' => "templates/dns_naptr_edit.htm", + 'fields' => array ( + //################################# + // Begin Datatable fields + //################################# + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'zone' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => @$app->functions->intval($_REQUEST["zone"]), + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'name' => 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') + ), + 'validators' => array ( 0 => array ( 'type' => 'REGEX', + 'regex' => '/^((\*|[a-zA-Z0-9\-_]{1,255})(\.[a-zA-Z0-9\-_]{1,255})*\.?)?$/', + 'errmsg'=> 'name_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '1024' + ), + 'type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => 'NAPTR', + 'value' => '', + 'width' => '5', + 'maxlength' => '5' + ), + 'data' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( + 0 => array ( + 'type' => 'NOTEMPTY', + 'errmsg'=> 'data_error_empty'), + 1 => array ( + 'type' => 'REGEX', + // matching: 'pref "flags" "service" "regexp" replacement.' + 'regex' => '/^\s*(\d+)\s+"([a-zA-Z0-9]*)"\s+"([^"]*)"\s+"(.*)"\s+([^\s]*\.)\s*$/', + 'errmsg'=> 'naptr_error_regex'), + ), + 'default' => '100 "" "" "" .', + 'value' => '', + 'width' => '30', + 'maxlength' => '1024' + ), + 'aux' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '100', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + 'ttl' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'RANGE', + 'range' => '60:', + 'errmsg'=> 'ttl_range_error'), + ), + 'default' => '3600', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'Y', + 'value' => array(0 => 'N', 1 => 'Y') + ), + 'stamp' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'serial' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + //################################# + // END Datatable fields + //################################# + ) +); + + + +?> diff --git a/interface/web/dns/form/dns_slave.tform.php b/interface/web/dns/form/dns_slave.tform.php index 0b4457b700a2f385f0c98782d38c7023daa14f24..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,30}[\.]{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 e56211782a4e4190e5faa347429c33f37787e758..6259cceddb12fe8b511eba64533cf4ccb75f0c6e 100644 --- a/interface/web/dns/form/dns_soa.tform.php +++ b/interface/web/dns/form/dns_soa.tform.php @@ -56,8 +56,33 @@ $form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, $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"]['dns_records'] = array ( + 'title' => "Records", + 'width' => 100, + 'template' => "templates/dns_records_edit.htm", + 'fields' => array ( + //################################# + // Begin Datatable fields + //################################# + + //################################# + // END Datatable fields + //################################# + ), + 'plugins' => array ( + 'dns_records' => array ( + 'class' => 'plugin_listview', + 'options' => array( + 'listdef' => 'list/dns_a.list.php', + 'sqlextwhere' => "zone = ".@$app->functions->intval(@$_REQUEST['id']), + 'sql_order_by' => "ORDER BY type, name" + ) + ) + ) +); + $form["tabs"]['dns_soa'] = array ( - 'title' => "DNS Zone", + 'title' => "Zone settings", 'width' => 100, 'template' => "templates/dns_soa_edit.htm", 'fields' => array ( @@ -95,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,30}[\.]{0,1}$/', + 'regex' => '/^[a-zA-Z0-9\.\-\/]{1,255}\.[a-zA-Z0-9\-]{2,63}[\.]{0,1}$/', 'errmsg'=> 'origin_error_regex'), ), 'default' => '', @@ -219,18 +244,11 @@ $form["tabs"]['dns_soa'] = array ( 'formtype' => 'TEXT', 'validators' => array ( 0 => array ( 'type' => 'CUSTOM', 'class' => 'validate_dns', - 'function' => 'validate_xfer', + 'function' => 'validate_ip', 'allowempty' => 'y', 'separator' => ',', 'errmsg'=> 'xfer_error_regex'), ), - /* - 'validators' => array ( 0 => array ( 'type' => 'ISIP', - 'allowempty' => 'y', - 'separator' => ',', - 'errmsg'=> 'xfer_error_regex'), - ), - */ 'default' => '', 'value' => '', 'width' => '30', @@ -239,7 +257,9 @@ $form["tabs"]['dns_soa'] = array ( 'also_notify' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'TEXT', - 'validators' => array ( 0 => array ( 'type' => 'ISIP', + 'validators' => array ( 0 => array ( 'type' => 'CUSTOM', + 'class' => 'validate_dns', + 'function' => 'validate_ip', 'allowempty' => 'y', 'separator' => ',', 'errmsg'=> 'also_notify_error_regex' @@ -276,6 +296,15 @@ $form["tabs"]['dns_soa'] = array ( 'default' => 'Y', 'value' => array(0 => 'N', 1 => 'Y') ), + 'dnssec_algo' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOXARRAY', + 'separator' => ',', + 'default' => 'ECDSAP256SHA256', + 'value' => array('NSEC3RSASHA1' => '7 (NSEC3RSASHA1)','ECDSAP256SHA256' => '13 (ECDSAP256SHA256)'), + 'width' => '30', + 'maxlength' => '255' + ), 'dnssec_info' => array ( 'datatype' => 'TEXT', 'formtype' => 'TEXTAREA', @@ -294,30 +323,20 @@ $form["tabs"]['dns_soa'] = array ( ) ); -$form["tabs"]['dns_records'] = array ( - 'title' => "Records", - 'width' => 100, - 'template' => "templates/dns_records_edit.htm", - 'fields' => array ( - //################################# - // Begin Datatable fields - //################################# - - //################################# - // END Datatable fields - //################################# - ), - 'plugins' => array ( - 'dns_records' => array ( - 'class' => 'plugin_listview', - 'options' => array( - 'listdef' => 'list/dns_a.list.php', - 'sqlextwhere' => "zone = ".@$app->functions->intval(@$_REQUEST['id']), - 'sql_order_by' => "ORDER BY type, name" - ) +$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/form/dns_spf.tform.php b/interface/web/dns/form/dns_spf.tform.php index 62b6b5283b58dc03f582be5e2f730ee31041e90d..53081b7ccabdf11b10d674abcb3cde1afe5260e4 100644 --- a/interface/web/dns/form/dns_spf.tform.php +++ b/interface/web/dns/form/dns_spf.tform.php @@ -86,7 +86,7 @@ $form["tabs"]['dns'] = array ( 'type' => 'TOLOWER') ), 'validators' => array ( 0 => array ( 'type' => 'REGEX', - 'regex' => '/^[a-zA-Z0-9\.\-\_]{0,255}$/', + 'regex' => '/^(\*\.|[a-zA-Z0-9\.\-\_]){0,255}$/', 'errmsg'=> 'name_error_regex'), ), 'default' => '', diff --git a/interface/web/dns/form/dns_sshfp.tform.php b/interface/web/dns/form/dns_sshfp.tform.php new file mode 100644 index 0000000000000000000000000000000000000000..6a71c6da782812e7876e05fc864764f37a41834f --- /dev/null +++ b/interface/web/dns/form/dns_sshfp.tform.php @@ -0,0 +1,165 @@ + 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"]['dns'] = array ( + 'title' => "DNS SSHFP", + 'width' => 100, + 'template' => "templates/dns_sshfp_edit.htm", + 'fields' => array ( + //################################# + // Begin Datatable fields + //################################# + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'zone' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => @$app->functions->intval($_REQUEST["zone"]), + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'name' => 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') + ), + 'validators' => array ( 0 => array ( 'type' => 'REGEX', + 'regex' => '/^(\*\.|[a-zA-Z0-9\.\-\_]){0,255}$/', + 'errmsg'=> 'name_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => 'SSHFP', + 'value' => '', + 'width' => '5', + 'maxlength' => '5' + ), + 'data' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( + 0 => array ( + 'type' => 'NOTEMPTY', + 'errmsg'=> 'data_error_empty' + ), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'ttl' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'RANGE', + 'range' => '60:', + 'errmsg'=> 'ttl_range_error'), + ), + 'default' => '3600', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'Y', + 'value' => array(0 => 'N', 1 => 'Y') + ), + 'stamp' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'serial' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + //################################# + // END Datatable fields + //################################# + ) +); + +if($_SESSION["s"]["user"]["typ"] == 'admin') { + unset($form["tabs"]['dns']['fields']['data']['validators']); + $form["tabs"]['dns']['fields']['data']['validators'][0]['type'] = 'NOTEMPTY'; + $form["tabs"]['dns']['fields']['data']['validators'][0]['errmsg'] = 'data_error_empty'; + $form["tabs"]['dns']['fields']['data']['maxlength'] = 512; +} +?> diff --git a/interface/web/dns/form/dns_txt.tform.php b/interface/web/dns/form/dns_txt.tform.php index 564e26aa186ad14bd17d39bc41c04b164e5878d5..886d6e5e095b970c4f0fa393979476371bd345b5 100644 --- a/interface/web/dns/form/dns_txt.tform.php +++ b/interface/web/dns/form/dns_txt.tform.php @@ -170,7 +170,7 @@ $form["tabs"]['dns'] = array ( ) ); -if($_SESSION["s"]["user"]["typ"] == 'admin') { +if($app->auth->is_admin()) { unset($form["tabs"]['dns']['fields']['data']['validators']); $form["tabs"]['dns']['fields']['data']['validators'][0]['type'] = 'NOTEMPTY'; $form["tabs"]['dns']['fields']['data']['validators'][0]['errmsg'] = 'data_error_empty'; diff --git a/interface/web/dns/lib/lang/ar.lng b/interface/web/dns/lib/lang/ar.lng index d01b6b31b92b7b87e4675421fad4d0cb3fb89cc3..6ccff298d935d0e5a575d94436a2f2cf4a0d22be 100644 --- a/interface/web/dns/lib/lang/ar.lng +++ b/interface/web/dns/lib/lang/ar.lng @@ -4,10 +4,10 @@ $wb['Zones'] = 'Zones'; $wb['DNS A'] = 'DNS A'; $wb['DNS ALIAS'] = 'DNS ALIAS'; $wb['DNS CNAME'] = 'DNS CNAME'; -$wb['DNS hinfo'] = 'DNS hinfo'; -$wb['DNS mx'] = 'DNS mx'; -$wb['DNS ns'] = 'DNS ns'; -$wb['DNS ptr'] = 'DNS ptr'; +$wb['DNS hinfo'] = 'DNS HINFO'; +$wb['DNS mx'] = 'DNS MX'; +$wb['DNS ns'] = 'DNS NS'; +$wb['DNS ptr'] = 'DNS PTR'; $wb['DNS RP'] = 'DNS RP'; $wb['DNS Zone'] = 'DNS Zone'; $wb['Records'] = 'Records'; diff --git a/interface/web/dns/lib/lang/ar_dns_a.lng b/interface/web/dns/lib/lang/ar_dns_a.lng index 7543672a9482becb158ccc74f22d896e6415ceed..36e5b50eb3836c822c58565386d260e5b581476d 100644 --- a/interface/web/dns/lib/lang/ar_dns_a.lng +++ b/interface/web/dns/lib/lang/ar_dns_a.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'The hostname is empty.'; $wb['name_error_regex'] = 'The hostname has the wrong format.'; $wb['data_error_empty'] = 'IP-Address empty'; $wb['ip_error_wrong'] = 'IP-Address format invalid'; -$wb['data_error_duplicate'] = 'Duplicate A-Record'; +$wb['data_error_duplicate'] = 'Duplicate A, ALIAS or CNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/ar_dns_aaaa.lng b/interface/web/dns/lib/lang/ar_dns_aaaa.lng index 0b7e38ac651ad47bbf8848947f3e1f06810e83f5..41b0d2202127712b17c8517b1f2a5a8f64e6bea9 100644 --- a/interface/web/dns/lib/lang/ar_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/ar_dns_aaaa.lng @@ -11,6 +11,7 @@ $wb['no_zone_perm'] = 'You do not have the permission to add a record to this DN $wb['name_error_empty'] = 'The hostname is empty.'; $wb['name_error_regex'] = 'The hostname has the wrong format.'; $wb['data_error_empty'] = 'IP-Address empty'; +$wb['data_error_duplicate'] = 'Duplicate AAAA, ALIAS or CNAME record'; $wb['ip_error_wrong'] = 'IP-Address format invalid'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/ar_dns_alias.lng b/interface/web/dns/lib/lang/ar_dns_alias.lng index bd4be9f219e66a4e78a408cc6cc5bd06f06c28e7..bf56c86fbe61a4713599eefd0cc739b153c78389 100644 --- a/interface/web/dns/lib/lang/ar_dns_alias.lng +++ b/interface/web/dns/lib/lang/ar_dns_alias.lng @@ -12,5 +12,6 @@ $wb['name_error_empty'] = 'The hostname is empty.'; $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.'; ?> diff --git a/interface/web/dns/lib/lang/ar_dns_caa.lng b/interface/web/dns/lib/lang/ar_dns_caa.lng index 973a97ceb6870404d7c8107002e1738b373362a0..8040cb4d549f3bc060a5b9ace62f711715446b0f 100644 --- a/interface/web/dns/lib/lang/ar_dns_caa.lng +++ b/interface/web/dns/lib/lang/ar_dns_caa.lng @@ -1,7 +1,7 @@ diff --git a/interface/web/dns/lib/lang/ar_dns_dname.lng b/interface/web/dns/lib/lang/ar_dns_dname.lng new file mode 100644 index 0000000000000000000000000000000000000000..483e1d14b5f25a99ab0170d14bb77d9f49e259a6 --- /dev/null +++ b/interface/web/dns/lib/lang/ar_dns_dname.lng @@ -0,0 +1,17 @@ + diff --git a/interface/web/dns/lib/lang/ar_dns_import.lng b/interface/web/dns/lib/lang/ar_dns_import.lng index 8f67eba14c74cf72fbf18fc031dc1896de3fc21a..3fc63992ed75d7262ee09d7726130a858bcf5fed 100644 --- a/interface/web/dns/lib/lang/ar_dns_import.lng +++ b/interface/web/dns/lib/lang/ar_dns_import.lng @@ -4,13 +4,22 @@ $wb['client_txt'] = 'Client'; $wb['btn_save_txt'] = 'Import Zonefile'; $wb['btn_cancel_txt'] = 'Cancel'; $wb['domain_txt'] = 'Domain'; -$wb['zone_file_successfully_imported_txt'] = 'The zone file has successfully been imported!'; -$wb['error_no_valid_zone_file_txt'] = 'This appears to be no valid zone file!'; +$wb['zone_file_successfully_imported_txt'] = 'The zone file has successfully been imported.'; +$wb['error_no_valid_zone_file_txt'] = 'This zone file appears invalid.'; $wb['zonefile_to_import_txt'] = 'Zone File'; -$wb['domain_field_desc_txt'] = 'Can be left empty if domain name is in the filename or the zone-file content.'; +$wb['domain_field_desc_txt'] = 'If empty, domain name is taken from SOA record.'; $wb['title'] = 'Import Zone Files'; $wb['no_file_uploaded_error'] = 'No zonefile uploaded'; $wb['zone_file_import_txt'] = 'Zone File Import'; $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.'; ?> diff --git a/interface/web/dns/lib/lang/ar_dns_naptr.lng b/interface/web/dns/lib/lang/ar_dns_naptr.lng new file mode 100644 index 0000000000000000000000000000000000000000..b39373c13de1d5b288b85d4ebeef8696a09d3af6 --- /dev/null +++ b/interface/web/dns/lib/lang/ar_dns_naptr.lng @@ -0,0 +1,21 @@ + diff --git a/interface/web/dns/lib/lang/ar_dns_soa.lng b/interface/web/dns/lib/lang/ar_dns_soa.lng index 4e93c5b41c13dd95e20cef40dca43881c7f14cb5..4333c3793aa1c144ce4f9da6a0d823700b6e1fa2 100644 --- a/interface/web/dns/lib/lang/ar_dns_soa.lng +++ b/interface/web/dns/lib/lang/ar_dns_soa.lng @@ -7,7 +7,7 @@ $wb['serial_txt'] = 'Serial'; $wb['refresh_txt'] = 'Refresh'; $wb['retry_txt'] = 'Retry'; $wb['expire_txt'] = 'Expire'; -$wb['minimum_txt'] = 'Minimum'; +$wb['minimum_txt'] = 'Minimum (negative cache ttl)'; $wb['ttl_txt'] = 'TTL'; $wb['xfer_txt'] = 'Allow zone transfers to
    these IPs (comma separated list)'; $wb['active_txt'] = 'Active'; @@ -22,7 +22,7 @@ $wb['ns_error_regex'] = 'NS has a invalid format.'; $wb['mbox_error_empty'] = 'Email is empty.'; $wb['mbox_error_regex'] = 'Email format invalid.'; $wb['also_notify_txt'] = 'Also Notify'; -$wb['also_notify_error_regex'] = 'Please use an IP address.'; +$wb['also_notify_error_regex'] = 'Also notify: Please use a valid IP range, one or more IP addresses separated by a comma or use the keyword: any'; $wb['update_acl_txt'] = 'Update ACL'; $wb['seconds_txt'] = 'Seconds'; $wb['eg_domain_tld'] = 'e.g. domain.tld'; @@ -34,11 +34,14 @@ $wb['retry_range_error'] = 'Min. Retry time is 60 seconds.'; $wb['expire_range_error'] = 'Min. Expire time is 60 seconds.'; $wb['minimum_range_error'] = 'Min. Minimum time is 60 seconds.'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; -$wb['xfer_error_regex'] = 'Also notify: Please use an IP address.'; +$wb['xfer_error_regex'] = 'Zone transfers: Please use a valid IP range, one or more IP addresses separated by a comma or use the keyword: any'; $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['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/ar_dns_soa_admin_list.lng b/interface/web/dns/lib/lang/ar_dns_soa_admin_list.lng index 183d1a8349ad9bab096fe27b0f73055fb103ff52..74ba7859000dbc3a9aa24393bdd3415d58e9d597 100644 --- a/interface/web/dns/lib/lang/ar_dns_soa_admin_list.lng +++ b/interface/web/dns/lib/lang/ar_dns_soa_admin_list.lng @@ -7,5 +7,6 @@ $wb['ns_txt'] = 'NS'; $wb['mbox_txt'] = 'Email'; $wb['add_new_record_wizard_txt'] = 'Add new DNS Zone with Wizard'; $wb['add_new_record_txt'] = 'Add new DNS Zone manually'; +$wb['import_zone_file_txt'] = 'Import Zone File'; $wb['sys_groupid_txt'] = 'Client'; ?> diff --git a/interface/web/dns/lib/lang/ar_dns_spf.lng b/interface/web/dns/lib/lang/ar_dns_spf.lng index df8d1fe1453faa2d4decfe0d3dc94cf19ff48458..0cbf77862f6619ad477913cefb5c4b5e248ddae6 100644 --- a/interface/web/dns/lib/lang/ar_dns_spf.lng +++ b/interface/web/dns/lib/lang/ar_dns_spf.lng @@ -1,5 +1,6 @@ edit the existing record?'; +$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'; ?> diff --git a/interface/web/dns/lib/lang/ar_dns_sshfp.lng b/interface/web/dns/lib/lang/ar_dns_sshfp.lng new file mode 100644 index 0000000000000000000000000000000000000000..dc9ad9a00634513f03aec6da53682d2842bae7b6 --- /dev/null +++ b/interface/web/dns/lib/lang/ar_dns_sshfp.lng @@ -0,0 +1,16 @@ + diff --git a/interface/web/dns/lib/lang/ar_dns_wizard.lng b/interface/web/dns/lib/lang/ar_dns_wizard.lng index 800477dbe94ff45ea4d0fc3440778d0b9bbec486..1c416ebddd0d52c95096275332b2e96e7a40ba0d 100644 --- a/interface/web/dns/lib/lang/ar_dns_wizard.lng +++ b/interface/web/dns/lib/lang/ar_dns_wizard.lng @@ -2,7 +2,7 @@ $wb['template_id_txt'] = 'Template'; $wb['server_id_txt'] = 'Server'; $wb['client_txt'] = 'Client'; -$wb['btn_save_txt'] = 'Create DNS Record'; +$wb['btn_save_txt'] = 'Create new DNS zone'; $wb['btn_cancel_txt'] = 'Cancel'; $wb['domain_txt'] = 'Domain'; $wb['email_txt'] = 'Email'; diff --git a/interface/web/dns/lib/lang/bg.lng b/interface/web/dns/lib/lang/bg.lng index 6208f82996b4cc87f2d8ec39865c03c5523a7244..c3b560cd3c65887f346b5b1cf12d3fba0258eca1 100644 --- a/interface/web/dns/lib/lang/bg.lng +++ b/interface/web/dns/lib/lang/bg.lng @@ -4,10 +4,10 @@ $wb['Zones'] = 'Зони'; $wb['DNS A'] = 'DNS A'; $wb['DNS ALIAS'] = 'DNS ALIAS'; $wb['DNS CNAME'] = 'DNS CNAME'; -$wb['DNS hinfo'] = 'DNS hinfo'; -$wb['DNS mx'] = 'DNS mx'; -$wb['DNS ns'] = 'DNS ns'; -$wb['DNS ptr'] = 'DNS ptr'; +$wb['DNS hinfo'] = 'DNS HINFO'; +$wb['DNS mx'] = 'DNS MX'; +$wb['DNS ns'] = 'DNS NS'; +$wb['DNS ptr'] = 'DNS PTR'; $wb['DNS RP'] = 'DNS RP'; $wb['DNS Zone'] = 'DNS Зона'; $wb['Records'] = 'Записи'; diff --git a/interface/web/dns/lib/lang/bg_dns_a.lng b/interface/web/dns/lib/lang/bg_dns_a.lng index e397d9774efceae21c7cb2219e0a66efedc704c8..a6fb74d118351aca801c88fe7a954fa2f0b2fd84 100644 --- a/interface/web/dns/lib/lang/bg_dns_a.lng +++ b/interface/web/dns/lib/lang/bg_dns_a.lng @@ -2,16 +2,16 @@ $wb['server_id_txt'] = 'Сървър'; $wb['zone_txt'] = 'Зона'; $wb['name_txt'] = 'Име на хоста'; -$wb['type_txt'] = 'тип'; -$wb['data_txt'] = 'IP-адрес'; +$wb['type_txt'] = 'Tип'; +$wb['data_txt'] = 'IP адрес'; $wb['ttl_txt'] = 'TTL'; $wb['active_txt'] = 'Активен'; $wb['limit_dns_record_txt'] = 'Максималният брой за DNS записи в твоят профил е достигнат.'; $wb['no_zone_perm'] = 'Нямате права да добавяте записи за DNS в тази зона.'; $wb['name_error_empty'] = 'Полето за хост име е празно.'; $wb['name_error_regex'] = 'Избраното име на хост е в грешен формат.'; -$wb['data_error_empty'] = 'Полето за IP-адреса е празно'; -$wb['ip_error_wrong'] = 'Формата на IP-адреса е грешен'; -$wb['data_error_duplicate'] = 'Дублиран A-Запис'; -$wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; +$wb['data_error_empty'] = 'Полето за IP адреса е празно'; +$wb['ip_error_wrong'] = 'Формата на IP адреса е грешен'; +$wb['data_error_duplicate'] = 'Duplicate A, ALIAS or CNAME record'; +$wb['ttl_range_error'] = 'Минималния TTL е 60 секунди.'; ?> diff --git a/interface/web/dns/lib/lang/bg_dns_aaaa.lng b/interface/web/dns/lib/lang/bg_dns_aaaa.lng index 37ad45726f0aecfc33d70248b4d55d6cd9457d61..2bf4d2c1de064a5eff65a10b4571bb89f2ad7e6e 100644 --- a/interface/web/dns/lib/lang/bg_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/bg_dns_aaaa.lng @@ -11,6 +11,7 @@ $wb['no_zone_perm'] = 'Вие нямате право да добавяте за $wb['name_error_empty'] = 'Полето с имейла е празно.'; $wb['name_error_regex'] = 'The hostname has the wrong format.'; $wb['data_error_empty'] = 'IP-Address empty'; +$wb['data_error_duplicate'] = 'Duplicate AAAA, ALIAS or CNAME record'; $wb['ip_error_wrong'] = 'IP-Address format invalid'; -$wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; +$wb['ttl_range_error'] = 'Минималния TTL е 60 секунди.'; ?> diff --git a/interface/web/dns/lib/lang/bg_dns_alias.lng b/interface/web/dns/lib/lang/bg_dns_alias.lng index 09b6aabac923964282e11b77ea94a1466d530db0..7733eb75bf2b91243a3ace1c59632d20893c1d5a 100644 --- a/interface/web/dns/lib/lang/bg_dns_alias.lng +++ b/interface/web/dns/lib/lang/bg_dns_alias.lng @@ -12,5 +12,6 @@ $wb['name_error_empty'] = 'Полето с имейла е празно.'; $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['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; +$wb['data_error_duplicate'] = 'Duplicate A, AAAA, ALIAS, CNAME, or DNAME record'; +$wb['ttl_range_error'] = 'Минималния TTL е 60 секунди.'; ?> diff --git a/interface/web/dns/lib/lang/bg_dns_caa.lng b/interface/web/dns/lib/lang/bg_dns_caa.lng index 973a97ceb6870404d7c8107002e1738b373362a0..20a8114b3fb9a0855cfb892a6c63870447daf7ce 100644 --- a/interface/web/dns/lib/lang/bg_dns_caa.lng +++ b/interface/web/dns/lib/lang/bg_dns_caa.lng @@ -1,19 +1,19 @@ diff --git a/interface/web/dns/lib/lang/bg_dns_cname.lng b/interface/web/dns/lib/lang/bg_dns_cname.lng index d7de1f0c01172ebe31e221bf78b3bf922a305ad9..c1b8d155e65a143a74704974c7606d8dd02624aa 100644 --- a/interface/web/dns/lib/lang/bg_dns_cname.lng +++ b/interface/web/dns/lib/lang/bg_dns_cname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Полето с имейла е празно.'; $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-Record or CNAME-Record'; -$wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; +$wb['data_error_duplicate'] = 'Duplicate A, AAAA, ALIAS, CNAME, or DNAME record'; +$wb['ttl_range_error'] = 'Минималния TTL е 60 секунди.'; ?> diff --git a/interface/web/dns/lib/lang/bg_dns_dkim.lng b/interface/web/dns/lib/lang/bg_dns_dkim.lng index 4d45fb4fe95d87134331a593c81c6994bafab57c..33de3f1f275df32a6af83ae84b0648c60879147a 100644 --- a/interface/web/dns/lib/lang/bg_dns_dkim.lng +++ b/interface/web/dns/lib/lang/bg_dns_dkim.lng @@ -6,7 +6,7 @@ $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['ttl_range_error'] = 'Минималния TTL е 60 секунди.'; $wb['selector_txt'] = 'DKIM-Selector'; $wb['data_error_empty'] = 'Public-Key missing'; $wb['dkim_selector_empty_txt'] = 'DKIM-Selector is empty'; diff --git a/interface/web/dns/lib/lang/bg_dns_dmarc.lng b/interface/web/dns/lib/lang/bg_dns_dmarc.lng index cf78bb8eed902817caf1e80e9e6e77d9d64b9ab3..9fdeb0b857e3d6f40a68ff97a9bb411c1dc7f18e 100644 --- a/interface/web/dns/lib/lang/bg_dns_dmarc.lng +++ b/interface/web/dns/lib/lang/bg_dns_dmarc.lng @@ -46,5 +46,5 @@ $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['ttl_range_error'] = 'Минималния TTL е 60 секунди.'; ?> diff --git a/interface/web/dns/lib/lang/bg_dns_dname.lng b/interface/web/dns/lib/lang/bg_dns_dname.lng new file mode 100644 index 0000000000000000000000000000000000000000..ccfd6fab3f5fe36a5c89b789ed67fe15c416cfb7 --- /dev/null +++ b/interface/web/dns/lib/lang/bg_dns_dname.lng @@ -0,0 +1,17 @@ + diff --git a/interface/web/dns/lib/lang/bg_dns_ds.lng b/interface/web/dns/lib/lang/bg_dns_ds.lng index c3622dc5b5eaa71ee71e573b6bb83da16aba3892..2de53bbe733ea8b327b510f1631e0bbc68eec3e2 100644 --- a/interface/web/dns/lib/lang/bg_dns_ds.lng +++ b/interface/web/dns/lib/lang/bg_dns_ds.lng @@ -12,6 +12,6 @@ $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['ttl_range_error'] = 'Минималния TTL е 60 секунди.'; $wb['invalid_type_ds'] = 'DS-Record has a wrong format.'; ?> diff --git a/interface/web/dns/lib/lang/bg_dns_hinfo.lng b/interface/web/dns/lib/lang/bg_dns_hinfo.lng index 3c61371f37a8629dfbb1e293f9251ac87f432904..7c722781e3a02e0b9903c3b4af597b54a1cc7bb5 100644 --- a/interface/web/dns/lib/lang/bg_dns_hinfo.lng +++ b/interface/web/dns/lib/lang/bg_dns_hinfo.lng @@ -12,5 +12,5 @@ $wb['name_error_empty'] = 'Полето с имейла е празно.'; $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['ttl_range_error'] = 'Минималния TTL е 60 секунди.'; ?> diff --git a/interface/web/dns/lib/lang/bg_dns_import.lng b/interface/web/dns/lib/lang/bg_dns_import.lng index 848a4f933bc8d24a156996f4b20ddc96acd24b95..7ff3498c44d0847282b2755823bc1270e61964f9 100644 --- a/interface/web/dns/lib/lang/bg_dns_import.lng +++ b/interface/web/dns/lib/lang/bg_dns_import.lng @@ -13,4 +13,13 @@ $wb['no_file_uploaded_error'] = 'Не е качен файла с зоната'; $wb['zone_file_import_txt'] = 'Zone File Import'; $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.'; ?> diff --git a/interface/web/dns/lib/lang/bg_dns_loc.lng b/interface/web/dns/lib/lang/bg_dns_loc.lng index dc9ad9a00634513f03aec6da53682d2842bae7b6..03d08b5c441ce4db20acc52e8fb387f07c24a5d2 100644 --- a/interface/web/dns/lib/lang/bg_dns_loc.lng +++ b/interface/web/dns/lib/lang/bg_dns_loc.lng @@ -12,5 +12,5 @@ $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['ttl_range_error'] = 'Минималния TTL е 60 секунди.'; ?> diff --git a/interface/web/dns/lib/lang/bg_dns_mx.lng b/interface/web/dns/lib/lang/bg_dns_mx.lng index d148871d3a7236fcb8f65598cf73dad174710555..1f17cd3e75ad155ae413415f413cbe98a3f5cf35 100644 --- a/interface/web/dns/lib/lang/bg_dns_mx.lng +++ b/interface/web/dns/lib/lang/bg_dns_mx.lng @@ -14,5 +14,5 @@ $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['ttl_range_error'] = 'Минималния TTL е 60 секунди.'; ?> diff --git a/interface/web/dns/lib/lang/bg_dns_naptr.lng b/interface/web/dns/lib/lang/bg_dns_naptr.lng new file mode 100644 index 0000000000000000000000000000000000000000..51ef611cf7ffd03ea71db53b2d83b4b2b9f6bb7b --- /dev/null +++ b/interface/web/dns/lib/lang/bg_dns_naptr.lng @@ -0,0 +1,21 @@ + diff --git a/interface/web/dns/lib/lang/bg_dns_ns.lng b/interface/web/dns/lib/lang/bg_dns_ns.lng index a39b8236778c416d8278c70a65f56c91e35c8b12..9ace49c8d19e15cb7136a3ec54546422e2a56232 100644 --- a/interface/web/dns/lib/lang/bg_dns_ns.lng +++ b/interface/web/dns/lib/lang/bg_dns_ns.lng @@ -12,5 +12,5 @@ $wb['name_error_empty'] = 'Полето с зона е празно.'; $wb['name_error_regex'] = 'Полето с зона е в грешен формат.'; $wb['data_error_empty'] = 'Полето с nameserver е празно'; $wb['data_error_regex'] = 'Полето с Nameserver е в грешен формат'; -$wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; +$wb['ttl_range_error'] = 'Минималния TTL е 60 секунди.'; ?> diff --git a/interface/web/dns/lib/lang/bg_dns_ptr.lng b/interface/web/dns/lib/lang/bg_dns_ptr.lng index 90be67f0816bc2fc9c1e35743dafcfd7136926b3..dbad3f1cbdc93da80758787629deadc18d9f07b2 100644 --- a/interface/web/dns/lib/lang/bg_dns_ptr.lng +++ b/interface/web/dns/lib/lang/bg_dns_ptr.lng @@ -12,5 +12,5 @@ $wb['name_error_empty'] = 'Полето с името неможе да бъде $wb['name_error_regex'] = 'Полето с името е в грешен формат.'; $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['ttl_range_error'] = 'Минималния TTL е 60 секунди.'; ?> diff --git a/interface/web/dns/lib/lang/bg_dns_rp.lng b/interface/web/dns/lib/lang/bg_dns_rp.lng index 3b60fb0d22de4302e872be7a9020c6ee9c65c9e5..4d6e72041576ee4813a123227b6232b23fdeaf18 100644 --- a/interface/web/dns/lib/lang/bg_dns_rp.lng +++ b/interface/web/dns/lib/lang/bg_dns_rp.lng @@ -12,5 +12,5 @@ $wb['name_error_empty'] = 'Името на хоста е празно.'; $wb['name_error_regex'] = 'Името на хоста е в грешен формат.'; $wb['data_error_empty'] = 'Полето с лице за контакти е празно'; $wb['data_error_regex'] = 'Полето с лице за контакти е в грешен формат'; -$wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; +$wb['ttl_range_error'] = 'Минималния TTL е 60 секунди.'; ?> diff --git a/interface/web/dns/lib/lang/bg_dns_soa.lng b/interface/web/dns/lib/lang/bg_dns_soa.lng index 151e3ead11483260d8acabf8ac729d7b0a5324c4..c1e57edf8b9ffa60b9e6f7ae306a1ebeae2184d7 100644 --- a/interface/web/dns/lib/lang/bg_dns_soa.lng +++ b/interface/web/dns/lib/lang/bg_dns_soa.lng @@ -23,7 +23,7 @@ $wb['mbox_error_empty'] = 'Полето с емайл е празно.'; $wb['mbox_error_regex'] = 'Полето е емайл е в грешен формат.'; $wb['also_notify_txt'] = 'Also Notify'; $wb['update_acl_txt'] = 'Обнови ACL'; -$wb['also_notify_error_regex'] = 'Please use an IP address.'; +$wb['also_notify_error_regex'] = 'Also notify: Please use a valid IP range, one or more IP addresses separated by a comma or use the keyword: any'; $wb['seconds_txt'] = 'Seconds'; $wb['eg_domain_tld'] = 'e.g. domain.tld'; $wb['eg_ns1_domain_tld'] = 'e.g. ns1.domain.tld'; @@ -33,12 +33,15 @@ $wb['refresh_range_error'] = 'Min. Refresh time is 60 seconds.'; $wb['retry_range_error'] = 'Min. Retry time is 60 seconds.'; $wb['expire_range_error'] = 'Min. Expire time is 60 seconds.'; $wb['minimum_range_error'] = 'Min. Minimum time is 60 seconds.'; -$wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; -$wb['xfer_error_regex'] = 'Also notify: Please use an IP address.'; +$wb['ttl_range_error'] = 'Минималния TTL е 60 секунди.'; +$wb['xfer_error_regex'] = 'Zone transfers: Please use a valid IP range, one or more IP addresses separated by a comma or use the keyword: any'; $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['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_admin_list.lng b/interface/web/dns/lib/lang/bg_dns_soa_admin_list.lng index 183d1a8349ad9bab096fe27b0f73055fb103ff52..74ba7859000dbc3a9aa24393bdd3415d58e9d597 100644 --- a/interface/web/dns/lib/lang/bg_dns_soa_admin_list.lng +++ b/interface/web/dns/lib/lang/bg_dns_soa_admin_list.lng @@ -7,5 +7,6 @@ $wb['ns_txt'] = 'NS'; $wb['mbox_txt'] = 'Email'; $wb['add_new_record_wizard_txt'] = 'Add new DNS Zone with Wizard'; $wb['add_new_record_txt'] = 'Add new DNS Zone manually'; +$wb['import_zone_file_txt'] = 'Import Zone File'; $wb['sys_groupid_txt'] = 'Client'; ?> diff --git a/interface/web/dns/lib/lang/bg_dns_spf.lng b/interface/web/dns/lib/lang/bg_dns_spf.lng index df8d1fe1453faa2d4decfe0d3dc94cf19ff48458..220adb1ec893fc5868b03f0ab5716d62c55ce5a0 100644 --- a/interface/web/dns/lib/lang/bg_dns_spf.lng +++ b/interface/web/dns/lib/lang/bg_dns_spf.lng @@ -1,5 +1,6 @@ edit the existing record?'; +$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['ttl_range_error'] = 'Минималния TTL е 60 секунди.'; +$wb['name_error_regex'] = 'The hostname has the wrong format.'; +$wb['btn_edit_as_txt_record_txt'] = 'Edit as TXT record'; ?> diff --git a/interface/web/dns/lib/lang/bg_dns_srv.lng b/interface/web/dns/lib/lang/bg_dns_srv.lng index 136acc424395382b8c21d2e7b3fc7d15be56235b..6ae6d4212a1ddcecac16de2169f02f063f6efd7a 100644 --- a/interface/web/dns/lib/lang/bg_dns_srv.lng +++ b/interface/web/dns/lib/lang/bg_dns_srv.lng @@ -16,5 +16,5 @@ $wb['aux_txt'] = 'Priority'; $wb['target_txt'] = 'Target'; $wb['weight_txt'] = 'Weight'; $wb['port_txt'] = 'Port'; -$wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; +$wb['ttl_range_error'] = 'Минималния TTL е 60 секунди.'; ?> diff --git a/interface/web/dns/lib/lang/bg_dns_sshfp.lng b/interface/web/dns/lib/lang/bg_dns_sshfp.lng new file mode 100644 index 0000000000000000000000000000000000000000..03d08b5c441ce4db20acc52e8fb387f07c24a5d2 --- /dev/null +++ b/interface/web/dns/lib/lang/bg_dns_sshfp.lng @@ -0,0 +1,16 @@ + diff --git a/interface/web/dns/lib/lang/bg_dns_tlsa.lng b/interface/web/dns/lib/lang/bg_dns_tlsa.lng index 3b87e2ad5987236e2159ce12b7494c89d15a6250..fb4734f3132131ae441859840f76708ff2ead7e0 100644 --- a/interface/web/dns/lib/lang/bg_dns_tlsa.lng +++ b/interface/web/dns/lib/lang/bg_dns_tlsa.lng @@ -12,5 +12,5 @@ $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['ttl_range_error'] = 'Минималния TTL е 60 секунди.'; ?> diff --git a/interface/web/dns/lib/lang/bg_dns_txt.lng b/interface/web/dns/lib/lang/bg_dns_txt.lng index 9d3dd134c629d44d9c7fca4d4e49bb877345c59b..d0f0d48a1c0929833ce0be93a2be385dfc018e24 100644 --- a/interface/web/dns/lib/lang/bg_dns_txt.lng +++ b/interface/web/dns/lib/lang/bg_dns_txt.lng @@ -12,7 +12,7 @@ $wb['name_error_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['ttl_range_error'] = 'Минималния TTL е 60 секунди.'; $wb['invalid_type_dkim'] = 'DKIM is not allowed. Use the DKIM button'; $wb['invalid_type_dmarc'] = 'DMARC is not allowed. Use the DMARC button'; $wb['invalid_type_spf'] = 'SPF is not allowed. Use the SPF button.'; diff --git a/interface/web/dns/lib/lang/br.lng b/interface/web/dns/lib/lang/br.lng index 9228373fdf0b75dc3bcb9e1959b59893a9724390..00e0b3138d405eaa9ff1058f1c9e186468b3ee8a 100644 --- a/interface/web/dns/lib/lang/br.lng +++ b/interface/web/dns/lib/lang/br.lng @@ -1,24 +1,34 @@ +$wb['DNS CAA Record'] = 'Registro CAA'; +$wb['DNS DS Record'] = 'Registro DS'; +$wb['DNS DKIM Record'] = 'Registro DKIM'; +$wb['DNS DMARC Record'] = 'Registro DMARC'; +$wb['DNS tlsa'] = 'Registro TLSA'; +$wb['Zone settings'] = 'Configurações da Zona'; +$wb['DNS AAAA'] = 'Registro AAAA'; +$wb['DNS NAPTR'] = 'Registro NAPTR'; +$wb['DNS SPF Record'] = 'Registro SPF'; +$wb['DNS LOC Record'] = 'Registro LOC'; +$wb['DNS DNAME'] = 'Registro DNAME'; +$wb['DNS SSHFP Record'] = 'Registro SSHFP'; diff --git a/interface/web/dns/lib/lang/br_dns_a.lng b/interface/web/dns/lib/lang/br_dns_a.lng index f96cf551e6c8a0ec411052c6959658790beef18f..32e2dab3d3f936297827fe00a0ac763157bbc544 100644 --- a/interface/web/dns/lib/lang/br_dns_a.lng +++ b/interface/web/dns/lib/lang/br_dns_a.lng @@ -6,12 +6,11 @@ $wb['type_txt'] = 'Tipo'; $wb['data_txt'] = 'Endereço IP'; $wb['ttl_txt'] = 'TTL'; $wb['active_txt'] = 'Ativo'; -$wb['limit_dns_record_txt'] = 'O limite de registros dns para esta conta foi alcançado.'; -$wb['no_zone_perm'] = 'Você não tem permissão para adicionar registros dns nesta zona.'; -$wb['name_error_empty'] = 'O nome do host está em branco.'; +$wb['limit_dns_record_txt'] = 'O limite de registros DNS para esta conta foi alcançado.'; +$wb['no_zone_perm'] = 'Você não tem permissão para adicionar registros DNS nesta zona.'; +$wb['name_error_empty'] = 'O nome do host está vazio.'; $wb['name_error_regex'] = 'O nome do host possui formato inválido (somente nomes canônicos são suportados).'; -$wb['data_error_empty'] = 'Endereço IP está em branco.'; +$wb['data_error_empty'] = 'Endereço IP está vazio.'; $wb['ip_error_wrong'] = 'Endereço IP inválido.'; -$wb['data_error_duplicate'] = 'Registro A ou CNAME duplicado.'; +$wb['data_error_duplicate'] = 'Registro A, ALIAS ou CNAME duplicado'; $wb['ttl_range_error'] = 'O TTL mínimo são 60 segundos.'; -?> diff --git a/interface/web/dns/lib/lang/br_dns_a_list.lng b/interface/web/dns/lib/lang/br_dns_a_list.lng index 6387c14cbee7d238e8219731bc74d3f2756e9eb9..c80df0d5a5f4dc06b2daf96dd8cd7f9dc9b7b9f7 100644 --- a/interface/web/dns/lib/lang/br_dns_a_list.lng +++ b/interface/web/dns/lib/lang/br_dns_a_list.lng @@ -12,4 +12,3 @@ $wb['add_new_record_txt'] = 'Adicionar novo registro A'; $wb['page_txt'] = 'Página'; $wb['page_of_txt'] = 'de'; $wb['delete_confirmation'] = 'Tem certeza que deseja remover este registro?'; -?> diff --git a/interface/web/dns/lib/lang/br_dns_aaaa.lng b/interface/web/dns/lib/lang/br_dns_aaaa.lng index 1a3cfb2d2740446bea11ffdc4f98404b225d51cd..b5475c5737e4ea60bb243e78260ebc24b539ab83 100644 --- a/interface/web/dns/lib/lang/br_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/br_dns_aaaa.lng @@ -6,11 +6,11 @@ $wb['type_txt'] = 'Tipo'; $wb['data_txt'] = 'Endereço IPv6'; $wb['ttl_txt'] = 'TTL'; $wb['active_txt'] = 'Ativo'; -$wb['limit_dns_record_txt'] = 'O limite de registros dns para esta conta foi alcançado.'; -$wb['no_zone_perm'] = 'Você não tem permissão para adicionar registros dns nesta zona.'; -$wb['name_error_empty'] = 'O nome do host está em branco.'; +$wb['limit_dns_record_txt'] = 'O limite de registros DNS para esta conta foi alcançado.'; +$wb['no_zone_perm'] = 'Você não tem permissão para adicionar registros DNS nesta zona.'; +$wb['name_error_empty'] = 'O nome do host está vazio.'; $wb['name_error_regex'] = 'O nome do host possui formato inválido (somente nomes canônicos são suportados).'; -$wb['data_error_empty'] = 'Endereço IPv6 está em branco.'; +$wb['data_error_empty'] = 'Endereço IPv6 está vazio.'; +$wb['data_error_duplicate'] = 'Registro AAAA, ALIAS ou CNAME duplicado'; $wb['ip_error_wrong'] = 'O endereço IPv6 possui formato inválido.'; $wb['ttl_range_error'] = 'O TTL mínimo são 60 segundos.'; -?> diff --git a/interface/web/dns/lib/lang/br_dns_alias.lng b/interface/web/dns/lib/lang/br_dns_alias.lng index 46821ee1ae5aeb548a3bc926b0d86d5d82245348..f956a1261a1723759d4daed97f83b467e8d25435 100644 --- a/interface/web/dns/lib/lang/br_dns_alias.lng +++ b/interface/web/dns/lib/lang/br_dns_alias.lng @@ -6,11 +6,11 @@ $wb['type_txt'] = 'Tipo'; $wb['data_txt'] = 'Alvo do host'; $wb['ttl_txt'] = 'TTL'; $wb['active_txt'] = 'Ativo'; -$wb['limit_dns_record_txt'] = 'O limite de registros dns para esta conta foi alcançado.'; -$wb['no_zone_perm'] = 'Você não tem permissão para adicionar registros dns nesta zona.'; -$wb['name_error_empty'] = 'O nome do host está em branco.'; +$wb['limit_dns_record_txt'] = 'O limite de registros DNS para esta conta foi alcançado.'; +$wb['no_zone_perm'] = 'Você não tem permissão para adicionar registros DNS nesta zona.'; +$wb['name_error_empty'] = 'O nome do host está vazio.'; $wb['name_error_regex'] = 'O nome do host possui formato inválido (somente nomes canônicos são suportados).'; -$wb['data_error_empty'] = 'O alvo do host está em branco.'; +$wb['data_error_empty'] = 'O alvo do host está vazio.'; $wb['data_error_regex'] = 'O formato do alvo do host é inválido.'; +$wb['data_error_duplicate'] = 'Registro A, AAAA, ALIAS, CNAME ou DNAME duplicado'; $wb['ttl_range_error'] = 'O TTL mínimo são 60 segundos.'; -?> diff --git a/interface/web/dns/lib/lang/br_dns_caa.lng b/interface/web/dns/lib/lang/br_dns_caa.lng index 16bf267862e92e1422405e6c95cc221d6855864d..efd4ba682d635964755bfab8535c73aef53b60c1 100644 --- a/interface/web/dns/lib/lang/br_dns_caa.lng +++ b/interface/web/dns/lib/lang/br_dns_caa.lng @@ -2,7 +2,7 @@ $wb['ca_list_txt'] = 'Autoridade Certificadora - CA'; $wb['ca_domain_txt'] = 'Domínio'; $wb['ca_hostname_txt'] = 'Nome de hosts adicionais'; -$wb['ca_hostname_note_txt'] = '(separado por vírgulas - em branco para todos os hosts)'; +$wb['ca_hostname_note_txt'] = '(separado por vírgulas - vazio para todos os hosts)'; $wb['ca_options_txt'] = 'Opções adicionais'; $wb['ca_options_note_txt'] = 'solicitado pela CA (lista separado por vírgulas)'; $wb['ca_wildcard_txt'] = 'Usar curingas SSL'; @@ -10,10 +10,9 @@ $wb['ca_critical_txt'] = 'Verificação estrita'; $wb['ttl_txt'] = 'TTL'; $wb['active_txt'] = 'Ativo'; $wb['select_txt'] = 'Selecionar autoridade certificadora'; -$wb['no_zone_perm'] = 'Você não tem permissão para adicionar registros dns nesta zona.'; -$wb['limit_dns_record_txt'] = 'O limite de registros dns para esta conta foi alcançado.'; +$wb['no_zone_perm'] = 'Você não tem permissão para adicionar registros DNS nesta zona.'; +$wb['limit_dns_record_txt'] = 'O limite de registros DNS para esta conta foi alcançado.'; $wb['ca_error_txt'] = 'Nenhuma autoridade certificadora selecionada.'; $wb['caa_exists_error'] = 'Registro CAA já existe.'; $wb['ca_option_error'] = 'Formato inválido para opções adicionais; OPÇÃO=VALOR'; $wb['ttl_range_error'] = 'O TTL mínimo são 60 segundos.'; -?> diff --git a/interface/web/dns/lib/lang/br_dns_cname.lng b/interface/web/dns/lib/lang/br_dns_cname.lng index c4fb0df260691581383407dfa939e9623b203ef2..cbba6dfc117a208714f51ccc25fe69fa2b7ce533 100644 --- a/interface/web/dns/lib/lang/br_dns_cname.lng +++ b/interface/web/dns/lib/lang/br_dns_cname.lng @@ -6,12 +6,11 @@ $wb['type_txt'] = 'Tipo'; $wb['data_txt'] = 'Alvo do host'; $wb['ttl_txt'] = 'TTL'; $wb['active_txt'] = 'Ativo'; -$wb['limit_dns_record_txt'] = 'O limite de registros dns para esta conta foi alcançado.'; -$wb['no_zone_perm'] = 'Você não tem permissão para adicionar registros dns nesta zona.'; -$wb['name_error_empty'] = 'O nome do host está em branco.'; +$wb['limit_dns_record_txt'] = 'O limite de registros DNS para esta conta foi alcançado.'; +$wb['no_zone_perm'] = 'Você não tem permissão para adicionar registros DNS nesta zona.'; +$wb['name_error_empty'] = 'O nome do host está vazio.'; $wb['name_error_regex'] = 'O nome do host possui formato inválido (somente nomes canônicos são suportados).'; -$wb['data_error_empty'] = 'O alvo do host está em branco.'; +$wb['data_error_empty'] = 'O alvo do host está vazio.'; $wb['data_error_regex'] = 'O alvo do host possui formato inválido.'; -$wb['data_error_duplicate'] = 'Registro A ou CNAME duplicado.'; +$wb['data_error_duplicate'] = 'Registro A, AAAA, ALIAS, CNAME ou DNAME duplicado'; $wb['ttl_range_error'] = 'O TTL mínimo são 60 segundos.'; -?> diff --git a/interface/web/dns/lib/lang/br_dns_dkim.lng b/interface/web/dns/lib/lang/br_dns_dkim.lng index a24976194d6ea426bcf597342dc3cccca7fdea29..b8700cf9ab076e0c3c8317e7d77884c60e8ff7e3 100644 --- a/interface/web/dns/lib/lang/br_dns_dkim.lng +++ b/interface/web/dns/lib/lang/br_dns_dkim.lng @@ -2,12 +2,12 @@ $wb['public_key_txt'] = 'Chave Pública'; $wb['ttl_txt'] = 'TTL'; $wb['active_txt'] = 'Ativo'; -$wb['record_exists_txt'] = 'Este registro dns já existe.'; -$wb['dkim_disabled_txt'] = 'Chave DKIM está desabilitada para este domínio de e-mail.'; -$wb['limit_dns_record_txt'] = 'O limite de registros dns para esta conta foi alcançado.'; -$wb['no_zone_perm'] = 'Você não tem permissão para adicionar registros dns nesta zona.'; +$wb['record_exists_txt'] = 'Este registro DNS já existe.'; +$wb['dkim_disabled_txt'] = 'Chave DKIM está desabilitada para este domínio de email.'; +$wb['limit_dns_record_txt'] = 'O limite de registros DNS para esta conta foi alcançado.'; +$wb['no_zone_perm'] = 'Você não tem permissão para adicionar registros DNS nesta zona.'; $wb['ttl_range_error'] = 'O TTL mínimo são 60 segundos.'; $wb['selector_txt'] = 'Seletor DKIM'; $wb['data_error_empty'] = 'Chave pública ausente.'; -$wb['dkim_selector_empty_txt'] = 'Seletor DKIM está em branco.'; -?> +$wb['dkim_selector_empty_txt'] = 'Seletor DKIM está vazio.'; +$wb['DNS DKIM'] = 'Registro DKIM'; diff --git a/interface/web/dns/lib/lang/br_dns_dmarc.lng b/interface/web/dns/lib/lang/br_dns_dmarc.lng index bacd3af25fc6b3869f6acadf167713b1296a00cc..55b16b9fb4de8764191876ccc10ccce70b711a56 100644 --- a/interface/web/dns/lib/lang/br_dns_dmarc.lng +++ b/interface/web/dns/lib/lang/br_dns_dmarc.lng @@ -1,26 +1,26 @@ +$wb['DNS DMARC'] = 'Registro DMARC'; diff --git a/interface/web/dns/lib/lang/br_dns_dname.lng b/interface/web/dns/lib/lang/br_dns_dname.lng new file mode 100644 index 0000000000000000000000000000000000000000..9adc3b42fe8ffb9cff1f9085ed681babdf0706a9 --- /dev/null +++ b/interface/web/dns/lib/lang/br_dns_dname.lng @@ -0,0 +1,16 @@ + +$wb['DNS DS'] = 'Registro DS'; diff --git a/interface/web/dns/lib/lang/br_dns_hinfo.lng b/interface/web/dns/lib/lang/br_dns_hinfo.lng index e7bdfa2f4c8debb543cb64a18260caa45a5ba18f..b7093bd47c052229f2134edc2b1969b218055e88 100644 --- a/interface/web/dns/lib/lang/br_dns_hinfo.lng +++ b/interface/web/dns/lib/lang/br_dns_hinfo.lng @@ -6,11 +6,11 @@ $wb['type_txt'] = 'Tipo'; $wb['data_txt'] = 'Informação do host'; $wb['ttl_txt'] = 'TTL'; $wb['active_txt'] = 'Ativo'; -$wb['limit_dns_record_txt'] = 'O limite de registros dns para esta conta foi alcançado.'; -$wb['no_zone_perm'] = 'Você não tem permissão para adicionar registros dns nesta zona.'; -$wb['name_error_empty'] = 'O nome do host está em branco.'; +$wb['limit_dns_record_txt'] = 'O limite de registros DNS para esta conta foi alcançado.'; +$wb['no_zone_perm'] = 'Você não tem permissão para adicionar registros DNS nesta zona.'; +$wb['name_error_empty'] = 'O nome do host está vazio.'; $wb['name_error_regex'] = 'O nome do host possui formato inválido (somente nomes canônicos são suportados).'; -$wb['data_error_empty'] = 'Informação do host está em branco.'; +$wb['data_error_empty'] = 'Informação do host está vazio.'; $wb['data_error_regex'] = 'Informação do host possui formato inválido.'; $wb['ttl_range_error'] = 'O TTL mínimo são 60 segundos.'; -?> +$wb['DNS HINFO'] = 'Registro HINFO'; diff --git a/interface/web/dns/lib/lang/br_dns_import.lng b/interface/web/dns/lib/lang/br_dns_import.lng index ffcef7d743b9c2e7daf443dd9ab5d30ca4f49784..1bdc7774b52f8137bee8dc5652deb786d88f4559 100644 --- a/interface/web/dns/lib/lang/br_dns_import.lng +++ b/interface/web/dns/lib/lang/br_dns_import.lng @@ -5,12 +5,20 @@ $wb['client_txt'] = 'Cliente'; $wb['btn_save_txt'] = 'Importar arquivo de zona'; $wb['btn_cancel_txt'] = 'Cancelar'; $wb['domain_txt'] = 'Domínio'; -$wb['zone_file_successfully_imported_txt'] = 'O arquivo de zona dns foi importado com sucesso!'; -$wb['error_no_valid_zone_file_txt'] = 'Aparentemente este não é um arquivo de zona dns válido!'; +$wb['zone_file_successfully_imported_txt'] = 'O arquivo de zona DNS foi importado com sucesso!'; +$wb['error_no_valid_zone_file_txt'] = 'Aparentemente este não é um arquivo de zona DNS válido!'; $wb['zonefile_to_import_txt'] = 'Arquivo de Zona'; -$wb['domain_field_desc_txt'] = 'Pode ficar em branco caso o domínio seja o mesmo nome do arquivo ou faz parte do conteúdo do mesmo.'; +$wb['domain_field_desc_txt'] = 'Pode ficar vazio caso o domínio seja o mesmo nome do arquivo ou faz parte do conteúdo do mesmo.'; $wb['title'] = 'Importar arquivo de zona'; -$wb['no_file_uploaded_error'] = 'Nenhum arquivo de zona dns foi carregado.'; +$wb['no_file_uploaded_error'] = 'Nenhum arquivo de zona DNS foi carregado.'; $wb['error_no_server_id'] = 'Nenhum servidor foi informado.'; $wb['error_not_allowed_server_id'] = 'O servidor selecionado não é permitido nesta conta.'; -?> +$wb['zone_already_exists'] = 'Esta zona já existe, você deve remover ou renomear a zona existente primeiro.'; +$wb['zone_not_allowed'] = 'Esta zona não é permitida para esta conta.'; +$wb['zone_file_missing_soa'] = 'A zona deve conter um registro SOA.'; +$wb['zone_file_multiple_soa'] = 'A zona não contém múltiplos registros SOA.'; +$wb['zone_file_soa_parser'] = 'O registro SOA nesta zona não pôde ser processado. Certifique-se de que SERIAL, REFRESH, RETRY, EXPIRE e MINIMUM estão cada um em uma linha separada de outros dados.'; +$wb['ignore_record_not_class_in'] = 'Registro DNS ignorado, sem classe IN.'; +$wb['ignore_record_unknown_type'] = 'Registro DNS ignorado, tipo desconhecido.'; +$wb['ignore_record_invalid_owner'] = 'Registro DNS ignorado, não foi possível validar o proprietário.'; +$wb['zone_file_import_fail'] = 'O arquivo de zona não foi importado.'; diff --git a/interface/web/dns/lib/lang/br_dns_loc.lng b/interface/web/dns/lib/lang/br_dns_loc.lng index f84c2af034680dfa53d7cbad289c9b9f94d373e1..56c1b2b26e88fbb6d19551c951c9990f9939703a 100644 --- a/interface/web/dns/lib/lang/br_dns_loc.lng +++ b/interface/web/dns/lib/lang/br_dns_loc.lng @@ -6,11 +6,11 @@ $wb['type_txt'] = 'Tipo'; $wb['data_txt'] = 'Texto'; $wb['ttl_txt'] = 'TTL'; $wb['active_txt'] = 'Ativo'; -$wb['limit_dns_record_txt'] = 'O limite de registros dns para esta conta foi alcançado.'; -$wb['no_zone_perm'] = 'Você não tem permissão para adicionar registros dns nesta zona.'; -$wb['name_error_empty'] = 'O nome do host está em branco.'; +$wb['limit_dns_record_txt'] = 'O limite de registros DNS para esta conta foi alcançado.'; +$wb['no_zone_perm'] = 'Você não tem permissão para adicionar registros DNS nesta zona.'; +$wb['name_error_empty'] = 'O nome do host está vazio.'; $wb['name_error_regex'] = 'O nome do host possui formato inválido (somente nomes canônicos são suportados).'; -$wb['data_error_empty'] = 'Texto está em branco.'; +$wb['data_error_empty'] = 'Texto está vazio.'; $wb['data_error_regex'] = 'Texto possui formato inválido.'; $wb['ttl_range_error'] = 'O TTL mínimo são 60 segundos.'; -?> +$wb['DNS LOC'] = 'Registro LOC'; diff --git a/interface/web/dns/lib/lang/br_dns_mx.lng b/interface/web/dns/lib/lang/br_dns_mx.lng index 45b721c1a81e1ee076ef864e9180593dfccab5f5..d28b8af5699a25967bd5957c7970f567799adaf1 100644 --- a/interface/web/dns/lib/lang/br_dns_mx.lng +++ b/interface/web/dns/lib/lang/br_dns_mx.lng @@ -3,16 +3,15 @@ $wb['server_id_txt'] = 'Servidor'; $wb['zone_txt'] = 'Zona'; $wb['name_txt'] = 'Nome do host'; $wb['type_txt'] = 'Tipo'; -$wb['data_txt'] = 'Nome do servidor de e-mail'; +$wb['data_txt'] = 'Nome do servidor de email'; $wb['aux_txt'] = 'Prioridade'; $wb['ttl_txt'] = 'TTL'; $wb['active_txt'] = 'Ativo'; -$wb['limit_dns_record_txt'] = 'O limite de registros dns para esta conta foi alcançado.'; -$wb['no_zone_perm'] = 'Você não tem permissão para adicionar registros dns nesta zona.'; -$wb['name_error_empty'] = 'O nome do host está em branco.'; +$wb['limit_dns_record_txt'] = 'O limite de registros DNS para esta conta foi alcançado.'; +$wb['no_zone_perm'] = 'Você não tem permissão para adicionar registros DNS nesta zona.'; +$wb['name_error_empty'] = 'O nome do host está vazio.'; $wb['name_error_regex'] = 'O nome do host possui formato inválido (somente nomes canônicos são suportados).'; -$wb['data_error_empty'] = 'O nome do servidor de e-mails está em branco.'; -$wb['data_error_regex'] = 'O nome do servidor de e-mails possui formato inválido.'; +$wb['data_error_empty'] = 'O nome do servidor de emails está vazio.'; +$wb['data_error_regex'] = 'O nome do servidor de emails possui formato inválido.'; $wb['duplicate_mx_record_txt'] = 'Registro MX duplicado.'; $wb['ttl_range_error'] = 'O TTL mínimo são 60 segundos.'; -?> diff --git a/interface/web/dns/lib/lang/br_dns_naptr.lng b/interface/web/dns/lib/lang/br_dns_naptr.lng new file mode 100644 index 0000000000000000000000000000000000000000..31faa64f9db0a85cf7a961396265a6dc5aad961f --- /dev/null +++ b/interface/web/dns/lib/lang/br_dns_naptr.lng @@ -0,0 +1,20 @@ + diff --git a/interface/web/dns/lib/lang/br_dns_ptr.lng b/interface/web/dns/lib/lang/br_dns_ptr.lng index b6214a62e86fb20acbd17ee63b6ea4c106e6c8ee..f39b65fb2464489f7550c801c0a1bc9fc0188db3 100644 --- a/interface/web/dns/lib/lang/br_dns_ptr.lng +++ b/interface/web/dns/lib/lang/br_dns_ptr.lng @@ -6,11 +6,10 @@ $wb['type_txt'] = 'Tipo'; $wb['data_txt'] = 'Nome canônico para o nome do host'; $wb['ttl_txt'] = 'TTL'; $wb['active_txt'] = 'Ativo'; -$wb['limit_dns_record_txt'] = 'O limite de registros dns para esta conta foi alcançado.'; -$wb['no_zone_perm'] = 'Você não tem permissão para adicionar registros dns nesta zona.'; -$wb['name_error_empty'] = 'O nome está em branco.'; +$wb['limit_dns_record_txt'] = 'O limite de registros DNS para esta conta foi alcançado.'; +$wb['no_zone_perm'] = 'Você não tem permissão para adicionar registros DNS nesta zona.'; +$wb['name_error_empty'] = 'O nome está vazio.'; $wb['name_error_regex'] = 'O nome possui formato inválido.'; -$wb['data_error_empty'] = 'O nome canônico está em branco.'; +$wb['data_error_empty'] = 'O nome canônico está vazio.'; $wb['data_error_regex'] = 'O nome canônico possui formato inválido.'; $wb['ttl_range_error'] = 'O TTL mínimo são 60 segundos.'; -?> diff --git a/interface/web/dns/lib/lang/br_dns_rp.lng b/interface/web/dns/lib/lang/br_dns_rp.lng index 4f782fb4a025c76155dd304461e3229ed4f1b252..e2ba604667c1eebefefaabd08bcbf4c9543b4be8 100644 --- a/interface/web/dns/lib/lang/br_dns_rp.lng +++ b/interface/web/dns/lib/lang/br_dns_rp.lng @@ -6,11 +6,10 @@ $wb['type_txt'] = 'Tipo'; $wb['data_txt'] = 'Responsável técnico'; $wb['ttl_txt'] = 'TTL'; $wb['active_txt'] = 'Ativo'; -$wb['limit_dns_record_txt'] = 'O limite de registros dns para esta conta foi alcançado.'; -$wb['no_zone_perm'] = 'Você não tem permissão para adicionar registros dns nesta zona.'; -$wb['name_error_empty'] = 'O nome do host está em branco.'; +$wb['limit_dns_record_txt'] = 'O limite de registros DNS para esta conta foi alcançado.'; +$wb['no_zone_perm'] = 'Você não tem permissão para adicionar registros DNS nesta zona.'; +$wb['name_error_empty'] = 'O nome do host está vazio.'; $wb['name_error_regex'] = 'O nome do host possui formato inválido (somente nomes canônicos são suportados).'; -$wb['data_error_empty'] = 'Responsável técnico está em branco.'; +$wb['data_error_empty'] = 'Responsável técnico está vazio.'; $wb['data_error_regex'] = 'Responsável técnico possui formato inválido.'; $wb['ttl_range_error'] = 'O TTL mínimo são 60 segundos.'; -?> diff --git a/interface/web/dns/lib/lang/br_dns_slave.lng b/interface/web/dns/lib/lang/br_dns_slave.lng index a71e64c4f282db2a3c8f4f48fe590890e070669f..cff5fc73dd281baf138653a1a56d4e4eca90ea66 100644 --- a/interface/web/dns/lib/lang/br_dns_slave.lng +++ b/interface/web/dns/lib/lang/br_dns_slave.lng @@ -4,14 +4,14 @@ $wb['origin_txt'] = 'Zona DNS'; $wb['secondary_zone_txt'] = 'Zona DNS secundária'; $wb['ns_txt'] = 'NS (Endereço IP)'; $wb['active_txt'] = 'Ativo'; -$wb['limit_dns_slave_zone_txt'] = 'O limite de zonas dns secundárias para esta conta foi alcançado.'; +$wb['limit_dns_slave_zone_txt'] = 'O limite de zonas DNS secundárias para esta conta foi alcançado.'; $wb['client_txt'] = 'Cliente'; $wb['xfer_txt'] = 'Permitir transferência de zonas para
    Endereço(s) IP(s) (lista de endereços, separados por vírgula)'; $wb['server_id_error_empty'] = 'Nenhum servidor selecionado.'; -$wb['origin_error_empty'] = 'Zona está em branco.'; -$wb['origin_error_unique'] = 'Já existe este registro dns nesta zona.'; -$wb['origin_error_regex'] = 'Zona possui um formato inválido.'; +$wb['origin_error_empty'] = 'Zona está vazia.'; +$wb['origin_error_unique'] = 'Já existe este registro DNS nesta zona.'; +$wb['origin_error_regex'] = 'Zona possui formato inválido.'; $wb['ns_error_regex'] = 'O NS possui formato inválido.'; $wb['eg_domain_tld'] = 'ex.: dominio.com.br.'; $wb['ipv4_form_txt'] = 'Separar múltiplos IPs com vírgulas.'; -?> +$wb['Secondary DNS Zone'] = 'Zona DNS secundária'; diff --git a/interface/web/dns/lib/lang/br_dns_slave_admin_list.lng b/interface/web/dns/lib/lang/br_dns_slave_admin_list.lng index 9b4c7e07ef08c670b157d97a7dee06afebc937dd..34854849e324b93328de461d4838dd14e1fd7d29 100644 --- a/interface/web/dns/lib/lang/br_dns_slave_admin_list.lng +++ b/interface/web/dns/lib/lang/br_dns_slave_admin_list.lng @@ -4,7 +4,6 @@ $wb['active_txt'] = 'Ativo'; $wb['server_id_txt'] = 'Servidor'; $wb['origin_txt'] = 'Zona'; $wb['ns_txt'] = 'NS'; -$wb['add_new_record_txt'] = 'Adicionar nova zona dns secundária'; +$wb['add_new_record_txt'] = 'Adicionar nova zona DNS secundária'; $wb['eg_domain_tld'] = 'ex.: dominio.com.br.'; $wb['sys_groupid_txt'] = 'Cliente'; -?> diff --git a/interface/web/dns/lib/lang/br_dns_slave_list.lng b/interface/web/dns/lib/lang/br_dns_slave_list.lng index adf14dfdc7f472792f8d19a9d53f96a67b76697f..044a0005ec1cee1b863bf3a723634d2944d1d76f 100644 --- a/interface/web/dns/lib/lang/br_dns_slave_list.lng +++ b/interface/web/dns/lib/lang/br_dns_slave_list.lng @@ -4,6 +4,5 @@ $wb['active_txt'] = 'Ativo'; $wb['server_id_txt'] = 'Servidor'; $wb['origin_txt'] = 'Zona'; $wb['ns_txt'] = 'NS'; -$wb['add_new_record_txt'] = 'Adicionar nova zona dns secundária'; +$wb['add_new_record_txt'] = 'Adicionar nova zona DNS secundária'; $wb['eg_domain_tld'] = 'ex.: dominio.com.br.'; -?> diff --git a/interface/web/dns/lib/lang/br_dns_soa.lng b/interface/web/dns/lib/lang/br_dns_soa.lng index f5385c4706b98e51611e803341ac3ea1a4f35ac4..e6c8982de0259df07f2d979f0b62bf6abf9fa241 100644 --- a/interface/web/dns/lib/lang/br_dns_soa.lng +++ b/interface/web/dns/lib/lang/br_dns_soa.lng @@ -2,7 +2,7 @@ $wb['server_id_txt'] = 'Servidor'; $wb['origin_txt'] = 'Zona (SOA)'; $wb['ns_txt'] = 'NS'; -$wb['mbox_txt'] = 'e-Mail'; +$wb['mbox_txt'] = 'eMail'; $wb['serial_txt'] = 'Serial'; $wb['refresh_txt'] = 'Atualizar'; $wb['retry_txt'] = 'Repetir'; @@ -11,19 +11,19 @@ $wb['minimum_txt'] = 'Mínimo'; $wb['ttl_txt'] = 'TTL'; $wb['xfer_txt'] = 'Permitir transferências de zonas para
    Endereço(s) IP(s) (lista de endereços, separados por vírgula)'; $wb['active_txt'] = 'Ativo'; -$wb['dnssec_info_txt'] = 'O campo DS DNSSEC para o registro'; +$wb['dnssec_info_txt'] = 'DS DNSSEC para o registro'; $wb['dnssec_wanted_txt'] = 'Zona assinada (DNSSEC)'; $wb['dnssec_wanted_info'] = 'Ao desativar o DNSSEC as chaves não serão excluídas se o DNSSEC tiver sido ativado anteriormente e as chaves já tiverem sido geradas, mas a zona não será mais entregue no formato assinado posteriormente. Se você usa o PowerDNS, as chaves serão excluídas!'; -$wb['limit_dns_zone_txt'] = 'O limite de zonas dns para esta conta foi alcançado.'; +$wb['limit_dns_zone_txt'] = 'O limite de zonas DNS para esta conta foi alcançado.'; $wb['client_txt'] = 'Cliente'; -$wb['no_zone_perm'] = 'Você não tem permissão para adicionar registros dns nesta zona.'; +$wb['no_zone_perm'] = 'Você não tem permissão para adicionar registros DNS nesta zona.'; $wb['server_id_error_empty'] = 'Nenhum servidor selecionado'; -$wb['origin_error_empty'] = 'Zona está em branco.'; -$wb['origin_error_unique'] = 'Já existe este registro dns nesta zona.'; -$wb['origin_error_regex'] = 'A zona dns possui formato inválido.'; +$wb['origin_error_empty'] = 'Zona está vazio.'; +$wb['origin_error_unique'] = 'Já existe este registro DNS nesta zona.'; +$wb['origin_error_regex'] = 'A zona DNS possui formato inválido.'; $wb['ns_error_regex'] = 'O registro NS possui formato inválido.'; -$wb['mbox_error_empty'] = 'O e-mail está em branco.'; -$wb['mbox_error_regex'] = 'O e-mail possui formato inválido.'; +$wb['mbox_error_empty'] = 'O email está vazio.'; +$wb['mbox_error_regex'] = 'O email possui formato inválido.'; $wb['also_notify_txt'] = 'Também notificar'; $wb['also_notify_error_regex'] = 'Também notificar: Por favor, use um endereço IP.'; $wb['xfer_error_regex'] = 'Xfer: Por favor use um ou mais endereço(s) IP, separado por vírgula ou use a palavra reservada: any'; @@ -32,13 +32,15 @@ $wb['seconds_txt'] = 'Segundos'; $wb['eg_domain_tld'] = 'ex.: dominio.com.br'; $wb['eg_ns1_domain_tld'] = 'ex.: ns1.dominio.com.br'; $wb['eg_webmaster_domain_tld'] = 'ex.: hostmaster@dominio.com.br'; -$wb['The Domain can not be changed. Please ask your Administrator if you want to change the domain name.'] = 'O domínio não pode ser alterado. Por favor contate o administrador se deseja alterar o domínio.'; +$wb['The Domain can not be changed. Please ask your Administrator if you want to change the domain name.'] = 'O domínio não pode ser modificado. Por favor contate o administrador se deseja modificar o domínio.'; $wb['refresh_range_error'] = 'Intervalo mínimo entre as atualizações são 60 segundos.'; $wb['retry_range_error'] = 'Intervalo mínimo entre as repetições são 60 segundos.'; $wb['expire_range_error'] = 'Intervalo mínimo para expirar são 60 segundos.'; $wb['minimum_range_error'] = 'Intervalo mínimo são 60 segundos.'; $wb['ttl_range_error'] = 'Intervalo mínimo do TTL são 60 segundos.'; $wb['error_not_allowed_server_id'] = 'O servidor selecionado não é permitido para esta conta.'; -$wb['soa_cannot_be_changed_txt'] = 'A zona (SOA) não pode ser alterada. Por favor, contate o administrador se deseja alterar esta zona.'; +$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/br_dns_soa_admin_list.lng b/interface/web/dns/lib/lang/br_dns_soa_admin_list.lng index 26e8062d530859904438dca6cc1b3b51515760cd..dda0b4a0310fce30a62831cee4e6c8daeab9124a 100644 --- a/interface/web/dns/lib/lang/br_dns_soa_admin_list.lng +++ b/interface/web/dns/lib/lang/br_dns_soa_admin_list.lng @@ -4,9 +4,9 @@ $wb['active_txt'] = 'Ativo'; $wb['server_id_txt'] = 'Servidor'; $wb['origin_txt'] = 'Zona'; $wb['ns_txt'] = 'NS'; -$wb['mbox_txt'] = 'e-Mail'; -$wb['add_new_record_wizard_txt'] = 'Adicionar zona dns através do assistente'; -$wb['add_new_record_txt'] = 'Adicionar zona dns manualmente'; +$wb['mbox_txt'] = 'eMail'; +$wb['add_new_record_wizard_txt'] = 'Adicionar zona DNS através do assistente'; +$wb['add_new_record_txt'] = 'Adicionar zona DNS manualmente'; $wb['zone_file_import_txt'] = 'Importar arquivo de zona'; $wb['sys_groupid_txt'] = 'Cliente'; -?> +$wb['import_zone_file_txt'] = 'Importar arquivo de zona'; diff --git a/interface/web/dns/lib/lang/br_dns_soa_list.lng b/interface/web/dns/lib/lang/br_dns_soa_list.lng index 969df1d2a92b1a9f3bfbaecbf7d06c4f6ab6aed5..33d0457d20b06ccd8371f68403b023f97cb6dbc3 100644 --- a/interface/web/dns/lib/lang/br_dns_soa_list.lng +++ b/interface/web/dns/lib/lang/br_dns_soa_list.lng @@ -4,7 +4,7 @@ $wb['active_txt'] = 'Ativo'; $wb['server_id_txt'] = 'Servidor'; $wb['origin_txt'] = 'Zona'; $wb['ns_txt'] = 'NS'; -$wb['mbox_txt'] = 'e-Mail'; -$wb['add_new_record_wizard_txt'] = 'Adicionar nova zona dns através do assistente'; -$wb['add_new_record_txt'] = 'Adicionar nova zona dns manualmente'; -?> +$wb['mbox_txt'] = 'eMail'; +$wb['add_new_record_wizard_txt'] = 'Adicionar nova zona DNS através do assistente'; +$wb['add_new_record_txt'] = 'Adicionar nova zona DNS manualmente'; +$wb['zone_file_import_txt'] = 'Importar arquivo de zona'; diff --git a/interface/web/dns/lib/lang/br_dns_spf.lng b/interface/web/dns/lib/lang/br_dns_spf.lng index 739e59cf41787cc4d0dec825d9fe8afb79540cf4..e7965daf41f30d60705ba2d802ab921ecce31416 100644 --- a/interface/web/dns/lib/lang/br_dns_spf.lng +++ b/interface/web/dns/lib/lang/br_dns_spf.lng @@ -1,25 +1,30 @@ o registro existente?'; +$wb['spf_record_exists_multiple_txt'] = 'Existe múltiplos registros SPF para o host "{hostname}". Isto pode causar rejeição de destinatários para seu email! Remova ou mescle os registros duplicados e tente novamente.'; +$wb['limit_dns_record_txt'] = 'O limite de registros DNS para esta conta foi alcançado.'; +$wb['no_zone_perm'] = 'Você não tem permissão para adicionar registros DNS nesta zona.'; $wb['ttl_range_error'] = 'O TTL mínimo são 60 segundos.'; -?> +$wb['name_error_regex'] = 'O host possui formato inválido.'; +$wb['btn_edit_as_txt_record_txt'] = 'Editar registro TXT'; +$wb['DNS SPF'] = 'Registro SPF'; diff --git a/interface/web/dns/lib/lang/br_dns_srv.lng b/interface/web/dns/lib/lang/br_dns_srv.lng index 97d26048960fad7a18e7fc28f273d444ccc86c49..f2fd60cc74de899c2952d6d899151c16cfa0efda 100644 --- a/interface/web/dns/lib/lang/br_dns_srv.lng +++ b/interface/web/dns/lib/lang/br_dns_srv.lng @@ -9,12 +9,11 @@ $wb['port_txt'] = 'Porta'; $wb['ttl_txt'] = 'TTL'; $wb['active_txt'] = 'Ativo'; $wb['aux_txt'] = 'Prioridade'; -$wb['limit_dns_record_txt'] = 'O limite de registros dns para esta conta foi alcançado.'; -$wb['no_zone_perm'] = 'Você não tem permissão para adicionar registros dns nesta zona.'; -$wb['name_error_empty'] = 'O nome do host está em branco.'; +$wb['limit_dns_record_txt'] = 'O limite de registros DNS para esta conta foi alcançado.'; +$wb['no_zone_perm'] = 'Você não tem permissão para adicionar registros DNS nesta zona.'; +$wb['name_error_empty'] = 'O nome do host está vazio.'; $wb['name_error_regex'] = 'O nome do host possui formato inválido (somente nomes canônicos são suportados).'; -$wb['data_error_empty'] = 'Registro SVR está em branco.'; -$wb['data_error_regex'] = 'Registro SVR possui formato inválido.'; +$wb['data_error_empty'] = 'Registro SRV está vazio.'; +$wb['data_error_regex'] = 'Registro SRV possui formato inválido.'; $wb['srv_error_regex'] = 'O formato do registro SVR é inválido. O registro SVR deve conter 3 cadeias de texto separados por espaços.'; $wb['ttl_range_error'] = 'O TTL mínimo são 60 segundos.'; -?> diff --git a/interface/web/dns/lib/lang/br_dns_sshfp.lng b/interface/web/dns/lib/lang/br_dns_sshfp.lng new file mode 100644 index 0000000000000000000000000000000000000000..7c8152f745de6deeeb1a65194e1b0aab802e904f --- /dev/null +++ b/interface/web/dns/lib/lang/br_dns_sshfp.lng @@ -0,0 +1,16 @@ + +$wb['DNS Wizard template'] = 'Gabarito do Assistente DNS'; +$wb['DNS Template'] = 'Gabarito DNS'; diff --git a/interface/web/dns/lib/lang/br_dns_template_list.lng b/interface/web/dns/lib/lang/br_dns_template_list.lng index 8ec480d727f18fe2a1f0e584376080d0123f054b..e9a918a77879533d7d598c1a7a5c6b934c56ed35 100644 --- a/interface/web/dns/lib/lang/br_dns_template_list.lng +++ b/interface/web/dns/lib/lang/br_dns_template_list.lng @@ -3,4 +3,3 @@ $wb['list_head_txt'] = 'Gabarito do Assistente DNS'; $wb['visible_txt'] = 'Visível'; $wb['name_txt'] = 'Nome'; $wb['add_new_record_txt'] = 'Adicionar novo registro'; -?> diff --git a/interface/web/dns/lib/lang/br_dns_tlsa.lng b/interface/web/dns/lib/lang/br_dns_tlsa.lng index 4037ebe595902514de0652fc7f2100c0a58eb2f8..e0e78cadcdd2a75eaa7e1c880810d87d02fc9a23 100644 --- a/interface/web/dns/lib/lang/br_dns_tlsa.lng +++ b/interface/web/dns/lib/lang/br_dns_tlsa.lng @@ -6,11 +6,10 @@ $wb['type_txt'] = 'Tipo'; $wb['data_txt'] = 'Dados TLSA'; $wb['ttl_txt'] = 'TTL'; $wb['active_txt'] = 'Ativo'; -$wb['limit_dns_record_txt'] = 'O limite de registros dns para esta conta foi alcançado.'; -$wb['no_zone_perm'] = 'Você não tem permissão para adicionar registros dns nesta zona.'; -$wb['name_error_empty'] = 'O nome do host está em branco.'; -$wb['name_error_regex'] = 'O nome do host possui formato inválido (somente nomes canônicos são suportados). Correto: _<port>._(tcp|udp).<hostname>'; -$wb['data_error_empty'] = 'Dados TLSA está em branco.'; +$wb['limit_dns_record_txt'] = 'O limite de registros DNS para esta conta foi alcançado.'; +$wb['no_zone_perm'] = 'Você não tem permissão para adicionar registros DNS nesta zona.'; +$wb['name_error_empty'] = 'O nome do host está vazio.'; +$wb['name_error_regex'] = 'O nome do host possui formato inválido (somente nomes canônicos são suportados). Correto: porta(tcp|udp);hostname;'; +$wb['data_error_empty'] = 'Dados TLSA está vazio.'; $wb['data_error_regex'] = 'Formato dos dados TLSA inválido. Correto: n n n HASH'; $wb['ttl_range_error'] = 'O TTL mínimo são 60 segundos.'; -?> diff --git a/interface/web/dns/lib/lang/br_dns_txt.lng b/interface/web/dns/lib/lang/br_dns_txt.lng index 641cb9f2e199290a32bbb9ab1bfda2c905e25940..27d73480a99a868334a4162f5ac5a49413cbfa71 100644 --- a/interface/web/dns/lib/lang/br_dns_txt.lng +++ b/interface/web/dns/lib/lang/br_dns_txt.lng @@ -6,14 +6,13 @@ $wb['type_txt'] = 'Tipo'; $wb['data_txt'] = 'Texto'; $wb['ttl_txt'] = 'TTL'; $wb['active_txt'] = 'Ativo'; -$wb['limit_dns_record_txt'] = 'O limite de registros dns para esta conta foi alcançado.'; -$wb['no_zone_perm'] = 'Você não tem permissão para adicionar registros dns nesta zona.'; -$wb['name_error_empty'] = 'O nome do host está em branco.'; +$wb['limit_dns_record_txt'] = 'O limite de registros DNS para esta conta foi alcançado.'; +$wb['no_zone_perm'] = 'Você não tem permissão para adicionar registros DNS nesta zona.'; +$wb['name_error_empty'] = 'O nome do host está vazio.'; $wb['name_error_regex'] = 'O nome do host possui formato inválido (somente nomes canônicos são suportados).'; -$wb['data_error_empty'] = 'O texto está em branco.'; +$wb['data_error_empty'] = 'O texto está vazio.'; $wb['data_error_regex'] = 'O texto é inválido.'; $wb['ttl_range_error'] = 'O TTL mínimo são 60 segundos.'; $wb['invalid_type_dkim'] = 'Sem permissão para DKIM. Use o botão DKIM.'; $wb['invalid_type_dmarc'] = 'Sem permissão para DMARC. Use o botão DMARC.'; $wb['invalid_type_spf'] = 'Sem permissão para SPF. Use o botão SPF.'; -?> diff --git a/interface/web/dns/lib/lang/br_dns_wizard.lng b/interface/web/dns/lib/lang/br_dns_wizard.lng index d132d4646b341a958d7f2d1c5bdf2d96452a4bcf..198ecbe6e616192d75d6739d1fe0b849d759c82f 100644 --- a/interface/web/dns/lib/lang/br_dns_wizard.lng +++ b/interface/web/dns/lib/lang/br_dns_wizard.lng @@ -1,38 +1,38 @@ +$wb['limit_dns_zone_txt'] = 'O limite de zonas DNS para esta conta foi alcançado.'; diff --git a/interface/web/dns/lib/lang/ca_dns_a.lng b/interface/web/dns/lib/lang/ca_dns_a.lng index 6b3b31ae4c62b3eb0b7c633ffb12ac832f5ac4f4..339efc73fe5eee8d40cbe454797b4cfba97eaf33 100644 --- a/interface/web/dns/lib/lang/ca_dns_a.lng +++ b/interface/web/dns/lib/lang/ca_dns_a.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'Vous n\'avez pas la permission d\'ajouter un enregistreme $wb['name_error_empty'] = 'Le nom d\'hôte est vide.'; $wb['name_error_regex'] = 'Le format du nom d\'hôte est invalide.'; $wb['data_error_empty'] = 'L\'adresse IP est vide.'; -$wb['data_error_duplicate'] = 'Enregistrement A ou CNAME en double'; +$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'; ?> diff --git a/interface/web/dns/lib/lang/ca_dns_aaaa.lng b/interface/web/dns/lib/lang/ca_dns_aaaa.lng index e29a5cbf0dc4661c2fe56e925db06b59abe2432d..778ea7cb0e181a63c41892a9028db0027e8a6573 100644 --- a/interface/web/dns/lib/lang/ca_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/ca_dns_aaaa.lng @@ -11,6 +11,7 @@ $wb['no_zone_perm'] = 'Vous n\'avez pas la permission d\'ajouter un enregistreme $wb['name_error_empty'] = 'Le nom d\'hôte est vide.'; $wb['name_error_regex'] = 'Le format du nom d\'hôte est invalide.'; $wb['data_error_empty'] = 'L\'adresse IP est vide.'; +$wb['data_error_duplicate'] = 'Duplicate AAAA, ALIAS or CNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; $wb['ip_error_wrong'] = 'IP-Address format invalid'; ?> diff --git a/interface/web/dns/lib/lang/ca_dns_alias.lng b/interface/web/dns/lib/lang/ca_dns_alias.lng index 4071d430b9ac5a400ba1286fa49af15a4057b021..be2d96ff2352cfbc4987fd7450c6c26769ea4a66 100644 --- a/interface/web/dns/lib/lang/ca_dns_alias.lng +++ b/interface/web/dns/lib/lang/ca_dns_alias.lng @@ -12,5 +12,6 @@ $wb['name_error_empty'] = 'Le nom d\'hôte est vide.'; $wb['name_error_regex'] = 'Le format du nom d\'hôte est invalide.'; $wb['data_error_empty'] = 'Le nom d\'hôte cible est vide.'; $wb['data_error_regex'] = 'Le format du nom d\'hôte est invalide.'; +$wb['data_error_duplicate'] = 'Duplicate A, AAAA, ALIAS, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/ca_dns_caa.lng b/interface/web/dns/lib/lang/ca_dns_caa.lng index 973a97ceb6870404d7c8107002e1738b373362a0..8040cb4d549f3bc060a5b9ace62f711715446b0f 100644 --- a/interface/web/dns/lib/lang/ca_dns_caa.lng +++ b/interface/web/dns/lib/lang/ca_dns_caa.lng @@ -1,7 +1,7 @@ diff --git a/interface/web/dns/lib/lang/ca_dns_dname.lng b/interface/web/dns/lib/lang/ca_dns_dname.lng new file mode 100644 index 0000000000000000000000000000000000000000..d9d8296fdb1c2ed715a70b5f229d4276fe9d604a --- /dev/null +++ b/interface/web/dns/lib/lang/ca_dns_dname.lng @@ -0,0 +1,17 @@ + diff --git a/interface/web/dns/lib/lang/ca_dns_import.lng b/interface/web/dns/lib/lang/ca_dns_import.lng index feb0ba7919ff585a0c9e8f43a0e95a838da92e13..78c2edbf808ba61813fb9fa6fd65cf7d7f721a0e 100644 --- a/interface/web/dns/lib/lang/ca_dns_import.lng +++ b/interface/web/dns/lib/lang/ca_dns_import.lng @@ -13,4 +13,13 @@ $wb['no_file_uploaded_error'] = 'Aucun fichier de Zone téléchargé'; $wb['zone_file_import_txt'] = 'Importer un fichier de Zone'; $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.'; ?> diff --git a/interface/web/dns/lib/lang/ca_dns_naptr.lng b/interface/web/dns/lib/lang/ca_dns_naptr.lng new file mode 100644 index 0000000000000000000000000000000000000000..b39373c13de1d5b288b85d4ebeef8696a09d3af6 --- /dev/null +++ b/interface/web/dns/lib/lang/ca_dns_naptr.lng @@ -0,0 +1,21 @@ + diff --git a/interface/web/dns/lib/lang/ca_dns_soa.lng b/interface/web/dns/lib/lang/ca_dns_soa.lng index aaf07a0b999573c52d6858557277785b108b5a57..2ac84a17df977e720a5b2fe752d30f6a7396ba16 100644 --- a/interface/web/dns/lib/lang/ca_dns_soa.lng +++ b/interface/web/dns/lib/lang/ca_dns_soa.lng @@ -7,7 +7,7 @@ $wb['serial_txt'] = 'Serial'; $wb['refresh_txt'] = 'Refresh'; $wb['retry_txt'] = 'Retry'; $wb['expire_txt'] = 'Expire'; -$wb['minimum_txt'] = 'Minimum'; +$wb['minimum_txt'] = 'Minimum (negative cache ttl)'; $wb['ttl_txt'] = 'TTL'; $wb['xfer_txt'] = 'Autoriser les transfers de zones vers
    ces IP (liste séparée par des virgules)'; $wb['active_txt'] = 'Actif'; @@ -41,4 +41,7 @@ $wb['dnssec_wanted_info'] = 'When disabling DNSSEC keys are not going to be dele $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['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_admin_list.lng b/interface/web/dns/lib/lang/ca_dns_soa_admin_list.lng index ff6fe695ae330cdab0477cd21b610c393c724a6b..0f477a473ac715f7402aa0ebfd3bb12780616ec7 100644 --- a/interface/web/dns/lib/lang/ca_dns_soa_admin_list.lng +++ b/interface/web/dns/lib/lang/ca_dns_soa_admin_list.lng @@ -7,5 +7,6 @@ $wb['ns_txt'] = 'NS'; $wb['mbox_txt'] = 'Courriel'; $wb['add_new_record_wizard_txt'] = 'Assistant de création de zone'; $wb['add_new_record_txt'] = 'Création manuel de zone'; +$wb['import_zone_file_txt'] = 'Import Zone File'; $wb['sys_groupid_txt'] = 'Client'; ?> diff --git a/interface/web/dns/lib/lang/ca_dns_spf.lng b/interface/web/dns/lib/lang/ca_dns_spf.lng index df8d1fe1453faa2d4decfe0d3dc94cf19ff48458..0cbf77862f6619ad477913cefb5c4b5e248ddae6 100644 --- a/interface/web/dns/lib/lang/ca_dns_spf.lng +++ b/interface/web/dns/lib/lang/ca_dns_spf.lng @@ -1,5 +1,6 @@ edit the existing record?'; +$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'; ?> diff --git a/interface/web/dns/lib/lang/ca_dns_sshfp.lng b/interface/web/dns/lib/lang/ca_dns_sshfp.lng new file mode 100644 index 0000000000000000000000000000000000000000..dc9ad9a00634513f03aec6da53682d2842bae7b6 --- /dev/null +++ b/interface/web/dns/lib/lang/ca_dns_sshfp.lng @@ -0,0 +1,16 @@ + diff --git a/interface/web/dns/lib/lang/cz.lng b/interface/web/dns/lib/lang/cz.lng index 74a1c457a77f79b88b55b72089adb685ba922f07..381425cdc5c009bc177f86533ae43c8084d84ed9 100644 --- a/interface/web/dns/lib/lang/cz.lng +++ b/interface/web/dns/lib/lang/cz.lng @@ -19,4 +19,3 @@ $wb['Add DNS Zone'] = 'Vytvořit DNS zónu'; $wb['Templates'] = 'Šablony DNS'; $wb['Secondary Zones'] = 'Sekundární DNS zóny'; $wb['Import Zone File'] = 'Importovat DNS zonový soubor'; -?> diff --git a/interface/web/dns/lib/lang/cz_dns_a.lng b/interface/web/dns/lib/lang/cz_dns_a.lng index 871f9146d42fb5d2a1fa0a0e1c81f44910414bc0..2c3a7f1b0e2988b4247733d770cfe746d0e26ba8 100644 --- a/interface/web/dns/lib/lang/cz_dns_a.lng +++ b/interface/web/dns/lib/lang/cz_dns_a.lng @@ -14,4 +14,3 @@ $wb['data_error_empty'] = 'IP adresa je prázdná'; $wb['data_error_duplicate'] = 'Duplikace A záznamu'; $wb['ttl_range_error'] = 'Min. TTL doba je 60 sekund.'; $wb['ip_error_wrong'] = 'IP - formát adresy neplatný'; -?> diff --git a/interface/web/dns/lib/lang/cz_dns_a_list.lng b/interface/web/dns/lib/lang/cz_dns_a_list.lng index 5096f96127bbc7367caf37ecdb18066d0bd82163..f877e2b1992f937adea5bf279b8f5bffb40c6263 100644 --- a/interface/web/dns/lib/lang/cz_dns_a_list.lng +++ b/interface/web/dns/lib/lang/cz_dns_a_list.lng @@ -12,4 +12,3 @@ $wb['add_new_record_txt'] = 'Vytvořit DNS A záznam'; $wb['page_txt'] = 'Stránka'; $wb['page_of_txt'] = 'z'; $wb['delete_confirmation'] = 'Skutečně chcete smazat tento záznam ?'; -?> diff --git a/interface/web/dns/lib/lang/cz_dns_aaaa.lng b/interface/web/dns/lib/lang/cz_dns_aaaa.lng index e28e9a8b735c040eb8002a0e4fc7838eb6074329..ce80f2d8819a6838e43ee4bc9a5a13068e635b51 100644 --- a/interface/web/dns/lib/lang/cz_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/cz_dns_aaaa.lng @@ -11,6 +11,6 @@ $wb['no_zone_perm'] = 'Nemáte oprávnění přidat záznam do této zóny.'; $wb['name_error_empty'] = 'Název hostitele je prázdný.'; $wb['name_error_regex'] = 'Název hostitele má chybný formát.'; $wb['data_error_empty'] = 'IP adresa je prázdná'; +$wb['data_error_duplicate'] = 'Duplicitní AAAA nebo CNAME záznam'; $wb['ttl_range_error'] = 'Min. TTL doba je 60 sekund.'; $wb['ip_error_wrong'] = 'IP - formát adresy neplatný'; -?> diff --git a/interface/web/dns/lib/lang/cz_dns_alias.lng b/interface/web/dns/lib/lang/cz_dns_alias.lng index 9c64d41797686affa958eb853636828bdb05daf3..d889d10d2633b1158041ae8b21bf0fb73a12578d 100644 --- a/interface/web/dns/lib/lang/cz_dns_alias.lng +++ b/interface/web/dns/lib/lang/cz_dns_alias.lng @@ -12,5 +12,5 @@ $wb['name_error_empty'] = 'Název hostitele je prázdný.'; $wb['name_error_regex'] = 'Název hostitele má chybný formát.'; $wb['data_error_empty'] = 'Cílový název hostitele je prázdný'; $wb['data_error_regex'] = 'Cílový název hostitele má chybný formát'; +$wb['data_error_duplicate'] = 'Duplicate A, AAAA, ALIAS, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL doba je 60 sekund.'; -?> diff --git a/interface/web/dns/lib/lang/cz_dns_caa.lng b/interface/web/dns/lib/lang/cz_dns_caa.lng index f4ba690c5a210bf522ad9bad83af731448272fa1..211fc294f942ea6c6f54591ec2d9c65e10920c38 100644 --- a/interface/web/dns/lib/lang/cz_dns_caa.lng +++ b/interface/web/dns/lib/lang/cz_dns_caa.lng @@ -16,4 +16,3 @@ $wb['ca_error_txt'] = 'Nebyla vybrána žádná certifikační autorita'; $wb['caa_exists_error'] = 'CAA záznam již existuje'; $wb['ca_option_error'] = 'Neplatný formát pro další možnosti; OPTION=VALUE'; $wb['ttl_range_error'] = 'Min. TTL čas je 60 sekund.'; -?> diff --git a/interface/web/dns/lib/lang/cz_dns_cname.lng b/interface/web/dns/lib/lang/cz_dns_cname.lng index 8fed28a5a7d2e685e0874c545e082bfde6d7ce6f..e3286e4a55e5ea375faf2f69e93c58bba4dbe1a0 100644 --- a/interface/web/dns/lib/lang/cz_dns_cname.lng +++ b/interface/web/dns/lib/lang/cz_dns_cname.lng @@ -14,4 +14,3 @@ $wb['data_error_empty'] = 'Cílový název hostitele je prázdný'; $wb['data_error_regex'] = 'Cílový název hostitele má chybný formát'; $wb['data_error_duplicate'] = 'Duplikace A záznamu nebo CNAME-záznamu'; $wb['ttl_range_error'] = 'Min. TTL doba je 60 sekund.'; -?> diff --git a/interface/web/dns/lib/lang/cz_dns_dkim.lng b/interface/web/dns/lib/lang/cz_dns_dkim.lng index e3a93bc8b8073e370266089153bb38b4b92589d2..311efa2071c9c1a199a1a964f2ef41da2b3cb25a 100644 --- a/interface/web/dns/lib/lang/cz_dns_dkim.lng +++ b/interface/web/dns/lib/lang/cz_dns_dkim.lng @@ -10,4 +10,3 @@ $wb['ttl_range_error'] = 'Min. TTL doba je 60 sekund.'; $wb['selector_txt'] = 'DKIM selektor'; $wb['data_error_empty'] = 'Public-Key missing'; $wb['dkim_selector_empty_txt'] = 'DKIM-Selector is empty'; -?> diff --git a/interface/web/dns/lib/lang/cz_dns_dmarc.lng b/interface/web/dns/lib/lang/cz_dns_dmarc.lng index c4c3bb4f241f768ec4f75ed0054542832cffa39a..026ff60cee742050ab4be45d77e5e58b446cfc75 100644 --- a/interface/web/dns/lib/lang/cz_dns_dmarc.lng +++ b/interface/web/dns/lib/lang/cz_dns_dmarc.lng @@ -47,4 +47,3 @@ $wb['record_exists_txt'] = 'DNS záznam již existuje'; $wb['limit_dns_record_txt'] = 'Byl dosažen max. počet DNS záznamů pro váš účet.'; $wb['no_zone_perm'] = 'Nemáte oprávnění přidat záznam do této zóny DNS.'; $wb['ttl_range_error'] = 'Min. TTL doba je 60 sekund.'; -?> diff --git a/interface/web/dns/lib/lang/cz_dns_dname.lng b/interface/web/dns/lib/lang/cz_dns_dname.lng new file mode 100644 index 0000000000000000000000000000000000000000..94dae46aa68b1560834c9b16daa8dff113285867 --- /dev/null +++ b/interface/web/dns/lib/lang/cz_dns_dname.lng @@ -0,0 +1,16 @@ + diff --git a/interface/web/dns/lib/lang/cz_dns_hinfo.lng b/interface/web/dns/lib/lang/cz_dns_hinfo.lng index edd9aa3694b1abd992846bdaf194b3ec6e536053..da00c42d3bb05c5083d50a4119641aa8d64040c9 100644 --- a/interface/web/dns/lib/lang/cz_dns_hinfo.lng +++ b/interface/web/dns/lib/lang/cz_dns_hinfo.lng @@ -13,4 +13,3 @@ $wb['name_error_regex'] = 'Název hostitele má chybný formát.'; $wb['data_error_empty'] = 'Informace o hostovi je prázdná'; $wb['data_error_regex'] = 'Informace o hostovi má chybný formát'; $wb['ttl_range_error'] = 'Min. TTL doba je 60 sekund.'; -?> diff --git a/interface/web/dns/lib/lang/cz_dns_import.lng b/interface/web/dns/lib/lang/cz_dns_import.lng index fc90d3cf3ca7a085406b899d6d6199e719b996bf..ddbcce0875ccc6b6c38b3135e9c4cb874168f421 100644 --- a/interface/web/dns/lib/lang/cz_dns_import.lng +++ b/interface/web/dns/lib/lang/cz_dns_import.lng @@ -13,4 +13,12 @@ $wb['no_file_uploaded_error'] = 'Nelze odeslat DNS zonový soubor'; $wb['zone_file_import_txt'] = 'Importovat DNS zonový soubor'; $wb['error_no_server_id'] = 'No server provided.'; $wb['error_not_allowed_server_id'] = 'Vybraný server není pro tento účet povolen.'; -?> +$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.'; diff --git a/interface/web/dns/lib/lang/cz_dns_loc.lng b/interface/web/dns/lib/lang/cz_dns_loc.lng index 4ed9018152ceeb842f33116f29034f9fc75f22f4..1fa6fa87d121d037ad84fbc999704d51601c6bca 100644 --- a/interface/web/dns/lib/lang/cz_dns_loc.lng +++ b/interface/web/dns/lib/lang/cz_dns_loc.lng @@ -1,6 +1,6 @@ diff --git a/interface/web/dns/lib/lang/cz_dns_mx.lng b/interface/web/dns/lib/lang/cz_dns_mx.lng index 8d62a01921680c319d11bbf8dd31e54c6a114956..17ab260c893cf8af29d50dc76c8485d8a44d8e1d 100644 --- a/interface/web/dns/lib/lang/cz_dns_mx.lng +++ b/interface/web/dns/lib/lang/cz_dns_mx.lng @@ -15,4 +15,3 @@ $wb['data_error_empty'] = 'Název hostitele e-mailového serveru je prázdný'; $wb['data_error_regex'] = 'Název hostitele e-mailového serveru má chybný formát'; $wb['duplicate_mx_record_txt'] = 'Duplicitní MX záznam.'; $wb['ttl_range_error'] = 'Min. TTL doba je 60 sekund.'; -?> diff --git a/interface/web/dns/lib/lang/cz_dns_naptr.lng b/interface/web/dns/lib/lang/cz_dns_naptr.lng new file mode 100644 index 0000000000000000000000000000000000000000..75f2580ea8aa0c223ba9bf0ced9c477eaf8640d2 --- /dev/null +++ b/interface/web/dns/lib/lang/cz_dns_naptr.lng @@ -0,0 +1,20 @@ + diff --git a/interface/web/dns/lib/lang/cz_dns_ptr.lng b/interface/web/dns/lib/lang/cz_dns_ptr.lng index 4d4403df9e504bce5027a66e4e31c9050103cc3d..ea5a3561a953e319b028caf488c3fee7c5c25efe 100644 --- a/interface/web/dns/lib/lang/cz_dns_ptr.lng +++ b/interface/web/dns/lib/lang/cz_dns_ptr.lng @@ -13,4 +13,3 @@ $wb['name_error_regex'] = 'Název má chybný formát.'; $wb['data_error_empty'] = 'Kanonický hostname je prázdný'; $wb['data_error_regex'] = 'Kanonického hostname má chybný formát'; $wb['ttl_range_error'] = 'Min. TTL doba je 60 sekund.'; -?> diff --git a/interface/web/dns/lib/lang/cz_dns_rp.lng b/interface/web/dns/lib/lang/cz_dns_rp.lng index b4582ba1c886881667a25aeff2277cb953574ca4..c805b6038081cf34dba89cc2417b3eebd39e41dc 100644 --- a/interface/web/dns/lib/lang/cz_dns_rp.lng +++ b/interface/web/dns/lib/lang/cz_dns_rp.lng @@ -13,4 +13,3 @@ $wb['name_error_regex'] = 'Název hostitele má chybný formát.'; $wb['data_error_empty'] = 'Odpovědná osoba je prázdná'; $wb['data_error_regex'] = 'Odpovědná osoba má chybný formát'; $wb['ttl_range_error'] = 'Min. TTL doba je 60 sekund.'; -?> diff --git a/interface/web/dns/lib/lang/cz_dns_slave.lng b/interface/web/dns/lib/lang/cz_dns_slave.lng index 349a01bdbbabbf9e93153727d3c36443c0a02de3..8493bd2fdaeaad0eb21403226604efd7addf4d48 100644 --- a/interface/web/dns/lib/lang/cz_dns_slave.lng +++ b/interface/web/dns/lib/lang/cz_dns_slave.lng @@ -14,4 +14,3 @@ $wb['ns_error_regex'] = 'NS má neplatný formát.'; $wb['eg_domain_tld'] = 'např. domena.cz'; $wb['ipv4_form_txt'] = 'IPV4 formát, např. 1.2.3.4'; $wb['secondary_zone_txt'] = 'Sekundární DNS zóna'; -?> diff --git a/interface/web/dns/lib/lang/cz_dns_slave_admin_list.lng b/interface/web/dns/lib/lang/cz_dns_slave_admin_list.lng index 2b4160735ab7187fa28245a96a25eaee0e01a7aa..c973ffcee6baf6bc4a454f34c81143543ed4373e 100644 --- a/interface/web/dns/lib/lang/cz_dns_slave_admin_list.lng +++ b/interface/web/dns/lib/lang/cz_dns_slave_admin_list.lng @@ -7,4 +7,3 @@ $wb['ns_txt'] = 'NS'; $wb['add_new_record_txt'] = 'Vytvořit novou Sekundarní DNS-Zónu'; $wb['eg_domain_tld'] = 'např. domena.cz'; $wb['sys_groupid_txt'] = 'Klient'; -?> diff --git a/interface/web/dns/lib/lang/cz_dns_slave_list.lng b/interface/web/dns/lib/lang/cz_dns_slave_list.lng index a0d68bc201f69fb40a4f068a9ea08f24fc369da0..fabcd4d3fd7a024370e0c8801ef26ae0ed5cb52c 100644 --- a/interface/web/dns/lib/lang/cz_dns_slave_list.lng +++ b/interface/web/dns/lib/lang/cz_dns_slave_list.lng @@ -6,4 +6,3 @@ $wb['origin_txt'] = 'Zóna'; $wb['ns_txt'] = 'NS'; $wb['add_new_record_txt'] = 'Vytvořit sekundární DNS zónu'; $wb['eg_domain_tld'] = 'např. domena.cz'; -?> diff --git a/interface/web/dns/lib/lang/cz_dns_soa.lng b/interface/web/dns/lib/lang/cz_dns_soa.lng index 5e4a0c2bb3b9a21ca19897551f5e643dd1d9d664..73c2582117a039a345323bb3b50d63b2b06b9937 100644 --- a/interface/web/dns/lib/lang/cz_dns_soa.lng +++ b/interface/web/dns/lib/lang/cz_dns_soa.lng @@ -9,7 +9,7 @@ $wb['retry_txt'] = 'Retry'; $wb['expire_txt'] = 'Expire'; $wb['minimum_txt'] = 'Minimum'; $wb['ttl_txt'] = 'TTL'; -$wb['xfer_txt'] = 'Povolot přenos zóny do
    těchto IP adres (položky oddělené čárkami)'; +$wb['xfer_txt'] = 'Povolit přenos zóny do
    těchto IP adres (položky oddělené čárkami)'; $wb['active_txt'] = 'Aktivní'; $wb['limit_dns_zone_txt'] = 'Byl dosažen maximální počet DNS záznamů pro Váš účet.'; $wb['client_txt'] = 'Klient'; @@ -41,4 +41,6 @@ $wb['dnssec_wanted_info'] = 'Když deaktivujete DNSSEC klíče nebudou odstraně $wb['error_not_allowed_server_id'] = 'Vybraný server není pro tento účet povolen.'; $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/cz_dns_soa_admin_list.lng b/interface/web/dns/lib/lang/cz_dns_soa_admin_list.lng index 0ec5de4f6d92b81cd0c3046d9e3a0c3b482f35ab..ab39140c781b05fa7d5ebcdaa4a42a1dfb313a39 100644 --- a/interface/web/dns/lib/lang/cz_dns_soa_admin_list.lng +++ b/interface/web/dns/lib/lang/cz_dns_soa_admin_list.lng @@ -7,5 +7,5 @@ $wb['ns_txt'] = 'NS'; $wb['mbox_txt'] = 'E-mail'; $wb['add_new_record_wizard_txt'] = 'Vytvořit DNS zónu pomocí průvodce'; $wb['add_new_record_txt'] = 'Vytvořit DNS zónu manuálně'; +$wb['import_zone_file_txt'] = 'Import Zone File'; $wb['sys_groupid_txt'] = 'Klient'; -?> diff --git a/interface/web/dns/lib/lang/cz_dns_soa_list.lng b/interface/web/dns/lib/lang/cz_dns_soa_list.lng index 6168c8b808e163597e52670c8ca46fff307db9fa..f8840971491794c9030a271bbb72f4cc0c629e57 100644 --- a/interface/web/dns/lib/lang/cz_dns_soa_list.lng +++ b/interface/web/dns/lib/lang/cz_dns_soa_list.lng @@ -8,4 +8,3 @@ $wb['mbox_txt'] = 'E-mail'; $wb['add_new_record_txt'] = 'Vytvořit DNS zónu (SOA záznam)'; $wb['add_new_record_wizard_txt'] = 'Vytvořit DNS zónu (dle šablony)'; $wb['import_zone_file_txt'] = 'Importovat DNS zonový soubor'; -?> diff --git a/interface/web/dns/lib/lang/cz_dns_spf.lng b/interface/web/dns/lib/lang/cz_dns_spf.lng index 3086454c34e87cff4a5c722ab48b0c7963632c14..3eb2a6ec2faf13440958a7586f41b10652b83883 100644 --- a/interface/web/dns/lib/lang/cz_dns_spf.lng +++ b/interface/web/dns/lib/lang/cz_dns_spf.lng @@ -1,5 +1,6 @@ edit the existing record?'; +$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'] = 'Byl dosažen max. počet DNS záznamů pro váš účet.'; $wb['no_zone_perm'] = 'Nemáte oprávnění přidat záznam do této zóny DNS.'; $wb['ttl_range_error'] = 'Min. TTL doba je 60 sekund.'; -?> +$wb['name_error_regex'] = 'Název hostitele má chybný formát.'; +$wb['btn_edit_as_txt_record_txt'] = 'Upravit jako TXT záznam'; diff --git a/interface/web/dns/lib/lang/cz_dns_srv.lng b/interface/web/dns/lib/lang/cz_dns_srv.lng index 00b1fc4cf10a7bd27bebb193020baa18b0516e76..914c6f3efb2297275f50573edd9335fc82de6f37 100644 --- a/interface/web/dns/lib/lang/cz_dns_srv.lng +++ b/interface/web/dns/lib/lang/cz_dns_srv.lng @@ -17,4 +17,3 @@ $wb['data_error_regex'] = 'Záznam serveru má chybný formát'; $wb['srv_error_regex'] = 'Neplatný formát záznamu serveru. Záznam serveru musí­ obsahovat 3 textové řetězce oddělené mezerami.'; $wb['aux_txt'] = 'Priorita'; $wb['ttl_range_error'] = 'Min. TTL doba je 60 sekund.'; -?> diff --git a/interface/web/dns/lib/lang/cz_dns_sshfp.lng b/interface/web/dns/lib/lang/cz_dns_sshfp.lng new file mode 100644 index 0000000000000000000000000000000000000000..1fa6fa87d121d037ad84fbc999704d51601c6bca --- /dev/null +++ b/interface/web/dns/lib/lang/cz_dns_sshfp.lng @@ -0,0 +1,15 @@ + diff --git a/interface/web/dns/lib/lang/cz_dns_template_list.lng b/interface/web/dns/lib/lang/cz_dns_template_list.lng index a4b2e406570122e186931bf8964ae12fc5609852..f67137b7d7688fb2e8c864fbc7a14632df65abff 100644 --- a/interface/web/dns/lib/lang/cz_dns_template_list.lng +++ b/interface/web/dns/lib/lang/cz_dns_template_list.lng @@ -3,4 +3,3 @@ $wb['list_head_txt'] = 'DNS průvodce šablonou'; $wb['visible_txt'] = 'Viditelný'; $wb['name_txt'] = 'Název'; $wb['add_new_record_txt'] = 'Vytvořit záznam'; -?> diff --git a/interface/web/dns/lib/lang/cz_dns_tlsa.lng b/interface/web/dns/lib/lang/cz_dns_tlsa.lng index 3891ad37c7a8cb1965453a6eab585eedd9734327..10bc29a57dea3c544450a34d2c1c0176a45874ec 100644 --- a/interface/web/dns/lib/lang/cz_dns_tlsa.lng +++ b/interface/web/dns/lib/lang/cz_dns_tlsa.lng @@ -1,6 +1,6 @@ diff --git a/interface/web/dns/lib/lang/cz_dns_txt.lng b/interface/web/dns/lib/lang/cz_dns_txt.lng index 4912f965b36329a9317d8cd48f0674aeab14bbbb..bb4549993f03e75b382a1f4e67ec0141906c9db6 100644 --- a/interface/web/dns/lib/lang/cz_dns_txt.lng +++ b/interface/web/dns/lib/lang/cz_dns_txt.lng @@ -16,4 +16,3 @@ $wb['ttl_range_error'] = 'Min. TTL doba je 60 sekund.'; $wb['invalid_type_dkim'] = 'Přímá editace DKIM záznamu zde není povolena. Editujte záznam pomocí tlačítka DKIM.'; $wb['invalid_type_dmarc'] = 'Přímá editace DMARC záznamu zde není povolena. Editujte záznam pomocí tlačítka DMARC.'; $wb['invalid_type_spf'] = 'Přímá editace SPF záznamu zde není povolena. Editujte záznam pomocí tlačítka SPF.'; -?> diff --git a/interface/web/dns/lib/lang/cz_dns_wizard.lng b/interface/web/dns/lib/lang/cz_dns_wizard.lng index a4a1ddf53946f4e90396df441afba9e08a0cacbf..21d9170838913077d186ed2a10c9f1179293258e 100644 --- a/interface/web/dns/lib/lang/cz_dns_wizard.lng +++ b/interface/web/dns/lib/lang/cz_dns_wizard.lng @@ -42,4 +42,3 @@ $wb['error_no_server_id'] = 'No server provided.'; $wb['error_not_allowed_server_id'] = 'Vybraný server není pro tento účet povolen.'; $wb['dnssec_txt'] = 'Podepsat zónu (DNSSEC)'; $wb['limit_dns_zone_txt'] = 'The max. number of DNS zones for your account is reached.'; -?> diff --git a/interface/web/dns/lib/lang/de.lng b/interface/web/dns/lib/lang/de.lng index 822fcd6a796f3b2a8235a001c972f1ce49c5dcc3..5f496af335ffb555c2b0c29fa73a07af65de8777 100644 --- a/interface/web/dns/lib/lang/de.lng +++ b/interface/web/dns/lib/lang/de.lng @@ -4,10 +4,10 @@ $wb['Zones'] = 'Zonen'; $wb['DNS A'] = 'DNS A'; $wb['DNS ALIAS'] = 'DNS ALIAS'; $wb['DNS CNAME'] = 'DNS CNAME'; -$wb['DNS hinfo'] = 'DNS hinfo'; -$wb['DNS mx'] = 'DNS mx'; -$wb['DNS ns'] = 'DNS ns'; -$wb['DNS ptr'] = 'DNS ptr'; +$wb['DNS hinfo'] = 'DNS HINFO'; +$wb['DNS mx'] = 'DNS MX'; +$wb['DNS ns'] = 'DNS NS'; +$wb['DNS ptr'] = 'DNS PTR'; $wb['DNS RP'] = 'DNS RP'; $wb['DNS Zone'] = 'DNS Zone'; $wb['Records'] = 'Einträge'; diff --git a/interface/web/dns/lib/lang/de_dns_a.lng b/interface/web/dns/lib/lang/de_dns_a.lng index 564a9318de54dbdd1031818a9e46482e9e7e0e3c..6a3a5fd8e6e8349e89a10c29ebb558c972104930 100644 --- a/interface/web/dns/lib/lang/de_dns_a.lng +++ b/interface/web/dns/lib/lang/de_dns_a.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Der Hostname ist leer.'; $wb['name_error_regex'] = 'Der Hostname hat das falsche Format.'; $wb['data_error_empty'] = 'IPv4 Adresse ist leer'; $wb['ip_error_wrong'] = 'IPv4 Adressen Format ist ungültig'; -$wb['data_error_duplicate'] = 'Doppelter A oder CNAME Eintrag'; +$wb['data_error_duplicate'] = 'Duplicate A, ALIAS or CNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/de_dns_aaaa.lng b/interface/web/dns/lib/lang/de_dns_aaaa.lng index 4fe054d36799e9cbd24d15f709c17ee18e956abb..518820a8fce0021124b811bbfe322007957eaeb4 100644 --- a/interface/web/dns/lib/lang/de_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/de_dns_aaaa.lng @@ -11,6 +11,7 @@ $wb['no_zone_perm'] = 'Sie haben nicht die Berechtigung, einen Eintrag zu dieser $wb['name_error_empty'] = 'Der Hostname ist leer.'; $wb['name_error_regex'] = 'Der Hostname hat das falsche Format.'; $wb['data_error_empty'] = 'IPv6 Adresse ist leer'; +$wb['data_error_duplicate'] = 'Duplicate AAAA, ALIAS or CNAME record'; $wb['ip_error_wrong'] = 'IPv6 Adressen Format ist ungültig'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/de_dns_alias.lng b/interface/web/dns/lib/lang/de_dns_alias.lng index 60eec60b601cf81673e80a24a72804081c620be6..3fdac9d68d0ffb834306f9fafad8858d64d280a2 100644 --- a/interface/web/dns/lib/lang/de_dns_alias.lng +++ b/interface/web/dns/lib/lang/de_dns_alias.lng @@ -12,5 +12,6 @@ $wb['name_error_empty'] = 'Der Hostname ist leer.'; $wb['name_error_regex'] = 'Der Hostname hat ein falsches Format.'; $wb['data_error_empty'] = 'Ziel Hostname ist leer'; $wb['data_error_regex'] = 'Ziel Hostname Format ist ungültig'; +$wb['data_error_duplicate'] = 'Duplicate A, AAAA, ALIAS, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/de_dns_cname.lng b/interface/web/dns/lib/lang/de_dns_cname.lng index 6f9b0eecb40ee39eb405598f49eef6261c7a0ca1..325c1ce3d168270b1e057d987060817b8e658c9f 100644 --- a/interface/web/dns/lib/lang/de_dns_cname.lng +++ b/interface/web/dns/lib/lang/de_dns_cname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Der Hostname ist leer.'; $wb['name_error_regex'] = 'Der Hostname hat das falsche Format.'; $wb['data_error_empty'] = 'Ziel Hostname ist leer'; $wb['data_error_regex'] = 'Ziel Hostname Format ist ungültig'; -$wb['data_error_duplicate'] = 'Doppelter A oder CNAME Eintrag'; +$wb['data_error_duplicate'] = 'Duplicate A, AAAA, ALIAS, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/de_dns_dname.lng b/interface/web/dns/lib/lang/de_dns_dname.lng new file mode 100644 index 0000000000000000000000000000000000000000..492613e75b40acda200c38e799a57b7927e5712e --- /dev/null +++ b/interface/web/dns/lib/lang/de_dns_dname.lng @@ -0,0 +1,17 @@ + diff --git a/interface/web/dns/lib/lang/de_dns_import.lng b/interface/web/dns/lib/lang/de_dns_import.lng index f33d304a0dafd1902fc13a14b99f7bb32fe2019c..31db13932e2476cb0b5b94f397000d58e4e1ca53 100644 --- a/interface/web/dns/lib/lang/de_dns_import.lng +++ b/interface/web/dns/lib/lang/de_dns_import.lng @@ -13,4 +13,13 @@ $wb['title'] = 'Zonen Datei importieren'; $wb['no_file_uploaded_error'] = 'Keine Datei hochgeladen'; $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.'; ?> diff --git a/interface/web/dns/lib/lang/de_dns_naptr.lng b/interface/web/dns/lib/lang/de_dns_naptr.lng new file mode 100644 index 0000000000000000000000000000000000000000..b39373c13de1d5b288b85d4ebeef8696a09d3af6 --- /dev/null +++ b/interface/web/dns/lib/lang/de_dns_naptr.lng @@ -0,0 +1,21 @@ + diff --git a/interface/web/dns/lib/lang/de_dns_soa.lng b/interface/web/dns/lib/lang/de_dns_soa.lng index 35d0e54ccdfd1ceeadd13a7ca2f9db0041330639..7338e154338c1a8bd2978c4c3fc5cbbb40a83913 100644 --- a/interface/web/dns/lib/lang/de_dns_soa.lng +++ b/interface/web/dns/lib/lang/de_dns_soa.lng @@ -7,7 +7,7 @@ $wb['serial_txt'] = 'Seriennummer'; $wb['refresh_txt'] = 'Refresh'; $wb['retry_txt'] = 'Retry'; $wb['expire_txt'] = 'Expire'; -$wb['minimum_txt'] = 'Minimum'; +$wb['minimum_txt'] = 'Minimum (negative cache ttl)'; $wb['ttl_txt'] = 'TTL'; $wb['xfer_txt'] = 'Zonentransfer zu diesen IP Adressen erlauben (mit Komma getrennte Liste)'; $wb['active_txt'] = 'Aktiv'; @@ -41,4 +41,7 @@ $wb['xfer_error_regex'] = 'Zonentransfer: Verwenden Sie eine oder mehrere durch $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['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/de_dns_soa_admin_list.lng b/interface/web/dns/lib/lang/de_dns_soa_admin_list.lng index 363369c65b366c099c76806faa9794b9610c4c54..294cd3b128d064b5f07d5e0f7d832f96520f2a37 100644 --- a/interface/web/dns/lib/lang/de_dns_soa_admin_list.lng +++ b/interface/web/dns/lib/lang/de_dns_soa_admin_list.lng @@ -7,5 +7,6 @@ $wb['ns_txt'] = 'NS'; $wb['mbox_txt'] = 'E-Mail'; $wb['add_new_record_txt'] = 'Neue DNS Zone (SOA) hinzufügen'; $wb['add_new_record_wizard_txt'] = 'Neue DNS Zone per Assistent hinzufügen'; +$wb['import_zone_file_txt'] = 'Import Zone File'; $wb['sys_groupid_txt'] = 'Kunde'; ?> diff --git a/interface/web/dns/lib/lang/de_dns_spf.lng b/interface/web/dns/lib/lang/de_dns_spf.lng index aec5595ad323afbb2212c79a529fb3cac4544828..d21f78015cfeba67aa81bd3c7565842cbce35100 100644 --- a/interface/web/dns/lib/lang/de_dns_spf.lng +++ b/interface/web/dns/lib/lang/de_dns_spf.lng @@ -1,5 +1,6 @@ edit the existing record?'; +$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['ttl_range_error'] = 'Min. TTL time ist 60 Sekunden.'; +$wb['name_error_regex'] = 'The hostname has the wrong format.'; $wb['limit_dns_record_txt'] = 'Die maximale Anzahl an DNS Einträgen für Ihr Konto wurde erreicht.'; $wb['no_zone_perm'] = 'Sie haben nicht die Berechtigung, einen Eintrag zu dieser DNS Zone hinzuzufügen.'; +$wb['btn_edit_as_txt_record_txt'] = 'Edit as TXT record'; ?> diff --git a/interface/web/dns/lib/lang/de_dns_sshfp.lng b/interface/web/dns/lib/lang/de_dns_sshfp.lng new file mode 100644 index 0000000000000000000000000000000000000000..eb2f83263af2bb4ad4f0d25d4b21ad86fffeaf75 --- /dev/null +++ b/interface/web/dns/lib/lang/de_dns_sshfp.lng @@ -0,0 +1,16 @@ + diff --git a/interface/web/dns/lib/lang/dk.lng b/interface/web/dns/lib/lang/dk.lng index 4f3fd7c2e5dc9fda3bd4f053c625fcccc4dde063..1c753d3492b7676c3167cbee96fa0d687a5cb67b 100644 --- a/interface/web/dns/lib/lang/dk.lng +++ b/interface/web/dns/lib/lang/dk.lng @@ -4,10 +4,10 @@ $wb['Zones'] = 'Zoner'; $wb['DNS A'] = 'DNS A'; $wb['DNS ALIAS'] = 'DNS ALIAS'; $wb['DNS CNAME'] = 'DNS CNAME'; -$wb['DNS hinfo'] = 'DNS hinfo'; -$wb['DNS mx'] = 'DNS mx'; -$wb['DNS ns'] = 'DNS ns'; -$wb['DNS ptr'] = 'DNS ptr'; +$wb['DNS hinfo'] = 'DNS HINFO'; +$wb['DNS mx'] = 'DNS MX'; +$wb['DNS ns'] = 'DNS NS'; +$wb['DNS ptr'] = 'DNS PTR'; $wb['DNS RP'] = 'DNS RP'; $wb['DNS Zone'] = 'DNS Zone'; $wb['Records'] = 'Poster'; diff --git a/interface/web/dns/lib/lang/dk_dns_a.lng b/interface/web/dns/lib/lang/dk_dns_a.lng index b10dae13ac57b4c7dece3b7692f7d082522b1b1f..f89aca476518b2e39cb070b31829671457c44f64 100644 --- a/interface/web/dns/lib/lang/dk_dns_a.lng +++ b/interface/web/dns/lib/lang/dk_dns_a.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'Du har ikke tilladelse til at tilføje en post til denne $wb['name_error_empty'] = 'Værtsnavnet er tomt.'; $wb['name_error_regex'] = 'Værtsnavnet har et forkert format.'; $wb['data_error_empty'] = 'IP-Adressen er tom'; -$wb['data_error_duplicate'] = 'Dupliker A-Record eller CNAME-Record'; +$wb['data_error_duplicate'] = 'Duplicate A, ALIAS or CNAME record'; $wb['ttl_range_error'] = 'Min. TTL tid er 60 sekunder.'; $wb['ip_error_wrong'] = 'IP-Address format invalid'; ?> diff --git a/interface/web/dns/lib/lang/dk_dns_aaaa.lng b/interface/web/dns/lib/lang/dk_dns_aaaa.lng index 664d63b41c4b6f401b17e1b0a9422b71bc418588..d6e00bc9d0cb36dc76b9a59e3c727387fbabac70 100644 --- a/interface/web/dns/lib/lang/dk_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/dk_dns_aaaa.lng @@ -11,6 +11,7 @@ $wb['no_zone_perm'] = 'Du har ikke tilladelse til at tilføje en post til denne $wb['name_error_empty'] = 'Værtsnavnet er tomt.'; $wb['name_error_regex'] = 'Værtsnavnet har et forkert format.'; $wb['data_error_empty'] = 'IP-Adressen er tom'; +$wb['data_error_duplicate'] = 'Duplicate AAAA, ALIAS or CNAME record'; $wb['ttl_range_error'] = 'Min. TTL tid er 60 sekunder.'; $wb['ip_error_wrong'] = 'IP-Address format invalid'; ?> diff --git a/interface/web/dns/lib/lang/dk_dns_alias.lng b/interface/web/dns/lib/lang/dk_dns_alias.lng index ca21de01eca2b985c7338731344606d786df5abb..a17fab0e2b87343571a54b8cc5ec754f624d8220 100644 --- a/interface/web/dns/lib/lang/dk_dns_alias.lng +++ b/interface/web/dns/lib/lang/dk_dns_alias.lng @@ -12,5 +12,6 @@ $wb['name_error_empty'] = 'Værtsnavnet er tomt.'; $wb['name_error_regex'] = 'Værtsnavnet har forkert format.'; $wb['data_error_empty'] = 'Mål-værtsnavn er tom'; $wb['data_error_regex'] = 'Mål-værtsnavn format er ugyldig'; +$wb['data_error_duplicate'] = 'Duplicate A, AAAA, ALIAS, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL tid er 60 sekunder.'; ?> diff --git a/interface/web/dns/lib/lang/dk_dns_caa.lng b/interface/web/dns/lib/lang/dk_dns_caa.lng index 973a97ceb6870404d7c8107002e1738b373362a0..8040cb4d549f3bc060a5b9ace62f711715446b0f 100644 --- a/interface/web/dns/lib/lang/dk_dns_caa.lng +++ b/interface/web/dns/lib/lang/dk_dns_caa.lng @@ -1,7 +1,7 @@ diff --git a/interface/web/dns/lib/lang/dk_dns_dname.lng b/interface/web/dns/lib/lang/dk_dns_dname.lng new file mode 100644 index 0000000000000000000000000000000000000000..0e651af8d35e706c920475a159292e6d5399f836 --- /dev/null +++ b/interface/web/dns/lib/lang/dk_dns_dname.lng @@ -0,0 +1,17 @@ + diff --git a/interface/web/dns/lib/lang/dk_dns_import.lng b/interface/web/dns/lib/lang/dk_dns_import.lng index 9edbe20009f599620964237b9cb97d32312745f9..93357e11940d8d1a833e93a80f553bf1a8364ad5 100644 --- a/interface/web/dns/lib/lang/dk_dns_import.lng +++ b/interface/web/dns/lib/lang/dk_dns_import.lng @@ -13,4 +13,13 @@ $wb['title'] = 'Importer Zone Filer'; $wb['no_file_uploaded_error'] = 'Ingen zone-fil overført'; $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.'; ?> diff --git a/interface/web/dns/lib/lang/dk_dns_naptr.lng b/interface/web/dns/lib/lang/dk_dns_naptr.lng new file mode 100644 index 0000000000000000000000000000000000000000..b39373c13de1d5b288b85d4ebeef8696a09d3af6 --- /dev/null +++ b/interface/web/dns/lib/lang/dk_dns_naptr.lng @@ -0,0 +1,21 @@ + diff --git a/interface/web/dns/lib/lang/dk_dns_soa.lng b/interface/web/dns/lib/lang/dk_dns_soa.lng index 1c8c5cc53c415555b240266f33e8c17ac079d785..6759024041b91aa1c83db92fcd9503cb7b029639 100644 --- a/interface/web/dns/lib/lang/dk_dns_soa.lng +++ b/interface/web/dns/lib/lang/dk_dns_soa.lng @@ -7,7 +7,7 @@ $wb['serial_txt'] = 'Serial'; $wb['refresh_txt'] = 'Opfriske'; $wb['retry_txt'] = 'Prøv igen'; $wb['expire_txt'] = 'Udløber'; -$wb['minimum_txt'] = 'Minimum'; +$wb['minimum_txt'] = 'Minimum (negative cache ttl)'; $wb['ttl_txt'] = 'TTL'; $wb['xfer_txt'] = 'Tillad zone overførsler til
    disse IP-adresser (kommasepareret liste)'; $wb['active_txt'] = 'Aktiv'; @@ -41,4 +41,7 @@ $wb['dnssec_wanted_info'] = 'When disabling DNSSEC keys are not going to be dele $wb['error_not_allowed_server_id'] = 'The selected server is not allowed for this account.'; $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/dk_dns_soa_admin_list.lng b/interface/web/dns/lib/lang/dk_dns_soa_admin_list.lng index 32728405bb779326b1af8b733953c7d570642627..f25d33ee67f00efddf778198080b30b5c89f244c 100644 --- a/interface/web/dns/lib/lang/dk_dns_soa_admin_list.lng +++ b/interface/web/dns/lib/lang/dk_dns_soa_admin_list.lng @@ -7,5 +7,6 @@ $wb['ns_txt'] = 'NS'; $wb['mbox_txt'] = 'E-mail'; $wb['add_new_record_wizard_txt'] = 'Tilføj ny DNS Zone med Guide'; $wb['add_new_record_txt'] = 'Tilføj ny DNS Zone manuelt'; +$wb['import_zone_file_txt'] = 'Import Zone File'; $wb['sys_groupid_txt'] = 'Kunde'; ?> diff --git a/interface/web/dns/lib/lang/dk_dns_spf.lng b/interface/web/dns/lib/lang/dk_dns_spf.lng index df8d1fe1453faa2d4decfe0d3dc94cf19ff48458..0cbf77862f6619ad477913cefb5c4b5e248ddae6 100644 --- a/interface/web/dns/lib/lang/dk_dns_spf.lng +++ b/interface/web/dns/lib/lang/dk_dns_spf.lng @@ -1,5 +1,6 @@ edit the existing record?'; +$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'; ?> diff --git a/interface/web/dns/lib/lang/dk_dns_sshfp.lng b/interface/web/dns/lib/lang/dk_dns_sshfp.lng new file mode 100644 index 0000000000000000000000000000000000000000..dc9ad9a00634513f03aec6da53682d2842bae7b6 --- /dev/null +++ b/interface/web/dns/lib/lang/dk_dns_sshfp.lng @@ -0,0 +1,16 @@ + diff --git a/interface/web/dns/lib/lang/dk_dns_wizard.lng b/interface/web/dns/lib/lang/dk_dns_wizard.lng index 0448db2d8c4bff84b69030712ac1358edb90c374..7eff25353707dfc3d38a1fbe1a016a8ebe602101 100644 --- a/interface/web/dns/lib/lang/dk_dns_wizard.lng +++ b/interface/web/dns/lib/lang/dk_dns_wizard.lng @@ -5,7 +5,7 @@ $wb['dns_zone_txt'] = 'DNS Zone'; $wb['template_id_txt'] = 'Skabelon'; $wb['server_id_txt'] = 'Server'; $wb['client_txt'] = 'Kunde'; -$wb['btn_save_txt'] = 'Create DNS-Record'; +$wb['btn_save_txt'] = 'Create new DNS zone'; $wb['btn_cancel_txt'] = 'Annullere'; $wb['domain_txt'] = 'Domæne'; $wb['email_txt'] = 'E-mail'; diff --git a/interface/web/dns/lib/lang/el.lng b/interface/web/dns/lib/lang/el.lng index f76afed784a300b3fefefd12915a1585f93d5568..a0b423d2571076ab6ad2c756170beacc3259ad3f 100644 --- a/interface/web/dns/lib/lang/el.lng +++ b/interface/web/dns/lib/lang/el.lng @@ -4,10 +4,10 @@ $wb['Zones'] = 'Ζώνες'; $wb['DNS A'] = 'DNS A'; $wb['DNS ALIAS'] = 'DNS ALIAS'; $wb['DNS CNAME'] = 'DNS CNAME'; -$wb['DNS hinfo'] = 'DNS hinfo'; -$wb['DNS mx'] = 'DNS mx'; -$wb['DNS ns'] = 'DNS ns'; -$wb['DNS ptr'] = 'DNS ptr'; +$wb['DNS hinfo'] = 'DNS HINFO'; +$wb['DNS mx'] = 'DNS MX'; +$wb['DNS ns'] = 'DNS NS'; +$wb['DNS ptr'] = 'DNS PTR'; $wb['DNS RP'] = 'DNS RP'; $wb['DNS Zone'] = 'Ζώνη DNS'; $wb['Records'] = 'Εγγραφές'; diff --git a/interface/web/dns/lib/lang/el_dns_a.lng b/interface/web/dns/lib/lang/el_dns_a.lng index ca5f336d98b0f3e11448dd50a78aca721df2ec4c..fbe429ee25fec29e30b01bc34123366b196e4a5e 100644 --- a/interface/web/dns/lib/lang/el_dns_a.lng +++ b/interface/web/dns/lib/lang/el_dns_a.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Το hostname δεν έχει οριστεί.'; $wb['name_error_regex'] = 'Το hostname δεν έχει σωστή μορφοποίηση.'; $wb['data_error_empty'] = 'Η διεύθυνση IP είναι κενή'; $wb['ip_error_wrong'] = 'Διεύθυνση IP με μη έγκυρη μορφοποίηση'; -$wb['data_error_duplicate'] = 'Διπλή εγγραφή A-Record ή CNAME-Record'; +$wb['data_error_duplicate'] = 'Duplicate A, ALIAS or CNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/el_dns_aaaa.lng b/interface/web/dns/lib/lang/el_dns_aaaa.lng index 5ca896c732464dade830e64edabd23cb7abf795f..64830c58c0d1040f88e6e4807926163279cc2f48 100644 --- a/interface/web/dns/lib/lang/el_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/el_dns_aaaa.lng @@ -11,6 +11,7 @@ $wb['no_zone_perm'] = 'Δεν έχετε δικαίωμα να προσθέσε $wb['name_error_empty'] = 'Το hostname δεν έχει οριστεί.'; $wb['name_error_regex'] = 'Το hostname δεν έχει σωστή μορφοποίηση.'; $wb['data_error_empty'] = 'Διεύθυνση IP κενή'; +$wb['data_error_duplicate'] = 'Duplicate AAAA, ALIAS or CNAME record'; $wb['ip_error_wrong'] = 'Διεύθυνση IP με μη έγκυρη μορφοποίηση'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/el_dns_alias.lng b/interface/web/dns/lib/lang/el_dns_alias.lng index 2e05e475da4aede8e81f17e0bf51dd7028c88725..f45fae103795f91279e7fff017e2021e718a1dc3 100644 --- a/interface/web/dns/lib/lang/el_dns_alias.lng +++ b/interface/web/dns/lib/lang/el_dns_alias.lng @@ -12,5 +12,6 @@ $wb['name_error_empty'] = 'Το hostname δεν έχει οριστεί'; $wb['name_error_regex'] = 'Το hostname έχει λάθος μορφοποίηση'; $wb['data_error_empty'] = 'Το hostname Προορισμός δεν έχει οριστεί'; $wb['data_error_regex'] = 'Το hostname Προορισμός έχει λάθος μορφοποίηση'; +$wb['data_error_duplicate'] = 'Duplicate A, AAAA, ALIAS, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/el_dns_caa.lng b/interface/web/dns/lib/lang/el_dns_caa.lng index 973a97ceb6870404d7c8107002e1738b373362a0..8040cb4d549f3bc060a5b9ace62f711715446b0f 100644 --- a/interface/web/dns/lib/lang/el_dns_caa.lng +++ b/interface/web/dns/lib/lang/el_dns_caa.lng @@ -1,7 +1,7 @@ diff --git a/interface/web/dns/lib/lang/el_dns_dname.lng b/interface/web/dns/lib/lang/el_dns_dname.lng new file mode 100644 index 0000000000000000000000000000000000000000..6623e1f8af354fe71a53390a1bb3e3ae7639fa23 --- /dev/null +++ b/interface/web/dns/lib/lang/el_dns_dname.lng @@ -0,0 +1,17 @@ + diff --git a/interface/web/dns/lib/lang/el_dns_import.lng b/interface/web/dns/lib/lang/el_dns_import.lng index 8f67eba14c74cf72fbf18fc031dc1896de3fc21a..3fc63992ed75d7262ee09d7726130a858bcf5fed 100644 --- a/interface/web/dns/lib/lang/el_dns_import.lng +++ b/interface/web/dns/lib/lang/el_dns_import.lng @@ -4,13 +4,22 @@ $wb['client_txt'] = 'Client'; $wb['btn_save_txt'] = 'Import Zonefile'; $wb['btn_cancel_txt'] = 'Cancel'; $wb['domain_txt'] = 'Domain'; -$wb['zone_file_successfully_imported_txt'] = 'The zone file has successfully been imported!'; -$wb['error_no_valid_zone_file_txt'] = 'This appears to be no valid zone file!'; +$wb['zone_file_successfully_imported_txt'] = 'The zone file has successfully been imported.'; +$wb['error_no_valid_zone_file_txt'] = 'This zone file appears invalid.'; $wb['zonefile_to_import_txt'] = 'Zone File'; -$wb['domain_field_desc_txt'] = 'Can be left empty if domain name is in the filename or the zone-file content.'; +$wb['domain_field_desc_txt'] = 'If empty, domain name is taken from SOA record.'; $wb['title'] = 'Import Zone Files'; $wb['no_file_uploaded_error'] = 'No zonefile uploaded'; $wb['zone_file_import_txt'] = 'Zone File Import'; $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.'; ?> diff --git a/interface/web/dns/lib/lang/el_dns_naptr.lng b/interface/web/dns/lib/lang/el_dns_naptr.lng new file mode 100644 index 0000000000000000000000000000000000000000..b39373c13de1d5b288b85d4ebeef8696a09d3af6 --- /dev/null +++ b/interface/web/dns/lib/lang/el_dns_naptr.lng @@ -0,0 +1,21 @@ + diff --git a/interface/web/dns/lib/lang/el_dns_soa.lng b/interface/web/dns/lib/lang/el_dns_soa.lng index 4d8c876d28aab75d4c6e893dcd1667363f9cf758..4ceed78dc9ebc0e515b048a91fb768c6d92ab0d6 100644 --- a/interface/web/dns/lib/lang/el_dns_soa.lng +++ b/interface/web/dns/lib/lang/el_dns_soa.lng @@ -34,11 +34,14 @@ $wb['retry_range_error'] = 'Min. Retry time is 60 seconds.'; $wb['expire_range_error'] = 'Min. Expire time is 60 seconds.'; $wb['minimum_range_error'] = 'Min. Minimum time is 60 seconds.'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; -$wb['xfer_error_regex'] = 'Also notify: Please use an IP address.'; +$wb['xfer_error_regex'] = 'Zone transfers: Please use a valid IP range, one or more IP addresses separated by a comma or use the keyword: any'; $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['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_admin_list.lng b/interface/web/dns/lib/lang/el_dns_soa_admin_list.lng index 183d1a8349ad9bab096fe27b0f73055fb103ff52..74ba7859000dbc3a9aa24393bdd3415d58e9d597 100644 --- a/interface/web/dns/lib/lang/el_dns_soa_admin_list.lng +++ b/interface/web/dns/lib/lang/el_dns_soa_admin_list.lng @@ -7,5 +7,6 @@ $wb['ns_txt'] = 'NS'; $wb['mbox_txt'] = 'Email'; $wb['add_new_record_wizard_txt'] = 'Add new DNS Zone with Wizard'; $wb['add_new_record_txt'] = 'Add new DNS Zone manually'; +$wb['import_zone_file_txt'] = 'Import Zone File'; $wb['sys_groupid_txt'] = 'Client'; ?> diff --git a/interface/web/dns/lib/lang/el_dns_spf.lng b/interface/web/dns/lib/lang/el_dns_spf.lng index df8d1fe1453faa2d4decfe0d3dc94cf19ff48458..0cbf77862f6619ad477913cefb5c4b5e248ddae6 100644 --- a/interface/web/dns/lib/lang/el_dns_spf.lng +++ b/interface/web/dns/lib/lang/el_dns_spf.lng @@ -1,5 +1,6 @@ edit the existing record?'; +$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'; ?> diff --git a/interface/web/dns/lib/lang/el_dns_sshfp.lng b/interface/web/dns/lib/lang/el_dns_sshfp.lng new file mode 100644 index 0000000000000000000000000000000000000000..dc9ad9a00634513f03aec6da53682d2842bae7b6 --- /dev/null +++ b/interface/web/dns/lib/lang/el_dns_sshfp.lng @@ -0,0 +1,16 @@ + diff --git a/interface/web/dns/lib/lang/en.lng b/interface/web/dns/lib/lang/en.lng index 3758933c3d73b19534c46b63758efa4147c0b016..4692d9f7d4abcf5292645c0bbf465dcdc5d2c50a 100644 --- a/interface/web/dns/lib/lang/en.lng +++ b/interface/web/dns/lib/lang/en.lng @@ -5,10 +5,10 @@ $wb['Zones'] = 'Zones'; $wb['DNS A'] = 'DNS A'; $wb['DNS ALIAS'] = 'DNS ALIAS'; $wb['DNS CNAME'] = 'DNS CNAME'; -$wb['DNS hinfo'] = 'DNS hinfo'; -$wb['DNS mx'] = 'DNS mx'; -$wb['DNS ns'] = 'DNS ns'; -$wb['DNS ptr'] = 'DNS ptr'; +$wb['DNS hinfo'] = 'DNS HINFO'; +$wb['DNS mx'] = 'DNS MX'; +$wb['DNS ns'] = 'DNS NS'; +$wb['DNS ptr'] = 'DNS PTR'; $wb['DNS RP'] = 'DNS RP'; $wb['DNS Zone'] = 'DNS Zone'; $wb['Records'] = 'Records'; diff --git a/interface/web/dns/lib/lang/en_dns_a.lng b/interface/web/dns/lib/lang/en_dns_a.lng index dbba7fb6e8f11f41456a53342305ac907b196826..36e5b50eb3836c822c58565386d260e5b581476d 100644 --- a/interface/web/dns/lib/lang/en_dns_a.lng +++ b/interface/web/dns/lib/lang/en_dns_a.lng @@ -1,17 +1,17 @@ \ No newline at end of file +?> diff --git a/interface/web/dns/lib/lang/en_dns_a_list.lng b/interface/web/dns/lib/lang/en_dns_a_list.lng index 267049b398c4c70d71c6a35b941aa2b54fd03aea..9993f84ac3b25174969ced38333c27e3dae09b10 100644 --- a/interface/web/dns/lib/lang/en_dns_a_list.lng +++ b/interface/web/dns/lib/lang/en_dns_a_list.lng @@ -1,15 +1,15 @@ \ No newline at end of file diff --git a/interface/web/dns/lib/lang/en_dns_aaaa.lng b/interface/web/dns/lib/lang/en_dns_aaaa.lng index 201a4d958479e7d7a08c20f76d2aa65ab2cc59db..41b0d2202127712b17c8517b1f2a5a8f64e6bea9 100644 --- a/interface/web/dns/lib/lang/en_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/en_dns_aaaa.lng @@ -1,16 +1,17 @@ \ No newline at end of file +?> diff --git a/interface/web/dns/lib/lang/en_dns_alias.lng b/interface/web/dns/lib/lang/en_dns_alias.lng index 35c0e0451adadbf13800f1f91a5d6c6874e3dcce..64a5082d6435e5fdb2b1f1bc53834d74144ba9a6 100644 --- a/interface/web/dns/lib/lang/en_dns_alias.lng +++ b/interface/web/dns/lib/lang/en_dns_alias.lng @@ -1,16 +1,17 @@ \ No newline at end of file diff --git a/interface/web/dns/lib/lang/en_dns_caa.lng b/interface/web/dns/lib/lang/en_dns_caa.lng index bf5b2ac8e1a8a4c34a001ffc843e1338bf54d3ce..d39ea7b894905194603863d12552818b13209a0c 100644 --- a/interface/web/dns/lib/lang/en_dns_caa.lng +++ b/interface/web/dns/lib/lang/en_dns_caa.lng @@ -1,5 +1,5 @@ \ No newline at end of file +?> diff --git a/interface/web/dns/lib/lang/en_dns_dkim.lng b/interface/web/dns/lib/lang/en_dns_dkim.lng index e1adcb9144f9fe9c97012e39005c169104c8ef3e..4d45fb4fe95d87134331a593c81c6994bafab57c 100644 --- a/interface/web/dns/lib/lang/en_dns_dkim.lng +++ b/interface/web/dns/lib/lang/en_dns_dkim.lng @@ -1,11 +1,11 @@ diff --git a/interface/web/dns/lib/lang/en_dns_ds.lng b/interface/web/dns/lib/lang/en_dns_ds.lng index 3f9b447811389dc80a42c129cd5a7bc5792ee75b..2d1a721865d9b064c7816f6468551014977c08c9 100644 --- a/interface/web/dns/lib/lang/en_dns_ds.lng +++ b/interface/web/dns/lib/lang/en_dns_ds.lng @@ -1,17 +1,17 @@ \ No newline at end of file diff --git a/interface/web/dns/lib/lang/en_dns_import.lng b/interface/web/dns/lib/lang/en_dns_import.lng index c80722c3c18d2d4c44e2a218e35506c381d40b82..0b9681b22758908dead72a67084788587c1486ae 100644 --- a/interface/web/dns/lib/lang/en_dns_import.lng +++ b/interface/web/dns/lib/lang/en_dns_import.lng @@ -2,15 +2,24 @@ $wb['zone_file_import_txt'] = 'Zone File Import'; $wb['server_id_txt'] = 'Server'; $wb['client_txt'] = 'Client'; -$wb["btn_save_txt"] = 'Import Zonefile'; -$wb["btn_cancel_txt"] = 'Cancel'; +$wb['btn_save_txt'] = 'Import Zonefile'; +$wb['btn_cancel_txt'] = 'Cancel'; $wb['domain_txt'] = 'Domain'; -$wb['zone_file_successfully_imported_txt'] = 'The zone file has successfully been imported!'; -$wb['error_no_valid_zone_file_txt'] = 'This appears to be no valid zone file!'; +$wb['zone_file_successfully_imported_txt'] = 'The zone file has successfully been imported.'; +$wb['error_no_valid_zone_file_txt'] = 'This zone file appears invalid.'; $wb['zonefile_to_import_txt'] = 'Zone File'; -$wb['domain_field_desc_txt'] = 'Can be left empty if domain name is in the filename or the zone-file content.'; +$wb['domain_field_desc_txt'] = 'If empty, domain name is taken from SOA record.'; $wb['title'] = 'Import Zone Files'; -$wb['no_file_uploaded_error'] = 'No zonefile uploaded'; +$wb['no_file_uploaded_error'] = 'No zonefile uploaded.'; $wb['error_no_server_id'] = 'No server provided.'; $wb['error_not_allowed_server_id'] = 'The selected server is not allowed for this account.'; -?> \ No newline at end of file +$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.'; +?> diff --git a/interface/web/dns/lib/lang/en_dns_loc.lng b/interface/web/dns/lib/lang/en_dns_loc.lng index a2e3322bb6d175e6bb32a2cd91fdc7325fcd706a..dc9ad9a00634513f03aec6da53682d2842bae7b6 100644 --- a/interface/web/dns/lib/lang/en_dns_loc.lng +++ b/interface/web/dns/lib/lang/en_dns_loc.lng @@ -1,16 +1,16 @@ diff --git a/interface/web/dns/lib/lang/en_dns_mx.lng b/interface/web/dns/lib/lang/en_dns_mx.lng index 298568c16cd7129715a10c569b4c03bf200e111f..09892668638cb25d6ef4fa718a952100c82d3fb1 100644 --- a/interface/web/dns/lib/lang/en_dns_mx.lng +++ b/interface/web/dns/lib/lang/en_dns_mx.lng @@ -1,18 +1,18 @@ \ No newline at end of file diff --git a/interface/web/dns/lib/lang/en_dns_naptr.lng b/interface/web/dns/lib/lang/en_dns_naptr.lng new file mode 100644 index 0000000000000000000000000000000000000000..b39373c13de1d5b288b85d4ebeef8696a09d3af6 --- /dev/null +++ b/interface/web/dns/lib/lang/en_dns_naptr.lng @@ -0,0 +1,21 @@ + diff --git a/interface/web/dns/lib/lang/en_dns_ns.lng b/interface/web/dns/lib/lang/en_dns_ns.lng index 15678111791d504a110241079001c3111a318441..74dd32f6a5602039506d13627e76aaa1d072a4bb 100644 --- a/interface/web/dns/lib/lang/en_dns_ns.lng +++ b/interface/web/dns/lib/lang/en_dns_ns.lng @@ -1,16 +1,16 @@ \ No newline at end of file diff --git a/interface/web/dns/lib/lang/en_dns_ptr.lng b/interface/web/dns/lib/lang/en_dns_ptr.lng index e9ed6aeac6037d482872d39fcb6d78e86477cb3e..ece77aed3fc42a516e4d25d9c95bd0d0f967c00a 100644 --- a/interface/web/dns/lib/lang/en_dns_ptr.lng +++ b/interface/web/dns/lib/lang/en_dns_ptr.lng @@ -1,16 +1,16 @@ \ No newline at end of file diff --git a/interface/web/dns/lib/lang/en_dns_rp.lng b/interface/web/dns/lib/lang/en_dns_rp.lng index d3e76e711d458140f5aa946e11fd25fe9e992479..71cc9f2ee4d5d38f59fdf1c03ea20b4730e72642 100644 --- a/interface/web/dns/lib/lang/en_dns_rp.lng +++ b/interface/web/dns/lib/lang/en_dns_rp.lng @@ -1,16 +1,16 @@ \ No newline at end of file diff --git a/interface/web/dns/lib/lang/en_dns_slave.lng b/interface/web/dns/lib/lang/en_dns_slave.lng index 055bc69688014aa0d2e0ae5cb46fce616ee9966c..4de10b2769b14d9c8c9314ebb876d4f2e1f9a3fd 100644 --- a/interface/web/dns/lib/lang/en_dns_slave.lng +++ b/interface/web/dns/lib/lang/en_dns_slave.lng @@ -1,17 +1,17 @@ these IPs (comma separated list)'; -$wb["server_id_error_empty"] = 'No server selected'; -$wb["origin_error_empty"] = 'Zone empty.'; -$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['server_id_txt'] = 'Server'; +$wb['origin_txt'] = 'DNS-Zone'; +$wb['secondary_zone_txt'] = 'Secondary DNS Zone'; +$wb['ns_txt'] = 'NS (IP-address)'; +$wb['active_txt'] = 'Active'; +$wb['limit_dns_slave_zone_txt'] = 'The max. number of Secondary DNS zones for your account is reached.'; +$wb['client_txt'] = 'Client'; +$wb['xfer_txt'] = 'Allow zone transfers to
    these IPs (comma separated list)'; +$wb['server_id_error_empty'] = 'No server selected'; +$wb['origin_error_empty'] = 'Zone empty.'; +$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'; ?> diff --git a/interface/web/dns/lib/lang/en_dns_slave_admin_list.lng b/interface/web/dns/lib/lang/en_dns_slave_admin_list.lng index 43f67783ce527cd4994c63efc0aa2697e01b845e..59d84877c6057f3d30d3d13acf16d2f1bce70664 100644 --- a/interface/web/dns/lib/lang/en_dns_slave_admin_list.lng +++ b/interface/web/dns/lib/lang/en_dns_slave_admin_list.lng @@ -1,10 +1,10 @@ diff --git a/interface/web/dns/lib/lang/en_dns_slave_list.lng b/interface/web/dns/lib/lang/en_dns_slave_list.lng index 734604d16978e932a45c2db0f60d715c3f667a0d..e62eb0487687911cb5ad7d2eafda23abe5b0570a 100644 --- a/interface/web/dns/lib/lang/en_dns_slave_list.lng +++ b/interface/web/dns/lib/lang/en_dns_slave_list.lng @@ -1,9 +1,9 @@ diff --git a/interface/web/dns/lib/lang/en_dns_soa.lng b/interface/web/dns/lib/lang/en_dns_soa.lng index 03dd6834c9584916c86abeb5b8cab8b81a3585a0..a5f1adfae5cc688659c98937fcb3c7c6947fa51d 100644 --- a/interface/web/dns/lib/lang/en_dns_soa.lng +++ b/interface/web/dns/lib/lang/en_dns_soa.lng @@ -1,33 +1,33 @@ these IPs (comma separated list)'; -$wb["active_txt"] = 'Active'; +$wb['server_id_txt'] = 'Server'; +$wb['origin_txt'] = 'Zone (SOA)'; +$wb['ns_txt'] = 'NS'; +$wb['mbox_txt'] = 'Email'; +$wb['serial_txt'] = 'Serial'; +$wb['refresh_txt'] = 'Refresh'; +$wb['retry_txt'] = 'Retry'; +$wb['expire_txt'] = 'Expire'; +$wb['minimum_txt'] = 'Minimum (negative cache ttl)'; +$wb['ttl_txt'] = 'TTL'; +$wb['xfer_txt'] = 'Allow zone transfers to
    these IPs (comma separated list)'; +$wb['active_txt'] = 'Active'; $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["limit_dns_zone_txt"] = 'The max. number of DNS zones for your account is reached.'; -$wb["client_txt"] = 'Client'; -$wb["no_zone_perm"] = 'You do not have the permission to add a record to this DNS zone.'; -$wb["server_id_error_empty"] = 'No server selected'; -$wb["origin_error_empty"] = 'Zone empty.'; -$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["mbox_error_empty"] = 'Email is empty.'; -$wb["mbox_error_regex"] = 'Email format invalid.'; -$wb["also_notify_txt"] = 'Also Notify'; -$wb['also_notify_error_regex'] = 'Also notify: Please use an IP address.'; -$wb['xfer_error_regex'] = 'Xfer: Please use one or more IP addresses, separated by , or use the keyword: any'; -$wb["update_acl_txt"] = 'Update ACL'; +$wb['limit_dns_zone_txt'] = 'The max. number of DNS zones for your account is reached.'; +$wb['client_txt'] = 'Client'; +$wb['no_zone_perm'] = 'You do not have the permission to add a record to this DNS zone.'; +$wb['server_id_error_empty'] = 'No server selected'; +$wb['origin_error_empty'] = 'Zone empty.'; +$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['mbox_error_empty'] = 'Email is empty.'; +$wb['mbox_error_regex'] = 'Email format invalid.'; +$wb['also_notify_txt'] = 'Also Notify'; +$wb['also_notify_error_regex'] = 'Also notify: Please use a valid IP range, one or more IP addresses separated by a comma or use the keyword: any'; +$wb['xfer_error_regex'] = 'Zone transfers: Please use a valid IP range, one or more IP addresses separated by a comma or use the keyword: any'; +$wb['update_acl_txt'] = 'Update ACL'; $wb['seconds_txt'] = 'Seconds'; $wb['eg_domain_tld'] = 'e.g. domain.tld'; $wb['eg_ns1_domain_tld'] = 'e.g. ns1.domain.tld'; @@ -41,4 +41,7 @@ $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; $wb['error_not_allowed_server_id'] = 'The selected server is not allowed for this account.'; $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/en_dns_soa_admin_list.lng b/interface/web/dns/lib/lang/en_dns_soa_admin_list.lng index 44cec900b91c118424bf2ddd98b5d0d530d42776..74ba7859000dbc3a9aa24393bdd3415d58e9d597 100644 --- a/interface/web/dns/lib/lang/en_dns_soa_admin_list.lng +++ b/interface/web/dns/lib/lang/en_dns_soa_admin_list.lng @@ -1,11 +1,12 @@ diff --git a/interface/web/dns/lib/lang/en_dns_soa_list.lng b/interface/web/dns/lib/lang/en_dns_soa_list.lng index 95f9a9bd038f61d4fa30d082acc1bd6f5499a98b..2f704357f87dc458bff87b698f1c6944f3a16320 100644 --- a/interface/web/dns/lib/lang/en_dns_soa_list.lng +++ b/interface/web/dns/lib/lang/en_dns_soa_list.lng @@ -1,11 +1,11 @@ diff --git a/interface/web/dns/lib/lang/en_dns_spf.lng b/interface/web/dns/lib/lang/en_dns_spf.lng index 7ac24dd227b26b9a34faa0b6877a8a7c5a53b99a..674cbad33ada1fa0f506467deac707a919232fdc 100644 --- a/interface/web/dns/lib/lang/en_dns_spf.lng +++ b/interface/web/dns/lib/lang/en_dns_spf.lng @@ -2,6 +2,7 @@ edit the existing record?'; +$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'; ?> - diff --git a/interface/web/dns/lib/lang/en_dns_srv.lng b/interface/web/dns/lib/lang/en_dns_srv.lng index a90be0310242dce4d13678ce4804a80960c6bedc..1a8a4a2d2ba8137e39a02e22c7bc6226e39a0112 100644 --- a/interface/web/dns/lib/lang/en_dns_srv.lng +++ b/interface/web/dns/lib/lang/en_dns_srv.lng @@ -1,20 +1,20 @@ \ No newline at end of file diff --git a/interface/web/dns/lib/lang/en_dns_sshfp.lng b/interface/web/dns/lib/lang/en_dns_sshfp.lng new file mode 100644 index 0000000000000000000000000000000000000000..dc9ad9a00634513f03aec6da53682d2842bae7b6 --- /dev/null +++ b/interface/web/dns/lib/lang/en_dns_sshfp.lng @@ -0,0 +1,16 @@ + diff --git a/interface/web/dns/lib/lang/en_dns_template.lng b/interface/web/dns/lib/lang/en_dns_template.lng index 426ff2c42015ce4c9327c022be1931e13b234eaf..6fec412cca68a218184116674265d4cc9d0ede72 100644 --- a/interface/web/dns/lib/lang/en_dns_template.lng +++ b/interface/web/dns/lib/lang/en_dns_template.lng @@ -1,7 +1,7 @@ \ No newline at end of file diff --git a/interface/web/dns/lib/lang/en_dns_template_list.lng b/interface/web/dns/lib/lang/en_dns_template_list.lng index c7d49817ef232000a9401324c9ad9ee92b932471..a8a56b355377a6d135a4ab39d036a416636ec644 100644 --- a/interface/web/dns/lib/lang/en_dns_template_list.lng +++ b/interface/web/dns/lib/lang/en_dns_template_list.lng @@ -1,6 +1,6 @@ \ No newline at end of file diff --git a/interface/web/dns/lib/lang/en_dns_tlsa.lng b/interface/web/dns/lib/lang/en_dns_tlsa.lng index dcfb3bfa333d0c65f05f397e7ce4549e6753019b..ad9ae26ac8c494260d8b00fed73dcd283e442169 100644 --- a/interface/web/dns/lib/lang/en_dns_tlsa.lng +++ b/interface/web/dns/lib/lang/en_dns_tlsa.lng @@ -1,16 +1,16 @@ \ No newline at end of file diff --git a/interface/web/dns/lib/lang/en_dns_txt.lng b/interface/web/dns/lib/lang/en_dns_txt.lng index 658b0ddf83e841c2de5f0e2a9beefdcd10d3b9af..ecbb5215cb1724643d080dcc5ed88c1ac1eb0767 100644 --- a/interface/web/dns/lib/lang/en_dns_txt.lng +++ b/interface/web/dns/lib/lang/en_dns_txt.lng @@ -1,17 +1,17 @@ diff --git a/interface/web/dns/lib/lang/es.lng b/interface/web/dns/lib/lang/es.lng old mode 100755 new mode 100644 diff --git a/interface/web/dns/lib/lang/es_dns_a.lng b/interface/web/dns/lib/lang/es_dns_a.lng old mode 100755 new mode 100644 index f3ea858f1dbcef5b1dcd2fa385c39012b302c73a..d2238f0d53250b77652d0d36ec91e86829d01bfe --- a/interface/web/dns/lib/lang/es_dns_a.lng +++ b/interface/web/dns/lib/lang/es_dns_a.lng @@ -1,6 +1,6 @@ diff --git a/interface/web/dns/lib/lang/es_dns_ds.lng b/interface/web/dns/lib/lang/es_dns_ds.lng old mode 100755 new mode 100644 diff --git a/interface/web/dns/lib/lang/es_dns_hinfo.lng b/interface/web/dns/lib/lang/es_dns_hinfo.lng old mode 100755 new mode 100644 diff --git a/interface/web/dns/lib/lang/es_dns_import.lng b/interface/web/dns/lib/lang/es_dns_import.lng old mode 100755 new mode 100644 index 80b5eb463b661209f7f2f6a777278d7c4db8658b..db73b69e33602d1fbbea4ad1ee3ffbacf8c2b9af --- a/interface/web/dns/lib/lang/es_dns_import.lng +++ b/interface/web/dns/lib/lang/es_dns_import.lng @@ -13,4 +13,13 @@ $wb['title'] = 'Importar Archivo de Zona'; $wb['zone_file_import_txt'] = 'Importar archivo de zona'; $wb['zone_file_successfully_imported_txt'] = 'El archivo de zona se ha importado correctamente!'; $wb['zonefile_to_import_txt'] = 'Archivo de Zona'; +$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.'; ?> diff --git a/interface/web/dns/lib/lang/es_dns_loc.lng b/interface/web/dns/lib/lang/es_dns_loc.lng old mode 100755 new mode 100644 diff --git a/interface/web/dns/lib/lang/es_dns_mx.lng b/interface/web/dns/lib/lang/es_dns_mx.lng old mode 100755 new mode 100644 diff --git a/interface/web/dns/lib/lang/es_dns_naptr.lng b/interface/web/dns/lib/lang/es_dns_naptr.lng new file mode 100644 index 0000000000000000000000000000000000000000..b39373c13de1d5b288b85d4ebeef8696a09d3af6 --- /dev/null +++ b/interface/web/dns/lib/lang/es_dns_naptr.lng @@ -0,0 +1,21 @@ + diff --git a/interface/web/dns/lib/lang/es_dns_ns.lng b/interface/web/dns/lib/lang/es_dns_ns.lng old mode 100755 new mode 100644 diff --git a/interface/web/dns/lib/lang/es_dns_ptr.lng b/interface/web/dns/lib/lang/es_dns_ptr.lng old mode 100755 new mode 100644 diff --git a/interface/web/dns/lib/lang/es_dns_rp.lng b/interface/web/dns/lib/lang/es_dns_rp.lng old mode 100755 new mode 100644 diff --git a/interface/web/dns/lib/lang/es_dns_slave_admin_list.lng b/interface/web/dns/lib/lang/es_dns_slave_admin_list.lng old mode 100755 new mode 100644 diff --git a/interface/web/dns/lib/lang/es_dns_slave_list.lng b/interface/web/dns/lib/lang/es_dns_slave_list.lng old mode 100755 new mode 100644 diff --git a/interface/web/dns/lib/lang/es_dns_soa.lng b/interface/web/dns/lib/lang/es_dns_soa.lng old mode 100755 new mode 100644 index 23f4cc5ffcfb53f784333a43965cfdd740cbac0c..b1061373f509e8a120d4d4b5232a7f842f39dcae --- a/interface/web/dns/lib/lang/es_dns_soa.lng +++ b/interface/web/dns/lib/lang/es_dns_soa.lng @@ -41,4 +41,7 @@ $wb['update_acl_txt'] = 'Actualizar ACL'; $wb['xfer_error_regex'] = 'Notificar también a: Por favor, usa una dirección IP.'; $wb['xfer_txt'] = 'Permitir transferencia de zonas a
    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/es_dns_soa_admin_list.lng b/interface/web/dns/lib/lang/es_dns_soa_admin_list.lng old mode 100755 new mode 100644 index aeb2618de3d4f6aaa880e9796d351241290eec88..087ebd80edb8b05a30fbb4acead5bc3ce51651b2 --- a/interface/web/dns/lib/lang/es_dns_soa_admin_list.lng +++ b/interface/web/dns/lib/lang/es_dns_soa_admin_list.lng @@ -2,6 +2,7 @@ $wb['active_txt'] = 'Habilitado'; $wb['add_new_record_txt'] = 'Añadir nueva Zona DNS manualmente'; $wb['add_new_record_wizard_txt'] = 'Añadir nueva Zona DNS usando el asistente'; +$wb['import_zone_file_txt'] = 'Importar archivo de zona'; $wb['list_head_txt'] = 'Zonas DNS'; $wb['mbox_txt'] = 'Email'; $wb['ns_txt'] = 'NS'; diff --git a/interface/web/dns/lib/lang/es_dns_soa_list.lng b/interface/web/dns/lib/lang/es_dns_soa_list.lng old mode 100755 new mode 100644 diff --git a/interface/web/dns/lib/lang/es_dns_spf.lng b/interface/web/dns/lib/lang/es_dns_spf.lng old mode 100755 new mode 100644 index e4094672bb524276712d89d6dfd2820b97be6bb7..62c60654f0315adcc9ad801d66f627c050696498 --- a/interface/web/dns/lib/lang/es_dns_spf.lng +++ b/interface/web/dns/lib/lang/es_dns_spf.lng @@ -1,9 +1,12 @@ edit the existing record?'; +$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['spf_a_txt'] = 'Permitir a la dirección IP actual del dominio enviar correo electrónico para este dominio'; $wb['spf_domain_note_txt'] = '(dominios separados por espacios en blanco)'; $wb['spf_domain_txt'] = 'Cualquier dominio que pueda entregar o retransmitir correo para este dominio'; @@ -22,4 +25,6 @@ $wb['spf_mechanism_txt'] = 'Mecanismo SPF'; $wb['spf_mx_txt'] = 'Permite a los servidores configurados como MX enviar correos desde este dominio'; $wb['ttl_range_error'] = 'El tiempo mín. de TTL es 60 segundos.'; $wb['ttl_txt'] = 'TTL'; +$wb['name_error_regex'] = 'The hostname has the wrong format.'; +$wb['btn_edit_as_txt_record_txt'] = 'Edit as TXT record'; ?> diff --git a/interface/web/dns/lib/lang/es_dns_srv.lng b/interface/web/dns/lib/lang/es_dns_srv.lng old mode 100755 new mode 100644 diff --git a/interface/web/dns/lib/lang/es_dns_sshfp.lng b/interface/web/dns/lib/lang/es_dns_sshfp.lng new file mode 100644 index 0000000000000000000000000000000000000000..58292c007a14bbe01b614956c0863bb32ac0a33f --- /dev/null +++ b/interface/web/dns/lib/lang/es_dns_sshfp.lng @@ -0,0 +1,16 @@ + diff --git a/interface/web/dns/lib/lang/es_dns_template.lng b/interface/web/dns/lib/lang/es_dns_template.lng old mode 100755 new mode 100644 diff --git a/interface/web/dns/lib/lang/es_dns_template_list.lng b/interface/web/dns/lib/lang/es_dns_template_list.lng old mode 100755 new mode 100644 diff --git a/interface/web/dns/lib/lang/es_dns_tlsa.lng b/interface/web/dns/lib/lang/es_dns_tlsa.lng old mode 100755 new mode 100644 diff --git a/interface/web/dns/lib/lang/es_dns_txt.lng b/interface/web/dns/lib/lang/es_dns_txt.lng old mode 100755 new mode 100644 diff --git a/interface/web/dns/lib/lang/es_dns_wizard.lng b/interface/web/dns/lib/lang/es_dns_wizard.lng old mode 100755 new mode 100644 diff --git a/interface/web/dns/lib/lang/fi.lng b/interface/web/dns/lib/lang/fi.lng old mode 100755 new mode 100644 diff --git a/interface/web/dns/lib/lang/fi_dns_a.lng b/interface/web/dns/lib/lang/fi_dns_a.lng old mode 100755 new mode 100644 index a7cf6efbbb404cddabedf35b1f9a57d4a6f4a959..4a5cec203828622f8140b67362425597d1b70565 --- a/interface/web/dns/lib/lang/fi_dns_a.lng +++ b/interface/web/dns/lib/lang/fi_dns_a.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Verkkotunnus on tyhjä.'; $wb['name_error_regex'] = 'Verkkotunnus on vääränlainen.'; $wb['data_error_empty'] = 'IP-osoite tyhjä'; $wb['ip_error_wrong'] = 'IP-osoite on vääränlainen'; -$wb['data_error_duplicate'] = 'A-tietue on jo olemassa'; +$wb['data_error_duplicate'] = 'Duplicate A, ALIAS or CNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/fi_dns_a_list.lng b/interface/web/dns/lib/lang/fi_dns_a_list.lng old mode 100755 new mode 100644 diff --git a/interface/web/dns/lib/lang/fi_dns_aaaa.lng b/interface/web/dns/lib/lang/fi_dns_aaaa.lng index 78c65575fd57a6a9e57cdbf8c29e6f23dc9213a8..06a8a46b05c4b76e17eb1541e0711f651471dca3 100644 --- a/interface/web/dns/lib/lang/fi_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/fi_dns_aaaa.lng @@ -11,6 +11,7 @@ $wb['no_zone_perm'] = 'Käyttäjätunnuksella ei ole oikeuksia lisätä tietueit $wb['name_error_empty'] = 'Verkkotunnus on tyhjä.'; $wb['name_error_regex'] = 'Verkkotunnus on väärän muotoinen.'; $wb['data_error_empty'] = 'Tekstikenttä on tyhjä'; +$wb['data_error_duplicate'] = 'Duplicate AAAA, ALIAS or CNAME record'; $wb['ip_error_wrong'] = 'Tekstikenttä on vääränlainen'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/fi_dns_alias.lng b/interface/web/dns/lib/lang/fi_dns_alias.lng old mode 100755 new mode 100644 index 45078dc1f2c8c1837b48540b72360214d4461c37..fc3d922338229e62f3a631a00367b7c3cf5e87eb --- a/interface/web/dns/lib/lang/fi_dns_alias.lng +++ b/interface/web/dns/lib/lang/fi_dns_alias.lng @@ -12,5 +12,6 @@ $wb['name_error_empty'] = 'Aliasverkkotunnus on tyhjä.'; $wb['name_error_regex'] = 'Aliasverkkotunnus on vääränlainen.'; $wb['data_error_empty'] = 'Pääverkkotunnus on tyhjä'; $wb['data_error_regex'] = 'Pääverkkotunnus on vääränlainen'; +$wb['data_error_duplicate'] = 'Duplicate A, AAAA, ALIAS, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/fi_dns_caa.lng b/interface/web/dns/lib/lang/fi_dns_caa.lng index 82de234d6e545c0912f0694f63b07182429bfa58..8040cb4d549f3bc060a5b9ace62f711715446b0f 100644 --- a/interface/web/dns/lib/lang/fi_dns_caa.lng +++ b/interface/web/dns/lib/lang/fi_dns_caa.lng @@ -1,5 +1,5 @@ diff --git a/interface/web/dns/lib/lang/fi_dns_dname.lng b/interface/web/dns/lib/lang/fi_dns_dname.lng new file mode 100644 index 0000000000000000000000000000000000000000..58d5481afc36611fc8f6809dd2e65e54f37c2e90 --- /dev/null +++ b/interface/web/dns/lib/lang/fi_dns_dname.lng @@ -0,0 +1,17 @@ + diff --git a/interface/web/dns/lib/lang/fi_dns_hinfo.lng b/interface/web/dns/lib/lang/fi_dns_hinfo.lng old mode 100755 new mode 100644 diff --git a/interface/web/dns/lib/lang/fi_dns_import.lng b/interface/web/dns/lib/lang/fi_dns_import.lng index 8f67eba14c74cf72fbf18fc031dc1896de3fc21a..3fc63992ed75d7262ee09d7726130a858bcf5fed 100644 --- a/interface/web/dns/lib/lang/fi_dns_import.lng +++ b/interface/web/dns/lib/lang/fi_dns_import.lng @@ -4,13 +4,22 @@ $wb['client_txt'] = 'Client'; $wb['btn_save_txt'] = 'Import Zonefile'; $wb['btn_cancel_txt'] = 'Cancel'; $wb['domain_txt'] = 'Domain'; -$wb['zone_file_successfully_imported_txt'] = 'The zone file has successfully been imported!'; -$wb['error_no_valid_zone_file_txt'] = 'This appears to be no valid zone file!'; +$wb['zone_file_successfully_imported_txt'] = 'The zone file has successfully been imported.'; +$wb['error_no_valid_zone_file_txt'] = 'This zone file appears invalid.'; $wb['zonefile_to_import_txt'] = 'Zone File'; -$wb['domain_field_desc_txt'] = 'Can be left empty if domain name is in the filename or the zone-file content.'; +$wb['domain_field_desc_txt'] = 'If empty, domain name is taken from SOA record.'; $wb['title'] = 'Import Zone Files'; $wb['no_file_uploaded_error'] = 'No zonefile uploaded'; $wb['zone_file_import_txt'] = 'Zone File Import'; $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.'; ?> diff --git a/interface/web/dns/lib/lang/fi_dns_mx.lng b/interface/web/dns/lib/lang/fi_dns_mx.lng old mode 100755 new mode 100644 diff --git a/interface/web/dns/lib/lang/fi_dns_naptr.lng b/interface/web/dns/lib/lang/fi_dns_naptr.lng new file mode 100644 index 0000000000000000000000000000000000000000..b39373c13de1d5b288b85d4ebeef8696a09d3af6 --- /dev/null +++ b/interface/web/dns/lib/lang/fi_dns_naptr.lng @@ -0,0 +1,21 @@ + diff --git a/interface/web/dns/lib/lang/fi_dns_ns.lng b/interface/web/dns/lib/lang/fi_dns_ns.lng old mode 100755 new mode 100644 diff --git a/interface/web/dns/lib/lang/fi_dns_ptr.lng b/interface/web/dns/lib/lang/fi_dns_ptr.lng old mode 100755 new mode 100644 diff --git a/interface/web/dns/lib/lang/fi_dns_rp.lng b/interface/web/dns/lib/lang/fi_dns_rp.lng old mode 100755 new mode 100644 diff --git a/interface/web/dns/lib/lang/fi_dns_soa.lng b/interface/web/dns/lib/lang/fi_dns_soa.lng old mode 100755 new mode 100644 index 3e106259677bea687262bb3cc99098c89e901c9c..36f95abab06a827df30a77fc7cd2b60e850defae --- a/interface/web/dns/lib/lang/fi_dns_soa.lng +++ b/interface/web/dns/lib/lang/fi_dns_soa.lng @@ -22,7 +22,7 @@ $wb['ns_error_regex'] = 'Nimipalvelin-kenttä on tyhjä.'; $wb['mbox_error_empty'] = 'Sähköpostiosoite on tyhjä.'; $wb['mbox_error_regex'] = 'Sähköpostiosoite on vääränlainen'; $wb['also_notify_txt'] = 'Läheta ilmoitus'; -$wb['also_notify_error_regex'] = 'Please use an IP address.'; +$wb['also_notify_error_regex'] = 'Also notify: Please use a valid IP range, one or more IP addresses separated by a comma or use the keyword: any'; $wb['update_acl_txt'] = 'Päivitä ACL'; $wb['seconds_txt'] = 'Seconds'; $wb['eg_domain_tld'] = 'e.g. domain.tld'; @@ -34,11 +34,14 @@ $wb['retry_range_error'] = 'Min. Retry time is 60 seconds.'; $wb['expire_range_error'] = 'Min. Expire time is 60 seconds.'; $wb['minimum_range_error'] = 'Min. Minimum time is 60 seconds.'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; -$wb['xfer_error_regex'] = 'Also notify: Please use an IP address.'; +$wb['xfer_error_regex'] = 'Zone transfers: Please use a valid IP range, one or more IP addresses separated by a comma or use the keyword: any'; $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['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_admin_list.lng b/interface/web/dns/lib/lang/fi_dns_soa_admin_list.lng index 183d1a8349ad9bab096fe27b0f73055fb103ff52..74ba7859000dbc3a9aa24393bdd3415d58e9d597 100644 --- a/interface/web/dns/lib/lang/fi_dns_soa_admin_list.lng +++ b/interface/web/dns/lib/lang/fi_dns_soa_admin_list.lng @@ -7,5 +7,6 @@ $wb['ns_txt'] = 'NS'; $wb['mbox_txt'] = 'Email'; $wb['add_new_record_wizard_txt'] = 'Add new DNS Zone with Wizard'; $wb['add_new_record_txt'] = 'Add new DNS Zone manually'; +$wb['import_zone_file_txt'] = 'Import Zone File'; $wb['sys_groupid_txt'] = 'Client'; ?> diff --git a/interface/web/dns/lib/lang/fi_dns_soa_list.lng b/interface/web/dns/lib/lang/fi_dns_soa_list.lng old mode 100755 new mode 100644 diff --git a/interface/web/dns/lib/lang/fi_dns_spf.lng b/interface/web/dns/lib/lang/fi_dns_spf.lng index df8d1fe1453faa2d4decfe0d3dc94cf19ff48458..0cbf77862f6619ad477913cefb5c4b5e248ddae6 100644 --- a/interface/web/dns/lib/lang/fi_dns_spf.lng +++ b/interface/web/dns/lib/lang/fi_dns_spf.lng @@ -1,5 +1,6 @@ edit the existing record?'; +$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'; ?> diff --git a/interface/web/dns/lib/lang/fi_dns_srv.lng b/interface/web/dns/lib/lang/fi_dns_srv.lng old mode 100755 new mode 100644 diff --git a/interface/web/dns/lib/lang/fi_dns_sshfp.lng b/interface/web/dns/lib/lang/fi_dns_sshfp.lng new file mode 100644 index 0000000000000000000000000000000000000000..dc9ad9a00634513f03aec6da53682d2842bae7b6 --- /dev/null +++ b/interface/web/dns/lib/lang/fi_dns_sshfp.lng @@ -0,0 +1,16 @@ + diff --git a/interface/web/dns/lib/lang/fi_dns_template.lng b/interface/web/dns/lib/lang/fi_dns_template.lng old mode 100755 new mode 100644 diff --git a/interface/web/dns/lib/lang/fi_dns_template_list.lng b/interface/web/dns/lib/lang/fi_dns_template_list.lng old mode 100755 new mode 100644 diff --git a/interface/web/dns/lib/lang/fi_dns_txt.lng b/interface/web/dns/lib/lang/fi_dns_txt.lng old mode 100755 new mode 100644 diff --git a/interface/web/dns/lib/lang/fi_dns_wizard.lng b/interface/web/dns/lib/lang/fi_dns_wizard.lng old mode 100755 new mode 100644 diff --git a/interface/web/dns/lib/lang/fr_dns_a.lng b/interface/web/dns/lib/lang/fr_dns_a.lng index 381fd623a6d5c134b18ccb9eca91c4566126dc34..395bcd7d627fc45a55b1b76127bdd4dab388c626 100644 --- a/interface/web/dns/lib/lang/fr_dns_a.lng +++ b/interface/web/dns/lib/lang/fr_dns_a.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'Vous n’avez pas la permission d’ajouter un enregistre $wb['name_error_empty'] = 'Le nom d’hôte est vide.'; $wb['name_error_regex'] = 'Le format du nom d’hôte est invalide.'; $wb['data_error_empty'] = 'L’adresse IP est vide.'; -$wb['data_error_duplicate'] = 'Enregistrement A ou CNAME en double'; +$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'; ?> diff --git a/interface/web/dns/lib/lang/fr_dns_aaaa.lng b/interface/web/dns/lib/lang/fr_dns_aaaa.lng index 1cc3722de5030f5a744c59729b119214029709ba..d5d14386e39a913742d277ae9a52a156aee54a07 100644 --- a/interface/web/dns/lib/lang/fr_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/fr_dns_aaaa.lng @@ -11,6 +11,7 @@ $wb['no_zone_perm'] = 'Vous n’avez pas la permission d’ajouter un enregistre $wb['name_error_empty'] = 'Le nom d’hôte est vide.'; $wb['name_error_regex'] = 'Le format du nom d’hôte est invalide.'; $wb['data_error_empty'] = 'L’adresse IP est vide.'; +$wb['data_error_duplicate'] = 'Duplicate AAAA, ALIAS or CNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; $wb['ip_error_wrong'] = 'IP-Address format invalid'; ?> diff --git a/interface/web/dns/lib/lang/fr_dns_alias.lng b/interface/web/dns/lib/lang/fr_dns_alias.lng index 4684ce36ff7c438977b3b4abb49db2c293334c85..8838024a0234e90c926b9b77bd0c5b9d0c3e2dc5 100644 --- a/interface/web/dns/lib/lang/fr_dns_alias.lng +++ b/interface/web/dns/lib/lang/fr_dns_alias.lng @@ -12,5 +12,6 @@ $wb['name_error_empty'] = 'Le nom d’hôte est vide.'; $wb['name_error_regex'] = 'Le format du nom d’hôte est invalide.'; $wb['data_error_empty'] = 'Le nom d’hôte cible est vide.'; $wb['data_error_regex'] = 'Le format du nom d’hôte est invalide.'; +$wb['data_error_duplicate'] = 'Duplicate A, AAAA, ALIAS, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/fr_dns_caa.lng b/interface/web/dns/lib/lang/fr_dns_caa.lng index 82de234d6e545c0912f0694f63b07182429bfa58..8040cb4d549f3bc060a5b9ace62f711715446b0f 100644 --- a/interface/web/dns/lib/lang/fr_dns_caa.lng +++ b/interface/web/dns/lib/lang/fr_dns_caa.lng @@ -1,5 +1,5 @@ diff --git a/interface/web/dns/lib/lang/fr_dns_dname.lng b/interface/web/dns/lib/lang/fr_dns_dname.lng new file mode 100644 index 0000000000000000000000000000000000000000..ad41861785d3d46c82ee234daa455678c614ef8f --- /dev/null +++ b/interface/web/dns/lib/lang/fr_dns_dname.lng @@ -0,0 +1,17 @@ + diff --git a/interface/web/dns/lib/lang/fr_dns_import.lng b/interface/web/dns/lib/lang/fr_dns_import.lng index 73bc88f82460a20e463a0509f12b511f81aa40a4..c367f542bb17aabbf3c29f2799108c8e07d705a0 100644 --- a/interface/web/dns/lib/lang/fr_dns_import.lng +++ b/interface/web/dns/lib/lang/fr_dns_import.lng @@ -13,4 +13,13 @@ $wb['no_file_uploaded_error'] = 'Aucun fichier de Zone téléchargé'; $wb['zone_file_import_txt'] = 'Importer un fichier de Zone'; $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.'; ?> diff --git a/interface/web/dns/lib/lang/fr_dns_naptr.lng b/interface/web/dns/lib/lang/fr_dns_naptr.lng new file mode 100644 index 0000000000000000000000000000000000000000..b39373c13de1d5b288b85d4ebeef8696a09d3af6 --- /dev/null +++ b/interface/web/dns/lib/lang/fr_dns_naptr.lng @@ -0,0 +1,21 @@ + diff --git a/interface/web/dns/lib/lang/fr_dns_soa.lng b/interface/web/dns/lib/lang/fr_dns_soa.lng index fa5a5202f6b3ce87509c5d6a55f9d0f6c899514f..dd66dc19865e0b8e60eb97f05e65ca360e2e1be4 100644 --- a/interface/web/dns/lib/lang/fr_dns_soa.lng +++ b/interface/web/dns/lib/lang/fr_dns_soa.lng @@ -7,7 +7,7 @@ $wb['serial_txt'] = 'Serial'; $wb['refresh_txt'] = 'Refresh'; $wb['retry_txt'] = 'Retry'; $wb['expire_txt'] = 'Expire'; -$wb['minimum_txt'] = 'Minimum'; +$wb['minimum_txt'] = 'Minimum (negative cache ttl)'; $wb['ttl_txt'] = 'TTL'; $wb['xfer_txt'] = 'Autoriser les transfers de zones vers
    ces IP (liste séparée par des virgules)'; $wb['active_txt'] = 'Actif'; @@ -41,4 +41,7 @@ $wb['dnssec_wanted_info'] = 'When disabling DNSSEC keys are not going to be dele $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['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_admin_list.lng b/interface/web/dns/lib/lang/fr_dns_soa_admin_list.lng index e4d52ffee58b6979f48337ca25346a9d04a6e6c8..0e5779a0a226f1a7caa637a4a2f2a11dd2050bd5 100644 --- a/interface/web/dns/lib/lang/fr_dns_soa_admin_list.lng +++ b/interface/web/dns/lib/lang/fr_dns_soa_admin_list.lng @@ -7,5 +7,6 @@ $wb['ns_txt'] = 'NS'; $wb['mbox_txt'] = 'E-mail'; $wb['add_new_record_wizard_txt'] = 'Add new DNS Zone with Wizard'; $wb['add_new_record_txt'] = 'Add new DNS Zone manually'; +$wb['import_zone_file_txt'] = 'Import Zone File'; $wb['sys_groupid_txt'] = 'Client'; ?> diff --git a/interface/web/dns/lib/lang/fr_dns_spf.lng b/interface/web/dns/lib/lang/fr_dns_spf.lng index df8d1fe1453faa2d4decfe0d3dc94cf19ff48458..0cbf77862f6619ad477913cefb5c4b5e248ddae6 100644 --- a/interface/web/dns/lib/lang/fr_dns_spf.lng +++ b/interface/web/dns/lib/lang/fr_dns_spf.lng @@ -1,5 +1,6 @@ edit the existing record?'; +$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'; ?> diff --git a/interface/web/dns/lib/lang/fr_dns_sshfp.lng b/interface/web/dns/lib/lang/fr_dns_sshfp.lng new file mode 100644 index 0000000000000000000000000000000000000000..dc9ad9a00634513f03aec6da53682d2842bae7b6 --- /dev/null +++ b/interface/web/dns/lib/lang/fr_dns_sshfp.lng @@ -0,0 +1,16 @@ + diff --git a/interface/web/dns/lib/lang/hr.lng b/interface/web/dns/lib/lang/hr.lng index 1495b3e6d3270b65cdb0a77e744207f81ad01d4a..6e4a286b467d7b50c9c5055c02c4ac792a59a10f 100644 --- a/interface/web/dns/lib/lang/hr.lng +++ b/interface/web/dns/lib/lang/hr.lng @@ -4,10 +4,10 @@ $wb['Zones'] = 'Zone'; $wb['DNS A'] = 'DNS A'; $wb['DNS ALIAS'] = 'DNS ALIAS'; $wb['DNS CNAME'] = 'DNS CNAME'; -$wb['DNS hinfo'] = 'DNS hinfo'; -$wb['DNS mx'] = 'DNS mx'; -$wb['DNS ns'] = 'DNS ns'; -$wb['DNS ptr'] = 'DNS ptr'; +$wb['DNS hinfo'] = 'DNS HINFO'; +$wb['DNS mx'] = 'DNS MX'; +$wb['DNS ns'] = 'DNS NS'; +$wb['DNS ptr'] = 'DNS PTR'; $wb['DNS RP'] = 'DNS RP'; $wb['DNS Zone'] = 'DNS zona'; $wb['Records'] = 'DNS zapisi'; diff --git a/interface/web/dns/lib/lang/hr_dns_a.lng b/interface/web/dns/lib/lang/hr_dns_a.lng index a6be0b89fc7b37a684dbf690f717fcd2546c2003..1a9a2fcd980de4e84408f048d8dfde68a51ff81b 100644 --- a/interface/web/dns/lib/lang/hr_dns_a.lng +++ b/interface/web/dns/lib/lang/hr_dns_a.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Naziv hosta nije upisan.'; $wb['name_error_regex'] = 'Naziv hosta je u pogrešnom formatu.'; $wb['data_error_empty'] = 'Polje IP adresa je prazno'; $wb['ip_error_wrong'] = 'Neispravan format A zapisa'; -$wb['data_error_duplicate'] = 'Već postoji ovaj A ili CNAME zapis'; +$wb['data_error_duplicate'] = 'Duplicate A, ALIAS or CNAME record'; $wb['ttl_range_error'] = 'Minimalno TTL vrijeme je 60 sekundi.'; ?> diff --git a/interface/web/dns/lib/lang/hr_dns_aaaa.lng b/interface/web/dns/lib/lang/hr_dns_aaaa.lng index d8a3419309a7d907b6e69a593fcf1eb599642470..5f388a020686e8a234e3b2bb61bd9f64c355a439 100644 --- a/interface/web/dns/lib/lang/hr_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/hr_dns_aaaa.lng @@ -11,6 +11,7 @@ $wb['no_zone_perm'] = 'Nemate dozvolu za dodavanja zapisa ovoj domeni.'; $wb['name_error_empty'] = 'Naziv hosta nije upisan.'; $wb['name_error_regex'] = 'Naziv hosta je u pogrešnom formatu.'; $wb['data_error_empty'] = 'Polje IPv6 adresa je prazno'; +$wb['data_error_duplicate'] = 'Duplicate AAAA, ALIAS or CNAME record'; $wb['ip_error_wrong'] = 'Neispravan format IPv6 adrese'; $wb['ttl_range_error'] = 'Minimalno TTL vrijeme je 60 sekundi.'; ?> diff --git a/interface/web/dns/lib/lang/hr_dns_alias.lng b/interface/web/dns/lib/lang/hr_dns_alias.lng index 90bdb35d66487ee30ac06562e14be53b7fc0d30d..e46ba9ac4394a3e3d66da62d626e6d9518fa7239 100644 --- a/interface/web/dns/lib/lang/hr_dns_alias.lng +++ b/interface/web/dns/lib/lang/hr_dns_alias.lng @@ -12,5 +12,6 @@ $wb['name_error_empty'] = 'Naziv hosta nije upisan.'; $wb['name_error_regex'] = 'Naziv hosta je u pogrešnom formatu.'; $wb['data_error_empty'] = 'Polje odredišni host je prazno'; $wb['data_error_regex'] = 'Neispravan format odredišnog hosta'; +$wb['data_error_duplicate'] = 'Duplicate A, AAAA, ALIAS, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'Minimalno TTL vrijeme je 60 sekundi.'; ?> diff --git a/interface/web/dns/lib/lang/hr_dns_caa.lng b/interface/web/dns/lib/lang/hr_dns_caa.lng index 82de234d6e545c0912f0694f63b07182429bfa58..8040cb4d549f3bc060a5b9ace62f711715446b0f 100644 --- a/interface/web/dns/lib/lang/hr_dns_caa.lng +++ b/interface/web/dns/lib/lang/hr_dns_caa.lng @@ -1,5 +1,5 @@ diff --git a/interface/web/dns/lib/lang/hr_dns_dname.lng b/interface/web/dns/lib/lang/hr_dns_dname.lng new file mode 100644 index 0000000000000000000000000000000000000000..e854c3efe1335dee4c9890f277b6e5ed84d43dfd --- /dev/null +++ b/interface/web/dns/lib/lang/hr_dns_dname.lng @@ -0,0 +1,17 @@ + diff --git a/interface/web/dns/lib/lang/hr_dns_import.lng b/interface/web/dns/lib/lang/hr_dns_import.lng index 09c178e5bbbaa7e7d7580c1e454f2b2dc8b1fe79..59632ed64edad24d7f293db3c849e21f76fd9f18 100644 --- a/interface/web/dns/lib/lang/hr_dns_import.lng +++ b/interface/web/dns/lib/lang/hr_dns_import.lng @@ -4,13 +4,22 @@ $wb['client_txt'] = 'Klijent'; $wb['btn_save_txt'] = 'Importiraj zonsku datoteku'; $wb['btn_cancel_txt'] = 'Odustani'; $wb['domain_txt'] = 'Domena'; -$wb['zone_file_successfully_imported_txt'] = 'The zone file has successfully been imported!'; -$wb['error_no_valid_zone_file_txt'] = 'This appears to be no valid zone file!'; +$wb['zone_file_successfully_imported_txt'] = 'The zone file has successfully been imported.'; +$wb['error_no_valid_zone_file_txt'] = 'This zone file appears invalid.'; $wb['zonefile_to_import_txt'] = 'Zonska datoteka'; -$wb['domain_field_desc_txt'] = 'Can be left empty if domain name is in the filename or the zone-file content.'; +$wb['domain_field_desc_txt'] = 'If empty, domain name is taken from SOA record.'; $wb['title'] = 'Importiraj zonske datoteka'; $wb['no_file_uploaded_error'] = 'Nije prenešena zonska datoteka'; $wb['zone_file_import_txt'] = 'Importiraj zonsku datoteku'; $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.'; ?> diff --git a/interface/web/dns/lib/lang/hr_dns_naptr.lng b/interface/web/dns/lib/lang/hr_dns_naptr.lng new file mode 100644 index 0000000000000000000000000000000000000000..b39373c13de1d5b288b85d4ebeef8696a09d3af6 --- /dev/null +++ b/interface/web/dns/lib/lang/hr_dns_naptr.lng @@ -0,0 +1,21 @@ + diff --git a/interface/web/dns/lib/lang/hr_dns_soa.lng b/interface/web/dns/lib/lang/hr_dns_soa.lng index b4a9f2f9b0ad77b8808ab250735d93de8486d451..5d88b4708746e0673fcd66bb4f40cd4e863a7a91 100644 --- a/interface/web/dns/lib/lang/hr_dns_soa.lng +++ b/interface/web/dns/lib/lang/hr_dns_soa.lng @@ -41,4 +41,7 @@ $wb['dnssec_wanted_info'] = 'When disabling DNSSEC keys are not going to be dele $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['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_admin_list.lng b/interface/web/dns/lib/lang/hr_dns_soa_admin_list.lng index 1dc2853bcf6d2f3cc78a5048ad1efd298d3acaeb..f8753a3465ed1031a0fb0f8bf7ff626ef43a6941 100644 --- a/interface/web/dns/lib/lang/hr_dns_soa_admin_list.lng +++ b/interface/web/dns/lib/lang/hr_dns_soa_admin_list.lng @@ -7,5 +7,6 @@ $wb['ns_txt'] = 'NS'; $wb['mbox_txt'] = 'Email'; $wb['add_new_record_wizard_txt'] = 'Dodaj novu DNS zonu sa čarobnjakom'; $wb['add_new_record_txt'] = 'Dodaj novu DNS zonu ručno'; +$wb['import_zone_file_txt'] = 'Import Zone File'; $wb['sys_groupid_txt'] = 'Klijent'; ?> diff --git a/interface/web/dns/lib/lang/hr_dns_spf.lng b/interface/web/dns/lib/lang/hr_dns_spf.lng index df8d1fe1453faa2d4decfe0d3dc94cf19ff48458..0cbf77862f6619ad477913cefb5c4b5e248ddae6 100644 --- a/interface/web/dns/lib/lang/hr_dns_spf.lng +++ b/interface/web/dns/lib/lang/hr_dns_spf.lng @@ -1,5 +1,6 @@ edit the existing record?'; +$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'; ?> diff --git a/interface/web/dns/lib/lang/hr_dns_sshfp.lng b/interface/web/dns/lib/lang/hr_dns_sshfp.lng new file mode 100644 index 0000000000000000000000000000000000000000..dc9ad9a00634513f03aec6da53682d2842bae7b6 --- /dev/null +++ b/interface/web/dns/lib/lang/hr_dns_sshfp.lng @@ -0,0 +1,16 @@ + diff --git a/interface/web/dns/lib/lang/hu.lng b/interface/web/dns/lib/lang/hu.lng index a59eba705d8e03e91b2f3b728e87b021a85cc6a2..eacc5427f92e0d0f6525e3f43cb6b786778f4220 100644 --- a/interface/web/dns/lib/lang/hu.lng +++ b/interface/web/dns/lib/lang/hu.lng @@ -4,10 +4,10 @@ $wb['Zones'] = 'Zónák'; $wb['DNS A'] = 'DNS A'; $wb['DNS ALIAS'] = 'DNS ALIAS'; $wb['DNS CNAME'] = 'DNS CNAME'; -$wb['DNS hinfo'] = 'DNS hinfo'; -$wb['DNS mx'] = 'DNS mx'; -$wb['DNS ns'] = 'DNS ns'; -$wb['DNS ptr'] = 'DNS ptr'; +$wb['DNS hinfo'] = 'DNS HINFO'; +$wb['DNS mx'] = 'DNS MX'; +$wb['DNS ns'] = 'DNS NS'; +$wb['DNS ptr'] = 'DNS PTR'; $wb['DNS RP'] = 'DNS RP'; $wb['DNS Zone'] = 'DNS Zóna'; $wb['Records'] = 'Rekordok'; diff --git a/interface/web/dns/lib/lang/hu_dns_a.lng b/interface/web/dns/lib/lang/hu_dns_a.lng index 3e52e94b9f5acb7515ce3d22b0bee93a7491801e..678f6a4c58f51cdfaa5e252267773e6da65e31b1 100644 --- a/interface/web/dns/lib/lang/hu_dns_a.lng +++ b/interface/web/dns/lib/lang/hu_dns_a.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'The hostname is empty.'; $wb['name_error_regex'] = 'The hostname has the wrong format.'; $wb['data_error_empty'] = 'IP-Address empty'; $wb['ip_error_wrong'] = 'IP-Address format invalid'; -$wb['data_error_duplicate'] = 'Duplicate A-Record'; +$wb['data_error_duplicate'] = 'Duplicate A, ALIAS or CNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/hu_dns_aaaa.lng b/interface/web/dns/lib/lang/hu_dns_aaaa.lng index f78f42d1869ac054c4cb54c52b6d4e5a514ce395..180d3a11169eabac56b061079ff1e01a8584617f 100644 --- a/interface/web/dns/lib/lang/hu_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/hu_dns_aaaa.lng @@ -11,6 +11,7 @@ $wb['no_zone_perm'] = 'You do not have the permission to add a record to this DN $wb['name_error_empty'] = 'The hostname is empty.'; $wb['name_error_regex'] = 'The hostname has the wrong format.'; $wb['data_error_empty'] = 'IP-Address empty'; +$wb['data_error_duplicate'] = 'Duplicate AAAA, ALIAS or CNAME record'; $wb['ip_error_wrong'] = 'IP-Address format invalid'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/hu_dns_alias.lng b/interface/web/dns/lib/lang/hu_dns_alias.lng index dbb957c9be6fec573b99673c2591177cf6b75201..12da9fe221eea2fd9a0e1e3f530fcac529271765 100644 --- a/interface/web/dns/lib/lang/hu_dns_alias.lng +++ b/interface/web/dns/lib/lang/hu_dns_alias.lng @@ -12,5 +12,6 @@ $wb['name_error_empty'] = 'The hostname is empty.'; $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.'; ?> diff --git a/interface/web/dns/lib/lang/hu_dns_caa.lng b/interface/web/dns/lib/lang/hu_dns_caa.lng index 82de234d6e545c0912f0694f63b07182429bfa58..8040cb4d549f3bc060a5b9ace62f711715446b0f 100644 --- a/interface/web/dns/lib/lang/hu_dns_caa.lng +++ b/interface/web/dns/lib/lang/hu_dns_caa.lng @@ -1,5 +1,5 @@ diff --git a/interface/web/dns/lib/lang/hu_dns_dname.lng b/interface/web/dns/lib/lang/hu_dns_dname.lng new file mode 100644 index 0000000000000000000000000000000000000000..d8d5ba81894dfd88e8fbb2e93ccb91bfbabb6a22 --- /dev/null +++ b/interface/web/dns/lib/lang/hu_dns_dname.lng @@ -0,0 +1,17 @@ + diff --git a/interface/web/dns/lib/lang/hu_dns_import.lng b/interface/web/dns/lib/lang/hu_dns_import.lng index 8f67eba14c74cf72fbf18fc031dc1896de3fc21a..3fc63992ed75d7262ee09d7726130a858bcf5fed 100644 --- a/interface/web/dns/lib/lang/hu_dns_import.lng +++ b/interface/web/dns/lib/lang/hu_dns_import.lng @@ -4,13 +4,22 @@ $wb['client_txt'] = 'Client'; $wb['btn_save_txt'] = 'Import Zonefile'; $wb['btn_cancel_txt'] = 'Cancel'; $wb['domain_txt'] = 'Domain'; -$wb['zone_file_successfully_imported_txt'] = 'The zone file has successfully been imported!'; -$wb['error_no_valid_zone_file_txt'] = 'This appears to be no valid zone file!'; +$wb['zone_file_successfully_imported_txt'] = 'The zone file has successfully been imported.'; +$wb['error_no_valid_zone_file_txt'] = 'This zone file appears invalid.'; $wb['zonefile_to_import_txt'] = 'Zone File'; -$wb['domain_field_desc_txt'] = 'Can be left empty if domain name is in the filename or the zone-file content.'; +$wb['domain_field_desc_txt'] = 'If empty, domain name is taken from SOA record.'; $wb['title'] = 'Import Zone Files'; $wb['no_file_uploaded_error'] = 'No zonefile uploaded'; $wb['zone_file_import_txt'] = 'Zone File Import'; $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.'; ?> diff --git a/interface/web/dns/lib/lang/hu_dns_naptr.lng b/interface/web/dns/lib/lang/hu_dns_naptr.lng new file mode 100644 index 0000000000000000000000000000000000000000..b39373c13de1d5b288b85d4ebeef8696a09d3af6 --- /dev/null +++ b/interface/web/dns/lib/lang/hu_dns_naptr.lng @@ -0,0 +1,21 @@ + diff --git a/interface/web/dns/lib/lang/hu_dns_soa.lng b/interface/web/dns/lib/lang/hu_dns_soa.lng index 80388e40560f24b36c3f56d36fac1fc241c1dcf1..fdabdd99c295582fdd02d1400400ab3fbd872dd9 100644 --- a/interface/web/dns/lib/lang/hu_dns_soa.lng +++ b/interface/web/dns/lib/lang/hu_dns_soa.lng @@ -7,7 +7,7 @@ $wb['serial_txt'] = 'Serial'; $wb['refresh_txt'] = 'Refresh'; $wb['retry_txt'] = 'Retry'; $wb['expire_txt'] = 'Expire'; -$wb['minimum_txt'] = 'Minimum'; +$wb['minimum_txt'] = 'Minimum (negative cache ttl)'; $wb['ttl_txt'] = 'TTL'; $wb['xfer_txt'] = 'Allow zone transfers to
    these IPs (comma separated list)'; $wb['active_txt'] = 'Aktív'; @@ -22,7 +22,7 @@ $wb['ns_error_regex'] = 'NS has a invalid format.'; $wb['mbox_error_empty'] = 'Email is empty.'; $wb['mbox_error_regex'] = 'Email format invalid.'; $wb['also_notify_txt'] = 'Also Notify'; -$wb['also_notify_error_regex'] = 'Please use an IP address.'; +$wb['also_notify_error_regex'] = 'Also notify: Please use a valid IP range, one or more IP addresses separated by a comma or use the keyword: any'; $wb['update_acl_txt'] = 'Update ACL'; $wb['seconds_txt'] = 'Seconds'; $wb['eg_domain_tld'] = 'e.g. domain.tld'; @@ -34,11 +34,14 @@ $wb['retry_range_error'] = 'Min. Retry time is 60 seconds.'; $wb['expire_range_error'] = 'Min. Expire time is 60 seconds.'; $wb['minimum_range_error'] = 'Min. Minimum time is 60 seconds.'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; -$wb['xfer_error_regex'] = 'Also notify: Please use an IP address.'; +$wb['xfer_error_regex'] = 'Zone transfers: Please use a valid IP range, one or more IP addresses separated by a comma or use the keyword: any'; $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['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_admin_list.lng b/interface/web/dns/lib/lang/hu_dns_soa_admin_list.lng index 183d1a8349ad9bab096fe27b0f73055fb103ff52..74ba7859000dbc3a9aa24393bdd3415d58e9d597 100644 --- a/interface/web/dns/lib/lang/hu_dns_soa_admin_list.lng +++ b/interface/web/dns/lib/lang/hu_dns_soa_admin_list.lng @@ -7,5 +7,6 @@ $wb['ns_txt'] = 'NS'; $wb['mbox_txt'] = 'Email'; $wb['add_new_record_wizard_txt'] = 'Add new DNS Zone with Wizard'; $wb['add_new_record_txt'] = 'Add new DNS Zone manually'; +$wb['import_zone_file_txt'] = 'Import Zone File'; $wb['sys_groupid_txt'] = 'Client'; ?> diff --git a/interface/web/dns/lib/lang/hu_dns_spf.lng b/interface/web/dns/lib/lang/hu_dns_spf.lng index df8d1fe1453faa2d4decfe0d3dc94cf19ff48458..0cbf77862f6619ad477913cefb5c4b5e248ddae6 100644 --- a/interface/web/dns/lib/lang/hu_dns_spf.lng +++ b/interface/web/dns/lib/lang/hu_dns_spf.lng @@ -1,5 +1,6 @@ edit the existing record?'; +$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'; ?> diff --git a/interface/web/dns/lib/lang/hu_dns_sshfp.lng b/interface/web/dns/lib/lang/hu_dns_sshfp.lng new file mode 100644 index 0000000000000000000000000000000000000000..dc9ad9a00634513f03aec6da53682d2842bae7b6 --- /dev/null +++ b/interface/web/dns/lib/lang/hu_dns_sshfp.lng @@ -0,0 +1,16 @@ + diff --git a/interface/web/dns/lib/lang/id.lng b/interface/web/dns/lib/lang/id.lng index 53b41113dc40e2ae49c22af0e9dea97db85b2f15..c745f6d30bc082ed9c012a44981954e1423e0d64 100644 --- a/interface/web/dns/lib/lang/id.lng +++ b/interface/web/dns/lib/lang/id.lng @@ -4,7 +4,7 @@ $wb['Zones'] = 'Zona'; $wb['DNS A'] = 'DNS A'; $wb['DNS ALIAS'] = 'DNS ALIAS'; $wb['DNS CNAME'] = 'DNS CNAME'; -$wb['DNS hinfo'] = 'DNS hinfo'; +$wb['DNS hinfo'] = 'DNS HINFO'; $wb['DNS mx'] = 'DNS MX'; $wb['DNS ns'] = 'DNS NS'; $wb['DNS ptr'] = 'DNS PTR'; diff --git a/interface/web/dns/lib/lang/id_dns_a.lng b/interface/web/dns/lib/lang/id_dns_a.lng index e9533800906eb1859a20d525485e16db890a27ad..3c5715e3dc1bcf4237d9d542fa291bb6bb74e461 100644 --- a/interface/web/dns/lib/lang/id_dns_a.lng +++ b/interface/web/dns/lib/lang/id_dns_a.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Nama Host kosong.'; $wb['name_error_regex'] = 'Format Nama Host salah.'; $wb['data_error_empty'] = 'Alamat IP kosong'; $wb['ip_error_wrong'] = 'Format Alamat IP tidak valid'; -$wb['data_error_duplicate'] = 'Record-A Ganda'; +$wb['data_error_duplicate'] = 'Duplicate A, ALIAS or CNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/id_dns_aaaa.lng b/interface/web/dns/lib/lang/id_dns_aaaa.lng index 68cab8327197c6488b3a7265b01a6a2396053434..75ade955302f0cda756f8e9fd3b50b20d3348397 100644 --- a/interface/web/dns/lib/lang/id_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/id_dns_aaaa.lng @@ -11,6 +11,7 @@ $wb['no_zone_perm'] = 'Anda tidak memiliki hak untuk menambah record ke zona DNS $wb['name_error_empty'] = 'Nama Host kosong.'; $wb['name_error_regex'] = 'Format Nama Host salah.'; $wb['data_error_empty'] = 'Alamat IP kosong'; +$wb['data_error_duplicate'] = 'Duplicate AAAA, ALIAS or CNAME record'; $wb['ip_error_wrong'] = 'Format Alamat IP tidak valid'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/id_dns_alias.lng b/interface/web/dns/lib/lang/id_dns_alias.lng index 497fcba7ddd3f3fea983b04b312abfd5adefafd2..223b3954761ac0fe666c584e820fe4fcc03f3f01 100644 --- a/interface/web/dns/lib/lang/id_dns_alias.lng +++ b/interface/web/dns/lib/lang/id_dns_alias.lng @@ -12,5 +12,6 @@ $wb['name_error_empty'] = 'Nama Host kosong.'; $wb['name_error_regex'] = 'Format Nama Host salah.'; $wb['data_error_empty'] = 'Nama Host Target kosong'; $wb['data_error_regex'] = 'Format Nama Host Target tidak valid'; +$wb['data_error_duplicate'] = 'Duplicate A, AAAA, ALIAS, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/id_dns_caa.lng b/interface/web/dns/lib/lang/id_dns_caa.lng index 82de234d6e545c0912f0694f63b07182429bfa58..8040cb4d549f3bc060a5b9ace62f711715446b0f 100644 --- a/interface/web/dns/lib/lang/id_dns_caa.lng +++ b/interface/web/dns/lib/lang/id_dns_caa.lng @@ -1,5 +1,5 @@ diff --git a/interface/web/dns/lib/lang/id_dns_dname.lng b/interface/web/dns/lib/lang/id_dns_dname.lng new file mode 100644 index 0000000000000000000000000000000000000000..a941b31084928874ae4fce695eaeb5736031466b --- /dev/null +++ b/interface/web/dns/lib/lang/id_dns_dname.lng @@ -0,0 +1,17 @@ + diff --git a/interface/web/dns/lib/lang/id_dns_import.lng b/interface/web/dns/lib/lang/id_dns_import.lng index 8f67eba14c74cf72fbf18fc031dc1896de3fc21a..3fc63992ed75d7262ee09d7726130a858bcf5fed 100644 --- a/interface/web/dns/lib/lang/id_dns_import.lng +++ b/interface/web/dns/lib/lang/id_dns_import.lng @@ -4,13 +4,22 @@ $wb['client_txt'] = 'Client'; $wb['btn_save_txt'] = 'Import Zonefile'; $wb['btn_cancel_txt'] = 'Cancel'; $wb['domain_txt'] = 'Domain'; -$wb['zone_file_successfully_imported_txt'] = 'The zone file has successfully been imported!'; -$wb['error_no_valid_zone_file_txt'] = 'This appears to be no valid zone file!'; +$wb['zone_file_successfully_imported_txt'] = 'The zone file has successfully been imported.'; +$wb['error_no_valid_zone_file_txt'] = 'This zone file appears invalid.'; $wb['zonefile_to_import_txt'] = 'Zone File'; -$wb['domain_field_desc_txt'] = 'Can be left empty if domain name is in the filename or the zone-file content.'; +$wb['domain_field_desc_txt'] = 'If empty, domain name is taken from SOA record.'; $wb['title'] = 'Import Zone Files'; $wb['no_file_uploaded_error'] = 'No zonefile uploaded'; $wb['zone_file_import_txt'] = 'Zone File Import'; $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.'; ?> diff --git a/interface/web/dns/lib/lang/id_dns_naptr.lng b/interface/web/dns/lib/lang/id_dns_naptr.lng new file mode 100644 index 0000000000000000000000000000000000000000..b39373c13de1d5b288b85d4ebeef8696a09d3af6 --- /dev/null +++ b/interface/web/dns/lib/lang/id_dns_naptr.lng @@ -0,0 +1,21 @@ + diff --git a/interface/web/dns/lib/lang/id_dns_soa.lng b/interface/web/dns/lib/lang/id_dns_soa.lng index a8b9df0d591dff46b52da7f4c67082e1617f0c22..d6cb9d78dae561d91607469c4a31f27138d6888f 100644 --- a/interface/web/dns/lib/lang/id_dns_soa.lng +++ b/interface/web/dns/lib/lang/id_dns_soa.lng @@ -7,7 +7,7 @@ $wb['serial_txt'] = 'Serial'; $wb['refresh_txt'] = 'Refresh'; $wb['retry_txt'] = 'Retry'; $wb['expire_txt'] = 'Expire'; -$wb['minimum_txt'] = 'Minimum'; +$wb['minimum_txt'] = 'Minimum (negative cache ttl)'; $wb['ttl_txt'] = 'TTL'; $wb['xfer_txt'] = 'Izinkan transfer zona ke
    IP ini (daftar dipisahkan dengan koma)'; $wb['active_txt'] = 'Aktif'; @@ -22,7 +22,7 @@ $wb['ns_error_regex'] = 'Format NS salah.'; $wb['mbox_error_empty'] = 'Email kosong.'; $wb['mbox_error_regex'] = 'Format Email tidak valid.'; $wb['also_notify_txt'] = 'Notifikasi Juga'; -$wb['also_notify_error_regex'] = 'Please use an IP address.'; +$wb['also_notify_error_regex'] = 'Also notify: Please use a valid IP range, one or more IP addresses separated by a comma or use the keyword: any'; $wb['update_acl_txt'] = 'Mutakhirkan ACL'; $wb['seconds_txt'] = 'Seconds'; $wb['eg_domain_tld'] = 'e.g. domain.tld'; @@ -34,11 +34,14 @@ $wb['retry_range_error'] = 'Min. Retry time is 60 seconds.'; $wb['expire_range_error'] = 'Min. Expire time is 60 seconds.'; $wb['minimum_range_error'] = 'Min. Minimum time is 60 seconds.'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; -$wb['xfer_error_regex'] = 'Also notify: Please use an IP address.'; +$wb['xfer_error_regex'] = 'Zone transfers: Please use a valid IP range, one or more IP addresses separated by a comma or use the keyword: any'; $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['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_admin_list.lng b/interface/web/dns/lib/lang/id_dns_soa_admin_list.lng index 183d1a8349ad9bab096fe27b0f73055fb103ff52..74ba7859000dbc3a9aa24393bdd3415d58e9d597 100644 --- a/interface/web/dns/lib/lang/id_dns_soa_admin_list.lng +++ b/interface/web/dns/lib/lang/id_dns_soa_admin_list.lng @@ -7,5 +7,6 @@ $wb['ns_txt'] = 'NS'; $wb['mbox_txt'] = 'Email'; $wb['add_new_record_wizard_txt'] = 'Add new DNS Zone with Wizard'; $wb['add_new_record_txt'] = 'Add new DNS Zone manually'; +$wb['import_zone_file_txt'] = 'Import Zone File'; $wb['sys_groupid_txt'] = 'Client'; ?> diff --git a/interface/web/dns/lib/lang/id_dns_spf.lng b/interface/web/dns/lib/lang/id_dns_spf.lng index df8d1fe1453faa2d4decfe0d3dc94cf19ff48458..0cbf77862f6619ad477913cefb5c4b5e248ddae6 100644 --- a/interface/web/dns/lib/lang/id_dns_spf.lng +++ b/interface/web/dns/lib/lang/id_dns_spf.lng @@ -1,5 +1,6 @@ edit the existing record?'; +$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'; ?> diff --git a/interface/web/dns/lib/lang/id_dns_sshfp.lng b/interface/web/dns/lib/lang/id_dns_sshfp.lng new file mode 100644 index 0000000000000000000000000000000000000000..dc9ad9a00634513f03aec6da53682d2842bae7b6 --- /dev/null +++ b/interface/web/dns/lib/lang/id_dns_sshfp.lng @@ -0,0 +1,16 @@ + diff --git a/interface/web/dns/lib/lang/it.lng b/interface/web/dns/lib/lang/it.lng index 0df62b281164c301aca857d84b70d0402d0e11f2..487d078632f4fcfd7c8f2031735af2e72fdcc4db 100644 --- a/interface/web/dns/lib/lang/it.lng +++ b/interface/web/dns/lib/lang/it.lng @@ -4,10 +4,10 @@ $wb['Zones'] = 'Zone'; $wb['DNS A'] = 'DNS A'; $wb['DNS ALIAS'] = 'DNS ALIAS'; $wb['DNS CNAME'] = 'DNS CNAME'; -$wb['DNS hinfo'] = 'DNS hinfo'; -$wb['DNS mx'] = 'DNS mx'; -$wb['DNS ns'] = 'DNS ns'; -$wb['DNS ptr'] = 'DNS ptr'; +$wb['DNS hinfo'] = 'DNS HINFO'; +$wb['DNS mx'] = 'DNS MX'; +$wb['DNS ns'] = 'DNS NS'; +$wb['DNS ptr'] = 'DNS PTR'; $wb['DNS RP'] = 'DNS RP'; $wb['DNS Zone'] = 'Zona DNS'; $wb['Records'] = 'Records'; diff --git a/interface/web/dns/lib/lang/it_dns_a.lng b/interface/web/dns/lib/lang/it_dns_a.lng index 122560b487303a23c1b0cb5732278a14235332b5..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 @@ 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 2746bb887df7d2ada5cffb61cbc6bd2e65964ed9..8de4a2c5e2fd2d4283629c4ef4e9f5c5193ebe98 100644 --- a/interface/web/dns/lib/lang/it_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/it_dns_aaaa.lng @@ -6,11 +6,12 @@ $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.'; $wb['data_error_empty'] = 'Indirizzo Ip vuoto'; +$wb['data_error_duplicate'] = 'Duplicate AAAA, ALIAS or CNAME record'; $wb['ttl_range_error'] = 'TTL time minimo 60 secondi.'; $wb['ip_error_wrong'] = 'IP-Address format invalid'; ?> diff --git a/interface/web/dns/lib/lang/it_dns_alias.lng b/interface/web/dns/lib/lang/it_dns_alias.lng index fef96c9880ded1f37a756313fe5ad3b4db10c635..c95d9b01e2058a11c7f021b6b024027ea8ae61db 100644 --- a/interface/web/dns/lib/lang/it_dns_alias.lng +++ b/interface/web/dns/lib/lang/it_dns_alias.lng @@ -1,16 +1,17 @@ diff --git a/interface/web/dns/lib/lang/it_dns_caa.lng b/interface/web/dns/lib/lang/it_dns_caa.lng index 82de234d6e545c0912f0694f63b07182429bfa58..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 @@ diff --git a/interface/web/dns/lib/lang/it_dns_cname.lng b/interface/web/dns/lib/lang/it_dns_cname.lng index 0732cbd72a2ca1833d38cf522de80a5e971de439..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'] = 'A-Record o CNAME-Record duplicato'; +$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 @@ 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 @@ diff --git a/interface/web/dns/lib/lang/it_dns_dname.lng b/interface/web/dns/lib/lang/it_dns_dname.lng new file mode 100644 index 0000000000000000000000000000000000000000..1e1e548b6bb53c14e7bf6713b98104858f75b833 --- /dev/null +++ b/interface/web/dns/lib/lang/it_dns_dname.lng @@ -0,0 +1,17 @@ + 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 @@ 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 @@ diff --git a/interface/web/dns/lib/lang/it_dns_import.lng b/interface/web/dns/lib/lang/it_dns_import.lng index 4ccee92b65a6541416ab26920d0cb507a88ddbfe..3f49ddc427a079b49ea65950f0c34a4926d5479b 100644 --- a/interface/web/dns/lib/lang/it_dns_import.lng +++ b/interface/web/dns/lib/lang/it_dns_import.lng @@ -5,12 +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['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 @@ 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 new file mode 100644 index 0000000000000000000000000000000000000000..124897d5967a3b413c75fbd28c1a0bd6294a661b --- /dev/null +++ b/interface/web/dns/lib/lang/it_dns_naptr.lng @@ -0,0 +1,21 @@ + 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 @@ 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 @@ 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 @@ 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
    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 @@ 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 48ba33d550309b4ad0cb6f1f93f63beeb576a5e8..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'; +$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
    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,24 +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_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 5f0c730599820905574d370d7d97a8c1454c47d3..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,11 +1,12 @@ 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 @@ diff --git a/interface/web/dns/lib/lang/it_dns_spf.lng b/interface/web/dns/lib/lang/it_dns_spf.lng index df8d1fe1453faa2d4decfe0d3dc94cf19ff48458..3c707f0013aa007632cf69547a179280fbd077d7 100644 --- a/interface/web/dns/lib/lang/it_dns_spf.lng +++ b/interface/web/dns/lib/lang/it_dns_spf.lng @@ -1,25 +1,30 @@ modificare il record esistente?'; +$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 new file mode 100644 index 0000000000000000000000000000000000000000..e592105311f7c1e92cf061c5647d38648a088e94 --- /dev/null +++ b/interface/web/dns/lib/lang/it_dns_sshfp.lng @@ -0,0 +1,16 @@ + 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 @@ 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 @@ 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 @@ 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 @@ 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.lng b/interface/web/dns/lib/lang/ja.lng index de5c4b89ca4b75d5a939de4937fcccecbd3d5e1e..1cc26a24e333d0745e57c65403ab5a96025f743c 100644 --- a/interface/web/dns/lib/lang/ja.lng +++ b/interface/web/dns/lib/lang/ja.lng @@ -4,10 +4,10 @@ $wb['Zones'] = 'ゾーン'; $wb['DNS A'] = 'DNS A'; $wb['DNS ALIAS'] = 'DNS ALIAS'; $wb['DNS CNAME'] = 'DNS CNAME'; -$wb['DNS hinfo'] = 'DNS hinfo'; -$wb['DNS mx'] = 'DNS mx'; -$wb['DNS ns'] = 'DNS ns'; -$wb['DNS ptr'] = 'DNS ptr'; +$wb['DNS hinfo'] = 'DNS HINFO'; +$wb['DNS mx'] = 'DNS MX'; +$wb['DNS ns'] = 'DNS NS'; +$wb['DNS ptr'] = 'DNS PTR'; $wb['DNS RP'] = 'DNS RP'; $wb['DNS Zone'] = 'DNS Zone'; $wb['Records'] = 'レコード'; diff --git a/interface/web/dns/lib/lang/ja_dns_a.lng b/interface/web/dns/lib/lang/ja_dns_a.lng index 890183a927b5fb9623bd7a609fd11ba4db14efad..45d336b9c488936131762c204867399e1f5660f6 100644 --- a/interface/web/dns/lib/lang/ja_dns_a.lng +++ b/interface/web/dns/lib/lang/ja_dns_a.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'ホスト名を入力してください。'; $wb['name_error_regex'] = 'ホスト名の形式が不正です。'; $wb['data_error_empty'] = 'IPアドレスを入力してください。'; $wb['ip_error_wrong'] = 'IPアドレスの形式が不正です。'; -$wb['data_error_duplicate'] = 'Aレコードが重複しています。'; +$wb['data_error_duplicate'] = 'Duplicate A, ALIAS or CNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/ja_dns_aaaa.lng b/interface/web/dns/lib/lang/ja_dns_aaaa.lng index 2c859b741688819bc985290574466e35cd78bad1..a851d2862e8ed5cd798a90689160e916153d9d3c 100644 --- a/interface/web/dns/lib/lang/ja_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/ja_dns_aaaa.lng @@ -11,6 +11,7 @@ $wb['no_zone_perm'] = 'このDNSゾーンにレコードを追加する権限が $wb['name_error_empty'] = 'ホスト名を入力してください。'; $wb['name_error_regex'] = 'ホスト名の形式が不正です。'; $wb['data_error_empty'] = 'IPアドレスを入力してください。'; +$wb['data_error_duplicate'] = 'Duplicate AAAA, ALIAS or CNAME record'; $wb['ip_error_wrong'] = 'IPアドレスの形式が不正です。'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/ja_dns_alias.lng b/interface/web/dns/lib/lang/ja_dns_alias.lng index 5fddc956ef384be001330368c2406bf47ef328cf..52ed4bb12ac3d88b4c680460f74af4ae00181842 100644 --- a/interface/web/dns/lib/lang/ja_dns_alias.lng +++ b/interface/web/dns/lib/lang/ja_dns_alias.lng @@ -12,5 +12,6 @@ $wb['name_error_empty'] = 'ホスト名を入力してください。'; $wb['name_error_regex'] = 'ホスト名の形式が不正です。'; $wb['data_error_empty'] = 'ターゲットのホスト名を入力してください。'; $wb['data_error_regex'] = 'ターゲットのホスト名の形式が不正です。'; +$wb['data_error_duplicate'] = 'Duplicate A, AAAA, ALIAS, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/ja_dns_caa.lng b/interface/web/dns/lib/lang/ja_dns_caa.lng index 82de234d6e545c0912f0694f63b07182429bfa58..8040cb4d549f3bc060a5b9ace62f711715446b0f 100644 --- a/interface/web/dns/lib/lang/ja_dns_caa.lng +++ b/interface/web/dns/lib/lang/ja_dns_caa.lng @@ -1,5 +1,5 @@ diff --git a/interface/web/dns/lib/lang/ja_dns_dname.lng b/interface/web/dns/lib/lang/ja_dns_dname.lng new file mode 100644 index 0000000000000000000000000000000000000000..141f9290e171d525c33611d4cedca0e934fcbbf5 --- /dev/null +++ b/interface/web/dns/lib/lang/ja_dns_dname.lng @@ -0,0 +1,17 @@ + diff --git a/interface/web/dns/lib/lang/ja_dns_import.lng b/interface/web/dns/lib/lang/ja_dns_import.lng index 8f67eba14c74cf72fbf18fc031dc1896de3fc21a..3fc63992ed75d7262ee09d7726130a858bcf5fed 100644 --- a/interface/web/dns/lib/lang/ja_dns_import.lng +++ b/interface/web/dns/lib/lang/ja_dns_import.lng @@ -4,13 +4,22 @@ $wb['client_txt'] = 'Client'; $wb['btn_save_txt'] = 'Import Zonefile'; $wb['btn_cancel_txt'] = 'Cancel'; $wb['domain_txt'] = 'Domain'; -$wb['zone_file_successfully_imported_txt'] = 'The zone file has successfully been imported!'; -$wb['error_no_valid_zone_file_txt'] = 'This appears to be no valid zone file!'; +$wb['zone_file_successfully_imported_txt'] = 'The zone file has successfully been imported.'; +$wb['error_no_valid_zone_file_txt'] = 'This zone file appears invalid.'; $wb['zonefile_to_import_txt'] = 'Zone File'; -$wb['domain_field_desc_txt'] = 'Can be left empty if domain name is in the filename or the zone-file content.'; +$wb['domain_field_desc_txt'] = 'If empty, domain name is taken from SOA record.'; $wb['title'] = 'Import Zone Files'; $wb['no_file_uploaded_error'] = 'No zonefile uploaded'; $wb['zone_file_import_txt'] = 'Zone File Import'; $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.'; ?> diff --git a/interface/web/dns/lib/lang/ja_dns_naptr.lng b/interface/web/dns/lib/lang/ja_dns_naptr.lng new file mode 100644 index 0000000000000000000000000000000000000000..b39373c13de1d5b288b85d4ebeef8696a09d3af6 --- /dev/null +++ b/interface/web/dns/lib/lang/ja_dns_naptr.lng @@ -0,0 +1,21 @@ + diff --git a/interface/web/dns/lib/lang/ja_dns_soa.lng b/interface/web/dns/lib/lang/ja_dns_soa.lng index 2e0fd5515fc2fbc42c94d3f25d472810ede11324..70d9414d26630f1e1ec4bd5ad1ca55c99b549fce 100644 --- a/interface/web/dns/lib/lang/ja_dns_soa.lng +++ b/interface/web/dns/lib/lang/ja_dns_soa.lng @@ -7,7 +7,7 @@ $wb['serial_txt'] = 'Serial'; $wb['refresh_txt'] = 'Refresh'; $wb['retry_txt'] = 'Retry'; $wb['expire_txt'] = 'Expire'; -$wb['minimum_txt'] = 'Minimum'; +$wb['minimum_txt'] = 'Minimum (negative cache ttl)'; $wb['ttl_txt'] = 'TTL'; $wb['xfer_txt'] = 'ゾーン転送を許可するIPアドレス
    (, で区切ってください)'; $wb['active_txt'] = '有効'; @@ -22,7 +22,7 @@ $wb['ns_error_regex'] = 'NS が不正な文字を含んでいます。'; $wb['mbox_error_empty'] = 'メールアドレスを指定してください'; $wb['mbox_error_regex'] = 'メールアドレスの形式が不正です。'; $wb['also_notify_txt'] = 'Also Notify'; -$wb['also_notify_error_regex'] = 'Please use an IP address.'; +$wb['also_notify_error_regex'] = 'Also notify: Please use a valid IP range, one or more IP addresses separated by a comma or use the keyword: any'; $wb['update_acl_txt'] = 'Update ACL'; $wb['seconds_txt'] = 'Seconds'; $wb['eg_domain_tld'] = 'e.g. domain.tld'; @@ -34,11 +34,14 @@ $wb['retry_range_error'] = 'Min. Retry time is 60 seconds.'; $wb['expire_range_error'] = 'Min. Expire time is 60 seconds.'; $wb['minimum_range_error'] = 'Min. Minimum time is 60 seconds.'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; -$wb['xfer_error_regex'] = 'Also notify: Please use an IP address.'; +$wb['xfer_error_regex'] = 'Zone transfers: Please use a valid IP range, one or more IP addresses separated by a comma or use the keyword: any'; $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['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/ja_dns_soa_admin_list.lng b/interface/web/dns/lib/lang/ja_dns_soa_admin_list.lng index 183d1a8349ad9bab096fe27b0f73055fb103ff52..74ba7859000dbc3a9aa24393bdd3415d58e9d597 100644 --- a/interface/web/dns/lib/lang/ja_dns_soa_admin_list.lng +++ b/interface/web/dns/lib/lang/ja_dns_soa_admin_list.lng @@ -7,5 +7,6 @@ $wb['ns_txt'] = 'NS'; $wb['mbox_txt'] = 'Email'; $wb['add_new_record_wizard_txt'] = 'Add new DNS Zone with Wizard'; $wb['add_new_record_txt'] = 'Add new DNS Zone manually'; +$wb['import_zone_file_txt'] = 'Import Zone File'; $wb['sys_groupid_txt'] = 'Client'; ?> diff --git a/interface/web/dns/lib/lang/ja_dns_spf.lng b/interface/web/dns/lib/lang/ja_dns_spf.lng index df8d1fe1453faa2d4decfe0d3dc94cf19ff48458..0cbf77862f6619ad477913cefb5c4b5e248ddae6 100644 --- a/interface/web/dns/lib/lang/ja_dns_spf.lng +++ b/interface/web/dns/lib/lang/ja_dns_spf.lng @@ -1,5 +1,6 @@ edit the existing record?'; +$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'; ?> diff --git a/interface/web/dns/lib/lang/ja_dns_sshfp.lng b/interface/web/dns/lib/lang/ja_dns_sshfp.lng new file mode 100644 index 0000000000000000000000000000000000000000..dc9ad9a00634513f03aec6da53682d2842bae7b6 --- /dev/null +++ b/interface/web/dns/lib/lang/ja_dns_sshfp.lng @@ -0,0 +1,16 @@ + diff --git a/interface/web/dns/lib/lang/nl.lng b/interface/web/dns/lib/lang/nl.lng index 69ddf89f6f6d428e09eadac1ba6d286db892b9dd..fd4fb698b9c9ac1254f1d2134194d0f9f2bb8e7f 100644 --- a/interface/web/dns/lib/lang/nl.lng +++ b/interface/web/dns/lib/lang/nl.lng @@ -4,10 +4,10 @@ $wb['Zones'] = 'Zones'; $wb['DNS A'] = 'DNS A'; $wb['DNS ALIAS'] = 'DNS ALIAS'; $wb['DNS CNAME'] = 'DNS CNAME'; -$wb['DNS hinfo'] = 'DNS hinfo'; -$wb['DNS mx'] = 'DNS mx'; -$wb['DNS ns'] = 'DNS ns'; -$wb['DNS ptr'] = 'DNS ptr'; +$wb['DNS hinfo'] = 'DNS HINFO'; +$wb['DNS mx'] = 'DNS MX'; +$wb['DNS ns'] = 'DNS NS'; +$wb['DNS ptr'] = 'DNS PTR'; $wb['DNS RP'] = 'DNS RP'; $wb['DNS Zone'] = 'DNS Zone'; $wb['Records'] = 'Records'; diff --git a/interface/web/dns/lib/lang/nl_dns_a.lng b/interface/web/dns/lib/lang/nl_dns_a.lng index b70b5c9c5069e2ff5d9db97d9d90c428ac1c44ba..a4c6f0cf7e7f687755f99c61ad184aefec9cd5f7 100644 --- a/interface/web/dns/lib/lang/nl_dns_a.lng +++ b/interface/web/dns/lib/lang/nl_dns_a.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'De hostnaam is niet ingvuld.'; $wb['name_error_regex'] = 'De hostnaam heeft een onjuist formaat.'; $wb['data_error_empty'] = 'IP-adres is niet ingvuld'; $wb['ip_error_wrong'] = 'IP-adres formaat ongeldig'; -$wb['data_error_duplicate'] = 'Duplicaat A-Record of CNAME-record'; +$wb['data_error_duplicate'] = 'Duplicaat A, ALIAS of CNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/nl_dns_aaaa.lng b/interface/web/dns/lib/lang/nl_dns_aaaa.lng index 298193c1e8272c527536fafec54bd2e92483ae88..2521ff5b17b115e8d2bc2ca665db884ca61ffda9 100644 --- a/interface/web/dns/lib/lang/nl_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/nl_dns_aaaa.lng @@ -11,6 +11,7 @@ $wb['no_zone_perm'] = 'U heeft geen toestemming om een record toe te voegen aan $wb['name_error_empty'] = 'De hostnaam is niet ingvuld'; $wb['name_error_regex'] = 'De hostnaam heeft een onjuist formaat.'; $wb['data_error_empty'] = 'IP-adres is niet ingevuld'; +$wb['data_error_duplicate'] = 'Duplicate AAAA, ALIAS or CNAME record'; $wb['ip_error_wrong'] = 'IP-adres formaat ongeldig'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/nl_dns_alias.lng b/interface/web/dns/lib/lang/nl_dns_alias.lng index 5b8873823d956356237164d1b5ca807f33a6a0d8..f3b2680a89f6c8ceaf56827da3502ff954307a78 100644 --- a/interface/web/dns/lib/lang/nl_dns_alias.lng +++ b/interface/web/dns/lib/lang/nl_dns_alias.lng @@ -12,5 +12,6 @@ $wb['name_error_empty'] = 'De hostname is niet ingvuld.'; $wb['name_error_regex'] = 'De hostnaam heeft een onjuist formaat.'; $wb['data_error_empty'] = 'Doel hostnaam is niet ingvuld'; $wb['data_error_regex'] = 'Doel hostnaam formaat ongeldig'; +$wb['data_error_duplicate'] = 'Duplicaat A, AAAA, ALIAS, CNAME, of DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/nl_dns_caa.lng b/interface/web/dns/lib/lang/nl_dns_caa.lng index 82de234d6e545c0912f0694f63b07182429bfa58..8040cb4d549f3bc060a5b9ace62f711715446b0f 100644 --- a/interface/web/dns/lib/lang/nl_dns_caa.lng +++ b/interface/web/dns/lib/lang/nl_dns_caa.lng @@ -1,5 +1,5 @@ diff --git a/interface/web/dns/lib/lang/nl_dns_dname.lng b/interface/web/dns/lib/lang/nl_dns_dname.lng new file mode 100644 index 0000000000000000000000000000000000000000..6072ddb37728f19214d5153a33f3eec2d7794e08 --- /dev/null +++ b/interface/web/dns/lib/lang/nl_dns_dname.lng @@ -0,0 +1,17 @@ + diff --git a/interface/web/dns/lib/lang/nl_dns_import.lng b/interface/web/dns/lib/lang/nl_dns_import.lng index 8f67eba14c74cf72fbf18fc031dc1896de3fc21a..3fc63992ed75d7262ee09d7726130a858bcf5fed 100644 --- a/interface/web/dns/lib/lang/nl_dns_import.lng +++ b/interface/web/dns/lib/lang/nl_dns_import.lng @@ -4,13 +4,22 @@ $wb['client_txt'] = 'Client'; $wb['btn_save_txt'] = 'Import Zonefile'; $wb['btn_cancel_txt'] = 'Cancel'; $wb['domain_txt'] = 'Domain'; -$wb['zone_file_successfully_imported_txt'] = 'The zone file has successfully been imported!'; -$wb['error_no_valid_zone_file_txt'] = 'This appears to be no valid zone file!'; +$wb['zone_file_successfully_imported_txt'] = 'The zone file has successfully been imported.'; +$wb['error_no_valid_zone_file_txt'] = 'This zone file appears invalid.'; $wb['zonefile_to_import_txt'] = 'Zone File'; -$wb['domain_field_desc_txt'] = 'Can be left empty if domain name is in the filename or the zone-file content.'; +$wb['domain_field_desc_txt'] = 'If empty, domain name is taken from SOA record.'; $wb['title'] = 'Import Zone Files'; $wb['no_file_uploaded_error'] = 'No zonefile uploaded'; $wb['zone_file_import_txt'] = 'Zone File Import'; $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.'; ?> diff --git a/interface/web/dns/lib/lang/nl_dns_naptr.lng b/interface/web/dns/lib/lang/nl_dns_naptr.lng new file mode 100644 index 0000000000000000000000000000000000000000..b39373c13de1d5b288b85d4ebeef8696a09d3af6 --- /dev/null +++ b/interface/web/dns/lib/lang/nl_dns_naptr.lng @@ -0,0 +1,21 @@ + diff --git a/interface/web/dns/lib/lang/nl_dns_soa.lng b/interface/web/dns/lib/lang/nl_dns_soa.lng index b29c040df81144e49a6271a96ca54e5131c5443e..fda742cf148adb12a11d72467e04746023e14ed4 100644 --- a/interface/web/dns/lib/lang/nl_dns_soa.lng +++ b/interface/web/dns/lib/lang/nl_dns_soa.lng @@ -7,7 +7,7 @@ $wb['serial_txt'] = 'Serieel'; $wb['refresh_txt'] = 'Ververs'; $wb['retry_txt'] = 'Opnieuw proberen'; $wb['expire_txt'] = 'Verlopen'; -$wb['minimum_txt'] = 'Minimum'; +$wb['minimum_txt'] = 'Minimum (negative cache ttl)'; $wb['ttl_txt'] = 'TTL'; $wb['xfer_txt'] = 'Sta zone transfers toe naar
    deze IPs (komma gescheiden waarden)'; $wb['active_txt'] = 'Actief'; @@ -22,7 +22,7 @@ $wb['ns_error_regex'] = 'NS heeft een ongeldig format.'; $wb['mbox_error_empty'] = 'E-mail is niet ingvuld.'; $wb['mbox_error_regex'] = 'E-mail formaat ongeldig.'; $wb['also_notify_txt'] = 'ook notifcatie'; -$wb['also_notify_error_regex'] = 'Please use an IP address.'; +$wb['also_notify_error_regex'] = 'Also notify: Please use a valid IP range, one or more IP addresses separated by a comma or use the keyword: any'; $wb['update_acl_txt'] = 'Update ACL'; $wb['seconds_txt'] = 'Seconds'; $wb['eg_domain_tld'] = 'e.g. domain.tld'; @@ -34,11 +34,14 @@ $wb['retry_range_error'] = 'Min. Retry time is 60 seconds.'; $wb['expire_range_error'] = 'Min. Expire time is 60 seconds.'; $wb['minimum_range_error'] = 'Min. Minimum time is 60 seconds.'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; -$wb['xfer_error_regex'] = 'Also notify: Please use an IP address.'; +$wb['xfer_error_regex'] = 'Zone transfers: Please use a valid IP range, one or more IP addresses separated by a comma or use the keyword: any'; $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['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/nl_dns_soa_admin_list.lng b/interface/web/dns/lib/lang/nl_dns_soa_admin_list.lng index 2ac184dd91877e3b831d9a2ae3421afe2efcdb23..5231e47e22472235775edcda7a7f0aa83ede7eaa 100644 --- a/interface/web/dns/lib/lang/nl_dns_soa_admin_list.lng +++ b/interface/web/dns/lib/lang/nl_dns_soa_admin_list.lng @@ -7,5 +7,6 @@ $wb['ns_txt'] = 'NS'; $wb['mbox_txt'] = 'E-mail'; $wb['add_new_record_wizard_txt'] = 'DNS Zone via wizard toevoegen'; $wb['add_new_record_txt'] = 'DNS Zone manueel toevoegen'; +$wb['import_zone_file_txt'] = 'Importeer zone bestand'; $wb['sys_groupid_txt'] = 'Klant'; ?> diff --git a/interface/web/dns/lib/lang/nl_dns_spf.lng b/interface/web/dns/lib/lang/nl_dns_spf.lng index df8d1fe1453faa2d4decfe0d3dc94cf19ff48458..0cbf77862f6619ad477913cefb5c4b5e248ddae6 100644 --- a/interface/web/dns/lib/lang/nl_dns_spf.lng +++ b/interface/web/dns/lib/lang/nl_dns_spf.lng @@ -1,5 +1,6 @@ edit the existing record?'; +$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'; ?> diff --git a/interface/web/dns/lib/lang/nl_dns_sshfp.lng b/interface/web/dns/lib/lang/nl_dns_sshfp.lng new file mode 100644 index 0000000000000000000000000000000000000000..dc9ad9a00634513f03aec6da53682d2842bae7b6 --- /dev/null +++ b/interface/web/dns/lib/lang/nl_dns_sshfp.lng @@ -0,0 +1,16 @@ + diff --git a/interface/web/dns/lib/lang/pl.lng b/interface/web/dns/lib/lang/pl.lng index 46f691ea39096b1b739ad4b5468bdf34ee1092dd..c1748b1722148f9f6a5c94dc8862b073b848c7ed 100644 --- a/interface/web/dns/lib/lang/pl.lng +++ b/interface/web/dns/lib/lang/pl.lng @@ -4,10 +4,10 @@ $wb['Zones'] = 'Strefy'; $wb['DNS A'] = 'DNS A'; $wb['DNS ALIAS'] = 'Alias DNS'; $wb['DNS CNAME'] = 'DNS CNAME'; -$wb['DNS hinfo'] = 'DNS hinfo'; -$wb['DNS mx'] = 'DNS mx'; -$wb['DNS ns'] = 'DNS ns'; -$wb['DNS ptr'] = 'DNS ptr'; +$wb['DNS hinfo'] = 'DNS HINFO'; +$wb['DNS mx'] = 'DNS MX'; +$wb['DNS ns'] = 'DNS NS'; +$wb['DNS ptr'] = 'DNS PTR'; $wb['DNS RP'] = 'DNS RP'; $wb['DNS Zone'] = 'Strefa DNS'; $wb['Records'] = 'Wpisy'; diff --git a/interface/web/dns/lib/lang/pl_dns_a.lng b/interface/web/dns/lib/lang/pl_dns_a.lng index 88adb2306e7308241e4c0e4c3cdb82dfbb5004ae..8af428f235870856cdf80ae8228cf88522c60b51 100644 --- a/interface/web/dns/lib/lang/pl_dns_a.lng +++ b/interface/web/dns/lib/lang/pl_dns_a.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Nazwa serwera jest pusta.'; $wb['name_error_regex'] = 'Nazwa serwera ma niepoprawny format.'; $wb['data_error_empty'] = 'Adres IP jest pusty.'; $wb['ip_error_wrong'] = 'Adres IP ma niepoprawny format.'; -$wb['data_error_duplicate'] = 'Duplikat wpisu A.'; +$wb['data_error_duplicate'] = 'Duplicate A, ALIAS or CNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/pl_dns_aaaa.lng b/interface/web/dns/lib/lang/pl_dns_aaaa.lng index 867d73ab97de4c5197cedd791d7ca151052e6ce2..1006ef77b0200bdf080bbba8242b8cbcee7e3d15 100644 --- a/interface/web/dns/lib/lang/pl_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/pl_dns_aaaa.lng @@ -11,6 +11,7 @@ $wb['no_zone_perm'] = 'Nie masz uprawnień, aby dodać nowy wpis w tej strefie D $wb['name_error_empty'] = 'Nazwa serwera jest pusta.'; $wb['name_error_regex'] = 'Nazwa serwera ma niepoprawny format.'; $wb['data_error_empty'] = 'Adres IP jest pusty.'; +$wb['data_error_duplicate'] = 'Duplicate AAAA, ALIAS or CNAME record'; $wb['ip_error_wrong'] = 'Adres IP ma niepoprawny format.'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/pl_dns_alias.lng b/interface/web/dns/lib/lang/pl_dns_alias.lng index abe5c15d121478564656a6df2a4284ef81781f86..05c83945d0284107d3fcd37d325e9a9631ce58f8 100644 --- a/interface/web/dns/lib/lang/pl_dns_alias.lng +++ b/interface/web/dns/lib/lang/pl_dns_alias.lng @@ -12,5 +12,6 @@ $wb['name_error_empty'] = 'Nazwa serwera jest pusta.'; $wb['name_error_regex'] = 'Nazwa serwera ma zły format.'; $wb['data_error_empty'] = 'Docelowa nazwa serwera jest pusta.'; $wb['data_error_regex'] = 'Docelowa nazwa serwera ma niepoprawny format.'; +$wb['data_error_duplicate'] = 'Duplicate A, AAAA, ALIAS, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/pl_dns_caa.lng b/interface/web/dns/lib/lang/pl_dns_caa.lng index 82de234d6e545c0912f0694f63b07182429bfa58..8040cb4d549f3bc060a5b9ace62f711715446b0f 100644 --- a/interface/web/dns/lib/lang/pl_dns_caa.lng +++ b/interface/web/dns/lib/lang/pl_dns_caa.lng @@ -1,5 +1,5 @@ diff --git a/interface/web/dns/lib/lang/pl_dns_dname.lng b/interface/web/dns/lib/lang/pl_dns_dname.lng new file mode 100644 index 0000000000000000000000000000000000000000..a7e3ac50e415ccf26f4eecd776fe2ba8c6d5cc58 --- /dev/null +++ b/interface/web/dns/lib/lang/pl_dns_dname.lng @@ -0,0 +1,17 @@ + diff --git a/interface/web/dns/lib/lang/pl_dns_import.lng b/interface/web/dns/lib/lang/pl_dns_import.lng index d622e03985e4376eb243a5145d383a7cb4ba29cd..f6b618c87b425b2bb570886f896ed1abde067d1c 100644 --- a/interface/web/dns/lib/lang/pl_dns_import.lng +++ b/interface/web/dns/lib/lang/pl_dns_import.lng @@ -13,4 +13,13 @@ $wb['no_file_uploaded_error'] = 'Nie załadowany żaden plik'; $wb['zone_file_import_txt'] = 'Import pliku strefy'; $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.'; ?> diff --git a/interface/web/dns/lib/lang/pl_dns_naptr.lng b/interface/web/dns/lib/lang/pl_dns_naptr.lng new file mode 100644 index 0000000000000000000000000000000000000000..b39373c13de1d5b288b85d4ebeef8696a09d3af6 --- /dev/null +++ b/interface/web/dns/lib/lang/pl_dns_naptr.lng @@ -0,0 +1,21 @@ + diff --git a/interface/web/dns/lib/lang/pl_dns_soa.lng b/interface/web/dns/lib/lang/pl_dns_soa.lng index f2d7e1ad87ed7a2848da364004168e5be483bbf0..d83e0aeeb0e18a392e71238fa021436365166b0e 100644 --- a/interface/web/dns/lib/lang/pl_dns_soa.lng +++ b/interface/web/dns/lib/lang/pl_dns_soa.lng @@ -7,7 +7,7 @@ $wb['serial_txt'] = 'Klucz'; $wb['refresh_txt'] = 'Odśwież'; $wb['retry_txt'] = 'Ponów'; $wb['expire_txt'] = 'Wygasł'; -$wb['minimum_txt'] = 'Minimum'; +$wb['minimum_txt'] = 'Minimum (negative cache ttl)'; $wb['ttl_txt'] = 'TTL'; $wb['xfer_txt'] = 'Zezwól na przeniesienie stref do
    tych adresów IP (adresy rozdzielaj przecinkiem)'; $wb['active_txt'] = 'Aktywny'; @@ -41,4 +41,7 @@ $wb['dnssec_wanted_info'] = 'When disabling DNSSEC keys are not going to be dele $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['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/pl_dns_soa_admin_list.lng b/interface/web/dns/lib/lang/pl_dns_soa_admin_list.lng index 183d1a8349ad9bab096fe27b0f73055fb103ff52..74ba7859000dbc3a9aa24393bdd3415d58e9d597 100644 --- a/interface/web/dns/lib/lang/pl_dns_soa_admin_list.lng +++ b/interface/web/dns/lib/lang/pl_dns_soa_admin_list.lng @@ -7,5 +7,6 @@ $wb['ns_txt'] = 'NS'; $wb['mbox_txt'] = 'Email'; $wb['add_new_record_wizard_txt'] = 'Add new DNS Zone with Wizard'; $wb['add_new_record_txt'] = 'Add new DNS Zone manually'; +$wb['import_zone_file_txt'] = 'Import Zone File'; $wb['sys_groupid_txt'] = 'Client'; ?> diff --git a/interface/web/dns/lib/lang/pl_dns_spf.lng b/interface/web/dns/lib/lang/pl_dns_spf.lng index df8d1fe1453faa2d4decfe0d3dc94cf19ff48458..0cbf77862f6619ad477913cefb5c4b5e248ddae6 100644 --- a/interface/web/dns/lib/lang/pl_dns_spf.lng +++ b/interface/web/dns/lib/lang/pl_dns_spf.lng @@ -1,5 +1,6 @@ edit the existing record?'; +$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'; ?> diff --git a/interface/web/dns/lib/lang/pl_dns_sshfp.lng b/interface/web/dns/lib/lang/pl_dns_sshfp.lng new file mode 100644 index 0000000000000000000000000000000000000000..dc9ad9a00634513f03aec6da53682d2842bae7b6 --- /dev/null +++ b/interface/web/dns/lib/lang/pl_dns_sshfp.lng @@ -0,0 +1,16 @@ + diff --git a/interface/web/dns/lib/lang/pt_dns_a.lng b/interface/web/dns/lib/lang/pt_dns_a.lng index 37e949b431ea15d5b2a4cb38c1ac4186862fc13e..7216ef9316ea1f8c47f5931c34ddfa2df26c65d2 100644 --- a/interface/web/dns/lib/lang/pt_dns_a.lng +++ b/interface/web/dns/lib/lang/pt_dns_a.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Hostname em branco.'; $wb['name_error_regex'] = 'Hostname tem um formato inválido.'; $wb['data_error_empty'] = 'Endereço-IP em branco'; $wb['ip_error_wrong'] = 'Endereço-IP formato inválido'; -$wb['data_error_duplicate'] = 'Registo-A duplicado'; +$wb['data_error_duplicate'] = 'Duplicate A, ALIAS or CNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/pt_dns_aaaa.lng b/interface/web/dns/lib/lang/pt_dns_aaaa.lng index 04698ced19967f56caa6dac3691dc1eb411780c5..51bb7aa5f1fe990810908c8bd0c22fd37745ee22 100644 --- a/interface/web/dns/lib/lang/pt_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/pt_dns_aaaa.lng @@ -11,6 +11,7 @@ $wb['no_zone_perm'] = 'Não tem permissão para adicionar registos a está zona $wb['name_error_empty'] = 'O Hostname está em branco.'; $wb['name_error_regex'] = 'O Hostname está com formato inválido.'; $wb['data_error_empty'] = 'Endereço-IP em branco'; +$wb['data_error_duplicate'] = 'Duplicate AAAA, ALIAS or CNAME record'; $wb['ip_error_wrong'] = 'Endereço-IP com formato inválido'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/pt_dns_alias.lng b/interface/web/dns/lib/lang/pt_dns_alias.lng index 85e0268f9dd8a2e7bc4cbf6b2038b064252939c1..94073bf9ba26a21bc50687f803a59090d16341bd 100644 --- a/interface/web/dns/lib/lang/pt_dns_alias.lng +++ b/interface/web/dns/lib/lang/pt_dns_alias.lng @@ -12,5 +12,6 @@ $wb['name_error_empty'] = 'Hostname está em branco.'; $wb['name_error_regex'] = 'O hostname está em um formato inválido.'; $wb['data_error_empty'] = 'Hostname de destino está em branco'; $wb['data_error_regex'] = 'O hostname de destino está em um formato inválido.'; +$wb['data_error_duplicate'] = 'Duplicate A, AAAA, ALIAS, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/pt_dns_caa.lng b/interface/web/dns/lib/lang/pt_dns_caa.lng index 82de234d6e545c0912f0694f63b07182429bfa58..8040cb4d549f3bc060a5b9ace62f711715446b0f 100644 --- a/interface/web/dns/lib/lang/pt_dns_caa.lng +++ b/interface/web/dns/lib/lang/pt_dns_caa.lng @@ -1,5 +1,5 @@ diff --git a/interface/web/dns/lib/lang/pt_dns_dname.lng b/interface/web/dns/lib/lang/pt_dns_dname.lng new file mode 100644 index 0000000000000000000000000000000000000000..aa8b13cc4ea12442f0099423f68ba8fe35d7d675 --- /dev/null +++ b/interface/web/dns/lib/lang/pt_dns_dname.lng @@ -0,0 +1,17 @@ + diff --git a/interface/web/dns/lib/lang/pt_dns_import.lng b/interface/web/dns/lib/lang/pt_dns_import.lng index 8f67eba14c74cf72fbf18fc031dc1896de3fc21a..3fc63992ed75d7262ee09d7726130a858bcf5fed 100644 --- a/interface/web/dns/lib/lang/pt_dns_import.lng +++ b/interface/web/dns/lib/lang/pt_dns_import.lng @@ -4,13 +4,22 @@ $wb['client_txt'] = 'Client'; $wb['btn_save_txt'] = 'Import Zonefile'; $wb['btn_cancel_txt'] = 'Cancel'; $wb['domain_txt'] = 'Domain'; -$wb['zone_file_successfully_imported_txt'] = 'The zone file has successfully been imported!'; -$wb['error_no_valid_zone_file_txt'] = 'This appears to be no valid zone file!'; +$wb['zone_file_successfully_imported_txt'] = 'The zone file has successfully been imported.'; +$wb['error_no_valid_zone_file_txt'] = 'This zone file appears invalid.'; $wb['zonefile_to_import_txt'] = 'Zone File'; -$wb['domain_field_desc_txt'] = 'Can be left empty if domain name is in the filename or the zone-file content.'; +$wb['domain_field_desc_txt'] = 'If empty, domain name is taken from SOA record.'; $wb['title'] = 'Import Zone Files'; $wb['no_file_uploaded_error'] = 'No zonefile uploaded'; $wb['zone_file_import_txt'] = 'Zone File Import'; $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.'; ?> diff --git a/interface/web/dns/lib/lang/pt_dns_naptr.lng b/interface/web/dns/lib/lang/pt_dns_naptr.lng new file mode 100644 index 0000000000000000000000000000000000000000..b39373c13de1d5b288b85d4ebeef8696a09d3af6 --- /dev/null +++ b/interface/web/dns/lib/lang/pt_dns_naptr.lng @@ -0,0 +1,21 @@ + diff --git a/interface/web/dns/lib/lang/pt_dns_soa.lng b/interface/web/dns/lib/lang/pt_dns_soa.lng index 61ff07f0cbd56d1cb9e24c4955cd83c8e5b59931..e1e8490b7d04fde56e5dbd625410c6bb753bfdcd 100644 --- a/interface/web/dns/lib/lang/pt_dns_soa.lng +++ b/interface/web/dns/lib/lang/pt_dns_soa.lng @@ -7,7 +7,7 @@ $wb['serial_txt'] = 'Serial'; $wb['refresh_txt'] = 'Refresh'; $wb['retry_txt'] = 'Retry'; $wb['expire_txt'] = 'Expire'; -$wb['minimum_txt'] = 'Minimum'; +$wb['minimum_txt'] = 'Minimum (negative cache ttl)'; $wb['ttl_txt'] = 'TTL'; $wb['xfer_txt'] = 'Permitir transferências de zona para
    estes IPs (lista separada por ponto e vírgula)'; $wb['active_txt'] = 'Activo'; @@ -22,7 +22,7 @@ $wb['ns_error_regex'] = 'NS tem um formato inválido.'; $wb['mbox_error_empty'] = 'Correio está em branco.'; $wb['mbox_error_regex'] = 'Correio com formato inválido.'; $wb['also_notify_txt'] = 'Also Notify'; -$wb['also_notify_error_regex'] = 'Please use an IP address.'; +$wb['also_notify_error_regex'] = 'Also notify: Please use a valid IP range, one or more IP addresses separated by a comma or use the keyword: any'; $wb['update_acl_txt'] = 'Actualizar ACL'; $wb['seconds_txt'] = 'Seconds'; $wb['eg_domain_tld'] = 'e.g. domain.tld'; @@ -34,11 +34,14 @@ $wb['retry_range_error'] = 'Min. Retry time is 60 seconds.'; $wb['expire_range_error'] = 'Min. Expire time is 60 seconds.'; $wb['minimum_range_error'] = 'Min. Minimum time is 60 seconds.'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; -$wb['xfer_error_regex'] = 'Also notify: Please use an IP address.'; +$wb['xfer_error_regex'] = 'Zone transfers: Please use a valid IP range, one or more IP addresses separated by a comma or use the keyword: any'; $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['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_admin_list.lng b/interface/web/dns/lib/lang/pt_dns_soa_admin_list.lng index 183d1a8349ad9bab096fe27b0f73055fb103ff52..74ba7859000dbc3a9aa24393bdd3415d58e9d597 100644 --- a/interface/web/dns/lib/lang/pt_dns_soa_admin_list.lng +++ b/interface/web/dns/lib/lang/pt_dns_soa_admin_list.lng @@ -7,5 +7,6 @@ $wb['ns_txt'] = 'NS'; $wb['mbox_txt'] = 'Email'; $wb['add_new_record_wizard_txt'] = 'Add new DNS Zone with Wizard'; $wb['add_new_record_txt'] = 'Add new DNS Zone manually'; +$wb['import_zone_file_txt'] = 'Import Zone File'; $wb['sys_groupid_txt'] = 'Client'; ?> diff --git a/interface/web/dns/lib/lang/pt_dns_spf.lng b/interface/web/dns/lib/lang/pt_dns_spf.lng index df8d1fe1453faa2d4decfe0d3dc94cf19ff48458..0cbf77862f6619ad477913cefb5c4b5e248ddae6 100644 --- a/interface/web/dns/lib/lang/pt_dns_spf.lng +++ b/interface/web/dns/lib/lang/pt_dns_spf.lng @@ -1,5 +1,6 @@ edit the existing record?'; +$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'; ?> diff --git a/interface/web/dns/lib/lang/pt_dns_sshfp.lng b/interface/web/dns/lib/lang/pt_dns_sshfp.lng new file mode 100644 index 0000000000000000000000000000000000000000..dc9ad9a00634513f03aec6da53682d2842bae7b6 --- /dev/null +++ b/interface/web/dns/lib/lang/pt_dns_sshfp.lng @@ -0,0 +1,16 @@ + diff --git a/interface/web/dns/lib/lang/ro.lng b/interface/web/dns/lib/lang/ro.lng index aa151ae2739818655d9a65325f8ce4ef1b5011dc..d9583d98700f0da4b6725811e928e58927574d52 100644 --- a/interface/web/dns/lib/lang/ro.lng +++ b/interface/web/dns/lib/lang/ro.lng @@ -4,10 +4,10 @@ $wb['Zones'] = 'Zone'; $wb['DNS A'] = 'DNS A'; $wb['DNS ALIAS'] = 'DNS ALIAS'; $wb['DNS CNAME'] = 'DNS CNAME'; -$wb['DNS hinfo'] = 'DNS hinfo'; -$wb['DNS mx'] = 'DNS mx'; -$wb['DNS ns'] = 'DNS ns'; -$wb['DNS ptr'] = 'DNS ptr'; +$wb['DNS hinfo'] = 'DNS HINFO'; +$wb['DNS mx'] = 'DNS MX'; +$wb['DNS ns'] = 'DNS NS'; +$wb['DNS ptr'] = 'DNS PTR'; $wb['DNS RP'] = 'DNS RP'; $wb['DNS Zone'] = 'DNS Zone'; $wb['Records'] = 'Records'; diff --git a/interface/web/dns/lib/lang/ro_dns_a.lng b/interface/web/dns/lib/lang/ro_dns_a.lng index f2f6a46c439121575df40209e87a5811833c9efa..db5d2937a41174521fc772e1b60de83d7c6b9dc6 100644 --- a/interface/web/dns/lib/lang/ro_dns_a.lng +++ b/interface/web/dns/lib/lang/ro_dns_a.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Hostname necompletat'; $wb['name_error_regex'] = 'Hostname format gresit'; $wb['data_error_empty'] = 'IP-Adresa vid'; $wb['ip_error_wrong'] = 'IP-Adresa format invalid'; -$wb['data_error_duplicate'] = 'Duplicate A-Record'; +$wb['data_error_duplicate'] = 'Duplicate A, ALIAS or CNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/ro_dns_aaaa.lng b/interface/web/dns/lib/lang/ro_dns_aaaa.lng index 0b7e38ac651ad47bbf8848947f3e1f06810e83f5..41b0d2202127712b17c8517b1f2a5a8f64e6bea9 100644 --- a/interface/web/dns/lib/lang/ro_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/ro_dns_aaaa.lng @@ -11,6 +11,7 @@ $wb['no_zone_perm'] = 'You do not have the permission to add a record to this DN $wb['name_error_empty'] = 'The hostname is empty.'; $wb['name_error_regex'] = 'The hostname has the wrong format.'; $wb['data_error_empty'] = 'IP-Address empty'; +$wb['data_error_duplicate'] = 'Duplicate AAAA, ALIAS or CNAME record'; $wb['ip_error_wrong'] = 'IP-Address format invalid'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/ro_dns_alias.lng b/interface/web/dns/lib/lang/ro_dns_alias.lng index a65a41ad8ee480ea0eef43cebba9b26a0d53fda8..925482e87bb637c346da3f76a4969516e991dfd6 100644 --- a/interface/web/dns/lib/lang/ro_dns_alias.lng +++ b/interface/web/dns/lib/lang/ro_dns_alias.lng @@ -12,5 +12,6 @@ $wb['name_error_empty'] = 'Hostname tinta este vid'; $wb['name_error_regex'] = 'Hostname in format gresit'; $wb['data_error_empty'] = 'Hostname tinta este vid'; $wb['data_error_regex'] = 'Hostname tinta format invalid'; +$wb['data_error_duplicate'] = 'Duplicate A, AAAA, ALIAS, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/ro_dns_caa.lng b/interface/web/dns/lib/lang/ro_dns_caa.lng index 82de234d6e545c0912f0694f63b07182429bfa58..8040cb4d549f3bc060a5b9ace62f711715446b0f 100644 --- a/interface/web/dns/lib/lang/ro_dns_caa.lng +++ b/interface/web/dns/lib/lang/ro_dns_caa.lng @@ -1,5 +1,5 @@ diff --git a/interface/web/dns/lib/lang/ro_dns_dname.lng b/interface/web/dns/lib/lang/ro_dns_dname.lng new file mode 100644 index 0000000000000000000000000000000000000000..01c51d8605d2c86ba79a058cca589a384f5b702f --- /dev/null +++ b/interface/web/dns/lib/lang/ro_dns_dname.lng @@ -0,0 +1,17 @@ + diff --git a/interface/web/dns/lib/lang/ro_dns_import.lng b/interface/web/dns/lib/lang/ro_dns_import.lng index 8f67eba14c74cf72fbf18fc031dc1896de3fc21a..3fc63992ed75d7262ee09d7726130a858bcf5fed 100644 --- a/interface/web/dns/lib/lang/ro_dns_import.lng +++ b/interface/web/dns/lib/lang/ro_dns_import.lng @@ -4,13 +4,22 @@ $wb['client_txt'] = 'Client'; $wb['btn_save_txt'] = 'Import Zonefile'; $wb['btn_cancel_txt'] = 'Cancel'; $wb['domain_txt'] = 'Domain'; -$wb['zone_file_successfully_imported_txt'] = 'The zone file has successfully been imported!'; -$wb['error_no_valid_zone_file_txt'] = 'This appears to be no valid zone file!'; +$wb['zone_file_successfully_imported_txt'] = 'The zone file has successfully been imported.'; +$wb['error_no_valid_zone_file_txt'] = 'This zone file appears invalid.'; $wb['zonefile_to_import_txt'] = 'Zone File'; -$wb['domain_field_desc_txt'] = 'Can be left empty if domain name is in the filename or the zone-file content.'; +$wb['domain_field_desc_txt'] = 'If empty, domain name is taken from SOA record.'; $wb['title'] = 'Import Zone Files'; $wb['no_file_uploaded_error'] = 'No zonefile uploaded'; $wb['zone_file_import_txt'] = 'Zone File Import'; $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.'; ?> diff --git a/interface/web/dns/lib/lang/ro_dns_naptr.lng b/interface/web/dns/lib/lang/ro_dns_naptr.lng new file mode 100644 index 0000000000000000000000000000000000000000..b39373c13de1d5b288b85d4ebeef8696a09d3af6 --- /dev/null +++ b/interface/web/dns/lib/lang/ro_dns_naptr.lng @@ -0,0 +1,21 @@ + diff --git a/interface/web/dns/lib/lang/ro_dns_soa.lng b/interface/web/dns/lib/lang/ro_dns_soa.lng index 134758f95ec9e9f701d394e241a678f6bd123530..87382ffa6fb46947058476641213235176e4ded6 100644 --- a/interface/web/dns/lib/lang/ro_dns_soa.lng +++ b/interface/web/dns/lib/lang/ro_dns_soa.lng @@ -7,7 +7,7 @@ $wb['serial_txt'] = 'Serial'; $wb['refresh_txt'] = 'Reincarca'; $wb['retry_txt'] = 'Reincearca'; $wb['expire_txt'] = 'Expire'; -$wb['minimum_txt'] = 'Minimum'; +$wb['minimum_txt'] = 'Minimum (negative cache ttl)'; $wb['ttl_txt'] = 'TTL'; $wb['xfer_txt'] = 'Accepta transfer zone catre
    aceste IP-uri (comma separated list)'; $wb['active_txt'] = 'Active'; @@ -22,7 +22,7 @@ $wb['ns_error_regex'] = 'NS are un format invalid'; $wb['mbox_error_empty'] = 'Email-ul este gol'; $wb['mbox_error_regex'] = 'Format email invalid.'; $wb['also_notify_txt'] = 'Also Notify'; -$wb['also_notify_error_regex'] = 'Please use an IP address.'; +$wb['also_notify_error_regex'] = 'Also notify: Please use a valid IP range, one or more IP addresses separated by a comma or use the keyword: any'; $wb['update_acl_txt'] = 'Update ACL'; $wb['seconds_txt'] = 'Seconds'; $wb['eg_domain_tld'] = 'e.g. domain.tld'; @@ -34,11 +34,14 @@ $wb['retry_range_error'] = 'Min. Retry time is 60 seconds.'; $wb['expire_range_error'] = 'Min. Expire time is 60 seconds.'; $wb['minimum_range_error'] = 'Min. Minimum time is 60 seconds.'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; -$wb['xfer_error_regex'] = 'Also notify: Please use an IP address.'; +$wb['xfer_error_regex'] = 'Zone transfers: Please use a valid IP range, one or more IP addresses separated by a comma or use the keyword: any'; $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['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_admin_list.lng b/interface/web/dns/lib/lang/ro_dns_soa_admin_list.lng index 183d1a8349ad9bab096fe27b0f73055fb103ff52..74ba7859000dbc3a9aa24393bdd3415d58e9d597 100644 --- a/interface/web/dns/lib/lang/ro_dns_soa_admin_list.lng +++ b/interface/web/dns/lib/lang/ro_dns_soa_admin_list.lng @@ -7,5 +7,6 @@ $wb['ns_txt'] = 'NS'; $wb['mbox_txt'] = 'Email'; $wb['add_new_record_wizard_txt'] = 'Add new DNS Zone with Wizard'; $wb['add_new_record_txt'] = 'Add new DNS Zone manually'; +$wb['import_zone_file_txt'] = 'Import Zone File'; $wb['sys_groupid_txt'] = 'Client'; ?> diff --git a/interface/web/dns/lib/lang/ro_dns_spf.lng b/interface/web/dns/lib/lang/ro_dns_spf.lng index df8d1fe1453faa2d4decfe0d3dc94cf19ff48458..0cbf77862f6619ad477913cefb5c4b5e248ddae6 100644 --- a/interface/web/dns/lib/lang/ro_dns_spf.lng +++ b/interface/web/dns/lib/lang/ro_dns_spf.lng @@ -1,5 +1,6 @@ edit the existing record?'; +$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'; ?> diff --git a/interface/web/dns/lib/lang/ro_dns_sshfp.lng b/interface/web/dns/lib/lang/ro_dns_sshfp.lng new file mode 100644 index 0000000000000000000000000000000000000000..dc9ad9a00634513f03aec6da53682d2842bae7b6 --- /dev/null +++ b/interface/web/dns/lib/lang/ro_dns_sshfp.lng @@ -0,0 +1,16 @@ + diff --git a/interface/web/dns/lib/lang/ru.lng b/interface/web/dns/lib/lang/ru.lng index 5faccbf414536bcb81a8d839b3c93e2aec95100a..34cc20a32aa623131f68bc073899871b2f95a0b5 100644 --- a/interface/web/dns/lib/lang/ru.lng +++ b/interface/web/dns/lib/lang/ru.lng @@ -4,10 +4,10 @@ $wb['Zones'] = 'Зоны'; $wb['DNS A'] = 'DNS A'; $wb['DNS ALIAS'] = 'DNS ALIAS'; $wb['DNS CNAME'] = 'DNS CNAME'; -$wb['DNS hinfo'] = 'DNS hinfo'; -$wb['DNS mx'] = 'DNS mx'; -$wb['DNS ns'] = 'DNS ns'; -$wb['DNS ptr'] = 'DNS ptr'; +$wb['DNS hinfo'] = 'DNS HINFO'; +$wb['DNS mx'] = 'DNS MX'; +$wb['DNS ns'] = 'DNS NS'; +$wb['DNS ptr'] = 'DNS PTR'; $wb['DNS RP'] = 'DNS RP'; $wb['DNS Zone'] = 'DNS Zone'; $wb['Records'] = 'Записи'; diff --git a/interface/web/dns/lib/lang/ru_dns_a.lng b/interface/web/dns/lib/lang/ru_dns_a.lng index 0af3014657a54287bc7550f78d618ad73bb0b30c..254dd3a76772d67c88e50eb578914eb515ceb590 100644 --- a/interface/web/dns/lib/lang/ru_dns_a.lng +++ b/interface/web/dns/lib/lang/ru_dns_a.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Имя пустое.'; $wb['name_error_regex'] = 'Имя узла имеет неправильный формат.'; $wb['data_error_empty'] = 'IP-адрес пустой'; $wb['ip_error_wrong'] = 'Неправильный формат IP-адреса'; -$wb['data_error_duplicate'] = 'Дубликат записи'; +$wb['data_error_duplicate'] = 'Duplicate A, ALIAS or CNAME record'; $wb['ttl_range_error'] = 'Мин. время TTL 60 секунд.'; ?> diff --git a/interface/web/dns/lib/lang/ru_dns_aaaa.lng b/interface/web/dns/lib/lang/ru_dns_aaaa.lng index 4620b53eaa2adae2f8ae796f119c7f1382abdbcd..9513c8fdc21885899936cf9dd70bfed8526e3296 100644 --- a/interface/web/dns/lib/lang/ru_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/ru_dns_aaaa.lng @@ -11,6 +11,7 @@ $wb['no_zone_perm'] = 'У Вас нет прав добавлять эту за $wb['name_error_empty'] = 'Имя пустое.'; $wb['name_error_regex'] = 'Неправильный формат имени хоста.'; $wb['data_error_empty'] = 'Пустой IP-адрес'; +$wb['data_error_duplicate'] = 'Duplicate AAAA, ALIAS or CNAME record'; $wb['ip_error_wrong'] = 'Неправильный формат IP-адреса'; $wb['ttl_range_error'] = 'Мин. время TTL 60 секунд.'; ?> diff --git a/interface/web/dns/lib/lang/ru_dns_alias.lng b/interface/web/dns/lib/lang/ru_dns_alias.lng index 32f1e065decc7704cd40065cc5fe00ec4a0cec4b..d80b0e7f9c4ef5a70a5f43c99debc00e30ef565b 100644 --- a/interface/web/dns/lib/lang/ru_dns_alias.lng +++ b/interface/web/dns/lib/lang/ru_dns_alias.lng @@ -12,5 +12,6 @@ $wb['name_error_empty'] = 'Имя пустое.'; $wb['name_error_regex'] = 'Имя узла имеет неправильный формат.'; $wb['data_error_empty'] = 'Целевое имя узла пустое'; $wb['data_error_regex'] = 'Целевое имя узла в неправильном формате'; +$wb['data_error_duplicate'] = 'Duplicate A, AAAA, ALIAS, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'Мин. время TTL 60 секунд.'; ?> diff --git a/interface/web/dns/lib/lang/ru_dns_caa.lng b/interface/web/dns/lib/lang/ru_dns_caa.lng index 82de234d6e545c0912f0694f63b07182429bfa58..8040cb4d549f3bc060a5b9ace62f711715446b0f 100644 --- a/interface/web/dns/lib/lang/ru_dns_caa.lng +++ b/interface/web/dns/lib/lang/ru_dns_caa.lng @@ -1,5 +1,5 @@ TTL 60 секунд.'; ?> diff --git a/interface/web/dns/lib/lang/ru_dns_dname.lng b/interface/web/dns/lib/lang/ru_dns_dname.lng new file mode 100644 index 0000000000000000000000000000000000000000..7e8da83b5b1f03bf599fddf3bfd803ebd00cc331 --- /dev/null +++ b/interface/web/dns/lib/lang/ru_dns_dname.lng @@ -0,0 +1,17 @@ +TTL 60 секунд.'; +?> diff --git a/interface/web/dns/lib/lang/ru_dns_import.lng b/interface/web/dns/lib/lang/ru_dns_import.lng index 752e02cc6c0faa4368b420dde619a92f6c77884d..95cf32c935bb281cd84cc1c79d38500eea2e90b4 100644 --- a/interface/web/dns/lib/lang/ru_dns_import.lng +++ b/interface/web/dns/lib/lang/ru_dns_import.lng @@ -13,4 +13,13 @@ $wb['no_file_uploaded_error'] = 'Файл зоны не загружен.'; $wb['zone_file_import_txt'] = 'Импорт файла зоны'; $wb['error_no_server_id'] = 'Не указан сервер.'; $wb['error_not_allowed_server_id'] = 'Выбранный сервер не доступен для этой учетной записи.'; +$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.'; ?> diff --git a/interface/web/dns/lib/lang/ru_dns_naptr.lng b/interface/web/dns/lib/lang/ru_dns_naptr.lng new file mode 100644 index 0000000000000000000000000000000000000000..b39373c13de1d5b288b85d4ebeef8696a09d3af6 --- /dev/null +++ b/interface/web/dns/lib/lang/ru_dns_naptr.lng @@ -0,0 +1,21 @@ + diff --git a/interface/web/dns/lib/lang/ru_dns_soa.lng b/interface/web/dns/lib/lang/ru_dns_soa.lng index fe716cdc1b1ca89be506c500674187fc042a8131..36a4c89cdf10d503eb5b1ca05b8d3b2626167dfe 100644 --- a/interface/web/dns/lib/lang/ru_dns_soa.lng +++ b/interface/web/dns/lib/lang/ru_dns_soa.lng @@ -7,7 +7,7 @@ $wb['serial_txt'] = 'Серийный номер'; $wb['refresh_txt'] = 'Refresh'; $wb['retry_txt'] = 'Повтор'; $wb['expire_txt'] = 'Expire'; -$wb['minimum_txt'] = 'Minimum'; +$wb['minimum_txt'] = 'Minimum (negative cache ttl)'; $wb['ttl_txt'] = 'TTL'; $wb['xfer_txt'] = 'Xfer (IP)'; $wb['active_txt'] = 'Активно'; @@ -41,4 +41,7 @@ $wb['dnssec_wanted_info'] = 'При отключении DNSSEC ключи не $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/ru_dns_soa_admin_list.lng b/interface/web/dns/lib/lang/ru_dns_soa_admin_list.lng index 47940f9e8d00fce49e411b15f930e805be3c2df7..d3d7be71834ad6f19a4696d02c6e565ba84311fb 100644 --- a/interface/web/dns/lib/lang/ru_dns_soa_admin_list.lng +++ b/interface/web/dns/lib/lang/ru_dns_soa_admin_list.lng @@ -7,5 +7,6 @@ $wb['ns_txt'] = 'NS'; $wb['mbox_txt'] = 'Адрес эл. почты'; $wb['add_new_record_wizard_txt'] = 'Добавить новую DNS-зону с помощью мастера'; $wb['add_new_record_txt'] = 'Добавить новую DNS-зону вручную'; +$wb['import_zone_file_txt'] = 'Импорт файла зоны'; $wb['sys_groupid_txt'] = 'Клиент'; ?> diff --git a/interface/web/dns/lib/lang/ru_dns_spf.lng b/interface/web/dns/lib/lang/ru_dns_spf.lng index cc4b4b087be6b840f2d58593d5ff3de096b69cd7..2d69c49a326a9eb55da2c6003afde78b664493e5 100644 --- a/interface/web/dns/lib/lang/ru_dns_spf.lng +++ b/interface/web/dns/lib/lang/ru_dns_spf.lng @@ -1,5 +1,6 @@ edit the existing record?'; +$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'] = 'Макс. количество DNS-записей для вашей учетной записи достигнуто.'; $wb['no_zone_perm'] = 'У Вас нет прав добавлять эту запись.'; $wb['ttl_range_error'] = 'Мин. время TTL 60 секунд.'; +$wb['name_error_regex'] = 'The hostname has the wrong format.'; +$wb['btn_edit_as_txt_record_txt'] = 'Edit as TXT record'; ?> diff --git a/interface/web/dns/lib/lang/ru_dns_sshfp.lng b/interface/web/dns/lib/lang/ru_dns_sshfp.lng new file mode 100644 index 0000000000000000000000000000000000000000..bf1a8a892a1f2c72943ebc70cf5d081806eade32 --- /dev/null +++ b/interface/web/dns/lib/lang/ru_dns_sshfp.lng @@ -0,0 +1,16 @@ +TTL 60 секунд.'; +?> diff --git a/interface/web/dns/lib/lang/se.lng b/interface/web/dns/lib/lang/se.lng index 4f443f079ec960d10eb22da25b56599607e73220..fe3c67255c01ffa6a985e77a823edd6c22af9759 100644 --- a/interface/web/dns/lib/lang/se.lng +++ b/interface/web/dns/lib/lang/se.lng @@ -4,10 +4,10 @@ $wb['Zones'] = 'Zoner'; $wb['DNS A'] = 'DNS A'; $wb['DNS ALIAS'] = 'DNS ALIAS'; $wb['DNS CNAME'] = 'DNS CNAME'; -$wb['DNS hinfo'] = 'DNS hinfo'; -$wb['DNS mx'] = 'DNS mx'; -$wb['DNS ns'] = 'DNS ns'; -$wb['DNS ptr'] = 'DNS ptr'; +$wb['DNS hinfo'] = 'DNS HINFO'; +$wb['DNS mx'] = 'DNS MX'; +$wb['DNS ns'] = 'DNS NS'; +$wb['DNS ptr'] = 'DNS PTR'; $wb['DNS RP'] = 'DNS RP'; $wb['DNS Zone'] = 'DNS Zone'; $wb['Records'] = 'Records'; diff --git a/interface/web/dns/lib/lang/se_dns_a.lng b/interface/web/dns/lib/lang/se_dns_a.lng index 7543672a9482becb158ccc74f22d896e6415ceed..36e5b50eb3836c822c58565386d260e5b581476d 100644 --- a/interface/web/dns/lib/lang/se_dns_a.lng +++ b/interface/web/dns/lib/lang/se_dns_a.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'The hostname is empty.'; $wb['name_error_regex'] = 'The hostname has the wrong format.'; $wb['data_error_empty'] = 'IP-Address empty'; $wb['ip_error_wrong'] = 'IP-Address format invalid'; -$wb['data_error_duplicate'] = 'Duplicate A-Record'; +$wb['data_error_duplicate'] = 'Duplicate A, ALIAS or CNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/se_dns_aaaa.lng b/interface/web/dns/lib/lang/se_dns_aaaa.lng index 0b7e38ac651ad47bbf8848947f3e1f06810e83f5..41b0d2202127712b17c8517b1f2a5a8f64e6bea9 100644 --- a/interface/web/dns/lib/lang/se_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/se_dns_aaaa.lng @@ -11,6 +11,7 @@ $wb['no_zone_perm'] = 'You do not have the permission to add a record to this DN $wb['name_error_empty'] = 'The hostname is empty.'; $wb['name_error_regex'] = 'The hostname has the wrong format.'; $wb['data_error_empty'] = 'IP-Address empty'; +$wb['data_error_duplicate'] = 'Duplicate AAAA, ALIAS or CNAME record'; $wb['ip_error_wrong'] = 'IP-Address format invalid'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/se_dns_alias.lng b/interface/web/dns/lib/lang/se_dns_alias.lng index bd4be9f219e66a4e78a408cc6cc5bd06f06c28e7..bf56c86fbe61a4713599eefd0cc739b153c78389 100644 --- a/interface/web/dns/lib/lang/se_dns_alias.lng +++ b/interface/web/dns/lib/lang/se_dns_alias.lng @@ -12,5 +12,6 @@ $wb['name_error_empty'] = 'The hostname is empty.'; $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.'; ?> diff --git a/interface/web/dns/lib/lang/se_dns_caa.lng b/interface/web/dns/lib/lang/se_dns_caa.lng index 82de234d6e545c0912f0694f63b07182429bfa58..8040cb4d549f3bc060a5b9ace62f711715446b0f 100644 --- a/interface/web/dns/lib/lang/se_dns_caa.lng +++ b/interface/web/dns/lib/lang/se_dns_caa.lng @@ -1,5 +1,5 @@ diff --git a/interface/web/dns/lib/lang/se_dns_dname.lng b/interface/web/dns/lib/lang/se_dns_dname.lng new file mode 100644 index 0000000000000000000000000000000000000000..62088e09b6f4e92cc41b63cc87c5180756186a2f --- /dev/null +++ b/interface/web/dns/lib/lang/se_dns_dname.lng @@ -0,0 +1,17 @@ + diff --git a/interface/web/dns/lib/lang/se_dns_import.lng b/interface/web/dns/lib/lang/se_dns_import.lng index 801dd473f7d23e517251c45f7f09a06d304ec88d..1c9496600275d21b8fb2bbfe059017c67b1e892b 100644 --- a/interface/web/dns/lib/lang/se_dns_import.lng +++ b/interface/web/dns/lib/lang/se_dns_import.lng @@ -7,10 +7,19 @@ $wb['domain_txt'] = 'Domän'; $wb['zone_file_successfully_imported_txt'] = 'Zonfilimporten har lyckats!'; $wb['error_no_valid_zone_file_txt'] = 'Detta verkar inte vara en giltig zonfil'; $wb['zonefile_to_import_txt'] = 'Zonfil'; -$wb['domain_field_desc_txt'] = 'Can be left empty if domain name is in the filename or the zone-file content.'; +$wb['domain_field_desc_txt'] = 'If empty, domain name is taken from SOA record.'; $wb['title'] = 'Importera zonfiler'; $wb['no_file_uploaded_error'] = 'Ingen zonfil uppladdad'; $wb['zone_file_import_txt'] = 'Zonfilsimport'; $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.'; ?> diff --git a/interface/web/dns/lib/lang/se_dns_naptr.lng b/interface/web/dns/lib/lang/se_dns_naptr.lng new file mode 100644 index 0000000000000000000000000000000000000000..b39373c13de1d5b288b85d4ebeef8696a09d3af6 --- /dev/null +++ b/interface/web/dns/lib/lang/se_dns_naptr.lng @@ -0,0 +1,21 @@ + diff --git a/interface/web/dns/lib/lang/se_dns_soa.lng b/interface/web/dns/lib/lang/se_dns_soa.lng index 034d3235a7e5c16d36678de066054e1b22c4d4f5..0e9732b43e2c25c4745f44b5a81aa75eedc736b7 100644 --- a/interface/web/dns/lib/lang/se_dns_soa.lng +++ b/interface/web/dns/lib/lang/se_dns_soa.lng @@ -7,7 +7,7 @@ $wb['serial_txt'] = 'Serienummer'; $wb['refresh_txt'] = 'Refresh'; $wb['retry_txt'] = 'Retry'; $wb['expire_txt'] = 'Expire'; -$wb['minimum_txt'] = 'Minimum'; +$wb['minimum_txt'] = 'Minimum (negative cache ttl)'; $wb['ttl_txt'] = 'TTL'; $wb['xfer_txt'] = 'Allow zone transfers to
    these IPs (comma separated list)'; $wb['active_txt'] = 'Aktiv'; @@ -34,11 +34,14 @@ $wb['retry_range_error'] = 'Min. Retry time is 60 seconds.'; $wb['expire_range_error'] = 'Min. Expire time is 60 seconds.'; $wb['minimum_range_error'] = 'Min. Minimum time is 60 seconds.'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; -$wb['xfer_error_regex'] = 'Also notify: Please use an IP address.'; +$wb['xfer_error_regex'] = 'Zone transfers: Please use a valid IP range, one or more IP addresses separated by a comma or use the keyword: any'; $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['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_admin_list.lng b/interface/web/dns/lib/lang/se_dns_soa_admin_list.lng index 183d1a8349ad9bab096fe27b0f73055fb103ff52..74ba7859000dbc3a9aa24393bdd3415d58e9d597 100644 --- a/interface/web/dns/lib/lang/se_dns_soa_admin_list.lng +++ b/interface/web/dns/lib/lang/se_dns_soa_admin_list.lng @@ -7,5 +7,6 @@ $wb['ns_txt'] = 'NS'; $wb['mbox_txt'] = 'Email'; $wb['add_new_record_wizard_txt'] = 'Add new DNS Zone with Wizard'; $wb['add_new_record_txt'] = 'Add new DNS Zone manually'; +$wb['import_zone_file_txt'] = 'Import Zone File'; $wb['sys_groupid_txt'] = 'Client'; ?> diff --git a/interface/web/dns/lib/lang/se_dns_spf.lng b/interface/web/dns/lib/lang/se_dns_spf.lng index df8d1fe1453faa2d4decfe0d3dc94cf19ff48458..0cbf77862f6619ad477913cefb5c4b5e248ddae6 100644 --- a/interface/web/dns/lib/lang/se_dns_spf.lng +++ b/interface/web/dns/lib/lang/se_dns_spf.lng @@ -1,5 +1,6 @@ edit the existing record?'; +$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'; ?> diff --git a/interface/web/dns/lib/lang/se_dns_sshfp.lng b/interface/web/dns/lib/lang/se_dns_sshfp.lng new file mode 100644 index 0000000000000000000000000000000000000000..dc9ad9a00634513f03aec6da53682d2842bae7b6 --- /dev/null +++ b/interface/web/dns/lib/lang/se_dns_sshfp.lng @@ -0,0 +1,16 @@ + diff --git a/interface/web/dns/lib/lang/se_dns_wizard.lng b/interface/web/dns/lib/lang/se_dns_wizard.lng index 800477dbe94ff45ea4d0fc3440778d0b9bbec486..1c416ebddd0d52c95096275332b2e96e7a40ba0d 100644 --- a/interface/web/dns/lib/lang/se_dns_wizard.lng +++ b/interface/web/dns/lib/lang/se_dns_wizard.lng @@ -2,7 +2,7 @@ $wb['template_id_txt'] = 'Template'; $wb['server_id_txt'] = 'Server'; $wb['client_txt'] = 'Client'; -$wb['btn_save_txt'] = 'Create DNS Record'; +$wb['btn_save_txt'] = 'Create new DNS zone'; $wb['btn_cancel_txt'] = 'Cancel'; $wb['domain_txt'] = 'Domain'; $wb['email_txt'] = 'Email'; diff --git a/interface/web/dns/lib/lang/sk.lng b/interface/web/dns/lib/lang/sk.lng index b03931fe0853a1de3f6c9b824b5a20ae33d5c2bd..a872f0eba4a00e5353bb2544c8eafc70aa54a51b 100644 --- a/interface/web/dns/lib/lang/sk.lng +++ b/interface/web/dns/lib/lang/sk.lng @@ -4,10 +4,10 @@ $wb['Zones'] = 'Zóny'; $wb['DNS A'] = 'DNS A'; $wb['DNS ALIAS'] = 'DNS ALIAS'; $wb['DNS CNAME'] = 'DNS CNAME'; -$wb['DNS hinfo'] = 'DNS hinfo'; -$wb['DNS mx'] = 'DNS mx'; -$wb['DNS ns'] = 'DNS ns'; -$wb['DNS ptr'] = 'DNS ptr'; +$wb['DNS hinfo'] = 'DNS HINFO'; +$wb['DNS mx'] = 'DNS MX'; +$wb['DNS ns'] = 'DNS NS'; +$wb['DNS ptr'] = 'DNS PTR'; $wb['DNS RP'] = 'DNS RP'; $wb['DNS Zone'] = 'DNS Zóna'; $wb['Records'] = 'Záznamy'; diff --git a/interface/web/dns/lib/lang/sk_dns_a.lng b/interface/web/dns/lib/lang/sk_dns_a.lng index d1fff2cdea70b4699607820cceb92e7b85bf2ad3..1362b4624d6b2fe5a4e9b486fe7b8e568b124720 100644 --- a/interface/web/dns/lib/lang/sk_dns_a.lng +++ b/interface/web/dns/lib/lang/sk_dns_a.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Hostname je prázdny.'; $wb['name_error_regex'] = 'Hostname má zlý formát.'; $wb['data_error_empty'] = 'IP Adresa je prázdna'; $wb['ip_error_wrong'] = 'IP Adresa má zlý formát.'; -$wb['data_error_duplicate'] = 'Duplikátny A-záznam'; +$wb['data_error_duplicate'] = 'Duplicate A, ALIAS or CNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/sk_dns_aaaa.lng b/interface/web/dns/lib/lang/sk_dns_aaaa.lng index 78d5cc6c4c63f556ed0b85df5172396ad1d9783c..0716d157986249d30e8ab27578b652ed28f01a63 100644 --- a/interface/web/dns/lib/lang/sk_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/sk_dns_aaaa.lng @@ -11,6 +11,7 @@ $wb['no_zone_perm'] = 'Nemáte oprávnenie Pridať záznam do tejto zóny DNS.'; $wb['name_error_empty'] = 'Hostname je prázdny.'; $wb['name_error_regex'] = 'Hostname má zlý formát.'; $wb['data_error_empty'] = 'IP-Adresa prázdna'; +$wb['data_error_duplicate'] = 'Duplicate AAAA, ALIAS or CNAME record'; $wb['ip_error_wrong'] = 'IP-Adresa má zlý formát'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/sk_dns_alias.lng b/interface/web/dns/lib/lang/sk_dns_alias.lng index a319049efc26a3b9e97a9c43d6884a82e7943934..ce167c7bcd35858cc2de8f597621de4e968f9d1a 100644 --- a/interface/web/dns/lib/lang/sk_dns_alias.lng +++ b/interface/web/dns/lib/lang/sk_dns_alias.lng @@ -12,5 +12,6 @@ $wb['name_error_empty'] = 'Hostname je prázdny.'; $wb['name_error_regex'] = 'Hostname má zlý formát.'; $wb['data_error_empty'] = 'Cieľový hostname je prázdny'; $wb['data_error_regex'] = 'Cieľový hostname má neplatný formát'; +$wb['data_error_duplicate'] = 'Duplicate A, AAAA, ALIAS, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/sk_dns_caa.lng b/interface/web/dns/lib/lang/sk_dns_caa.lng index 82de234d6e545c0912f0694f63b07182429bfa58..8040cb4d549f3bc060a5b9ace62f711715446b0f 100644 --- a/interface/web/dns/lib/lang/sk_dns_caa.lng +++ b/interface/web/dns/lib/lang/sk_dns_caa.lng @@ -1,5 +1,5 @@ diff --git a/interface/web/dns/lib/lang/sk_dns_dname.lng b/interface/web/dns/lib/lang/sk_dns_dname.lng new file mode 100644 index 0000000000000000000000000000000000000000..88c3f069bd395278a7c54b1726eb44d1e036e17d --- /dev/null +++ b/interface/web/dns/lib/lang/sk_dns_dname.lng @@ -0,0 +1,17 @@ + diff --git a/interface/web/dns/lib/lang/sk_dns_import.lng b/interface/web/dns/lib/lang/sk_dns_import.lng index 8f67eba14c74cf72fbf18fc031dc1896de3fc21a..3fc63992ed75d7262ee09d7726130a858bcf5fed 100644 --- a/interface/web/dns/lib/lang/sk_dns_import.lng +++ b/interface/web/dns/lib/lang/sk_dns_import.lng @@ -4,13 +4,22 @@ $wb['client_txt'] = 'Client'; $wb['btn_save_txt'] = 'Import Zonefile'; $wb['btn_cancel_txt'] = 'Cancel'; $wb['domain_txt'] = 'Domain'; -$wb['zone_file_successfully_imported_txt'] = 'The zone file has successfully been imported!'; -$wb['error_no_valid_zone_file_txt'] = 'This appears to be no valid zone file!'; +$wb['zone_file_successfully_imported_txt'] = 'The zone file has successfully been imported.'; +$wb['error_no_valid_zone_file_txt'] = 'This zone file appears invalid.'; $wb['zonefile_to_import_txt'] = 'Zone File'; -$wb['domain_field_desc_txt'] = 'Can be left empty if domain name is in the filename or the zone-file content.'; +$wb['domain_field_desc_txt'] = 'If empty, domain name is taken from SOA record.'; $wb['title'] = 'Import Zone Files'; $wb['no_file_uploaded_error'] = 'No zonefile uploaded'; $wb['zone_file_import_txt'] = 'Zone File Import'; $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.'; ?> diff --git a/interface/web/dns/lib/lang/sk_dns_naptr.lng b/interface/web/dns/lib/lang/sk_dns_naptr.lng new file mode 100644 index 0000000000000000000000000000000000000000..b39373c13de1d5b288b85d4ebeef8696a09d3af6 --- /dev/null +++ b/interface/web/dns/lib/lang/sk_dns_naptr.lng @@ -0,0 +1,21 @@ + diff --git a/interface/web/dns/lib/lang/sk_dns_soa.lng b/interface/web/dns/lib/lang/sk_dns_soa.lng index ac1f1162430a009255edcd60ec76809fc8fe14ac..115df5672527784714a3b563744077d0d9ff42ac 100644 --- a/interface/web/dns/lib/lang/sk_dns_soa.lng +++ b/interface/web/dns/lib/lang/sk_dns_soa.lng @@ -7,7 +7,7 @@ $wb['serial_txt'] = 'Seriové čislo'; $wb['refresh_txt'] = 'Obnoviť'; $wb['retry_txt'] = 'Opakovať'; $wb['expire_txt'] = 'Expirovať'; -$wb['minimum_txt'] = 'Minimum'; +$wb['minimum_txt'] = 'Minimum (negative cache ttl)'; $wb['ttl_txt'] = 'TTL'; $wb['xfer_txt'] = 'Povoliť prenosy zóny na
    tieto IP (comma separated list)'; $wb['active_txt'] = 'Aktivovať'; @@ -22,7 +22,7 @@ $wb['ns_error_regex'] = 'NS má neplatný formát.'; $wb['mbox_error_empty'] = 'Email je prázdny.'; $wb['mbox_error_regex'] = 'Email má neplatný formát.'; $wb['also_notify_txt'] = 'Also Notify'; -$wb['also_notify_error_regex'] = 'Please use an IP address.'; +$wb['also_notify_error_regex'] = 'Also notify: Please use a valid IP range, one or more IP addresses separated by a comma or use the keyword: any'; $wb['update_acl_txt'] = 'Update ACL'; $wb['seconds_txt'] = 'Seconds'; $wb['eg_domain_tld'] = 'e.g. domain.tld'; @@ -34,11 +34,14 @@ $wb['retry_range_error'] = 'Min. Retry time is 60 seconds.'; $wb['expire_range_error'] = 'Min. Expire time is 60 seconds.'; $wb['minimum_range_error'] = 'Min. Minimum time is 60 seconds.'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; -$wb['xfer_error_regex'] = 'Also notify: Please use an IP address.'; +$wb['xfer_error_regex'] = 'Zone transfers: Please use a valid IP range, one or more IP addresses separated by a comma or use the keyword: any'; $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['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_admin_list.lng b/interface/web/dns/lib/lang/sk_dns_soa_admin_list.lng index 183d1a8349ad9bab096fe27b0f73055fb103ff52..74ba7859000dbc3a9aa24393bdd3415d58e9d597 100644 --- a/interface/web/dns/lib/lang/sk_dns_soa_admin_list.lng +++ b/interface/web/dns/lib/lang/sk_dns_soa_admin_list.lng @@ -7,5 +7,6 @@ $wb['ns_txt'] = 'NS'; $wb['mbox_txt'] = 'Email'; $wb['add_new_record_wizard_txt'] = 'Add new DNS Zone with Wizard'; $wb['add_new_record_txt'] = 'Add new DNS Zone manually'; +$wb['import_zone_file_txt'] = 'Import Zone File'; $wb['sys_groupid_txt'] = 'Client'; ?> diff --git a/interface/web/dns/lib/lang/sk_dns_spf.lng b/interface/web/dns/lib/lang/sk_dns_spf.lng index df8d1fe1453faa2d4decfe0d3dc94cf19ff48458..0cbf77862f6619ad477913cefb5c4b5e248ddae6 100644 --- a/interface/web/dns/lib/lang/sk_dns_spf.lng +++ b/interface/web/dns/lib/lang/sk_dns_spf.lng @@ -1,5 +1,6 @@ edit the existing record?'; +$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'; ?> diff --git a/interface/web/dns/lib/lang/sk_dns_sshfp.lng b/interface/web/dns/lib/lang/sk_dns_sshfp.lng new file mode 100644 index 0000000000000000000000000000000000000000..dc9ad9a00634513f03aec6da53682d2842bae7b6 --- /dev/null +++ b/interface/web/dns/lib/lang/sk_dns_sshfp.lng @@ -0,0 +1,16 @@ + diff --git a/interface/web/dns/lib/lang/tr.lng b/interface/web/dns/lib/lang/tr.lng index a291a5af0807f718f6fc67171a4a28bba1cb69de..e3d18ac8fb7560985e02707cc2b05d415d238369 100644 --- a/interface/web/dns/lib/lang/tr.lng +++ b/interface/web/dns/lib/lang/tr.lng @@ -5,10 +5,10 @@ $wb['Zones'] = 'Bölgeler'; $wb['DNS A'] = 'DNS A'; $wb['DNS ALIAS'] = 'DNS ALIAS'; $wb['DNS CNAME'] = 'DNS CNAME'; -$wb['DNS hinfo'] = 'DNS hinfo'; -$wb['DNS mx'] = 'DNS mx'; -$wb['DNS ns'] = 'DNS ns'; -$wb['DNS ptr'] = 'DNS ptr'; +$wb['DNS hinfo'] = 'DNS HINFO'; +$wb['DNS mx'] = 'DNS MX'; +$wb['DNS ns'] = 'DNS NS'; +$wb['DNS ptr'] = 'DNS PTR'; $wb['DNS RP'] = 'DNS RP'; $wb['DNS Zone'] = 'DNS Bölgesi'; $wb['Records'] = 'Kayıtlar'; diff --git a/interface/web/dns/lib/lang/tr_dns_a.lng b/interface/web/dns/lib/lang/tr_dns_a.lng index 905ff04744011e49434a526c4378e17b3636335e..06b96a7fd5445b2904a3c06039b3c7eee9b566c9 100644 --- a/interface/web/dns/lib/lang/tr_dns_a.lng +++ b/interface/web/dns/lib/lang/tr_dns_a.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'Bu DNS bölgesine kayıt ekleme izniniz yok.'; $wb['name_error_empty'] = 'Sunucu adı boş olamaz.'; $wb['name_error_regex'] = 'Sunucu adı biçimi geçersiz.'; $wb['data_error_empty'] = 'IP Adresi boş olamaz'; -$wb['data_error_duplicate'] = 'Bu A DNS kaydı zaten var'; +$wb['data_error_duplicate'] = 'Duplicate A, ALIAS or CNAME record'; $wb['ttl_range_error'] = 'En düşük TTL süresi 60 saniyedir.'; $wb['ip_error_wrong'] = 'IP adresi biçimi geçersiz'; ?> diff --git a/interface/web/dns/lib/lang/tr_dns_aaaa.lng b/interface/web/dns/lib/lang/tr_dns_aaaa.lng index 1726f80a8ff6c45979e06548ce7a01425b311dd2..cfc99307f063d2dc1c93cd4294778995a109f0c1 100644 --- a/interface/web/dns/lib/lang/tr_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/tr_dns_aaaa.lng @@ -11,6 +11,7 @@ $wb['no_zone_perm'] = 'Bu DNS bölgesine kayıt ekleme izniniz yok.'; $wb['name_error_empty'] = 'Sunucu adı boş olamaz.'; $wb['name_error_regex'] = 'Sunucu adının biçimi geçersiz.'; $wb['data_error_empty'] = 'IP Adresi boş olamaz'; +$wb['data_error_duplicate'] = 'Duplicate AAAA, ALIAS or CNAME record'; $wb['ip_error_wrong'] = 'IP adresinin biçimi geçersiz'; $wb['ttl_range_error'] = 'En düşük TTL süresi 60 saniyedir.'; ?> diff --git a/interface/web/dns/lib/lang/tr_dns_alias.lng b/interface/web/dns/lib/lang/tr_dns_alias.lng index ce78fcf3032004a93aa77a3ec5277c945b2bb912..b152a5fbe6fca61ec9f94c06a4881de45cf1d095 100644 --- a/interface/web/dns/lib/lang/tr_dns_alias.lng +++ b/interface/web/dns/lib/lang/tr_dns_alias.lng @@ -12,5 +12,6 @@ $wb['name_error_empty'] = 'Sunucu adı boş olamaz.'; $wb['name_error_regex'] = 'Sunucu adının biçimi geçersiz.'; $wb['data_error_empty'] = 'Hedef sunucu adı boş olamaz'; $wb['data_error_regex'] = 'Hedef sunucu adı biçimi geçersiz'; +$wb['data_error_duplicate'] = 'Duplicate A, AAAA, ALIAS, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'En düşük TTL süresi 60 saniyedir.'; ?> diff --git a/interface/web/dns/lib/lang/tr_dns_caa.lng b/interface/web/dns/lib/lang/tr_dns_caa.lng index 82de234d6e545c0912f0694f63b07182429bfa58..8040cb4d549f3bc060a5b9ace62f711715446b0f 100644 --- a/interface/web/dns/lib/lang/tr_dns_caa.lng +++ b/interface/web/dns/lib/lang/tr_dns_caa.lng @@ -1,5 +1,5 @@ diff --git a/interface/web/dns/lib/lang/tr_dns_dname.lng b/interface/web/dns/lib/lang/tr_dns_dname.lng new file mode 100644 index 0000000000000000000000000000000000000000..8cd2b0a0aa87734e929054e9c5bfdda4c6bb7668 --- /dev/null +++ b/interface/web/dns/lib/lang/tr_dns_dname.lng @@ -0,0 +1,17 @@ + diff --git a/interface/web/dns/lib/lang/tr_dns_import.lng b/interface/web/dns/lib/lang/tr_dns_import.lng index 0f95a3131f76190b4277ceb9cd6e6d9b08f02d79..8aa42a51e3c6126a0620d20bee38418048d96751 100644 --- a/interface/web/dns/lib/lang/tr_dns_import.lng +++ b/interface/web/dns/lib/lang/tr_dns_import.lng @@ -13,4 +13,13 @@ $wb['title'] = 'Bölge Dosyalarını İçe Aktar'; $wb['no_file_uploaded_error'] = 'Hiçbir bölge dosyası yüklenmedi'; $wb['error_no_server_id'] = 'Sunucu belirtilmemiş.'; $wb['error_not_allowed_server_id'] = 'Seçilmiş sunucuda bu hesap kullanılamaz.'; +$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.'; ?> diff --git a/interface/web/dns/lib/lang/tr_dns_naptr.lng b/interface/web/dns/lib/lang/tr_dns_naptr.lng new file mode 100644 index 0000000000000000000000000000000000000000..b39373c13de1d5b288b85d4ebeef8696a09d3af6 --- /dev/null +++ b/interface/web/dns/lib/lang/tr_dns_naptr.lng @@ -0,0 +1,21 @@ + diff --git a/interface/web/dns/lib/lang/tr_dns_soa.lng b/interface/web/dns/lib/lang/tr_dns_soa.lng index fd39de04f5e9742c3717bb77a33e6d25908a1a16..fc1bc60a82aa95bbd9451f246b3ccf7e9c918529 100644 --- a/interface/web/dns/lib/lang/tr_dns_soa.lng +++ b/interface/web/dns/lib/lang/tr_dns_soa.lng @@ -41,4 +41,7 @@ $wb['ttl_range_error'] = 'En düşük TTL süresi 60 saniyedir.'; $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/lib/lang/tr_dns_soa_admin_list.lng b/interface/web/dns/lib/lang/tr_dns_soa_admin_list.lng index 490cdc7b4fbe0a4b332e9221098793a56082ab86..6f0bc7f985ab8a8b950e1937909aa074e4992d1c 100644 --- a/interface/web/dns/lib/lang/tr_dns_soa_admin_list.lng +++ b/interface/web/dns/lib/lang/tr_dns_soa_admin_list.lng @@ -7,5 +7,6 @@ $wb['ns_txt'] = 'Ad Sunucusu'; $wb['mbox_txt'] = 'E-posta'; $wb['add_new_record_wizard_txt'] = 'Yardımcı ile DNS Bölgesi Ekle'; $wb['add_new_record_txt'] = 'El ile DNS Bölgesi Ekle'; +$wb['import_zone_file_txt'] = 'Bölge Dosyasını İçe Aktar'; $wb['sys_groupid_txt'] = 'Müşteri'; ?> diff --git a/interface/web/dns/lib/lang/tr_dns_spf.lng b/interface/web/dns/lib/lang/tr_dns_spf.lng index 40cad402a461aff5e9fe8ce0d5c94e6f4257e727..5ca1e470e389f72efff1099c543c23b711e1bb47 100644 --- a/interface/web/dns/lib/lang/tr_dns_spf.lng +++ b/interface/web/dns/lib/lang/tr_dns_spf.lng @@ -1,5 +1,6 @@ edit the existing record?'; +$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'] = 'Hesabınıza ekleyebileceğiniz en fazla DNS kaydı sınırına ulaştınız.'; $wb['no_zone_perm'] = 'Bu DNS bölgesine kayıt ekleme izniniz yok.'; $wb['ttl_range_error'] = 'En düşük TTL süresi 60 saniyedir.'; +$wb['name_error_regex'] = 'The hostname has the wrong format.'; +$wb['btn_edit_as_txt_record_txt'] = 'Edit as TXT record'; ?> diff --git a/interface/web/dns/lib/lang/tr_dns_sshfp.lng b/interface/web/dns/lib/lang/tr_dns_sshfp.lng new file mode 100644 index 0000000000000000000000000000000000000000..25350c9aa8ef17276875fc4b31da8cc1a1e88cd2 --- /dev/null +++ b/interface/web/dns/lib/lang/tr_dns_sshfp.lng @@ -0,0 +1,16 @@ + diff --git a/interface/web/dns/lib/module.conf.php b/interface/web/dns/lib/module.conf.php index 75b17a98e8d975871418da2f4a8655f3b5d3aacc..4e4c6454708ba56f3b7aad22324514d98cfe093d 100644 --- a/interface/web/dns/lib/module.conf.php +++ b/interface/web/dns/lib/module.conf.php @@ -1,5 +1,7 @@ auth->get_user_id(); + $module["name"] = "dns"; $module["title"] = "top_menu_dns"; $module["template"] = "module.tpl.htm"; @@ -56,19 +58,23 @@ $module["nav"][] = array( 'title' => 'DNS', unset($items); -$items[] = array( 'title' => "Secondary Zones", - 'target' => 'content', - 'link' => 'dns/dns_slave_list.php', - 'html_id' => 'dns_slave_list'); - -$module["nav"][] = array( 'title' => 'Secondary DNS', - 'open' => 1, - 'items' => $items); +if($app->auth->get_client_limit($userid, 'dns_slave_zone') != 0) +{ + $items[] = array( 'title' => "Secondary Zones", + 'target' => 'content', + 'link' => 'dns/dns_slave_list.php', + 'html_id' => 'dns_slave_list'); + + $module["nav"][] = array( 'title' => 'Secondary DNS', + 'open' => 1, + 'items' => $items); + + unset($items); +} -unset($items); -?> +?> \ No newline at end of file diff --git a/interface/web/dns/lib/remote.conf.php b/interface/web/dns/lib/remote.conf.php index 0ca556926bf29d8f6aaadbdebb8cb7ad324be371..fb52f8973eead2ce4cb34100039d316a3d4318cf 100644 --- a/interface/web/dns/lib/remote.conf.php +++ b/interface/web/dns/lib/remote.conf.php @@ -4,16 +4,20 @@ $function_list['dns_zone_get,dns_zone_get_id,dns_zone_add,dns_zone_update,dns_zo $function_list['dns_a_get,dns_a_add,dns_a_update,dns_a_delete'] = 'DNS a functions'; $function_list['dns_aaaa_get,dns_aaaa_add,dns_aaaa_update,dns_aaaa_delete'] = 'DNS aaaa functions'; $function_list['dns_alias_get,dns_alias_add,dns_alias_update,dns_alias_delete'] = 'DNS alias functions'; +$function_list['dns_caa_get,dns_caa_add,dns_caa_update,dns_caa_delete'] = 'DNS caa functions'; $function_list['dns_cname_get,dns_cname_add,dns_cname_update,dns_cname_delete'] = 'DNS cname functions'; +$function_list['dns_dname_get,dns_dname_add,dns_dname_update,dns_dname_delete'] = 'DNS dname functions'; $function_list['dns_ds_get,dns_ds_add,dns_ds_update,dns_ds_delete'] = 'DNS ds functions'; $function_list['dns_hinfo_get,dns_hinfo_add,dns_hinfo_update,dns_hinfo_delete'] = 'DNS hinfo functions'; $function_list['dns_loc_get,dns_loc_add,dns_loc_update,dns_loc_delete'] = 'DNS loc functions'; $function_list['dns_mx_get,dns_mx_add,dns_mx_update,dns_mx_delete'] = 'DNS mx functions'; -$function_list['dns_tlsa_get,dns_tlsa_add,dns_tlsa_update,dns_tlsa_delete'] = 'DNS tlsa functions'; +$function_list['dns_naptr_get,dns_naptr_add,dns_naptr_update,dns_naptr_delete'] = 'DNS naptr functions'; $function_list['dns_ns_get,dns_ns_add,dns_ns_update,dns_ns_delete'] = 'DNS ns functions'; $function_list['dns_ptr_get,dns_ptr_add,dns_ptr_update,dns_ptr_delete'] = 'DNS ptr functions'; $function_list['dns_rp_get,dns_rp_add,dns_rp_update,dns_rp_delete'] = 'DNS rp functions'; $function_list['dns_srv_get,dns_srv_add,dns_srv_update,dns_srv_delete'] = 'DNS srv functions'; +$function_list['dns_sshfp_get,dns_sshfp_add,dns_sshfp_update,dns_sshfp_delete'] = 'DNS sshfp functions'; +$function_list['dns_tlsa_get,dns_tlsa_add,dns_tlsa_update,dns_tlsa_delete'] = 'DNS tlsa functions'; $function_list['dns_txt_get,dns_txt_add,dns_txt_update,dns_txt_delete'] = 'DNS txt functions'; ?> diff --git a/interface/web/dns/list/dns_a.list.php b/interface/web/dns/list/dns_a.list.php index 1c6999511d1280b8c015b422bed9435a6cf5485b..169ec4af069f4435613e3f1b0ca73d1ca77d02fc 100644 --- a/interface/web/dns/list/dns_a.list.php +++ b/interface/web/dns/list/dns_a.list.php @@ -132,7 +132,7 @@ $liste["item"][] = array( 'field' => "type", 'prefix' => "", 'suffix' => "", 'width' => "", - 'value' => array('A'=>'A', 'AAAA' => 'AAAA', 'ALIAS'=>'ALIAS', 'CAA'=>'CAA', 'CNAME'=>'CNAME', 'DS'=>'DS', 'HINFO'=>'HINFO', 'LOC'=>'LOC', 'MX'=>'MX', 'NS'=>'NS', 'PTR'=>'PTR', 'RP'=>'RP', 'SRV'=>'SRV', 'TLSA'=>'TLSA', 'TXT'=>'TXT')); + 'value' => array('A'=>'A', 'AAAA' => 'AAAA', 'ALIAS'=>'ALIAS', 'CAA'=>'CAA', 'CNAME'=>'CNAME', 'DNAME'=>'DNAME', 'DS'=>'DS', 'HINFO'=>'HINFO', 'LOC'=>'LOC', 'MX'=>'MX', 'NAPTR'=>'NAPTR', 'NS'=>'NS', 'PTR'=>'PTR', 'RP'=>'RP', 'SRV'=>'SRV', 'SSHFP'=>'SSHFP', 'TLSA'=>'TLSA', 'TXT'=>'TXT')); ?> diff --git a/interface/web/dns/templates/dns_a_edit.htm b/interface/web/dns/templates/dns_a_edit.htm index 92dfbcd3ae1328546c9dc0ddf4759eaf60906002..592999de7e84bb72741ce6f32b94ee08376dc67e 100644 --- a/interface/web/dns/templates/dns_a_edit.htm +++ b/interface/web/dns/templates/dns_a_edit.htm @@ -1,13 +1,6 @@ - -

    - - - -
    +
    -

    {tmpl_var name='name_hint_txt'}

    +

    {tmpl_var name='name_hint_txt'}

    @@ -21,15 +14,15 @@ {tmpl_var name='active'}
    - - + + - +
    - +
    \ No newline at end of file + }); + diff --git a/interface/web/dns/templates/dns_a_list.htm b/interface/web/dns/templates/dns_a_list.htm index 5a4a5eeb683309e2e4287644c64ecf12d4b65388..4d0f3b2b2880d2aa9afe38bd756fdc00e9e87ff5 100644 --- a/interface/web/dns/templates/dns_a_list.htm +++ b/interface/web/dns/templates/dns_a_list.htm @@ -1,6 +1,16 @@ + +
    +

    + +

    +
    {tmpl_var name='config_error_tstamp'} : 
    +
    {tmpl_var name='config_error_msg'}
    +
    +

    +
    +
    -
    @@ -12,31 +22,33 @@ {tmpl_var name="datalog_changes_end_txt"}
    -

    -
    +

    {tmpl_var name="toolsarea_head_txt"}

    - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + +
    - + @@ -61,7 +73,7 @@ - + @@ -92,4 +104,3 @@ - diff --git a/interface/web/dns/templates/dns_aaaa_edit.htm b/interface/web/dns/templates/dns_aaaa_edit.htm index fbbc757ceca1d0d3b41ff421382fa9ab72a883b1..d21d2bdd92685b457b286836c2db2c75012f50d4 100644 --- a/interface/web/dns/templates/dns_aaaa_edit.htm +++ b/interface/web/dns/templates/dns_aaaa_edit.htm @@ -1,10 +1,3 @@ - -

    - - -

    {tmpl_var name='name_hint_txt'}

    @@ -29,7 +22,7 @@
    - +
    \ No newline at end of file + diff --git a/interface/web/dns/templates/dns_alias_edit.htm b/interface/web/dns/templates/dns_alias_edit.htm index 5ab2a3ccaa23ddb7954266715b6645f2b40bd8fa..57a5343b6576fa409cad617e110b598a081c14f5 100644 --- a/interface/web/dns/templates/dns_alias_edit.htm +++ b/interface/web/dns/templates/dns_alias_edit.htm @@ -1,10 +1,3 @@ - -

    - - -
    @@ -28,5 +21,5 @@
    - -
    \ No newline at end of file + +
    diff --git a/interface/web/dns/templates/dns_caa_edit.htm b/interface/web/dns/templates/dns_caa_edit.htm index 3de64818b4936ae902004b53de139742c3187e81..7c9d42d94b1d8ea292b97f419203c4fc0a15845d 100644 --- a/interface/web/dns/templates/dns_caa_edit.htm +++ b/interface/web/dns/templates/dns_caa_edit.htm @@ -1,6 +1,3 @@ - -

    -
    @@ -54,7 +51,7 @@ For future use. At this time, CA’s do not recognize any other flag values as
    - +
    \ No newline at end of file + +
    +

    + +

    +
    +
    + +
    +
    + + + +
    +
    +
      + +
    +
    +
    +
    + + + +
    +
    + + +
    +
    +
    + + diff --git a/interface/web/dns/templates/dns_loc_edit.htm b/interface/web/dns/templates/dns_loc_edit.htm index 12cfb6357fd42285214e4423c5e9196b6c5dc7df..8753f800e78add9d92ba510eb99cdbd97b4b40ac 100644 --- a/interface/web/dns/templates/dns_loc_edit.htm +++ b/interface/web/dns/templates/dns_loc_edit.htm @@ -1,10 +1,3 @@ - -

    - - -
    @@ -28,5 +21,5 @@
    - -
    \ No newline at end of file + + diff --git a/interface/web/dns/templates/dns_mx_edit.htm b/interface/web/dns/templates/dns_mx_edit.htm index 290c218faf96b3cbb772c2b257c4c1c2aef67f69..1d8889afc8e7534c5c4d23b9befa0d3502642134 100644 --- a/interface/web/dns/templates/dns_mx_edit.htm +++ b/interface/web/dns/templates/dns_mx_edit.htm @@ -1,10 +1,3 @@ - -

    - - -
    @@ -31,5 +24,5 @@
    - -
    \ No newline at end of file + + diff --git a/interface/web/dns/templates/dns_naptr_edit.htm b/interface/web/dns/templates/dns_naptr_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..16aeef581f4779de038987868ef287e7643e73e3 --- /dev/null +++ b/interface/web/dns/templates/dns_naptr_edit.htm @@ -0,0 +1,40 @@ +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    + {tmpl_var name='active'} +
    +
    + + + + + + +
    + + +
    diff --git a/interface/web/dns/templates/dns_ns_edit.htm b/interface/web/dns/templates/dns_ns_edit.htm index 3cafa17dafaa8bf64046db2bf86f10874ab02f8e..be3b576f65450342d714aaf5febe839fad1e069a 100644 --- a/interface/web/dns/templates/dns_ns_edit.htm +++ b/interface/web/dns/templates/dns_ns_edit.htm @@ -1,10 +1,3 @@ - -

    - - -
    @@ -28,5 +21,5 @@
    - -
    \ No newline at end of file + + diff --git a/interface/web/dns/templates/dns_ptr_edit.htm b/interface/web/dns/templates/dns_ptr_edit.htm index de59069259df650f1359a102d3b52af31b1ff27a..2cd3503dbf4bc2a45545d036f17d209fcb4d2bed 100644 --- a/interface/web/dns/templates/dns_ptr_edit.htm +++ b/interface/web/dns/templates/dns_ptr_edit.htm @@ -1,10 +1,3 @@ - -

    - - -
    @@ -28,5 +21,5 @@
    - -
    \ No newline at end of file + + diff --git a/interface/web/dns/templates/dns_records_edit.htm b/interface/web/dns/templates/dns_records_edit.htm index a2a42c3d45c70f3906690fe19a6c12fc75cb12d8..979cebe5fd58636304f789c508cafd6cacc27923 100644 --- a/interface/web/dns/templates/dns_records_edit.htm +++ b/interface/web/dns/templates/dns_records_edit.htm @@ -1,8 +1,3 @@ - -

    -
    {tmpl_var name='dns_records'} @@ -11,4 +6,4 @@
    - \ No newline at end of file + diff --git a/interface/web/dns/templates/dns_rp_edit.htm b/interface/web/dns/templates/dns_rp_edit.htm index 3dd04adf1a3344d7d9864c02f57e0bb4bb7465fd..4719aff58cd4ecc0bb8ed89d93ac7b4b275422c8 100644 --- a/interface/web/dns/templates/dns_rp_edit.htm +++ b/interface/web/dns/templates/dns_rp_edit.htm @@ -1,10 +1,3 @@ - -

    - - -
    @@ -28,5 +21,5 @@
    - -
    \ No newline at end of file + + diff --git a/interface/web/dns/templates/dns_slave_edit.htm b/interface/web/dns/templates/dns_slave_edit.htm index 832fec1abc0445f73aceb06073a05184406c7601..1f4f7234d613d00c21291ae3292ca6108d15d9cd 100644 --- a/interface/web/dns/templates/dns_slave_edit.htm +++ b/interface/web/dns/templates/dns_slave_edit.htm @@ -1,10 +1,3 @@ - -

    - - -
    diff --git a/interface/web/dns/templates/dns_slave_list.htm b/interface/web/dns/templates/dns_slave_list.htm index 799f14ba28700ce1d454813a407a71372b8ad78e..e59470a1910b0e101b091d3db3247513a5907716 100644 --- a/interface/web/dns/templates/dns_slave_list.htm +++ b/interface/web/dns/templates/dns_slave_list.htm @@ -21,12 +21,12 @@

    {tmpl_var name="toolsarea_head_txt"}

    - + - - - + + +

    @@ -62,16 +62,14 @@ - + - +
    {tmpl_var name='globalsearch_noresults_text_txt'}{tmpl_var name='globalsearch_noresults_text_txt'}
    - - \ No newline at end of file diff --git a/interface/web/dns/templates/dns_soa_admin_list.htm b/interface/web/dns/templates/dns_soa_admin_list.htm index 79faa645fe607fb9adee9e3ebf3e15d85c9f6f42..fe381eaac3fb38324c44076ff1c86145ff55368d 100644 --- a/interface/web/dns/templates/dns_soa_admin_list.htm +++ b/interface/web/dns/templates/dns_soa_admin_list.htm @@ -21,14 +21,14 @@

    {tmpl_var name="toolsarea_head_txt"}

    - + - - - + + + + -

    @@ -57,13 +57,13 @@ - - - - - - - + + + + + + diff --git a/interface/web/dns/templates/dns_soa_edit.htm b/interface/web/dns/templates/dns_soa_edit.htm index 7a069cb3bf27d5d2e354d4aca240e44b13255c74..97f338503099d330097583b225db61a0de55c195 100644 --- a/interface/web/dns/templates/dns_soa_edit.htm +++ b/interface/web/dns/templates/dns_soa_edit.htm @@ -1,193 +1,219 @@ - -

    - -
    -

    {tmpl_var name='configuration_error_txt'}

    -
    {tmpl_var name='config_error_tstamp'} : 
    {tmpl_var name='config_error_msg'}
    -
    +
    +

    + +

    +
    {tmpl_var name='config_error_tstamp'} : 
    +
    {tmpl_var name='config_error_msg'}
    +
    +

    +
    - - DNS Zone - -
    - - -
    - - - -
    -
    -
    - -
    - -
    -
    -
    - - - - -
    - - -
    - - - -
    -
    -
    -
    -
    - - -
    - -
    -
    -
    -
    -
    - - -
    - -

    {tmpl_var name='eg_domain_tld'}

    -
    - -
    - -

    {tmpl_var name='eg_domain_tld'}

    -
    -
    -
    -
    - -
    - -

    {tmpl_var name='eg_ns1_domain_tld'}

    -
    -
    -
    - -
    - -

    {tmpl_var name='eg_webmaster_domain_tld'}

    -
    + +
    + + +
    +
    + + + +
    +
    +
    +
    + +
    + +
    +
    +
    +
    + + + + +
    + + +
    -
    - -
     {tmpl_var name='seconds_txt'} -
    -
    - -
     {tmpl_var name='seconds_txt'} -
    -
    - -
     {tmpl_var name='seconds_txt'} -
    -
    - -
     {tmpl_var name='seconds_txt'} -
    -
    - -
     {tmpl_var name='seconds_txt'} -
    -
    - -
    -
    - -
    - -
    - -
    -
    -
    - -
    - {tmpl_var name='active'} -
    -
    - + + + +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    +
    +
    +
    +
    + + +
    + +

    {tmpl_var name='eg_domain_tld'}

    +
    + +
    + +

    {tmpl_var name='eg_domain_tld'}

    +
    +
    +
    +
    + +
    + +

    {tmpl_var name='eg_ns1_domain_tld'}

    +
    +
    +
    + +
    + +

    {tmpl_var name='eg_webmaster_domain_tld'}

    +
    +
    +
    + +
    +
     {tmpl_var name='seconds_txt'} +
    +
    +
    + +
    +
     {tmpl_var name='seconds_txt'} +
    +
    +
    + +
    +
     {tmpl_var name='seconds_txt'} +
    +
    +
    + +
    +
     {tmpl_var name='seconds_txt'} +
    +
    +
    + +
    +
     {tmpl_var name='seconds_txt'} +
    +
    +
    + +
    +
    +
    + +
    +
    + +
    + +
    +
    +
    +
    + +
    +
    +
    + +
    + {tmpl_var name='active'} +
    +
    -
    - -
    - {tmpl_var name='dnssec_wanted'}
    ({tmpl_var name='dnssec_wanted_info'}) -
    -
    -
    - -
    -
    -
    - - - - -
    - - -
    +
    + +
    + {tmpl_var name='dnssec_wanted'}
    ({tmpl_var name='dnssec_wanted_info'}) +
    +
    +
    + +
    + {tmpl_var name='dnssec_algo'} +
    +
    +
    + +
    +
    + + + +
    +
    + + +
    +
    diff --git a/interface/web/dns/templates/dns_soa_list.htm b/interface/web/dns/templates/dns_soa_list.htm index df579e852aa3424bcbdb084340a0163a23a2f76d..ec23975175c429a9a2d61320db31bfea80d2b7e8 100644 --- a/interface/web/dns/templates/dns_soa_list.htm +++ b/interface/web/dns/templates/dns_soa_list.htm @@ -21,14 +21,14 @@

    {tmpl_var name="toolsarea_head_txt"}

    - + - - - + + +

    {tmpl_var name="active"}{tmpl_var name="sys_groupid"}{tmpl_var name="server_id"}{tmpl_var name="origin"}{tmpl_var name="ns"}{tmpl_var name="mbox"} + {tmpl_var name="active"}{tmpl_var name="sys_groupid"}{tmpl_var name="server_id"}{tmpl_var name="origin"}{tmpl_var name="ns"}{tmpl_var name="mbox"}
    @@ -55,12 +55,12 @@ - - - - - - + + + + + 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'} +
    {tmpl_var name='rendered_zone'}
    +{tmpl_else} + {tmpl_var name='rendered_zone_unavailable_txt'} +{/tmpl_if} + +
    + +
    + diff --git a/interface/web/dns/templates/dns_spf_edit.htm b/interface/web/dns/templates/dns_spf_edit.htm index 3c34b37a41b03d0f74b5f335d2a3986c25f2ed43..44dd9458906c9d1f739692dd482ed4a28e816d7a 100644 --- a/interface/web/dns/templates/dns_spf_edit.htm +++ b/interface/web/dns/templates/dns_spf_edit.htm @@ -1,10 +1,7 @@ - -

    - - - +
    + +
    +
    @@ -52,11 +49,13 @@ -
    - + + + +
    diff --git a/interface/web/dns/templates/dns_srv_edit.htm b/interface/web/dns/templates/dns_srv_edit.htm index fd9f00d7b48058871fc68373d7ff8d2be8ac7320..22831e684010dd420ad51a22d536045f1dc79de3 100644 --- a/interface/web/dns/templates/dns_srv_edit.htm +++ b/interface/web/dns/templates/dns_srv_edit.htm @@ -1,10 +1,3 @@ - -

    - - -
    @@ -37,5 +30,5 @@
    - -
    \ No newline at end of file + + diff --git a/interface/web/dns/templates/dns_sshfp_edit.htm b/interface/web/dns/templates/dns_sshfp_edit.htm new file mode 100644 index 0000000000000000000000000000000000000000..2f83356be58888fd3ff26bf4743ad5d0cc83d786 --- /dev/null +++ b/interface/web/dns/templates/dns_sshfp_edit.htm @@ -0,0 +1,25 @@ +
    + +
    +
    + +
    +
    + +
    +
    + +
    + {tmpl_var name='active'} +
    +
    + + + + + + +
    + + +
    diff --git a/interface/web/dns/templates/dns_template_edit.htm b/interface/web/dns/templates/dns_template_edit.htm index 9de8c93447f466f0394ba52fb82a972886b7ce06..db0ee9d92580c35e3c974c0e39d0040c93c6363e 100644 --- a/interface/web/dns/templates/dns_template_edit.htm +++ b/interface/web/dns/templates/dns_template_edit.htm @@ -1,10 +1,3 @@ - -

    - - -
    diff --git a/interface/web/dns/templates/dns_tlsa_edit.htm b/interface/web/dns/templates/dns_tlsa_edit.htm index c2cde8be6197c060588bf337749b315e6ed151c9..b780efb9bf6d5eaad7996b4bfed2efeb38ca15c1 100644 --- a/interface/web/dns/templates/dns_tlsa_edit.htm +++ b/interface/web/dns/templates/dns_tlsa_edit.htm @@ -1,10 +1,3 @@ - -

    - - -
    @@ -28,5 +21,5 @@
    - -
    \ No newline at end of file + + diff --git a/interface/web/dns/templates/dns_txt_edit.htm b/interface/web/dns/templates/dns_txt_edit.htm index f03f6d36c86209aec2aff3e2c368ba83e13b7f41..b74d6a55c7a3e82764af280d0f7a7d71c9da9e2f 100644 --- a/interface/web/dns/templates/dns_txt_edit.htm +++ b/interface/web/dns/templates/dns_txt_edit.htm @@ -1,10 +1,3 @@ - -

    - - -
    @@ -28,5 +21,5 @@
    - -
    \ No newline at end of file + + diff --git a/interface/web/dns/templates/dns_wizard.htm b/interface/web/dns/templates/dns_wizard.htm index 907dedca888b4e5f987854fac46eca215025125f..07d064c1619ff850d9328dc748e8307237b38e39 100644 --- a/interface/web/dns/templates/dns_wizard.htm +++ b/interface/web/dns/templates/dns_wizard.htm @@ -1,139 +1,159 @@ -

    - -

    -
    - - - -
    - -
    -
    - -
    - -
    -
    - -
    - -
    -
    -
    - - - - -
    - -
    -
    -
    -
    - - -
    - -
    -
    -
    -
    - -
    - - -
    - -
    -
    -
    - -
    - -
    -
    - -
    - -
    -
    - -
    - -
    -
    - -
    - -
    -
    - -
    - -
    -
    - +
    +
    + +
    +
    + +
    +
    +
      + +
    +
    +
    +
    +
    + +
    +
    + +
    + +
    +
    +
    - -
    -
    - + +
    +
    + + + + + +
    + +
    +
    +
    + + +
    - -
    -
    - - - - - -
    - - -
    + +
    +
    + +
    + +
    + + +
    + +
    +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + + + +
    +
    + + +
    +
    + + diff --git a/interface/web/favicon.ico b/interface/web/favicon.ico deleted file mode 100644 index dc71b5320c890943e4aba52d80689deb58c6b39e..0000000000000000000000000000000000000000 Binary files a/interface/web/favicon.ico and /dev/null differ diff --git a/interface/web/help/faq_delete.php b/interface/web/help/faq_delete.php index c1faed60d99afdad537d4447cd009d2f7e49ff50..161b1ce45b471d4a98dcbcce366c258fbbb7e157 100644 --- a/interface/web/help/faq_delete.php +++ b/interface/web/help/faq_delete.php @@ -11,6 +11,9 @@ require_once '../../lib/app.inc.php'; // Check module permissions $app->auth->check_module_permissions('admin'); +// Do not allow FAQ editor in DEMO mode +if($conf['demo_mode'] == true) $app->error('This function is disabled in demo mode.'); + // Load the form $app->uses('tform_actions'); $app->tform_actions->onDelete(); diff --git a/interface/web/help/faq_edit.php b/interface/web/help/faq_edit.php index 397f5cccf4233b4a5cefb4485a1f27617d68a1cf..e0f0380f8cdfa59eaf52d246da0364751e1706a6 100644 --- a/interface/web/help/faq_edit.php +++ b/interface/web/help/faq_edit.php @@ -10,6 +10,9 @@ require_once '../../lib/app.inc.php'; // Check the module permissions and redirect if not allowed. $app->auth->check_module_permissions('admin'); +// Do not allow FAQ editor in DEMO mode +if($conf['demo_mode'] == true) $app->error('This function is disabled in demo mode.'); + // Load the templating and form classes $app->uses('tpl,tform,tform_actions'); $app->load('tform_actions'); diff --git a/interface/web/help/faq_sections_delete.php b/interface/web/help/faq_sections_delete.php index 865071ff252cc507ef6748322f38cfa341e648d9..76ff1c75a10dd0eb4b102b67be8caeb1068ba77e 100644 --- a/interface/web/help/faq_sections_delete.php +++ b/interface/web/help/faq_sections_delete.php @@ -11,6 +11,9 @@ require_once '../../lib/app.inc.php'; // Check module permissions $app->auth->check_module_permissions('admin'); +// Do not allow FAQ editor in DEMO mode +if($conf['demo_mode'] == true) $app->error('This function is disabled in demo mode.'); + // Load the form $app->uses('tform_actions'); $app->tform_actions->onDelete(); diff --git a/interface/web/help/faq_sections_edit.php b/interface/web/help/faq_sections_edit.php index f146db8605dd34e9c9980871f4a88923c431c9b5..56b3c77487291325ca41e8e2dc7f57b5431f6220 100644 --- a/interface/web/help/faq_sections_edit.php +++ b/interface/web/help/faq_sections_edit.php @@ -10,6 +10,9 @@ require_once '../../lib/app.inc.php'; // Check the module permissions and redirect if not allowed. $app->auth->check_module_permissions('admin'); +// Do not allow FAQ editor in DEMO mode +if($conf['demo_mode'] == true) $app->error('This function is disabled in demo mode.'); + // Load the templating and form classes $app->uses('tpl,tform,tform_actions'); $app->load('tform_actions'); diff --git a/interface/web/help/lib/lang/bg.lng b/interface/web/help/lib/lang/bg.lng index fa57a5d4d99183c0aae002562e89a20402b60040..7d65941b7990f016dda966200b313d10e81ce66b 100644 --- a/interface/web/help/lib/lang/bg.lng +++ b/interface/web/help/lib/lang/bg.lng @@ -6,9 +6,9 @@ $wb['View messages'] = 'Преглед на съобщенията'; $wb['Support'] = 'Поддръжка'; $wb['About ISPConfig'] = 'За ISPConfig'; $wb['Version'] = 'Версия'; -$wb['Frequently Asked Questions'] = 'Често задавани въпроси'; -$wb['FAQ Sections'] = 'ЧЗВ секция'; -$wb['Manage Sections'] = 'Редактирай секциите'; -$wb['Add a Question & Answer Pair'] = 'Добави въпрос & Отговор '; -$wb['Manage Questions'] = 'Редактирай въпроса'; +$wb['Frequently Asked Questions'] = 'Често Задавани Въпроси'; +$wb['FAQ Sections'] = 'ЧЗВ секции'; +$wb['Manage Sections'] = 'Управление секциите'; +$wb['Add a Question & Answer Pair'] = 'Добави Въпрос и Отговор'; +$wb['Manage Questions'] = 'Управление на въпросите'; ?> diff --git a/interface/web/help/lib/lang/br.lng b/interface/web/help/lib/lang/br.lng index 217d3afa148487947cd79e9546a8e8bba8a97425..da6fbf2403af00b2337e6ab6264db0729564593e 100644 --- a/interface/web/help/lib/lang/br.lng +++ b/interface/web/help/lib/lang/br.lng @@ -11,4 +11,3 @@ $wb['FAQ Sections'] = 'Seções FAQ'; $wb['Manage Sections'] = 'Gerenciar seções'; $wb['Add a Question & Answer Pair'] = 'Adicionar novo par questão/resposta'; $wb['Manage Questions'] = 'Gerenciar questões'; -?> diff --git a/interface/web/help/lib/lang/br_faq_form.lng b/interface/web/help/lib/lang/br_faq_form.lng index b24ec1c58fbd389599e3e87e48d859c106bb542c..89f8685de4cdbecb05ee64974bae5f918ccadadc 100644 --- a/interface/web/help/lib/lang/br_faq_form.lng +++ b/interface/web/help/lib/lang/br_faq_form.lng @@ -3,4 +3,3 @@ $wb['faq_faq_txt'] = 'Questões Frequentes'; $wb['faq_question_txt'] = 'Questão'; $wb['faq_answer_txt'] = 'Resposta'; $wb['faq_section_txt'] = 'Seção'; -?> diff --git a/interface/web/help/lib/lang/br_faq_manage_questions_list.lng b/interface/web/help/lib/lang/br_faq_manage_questions_list.lng index ee9f769d91b241416324754c305ce761f162b959..df2125a7a551183653d55b1bec2053761be6027b 100644 --- a/interface/web/help/lib/lang/br_faq_manage_questions_list.lng +++ b/interface/web/help/lib/lang/br_faq_manage_questions_list.lng @@ -6,4 +6,3 @@ $wb['faq_edit_txt'] = 'Editar'; $wb['faq_sections_txt'] = 'Seção'; $wb['faq_faq_questions_txt'] = 'Questões Frequentes'; $wb['faq_new_question_txt'] = 'Adicionar novo par questão/resposta'; -?> diff --git a/interface/web/help/lib/lang/br_faq_sections_form.lng b/interface/web/help/lib/lang/br_faq_sections_form.lng index 2fb709cbd2378c11cbb5dd7eefe4a1d3351bb17d..05237f2a20a1a4808eab0d4f90c72ca76856b5bc 100644 --- a/interface/web/help/lib/lang/br_faq_sections_form.lng +++ b/interface/web/help/lib/lang/br_faq_sections_form.lng @@ -1,3 +1,2 @@ diff --git a/interface/web/help/lib/lang/br_help_faq_list.lng b/interface/web/help/lib/lang/br_help_faq_list.lng index 64a02c0a74a64c7eb17eb68d18e3a2c214901db6..a94404919fb267b18d627681bb0c7e37be084e37 100644 --- a/interface/web/help/lib/lang/br_help_faq_list.lng +++ b/interface/web/help/lib/lang/br_help_faq_list.lng @@ -1,3 +1,2 @@ diff --git a/interface/web/help/lib/lang/br_help_faq_sections_list.lng b/interface/web/help/lib/lang/br_help_faq_sections_list.lng index aec81d7b59292fa6aae7452ada45e625dc199cfc..8c22ec5c0e1be847a205b8e38fabed44cbe9dcd7 100644 --- a/interface/web/help/lib/lang/br_help_faq_sections_list.lng +++ b/interface/web/help/lib/lang/br_help_faq_sections_list.lng @@ -5,4 +5,3 @@ $wb['faq_edit_txt'] = 'Editar'; $wb['faq_sections_txt'] = 'Seções'; $wb['faq_faq_sections_txt'] = 'Seções FAQ'; $wb['faq_new_section_txt'] = 'Adicionar nova seção'; -?> diff --git a/interface/web/help/lib/lang/br_support_message.lng b/interface/web/help/lib/lang/br_support_message.lng index dad8ce7fd574d0d48873df37d5899b298d9fbc52..44da84097cd4a9f95ac019ff8eead4eea30751e4 100644 --- a/interface/web/help/lib/lang/br_support_message.lng +++ b/interface/web/help/lib/lang/br_support_message.lng @@ -7,10 +7,9 @@ $wb['tstamp_txt'] = 'Data/Hora'; $wb['reply_txt'] = 'Responder'; $wb['date_txt'] = 'Data'; $wb['support_request_subject_txt'] = 'Requisição de Suporte'; -$wb['support_request_txt'] = 'Você recebeu uma requisição de suporte. Por favor, não responda este e-mail, mas processe a requisição dentro do ISPConfig.'; -$wb['answer_to_support_request_txt'] = 'Você recebeu uma resposta à sua requisição de suporte. Por favor, não responda este e-mail, mas processe a mensagem dentro do ISPConfig.'; -$wb['answer_to_support_request_sent_txt'] = 'Sua resposta à requisição de suporte foi enviada. Por favor, não responda este e-mail.'; -$wb['support_request_sent_txt'] = 'Sua requisição de suporte foi enviada. Por favor, não responda este e-mail.'; -$wb['recipient_or_sender_email_address_not_valid_txt'] = 'A mensagem não pôde ser enviada porque o remetente e/ou destinatário são e-mails inválidos.'; -$wb['subject_is_empty'] = 'O assunto está em branco.'; -?> +$wb['support_request_txt'] = 'Você recebeu uma requisição de suporte. Por favor, não responda este email, mas processe a requisição dentro do ISPConfig.'; +$wb['answer_to_support_request_txt'] = 'Você recebeu uma resposta à sua requisição de suporte. Por favor, não responda este email, mas processe a mensagem dentro do ISPConfig.'; +$wb['answer_to_support_request_sent_txt'] = 'Sua resposta à requisição de suporte foi enviada. Por favor, não responda este email.'; +$wb['support_request_sent_txt'] = 'Sua requisição de suporte foi enviada. Por favor, não responda este email.'; +$wb['recipient_or_sender_email_address_not_valid_txt'] = 'A mensagem não pôde ser enviada porque o remetente e/ou destinatário são emails inválidos.'; +$wb['subject_is_empty'] = 'O assunto está vazio.'; diff --git a/interface/web/help/lib/lang/br_support_message_list.lng b/interface/web/help/lib/lang/br_support_message_list.lng index e4add42b799839edd88f5761d09a8ecbeb1cf9a5..13e3864f899ebbeb30d5101f646ac1791c87259f 100644 --- a/interface/web/help/lib/lang/br_support_message_list.lng +++ b/interface/web/help/lib/lang/br_support_message_list.lng @@ -4,4 +4,3 @@ $wb['sender_id_txt'] = 'Remetente'; $wb['subject_txt'] = 'Assunto'; $wb['add_new_record_txt'] = 'Adicionar nova mensagem de suporte'; $wb['date_txt'] = 'Data'; -?> diff --git a/interface/web/help/lib/lang/cz.lng b/interface/web/help/lib/lang/cz.lng index 55279c6a69c9a1e1d57081bbc96b1994db6a3e01..c5e1bde4b26630feda2d815fad53585977aab521 100644 --- a/interface/web/help/lib/lang/cz.lng +++ b/interface/web/help/lib/lang/cz.lng @@ -11,4 +11,3 @@ $wb['FAQ Sections'] = 'Sekce FAQ - Často kladené dotazy'; $wb['Manage Sections'] = 'Spravovat sekce'; $wb['Manage Questions'] = 'Spravovat dotazy'; $wb['Add a Question & Answer Pair'] = 'Vytvořit otázku a odpověď'; -?> diff --git a/interface/web/help/lib/lang/cz_faq_form.lng b/interface/web/help/lib/lang/cz_faq_form.lng index 73feee6955ca1ea13de8f949cc9d7b2a260a4703..d5ea458e14cc7b0441ca25c31c50f94322cd9f37 100644 --- a/interface/web/help/lib/lang/cz_faq_form.lng +++ b/interface/web/help/lib/lang/cz_faq_form.lng @@ -3,4 +3,3 @@ $wb['faq_faq_txt'] = 'Často kladené dotazy'; $wb['faq_question_txt'] = 'Otázka'; $wb['faq_answer_txt'] = 'Odpověď'; $wb['faq_section_txt'] = 'Sekce'; -?> diff --git a/interface/web/help/lib/lang/cz_faq_manage_questions_list.lng b/interface/web/help/lib/lang/cz_faq_manage_questions_list.lng index 34a03b317500c408f935be3d681ffa1161763342..431928c2465479940361c5aa63a843e5a3275b3a 100644 --- a/interface/web/help/lib/lang/cz_faq_manage_questions_list.lng +++ b/interface/web/help/lib/lang/cz_faq_manage_questions_list.lng @@ -6,4 +6,3 @@ $wb['faq_edit_txt'] = 'Upravit'; $wb['faq_sections_txt'] = 'Sekce'; $wb['faq_faq_questions_txt'] = 'Často kladené dotazy'; $wb['faq_new_question_txt'] = 'Vytvořit nový dotaz'; -?> diff --git a/interface/web/help/lib/lang/cz_faq_sections_form.lng b/interface/web/help/lib/lang/cz_faq_sections_form.lng index f9de704d8a860979932e84c43b7a29461967ec6c..20ec09e845043685d3a413bc8adbf71067132ee2 100644 --- a/interface/web/help/lib/lang/cz_faq_sections_form.lng +++ b/interface/web/help/lib/lang/cz_faq_sections_form.lng @@ -1,3 +1,2 @@ diff --git a/interface/web/help/lib/lang/cz_help_faq_list.lng b/interface/web/help/lib/lang/cz_help_faq_list.lng index 923d9b892a47d9c69baf8943f7b7ff33cd09baf7..dadb8e29bbdaebb2076b5f9d3712b8aa6cf20d22 100644 --- a/interface/web/help/lib/lang/cz_help_faq_list.lng +++ b/interface/web/help/lib/lang/cz_help_faq_list.lng @@ -1,3 +1,2 @@ diff --git a/interface/web/help/lib/lang/cz_help_faq_sections_list.lng b/interface/web/help/lib/lang/cz_help_faq_sections_list.lng index e9f8f2ea886ea816b3a0acc6e1166e9d3434d314..9c478baacec28a04ba672afa9dd93365f9ad3c88 100644 --- a/interface/web/help/lib/lang/cz_help_faq_sections_list.lng +++ b/interface/web/help/lib/lang/cz_help_faq_sections_list.lng @@ -5,4 +5,3 @@ $wb['faq_edit_txt'] = 'Upravit'; $wb['faq_sections_txt'] = 'Sekce'; $wb['faq_faq_sections_txt'] = 'Sekce FAQ - Často kladené dotazy'; $wb['faq_new_section_txt'] = 'Vytvořit sekci'; -?> diff --git a/interface/web/help/lib/lang/cz_support_message.lng b/interface/web/help/lib/lang/cz_support_message.lng index e2b2f4072c3785f82dd76425b37de34fe6b6d20b..17c15e8d9c6a5ae63bcc310b7fef7833663e143b 100644 --- a/interface/web/help/lib/lang/cz_support_message.lng +++ b/interface/web/help/lib/lang/cz_support_message.lng @@ -12,5 +12,4 @@ $wb['answer_to_support_request_txt'] = 'You have got a reply to your support req $wb['answer_to_support_request_sent_txt'] = 'Your reply to the support request has been sent. Please don\'t reply to this email.'; $wb['support_request_sent_txt'] = 'Your support request has been sent. Please don\'t reply to this email.'; $wb['recipient_or_sender_email_address_not_valid_txt'] = 'Zprávu nelze odeslat, protože e-mailová adresa příjemce a/nebo odesílatele není platná.'; -$wb['subject_is_empty'] = 'The subject can not be empty.'; -?> +$wb['subject_is_empty'] = 'Předmět nemůže být prázdný.'; diff --git a/interface/web/help/lib/lang/cz_support_message_list.lng b/interface/web/help/lib/lang/cz_support_message_list.lng index 23f80584f99eed41c3682e49ab0a692b02a4d1e2..3c3860ebdd82cdb2bd834884de9ca2bfdc2e36ad 100644 --- a/interface/web/help/lib/lang/cz_support_message_list.lng +++ b/interface/web/help/lib/lang/cz_support_message_list.lng @@ -4,4 +4,3 @@ $wb['sender_id_txt'] = 'Odesílatel'; $wb['subject_txt'] = 'Předmět'; $wb['add_new_record_txt'] = 'Vytvořit zprávu pro podporu'; $wb['date_txt'] = 'Datum'; -?> diff --git a/interface/web/help/lib/lang/en_faq_form.lng b/interface/web/help/lib/lang/en_faq_form.lng index 6dbdbb0aa025d0cbe96057e1a56c676ccb042e2f..dfc4e8799c6caad6695051279a5ccb89da1def15 100644 --- a/interface/web/help/lib/lang/en_faq_form.lng +++ b/interface/web/help/lib/lang/en_faq_form.lng @@ -1,6 +1,6 @@ diff --git a/interface/web/help/lib/lang/en_faq_manage_questions_list.lng b/interface/web/help/lib/lang/en_faq_manage_questions_list.lng index ada708c7dde1776fb71bb62de53d0bd617a58ad6..537b9033d727948b196f598be750d6b8dfa9b172 100644 --- a/interface/web/help/lib/lang/en_faq_manage_questions_list.lng +++ b/interface/web/help/lib/lang/en_faq_manage_questions_list.lng @@ -1,10 +1,10 @@ diff --git a/interface/web/help/lib/lang/en_faq_sections_form.lng b/interface/web/help/lib/lang/en_faq_sections_form.lng index ade38191773262cb448d0baa6bdd648217ba3ecc..dab0863b812ae5dac8b7ba14c718632b6e14b241 100644 --- a/interface/web/help/lib/lang/en_faq_sections_form.lng +++ b/interface/web/help/lib/lang/en_faq_sections_form.lng @@ -1,3 +1,3 @@ diff --git a/interface/web/help/lib/lang/en_help_faq_sections_list.lng b/interface/web/help/lib/lang/en_help_faq_sections_list.lng index 37056924c7c3137fb70b6edb964601b7c5a1a595..412821d431f3e319bb5772e55793f28ab1732704 100644 --- a/interface/web/help/lib/lang/en_help_faq_sections_list.lng +++ b/interface/web/help/lib/lang/en_help_faq_sections_list.lng @@ -1,9 +1,9 @@ diff --git a/interface/web/help/lib/lang/en_support_message_list.lng b/interface/web/help/lib/lang/en_support_message_list.lng index 2cea3110ee6463bd0c74ea9013ec151db96ef2ce..194878610057e952f9d666e55c8ec1b545b1b617 100644 --- a/interface/web/help/lib/lang/en_support_message_list.lng +++ b/interface/web/help/lib/lang/en_support_message_list.lng @@ -2,6 +2,6 @@ $wb['list_head_txt'] = 'Support Messages'; $wb['sender_id_txt'] = 'Sender'; $wb['subject_txt'] = 'Subject'; -$wb["add_new_record_txt"] = 'Create new support message'; +$wb['add_new_record_txt'] = 'Create new support message'; $wb['date_txt'] = 'Date'; ?> \ No newline at end of file diff --git a/interface/web/help/lib/lang/es.lng b/interface/web/help/lib/lang/es.lng old mode 100755 new mode 100644 diff --git a/interface/web/help/lib/lang/es_faq_form.lng b/interface/web/help/lib/lang/es_faq_form.lng old mode 100755 new mode 100644 diff --git a/interface/web/help/lib/lang/es_faq_manage_questions_list.lng b/interface/web/help/lib/lang/es_faq_manage_questions_list.lng old mode 100755 new mode 100644 diff --git a/interface/web/help/lib/lang/es_faq_sections_form.lng b/interface/web/help/lib/lang/es_faq_sections_form.lng old mode 100755 new mode 100644 diff --git a/interface/web/help/lib/lang/es_help_faq_list.lng b/interface/web/help/lib/lang/es_help_faq_list.lng old mode 100755 new mode 100644 diff --git a/interface/web/help/lib/lang/es_help_faq_sections_list.lng b/interface/web/help/lib/lang/es_help_faq_sections_list.lng old mode 100755 new mode 100644 diff --git a/interface/web/help/lib/lang/es_support_message.lng b/interface/web/help/lib/lang/es_support_message.lng old mode 100755 new mode 100644 diff --git a/interface/web/help/lib/lang/es_support_message_list.lng b/interface/web/help/lib/lang/es_support_message_list.lng old mode 100755 new mode 100644 diff --git a/interface/web/help/lib/lang/fi.lng b/interface/web/help/lib/lang/fi.lng old mode 100755 new mode 100644 diff --git a/interface/web/help/lib/lang/fi_support_message.lng b/interface/web/help/lib/lang/fi_support_message.lng old mode 100755 new mode 100644 diff --git a/interface/web/help/lib/lang/fi_support_message_list.lng b/interface/web/help/lib/lang/fi_support_message_list.lng old mode 100755 new mode 100644 diff --git a/interface/web/help/lib/lang/it.lng b/interface/web/help/lib/lang/it.lng index d02e52ee374dcb67fabc8b850dab2972aa880ba6..fc4f0431750c03cfec012750abc1cf177612afc9 100644 --- a/interface/web/help/lib/lang/it.lng +++ b/interface/web/help/lib/lang/it.lng @@ -4,11 +4,11 @@ $wb['Message'] = 'Messaggi'; $wb['Send message'] = 'Spedisci messaggio'; $wb['View messages'] = 'Visualizza messaggi'; $wb['Support'] = 'Supporto'; -$wb['About ISPConfig'] = 'About ISPConfig'; +$wb['About ISPConfig'] = 'Info su ISPConfig'; $wb['Version'] = 'Versione'; -$wb['Frequently Asked Questions'] = 'Frequently Asked Questions'; +$wb['Frequently Asked Questions'] = 'Domande frequenti'; $wb['FAQ Sections'] = 'FAQ Sezioni'; $wb['Manage Sections'] = 'Gestisci Sezioni'; $wb['Add a Question & Answer Pair'] = 'Aggiungi una domanda e rispondi'; -$wb['Manage Questions'] = 'Manage Questions'; +$wb['Manage Questions'] = 'Gestisci domande'; ?> diff --git a/interface/web/help/lib/lang/it_faq_form.lng b/interface/web/help/lib/lang/it_faq_form.lng index 7716d19dfa17b215a8d83955eb05fc57dfd2c941..c271fa40803622362ad58019a77ecd110c39090b 100644 --- a/interface/web/help/lib/lang/it_faq_form.lng +++ b/interface/web/help/lib/lang/it_faq_form.lng @@ -1,5 +1,5 @@ diff --git a/interface/web/help/lib/lang/it_support_message.lng b/interface/web/help/lib/lang/it_support_message.lng index e4e18aa3ee3707b71c3ab2501847f99448b4dcbe..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'; @@ -12,5 +12,5 @@ $wb['answer_to_support_request_txt'] = 'Hai una risposta alla richiesta di suppo $wb['answer_to_support_request_sent_txt'] = 'La tua richiesta di supporto è stata trasmessa. Non rispondere a questa email.'; $wb['support_request_sent_txt'] = 'La tua richiesta di supporto è stata trasmessa. Non rispondere a questa email.'; $wb['recipient_or_sender_email_address_not_valid_txt'] = 'Impossibile trasmettere il messaggio. Destinatario non valido.'; -$wb['subject_is_empty'] = 'The subject can not be empty.'; +$wb['subject_is_empty'] = 'L\'oggetto non può essere vuoto.'; ?> 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/lib/module.conf.php b/interface/web/help/lib/module.conf.php index bee099d1ba1a44661b838e24272c4d54f49b180f..559ac3b4ffaa0f6115c71faa9730ab49134c1fa4 100644 --- a/interface/web/help/lib/module.conf.php +++ b/interface/web/help/lib/module.conf.php @@ -25,27 +25,30 @@ $module['tab_width'] = ''; //*** Menu Definition ***************************************** +// read web config +$app->uses('getconf'); +$global_config = $app->getconf->get_global_config('misc'); +if($global_config['show_support_messages'] == 'y') { + //* make sure that the items array is empty + $items = array(); -//* make sure that the items array is empty -$items = array(); - -//* Add a menu item with the label 'Send message' -$items[] = array( 'title' => 'Send message', + //* Add a menu item with the label 'Send message' + $items[] = array( 'title' => 'Send message', 'target' => 'content', 'link' => 'help/support_message_edit.php', 'html_id' => 'help_message_send'); -//* Add a menu item with the label 'View messages' -$items[] = array( 'title' => 'View messages', + //* Add a menu item with the label 'View messages' + $items[] = array( 'title' => 'View messages', 'target' => 'content', 'link' => 'help/support_message_list.php', 'html_id' => 'help_message_list'); - -//* Add the menu items defined above to a menu section labeled 'Support' -$module['nav'][] = array( 'title' => 'Support', + //* Add the menu items defined above to a menu section labeled 'Support' + $module['nav'][] = array( 'title' => 'Support', 'open' => 1, 'items' => $items); +} //* the FAQ menu section $itemsfaq = array(); @@ -62,8 +65,7 @@ if($_SESSION['s']['user']['typ'] == 'admin') { 'open' => 1, 'items' => $itemsfaq); } -else - { //* the user +else { //* the user $sql = "SELECT * FROM help_faq_sections"; $res = $app->db->queryAllRecords($sql); //* all the content sections @@ -77,7 +79,7 @@ else $module['nav'][] = array( 'title' => 'FAQ', 'open' => 1, 'items' => $itemsfaq); - } + } } //* -- end of the FAQ menu section @@ -98,9 +100,5 @@ if($_SESSION['s']['user']['typ'] == 'admin') { $module['nav'][] = array( 'title' => 'About ISPConfig', 'open' => 1, 'items' => $items); - } - - - ?> diff --git a/interface/web/help/templates/faq_edit.htm b/interface/web/help/templates/faq_edit.htm index 3bf9d8a903a100a998e8b1e9b3ae878b5273a9c3..d0f976051149db9c628ba7e6fae0e815e0355b7f 100644 --- a/interface/web/help/templates/faq_edit.htm +++ b/interface/web/help/templates/faq_edit.htm @@ -1,5 +1,3 @@ - - {tmpl_var name='faq_faq_txt'}
    {tmpl_var name="active"}{tmpl_var name="server_id"}{tmpl_var name="origin"}{tmpl_var name="ns"}{tmpl_var name="mbox"} + {tmpl_var name="active"}{tmpl_var name="server_id"}{tmpl_var name="origin"}{tmpl_var name="ns"}{tmpl_var name="mbox"}
    - + @@ -24,7 +24,7 @@
    {tmpl_var name="faq_question_txt"}{tmpl_var name="faq_question_txt"} {tmpl_var name="faq_section_name_txt"} {tmpl_var name="faq_delete_txt"} {tmpl_var name="faq_edit_txt"}{tmpl_var name='hf_question'} {tmpl_var name='hf_section'} - + @@ -45,4 +45,4 @@
    - \ No newline at end of file + diff --git a/interface/web/help/templates/faq_sections_edit.htm b/interface/web/help/templates/faq_sections_edit.htm index 1380447db870743aada6e519c00c4959e9e50a9d..2ff83549766c3a0e39c6b8d71754d3fb5265e1c8 100644 --- a/interface/web/help/templates/faq_sections_edit.htm +++ b/interface/web/help/templates/faq_sections_edit.htm @@ -1,5 +1,3 @@ - - {tmpl_var name='faq_section_name_txt'}
    @@ -11,4 +9,3 @@ - diff --git a/interface/web/help/templates/help_faq_sections_list.htm b/interface/web/help/templates/help_faq_sections_list.htm index 5a3733aa0b6da6333fee5cdd762ef3b804f1f974..1d0ef16443b09a6a0143e9f918250b903ab70efb 100644 --- a/interface/web/help/templates/help_faq_sections_list.htm +++ b/interface/web/help/templates/help_faq_sections_list.htm @@ -26,7 +26,7 @@ {tmpl_var name='hfs_name'} - + diff --git a/interface/web/help/templates/support_message_edit.htm b/interface/web/help/templates/support_message_edit.htm index fb54578e1670cc3d87a73c5d5cf06ced8bcd82fc..a01cb31076407c61d108625e97377384b197eabd 100644 --- a/interface/web/help/templates/support_message_edit.htm +++ b/interface/web/help/templates/support_message_edit.htm @@ -1,10 +1,3 @@ - -

    - - - {tmpl_var name='message_txt'}
    ",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;++db;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.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="",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.lengthx",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]*)\/>/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*\s*$/g,ib={option:[1,""],thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_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>")+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>");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("\n"; +$html .= "\n
    \n\n"; $html .= ""; echo $html; -?> \ No newline at end of file +?> diff --git a/server/conf/bind_pri.domain.master b/server/conf/bind_pri.domain.master index fb867901dc2848506db0790c5ce076e92d2326ab..efaa06a28d4242a19e4f636d536c614202a4b66d 100644 --- a/server/conf/bind_pri.domain.master +++ b/server/conf/bind_pri.domain.master @@ -9,46 +9,52 @@ $TTL {tmpl_var name='ttl'} -{tmpl_var name='name'} {tmpl_var name='ttl'} NS {tmpl_var name='data'} +{tmpl_var name='name'} {tmpl_var name='ttl'} NS {tmpl_var name='data'} -{tmpl_var name='name'} {tmpl_var name='ttl'} A {tmpl_var name='data'} +{tmpl_var name='name'} {tmpl_var name='ttl'} A {tmpl_var name='data'} -{tmpl_var name='name'} {tmpl_var name='ttl'} AAAA {tmpl_var name='data'} +{tmpl_var name='name'} {tmpl_var name='ttl'} AAAA {tmpl_var name='data'} -{tmpl_var name='name'} {tmpl_var name='ttl'} CNAME {tmpl_var name='data'} +{tmpl_var name='name'} {tmpl_var name='ttl'} CNAME {tmpl_var name='data'} -{tmpl_var name='name'} {tmpl_var name='ttl'} CAA {tmpl_var name='data'} +{tmpl_var name='name'} {tmpl_var name='ttl'} CAA {tmpl_var name='data'} -{tmpl_var name='name'} {tmpl_var name='ttl'} CNAME {tmpl_var name='data'} +{tmpl_var name='name'} {tmpl_var name='ttl'} CNAME {tmpl_var name='data'} + + +{tmpl_var name='name'} {tmpl_var name='ttl'} DNAME {tmpl_var name='data'} -{tmpl_var name='name'} {tmpl_var name='ttl'} DS {tmpl_var name='data'} +{tmpl_var name='name'} {tmpl_var name='ttl'} DS {tmpl_var name='data'} -{tmpl_var name='name'} {tmpl_var name='ttl'} HINFO {tmpl_var name='data'} +{tmpl_var name='name'} {tmpl_var name='ttl'} HINFO {tmpl_var name='data'} {tmpl_var name='name'} {tmpl_var name='ttl'} LOC {tmpl_var name='data'} -{tmpl_var name='name'} {tmpl_var name='ttl'} MX {tmpl_var name='aux'} {tmpl_var name='data'} +{tmpl_var name='name'} {tmpl_var name='ttl'} MX {tmpl_var name='aux'} {tmpl_var name='data'} -{tmpl_var name='name'} {tmpl_var name='ttl'} NAPTR {tmpl_var name='data'} +{tmpl_var name='name'} {tmpl_var name='ttl'} NAPTR {tmpl_var name='aux'} {tmpl_var name='data'} {tmpl_var name='name'} {tmpl_var name='ttl'} PTR {tmpl_var name='data'} -{tmpl_var name='name'} {tmpl_var name='ttl'} RP {tmpl_var name='data'} +{tmpl_var name='name'} {tmpl_var name='ttl'} RP {tmpl_var name='data'} -{tmpl_var name='name'} {tmpl_var name='ttl'} SRV {tmpl_var name='aux'} {tmpl_var name='data'} +{tmpl_var name='name'} {tmpl_var name='ttl'} SRV {tmpl_var name='aux'} {tmpl_var name='data'} + + +{tmpl_var name='name'} {tmpl_var name='ttl'} SSHFP {tmpl_var name='data'} {tmpl_var name='name'} {tmpl_var name='ttl'} TLSA {tmpl_var name='data'} @@ -57,8 +63,6 @@ $TTL {tmpl_var name='ttl'} {tmpl_var name='name'} {tmpl_var name='ttl'} TXT "{tmpl_var name='data'}" -{tmpl_var name='name'} {tmpl_var name='ttl'} TYPE257 {tmpl_var name='data'} +{tmpl_var name='name'} {tmpl_var name='ttl'} TYPE257 {tmpl_var name='data'} - - diff --git a/server/conf/error/br/400.html b/server/conf/error/br/400.html index e89e706bb81d7de56067fa2b6b03ebe187d2f4ee..455a4bb5c00f938ddd2c37f6df933f59ae9b83e9 100644 --- a/server/conf/error/br/400.html +++ b/server/conf/error/br/400.html @@ -56,7 +56,7 @@

    Se tiver qualquer dúvida extra sobre este erro contate seu webmaster.

    diff --git a/server/conf/error/br/401.html b/server/conf/error/br/401.html index 99b20cbcab11cebe392d87891b1f15e71d9a07e8..7cc355ebd4915f9ade98e6543b30a020362d57ba 100644 --- a/server/conf/error/br/401.html +++ b/server/conf/error/br/401.html @@ -54,7 +54,7 @@

    Se tiver qualquer dúvida extra sobre este erro contate seu webmaster.

    diff --git a/server/conf/error/br/403.html b/server/conf/error/br/403.html index 5e466d89f72abe3108e417cc3ca5849ca0bf2d80..515e247c1b2eddeb3b8c00875d8bd14a852a1f6e 100644 --- a/server/conf/error/br/403.html +++ b/server/conf/error/br/403.html @@ -54,7 +54,7 @@

    Se tiver qualquer dúvida extra sobre este erro contate seu webmaster.

    diff --git a/server/conf/error/br/404.html b/server/conf/error/br/404.html index 1a8266f4844ddebee66571742024a5a40269358e..cd258ee736557377e9ebf053e92300f820b8b683 100644 --- a/server/conf/error/br/404.html +++ b/server/conf/error/br/404.html @@ -54,7 +54,7 @@

    Se tiver qualquer dúvida extra sobre este erro cheque por atualizações neste endereço ou contate seu webmaster.

    diff --git a/server/conf/error/br/405.html b/server/conf/error/br/405.html index 6564ff227ba9ffa254ab7f6e7bf0112f710112f2..fa5194ccb4941d5a695be926d2010c4721336b27 100644 --- a/server/conf/error/br/405.html +++ b/server/conf/error/br/405.html @@ -54,7 +54,7 @@

    Se tiver qualquer dúvida extra sobre este erro contate seu webmaster.

    diff --git a/server/conf/error/br/500.html b/server/conf/error/br/500.html index ea72c3467177844e125dd37e338cb1e0164f50dd..142c4fbf88a19a13f5fdc45eae0810787b3ac29f 100644 --- a/server/conf/error/br/500.html +++ b/server/conf/error/br/500.html @@ -54,7 +54,7 @@

    Se está mensagem se repetir muitas vezes contate seu webmaster.

    diff --git a/server/conf/error/br/502.html b/server/conf/error/br/502.html index 62a1b0246927a90bb235107e93c9158f615b67d5..11f4b1e91bda8d5a8e660a5b7ddc43cec4476ee1 100644 --- a/server/conf/error/br/502.html +++ b/server/conf/error/br/502.html @@ -54,7 +54,7 @@

    If you get this message repeatedly please contact the webmaster.

    diff --git a/server/conf/error/br/503.html b/server/conf/error/br/503.html index fe563ee72329fc7942edddd66385cae2d45f8686..ea4287da7598e12974dd0195b20251023f28fe2f 100644 --- a/server/conf/error/br/503.html +++ b/server/conf/error/br/503.html @@ -54,7 +54,7 @@

    Se tiver qualquer dúvida extra sobre este erro contate seu webmaster.

    diff --git a/server/conf/error/cz/400.html b/server/conf/error/cz/400.html index 39fd16337ef3e07a826a54fd45dae0857856fb70..1b55e269931b5b905a58a7ca7588998991da7e0c 100644 --- a/server/conf/error/cz/400.html +++ b/server/conf/error/cz/400.html @@ -54,7 +54,7 @@

    Please contact the webmaster with any queries.

    diff --git a/server/conf/error/cz/401.html b/server/conf/error/cz/401.html index 28fc2a038904dff7d0dcca146ee1bfd33325c6a2..2b7d8a0b232ee6c4627a45c651b3255a626cfd02 100644 --- a/server/conf/error/cz/401.html +++ b/server/conf/error/cz/401.html @@ -54,7 +54,7 @@

    Please contact the webmaster with any queries.

    diff --git a/server/conf/error/cz/403.html b/server/conf/error/cz/403.html index 676f7133ef948cd73ac223d6cf4c907bd00902db..ab630edd444311ee234bc645dc5e09f86da7ae6c 100644 --- a/server/conf/error/cz/403.html +++ b/server/conf/error/cz/403.html @@ -54,7 +54,7 @@

    Please contact the webmaster with any queries.

    diff --git a/server/conf/error/cz/404.html b/server/conf/error/cz/404.html index 78452ba45987a469945fd3aaf1a6c06abe5f582c..62f6ddd5f2709e80b1f4bec4f56a408fe1e10286 100644 --- a/server/conf/error/cz/404.html +++ b/server/conf/error/cz/404.html @@ -54,7 +54,7 @@

    Please check the URL or contact the webmaster.

    diff --git a/server/conf/error/cz/405.html b/server/conf/error/cz/405.html index c9ed8f622c82469d2430d9be52bcaf1ad2bc0587..dade7de0204fb7ee9ac815143a32c0654c2498b2 100644 --- a/server/conf/error/cz/405.html +++ b/server/conf/error/cz/405.html @@ -54,7 +54,7 @@

    Please contact the webmaster with any queries.

    diff --git a/server/conf/error/cz/500.html b/server/conf/error/cz/500.html index 43864a7a6e0cd59741175cd6898a6cfb3f8e94b0..549a06d43608db1ca106395696a5175030b56c9d 100644 --- a/server/conf/error/cz/500.html +++ b/server/conf/error/cz/500.html @@ -54,7 +54,7 @@

    If you get this message repeatedly please contact the webmaster.

    diff --git a/server/conf/error/cz/502.html b/server/conf/error/cz/502.html index 62a1b0246927a90bb235107e93c9158f615b67d5..11f4b1e91bda8d5a8e660a5b7ddc43cec4476ee1 100644 --- a/server/conf/error/cz/502.html +++ b/server/conf/error/cz/502.html @@ -54,7 +54,7 @@

    If you get this message repeatedly please contact the webmaster.

    diff --git a/server/conf/error/cz/503.html b/server/conf/error/cz/503.html index eb55a56e19cd877d60a9c16c500b43364541e76e..a25d071dbe4bbcc510b4410d5d6114ab96775483 100644 --- a/server/conf/error/cz/503.html +++ b/server/conf/error/cz/503.html @@ -54,7 +54,7 @@

    Please contact the webmaster with any queries.

    diff --git a/server/conf/error/de/400.html b/server/conf/error/de/400.html index 05a3b3cb16642c0f2af70fcd4e88a211cd5e611e..df70160b407f33a04fc3fff8348680375fc95179 100644 --- a/server/conf/error/de/400.html +++ b/server/conf/error/de/400.html @@ -54,7 +54,7 @@

    Bei Problemen wenden Sie sich bitte an den Webmaster.

    diff --git a/server/conf/error/de/401.html b/server/conf/error/de/401.html index 3e84dc714c25119648d844ca77e2de65fc00e6df..74fecede65fa781eb9e184cda824ad941482cd03 100644 --- a/server/conf/error/de/401.html +++ b/server/conf/error/de/401.html @@ -54,7 +54,7 @@

    Bei weiteren Problemen wenden Sie sich bitte an den Webmaster.

    diff --git a/server/conf/error/de/403.html b/server/conf/error/de/403.html index c7d0da995ddb2bb3d42b31d7c1f58ea834e18e12..1ea413810f831205bfc31e678b52b0c7794a8635 100644 --- a/server/conf/error/de/403.html +++ b/server/conf/error/de/403.html @@ -54,7 +54,7 @@

    Bei weiteren Problemen wenden Sie sich bitte an den Webmaster.

    diff --git a/server/conf/error/de/404.html b/server/conf/error/de/404.html index c4760505f42f0023df14f0cbf065296c10f1a74a..2174cf1ef9109853a36247dbb417d99512ed0eec 100644 --- a/server/conf/error/de/404.html +++ b/server/conf/error/de/404.html @@ -54,7 +54,7 @@

    Bitte überprüfen Sie die Schreibweise der URL oder wenden Sie sich an den Webmaster.

    diff --git a/server/conf/error/de/405.html b/server/conf/error/de/405.html index cdada31a435b7442eb440737ec0fae41f4a0efcd..115ec20256875eb7e9a1b628e95694a1c9310d92 100644 --- a/server/conf/error/de/405.html +++ b/server/conf/error/de/405.html @@ -54,7 +54,7 @@

    Bei Problemen wenden Sie sich bitte an den Webmaster.

    diff --git a/server/conf/error/de/500.html b/server/conf/error/de/500.html index 99d2e4fb29b4c6ac6fa1556a75a276aa46b7eba8..e649203dec0754ad1205ad4686295afc86421aa5 100644 --- a/server/conf/error/de/500.html +++ b/server/conf/error/de/500.html @@ -54,7 +54,7 @@

    Sollten Sie diese Fehlermeldung öfter erhalten, wenden Sie sich bitte an den Webmaster.

    diff --git a/server/conf/error/de/502.html b/server/conf/error/de/502.html index 1d7afb304343abec534fa0de29bf53a3f909df08..14c71da4a0654d5421ff93bdc949538e101c8f70 100644 --- a/server/conf/error/de/502.html +++ b/server/conf/error/de/502.html @@ -54,7 +54,7 @@

    Sollten Sie diese Fehlermeldung öfter erhalten, wenden Sie sich bitte an den Webmaster.

    diff --git a/server/conf/error/de/503.html b/server/conf/error/de/503.html index 43dbef8c8cdc76a68d9bf718cdb76db0a8daab06..2144bf7f0ac41068880ca05708af16a2c71da423 100644 --- a/server/conf/error/de/503.html +++ b/server/conf/error/de/503.html @@ -55,7 +55,7 @@

    Sollten Sie diese Fehlermeldung öfter erhalten, wenden Sie sich bitte an den Webmaster.

    diff --git a/server/conf/error/en/400.html b/server/conf/error/en/400.html index 39fd16337ef3e07a826a54fd45dae0857856fb70..1b55e269931b5b905a58a7ca7588998991da7e0c 100644 --- a/server/conf/error/en/400.html +++ b/server/conf/error/en/400.html @@ -54,7 +54,7 @@

    Please contact the webmaster with any queries.

    diff --git a/server/conf/error/en/401.html b/server/conf/error/en/401.html index 28fc2a038904dff7d0dcca146ee1bfd33325c6a2..2b7d8a0b232ee6c4627a45c651b3255a626cfd02 100644 --- a/server/conf/error/en/401.html +++ b/server/conf/error/en/401.html @@ -54,7 +54,7 @@

    Please contact the webmaster with any queries.

    diff --git a/server/conf/error/en/403.html b/server/conf/error/en/403.html index 676f7133ef948cd73ac223d6cf4c907bd00902db..ab630edd444311ee234bc645dc5e09f86da7ae6c 100644 --- a/server/conf/error/en/403.html +++ b/server/conf/error/en/403.html @@ -54,7 +54,7 @@

    Please contact the webmaster with any queries.

    diff --git a/server/conf/error/en/404.html b/server/conf/error/en/404.html index 78452ba45987a469945fd3aaf1a6c06abe5f582c..62f6ddd5f2709e80b1f4bec4f56a408fe1e10286 100644 --- a/server/conf/error/en/404.html +++ b/server/conf/error/en/404.html @@ -54,7 +54,7 @@

    Please check the URL or contact the webmaster.

    diff --git a/server/conf/error/en/405.html b/server/conf/error/en/405.html index c9ed8f622c82469d2430d9be52bcaf1ad2bc0587..dade7de0204fb7ee9ac815143a32c0654c2498b2 100644 --- a/server/conf/error/en/405.html +++ b/server/conf/error/en/405.html @@ -54,7 +54,7 @@

    Please contact the webmaster with any queries.

    diff --git a/server/conf/error/en/500.html b/server/conf/error/en/500.html index 43864a7a6e0cd59741175cd6898a6cfb3f8e94b0..549a06d43608db1ca106395696a5175030b56c9d 100644 --- a/server/conf/error/en/500.html +++ b/server/conf/error/en/500.html @@ -54,7 +54,7 @@

    If you get this message repeatedly please contact the webmaster.

    diff --git a/server/conf/error/en/502.html b/server/conf/error/en/502.html index 62a1b0246927a90bb235107e93c9158f615b67d5..11f4b1e91bda8d5a8e660a5b7ddc43cec4476ee1 100644 --- a/server/conf/error/en/502.html +++ b/server/conf/error/en/502.html @@ -54,7 +54,7 @@

    If you get this message repeatedly please contact the webmaster.

    diff --git a/server/conf/error/en/503.html b/server/conf/error/en/503.html index eb55a56e19cd877d60a9c16c500b43364541e76e..a25d071dbe4bbcc510b4410d5d6114ab96775483 100644 --- a/server/conf/error/en/503.html +++ b/server/conf/error/en/503.html @@ -54,7 +54,7 @@

    Please contact the webmaster with any queries.

    diff --git a/server/conf/error/es/400.html b/server/conf/error/es/400.html index 39fd16337ef3e07a826a54fd45dae0857856fb70..1b55e269931b5b905a58a7ca7588998991da7e0c 100644 --- a/server/conf/error/es/400.html +++ b/server/conf/error/es/400.html @@ -54,7 +54,7 @@

    Please contact the webmaster with any queries.

    diff --git a/server/conf/error/es/401.html b/server/conf/error/es/401.html index 28fc2a038904dff7d0dcca146ee1bfd33325c6a2..2b7d8a0b232ee6c4627a45c651b3255a626cfd02 100644 --- a/server/conf/error/es/401.html +++ b/server/conf/error/es/401.html @@ -54,7 +54,7 @@

    Please contact the webmaster with any queries.

    diff --git a/server/conf/error/es/403.html b/server/conf/error/es/403.html index 676f7133ef948cd73ac223d6cf4c907bd00902db..ab630edd444311ee234bc645dc5e09f86da7ae6c 100644 --- a/server/conf/error/es/403.html +++ b/server/conf/error/es/403.html @@ -54,7 +54,7 @@

    Please contact the webmaster with any queries.

    diff --git a/server/conf/error/es/404.html b/server/conf/error/es/404.html index 78452ba45987a469945fd3aaf1a6c06abe5f582c..62f6ddd5f2709e80b1f4bec4f56a408fe1e10286 100644 --- a/server/conf/error/es/404.html +++ b/server/conf/error/es/404.html @@ -54,7 +54,7 @@

    Please check the URL or contact the webmaster.

    diff --git a/server/conf/error/es/405.html b/server/conf/error/es/405.html index c9ed8f622c82469d2430d9be52bcaf1ad2bc0587..dade7de0204fb7ee9ac815143a32c0654c2498b2 100644 --- a/server/conf/error/es/405.html +++ b/server/conf/error/es/405.html @@ -54,7 +54,7 @@

    Please contact the webmaster with any queries.

    diff --git a/server/conf/error/es/500.html b/server/conf/error/es/500.html index 43864a7a6e0cd59741175cd6898a6cfb3f8e94b0..549a06d43608db1ca106395696a5175030b56c9d 100644 --- a/server/conf/error/es/500.html +++ b/server/conf/error/es/500.html @@ -54,7 +54,7 @@

    If you get this message repeatedly please contact the webmaster.

    diff --git a/server/conf/error/es/502.html b/server/conf/error/es/502.html index 62a1b0246927a90bb235107e93c9158f615b67d5..11f4b1e91bda8d5a8e660a5b7ddc43cec4476ee1 100644 --- a/server/conf/error/es/502.html +++ b/server/conf/error/es/502.html @@ -54,7 +54,7 @@

    If you get this message repeatedly please contact the webmaster.

    diff --git a/server/conf/error/es/503.html b/server/conf/error/es/503.html index eb55a56e19cd877d60a9c16c500b43364541e76e..a25d071dbe4bbcc510b4410d5d6114ab96775483 100644 --- a/server/conf/error/es/503.html +++ b/server/conf/error/es/503.html @@ -54,7 +54,7 @@

    Please contact the webmaster with any queries.

    diff --git a/server/conf/error/fi/400.html b/server/conf/error/fi/400.html index 821ec0a130aacdac048763aea33fd66f3ee3f67a..4cf14cb3a6a4f03dffcbc638c13360ef4036ea61 100644 --- a/server/conf/error/fi/400.html +++ b/server/conf/error/fi/400.html @@ -54,7 +54,7 @@

    Ota yhteyttä ylläpitoon jos sinulla on kysyttävää.

    diff --git a/server/conf/error/fi/401.html b/server/conf/error/fi/401.html index 4d31371eb1246ca63c626d8e21d3fc09600edcac..ffb7bcd5fb232c50d035b4d5167b78f02faf58f2 100644 --- a/server/conf/error/fi/401.html +++ b/server/conf/error/fi/401.html @@ -54,7 +54,7 @@

    Ota yhteyttä ylläpitoon jos sinulla on kysyttävää.

    diff --git a/server/conf/error/fi/403.html b/server/conf/error/fi/403.html index 465b668dfd2e01434bb868675187baa6bd173fcd..eafa38dcb5b2cb9abd9235c5bada1299eb228f49 100644 --- a/server/conf/error/fi/403.html +++ b/server/conf/error/fi/403.html @@ -54,7 +54,7 @@

    Ota yhteyttä ylläpitoon jos sinulla on kysyttävää.

    diff --git a/server/conf/error/fi/404.html b/server/conf/error/fi/404.html index 7dbbe92a83dd31c3d8c9000d1b371eb18e58a963..a0d70a9c426f1808ec18a9aa675cad19883dd7a1 100644 --- a/server/conf/error/fi/404.html +++ b/server/conf/error/fi/404.html @@ -54,7 +54,7 @@

    Tarkista osoite tai ota yhteyttä ylläpitoon.

    diff --git a/server/conf/error/fi/405.html b/server/conf/error/fi/405.html index 133289437ad2c598593e3b112762ec1279feb9f0..c66e7056369c15c2c04a95f13bcfc29156585067 100644 --- a/server/conf/error/fi/405.html +++ b/server/conf/error/fi/405.html @@ -54,7 +54,7 @@

    Ota yhteyttä ylläpitoon jos sinulla on kysyttävää.

    diff --git a/server/conf/error/fi/500.html b/server/conf/error/fi/500.html index e84962a26fba900a8ea8b586c011272a6245643f..5f577c30862aa81ca9f7d9098a891cde541133ce 100644 --- a/server/conf/error/fi/500.html +++ b/server/conf/error/fi/500.html @@ -54,7 +54,7 @@

    Jos saat tämän virheen toistuvasti, ota yhteyttä ylläpitoon.

    diff --git a/server/conf/error/fi/502.html b/server/conf/error/fi/502.html index 62a1b0246927a90bb235107e93c9158f615b67d5..11f4b1e91bda8d5a8e660a5b7ddc43cec4476ee1 100644 --- a/server/conf/error/fi/502.html +++ b/server/conf/error/fi/502.html @@ -54,7 +54,7 @@

    If you get this message repeatedly please contact the webmaster.

    diff --git a/server/conf/error/fi/503.html b/server/conf/error/fi/503.html index 09d544dd3612ffb172abdc6552e914cf1e0232f0..5cd62616de8c4e9c602a2ae882ea712934dcafe0 100644 --- a/server/conf/error/fi/503.html +++ b/server/conf/error/fi/503.html @@ -54,7 +54,7 @@

    Ota yhteyttä ylläpitoon jos sinulla on kysyttävää.

    diff --git a/server/conf/error/fr/400.html b/server/conf/error/fr/400.html index 39fd16337ef3e07a826a54fd45dae0857856fb70..1b55e269931b5b905a58a7ca7588998991da7e0c 100644 --- a/server/conf/error/fr/400.html +++ b/server/conf/error/fr/400.html @@ -54,7 +54,7 @@

    Please contact the webmaster with any queries.

    diff --git a/server/conf/error/fr/401.html b/server/conf/error/fr/401.html index 28fc2a038904dff7d0dcca146ee1bfd33325c6a2..2b7d8a0b232ee6c4627a45c651b3255a626cfd02 100644 --- a/server/conf/error/fr/401.html +++ b/server/conf/error/fr/401.html @@ -54,7 +54,7 @@

    Please contact the webmaster with any queries.

    diff --git a/server/conf/error/fr/403.html b/server/conf/error/fr/403.html index 676f7133ef948cd73ac223d6cf4c907bd00902db..ab630edd444311ee234bc645dc5e09f86da7ae6c 100644 --- a/server/conf/error/fr/403.html +++ b/server/conf/error/fr/403.html @@ -54,7 +54,7 @@

    Please contact the webmaster with any queries.

    diff --git a/server/conf/error/fr/404.html b/server/conf/error/fr/404.html index 78452ba45987a469945fd3aaf1a6c06abe5f582c..62f6ddd5f2709e80b1f4bec4f56a408fe1e10286 100644 --- a/server/conf/error/fr/404.html +++ b/server/conf/error/fr/404.html @@ -54,7 +54,7 @@

    Please check the URL or contact the webmaster.

    diff --git a/server/conf/error/fr/405.html b/server/conf/error/fr/405.html index c9ed8f622c82469d2430d9be52bcaf1ad2bc0587..dade7de0204fb7ee9ac815143a32c0654c2498b2 100644 --- a/server/conf/error/fr/405.html +++ b/server/conf/error/fr/405.html @@ -54,7 +54,7 @@

    Please contact the webmaster with any queries.

    diff --git a/server/conf/error/fr/500.html b/server/conf/error/fr/500.html index 43864a7a6e0cd59741175cd6898a6cfb3f8e94b0..549a06d43608db1ca106395696a5175030b56c9d 100644 --- a/server/conf/error/fr/500.html +++ b/server/conf/error/fr/500.html @@ -54,7 +54,7 @@

    If you get this message repeatedly please contact the webmaster.

    diff --git a/server/conf/error/fr/502.html b/server/conf/error/fr/502.html index 62a1b0246927a90bb235107e93c9158f615b67d5..11f4b1e91bda8d5a8e660a5b7ddc43cec4476ee1 100644 --- a/server/conf/error/fr/502.html +++ b/server/conf/error/fr/502.html @@ -54,7 +54,7 @@

    If you get this message repeatedly please contact the webmaster.

    diff --git a/server/conf/error/fr/503.html b/server/conf/error/fr/503.html index eb55a56e19cd877d60a9c16c500b43364541e76e..a25d071dbe4bbcc510b4410d5d6114ab96775483 100644 --- a/server/conf/error/fr/503.html +++ b/server/conf/error/fr/503.html @@ -54,7 +54,7 @@

    Please contact the webmaster with any queries.

    diff --git a/server/conf/error/gr/400.html b/server/conf/error/gr/400.html index 39fd16337ef3e07a826a54fd45dae0857856fb70..1b55e269931b5b905a58a7ca7588998991da7e0c 100644 --- a/server/conf/error/gr/400.html +++ b/server/conf/error/gr/400.html @@ -54,7 +54,7 @@

    Please contact the webmaster with any queries.

    diff --git a/server/conf/error/gr/401.html b/server/conf/error/gr/401.html index 28fc2a038904dff7d0dcca146ee1bfd33325c6a2..2b7d8a0b232ee6c4627a45c651b3255a626cfd02 100644 --- a/server/conf/error/gr/401.html +++ b/server/conf/error/gr/401.html @@ -54,7 +54,7 @@

    Please contact the webmaster with any queries.

    diff --git a/server/conf/error/gr/403.html b/server/conf/error/gr/403.html index 676f7133ef948cd73ac223d6cf4c907bd00902db..ab630edd444311ee234bc645dc5e09f86da7ae6c 100644 --- a/server/conf/error/gr/403.html +++ b/server/conf/error/gr/403.html @@ -54,7 +54,7 @@

    Please contact the webmaster with any queries.

    diff --git a/server/conf/error/gr/404.html b/server/conf/error/gr/404.html index 78452ba45987a469945fd3aaf1a6c06abe5f582c..62f6ddd5f2709e80b1f4bec4f56a408fe1e10286 100644 --- a/server/conf/error/gr/404.html +++ b/server/conf/error/gr/404.html @@ -54,7 +54,7 @@

    Please check the URL or contact the webmaster.

    diff --git a/server/conf/error/gr/405.html b/server/conf/error/gr/405.html index c9ed8f622c82469d2430d9be52bcaf1ad2bc0587..dade7de0204fb7ee9ac815143a32c0654c2498b2 100644 --- a/server/conf/error/gr/405.html +++ b/server/conf/error/gr/405.html @@ -54,7 +54,7 @@

    Please contact the webmaster with any queries.

    diff --git a/server/conf/error/gr/500.html b/server/conf/error/gr/500.html index 43864a7a6e0cd59741175cd6898a6cfb3f8e94b0..549a06d43608db1ca106395696a5175030b56c9d 100644 --- a/server/conf/error/gr/500.html +++ b/server/conf/error/gr/500.html @@ -54,7 +54,7 @@

    If you get this message repeatedly please contact the webmaster.

    diff --git a/server/conf/error/gr/502.html b/server/conf/error/gr/502.html index 62a1b0246927a90bb235107e93c9158f615b67d5..11f4b1e91bda8d5a8e660a5b7ddc43cec4476ee1 100644 --- a/server/conf/error/gr/502.html +++ b/server/conf/error/gr/502.html @@ -54,7 +54,7 @@

    If you get this message repeatedly please contact the webmaster.

    diff --git a/server/conf/error/gr/503.html b/server/conf/error/gr/503.html index eb55a56e19cd877d60a9c16c500b43364541e76e..a25d071dbe4bbcc510b4410d5d6114ab96775483 100644 --- a/server/conf/error/gr/503.html +++ b/server/conf/error/gr/503.html @@ -54,7 +54,7 @@

    Please contact the webmaster with any queries.

    diff --git a/server/conf/error/hr/400.html b/server/conf/error/hr/400.html index b0cf2530396e710e49a5f4850740dd2c2e074098..6141474b5504828065ff0acf3aa3de7df3a4e233 100644 --- a/server/conf/error/hr/400.html +++ b/server/conf/error/hr/400.html @@ -54,7 +54,7 @@

    Molimo vas kontaktirajte webmajstora ukoliko imate pitanja.

    diff --git a/server/conf/error/hr/401.html b/server/conf/error/hr/401.html index c0afe60b28dd758849ab1f86c106e3beb66f3bd9..15cc68491f4f1b4f1854f9fb916ae31e215f60f1 100644 --- a/server/conf/error/hr/401.html +++ b/server/conf/error/hr/401.html @@ -54,7 +54,7 @@

    Molimo vas kontaktirajte webmajstora ukoliko imate pitanja.

    diff --git a/server/conf/error/hr/403.html b/server/conf/error/hr/403.html index 01e29222de790c5414cd0207f2ca673395f29037..4845d4da886130256f10c1ecc256dd40f388750d 100644 --- a/server/conf/error/hr/403.html +++ b/server/conf/error/hr/403.html @@ -54,7 +54,7 @@

    Molimo vas kontaktirajte webmajstora ukoliko imate pitanja.

    diff --git a/server/conf/error/hr/404.html b/server/conf/error/hr/404.html index 514a85309457829f4001af4754c5f5c4f077fd70..e367e7915457adee7b66ac5de4e9e496d057476e 100644 --- a/server/conf/error/hr/404.html +++ b/server/conf/error/hr/404.html @@ -54,7 +54,7 @@

    Provjerite da li je URL ispravan ili kontaktirajte webmajstora.

    diff --git a/server/conf/error/hr/405.html b/server/conf/error/hr/405.html index 3c5d1c070268dc97690838c41f0f467b2c04aac4..7a8fb891537d1d44780de7585960459e492a4dc5 100644 --- a/server/conf/error/hr/405.html +++ b/server/conf/error/hr/405.html @@ -54,7 +54,7 @@

    Molimo vas kontaktirajte webmajstora ukoliko imate pitanja.

    diff --git a/server/conf/error/hr/500.html b/server/conf/error/hr/500.html index 16cd1b3168a9f479714ecc1a878876286225d2dc..1f6239c99e5a7c8d58dd5bc0f359f612d4c1621f 100644 --- a/server/conf/error/hr/500.html +++ b/server/conf/error/hr/500.html @@ -54,7 +54,7 @@

    Ukoliko se ova poruka ponavlja kontaktirajte webmajstora.

    diff --git a/server/conf/error/hr/502.html b/server/conf/error/hr/502.html index 09bf4071417837c7d5f900ca109aaa1dc00eabac..6b7f6ea25298c1296d406ca39776ef5bea31dd18 100644 --- a/server/conf/error/hr/502.html +++ b/server/conf/error/hr/502.html @@ -54,7 +54,7 @@

    Ukoliko se ova poruka ponavlja kontaktirajte webmajstora.

    diff --git a/server/conf/error/hr/503.html b/server/conf/error/hr/503.html index 3d0be8391ee798cbdd82e86cfb7be4eff5d238b3..b5e758a2baca70f8a131e54df83f3d4faf3b031b 100644 --- a/server/conf/error/hr/503.html +++ b/server/conf/error/hr/503.html @@ -54,7 +54,7 @@

    Molimo vas kontaktirajte webmajstora ukoliko imate pitanja.

    diff --git a/server/conf/error/hu/400.html b/server/conf/error/hu/400.html index 39fd16337ef3e07a826a54fd45dae0857856fb70..1b55e269931b5b905a58a7ca7588998991da7e0c 100644 --- a/server/conf/error/hu/400.html +++ b/server/conf/error/hu/400.html @@ -54,7 +54,7 @@

    Please contact the webmaster with any queries.

    diff --git a/server/conf/error/hu/401.html b/server/conf/error/hu/401.html index 28fc2a038904dff7d0dcca146ee1bfd33325c6a2..2b7d8a0b232ee6c4627a45c651b3255a626cfd02 100644 --- a/server/conf/error/hu/401.html +++ b/server/conf/error/hu/401.html @@ -54,7 +54,7 @@

    Please contact the webmaster with any queries.

    diff --git a/server/conf/error/hu/403.html b/server/conf/error/hu/403.html index 676f7133ef948cd73ac223d6cf4c907bd00902db..ab630edd444311ee234bc645dc5e09f86da7ae6c 100644 --- a/server/conf/error/hu/403.html +++ b/server/conf/error/hu/403.html @@ -54,7 +54,7 @@

    Please contact the webmaster with any queries.

    diff --git a/server/conf/error/hu/404.html b/server/conf/error/hu/404.html index 78452ba45987a469945fd3aaf1a6c06abe5f582c..62f6ddd5f2709e80b1f4bec4f56a408fe1e10286 100644 --- a/server/conf/error/hu/404.html +++ b/server/conf/error/hu/404.html @@ -54,7 +54,7 @@

    Please check the URL or contact the webmaster.

    diff --git a/server/conf/error/hu/405.html b/server/conf/error/hu/405.html index c9ed8f622c82469d2430d9be52bcaf1ad2bc0587..dade7de0204fb7ee9ac815143a32c0654c2498b2 100644 --- a/server/conf/error/hu/405.html +++ b/server/conf/error/hu/405.html @@ -54,7 +54,7 @@

    Please contact the webmaster with any queries.

    diff --git a/server/conf/error/hu/500.html b/server/conf/error/hu/500.html index 43864a7a6e0cd59741175cd6898a6cfb3f8e94b0..549a06d43608db1ca106395696a5175030b56c9d 100644 --- a/server/conf/error/hu/500.html +++ b/server/conf/error/hu/500.html @@ -54,7 +54,7 @@

    If you get this message repeatedly please contact the webmaster.

    diff --git a/server/conf/error/hu/502.html b/server/conf/error/hu/502.html index 62a1b0246927a90bb235107e93c9158f615b67d5..11f4b1e91bda8d5a8e660a5b7ddc43cec4476ee1 100644 --- a/server/conf/error/hu/502.html +++ b/server/conf/error/hu/502.html @@ -54,7 +54,7 @@

    If you get this message repeatedly please contact the webmaster.

    diff --git a/server/conf/error/hu/503.html b/server/conf/error/hu/503.html index eb55a56e19cd877d60a9c16c500b43364541e76e..a25d071dbe4bbcc510b4410d5d6114ab96775483 100644 --- a/server/conf/error/hu/503.html +++ b/server/conf/error/hu/503.html @@ -54,7 +54,7 @@

    Please contact the webmaster with any queries.

    diff --git a/server/conf/error/it/400.html b/server/conf/error/it/400.html index db47b3106ded917a1300957f56e74af4b7cced20..b3bc46ac1059d7e856cbe6cc1aba294ee7e72b96 100644 --- a/server/conf/error/it/400.html +++ b/server/conf/error/it/400.html @@ -54,7 +54,7 @@

    Contatta il webmaster.

    diff --git a/server/conf/error/it/401.html b/server/conf/error/it/401.html index 97230f48747da7f098508fe5567e88f25de831be..ad7f9ad7d7eecc24e5fe9ef29767e9e0b70b921f 100644 --- a/server/conf/error/it/401.html +++ b/server/conf/error/it/401.html @@ -54,7 +54,7 @@

    Contatta il webmaster.

    diff --git a/server/conf/error/it/403.html b/server/conf/error/it/403.html index 4827e06c96ed215df25b84669307e05235b071df..688463d101e2bb239a036cf8a0a4d68117f4c600 100644 --- a/server/conf/error/it/403.html +++ b/server/conf/error/it/403.html @@ -54,7 +54,7 @@

    Contatta il webmaster.

    diff --git a/server/conf/error/it/404.html b/server/conf/error/it/404.html index d3246fa87d4e7247df2b6e6c3ffd4c4b76735111..6bebd94cb6089f7197439192b6c5f782a2d4420f 100644 --- a/server/conf/error/it/404.html +++ b/server/conf/error/it/404.html @@ -54,7 +54,7 @@

    Contatta il webmaster.

    diff --git a/server/conf/error/it/405.html b/server/conf/error/it/405.html index 05ba2c2f73c48b4407037217265d0a1dc722199b..161a0a0ece2e6730a099dc38e85ee55f08ba85e1 100644 --- a/server/conf/error/it/405.html +++ b/server/conf/error/it/405.html @@ -54,7 +54,7 @@

    Contatta il webmaster.

    diff --git a/server/conf/error/it/500.html b/server/conf/error/it/500.html index 5a3dd04d1ece6737d11edccfaa68169ae6146787..dc189afe5bf14b55b05eee71b2b5ad8b18c37c83 100644 --- a/server/conf/error/it/500.html +++ b/server/conf/error/it/500.html @@ -54,7 +54,7 @@

    Se questo messaggio si ripete, contattare il webmaster.

    diff --git a/server/conf/error/it/502.html b/server/conf/error/it/502.html index 62a1b0246927a90bb235107e93c9158f615b67d5..11f4b1e91bda8d5a8e660a5b7ddc43cec4476ee1 100644 --- a/server/conf/error/it/502.html +++ b/server/conf/error/it/502.html @@ -54,7 +54,7 @@

    If you get this message repeatedly please contact the webmaster.

    diff --git a/server/conf/error/it/503.html b/server/conf/error/it/503.html index e2445f9129824a573e6807c4159ed9d6545784cc..e05ba31058a0e5e3078d2f228501e42699eb3fb4 100644 --- a/server/conf/error/it/503.html +++ b/server/conf/error/it/503.html @@ -54,7 +54,7 @@

    Contatta il webmaster.

    diff --git a/server/conf/error/nl/400.html b/server/conf/error/nl/400.html index 39fd16337ef3e07a826a54fd45dae0857856fb70..1b55e269931b5b905a58a7ca7588998991da7e0c 100644 --- a/server/conf/error/nl/400.html +++ b/server/conf/error/nl/400.html @@ -54,7 +54,7 @@

    Please contact the webmaster with any queries.

    diff --git a/server/conf/error/nl/401.html b/server/conf/error/nl/401.html index 28fc2a038904dff7d0dcca146ee1bfd33325c6a2..2b7d8a0b232ee6c4627a45c651b3255a626cfd02 100644 --- a/server/conf/error/nl/401.html +++ b/server/conf/error/nl/401.html @@ -54,7 +54,7 @@

    Please contact the webmaster with any queries.

    diff --git a/server/conf/error/nl/403.html b/server/conf/error/nl/403.html index 676f7133ef948cd73ac223d6cf4c907bd00902db..ab630edd444311ee234bc645dc5e09f86da7ae6c 100644 --- a/server/conf/error/nl/403.html +++ b/server/conf/error/nl/403.html @@ -54,7 +54,7 @@

    Please contact the webmaster with any queries.

    diff --git a/server/conf/error/nl/404.html b/server/conf/error/nl/404.html index 78452ba45987a469945fd3aaf1a6c06abe5f582c..62f6ddd5f2709e80b1f4bec4f56a408fe1e10286 100644 --- a/server/conf/error/nl/404.html +++ b/server/conf/error/nl/404.html @@ -54,7 +54,7 @@

    Please check the URL or contact the webmaster.

    diff --git a/server/conf/error/nl/405.html b/server/conf/error/nl/405.html index c9ed8f622c82469d2430d9be52bcaf1ad2bc0587..dade7de0204fb7ee9ac815143a32c0654c2498b2 100644 --- a/server/conf/error/nl/405.html +++ b/server/conf/error/nl/405.html @@ -54,7 +54,7 @@

    Please contact the webmaster with any queries.

    diff --git a/server/conf/error/nl/500.html b/server/conf/error/nl/500.html index 43864a7a6e0cd59741175cd6898a6cfb3f8e94b0..549a06d43608db1ca106395696a5175030b56c9d 100644 --- a/server/conf/error/nl/500.html +++ b/server/conf/error/nl/500.html @@ -54,7 +54,7 @@

    If you get this message repeatedly please contact the webmaster.

    diff --git a/server/conf/error/nl/502.html b/server/conf/error/nl/502.html index 62a1b0246927a90bb235107e93c9158f615b67d5..11f4b1e91bda8d5a8e660a5b7ddc43cec4476ee1 100644 --- a/server/conf/error/nl/502.html +++ b/server/conf/error/nl/502.html @@ -54,7 +54,7 @@

    If you get this message repeatedly please contact the webmaster.

    diff --git a/server/conf/error/nl/503.html b/server/conf/error/nl/503.html index eb55a56e19cd877d60a9c16c500b43364541e76e..a25d071dbe4bbcc510b4410d5d6114ab96775483 100644 --- a/server/conf/error/nl/503.html +++ b/server/conf/error/nl/503.html @@ -54,7 +54,7 @@

    Please contact the webmaster with any queries.

    diff --git a/server/conf/error/pl/400.html b/server/conf/error/pl/400.html index 39fd16337ef3e07a826a54fd45dae0857856fb70..1b55e269931b5b905a58a7ca7588998991da7e0c 100644 --- a/server/conf/error/pl/400.html +++ b/server/conf/error/pl/400.html @@ -54,7 +54,7 @@

    Please contact the webmaster with any queries.

    diff --git a/server/conf/error/pl/401.html b/server/conf/error/pl/401.html index 28fc2a038904dff7d0dcca146ee1bfd33325c6a2..2b7d8a0b232ee6c4627a45c651b3255a626cfd02 100644 --- a/server/conf/error/pl/401.html +++ b/server/conf/error/pl/401.html @@ -54,7 +54,7 @@

    Please contact the webmaster with any queries.

    diff --git a/server/conf/error/pl/403.html b/server/conf/error/pl/403.html index 676f7133ef948cd73ac223d6cf4c907bd00902db..ab630edd444311ee234bc645dc5e09f86da7ae6c 100644 --- a/server/conf/error/pl/403.html +++ b/server/conf/error/pl/403.html @@ -54,7 +54,7 @@

    Please contact the webmaster with any queries.

    diff --git a/server/conf/error/pl/404.html b/server/conf/error/pl/404.html index 78452ba45987a469945fd3aaf1a6c06abe5f582c..62f6ddd5f2709e80b1f4bec4f56a408fe1e10286 100644 --- a/server/conf/error/pl/404.html +++ b/server/conf/error/pl/404.html @@ -54,7 +54,7 @@

    Please check the URL or contact the webmaster.

    diff --git a/server/conf/error/pl/405.html b/server/conf/error/pl/405.html index c9ed8f622c82469d2430d9be52bcaf1ad2bc0587..dade7de0204fb7ee9ac815143a32c0654c2498b2 100644 --- a/server/conf/error/pl/405.html +++ b/server/conf/error/pl/405.html @@ -54,7 +54,7 @@

    Please contact the webmaster with any queries.

    diff --git a/server/conf/error/pl/500.html b/server/conf/error/pl/500.html index 43864a7a6e0cd59741175cd6898a6cfb3f8e94b0..549a06d43608db1ca106395696a5175030b56c9d 100644 --- a/server/conf/error/pl/500.html +++ b/server/conf/error/pl/500.html @@ -54,7 +54,7 @@

    If you get this message repeatedly please contact the webmaster.

    diff --git a/server/conf/error/pl/502.html b/server/conf/error/pl/502.html index 62a1b0246927a90bb235107e93c9158f615b67d5..11f4b1e91bda8d5a8e660a5b7ddc43cec4476ee1 100644 --- a/server/conf/error/pl/502.html +++ b/server/conf/error/pl/502.html @@ -54,7 +54,7 @@

    If you get this message repeatedly please contact the webmaster.

    diff --git a/server/conf/error/pl/503.html b/server/conf/error/pl/503.html index eb55a56e19cd877d60a9c16c500b43364541e76e..a25d071dbe4bbcc510b4410d5d6114ab96775483 100644 --- a/server/conf/error/pl/503.html +++ b/server/conf/error/pl/503.html @@ -54,7 +54,7 @@

    Please contact the webmaster with any queries.

    diff --git a/server/conf/error/se/400.html b/server/conf/error/se/400.html index 39fd16337ef3e07a826a54fd45dae0857856fb70..1b55e269931b5b905a58a7ca7588998991da7e0c 100644 --- a/server/conf/error/se/400.html +++ b/server/conf/error/se/400.html @@ -54,7 +54,7 @@

    Please contact the webmaster with any queries.

    diff --git a/server/conf/error/se/401.html b/server/conf/error/se/401.html index 28fc2a038904dff7d0dcca146ee1bfd33325c6a2..2b7d8a0b232ee6c4627a45c651b3255a626cfd02 100644 --- a/server/conf/error/se/401.html +++ b/server/conf/error/se/401.html @@ -54,7 +54,7 @@

    Please contact the webmaster with any queries.

    diff --git a/server/conf/error/se/403.html b/server/conf/error/se/403.html index 676f7133ef948cd73ac223d6cf4c907bd00902db..ab630edd444311ee234bc645dc5e09f86da7ae6c 100644 --- a/server/conf/error/se/403.html +++ b/server/conf/error/se/403.html @@ -54,7 +54,7 @@

    Please contact the webmaster with any queries.

    diff --git a/server/conf/error/se/404.html b/server/conf/error/se/404.html index 78452ba45987a469945fd3aaf1a6c06abe5f582c..62f6ddd5f2709e80b1f4bec4f56a408fe1e10286 100644 --- a/server/conf/error/se/404.html +++ b/server/conf/error/se/404.html @@ -54,7 +54,7 @@

    Please check the URL or contact the webmaster.

    diff --git a/server/conf/error/se/405.html b/server/conf/error/se/405.html index c9ed8f622c82469d2430d9be52bcaf1ad2bc0587..dade7de0204fb7ee9ac815143a32c0654c2498b2 100644 --- a/server/conf/error/se/405.html +++ b/server/conf/error/se/405.html @@ -54,7 +54,7 @@

    Please contact the webmaster with any queries.

    diff --git a/server/conf/error/se/500.html b/server/conf/error/se/500.html index 43864a7a6e0cd59741175cd6898a6cfb3f8e94b0..549a06d43608db1ca106395696a5175030b56c9d 100644 --- a/server/conf/error/se/500.html +++ b/server/conf/error/se/500.html @@ -54,7 +54,7 @@

    If you get this message repeatedly please contact the webmaster.

    diff --git a/server/conf/error/se/502.html b/server/conf/error/se/502.html index 62a1b0246927a90bb235107e93c9158f615b67d5..11f4b1e91bda8d5a8e660a5b7ddc43cec4476ee1 100644 --- a/server/conf/error/se/502.html +++ b/server/conf/error/se/502.html @@ -54,7 +54,7 @@

    If you get this message repeatedly please contact the webmaster.

    diff --git a/server/conf/error/se/503.html b/server/conf/error/se/503.html index eb55a56e19cd877d60a9c16c500b43364541e76e..a25d071dbe4bbcc510b4410d5d6114ab96775483 100644 --- a/server/conf/error/se/503.html +++ b/server/conf/error/se/503.html @@ -54,7 +54,7 @@

    Please contact the webmaster with any queries.

    diff --git a/server/conf/error/si/400.html b/server/conf/error/si/400.html index 39fd16337ef3e07a826a54fd45dae0857856fb70..1b55e269931b5b905a58a7ca7588998991da7e0c 100644 --- a/server/conf/error/si/400.html +++ b/server/conf/error/si/400.html @@ -54,7 +54,7 @@

    Please contact the webmaster with any queries.

    diff --git a/server/conf/error/si/401.html b/server/conf/error/si/401.html index 28fc2a038904dff7d0dcca146ee1bfd33325c6a2..2b7d8a0b232ee6c4627a45c651b3255a626cfd02 100644 --- a/server/conf/error/si/401.html +++ b/server/conf/error/si/401.html @@ -54,7 +54,7 @@

    Please contact the webmaster with any queries.

    diff --git a/server/conf/error/si/403.html b/server/conf/error/si/403.html index 676f7133ef948cd73ac223d6cf4c907bd00902db..ab630edd444311ee234bc645dc5e09f86da7ae6c 100644 --- a/server/conf/error/si/403.html +++ b/server/conf/error/si/403.html @@ -54,7 +54,7 @@

    Please contact the webmaster with any queries.

    diff --git a/server/conf/error/si/404.html b/server/conf/error/si/404.html index 78452ba45987a469945fd3aaf1a6c06abe5f582c..62f6ddd5f2709e80b1f4bec4f56a408fe1e10286 100644 --- a/server/conf/error/si/404.html +++ b/server/conf/error/si/404.html @@ -54,7 +54,7 @@

    Please check the URL or contact the webmaster.

    diff --git a/server/conf/error/si/405.html b/server/conf/error/si/405.html index c9ed8f622c82469d2430d9be52bcaf1ad2bc0587..dade7de0204fb7ee9ac815143a32c0654c2498b2 100644 --- a/server/conf/error/si/405.html +++ b/server/conf/error/si/405.html @@ -54,7 +54,7 @@

    Please contact the webmaster with any queries.

    diff --git a/server/conf/error/si/500.html b/server/conf/error/si/500.html index 43864a7a6e0cd59741175cd6898a6cfb3f8e94b0..549a06d43608db1ca106395696a5175030b56c9d 100644 --- a/server/conf/error/si/500.html +++ b/server/conf/error/si/500.html @@ -54,7 +54,7 @@

    If you get this message repeatedly please contact the webmaster.

    diff --git a/server/conf/error/si/502.html b/server/conf/error/si/502.html index 62a1b0246927a90bb235107e93c9158f615b67d5..11f4b1e91bda8d5a8e660a5b7ddc43cec4476ee1 100644 --- a/server/conf/error/si/502.html +++ b/server/conf/error/si/502.html @@ -54,7 +54,7 @@

    If you get this message repeatedly please contact the webmaster.

    diff --git a/server/conf/error/si/503.html b/server/conf/error/si/503.html index eb55a56e19cd877d60a9c16c500b43364541e76e..a25d071dbe4bbcc510b4410d5d6114ab96775483 100644 --- a/server/conf/error/si/503.html +++ b/server/conf/error/si/503.html @@ -54,7 +54,7 @@

    Please contact the webmaster with any queries.

    diff --git a/server/conf/error/sr/400.html b/server/conf/error/sr/400.html index 39fd16337ef3e07a826a54fd45dae0857856fb70..1b55e269931b5b905a58a7ca7588998991da7e0c 100644 --- a/server/conf/error/sr/400.html +++ b/server/conf/error/sr/400.html @@ -54,7 +54,7 @@

    Please contact the webmaster with any queries.

    diff --git a/server/conf/error/sr/401.html b/server/conf/error/sr/401.html index 28fc2a038904dff7d0dcca146ee1bfd33325c6a2..2b7d8a0b232ee6c4627a45c651b3255a626cfd02 100644 --- a/server/conf/error/sr/401.html +++ b/server/conf/error/sr/401.html @@ -54,7 +54,7 @@

    Please contact the webmaster with any queries.

    diff --git a/server/conf/error/sr/403.html b/server/conf/error/sr/403.html index 676f7133ef948cd73ac223d6cf4c907bd00902db..ab630edd444311ee234bc645dc5e09f86da7ae6c 100644 --- a/server/conf/error/sr/403.html +++ b/server/conf/error/sr/403.html @@ -54,7 +54,7 @@

    Please contact the webmaster with any queries.

    diff --git a/server/conf/error/sr/404.html b/server/conf/error/sr/404.html index 78452ba45987a469945fd3aaf1a6c06abe5f582c..62f6ddd5f2709e80b1f4bec4f56a408fe1e10286 100644 --- a/server/conf/error/sr/404.html +++ b/server/conf/error/sr/404.html @@ -54,7 +54,7 @@

    Please check the URL or contact the webmaster.

    diff --git a/server/conf/error/sr/405.html b/server/conf/error/sr/405.html index c9ed8f622c82469d2430d9be52bcaf1ad2bc0587..dade7de0204fb7ee9ac815143a32c0654c2498b2 100644 --- a/server/conf/error/sr/405.html +++ b/server/conf/error/sr/405.html @@ -54,7 +54,7 @@

    Please contact the webmaster with any queries.

    diff --git a/server/conf/error/sr/500.html b/server/conf/error/sr/500.html index 43864a7a6e0cd59741175cd6898a6cfb3f8e94b0..549a06d43608db1ca106395696a5175030b56c9d 100644 --- a/server/conf/error/sr/500.html +++ b/server/conf/error/sr/500.html @@ -54,7 +54,7 @@

    If you get this message repeatedly please contact the webmaster.

    diff --git a/server/conf/error/sr/502.html b/server/conf/error/sr/502.html index 62a1b0246927a90bb235107e93c9158f615b67d5..11f4b1e91bda8d5a8e660a5b7ddc43cec4476ee1 100644 --- a/server/conf/error/sr/502.html +++ b/server/conf/error/sr/502.html @@ -54,7 +54,7 @@

    If you get this message repeatedly please contact the webmaster.

    diff --git a/server/conf/error/sr/503.html b/server/conf/error/sr/503.html index eb55a56e19cd877d60a9c16c500b43364541e76e..a25d071dbe4bbcc510b4410d5d6114ab96775483 100644 --- a/server/conf/error/sr/503.html +++ b/server/conf/error/sr/503.html @@ -54,7 +54,7 @@

    Please contact the webmaster with any queries.

    diff --git a/server/conf/goaccess_index.php.master b/server/conf/goaccess_index.php.master new file mode 100644 index 0000000000000000000000000000000000000000..ecb91c7a9cbaefeabd668a651f32cf1b24503f48 --- /dev/null +++ b/server/conf/goaccess_index.php.master @@ -0,0 +1,74 @@ +function load_content(url){var iframe = document.getElementById(\"content\");iframe.src = url;}\n"; + +if ($handle = opendir('.')) +{ + while(false !== ($file = readdir($handle))) + { + if (substr($file,0,1) != "." && is_dir($file)) + { + $orderkey = substr($file,0,4).substr($file,5,2); + if (substr($file,5,2) < 10 ) + { + $orderkey = substr($file,0,4)."0".substr($file,5,2); + } + $goaprev[$orderkey] = $file; + } + } + + $month = date("n"); + $year = date("Y"); + + if (date("d") == 1) + { + $month = date("m")-1; + if (date("m") == 1) + { + $year = date("Y")-1; + $month = "12"; + } + } + + $current = $year.$month; + if ( $month < 10 ) { + $current = $year."0".$month; + } + $goaprev[$current] = $year."-".$month; + + closedir($handle); +} + +arsort($goaprev); + +$options = ""; +foreach ($goaprev as $key => $value) +{ + + if(file_exists($value.'/awsindex.html') && file_exists($value.'/goaindex.html')) { + $goaccessindex = 'goaindex.html'; + } elseif(file_exists($value.'/awsindex.html') && !file_exists($value.'/goaindex.html')) { + $goaccessindex = 'awsindex.html'; + } else { + $goaccessindex = 'goaindex.html'; + } + + if($key == $current) $options .= "\n"; + else $options .= "\n"; + +} +$goaccessindex = 'goaindex.html'; + +$html = "\n\n\nStats\n"; +$html .= "\n"; +$html .= "\n\n\n"; +$html .= $script; +$html .= "
    {$yearmonth_text}\n"; +$html .= "\n
    \n\n"; +$html .= ""; +echo $html; +?> diff --git a/server/conf/index/standard_index.html_bg b/server/conf/index/standard_index.html_bg new file mode 100644 index 0000000000000000000000000000000000000000..d98bda676053973cbc5f834b16530ee62313db40 --- /dev/null +++ b/server/conf/index/standard_index.html_bg @@ -0,0 +1,60 @@ + + + + Привет! + + + + + + +
    + +
    +

    Това е страницата по подразбиране за вашият уеб сайт.

    +

    Този файл може да бъде изтрит или презаписан с друг без никакъв проблем. Виждате съдържанието на файла index.html в web директорията.

    +

    Ако имате въпроси или проблеми може да се свържете с поддръжката.

    +
    + +
    + + diff --git a/server/conf/index/standard_index.html_br b/server/conf/index/standard_index.html_br index abce2afd36f56b48d8a32cf671c7f1c70008ef47..9fdaa4581dbd1bd3db945ea228d1dead05a5a9df 100644 --- a/server/conf/index/standard_index.html_br +++ b/server/conf/index/standard_index.html_br @@ -53,7 +53,7 @@

    Tendo quaisquer dúvidas ou problemas contate o suporte.

    diff --git a/server/conf/index/standard_index.html_cz b/server/conf/index/standard_index.html_cz index f9077b41ce5db2e4ea1d93601dc4f941cf4ae06a..65c5aaea586e016884f6eb30b3c9cd5e26249f02 100644 --- a/server/conf/index/standard_index.html_cz +++ b/server/conf/index/standard_index.html_cz @@ -53,7 +53,7 @@

    Pokud mate jakekoliv dotazy prosim kontaktuje Support.

    diff --git a/server/conf/index/standard_index.html_de b/server/conf/index/standard_index.html_de index ad56618315773979069531dfd124cdfbc18f41c0..13e1f523b99fd8f8b7035508556b41b5cd083cdd 100644 --- a/server/conf/index/standard_index.html_de +++ b/server/conf/index/standard_index.html_de @@ -53,7 +53,7 @@

    Bei Fragen oder Problemen wenden Sie sich bitte an den Support.

    diff --git a/server/conf/index/standard_index.html_en b/server/conf/index/standard_index.html_en index 186ea25bd73e4818de23fcc94f2cd4360d064615..266094d0ba421b2544c1dfa366ba837bdefad5d7 100644 --- a/server/conf/index/standard_index.html_en +++ b/server/conf/index/standard_index.html_en @@ -53,7 +53,7 @@

    For questions or problems please contact support.

    diff --git a/server/conf/index/standard_index.html_es b/server/conf/index/standard_index.html_es index 5db368c40928e7a969421b6e7a83790dfcfcbab3..ad45952cbf4cba49465e0e3acdd8d94b0b99e709 100644 --- a/server/conf/index/standard_index.html_es +++ b/server/conf/index/standard_index.html_es @@ -53,7 +53,7 @@

    Si tiene dudas o problemas, porfavor contacte al support.

    diff --git a/server/conf/index/standard_index.html_fi b/server/conf/index/standard_index.html_fi index e34f57a276f5aaf41fb141fa38f40e5a8ba1e23f..b2dc06e09e4caf8607d3bd645e54e5169bad3d8c 100644 --- a/server/conf/index/standard_index.html_fi +++ b/server/conf/index/standard_index.html_fi @@ -53,7 +53,7 @@

    Jos sinulla on ongelmia tai kysyttävää, ota yhteyttä asiakastukeen.

    diff --git a/server/conf/index/standard_index.html_fr b/server/conf/index/standard_index.html_fr index b943854bded96b3dbb8efbe633ec02c247392c9c..ba8a2723584b58a55707471f5d8c94e0c9c09173 100644 --- a/server/conf/index/standard_index.html_fr +++ b/server/conf/index/standard_index.html_fr @@ -53,7 +53,7 @@

    Pour tous problèmes ou questions, merci de contacter le support.

    diff --git a/server/conf/index/standard_index.html_gr b/server/conf/index/standard_index.html_gr index 41751e1696bc7a33287955345ca281ccb18bf97a..d6b58395ed3ea2612d704295a433599e9c2e8c1c 100644 --- a/server/conf/index/standard_index.html_gr +++ b/server/conf/index/standard_index.html_gr @@ -53,7 +53,7 @@

    Ãéá áðïñßåò Þ ðñïâëÞìáôá ðáñáêáëþ åðéêïéíùíÞóôå ìå ôï äéá÷åéñéóôÞ.

    diff --git a/server/conf/index/standard_index.html_hr b/server/conf/index/standard_index.html_hr index 2960aa1d4fa20bb6eb3a871350f60801054b29c3..4270b4dda31c15fec32923a0c4684caffbf065c0 100644 --- a/server/conf/index/standard_index.html_hr +++ b/server/conf/index/standard_index.html_hr @@ -53,7 +53,7 @@

    Za sva pitanja ili probleme molimo vas kontaktirajte podršku.

    diff --git a/server/conf/index/standard_index.html_hu b/server/conf/index/standard_index.html_hu index 33444ec7b7ee03dd1aaf7de098be3228ff1a12fa..0465bcc38f79566eac46b82e9f706db5a64625de 100644 --- a/server/conf/index/standard_index.html_hu +++ b/server/conf/index/standard_index.html_hu @@ -53,7 +53,7 @@

    Kérdéseivel, kérjük, forduljon a support.

    diff --git a/server/conf/index/standard_index.html_it b/server/conf/index/standard_index.html_it index 141bbb9e25d0f7806fc306ed4ab9052e0981fb99..bec16c304029fc62fbf2a416db6d4ecfef90695c 100644 --- a/server/conf/index/standard_index.html_it +++ b/server/conf/index/standard_index.html_it @@ -53,7 +53,7 @@

    Per domande o problemi contattate il supporto.

    diff --git a/server/conf/index/standard_index.html_nl b/server/conf/index/standard_index.html_nl index ea2255fc2018d12afd98680f8c4d5ec9a3230888..3345bedc1f9dae37967754ac2a74addbeb12f713 100644 --- a/server/conf/index/standard_index.html_nl +++ b/server/conf/index/standard_index.html_nl @@ -53,7 +53,7 @@

    Voor vragen of problemen kunt u contact opnemen met de support.

    diff --git a/server/conf/index/standard_index.html_pl b/server/conf/index/standard_index.html_pl index e657b3842654e56c318613217f5bccbddd79992e..538edc37e930c00bc43767bbb1ee9383093b9d1a 100644 --- a/server/conf/index/standard_index.html_pl +++ b/server/conf/index/standard_index.html_pl @@ -53,7 +53,7 @@

    For questions or problems please contact the support.

    diff --git a/server/conf/index/standard_index.html_se b/server/conf/index/standard_index.html_se index 6a217475a59525969b99004900ca81debe5cddd5..deaaf5e2a673935062148f0be88f1ed6c1335ad4 100644 --- a/server/conf/index/standard_index.html_se +++ b/server/conf/index/standard_index.html_se @@ -53,7 +53,7 @@

    För frågor eller problem runt detta kontakta support.

    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 @@ + + + + Vitajte! + + + + + + +
    + +
    +

    Toto je štandardná stránka Vašej webstránky.

    +

    Môžete ju bez obáv vymazať alebo nahradiť iným súborom. Toto je súbor index.html v adresári web.

    +

    Ak máte akékoľvek otázky kontaktujte podporu.

    +
    + +
    + + diff --git a/server/conf/index/standard_index.html_sr b/server/conf/index/standard_index.html_sr index eaa8c062bebf811005bc9f4589661329ea9a9431..c094e1e5ba4fe372ee075f50e19878b87396d8cc 100644 --- a/server/conf/index/standard_index.html_sr +++ b/server/conf/index/standard_index.html_sr @@ -53,7 +53,7 @@

    Kontaktirajte support u vezi pitanja i problema.

    diff --git a/server/conf/index/user_standard_index.html_br b/server/conf/index/user_standard_index.html_br index 88cc913e97d4ecea71d4769553275bc93e4265c3..cb9d192d4815fe1814920dd61c7b1b9f49b9a8d6 100644 --- a/server/conf/index/user_standard_index.html_br +++ b/server/conf/index/user_standard_index.html_br @@ -53,7 +53,7 @@

    Tendo quaisquer dúvidas ou problemas contate o suporte.

    diff --git a/server/conf/index/user_standard_index.html_cz b/server/conf/index/user_standard_index.html_cz index 0be2ca0ad8a2bf10af2950d60a052763dcf2a775..0f193b209926802fa65a05c15ff651e5a7d1b894 100644 --- a/server/conf/index/user_standard_index.html_cz +++ b/server/conf/index/user_standard_index.html_cz @@ -53,7 +53,7 @@

    Pokud mate jakekoliv dotazy prosim kontaktuje Support.

    diff --git a/server/conf/index/user_standard_index.html_de b/server/conf/index/user_standard_index.html_de index 6264631b4edb01ca204b8411ddc2347bee6cdad5..784c4ac46da7f480cb40bf2b35e3d277b3ae6328 100644 --- a/server/conf/index/user_standard_index.html_de +++ b/server/conf/index/user_standard_index.html_de @@ -53,7 +53,7 @@

    Bei Fragen oder Problemen wenden Sie sich bitte an den Support.

    diff --git a/server/conf/index/user_standard_index.html_en b/server/conf/index/user_standard_index.html_en index bb3a7aa5a34589d16655fd304d8f80f240aa9995..b51fb3982f7ddf2d33bf62c2afeeddfe9ca48250 100644 --- a/server/conf/index/user_standard_index.html_en +++ b/server/conf/index/user_standard_index.html_en @@ -53,7 +53,7 @@

    For questions or problems please contact the support.

    diff --git a/server/conf/index/user_standard_index.html_es b/server/conf/index/user_standard_index.html_es index d2bb462be808e938e825629d838555711385fa03..36cb34eb7f9666af39ace40dda9e594aeb6f541b 100644 --- a/server/conf/index/user_standard_index.html_es +++ b/server/conf/index/user_standard_index.html_es @@ -53,7 +53,7 @@

    Si tiene dudas o problemas, porfavor contacte al support.

    diff --git a/server/conf/index/user_standard_index.html_fi b/server/conf/index/user_standard_index.html_fi index 14cd51576e44bf2835291759d95236e24252a826..dec5edc88176b4a28dce521777d162ca06096279 100644 --- a/server/conf/index/user_standard_index.html_fi +++ b/server/conf/index/user_standard_index.html_fi @@ -53,7 +53,7 @@

    Jos sinulla on ongelmia tai kysyttävää, ota yhteyttä asiakastukeen.

    diff --git a/server/conf/index/user_standard_index.html_fr b/server/conf/index/user_standard_index.html_fr index 908b87c02d3e18d45518c4322b5de82668ef180b..1e9321548864bd49f5b3bf4eca0034c598ae260b 100644 --- a/server/conf/index/user_standard_index.html_fr +++ b/server/conf/index/user_standard_index.html_fr @@ -53,7 +53,7 @@

    Pour tous problèmes ou questions, merci de contacter le support.

    diff --git a/server/conf/index/user_standard_index.html_gr b/server/conf/index/user_standard_index.html_gr index 63f16a46f5888d6faed28c4fca719c148b5a766e..d2a377a0cf83adb0ba18bd5135345abef986ea2b 100644 --- a/server/conf/index/user_standard_index.html_gr +++ b/server/conf/index/user_standard_index.html_gr @@ -53,7 +53,7 @@

    Ãéá áðïñßåò Þ ðñïâëÞìáôá ðáñáêáëþ åðéêïéíùíÞóôå ìå ôï äéá÷åéñéóôÞ.

    diff --git a/server/conf/index/user_standard_index.html_hr b/server/conf/index/user_standard_index.html_hr index 4459e8d1f8edf7c93573a87018af822ec41fb2ac..5f56666fc4ff4dba74dbd7b4ffb5aeca042f02c2 100644 --- a/server/conf/index/user_standard_index.html_hr +++ b/server/conf/index/user_standard_index.html_hr @@ -53,7 +53,7 @@

    Za sva pitanja ili probleme molimo vas kontaktirajte podršku.

    diff --git a/server/conf/index/user_standard_index.html_hu b/server/conf/index/user_standard_index.html_hu index 2ca87323e801f9e1b5c7762ed001d67bc352dce8..0dd90cb055d79889db52cdf3bf90d6ddfcba7012 100644 --- a/server/conf/index/user_standard_index.html_hu +++ b/server/conf/index/user_standard_index.html_hu @@ -53,7 +53,7 @@

    Kérdéseivel, kérjük, forduljon a support.

    diff --git a/server/conf/index/user_standard_index.html_it b/server/conf/index/user_standard_index.html_it index 6f253f04fbec0f204e0bc19f9f16e183c0ac5c8b..b891741cbdf73d811c1600ad8c8da7fd09c55bee 100644 --- a/server/conf/index/user_standard_index.html_it +++ b/server/conf/index/user_standard_index.html_it @@ -53,7 +53,7 @@

    Per domande o problemi contattate il supporto.

    diff --git a/server/conf/index/user_standard_index.html_nl b/server/conf/index/user_standard_index.html_nl index ec1b8be075f64865ed3764012f5f959287618dcf..55fe98e18d44761a3e8f5f1bc308f5bed3963c63 100644 --- a/server/conf/index/user_standard_index.html_nl +++ b/server/conf/index/user_standard_index.html_nl @@ -53,7 +53,7 @@

    Voor vragen of problemen kunt u contact opnemen met de support.

    diff --git a/server/conf/index/user_standard_index.html_pl b/server/conf/index/user_standard_index.html_pl index bb3a7aa5a34589d16655fd304d8f80f240aa9995..b51fb3982f7ddf2d33bf62c2afeeddfe9ca48250 100644 --- a/server/conf/index/user_standard_index.html_pl +++ b/server/conf/index/user_standard_index.html_pl @@ -53,7 +53,7 @@

    For questions or problems please contact the support.

    diff --git a/server/conf/index/user_standard_index.html_se b/server/conf/index/user_standard_index.html_se index ed9c9ae129ab405b6330f18dc5b4cd2750bfe6f6..5d29f7d40687a63ae77f3da4d08b380439b8392b 100644 --- a/server/conf/index/user_standard_index.html_se +++ b/server/conf/index/user_standard_index.html_se @@ -53,7 +53,7 @@

    För frågor eller problem runt detta kontakta support.

    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 @@ + + + + Vitajte! + + + + + + +
    + +
    +

    Toto je štandardná stránka Vašej webstránky {USER_USERNAME}

    +

    Môžete ju bez obáv vymazať alebo nahradiť iným súborom. Toto je súbor index.html v adresári user/{USER_USERNAME}/web.

    +

    Ak máte akékoľvek otázky kontaktujte podporu.

    +
    + +
    + + diff --git a/server/conf/index/user_standard_index.html_sr b/server/conf/index/user_standard_index.html_sr index 7a60fe070534c059fd6be35f29fb17322c896f6d..d86c12ac4e5746714030acb6ba9c765b862813cb 100644 --- a/server/conf/index/user_standard_index.html_sr +++ b/server/conf/index/user_standard_index.html_sr @@ -53,7 +53,7 @@

    Kontaktirajte support u vezi pitanja i problema.

    diff --git a/server/conf/mail/db_quota_notification_fr.txt b/server/conf/mail/db_quota_notification_fr.txt new file mode 100644 index 0000000000000000000000000000000000000000..c48a1a2a9a158de1dfaa9e12af9fdd5050b8609b --- /dev/null +++ b/server/conf/mail/db_quota_notification_fr.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: Notification de quota de base de données + +La base de données {database_name} a atteint ou est sur le point d'atteindre son quota maximum. + +Base de données : {database_name} +Espace utilisé : {used} +Quota : {quota} +Ratio d'utilisation : {ratio} diff --git a/server/conf/mail/db_quota_notification_nl.txt b/server/conf/mail/db_quota_notification_nl.txt new file mode 100644 index 0000000000000000000000000000000000000000..4706294f74316a393773dd31f2a5753577ed9a98 --- /dev/null +++ b/server/conf/mail/db_quota_notification_nl.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: Database quota notificatie + +De database {database_name} heeft (bijna) het opslaglimiet bereikt. + +Database: {database_name} +Used space: {used} +Quota: {quota} +Usage ratio: {ratio} 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_fr.txt b/server/conf/mail/db_quota_ok_notification_fr.txt new file mode 100644 index 0000000000000000000000000000000000000000..573e9e9a0b23b65789bebbdf93c1ba0698fc5a08 --- /dev/null +++ b/server/conf/mail/db_quota_ok_notification_fr.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: Quota de base de données ok + +La base de données {database_name} n'est plus à la limite de son quota. + +Base de données : {database_name} +Espace utilisé : {used} +Quota : {quota} +Ratio d'utilisation : {ratio} diff --git a/server/conf/mail/db_quota_ok_notification_nl.txt b/server/conf/mail/db_quota_ok_notification_nl.txt new file mode 100644 index 0000000000000000000000000000000000000000..b0babbd6cac2b973a8bfb138be1ffe7c73204688 --- /dev/null +++ b/server/conf/mail/db_quota_ok_notification_nl.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: Database quota ok + +De database {database_name} heeft niet meer (bijna) het opslaglimiet bereikt. + +Database: {database_name} +Used space: {used} +Quota: {quota} +Usage ratio: {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_fr.txt b/server/conf/mail/mail_quota_notification_fr.txt new file mode 100644 index 0000000000000000000000000000000000000000..74d9188f831b523e9a6ca4b7772a4246fb2bc813 --- /dev/null +++ b/server/conf/mail/mail_quota_notification_fr.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: Notification de quota de votre compte email + +Le compte email {email} a atteint ou est sur le point d'atteindre son quota maximum. + +Compte email : {email} +Nom : {name} +Espace utilisé : {used} +Quota : {quota} +Ratio d'utilisation : {ratio} diff --git a/server/conf/mail/mail_quota_notification_nl.txt b/server/conf/mail/mail_quota_notification_nl.txt new file mode 100644 index 0000000000000000000000000000000000000000..3afafa2595d6f6bcf2c3eb381296b53f60a08341 --- /dev/null +++ b/server/conf/mail/mail_quota_notification_nl.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: Mailbox quota notification + +De mailbox {email} heeft (bijna) het opslaglimiet bereikt. + +Mailbox: {email} +Name: {name} +Used space: {used} +Quota: {quota} +Usage ratio: {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_fr.txt b/server/conf/mail/mail_quota_ok_notification_fr.txt new file mode 100644 index 0000000000000000000000000000000000000000..44ed789bd82a4b0d562f2d65ab1dae547ab60141 --- /dev/null +++ b/server/conf/mail/mail_quota_ok_notification_fr.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: Quota de votre compte email ok + +Le compte email {email} n'est plus à la limite de son quota. + +Compte email : {email} +Nom : {name} +Espace utilisé : {used} +Quota : {quota} +Ratio d'utilisation : {ratio} diff --git a/server/conf/mail/mail_quota_ok_notification_nl.txt b/server/conf/mail/mail_quota_ok_notification_nl.txt new file mode 100644 index 0000000000000000000000000000000000000000..9a82a231e01c3dba1ae3632cd47017a484a0df1e --- /dev/null +++ b/server/conf/mail/mail_quota_ok_notification_nl.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: Mailbox quota ok + +De mailbox {email} is niet meer (bijna) vol. + +Mailbox: {email} +Name: {name} +Used space: {used} +Quota: {quota} +Usage ratio: {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_fr.txt b/server/conf/mail/web_quota_notification_fr.txt new file mode 100644 index 0000000000000000000000000000000000000000..b6869424f43f288d7f84828baae7fb298b58cb33 --- /dev/null +++ b/server/conf/mail/web_quota_notification_fr.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: Notification de quota de votre espace web + +Le site web {domain} a atteint ou est sur le point d'atteindre son quota maximum. + +Domaine : {domain} +Espace utilisé : {used} +Limite souple : {soft} +Limite stricte : {hard} +Ratio d'utilisation : {ratio} diff --git a/server/conf/mail/web_quota_notification_nl.txt b/server/conf/mail/web_quota_notification_nl.txt new file mode 100644 index 0000000000000000000000000000000000000000..740637660bc286bfa2219250d21489561bab2438 --- /dev/null +++ b/server/conf/mail/web_quota_notification_nl.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: Website quota notification + +De website {domain} heeft (bijna) het opslaglimiet bereikt. + +Domain: {domain} +Used space: {used} +Soft limit: {soft} +Hard limit: {hard} +Usage ratio: {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_fr.txt b/server/conf/mail/web_quota_ok_notification_fr.txt new file mode 100644 index 0000000000000000000000000000000000000000..ee6823de90e2972a96445a8c5e3c0965d998a711 --- /dev/null +++ b/server/conf/mail/web_quota_ok_notification_fr.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: Quota de votre espace web ok + +Le site web {domain} n'est plus à la limite de son quota. + +Domaine : {domain} +Espace utilisé : {used} +Limite souple : {soft} +Limite stricte : {hard} +Ratio d'utilisation : {ratio} diff --git a/server/conf/mail/web_quota_ok_notification_nl.txt b/server/conf/mail/web_quota_ok_notification_nl.txt new file mode 100644 index 0000000000000000000000000000000000000000..086f3c0f73778bbf66feb7aea26738447920c98e --- /dev/null +++ b/server/conf/mail/web_quota_ok_notification_nl.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: Website quota ok + +De website {domain} is niet langer (bijna) buiten het opslaglimiet. + +Domain: {domain} +Used space: {used} +Soft limit: {soft} +Hard limit: {hard} +Usage ratio: {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_fr.txt b/server/conf/mail/web_traffic_notification_fr.txt new file mode 100644 index 0000000000000000000000000000000000000000..8318df424a9a3c37659c0f2dfa27734d2ad21f2a --- /dev/null +++ b/server/conf/mail/web_traffic_notification_fr.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: Notification de trafic web dépassé - site désactivé + +Le site web {domain} a dépassé sa limite de trafic et a été désactivé. diff --git a/server/conf/mail/web_traffic_notification_nl.txt b/server/conf/mail/web_traffic_notification_nl.txt new file mode 100644 index 0000000000000000000000000000000000000000..89047b206b707b016a2c9595e2f4be8d5c677447 --- /dev/null +++ b/server/conf/mail/web_traffic_notification_nl.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: Webverkeerslimiet bereikt + +De website {domain} heeft het verkeerslimiet voor deze maand bereikt en is uitgeschakeld. 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_en.txt b/server/conf/mail/web_traffic_notification_warn_en.txt new file mode 100644 index 0000000000000000000000000000000000000000..f69d906dabecd58dbe3f1b48adb8ac465c49fe96 --- /dev/null +++ b/server/conf/mail/web_traffic_notification_warn_en.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: Website traffic notification + +The website {domain} is over traffic. diff --git a/server/conf/mail/web_traffic_notification_warn_nl.txt b/server/conf/mail/web_traffic_notification_warn_nl.txt new file mode 100644 index 0000000000000000000000000000000000000000..02d9a03c2fb4818aabf7278a1f789fefd2703eff --- /dev/null +++ b/server/conf/mail/web_traffic_notification_warn_nl.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: Webverkeerslimiet bereikt + +De website {domain} heeft het verkeerslimiet voor deze maand bereikt. 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_de.txt b/server/conf/mail/welcome_email_de.txt index 2327209acef50c0363402c64101874acf7c1c3d0..d28e9ac2430d510eea1a0c44f785e0db62b55fee 100644 --- a/server/conf/mail/welcome_email_de.txt +++ b/server/conf/mail/welcome_email_de.txt @@ -1,4 +1,4 @@ -From: ISPConfig +From: {admin_name} <{admin_mail}> Subject: Ihr Mailaccount ist aktiv. -Ihr Mailaccount ist jetzt aktiv. Viel Vergnügen. \ No newline at end of file +Ihr Mailaccount ist jetzt aktiv. Viel Vergnügen. diff --git a/server/conf/mail/welcome_email_en.txt b/server/conf/mail/welcome_email_en.txt index 9689485606a36a69212de7005b5978b87df9031f..485227c0f3b95ef14cfd6bfe46e75d9e666f455e 100644 --- a/server/conf/mail/welcome_email_en.txt +++ b/server/conf/mail/welcome_email_en.txt @@ -1,4 +1,4 @@ -From: ISPConfig +From: {admin_name} <{admin_mail}> Subject: Welcome to your new email account. -Welcome to your new email account. Your webmaster. \ No newline at end of file +Welcome to your new email account. Your webmaster. diff --git a/server/conf/mail/welcome_email_es.txt b/server/conf/mail/welcome_email_es.txt index ede0ea5120825ecd9a94e91d6a5b25030c2ee148..9ead0568f3a130448e7db028a85449167f8f338c 100644 --- a/server/conf/mail/welcome_email_es.txt +++ b/server/conf/mail/welcome_email_es.txt @@ -1,4 +1,4 @@ -From: ISPConfig +From: {admin_name} <{admin_mail}> Subject: Bienvenido a su nueva cuenta de correo Bienvenido a su nueva cuenta de correo. Su administrador. diff --git a/server/conf/mail/welcome_email_fr.txt b/server/conf/mail/welcome_email_fr.txt new file mode 100644 index 0000000000000000000000000000000000000000..d1750068696373985c8c6e6f9f02cb6d98e245d5 --- /dev/null +++ b/server/conf/mail/welcome_email_fr.txt @@ -0,0 +1,4 @@ +From: {admin_name} <{admin_mail}> +Subject: Bienvenue dans votre nouvelle boîte aux lettres + +Votre nouveau compte email est désormais activé. Votre webmaster. diff --git a/server/conf/mail/welcome_email_hr.txt b/server/conf/mail/welcome_email_hr.txt index 3c45f5ac0b65d86cc76d8eb0e3e811ff3e761c1d..f288c480f092d9cce84cb7e1f021b39fbf3c266b 100644 --- a/server/conf/mail/welcome_email_hr.txt +++ b/server/conf/mail/welcome_email_hr.txt @@ -1,4 +1,4 @@ -From: ISPConfig +From: {admin_name} <{admin_mail}> Subject: Dobrodošli u vaš novi email račun. -Dobrodošli u vaš novi email račun. Vaš webmajstor. \ No newline at end of file +Dobrodošli u vaš novi email račun. Vaš webmajstor. diff --git a/server/conf/mail/welcome_email_nl.txt b/server/conf/mail/welcome_email_nl.txt new file mode 100644 index 0000000000000000000000000000000000000000..2fce985968e927dc281d7f5d64d74ff61ed51855 --- /dev/null +++ b/server/conf/mail/welcome_email_nl.txt @@ -0,0 +1,4 @@ +From: {admin_name} <{admin_mail}> +Subject: Welkom in uw nieuwe account. + +Welkom in uw nieuwe email account. Uw webmaster. 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 8a97f82a439cd596d341cf91b313ad4a52625a6b..181f4c807e2ee0761e61ef26f3f0589153703ca2 100644 --- a/server/conf/nginx_apps.vhost.master +++ b/server/conf/nginx_apps.vhost.master @@ -1,5 +1,13 @@ server { - listen {apps_vhost_ip}{apps_vhost_port}; + 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; + {ssl_comment}ssl_certificate_key /usr/local/ispconfig/interface/ssl/ispserver.key; + + # redirect to https if accessed with http + {ssl_comment}error_page 497 https://$host:{apps_vhost_port}$request_uri; server_name {apps_vhost_servername}; @@ -12,7 +20,7 @@ server { } # serve static files directly - location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|html|xml|txt)$ { + location ~* ^.+\.(jpg|jpeg|gif|css|png|js|ico|html|xml|txt)$ { access_log off; } @@ -165,6 +173,7 @@ server { fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; + fastcgi_param SCRIPT_FILENAME $request_filename; fastcgi_param SCRIPT_NAME $fastcgi_script_name; fastcgi_param REQUEST_URI $request_uri; fastcgi_param DOCUMENT_URI $document_uri; @@ -191,7 +200,7 @@ server { fastcgi_pass unix:{cgi_socket}; } - location /images/mailman { + location ^~ /images/mailman { alias /usr/share/images/mailman; } @@ -223,5 +232,4 @@ server { {use_rspamd}alias /usr/share/rspamd/www/$1; {use_rspamd}} {use_rspamd}} - } diff --git a/server/conf/nginx_vhost.conf.master b/server/conf/nginx_vhost.conf.master index b1db61fe1c90e9a34dbc7797060ded982ebd66de..400d9b9af2a00f57463a2b762c7a29d79c80968c 100644 --- a/server/conf/nginx_vhost.conf.master +++ b/server/conf/nginx_vhost.conf.master @@ -1,5 +1,10 @@ server { listen :; + + + listen : proxy_protocol; + + listen []:; @@ -7,39 +12,50 @@ server { listen [::]:; - listen : ssl{tmpl_if name='enable_http2' op='==' value='y'} http2{/tmpl_if}{tmpl_if name='enable_spdy' op='==' value='y'} spdy{/tmpl_if}; - ssl_protocols TLSv1 TLSv1.1 TLSv1.2; + listen : ssl http2; + + + listen : ssl http2 proxy_protocol; + + + + + ssl_protocols TLSv1.3 TLSv1.2; + + ssl_protocols TLSv1.2; + # ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS'; # ssl_prefer_server_ciphers on; - listen []: ssl{tmpl_if name='enable_http2' op='==' value='y'} http2{/tmpl_if}{tmpl_if name='enable_spdy' op='==' value='y'} spdy{/tmpl_if}; + listen []: ssl http2; - listen [::]: ssl{tmpl_if name='enable_http2' op='==' value='y'} http2{/tmpl_if}{tmpl_if name='enable_spdy' op='==' value='y'} spdy{/tmpl_if}; + listen [::]: ssl http2; ssl_certificate ; ssl_certificate_key ; - + server_name ; root ; - + disable_symlinks if_not_owner from=$document_root; + if ($scheme != "https") { - rewrite ^ https://$http_host$request_uri? permanent; + rewrite ^(?!/\.well-known/acme-challenge)/ https://$http_host$request_uri? permanent; } if ($http_host "") { - rewrite ^ $scheme://$request_uri? permanent; + rewrite ^(?!/\.well-known/acme-challenge)/ $scheme://$request_uri? permanent; } if ($http_host "") { - rewrite ^ $scheme://$request_uri? permanent; + rewrite ^(?!/\.well-known/acme-challenge)/ $scheme://$request_uri? permanent; } @@ -53,6 +69,16 @@ server { if ($http_host != "") { rewrite ^(.*)$ $2 ; } + ## no proxy for acme-challenge + location ^~ /.well-known/acme-challenge/ { + access_log off; + log_not_found off; + root /usr/local/ispconfig/interface/acme/; + autoindex off; + index index.html; + try_files $uri $uri/ =404; + } + location / { proxy_pass ; rewrite ^/(.*) /$1; @@ -62,16 +88,16 @@ server { } - - index index.html index.htm index.php index.cgi index.pl index.xhtml; - - + + index index.html index.htm index.php index.cgi index.pl index.xhtml standard_index.html; + + location ~ \.shtml$ { ssi on; } - + error_page 400 /error/400.html; error_page 401 /error/401.html; error_page 403 /error/403.html; @@ -84,37 +110,45 @@ server { location = /error/400.html { internal; + auth_basic off; } location = /error/401.html { internal; + auth_basic off; } location = /error/403.html { internal; + auth_basic off; } location = /error/404.html { internal; + auth_basic off; } location = /error/405.html { internal; + auth_basic off; } location = /error/500.html { internal; + auth_basic off; } location = /error/502.html { internal; + auth_basic off; } location = /error/503.html { internal; + auth_basic off; } - + error_log /var/log/ispconfig/httpd//error.log; access_log /var/log/ispconfig/httpd//access.log combined; @@ -139,7 +173,7 @@ server { index index.html; try_files $uri $uri/ =404; } - + location = /favicon.ico { log_not_found off; access_log off; @@ -152,12 +186,13 @@ server { log_not_found off; access_log off; } - + location /stats/ { index index.html index.php; auth_basic "Members Only"; auth_basic_user_file ; + add_header Content-Security-Policy "default-src * 'self' 'unsafe-inline' 'unsafe-eval' data:;"; } location ^~ /awstats-icon { @@ -315,37 +350,44 @@ server { location { ##merge## auth_basic "Members Only"; auth_basic_user_file .htpasswd; - + location ~ \.php$ { try_files @php; } } - + } server { - listen :80; + listen :; - listen []:80; + listen []:; + + + listen [::]:; - + + - listen :443 ssl; + listen : ssl http2; - listen []:443 ssl; + listen []: ssl http2; + + + listen [::]: ssl http2; ssl_certificate ; ssl_certificate_key ; - + server_name ; if ($http_host "") { - rewrite ^ $scheme://$request_uri? permanent; + rewrite ^(?!/\.well-known/acme-challenge)/ $scheme://$request_uri? permanent; } diff --git a/server/conf/php_fpm_pool.conf.master b/server/conf/php_fpm_pool.conf.master index fb5c4b44d9b975ccef05ab936dc7d7d75c7e934a..f2417e87bba0dbc2388645105fd6e88ba96daf7c 100644 --- a/server/conf/php_fpm_pool.conf.master +++ b/server/conf/php_fpm_pool.conf.master @@ -30,7 +30,6 @@ chdir = / chroot = php_admin_value[doc_root] = -php_admin_value[cgi.fix_pathinfo] = 0 env[HOSTNAME] = $HOSTNAME @@ -45,8 +44,10 @@ env[PATH] = /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin php_admin_value[session.save_path] = /tmp php_admin_value[upload_tmp_dir] = /tmp + php_admin_value[sendmail_path] = "/usr/sbin/sendmail -t -i -f webmaster@" + 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"; + +servers = ""; + + +password = ""; + +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_options.inc.master b/server/conf/rspamd_options.inc.master new file mode 100644 index 0000000000000000000000000000000000000000..537816c8036e7152e3dcf510afde87219c0aeaac --- /dev/null +++ b/server/conf/rspamd_options.inc.master @@ -0,0 +1,12 @@ +# Addrs local to this server. +local_addrs = [ + "127.0.0.0/8", + "::1", + ]; + +# This list is generated by ISPConfig, place custom addresses/networks in local_networks.inc. +local_networks = "/etc/rspamd/local.d/local_networks.inc"; + +dns { + nameserver = ["127.0.0.1:53:10"]; +} 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 = ""; + +password = ""; + diff --git a/server/conf/rspamd_users.conf.master b/server/conf/rspamd_users.conf.master deleted file mode 100644 index 73d437d6cbdd3a7292af84855364cdfee7de977a..0000000000000000000000000000000000000000 --- a/server/conf/rspamd_users.conf.master +++ /dev/null @@ -1,43 +0,0 @@ -settings { - authenticated { - priority = 10; - authenticated = yes; - #apply "default" { groups_disabled = ["rbl", "spf"]; } - apply "default" { - #symbols_enabled = []; - symbols_disabled = []; - #groups_enabled = []; - groups_disabled = ["rbl"]; - } - } - whitelist { - priority = 10; - rcpt = "postmaster"; - rcpt = "hostmaster"; - rcpt = "abuse"; - want_spam = yes; - } - whitelist-ip { - priority = 10; - - ip = ""; - - - want_spam = yes; - } -# whitelist-timmehosting { -# priority = 20; -# from = "@xxx"; -# from = "@xxx"; -# want_spam = yes; -# } - whitelist-ca { - priority = 20; - from = "@comodo.com"; - from = "@geotrust.com"; - from = "@geotrusteurope.com"; - want_spam = yes; - } - .include(try=true; glob=true) "$LOCAL_CONFDIR/local.d/users/*.conf" - .include(try=true; priority=1,duplicate=merge) "$LOCAL_CONFDIR/local.d/users.local.conf" -} diff --git a/server/conf/rspamd_users.inc.conf.master b/server/conf/rspamd_users.inc.conf.master index 96ba9f08384f0c42fa398517f4e34ff301c83648..83dd5b27643143a94340d49a7c913ed191840ae3 100644 --- a/server/conf/rspamd_users.inc.conf.master +++ b/server/conf/rspamd_users.inc.conf.master @@ -38,9 +38,11 @@ actions { "rewrite subject" = ; + "add header" = null; "add header" = ; + "rewrite subject" = null; reject = ; diff --git a/server/conf/sieve_filter.master b/server/conf/sieve_filter.master index 13c08dd56b18987573c18fd1fe1aee432db17e44..5635b946aa8c2e3fed747f4543011ecc979c7415 100644 --- a/server/conf/sieve_filter.master +++ b/server/conf/sieve_filter.master @@ -1,39 +1,74 @@ -require ["fileinto", "regex", "date", "relational", "vacation", "imap4flags", "envelope", "subaddress", "copy", "reject"]; + +# This sieve script is generated by ISPConfig, any changes made will be overwritten. +# You can create and activate a per-user sieve script (manually or via managesieve), +# which will execute after this. + +require ["body", "copy", "date", "envelope", "fileinto", "imap4flags", "mailbox", "regex", "reject", "relational", "subaddress", "vacation", "variables"]; + + +# Move spam to spam folder +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; +} + # Send a copy of email to -redirect ""; +redirect :copy ""; - + + + + +# This sieve script is generated by ISPConfig, any changes made will be overwritten. +# You can create and activate a per-user sieve script (manually or via managesieve), +# which will execute before this. + +require ["body", "copy", "date", "envelope", "fileinto", "imap4flags", "mailbox", "regex", "reject", "relational", "subaddress", "vacation", "variables"]; + + # Move spam to spam folder -if anyof (header :contains "X-Spam-Flag" "YES", header :contains "X-Spam" "Yes", header :contains "subject" "*** SPAM ***", header :contains "subject" "***SPAM***") { - fileinto "Junk"; +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; } - - -keep; - ################################################################# # Autoreply ################################################################# # Move spam to spam folder -if anyof (header :contains "X-Spam-Flag" "YES", header :contains "X-Spam" "Yes", header :contains "subject" "*** SPAM ***", header :contains "subject" "***SPAM***") { - fileinto "Junk"; +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; } + + +if currentdate :value "ge" "iso8601" "" { + + +if currentdate :value "le" "iso8601" "" { + + vacation :days 1 :subject "" - # :addresses ["test@test.int", "till@test.int"] ""; - \ No newline at end of file + + +} + + +} + + + + diff --git a/server/conf/sieve_filter_1.2.master b/server/conf/sieve_filter_1.2.master deleted file mode 100644 index 5244693102ce0778964ce2e25b61c377b1b2bf8a..0000000000000000000000000000000000000000 --- a/server/conf/sieve_filter_1.2.master +++ /dev/null @@ -1,47 +0,0 @@ -require ["fileinto", "regex", "date", "relational", "vacation", "imap4flags", "envelope", "subaddress", "copy", "reject"]; - - -# Move spam to spam folder -if anyof (header :contains "X-Spam-Flag" "YES", header :contains "X-Spam" "Yes", header :contains "subject" "*** SPAM ***", header :contains "subject" "***SPAM***") { - fileinto "Junk"; - # Stop here so that we do not reply on spams - stop; -} - - - -# Send a copy of email to - -redirect ""; - - - - - -keep; - - -################################################################# -# Autoreply -################################################################# - -# Move spam to spam folder -if anyof (header :contains "X-Spam-Flag" "YES", header :contains "X-Spam" "Yes", header :contains "subject" "*** SPAM ***", header :contains "subject" "***SPAM***") { - # Stop here so that we do not reply on spams - stop; -} - - -if allof(currentdate :value "ge" "iso8601" "", currentdate :value "le" "iso8601" "") { - - -vacation :days 1 - :subject "" - - ""; - - -} - - - diff --git a/server/conf/vhost.conf.master b/server/conf/vhost.conf.master index e45634e9b208df0fd6a6a74fd1d4151dcfdf3167..f687bee839ba003cdbcaa195bd1cadbb0590a356 100644 --- a/server/conf/vhost.conf.master +++ b/server/conf/vhost.conf.master @@ -12,6 +12,18 @@ + + + + RemoteIPProxyProtocol On + + + + ProxyProtocol On + + + + DocumentRoot @@ -38,11 +50,13 @@ ServerAdmin webmaster@ - - Protocols h2 http/1.1 - SSLProtocol All -SSLv2 -SSLv3 - SSLCipherSuite 'EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS' - + + Protocols h2 http/1.1 + + + + AddOutputFilterByType BROTLI_COMPRESS text/html text/plain text/xml text/css text/javascript application/x-javascript application/javascript application/xml application/xml+rss application/atom+xml application/json application/x-font-ttf application/vnd.ms-fontobject image/x-icon + @@ -64,10 +78,10 @@ ErrorDocument 503 /error/503.html - + SSLEngine on - SSLProtocol All -SSLv2 -SSLv3 + SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1 # SSLCipherSuite ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS SSLHonorCipherOrder on # @@ -76,17 +90,17 @@ SSLCertificateFile SSLCertificateKeyFile - SSLUseStapling on - SSLStaplingResponderTimeout 5 - SSLStaplingReturnResponderErrors off - - - - SSLCertificateChainFile + SSLUseStapling on + SSLStaplingResponderTimeout 5 + SSLStaplingReturnResponderErrors off + + + SSLCertificateChainFile + + + - - # Clear PHP settings of this website @@ -240,7 +254,9 @@ SetEnv TMP /tmp SetEnv TMPDIR /tmp SetEnv TEMP /tmp + php_admin_value sendmail_path "/usr/sbin/sendmail -t -i -fwebmaster@" + php_admin_value upload_tmp_dir /tmp php_admin_value session.save_path /tmp # PHPIniDir @@ -360,18 +376,22 @@ - SetHandler php-fcgi + + SetHandler php-fcgi + - SetHandler php-fcgi + + SetHandler php-fcgi + Action php-fcgi /php-fcgi virtual Alias /php-fcgi {tmpl_var name='document_root'}/cgi-bin/php-fcgi-{tmpl_var name='ip_address'}-{tmpl_var name='port'}-{tmpl_var name='domain'} - FastCgiExternalServer {tmpl_var name='document_root'}/cgi-bin/php-fcgi-{tmpl_var name='ip_address'}-{tmpl_var name='port'}-{tmpl_var name='domain'} -idle-timeout 300 -host 127.0.0.1: -pass-header Authorization -pass-header Content-Type + FastCgiExternalServer {tmpl_var name='document_root'}/cgi-bin/php-fcgi-{tmpl_var name='ip_address'}-{tmpl_var name='port'}-{tmpl_var name='domain'} -idle-timeout 300 -host 127.0.0.1: -pass-header Authorization -pass-header Content-Type FastCgiExternalServer {tmpl_var name='document_root'}/cgi-bin/php-fcgi-{tmpl_var name='ip_address'}-{tmpl_var name='port'}-{tmpl_var name='domain'} -idle-timeout 300 -socket -pass-header Authorization -pass-header Content-Type @@ -388,17 +408,35 @@ #ProxyPassMatch ^/(.*\.php[345]?(/.*)?)$ fcgi://127.0.0.1:/$1 + + + + SetHandler "proxy:fcgi://127.0.0.1:" + + + + SetHandler "proxy:fcgi://127.0.0.1:" + #ProxyPassMatch ^/(.*\.php[345]?(/.*)?)$ unix://|fcgi://localhost//$1 + + + + SetHandler "proxy:unix:|fcgi://localhost" + + + + SetHandler "proxy:unix:|fcgi://localhost" + @@ -493,9 +531,16 @@ RewriteCond %{REQUEST_URI} !^/php-fcgi/ RewriteCond %{REQUEST_URI} !^ - + + + + SSLProxyEngine On + + + + RewriteRule ^/(.*)$ $1 - + diff --git a/server/cron.php b/server/cron.php index ef13d06e2f3b072c4d806db6f236325e25153339..0fe1dfc6cfbaf380b49a8780708080fe884bc4dc 100644 --- a/server/cron.php +++ b/server/cron.php @@ -128,6 +128,6 @@ $app->services->processDelayedActions(); @unlink($conf['temppath'] . $conf['fs_div'] . '.ispconfig_cron_lock'); $app->log('Remove Lock: ' . $conf['temppath'] . $conf['fs_div'] . '.ispconfig_cron_lock', LOGLEVEL_DEBUG); -if($conf['log_priority'] <= LOGLEVEL_DEBUG) die("finished.\n"); +if($conf['log_priority'] <= LOGLEVEL_DEBUG) die("finished cron run.\n"); ?> diff --git a/server/cron.sh b/server/cron.sh index 98f0ddfd30d4443382e0b77a5d1a9145bb503544..05fa10ef0d5c96a8d50d88b9e0cf0c1ca665084e 100644 --- a/server/cron.sh +++ b/server/cron.sh @@ -10,7 +10,7 @@ if [ -f /usr/local/ispconfig/server/lib/php.ini ]; then fi cd /usr/local/ispconfig/server -/usr/bin/php -q \ +$(which php) -q \ -d disable_classes= \ -d disable_functions= \ -d open_basedir= \ diff --git a/server/cron_debug.php b/server/cron_debug.php index 74065f02c43fb1fcf970810c6607edd40cbdbd63..568cfd641399bf94cf43d507e72a0fe45182bbcc 100644 --- a/server/cron_debug.php +++ b/server/cron_debug.php @@ -52,7 +52,7 @@ if(isset($cmd_opt['cronjob']) && is_file($path.'/'.$cmd_opt['cronjob'])) { // Cronjob that shell be run $cronjob_file = $cmd_opt['cronjob']; } else { - die('Usage example: php cron_debug.php --cronjob=100-mailbox_stats.inc.php'); + die('Usage example: php cron_debug.php --cronjob=100-mailbox_stats.inc.php'."\n"); } // Load and run the cronjob @@ -63,6 +63,6 @@ $class_name = 'cronjob_' . $name; $cronjob = new $class_name(); $cronjob->run(true); -die("finished.\n"); +die("finished cron debug.\n"); ?> diff --git a/server/lib/app.inc.php b/server/lib/app.inc.php index 146f2465c066813216796646c2dad553b1590062..b6adb3a1027c40e0a18a47bf496f3def0835ffa0 100644 --- a/server/lib/app.inc.php +++ b/server/lib/app.inc.php @@ -1,7 +1,6 @@ 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 { @@ -63,14 +92,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); } @@ -84,34 +118,68 @@ class app { trigger_error('Undefined property ' . $name . ' of class app', E_USER_WARNING); } } - + + /** + * 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; - + if($this->_calling_script == 'server') { @unlink($conf['temppath'] . $conf['fs_div'] . '.ispconfig_lock'); } 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; } } @@ -119,64 +187,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. @@ -194,13 +317,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'] != '') { - // send notification to admin - $mailBody = $log_msg; - $mailSubject = substr($log_msg, 0, 50).'...'; + if($conf['hostname'] != 'localhost' && $conf['hostname'] != '') { + $hostname = $conf['hostname']; + } else { + $hostname = exec('hostname -f'); + } + // Send notification to admin. + $mailBody = $hostname . " - " . $log_msg; + $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"; @@ -209,26 +337,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 new file mode 100644 index 0000000000000000000000000000000000000000..2b6d21e57e3ad5501d69dc1ad83f55fdf2693c1b --- /dev/null +++ b/server/lib/classes/backup.inc.php @@ -0,0 +1,2280 @@ + + * @author Jorge Muñoz (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 + * @see backup::restoreBackupWebFiles() to restore web files + */ +class backup +{ + /** + * Returns file extension for specified backup format + * @param string $format backup format + * @return string|null + * @author Ramil Valitov + */ + 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 + */ + 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; + } + /** + * Checks whatever a backup mode is for a repository + * @param $mode Backup mode + * @return bool + * @author Jorge Muñoz + */ + 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 + * @param string $web_document_root + * @param string $web_user + * @author Ramil Valitov + */ + protected static function restoreFileOwnership($web_document_root, $web_user, $web_group) + { + global $app; + + $blacklist = array('bin', 'dev', 'etc', 'home', 'lib', 'lib32', 'lib64', 'log', 'opt', 'proc', 'net', 'run', 'sbin', 'ssl', 'srv', 'sys', 'usr', 'var'); + + $find_excludes = '-not -path "." -and -not -path "./web/stats/*"'; + + foreach ( $blacklist as $dir ) { + $find_excludes .= ' -and -not -path "./'.$dir.'" -and -not -path "./'.$dir.'/*"'; + } + + $app->log('Restoring permissions for ' . $web_document_root, LOGLEVEL_DEBUG); + $app->system->exec_safe('cd ? && find . '.$find_excludes.' -exec chown ?:? {} \;', $web_document_root, $web_user, $web_group); + + } + + /** + * Returns default backup format used in previous versions of ISPConfig + * @param string $backup_mode can be 'userzip' or 'rootgz' + * @param string $backup_type can be 'web' or 'mysql' + * @return string + * @author Ramil Valitov + */ + 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 ""; + } + + /** + * Restores a database backup. + * The backup directory must be mounted before calling this method. + * @param string $backup_format + * @param string $password password for encrypted backup or empty string if archive is not encrypted + * @param string $backup_dir + * @param string $filename + * @param string $backup_mode + * @param string $backup_type + * @return bool true if succeeded + * @see backup_plugin::mount_backup_dir() + * @author Ramil Valitov + * @author Jorge Muñoz + */ + public static function restoreBackupDatabase($backup_format, $password, $backup_dir, $filename, $backup_mode, $backup_type) + { + global $app; + + //* Load sql dump into db + include 'lib/mysql_clientdb.conf'; + if (self::backupModeIsRepos($backup_mode)) { + + $backup_archive = $filename; + + preg_match('@^(manual-)?db_(?P.+)_\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); + + preg_match('@^(manual-)?db_(?P.+)_\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); + $db_name = null; + } else { + $db_name = $matches['db']; + } + + 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 + $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; + } + } + if (!empty($command)) { + /** @var string $clientdb_host */ + /** @var string $clientdb_user */ + /** @var string $clientdb_password */ + $app->system->exec_safe($command, $full_filename, $clientdb_host, $clientdb_user, $clientdb_password, $db_name); + $retval = $app->system->last_exec_retcode(); + if ($retval == 0) { + $app->log('Restored MySQL backup ' . $full_filename, LOGLEVEL_DEBUG); + $success = true; + } else { + $app->log('Failed to restore MySQL backup ' . $full_filename . ', exit code ' . $retval, LOGLEVEL_ERROR); + } + } + } + unset($clientdb_host); + unset($clientdb_user); + unset($clientdb_password); + + return $success; + } + + /** + * Restores web files backup. + * The backup directory must be mounted before calling this method. + * @param string $backup_format + * @param string $password password for encrypted backup or empty string if archive is not encrypted + * @param string $backup_dir + * @param string $filename + * @param string $backup_mode + * @param string $backup_type + * @param string $web_root + * @param string $web_user + * @param string $web_group + * @return bool true if succeed + * @see backup_plugin::mount_backup_dir() + * @author Ramil Valitov + * @author Jorge Muñoz + */ + public static function restoreBackupWebFiles($backup_format, $password, $backup_dir, $filename, $backup_mode, $backup_type, $web_root, $web_user, $web_group) + { + global $app; + + $result = false; + + $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); + } + + } elseif ($backup_mode == 'userzip' || $backup_mode == 'rootgz') { + + 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 . " 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); + //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) { + //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('Archive test failed for ' . $full_filename, 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); + } + } + } else { + $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 + */ + 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.+)_\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 + */ + 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.+)_\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 + * @return false|string + * @author Ramil Valitov + */ + protected static function getCompressionMethod($format) + { + $pos = strrpos($format, "_"); + return substr($format, $pos + 1); + } + + /** + * Returns default options for compressing rar + * @param string $backup_tmp temporary directory that rar can use + * @param string|null $password backup password if any + * @return string options for rar + */ + protected static function getRarOptions($backup_tmp, $password) + { + /** + * All rar options are listed here: + * https://documentation.help/WinRAR/HELPCommands.htm + * https://documentation.help/WinRAR/HELPSwitches.htm + * Some compression profiles and different versions of rar may use different default values, so it's better + * to specify everything explicitly. + * The difference between compression methods is not big in terms of file size, but is huge in terms of + * CPU and RAM consumption. Therefore it makes sense only to use fastest the compression method. + */ + $options = array( + /** + * Start with fastest compression method (least compressive) + */ + '-m1', + + /** + * Disable solid archiving. + * Never use solid archive: it's very slow and requires to read and sort all files first + */ + '-S-', + + /** + * Ignore default profile and environment variables + * https://documentation.help/WinRAR/HELPSwCFGm.htm + */ + '-CFG-', + + /** + * Disable error messages output + * https://documentation.help/WinRAR/HELPSwINUL.htm + */ + '-inul', + + /** + * Lock archive: this switch prevents any further archive modifications by rar + * https://documentation.help/WinRAR/HELPSwK.htm + */ + '-k', + + /** + * Create archive in RAR 5.0 format + * https://documentation.help/WinRAR/HELPSwMA.htm + */ + '-ma', + + /** + * Set dictionary size to 16Mb. + * When archiving, rar needs about 6x memory of specified dictionary size. + * https://documentation.help/WinRAR/HELPSwMD.htm + */ + '-md16m', + + /** + * Use only one CPU thread + * https://documentation.help/WinRAR/HELPSwMT.htm + */ + '-mt1', + + /** + * Use this switch when archiving to save file security information and when extracting to restore it. + * It stores file owner, group, file permissions and audit information. + * https://documentation.help/WinRAR/HELPSwOW.htm + */ + '-ow', + + /** + * Overwrite all + * https://documentation.help/WinRAR/HELPSwO.htm + */ + '-o+', + + /** + * Exclude base folder from names. + * Required for correct directory structure inside archive + * https://documentation.help/WinRAR/HELPSwEP1.htm + */ + '-ep1', + + /** + * Never add quick open information. + * This information is useful only if you want to read the contents of archive (list of files). + * Besides it can increase the archive size. As we need the archive only for future complete extraction, + * there's no need to use this information at all. + * https://documentation.help/WinRAR/HELPSwQO.htm + */ + '-qo-', + + /** + * Set lowest task priority (1) and 10ms sleep time between read/write operations. + * https://documentation.help/WinRAR/HELPSwRI.htm + */ + '-ri1:10', + + /** + * Temporary folder + * https://documentation.help/WinRAR/HELPSwW.htm + */ + '-w' . escapeshellarg($backup_tmp), + + /** + * Assume Yes on all queries + * https://documentation.help/WinRAR/HELPSwY.htm + */ + '-y', + ); + + $options = implode(" ", $options); + + if (!empty($password)) { + /** + * Encrypt both file data and headers + * https://documentation.help/WinRAR/HELPSwHP.htm + */ + $options .= ' -HP' . escapeshellarg($password); + } + return $options; + } + + /** + * Returns default options for decompressing rar + * @param string|null $password backup password if any + * @return string options for rar + */ + protected static function getUnRarOptions($password) + { + /** + * All rar options are listed here: + * https://documentation.help/WinRAR/HELPCommands.htm + * https://documentation.help/WinRAR/HELPSwitches.htm + * Some compression profiles and different versions of rar may use different default values, so it's better + * to specify everything explicitly. + * The difference between compression methods is not big in terms of file size, but is huge in terms of + * CPU and RAM consumption. Therefore it makes sense only to use fastest the compression method. + */ + $options = array( + /** + * Ignore default profile and environment variables + * https://documentation.help/WinRAR/HELPSwCFGm.htm + */ + '-CFG-', + + /** + * Disable error messages output + * https://documentation.help/WinRAR/HELPSwINUL.htm + */ + '-inul', + + /** + * Use only one CPU thread + * https://documentation.help/WinRAR/HELPSwMT.htm + */ + '-mt1', + + /** + * Use this switch when archiving to save file security information and when extracting to restore it. + * It stores file owner, group, file permissions and audit information. + * https://documentation.help/WinRAR/HELPSwOW.htm + */ + '-ow', + + /** + * Overwrite all + * https://documentation.help/WinRAR/HELPSwO.htm + */ + '-o+', + + /** + * Set lowest task priority (1) and 10ms sleep time between read/write operations. + * https://documentation.help/WinRAR/HELPSwRI.htm + */ + '-ri1:10', + + /** + * Assume Yes on all queries + * https://documentation.help/WinRAR/HELPSwY.htm + */ + '-y', + ); + + $options = implode(" ", $options); + + if (!empty($password)) { + $options .= ' -P' . escapeshellarg($password); + } + return $options; + } + + /** + * Returns compression options for 7z + * @param string $format compression format used in 7z + * @param string $password password if any + * @return string + */ + protected static function get7zCompressOptions($format, $password) + { + $method = self::getCompressionMethod($format); + /** + * List of 7z options is here: + * https://linux.die.net/man/1/7z + * https://sevenzip.osdn.jp/chm/cmdline/syntax.htm + * https://sevenzip.osdn.jp/chm/cmdline/switches/ + */ + $options = array( + /** + * Use 7z format (container) + */ + '-t7z', + + /** + * Compression method (LZMA, LZMA2, etc.) + * https://sevenzip.osdn.jp/chm/cmdline/switches/method.htm + */ + '-m0=' . $method, + + /** + * Fastest compression method + */ + '-mx=1', + + /** + * Disable solid mode + */ + '-ms=off', + + /** + * Disable multithread mode, use less CPU + */ + '-mmt=off', + + /** + * Disable multithread mode for filters, use less CPU + */ + '-mmtf=off', + + /** + * Disable progress indicator + */ + '-bd', + + /** + * Assume yes on all queries + * https://sevenzip.osdn.jp/chm/cmdline/switches/yes.htm + */ + '-y', + ); + $options = implode(" ", $options); + switch (strtoupper($method)) { + case 'LZMA': + case 'LZMA2': + /** + * Dictionary size is 5Mb. + * 7z can use 12 times more RAM + */ + $options .= ' -md=5m'; + break; + case 'PPMD': + /** + * Dictionary size is 64Mb. + * It's the maximum RAM that 7z is allowed to use. + */ + $options .= ' -mmem=64m'; + break; + } + if (!empty($password)) { + $options .= ' -mhe=on -p' . escapeshellarg($password); + } + return $options; + } + + /** + * Returns decompression options for 7z + * @param string $password password if any + * @return string + */ + protected static function get7zDecompressOptions($password) + { + /** + * List of 7z options is here: + * https://linux.die.net/man/1/7z + * https://sevenzip.osdn.jp/chm/cmdline/syntax.htm + * https://sevenzip.osdn.jp/chm/cmdline/switches/ + */ + $options = array( + /** + * Disable multithread mode, use less CPU + */ + '-mmt=off', + + /** + * Disable progress indicator + */ + '-bd', + + /** + * Assume yes on all queries + * https://sevenzip.osdn.jp/chm/cmdline/switches/yes.htm + */ + '-y', + ); + $options = implode(" ", $options); + if (!empty($password)) { + $options .= ' -p' . escapeshellarg($password); + } + 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 + */ + 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 + */ + 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. + * @param integer $server_id + * @param integer $web_id id of the website + * @param integer $max_backup_copies number of backup copies to keep, all files beyond the limit will be erased + * @param string $backup_dir directory to scan + * @return bool + * @see backup_plugin::backups_garbage_collection() call this method first + * @see backup_plugin::mount_backup_dir() + * @author Ramil Valitov + * @author Jorge Muñoz + */ + protected static function clearBackups($server_id, $web_id, $max_backup_copies, $backup_dir, $prefix_list=null) + { + global $app; + + $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); + + 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); + } + } + 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. + * @param int $server_id + * @param string|null $backup_type if defined then process only backups of this type + * @param string|null $domain_id if defined then process only backups that belong to this domain + * @author Ramil Valitov + * @see backup_plugin::mount_backup_dir() + */ + protected static function backups_garbage_collection($server_id, $backup_type = null, $domain_id = null) + { + global $app; + + //First check that all records in database have related files and delete records without files on disk + $args_sql = array(); + $args_sql_domains = array(); + $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 = ? 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); + array_push($args_sql_domains, $server_id); + array_push($args_sql_domains_with_backups, $server_id); + if (!empty($backup_type)) { + $sql .= " AND backup_type = ?"; + array_push($args_sql, $backup_type); + array_push($args_sql_domains_with_backups, $backup_type); + } + if (!empty($domain_id)) { + $sql .= " AND parent_domain_id = ?"; + $sql_domains .= " AND domain_id = ?"; + $sql_domains_with_backups .= " AND domain_id = ?"; + array_push($args_sql, $domain_id); + array_push($args_sql_domains, $domain_id); + array_push($args_sql_domains_with_backups, $domain_id); + } + + $db_list = array($app->db); + if ($app->db->dbHost != $app->dbmaster->dbHost) + array_push($db_list, $app->dbmaster); + + // 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) { + $backup_file = $backup_dir . '/web' . $backup['parent_domain_id'] . '/' . $backup['filename']; + if (!is_file($backup_file)) { + $app->log('Backup file ' . $backup_file . ' does not exist on disk, deleting this entry from database', LOGLEVEL_DEBUG); + $sql = "DELETE FROM web_backup WHERE backup_id = ?"; + $db->query($sql, $backup['backup_id']); + } + } + } + + // 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']; + $domain_backup_dir = $backup_dir . '/web' . $domain_id; + $files = self::get_files($domain_backup_dir); + + 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(); + foreach ($db_list as $db) { + $backups = $db->queryAllRecords($sql, $domain_id); + foreach ($backups as $backup) { + if (!in_array($backup['filename'],$files)) { + $untracked_backup_files[] = $backup['filename']; + } + } + } + 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); + } + } + } + + // 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']; + $domain_backup_dir = $backup_dir . '/web' . $domain_id; + + // Remove backupdir symlink and create as directory instead + if (is_link($backup_download_dir) || !is_dir($backup_download_dir)) { + $web_path = $rec['document_root']; + $app->system->web_folder_protection($web_path, false); + + $backup_download_dir = $web_path . '/backup'; + if (is_link($backup_download_dir)) { + unlink($backup_download_dir); + } + if (!is_dir($backup_download_dir)) { + mkdir($backup_download_dir); + chown($backup_download_dir, $rec['system_user']); + chgrp($backup_download_dir, $rec['system_group']); + } + + $app->system->web_folder_protection($web_path, true); + } + + // delete old files from backup download dir (/var/www/example.com/backup) + if (is_dir($backup_download_dir)) { + $dir_handle = dir($backup_download_dir); + $now = time(); + while (false !== ($entry = $dir_handle->read())) { + $full_filename = $backup_download_dir . '/' . $entry; + if ($entry != '.' && $entry != '..' && is_file($full_filename) && ! is_link($full_filename)) { + // delete files older than 3 days + if ($now - filemtime($full_filename) >= 60 * 60 * 24 * 3) { + $app->log('Backup file ' . $full_filename . ' is too old, deleting this file from disk', LOGLEVEL_DEBUG); + @unlink($full_filename); + } + } + } + $dir_handle->close(); + } + } + } + + 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 + * @param string[]|null $prefix_list filter files that have one of the prefixes. Use null for default filtering. + * @param string[]|null $endings_list filter files that have one of the endings. Use null for default filtering. + * @return string[] + * @author Ramil Valitov + */ + protected static function get_files($directory, $prefix_list = null, $endings_list = null) + { + $default_prefix_list = array( + 'web', + 'manual-web', + 'db_', + 'manual-db_', + ); + $default_endings_list = array( + '.gz', + '.7z', + '.rar', + '.zip', + '.xz', + '.bz2', + ); + if (is_null($prefix_list)) + $prefix_list = $default_prefix_list; + if (is_null($endings_list)) + $endings_list = $default_endings_list; + + if (!is_dir($directory)) { + return array(); + } + + $dir_handle = dir($directory); + $files = array(); + while (false !== ($entry = $dir_handle->read())) { + $full_filename = $directory . '/' . $entry; + if ($entry != '.' && $entry != '..' && is_file($full_filename)) { + 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 && !empty($endings_list)) { + $add = false; + foreach ($endings_list as $ending) { + if (substr($entry, -strlen($ending)) == $ending) { + $add = true; + break; + } + } + } + if ($add) + array_push($files, $entry); + } + } + $dir_handle->close(); + + 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 + */ + 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 + * @param string $arg + * @param string $pre + * @param string $post + * @return string + * @author Ramil Valitov + */ + protected static function generateExcludeList($backup_excludes, $arg, $pre='', $post='') + { + $excludes = ""; + foreach ($backup_excludes as $ex) { + # pass through escapeshellarg if not already done + if ( preg_match( "/^'.+'$/", $ex ) ) { + $excludes .= "${arg}${pre}${ex}${post} "; + } else { + $excludes .= "${arg}" . escapeshellarg("${pre}${ex}${post}") . " "; + } + } + + return trim( $excludes ); + } + + /** + * Runs a web compression routine + * @param string $format + * @param string[] $backup_excludes + * @param string $backup_mode + * @param string $web_path + * @param string $web_backup_dir + * @param string $web_backup_file + * @param string $web_user + * @param string $web_group + * @param string $http_server_user + * @param string $backup_tmp + * @param string|null $password + * @return bool true if success + * @author Ramil Valitov + */ + protected static function runWebCompression($format, $backup_excludes, $backup_mode, $web_path, $web_backup_dir, $web_backup_file, $web_user, $web_group, $http_server_user, $backup_tmp, $password) + { + global $app; + + $find_user_files = 'cd ? && sudo -u ? find . -group ? -or -user ? -print 2> /dev/null'; + $excludes = self::generateExcludeList($backup_excludes, '--exclude='); + $tar_dir = 'tar pcf - ' . $excludes . ' --directory ? .'; + $tar_input = 'tar pcf --null -T -'; + + $app->log('Performing web files backup of ' . $web_path . ' in format ' . $format . ', mode ' . $backup_mode, LOGLEVEL_DEBUG); + switch ($format) { + case 'tar_gzip': + if ($app->system->is_installed('pigz')) { + //use pigz + if ($backup_mode == 'user_zip') { + $app->system->exec_safe($find_user_files . ' | ' . $tar_input . ' | pigz > ?', $web_path, $web_user, $web_group, $http_server_user, $web_path, $web_backup_dir . '/' . $web_backup_file); + } else { + //Standard casual behaviour of ISPConfig + $app->system->exec_safe($tar_dir . ' | pigz > ?', $web_path, $web_backup_dir . '/' . $web_backup_file); + } + $exit_code = $app->system->last_exec_retcode(); + return $exit_code == 0; + } else { + //use gzip + if ($backup_mode == 'user_zip') { + $app->system->exec_safe($find_user_files . ' | tar pczf ? --null -T -', $web_path, $web_user, $web_group, $http_server_user, $web_backup_dir . '/' . $web_backup_file); + } else { + //Standard casual behaviour of ISPConfig + $app->system->exec_safe('tar pczf ? ' . $excludes . ' --directory ? .', $web_backup_dir . '/' . $web_backup_file, $web_path); + } + $exit_code = $app->system->last_exec_retcode(); + // tar can return 1 and still create valid backups + return ($exit_code == 0 || $exit_code == 1); + } + case 'zip': + case 'zip_bzip2': + $zip_options = ($format === 'zip_bzip2') ? ' -Z bzip2 ' : ''; + if (!empty($password)) { + $zip_options .= ' --password ' . escapeshellarg($password); + } + $excludes = self::generateExcludeList($backup_excludes, '-x '); + $excludes .= " " . self::generateExcludeList($backup_excludes, '-x ', '', '/*'); + if ($backup_mode == 'user_zip') { + //Standard casual behaviour of ISPConfig + $app->system->exec_safe($find_user_files . ' | zip ' . $zip_options . ' -b ? --symlinks ? -@ ' . $excludes, $web_path, $web_user, $web_group, $http_server_user, $backup_tmp, $web_backup_dir . '/' . $web_backup_file); + } else { + //Use cd to have a correct directory structure inside the archive, zip current directory "." to include hidden (dot) files + $app->system->exec_safe('cd ? && zip ' . $zip_options . ' -b ? --symlinks -r ? . ' . $excludes, $web_path, $backup_tmp, $web_backup_dir . '/' . $web_backup_file); + } + $exit_code = $app->system->last_exec_retcode(); + // zip can return 12(due to harmless warnings) and still create valid backups + return ($exit_code == 0 || $exit_code == 12); + case 'tar_bzip2': + if ($backup_mode == 'user_zip') { + $app->system->exec_safe($find_user_files . ' | tar pcjf ? --null -T -', $web_path, $web_user, $web_group, $http_server_user, $web_backup_dir . '/' . $web_backup_file); + } else { + $app->system->exec_safe('tar pcjf ? ' . $excludes . ' --directory ? .', $web_backup_dir . '/' . $web_backup_file, $web_path); + } + $exit_code = $app->system->last_exec_retcode(); + // tar can return 1 and still create valid backups + return ($exit_code == 0 || $exit_code == 1); + case 'tar_xz': + if ($backup_mode == 'user_zip') { + $app->system->exec_safe($find_user_files . ' | tar pcJf ? --null -T -', $web_path, $web_user, $web_group, $http_server_user, $web_backup_dir . '/' . $web_backup_file); + } else { + $app->system->exec_safe('tar pcJf ? ' . $excludes . ' --directory ? .', $web_backup_dir . '/' . $web_backup_file, $web_path); + } + $exit_code = $app->system->last_exec_retcode(); + // tar can return 1 and still create valid backups + return ($exit_code == 0 || $exit_code == 1); + case 'rar': + $options = self::getRarOptions($backup_tmp,$password); + if ($backup_mode != 'user_zip') { + //Recurse subfolders, otherwise we will pass a list of files to compress + $options .= ' -r'; + } + $excludes = self::generateExcludeList($backup_excludes, '-x'); + $zip_command = 'rar a ' . $options . ' '.$excludes.' ?'; + if ($backup_mode == 'user_zip') { + $app->system->exec_safe($find_user_files . ' | ' . $zip_command . ' ? @', $web_path, $web_user, $web_group, $http_server_user, $web_path, $web_backup_dir . '/' . $web_backup_file); + } else { + $app->system->exec_safe('cd ? && ' . $zip_command . ' .', $web_path, $web_backup_dir . '/' . $web_backup_file); + } + $exit_code = $app->system->last_exec_retcode(); + return ($exit_code == 0 || $exit_code == 1); + } + if (strpos($format, "tar_7z_") === 0) { + $options = self::get7zCompressOptions($format, $password); + $zip_command = '7z a ' . $options . ' -si ?'; + if ($backup_mode == 'user_zip') { + $app->system->exec_safe($find_user_files . ' | ' . $tar_input . ' | '. $zip_command, $web_path, $web_user, $web_group, $http_server_user, $web_path, $web_backup_dir . '/' . $web_backup_file); + } else { + $app->system->exec_safe($tar_dir . ' | ' . $zip_command, $web_path, $web_backup_dir . '/' . $web_backup_file); + } + $exit_code = $app->system->last_exec_retcode(); + return $exit_code == 0; + } + return false; + } + + /** + * Runs a database compression routine + * @param string $format + * @param string $db_backup_dir + * @param string $db_backup_file + * @param string $compressed_backup_file + * @param string $backup_tmp + * @param string|null $password + * @return bool true if success + * @author Ramil Valitov + */ + protected static function runDatabaseCompression($format, $db_backup_dir, $db_backup_file, $compressed_backup_file, $backup_tmp, $password) + { + global $app; + + $app->log('Performing database backup to file ' . $compressed_backup_file . ' in format ' . $format, LOGLEVEL_DEBUG); + switch ($format) { + case 'gzip': + if ($app->system->is_installed('pigz')) { + //use pigz + $zip_cmd = 'pigz'; + } else { + //use gzip + $zip_cmd = 'gzip'; + } + $app->system->exec_safe($zip_cmd . " -c ? > ?", $db_backup_dir . '/' . $db_backup_file, $db_backup_dir . '/' . $compressed_backup_file); + $exit_code = $app->system->last_exec_retcode(); + return $exit_code == 0; + case 'zip': + case 'zip_bzip2': + $zip_options = ($format === 'zip_bzip2') ? ' -Z bzip2 ' : ''; + if (!empty($password)) { + $zip_options .= ' --password ' . escapeshellarg($password); + } + $app->system->exec_safe('zip ' . $zip_options . ' -j -b ? ? ?', $backup_tmp, $db_backup_dir . '/' . $compressed_backup_file, $db_backup_dir . '/' . $db_backup_file); + $exit_code = $app->system->last_exec_retcode(); + // zip can return 12(due to harmless warnings) and still create valid backups + return ($exit_code == 0 || $exit_code == 12); + case 'bzip2': + $app->system->exec_safe("bzip2 -q -c ? > ?", $db_backup_dir . '/' . $db_backup_file, $db_backup_dir . '/' . $compressed_backup_file); + $exit_code = $app->system->last_exec_retcode(); + return $exit_code == 0; + case 'xz': + $app->system->exec_safe("xz -q -q -c ? > ?", $db_backup_dir . '/' . $db_backup_file, $db_backup_dir . '/' . $compressed_backup_file); + $exit_code = $app->system->last_exec_retcode(); + return $exit_code == 0; + case 'rar': + $options = self::getRarOptions($backup_tmp, $password); + $zip_command = 'rar a ' . $options . ' ? ?'; + $app->system->exec_safe($zip_command, $db_backup_dir . '/' . $compressed_backup_file, $db_backup_dir . '/' . $db_backup_file); + $exit_code = $app->system->last_exec_retcode(); + return ($exit_code == 0 || $exit_code == 1); + } + if (strpos($format, "7z_") === 0) { + $options = self::get7zCompressOptions($format, $password); + $zip_command = '7z a ' . $options . ' ? ?'; + $app->system->exec_safe($zip_command, $db_backup_dir . '/' . $compressed_backup_file, $db_backup_dir . '/' . $db_backup_file); + $exit_code = $app->system->last_exec_retcode(); + return $exit_code == 0; + } + return false; + } + + /** + * Mounts the backup directory if required + * @param int $server_id + * @return bool true if success + * @author Ramil Valitov + * @see backup_plugin::unmount_backup_dir() + */ + public static function mount_backup_dir($server_id) + { + global $app; + + $server_config = $app->getconf->get_server_config($server_id, 'server'); + if ($server_config['backup_dir_is_mount'] == 'y') + return $app->system->mount_backup_dir($server_config['backup_dir']); + return true; + } + + /** + * Unmounts the backup directory if required + * @param int $server_id + * @return bool true if success + * @author Ramil Valitov + * @see backup_plugin::mount_backup_dir() + */ + public static function unmount_backup_dir($server_id) + { + global $app; + + $server_config = $app->getconf->get_server_config($server_id, 'server'); + if ($server_config['backup_dir_is_mount'] == 'y') + return $app->system->umount_backup_dir($server_config['backup_dir']); + return true; + } + + /** + * Makes backup of database. + * The backup directory must be mounted before calling this method. + * This method is for private use only, don't call this method unless you know what you're doing. + * @param array $web_domain + * @param string $backup_job type of backup job: manual or auto + * @return bool true if success + * @author Ramil Valitov + * @author Jorge Muñoz + * @see backup_plugin::run_backup() recommeneded to use if you need to make backups + */ + protected static function make_database_backup($web_domain, $backup_job) + { + global $app; + + $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; + $success = false; + + if (empty($backup_job)) + $backup_job = "auto"; + + $records = $app->dbmaster->queryAllRecords("SELECT * FROM web_database WHERE server_id = ? AND parent_domain_id = ?", $server_id, $domain_id); + if (empty($records)){ + $app->log('Skipping database backup for domain ' . $web_domain['domain_id'] . ', because no related databases found.', LOGLEVEL_DEBUG); + return true; + } + + self::prepare_backup_dir($server_id, $web_domain); + + include '/usr/local/ispconfig/server/lib/mysql_clientdb.conf'; + + //* Check mysqldump capabilities + exec('mysqldump --help', $tmp); + $mysqldump_routines = (strpos(implode($tmp), '--routines') !== false) ? '--routines' : ''; + unset($tmp); + + foreach ($records as $rec) { + 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_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 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(); + + //* 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); + } + + 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 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); + unset($clientdb_user); + unset($clientdb_password); + + return $success; + } + + /** + * Makes backup of web files. + * The backup directory must be mounted before calling this method. + * This method is for private use only, don't call this method unless you know what you're doing + * @param array $web_domain info about domain to backup, SQL record of table 'web_domain' + * @param string $backup_job type of backup job: manual or auto + * @return bool true if success + * @author Ramil Valitov + * @author Jorge Muñoz + * @see backup_plugin::mount_backup_dir() + * @see backup_plugin::run_backup() recommeneded to use if you need to make backups + */ + protected static function make_web_backup($web_domain, $backup_job) + { + global $app; + + $server_id = intval($web_domain['server_id']); + $domain_id = intval($web_domain['domain_id']); + $server_config = $app->getconf->get_server_config($server_id, 'server'); + $global_config = $app->getconf->get_global_config('sites'); + $backup_dir = trim($server_config['backup_dir']); + $backup_mode = $server_config['backup_mode']; + $backup_tmp = trim($server_config['backup_tmp']); + if (empty($backup_mode)) + $backup_mode = 'userzip'; + + $web_config = $app->getconf->get_server_config($server_id, 'web'); + $http_server_user = $web_config['user']; + + if (empty($backup_dir)) { + $app->log('Failed to make backup of web files for domain id ' . $domain_id . ' on server id ' . $server_id . ', because backup directory is not defined', LOGLEVEL_ERROR); + return false; + } + if (empty($backup_job)) + $backup_job = "auto"; + + $backup_format_web = $web_domain['backup_format_web']; + //Check if we're working with data saved in old version of ISPConfig + if (empty($backup_format_web)) { + $backup_format_web = 'default'; + } + if ($backup_format_web == 'default') { + $backup_format_web = self::getDefaultBackupFormat($backup_mode, 'web'); + } + $password = ($web_domain['backup_encrypt'] == 'y') ? trim($web_domain['backup_password']) : ''; + $backup_extension_web = self::getBackupWebExtension($backup_format_web); + if (empty($backup_extension_web)) { + $app->log('Failed to make backup of web files, because of unknown backup format ' . $backup_format_web . ' for website ' . $web_domain['domain'], LOGLEVEL_ERROR); + return false; + } + + $web_path = $web_domain['document_root']; + $web_user = $web_domain['system_user']; + $web_group = $web_domain['system_group']; + $web_id = $web_domain['domain_id']; + + 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', + ); + + $b_excludes = explode(',', trim($web_domain['backup_excludes'])); + if (is_array($b_excludes) && !empty($b_excludes)) { + foreach ($b_excludes as $b_exclude) { + $b_exclude = trim($b_exclude); + if ($b_exclude != '') { + array_push($backup_excludes, escapeshellarg($b_exclude)); + } + } + } + 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'; + + 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'; + + //Insert web backup record in database + $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 (?, ?, ?, ?, ?, ?, ?, ?, ?)"; + $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, $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'] . ' using path ' . $web_path . ' failed.', LOGLEVEL_ERROR); + } + } else { + $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', + ); + 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 + */ + 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 + */ + 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 + * @param array $domain_data + * @author Ramil Valitov + */ + protected static function prepare_backup_dir($server_id, $domain_data) + { + global $app; + + $server_config = $app->getconf->get_server_config($server_id, 'server'); + $global_config = $app->getconf->get_global_config('sites'); + + if (isset($server_config['backup_dir_ftpread']) && $server_config['backup_dir_ftpread'] == 'y') { + $backup_dir_permissions = 0755; + } else { + $backup_dir_permissions = 0750; + } + + $backup_dir = $server_config['backup_dir']; + + if (!is_dir($backup_dir)) { + mkdir($backup_dir, $backup_dir_permissions, true); + } else { + chmod($backup_dir, $backup_dir_permissions); + } + + $web_backup_dir = $backup_dir . '/web' . $domain_data['domain_id']; + if (!is_dir($web_backup_dir)) + mkdir($web_backup_dir, 0750); + chmod($web_backup_dir, 0750); + + $backup_username = 'root'; + $backup_group = 'root'; + + if ($global_config['backups_include_into_web_quota'] == 'y') { + $backup_username = $domain_data['system_user']; + $backup_group = $domain_data['system_group']; + } + chown($web_backup_dir, $backup_username); + chgrp($web_backup_dir, $backup_group); + } + + /** + * Makes a backup of website files or database. + * @param string|int $domain_id + * @param string $type backup type: web or mysql + * @param string $backup_job how the backup is initiated: manual or auto + * @param bool $mount if true, then the backup dir will be mounted and unmounted automatically + * @return bool returns true if success + * @author Ramil Valitov + */ + public static function run_backup($domain_id, $type, $backup_job, $mount = true) + { + global $app, $conf; + + $domain_id = intval($domain_id); + + $sql = "SELECT * FROM web_domain WHERE (type = 'vhost' OR type = 'vhostsubdomain' OR type = 'vhostalias') AND domain_id = ?"; + $rec = $app->dbmaster->queryOneRecord($sql, $domain_id); + if (empty($rec)) { + $app->log('Failed to make backup of type ' . $type . ', because no information present about requested domain id ' . $domain_id, LOGLEVEL_ERROR); + return false; + } + $server_id = intval($conf['server_id']); + + if ($mount && !self::mount_backup_dir($server_id)) { + $app->log('Failed to make backup of type ' . $type . ' for domain id ' . $domain_id . ', because failed to mount backup directory', LOGLEVEL_ERROR); + return false; + } + $ok = false; + + switch ($type) { + case 'web': + $ok = self::make_web_backup($rec, $backup_job); + break; + case 'mysql': + $rec['server_id'] = $server_id; + $ok = self::make_database_backup($rec, $backup_job); + break; + default: + $app->log('Failed to make backup, because backup type is unknown: ' . $type, LOGLEVEL_ERROR); + break; + } + if ($mount) + self::unmount_backup_dir($server_id); + return $ok; + } + + /** + * Runs backups of all websites that have backups enabled with respect to their backup interval settings + * @param int $server_id + * @param string $backup_job backup tupe: auto or manual + * @author Ramil Valitov + */ + public static function run_all_backups($server_id, $backup_job = "auto") + { + global $app; + + $server_id = intval($server_id); + + $sql = "SELECT * FROM web_domain WHERE server_id = ? AND (type = 'vhost' OR type = 'vhostsubdomain' OR type = 'vhostalias') AND active = 'y' AND backup_interval != 'none' AND backup_interval != ''"; + $domains = $app->dbmaster->queryAllRecords($sql, $server_id); + + if (!self::mount_backup_dir($server_id)) { + $app->log('Failed to run regular backups routine because failed to mount backup directory', LOGLEVEL_ERROR); + return; + } + self::backups_garbage_collection($server_id); + + $date_of_week = date('w'); + $date_of_month = date('d'); + foreach ($domains as $domain) { + if (($domain['backup_interval'] == 'daily' or ($domain['backup_interval'] == 'weekly' && $date_of_week == 0) or ($domain['backup_interval'] == 'monthly' && $date_of_month == '01'))) { + self::run_backup($domain['domain_id'], 'web', $backup_job, false); + } + } + + $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) { + if (($database['backup_interval'] == 'daily' or ($database['backup_interval'] == 'weekly' && $date_of_week == 0) or ($database['backup_interval'] == 'monthly' && $date_of_month == '01'))) { + self::run_backup($database['domain_id'], 'mysql', $backup_job, false); + } + } + self::unmount_backup_dir($server_id); + } +} + +?> diff --git a/server/lib/classes/cron.d/100-monitor_backup.inc.php b/server/lib/classes/cron.d/100-monitor_backup.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..b90290d7c3f70d9c0f73ea277672ddfa4e2684b2 --- /dev/null +++ b/server/lib/classes/cron.d/100-monitor_backup.inc.php @@ -0,0 +1,111 @@ +load('monitor_tools'); + $this->_tools = new monitor_tools(); + /* end global section for monitor cronjobs */ + + /* the id of the server as int */ + $server_id = intval($conf['server_id']); + + /** The type of the data */ + + + $type = 'backup_utils'; + + $missing_utils = array(); + $util_list = array( + 'borg', + 'gzip', + 'gunzip', + 'zip', + 'unzip', + 'pigz', + 'tar', + 'bzip2', + 'bunzip2', + 'xz', + 'unxz', + '7z', + 'rar', + ); + foreach ($util_list as $util) { + if (!$app->system->is_installed($util)) { + $missing_utils[] = $util; + } + } + + $res = array(); + $res['server_id'] = $server_id; + $res['type'] = $type; + $res['data'] = array('missing_utils' => $missing_utils); + $res['state'] = 'ok'; + + /* + * Insert the data into the database + */ + $sql = 'REPLACE INTO monitor_data (server_id, type, created, data, state) ' . + 'VALUES (?, ?, UNIX_TIMESTAMP(), ?, ?)'; + $app->dbmaster->query($sql, $res['server_id'], $res['type'], serialize($res['data']), $res['state']); + + /* The new data is written, now we can delete the old one */ + $this->_tools->delOldRecords($res['type'], $res['server_id']); + + parent::onRunJob(); + } + + /* this function is optional if it contains no custom code */ + public function onAfterRun() { + parent::onAfterRun(); + } + +} diff --git a/server/lib/classes/cron.d/100-monitor_cpu.inc.php b/server/lib/classes/cron.d/100-monitor_cpu.inc.php index f570eeb81913110d1d40482febee8879c02fd2d1..1d67be73704757262ae9f89f4078981cff037fba 100644 --- a/server/lib/classes/cron.d/100-monitor_cpu.inc.php +++ b/server/lib/classes/cron.d/100-monitor_cpu.inc.php @@ -78,7 +78,7 @@ class cronjob_monitor_cpu extends cronjob { $part = preg_split('/:/', $line); $key = trim($part[0]); - $value = trim($part[1]); + $value = (isset($part[1]))?trim($part[1]):''; if ($key == 'processor') $processor = intval($value); if ($key != '') diff --git a/server/lib/classes/cron.d/100-monitor_database_size.inc.php b/server/lib/classes/cron.d/100-monitor_database_size.inc.php index 97f12253717980eb1bdbdded76b211d2b7a64777..3f0abed70968ecf90bbfc92742b1f75dc9733e96 100644 --- a/server/lib/classes/cron.d/100-monitor_database_size.inc.php +++ b/server/lib/classes/cron.d/100-monitor_database_size.inc.php @@ -78,7 +78,7 @@ class cronjob_monitor_database_size extends cronjob { $state = 'ok'; /** Fetch the data of all databases into an array */ - $databases = $app->db->queryAllRecords("SELECT database_id, database_name, sys_groupid, database_quota, quota_exceeded FROM web_database WHERE server_id = ? GROUP BY sys_groupid, database_name ASC", $server_id); + $databases = $app->db->queryAllRecords("SELECT database_id, database_name, sys_groupid, database_quota, quota_exceeded FROM web_database WHERE server_id = ? ORDER BY sys_groupid, database_name ASC", $server_id); if(is_array($databases) && !empty($databases)) { @@ -95,12 +95,12 @@ class cronjob_monitor_database_size extends cronjob { if(!is_numeric($quota)) continue; if($quota < 1 || $quota > $data[$i]['size']) { - print 'database ' . $rec['database_name'] . ' size does not exceed quota: ' . ($quota < 1 ? 'unlimited' : $quota) . ' (quota) > ' . $data[$i]['size'] . " (used)\n"; + //print 'database ' . $rec['database_name'] . ' size does not exceed quota: ' . ($quota < 1 ? 'unlimited' : $quota) . ' (quota) > ' . $data[$i]['size'] . " (used)\n"; if($rec['quota_exceeded'] == 'y') { $app->dbmaster->datalogUpdate('web_database', array('quota_exceeded' => 'n'), 'database_id', $rec['database_id']); } } elseif($rec['quota_exceeded'] == 'n') { - print 'database ' . $rec['database_name'] . ' size exceeds quota: ' . $quota . ' (quota) < ' . $data[$i]['size'] . " (used)\n"; + //print 'database ' . $rec['database_name'] . ' size exceeds quota: ' . $quota . ' (quota) < ' . $data[$i]['size'] . " (used)\n"; $app->dbmaster->datalogUpdate('web_database', array('quota_exceeded' => 'y'), 'database_id', $rec['database_id']); } } diff --git a/server/lib/classes/cron.d/100-monitor_disk_usage.inc.php b/server/lib/classes/cron.d/100-monitor_disk_usage.inc.php index 1d03949a8cf1c7457fd9b7e96a51be5fe73b57f9..a3c3a3448fdb38287ec50f386e214ce3595f255d 100644 --- a/server/lib/classes/cron.d/100-monitor_disk_usage.inc.php +++ b/server/lib/classes/cron.d/100-monitor_disk_usage.inc.php @@ -83,7 +83,7 @@ class cronjob_monitor_disk_usage extends cronjob { * ignore the first line, process the rest */ for ($i = 1; $i <= sizeof($df); $i++) { - if ($df[$i] != '') { + if (isset($df[$i]) && $df[$i] != '') { /* * Make an array of the data */ diff --git a/server/lib/classes/cron.d/100-monitor_email_quota.inc.php b/server/lib/classes/cron.d/100-monitor_email_quota.inc.php index 8adf7c7253f37a0ba03edc09065da8a38c1468fd..40736a7bac8f976f922befecbcfab68073d22f84 100644 --- a/server/lib/classes/cron.d/100-monitor_email_quota.inc.php +++ b/server/lib/classes/cron.d/100-monitor_email_quota.inc.php @@ -79,30 +79,40 @@ class cronjob_monitor_email_quota extends cronjob { if(is_array($mailboxes)) { //* with dovecot we can use doveadm instead of 'du -s' - $dovecot = false; - if (isset($mail_config['pop3_imap_daemon']) && $mail_config ['pop3_imap_daemon'] = 'dovecot' && is_executable('doveadm')) { - exec('doveadm quota 2>&1', $tmp_output, $tmp_retval); // with dovecot 2.2.x 'doveadm quota' is unuseable - if ($retval = 64) $dovecot = true; + $dovecotQuotaUsage = array(); + if (isset($mail_config['pop3_imap_daemon']) && $mail_config ['pop3_imap_daemon'] = 'dovecot') { + exec("doveadm quota get -A 2>&1", $res, $retval); + if ($retval = 64) { + foreach ($res as $v) { + $s = preg_split('/\s+/', $v); + if ($s[2] == 'STORAGE') { + $dovecotQuotaUsage[$s[0]] = $s[3] * 1024; // doveadm output is in kB + } elseif ($s[3] == 'STORAGE') { + $dovecotQuotaUsage[$s[0]] = $s[4] * 1024; // doveadm output is in kB + } + } + } } foreach($mailboxes as $mb) { $email = $mb['email']; $email_parts = explode('@', $mb['email']); $filename = $mb['maildir'].'/.quotausage'; - if(!file_exists($filename) && $dovecot) { - $app->system->exec_safe('doveadm quota recalc -u ?', $email); - } - if(file_exists($filename) && !is_link($filename)) { + if(count($dovecotQuotaUsage) > 0 && isset($dovecotQuotaUsage[$email])) { + $data[$email]['used'] = $dovecotQuotaUsage[$email]; + $app->log("Mail storage $email: " . $data[$email]['used'], LOGLEVEL_DEBUG); + } elseif(file_exists($filename) && !is_link($filename)) { $quotafile = file($filename); preg_match('/storage.*?([0-9]+)/s', implode('',$quotafile), $storage_value); $data[$email]['used'] = $storage_value[1]; - $app->log("Mail storage $email: " . $storage_value[1], LOGLEVEL_DEBUG); + $app->log("Mail storage $email: " . $data[$email]['used'], LOGLEVEL_DEBUG); unset($quotafile); } else { $app->system->exec_safe('du -s ?', $mb['maildir']); $out = $app->system->last_exec_out(); $parts = explode(' ', $out[0]); $data[$email]['used'] = intval($parts[0])*1024; + $app->log("Mail storage $email: " . $data[$email]['used'], LOGLEVEL_DEBUG); unset($out); unset($parts); } @@ -110,6 +120,7 @@ class cronjob_monitor_email_quota extends cronjob { } unset($mailboxes); + unset($dovecotQuotaUsage); //* Dovecot quota check Courier in progress lathama@gmail.com /* @@ -132,8 +143,8 @@ class cronjob_monitor_email_quota extends cronjob { $res['state'] = $state; /* - * Insert the data into the database - */ + * Insert the data into the database + */ $sql = 'REPLACE INTO monitor_data (server_id, type, created, data, state) ' . 'VALUES (?, ?, UNIX_TIMESTAMP(), ?, ?)'; $app->dbmaster->query($sql, $res['server_id'], $res['type'], serialize($res['data']), $res['state']); diff --git a/server/lib/classes/cron.d/100-monitor_fail2ban.inc.php b/server/lib/classes/cron.d/100-monitor_fail2ban.inc.php index 5c4ba80561b222b6be12a1dc5f8f02951a91ab64..a25d5c710666ce802e1993ca8a6adb708dd1a3d8 100644 --- a/server/lib/classes/cron.d/100-monitor_fail2ban.inc.php +++ b/server/lib/classes/cron.d/100-monitor_fail2ban.inc.php @@ -67,10 +67,8 @@ class cronjob_monitor_fail2ban extends cronjob { $type = 'log_fail2ban'; /* This monitoring is only available if fail2ban is installed */ - system('which fail2ban-client', $retval); // Debian, Ubuntu, Fedora - if ($retval !== 0) - system('which fail2ban', $retval); // CentOS - if ($retval === 0) { + if ($app->system->is_installed('fail2ban-client') // Debian, Ubuntu, Fedora + || $app->system->is_installed('fail2ban')) { // CentOS /* Get the data of the log */ $data = $this->_tools->_getLogData($type); diff --git a/server/lib/classes/cron.d/100-monitor_hd_quota.inc.php b/server/lib/classes/cron.d/100-monitor_hd_quota.inc.php index a4971eb532df3a99c231c90d2e3952b334bed323..32a9c410e8fa4797da178e7e8f94f7cab13386ca 100644 --- a/server/lib/classes/cron.d/100-monitor_hd_quota.inc.php +++ b/server/lib/classes/cron.d/100-monitor_hd_quota.inc.php @@ -78,7 +78,7 @@ class cronjob_monitor_hd_quota extends cronjob { //* ignore the first 5 lines, process the rest for ($i = 5; $i <= sizeof($df); $i++) { - if ($df[$i] != '') { + if (isset($df[$i]) && $df[$i] != '') { //* Make a array of the data $s = preg_split('/[\s]+/', $df[$i]); $username = $s[0]; @@ -106,19 +106,19 @@ class cronjob_monitor_hd_quota extends cronjob { //* ignore the first 5 lines, process the rest for ($i = 5; $i <= sizeof($df); $i++) { - if ($df[$i] != '') { + if (isset($df[$i]) && $df[$i] != '') { //* Make a array of the data $s = preg_split('/[\s]+/', $df[$i]); $groupname = $s[0]; if (substr($groupname, 0, 6) == 'client') { if (isset($data['group'][$groupname])) { - $data['group'][$groupname]['used'] += $s[1]; - $data['group'][$groupname]['soft'] += $s[2]; - $data['group'][$groupname]['hard'] += $s[3]; + $data['group'][$groupname]['used'] += $s[2]; + $data['group'][$groupname]['soft'] += $s[3]; + $data['group'][$groupname]['hard'] += $s[4]; } else { - $data['group'][$groupname]['used'] = $s[1]; - $data['group'][$groupname]['soft'] = $s[2]; - $data['group'][$groupname]['hard'] = $s[3]; + $data['group'][$groupname]['used'] = $s[2]; + $data['group'][$groupname]['soft'] = $s[3]; + $data['group'][$groupname]['hard'] = $s[4]; } } } diff --git a/server/lib/classes/cron.d/100-monitor_iptables.inc.php b/server/lib/classes/cron.d/100-monitor_iptables.inc.php index 1ad11d9ecccdcbf690c3337524221aee62b431f8..cff0a73ac3747e1b0e1b867af5ca4a85e9a58179 100644 --- a/server/lib/classes/cron.d/100-monitor_iptables.inc.php +++ b/server/lib/classes/cron.d/100-monitor_iptables.inc.php @@ -67,8 +67,7 @@ class cronjob_monitor_iptables extends cronjob { $type = 'iptables_rules'; /* This monitoring is only available if fail2ban is installed */ - system('which iptables', $retval); // Debian, Ubuntu, Fedora - if ($retval === 0) { + if ($app->system->is_installed('iptables')) { /* Get the data of the log */ $data['output'] = '

    iptables -S (ipv4)

    '.shell_exec('iptables -S 2>/dev/null'); @@ -83,8 +82,7 @@ class cronjob_monitor_iptables extends cronjob { /* This monitoring is only available if fail2ban is installed */ - system('which ip6tables', $retval); // Debian, Ubuntu, Fedora - if ($retval === 0) { + if ($app->system->is_installed('ip6tables')) { /* Get the data of the log */ $data['output'] .= '

    ip6tables -S (ipv6)

    '.shell_exec('ip6tables -S 2>/dev/null'); diff --git a/server/lib/classes/cron.d/100-monitor_letsencrypt_log.inc.php b/server/lib/classes/cron.d/100-monitor_letsencrypt_log.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..166628114ca6c85c03fc867283524cf0bd19b56e --- /dev/null +++ b/server/lib/classes/cron.d/100-monitor_letsencrypt_log.inc.php @@ -0,0 +1,105 @@ +load('monitor_tools'); + $this->_tools = new monitor_tools(); + /* end global section for monitor cronjobs */ + + /* the id of the server as int */ + $server_id = intval($conf['server_id']); + + /** The type of the data */ + $type = 'log_letsencrypt'; + + /* Get the data of the log */ + $data = $this->_tools->_getLogData($type, 500); + + /* + * actually this info has no state. + * maybe someone knows better...???... + */ + $state = 'no_state'; + + /* + * Return the Result + */ + $res = array(); + $res['server_id'] = $server_id; + $res['type'] = $type; + $res['data'] = $data; + $res['state'] = $state; + + /* + * Insert the data into the database + */ + $sql = 'REPLACE INTO monitor_data (server_id, type, created, data, state) ' . + 'VALUES (?, ?, UNIX_TIMESTAMP(), ?, ?)'; + $app->dbmaster->query($sql, $res['server_id'], $res['type'], serialize($res['data']), $res['state']); + + /* The new data is written, now we can delete the old one */ + $this->_tools->delOldRecords($res['type'], $res['server_id']); + + parent::onRunJob(); + } + + /* this function is optional if it contains no custom code */ + public function onAfterRun() { + global $app; + + parent::onAfterRun(); + } +} +?> diff --git a/server/lib/classes/cron.d/100-monitor_mail_log.inc.php b/server/lib/classes/cron.d/100-monitor_mail_log.inc.php index 5c41105d3c7aadf3765f39b68beb5217d104c578..e7562f6bf1bed9ea54ef1c0e2f83ca7e90514179 100644 --- a/server/lib/classes/cron.d/100-monitor_mail_log.inc.php +++ b/server/lib/classes/cron.d/100-monitor_mail_log.inc.php @@ -67,7 +67,7 @@ class cronjob_monitor_mail_log extends cronjob { $type = 'log_mail'; /* Get the data of the log */ - $data = $this->_tools->_getLogData($type); + $data = $this->_tools->_getLogData($type, 500); /* * actually this info has no state. diff --git a/server/lib/classes/cron.d/100-monitor_mail_queue.inc.php b/server/lib/classes/cron.d/100-monitor_mail_queue.inc.php index b259904d55752c36407517f87aed98863161ba4c..f39dd00a6eea4c917980ba0a4f2cc7ae5e99f854 100644 --- a/server/lib/classes/cron.d/100-monitor_mail_queue.inc.php +++ b/server/lib/classes/cron.d/100-monitor_mail_queue.inc.php @@ -89,8 +89,8 @@ class cronjob_monitor_mail_queue extends cronjob { $tmp = explode("\n", $data['output']); $more = $tmp[sizeof($tmp) - 1]; $res = $this->_getIntArray($more); - $data['bytes'] = $res[0]; - $data['requests'] = $res[1]; + $data['bytes'] = (isset($res[0]))?$res[0]:0; + $data['requests'] = (isset($res[1]))?$res[1]:0; /** The state of the mailq. */ $state = 'ok'; diff --git a/server/lib/classes/cron.d/100-monitor_mem_usage.inc.php b/server/lib/classes/cron.d/100-monitor_mem_usage.inc.php index 73567478dc33cb2aee8f903ffe8358f45e460648..613287267df7e03752556c90887e93d6f0cb58c7 100644 --- a/server/lib/classes/cron.d/100-monitor_mem_usage.inc.php +++ b/server/lib/classes/cron.d/100-monitor_mem_usage.inc.php @@ -78,7 +78,7 @@ class cronjob_monitor_mem_usage extends cronjob { $key = trim($part[0]); $tmp = explode(' ', trim($part[1])); $value = 0; - if ($tmp[1] == 'kB') + if (isset($tmp[1]) && $tmp[1] == 'kB') $value = $tmp[0] * 1024; $data[$key] = $value; } diff --git a/server/lib/classes/cron.d/100-monitor_raid.inc.php b/server/lib/classes/cron.d/100-monitor_raid.inc.php index d1a9a53455c6a70e2efab0a561c1d7e21b1e6404..80ab29b6c36cb23c59c01ddc96f8ba2f9398e83a 100644 --- a/server/lib/classes/cron.d/100-monitor_raid.inc.php +++ b/server/lib/classes/cron.d/100-monitor_raid.inc.php @@ -126,8 +126,7 @@ class cronjob_monitor_raid extends cronjob { * Check, if we have mpt-status installed (LSIsoftware-raid) */ if (file_exists('/proc/mpt/summary')) { - system('which mpt-status', $retval); - if ($retval === 0) { + if ($app->system->is_installed('mpt-status')) { /* * Fetch the output */ @@ -174,8 +173,7 @@ class cronjob_monitor_raid extends cronjob { /* * 3ware Controller */ - system('which tw_cli', $retval); - if($retval === 0) { + if($app->system->is_installed('tw_cli')) { // TYPOWORX FIX | Determine Controler-ID $availableControlers = shell_exec('tw_cli info | grep -Eo "c[0-9]+"'); @@ -232,8 +230,7 @@ class cronjob_monitor_raid extends cronjob { /* * HP Proliant */ - system('which hpacucli', $retval); - if($retval === 0) { + if($app->system->is_installed('hpacucli')) { $state = 'ok'; $data['output'] = shell_exec('/usr/sbin/hpacucli ctrl all show config'); $tmp = explode("\n", $data['output']); @@ -278,10 +275,14 @@ class cronjob_monitor_raid extends cronjob { /* * LSI MegaRaid */ - system('which megacli', $retval); - system('which megacli64', $retval64); - if($retval === 0 || $retval64 === 0) { - $binary=@($retval === 0)?'megacli':'megacli64'; + $binary = FALSE; + if ($app->system->is_installed('megacli')) { + $binary = 'megacli'; + } + if ($app->system->is_installed('megacli64')) { + $binary = 'megacli64'; + } + if($binary) { $state = 'ok'; $data['output'] = shell_exec($binary.' -LDInfo -Lall -aAll -NoLog'); if (strpos($data['output'], 'Optimal') !== false) { @@ -298,8 +299,7 @@ class cronjob_monitor_raid extends cronjob { /* * Adaptec-RAID */ - system('which arcconf', $retval); - if($retval === 0) { + if($app->system->is_installed('arcconf')) { $state = 'ok'; $data['output'] = shell_exec('arcconf GETCONFIG 1 LD'); if(is_array($data['output'])) { diff --git a/server/lib/classes/cron.d/100-monitor_rkhunter.inc.php b/server/lib/classes/cron.d/100-monitor_rkhunter.inc.php index 43071b83872b26048266ba9250dff926c6997d95..5efb9420ec7065ba4a55bb2a4d4ba898d731b621 100644 --- a/server/lib/classes/cron.d/100-monitor_rkhunter.inc.php +++ b/server/lib/classes/cron.d/100-monitor_rkhunter.inc.php @@ -67,8 +67,7 @@ class cronjob_monitor_rkhunter extends cronjob { $type = 'rkhunter'; /* This monitoring is only available if rkhunter is installed */ - system('which rkhunter', $retval); - if ($retval === 0) { + if ($app->system->is_installed('rkhunter')) { /* * Fetch the output */ diff --git a/server/lib/classes/cron.d/100-monitor_system_update.inc.php b/server/lib/classes/cron.d/100-monitor_system_update.inc.php index 3d4ebf408e4fb5349646bca0b5bbe84ed8daf4b6..cab5f68edb0f7230d955da4c228f442a983db489 100644 --- a/server/lib/classes/cron.d/100-monitor_system_update.inc.php +++ b/server/lib/classes/cron.d/100-monitor_system_update.inc.php @@ -159,29 +159,42 @@ class cronjob_monitor_system_update extends cronjob { * Fetch the output */ $data['output'] = shell_exec('zypper lu'); + } elseif(file_exists('/etc/redhat-release')) { - /* - * update and find the upgrade. - * if there is any output, then there is a needed update + /* + * update and find the upgrade. + * if there is any output, then there is a needed update + */ + + /* try to figure out the default package manager first */ + if(file_exists('/usr/bin/dnf') && (is_link('/usr/bin/yum'))) { + $rhPkgMgr = 'dnf'; + } elseif(file_exists('/usr/bin/dnf') && (!file_exists('/usr/bin/yum'))) { + $rhPkgMgr = 'dnf'; + } else { + $rhPkgMgr = 'yum'; + } + + $aptData = shell_exec($rhPkgMgr. ' -q list updates'); + + if ($aptData == '') { + /* There is nothing to update! */ + $state = 'ok'; + } else { + /* + * There is something to update! this is in most cases not critical, so we can + * do a system-update once a month or so... + */ + $state = 'info'; + } + + /* + * Fetch the output */ - $aptData = shell_exec('yum -q list updates'); - if ($aptData == '') { - /* There is nothing to update! */ - $state = 'ok'; - } else { - /* - * There is something to update! this is in most cases not critical, so we can - * do a system-update once a month or so... - */ - $state = 'info'; - } - /* - * Fetch the output - */ - $data['output'] = shell_exec('yum -q list updates'); + $data['output'] = shell_exec($rhPkgMgr. ' -q list updates'); - } else { + } else { /* * It is not Debian/Ubuntu, so there is no data and no state * diff --git a/server/lib/classes/cron.d/150-awstats.inc.php b/server/lib/classes/cron.d/150-awstats.inc.php index 4ba286ea1aefba159c0ef3ea425af4cbac4959e4..225b3580737e6bacd73981009ccd2668d3f35aa1 100644 --- a/server/lib/classes/cron.d/150-awstats.inc.php +++ b/server/lib/classes/cron.d/150-awstats.inc.php @@ -60,7 +60,6 @@ class cronjob_awstats extends cronjob { $web_config = $app->getconf->get_server_config($conf['server_id'], 'web'); foreach($records as $rec) { - //$yesterday = date('Ymd',time() - 86400); $yesterday = date('Ymd', strtotime("-1 day", time())); $log_folder = 'log'; @@ -87,7 +86,14 @@ class cronjob_awstats extends cronjob { $awstats_conf_dir = $web_config['awstats_conf_dir']; $awstats_website_conf_file = $web_config['awstats_conf_dir'].'/awstats.'.$domain.'.conf'; - if(is_file($awstats_website_conf_file)) unlink($awstats_website_conf_file); + $existing_awstats_conf_array = array(); + if(is_file($awstats_website_conf_file)) { + $existing_awstats_conf = file($awstats_website_conf_file); + foreach ($existing_awstats_conf as $line) { + if(preg_match("/Lang=/",$line)) $existing_awstats_conf_array['Lang'] = implode('',parse_ini_string($line)); + } + unlink($awstats_website_conf_file); + } $sql = "SELECT domain FROM web_domain WHERE (type = 'alias' OR type = 'subdomain') AND parent_domain_id = ?"; $aliases = $app->db->queryAllRecords($sql, $rec['domain_id']); @@ -109,6 +115,8 @@ class cronjob_awstats extends cronjob { LogFile="/var/log/ispconfig/httpd/'.$domain.'/yesterday-access.log" SiteDomain="'.$domain.'" HostAliases="www.'.$domain.' localhost 127.0.0.1'.$aliasdomain.'"'; + if (array_key_exists('Lang',$existing_awstats_conf_array)) $awstats_conf_file_content .=' + Lang="'.$existing_awstats_conf_array['Lang'].'"'; if (isset($include_file)) { file_put_contents($awstats_website_conf_file, $awstats_conf_file_content); } else { @@ -135,10 +143,7 @@ class cronjob_awstats extends cronjob { } } - // awstats_buildstaticpages.pl -update -config=mydomain.com -lang=en -dir=/var/www/domain.com/'.$web_folder.'/stats -awstatsprog=/path/to/awstats.pl - // $command = "$awstats_buildstaticpages_pl -update -config='$domain' -lang=".$conf['language']." -dir='$statsdir' -awstatsprog='$awstats_pl'"; - - $command = escapeshellcmd($awstats_buildstaticpages_pl) . ' -month=' . escapeshellarg($awmonth) . ' -year=' . escapeshellarg($awyear) . ' -update -config=' . escapeshellarg($domain) . ' -lang=' . escapeshellarg($conf['language']) . ' -dir=' . escapeshellarg($statsdir) . ' -awstatsprog=' . escapeshellarg($awstats_pl); + $command = escapeshellcmd($awstats_buildstaticpages_pl) . ' -month=' . escapeshellarg($awmonth) . ' -year=' . escapeshellarg($awyear) . ' -update -config=' . escapeshellarg($domain) . ' -dir=' . escapeshellarg($statsdir) . ' -awstatsprog=' . escapeshellarg($awstats_pl); if (date("d") == 2) { $awmonth = date("m")-1; @@ -152,8 +157,13 @@ class cronjob_awstats extends cronjob { mkdir($statsdirold); } $files = scandir($statsdir); + + if (($key = array_search('index.php', $files)) !== false) { + unset($files[$key]); + } + foreach ($files as $file) { - if (substr($file, 0, 1) != "." && !is_dir("$statsdir"."/"."$file") && substr($file, 0, 1) != "w" && substr($file, 0, 1) != "i") copy("$statsdir"."/"."$file", "$statsdirold"."$file"); + if (substr($file, 0, 1) != "." && !is_dir("$statsdir"."/"."$file") && substr($file, 0, 1) != "w" && substr($file, 0, 1) != "i") $app->system->move("$statsdir"."/"."$file", "$statsdirold"."$file"); } } diff --git a/server/lib/classes/cron.d/150-goaccess.inc.php b/server/lib/classes/cron.d/150-goaccess.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..2d2c262ff2ab4f1e894eac0b23dadda6b6c55e95 --- /dev/null +++ b/server/lib/classes/cron.d/150-goaccess.inc.php @@ -0,0 +1,291 @@ +db->queryAllRecords($sql, $conf['server_id']); + + $web_config = $app->getconf->get_server_config($conf['server_id'], 'web'); + + if(is_array($records) && !empty($records)) { + + /* Check if goaccess binary is in path/installed */ + if($app->system->is_installed('goaccess')) { + + $goaccess_conf_locs = array('/etc/goaccess.conf', '/etc/goaccess/goaccess.conf'); + $count = 0; + + foreach($goaccess_conf_locs as $goa_loc) { + if(is_file($goa_loc) && (filesize($goa_loc) > 0)) { + $goaccess_conf_main = $goa_loc; + break; + } else { + $count++; + if($count == 2) { + $app->log("No GoAccess base config found. Make sure that GoAccess is installed and that the goaccess.conf does exist in /etc or /etc/goaccess", LOGLEVEL_ERROR); + } + } + } + + + foreach($records as $rec) { + $yesterday = date('Ymd', strtotime("-1 day", time())); + + $log_folder = 'log'; + + if($rec['type'] == 'vhostsubdomain' || $rec['type'] == 'vhostalias') { + $tmp = $app->db->queryOneRecord('SELECT `domain` FROM web_domain WHERE domain_id = ?', $rec['parent_domain_id']); + $subdomain_host = preg_replace('/^(.*)\.' . preg_quote($tmp['domain'], '/') . '$/', '$1', $rec['domain']); + if($subdomain_host == '') $subdomain_host = 'web'.$rec['domain_id']; + $log_folder .= '/' . $subdomain_host; + unset($tmp); + } + + $logfile = $rec['document_root'].'/' . $log_folder . '/'.$yesterday.'-access.log'; + + if(!@is_file($logfile)) { + $logfile = $rec['document_root'].'/' . $log_folder . '/'.$yesterday.'-access.log.gz'; + if(!@is_file($logfile)) { + continue; + } + } + + $web_folder = (($rec['type'] == 'vhostsubdomain' || $rec['type'] == 'vhostalias') ? $rec['web_folder'] : 'web'); + $domain = $rec['domain']; + $statsdir = $rec['document_root'].'/'.$web_folder.'/stats'; + $goaccess_conf = $rec['document_root'].'/log/goaccess.conf'; + + /* + In case that you use a different log format, you should use a custom goaccess.conf which you'll have to put into /usr/local/ispconfig/server/conf-custom/. + By default the originally, with GoAccess shipped goaccess.conf from /etc/ or /etc/goaccess will be used along with the log-format value COMBINED. + */ + + if(file_exists("/usr/local/ispconfig/server/conf-custom/goaccess.conf.master") && (!file_exists($goaccess_conf))) { + $app->system->copy("/usr/local/ispconfig/server/conf-custom/goaccess.conf.master", $goaccess_conf); + } elseif(!file_exists($goaccess_conf)) { + + /* + By default the goaccess.conf should get copied by the webserver plugin but in case it wasn't, or it got deleted by accident we gonna copy it again to the destination dir. + Also there was no /usr/local/ispconfig/server/conf-custom/goaccess.conf.master, so we gonna use /etc/goaccess.conf or /etc/goaccess/goaccess.conf as the base conf. + */ + + $app->system->copy($goaccess_conf_main, $goaccess_conf); + $content = $app->system->file_get_contents($goaccess_conf, true); + $content = preg_replace('/^(#)?log-format COMBINED/m', "log-format COMBINED", $content); + $app->system->file_put_contents($goaccess_conf, $content, true); + unset($content); + } + + $username = $rec['system_user']; + $groupname = $rec['system_group']; + $docroot = $rec['document_root']; + + if(!@is_dir($statsdir)) $app->system->mkdirpath($statsdir, 0755, $username, $groupname); + + $goa_db_dir = $docroot.'/log/goaccess_db'; + $output_html = $docroot.'/'.$web_folder.'/stats/goaindex.html'; + if(!@is_dir($goa_db_dir)) $app->system->mkdirpath($goa_db_dir); + + if(is_link('/var/log/ispconfig/httpd/'.$domain.'/yesterday-access.log')) $app->system->unlink('/var/log/ispconfig/httpd/'.$domain.'/yesterday-access.log'); + + symlink($logfile, '/var/log/ispconfig/httpd/'.$domain.'/yesterday-access.log'); + $app->system->exec_safe('chown -R ?:? ?', $username, $groupname, $statsdir); + + $goamonth = date("n"); + $goayear = date("Y"); + + if (date("d") == 1) { + $goamonth = date("m")-1; + if (date("m") == 1) { + $goayear = date("Y")-1; + $goamonth = "12"; + } + } + + if (date("d") == 2) { + $goamonth = date("m")-1; + if (date("m") == 1) { + $goayear = date("Y")-1; + $goamonth = "12"; + } + + $statsdirold = $statsdir."/".$goayear."-".$goamonth."/"; + + if(!is_dir($statsdirold)) { + $app->system->mkdirpath($statsdirold, 0755, $username, $groupname); + } + + $files = scandir($statsdir); + if (($key = array_search('index.php', $files)) !== false) { + unset($files[$key]); + } + + foreach ($files as $file) { + if (substr($file, 0, 1) != "." && !is_dir("$statsdir"."/"."$file") && substr($file, 0, 1) != "w" && substr($file, 0, 1) != "i") $app->system->move("$statsdir"."/"."$file", "$statsdirold"."$file"); + } + } + + // Get the GoAccess version + $match = array(); + + $goaccess_version = $app->system->system_safe('goaccess --version 2>&1'); + + if(preg_match('/[0-9]\.[0-9]{1,2}/', $goaccess_version, $match)) { + $goaccess_version = $match[0]; + } + + + $sql_user = "SELECT client_id FROM sys_group WHERE groupid = ?"; + $rec_user = $app->db->queryOneRecord($sql_user, $rec['sys_groupid']); + $lang_query = "SELECT country,language FROM client WHERE client_id = ?"; + $lang_user = $app->db->queryOneRecord($lang_query, $rec_user['client_id']); + $cust_lang = $lang_user['language']."_".strtoupper($lang_user['language']).".UTF-8"; + + switch($lang_user['language']) + { + case 'en': + $cust_lang = 'en_UK.UTF-8'; + break; + case 'br': + $cust_lang = 'pt_BR.UTF-8'; + break; + case 'pt': + $cust_lang = 'pt_BR.UTF-8'; + break; + case 'ca': + $cust_lang = 'en_US.UTF-8'; + break; + case 'ja': + $cust_lang = 'ja_JP.UTF-8'; + break; + case 'ar': + $cust_lang = 'es_ES.UTF-8'; + break; + case 'el': + $cust_lang = 'el_GR.UTF-8'; + break; + case 'se': + $cust_lang = 'sv_SE.UTF-8'; + break; + case 'dk': + $cust_lang = 'da_DK.UTF-8'; + break; + case 'cz': + $cust_lang = 'cs_CZ.UTF-8'; + break; + } + + + /* + * GoAccess removed with 1.4 B+Tree support and supports from this version on only "In-Memory with On-Disk Persistance Storage". + * For versions prior 1.4 you need GoAccess with B+Tree support compiled! + */ + + if(version_compare($goaccess_version,1.4) >= 0) { + $app->system->exec_safe("LANG=? goaccess -f ? --config-file ? --restore --persist --db-path=? --output=?", $cust_lang, $logfile, $goaccess_conf, $goa_db_dir, $output_html); + } else { + $output = $app->system->system_safe('goaccess --help 2>&1'); + preg_match('/keep-db-files/', $output, $match); + if($match[0] == "keep-db-files") { + $app->system->exec_safe("LANG=? goaccess -f ? --config-file ? --load-from-disk --keep-db-files --db-path=? --output=?", $cust_lang, $logfile, $goaccess_conf, $goa_db_dir, $output_html); + } else { + $app->log("Stats couldn't be generated. The GoAccess binary wasn't compiled with B+Tree support. Please recompile/reinstall GoAccess with B+Tree support, or install GoAccess version >= 1.4! (recommended)", LOGLEVEL_ERROR); + } + unset($output); + } + + unset($cust_lang); + unset($sql_user); + unset($rec_user); + unset($lang_query); + unset($lang_user); + + if(!is_file($rec['document_root']."/".$web_folder."/stats/index.php")) { + if(file_exists("/usr/local/ispconfig/server/conf-custom/goaccess_index.php.master")) { + $app->system->copy("/usr/local/ispconfig/server/conf-custom/goaccess_index.php.master", $rec['document_root']."/".$web_folder."/stats/index.php"); + } else { + $app->system->copy("/usr/local/ispconfig/server/conf/goaccess_index.php.master", $rec['document_root']."/".$web_folder."/stats/index.php"); + } + } + + $app->log('Created GoAccess statistics for ' . $domain, LOGLEVEL_DEBUG); + if(is_file($rec['document_root']."/".$web_folder."/stats/index.php")) { + $app->system->chown($rec['document_root']."/".$web_folder."/stats/index.php", $rec['system_user']); + $app->system->chgrp($rec['document_root']."/".$web_folder."/stats/index.php", $rec['system_group']); + } + + $app->system->exec_safe('chown -R ?:? ?', $username, $groupname, $statsdir); + } + } else { + $app->log("Stats couldn't be generated. The GoAccess binary couldn't be found. Make sure that GoAccess is installed and that it is in \$PATH", LOGLEVEL_ERROR); + } + + } + + parent::onRunJob(); + } + + /* this function is optional if it contains no custom code */ + public function onAfterRun() { + global $app; + + parent::onAfterRun(); + } + +} + +?> diff --git a/server/lib/classes/cron.d/150-webalizer.inc.php b/server/lib/classes/cron.d/150-webalizer.inc.php index 42aa125e0f9b427883196bf2d511e25a3ad6d182..6c68cef183a6bcad8532bc5cbb13edcf01201800 100644 --- a/server/lib/classes/cron.d/150-webalizer.inc.php +++ b/server/lib/classes/cron.d/150-webalizer.inc.php @@ -127,8 +127,8 @@ class cronjob_webalizer extends cronjob { chown($statsdir, $username); chgrp($statsdir, $groupname); $app->system->exec_safe("$webalizer -c ? -n ? -s ? -r ? -q -T -p -o ? ?", $webalizer_conf, $domain, $domain, $domain, $statsdir, $logfile); - - exec('chown -R ?:? ?', $username, $groupname, $statsdir); + + $app->system->exec_safe('chown -R ?:? ?', $username, $groupname, $statsdir); } diff --git a/server/lib/classes/cron.d/200-ftplogfiles.inc.php b/server/lib/classes/cron.d/200-ftplogfiles.inc.php index 36b43352404153dcde58ee8e857de9bd6830011d..a88a360ae2cb32ff99face8352686f43bf7a2a07 100644 --- a/server/lib/classes/cron.d/200-ftplogfiles.inc.php +++ b/server/lib/classes/cron.d/200-ftplogfiles.inc.php @@ -32,7 +32,17 @@ class cronjob_ftplogfiles extends cronjob { // Make the ftp logfiles directories world readable to enable ftp access //###################################################################################################### - if(is_dir('/var/log/pure-ftpd/')) exec('chmod +r /var/log/pure-ftpd/*'); + $logfile = null; + + if(is_dir('/var/log/pure-ftpd/')) { + exec('chmod +r /var/log/pure-ftpd/*'); + $logfile="/var/log/pure-ftpd/transfer.log.1"; + } elseif(is_file('/var/log/pureftpd.log')) { + $logfile="/var/log/pureftpd.log"; + } else { + $app->log("The pure-ftpd log file could not be found.", LOGLEVEL_DEBUG); + return false; + } //###################################################################################################### // Manage and compress ftp logfiles and create traffic statistics @@ -71,7 +81,7 @@ class cronjob_ftplogfiles extends cronjob { } } - $fp = @fopen('/var/log/pure-ftpd/transfer.log.1', 'r'); + $fp = @fopen($logfile, 'r'); $ftp_traffic = array(); if ($fp) { diff --git a/server/lib/classes/cron.d/200-logfiles.inc.php b/server/lib/classes/cron.d/200-logfiles.inc.php index e2d9e9bb9ec0c1df7dd237e6d3f49aea07ee1a75..ef0bbb1201b0bf35a67d77e96fc6b3d4c1e1a408 100644 --- a/server/lib/classes/cron.d/200-logfiles.inc.php +++ b/server/lib/classes/cron.d/200-logfiles.inc.php @@ -49,10 +49,10 @@ class cronjob_logfiles extends cronjob { public function onRunJob() { global $app, $conf; - + $app->uses('getconf'); $server_config = $app->getconf->get_server_config($conf['server_id'], 'server'); - + if($server_config['log_retention'] > 0) { $max_syslog = $app->functions->intval($server_config['log_retention']); } else { @@ -121,18 +121,18 @@ class cronjob_logfiles extends cronjob { $app->system->exec_safe("gzip -c ? > ?", $logfile, $logfile . '.gz'); unlink($logfile); } - + $cron_logfiles = array('cron.log', 'cron_error.log', 'cron_wget.log'); foreach($cron_logfiles as $cron_logfile) { - $cron_logfile = $rec['document_root'].'/' . $log_folder . '/' . $cron_logfile; - + $cron_logfile = $rec['document_root'].'/private/' . $cron_logfile; + // rename older files (move up by one) $num = $log_retention; while($num >= 1) { if(is_file($cron_logfile . '.' . $num . '.gz')) rename($cron_logfile . '.' . $num . '.gz', $cron_logfile . '.' . ($num + 1) . '.gz'); $num--; } - + // compress current logfile if(is_file($cron_logfile)) { $app->system->exec_safe("gzip -c ? > ?", $cron_logfile, $cron_logfile . '.1.gz'); @@ -146,7 +146,7 @@ class cronjob_logfiles extends cronjob { } } - // rotate and compress the error.log + // rotate and compress the error.log $error_logfile = $rec['document_root'].'/' . $log_folder . '/error.log'; // rename older files (move up by one) $num = $log_retention; @@ -184,7 +184,7 @@ class cronjob_logfiles extends cronjob { //###################################################################################################### - $ispconfig_logfiles = array('ispconfig.log', 'cron.log', 'auth.log'); + $ispconfig_logfiles = array('ispconfig.log', 'cron.log', 'auth.log', 'acme.log'); foreach($ispconfig_logfiles as $ispconfig_logfile) { $num = $max_syslog; $ispconfig_logfile = $conf['ispconfig_log_dir'].'/'.$ispconfig_logfile; @@ -193,7 +193,7 @@ class cronjob_logfiles extends cronjob { if(is_file($ispconfig_logfile . '.' . $num . '.gz')) rename($ispconfig_logfile . '.' . $num . '.gz', $ispconfig_logfile . '.' . ($num + 1) . '.gz'); $num--; } - // compress current logfile + //* compress current logfile if(is_file($ispconfig_logfile)) { $app->system->exec_safe("gzip -c ? > ?", $ispconfig_logfile, $ispconfig_logfile . '.1.gz'); $app->system->exec_safe("cat /dev/null > ?", $ispconfig_logfile); @@ -217,7 +217,7 @@ class cronjob_logfiles extends cronjob { foreach($records as $rec){ $tmp_path = realpath($rec['document_root'].'/tmp'); if($tmp_path != '' && strlen($tmp_path) > 10 && is_dir($tmp_path) && $app->system->is_user($rec['system_user'])){ - exec("cd ?; find . -mtime +1 -name 'sess_*' | grep -v -w .no_delete | xargs rm > /dev/null 2> /dev/null", $tmp_path); + $app->system->exec_safe("cd ?; find . -mtime +1 -name 'sess_*' | grep -v -w .no_delete | xargs rm > /dev/null 2> /dev/null", $tmp_path); } } } @@ -240,7 +240,7 @@ class cronjob_logfiles extends cronjob { */ $sql = "DELETE FROM sys_log WHERE tstamp < ? AND server_id != 0"; $app->dbmaster->query($sql, $tstamp); - + /* * now delete those entries without a linked datalog entry (datalog_id = 0) */ 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 5d652d0820d99a72eb67d7379cd73556c4a4a2d6..08cd283ef78834d67ed011fc2e3b124b1a380121 100644 --- a/server/lib/classes/cron.d/300-quota_notify.inc.php +++ b/server/lib/classes/cron.d/300-quota_notify.inc.php @@ -49,7 +49,7 @@ class cronjob_quota_notify extends cronjob { public function onRunJob() { global $app, $conf; - + /* used for all monitor cronjobs */ $app->load('monitor_tools'); $this->_tools = new monitor_tools(); @@ -57,6 +57,13 @@ class cronjob_quota_notify extends cronjob { $web_config = $app->getconf->get_server_config($conf['server_id'], 'web'); + // Get client email and eventual reseller email + $client_group_id = $rec["sys_groupid"]; + $client = $app->db->queryOneRecord("SELECT client.email, client.parent_client_id FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $client_group_id); + if($client['parent_client_id'] > 0) { + $reseller = $app->db->queryOneRecord("SELECT email FROM client WHERE client_id = ?", $client['parent_client_id']); + } + //###################################################################################################### // enforce traffic quota (run only on the "master-server") //###################################################################################################### @@ -81,14 +88,23 @@ class cronjob_quota_notify extends cronjob { $web_traffic = round($tmp['total_traffic_bytes']/1024/1024); if($web_traffic_quota > 0 && $web_traffic > $web_traffic_quota) { - $app->dbmaster->datalogUpdate('web_domain', array("traffic_quota_lock" => 'y', "active" => 'n'), 'domain_id', $rec['domain_id']); - $app->log('Traffic quota for '.$rec['domain'].' exceeded. Disabling website.', LOGLEVEL_DEBUG); - + //* Lock website + if ($web_config['overtraffic_disable_web'] == 'y') { + $app->dbmaster->datalogUpdate('web_domain', array("traffic_quota_lock" => 'y', "active" => 'n'), 'domain_id', $rec['domain_id']); + $app->log('Traffic quota for '.$rec['domain'].' exceeded. Disabling website.', LOGLEVEL_DEBUG); + } + else { + $app->log('Traffic quota for '.$rec['domain'].' exceeded.', LOGLEVEL_DEBUG); + } //* Send traffic notifications - if($rec['traffic_quota_lock'] != 'y' && ($web_config['overtraffic_notify_admin'] == 'y' || $web_config['overtraffic_notify_client'] == 'y')) { + if($rec['traffic_quota_lock'] != 'y' && ($web_config['overtraffic_notify_admin'] == 'y' || $web_config['overtraffic_notify_reseller'] == 'y' || $web_config['overtraffic_notify_client'] == 'y')) { $placeholders = array('{domain}' => $rec['domain'], - '{admin_mail}' => ($global_config['admin_mail'] != ''? $global_config['admin_mail'] : 'root')); + '{admin_mail}' => ($global_config['admin_mail'] != ''? $global_config['admin_mail'] : 'root'), + '{used}' => $web_traffic, + '{limit}' => $web_traffic_quota, + '{ratio}' => number_format(($web_traffic_quota > 0 ? $web_traffic/$web_traffic_quota : 0) * 100, 2, '.', '').'%' + ); $recipients = array(); //* send email to admin @@ -96,16 +112,26 @@ class cronjob_quota_notify extends cronjob { $recipients[] = $global_config['admin_mail']; } + //* Send email to reseller + if($web_config['overtraffic_notify_reseller'] == 'y') { + if($reseller['email'] != '') { + $recipients[] = $reseller['email']; + } + } + //* Send email to client if($web_config['overtraffic_notify_client'] == 'y') { - $client_group_id = $rec["sys_groupid"]; - $client = $app->db->queryOneRecord("SELECT client.email FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $client_group_id); if($client['email'] != '') { $recipients[] = $client['email']; } } - $this->_tools->send_notification_email('web_traffic_notification', $placeholders, $recipients); + if ($web_config['overtraffic_disable_web'] == 'y') { + $this->_tools->send_notification_email('web_traffic_notification', $placeholders, $recipients); + } + else { + $this->_tools->send_notification_email('web_traffic_notification_warn', $placeholders, $recipients); + } } } else { @@ -196,13 +222,13 @@ 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']); // send notification - everything ok again - if($rec['last_quota_notification'] && $web_config['overquota_notify_onok'] == 'y' && ($web_config['overquota_notify_admin'] == 'y' || $web_config['overquota_notify_client'] == 'y')) { + if($rec['last_quota_notification'] && $web_config['overquota_notify_onok'] == 'y' && ($web_config['overquota_notify_admin'] == 'y' || $web_config['overquota_notify_reseller'] == 'y' || $web_config['overquota_notify_client'] == 'y')) { $placeholders = array('{domain}' => $rec['domain'], '{admin_mail}' => ($global_config['admin_mail'] != ''? $global_config['admin_mail'] : 'root'), '{used}' => $rec['used'], @@ -217,10 +243,15 @@ class cronjob_quota_notify extends cronjob { $recipients[] = $global_config['admin_mail']; } + //* Send email to reseller + if($web_config['overquota_notify_reseller'] == 'y') { + if($reseller['email'] != '') { + $recipients[] = $reseller['email']; + } + } + //* Send email to client if($web_config['overquota_notify_client'] == 'y') { - $client_group_id = $rec["sys_groupid"]; - $client = $app->db->queryOneRecord("SELECT client.email FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $client_group_id); if($client['email'] != '') { $recipients[] = $client['email']; } @@ -235,8 +266,8 @@ class cronjob_quota_notify extends cronjob { elseif($web_config['overquota_notify_freq'] > 0 && $rec['notified_before'] >= $web_config['overquota_notify_freq']) $send_notification = true; //* Send quota notifications - if(($web_config['overquota_notify_admin'] == 'y' || $web_config['overquota_notify_client'] == 'y') && $send_notification == true) { - $app->dbmaster->datalogUpdate('web_domain', array("last_quota_notification" => array("SQL" => "CURDATE()")), 'domain_id', $rec['domain_id']); + if(($web_config['overquota_notify_admin'] == 'y' || $web_config['overquota_notify_reseller'] == 'y' || $web_config['overquota_notify_client'] == 'y') && $send_notification == true) { + $app->dbmaster->datalogUpdate('web_domain', array("last_quota_notification" => date('Y-m-d')), 'domain_id', $rec['domain_id']); $placeholders = array('{domain}' => $rec['domain'], '{admin_mail}' => ($global_config['admin_mail'] != ''? $global_config['admin_mail'] : 'root'), @@ -252,10 +283,15 @@ class cronjob_quota_notify extends cronjob { $recipients[] = $global_config['admin_mail']; } + //* Send email to reseller + if($web_config['overquota_notify_reseller'] == 'y') { + if($reseller['email'] != '') { + $recipients[] = $reseller['email']; + } + } + //* Send email to client if($web_config['overquota_notify_client'] == 'y') { - $client_group_id = $rec["sys_groupid"]; - $client = $app->db->queryOneRecord("SELECT client.email FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $client_group_id); if($client['email'] != '') { $recipients[] = $client['email']; } @@ -325,13 +361,13 @@ 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']); // send notification - everything ok again - if($rec['last_quota_notification'] && $mail_config['overquota_notify_onok'] == 'y' && ($mail_config['overquota_notify_admin'] == 'y' || $mail_config['overquota_notify_client'] == 'y')) { + if($rec['last_quota_notification'] && $mail_config['overquota_notify_onok'] == 'y' && ($mail_config['overquota_notify_admin'] == 'y' || $web_config['overquota_notify_reseller'] == 'y' || $mail_config['overquota_notify_client'] == 'y')) { $placeholders = array('{email}' => $rec['email'], '{admin_mail}' => ($global_config['admin_mail'] != ''? $global_config['admin_mail'] : 'root'), '{used}' => $rec['used'], @@ -345,10 +381,15 @@ class cronjob_quota_notify extends cronjob { $recipients[] = $global_config['admin_mail']; } + //* Send email to reseller + if($web_config['overquota_notify_reseller'] == 'y') { + if($reseller['email'] != '') { + $recipients[] = $reseller['email']; + } + } + //* Send email to client if($mail_config['overquota_notify_client'] == 'y') { - $client_group_id = $rec["sys_groupid"]; - $client = $app->db->queryOneRecord("SELECT client.email FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $client_group_id); if($client['email'] != '') { $recipients[] = $client['email']; } @@ -364,8 +405,8 @@ class cronjob_quota_notify extends cronjob { if(!$rec['last_quota_notification']) $send_notification = true; // not yet notified elseif($mail_config['overquota_notify_freq'] > 0 && $rec['notified_before'] >= $mail_config['overquota_notify_freq']) $send_notification = true; - if(($mail_config['overquota_notify_admin'] == 'y' || $mail_config['overquota_notify_client'] == 'y') && $send_notification == true) { - $app->dbmaster->datalogUpdate('mail_user', array("last_quota_notification" => array("SQL" => "CURDATE()")), 'mailuser_id', $rec['mailuser_id']); + if(($mail_config['overquota_notify_admin'] == 'y' || $mail_config['overquota_notify_reseller'] == 'y' || $mail_config['overquota_notify_client'] == 'y') && $send_notification == true) { + $app->dbmaster->datalogUpdate('mail_user', array("last_quota_notification" => date('Y-m-d')), 'mailuser_id', $rec['mailuser_id']); $placeholders = array('{email}' => $rec['email'], '{admin_mail}' => ($global_config['admin_mail'] != ''? $global_config['admin_mail'] : 'root'), @@ -380,10 +421,15 @@ class cronjob_quota_notify extends cronjob { $recipients[] = $global_config['admin_mail']; } + //* Send email to reseller + if($web_config['overquota_notify_reseller'] == 'y') { + if($reseller['email'] != '') { + $recipients[] = $reseller['email']; + } + } + //* Send email to client if($mail_config['overquota_notify_client'] == 'y') { - $client_group_id = $rec["sys_groupid"]; - $client = $app->db->queryOneRecord("SELECT client.email FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $client_group_id); if($client['email'] != '') { $recipients[] = $client['email']; } @@ -410,12 +456,12 @@ class cronjob_quota_notify extends cronjob { $monitor_data = array(); foreach ($tmp_rec as $tmp_mon) { $tmp_array = unserialize($app->db->unquote($tmp_mon['data'])); - if(is_array($tmp_array)) + if(is_array($tmp_array)) foreach($tmp_array as $sys_groupid => $data) $monitor_data[$data['sys_groupid']][] = $data; } //* remove duplicates from monitor-data - foreach($monitor_data as $_monitor_data) + foreach($monitor_data as $_monitor_data) $monitor_data[$_monitor_data[0]['sys_groupid']]=array_map("unserialize", array_unique(array_map("serialize", $_monitor_data))); } @@ -434,15 +480,12 @@ class cronjob_quota_notify extends cronjob { foreach($cid as $monitor) { if ($monitor['database_name'] == $database) { - //* get the client - $client = $app->db->queryOneRecord("SELECT client.username, client.email FROM web_database, sys_group, client WHERE web_database.sys_groupid = sys_group.groupid AND sys_group.client_id = client.client_id AND web_database.database_name=?", $database); - //* check quota 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; @@ -451,8 +494,8 @@ class cronjob_quota_notify extends cronjob { //* Send quota notifications - if(($web_config['overquota_db_notify_admin'] == 'y' || $web_config['overquota_db_notify_client'] == 'y') && $send_notification == true) { - $app->dbmaster->datalogUpdate('web_database', array("last_quota_notification" => array("SQL" => "CURDATE()")), 'database_id', $rec['database_id']); + if(($web_config['overquota_db_notify_admin'] == 'y' || $web_config['overquota_db_notify_reseller'] == 'y' || $web_config['overquota_db_notify_client'] == 'y') && $send_notification == true) { + $app->dbmaster->datalogUpdate('web_database', array("last_quota_notification" => date('Y-m-d')), 'database_id', $rec['database_id']); $placeholders = array( '{database_name}' => $rec['database_name'], '{admin_mail}' => ($global_config['admin_mail'] != ''? $global_config['admin_mail'] : 'root'), @@ -467,10 +510,19 @@ class cronjob_quota_notify extends cronjob { if($global_config['admin_mail'] != '' && $web_config['overquota_db_notify_admin'] == 'y') $recipients[] = $global_config['admin_mail']; + //* Send email to reseller + if($web_config['overquota_db_notify_reseller'] == 'y') { + if($reseller['email'] != '') { + $recipients[] = $reseller['email']; + } + } + //* Send email to client - if($web_config['overquota_db_notify_client'] == 'y' && $client['email'] != '') - $recipients[] = $client['email']; - + if($web_config['overquota_db_notify_client'] == 'y') { + if($client['email'] != '') { + $recipients[] = $client['email']; + } + } $this->_tools->send_notification_email('db_quota_notification', $placeholders, $recipients); } @@ -480,7 +532,7 @@ class cronjob_quota_notify extends cronjob { if($rec['last_quota_notification']) $app->dbmaster->datalogUpdate('web_database', array("last_quota_notification" => null), 'database_id', $rec['database_id']); // send notification - everything ok again - if($rec['last_quota_notification'] && $web_config['overquota_notify_onok'] == 'y' && ($web_config['overquota_db_notify_admin'] == 'y' || $web_config['overquota_db_notify_client'] == 'y')) { + if($rec['last_quota_notification'] && $web_config['overquota_notify_onok'] == 'y' && ($web_config['overquota_db_notify_admin'] == 'y' || $web_config['overquota_db_notify_reseller'] == 'y' || $web_config['overquota_db_notify_client'] == 'y')) { $placeholders = array( '{database_name}' => $rec['database_name'], '{admin_mail}' => ($global_config['admin_mail'] != ''? $global_config['admin_mail'] : 'root'), @@ -492,12 +544,24 @@ class cronjob_quota_notify extends cronjob { $recipients = array(); //* send email to admin - if($global_config['admin_mail'] != '' && $web_config['overquota_db_notify_admin'] == 'y') + if($global_config['admin_mail'] != '' && $web_config['overquota_db_notify_admin'] == 'y') { $recipients[] = $global_config['admin_mail']; + } + + //* Send email to reseller + if($web_config['overquota_db_notify_reseller'] == 'y') { + if($reseller['email'] != '') { + $recipients[] = $reseller['email']; + } + } //* Send email to client - if($web_config['overquota_db_notify_client'] == 'y' && $client['email'] != '') - $recipients[] = $client['email']; + if($mail_config['overquota_notify_client'] == 'y') { + if($client['email'] != '') { + $recipients[] = $client['email']; + } + } + $this->_tools->send_notification_email('db_quota_ok_notification', $placeholders, $recipients); @@ -507,7 +571,7 @@ class cronjob_quota_notify extends cronjob { } - } + } } diff --git a/server/lib/classes/cron.d/500-backup.inc.php b/server/lib/classes/cron.d/500-backup.inc.php index f261daf468b726200e925474a8fc7aed3713ca85..cf4272991e340515b76399bcb27f884dae171b9c 100644 --- a/server/lib/classes/cron.d/500-backup.inc.php +++ b/server/lib/classes/cron.d/500-backup.inc.php @@ -50,365 +50,8 @@ class cronjob_backup extends cronjob { public function onRunJob() { global $app, $conf; - $server_config = $app->getconf->get_server_config($conf['server_id'], 'server'); - $global_config = $app->getconf->get_global_config('sites'); - $backup_dir = trim($server_config['backup_dir']); - $backup_mode = $server_config['backup_mode']; - $backup_tmp = trim($server_config['backup_tmp']); - if($backup_mode == '') $backup_mode = 'userzip'; - - $web_config = $app->getconf->get_server_config($conf['server_id'], 'web'); - $http_server_user = $web_config['user']; - - if($backup_dir != '') { - - if(isset($server_config['backup_dir_ftpread']) && $server_config['backup_dir_ftpread'] == 'y') { - $backup_dir_permissions = 0755; - } else { - $backup_dir_permissions = 0750; - } - - if(!is_dir($backup_dir)) { - mkdir($backup_dir, $backup_dir_permissions, true); - } else { - chmod($backup_dir, $backup_dir_permissions); - } - $run_backups = true; - //* mount backup directory, if necessary - if( $server_config['backup_dir_is_mount'] == 'y' && !$app->system->mount_backup_dir($backup_dir) ) $run_backups = false; - if($run_backups){ - $web_array = array(); - - system('which pigz > /dev/null', $ret); - if($ret === 0) { - $use_pigz = true; - $zip_cmd = 'pigz'; // db-backups - } else { - $use_pigz = false; - $zip_cmd = 'gzip'; // db-backups - } - - //* backup only active domains - $sql = "SELECT * FROM web_domain WHERE server_id = ? AND (type = 'vhost' OR type = 'vhostsubdomain' OR type = 'vhostalias') AND active = 'y'"; - $records = $app->db->queryAllRecords($sql, $conf['server_id']); - if(is_array($records)) { - foreach($records as $rec) { - - //* Do the website backup - if($rec['backup_interval'] == 'daily' or ($rec['backup_interval'] == 'weekly' && date('w') == 0) or ($rec['backup_interval'] == 'monthly' && date('d') == '01')) { - - $web_path = $rec['document_root']; - $web_user = $rec['system_user']; - $web_group = $rec['system_group']; - $web_id = $rec['domain_id']; - if(!in_array($web_id, $web_array)) $web_array[] = $web_id; - $web_backup_dir = $backup_dir.'/web'.$web_id; - if(!is_dir($web_backup_dir)) mkdir($web_backup_dir, 0750); - chmod($web_backup_dir, 0750); - //if(isset($server_config['backup_dir_ftpread']) && $server_config['backup_dir_ftpread'] == 'y') { - chown($web_backup_dir, $rec['system_user']); - chgrp($web_backup_dir, $rec['system_group']); - /*} else { - chown($web_backup_dir, 'root'); - chgrp($web_backup_dir, 'root'); - }*/ - - $backup_excludes = ''; - $b_excludes = explode(',', trim($rec['backup_excludes'])); - if(is_array($b_excludes) && !empty($b_excludes)){ - foreach($b_excludes as $b_exclude){ - $b_exclude = trim($b_exclude); - if($b_exclude != ''){ - $backup_excludes .= ' --exclude='.escapeshellarg($b_exclude); - } - } - } - - if($backup_mode == 'userzip') { - //* Create a .zip backup as web user and include also files owned by apache / nginx user - $web_backup_file = 'web'.$web_id.'_'.date('Y-m-d_H-i').'.zip'; - $app->system->exec_safe('cd ? && sudo -u ? find . -group ? -print 2> /dev/null | zip -b ? --exclude=./backup\*'.$backup_excludes.' --symlinks ? -@', $web_path, $web_user, $web_group, $backup_tmp, $web_backup_dir.'/'.$web_backup_file); - $retval = $app->system->last_exec_retcode(); - if($retval == 0 || $retval == 12) $app->system->exec_safe('cd ? && sudo -u ? find . -user ? -print 2> /dev/null | zip -b ? --exclude=./backup\*'.$backup_excludes.' --update --symlinks ? -@', $web_path, $web_user, $http_server_user, $backup_tmp, $web_backup_dir.'/'.$web_backup_file); - $retval = $app->system->last_exec_retcode(); - } else { - //* Create a tar.gz backup as root user - $web_backup_file = 'web'.$web_id.'_'.date('Y-m-d_H-i').'.tar.gz'; - if ($use_pigz) { - $app->system->exec_safe('tar pcf - --exclude=./backup\*'.$backup_excludes.' --directory ? . | pigz > ?', $web_path, $web_backup_dir.'/'.$web_backup_file); - $retval = $app->system->last_exec_retcode(); - } else { - $app->system->exec_safe('tar pczf ? --exclude=./backup\*'.$backup_excludes.' --directory ? .', $web_backup_dir.'/'.$web_backup_file, $web_path); - $retval = $app->system->last_exec_retcode(); - } - } - if($retval == 0 || ($backup_mode != 'userzip' && $retval == 1) || ($backup_mode == 'userzip' && $retval == 12)) { // tar can return 1, zip can return 12(due to harmless warings) and still create valid backups - if(is_file($web_backup_dir.'/'.$web_backup_file)){ - $backupusername = ($global_config['backups_include_into_web_quota'] == 'y') ? $web_user : 'root'; - $backupgroup = ($global_config['backups_include_into_web_quota'] == 'y') ? $web_group : 'root'; - chown($web_backup_dir.'/'.$web_backup_file, $backupusername); - chgrp($web_backup_dir.'/'.$web_backup_file, $backupgroup); - chmod($web_backup_dir.'/'.$web_backup_file, 0750); - - //* Insert web backup record in database - $filesize = filesize($web_backup_dir.'/'.$web_backup_file); - $sql = "INSERT INTO web_backup (server_id, parent_domain_id, backup_type, backup_mode, tstamp, filename, filesize) VALUES (?, ?, ?, ?, ?, ?, ?)"; - $app->db->query($sql, $conf['server_id'], $web_id, 'web', $backup_mode, time(), $web_backup_file, $filesize); - if($app->db->dbHost != $app->dbmaster->dbHost) - $app->dbmaster->query($sql, $conf['server_id'], $web_id, 'web', $backup_mode, time(), $web_backup_file, $filesize); - unset($filesize); - } - } else { - if(is_file($web_backup_dir.'/'.$web_backup_file)) unlink($web_backup_dir.'/'.$web_backup_file); - $app->log('Backup of '.$web_path.' failed.', LOGLEVEL_WARN); - } - - //* Remove old backups - $backup_copies = intval($rec['backup_copies']); - - $dir_handle = dir($web_backup_dir); - $files = array(); - while (false !== ($entry = $dir_handle->read())) { - if($entry != '.' && $entry != '..' && substr($entry, 0, 3) == 'web' && is_file($web_backup_dir.'/'.$entry)) { - $files[] = $entry; - } - } - $dir_handle->close(); - - rsort($files); - - for ($n = $backup_copies; $n <= 10; $n++) { - if(isset($files[$n]) && is_file($web_backup_dir.'/'.$files[$n])) { - $sql = "DELETE FROM web_backup WHERE server_id = ? AND parent_domain_id = ? AND filename = ?"; - $app->db->query($sql, $conf['server_id'], $web_id, $files[$n]); - if($app->db->dbHost != $app->dbmaster->dbHost) $app->dbmaster->query($sql, $conf['server_id'], $web_id, $files[$n]); - @unlink($web_backup_dir.'/'.$files[$n]); - } - } - - unset($files); - unset($dir_handle); - - //* Remove backupdir symlink and create as directory instead - $app->system->web_folder_protection($web_path, false); - - if(is_link($web_path.'/backup')) { - unlink($web_path.'/backup'); - } - if(!is_dir($web_path.'/backup')) { - mkdir($web_path.'/backup'); - chown($web_path.'/backup', $rec['system_user']); - chgrp($web_path.'/backup', $rec['system_group']); - } - - $app->system->web_folder_protection($web_path, true); - } - - /* If backup_interval is set to none and we have a - backup directory for the website, then remove the backups */ - if($rec['backup_interval'] == 'none' || $rec['backup_interval'] == '') { - $web_id = $rec['domain_id']; - $web_user = $rec['system_user']; - $web_backup_dir = realpath($backup_dir.'/web'.$web_id); - if(is_dir($web_backup_dir)) { - $dir_handle = opendir($web_backup_dir.'/'); - while ($file = readdir($dir_handle)) { - if(!is_dir($file)) { - unlink ("$web_backup_dir/"."$file"); - } - } - } - $sql = "DELETE FROM web_backup WHERE server_id = ? AND parent_domain_id = ?"; - $app->db->query($sql, $conf['server_id'], $web_id); - if($app->db->dbHost != $app->dbmaster->dbHost) $app->dbmaster->query($sql, $conf['server_id'], $web_id); - } - } - } - - $records = $app->db->queryAllRecords("SELECT * FROM web_database WHERE server_id = ? AND backup_interval != 'none' AND backup_interval != ''", $conf['server_id']); - if(is_array($records)) { - - include '/usr/local/ispconfig/server/lib/mysql_clientdb.conf'; - - //* Check mysqldump capabilities - exec('mysqldump --help',$tmp); - $mysqldump_routines = (strpos(implode($tmp),'--routines') !== false)?'--routines':''; - unset($tmp); - - foreach($records as $rec) { - - //* Do the database backup - if($rec['backup_interval'] == 'daily' or ($rec['backup_interval'] == 'weekly' && date('w') == 0) or ($rec['backup_interval'] == 'monthly' && date('d') == '01')) { - - $web_id = $rec['parent_domain_id']; - if(!in_array($web_id, $web_array)) $web_array[] = $web_id; - $db_backup_dir = $backup_dir.'/web'.$web_id; - if(!is_dir($db_backup_dir)) mkdir($db_backup_dir, 0750); - chmod($db_backup_dir, 0750); - $backupusername = 'root'; - $backupgroup = 'root'; - if ($global_config['backups_include_into_web_quota'] == 'y') { - $sql = "SELECT * FROM web_domain WHERE domain_id = ".$rec['parent_domain_id']; - $webdomain = $app->db->queryOneRecord($sql); - $backupusername = $webdomain['system_user']; - $backupgroup = $webdomain['system_group']; - } - chown($db_backup_dir, $backupusername); - chgrp($db_backup_dir, $backupgroup); - - //* Do the mysql database backup with mysqldump - $db_id = $rec['database_id']; - $db_name = $rec['database_name']; - $db_backup_file = 'db_'.$db_name.'_'.date('Y-m-d_H-i').'.sql'; - $command = "mysqldump -h ? -u ? -p? -c --add-drop-table --create-options --quick --max_allowed_packet=512M ".$mysqldump_routines." --result-file=? ?"; - $app->system->exec_safe($command, $clientdb_host, $clientdb_user, $clientdb_password, $db_backup_dir.'/'.$db_backup_file, $db_name); - $retval = $app->system->last_exec_retcode(); - - //* Compress the backup with gzip / pigz - if($retval == 0) { - $app->system->exec_safe("$zip_cmd -c ? > ?", $db_backup_dir.'/'.$db_backup_file, $db_backup_dir.'/'.$db_backup_file . '.gz'); - $retval = $app->system->last_exec_retcode(); - } - - if($retval == 0){ - if(is_file($db_backup_dir.'/'.$db_backup_file.'.gz')){ - chmod($db_backup_dir.'/'.$db_backup_file.'.gz', 0750); - chown($db_backup_dir.'/'.$db_backup_file.'.gz', fileowner($db_backup_dir)); - chgrp($db_backup_dir.'/'.$db_backup_file.'.gz', filegroup($db_backup_dir)); - - //* Insert web backup record in database - $filesize = filesize($db_backup_dir.'/'.$db_backup_file.'.gz'); - $sql = "INSERT INTO web_backup (server_id, parent_domain_id, backup_type, backup_mode, tstamp, filename, filesize) VALUES (?, ?, ?, ?, ?, ?, ?)"; - $app->db->query($sql, $conf['server_id'], $web_id, 'mysql', 'sqlgz', time(), $db_backup_file.'.gz', $filesize); - if($app->db->dbHost != $app->dbmaster->dbHost) - $app->dbmaster->query($sql, $conf['server_id'], $web_id, 'mysql', 'sqlgz', time(), $db_backup_file.'.gz', $filesize); - unset($filesize); - } - } else { - if(is_file($db_backup_dir.'/'.$db_backup_file.'.gz')) unlink($db_backup_dir.'/'.$db_backup_file.'.gz'); - } - //* Remove the uncompressed file - if(is_file($db_backup_dir.'/'.$db_backup_file)) unlink($db_backup_dir.'/'.$db_backup_file); - - //* Remove old backups - $backup_copies = intval($rec['backup_copies']); - - $dir_handle = dir($db_backup_dir); - $files = array(); - while (false !== ($entry = $dir_handle->read())) { - if($entry != '.' && $entry != '..' && preg_match('/^db_('.$db_name.')_\d{4}-\d{2}-\d{2}_\d{2}-\d{2}\.sql.gz$/', $entry, $matches) && is_file($db_backup_dir.'/'.$entry)) { - if(array_key_exists($matches[1], $files) == false) $files[$matches[1]] = array(); - $files[$matches[1]][] = $entry; - } - } - $dir_handle->close(); - - reset($files); - foreach($files as $db_name => $filelist) { - rsort($filelist); - for ($n = $backup_copies; $n <= 10; $n++) { - if(isset($filelist[$n]) && is_file($db_backup_dir.'/'.$filelist[$n])) { - $sql = "DELETE FROM web_backup WHERE server_id = ? AND parent_domain_id = ? AND filename = ?"; - $app->db->query($sql, $conf['server_id'], $web_id, $filelist[$n]); - if($app->db->dbHost != $app->dbmaster->dbHost) $app->dbmaster->query($sql, $conf['server_id'], $web_id, $filelist[$n]); - @unlink($db_backup_dir.'/'.$filelist[$n]); - } - } - } - - unset($files); - unset($dir_handle); - } - } - - unset($clientdb_host); - unset($clientdb_user); - unset($clientdb_password); - - } - - // remove non-existing backups from database - $backups = $app->db->queryAllRecords("SELECT * FROM web_backup WHERE server_id = ?", $conf['server_id']); - if(is_array($backups) && !empty($backups)){ - foreach($backups as $backup){ - $backup_file = $backup_dir.'/web'.$backup['parent_domain_id'].'/'.$backup['filename']; - if(!is_file($backup_file)){ - $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){ - $backups = $app->dbmaster->queryAllRecords("SELECT * FROM web_backup WHERE server_id = ?", $conf['server_id']); - if(is_array($backups) && !empty($backups)){ - foreach($backups as $backup){ - $backup_file = $backup_dir.'/web'.$backup['parent_domain_id'].'/'.$backup['filename']; - if(!is_file($backup_file)){ - $sql = "DELETE FROM web_backup WHERE server_id = ? AND parent_domain_id = ? AND filename = ?"; - $app->dbmaster->query($sql, $conf['server_id'], $backup['parent_domain_id'], $backup['filename']); - } - } - } - } - - // garbage collection (non-existing databases) - if(is_array($web_array) && !empty($web_array)){ - foreach($web_array as $tmp_web_id){ - $tmp_backup_dir = $backup_dir.'/web'.$tmp_web_id; - if(is_dir($tmp_backup_dir)){ - $dir_handle = dir($tmp_backup_dir); - $files = array(); - while (false !== ($entry = $dir_handle->read())) { - if($entry != '.' && $entry != '..' && preg_match('/^db_(.*?)_\d{4}-\d{2}-\d{2}_\d{2}-\d{2}\.sql.gz$/', $entry, $matches) && is_file($tmp_backup_dir.'/'.$entry)) { - - $tmp_db_name = $matches[1]; - $tmp_database = $app->db->queryOneRecord("SELECT * FROM web_database WHERE server_id = ? AND parent_domain_id = ? AND database_name = ?", $conf['server_id'], $tmp_web_id, $tmp_db_name); - - if(is_array($tmp_database) && !empty($tmp_database)){ - if($tmp_database['backup_interval'] == 'none' || intval($tmp_database['backup_copies']) == 0){ - @unlink($tmp_backup_dir.'/'.$entry); - $sql = "DELETE FROM web_backup WHERE server_id = ? AND parent_domain_id = ? AND filename = ?"; - $app->db->query($sql, $conf['server_id'], $tmp_web_id, $entry); - if($app->db->dbHost != $app->dbmaster->dbHost) $app->dbmaster->query($sql, $conf['server_id'], $tmp_web_id, $entry); - } - } else { - @unlink($tmp_backup_dir.'/'.$entry); - $sql = "DELETE FROM web_backup WHERE server_id = ? AND parent_domain_id = ? AND filename = ?"; - $app->db->query($sql, $conf['server_id'], $tmp_web_id, $entry); - if($app->db->dbHost != $app->dbmaster->dbHost) $app->dbmaster->query($sql, $conf['server_id'], $tmp_web_id, $entry); - } - } - } - $dir_handle->close(); - } - } - } - //* end run_backups - if( $server_config['backup_dir_is_mount'] == 'y' ) $app->system->umount_backup_dir($backup_dir); - } - } - - // delete files from backup download dir (/var/www/example.com/backup) - unset($records, $entry, $files); - $sql = "SELECT * FROM web_domain WHERE server_id = ? AND (type = 'vhost' OR type = 'vhostsubdomain' OR type = 'vhostalias') AND active = 'y'"; - $records = $app->db->queryAllRecords($sql, $conf['server_id']); - if(is_array($records)) { - foreach($records as $rec) { - $backup_download_dir = $rec['document_root'].'/backup'; - if(is_dir($backup_download_dir)){ - $dir_handle = dir($backup_download_dir); - $files = array(); - while (false !== ($entry = $dir_handle->read())) { - if($entry != '.' && $entry != '..' && is_file($backup_download_dir.'/'.$entry)) { - // delete files older than 3 days - if(time() - filemtime($backup_download_dir.'/'.$entry) >= 60*60*24*3) @unlink($backup_download_dir.'/'.$entry); - } - } - $dir_handle->close(); - } - } - } - + $app->load("backup"); + backup::run_all_backups($conf['server_id'], "auto"); parent::onRunJob(); } 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 234f02771db841d194e38f3e5050b4e6004e5868..4dcb1994142065a7e8aed42036578c1a88229c29 100644 --- a/server/lib/classes/cron.d/500-backup_mail.inc.php +++ b/server/lib/classes/cron.d/500-backup_mail.inc.php @@ -33,6 +33,11 @@ class cronjob_backup_mail extends cronjob { protected $_schedule = '0 0 * * *'; private $tmp_backup_dir = ''; + /** + * The maximum number of backups that ISPConfig can store. + */ + const max_backups = 30; + /* this function is optional if it contains no custom code */ public function onPrepare() { global $app; @@ -73,8 +78,7 @@ class cronjob_backup_mail extends cronjob { } else { chmod($backup_dir, $backup_dir_permissions); } - system('which pigz > /dev/null', $ret); - if($ret === 0) { + if($app->system->is_installed('pigz')) { $use_pigz = true; } else { $use_pigz = false; @@ -122,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'; @@ -204,7 +208,7 @@ class cronjob_backup_mail extends cronjob { } $dir_handle->close(); rsort($files); - for ($n = $backup_copies; $n <= 10; $n++) { + for ($n = $backup_copies; $n <= self::max_backups; $n++) { if(isset($files[$n]) && is_file($mail_backup_dir.'/'.$files[$n])) { unlink($mail_backup_dir.'/'.$files[$n]); $sql = "DELETE FROM mail_backup WHERE server_id = ? AND parent_domain_id = ? AND filename = ?"; diff --git a/server/lib/classes/cron.d/500-clean_mailboxes.inc.php b/server/lib/classes/cron.d/500-clean_mailboxes.inc.php new file mode 100755 index 0000000000000000000000000000000000000000..711c735db15b3f67f11ad47bfd1550e476630330 --- /dev/null +++ b/server/lib/classes/cron.d/500-clean_mailboxes.inc.php @@ -0,0 +1,99 @@ +db->queryAllRecords("SELECT email, maildir, purge_trash_days, purge_junk_days FROM mail_user WHERE maildir_format = 'maildir' AND disableimap = 'n' AND server_id = ? AND (purge_trash_days > 0 OR purge_junk_days > 0)", $server_id); + + if(is_array($records) && !empty($records)) { + foreach($records as $email) { + if($email['purge_trash_days'] > 0) { + foreach($trash_names as $trash) { + if(is_dir($email['maildir'].'/Maildir/.'.$trash)) { + $app->system->exec_safe($expunge_cmd.intval($email['purge_trash_days']).'d', $email['email'], $trash); + } + } + } + if($email['purge_junk_days'] > 0) { + foreach($junk_names as $junk) { + if(is_dir($email['maildir'].'/Maildir/.'.$junk)) { + $app->system->exec_safe($expunge_cmd.intval($email['purge_junk_days']).'d', $email['email'], $junk); + } + } + } + $app->system->exec_safe($purge_cmd, $email['email']); + $app->system->exec_safe($recalc_cmd, $email['email']); + } + } + + parent::onRunJob(); + } + + /* this function is optional if it contains no custom code */ + public function onAfterRun() { + global $app; + + parent::onAfterRun(); + } + +} + +?> 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 @@ +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 new file mode 100644 index 0000000000000000000000000000000000000000..e38ee58210fe329c1ef0c9b91804f70615528441 --- /dev/null +++ b/server/lib/classes/cron.d/600-jailkit_maintenance.inc.php @@ -0,0 +1,147 @@ + +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_jailkit_maintenance extends cronjob { + + // job schedule + protected $_schedule = '*/5 * * * *'; + protected $_run_at_new = true; + + public function onRunJob() { + global $app, $conf; + + $server_config = $app->getconf->get_server_config($conf['server_id'], 'server'); + + $jailkit_config = $app->getconf->get_server_config($conf['server_id'], 'jailkit'); + if (isset($this->jailkit_config) && isset($this->jailkit_config['jailkit_hardlinks'])) { + if ($this->jailkit_config['jailkit_hardlinks'] == 'yes') { + $options = array('hardlink'); + } elseif ($this->jailkit_config['jailkit_hardlinks'] == 'no') { + $options = array(); + } + } else { + $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; + + $sql = "SELECT domain_id, domain, document_root, system_user, system_group, php_fpm_chroot, jailkit_chroot_app_sections, jailkit_chroot_app_programs, delete_unused_jailkit, last_jailkit_hash FROM web_domain WHERE type = 'vhost' AND (last_jailkit_update IS NULL OR last_jailkit_update < (NOW() - INTERVAL 24 HOUR)) AND server_id = ? ORDER by last_jailkit_update LIMIT ?"; + $records = $app->db->queryAllRecords($sql, $conf['server_id'], $num_jails_to_update); + + foreach($records as $rec) { + if (!is_dir($rec['document_root']) || !is_dir($rec['document_root'].'/etc/jailkit')) { + $app->db->query("UPDATE `web_domain` SET `last_jailkit_update` = NOW() WHERE `document_root` = ?", $rec['document_root']); + continue; + } + + //$app->log('Beginning jailkit maintenance for domain '.$rec['domain'].' at '.$rec['document_root'], LOGLEVEL_DEBUG); + print 'Beginning jailkit maintenance for domain '.$rec['domain'].' at '.$rec['document_root']."\n"; + + // check for any shell_user using this jail + $shell_user_inuse = $app->db->queryOneRecord('SELECT shell_user_id FROM `shell_user` WHERE `parent_domain_id` = ? AND `chroot` = ? AND `server_id` = ?', $rec['domain_id'], 'jailkit', $conf['server_id']); + + // check for any cron job using this jail + $cron_inuse = $app->db->queryOneRecord('SELECT id FROM `cron` WHERE `parent_domain_id` = ? AND `type` = ? AND `server_id` = ?', $rec['domain_id'], 'chrooted', $conf['server_id']); + + $records2 = $app->db->queryAllRecords('SELECT web_folder FROM `web_domain` WHERE `parent_domain_id` = ? AND `document_root` = ? AND web_folder != \'\' AND web_folder IS NOT NULL AND `server_id` = ?', $rec['domain_id'], $rec['document_root'], $conf['server_id']); + foreach ($records2 as $record2) { + if ($record2['web_folder'] == NULL || $record2['web_folder'] == '') { + continue; + } + $options[] = 'skip='.$record2['web_folder']; + } + + if ($shell_user_inuse || $cron_inuse || $rec['php_fpm_chroot'] == 'y' || $rec['delete_unused_jailkit'] != 'y') { + $sections = $jailkit_config['jailkit_chroot_app_sections']; + if (isset($rec['jailkit_chroot_app_sections']) && $rec['jailkit_chroot_app_sections'] != '') { + $sections = $rec['jailkit_chroot_app_sections']; + } + $programs = $jailkit_config['jailkit_chroot_app_programs']; + if (isset($rec['jailkit_chroot_app_programs']) && $rec['jailkit_chroot_app_programs'] != '') { + $programs = $rec['jailkit_chroot_app_programs']; + } + $programs .= ' '.$jailkit_config['jailkit_chroot_cron_programs']; + + $last_updated = preg_split('/[\s,]+/', $sections.' '.$programs); + $last_updated = array_unique($last_updated, SORT_REGULAR); + sort($last_updated, SORT_STRING); + $update_hash = hash('md5', implode(' ', $last_updated)); + + 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 + $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 + $options[] = 'force'; + # bogus hash will not match, triggering an update + $update_hash = 'force_update'.time(); + } + } + + if ($update_hash != $rec['last_jailkit_hash']) { + $app->system->web_folder_protection($rec['document_root'], false); + $app->system->update_jailkit_chroot($rec['document_root'], $sections, $programs, $options); + $app->system->web_folder_protection($rec['document_root'], true); + $app->db->query("UPDATE `web_domain` SET `last_jailkit_update` = NOW(), `last_jailkit_hash` = ? WHERE `document_root` = ?", $update_hash, $rec['document_root']); + } else { + $app->db->query("UPDATE `web_domain` SET `last_jailkit_update` = NOW() WHERE `document_root` = ?", $rec['document_root']); + } + } elseif ($rec['delete_unused_jailkit'] == 'y') { + //$app->log('Removing unused jail: '.$rec['document_root'], LOGLEVEL_DEBUG); + print 'Removing unused jail: '.$rec['document_root']."\n"; + $app->system->web_folder_protection($rec['document_root'], false); + $app->system->delete_jailkit_chroot($rec['document_root'], $options); + $app->system->web_folder_protection($rec['document_root'], true); + + $app->db->query("UPDATE `web_domain` SET `last_jailkit_update` = NOW(), `last_jailkit_hash` = NULL WHERE `document_root` = ?", $rec['document_root']); + } else { + $app->db->query("UPDATE `web_domain` SET `last_jailkit_update` = NOW() WHERE `document_root` = ?", $rec['document_root']); + } + } + + parent::onRunJob(); + } + +} + diff --git a/server/lib/classes/cron.inc.php b/server/lib/classes/cron.inc.php index 67be475fe37249d1df27d13c1d7408a72e9ba1e0..2c7f16170c32bb121e0b33280e15a9614712f488 100644 --- a/server/lib/classes/cron.inc.php +++ b/server/lib/classes/cron.inc.php @@ -246,7 +246,7 @@ class cron { $ts = mktime($iHour, $iMinute, 0, $iMonth, $iDay, $iYear); //print strftime('%d.%m.%Y (%A) %H:%M', $ts) . "\n"; //var_dump($iCurMinute, $iCurHour, $iCurDay, $iCurMonth, $iCurWDay, '--', $iNextMinute, $iNextHour, $iNextDay, $iNextMonth, $iNextWDay); - if(ISPConfigDateTime::last_day($iMonth, $iYear) >= $iDay && in_array($app->functions->intval(strftime('%w', $ts)), $this->_aValidValues['weekday'], true) === true) { + if(ISPConfigDateTime::last_day($iMonth, $iYear) >= $iDay && in_array($app->functions->intval(date('w', $ts)), $this->_aValidValues['weekday'], true) === true) { $bValid = true; } else { if($iYear - $iStartYear > 5) { diff --git a/server/lib/classes/cronjob.inc.php b/server/lib/classes/cronjob.inc.php index 27bc7038cf69dfa25efb05b128b0460afa8d8cc0..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 */ @@ -99,6 +102,13 @@ class cronjob { if($conf['log_priority'] <= LOGLEVEL_DEBUG) print "Called onPrepare() for class " . get_class($this) . "\n"; // check the run time and values for this job + // remove stale cronjobs + $data = $app->db->queryAllRecords("SELECT `last_run` FROM `sys_cron` WHERE `name` = ? AND (`last_run` IS NOT NULL AND `last_run` < DATE_SUB(NOW(), INTERVAL 24 HOUR)) AND `running` = 1", get_class($this)); + foreach ($data as $rec) { + if($conf['log_priority'] <= LOGLEVEL_WARN) print "Removing stale sys_cron entry for ".get_class($this)." (last run ".$rec['last_run'].")\n"; + $app->db->query("DELETE FROM `sys_cron` WHERE `name` = ? AND `last_run` = ? AND `running` = 1", $rec['name'], $rec['last_run']); + } + // get previous run data $data = $app->db->queryOneRecord("SELECT `last_run`, `next_run`, IF(`last_run` IS NOT NULL AND `last_run` < DATE_SUB(NOW(), INTERVAL 24 HOUR), 0, `running`) as `running` FROM `sys_cron` WHERE `name` = ?", get_class($this)); if($data) { @@ -171,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! @@ -181,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/db_mysql.inc.php b/server/lib/classes/db_mysql.inc.php index 9c7269e568624cb7ae2f696929130ad1817b9e63..3096a5b06273aa2347eaa6060688f6bc9b2059c2 100644 --- a/server/lib/classes/db_mysql.inc.php +++ b/server/lib/classes/db_mysql.inc.php @@ -77,11 +77,13 @@ class db $this->dbPort = $port ? $port : $conf['db_port']; $this->dbName = $database ? $database : $conf['db_database']; $this->dbUser = $user ? $user : $conf['db_user']; - $this->dbPass = $pass ? $pass : $conf['db_password']; + $this->dbPass = ( $pass !== NULL ) ? $pass : $conf['db_password']; $this->dbCharset = $conf['db_charset']; $this->dbClientFlags = ($flags !== NULL) ? $flags : $conf['db_client_flags']; $this->_iConnId = mysqli_init(); + mysqli_report(MYSQLI_REPORT_OFF); + mysqli_real_connect($this->_iConnId, $this->dbHost, $this->dbUser, $this->dbPass, '', (int)$this->dbPort, NULL, $this->dbClientFlags); for($try=0;(!is_object($this->_iConnId) || mysqli_connect_errno()) && $try < 5;++$try) { sleep($try); @@ -171,14 +173,10 @@ class db } elseif(is_null($sValue) || (is_string($sValue) && (strcmp($sValue, '#NULL#') == 0))) { $sTxt = 'NULL'; } elseif(is_array($sValue)) { - if(isset($sValue['SQL'])) { - $sTxt = $sValue['SQL']; - } else { - $sTxt = ''; - foreach($sValue as $sVal) $sTxt .= ',\'' . $this->escape($sVal) . '\''; - $sTxt = '(' . substr($sTxt, 1) . ')'; - if($sTxt == '()') $sTxt = '(0)'; - } + $sTxt = ''; + foreach($sValue as $sVal) $sTxt .= ',\'' . $this->escape($sVal) . '\''; + $sTxt = '(' . substr($sTxt, 1) . ')'; + if($sTxt == '()') $sTxt = '(0)'; } else { $sTxt = '\'' . $this->escape($sValue) . '\''; } @@ -259,6 +257,8 @@ class db private function _query($sQuery = '') { global $app; + $aArgs = func_get_args(); + if ($sQuery == '') { $this->_sqlerror('Keine Anfrage angegeben / No query given'); return false; @@ -297,7 +297,6 @@ class db } } while($ok == false); - $aArgs = func_get_args(); $sQuery = call_user_func_array(array(&$this, '_build_query_string'), $aArgs); $this->securityScan($sQuery); $this->_iQueryId = mysqli_query($this->_iConnId, $sQuery); @@ -353,10 +352,17 @@ class db * @return array result row or NULL if none found */ public function queryOneRecord($sQuery = '') { - if(!preg_match('/limit \d+\s*(,\s*\d+)?$/i', $sQuery)) $sQuery .= ' LIMIT 0,1'; $aArgs = func_get_args(); - $oResult = call_user_func_array(array(&$this, 'query'), $aArgs); + if(!empty($aArgs)) { + $sQuery = array_shift($aArgs); + if($sQuery && !preg_match('/limit \d+(\s*,\s*\d+)?$/i', $sQuery)) { + $sQuery .= ' LIMIT 0,1'; + } + array_unshift($aArgs, $sQuery); + } + + $oResult = call_user_func_array([&$this, 'query'], $aArgs); if(!$oResult) return null; $aReturn = $oResult->get(); @@ -559,7 +565,7 @@ class db } elseif(is_object($app) && method_exists($app, 'log') && $bNoLog == false) { $app->log($sErrormsg . $sAddMsg . ' -> ' . $mysql_errno . ' (' . $mysql_error . ')', LOGLEVEL_WARN, false); } elseif(php_sapi_name() == 'cli') { - echo $sErrormsg . $sAddMsg; + echo $sErrormsg . ' ' . $sAddMsg; } } @@ -742,7 +748,7 @@ class db foreach($insert_data as $key => $val) { $key_str .= '??,'; $params[] = $key; - + $val_str .= '?,'; $v_params[] = $val; } @@ -756,7 +762,7 @@ class db $this->query("INSERT INTO ?? $insert_data_str", $tablename); $app->log("deprecated use of passing values to datalogInsert() - table " . $tablename, 1); } - + $old_rec = array(); $index_value = $this->insertID(); if(!$index_value && isset($insert_data[$index_field])) { @@ -1098,6 +1104,75 @@ class db } } + /** + * Get the database type (mariadb or mysql) + * + * @access public + * @return string 'mariadb' or string 'mysql' + */ + + public function getDatabaseType() { + $tmp = $this->queryOneRecord('SELECT VERSION() as version'); + if(stristr($tmp['version'],'mariadb')) { + return 'mariadb'; + } else { + return 'mysql'; + } + } + + /** + * Get the database version + * + * @access public + * @param bool $major_version_only = true will return the major version only, e.g. 8 for MySQL 8 + * @return string version number + */ + + public function getDatabaseVersion($major_version_only = false) { + $tmp = $this->queryOneRecord('SELECT VERSION() as version'); + $version = explode('-', $tmp['version']); + if($major_version_only == true) { + $version_parts = explode('.', $version[0]); + return $version_parts[0]; + } else { + return $version[0]; + } + } + + /** + * Get a mysql password hash + * + * @access public + * @param string cleartext password + * @return string Password hash + */ + + public function getPasswordHash($password) { + + $password_type = 'password'; + + /* Disabled until caching_sha2_password is implemented + if($this->getDatabaseType() == 'mysql' && $this->getDatabaseVersion(true) >= 8) { + // we are in MySQL 8 mode + $tmp = $this->queryOneRecord("show variables like 'default_authentication_plugin'"); + if($tmp['default_authentication_plugin'] == 'caching_sha2_password') { + $password_type = 'caching_sha2_password'; + } + } + */ + + if($password_type == 'caching_sha2_password') { + /* + caching_sha2_password hashing needs to be implemented, have not + found valid PHP implementation for the new password hash type. + */ + } else { + $password_hash = '*'.strtoupper(sha1(sha1($password, true))); + } + + return $password_hash; + } + } /** @@ -1300,7 +1375,7 @@ class fakedb_result { if(!is_array($this->aLimitedData)) return $aItem; - if(list($vKey, $aItem) = each($this->aLimitedData)) { + foreach($this->aLimitedData as $vKey => $aItem) { if(!$aItem) $aItem = null; } return $aItem; diff --git a/server/lib/classes/file.inc.php b/server/lib/classes/file.inc.php index eadb38b789f0cfd9f80d6fd951e53be403616821..28757d0dd50b4e30baab69e29cf14d22dfb4e577 100644 --- a/server/lib/classes/file.inc.php +++ b/server/lib/classes/file.inc.php @@ -158,26 +158,6 @@ class file{ return $ret_val; } - function edit_dist($var, $val){ - global $$var; - $files = array('/root/ispconfig/dist.inc.php'); - foreach($files as $file){ - if(is_file($file)){ - $file_content = $this->unix_nl($this->rf($file)); - $lines = explode("\n", $file_content); - for($i=0;$iwf($file, $file_content); - } - } - } - function getDirectoryListing($dirname, $sortorder = 'a', $show_subdirs = 0, $show_subdirfiles = 0, $exts = '', $ext_save = 1){ // This function will return an array with filenames based on the criteria you can set in the variables // @sortorder : a for ascending (the standard) or d for descending (you can use the "r" for reverse as well, works the same) diff --git a/server/lib/classes/functions.inc.php b/server/lib/classes/functions.inc.php index 1d9dd67569448a2cee200ec71281685fd568517a..34e5943cda865a11fd279c88dcb57785abf810a4 100644 --- a/server/lib/classes/functions.inc.php +++ b/server/lib/classes/functions.inc.php @@ -118,6 +118,26 @@ class functions { return $out; } + public function array_unset_by_value($array, $value) { + if (!is_array($array)) { + return $array; + } + if (is_array($value)) { + foreach ($array as $key => $val){ + if (in_array($val, $value)) { + unset($array[$key]); + } + } + } else { + foreach ($array as $key => $val){ + if ($val == $value) { + unset($array[$key]); + } + } + } + return $array; + } + public function currency_format($number, $view = '') { global $app; if($view != '') $number_format_decimals = (int)$app->lng('number_format_decimals_'.$view); @@ -336,6 +356,34 @@ class functions { } } + + /** + * Normalize a path and strip duplicate slashes from it + * + * This will also remove all /../ from the path, reducing the preceding path elements + * + * @param string $path + * @return string + */ + public function normalize_path($path) { + $path = preg_replace('~[/]{2,}~', '/', $path); + $parts = explode('/', $path); + $return_parts = array(); + + foreach($parts as $current_part) { + if($current_part === '..') { + if(!empty($return_parts) && end($return_parts) !== '') { + array_pop($return_parts); + } + } else { + $return_parts[] = $current_part; + } + } + + return implode('/', $return_parts); + } + + /** IDN converter wrapper. * all converter classes should be placed in ISPC_CLASS_PATH.'/idn/' */ @@ -415,19 +463,21 @@ class functions { } return implode("\n", $domains); } - + public function generate_ssh_key($client_id, $username = ''){ 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/getconf.inc.php b/server/lib/classes/getconf.inc.php index 2c20971adb3ead87e2b3893d4201176ab48e71c4..f8bfc48c0ed178673b7e65749bb47c3ce657e9de 100644 --- a/server/lib/classes/getconf.inc.php +++ b/server/lib/classes/getconf.inc.php @@ -30,34 +30,28 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. class getconf { - var $config; - function get_server_config($server_id, $section = '') { global $app; - if(!is_array($this->config[$server_id])) { - $app->uses('ini_parser'); - $server_id = intval($server_id); - $server = $app->db->queryOneRecord('SELECT config FROM server WHERE server_id = ?', $server_id); - $this->config[$server_id] = $app->ini_parser->parse_ini_string(stripslashes($server['config'])); - } + $app->uses('ini_parser'); + $server_id = intval($server_id); + $server = $app->db->queryOneRecord('SELECT config FROM server WHERE server_id = ?', $server_id); + $config = $app->ini_parser->parse_ini_string(stripslashes($server['config'])); if($section == '') { - return $this->config[$server_id]; + return $config; } else { - return $this->config[$server_id][$section]; + return $config[$section]; } } public function get_global_config($section = '') { global $app; - if(!@is_array($this->config['global'])) { - $app->uses('ini_parser'); - $tmp = $app->db->queryOneRecord('SELECT config FROM sys_ini WHERE sysini_id = 1'); - $this->config['global'] = $app->ini_parser->parse_ini_string(stripslashes($tmp['config'])); - } - return ($section == '') ? $this->config['global'] : $this->config['global'][$section]; + $app->uses('ini_parser'); + $tmp = $app->db->queryOneRecord('SELECT config FROM sys_ini WHERE sysini_id = 1'); + $config = $app->ini_parser->parse_ini_string(stripslashes($tmp['config'])); + return ($section == '') ? $config : $config[$section]; } public function get_security_config($section = '') { diff --git a/server/lib/classes/ini_parser.inc.php b/server/lib/classes/ini_parser.inc.php index d4c94543c6acaf75f5c24ffe1e6a0c0c58bda20d..f75f4b4cb756ae4d07b2eb732e340122c09b8dab 100644 --- a/server/lib/classes/ini_parser.inc.php +++ b/server/lib/classes/ini_parser.inc.php @@ -52,6 +52,75 @@ class ini_parser{ + function parse_ini_file($file) { + if(!is_file($file)) { + return false; + } + return $this->parse_ini_string(file_get_contents($file)); + } + + + + function array_to_ini($array,$out="") { + if(!is_array($array)) { + return $array; + } + $t=""; + $q=false; + foreach($array as $c=>$d) { + if(is_array($d)) { + $t .= $this->array_to_ini($d,$c); + } else { + if($c===intval($c)) { + if(!empty($out)) { + $t.="\r\n".$out." = \"".$d."\""; + if($q!=2) { + $q=true; + } + } else { + $t.="\r\n".$d; + } + } else { + $t.="\r\n".$c." = \"".$d."\""; + $q=2; + } + } + } + if($q!=true && !empty($out)) + return "[".$out."]\r\n".$t; + if(!empty($out)) + return $t; + return trim($t); + } + + + + function write_ini_file($array, $file) { + $ret = false; + $ini = $this->array_to_ini($array); + + if ($fp = fopen($file, 'w')) { + $startTime = microtime(); + do + { + $canWrite = flock($fp, LOCK_EX); + // If lock not obtained sleep for 0 - 100 milliseconds, to avoid collision and CPU load + if(!$canWrite) usleep(round(rand(0, 100)*1000)); + } while ((!$canWrite) and ((microtime()-$startTime) < 1000)); + + // file was locked so now we can store information + if ($canWrite) { + $ret = fwrite($fp, $ini); + flock($fp, LOCK_UN); + } + fclose($fp); + } + return $ret; + } + + + + // unused function, and misleading arg ($file is unused) function get_ini_string($file) { $content = ''; foreach($this->config as $section => $data) { diff --git a/server/lib/classes/ispcmail.inc.php b/server/lib/classes/ispcmail.inc.php index cc83c7413725801af4d0cb6e3192f6a41b833186..f5aa35957753ec1c6ff65d6a9eb555cff747065e 100644 --- a/server/lib/classes/ispcmail.inc.php +++ b/server/lib/classes/ispcmail.inc.php @@ -169,7 +169,7 @@ class ispcmail { $this->smtp_host = $value; break; case 'smtp_port': - $this->smtp_port = $value; + if(intval($value) > 0) $this->smtp_port = $value; break; case 'smtp_user': $this->smtp_user = $value; @@ -586,8 +586,8 @@ class ispcmail { */ private function _smtp_login() { $this->_smtp_conn = fsockopen(($this->smtp_crypt == 'ssl' ? 'tls://' : '') . $this->smtp_host, $this->smtp_port, $errno, $errstr, 30); - $response = fgets($this->_smtp_conn, 515); if(empty($this->_smtp_conn)) return false; + $response = fgets($this->_smtp_conn, 515); //Say Hello to SMTP if($this->smtp_helo == '') $this->detectHelo(); @@ -598,13 +598,23 @@ class ispcmail { if($this->smtp_crypt == 'tls') { fputs($this->_smtp_conn, 'STARTTLS' . $this->_crlf); fgets($this->_smtp_conn, 515); + $crypto_method = STREAM_CRYPTO_METHOD_TLS_CLIENT; if (defined('STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT')) { $crypto_method |= STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT; $crypto_method |= STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT; } - stream_socket_enable_crypto($this->_smtp_conn, true, $crypto_method); + stream_context_set_option($this->_smtp_conn, 'ssl', 'verify_host', false); + stream_context_set_option($this->_smtp_conn, 'ssl', 'verify_peer', false); + stream_context_set_option($this->_smtp_conn, 'ssl', 'verify_peer_name', false); + stream_context_set_option($this->_smtp_conn, 'ssl', 'allow_self_signed', true); + if (stream_socket_enable_crypto($this->_smtp_conn, true, $crypto_method) != true) { + return false; + } + + fputs($this->_smtp_conn, 'HELO ' . $this->smtp_helo . $this->_crlf); + $response = fgets($this->_smtp_conn, 515); } //AUTH LOGIN @@ -817,8 +827,7 @@ class ispcmail { else $rec_string .= $recip; } $to = $this->_encodeHeader($rec_string, $this->mail_charset); - //$result = mail($to, $subject, $this->body, implode($this->_crlf, $headers)); - $result = mail($to, $enc_subject, $this->body, implode($this->_crlf, $headers)); + $result = mail($to, $enc_subject, $this->body, implode($this->_crlf, $headers), "-f $this->_mail_sender"); } // Reset the subject in case mail is resent diff --git a/server/lib/classes/letsencrypt.inc.php b/server/lib/classes/letsencrypt.inc.php index f60ad040e72013707babe5c7ebabefc0318bc3f2..5a69ce18a11e80bf4ef8bba2d784a61e8c50a94e 100644 --- a/server/lib/classes/letsencrypt.inc.php +++ b/server/lib/classes/letsencrypt.inc.php @@ -42,9 +42,9 @@ class letsencrypt { public function __construct(){ } - + 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 2> /dev/null')); $acme = reset($acme); if(is_executable($acme)) { return $acme; @@ -52,18 +52,18 @@ class letsencrypt { return false; } } - + public function get_acme_command($domains, $key_file, $bundle_file, $cert_file, $server_type = 'apache') { - global $app; - + global $app, $conf; + $letsencrypt = $this->get_acme_script(); - + $cmd = ''; // generate cli format foreach($domains as $domain) { $cmd .= (string) " -d " . $domain; } - + if($cmd == '') { return false; } @@ -73,14 +73,15 @@ class letsencrypt { } else { $cert_arg = '--fullchain-file ' . escapeshellarg($bundle_file) . ' --cert-file ' . escapeshellarg($cert_file); } - - $cmd = 'R=0 ; C=0 ; ' . $letsencrypt . ' --issue ' . $cmd . ' -w /usr/local/ispconfig/interface/acme ; R=$? ; if [[ $R -eq 0 || $R -eq 2 ]] ; then ' . $letsencrypt . ' --install-cert ' . $cmd . ' --key-file ' . escapeshellarg($key_file) . ' ' . $cert_arg . ' --reloadcmd ' . escapeshellarg($this->get_reload_command()) . '; C=$? ; fi ; if [[ $C -eq 0 ]] ; then exit $R ; else exit $C ; fi'; - + + $cmd = 'R=0 ; C=0 ; ' . $letsencrypt . ' --issue ' . $cmd . ' -w /usr/local/ispconfig/interface/acme --always-force-new-domain-key --keylength 4096; R=$? ; if [ $R -eq 0 -o $R -eq 2 ] ; then ' . $letsencrypt . ' --install-cert ' . $cmd . ' --key-file ' . escapeshellarg($key_file) . ' ' . $cert_arg . ' --reloadcmd ' . escapeshellarg($this->get_reload_command()) . ' --log ' . escapeshellarg($conf['ispconfig_log_dir'].'/acme.log') . '; C=$? ; fi ; if [ $C -eq 0 ] ; then exit $R ; else exit $C ; fi'; + return $cmd; } - + 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')); + $which_certbot = shell_exec('which certbot /root/.local/share/letsencrypt/bin/letsencrypt /opt/eff.org/certbot/venv/bin/certbot letsencrypt'); + $letsencrypt = explode("\n", $which_certbot ? $which_certbot : ''); $letsencrypt = reset($letsencrypt); if(is_executable($letsencrypt)) { return $letsencrypt; @@ -94,13 +95,13 @@ class letsencrypt { $ret = null; $val = 0; exec($install_cmd . ' 2>&1', $ret, $val); - + return ($val == 0 ? true : false); } - + private function get_reload_command() { global $app, $conf; - + $web_config = $app->getconf->get_server_config($conf['server_id'], 'web'); $daemon = ''; @@ -121,26 +122,27 @@ class letsencrypt { $cmd = $app->system->getinitcommand($daemon, 'force-reload'); return $cmd; } - + public function get_certbot_command($domains) { global $app; - + $letsencrypt = $this->get_certbot_script(); - + $cmd = ''; // generate cli format foreach($domains as $domain) { $cmd .= (string) " --domains " . $domain; } - + if($cmd == '') { return false; } - + + $primary_domain = $domains[0]; $matches = array(); $ret = null; $val = 0; - + $letsencrypt_version = exec($letsencrypt . ' --version 2>&1', $ret, $val); if(preg_match('/^(\S+|\w+)\s+(\d+(\.\d+)+)$/', $letsencrypt_version, $matches)) { $letsencrypt_version = $matches[2]; @@ -151,49 +153,53 @@ class letsencrypt { $acme_version = 'https://acme-v01.api.letsencrypt.org/directory'; } if (version_compare($letsencrypt_version, '0.30', '>=')) { - $app->log("LE version is " . $letsencrypt_version . ", so using certificates command", LOGLEVEL_DEBUG); + $app->log("LE version is " . $letsencrypt_version . ", so using certificates command and --cert-name instead of --expand", LOGLEVEL_DEBUG); $this->certbot_use_certcommand = true; $webroot_map = array(); for($i = 0; $i < count($domains); $i++) { $webroot_map[$domains[$i]] = '/usr/local/ispconfig/interface/acme'; } $webroot_args = "--webroot-map " . escapeshellarg(str_replace(array("\r", "\n"), '', json_encode($webroot_map))); + // --cert-name might be working with earlier versions of certbot, but there is no exact version documented + // So for safety reasons we add it to the 0.30 version check as it is documented to work as expected in this version + $cert_selection_command = "--cert-name $primary_domain"; } else { $webroot_args = "$cmd --webroot-path /usr/local/ispconfig/interface/acme"; + $cert_selection_command = "--expand"; } - - $cmd = $letsencrypt . " certonly -n --text --agree-tos --expand --authenticator webroot --server $acme_version --rsa-key-size 4096 --email postmaster@$domain $cmd --webroot-path /usr/local/ispconfig/interface/acme"; - + + $cmd = $letsencrypt . " certonly -n --text --agree-tos $cert_selection_command --authenticator webroot --server $acme_version --rsa-key-size 4096 --email webmaster@$primary_domain $webroot_args"; + return $cmd; } - + public function get_letsencrypt_certificate_paths($domains = array()) { global $app; - + if($this->get_acme_script()) { return false; } - + if(empty($domains)) return false; if(!is_dir($this->renew_config_path)) return false; - + $dir = opendir($this->renew_config_path); if(!$dir) return false; - + $path_scores = array(); - + $main_domain = reset($domains); sort($domains); $min_diff = false; - + while($file = readdir($dir)) { if($file === '.' || $file === '..' || substr($file, -5) !== '.conf') continue; $file_path = $this->renew_config_path . '/' . $file; if(!is_file($file_path) || !is_readable($file_path)) continue; - + $fp = fopen($file_path, 'r'); if(!$fp) continue; - + $path_scores[$file_path] = array( 'domains' => array(), 'diff' => 0, @@ -211,26 +217,26 @@ class letsencrypt { if($line === '') continue; elseif(!$in_list) { if($line == '[[webroot_map]]') $in_list = true; - + $tmp = explode('=', $line, 2); if(count($tmp) != 2) continue; $key = trim($tmp[0]); if($key == 'cert' || $key == 'privkey' || $key == 'chain' || $key == 'fullchain') { $path_scores[$file_path]['cert_paths'][$key] = trim($tmp[1]); } - + continue; } - + $tmp = explode('=', $line, 2); if(count($tmp) != 2) continue; - + $domain = trim($tmp[0]); if($domain == $main_domain) $path_scores[$file_path]['has_main_domain'] = true; $path_scores[$file_path]['domains'][] = $domain; } fclose($fp); - + sort($path_scores[$file_path]['domains']); if(count(array_intersect($domains, $path_scores[$file_path]['domains'])) < 1) { $path_scores[$file_path]['diff'] = false; @@ -238,13 +244,13 @@ class letsencrypt { // give higher diff value to missing domains than to those that are too much in there $path_scores[$file_path]['diff'] = (count(array_diff($domains, $path_scores[$file_path]['domains'])) * 1.5) + count(array_diff($path_scores[$file_path]['domains'], $domains)); } - + if($min_diff === false || $path_scores[$file_path]['diff'] < $min_diff) $min_diff = $path_scores[$file_path]['diff']; } closedir($dir); if($min_diff === false) return false; - + $cert_paths = false; $used_path = false; foreach($path_scores as $path => $data) { @@ -254,15 +260,15 @@ class letsencrypt { if($data['has_main_domain'] == true) break; } } - + $app->log("Let's Encrypt Cert config path is: " . ($used_path ? $used_path : "not found") . ".", LOGLEVEL_DEBUG); - + return $cert_paths; } - + private function get_ssl_domain($data) { global $app; - + $domain = $data['new']['ssl_domain']; if(!$domain) { $domain = $data['new']['domain']; @@ -276,14 +282,14 @@ class letsencrypt { $domain = substr($domain, 2); } } - + return $domain; } - + public function get_website_certificate_paths($data) { $ssl_dir = $data['new']['document_root'].'/ssl'; $domain = $this->get_ssl_domain($data); - + $cert_paths = array( 'domain' => $domain, 'key' => $ssl_dir.'/'.$domain.'.key', @@ -292,7 +298,7 @@ class letsencrypt { 'crt' => $ssl_dir.'/'.$domain.'.crt', 'bundle' => $ssl_dir.'/'.$domain.'.bundle' ); - + if($data['new']['ssl'] == 'y' && $data['new']['ssl_letsencrypt'] == 'y') { $cert_paths = array( 'domain' => $domain, @@ -302,31 +308,38 @@ class letsencrypt { 'bundle' => $ssl_dir.'/'.$domain.'-le.bundle' ); } - + return $cert_paths; } - + public function request_certificates($data, $server_type = 'apache') { global $app, $conf; - + $app->uses('getconf'); $web_config = $app->getconf->get_server_config($conf['server_id'], 'web'); $server_config = $app->getconf->get_server_config($conf['server_id'], 'server'); - + $use_acme = false; if($this->get_acme_script()) { $use_acme = true; } elseif(!$this->get_certbot_script()) { + $app->log("Unable to find Let's Encrypt client, installing acme.sh.", LOGLEVEL_DEBUG); // acme and le missing $this->install_acme(); + if($this->get_acme_script()) { + $use_acme = true; + } else { + $app->log("Unable to install acme.sh. Cannot proceed, no Let's Encrypt client found.", LOGLEVEL_WARN); + return false; + } } - + $tmp = $app->letsencrypt->get_website_certificate_paths($data); $domain = $tmp['domain']; $key_file = $tmp['key']; $crt_file = $tmp['crt']; $bundle_file = $tmp['bundle']; - + // default values $temp_domains = array($domain); $cli_domain_arg = ''; @@ -345,7 +358,7 @@ class letsencrypt { $temp_domains[] = $subdomain['domain']; } } - + //* then, add alias domain if we have $aliasdomains = $app->db->queryAllRecords('SELECT domain,subdomain FROM web_domain WHERE parent_domain_id = '.intval($data['new']['domain_id'])." AND active = 'y' AND type = 'alias' AND ssl_letsencrypt_exclude != 'y'"); if(is_array($aliasdomains)) { @@ -361,7 +374,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); @@ -395,17 +408,23 @@ class letsencrypt { // unset useless data unset($subdomains); unset($aliasdomains); - + $this->certbot_use_certcommand = false; $letsencrypt_cmd = ''; $allow_return_codes = null; + $old_umask = umask(0022); # work around acme.sh permission bug, see #6015 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); } - + $success = false; if($letsencrypt_cmd) { if(!isset($server_config['migration_mode']) || $server_config['migration_mode'] != 'y') { @@ -420,6 +439,7 @@ class letsencrypt { } if($use_acme === true) { + umask($old_umask); if(!$success) { $app->log('Let\'s Encrypt SSL Cert for: ' . $domain . ' could not be issued.', LOGLEVEL_WARN); $app->log($letsencrypt_cmd, LOGLEVEL_WARN); @@ -428,10 +448,17 @@ class letsencrypt { return true; } } - + $le_files = array(); if($this->certbot_use_certcommand === true && $letsencrypt_cmd) { - $letsencrypt_cmd = $letsencrypt_cmd . " certificates " . $cli_domain_arg; + $cli_domain_arg = ''; + // generate cli format + foreach($temp_domains as $temp_domain) { + $cli_domain_arg .= (string) " --domains " . $temp_domain; + } + + + $letsencrypt_cmd = $this->get_certbot_script() . " certificates " . $cli_domain_arg; $output = explode("\n", shell_exec($letsencrypt_cmd . " 2>/dev/null | grep -v '^\$'")); $le_path = ''; $skip_to_next = true; @@ -439,18 +466,18 @@ class letsencrypt { foreach($output as $outline) { $outline = trim($outline); $app->log("LE CERT OUTPUT: " . $outline, LOGLEVEL_DEBUG); - + if($skip_to_next === true && !preg_match('/^\s*Certificate Name/', $outline)) { continue; } $skip_to_next = false; - + if(preg_match('/^\s*Expiry.*?VALID:\s+\D/', $outline)) { $app->log("Found LE path is expired or invalid: " . $matches[1], LOGLEVEL_DEBUG); $skip_to_next = true; continue; } - + if(preg_match('/^\s*Certificate Path:\s*(\/.*?)\s*$/', $outline, $matches)) { $app->log("Found LE path: " . $matches[1], LOGLEVEL_DEBUG); $le_path = dirname($matches[1]); @@ -461,7 +488,7 @@ class letsencrypt { } } } - + if($le_path) { $le_files = array( 'privkey' => $le_path . '/privkey.pem', @@ -475,32 +502,32 @@ class letsencrypt { $le_files = $this->get_letsencrypt_certificate_paths($temp_domains); } unset($temp_domains); - + if($server_type != 'apache' || version_compare($app->system->getapacheversion(true), '2.4.8', '>=')) { $crt_tmp_file = $le_files['fullchain']; } else { $crt_tmp_file = $le_files['cert']; } - + $key_tmp_file = $le_files['privkey']; $bundle_tmp_file = $le_files['chain']; - + if(!$success) { // error issuing cert $app->log('Let\'s Encrypt SSL Cert for: ' . $domain . ' could not be issued.', LOGLEVEL_WARN); $app->log($letsencrypt_cmd, LOGLEVEL_WARN); - + // if cert already exists, dont remove it. Ex. expired/misstyped/noDnsYet alias domain, api down... if(!file_exists($crt_tmp_file)) { return false; } } - + //* check is been correctly created if(file_exists($crt_tmp_file)) { $app->log("Let's Encrypt Cert file: $crt_tmp_file exists.", LOGLEVEL_DEBUG); $date = date("YmdHis"); - + //* TODO: check if is a symlink, if target same keep it, either remove it if(is_file($key_file)) { $app->system->copy($key_file, $key_file.'.old.'.$date); @@ -528,11 +555,11 @@ class letsencrypt { if(@is_link($bundle_file)) $app->system->unlink($bundle_file); if(@file_exists($bundle_tmp_file)) $app->system->exec_safe("ln -s ? ?", $bundle_tmp_file, $bundle_file); - + return true; } else { $app->log("Let's Encrypt Cert file: $crt_tmp_file does not exist.", LOGLEVEL_DEBUG); return false; } } -} \ No newline at end of file +} diff --git a/server/lib/classes/libdatetime.inc.php b/server/lib/classes/libdatetime.inc.php index fe2b81553b25849fb956cdfa69d1b48e7b77015e..a0633266fc4cd1ea0d31dead028aa194f01906cf 100644 --- a/server/lib/classes/libdatetime.inc.php +++ b/server/lib/classes/libdatetime.inc.php @@ -152,7 +152,7 @@ abstract class ISPConfigDateTime { * - onlytime: HH:MM * - rss: Rss time format for XML * - nice: if you prepend a nice: (like nice:long) you will get results like "today" or "yesterday" if applicable - * - custom: you can give a strftime format like %d.%m.%Y %H:%M if you prepend custom: to it + * - custom: you can give a php date function format like d.m.Y H:i if you prepend custom: to it * @param bool $time if true apped the time to the date string * @param bool $seconds if true append the seconds to the time * @return string date string @@ -174,15 +174,15 @@ abstract class ISPConfigDateTime { $fmt = ''; $prepend = ''; if(substr($format, 0, 5) == 'nice:') { - if(strftime('%d.%m.%Y', $date) == strftime('%d.%m.%Y', $portal->getTime())) { + if(date('d.m.Y', $date) == date('d.m.Y', $portal->getTime())) { if($time == true) $format = 'onlytime'; else $format = ''; $prepend = 'Heute'; - } elseif(strftime('%d.%m.%Y', $date) == strftime('%d.%m.%Y', $portal->getTime() - 86400)) { + } elseif(date('d.m.Y', $date) == date('d.m.Y', $portal->getTime() - 86400)) { if($time == true) $format = 'onlytime'; else $format = ''; $prepend = 'Gestern'; - } elseif(strftime('%d.%m.%Y', $date) == strftime('%d.%m.%Y', $portal->getTime() + 86400)) { + } elseif(date('d.m.Y', $date) == date('d.m.Y', $portal->getTime() + 86400)) { if($time == true) $format = 'onlytime'; else $format = ''; $prepend = 'Morgen'; @@ -195,21 +195,21 @@ abstract class ISPConfigDateTime { $time = false; } - if($format == 'short') $fmt = '%d.%m.%y'; - elseif($format == 'veryshort') $fmt = '%d.%m.'; - elseif($format == 'medium') $fmt = '%d.%m.%Y'; - elseif($format == 'long') $fmt = '%d. %B %Y'; - elseif($format == 'extra') $fmt = '%A, %d. %B %Y'; - elseif($format == 'day') $fmt = '%d'; - elseif($format == 'monthnum') $fmt = '%m'; - elseif($format == 'shortmonth') $fmt = '%b'; - elseif($format == 'month') $fmt = '%B'; - elseif($format == 'shortyear') $fmt = '%y'; - elseif($format == 'year') $fmt = '%Y'; - elseif($format == 'onlydate') $fmt = '%d.%m.'; - elseif($format == 'onlydatelong') $fmt = '%d. %B'; + if($format == 'short') $fmt = 'd.m.y'; + elseif($format == 'veryshort') $fmt = 'd.m.'; + elseif($format == 'medium') $fmt = 'd.m.Y'; + elseif($format == 'long') $fmt = 'd. B Y'; + elseif($format == 'extra') $fmt = 'A, d. B Y'; + elseif($format == 'day') $fmt = 'd'; + elseif($format == 'monthnum') $fmt = 'm'; + elseif($format == 'shortmonth') $fmt = 'b'; + elseif($format == 'month') $fmt = 'B'; + elseif($format == 'shortyear') $fmt = 'y'; + elseif($format == 'year') $fmt = 'Y'; + elseif($format == 'onlydate') $fmt = 'd.m.'; + elseif($format == 'onlydatelong') $fmt = 'd. B'; elseif($format == 'onlytime') { - $fmt = '%H:%M'; + $fmt = 'H:i'; $time = false; } elseif($format == 'rss') { $ret = date(DATE_RSS, $date); @@ -220,9 +220,9 @@ abstract class ISPConfigDateTime { if($prepend != '') $ret = $prepend . ' ' . $ret; return $ret; } - if($time == true) $fmt .= ' %H:%M' . ($seconds == true ? ':%S' : ''); + if($time == true) $fmt .= ' H:i' . ($seconds == true ? ':s' : ''); - if($fmt != '') $ret = strftime($fmt, $date); + if($fmt != '') $ret = date($fmt, $date); else $ret = ''; if($prepend != '') $ret = trim($prepend . ' ' . $ret); @@ -249,10 +249,10 @@ abstract class ISPConfigDateTime { * @return mixed either int (months) or array of int (0 => years, 1 => months) or FALSE on invalid dates */ public static function months_between($date_from, $date_to, $return_years = false, $include_both = false) { - $date_from = self::to_string($date_from, 'custom:%Y%m'); + $date_from = self::to_string($date_from, 'custom:Ym'); if($date_from === false) return $date_from; - $date_to = self::to_string($date_to, 'custom:%Y%m'); + $date_to = self::to_string($date_to, 'custom:Ym'); if($date_to === false) return $date_to; $date_from = intval($date_from); @@ -294,12 +294,12 @@ abstract class ISPConfigDateTime { * @return mixed either int (days) or FALSE on invalid dates */ public static function days_between($date_from, $date_to, $include_both = false) { - $date_from = self::to_string($date_from, 'custom:%Y-%m-%d'); + $date_from = self::to_string($date_from, 'custom:Y-m-d'); if($date_from === false) return $date_from; list($y, $m, $d) = explode('-', $date_from); $ts_from = mktime(0, 0, 0, $m, $d, $y); - $date_to = self::to_string($date_to, 'custom:%Y-%m-%d'); + $date_to = self::to_string($date_to, 'custom:Y-m-d'); if($date_to === false) return $date_to; list($y, $m, $d) = explode('-', $date_to); $ts_to = mktime(0, 0, 0, $m, $d, $y); @@ -364,7 +364,7 @@ abstract class ISPConfigDateTime { if($date === false) $date = $portal->getTime(true); if(is_numeric($date)) { - return $no_time ? strftime('%Y-%m-%d', $date) : strftime('%Y-%m-%d %H:%M:%S', $date); + return $no_time ? date('Y-m-d', $date) : date('Y-m-d H:i:s', $date); } if(preg_match('/^(.*)(\d{1,2}:\d{1,2}(:\d{1,2})?)(\D|$)/', $date, $matches)) { @@ -473,7 +473,7 @@ abstract class ISPConfigDateTime { if($date === false) return $date; list($year, $month, $day) = explode('-', $date); - list($curyear, $curmonth, $curday) = explode('-', strftime('%Y-%m-%d', $portal->getTime())); + list($curyear, $curmonth, $curday) = explode('-', date('Y-m-d', $portal->getTime())); $year_diff = $curyear - $year; $month_diff = $curmonth - $month; diff --git a/server/lib/classes/monitor_tools.inc.php b/server/lib/classes/monitor_tools.inc.php index d8d325fe60fbfc3d1d100ca77ee5c762bbabc9b6..bb0124a26c20a0bfe5f58c4d6a828c643f79fc63 100644 --- a/server/lib/classes/monitor_tools.inc.php +++ b/server/lib/classes/monitor_tools.inc.php @@ -44,12 +44,12 @@ class monitor_tools { //** Debian or Ubuntu if(file_exists('/etc/debian_version')) { - + // Check if this is Ubuntu and not Debian if (strstr(trim(file_get_contents('/etc/issue')), 'Ubuntu') || (is_file('/etc/os-release') && stristr(file_get_contents('/etc/os-release'), 'Ubuntu'))) { - + $issue = file_get_contents('/etc/issue'); - + // Use content of /etc/issue file if(strstr($issue,'Ubuntu')) { if (strstr(trim($issue), 'LTS')) { @@ -75,7 +75,7 @@ class monitor_tools { } else { $lts = ""; } - + $distname = 'Ubuntu'; $distid = 'debian40'; $distbaseid = 'debian'; @@ -87,6 +87,10 @@ class monitor_tools { $mainver = $ver; } switch ($mainver){ + case "20.04": + $relname = "(Focal Fossa)"; + $distconfid = 'ubuntu2004'; + break; case "18.04": $relname = "(Bionic Beaver)"; $distconfid = 'ubuntu1804'; @@ -217,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'; @@ -251,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'; @@ -266,66 +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)')) { + 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 = '9'; - $distid = 'fedora9'; + $distver = '32'; + $distid = 'fedora32'; $distbaseid = 'fedora'; - } elseif(stristr($content, 'Fedora release 10 (Cambridge)')) { + } elseif(stristr($prettyname[0], 'Fedora 33 (Thirty Three)')) { $distname = 'Fedora'; - $distver = '10'; - $distid = 'fedora9'; + $distver = '33'; + $distid = 'fedora33'; $distbaseid = 'fedora'; - } elseif(stristr($content, 'Fedora release 10')) { - $distname = 'Fedora'; - $distver = '11'; - $distid = 'fedora9'; + //** 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 release 5.2 (Final)')) { - $distname = 'CentOS'; - $distver = '5.2'; - $distid = 'centos52'; + //** 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'; - } 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'; - $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'; - $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'; - } } 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')) { @@ -341,7 +366,7 @@ class monitor_tools { } else { die('Unrecognized GNU/Linux distribution'); } - + // Set $distconfid to distid, if no different id for the config is defined if(!isset($distconfid)) $distconfid = $distid; @@ -445,16 +470,21 @@ class monitor_tools { } } - /* Monitor MySQL Server */ - $data['mysqlserver'] = -1; // unknown - not needed - if ($services['db_server'] == 1) { - if ($this->_checkTcp('localhost', 3306)) { - $data['mysqlserver'] = 1; - } else { - $data['mysqlserver'] = 0; - $state = 'error'; // because service is down - } - } + /* Monitor MySQL Server */ + $data['mysqlserver'] = -1; // unknown - not needed + if ($services['db_server'] == 1) { + // hail MySQL server: + mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); + $ispcDB = mysqli_connect($conf['db_host'], $conf['db_user'], $conf['db_password'], $conf['db_database'], $conf['db_port']); + if ($ispcDB !== false) { + $data['mysqlserver'] = 1; + } else { + $data['mysqlserver'] = 0; + $state = 'error'; // because service is down + } + mysqli_close($ispcDB); // we can ignore the result (gwyneth 20220605) + } + /* $data['mongodbserver'] = -1; if ($this->_checkTcp('localhost', 27017)) { @@ -476,11 +506,12 @@ class monitor_tools { return $res; } - public function _getLogData($log) { + public function _getLogData($log, $max_lines = 100) { global $conf; $dist = ''; $logfile = ''; + $journalmatch = ''; if (@is_file('/etc/debian_version')) { $dist = 'debian'; @@ -530,7 +561,7 @@ class monitor_tools { if ($dist == 'debian') { $logfile = '/var/log/syslog'; } elseif ($dist == 'redhat') { - $logfile = '/var/log/messages'; + $journalmatch = ' '; } elseif ($dist == 'suse') { $logfile = '/var/log/messages'; } elseif ($dist == 'gentoo') { @@ -548,6 +579,32 @@ class monitor_tools { $logfile = '/var/log/cron'; } break; + case 'log_letsencrypt': + $check_files = array(); + if(file_exists($conf['ispconfig_log_dir'].'/acme.log')) { + $check_files[] = $conf['ispconfig_log_dir'].'/acme.log'; + } + if(file_exists('/root/.acme.sh/acme.sh') && file_exists('/root/.acme.sh/acme.sh.log')) { + $check_files[] = '/root/.acme.sh/acme.sh.log'; + } + if(file_exists('/usr/local/ispconfig/server/scripts/acme.sh') && file_exists('/usr/local/ispconfig/server/scripts/acme.sh.log')) { + $check_files[] = '/usr/local/ispconfig/server/scripts/acme.sh.log'; + } + if(file_exists('/var/log/letsencrypt/letsencrypt.log')) { + $check_files[] = '/var/log/letsencrypt/letsencrypt.log'; + } + $logfile = ''; + $newest = 0; + + foreach($check_files as $file) { + $mtime = filemtime($file); + if($mtime > $newest) { + $newest = $mtime; + $logfile = $file; + } + } + unset($check_files); + break; case 'log_freshclam': if ($dist == 'debian') { $logfile = '/var/log/clamav/freshclam.log'; @@ -605,27 +662,40 @@ class monitor_tools { if (stristr($logfile, ';') or substr($logfile, 0, 9) != '/var/log/' or stristr($logfile, '..')) { $log = 'Logfile path error.'; } else { - $log = ''; if (is_readable($logfile)) { - $fd = popen('tail -n 100 ' . escapeshellarg($logfile), 'r'); - if ($fd) { - while (!feof($fd)) { - $log .= fgets($fd, 4096); - $n++; - if ($n > 1000) - break; - } - fclose($fd); - } + $log = $this->_getOutputFromExecCommand('tail -n '.intval($max_lines).' ' . escapeshellarg($logfile)); } else { $log = 'Unable to read ' . $logfile; } } + } else { + if($journalmatch != ''){ + $log = $this->_getOutputFromExecCommand('journalctl -n '.intval($max_lines).' --no-pager ' . escapeshellcmd($journalmatch)); + }else{ + $log = 'Unable to read logfile'; + } + } return $log; } + private function _getOutputFromExecCommand ($command) { + $log = ''; + $fd = popen($command, 'r'); + if ($fd) { + $n = 0; + while (!feof($fd)) { + $log .= fgets($fd, 4096); + $n++; + if ($n > 1000) + break; + } + fclose($fd); + } + return $log; + } + private function _checkTcp($host, $port) { /* Try to open a connection */ $fp = @fsockopen($host, $port, $errno, $errstr, 2); @@ -774,7 +844,7 @@ class monitor_tools { } public function send_notification_email($template, $placeholders, $recipients) { - global $conf; + global $app, $conf; if(!is_array($recipients) || count($recipients) < 1) return false; if(!is_array($placeholders)) $placeholders = array(); @@ -791,6 +861,7 @@ class monitor_tools { //* get mail headers, subject and body $mailHeaders = ''; + $mailFrom = ''; $mailBody = ''; $mailSubject = ''; $inHeader = true; @@ -806,6 +877,16 @@ class monitor_tools { $mailSubject = trim($parts[1]); continue; } + if(strtolower($parts[0]) == 'from') { + $mailFrom = trim($parts[1]); + continue; + } + if(strtolower($parts[0]) == 'cc') { + if (! in_array(trim($parts[1]), $recipients)) { + $recipients[] = trim($parts[1]); + } + continue; + } unset($parts); $mailHeaders .= trim($lines[$l]) . "\n"; } else { @@ -816,18 +897,14 @@ class monitor_tools { //* Replace placeholders $mailHeaders = strtr($mailHeaders, $placeholders); + $mailFrom = strtr($mailFrom, $placeholders); $mailSubject = strtr($mailSubject, $placeholders); $mailBody = strtr($mailBody, $placeholders); for($r = 0; $r < count($recipients); $r++) { - mail($recipients[$r], $mailSubject, $mailBody, $mailHeaders); + $app->functions->mail($recipients[$r], $mailSubject, $mailBody, $mailFrom); } - unset($mailSubject); - unset($mailHeaders); - unset($mailBody); - unset($lines); - return true; } diff --git a/server/lib/classes/system.inc.php b/server/lib/classes/system.inc.php index 551e4e485315948f4bf1da53cabb62022dc79808..7e4e7ae447c64bbac3c6a3049d6fafc21ed1a56b 100644 --- a/server/lib/classes/system.inc.php +++ b/server/lib/classes/system.inc.php @@ -36,10 +36,10 @@ class system{ var $data; var $min_uid = 500; var $min_gid = 500; - + private $_last_exec_out = null; private $_last_exec_retcode = null; - + /** * Construct for this class * @@ -872,7 +872,7 @@ class system{ $app->log("Action aborted, file is a symlink: $filename", LOGLEVEL_WARN); return false; } - + if($run_as_user !== null && $run_as_user !== 'root') { if(!$this->check_run_as_user($run_as_user)) { $app->log("Action aborted, invalid run-as-user: $run_as_user", LOGLEVEL_WARN); @@ -934,6 +934,39 @@ class system{ return copy($file1, $file2); } + function move($file1, $file2) { + $cmd = 'mv ? ?'; + $this->exec_safe($cmd, $file1, $file2); + $return_var = $this->last_exec_retcode(); + return $return_var == 0 ? true : 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; + } + function touch($file, $allow_symlink = false){ global $app; if($allow_symlink == false && @file_exists($file) && $this->checkpath($file) == false) { @@ -976,6 +1009,83 @@ class system{ return symlink($cfrom, $to); } + function remove_broken_symlinks($path, $recursive=false) { + global $app; + + if ($path != '/') { + $path = rtrim($path, '/'); + } + if (is_dir($path)) { + $objects = array_diff(scandir($path), array('.', '..')); + foreach ($objects as $object) { + if (is_dir("$path/$object") && $recursive) { + $this->remove_broken_symlinks("$path/$object", $recursive); + } elseif (is_link("$path/$object") && !file_exists("$path/$object")) { + $app->log("removing broken symlink $path/$object", LOGLEVEL_DEBUG); + unlink ("$path/$object"); + } + } + } elseif (is_link("$path") && !file_exists("$path")) { + $app->log("removing broken symlink $path", LOGLEVEL_DEBUG); + unlink ("$path"); + } + } + + function remove_recursive_symlinks($path, $chroot_basedir='', $recursive=false) { + global $app; + + if ($path != '/') { + $path = rtrim($path, '/'); + } + if (strlen($chroot_basedir) > 0) { + if (!is_dir($chroot_basedir)) { + $app->log("remove_recursive_symlink: invalid chroot basedir: $chroot_basedir", LOGLEVEL_DEBUG); + return false; + } + if (!(substr($path, 0, strlen($chroot_basedir)) === $chroot_basedir)) { + $app->log("remove_recursive_symlink: path $path is not below chroot basedir $chroot_basedir", LOGLEVEL_DEBUG); + return false; + } + if ($chroot_basedir != '/') { + $chroot_basedir = rtrim($chroot_basedir, '/'); + } + } + if (is_dir($path)) { + $objects = array_diff(scandir($path), array('.', '..')); + foreach ($objects as $object) { + if (is_dir("$path/$object") && $recursive) { + $this->remove_recursive_symlinks("$path/$object", $chroot_basedir, $recursive); + } elseif (is_link("$path/$object")) { + $realpath = realpath("$path/$object"); + if (strlen($chroot_basedir) > 0 ) { + $root_path = substr("$path/$object", strlen($chroot_basedir)); + if ($root_path && $realpath == $root_path) { + $app->log("removing recursive symlink $path/$object", LOGLEVEL_DEBUG); + unlink ("$path/$object"); + } + } + if ($realpath = "" || $realpath == "$path/$object") { + $app->log("removing recursive symlink $path/$object", LOGLEVEL_DEBUG); + unlink ("$path/$object"); + } + } + } + } elseif (is_link("$path")) { + $realpath = realpath($path); + if (strlen($chroot_basedir) > 0 ) { + $root_path = substr($path, strlen($chroot_basedir)); + if ($root_path && $realpath == $root_path) { + $app->log("removing recursive symlink $path", LOGLEVEL_DEBUG); + unlink ($path); + } + } + if ($realpath = "" || $realpath == $path) { + $app->log("removing recursive symlink $path", LOGLEVEL_DEBUG); + unlink ($path); + } + } + } + function checkpath($path) { $path = trim($path); //* We allow only absolute paths @@ -1261,6 +1371,7 @@ class system{ * Control services to restart etc * */ + /* function daemon_init($daemon, $action){ //* $action = start|stop|restart|reload global $app; @@ -1299,7 +1410,7 @@ class system{ } } } - } + } */ function netmask($netmask){ list($f1, $f2, $f3, $f4) = explode('.', trim($netmask)); @@ -1481,50 +1592,12 @@ 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 * */ function get_time(){ - $addr = 'http://www.ispconfig.org/'; + $addr = 'https://www.ispconfig.org/'; $timeout = 1; $url_parts = parse_url($addr); $path = $url_parts['path']; @@ -1634,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) { @@ -1657,7 +1727,7 @@ class system{ function maildirmake($maildir_path, $user = '', $subfolder = '', $group = '') { global $app, $conf; - + // load the server configuration options $app->uses("getconf"); $mail_config = $app->getconf->get_server_config($conf["server_id"], 'mail'); @@ -1678,7 +1748,7 @@ class system{ if($group != '' && $group != 'root' && $this->is_group($group)) { if(is_dir($dir)) $this->chgrp($dir, $group); - + $chgrp_mdsub = true; } @@ -1694,7 +1764,7 @@ class system{ //* Add the subfolder to the subscriptions and courierimapsubscribed files if($subfolder != '') { - + // Courier if($mail_config['pop3_imap_daemon'] == 'courier') { if(!is_file($maildir_path.'/courierimapsubscribed')) { @@ -1741,7 +1811,7 @@ class system{ } } - + function _exec($command, $allow_return_codes = null) { global $app; $out = array(); @@ -1765,6 +1835,40 @@ class system{ } } + function set_immutable($path, $enable = true, $recursive = false) { + global $app; + + if($this->checkpath($path) == false) { + $app->log("Action aborted, target is a symlink: $path", LOGLEVEL_DEBUG); + return false; + } + + if($path != '' && $path != '/' && strlen($path) > 6 && strpos($path, '..') === false && (is_file($path) || is_dir($path))) { + if($enable) { + $this->exec_safe('chattr +i ?', $path); + } else { + $this->exec_safe('chattr -i ?', $path); + } + + if($enable === false && $recursive === true && is_dir($path)) { + // only allow when removing immutable + $this->exec_safe('chattr -R -i ?', $path); + } + } + } + + public function is_blacklisted_web_path($path) { + $blacklist = array('bin', 'cgi-bin', 'dev', 'etc', 'home', 'lib', 'lib64', 'log', 'ssl', 'usr', 'var', 'proc', 'net', 'sys', 'srv', 'sbin', 'run'); + + $path = ltrim($path, '/'); + $parts = explode('/', $path); + if(in_array(strtolower($parts[0]), $blacklist, true)) { + return true; + } + + return false; + } + function web_folder_protection($document_root, $protect) { global $app, $conf; @@ -1902,9 +2006,9 @@ class system{ function mount_backup_dir($backup_dir, $mount_cmd = '/usr/local/ispconfig/server/scripts/backup_dir_mount.sh'){ global $app, $conf; - + if($this->is_mounted($backup_dir)) return true; - + $mounted = true; if ( is_file($mount_cmd) && is_executable($mount_cmd) && @@ -1958,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); @@ -1998,9 +2169,55 @@ class system{ } } + function getopensslversion($get_minor = false) { + global $app; + if($this->is_installed('openssl')) $cmd = 'openssl version'; + else { + $app->log("Could not check OpenSSL version, openssl not found.", LOGLEVEL_DEBUG); + return '1.0.1'; + } + + exec($cmd, $output, $return_var); + if($return_var != 0 || !$output[0]) { + $app->log("Could not check OpenSSL version, openssl did not return any data.", LOGLEVEL_WARN); + return '1.0.1'; + } + if(preg_match('/OpenSSL\s*(\d+)(\.(\d+)(\.(\d+))*)?(\D|$)/i', $output[0], $matches)) { + return $matches[1] . (isset($matches[3]) ? '.' . $matches[3] : '') . (isset($matches[5]) && $get_minor == true ? '.' . $matches[5] : ''); + } else { + $app->log("Could not check OpenSSL version, did not find version string in openssl output.", LOGLEVEL_WARN); + return '1.0.1'; + } + + } + + function getnginxversion($get_minor = false) { + global $app; + + if($this->is_installed('nginx')) $cmd = 'nginx -v 2>&1'; + else { + $app->log("Could not check Nginx version, nginx not found.", LOGLEVEL_DEBUG); + return false; + } + + exec($cmd, $output, $return_var); + + if($return_var != 0 || !$output[0]) { + $app->log("Could not check Nginx version, nginx did not return any data.", LOGLEVEL_WARN); + return false; + } + + if(preg_match('/nginx version: nginx\/\s*(\d+)(\.(\d+)(\.(\d+))*)?(\D|$)/i', $output[0], $matches)) { + return $matches[1] . (isset($matches[3]) ? '.' . $matches[3] : '') . (isset($matches[5]) && $get_minor == true ? '.' . $matches[5] : ''); + } else { + $app->log("Could not check Nginx version, did not find version string in nginx output.", LOGLEVEL_WARN); + return false; + } + } + function getapacheversion($get_minor = false) { global $app; - + $cmd = ''; if($this->is_installed('apache2ctl')) $cmd = 'apache2ctl -v'; elseif($this->is_installed('apachectl')) $cmd = 'apachectl -v'; @@ -2008,13 +2225,13 @@ class system{ $app->log("Could not check apache version, apachectl not found.", LOGLEVEL_DEBUG); return '2.2'; } - + exec($cmd, $output, $return_var); if($return_var != 0 || !$output[0]) { $app->log("Could not check apache version, apachectl did not return any data.", LOGLEVEL_WARN); return '2.2'; } - + if(preg_match('/version:\s*Apache\/(\d+)(\.(\d+)(\.(\d+))*)?(\D|$)/i', $output[0], $matches)) { return $matches[1] . (isset($matches[3]) ? '.' . $matches[3] : '') . (isset($matches[5]) && $get_minor == true ? '.' . $matches[5] : ''); } else { @@ -2025,7 +2242,7 @@ class system{ function getapachemodules() { global $app; - + $cmd = ''; if($this->is_installed('apache2ctl')) $cmd = 'apache2ctl -t -D DUMP_MODULES'; elseif($this->is_installed('apachectl')) $cmd = 'apachectl -t -D DUMP_MODULES'; @@ -2033,23 +2250,23 @@ class system{ $app->log("Could not check apache modules, apachectl not found.", LOGLEVEL_WARN); return array(); } - + exec($cmd . ' 2>/dev/null', $output, $return_var); if($return_var != 0 || !$output[0]) { $app->log("Could not check apache modules, apachectl did not return any data.", LOGLEVEL_WARN); return array(); } - + $modules = array(); for($i = 0; $i < count($output); $i++) { if(preg_match('/^\s*(\w+)\s+\((shared|static)\)\s*$/', $output[$i], $matches)) { $modules[] = $matches[1]; } } - + return $modules; } - + //* ISPConfig mail function public function mail($to, $subject, $text, $from, $filepath = '', $filetype = 'application/pdf', $filename = '', $cc = '', $bcc = '', $from_name = '') { global $app, $conf; @@ -2076,65 +2293,95 @@ class system{ $app->ispcmail->send($to); $app->ispcmail->finish(); - + return true; } - + public function is_allowed_user($username, $check_id = true, $restrict_names = false) { global $app; - + $name_blacklist = array('root','ispconfig','vmail','getmail'); if(in_array($username,$name_blacklist)) return false; - + if(preg_match('/^[a-zA-Z0-9\.\-_]{1,32}$/', $username) == false) return false; - + if($check_id && intval($this->getuid($username)) < $this->min_uid) return false; - + if($restrict_names == true && preg_match('/^web\d+$/', $username) == false) return false; - + return true; } - + public function is_allowed_group($groupname, $check_id = true, $restrict_names = false) { global $app; - + $name_blacklist = array('root','ispconfig','vmail','getmail'); if(in_array($groupname,$name_blacklist)) return false; - + if(preg_match('/^[a-zA-Z0-9\.\-_]{1,32}$/', $groupname) == false) return false; - + if($check_id && intval($this->getgid($groupname)) < $this->min_gid) return false; - + if($restrict_names == true && preg_match('/^client\d+$/', $groupname) == false) return false; - + + return true; + } + + public function is_allowed_path($path) { + global $app; + + $path = $app->functions->normalize_path($path); + if(file_exists($path)) { + $path = realpath($path); + } + + $blacklisted_paths_regex = array( + '@^/$@', + '@^/proc(/.*)?$@', + '@^/sys(/.*)?$@', + '@^/etc(/.*)?$@', + '@^/dev(/.*)?$@', + '@^/tmp(/.*)?$@', + '@^/run(/.*)?$@', + '@^/boot(/.*)?$@', + '@^/root(/.*)?$@', + '@^/var(/?|/backups?(/.*)?)?$@', + ); + + foreach($blacklisted_paths_regex as $regex) { + if(preg_match($regex, $path)) { + return false; + } + } + return true; } - + public function last_exec_out() { return $this->_last_exec_out; } - + public function last_exec_retcode() { return $this->_last_exec_retcode; } - + public function exec_safe($cmd) { global $app; - + + $args = func_get_args(); $arg_count = func_num_args(); if($arg_count != substr_count($cmd, '?') + 1) { trigger_error('Placeholder count not matching argument list.', E_USER_WARNING); return false; } if($arg_count > 1) { - $args = func_get_args(); array_shift($args); $pos = 0; $a = 0; foreach($args as $value) { $a++; - + $pos = strpos($cmd, '?', $pos); if($pos === false) { break; @@ -2144,22 +2391,30 @@ class system{ $pos += strlen($value); } } - + $this->_last_exec_out = null; $this->_last_exec_retcode = null; $ret = exec($cmd, $this->_last_exec_out, $this->_last_exec_retcode); - + $app->log("safe_exec cmd: " . $cmd . " - return code: " . $this->_last_exec_retcode, LOGLEVEL_DEBUG); - + return $ret; } - + public function system_safe($cmd) { call_user_func_array(array($this, 'exec_safe'), func_get_args()); return implode("\n", $this->_last_exec_out); } - + public function create_jailkit_user($username, $home_dir, $user_home_dir, $shell = '/bin/bash', $p_user = null, $p_user_home_dir = null) { + global $app; + + // Disallow operating on root directory + if(realpath($home_dir) == '/') { + $app->log("create_jailkit_user: invalid home_dir: $home_dir", LOGLEVEL_WARN); + return false; + } + // Check if USERHOMEDIR already exists if(!is_dir($home_dir . '/.' . $user_home_dir)) { $this->mkdirpath($home_dir . '/.' . $user_home_dir, 0755, $username); @@ -2178,100 +2433,518 @@ class system{ $cmd = 'usermod --home=? ? 2>/dev/null'; $this->exec_safe($cmd, $home_dir . '/.' . $p_user_home_dir, $p_user); } - + + return true; + } + + public function create_jailkit_chroot($home_dir, $app_sections = array(), $options = array()) { + global $app; +$app->log("create_jailkit_chroot: called for home_dir $home_dir with options: " . print_r($options, true), LOGLEVEL_DEBUG); + + // Disallow operating on root directory + if(realpath($home_dir) == '/') { + $app->log("create_jailkit_chroot: invalid home_dir: $home_dir", LOGLEVEL_WARN); + return false; + } + + if(!is_dir($home_dir)) { + $app->log("create_jailkit_chroot: jail directory does not exist: $home_dir", LOGLEVEL_WARN); + return false; + } + if(empty($app_sections)) { + return true; + } elseif(is_string($app_sections)) { + $app_sections = preg_split('/[\s,]+/', $app_sections); + } + if(! is_array($options)) { + $options = (is_string($options) ? preg_split('/[\s,]+/', $options) : array()); + } + + // Change ownership of the chroot directory to root + $this->chown($home_dir, 'root'); + $this->chgrp($home_dir, 'root'); + + $program_args = ''; + foreach ($options as $opt) { + switch ($opt) { + case '-k': + case 'hardlink': + $program_args .= ' -k'; + break; + case '-f': + case 'force': + $program_args .= ' -f'; + break; + } + } + # /etc/jailkit/jk_init.ini is the default path, probably not needed? + $program_args .= ' -c /etc/jailkit/jk_init.ini -j ?'; + foreach($app_sections as $app_section) { + if ($app_section == '') { + continue; + } + # should check that section exists with jk_init --list ? + $program_args .= ' ' . escapeshellarg($app_section); + } + + // Initialize the chroot into the specified directory with the specified applications + $cmd = 'jk_init' . $program_args; + $this->exec_safe($cmd, $home_dir); + + // Create the tmp and /var/run directories + if(!is_dir($home_dir . '/tmp')) { + $this->mkdirpath($home_dir . '/tmp', 0770); + } else { + $this->chmod($home_dir . '/tmp', 0770, true); + } + if(!is_dir($home_dir . '/var/run')) { + $this->mkdirpath($home_dir . '/var/run', 0755); + } else { + $this->chmod($home_dir . '/var/run', 0755, true); + } + if(!is_dir($home_dir . '/var/tmp')) { + $this->mkdirpath($home_dir . '/var/tmp', 0770); + } else { + $this->chmod($home_dir . '/var/tmp', 0770, true); + } + + // Fix permissions of the root directory + $this->chmod($home_dir . '/bin', 0755, true); // was chmod g-w $CHROOT_HOMEDIR/bin + return true; } - - public function create_jailkit_programs($home_dir, $programs = array()) { + + public function create_jailkit_programs($home_dir, $programs = array(), $options = array()) { + global $app; +$app->log("create_jailkit_programs: called for home_dir $home_dir with options: " . print_r($options, true), LOGLEVEL_DEBUG); + + // Disallow operating on root directory + if(realpath($home_dir) == '/') { + $app->log("create_jailkit_programs: invalid home_dir: $home_dir", LOGLEVEL_WARN); + return false; + } + + if(!is_dir($home_dir)) { + $app->log("create_jailkit_programs: jail directory does not exist: $home_dir", LOGLEVEL_WARN); + return false; + } if(empty($programs)) { return true; } elseif(is_string($programs)) { $programs = preg_split('/[\s,]+/', $programs); } + if(! is_array($options)) { + $options = (is_string($options) ? preg_split('/[\s,]+/', $options) : array()); + } + + # prohibit ill-advised copying paths known to be sensitive/problematic + # (easy to bypass if needed, eg. use /./etc) + $blacklisted_paths_regex = array( + '@^/$@', + '@^/proc(/.*)?$@', + '@^/sys(/.*)?$@', + '@^/etc/?$@', + '@^/dev/?$@', + '@^/tmp/?$@', + '@^/run/?$@', + '@^/boot/?$@', + '@^/var(/?|/backups?/?)?$@', + ); + $program_args = ''; + foreach ($options as $opt) { + switch ($opt) { + case '-k': + case 'hardlink': + $program_args .= ' -k'; + break; + case '-f': + case 'force': + $program_args .= ' -f'; + break; + } + } + $program_args .= ' -j ?'; + + $bad_paths = array(); foreach($programs as $prog) { - $program_args .= ' ' . escapeshellarg($prog); + if ($prog == '') { + continue; + } + foreach ($blacklisted_paths_regex as $re) { + if (preg_match($re, $prog, $matches)) { + $bad_paths[] = $matches[0]; + } + } + if (count($bad_paths) > 0) { + $app->log("Prohibited path not added to jail $home_dir: " . implode(", ", $bad_paths), LOGLEVEL_WARN); + } else { + $program_args .= ' ' . escapeshellarg($prog); + } } - - $cmd = 'jk_cp -k ?' . $program_args; - $this->exec_safe($cmd, $home_dir); - + + if (count($programs) > count($bad_paths)) { + $cmd = 'jk_cp' . $program_args; + $this->exec_safe($cmd, $home_dir); + } + return true; } - - public function create_jailkit_chroot($home_dir, $app_sections = array()) { - if(empty($app_sections)) { - return true; - } elseif(is_string($app_sections)) { - $app_sections = preg_split('/[\s,]+/', $app_sections); + + public function update_jailkit_chroot($home_dir, $sections = array(), $programs = array(), $options = array()) { + global $app; + +$app->log("update_jailkit_chroot called for $home_dir with options ".print_r($options, true), LOGLEVEL_DEBUG); + $app->uses('ini_parser'); + + // Disallow operating on root directory + if(realpath($home_dir) == '/') { + $app->log("update_jailkit_chroot: invalid home_dir: $home_dir", LOGLEVEL_WARN); + return false; } - + + if(!is_dir($home_dir)) { + $app->log("update_jailkit_chroot: jail directory does not exist: $home_dir", LOGLEVEL_WARN); + return false; + } + + $jailkit_directories = array( + 'bin', + 'dev', + 'etc', + 'lib', + 'lib32', + 'lib64', + 'opt', + 'sys', + 'usr', + 'var', + ); + + $opts = array(); + $jk_update_args = ''; + $jk_cp_args = ''; + $skips = ''; + foreach ($options as $opt) { + switch ($opt) { + case '-k': + case 'hardlink': + $opts[] = 'hardlink'; + $jk_update_args .= ' -k'; + $jk_cp_args .= ' -k'; + break; + case '-f': + case 'force': + $opts[] = 'force'; + $jk_cp_args .= ' -f'; + break; + default: + if (preg_match('@^skip[ =]/?(.+)$@', $opt, $matches) ) { + if (in_array($matches[1], $jailkit_directories)) { + $app->log("update_jailkit_chroot: skipping update of jailkit directory $home_dir/".$matches[1] + . "; if this is in use as a web folder, it is insecure and should be fixed.", LOGLEVEL_WARN); + } + $jailkit_directories = $app->functions->array_unset_by_value($jailkit_directories, $matches[1]); + $skips .= ' --skip=/'.escapeshellarg($matches[1]); + } + break; + } + } + // Change ownership of the chroot directory to root $this->chown($home_dir, 'root'); $this->chgrp($home_dir, 'root'); - $app_args = ''; - foreach($app_sections as $app_section) { - $app_args .= ' ' . escapeshellarg($app_section); + $multiple_links = array(); + foreach ($jailkit_directories as $dir) { + $root_dir = '/'.$dir; + $jail_dir = rtrim($home_dir, '/') . '/'.$dir; + + if (!is_dir($jail_dir)) { + $skips .= " --skip=/$dir"; + continue; + } + + // if directory exists in jail but not in root, remove it + if (is_dir($jail_dir) && !is_dir($root_dir)) { + $this->rmdir($jail_dir, true); + $skips .= " --skip=/$dir"; + continue; + } + + $this->remove_broken_symlinks($jail_dir, true); + $this->remove_recursive_symlinks($jail_dir, $home_dir, true); + + // save list of hardlinked files + if (!(in_array('hardlink', $opts) || in_array('allow_hardlink', $options))) { +$app->log("update_jailkit_chroot: searching for hardlinks in $jail_dir", LOGLEVEL_DEBUG); + $find_multiple_links = function ( $path ) use ( &$find_multiple_links ) { + $found = array(); + if (is_dir($path) && !is_link($path)) { + $objects = array_diff(scandir($path), array('.', '..')); + foreach ($objects as $object) { + $ret = $find_multiple_links( "$path/$object" ); + if (count($ret) > 0) { + $found = array_merge($found, $ret); + } + } + } elseif (is_file($path)) { + $stat = lstat($path); + if ($stat['nlink'] > 1) { + $found[$path] = $path; + } + } + return $found; + }; + + $ret = $find_multiple_links($jail_dir); + if (count($ret) > 0) { + $multiple_links = array_merge($multiple_links, $ret); + } + + // remove broken symlinks a second time after hardlink cleanup + $this->remove_broken_symlinks($jail_dir, true); + } +else { $app->log("update_jailkit_chroot: NOT searching for hardlinks in $jail_dir, options: ".print_r($options, true), LOGLEVEL_DEBUG); } } - - // Initialize the chroot into the specified directory with the specified applications - $cmd = 'jk_init -f -k -c /etc/jailkit/jk_init.ini -j ?' . $app_args; + + foreach ($multiple_links as $file) { + $app->log("update_jailkit_chroot: removing hardlinked file: $file", LOGLEVEL_DEBUG); + unlink($file); + } + + $cmd = 'jk_update --jail=?' . $jk_update_args . $skips; $this->exec_safe($cmd, $home_dir); +$app->log('jk_update returned: '.print_r($this->_last_exec_out, true), LOGLEVEL_DEBUG); + # handle jk_update output + foreach ($this->_last_exec_out as $line) { + # jk_update sample output: + # skip /var/www/clients/client1/web1/opt/ + # removing outdated file /var/www/clients/client15/web19/usr/bin/host + # removing deprecated directory /var/www/clients/client15/web19/usr/lib/x86_64-linux-gnu/libtasn1.so.6.5.3 + # Creating symlink /var/www/clients/client15/web19/lib/x86_64-linux-gnu/libicudata.so.65 to libicudata.so.65.1 + # Copying /usr/bin/mysql to /var/www/clients/client15/web19/usr/bin/mysql + if (preg_match('@^(skip|removing (outdated|deprecated)|Creating|Copying)@', $line)) { + continue; + } + + # jk_update sample output: + # ERROR: failed to remove deprecated directory /var/www/clients/client1/web10/usr/lib/x86_64-linux-gnu/libGeoIP.so.1.6.9 + if (preg_match('@^(?:[^ ]+ ){6}(?:.+)('.preg_quote($home_dir, '@').'.+)@', $line, $matches)) { + # remove deprecated files that jk_update failed to remove + if (is_file($matches[1]) || is_link($matches[1])) { +$app->log("update_jailkit_chroot: removing deprecated file which jk_update failed to remove: ".$matches[1], LOGLEVEL_DEBUG); + unlink($matches[1]); + } elseif (is_dir($matches[1]) && !is_link($matches[1])) { +$app->log("update_jailkit_chroot: removing deprecated directory which jk_update failed to remove: ".$matches[1], LOGLEVEL_DEBUG); + $this->rmdir($matches[1], true); + } else { + # unhandled error + //$app->log("jk_update error for jail $home_dir: ".$matches[1], LOGLEVEL_DEBUG); + // at least for 3.2 beta, lets gather some of this info: + $app->log("jk_update error for jail $home_dir, feel free to pass to ispconfig developers: ".print_r( $matches, true), LOGLEVEL_DEBUG); + } + + # any other ERROR or WARNING + # sample so far: + # ERROR: /usr/bin/nano does not exist + # WARNING: section [whatever] does not exist in /etc/jailkit/jk_init.ini + } elseif (preg_match('/^(WARNING|ERROR)/', $line, $matches)) { + $app->log("jk_update: $line", LOGLEVEL_DEBUG); + } + } + + // reinstall jailkit sections and programs + if(!(empty($sections) && empty($programs))) { + $this->create_jailkit_chroot($home_dir, $sections, $opts); + $this->create_jailkit_programs($home_dir, $programs, $opts); + } - // Create the temp directory + // Create the tmp and /var/run directories if(!is_dir($home_dir . '/tmp')) { - $this->mkdirpath($home_dir . '/tmp', 0777); + $this->mkdirpath($home_dir . '/tmp', 0770); + } else { + $this->chmod($home_dir . '/tmp', 0770, true); + } + if(!is_dir($home_dir . '/var/run')) { + $this->mkdirpath($home_dir . '/var/run', 0755); } else { - $this->chmod($home_dir . '/tmp', 0777, true); + $this->chmod($home_dir . '/var/run', 0755, true); + } + if(!is_dir($home_dir . '/var/tmp')) { + $this->mkdirpath($home_dir . '/var/tmp', 0770); + } else { + $this->chmod($home_dir . '/var/tmp', 0770, true); + } + + // TODO: Set /usr/bin/php symlink to php version of the website. + // + // Currently server_php does not have a field for the cli path; + // we can guess/determing according to OS-specific conventions or add that field. + // Then symlink /usr/bin/php (or correct OS-specific path) to that location. + + // search for any hardlinked files which are now missing + if (!(in_array('hardlink', $opts) || in_array('allow_hardlink', $options))) { + foreach ($multiple_links as $file) { + if (!is_file($file)) { + // strip $home_dir from $file + if (substr($file, 0, strlen(rtrim($home_dir, '/'))) == rtrim($home_dir, '/')) { + $file = substr($file, strlen(rtrim($home_dir, '/'))); + } + if (is_file($file)) { // file exists in root + $app->log("update_jailkit_chroot: previously hardlinked file still missing, running jk_cp to restore: $file", LOGLEVEL_DEBUG); + $cmd = 'jk_cp -j ? ' . $jk_cp_args . ' ' . escapeshellarg($file); + $this->exec_safe($cmd, $home_dir); + } else { + // not necessarily an error + $app->log("update_jailkit_chroot: previously hardlinked file was not restored and is no longer present in system: $file", LOGLEVEL_DEBUG); + } + } + } } // Fix permissions of the root firectory $this->chmod($home_dir . '/bin', 0755, true); // was chmod g-w $CHROOT_HOMEDIR/bin - // mysql needs the socket in the chrooted environment - $this->mkdirpath($home_dir . '/var/run/mysqld'); - - // ln /var/run/mysqld/mysqld.sock $CHROOT_HOMEDIR/var/run/mysqld/mysqld.sock - if(!file_exists("/var/run/mysqld/mysqld.sock")) { - $this->exec_safe('ln ? ?', '/var/run/mysqld/mysqld.sock', $home_dir . '/var/run/mysqld/mysqld.sock'); + // remove non-existent jails from /etc/jailkit/jk_socketd.ini + if (is_file('/etc/jailkit/jk_socketd.ini')) { + $rewrite = false; + $jk_socketd_ini = $app->ini_parser->parse_ini_file('/etc/jailkit/jk_socketd.ini'); + foreach ($jk_socketd_ini as $log => $settings) { + $jail = preg_replace('@/dev/log$@', '', $log); + if ($jail != $log && !is_dir($jail)) { + unset($jk_socketd_ini[$log]); + $rewrite=true; + } + } + if ($rewrite) { + $app->log('update_jailkit_chroot: writing /etc/jailkit/jk_socketd.ini', LOGLEVEL_DEBUG); + $app->ini_parse->write_ini_file($jk_socketd_ini, '/etc/jailkit/jk_socketd.ini'); + } } - + return true; } - - + + public function delete_jailkit_chroot($home_dir, $options = array()) { + global $app; + +$app->log("delete_jailkit_chroot called for $home_dir with options ".print_r($options, true), LOGLEVEL_DEBUG); + $app->uses('ini_parser'); + + // Disallow operating on root directory + if(realpath($home_dir) == '/') { + $app->log("delete_jailkit_chroot: invalid home_dir: $home_dir", LOGLEVEL_WARN); + return false; + } + + if(!is_dir($home_dir)) { + $app->log("delete_jailkit_chroot: jail directory does not exist: $home_dir", LOGLEVEL_DEBUG); + return false; + } + + $jailkit_directories = array( + 'bin', + 'dev', + 'etc', + 'lib', + 'lib32', + 'lib64', + 'opt', + 'sys', + 'usr', + 'var', + 'run', # not used by jailkit, but added for cleanup + ); + + foreach ($options as $opt) { + switch ($opt) { + default: + if (preg_match('@^skip[ =]/?(.+)$@', $opt, $matches) ) { + $matches[1] = ltrim($matches[1], '/'); + if (in_array($matches[1], $jailkit_directories)) { + $app->log("delete_jailkit_chroot: skipping removal of jailkit directory .$home_dir/".$matches[1] + . "; if this is in use as a web folder, it is insecure and should be fixed.", LOGLEVEL_WARN); + } + $jailkit_directories = $app->functions->array_unset_by_value($jailkit_directories, $matches[1]); + } + break; + } + } + + $removed = ''; + foreach ($jailkit_directories as $dir) { + $jail_dir = rtrim($home_dir, '/') . '/'.$dir; + + if (is_link($jail_dir)) { + unlink($jail_dir); + $removed .= ' /'.$dir; + } elseif (is_dir($jail_dir)) { + $this->rmdir($jail_dir, true); + $removed .= ' /'.$dir; + } + + } + + $app->log("delete_jailkit_chroot: removed from jail $home_dir: $removed", LOGLEVEL_DEBUG); + + // remove /home if empty + $home = rtrim($home_dir, '/') . '/home'; + @rmdir($home); # ok to fail if non-empty + + // otherwise archive under /private + $private = rtrim($home_dir, '/') . '/private'; + if (is_dir($home) && is_dir($private)) { + $archive = $private.'/home-'.date('c'); + rename($home, $archive); + } + + // remove $home_dir from /etc/jailkit/jk_socketd.ini + if (is_file('/etc/jailkit/jk_socketd.ini')) { + $jk_socketd_ini = $app->ini_parser->parse_ini_file('/etc/jailkit/jk_socketd.ini'); + $log = $home . '/dev/log'; + if (isset($jk_socketd_ini[$log])) { + unset($jk_socketd_ini[$log]); + $app->log('delete_jailkit_chroot: writing /etc/jailkit/jk_socketd.ini', LOGLEVEL_DEBUG); + $app->ini_parse->write_ini_file($jk_socketd_ini, '/etc/jailkit/jk_socketd.ini'); + } + } + + return true; + } + + public function pipe_exec($cmd, $stdin, &$retval = null, &$stderr = null) { $descriptors = array( 0 => array('pipe', 'r'), 1 => array('pipe', 'w'), 2 => array('pipe', 'w') ); - + $result = ''; $pipes = null; $proc = proc_open($cmd, $descriptors, $pipes); if(is_resource($proc)) { fwrite($pipes[0], $stdin); fclose($pipes[0]); - + $result = stream_get_contents($pipes[1]); $stderr = stream_get_contents($pipes[2]); fclose($pipes[1]); fclose($pipes[2]); - + $retval = proc_close($proc); - + return $result; } else { return false; } } - + private function get_sudo_command($cmd, $run_as_user) { return 'sudo -u ' . escapeshellarg($run_as_user) . ' sh -c ' . escapeshellarg($cmd); } - + private function check_run_as_user($username) { if(preg_match('/^[a-zA-Z0-9_\-]+$/', $username)) { return true; diff --git a/server/lib/classes/tpl.inc.php b/server/lib/classes/tpl.inc.php index 70dc2e783cf4c37b4bafe0e73c453a30e47e16cd..a4ba1602529663254b096a91e3151ed6c6d29aec 100644 --- a/server/lib/classes/tpl.inc.php +++ b/server/lib/classes/tpl.inc.php @@ -1099,7 +1099,7 @@ if (!defined('vlibTemplateClassLoaded')) { { array_push($this->_namespace, $varname); $tempvar = count($this->_namespace) - 1; - $retstr = "for (\$_".$tempvar."=0 ; \$_".$tempvar." < count(\$this->_arrvars"; + $retstr = "for (\$_".$tempvar."=0 ; \$_".$tempvar." < \$this->_tpl_count(\$this->_arrvars"; for ($i=0; $i < count($this->_namespace); $i++) { $retstr .= "['".$this->_namespace[$i]."']"; if ($this->_namespace[$i] != $varname) $retstr .= "[\$_".$i."]"; @@ -1439,6 +1439,27 @@ if (!defined('vlibTemplateClassLoaded')) { return $return; } + /** + * Used during in evaled code to replace PHP count function for PHP 8 compatibility + * @var variable to be counted + */ + private function _tpl_count($var) + { + $retvar = 0; + if(isset($var)) { + if(is_array($var)) { + $retvar = count($var); + } elseif(is_null($var)) { + $retvar = 0; + } else { + $retvar = 1; + } + } else { + $retvar = 0; + } + return $retvar; + } + /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - The following functions have no use and are included just so that if the user is making use of vlibTemplateCache functions, this doesn't crash when changed to diff --git a/server/lib/classes/tpl_ini.inc.php b/server/lib/classes/tpl_ini.inc.php index 792dacbece793e095541caca39451de0733d57d9..6f9f83731bd2e89eae6c8578674173f77fae5914 100644 --- a/server/lib/classes/tpl_ini.inc.php +++ b/server/lib/classes/tpl_ini.inc.php @@ -89,7 +89,7 @@ if (!defined('vlibIniClassLoaded')) { /* the following are only used by the vlibTemplateCache class. */ - 'CACHE_DIRECTORY' => $conf["template"]["cache_dir"], + 'CACHE_DIRECTORY' => (isset($conf["template"]["cache_dir"]))?$conf["template"]["cache_dir"]:'', // Directory where the cached filesystem // will be set up (full path, and must be writable) // '/' or '\' off the end of the directory. 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 @@ + +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/remoteaction_core_module.inc.php b/server/mods-available/remoteaction_core_module.inc.php index 3b6bb9fb497366c4e2d05d2324777a6eb0273620..56cc3745c213976712adaeaa6bce1db33ce999a1 100644 --- a/server/mods-available/remoteaction_core_module.inc.php +++ b/server/mods-available/remoteaction_core_module.inc.php @@ -172,16 +172,18 @@ class remoteaction_core_module { /* * Do the update */ - exec("aptitude update"); - exec("aptitude safe-upgrade -y"); + //Guess this is not wanted here? + //exec("aptitude update"); + //exec("aptitude safe-upgrade -y"); //TODO : change this when distribution information has been integrated into server record if(file_exists('/etc/gentoo-release')) { exec("glsa-check -f --nocolor affected"); - } - else { - exec("aptitude update"); - exec("aptitude safe-upgrade -y"); + } elseif(file_exists('/etc/redhat-release')) { + exec("which dnf &> /dev/null && dnf -y update || yum -y update"); + } else { + exec("apt-get update"); + exec("apt-get -y upgrade"); } /* @@ -192,14 +194,14 @@ class remoteaction_core_module { private function _doIspCUpdate($action) { global $app; - + // Ensure that this code is not executed twice as this would cause a loop in case of a failure $this->_actionDone($action['action_id'], 'ok'); /* * Get the version-number of the newest version */ - $new_version = @file_get_contents('http://www.ispconfig.org/downloads/ispconfig3_version.txt'); + $new_version = @file_get_contents('https://www.ispconfig.org/downloads/ispconfig3_version.txt'); $new_version = trim($new_version); /* @@ -215,7 +217,7 @@ class remoteaction_core_module { exec("rm /tmp/ispconfig3_install -R"); /* get the newest version */ - $app->system->exec_safe("wget ?", "http://www.ispconfig.org/downloads/ISPConfig-" . $new_version . ".tar.gz"); + $app->system->exec_safe("wget ?", "https://www.ispconfig.org/downloads/ISPConfig-" . $new_version . ".tar.gz"); /* extract the files */ $app->system->exec_safe("tar xvfz ?", "ISPConfig-" . $new_version . ".tar.gz"); diff --git a/server/mods-available/server_module.inc.php b/server/mods-available/server_module.inc.php index bc846cf53062b0cec4fc653095a00ecace34f6a1..92a50c51286b32f092150568d6cc69bfc0c4f845 100644 --- a/server/mods-available/server_module.inc.php +++ b/server/mods-available/server_module.inc.php @@ -40,10 +40,7 @@ class server_module { 'server_ip_delete', 'firewall_insert', 'firewall_update', - 'firewall_delete', - 'software_update_inst_insert', - 'software_update_inst_update', - 'software_update_inst_delete'); + 'firewall_delete'); //* This function is called during ispconfig installation to determine // if a symlink shall be created for this plugin. @@ -81,7 +78,6 @@ class server_module { $app->modules->registerTableHook('server', 'server_module', 'process'); $app->modules->registerTableHook('server_ip', 'server_module', 'process'); $app->modules->registerTableHook('firewall', 'server_module', 'process'); - $app->modules->registerTableHook('software_update_inst', 'server_module', 'process'); // Register service //$app->services->registerService('httpd','web_module','restartHttpd'); @@ -112,11 +108,6 @@ class server_module { if($action == 'u') $app->plugins->raiseEvent('firewall_update', $data); if($action == 'd') $app->plugins->raiseEvent('firewall_delete', $data); break; - case 'software_update_inst': - if($action == 'i') $app->plugins->raiseEvent('software_update_inst_insert', $data); - if($action == 'u') $app->plugins->raiseEvent('software_update_inst_update', $data); - if($action == 'd') $app->plugins->raiseEvent('software_update_inst_delete', $data); - break; } // end switch } // end function diff --git a/server/mods-available/web_module.inc.php b/server/mods-available/web_module.inc.php index 02f31510c2a2001c3c2ef4cada45cfa3c1a76377..bb2de0d1deb3a573df2d168ddfd4e48591a6b53a 100644 --- a/server/mods-available/web_module.inc.php +++ b/server/mods-available/web_module.inc.php @@ -32,7 +32,8 @@ class web_module { var $module_name = 'web_module'; var $class_name = 'web_module'; - var $actions_available = array( 'web_domain_insert', + var $actions_available = array( + 'web_domain_insert', 'web_domain_update', 'web_domain_delete', 'ftp_user_insert', @@ -53,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', @@ -64,7 +68,8 @@ class web_module { 'aps_package_delete', 'aps_setting_insert', 'aps_setting_update', - 'aps_setting_delete'); + 'aps_setting_delete' + ); //* This function is called during ispconfig installation to determine // if a symlink shall be created for this plugin. @@ -110,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'); @@ -165,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); @@ -220,7 +231,7 @@ class web_module { } else { $cmd = $app->system->getinitcommand($daemon, 'reload'); } - + if($web_config['server_type'] == 'nginx'){ $app->log("Checking nginx configuration...", LOGLEVEL_DEBUG); exec('nginx -t 2>&1', $retval['output'], $retval['retval']); @@ -232,15 +243,20 @@ class web_module { } } - 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){ //exec('nginx -t 2>&1', $retval['output'], $retval['retval']); @@ -263,7 +279,7 @@ class web_module { } else { $path_parts = pathinfo($init_script); $initcommand = $app->system->getinitcommand($path_parts['basename'], $action, $path_parts['dirname']); - + if($action == 'reload' && $init_script == $conf['init_scripts'].'/'.$web_config['php_fpm_init_script']) { // we have to do a workaround because of buggy ubuntu fpm reload handling // @see: https://bugs.launchpad.net/ubuntu/+source/php5/+bug/1242376 @@ -280,7 +296,7 @@ class web_module { } */ unset($tmp); - } + } } /* if($action == 'reload') { @@ -296,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 59e97629cb6d1a2694ce62d2365e62a42c301d8d..76573c0e964009e5acdb468ed9cabb68f63e49e8 100644 --- a/server/plugins-available/apache2_plugin.inc.php +++ b/server/plugins-available/apache2_plugin.inc.php @@ -37,6 +37,8 @@ class apache2_plugin { var $action = ''; var $ssl_certificate_changed = false; var $update_letsencrypt = false; + var $website = null; + var $jailkit_config = null; //* This function is called during ispconfig installation to determine // if a symlink shall be created for this plugin. @@ -73,7 +75,7 @@ class apache2_plugin { $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_insert', $this->plugin_name, 'server_ip'); $app->plugins->registerEvent('server_update', $this->plugin_name, 'server_ip'); @@ -97,22 +99,26 @@ class apache2_plugin { private function get_master_php_ini_content($web_data) { global $app, $conf; - + $app->uses('getconf'); $web_config = $app->getconf->get_server_config($conf['server_id'], 'web'); $fastcgi_config = $app->getconf->get_server_config($conf['server_id'], 'fastcgi'); - + $php_ini_content = ''; $master_php_ini_path = ''; - + if($web_data['php'] == 'mod') { $master_php_ini_path = $web_config['php_ini_path_apache']; } else { // check for custom php - if($web_data['fastcgi_php_version'] != '') { - $tmp = explode(':', $web_data['fastcgi_php_version']); - if(isset($tmp[2])) { - $tmppath = $tmp[2]; + if($web_data['server_php_id'] != 0) { + $tmp = $app->db->queryOneRecord('SELECT * FROM server_php WHERE server_php_id = ?', $web_data['server_php_id']); + $ini_key = 'php_fastcgi_ini_dir'; + if($web_data['php'] === 'php-fpm') { + $ini_key = 'php_fpm_ini_dir'; + } + if($tmp && $tmp[$ini_key]) { + $tmppath = $tmp[$ini_key]; if(substr($tmppath, -7) != 'php.ini') { if(substr($tmppath, -1) != '/') $tmppath .= '/'; $tmppath .= 'php.ini'; @@ -135,7 +141,7 @@ class apache2_plugin { } } } - + // Resolve inconsistant path settings if($master_php_ini_path != '' && is_dir($master_php_ini_path) && is_file($master_php_ini_path.'/php.ini')) { $master_php_ini_path .= '/php.ini'; @@ -145,7 +151,7 @@ class apache2_plugin { if($master_php_ini_path != '' && substr($master_php_ini_path, -7) == 'php.ini' && is_file($master_php_ini_path)) { $php_ini_content .= $app->system->file_get_contents($master_php_ini_path)."\n"; } - + return $php_ini_content; } @@ -169,21 +175,21 @@ class apache2_plugin { $qrystr .= " AND php = 'mod'"; } elseif($data['mode'] == 'fast-cgi') { $qrystr .= " AND php = 'fast-cgi'"; - if($data['php_version']) { - $qrystr .= " AND fastcgi_php_version LIKE ?"; - $param = '%:' . $data['php_version']; + if(isset($data['php_version'])) { + $qrystr .= " AND server_php_id = ?"; + $param = $data['php_version']; } } elseif($data['mode'] == 'php-fpm') { $qrystr .= " AND php = 'php-fpm'"; - if($data['php_version']) { - $qrystr .= " AND fastcgi_php_version LIKE ?"; - $param = '%:' . $data['php_version'] . ':%'; + if(isset($data['php_version'])) { + $qrystr .= " AND server_php_id = ?"; + $param = $data['php_version']; } } elseif($data['mode'] == 'hhvm') { $qrystr .= " AND php = 'hhvm'"; - if($data['php_version']) { - $qrystr .= " AND fastcgi_php_version LIKE ?"; - $param = '%:' . $data['php_version'] . ':%'; + if(isset($data['php_version'])) { + $qrystr .= " AND server_php_id = ?"; + $param = $data['php_version']; } } else { $qrystr .= " AND php != 'mod' AND php != 'fast-cgi'"; @@ -200,11 +206,11 @@ class apache2_plugin { $custom_php_ini_dir .= '_' . $web_folder; } if(!is_dir($web_config['website_basedir'].'/conf')) $app->system->mkdir($web_config['website_basedir'].'/conf'); - + if(!is_dir($custom_php_ini_dir)) $app->system->mkdir($custom_php_ini_dir); - + $php_ini_content = $this->get_master_php_ini_content($web_data); - + if(intval($web_data['directive_snippets_id']) > 0){ $snippet = $app->db->queryOneRecord("SELECT * FROM directive_snippets WHERE directive_snippets_id = ? AND type = 'apache' AND active = 'y' AND customer_viewable = 'y'", intval($web_data['directive_snippets_id'])); if(isset($snippet['required_php_snippets']) && trim($snippet['required_php_snippets']) != ''){ @@ -223,7 +229,7 @@ class apache2_plugin { } } } - + $php_ini_content .= str_replace("\r", '', trim($web_data['custom_php_ini'])); $app->system->file_put_contents($custom_php_ini_dir.'/php.ini', $php_ini_content); $app->log('Info: rewrote custom php.ini for web ' . $web_data['domain_id'] . ' (' . $web_data['domain'] . ').', LOGLEVEL_DEBUG); @@ -272,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'; @@ -287,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 @@ -329,50 +323,50 @@ class apache2_plugin { [ req_attributes ] ";//challengePassword = A challenge password"; + $ext_cnf = " + subjectAltName = @alt_names + + [alt_names] + DNS.1 = .$domain"; + $ssl_cnf_file = $ssl_dir.'/openssl.conf'; $app->system->file_put_contents($ssl_cnf_file, $ssl_cnf); + $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 ?", $openssl_cmd_crt_file, $web_config['CA_path']."/openssl.cnf", $web_config['CA_pass'], $openssl_cmd_csr_file); + $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", LOGLEVEL_ERROR); + $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); + @$app->system->unlink($ssl_ext_file); $ssl_request = $app->system->file_get_contents($csr_file); $ssl_cert = $app->system->file_get_contents($crt_file); $ssl_key = $app->system->file_get_contents($key_file); @@ -383,15 +377,15 @@ class apache2_plugin { $app->dbmaster->query("UPDATE web_domain SET ssl_request = ?, ssl_cert = ?, ssl_key = ? WHERE domain = ?", $ssl_request, $ssl_cert, $ssl_key, $data['new']['domain']); $app->dbmaster->query("UPDATE web_domain SET ssl_action = '' WHERE domain = ?", $data['new']['domain']); } - + //* Check that the SSL key is not password protected if($data["new"]["ssl_action"] == 'save') { if(stristr($data["new"]["ssl_key"],'Proc-Type: 4,ENCRYPTED')) { $data["new"]["ssl_action"] = ''; - + $app->log('SSL Certificate not saved. The SSL key is encrypted.', LOGLEVEL_WARN); $app->dbmaster->datalogError('SSL Certificate not saved. The SSL key is encrypted.'); - + /* Update the DB of the (local) Server */ $app->db->query("UPDATE web_domain SET ssl_action = '' WHERE domain = ?", $data['new']['domain']); @@ -399,7 +393,7 @@ class apache2_plugin { $app->dbmaster->query("UPDATE web_domain SET ssl_action = '' WHERE domain = ?", $data['new']['domain']); } } - + //* and check that SSL cert does not contain subdomain of domain acme.invalid if($data["new"]["ssl_action"] == 'save') { $tmp = array(); @@ -409,10 +403,10 @@ class apache2_plugin { $crt_data = implode("\n",$tmp); if(stristr($crt_data,'.acme.invalid')) { $data["new"]["ssl_action"] = ''; - + $app->log('SSL Certificate not saved. The SSL cert contains domain acme.invalid.', LOGLEVEL_WARN); $app->dbmaster->datalogError('SSL Certificate not saved. The SSL cert contains domain acme.invalid.'); - + /* Update the DB of the (local) Server */ $app->db->query("UPDATE web_domain SET ssl_action = '' WHERE domain = ?", $data['new']['domain']); @@ -430,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.'~'); @@ -536,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); @@ -550,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']) == '') { @@ -570,7 +560,12 @@ class apache2_plugin { $web_folder = $data['new']['web_folder']; $log_folder .= '/' . $subdomain_host; unset($tmp); - + + if($app->system->is_blacklisted_web_path($web_folder)) { + $app->log('Vhost ' . $subdomain_host . ' is using a blacklisted web folder: ' . $web_folder, LOGLEVEL_ERROR); + return 0; + } + if(isset($data['old']['parent_domain_id'])) { // old one $tmp = $app->db->queryOneRecord('SELECT `domain` FROM web_domain WHERE domain_id = ?', $data['old']['parent_domain_id']); @@ -639,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); @@ -666,15 +661,13 @@ class apache2_plugin { $app->system->rename($data['new']['document_root'], $data['new']['document_root'].'_bak_'.date('Y_m_d_H_i_s')); $app->log('Renaming existing directory in new docroot location. mv '.$data['new']['document_root'].' '.$data['new']['document_root'].'_bak_'.date('Y_m_d_H_i_s'), LOGLEVEL_DEBUG); } - + //* Unmount the old log directory bfore we move the log dir - $app->system->exec_safe('umount ?', $data['old']['document_root'].'/log'); + $app->system->exec_safe('umount -l ?', $data['old']['document_root'].'/log'); //* 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 @@ -694,17 +687,8 @@ 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') { $fstab_line = '/var/log/ispconfig/httpd/'.$data['new']['domain'].' '.$data['new']['document_root'].'/'.$log_folder.' none bind,nofail,_netdev 0 0'; $app->system->replaceLine('/etc/fstab', $fstab_line_old, $fstab_line, 0, 1); @@ -712,24 +696,29 @@ class apache2_plugin { $fstab_line = '/var/log/ispconfig/httpd/'.$data['new']['domain'].' '.$data['new']['document_root'].'/'.$log_folder.' none bind,nofail 0 0'; $app->system->replaceLine('/etc/fstab', $fstab_line_old, $fstab_line, 0, 1); } - + $app->system->exec_safe('mount --bind ? ?', '/var/log/ispconfig/httpd/'.$data['new']['domain'], $data['new']['document_root'].'/'.$log_folder); - - } - //print_r($data); + } // Check if the directories are there and create them if necessary. $app->system->web_folder_protection($data['new']['document_root'], false); - if(!is_dir($data['new']['document_root'].'/' . $web_folder)) $app->system->mkdirpath($data['new']['document_root'].'/' . $web_folder); + if(!is_dir($data['new']['document_root'].'/' . $web_folder)) { + if($web_folder !== 'web') { //vhost sub/alias + $app->system->mkdirpath($data['new']['document_root'].'/' . $web_folder, 0755, $username, $groupname); + } else { + $app->system->mkdirpath($data['new']['document_root'].'/' . $web_folder); + } + } if(!is_dir($data['new']['document_root'].'/' . $web_folder . '/error') and $data['new']['errordocs']) $app->system->mkdirpath($data['new']['document_root'].'/' . $web_folder . '/error'); if($data['new']['stats_type'] != '' && !is_dir($data['new']['document_root'].'/' . $web_folder . '/stats')) $app->system->mkdirpath($data['new']['document_root'].'/' . $web_folder . '/stats'); 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'].'/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'); $app->system->chmod($data['new']['document_root'].'/.ssh', 0700); @@ -745,6 +734,87 @@ class apache2_plugin { $app->system->chgrp($data['new']['document_root'].'/private', $groupname); } + // load jailkit server config + $jailkit_config = $app->getconf->get_server_config($conf['server_id'], 'jailkit'); + + // website overrides + if (isset($data['new']['jailkit_chroot_app_sections']) && $data['new']['jailkit_chroot_app_sections'] != '' ) { + $jailkit_config['jailkit_chroot_app_sections'] = $data['new']['jailkit_chroot_app_sections']; + } + if (isset($data['new']['jailkit_chroot_app_programs']) && $data['new']['jailkit_chroot_app_programs'] != '' ) { + $jailkit_config['jailkit_chroot_app_programs'] = $data['new']['jailkit_chroot_app_programs']; + } + + $last_updated = preg_split('/[\s,]+/', $jailkit_config['jailkit_chroot_app_sections'] + .' '.$jailkit_config['jailkit_chroot_app_programs'] + .' '.$jailkit_config['jailkit_chroot_cron_programs']); + $last_updated = array_unique($last_updated, SORT_REGULAR); + sort($last_updated, SORT_STRING); + $update_hash = hash('md5', implode(' ', $last_updated)); + $check_for_jailkit_updates=false; + + $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; + $this->_setup_jailkit_chroot(); + $this->_add_jailkit_user(); + // else delete if unused + } elseif (($data['new']['delete_unused_jailkit'] == 'y' && $data['new']['php_fpm_chroot'] != 'y') || + ($data['new']['delete_unused_jailkit'] == 'y' && $data['new']['php'] == 'no')) { + $check_for_jailkit_updates=false; + $this->_delete_jailkit_if_unused($data['new']['domain_id']); + if(is_dir($data['new']['document_root'].'/etc/jailkit')) { + $check_for_jailkit_updates=true; + } + // else update if needed + } elseif ($data['new']['delete_unused_jailkit'] != 'y') { + $check_for_jailkit_updates=true; + } + + // If jail exists (and wasn't deleted), we may need to update it + if($check_for_jailkit_updates && + ( ($data['old']['jailkit_chroot_app_sections'] != $data['new']['jailkit_chroot_app_sections']) || + ($data['old']['jailkit_chroot_app_programs'] != $data['new']['jailkit_chroot_app_programs']) ) ) + { + + if (isset($jailkit_config['jailkit_hardlinks'])) { + if ($jailkit_config['jailkit_hardlinks'] == 'yes') { + $options = array('hardlink'); + } elseif ($jailkit_config['jailkit_hardlinks'] == 'no') { + $options = array(); + } + } else { + $options = array('allow_hardlink'); + } + + $options[] = 'force'; + + $sections = $jailkit_config['jailkit_chroot_app_sections']; + $programs = $jailkit_config['jailkit_chroot_app_programs'] . ' ' + . $jailkit_config['jailkit_chroot_cron_programs']; + + $records = $app->db->queryAllRecords('SELECT web_folder FROM `web_domain` WHERE `parent_domain_id` = ? AND `document_root` = ? AND web_folder != \'\' AND web_folder IS NOT NULL AND `server_id` = ?', $data['new']['domain_id'], $data['new']['document_root'], $conf['server_id']); + foreach ($records as $record) { + $options[] = 'skip='.$record['web_folder']; + } + + // don't update if last_jailkit_hash is the same + $tmp = $app->db->queryOneRecord('SELECT `last_jailkit_hash` FROM web_domain WHERE domain_id = ?', $data['new']['parent_domain_id']); + if ($update_hash != $tmp['last_jailkit_hash']) { + $app->system->update_jailkit_chroot($data['new']['document_root'], $sections, $programs, $options); + + // this gets last_jailkit_update out of sync with master db, but that is ok, + // as it is only used as a timestamp to moderate the frequency of updating on the slaves + $app->db->query("UPDATE `web_domain` SET `last_jailkit_update` = NOW(), `last_jailkit_hash` = ? WHERE `document_root` = ?", $update_hash, $data['new']['document_root']); + } + unset($tmp); + } // Remove the symlink for the site, if site is renamed if($this->action == 'update' && $data['old']['domain'] != '' && $data['new']['domain'] != $data['old']['domain']) { @@ -756,7 +826,7 @@ class apache2_plugin { $app->system->removeLine('/etc/fstab', $fstab_line); //* Unmount log directory - $app->system->exec_safe('umount ?', $data['old']['document_root'].'/'.$old_log_folder); + $app->system->exec_safe('umount -l ?', $data['old']['document_root'].'/'.$old_log_folder); } //* Create the log dir if nescessary and mount it @@ -769,7 +839,7 @@ class apache2_plugin { $app->system->chmod($data['new']['document_root'].'/'.$log_folder, 0755); $app->system->exec_safe('mount --bind ? ?', '/var/log/ispconfig/httpd/'.$data['new']['domain'], $data['new']['document_root'].'/'.$log_folder); //* add mountpoint to fstab - $fstab_line = '/var/log/ispconfig/httpd/'.$data['new']['domain'].' '.$data['new']['document_root'].'/'.$log_folder.' none bind,nobootwait'; + $fstab_line = '/var/log/ispconfig/httpd/'.$data['new']['domain'].' '.$data['new']['document_root'].'/'.$log_folder.' none bind,nofail'; $fstab_line .= @($web_config['network_filesystem'] == 'y')?',_netdev 0 0':' 0 0'; $app->system->replaceLine('/etc/fstab', $fstab_line, $fstab_line, 1, 1); } @@ -790,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); @@ -851,11 +921,11 @@ class apache2_plugin { $app->system->exec_safe('chmod -R a+r ?', $error_page_path); } - //* Copy the web skeleton files only when there is no index.ph or index.html file yet - if(!file_exists($data['new']['document_root'].'/'.$web_folder.'/index.html') && !file_exists($data['new']['document_root'].'/'.$web_folder.'/index.php')) { + //* Copy the web skeleton files only when there is no index.php, standard_index.html or index.html file yet + if(!file_exists($data['new']['document_root'].'/'.$web_folder.'/index.html') && !file_exists($data['new']['document_root'].'/'.$web_folder.'/index.php') && !file_exists($data['new']['document_root'].'/'.$web_folder.'/standard_index.html')) { if (file_exists($conf['rootpath'] . '/conf-custom/index/standard_index.html_'.substr($conf['language'], 0, 2))) { - if(!file_exists($data['new']['document_root'] . '/' . $web_folder . '/index.html')) { - $app->system->exec_safe('cp ? ?', $conf['rootpath'] . '/conf-custom/index/standard_index.html_' . substr($conf['language'], 0, 2), $data['new']['document_root'] . '/' . $web_folder . '/index.html'); + if(!file_exists($data['new']['document_root'] . '/' . $web_folder . '/standard_index.html')) { + $app->system->exec_safe('cp ? ?', $conf['rootpath'] . '/conf-custom/index/standard_index.html_' . substr($conf['language'], 0, 2), $data['new']['document_root'] . '/' . $web_folder . '/standard_index.html'); } if(is_file($conf['rootpath'] . '/conf-custom/index/favicon.ico')) { @@ -866,13 +936,13 @@ class apache2_plugin { } } else { if (file_exists($conf['rootpath'] . '/conf-custom/index/standard_index.html')) { - if(!file_exists($data['new']['document_root'].'/' . $web_folder . '/index.html')) $app->system->exec_safe('cp ? ?', $conf['rootpath'] . '/conf-custom/index/standard_index.html', $data['new']['document_root'].'/' . $web_folder . '/index.html'); + if(!file_exists($data['new']['document_root'].'/' . $web_folder . '/standard_index.html')) $app->system->exec_safe('cp ? ?', $conf['rootpath'] . '/conf-custom/index/standard_index.html', $data['new']['document_root'].'/' . $web_folder . '/standard_index.html'); } else { - if(!file_exists($data['new']['document_root'].'/' . $web_folder . '/index.html')) $app->system->exec_safe('cp ? ?', $conf['rootpath'] . '/conf/index/standard_index.html_'.substr($conf['language'], 0, 2), $data['new']['document_root'].'/' . $web_folder . '/index.html'); - if(is_file($conf['rootpath'] . '/conf/index/favicon.ico')){ + if(!file_exists($data['new']['document_root'].'/' . $web_folder . '/standard_index.html')) $app->system->exec_safe('cp ? ?', $conf['rootpath'] . '/conf/index/standard_index.html_'.substr($conf['language'], 0, 2), $data['new']['document_root'].'/' . $web_folder . '/standard_index.html'); + if(is_file($conf['rootpath'] . '/conf/index/favicon.ico')) { if(!file_exists($data['new']['document_root'].'/' . $web_folder . '/favicon.ico')) $app->system->exec_safe('cp ? ?', $conf['rootpath'] . '/conf/index/favicon.ico', $data['new']['document_root'].'/' . $web_folder . '/'); } - if(is_file($conf['rootpath'] . '/conf/index/robots.txt')){ + if(is_file($conf['rootpath'] . '/conf/index/robots.txt')) { if(!file_exists($data['new']['document_root'].'/' . $web_folder . '/robots.txt')) $app->system->exec_safe('cp ? ?', $conf['rootpath'] . '/conf/index/robots.txt', $data['new']['document_root'].'/' . $web_folder . '/'); } } @@ -1093,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'); @@ -1104,21 +1174,35 @@ class apache2_plugin { } $fastcgi_config = $app->getconf->get_server_config($conf['server_id'], 'fastcgi'); - - if(trim($data['new']['fastcgi_php_version']) != ''){ - list($custom_fastcgi_php_name, $custom_fastcgi_php_executable, $custom_fastcgi_php_ini_dir) = explode(':', trim($data['new']['fastcgi_php_version'])); - if(is_file($custom_fastcgi_php_ini_dir)) $custom_fastcgi_php_ini_dir = dirname($custom_fastcgi_php_ini_dir); - if(substr($custom_fastcgi_php_ini_dir, -1) == '/') $custom_fastcgi_php_ini_dir = substr($custom_fastcgi_php_ini_dir, 0, -1); + $custom_fastcgi_php_executable = ''; + + if($data['new']['server_php_id'] != 0){ + $tmp_php = $app->db->queryOneRecord('SELECT * FROM server_php WHERE server_php_id = ?', $data['new']['server_php_id']); + if($tmp_php) { + if($data['new']['php'] === 'php-fpm') { + $custom_fastcgi_php_ini_dir = $tmp_php['php_fpm_ini_dir']; + $custom_fastcgi_php_executable = $tmp_php['php_fpm_init_script']; + } else { + $custom_fastcgi_php_ini_dir = $tmp_php['php_fastcgi_ini_dir']; + $custom_fastcgi_php_executable = $tmp_php['php_fastcgi_binary']; + } + if(is_file($custom_fastcgi_php_ini_dir)) $custom_fastcgi_php_ini_dir = dirname($custom_fastcgi_php_ini_dir); + if(substr($custom_fastcgi_php_ini_dir, -1) == '/') $custom_fastcgi_php_ini_dir = substr($custom_fastcgi_php_ini_dir, 0, -1); + } } //* Create custom php.ini - if(trim($data['new']['custom_php_ini']) != '') { + # Because of custom default PHP directives from snippet + # php.ini custom values order os: 1. general settings 2. Directive Snippets settings 3. custom php.ini settings defined in domain settings + if(trim($data['new']['custom_php_ini']) != '' || $data['new']['directive_snippets_id'] > "0") { $has_custom_php_ini = true; + $custom_sendmail_path = false; if(!is_dir($custom_php_ini_dir)) $app->system->mkdirpath($custom_php_ini_dir); - + $php_ini_content = $this->get_master_php_ini_content($data['new']); - $php_ini_content .= str_replace("\r", '', trim($data['new']['custom_php_ini'])); - + + $php_ini_content .= "\n".str_replace("\r", '', trim($data['new']['custom_php_ini'])); + if(intval($data['new']['directive_snippets_id']) > 0){ $snippet = $app->db->queryOneRecord("SELECT * FROM directive_snippets WHERE directive_snippets_id = ? AND type = 'apache' AND active = 'y' AND customer_viewable = 'y'", intval($data['new']['directive_snippets_id'])); if(isset($snippet['required_php_snippets']) && trim($snippet['required_php_snippets']) != ''){ @@ -1130,6 +1214,7 @@ class apache2_plugin { $php_snippet = $app->db->queryOneRecord("SELECT * FROM directive_snippets WHERE directive_snippets_id = ? AND type = 'php' AND active = 'y'", $required_php_snippet); $php_snippet['snippet'] = trim($php_snippet['snippet']); if($php_snippet['snippet'] != ''){ + $php_snippet['snippet'] = str_replace("\r", '', $php_snippet['snippet']); $php_ini_content .= "\n".$php_snippet['snippet']; } } @@ -1137,7 +1222,14 @@ class apache2_plugin { } } } - + + $custom_sendmail_path = false; + $line = strtok($php_ini_content, '\n'); + while ($line !== false) { + if (strpos($line, 'sendmail_path') === 0) $custom_sendmail_path = true; + $line = strtok('\n'); + } + $app->system->file_put_contents($custom_php_ini_dir.'/php.ini', $php_ini_content); } else { $has_custom_php_ini = false; @@ -1171,26 +1263,31 @@ class apache2_plugin { $vhost_data['apache_directives'] = $snippet['snippet']; } } + + if(!$vhost_data['apache_directives']) { + $vhost_data['apache_directives'] = ''; // ensure it is not null + } + // Make sure we only have Unix linebreaks $vhost_data['apache_directives'] = str_replace("\r\n", "\n", $vhost_data['apache_directives']); $vhost_data['apache_directives'] = str_replace("\r", "\n", $vhost_data['apache_directives']); $trans = array( '{DOCROOT}' => $vhost_data['web_document_root_www'], - '{DOCROOT_CLIENT}' => $vhost_data['web_document_root'] + '{DOCROOT_CLIENT}' => $vhost_data['web_document_root'], + '{DOMAIN}' => $vhost_data['domain'] ); $vhost_data['apache_directives'] = strtr($vhost_data['apache_directives'], $trans); - + $app->uses('letsencrypt'); // Check if a SSL cert exists $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']; unset($tmp); - + $data['new']['ssl_domain'] = $domain; $vhost_data['ssl_domain'] = $domain; $vhost_data['ssl_crt_file'] = $crt_file; @@ -1222,21 +1319,10 @@ class apache2_plugin { $app->dbmaster->query("UPDATE web_domain SET `ssl` = ?, `ssl_letsencrypt` = ? WHERE `domain` = ? AND `server_id` = ?", $data['new']['ssl'], 'n', $data['new']['domain'], $conf['server_id']); } } - + // Use separate bundle file only for apache versions < 2.4.8 if(@is_file($bundle_file) && version_compare($app->system->getapacheversion(true), '2.4.8', '<')) $vhost_data['has_bundle_cert'] = 1; - // HTTP/2.0 ? - $vhost_data['enable_http2'] = 'n'; - if($vhost_data['enable_spdy'] == 'y'){ - // check if apache supports http_v2 - exec("2>&1 apachectl -M | grep http2_module", $tmp_output, $tmp_retval); - if($tmp_retval == 0){ - $vhost_data['enable_http2'] = 'y'; - } - unset($tmp_output, $tmp_retval); - } - // Set SEO Redirect if($data['new']['seo_redirect'] != ''){ $vhost_data['seo_redirect_enabled'] = 1; @@ -1252,6 +1338,8 @@ class apache2_plugin { $vhost_data['seo_redirect_enabled'] = 0; } + $vhost_data['custom_sendmail_path'] = (isset($custom_sendmail_path) && $custom_sendmail_path) ? 'y' : 'n'; + $tpl->setVar($vhost_data); $tpl->setVar('apache_version', $app->system->getapacheversion()); @@ -1275,15 +1363,17 @@ class apache2_plugin { switch($data['new']['subdomain']) { case 'www': - $rewrite_rules[] = array( 'rewrite_domain' => '^'.$this->_rewrite_quote($data['new']['domain']), + $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_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')); @@ -1292,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')); @@ -1300,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')); @@ -1425,7 +1517,7 @@ class apache2_plugin { } else { $tpl->setVar('alias', ''); } - + if (count($rewrite_wildcard_rules) > 0) $rewrite_rules = array_merge($rewrite_rules, $rewrite_wildcard_rules); // Append wildcard rules to the end of rules if(count($rewrite_rules) > 0 || $vhost_data['seo_redirect_enabled'] > 0 || count($alias_seo_redirects) > 0 || $data['new']['rewrite_to_https'] == 'y') { @@ -1434,6 +1526,10 @@ class apache2_plugin { $tpl->setVar('rewrite_enabled', 0); } + if($data['new']['ssl'] == 'n') { + $tpl->setVar('rewrite_to_https', 'n'); + } + //$tpl->setLoop('redirects',$rewrite_rules); /** @@ -1468,7 +1564,7 @@ class apache2_plugin { $fcgi_tpl->setVar('apache_version', $app->system->getapacheversion()); // Support for multiple PHP versions (FastCGI) - if(trim($data['new']['fastcgi_php_version']) != ''){ + if($data['new']['server_php_id'] != 0){ $default_fastcgi_php = false; if(substr($custom_fastcgi_php_ini_dir, -1) != '/') $custom_fastcgi_php_ini_dir .= '/'; } else { @@ -1499,6 +1595,7 @@ class apache2_plugin { $fcgi_tpl->setVar('open_basedir', $php_open_basedir); $fcgi_starter_script = $fastcgi_starter_path.$fastcgi_config['fastcgi_starter_script'].(($data['new']['type'] == 'vhostsubdomain' || $data['new']['type'] == 'vhostalias') ? '_web' . $data['new']['domain_id'] : ''); + $app->system->set_immutable($fcgi_starter_script, false); $app->system->file_put_contents($fcgi_starter_script, $fcgi_tpl->grab()); unset($fcgi_tpl); @@ -1511,6 +1608,7 @@ class apache2_plugin { } $app->system->chown($fcgi_starter_script, $data['new']['system_user']); $app->system->chgrp($fcgi_starter_script, $data['new']['system_group']); + $app->system->set_immutable($fcgi_starter_script, true); $tpl->setVar('fastcgi_alias', $fastcgi_config['fastcgi_alias']); $tpl->setVar('fastcgi_starter_path', $fastcgi_starter_path); @@ -1524,6 +1622,7 @@ class apache2_plugin { if ($data['old']['php'] == 'fast-cgi') { $fastcgi_starter_path = str_replace('[system_user]', $data['old']['system_user'], $fastcgi_config['fastcgi_starter_path']); $fastcgi_starter_path = str_replace('[client_id]', $client_id, $fastcgi_starter_path); + $app->system->set_immutable($fastcgi_starter_path, false, true); if($data['old']['type'] == 'vhost') { if(is_file($fastcgi_starter_script)) @unlink($fastcgi_starter_script); if (is_dir($fastcgi_starter_path)) @rmdir($fastcgi_starter_path); @@ -1539,21 +1638,30 @@ class apache2_plugin { * PHP-FPM */ // Support for multiple PHP versions + $default_php_fpm = true; if($data['new']['php'] == 'php-fpm'){ - if(trim($data['new']['fastcgi_php_version']) != ''){ - $default_php_fpm = false; - list($custom_php_fpm_name, $custom_php_fpm_init_script, $custom_php_fpm_ini_dir, $custom_php_fpm_pool_dir) = explode(':', trim($data['new']['fastcgi_php_version'])); - if(substr($custom_php_fpm_ini_dir, -1) != '/') $custom_php_fpm_ini_dir .= '/'; - } else { - $default_php_fpm = true; + if($data['new']['server_php_id'] != 0){ + $tmp_php = $app->db->queryOneRecord('SELECT * FROM server_php WHERE server_php_id = ?', $data['new']['server_php_id']); + if($tmp_php) { + $default_php_fpm = false; + $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['php_fpm_socket_dir']; + if(substr($custom_php_fpm_ini_dir, -1) != '/') $custom_php_fpm_ini_dir .= '/'; + } } } else { - if(trim($data['old']['fastcgi_php_version']) != '' && ($data['old']['php'] == 'php-fpm' || $data['old']['php'] == 'hhvm')){ - $default_php_fpm = false; - list($custom_php_fpm_name, $custom_php_fpm_init_script, $custom_php_fpm_ini_dir, $custom_php_fpm_pool_dir) = explode(':', trim($data['old']['fastcgi_php_version'])); - if(substr($custom_php_fpm_ini_dir, -1) != '/') $custom_php_fpm_ini_dir .= '/'; - } else { - $default_php_fpm = true; + if($data['old']['server_php_id'] != 0 && ($data['old']['php'] == 'php-fpm' || $data['old']['php'] == 'hhvm')){ + $tmp_php = $app->db->queryOneRecord('SELECT * FROM server_php WHERE server_php_id = ?', $data['old']['server_php_id']); + if($tmp_php) { + $default_php_fpm = false; + $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['php_fpm_socket_dir']; + if(substr($custom_php_fpm_ini_dir, -1) != '/') $custom_php_fpm_ini_dir .= '/'; + } } } @@ -1566,9 +1674,14 @@ class apache2_plugin { if(substr($pool_dir, -1) != '/') $pool_dir .= '/'; $pool_name = 'web'.$data['new']['domain_id']; - $socket_dir = $web_config['php_fpm_socket_dir']; + + if (!$default_php_fpm && !empty($custom_php_fpm_socket_dir)) { + $socket_dir = $custom_php_fpm_socket_dir; + } else { + $socket_dir = $web_config['php_fpm_socket_dir']; + } if(substr($socket_dir, -1) != '/') $socket_dir .= '/'; - + if($data['new']['php_fpm_use_socket'] == 'y'){ $use_tcp = 0; $use_socket = 1; @@ -1635,6 +1748,7 @@ class apache2_plugin { } $cgi_starter_script = $cgi_starter_path.$cgi_config['cgi_starter_script'].(($data['new']['type'] == 'vhostsubdomain' || $data['new']['type'] == 'vhostalias') ? '_web' . $data['new']['domain_id'] : ''); + $app->system->set_immutable($cgi_starter_script, false); $app->system->file_put_contents($cgi_starter_script, $cgi_tpl->grab()); unset($cgi_tpl); @@ -1648,6 +1762,7 @@ class apache2_plugin { } $app->system->chown($cgi_starter_script, $data['new']['system_user']); $app->system->chgrp($cgi_starter_script, $data['new']['system_group']); + $app->system->set_immutable($cgi_starter_script, true); $tpl->setVar('cgi_starter_path', $cgi_starter_path); $tpl->setVar('cgi_starter_script', $cgi_config['cgi_starter_script'].(($data['new']['type'] == 'vhostsubdomain' || $data['new']['type'] == 'vhostalias') ? '_web' . $data['new']['domain_id'] : '')); @@ -1675,6 +1790,16 @@ class apache2_plugin { if(count($rewrite_rules) > 0) $tmp_vhost_arr = $tmp_vhost_arr + array('redirects' => $rewrite_rules); if(count($alias_seo_redirects) > 0) $tmp_vhost_arr = $tmp_vhost_arr + array('alias_seo_redirects' => $alias_seo_redirects); $vhosts[] = $tmp_vhost_arr; + + //if proxy protocol is enabled we need to add a new port to lsiten to + if($web_config['vhost_proxy_protocol_enabled'] == 'y' && $data['new']['proxy_protocol'] == 'y'){ + if((int)$web_config['vhost_proxy_protocol_http_port'] > 0) { + $tmp_vhost_arr['port'] = (int)$web_config['vhost_proxy_protocol_http_port']; + $tmp_vhost_arr['use_proxy_protocol'] = $data['new']['proxy_protocol']; + $vhosts[] = $tmp_vhost_arr; + } + } + unset($tmp_vhost_arr); //* Add vhost for ipv4 IP with SSL @@ -1689,6 +1814,16 @@ class apache2_plugin { } if(count($ipv4_ssl_alias_seo_redirects) > 0) $tmp_vhost_arr = $tmp_vhost_arr + array('alias_seo_redirects' => $ipv4_ssl_alias_seo_redirects); $vhosts[] = $tmp_vhost_arr; + + //if proxy protocol is enabled we need to add a new port to lsiten to + if($web_config['vhost_proxy_protocol_enabled'] == 'y' && $data['new']['proxy_protocol'] == 'y'){ + if((int)$web_config['vhost_proxy_protocol_https_port'] > 0) { + $tmp_vhost_arr['port'] = (int)$web_config['vhost_proxy_protocol_https_port']; + $tmp_vhost_arr['use_proxy_protocol'] = $data['new']['proxy_protocol']; + $vhosts[] = $tmp_vhost_arr; + } + } + unset($tmp_vhost_arr, $ipv4_ssl_alias_seo_redirects); $app->log('Enable SSL for: '.$domain, LOGLEVEL_DEBUG); } @@ -1802,7 +1937,7 @@ class apache2_plugin { if($data['new']['stats_type'] != '') { if(!is_dir($data['new']['document_root'].'/' . $web_folder . '/stats')) $app->system->mkdir($data['new']['document_root'].'/' . $web_folder . '/stats'); - $ht_file = "AuthType Basic\nAuthName \"Members Only\"\nAuthUserFile ".$data['new']['document_root']."/web/stats/.htpasswd_stats\nrequire valid-user"; + $ht_file = "AuthType Basic\nAuthName \"Members Only\"\nAuthUserFile ".$data['new']['document_root']."/web/stats/.htpasswd_stats\nrequire valid-user\nDirectoryIndex index.html index.php\nHeader set Content-Security-Policy \"default-src * 'self' 'unsafe-inline' 'unsafe-eval' data:;\"\n\nAddDefaultCharset UTF-8\n\n"; $app->system->file_put_contents($data['new']['document_root'].'/' . $web_folder . '/stats/.htaccess', $ht_file); $app->system->chmod($data['new']['document_root'].'/' . $web_folder . '/stats/.htaccess', 0755); unset($ht_file); @@ -1824,11 +1959,31 @@ class apache2_plugin { $this->awstats_update($data, $web_config); } + //* Create GoAccess configuration + if($data['new']['stats_type'] == 'goaccess' && ($data['new']['type'] == 'vhost' || $data['new']['type'] == 'vhostsubdomain' || $data['new']['type'] == 'vhostalias')) { + $this->goaccess_update($data, $web_config); + } + //* Remove Stats-Folder when Statistics set to none if($data['new']['stats_type'] == '' && ($data['new']['type'] == 'vhost' || $data['new']['type'] == 'vhostsubdomain' || $data['new']['type'] == 'vhostalias')) { $app->file->removeDirectory($data['new']['document_root'].'/web/stats'); } + //* Remove the AWstats configuration file + if($data['old']['stats_type'] == 'awstats' && $data['new']['stats_type'] != 'awstats') { + $this->awstats_delete($data, $web_config); + } + + //* Remove the GoAccess configuration file + if($data['old']['stats_type'] == 'goaccess' && $data['new']['stats_type'] != 'goaccess') { + $this->goaccess_delete($data, $web_config); + } + + //* Remove the Webalizer configuration file + if($data['old']['stats_type'] == 'webalizer' && $data['new']['stats_type'] != 'webalizer') { + $this->webalizer_delete($data, $web_config); + } + $this->php_fpm_pool_update($data, $web_config, $pool_dir, $pool_name, $socket_dir, $web_folder); $this->hhvm_update($data, $web_config); @@ -1909,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); @@ -1944,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.'~'); @@ -2026,14 +2175,14 @@ class apache2_plugin { if($data['old']['type'] == 'vhost' || $data['old']['type'] == 'vhostsubdomain' || $data['old']['type'] == 'vhostalias'){ if(is_array($log_folders) && !empty($log_folders)){ foreach($log_folders as $log_folder){ - $app->system->exec_safe('umount ? 2>/dev/null', $data['old']['document_root'].'/'.$log_folder); + $app->system->exec_safe('umount -l ? 2>/dev/null', $data['old']['document_root'].'/'.$log_folder); } } else { - $app->system->exec_safe('umount ? 2>/dev/null', $data['old']['document_root'].'/'.$log_folder); + $app->system->exec_safe('umount -l ? 2>/dev/null', $data['old']['document_root'].'/'.$log_folder); } - + // remove letsencrypt if it exists (renew will always fail otherwise) - + $old_domain = $data['old']['domain']; if(substr($old_domain, 0, 2) === '*.') { // wildcard domain not yet supported by letsencrypt! @@ -2157,11 +2306,13 @@ class apache2_plugin { $fastcgi_starter_path = str_replace('[system_user]', $data['old']['system_user'], $fastcgi_config['fastcgi_starter_path']); if($data['old']['type'] == 'vhost') { if (is_dir($fastcgi_starter_path)) { + $app->system->set_immutable($fastcgi_starter_path, false, true); $app->system->exec_safe('rm -rf ?', $fastcgi_starter_path); } } else { $fcgi_starter_script = $fastcgi_starter_path.$fastcgi_config['fastcgi_starter_script'].'_web'.$data['old']['domain_id']; if (file_exists($fcgi_starter_script)) { + $app->system->set_immutable($fcgi_starter_script, false); $app->system->exec_safe('rm -f ?', $fcgi_starter_script); } } @@ -2182,11 +2333,13 @@ class apache2_plugin { $cgi_starter_path = str_replace('[system_user]', $data['old']['system_user'], $web_config['cgi_starter_path']); if($data['old']['type'] == 'vhost') { if (is_dir($cgi_starter_path)) { + $app->system->set_immutable($cgi_starter_path, false, true); $app->system->exec_safe('rm -rf ?', $cgi_starter_path); } } else { $cgi_starter_script = $cgi_starter_path.'php-cgi-starter_web'.$data['old']['domain_id']; if (file_exists($cgi_starter_script)) { + $app->system->set_immutable($cgi_starter_script, false); $app->system->exec_safe('rm -f ?', $cgi_starter_script); } } @@ -2228,7 +2381,7 @@ class apache2_plugin { } - //* Remove the awstats configuration file + //* Remove the AWstats configuration file if($data['old']['stats_type'] == 'awstats') { $this->awstats_delete($data, $web_config); } @@ -2568,7 +2721,7 @@ class apache2_plugin { $app->system->chown($new_folder_path.'.htaccess', $website['system_user']); $app->system->chgrp($new_folder_path.'.htaccess', $website['system_group']); $app->log('Created/modified file '.$new_folder_path.'.htaccess', LOGLEVEL_DEBUG); - + //* Create empty .htpasswd file, if it does not exist if(!is_file($folder_path.'.htpasswd')) { $app->system->touch($new_folder_path.'.htpasswd'); @@ -2930,21 +3083,114 @@ class apache2_plugin { } } - //* Delete the awstats configuration file - private function awstats_delete ($data, $web_config) { + //* Delete the awstats configuration file + private function awstats_delete ($data, $web_config) { + global $app; + + $awstats_conf_dir = $web_config['awstats_conf_dir']; + + if ( @is_file($awstats_conf_dir.'/awstats.'.$data['old']['domain'].'.conf') ) { + $app->system->unlink($awstats_conf_dir.'/awstats.'.$data['old']['domain'].'.conf'); + $app->log('Removed AWStats config file: '.$awstats_conf_dir.'/awstats.'.$data['old']['domain'].'.conf', LOGLEVEL_DEBUG); + } + } + + //* Update the GoAccess configuration file + private function goaccess_update ($data, $web_config) { + global $app; + + $web_folder = $data['new']['web_folder']; + if($data['new']['type'] == 'vhost') $web_folder = 'web'; + + $goaccess_conf_locs = array('/etc/goaccess.conf', '/etc/goaccess/goaccess.conf'); + $count = 0; + + foreach($goaccess_conf_locs as $goa_loc) { + if(is_file($goa_loc) && (filesize($goa_loc) > 0)) { + $goaccess_conf_main = $goa_loc; + break; + } else { + $count++; + if($count == 2) { + $app->log("No GoAccess base config found. Make sure that GoAccess is installed and that the goaccess.conf does exist in /etc or /etc/goaccess", LOGLEVEL_WARN); + } + } + } + + if(!is_dir($data['new']['document_root'] . "/log/goaccess_db")) $app->system->mkdirpath($data['new']['document_root'] . "/log/goaccess_db"); + $goaccess_conf = $data['new']['document_root'].'/log/goaccess.conf'; + + /* + In case that you use a different log format, you should use a custom goaccess.conf which you'll have to put into /usr/local/ispconfig/server/conf-custom/. + By default the originaly with GoAccess shipped goaccess.conf from /etc/ will be used along with the log-format value COMBINED. + */ + + if(file_exists("/usr/local/ispconfig/server/conf-custom/goaccess.conf.master")) { + $app->system->copy("/usr/local/ispconfig/server/conf-custom/goaccess_index.php.master", $goaccess_conf); + + } elseif(!file_exists($goaccess_conf)) { + + /* + By default the goaccess.conf should get copied by the webserver plugin but in case it wasn't, or it got deleted by accident we gonna copy it again to the destination dir. + Also there was no /usr/local/ispconfig/server/conf-custom/goaccess.conf.master, so we gonna use /etc/goaccess.conf as the base conf. + */ + + $app->system->copy($goaccess_conf_main, $goaccess_conf); + $content = $app->system->file_get_contents($goaccess_conf, true); + $content = preg_replace('/^(#)?log-format COMBINED/m', "log-format COMBINED", $content); + $app->system->file_put_contents($goaccess_conf, $content, true); + unset($content); + + } + + if(file_exists($goaccess_conf)) { + $domain = $data['new']['domain']; + $content = $app->system->file_get_contents($goaccess_conf, true); + $content = preg_replace('/^(#)?html-report-title(.*)/m', "html-report-title $domain", $content); + $app->system->file_put_contents($goaccess_conf, $content, true); + unset($content); + + } + + if(is_file($goaccess_conf) && (filesize($goaccess_conf) > 0)) { + $app->log('Created GoAccess config file: '.$goaccess_conf, LOGLEVEL_DEBUG); + } + + if(is_file($data['new']['document_root']."/" . $web_folder . "/stats/index.html")) $app->system->unlink($data['new']['document_root']."/" . $web_folder . "/stats/index.html"); + if(file_exists("/usr/local/ispconfig/server/conf-custom/goaccess_index.php.master")) { + $app->system->copy("/usr/local/ispconfig/server/conf-custom/goaccess_index.php.master", $data['new']['document_root']."/" . $web_folder . "/stats/index.php"); + } else { + $app->system->copy("/usr/local/ispconfig/server/conf/goaccess_index.php.master", $data['new']['document_root']."/" . $web_folder . "/stats/index.php"); + } + } + + //* Delete the GoAccess configuration file + private function goaccess_delete ($data, $web_config) { global $app; - $awstats_conf_dir = $web_config['awstats_conf_dir']; + $goaccess_conf = $data['old']['document_root'] . "/log/goaccess.conf"; - if ( @is_file($awstats_conf_dir.'/awstats.'.$data['old']['domain'].'.conf') ) { - $app->system->unlink($awstats_conf_dir.'/awstats.'.$data['old']['domain'].'.conf'); - $app->log('Removed AWStats config file: '.$awstats_conf_dir.'/awstats.'.$data['old']['domain'].'.conf', LOGLEVEL_DEBUG); + if ( @is_file($goaccess_conf) ) { + $app->system->unlink($goaccess_conf); + $app->log('Removed GoAccess config file: '.$goaccess_conf, LOGLEVEL_DEBUG); } } + //* Delete the Webalizer configuration file + private function webalizer_delete ($data, $web_config) { + global $app; + + $webalizer_conf = $data['old']['document_root'] . "/log/webalizer.conf"; + + if ( @is_file($webalizer_conf) ) { + $app->system->unlink($webalizer_conf); + $app->log('Removed Webalizer config file: '.$webalizer_conf, LOGLEVEL_DEBUG); + } + } + private function hhvm_update($data, $web_config) { global $app, $conf; - + if(file_exists($conf['rootpath'] . '/conf-custom/hhvm_starter.master')) { $content = file_get_contents($conf['rootpath'] . '/conf-custom/hhvm_starter.master'); } else { @@ -2955,7 +3201,7 @@ class apache2_plugin { } else { $monit_content = file_get_contents($conf['rootpath'] . '/conf/hhvm_monit.master'); } - + if($data['new']['php'] == 'hhvm' && $data['old']['php'] != 'hhvm' || ($data['new']['php'] == 'hhvm' && isset($data['old']['custom_php_ini']) && $data['new']['custom_php_ini'] != $data['old']['custom_php_ini'])) { // Custom php.ini settings @@ -2968,7 +3214,7 @@ class apache2_plugin { foreach($required_php_snippets as $required_php_snippet){ $required_php_snippet = intval($required_php_snippet); if($required_php_snippet > 0){ - $php_snippet = $app->db->queryOneRecord("SELECT * FROM directive_snippets WHERE ".($snippet['master_directive_snippets_id'] > 0 ? 'master_' : '')."directive_snippets_id = ? AND type = 'php' AND active = 'y'", $required_php_snippet); + $php_snippet = $app->db->queryOneRecord("SELECT * FROM directive_snippets WHERE directive_snippets_id = ? AND type = 'php' AND active = 'y'", $required_php_snippet); $php_snippet['snippet'] = trim($php_snippet['snippet']); if($php_snippet['snippet'] != ''){ $custom_php_ini_settings .= "\n".$php_snippet['snippet']; @@ -2992,14 +3238,14 @@ class apache2_plugin { $app->system->exec_safe('chmod +x ? >/dev/null 2>&1', '/etc/init.d/hhvm_' . $data['new']['system_user']); $app->system->exec_safe('/usr/sbin/update-rc.d ? defaults >/dev/null 2>&1', 'hhvm_' . $data['new']['system_user']); $app->system->exec_safe('? restart >/dev/null 2>&1', '/etc/init.d/hhvm_' . $data['new']['system_user']); - + if(is_dir('/etc/monit/conf.d')){ $monit_content = str_replace('{SYSTEM_USER}', $data['new']['system_user'], $monit_content); file_put_contents('/etc/monit/conf.d/00-hhvm_' . $data['new']['system_user'], $monit_content); if(is_file('/etc/monit/conf.d/hhvm_' . $data['new']['system_user'])) unlink('/etc/monit/conf.d/hhvm_' . $data['new']['system_user']); exec('/etc/init.d/monit restart >/dev/null 2>&1'); } - + } elseif($data['new']['php'] != 'hhvm' && $data['old']['php'] == 'hhvm') { if($data['old']['system_user'] != ''){ $app->system->exec_safe('? stop >/dev/null 2>&1', '/etc/init.d/hhvm_' . $data['old']['system_user']); @@ -3007,7 +3253,7 @@ class apache2_plugin { unlink('/etc/init.d/hhvm_' . $data['old']['system_user']); if(is_file('/etc/hhvm/'.$data['old']['system_user'].'.ini')) unlink('/etc/hhvm/'.$data['old']['system_user'].'.ini'); } - + if(is_file('/etc/monit/conf.d/hhvm_' . $data['old']['system_user']) || is_file('/etc/monit/conf.d/00-hhvm_' . $data['old']['system_user'])){ if(is_file('/etc/monit/conf.d/hhvm_' . $data['old']['system_user'])){ unlink('/etc/monit/conf.d/hhvm_' . $data['old']['system_user']); @@ -3026,27 +3272,35 @@ class apache2_plugin { $pool_dir = trim($pool_dir); //$reload = false; + $default_php_fpm = true; + if($data['new']['php'] == 'php-fpm'){ - if(trim($data['new']['fastcgi_php_version']) != ''){ - $default_php_fpm = false; - list($custom_php_fpm_name, $custom_php_fpm_init_script, $custom_php_fpm_ini_dir, $custom_php_fpm_pool_dir) = explode(':', trim($data['new']['fastcgi_php_version'])); - if(substr($custom_php_fpm_ini_dir, -1) != '/') $custom_php_fpm_ini_dir .= '/'; - } else { - $default_php_fpm = true; + if($data['new']['server_php_id'] != 0){ + $tmp_php = $app->db->queryOneRecord('SELECT * FROM server_php WHERE server_php_id = ?', $data['new']['server_php_id']); + if($tmp_php) { + $default_php_fpm = false; + $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']; + if(substr($custom_php_fpm_ini_dir, -1) != '/') $custom_php_fpm_ini_dir .= '/'; + } } } else { - if(trim($data['old']['fastcgi_php_version']) != '' && $data['old']['php'] == 'php-fpm'){ - $default_php_fpm = false; - list($custom_php_fpm_name, $custom_php_fpm_init_script, $custom_php_fpm_ini_dir, $custom_php_fpm_pool_dir) = explode(':', trim($data['old']['fastcgi_php_version'])); - if(substr($custom_php_fpm_ini_dir, -1) != '/') $custom_php_fpm_ini_dir .= '/'; - } else { - $default_php_fpm = true; + if($data['old']['server_php_id'] != 0 && $data['old']['php'] == 'php-fpm'){ + $tmp_php = $app->db->queryOneRecord('SELECT * FROM server_php WHERE server_php_id = ?', $data['old']['server_php_id']); + if($tmp_php) { + $default_php_fpm = false; + $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']; + if(substr($custom_php_fpm_ini_dir, -1) != '/') $custom_php_fpm_ini_dir .= '/'; + } } } $app->uses("getconf"); $web_config = $app->getconf->get_server_config($conf["server_id"], 'web'); - + $php_fpm_reload_mode = ($web_config['php_fpm_reload_mode'] == 'reload')?'reload':'restart'; if($data['new']['php'] != 'php-fpm'){ @@ -3069,7 +3323,7 @@ class apache2_plugin { $tpl = new tpl(); $tpl->newTemplate('php_fpm_pool.conf.master'); $tpl->setVar('apache_version', $app->system->getapacheversion()); - + if($data['new']['php_fpm_use_socket'] == 'y'){ $use_tcp = 0; $use_socket = 1; @@ -3122,7 +3376,7 @@ class apache2_plugin { // Custom php.ini settings $final_php_ini_settings = array(); $custom_php_ini_settings = trim($data['new']['custom_php_ini']); - + if(intval($data['new']['directive_snippets_id']) > 0){ $snippet = $app->db->queryOneRecord("SELECT * FROM directive_snippets WHERE directive_snippets_id = ? AND type = 'apache' AND active = 'y' AND customer_viewable = 'y'", intval($data['new']['directive_snippets_id'])); if(isset($snippet['required_php_snippets']) && trim($snippet['required_php_snippets']) != ''){ @@ -3131,7 +3385,7 @@ class apache2_plugin { foreach($required_php_snippets as $required_php_snippet){ $required_php_snippet = intval($required_php_snippet); if($required_php_snippet > 0){ - $php_snippet = $app->db->queryOneRecord("SELECT * FROM directive_snippets WHERE ".($snippet['master_directive_snippets_id'] > 0 ? 'master_' : '')."directive_snippets_id = ? AND type = 'php' AND active = 'y'", $required_php_snippet); + $php_snippet = $app->db->queryOneRecord("SELECT * FROM directive_snippets WHERE directive_snippets_id = ? AND type = 'php' AND active = 'y'", $required_php_snippet); $php_snippet['snippet'] = trim($php_snippet['snippet']); if($php_snippet['snippet'] != ''){ $custom_php_ini_settings .= "\n".$php_snippet['snippet']; @@ -3141,14 +3395,16 @@ class apache2_plugin { } } } - + $custom_session_save_path = false; + $custom_sendmail_path = false; if($custom_php_ini_settings != ''){ // Make sure we only have Unix linebreaks $custom_php_ini_settings = str_replace("\r\n", "\n", $custom_php_ini_settings); $custom_php_ini_settings = str_replace("\r", "\n", $custom_php_ini_settings); $ini_settings = explode("\n", $custom_php_ini_settings); if(is_array($ini_settings) && !empty($ini_settings)){ + $ini_settings = str_replace('{WEBROOT}', $data['new']['document_root'].'/web', $ini_settings); foreach($ini_settings as $ini_setting){ $ini_setting = trim($ini_setting); if(substr($ini_setting, 0, 1) == ';') continue; @@ -3159,6 +3415,7 @@ class apache2_plugin { if($value != ''){ $key = trim($key); if($key == 'session.save_path') $custom_session_save_path = true; + if($key == 'sendmail_path') $custom_sendmail_path = true; switch (strtolower($value)) { case '0': // PHP-FPM might complain about invalid boolean value if you use 0 @@ -3181,6 +3438,7 @@ class apache2_plugin { } $tpl->setVar('custom_session_save_path', ($custom_session_save_path ? 'y' : 'n')); + $tpl->setVar('custom_sendmail_path', ($custom_sendmail_path ? 'y' : 'n')); $tpl->setLoop('custom_php_ini_settings', $final_php_ini_settings); @@ -3228,18 +3486,23 @@ class apache2_plugin { //* Delete the PHP-FPM pool configuration file private function php_fpm_pool_delete ($data, $web_config) { global $app, $conf; - + $app->uses("getconf"); $web_config = $app->getconf->get_server_config($conf["server_id"], 'web'); - + $php_fpm_reload_mode = ($web_config['php_fpm_reload_mode'] == 'reload')?'reload':'restart'; - if(trim($data['old']['fastcgi_php_version']) != '' && $data['old']['php'] == 'php-fpm'){ - $default_php_fpm = false; - list($custom_php_fpm_name, $custom_php_fpm_init_script, $custom_php_fpm_ini_dir, $custom_php_fpm_pool_dir) = explode(':', trim($data['old']['fastcgi_php_version'])); - if(substr($custom_php_fpm_ini_dir, -1) != '/') $custom_php_fpm_ini_dir .= '/'; - } else { - $default_php_fpm = true; + $default_php_fpm = true; + + if($data['old']['server_php_id'] != 0 && $data['old']['php'] == 'php-fpm'){ + $tmp_php = $app->db->queryOneRecord('SELECT * FROM server_php WHERE server_php_id = ?', $data['old']['server_php_id']); + if($tmp_php) { + $default_php_fpm = false; + $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']; + if(substr($custom_php_fpm_ini_dir, -1) != '/') $custom_php_fpm_ini_dir .= '/'; + } } if($default_php_fpm){ @@ -3390,6 +3653,167 @@ class apache2_plugin { return $seo_redirects; } + function _setup_jailkit_chroot() + { + global $app, $conf; + + $app->uses('system'); + + if (isset($this->jailkit_config) && isset($this->jailkit_config['jailkit_hardlinks'])) { + if ($this->jailkit_config['jailkit_hardlinks'] == 'yes') { + $options = array('hardlink'); + } elseif ($this->jailkit_config['jailkit_hardlinks'] == 'no') { + $options = array(); + } + } else { + $options = array('allow_hardlink'); + } + + // should move return here if $this->website['new_jailkit_hash'] == $this->website['last_jailkit_hash'] ? + + // check if the chroot environment is created yet if not create it with a list of program sections from the config + if (!is_dir($this->website['document_root'].'/etc/jailkit')) + { + $app->system->create_jailkit_chroot($this->website['document_root'], $this->jailkit_config['jailkit_chroot_app_sections'], $options); + $app->log("Added jailkit chroot", LOGLEVEL_DEBUG); + + $this->_add_jailkit_programs($options); + + $app->load('tpl'); + + $tpl = new tpl(); + $tpl->newTemplate("bash.bashrc.master"); + + $tpl->setVar('jailkit_chroot', true); + $tpl->setVar('domain', $this->website['domain']); + $tpl->setVar('home_dir', $this->_get_home_dir("")); + + $bashrc = $this->website['document_root'].'/etc/bash.bashrc'; + if(@is_file($bashrc) || @is_link($bashrc)) unlink($bashrc); + + file_put_contents($bashrc, $tpl->grab()); + unset($tpl); + + $app->log("Added bashrc script: ".$bashrc, LOGLEVEL_DEBUG); + + $tpl = new tpl(); + $tpl->newTemplate("motd.master"); + + $tpl->setVar('domain', $this->website['domain']); + + $motd = $this->website['document_root'].'/var/run/motd'; + if(@is_file($motd) || @is_link($motd)) unlink($motd); + + $app->system->file_put_contents($motd, $tpl->grab()); + + } else { + // force update existing jails + $options[] = 'force'; + + $sections = $this->jailkit_config['jailkit_chroot_app_sections']; + $programs = $this->jailkit_config['jailkit_chroot_app_programs'] . ' ' + . $this->jailkit_config['jailkit_chroot_cron_programs']; + + if ($this->website['new_jailkit_hash'] == $this->website['last_jailkit_hash']) { + return; + } + + $records = $app->db->queryAllRecords('SELECT web_folder FROM `web_domain` WHERE `parent_domain_id` = ? AND `document_root` = ? AND web_folder != \'\' AND web_folder IS NOT NULL AND `server_id` = ?', $this->website['domain_id'], $this->website['document_root'], $conf['server_id']); + foreach ($records as $record) { + $options[] = 'skip='.$record['web_folder']; + } + + $app->system->update_jailkit_chroot($this->website['document_root'], $sections, $programs, $options); + } + + // this gets last_jailkit_update out of sync with master db, but that is ok, + // as it is only used as a timestamp to moderate the frequency of updating on the slaves + $app->db->query("UPDATE `web_domain` SET `last_jailkit_update` = NOW(), `last_jailkit_hash` = ? WHERE `document_root` = ?", $this->website['new_jailkit_hash'], $this->website['document_root']); + } + + function _add_jailkit_programs($opts=array()) + { + global $app; + + $app->uses('system'); + + //copy over further programs and its libraries + $app->system->create_jailkit_programs($this->website['document_root'], $this->jailkit_config['jailkit_chroot_app_programs'], $opts); + $app->log("Added app programs to jailkit chroot", LOGLEVEL_DEBUG); + + $app->system->create_jailkit_programs($this->website['document_root'], $this->jailkit_config['jailkit_chroot_cron_programs'], $opts); + $app->log("Added cron programs to jailkit chroot", LOGLEVEL_DEBUG); + } + + function _get_home_dir($username) + { + return str_replace("[username]", $username, $this->jailkit_config['jailkit_chroot_home']); + } + + function _add_jailkit_user() + { + global $app; + + // add the user to the chroot + $jailkit_chroot_userhome = $this->_get_home_dir($this->website['system_user']); + + if(!is_dir($this->website['document_root'].'/etc')) $app->system->mkdir($this->website['document_root'].'/etc', 0755, true); + if(!is_file($this->website['document_root'].'/etc/passwd')) $app->system->exec_safe('touch ?', $this->website['document_root'].'/etc/passwd'); + + // IMPORTANT! + // ALWAYS create the user. Even if the user was created before + // if we check if the user exists, then a update (no shell -> jailkit) will not work + // and the user has FULL ACCESS to the root of the server! + $app->system->create_jailkit_user($this->website['system_user'], $this->website['document_root'], $jailkit_chroot_userhome); + + if(!is_dir($this->website['document_root'].$jailkit_chroot_userhome)) { + $app->system->mkdir($this->website['document_root'].$jailkit_chroot_userhome, 0750, true); + $app->system->chown($this->website['document_root'].$jailkit_chroot_userhome, $this->website['system_user']); + $app->system->chgrp($this->website['document_root'].$jailkit_chroot_userhome, $this->website['system_group']); + } + + $app->log("Added created jailkit user home in : ".$this->website['document_root'].$jailkit_chroot_userhome, LOGLEVEL_DEBUG); + } + + private function _delete_jailkit_if_unused($parent_domain_id) { + global $app, $conf; + + // get jail directory + $parent_domain = $app->db->queryOneRecord("SELECT * FROM `web_domain` WHERE `domain_id` = ? OR `parent_domain_id` = ? AND `document_root` IS NOT NULL", $parent_domain_id, $parent_domain_id); + if (!is_dir($parent_domain['document_root'])) { + return; + } + + // chroot is used by php-fpm + if (isset($parent_domain['php_fpm_chroot']) && $parent_domain['php_fpm_chroot'] == 'y' && $parent_domain['php'] != 'no') { + return; + } + + // check for any shell_user using this jail + $inuse = $app->db->queryOneRecord('SELECT shell_user_id FROM `shell_user` WHERE `parent_domain_id` = ? AND `chroot` = ?', $parent_domain_id, 'jailkit'); + if($inuse) { + return; + } + + // check for any cron job using this jail + $inuse = $app->db->queryOneRecord('SELECT id FROM `cron` WHERE `parent_domain_id` = ? AND `type` = ?', $parent_domain_id, 'chrooted'); + if($inuse) { + return; + } + + $options = array(); + $records = $app->db->queryAllRecords('SELECT web_folder FROM `web_domain` WHERE `parent_domain_id` = ? AND `document_root` = ? AND web_folder != \'\' AND web_folder IS NOT NULL AND `server_id` = ?', $parent_domain_id, $parent_domain['document_root'], $conf['server_id']); + foreach ($records as $record) { + $options[] = 'skip='.$record['web_folder']; + } + + $app->system->delete_jailkit_chroot($parent_domain['document_root'], $options); + + // this gets last_jailkit_update out of sync with master db, but that is ok, + // as it is only used as a timestamp to moderate the frequency of updating on the slaves + $app->db->query("UPDATE `web_domain` SET `last_jailkit_update` = NOW(), `last_jailkit_hash` = NULL WHERE `document_root` = ?", $parent_domain['document_root']); + } + } // end class ?> diff --git a/server/plugins-available/apps_vhost_plugin.inc.php b/server/plugins-available/apps_vhost_plugin.inc.php index 4d0866d1de9f283d25e23c857d6b652bf6975e15..6318c519ef70c5c1ef1f9c086e87d64aca98001b 100644 --- a/server/plugins-available/apps_vhost_plugin.inc.php +++ b/server/plugins-available/apps_vhost_plugin.inc.php @@ -106,7 +106,19 @@ class apps_vhost_plugin { $vhost_port_listen = '#'; } $tpl->setVar('vhost_port_listen', $vhost_port_listen); - + + /* 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')) { + $tpl->setVar('ssl_comment',''); + } else { + $tpl->setVar('ssl_comment','#'); + } + if(is_file('/usr/local/ispconfig/interface/ssl/ispserver.crt') && is_file('/usr/local/ispconfig/interface/ssl/ispserver.key') && is_file('/usr/local/ispconfig/interface/ssl/ispserver.bundle')) { + $tpl->setVar('ssl_bundle_comment',''); + } else { + $tpl->setVar('ssl_bundle_comment','#'); + } + $mail_config = $app->getconf->get_server_config($conf['server_id'], 'mail'); if($mail_config['content_filter'] == 'rspamd'){ $use_rspamd = true; @@ -180,10 +192,12 @@ class apps_vhost_plugin { $content = str_replace('{fpm_socket}', $fpm_socket, $content); $content = str_replace('{cgi_socket}', $cgi_socket, $content); if( file_exists('/var/run/php5-fpm.sock') + || file_exists('/var/lib/php5-fpm/apps.sock') || file_exists('/var/run/php/php7.0-fpm.sock') || file_exists('/var/run/php/php7.1-fpm.sock') || file_exists('/var/run/php/php7.2-fpm.sock') || file_exists('/var/run/php/php7.3-fpm.sock') + || file_exists('/var/run/php/php7.4-fpm.sock') ){ $use_tcp = '#'; $use_socket = ''; @@ -191,9 +205,19 @@ class apps_vhost_plugin { $use_tcp = ''; $use_socket = '#'; } + + /* 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 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); - + $mail_config = $app->getconf->get_server_config($conf['server_id'], 'mail'); if($mail_config['content_filter'] == 'rspamd'){ $use_rspamd = ''; @@ -203,9 +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.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 @@ -225,7 +251,7 @@ class apps_vhost_plugin { file_put_contents("$vhost_conf_dir/apps.vhost", $content); // enabled / disable apps-vhost - $vhost_symlink = $web_config['vhost_conf_enabled_dir'].'/000-apps.vhost'; + $vhost_symlink = $vhost_conf_enabled_dir . '/000-apps.vhost'; if(is_link($vhost_symlink) && $web_config['apps_vhost_enabled'] == 'n') { $app->system->unlink($vhost_symlink); } diff --git a/server/plugins-available/backup_plugin.inc.php b/server/plugins-available/backup_plugin.inc.php index 3308289d41dfff03564450137cced34aaedb3d8e..8ba345b4c46315939be690a252485f1537997bc9 100644 --- a/server/plugins-available/backup_plugin.inc.php +++ b/server/plugins-available/backup_plugin.inc.php @@ -54,6 +54,8 @@ class backup_plugin { $app->plugins->registerAction('backup_download', $this->plugin_name, 'backup_action'); $app->plugins->registerAction('backup_restore', $this->plugin_name, 'backup_action'); $app->plugins->registerAction('backup_delete', $this->plugin_name, 'backup_action'); + $app->plugins->registerAction('backup_web_files', $this->plugin_name, 'make_backup_callback'); + $app->plugins->registerAction('backup_database', $this->plugin_name, 'make_backup_callback'); //$app->plugins->registerAction('backup_download_mail', $this->plugin_name, 'backup_action_mail'); $app->plugins->registerAction('backup_restore_mail', $this->plugin_name, 'backup_action_mail'); $app->plugins->registerAction('backup_delete_mail', $this->plugin_name, 'backup_action_mail'); @@ -69,8 +71,9 @@ class backup_plugin { if(is_array($backup)) { $app->uses('ini_parser,file,getconf,system'); + $app->load("backup"); - $web = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ?", $backup['parent_domain_id']); + $web = $app->dbmaster->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ?", $backup['parent_domain_id']); $server_config = $app->getconf->get_server_config($conf['server_id'], 'server'); $backup_dir = trim($server_config['backup_dir']); if($backup_dir == '') return; @@ -78,19 +81,13 @@ class backup_plugin { $backup_dir_is_ready = true; //* mount backup directory, if necessary - if( $server_config['backup_dir_is_mount'] == 'y' && !$app->system->mount_backup_dir($server_config['backup_dir']) ) $backup_dir_is_ready = false; + if (!backup::mount_backup_dir($conf['server_id'])) + $backup_dir_is_ready = false; 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 @@ -121,61 +118,19 @@ class backup_plugin { //* Restore a mysql backup if($action_name == 'backup_restore' && $backup['backup_type'] == 'mysql') { - //* Load sql dump into db - include 'lib/mysql_clientdb.conf'; - - if(file_exists($backup_dir.'/'.$backup['filename'])) { - //$parts = explode('_',$backup['filename']); - //$db_name = $parts[1]; - preg_match('@^db_(.+)_\d{4}-\d{2}-\d{2}_\d{2}-\d{2}\.sql\.gz$@', $backup['filename'], $matches); - $db_name = $matches[1]; - $command = "gunzip --stdout ? | mysql -h ? -u ? -p? ?"; - $app->system->exec_safe($command, $backup_dir.'/'.$backup['filename'], $clientdb_host, $clientdb_user, $clientdb_password, $db_name); - } - unset($clientdb_host); - unset($clientdb_user); - unset($clientdb_password); - $app->log('Restored MySQL backup '.$backup_dir.'/'.$backup['filename'], LOGLEVEL_DEBUG); + backup::restoreBackupDatabase($backup['backup_format'], trim($backup['backup_password']), $backup_dir, $backup['filename'], $backup['backup_mode'], $backup['backup_type']); } //* Restore a web backup if($action_name == 'backup_restore' && $backup['backup_type'] == 'web') { - $app->system->web_folder_protection($web['document_root'], false); - if($backup['backup_mode'] == 'userzip') { - if(file_exists($backup_dir.'/'.$backup['filename']) && $web['document_root'] != '' && $web['document_root'] != '/' && !stristr($backup_dir.'/'.$backup['filename'], '..') && !stristr($backup_dir.'/'.$backup['filename'], 'etc')) { - if(file_exists($web['document_root'].'/backup/'.$backup['filename'])) rename($web['document_root'].'/backup/'.$backup['filename'], $web['document_root'].'/backup/'.$backup['filename'].'.bak'); - 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']); - $command = 'sudo -u ? unzip -qq -o ? -d ? 2> /dev/null'; - $app->system->exec_safe($command, $web['system_user'], $web['document_root'].'/backup/'.$backup['filename'], $web['document_root']); - unlink($web['document_root'].'/backup/'.$backup['filename']); - if(file_exists($web['document_root'].'/backup/'.$backup['filename'].'.bak')) rename($web['document_root'].'/backup/'.$backup['filename'].'.bak', $web['document_root'].'/backup/'.$backup['filename']); - $app->log('Restored Web backup '.$backup_dir.'/'.$backup['filename'], LOGLEVEL_DEBUG); - } - } - if($backup['backup_mode'] == 'rootgz') { - if(file_exists($backup_dir.'/'.$backup['filename']) && $web['document_root'] != '' && $web['document_root'] != '/' && !stristr($backup_dir.'/'.$backup['filename'], '..') && !stristr($backup_dir.'/'.$backup['filename'], 'etc')) { - $command = 'tar xzf ? --directory ?'; - $app->system->exec_safe($command, $backup_dir.'/'.$backup['filename'], $web['document_root']); - $app->log('Restored Web backup '.$backup_dir.'/'.$backup['filename'], LOGLEVEL_DEBUG); - } - } - $app->system->web_folder_protection($web['document_root'], true); + backup::restoreBackupWebFiles($backup['backup_format'], trim($backup['backup_password']), $backup_dir, $backup['filename'], $backup['backup_mode'], $backup['backup_type'], $web['document_root'], $web['system_user'], $web['system_group']); } 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']); } - if( $server_config['backup_dir_is_mount'] == 'y' ) $app->system->umount_backup_dir($backup_dir); + backup::unmount_backup_dir($conf['server_id']); } else { $app->log('Backup directory not ready.', LOGLEVEL_DEBUG); } @@ -186,6 +141,37 @@ class backup_plugin { return 'ok'; } + /** + * Makes a backup of website files or database, it's triggered by action and required for the plugin to work. + * Please, don't call this function directly unless you know what you're doing. + * @param string $action_name is the backup source: web files or database + * @param string|int $domain_id + * @return string + * @author Ramil Valitov + * @uses backup_plugin::run_backup() recommended to use if you need to make backups + */ + public function make_backup_callback($action_name, $domain_id) + { + global $app; + + //Load backup class + $app->load('backup'); + $app->log('Triggered backup routine for domain id ' . $domain_id . ', action name ' . $action_name, LOGLEVEL_DEBUG); + + switch ($action_name) { + case 'backup_web_files': + backup::run_backup($domain_id, 'web', "manual"); + break; + case 'backup_database': + backup::run_backup($domain_id, 'mysql', "manual"); + break; + default: + $app->log('Unknown backup action name: ' . $action_name, LOGLEVEL_ERROR); + break; + } + return 'ok'; + } + //* Restore a mail backup - florian@schaal-24.de public function backup_action_mail($action_name, $data) { global $app, $conf; @@ -321,5 +307,4 @@ class backup_plugin { } // end class -?> - +?> diff --git a/server/plugins-available/bind_plugin.inc.php b/server/plugins-available/bind_plugin.inc.php index e8b72b5dbc8b65a612158766f34414f536d11378..643f34e618708d728a75a03d58a3914fd551c810 100644 --- a/server/plugins-available/bind_plugin.inc.php +++ b/server/plugins-available/bind_plugin.inc.php @@ -85,80 +85,114 @@ class bind_plugin { //* load the server configuration options $dns_config = $app->getconf->get_server_config($conf["server_id"], 'dns'); - - //TODO : change this when distribution information has been integrated into server record - $filespre = (file_exists('/etc/gentoo-release')) ? 'pri/' : 'pri.'; - + $domain = substr($data['new']['origin'], 0, strlen($data['new']['origin'])-1); - if (!file_exists($dns_config['bind_zonefiles_dir'].'/'.$filespre.$domain)) return false; - + if (!file_exists($dns_config['bind_zonefiles_dir'].'/'.$this->zone_file_prefix().$domain)) return false; + //* Check Entropy - if (file_get_contents('/proc/sys/kernel/random/entropy_avail') < 400) { + if (file_get_contents('/proc/sys/kernel/random/entropy_avail') < 200) { $app->log('DNSSEC ERROR: We are low on entropy. Not generating new Keys for '.$domain.'. Please consider installing package haveged.', LOGLEVEL_WARN); echo "DNSSEC ERROR: We are low on entropy. Not generating new Keys for $domain. Please consider installing package haveged.\n"; return false; } - + //* Verify that we do not already have keys (overwriting-protection) - if (file_exists($dns_config['bind_zonefiles_dir'].'/dsset-'.$domain.'.')) { - return $this->soa_dnssec_update($data); - } else if ($data['new']['dnssec_initialized'] == 'Y') { //In case that we generated keys but the dsset-file was not generated - $keycount=0; - foreach (glob($dns_config['bind_zonefiles_dir'].'/K'.$domain.'*.key') as $keyfile) { - $keycount++; - } - if ($keycount > 0) { - $this->soa_dnssec_sign($data); - return true; + if($data['old']['dnssec_algo'] == $data['new']['dnssec_algo']) { + if (file_exists($dns_config['bind_keyfiles_dir'].'/dsset-'.$domain.'.')) { + return $this->soa_dnssec_update($data); + } else if ($data['new']['dnssec_initialized'] == 'Y') { //In case that we generated keys but the dsset-file was not generated + $keycount=0; + foreach (glob($dns_config['bind_keyfiles_dir'].'/K'.$domain.'*.key') as $keyfile) { + $keycount++; + } + if ($keycount > 0) { + $this->soa_dnssec_sign($data); + return true; + } } } - - //Do some magic... - $app->system->exec_safe('cd ?; dnssec-keygen -a NSEC3RSASHA1 -b 2048 -n ZONE ?; dnssec-keygen -f KSK -a NSEC3RSASHA1 -b 4096 -n ZONE ?', $dns_config['bind_zonefiles_dir'], $domain, $domain); + + // Get DNSSEC Algorithms + $dnssec_algo = explode(',',$data['new']['dnssec_algo']); + + //* Create the Zone Signing and Key Signing Keys + if(in_array('ECDSAP256SHA256',$dnssec_algo) && count(glob($dns_config['bind_keyfiles_dir'].'/K'.$domain.'.+013*.key')) == 0) { + $app->system->exec_safe('cd ?; dnssec-keygen -3 -a ECDSAP256SHA256 -n ZONE ?; dnssec-keygen -f KSK -3 -a ECDSAP256SHA256 -n ZONE ?', $dns_config['bind_keyfiles_dir'], $domain, $domain); + } + if(in_array('NSEC3RSASHA1',$dnssec_algo) && count(glob($dns_config['bind_keyfiles_dir'].'/K'.$domain.'.+007*.key')) == 0) { + $app->system->exec_safe('cd ?; dnssec-keygen -a NSEC3RSASHA1 -b 2048 -n ZONE ?; dnssec-keygen -f KSK -a NSEC3RSASHA1 -b 4096 -n ZONE ?', $dns_config['bind_keyfiles_dir'], $domain, $domain); + } $this->soa_dnssec_sign($data); //Now sign the zone for the first time $data['new']['dnssec_initialized']='Y'; } - + function soa_dnssec_sign(&$data) { global $app, $conf; - + //* Load libraries $app->uses("getconf,tpl"); //* load the server configuration options $dns_config = $app->getconf->get_server_config($conf["server_id"], 'dns'); - - //TODO : change this when distribution information has been integrated into server record - $filespre = (file_exists('/etc/gentoo-release')) ? 'pri/' : 'pri.'; - + + $filespre = $this->zone_file_prefix(); $domain = substr($data['new']['origin'], 0, strlen($data['new']['origin'])-1); if (!file_exists($dns_config['bind_zonefiles_dir'].'/'.$filespre.$domain)) return false; - + + //* Get DNSSEC Algorithms + $dnssec_algo = explode(',',$data['new']['dnssec_algo']); + + //* Get Zone file content $zonefile = file_get_contents($dns_config['bind_zonefiles_dir'].'/'.$filespre.$domain); $keycount=0; - foreach (glob($dns_config['bind_zonefiles_dir'].'/K'.$domain.'*.key') as $keyfile) { - $includeline = '$INCLUDE '.basename($keyfile); - if (!preg_match('@'.preg_quote($includeline).'@', $zonefile)) $zonefile .= "\n".$includeline."\n"; - $keycount++; + + //* Include ECDSAP256SHA256 keys in zone + if(in_array('ECDSAP256SHA256',$dnssec_algo)) { + foreach (glob($dns_config['bind_keyfiles_dir'].'/K'.$domain.'.+013*.key') as $keyfile) { + $includeline = '$INCLUDE ' . $keyfile; + if (!preg_match('@'.preg_quote($includeline).'@', $zonefile)) $zonefile .= "\n".$includeline."\n"; + $keycount++; + } } - if ($keycount != 2) $app->log('DNSSEC Warning: There are more or less than 2 keyfiles for zone '.$domain, LOGLEVEL_WARN); + + //* Include NSEC3RSASHA1 keys in zone + if(in_array('NSEC3RSASHA1',$dnssec_algo)) { + foreach (glob($dns_config['bind_keyfiles_dir'].'/K'.$domain.'.+007*.key') as $keyfile) { + $includeline = '$INCLUDE ' . $keyfile; + if (!preg_match('@'.preg_quote($includeline).'@', $zonefile)) $zonefile .= "\n".$includeline."\n"; + $keycount++; + } + } + + $keycount_wanted = count(explode(',',$data['new']['dnssec_algo']))*2; + + if ($keycount != $keycount_wanted) $app->log('DNSSEC Warning: There are more or less than 2 keyfiles for each algorithm for zone '.$domain.'. Found: '.$keycount. ' Expected: '.$keycount_wanted, LOGLEVEL_WARN); file_put_contents($dns_config['bind_zonefiles_dir'].'/'.$filespre.$domain, $zonefile); - - //Sign the zone and set it valid for max. 16 days - $app->system->exec_safe('cd ?; dnssec-signzone -A -e +1382400 -3 $(head -c 1000 /dev/random | sha1sum | cut -b 1-16) -N increment -o ? -t ?', $dns_config['bind_zonefiles_dir'], $domain, $filespre.$domain); - - //Write Data back ino DB - $dnssecdata = "DS-Records:\n".file_get_contents($dns_config['bind_zonefiles_dir'].'/dsset-'.$domain.'.'); + + //* Sign the zone and set it valid for max. 16 days + $app->system->exec_safe('cd ?; dnssec-signzone -A -e +1382400 -3 $(head -c 1000 /dev/random | sha1sum | cut -b 1-16) -N increment -o ? -K ? -t ?', $dns_config['bind_zonefiles_dir'], $domain, $dns_config['bind_keyfiles_dir'], $dns_config['bind_zonefiles_dir'].'/'.$filespre.$domain); + + //* Write Data back ino DB + $dnssecdata = "DS-Records:\n".file_get_contents($dns_config['bind_keyfiles_dir'].'/dsset-'.$domain.'.'); $dnssecdata .= "\n------------------------------------\n\nDNSKEY-Records:\n"; - foreach (glob($dns_config['bind_zonefiles_dir'].'/K'.$domain.'*.key') as $keyfile) { - $dnssecdata .= file_get_contents($keyfile)."\n\n"; + + if(in_array('ECDSAP256SHA256',$dnssec_algo)) { + foreach (glob($dns_config['bind_keyfiles_dir'].'/K'.$domain.'.+013*.key') as $keyfile) { + $dnssecdata .= file_get_contents($keyfile)."\n\n"; + } + } + + if(in_array('NSEC3RSASHA1',$dnssec_algo)) { + foreach (glob($dns_config['bind_keyfiles_dir'].'/K'.$domain.'.+007*.key') as $keyfile) { + $dnssecdata .= file_get_contents($keyfile)."\n\n"; + } } - + if ($app->dbmaster !== $app->db) $app->dbmaster->query('UPDATE dns_soa SET dnssec_info=?, dnssec_initialized=\'Y\', dnssec_last_signed=? WHERE id=?', $dnssecdata, intval(time()), intval($data['new']['id'])); $app->db->query('UPDATE dns_soa SET dnssec_info=?, dnssec_initialized=\'Y\', dnssec_last_signed=? WHERE id=?', $dnssecdata, intval(time()), intval($data['new']['id'])); } - + function soa_dnssec_update(&$data, $new=false) { global $app, $conf; @@ -167,33 +201,31 @@ class bind_plugin { //* load the server configuration options $dns_config = $app->getconf->get_server_config($conf["server_id"], 'dns'); - - //TODO : change this when distribution information has been integrated into server record - $filespre = (file_exists('/etc/gentoo-release')) ? 'pri/' : 'pri.'; - + + $filespre = $this->zone_file_prefix(); $domain = substr($data['new']['origin'], 0, strlen($data['new']['origin'])-1); if (!file_exists($dns_config['bind_zonefiles_dir'].'/'.$filespre.$domain)) return false; - + //* Check for available entropy if (file_get_contents('/proc/sys/kernel/random/entropy_avail') < 200) { - $app->log('DNSSEC ERROR: We are low on entropy. This could cause server script to fail. Please consider installing package haveged.', LOGLEVEL_ERR); + $app->log('DNSSEC ERROR: We are low on entropy. This could cause server script to fail. Please consider installing package haveged.', LOGLEVEL_ERROR); echo "DNSSEC ERROR: We are low on entropy. This could cause server script to fail. Please consider installing package haveged.\n"; return false; } - - if (!$new && !file_exists($dns_config['bind_zonefiles_dir'].'/dsset-'.$domain.'.')) $this->soa_dnssec_create($data); - + + if (!$new && !file_exists($dns_config['bind_keyfiles_dir'].'/dsset-'.$domain.'.')) $this->soa_dnssec_create($data); + $dbdata = $app->db->queryOneRecord('SELECT id,serial FROM dns_soa WHERE id=?', intval($data['new']['id'])); $app->system->exec_safe('cd ?; named-checkzone ? ? | egrep -ho \'[0-9]{10}\'', $dns_config['bind_zonefiles_dir'], $domain, $dns_config['bind_zonefiles_dir'].'/'.$filespre.$domain); $retState = $app->system->last_exec_retcode(); if ($retState != 0) { - $app->log('DNSSEC Error: Error in Zonefile for '.$domain, LOGLEVEL_ERR); + $app->log('DNSSEC Error: Error in Zonefile for '.$domain, LOGLEVEL_ERROR); return false; } - + $this->soa_dnssec_sign($data); } - + function soa_dnssec_delete(&$data) { global $app, $conf; @@ -202,16 +234,16 @@ class bind_plugin { //* load the server configuration options $dns_config = $app->getconf->get_server_config($conf["server_id"], 'dns'); - - //TODO : change this when distribution information has been integrated into server record - $filespre = (file_exists('/etc/gentoo-release')) ? 'pri/' : 'pri.'; - + $domain = substr($data['new']['origin'], 0, strlen($data['new']['origin'])-1); - - unlink($dns_config['bind_zonefiles_dir'].'/K'.$domain.'.+*'); - unlink($dns_config['bind_zonefiles_dir'].'/'.$filespre.$domain.'.signed'); - unlink($dns_config['bind_zonefiles_dir'].'/dsset-'.$domain.'.'); - + + $key_files = glob($dns_config['bind_keyfiles_dir'].'/K'.$domain.'.+*'); + foreach($key_files as $file) { + unlink($file); + } + unlink($dns_config['bind_zonefiles_dir'].'/'.$this->zone_file_prefix().$domain.'.signed'); + unlink($dns_config['bind_keyfiles_dir'].'/dsset-'.$domain.'.'); + if ($app->dbmaster !== $app->db) $app->dbmaster->query('UPDATE dns_soa SET dnssec_info=\'\', dnssec_initialized=\'N\' WHERE id=?', intval($data['new']['id'])); $app->db->query('UPDATE dns_soa SET dnssec_info=\'\', dnssec_initialized=\'N\' WHERE id=?', intval($data['new']['id'])); } @@ -235,7 +267,7 @@ class bind_plugin { //* Get the bind version $bind_caa = false; - $bind = explode("\n", shell_exec('which named bind')); + $bind = explode("\n", shell_exec('which named bind 2> /dev/null')); $bind = reset($bind); if(is_executable($bind)) { exec($bind . ' -v 2>&1', $tmp); @@ -254,6 +286,7 @@ class bind_plugin { $records = $app->db->queryAllRecords("SELECT * FROM dns_rr WHERE zone = ? AND active = 'Y'", $zone['id']); if(is_array($records) && !empty($records)){ + $caa_add_rec = -1; for($i=0;$i 0) { + // remove previously added issue ";" + array_pop($records); + } + $caa_add_rec = -2; + } $length = strlen($hex[1])/2; $data_new = "\# $length $hex[1]"; $records[$i]['data'] = $data_new; } } } - $tpl->setLoop('zones', $records); - - //TODO : change this when distribution information has been integrated into server record - if (file_exists('/etc/gentoo-release')) { - $filename = $dns_config['bind_zonefiles_dir'].'/pri/'.str_replace("/", "_", substr($zone['origin'], 0, -1)); - } else { - $filename = $dns_config['bind_zonefiles_dir'].'/pri.'.str_replace("/", "_", substr($zone['origin'], 0, -1)); + $app->log("DNS zone[".$zone['origin']."] has no records yet, skip...", LOGLEVEL_DEBUG); + return; } + $tpl->setLoop('zones', $records); + + $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); @@ -299,7 +349,7 @@ class bind_plugin { if($return_status === 0) { $app->log("Writing BIND domain file: ".$filename, LOGLEVEL_DEBUG); } else { - $loglevel = @($dns_config['disable_bind_log'] === 'y')?'LOGLEVEL_DEBUG':'LOGLEVEL_WARN'; + $loglevel = @($dns_config['disable_bind_log'] === 'y') ? LOGLEVEL_DEBUG : LOGLEVEL_WARN; $app->log("Writing BIND domain file failed: ".$filename." ".implode(' ', $out), $loglevel); if(is_array($out) && !empty($out)){ $app->log('Reason for Bind restart failure: '.implode("\n", $out), $loglevel); @@ -319,25 +369,24 @@ class bind_plugin { unset($records_out); unset($zone); } - + //* DNSSEC-Implementation - if($data['old']['origin'] != $data['new']['origin']) { + if($data['old']['origin'] != $data['new']['origin']) { if (@$data['old']['dnssec_initialized'] == 'Y' && strlen(@$data['old']['origin']) > 3) $this->soa_dnssec_delete($data); //delete old keys if ($data['new']['dnssec_wanted'] == 'Y') $this->soa_dnssec_create($data); - } - else if ($data['new']['dnssec_wanted'] == 'Y' && $data['old']['dnssec_initialized'] == 'N') $this->soa_dnssec_create($data); - else if ($data['new']['dnssec_wanted'] == 'N' && $data['old']['dnssec_initialized'] == 'Y') { //delete old signed file if dnssec is no longer wanted - //TODO : change this when distribution information has been integrated into server record - if (file_exists('/etc/gentoo-release')) { - $filename = $dns_config['bind_zonefiles_dir'].'/pri/'.str_replace("/", "_", substr($data['old']['origin'], 0, -1)); - } - else { - $filename = $dns_config['bind_zonefiles_dir'].'/pri.'.str_replace("/", "_", substr($data['old']['origin'], 0, -1)); - } + } elseif($data['old']['dnssec_algo'] != $data['new']['dnssec_algo']) { + $app->log("DNSSEC Algorithm has changed: ".$data['new']['dnssec_algo'], LOGLEVEL_DEBUG); + if ($data['new']['dnssec_wanted'] == 'Y') $this->soa_dnssec_create($data); + } elseif ($data['new']['dnssec_wanted'] == 'Y' && $data['old']['dnssec_initialized'] == 'N') { + $this->soa_dnssec_create($data); + } elseif ($data['new']['dnssec_wanted'] == 'N' && $data['old']['dnssec_initialized'] == 'Y') { //delete old signed file if dnssec is no longer wanted + $filename = $dns_config['bind_zonefiles_dir'].'/' . $this->zone_file_prefix() . str_replace("/", "_", substr($data['old']['origin'], 0, -1)); if(is_file($filename.'.signed')) unlink($filename.'.signed'); - } else if ($data['new']['dnssec_wanted'] == 'Y') $this->soa_dnssec_update($data); + } elseif ($data['new']['dnssec_wanted'] == 'Y') { + $this->soa_dnssec_update($data); + } // END DNSSEC - + //* rebuild the named.conf file if the origin has changed or when the origin is inserted. //if($this->action == 'insert' || $data['old']['origin'] != $data['new']['origin']) { $this->write_named_conf($data, $dns_config); @@ -345,19 +394,13 @@ class bind_plugin { //* Delete old domain file, if domain name has been changed if($data['old']['origin'] != $data['new']['origin']) { - //TODO : change this when distribution information has been integrated into server record - if (file_exists('/etc/gentoo-release')) { - $filename = $dns_config['bind_zonefiles_dir'].'/pri/'.str_replace("/", "_", substr($data['old']['origin'], 0, -1)); - } - else { - $filename = $dns_config['bind_zonefiles_dir'].'/pri.'.str_replace("/", "_", substr($data['old']['origin'], 0, -1)); - } + $filename = $dns_config['bind_zonefiles_dir'].'/' . $this->zone_file_prefix() . str_replace("/", "_", substr($data['old']['origin'], 0, -1)); if(is_file($filename)) unlink($filename); if(is_file($filename.'.err')) unlink($filename.'.err'); if(is_file($filename.'.signed')) unlink($filename.'.signed'); } - + //* Restart bind nameserver if update_acl is not empty, otherwise reload it if($data['new']['update_acl'] != '') { $app->services->restartServiceDelayed('bind', 'restart'); @@ -378,24 +421,11 @@ class bind_plugin { $this->write_named_conf($data, $dns_config); //* Delete the domain file - //TODO : change this when distribution information has been integrated into server record - if (file_exists('/etc/gentoo-release')) { - $zone_file_name = $dns_config['bind_zonefiles_dir'].'/pri/'.str_replace("/", "_", substr($data['old']['origin'], 0, -1)); - } - else { - $zone_file_name = $dns_config['bind_zonefiles_dir'].'/pri.'.str_replace("/", "_", substr($data['old']['origin'], 0, -1)); - } - + $zone_file_name = $dns_config['bind_zonefiles_dir'].'/' . $this->zone_file_prefix() . str_replace("/", "_", substr($data['old']['origin'], 0, -1)); if(is_file($zone_file_name)) unlink($zone_file_name); if(is_file($zone_file_name.'.err')) unlink($zone_file_name.'.err'); $app->log("Deleting BIND domain file: ".$zone_file_name, LOGLEVEL_DEBUG); - //* DNSSEC-Implementation - if($data['old']['dnssec_initialized'] == 'Y' && file_exists('/usr/local/ispconfig/server/scripts/dnssec-delete.sh')) { - //delete keys - $app->system->exec_safe('/usr/local/ispconfig/server/scripts/dnssec-delete.sh ?', $data['old']['origin']); - } - //* Reload bind nameserver $app->services->restartServiceDelayed('bind', 'reload'); @@ -425,24 +455,13 @@ class bind_plugin { //* Delete old domain file, if domain name has been changed if($data['old']['origin'] != $data['new']['origin']) { - //TODO : change this when distribution information has been integrated into server record - if (file_exists('/etc/gentoo-release')) { - $filename = $dns_config['bind_zonefiles_dir'].'/sec/'.str_replace("/", "_", substr($data['old']['origin'], 0, -1)); - } - else { - $filename = $dns_config['bind_zonefiles_dir'].'/slave/sec.'.str_replace("/", "_", substr($data['old']['origin'], 0, -1)); - } - + $filename = $dns_config['bind_zonefiles_dir'].'/' . $this->zone_file_prefix() . str_replace("/", "_", substr($data['old']['origin'], 0, -1)); if(is_file($filename)) unset($filename); } //* Ensure that the named slave directory is writable by the named user - if (file_exists('/etc/gentoo-release')) { - $slave_record_dir = $dns_config['bind_zonefiles_dir'].'/sec'; - } else { - $slave_record_dir = $dns_config['bind_zonefiles_dir'].'/slave'; - } - if(!@is_dir($slave_record_dir)) mkdir($slave_record_dir, 0770); + $slave_record_dir = $dns_config['bind_zonefiles_dir'].'/'.$this->slave_zone_file_prefix(); + if(!@is_dir($slave_record_dir)) mkdir($slave_record_dir, 0770, true); chown($slave_record_dir, $dns_config['bind_user']); chgrp($slave_record_dir, $dns_config['bind_group']); @@ -463,14 +482,7 @@ class bind_plugin { $this->write_named_conf($data, $dns_config); //* Delete the domain file - //TODO : change this when distribution information has been integrated into server record - if (file_exists('/etc/gentoo-release')) { - $zone_file_name = $dns_config['bind_zonefiles_dir'].'/sec/'.str_replace("/", "_", substr($data['old']['origin'], 0, -1)); - } - else { - $zone_file_name = $dns_config['bind_zonefiles_dir'].'/slave/sec.'.str_replace("/", "_", substr($data['old']['origin'], 0, -1)); - } - + $zone_file_name = $dns_config['bind_zonefiles_dir'].'/' . $this->slave_zone_file_prefix() . str_replace("/", "_", substr($data['old']['origin'], 0, -1)); if(is_file($zone_file_name)) unlink($zone_file_name); $app->log("Deleting BIND domain file for secondary zone: ".$zone_file_name, LOGLEVEL_DEBUG); @@ -527,16 +539,8 @@ class bind_plugin { //* Check if the current zone that triggered this function has at least one NS record - //TODO : change this when distribution information has been integrated into server record - if (file_exists('/etc/gentoo-release')) { - $pri_zonefiles_path = $dns_config['bind_zonefiles_dir'].'/pri/'; - $sec_zonefiles_path = $dns_config['bind_zonefiles_dir'].'/sec/'; - - } - else { - $pri_zonefiles_path = $dns_config['bind_zonefiles_dir'].'/pri.'; - $sec_zonefiles_path = $dns_config['bind_zonefiles_dir'].'/slave/sec.'; - } + $pri_zonefiles_path = $dns_config['bind_zonefiles_dir'].'/'.$this->zone_file_prefix(); + $sec_zonefiles_path = $dns_config['bind_zonefiles_dir'].'/'.$this->slave_zone_file_prefix(); //* Loop trough zones foreach($tmps as $tmp) { @@ -544,13 +548,11 @@ class bind_plugin { if ($tmp['dnssec_wanted'] == 'Y') $zone_file .= '.signed'; //.signed is for DNSSEC-Implementation $options = ''; - if(trim($tmp['xfer']) != '') { + if($tmp['xfer'] != null && trim($tmp['xfer']) != '') { $options .= " allow-transfer {".str_replace(',', ';', $tmp['xfer']).";};\n"; - } else { - $options .= " allow-transfer {none;};\n"; } - if(trim($tmp['also_notify']) != '') $options .= ' also-notify {'.str_replace(',', ';', $tmp['also_notify']).";};\n"; - if(trim($tmp['update_acl']) != '') $options .= " allow-update {".str_replace(',', ';', $tmp['update_acl']).";};\n"; + if($tmp['also_notify'] != null && trim($tmp['also_notify']) != '') $options .= ' also-notify {'.str_replace(',', ';', $tmp['also_notify']).";};\n"; + if($tmp['update_acl'] != null && trim($tmp['update_acl']) != '') $options .= " allow-update {".str_replace(',', ';', $tmp['update_acl']).";};\n"; if(file_exists($zone_file)) { $zones[] = array( 'zone' => substr($tmp['origin'], 0, -1), @@ -571,7 +573,7 @@ class bind_plugin { foreach($tmps_sec as $tmp) { // When you have more than one master, the serial number is used to determine which Master has the most current version of the zone by the - // slaves. The slaves actually ask for the SOA record from each Master when refreshing. + // slaves. The slaves actually ask for the SOA record from each Master when refreshing. $options = " masters {".str_replace(',', ';', $tmp['ns']).";};\n"; if(trim($tmp['xfer']) != '') { $options .= " allow-transfer {".str_replace(',', ';', $tmp['xfer']).";};\n"; @@ -603,6 +605,16 @@ class bind_plugin { } + function zone_file_prefix() { + //TODO : change this when distribution information has been integrated into server record + return (file_exists('/etc/gentoo-release')) ? 'pri/' : 'pri.'; + } + function slave_zone_file_prefix() { + //TODO : change this when distribution information has been integrated into server record + return (file_exists('/etc/gentoo-release')) ? 'sec/' : 'slave/sec.'; + } + + } // end class diff --git a/server/plugins-available/cron_jailkit_plugin.inc.php b/server/plugins-available/cron_jailkit_plugin.inc.php index 0650ad87a3aefee4057d4d78d6a40214c2454852..8bd33b3de00fd3853510784770c580666ed4aaef 100644 --- a/server/plugins-available/cron_jailkit_plugin.inc.php +++ b/server/plugins-available/cron_jailkit_plugin.inc.php @@ -76,7 +76,7 @@ class cron_jailkit_plugin { } //* get data from web - $parent_domain = $app->db->queryOneRecord("SELECT `domain_id`, `system_user`, `system_group`, `document_root`, `domain` FROM `web_domain` WHERE `domain_id` = ?", $data["new"]["parent_domain_id"]); + $parent_domain = $app->db->queryOneRecord("SELECT * FROM `web_domain` WHERE `domain_id` = ?", $data["new"]["parent_domain_id"]); if(!$parent_domain["domain_id"]) { $app->log("Parent domain not found", LOGLEVEL_WARN); return 0; @@ -105,8 +105,12 @@ class cron_jailkit_plugin { // load the server configuration options $app->uses("getconf"); $this->data = $data; - $this->app = $app; $this->jailkit_config = $app->getconf->get_server_config($conf["server_id"], 'jailkit'); + foreach (array('jailkit_chroot_app_sections', 'jailkit_chroot_app_programs') as $section) { + if (isset($parent_domain[$section]) && $parent_domain[$section] != '' ) { + $this->jailkit_config[$section] = $parent_domain[$section]; + } + } $this->_update_website_security_level(); @@ -141,7 +145,7 @@ class cron_jailkit_plugin { return 0; } //* get data from web - $parent_domain = $app->db->queryOneRecord("SELECT `domain_id`, `system_user`, `system_group`, `document_root`, `domain` FROM `web_domain` WHERE `domain_id` = ?", $data["new"]["parent_domain_id"]); + $parent_domain = $app->db->queryOneRecord("SELECT * FROM `web_domain` WHERE `domain_id` = ?", $data["new"]["parent_domain_id"]); if(!$parent_domain["domain_id"]) { $app->log("Parent domain not found", LOGLEVEL_WARN); return 0; @@ -167,29 +171,25 @@ class cron_jailkit_plugin { { $app->log("Jailkit Plugin (Cron) -> setting up jail", LOGLEVEL_DEBUG); // load the server configuration options - /* $app->uses("getconf"); $this->data = $data; - $this->app = $app; - $this->jailkit_config = $app->getconf->get_server_config($conf["server_id"], 'jailkit'); - $this->parent_domain = $parent_domain; - - $this->_setup_jailkit_chroot(); - $this->_add_jailkit_user(); - */ - $app->uses("getconf"); - $this->data = $data; - $this->app = $app; $this->jailkit_config = $app->getconf->get_server_config($conf["server_id"], 'jailkit'); + foreach (array('jailkit_chroot_app_sections', 'jailkit_chroot_app_programs') as $section) { + if (isset($parent_domain[$section]) && $parent_domain[$section] != '' ) { + $this->jailkit_config[$section] = $parent_domain[$section]; + } + } $this->_update_website_security_level(); $app->system->web_folder_protection($parent_domain['document_root'], false); $this->_setup_jailkit_chroot(); + $this->_add_jailkit_user(); $this->_update_website_security_level(); + $app->system->web_folder_protection($parent_domain['document_root'], true); } @@ -205,22 +205,59 @@ class cron_jailkit_plugin { function delete($event_name, $data) { global $app, $conf; - //* nothing to do here! + if($data["old"]["parent_domain_id"] == '') { + $app->log("Parent domain not set", LOGLEVEL_WARN); + return 0; + } + + $app->uses('system'); + + if ($data['old']['type'] == "chrooted") + { + $parent_domain = $app->db->queryOneRecord("SELECT * FROM `web_domain` WHERE `domain_id` = ?", $data['old']['parent_domain_id']); + + // should copy some _delete_homedir() functionality from shelluser_jailkit_plugin ? + if (isset($parent_domain['delete_unused_jailkit']) && $parent_domain['delete_unused_jailkit'] == 'y') { + $app->system->web_folder_protection($parent_domain['document_root'], false); + $this->_delete_jailkit_if_unused($parent_domain['domain_id']); + $app->system->web_folder_protection($parent_domain['document_root'], true); + } + } } function _setup_jailkit_chroot() { global $app; - //check if the chroot environment is created yet if not create it with a list of program sections from the config + if (isset($this->jailkit_config) && isset($this->jailkit_config['jailkit_hardlinks'])) { + if ($this->jailkit_config['jailkit_hardlinks'] == 'yes') { + $options = array('hardlink'); + } elseif ($this->jailkit_config['jailkit_hardlinks'] == 'no') { + $options = array(); + } + } else { + $options = array('allow_hardlink'); + } + + $last_updated = preg_split('/[\s,]+/', $this->jailkit_config['jailkit_chroot_app_sections'] + .' '.$this->jailkit_config['jailkit_chroot_app_programs'] + .' '.$this->jailkit_config['jailkit_chroot_cron_programs']); + $last_updated = array_unique($last_updated, SORT_REGULAR); + sort($last_updated, SORT_STRING); + $update_hash = hash('md5', implode(' ', $last_updated)); + + // should move return here if $update_hash == $parent_domain['last_jailkit_hash'] ? + + // check if the chroot environment is created yet if not create it with a list of program sections from the config if (!is_dir($this->parent_domain['document_root'].'/etc/jailkit')) { - $app->system->create_jailkit_chroot($this->parent_domain['document_root'], $this->jailkit_config['jailkit_chroot_app_sections']); + $app->system->create_jailkit_chroot($this->parent_domain['document_root'], $this->jailkit_config['jailkit_chroot_app_sections'], $options); + $app->log("Added jailkit chroot", LOGLEVEL_DEBUG); - $this->app->log("Added jailkit chroot", LOGLEVEL_DEBUG); + $this->_add_jailkit_programs($options); - $this->app->load('tpl'); + $app->load('tpl'); $tpl = new tpl(); $tpl->newTemplate("bash.bashrc.master"); @@ -235,7 +272,7 @@ class cron_jailkit_plugin { $app->system->file_put_contents($bashrc, $tpl->grab()); unset($tpl); - $this->app->log('Added bashrc script: '.$bashrc, LOGLEVEL_DEBUG); + $app->log('Added bashrc script: '.$bashrc, LOGLEVEL_DEBUG); $tpl = new tpl(); $tpl->newTemplate('motd.master'); @@ -247,30 +284,51 @@ class cron_jailkit_plugin { $app->system->file_put_contents($motd, $tpl->grab()); + } else { + // force update existing jails + $options[] = 'force'; + + $sections = $this->jailkit_config['jailkit_chroot_app_sections']; + $programs = $this->jailkit_config['jailkit_chroot_app_programs'] . ' ' + . $this->jailkit_config['jailkit_chroot_cron_programs']; + + if ($update_hash == $parent_domain['last_jailkit_hash']) { + return; + } + + $records = $app->db->queryAllRecords('SELECT web_folder FROM `web_domain` WHERE `parent_domain_id` = ? AND `document_root` = ? AND web_folder != \'\' AND web_folder IS NOT NULL AND `server_id` = ?', $this->parent_domain['domain_id'], $this->parent_domain['document_root'], $conf['server_id']); + foreach ($records as $record) { + $options[] = 'skip='.$record['web_folder']; + } + + $app->system->update_jailkit_chroot($this->parent_domain['document_root'], $sections, $programs, $options); } - $this->_add_jailkit_programs(); + + // this gets last_jailkit_update out of sync with master db, but that is ok, + // as it is only used as a timestamp to moderate the frequency of updating on the slaves + $app->db->query("UPDATE `web_domain` SET `last_jailkit_update` = NOW(), `last_jailkit_hash` = ? WHERE `document_root` = ?", $update_hash, $this->parent_domain['document_root']); } - function _add_jailkit_programs() + function _add_jailkit_programs($opts=array()) { global $app; //copy over further programs and its libraries - $app->system->create_jailkit_programs($this->parent_domain['document_root'], $this->jailkit_config['jailkit_chroot_app_programs']); - $this->app->log("Added app programs to jailkit chroot", LOGLEVEL_DEBUG); - - $app->system->create_jailkit_programs($this->parent_domain['document_root'], $this->jailkit_config['jailkit_chroot_cron_programs']); - $this->app->log("Added cron programs to jailkit chroot", LOGLEVEL_DEBUG); + $app->system->create_jailkit_programs($this->parent_domain['document_root'], $this->jailkit_config['jailkit_chroot_app_programs'], $opts); + $app->log("Added app programs to jailkit chroot", LOGLEVEL_DEBUG); + + $app->system->create_jailkit_programs($this->parent_domain['document_root'], $this->jailkit_config['jailkit_chroot_cron_programs'], $opts); + $app->log("Added cron programs to jailkit chroot", LOGLEVEL_DEBUG); } function _add_jailkit_user() { global $app; - //add the user to the chroot + // add the user to the chroot $jailkit_chroot_userhome = $this->_get_home_dir($this->parent_domain['system_user']); - if(!is_dir($this->parent_domain['document_root'].'/etc')) mkdir($this->parent_domain['document_root'].'/etc'); + if(!is_dir($this->parent_domain['document_root'].'/etc')) $app->system->mkdir($this->parent_domain['document_root'].'/etc', 0755, true); if(!is_file($this->parent_domain['document_root'].'/etc/passwd')) $app->system->exec_safe('touch ?', $this->parent_domain['document_root'].'/etc/passwd'); // IMPORTANT! @@ -279,7 +337,10 @@ class cron_jailkit_plugin { // and the user has FULL ACCESS to the root of the server! $app->system->create_jailkit_user($this->parent_domain['system_user'], $this->parent_domain['document_root'], $jailkit_chroot_userhome); - $app->system->mkdir($this->parent_domain['document_root'].$jailkit_chroot_userhome, 0755, true); + 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']); @@ -311,5 +372,44 @@ class cron_jailkit_plugin { } } + private function _delete_jailkit_if_unused($parent_domain_id) { + global $app, $conf; + + // get jail directory + $parent_domain = $app->db->queryOneRecord("SELECT * FROM `web_domain` WHERE `domain_id` = ? OR `parent_domain_id` = ? AND `document_root` IS NOT NULL", $parent_domain_id, $parent_domain_id); + if (!is_dir($parent_domain['document_root'])) { + return; + } + + // chroot is used by php-fpm + if (isset($parent_domain['php_fpm_chroot']) && $parent_domain['php_fpm_chroot'] == 'y') { + return; + } + + // check for any shell_user using this jail + $inuse = $app->db->queryOneRecord('SELECT shell_user_id FROM `shell_user` WHERE `parent_domain_id` = ? AND `chroot` = ?', $parent_domain_id, 'jailkit'); + if($inuse) { + return; + } + + // check for any cron job using this jail + $inuse = $app->db->queryOneRecord('SELECT id FROM `cron` WHERE `parent_domain_id` = ? AND `type` = ?', $parent_domain_id, 'chrooted'); + if($inuse) { + return; + } + + $options = array(); + $records = $app->db->queryAllRecords('SELECT web_folder FROM `web_domain` WHERE `parent_domain_id` = ? AND `document_root` = ? AND web_folder != \'\' AND web_folder IS NOT NULL AND `server_id` = ?', $parent_domain_id, $parent_domain['document_root'], $conf['server_id']); + foreach ($records as $record) { + $options[] = 'skip='.$record['web_folder']; + } + + $app->system->delete_jailkit_chroot($parent_domain['document_root'], $options); + + // this gets last_jailkit_update out of sync with master db, but that is ok, + // as it is only used as a timestamp to moderate the frequency of updating on the slaves + $app->db->query("UPDATE `web_domain` SET `last_jailkit_update` = NOW(), `last_jailkit_hash` = NULL WHERE `document_root` = ?", $parent_domain['document_root']); + } + } // end class diff --git a/server/plugins-available/cron_plugin.inc.php b/server/plugins-available/cron_plugin.inc.php index af4e24d97429faf08e2acea80fb57eb21ab88583..331e85f91977a0717d77ecef33ce7563be692cd8 100644 --- a/server/plugins-available/cron_plugin.inc.php +++ b/server/plugins-available/cron_plugin.inc.php @@ -103,7 +103,7 @@ class cron_plugin { $app->log("Websites (and Crons) cannot be owned by the root user or group.", LOGLEVEL_WARN); return false; } - + // Get the client ID $client = $app->dbmaster->queryOneRecord("SELECT client_id FROM sys_group WHERE sys_group.groupid = ?", $data["new"]["sys_groupid"]); $client_id = intval($client["client_id"]); @@ -123,7 +123,7 @@ class cron_plugin { $app->system->exec_safe("useradd -d ? -g ? ? -s /bin/false", $parent_domain["document_root"], $groupname, $username); $app->log("Adding the user: $username", LOGLEVEL_DEBUG); } - + // Set the quota for the user if($username != '' && $app->system->is_user($username)) { if($parent_domain['hd_quota'] > 0) { @@ -144,7 +144,7 @@ class cron_plugin { $app->system->exec_safe('setquota -u ? ? ? 0 0 -a &> /dev/null', $username, $blocks_soft, $blocks_hard); $app->system->exec_safe('setquota -T -u ? 604800 604800 -a &> /dev/null', $username); } elseif ($file_system == 'xfs') { - + $app->system->exec_safe("xfs_quota -x -c ? ?", "limit -u bsoft=$mb_soft" . 'm'. " bhard=$mb_hard" . 'm'. " $username", $primitive_root); // xfs only supports timers globally, not per user. @@ -177,21 +177,25 @@ class cron_plugin { } function delete($event_name, $data) { - global $app, $conf; + global $app; //* get data from web $parent_domain = $app->db->queryOneRecord("SELECT `domain_id`, `system_user`, `system_group`, `document_root`, `hd_quota` FROM `web_domain` WHERE `domain_id` = ?", $data["old"]["parent_domain_id"]); - if(!$parent_domain["domain_id"]) { - $app->log("Parent domain not found", LOGLEVEL_WARN); - return 0; - } - - // Get the client ID - $client = $app->dbmaster->queryOneRecord("SELECT client_id FROM sys_group WHERE sys_group.groupid = ?", $data["old"]["sys_groupid"]); - $client_id = intval($client["client_id"]); - unset($client); - $this->parent_domain = $parent_domain; + 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'); + 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; + } $this->_write_crontab(); } @@ -219,31 +223,31 @@ class cron_plugin { if($cron_jobs && count($cron_jobs) > 0) { foreach($cron_jobs as $job) { if($job['run_month'] == '@reboot') { - $command = "@reboot"; + $cron_line = "@reboot"; } else { - $command = str_replace(" ", "", $job['run_min']) . "\t" . str_replace(" ", "", $job['run_hour']) . "\t" . str_replace(" ", "", $job['run_mday']) . "\t" . str_replace(" ", "", $job['run_month']) . "\t" . str_replace(" ", "", $job['run_wday']); + $cron_line = str_replace(" ", "", $job['run_min']) . "\t" . str_replace(" ", "", $job['run_hour']) . "\t" . str_replace(" ", "", $job['run_mday']) . "\t" . str_replace(" ", "", $job['run_month']) . "\t" . str_replace(" ", "", $job['run_wday']); } - - $log_target = ">/dev/null 2>&1"; + + $log_target = ""; $log_wget_target = '/dev/null'; $log_root = ''; if($job['log'] == 'y') { if($job['type'] != 'chrooted') $log_root = $this->parent_domain['document_root']; $log_root .= '/private'; - + $log_target = '>>' . $log_root . '/cron.log 2>>' . $log_root . '/cron_error.log'; $log_wget_target = $log_root . '/cron_wget.log'; } - - $command .= "\t{$this->parent_domain['system_user']}"; //* running as user + + $cron_line .= "\t{$this->parent_domain['system_user']}"; //* running as user if($job['type'] == 'url') { - $command .= "\t{$cron_config['wget']} --no-check-certificate --user-agent='Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0' -q -t 1 -T 7200 -O " . $log_wget_target . " " . escapeshellarg($job['command']) . " " . $log_target; + $cron_line .= "\t{$cron_config['wget']} --no-check-certificate --user-agent='Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0' -q -t 1 -T 7200 -O " . $log_wget_target . " " . escapeshellarg($job['command']) . " " . $log_target; } else { if(strpos($job['command'], "\n") !== false || strpos($job['command'], "\r") !== false || strpos($job['command'], chr(0)) !== false) { $app->log("Insecure Cron job SKIPPED: " . $job['command'], LOGLEVEL_WARN); continue; } - + $web_root = ''; if($job['type'] == 'chrooted') { if(substr($job['command'], 0, strlen($this->parent_domain['document_root'])) == $this->parent_domain['document_root']) { @@ -253,20 +257,20 @@ class cron_plugin { } else { $web_root = $this->parent_domain['document_root']; } - + $web_root .= '/web'; $job['command'] = str_replace('[web_root]', $web_root, $job['command']); - $command .= "\t"; - //if($job['type'] != 'chrooted' && substr($job['command'], 0, 1) != "/") $command .= $this->parent_domain['document_root'].'/'; - $command .= $job['command'] . " " . $log_target; + $cron_line .= "\t"; + //if($job['type'] != 'chrooted' && substr($job['command'], 0, 1) != "/") $cron_line .= $this->parent_domain['document_root'].'/'; + $cron_line .= $job['command'] . " " . $log_target; } if($job['type'] == 'chrooted') { - $chr_cron_content .= $command . " #{$job['domain']}\n"; + $chr_cron_content .= $cron_line . " #{$job['domain']}\n"; $chr_cmd_count++; } else { - $cron_content .= $command . " #{$job['domain']}\n"; + $cron_content .= $cron_line . " #{$job['domain']}\n"; $cmd_count++; } } diff --git a/server/plugins-available/getmail_plugin.inc.php b/server/plugins-available/getmail_plugin.inc.php index c3f4f7e1dcd48f210bcf935398f9960cb28fe80f..c06638db32943b574d835af0f47a92e8332820c6 100644 --- a/server/plugins-available/getmail_plugin.inc.php +++ b/server/plugins-available/getmail_plugin.inc.php @@ -76,7 +76,7 @@ class getmail_plugin { function update($event_name, $data) { global $app, $conf; - + // Do not write getmail config files on mirror servers to avoid double fetching of emails. if($conf['mirror_server_id'] > 0) return true; @@ -116,7 +116,7 @@ class getmail_plugin { $tpl = str_replace('{DELETE}', 'false', $tpl); } - if($data["new"]["read_all"] == 'y') { + if($data["new"]["source_read_all"] == 'y') { $tpl = str_replace('{READ_ALL}', 'true', $tpl); } else { $tpl = str_replace('{READ_ALL}', 'false', $tpl); diff --git a/server/plugins-available/mail_plugin.inc.php b/server/plugins-available/mail_plugin.inc.php index 4d5ac826d3780f4d264f07c0060a9f0ffe13bd56..53836a1392f50d4dda9268f83f464fa6ec78d149 100644 --- a/server/plugins-available/mail_plugin.inc.php +++ b/server/plugins-available/mail_plugin.inc.php @@ -82,6 +82,7 @@ class mail_plugin { //* get the config $app->uses('getconf,system'); $mail_config = $app->getconf->get_server_config($conf['server_id'], 'mail'); + $global_mail_config = $app->getconf->get_global_config('mail'); // convert to lower case - it could cause problems if some directory above has upper case name // $data['new']['maildir'] = strtolower($data['new']['maildir']); @@ -135,7 +136,7 @@ class mail_plugin { $app->system->exec_safe("su -c 'doveadm mailbox create -u ? Trash'", $data["new"]["email"]); $app->system->exec_safe("su -c 'doveadm mailbox create -u ? Junk'", $data["new"]["email"]); $app->system->exec_safe("su -c 'doveadm mailbox create -u ? Drafts'", $data["new"]["email"]); - + $app->system->exec_safe("su -c 'doveadm mailbox subscribe -u ? INBOX'", $data["new"]["email"]); $app->system->exec_safe("su -c 'doveadm mailbox subscribe -u ? Sent'", $data["new"]["email"]); $app->system->exec_safe("su -c 'doveadm mailbox subscribe -u ? Trash'", $data["new"]["email"]); @@ -149,26 +150,26 @@ class mail_plugin { $app->log('Created Directory: '.$maildomain_path, LOGLEVEL_DEBUG); $maildomain_path .= '/Maildir'; } - + //* When the mail user dir exists but it is not a valid maildir, move it to corrupted maildir folder if(!empty($maildomain_path) && is_dir($maildomain_path) && !is_dir($maildomain_path.'/new') && !is_dir($maildomain_path.'/cur')) { if(!is_dir($mail_config['homedir_path'].'/corrupted/'.$data['new']['mailuser_id'])) $app->system->mkdirpath($mail_config['homedir_path'].'/corrupted/'.$data['new']['mailuser_id'], 0700, $mail_config['mailuser_name'], $mail_config['mailuser_group']); $app->system->exec_safe("su -c ? vmail", "mv -f " . $data['new']['maildir']." ".$mail_config['homedir_path'].'/corrupted/'.$data['new']['mailuser_id']); $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. if(!empty($maildomain_path) && !is_dir($maildomain_path)) { - + $app->system->maildirmake($maildomain_path, $user, '', $group); - + //* This is to fix the maildrop quota not being rebuilt after the quota is changed. if($mail_config['pop3_imap_daemon'] != 'dovecot') { if(is_dir($maildomain_path)) $app->system->exec_safe("su -c ? ?", "maildirmake -q ".$data['new']['quota']."S ".$maildomain_path, $user); // Avoid maildirmake quota bug, see debian bug #214911 $app->log('Created Maildir: '."su -c 'maildirmake -q ".$data['new']['quota']."S ".$maildomain_path."' ".$user, LOGLEVEL_DEBUG); } } - + if(!is_dir($data['new']['maildir'].'/.Sent')) { $app->system->maildirmake($maildomain_path, $user, 'Sent', $group); } @@ -181,11 +182,11 @@ class mail_plugin { if(!is_dir($data['new']['maildir'].'/.Junk')) { $app->system->maildirmake($maildomain_path, $user, 'Junk', $group); } - + // Set permissions now recursive $app->system->exec_safe('chown -R ?:? ?', $user, $group, $data['new']['maildir']); $app->log('Set ownership on '.$data['new']['maildir'], LOGLEVEL_DEBUG); - + //* Set the maildir quota if(is_dir($data['new']['maildir'].'/new') && $mail_config['pop3_imap_daemon'] != 'dovecot') { if($data['new']['quota'] > 0) { @@ -218,20 +219,30 @@ class mail_plugin { $lines = file($conf['rootpath'].'/conf/mail/welcome_email_en.txt'); } + $placeholders = array( + '{domain}' => "$domain", + '{email}' => $data["new"]["email"], + '{admin_mail}' => ($global_mail_config['admin_mail'] != '' ? $global_mail_config['admin_mail'] : 'root'), + '{admin_name}' => ($global_mail_config['admin_name'] != '' ? $global_mail_config['admin_name'] : ''), + ); + //* Get from address $parts = explode(':', trim($lines[0])); unset($parts[0]); $welcome_mail_from = implode(':', $parts); unset($lines[0]); + $welcome_mail_from = strtr($welcome_mail_from, $placeholders); //* Get subject $parts = explode(':', trim($lines[1])); unset($parts[0]); $welcome_mail_subject = implode(':', $parts); unset($lines[1]); + $welcome_mail_subject = strtr($welcome_mail_subject, $placeholders); //* Get message $welcome_mail_message = trim(implode($lines)); + $welcome_mail_message = strtr($welcome_mail_message, $placeholders); unset($tmp); $mailHeaders = "MIME-Version: 1.0" . "\n"; @@ -247,8 +258,15 @@ class mail_plugin { $mailTarget = $data["new"]["email"]; $mailSubject = "=?utf-8?B?".base64_encode($welcome_mail_subject)."?="; - //* Send the welcome email only on the "master" mail server to avoid duplicate emails - if($conf['mirror_server_id'] == 0) mail($mailTarget, $mailSubject, $welcome_mail_message, $mailHeaders); + $additionalParameters = ''; + if (preg_match('/\b([A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,63})\b/i', $welcome_mail_from, $matches)) { + $additionalParameters = '-f '.$matches[1]; + } + + // Send the welcome email only on a "master" mail server to avoid duplicate emails, and only send them when welcome emails are enabled. + // (bypass the normal ispcmail class when creating mail accounts) + $global_config = $app->getconf->get_global_config('mail'); + if($conf['mirror_server_id'] == 0 && $global_config['enable_welcome_mail'] == 'y') mail($mailTarget, $mailSubject, $welcome_mail_message, $mailHeaders, $additionalParameters); } @@ -261,7 +279,7 @@ class mail_plugin { // Maildir-Format must not be changed on this way !! $data['new']['maildir_format'] = $data['old']['maildir_format']; - + $maildomain_path = $data['new']['maildir']; $tmp_basepath = $data['new']['maildir']; $tmp_basepath_parts = explode('/', $tmp_basepath); @@ -315,7 +333,7 @@ class mail_plugin { $app->system->exec_safe('mv -f ? ?'. $data['old']['maildir'], $data['new']['maildir']); $app->log('Moved Maildir from: '.$data['old']['maildir'].' to '.$data['new']['maildir'], LOGLEVEL_DEBUG); } - + //* Create the maildir, if it doesn not exist, set permissions, set quota. if(!is_dir($data['new']['maildir'].'/mdbox')) { $app->system->exec_safe("su -c 'doveadm mailbox create -u ? INBOX'", $data["new"]["email"]); @@ -323,7 +341,7 @@ class mail_plugin { $app->system->exec_safe("su -c 'doveadm mailbox create -u ? Trash'", $data["new"]["email"]); $app->system->exec_safe("su -c 'doveadm mailbox create -u ? Junk'", $data["new"]["email"]); $app->system->exec_safe("su -c 'doveadm mailbox create -u ? Drafts'", $data["new"]["email"]); - + $app->system->exec_safe("su -c 'doveadm mailbox subscribe -u ? INBOX'", $data["new"]["email"]); $app->system->exec_safe("su -c 'doveadm mailbox subscribe -u ? Sent'", $data["new"]["email"]); $app->system->exec_safe("su -c 'doveadm mailbox subscribe -u ? Trash'", $data["new"]["email"]); @@ -338,18 +356,18 @@ class mail_plugin { $app->log('Created Directory: '.$base_path, LOGLEVEL_DEBUG); $maildomain_path .= '/Maildir'; } - + //* When the mail user dir exists but it is not a valid maildir, move it to corrupted maildir folder if(!empty($maildomain_path) && is_dir($maildomain_path) && !is_dir($maildomain_path.'/new') && !is_dir($maildomain_path.'/cur')) { if(!is_dir($mail_config['homedir_path'].'/corrupted/'.$data['new']['mailuser_id'])) $app->system->mkdirpath($mail_config['homedir_path'].'/corrupted/'.$data['new']['mailuser_id'], 0700, $mail_config['mailuser_name'], $mail_config['mailuser_group']); $app->system->exec_safe("su -c ? ?", "mv -f ".$data['new']['maildir']." ".$mail_config['homedir_path'].'/corrupted/'.$data['new']['mailuser_id'], 'vmail'); $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); - + //* This is to fix the maildrop quota not being rebuilt after the quota is changed. if($mail_config['pop3_imap_daemon'] != 'dovecot') { if($data['new']['quota'] > 0) { @@ -361,7 +379,7 @@ class mail_plugin { } } } - + if(!is_dir($data['new']['maildir'].'/.Sent')) { $app->system->maildirmake($maildomain_path, $user, 'Sent', $group); } @@ -374,11 +392,11 @@ class mail_plugin { if(!is_dir($data['new']['maildir'].'/.Junk')) { $app->system->maildirmake($maildomain_path, $user, 'Junk', $group); } - + // Set permissions now recursive $app->system->exec_safe('chown -R ?:? ?', $user, $group, $data['new']['maildir']); $app->log('Set ownership on '.$data['new']['maildir'], LOGLEVEL_DEBUG); - + // Move mailbox, if domain has changed and delete old mailbox if($data['new']['maildir'] != $data['old']['maildir'] && is_dir($data['old']['maildir'])) { if(is_dir($data['new']['maildir'])) { @@ -411,8 +429,19 @@ class mail_plugin { $maildir_path_deleted = false; $old_maildir_path = $data['old']['maildir']; if($old_maildir_path != $mail_config['homedir_path'] && strlen($old_maildir_path) > strlen($mail_config['homedir_path']) && !stristr($old_maildir_path, '//') && !stristr($old_maildir_path, '..') && !stristr($old_maildir_path, '*') && strlen($old_maildir_path) >= 10) { - $app->system->exec_safe('rm -rf ?', $old_maildir_path); - $app->log('Deleted the Maildir: '.$data['old']['maildir'], LOGLEVEL_DEBUG); + if ($mail_config['mailbox_soft_delete'] == 'y') { + // Move it, adding a date based suffix. A cronjob should purge or archive. + $thrash_maildir_path = $old_maildir_path . '-deleted-' . date("YmdHis"); + $app->system->exec_safe('mv ? ?', $old_maildir_path, $thrash_maildir_path); + + // Update the dir's timestamp to make filtering on age easier in any cleanup cronjob. + $app->system->exec_safe('touch ?', $thrash_maildir_path); + + $app->log('Renamed the Maildir: ' . $data['old']['maildir'] . ' to ' . $thrash_maildir_path, LOGLEVEL_DEBUG); + } else { + $app->system->exec_safe('rm -rf ?', $old_maildir_path); + $app->log('Deleted the Maildir: '.$data['old']['maildir'], LOGLEVEL_DEBUG); + } $maildir_path_deleted = true; } else { $app->log('Possible security violation when deleting the maildir: '.$data['old']['maildir'], LOGLEVEL_ERROR); @@ -455,8 +484,19 @@ class mail_plugin { //* Delete maildomain path $old_maildomain_path = $mail_config['homedir_path'].'/'.$data['old']['domain']; if($old_maildomain_path != $mail_config['homedir_path'] && !stristr($old_maildomain_path, '//') && !stristr($old_maildomain_path, '..') && !stristr($old_maildomain_path, '*') && !stristr($old_maildomain_path, '&') && strlen($old_maildomain_path) >= 10 && !empty($data['old']['domain'])) { - $app->system->exec_safe('rm -rf ?', $old_maildomain_path); - $app->log('Deleted the mail domain directory: '.$old_maildomain_path, LOGLEVEL_DEBUG); + if ($mail_config['mailbox_soft_delete'] == 'y') { + // Move it, adding a date based suffix. A cronjob should purge or archive. + $thrash_maildomain_path = $old_maildomain_path . '-deleted-' . date("YmdHis"); + $app->system->exec_safe('mv ? ?', $old_maildomain_path, $thrash_maildomain_path); + + // Update the dir's timestamp to make filtering on age easier in any cleanup cronjob. + $app->system->exec_safe('touch ?', $thrash_maildomain_path); + + $app->log('Renamed the mail domain directory: ' . $old_maildomain_path . ' to ' . $thrash_maildomain_path, LOGLEVEL_DEBUG); + } else { + $app->system->exec_safe('rm -rf ?', $old_maildomain_path); + $app->log('Deleted the mail domain directory: '.$old_maildomain_path, LOGLEVEL_DEBUG); + } $maildomain_path_deleted = true; } else { $app->log('Possible security violation when deleting the mail domain directory: '.$old_maildomain_path, LOGLEVEL_ERROR); @@ -470,7 +510,7 @@ class mail_plugin { } else { $app->log('Possible security violation when deleting the mail domain mailfilter directory: '.$old_maildomain_path, LOGLEVEL_ERROR); } - + //* Delete the mail-backups $server_config = $app->getconf->get_server_config($conf['server_id'], 'server'); $backup_dir = $server_config['backup_dir']; diff --git a/server/plugins-available/maildeliver_plugin.inc.php b/server/plugins-available/maildeliver_plugin.inc.php index 2c16601f5024d8d74242b4fb25b29f43e13b918c..168063c1a2a9307cfd81c882ab890c9878507661 100644 --- a/server/plugins-available/maildeliver_plugin.inc.php +++ b/server/plugins-available/maildeliver_plugin.inc.php @@ -93,147 +93,150 @@ class maildeliver_plugin { or $data["old"]["autoresponder_start_date"] != $data["new"]["autoresponder_start_date"] or $data["old"]["autoresponder_end_date"] != $data["new"]["autoresponder_end_date"] or $data["old"]["cc"] != $data["new"]["cc"] + or $data["old"]["forward_in_lda"] != $data["new"]["forward_in_lda"] ) { $app->log("Mailfilter config has been changed", LOGLEVEL_DEBUG); $sieve_file = $data["new"]["maildir"].'/.sieve'; - $sieve_file_isp = $data["new"]["maildir"].'/sieve/ispconfig.sieve'; - if(is_file($sieve_file)) unlink($sieve_file) or $app->log("Unable to delete file: $sieve_file", LOGLEVEL_WARN); - if(is_file($sieve_file_isp)) unlink($sieve_file_isp) or $app->log("Unable to delete file: $sieve_file_isp", LOGLEVEL_WARN); + $sieve_file_svbin = $data["new"]["maildir"].'/.sieve.svbin'; + $old_sieve_file_isp = $data["new"]["maildir"].'/sieve/ispconfig.sieve'; + $sieve_file_isp_before = $data["new"]["maildir"].'/.ispconfig-before.sieve'; + $sieve_file_isp_before_svbin = $data["new"]["maildir"].'/.ispconfig-before.svbin'; + $sieve_file_isp_after = $data["new"]["maildir"].'/.ispconfig.sieve'; + $sieve_file_isp_after_svbin = $data["new"]["maildir"].'/.ispconfig.svbin'; + + if(is_file($old_sieve_file_isp)) unlink($old_sieve_file_isp) or $app->log("Unable to delete file: $old_sieve_file_isp", LOGLEVEL_WARN); + // cleanup .sieve file if it is now a broken link + if(is_link($sieve_file) && !file_exists($sieve_file)) unlink($sieve_file) or $app->log("Unable to delete file: $sieve_file", LOGLEVEL_WARN); + if(is_file($sieve_file_svbin)) unlink($sieve_file_svbin) or $app->log("Unable to delete file: $sieve_file_svbin", LOGLEVEL_WARN); + if(is_file($sieve_file_isp_before)) unlink($sieve_file_isp_before) or $app->log("Unable to delete file: $sieve_file_isp_before", LOGLEVEL_WARN); + if(is_file($sieve_file_isp_before_svbin)) unlink($sieve_file_isp_before_svbin) or $app->log("Unable to delete file: $sieve_file_isp_before_svbin", LOGLEVEL_WARN); + if(is_file($sieve_file_isp_after)) unlink($sieve_file_isp_after) or $app->log("Unable to delete file: $sieve_file_isp_after", LOGLEVEL_WARN); + if(is_file($sieve_file_isp_after_svbin)) unlink($sieve_file_isp_after_svbin) or $app->log("Unable to delete file: $sieve_file_isp_after_svbin", LOGLEVEL_WARN); $app->load('tpl'); - //* Select sieve filter file for dovecot version - exec('dovecot --version', $tmp); - if(substr($tmp[0], 0, 3) == '1.0') { - $filter_file_template = "sieve_filter.master"; - } elseif(substr($tmp[0], 0, 3) == '1.2') { - $filter_file_template = "sieve_filter_1.2.master"; - } elseif(substr($tmp[0], 0, 1) == '2') { - $filter_file_template = "sieve_filter_1.2.master"; - } else { - $filter_file_template = "sieve_filter.master"; - } - unset($tmp); - - //* Create new filter file based on template - $tpl = new tpl(); - $tpl->newTemplate($filter_file_template); - - // cc Field - $tmp_mails_arr = explode(',',$data["new"]["cc"]); - $tmp_addresses_arr = array(); - foreach($tmp_mails_arr as $address) { - if(trim($address) != '') $tmp_addresses_arr[] = array('address' => trim($address)); - } + foreach ( array('before', 'after') as $sieve_script ) { + //* Create new filter file based on template + $tpl = new tpl(); + $tpl->newTemplate("sieve_filter.master"); + + // cc Field + if ($data["new"]["forward_in_lda"] == 'y' && $data["new"]["cc"] != '') { + $tmp_mails_arr = explode(',',$data["new"]["cc"]); + $tmp_addresses_arr = array(); + foreach($tmp_mails_arr as $address) { + if(trim($address) != '') $tmp_addresses_arr[] = array('address' => trim($address)); + } - $tpl->setVar('cc', $data["new"]["cc"]); - $tpl->setLoop('ccloop', $tmp_addresses_arr); + $tpl->setVar('cc', $data["new"]["cc"]); + $tpl->setLoop('ccloop', $tmp_addresses_arr); + } - // Custom filters - if($data["new"]["custom_mailfilter"] == 'NULL') $data["new"]["custom_mailfilter"] = ''; - $tpl->setVar('custom_mailfilter', str_replace("\r\n","\n",$data["new"]["custom_mailfilter"])); + // Custom filters + if($data["new"]["custom_mailfilter"] == 'NULL') $data["new"]["custom_mailfilter"] = ''; + $tpl->setVar('custom_mailfilter', str_replace("\r\n","\n",$data["new"]["custom_mailfilter"])); - // Move junk - $tpl->setVar('move_junk', $data["new"]["move_junk"]); + // Move junk + $tpl->setVar('move_junk', $data["new"]["move_junk"]); - // Check autoresponder dates - if((!$data['new']['autoresponder_start_date'] || $data["new"]["autoresponder_start_date"] == '0000-00-00 00:00:00') && (!$data['new']['autoresponder_end_date'] || $data["new"]["autoresponder_end_date"] == '0000-00-00 00:00:00')) { - $tpl->setVar('autoresponder_date_limit', 0); - } else { - $tpl->setVar('autoresponder_date_limit', 1); - } + // Set autoresponder start date + $data["new"]["autoresponder_start_date"] = str_replace(" ", "T", $data["new"]["autoresponder_start_date"]); + $tpl->setVar('start_date', $data["new"]["autoresponder_start_date"]); + // Set autoresponder end date + $data["new"]["autoresponder_end_date"] = str_replace(" ", "T", $data["new"]["autoresponder_end_date"]); + $tpl->setVar('end_date', $data["new"]["autoresponder_end_date"]); - // Set autoresponder start date - $data["new"]["autoresponder_start_date"] = str_replace(" ", "T", $data["new"]["autoresponder_start_date"]); - $tpl->setVar('start_date', $data["new"]["autoresponder_start_date"]); + // Autoresponder + $tpl->setVar('autoresponder', $data["new"]["autoresponder"]); - // Set autoresponder end date - $data["new"]["autoresponder_end_date"] = str_replace(" ", "T", $data["new"]["autoresponder_end_date"]); - $tpl->setVar('end_date', $data["new"]["autoresponder_end_date"]); + // Autoresponder Subject + $data["new"]["autoresponder_subject"] = str_replace("\"", "'", $data["new"]["autoresponder_subject"]); + $tpl->setVar('autoresponder_subject', $data["new"]["autoresponder_subject"]); - // Autoresponder - $tpl->setVar('autoresponder', $data["new"]["autoresponder"]); + // Autoresponder Text + $data["new"]["autoresponder_text"] = str_replace("\"", "'", $data["new"]["autoresponder_text"]); + $tpl->setVar('autoresponder_text', $data["new"]["autoresponder_text"]); - // Autoresponder Subject - $data["new"]["autoresponder_subject"] = str_replace("\"", "'", $data["new"]["autoresponder_subject"]); - $tpl->setVar('autoresponder_subject', $data["new"]["autoresponder_subject"]); + if (! defined($address_str)) { + //* Set alias addresses for autoresponder + $sql = "SELECT * FROM mail_forwarding WHERE type = 'alias' AND destination = ?"; + $records = $app->db->queryAllRecords($sql, $data["new"]["email"]); - // Autoresponder Text - $data["new"]["autoresponder_text"] = str_replace("\"", "'", $data["new"]["autoresponder_text"]); - $tpl->setVar('autoresponder_text', $data["new"]["autoresponder_text"]); + $addresses = array(); + $addresses[] = $data["new"]["email"]; + if(is_array($records) && count($records) > 0) { + foreach($records as $rec) { + $addresses[] = $rec['source']; + } + } - //* Set alias addresses for autoresponder - $sql = "SELECT * FROM mail_forwarding WHERE type = 'alias' AND destination = ?"; - $records = $app->db->queryAllRecords($sql, $data["new"]["email"]); + $app->log("Found " . count($addresses) . " addresses.", LOGLEVEL_DEBUG); + + $alias_addresses = array(); + + $email_parts = explode('@', $data["new"]["email"]); + $sql = "SELECT * FROM mail_forwarding WHERE type = 'aliasdomain' AND destination = ?"; + $records = $app->db->queryAllRecords($sql, '@'.$email_parts[1]); + if(is_array($records) && count($records) > 0) { + $app->log("Found " . count($records) . " records (aliasdomains).", LOGLEVEL_DEBUG); + foreach($records as $rec) { + $aliasdomain = substr($rec['source'], 1); + foreach($addresses as $email) { + $email_parts = explode('@', $email); + $alias_addresses[] = $email_parts[0].'@'.$aliasdomain; + } + } + } - $addresses = array(); - $addresses[] = $data["new"]["email"]; - if(is_array($records) && count($records) > 0) { - foreach($records as $rec) { - $addresses[] = $rec['source']; - } - } + $app->log("Found " . count($addresses) . " addresses at all.", LOGLEVEL_DEBUG); - $app->log("Found " . count($addresses) . " addresses.", LOGLEVEL_DEBUG); + $addresses = array_unique(array_merge($addresses, $alias_addresses)); - $alias_addresses = array(); + $app->log("Found " . count($addresses) . " unique addresses at all.", LOGLEVEL_DEBUG); - $email_parts = explode('@', $data["new"]["email"]); - $sql = "SELECT * FROM mail_forwarding WHERE type = 'aliasdomain' AND destination = ?"; - $records = $app->db->queryAllRecords($sql, '@'.$email_parts[1]); - if(is_array($records) && count($records) > 0) { - $app->log("Found " . count($records) . " records (aliasdomains).", LOGLEVEL_DEBUG); - foreach($records as $rec) { - $aliasdomain = substr($rec['source'], 1); - foreach($addresses as $email) { - $email_parts = explode('@', $email); - $alias_addresses[] = $email_parts[0].'@'.$aliasdomain; + $address_str = ''; + if(is_array($addresses) && count($addresses) > 0) { + $address_str .= ':addresses ['; + foreach($addresses as $rec) { + $address_str .= '"'.$rec.'",'; + } + $address_str = substr($address_str, 0, -1); + $address_str .= ']'; } } - } - - $app->log("Found " . count($addresses) . " addresses at all.", LOGLEVEL_DEBUG); - $addresses = array_unique(array_merge($addresses, $alias_addresses)); + $tpl->setVar('addresses', $address_str); - $app->log("Found " . count($addresses) . " unique addresses at all.", LOGLEVEL_DEBUG); + if ( ! is_dir($data["new"]["maildir"].'/sieve/') ) { + $app->system->mkdirpath($data["new"]["maildir"].'/sieve/', 0700, $mail_config['mailuser_name'], $mail_config['mailuser_group']); + } - $address_str = ''; - if(is_array($addresses) && count($addresses) > 0) { - $address_str .= ':addresses ['; - foreach($addresses as $rec) { - $address_str .= '"'.$rec.'",'; + $tpl->setVar('sieve_script', $sieve_script); + if ($sieve_script == 'before') { + $sieve_file_isp = $sieve_file_isp_before; + $sieve_file_isp_svbin = $sieve_file_isp_before_svbin; + } elseif ($sieve_script == 'after') { + $sieve_file_isp = $sieve_file_isp_after; + $sieve_file_isp_svbin = $sieve_file_isp_after_svbin; } - $address_str = substr($address_str, 0, -1); - $address_str .= ']'; - } + file_put_contents($sieve_file_isp, $tpl->grab()) or $app->log("Unable to write sieve filter file " . $sieve_file_isp, LOGLEVEL_WARN); + if ( is_file($sieve_file_isp) ) { + $app->system->chown($sieve_file_isp,$mail_config['mailuser_name'],false); + $app->system->chgrp($sieve_file_isp,$mail_config['mailuser_group'],false); - $tpl->setVar('addresses', $address_str); + $app->system->exec_safe("sievec ?", "$sieve_file_isp"); + if ( is_file($sieve_file_isp_svbin) ) { + $app->system->chown($sieve_file_isp_svbin,$mail_config['mailuser_name'],false); + $app->system->chgrp($sieve_file_isp_svbin,$mail_config['mailuser_group'],false); + } + } - if ( ! is_dir($data["new"]["maildir"].'/sieve/') ) { - $app->system->mkdirpath($data["new"]["maildir"].'/sieve/', 0700, $mail_config['mailuser_name'], $mail_config['mailuser_group']); - } + unset($tpl); - file_put_contents($sieve_file_isp, $tpl->grab()) or $app->log("Unable to write sieve filter file", LOGLEVEL_WARN); - if ( is_file($sieve_file_isp) ) { - $app->system->chown($sieve_file_isp,$mail_config['mailuser_name'],false); - $app->system->chgrp($sieve_file_isp,$mail_config['mailuser_group'],false); - } - chdir($data["new"]["maildir"]); - //* create symlink to activate sieve script - symlink("sieve/ispconfig.sieve", ".sieve") or $app->log("Unable to create symlink to active sieve filter", LOGLEVEL_WARN); - if (is_link(".sieve")) { - $app->system->chown(".sieve",$mail_config['mailuser_name'],true); - $app->system->chgrp(".sieve",$mail_config['mailuser_group'],true); } - $app->system->chown($sieve_file,$mail_config['mailuser_name'],true); - $app->system->chgrp($sieve_file,$mail_config['mailuser_group'],true); - - unset($tpl); - } } @@ -241,9 +244,21 @@ class maildeliver_plugin { global $app, $conf; $sieve_file = $data["old"]["maildir"].'/.sieve'; - $sieve_file_isp = $data["old"]["maildir"].'/sieve/ispconfig.sieve'; - if(is_file($sieve_file)) unlink($sieve_file) or $app->log("Unable to delete file: $sieve_file", LOGLEVEL_WARN); - if(is_file($sieve_file_isp)) unlink($sieve_file_isp) or $app->log("Unable to delete file: $sieve_file_isp", LOGLEVEL_WARN); + $sieve_file_svbin = $data["old"]["maildir"].'/.sieve.svbin'; + $old_sieve_file_isp = $data["new"]["maildir"].'/sieve/ispconfig.sieve'; + $sieve_file_isp_before = $data["old"]["maildir"].'/.ispconfig-before.sieve'; + $sieve_file_isp_before_svbin = $data["old"]["maildir"].'/.ispconfig-before.svbin'; + $sieve_file_isp_after = $data["old"]["maildir"].'/.ispconfig.sieve'; + $sieve_file_isp_after_svbin = $data["old"]["maildir"].'/.ispconfig.svbin'; + + if(is_file($old_sieve_file_isp)) unlink($old_sieve_file_isp) or $app->log("Unable to delete file: $old_sieve_file_isp", LOGLEVEL_WARN); + // cleanup .sieve file if it is now a broken link + if(is_link($sieve_file) && !file_exists($sieve_file)) unlink($sieve_file) or $app->log("Unable to delete file: $sieve_file", LOGLEVEL_WARN); + if(is_file($sieve_file_svbin)) unlink($sieve_file_svbin) or $app->log("Unable to delete file: $sieve_file_svbin", LOGLEVEL_WARN); + if(is_file($sieve_file_isp_before)) unlink($sieve_file_isp_before) or $app->log("Unable to delete file: $sieve_file_isp_before", LOGLEVEL_WARN); + if(is_file($sieve_file_isp_before_svbin)) unlink($sieve_file_isp_before_svbin) or $app->log("Unable to delete file: $sieve_file_isp_before_svbin", LOGLEVEL_WARN); + if(is_file($sieve_file_isp_after)) unlink($sieve_file_isp_after) or $app->log("Unable to delete file: $sieve_file_isp_after", LOGLEVEL_WARN); + if(is_file($sieve_file_isp_after_svbin)) unlink($sieve_file_isp_after_svbin) or $app->log("Unable to delete file: $sieve_file_isp_after_svbin", LOGLEVEL_WARN); } diff --git a/server/plugins-available/maildrop_plugin.inc.php b/server/plugins-available/maildrop_plugin.inc.php index 2fefa26cfc95cfc697dc456278f136258543628b..e1b559b367432cfb4349e6fd4e9f376e048cb22b 100644 --- a/server/plugins-available/maildrop_plugin.inc.php +++ b/server/plugins-available/maildrop_plugin.inc.php @@ -146,9 +146,12 @@ class maildrop_plugin { if ($data['new']['autoresponder_start_date'] && $data["new"]["autoresponder_start_date"] != '0000-00-00 00:00:00') { // Dates have been set $tpl = str_replace('{start_date}', strtotime($data["new"]["autoresponder_start_date"]), $tpl); - $tpl = str_replace('{end_date}', strtotime($data["new"]["autoresponder_end_date"]), $tpl); } else { $tpl = str_replace('{start_date}', -7200, $tpl); + } + if ($data['new']['autoresponder_end_date'] && $data["new"]["autoresponder_end_date"] != '0000-00-00 00:00:00') { // Dates have been set + $tpl = str_replace('{end_date}', strtotime($data["new"]["autoresponder_end_date"]), $tpl); + } else { $tpl = str_replace('{end_date}', 2147464800, $tpl); } @@ -173,7 +176,9 @@ class maildrop_plugin { // Write the custom mailfilter script, if mailfilter recipe has changed if($data["old"]["custom_mailfilter"] != $data["new"]["custom_mailfilter"] or $data["old"]["move_junk"] != $data["new"]["move_junk"] - or $data["old"]["cc"] != $data["new"]["cc"]) { + or $data["old"]["cc"] != $data["new"]["cc"] + or $data["old"]["forward_in_lda"] != $data["new"]["forward_in_lda"] + ) { $app->log("Mailfilter config has been changed", LOGLEVEL_DEBUG); if(trim($data["new"]["custom_mailfilter"]) != '' @@ -195,7 +200,7 @@ class maildrop_plugin { $mailfilter_content = ''; - if($data["new"]["cc"] != '') { + if ($data["new"]["forward_in_lda"] == 'y' && $data["new"]["cc"] != '') { $tmp_mails_arr = explode(',',$data["new"]["cc"]); foreach($tmp_mails_arr as $address) { if(trim($address) != '') $mailfilter_content .= "cc \"!".trim($address)."\"\n"; @@ -204,7 +209,7 @@ class maildrop_plugin { $app->log("Added CC address ".$data["new"]["cc"].' to mailfilter file.', LOGLEVEL_DEBUG); } - if($data["new"]["move_junk"] == 'y') { + if($data["new"]["move_junk"] != 'n') { if(file_exists($conf["rootpath"].'/conf-custom/mailfilter_move_junk.master')) { $mailfilter_content .= file_get_contents($conf["rootpath"].'/conf-custom/mailfilter_move_junk.master')."\n"; } else { diff --git a/server/plugins-available/mysql_clientdb_plugin.inc.php b/server/plugins-available/mysql_clientdb_plugin.inc.php index a26129eed96e1b8e9499c61efa7ecb831da5114d..9cf750a84db03949bc818d0979618dc8f82c7bca 100644 --- a/server/plugins-available/mysql_clientdb_plugin.inc.php +++ b/server/plugins-available/mysql_clientdb_plugin.inc.php @@ -101,16 +101,11 @@ class mysql_clientdb_plugin { $success = true; if(!preg_match('/\*[A-F0-9]{40}$/', $database_password)) { - $result = $link->query("SELECT PASSWORD('" . $link->escape_string($database_password) . "') as `crypted`"); - if($result) { - $row = $result->fetch_assoc(); - $database_password = $row['crypted']; - $result->free(); - } + $database_password = $app->db->getPasswordHash($password); } - + $app->log("Calling $action for $database_name with access $user_access_mode and hosts " . implode(', ', $host_list), LOGLEVEL_DEBUG); - + // loop through hostlist foreach($host_list as $db_host) { $db_host = trim($db_host); @@ -137,22 +132,53 @@ class mysql_clientdb_plugin { $app->log("Invalid host " . $db_host . " for GRANT to " . $database_name, LOGLEVEL_DEBUG); continue; } - + $grants = 'ALL PRIVILEGES'; if($user_access_mode == 'r') $grants = 'SELECT'; elseif($user_access_mode == 'rd') $grants = 'SELECT, DELETE, ALTER, DROP'; - + + $database_name = $link->escape_string($database_name); + if($action == 'GRANT') { if($user_access_mode == 'r' || $user_access_mode == 'rd') { - if(!$link->query("REVOKE ALL PRIVILEGES ON `".$link->escape_string($database_name)."`.* FROM '".$link->escape_string($database_user)."'@'$db_host'")) $success = false; - $app->log("REVOKE ALL PRIVILEGES ON `".$link->escape_string($database_name)."`.* FROM '".$link->escape_string($database_user)."'@'$db_host' success? " . ($success ? 'yes' : 'no'), LOGLEVEL_DEBUG); + if(!$link->query("REVOKE ALL PRIVILEGES ON `".$database_name."`.* FROM '".$link->escape_string($database_user)."'@'$db_host'")) $success = false; + $app->log("REVOKE ALL PRIVILEGES ON `".$database_name."`.* FROM '".$link->escape_string($database_user)."'@'$db_host' success? " . ($success ? 'yes' : 'no'), LOGLEVEL_DEBUG); $success = true; } - - if(!$link->query("GRANT " . $grants . " ON `".$link->escape_string($database_name)."`.* TO '".$link->escape_string($database_user)."'@'$db_host' IDENTIFIED BY PASSWORD '".$link->escape_string($database_password)."'")) $success = false; - $app->log("GRANT " . $grants . " ON `".$link->escape_string($database_name)."`.* TO '".$link->escape_string($database_user)."'@'$db_host' IDENTIFIED BY PASSWORD '".$link->escape_string($database_password)."' success? " . ($success ? 'yes' : 'no'), LOGLEVEL_DEBUG); - } elseif($action == 'REVOKE') { - if(!$link->query("REVOKE ALL PRIVILEGES ON `".$link->escape_string($database_name)."`.* FROM '".$link->escape_string($database_user)."'@'$db_host'")) $success = false; + + // Create the user + $link->query("CREATE USER '".$link->escape_string($database_user)."'@'$db_host'"); + $app->log("CREATE USER '".$link->escape_string($database_user)."'@'$db_host'", LOGLEVEL_DEBUG); + + // mariadb or mysql < 5.7 + if($this->getDatabaseType($link) == 'mariadb' || version_compare($this->getDatabaseVersion($link), '5.7', '<')) { + $query = sprintf("SET PASSWORD FOR '%s'@'%s' = '%s'", + $link->escape_string($database_user), + $db_host, + $link->escape_string($database_password)); + if(!$link->query($query)) $success = false; + } + // mysql >= 5.7 + else { + $query = sprintf("ALTER USER IF EXISTS '%s'@'%s' IDENTIFIED WITH mysql_native_password AS '%s'", + $link->escape_string($database_user), + $db_host, + $link->escape_string($database_password)); + if(!$link->query($query)) $success = false; + } + + $app->log("PASSWORD SET FOR '".$link->escape_string($database_user)."'@'$db_host' success? " . ($success ? 'yes' : 'no'), LOGLEVEL_DEBUG); + + if($success == true){ + $link->query("FLUSH PRIVILEGES"); + } + + // Set the grant + if(!$link->query("GRANT " . $grants . " ON `".$database_name."`.* TO '".$link->escape_string($database_user)."'@'$db_host'")) $success = false; + $app->log("GRANT " . $grants . " ON `".$database_name."`.* TO '".$link->escape_string($database_user)."'@'$db_host' success? " . ($success ? 'yes' : 'no'), LOGLEVEL_DEBUG); + + } elseif($action == 'REVOKE') { + if(!$link->query("REVOKE ALL PRIVILEGES ON `".$database_name."`.* FROM '".$link->escape_string($database_user)."'@'$db_host'")) $success = false; } elseif($action == 'DROP') { if(!$link->query("DROP USER '".$link->escape_string($database_user)."'@'$db_host'")) $success = false; } elseif($action == 'RENAME') { @@ -161,10 +187,21 @@ class mysql_clientdb_plugin { //if(!$link->query("SET PASSWORD FOR '".$link->escape_string($database_user)."'@'$db_host' = '".$link->escape_string($database_password)."'")) $success = false; // SET PASSWORD for already hashed passwords is not supported by latest MySQL 5.7 anymore, so we have to set the hashed password directly if(trim($database_password) != '') { - // MySQL < 5.7 and MariadB 10 - if(!$link->query("UPDATE mysql.user SET `Password` = '".$link->escape_string($database_password)."' WHERE `Host` = '".$db_host."' AND `User` = '".$link->escape_string($database_user)."'")) { - // MySQL 5.7, the Password field has been renamed to authentication_string - if(!$link->query("UPDATE mysql.user SET `authentication_string` = '".$link->escape_string($database_password)."' WHERE `Host` = '".$db_host."' AND `User` = '".$link->escape_string($database_user)."'")) $success = false; + // mariadb or mysql < 5.7 + if($this->getDatabaseType($link) == 'mariadb' || version_compare($this->getDatabaseVersion($link), '5.7', '<')) { + $query = sprintf("SET PASSWORD FOR '%s'@'%s' = '%s'", + $link->escape_string($database_user), + $db_host, + $link->escape_string($database_password)); + if(!$link->query($query)) $success = false; + } + // mysql >= 5.7 + else { + $query = sprintf("ALTER USER IF EXISTS '%s'@'%s' IDENTIFIED WITH mysql_native_password AS '%s'", + $link->escape_string($database_user), + $db_host, + $link->escape_string($database_password)); + if(!$link->query($query)) $success = false; } if($success == true) $link->query("FLUSH PRIVILEGES"); } @@ -224,6 +261,7 @@ class mysql_clientdb_plugin { return; } + mysqli_report(MYSQLI_REPORT_OFF); //* Connect to the database $link = new mysqli($clientdb_host, $clientdb_user, $clientdb_password); if ($link->connect_error) { @@ -287,13 +325,14 @@ class mysql_clientdb_plugin { return; } + mysqli_report(MYSQLI_REPORT_OFF); //* Connect to the database $link = new mysqli($clientdb_host, $clientdb_user, $clientdb_password); if ($link->connect_error) { $app->log('Unable to connect to the database: '.$link->connect_error, LOGLEVEL_ERROR); return; } - + // check if the database exists if($data['new']['database_name'] == $data['old']['database_name']) { $result = $link->query("SHOW DATABASES LIKE '".$link->escape_string($data['new']['database_name'])."'"); @@ -527,7 +566,7 @@ class mysql_clientdb_plugin { //* Remote access option has changed. if($data['new']['remote_access'] != $data['old']['remote_access']) { - //* set new priveliges + //* set new privileges if($data['new']['remote_access'] == 'y') { if($db_user) { if($db_user['database_user'] == 'root'){ @@ -617,6 +656,7 @@ class mysql_clientdb_plugin { return; } + mysqli_report(MYSQLI_REPORT_OFF); //* Connect to the database $link = new mysqli($clientdb_host, $clientdb_user, $clientdb_password); if ($link->connect_error) { @@ -672,6 +712,7 @@ class mysql_clientdb_plugin { return; } + mysqli_report(MYSQLI_REPORT_OFF); //* Connect to the database $link = new mysqli($clientdb_host, $clientdb_user, $clientdb_password); if ($link->connect_error) { @@ -745,6 +786,7 @@ class mysql_clientdb_plugin { return; } + mysqli_report(MYSQLI_REPORT_OFF); //* Connect to the database $link = new mysqli($clientdb_host, $clientdb_user, $clientdb_password); if ($link->connect_error) { @@ -771,6 +813,43 @@ class mysql_clientdb_plugin { $link->close(); } + + + + function getDatabaseType($link) { + $result = $link->query('SELECT VERSION() as version'); + if($result) { + $tmp = $result->fetch_assoc(); + $result->free(); + + if(stristr($tmp['version'],'mariadb')) { + return 'mariadb'; + } else { + return 'mysql'; + } + } else { + return false; + } + } + + function getDatabaseVersion($link, $major_version_only = false) { + $result = $link->query('SELECT VERSION() as version'); + if($result) { + $tmp = $result->fetch_assoc(); + $result->free(); + + $version = explode('-', $tmp['version']); + if($major_version_only == true) { + $version_parts = explode('.', $version[0]); + return $version_parts[0]; + } else { + return $version[0]; + } + } else { + return false; + } + } + } // end class -?> +?> \ No newline at end of file diff --git a/server/plugins-available/network_settings_plugin.inc.php b/server/plugins-available/network_settings_plugin.inc.php index 1ed12f3a1c5a87bcc792f64274a332e6dd08b14f..6a34cc20d7ac4fb08f4bbd6e09f9f58fef4fbef5 100644 --- a/server/plugins-available/network_settings_plugin.inc.php +++ b/server/plugins-available/network_settings_plugin.inc.php @@ -249,55 +249,55 @@ class network_settings_plugin { $app->log('Network configuration disabled in server settings.', LOGLEVEL_DEBUG); } } - + //* Configure hostname - if($event_name == 'server_update' && $data['mirrored'] == false) { - + if($event_name == 'server_update' && $conf['mirror_server_id'] == 0) { + //* get old server config $tmp = $app->ini_parser->parse_ini_string(stripslashes($data['old']['config'])); $old_server_config = $tmp['server']; unset($tmp); - + $new_hostname = trim($server_config['hostname']); $old_hostname = trim($old_server_config['hostname']); - + if($new_hostname != '' && $old_hostname != $new_hostname) { - + if(is_file('/etc/hostname')) { $app->system->file_put_contents('/etc/hostname',$new_hostname); $app->log('Changed /etc/hostname to '.$new_hostname, LOGLEVEL_DEBUG); } - + if(is_file('/etc/mailname')) { $app->system->file_put_contents('/etc/mailname',$new_hostname); $app->log('Changed /etc/mailname to '.$new_hostname, LOGLEVEL_DEBUG); } - + $postconf_commands = array( 'myhostname = '.$new_hostname, 'mydestination = '.$new_hostname.', localhost, localhost.localdomain' ); - + //* Executing the postconf commands foreach($postconf_commands as $cmd) { $command = "postconf -e ?"; $app->system->exec_safe($command, $cmd); } - + $app->log('Changed changed myhostname and mydestination in postfix main.cf to '.$new_hostname, LOGLEVEL_DEBUG); - + //* change /etc/hosts $hosts = file_get_contents('/etc/hosts'); $hosts = str_replace($old_hostname,$new_hostname,$hosts); $app->system->file_put_contents('/etc/hosts',$hosts); - + exec($app->system->getinitcommand('postfix', 'restart').' 2>&1'); exec($app->system->getinitcommand('networking', 'restart').' 2>&1'); - + } - + } - + } diff --git a/server/plugins-available/nginx_plugin.inc.php b/server/plugins-available/nginx_plugin.inc.php index a8a3c3bf16be22f3e737ef8bfb6adf9ef32d2572..dd0ad5892146ccd414f5746117240e53adb3576a 100644 --- a/server/plugins-available/nginx_plugin.inc.php +++ b/server/plugins-available/nginx_plugin.inc.php @@ -37,6 +37,8 @@ class nginx_plugin { var $action = ''; var $ssl_certificate_changed = false; var $update_letsencrypt = false; + var $website = null; + var $jailkit_config = null; //* This function is called during ispconfig installation to determine // if a symlink shall be created for this plugin. @@ -110,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'; @@ -124,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 @@ -166,48 +157,50 @@ class nginx_plugin { [ req_attributes ] ";//challengePassword = A challenge password"; + $ext_cnf = " + subjectAltName = @alt_names + + [alt_names] + DNS.1 = .$domain"; + $ssl_cnf_file = $ssl_dir.'/openssl.conf'; $app->system->file_put_contents($ssl_cnf_file, $ssl_cnf); + $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 ?", $openssl_cmd_crt_file, $web_config['CA_path']."/openssl.cnf", $web_config['CA_pass'], $openssl_cmd_csr_file); + $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", 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); + @$app->system->unlink($ssl_ext_file); $ssl_request = $app->system->file_get_contents($csr_file); $ssl_cert = $app->system->file_get_contents($crt_file); $ssl_key = $app->system->file_get_contents($key_file); @@ -218,15 +211,15 @@ class nginx_plugin { $app->dbmaster->query("UPDATE web_domain SET ssl_request = ?, ssl_cert = ?, ssl_key = ? WHERE domain = ?", $ssl_request, $ssl_cert, $ssl_key, $data['new']['domain']); $app->dbmaster->query("UPDATE web_domain SET ssl_action = '' WHERE domain = ?", $data['new']['domain']); } - + //* Check that the SSL key is not password protected if($data["new"]["ssl_action"] == 'save') { if(stristr($data["new"]["ssl_key"],'Proc-Type: 4,ENCRYPTED')) { $data["new"]["ssl_action"] = ''; - + $app->log('SSL Certificate not saved. The SSL key is encrypted.', LOGLEVEL_WARN); $app->dbmaster->datalogError('SSL Certificate not saved. The SSL key is encrypted.'); - + /* Update the DB of the (local) Server */ $app->db->query("UPDATE web_domain SET ssl_action = '' WHERE domain = ?", $data['new']['domain']); @@ -234,7 +227,7 @@ class nginx_plugin { $app->dbmaster->query("UPDATE web_domain SET ssl_action = '' WHERE domain = ?", $data['new']['domain']); } } - + //* and check that SSL cert does not contain subdomain of domain acme.invalid if($data["new"]["ssl_action"] == 'save') { $tmp = array(); @@ -244,10 +237,10 @@ class nginx_plugin { $crt_data = implode("\n",$tmp); if(stristr($crt_data,'.acme.invalid')) { $data["new"]["ssl_action"] = ''; - + $app->log('SSL Certificate not saved. The SSL cert contains domain acme.invalid.', LOGLEVEL_WARN); $app->dbmaster->datalogError('SSL Certificate not saved. The SSL cert contains domain acme.invalid.'); - + /* Update the DB of the (local) Server */ $app->db->query("UPDATE web_domain SET ssl_action = '' WHERE domain = ?", $data['new']['domain']); @@ -265,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.'~'); @@ -368,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); @@ -382,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']) == '') { @@ -400,7 +390,7 @@ class nginx_plugin { if(substr($data['new']['web_folder'],-1) == '/') $data['new']['web_folder'] = substr($data['new']['web_folder'],0,-1); } $web_folder .= '/'.$data['new']['web_folder']; - + if($data['old']['web_folder'] != ''){ if(substr($data['old']['web_folder'],0,1) == '/') $data['old']['web_folder'] = substr($data['old']['web_folder'],1); if(substr($data['old']['web_folder'],-1) == '/') $data['old']['web_folder'] = substr($data['old']['web_folder'],0,-1); @@ -415,7 +405,12 @@ class nginx_plugin { $web_folder = $data['new']['web_folder']; $log_folder .= '/' . $subdomain_host; unset($tmp); - + + if($app->system->is_blacklisted_web_path($web_folder)) { + $app->log('Vhost ' . $subdomain_host . ' is using a blacklisted web folder: ' . $web_folder, LOGLEVEL_ERROR); + return 0; + } + if(isset($data['old']['parent_domain_id'])) { // old one $tmp = $app->db->queryOneRecord('SELECT `domain` FROM web_domain WHERE domain_id = ?', $data['old']['parent_domain_id']); @@ -484,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); @@ -492,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']); @@ -508,15 +506,13 @@ class nginx_plugin { $app->system->rename($data['new']['document_root'], $data['new']['document_root'].'_bak_'.date('Y_m_d_H_i_s')); $app->log('Renaming existing directory in new docroot location. mv '.$data['new']['document_root'].' '.$data['new']['document_root'].'_bak_'.date('Y_m_d_H_i_s'), LOGLEVEL_DEBUG); } - + //* Unmount the old log directory bfore we move the log dir $app->system->exec_safe('umount ?', $old_dir.'/log'); //* 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 @@ -536,17 +532,8 @@ 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') { $fstab_line = '/var/log/ispconfig/httpd/'.$data['new']['domain'].' '.$data['new']['document_root'].'/'.$log_folder.' none bind,nofail,_netdev 0 0'; $app->system->replaceLine('/etc/fstab', $fstab_line_old, $fstab_line, 0, 1); @@ -554,30 +541,35 @@ class nginx_plugin { $fstab_line = '/var/log/ispconfig/httpd/'.$data['new']['domain'].' '.$data['new']['document_root'].'/'.$log_folder.' none bind,nofail 0 0'; $app->system->replaceLine('/etc/fstab', $fstab_line_old, $fstab_line, 0, 1); } - + $app->system->exec_safe('mount --bind ? ?', '/var/log/ispconfig/httpd/'.$data['new']['domain'], $data['new']['document_root'].'/'.$log_folder); } - //print_r($data); - // Check if the directories are there and create them if necessary. $app->system->web_folder_protection($data['new']['document_root'], false); - if(!is_dir($data['new']['document_root'].'/' . $web_folder)) $app->system->mkdirpath($data['new']['document_root'].'/' . $web_folder); + if(!is_dir($data['new']['document_root'].'/' . $web_folder)) { + if($web_folder !== 'web') { //vhost sub/alias + $app->system->mkdirpath($data['new']['document_root'].'/' . $web_folder, 0755, $username, $groupname); + } else { + $app->system->mkdirpath($data['new']['document_root'].'/' . $web_folder); + } + } if(!is_dir($data['new']['document_root'].'/' . $web_folder . '/error') and $data['new']['errordocs']) $app->system->mkdirpath($data['new']['document_root'].'/' . $web_folder . '/error'); if($data['new']['stats_type'] != '' && !is_dir($data['new']['document_root'].'/' . $web_folder . '/stats')) $app->system->mkdirpath($data['new']['document_root'].'/' . $web_folder . '/stats'); 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'); $app->system->chmod($data['new']['document_root'].'/.ssh', 0700); $app->system->chown($data['new']['document_root'].'/.ssh', $username); $app->system->chgrp($data['new']['document_root'].'/.ssh', $groupname); } - + //* Create the new private directory if(!is_dir($data['new']['document_root'].'/private')) { $app->system->mkdirpath($data['new']['document_root'].'/private'); @@ -587,6 +579,88 @@ class nginx_plugin { } + // load jailkit server config + $jailkit_config = $app->getconf->get_server_config($conf['server_id'], 'jailkit'); + + // website overrides + if (isset($data['new']['jailkit_chroot_app_sections']) && $data['new']['jailkit_chroot_app_sections'] != '' ) { + $jailkit_config['jailkit_chroot_app_sections'] = $data['new']['jailkit_chroot_app_sections']; + } + if (isset($data['new']['jailkit_chroot_app_programs']) && $data['new']['jailkit_chroot_app_programs'] != '' ) { + $jailkit_config['jailkit_chroot_app_programs'] = $data['new']['jailkit_chroot_app_programs']; + } + + $last_updated = preg_split('/[\s,]+/', $jailkit_config['jailkit_chroot_app_sections'] + .' '.$jailkit_config['jailkit_chroot_app_programs'] + .' '.$jailkit_config['jailkit_chroot_cron_programs']); + $last_updated = array_unique($last_updated, SORT_REGULAR); + sort($last_updated, SORT_STRING); + $update_hash = hash('md5', implode(' ', $last_updated)); + $check_for_jailkit_updates=false; + + $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; + $this->_setup_jailkit_chroot(); + $this->_add_jailkit_user(); + // else delete if unused + } elseif (($data['new']['delete_unused_jailkit'] == 'y' && $data['new']['php_fpm_chroot'] != 'y') || + ($data['new']['delete_unused_jailkit'] == 'y' && $data['new']['php'] == 'no')) { + $check_for_jailkit_updates=false; + $this->_delete_jailkit_if_unused($data['new']['domain_id']); + if(is_dir($data['new']['document_root'].'/etc/jailkit')) { + $check_for_jailkit_updates=true; + } + // else update if needed + } elseif ($data['new']['delete_unused_jailkit'] != 'y') { + $check_for_jailkit_updates=true; + } + + // If jail exists (and wasn't deleted), we may need to update it + if($check_for_jailkit_updates && + ( ($data['old']['jailkit_chroot_app_sections'] != $data['new']['jailkit_chroot_app_sections']) || + ($data['old']['jailkit_chroot_app_programs'] != $data['new']['jailkit_chroot_app_programs']) ) ) + { + + if (isset($jailkit_config['jailkit_hardlinks'])) { + if ($jailkit_config['jailkit_hardlinks'] == 'yes') { + $options = array('hardlink'); + } elseif ($jailkit_config['jailkit_hardlinks'] == 'no') { + $options = array(); + } + } else { + $options = array('allow_hardlink'); + } + + $options[] = 'force'; + + $sections = $jailkit_config['jailkit_chroot_app_sections']; + $programs = $jailkit_config['jailkit_chroot_app_programs'] . ' ' + . $jailkit_config['jailkit_chroot_cron_programs']; + + $records = $app->db->queryAllRecords('SELECT web_folder FROM `web_domain` WHERE `parent_domain_id` = ? AND `document_root` = ? AND web_folder != \'\' AND web_folder IS NOT NULL AND `server_id` = ?', $data['new']['domain_id'], $data['new']['document_root'], $conf['server_id']); + foreach ($records as $record) { + $options[] = 'skip='.$record['web_folder']; + } + + // don't update if last_jailkit_hash is the same + $tmp = $app->db->queryOneRecord('SELECT `last_jailkit_hash` FROM web_domain WHERE domain_id = ?', $data['new']['parent_domain_id']); + if ($update_hash != $tmp['last_jailkit_hash']) { + $app->system->update_jailkit_chroot($data['new']['document_root'], $sections, $programs, $options); + + // this gets last_jailkit_update out of sync with master db, but that is ok, + // as it is only used as a timestamp to moderate the frequency of updating on the slaves + $app->db->query("UPDATE `web_domain` SET `last_jailkit_update` = NOW(), `last_jailkit_hash` = ? WHERE `document_root` = ?", $update_hash, $data['new']['document_root']); + } + unset($tmp); + } + // Remove the symlink for the site, if site is renamed if($this->action == 'update' && $data['old']['domain'] != '' && $data['new']['domain'] != $data['old']['domain']) { if(is_dir('/var/log/ispconfig/httpd/'.$data['old']['domain'])) $app->system->exec_safe('rm -rf ?', '/var/log/ispconfig/httpd/'.$data['old']['domain']); @@ -610,7 +684,7 @@ class nginx_plugin { $app->system->chmod($data['new']['document_root'].'/'.$log_folder, 0755); $app->system->exec_safe('mount --bind ? ?', '/var/log/ispconfig/httpd/'.$data['new']['domain'], $data['new']['document_root'].'/'.$log_folder); //* add mountpoint to fstab - $fstab_line = '/var/log/ispconfig/httpd/'.$data['new']['domain'].' '.$data['new']['document_root'].'/'.$log_folder.' none bind,nobootwait'; + $fstab_line = '/var/log/ispconfig/httpd/'.$data['new']['domain'].' '.$data['new']['document_root'].'/'.$log_folder.' none bind,nofail'; $fstab_line .= @($web_config['network_filesystem'] == 'y')?',_netdev 0 0':' 0 0'; $app->system->replaceLine('/etc/fstab', $fstab_line, $fstab_line, 1, 1); } @@ -631,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); @@ -691,11 +765,13 @@ class nginx_plugin { } $app->system->exec_safe('chmod -R a+r ?', $error_page_path); } - - //* Copy the web skeleton files only when there is no index.ph or index.html file yet - if(!file_exists($data['new']['document_root'].'/'.$web_folder.'/index.html') && !file_exists($data['new']['document_root'].'/'.$web_folder.'/index.php')) { + + //* Copy the web skeleton files only when there is no index.php, standard_index.html or index.html file yet + if(!file_exists($data['new']['document_root'].'/'.$web_folder.'/index.html') && !file_exists($data['new']['document_root'].'/'.$web_folder.'/index.php') && !file_exists($data['new']['document_root'].'/'.$web_folder.'/standard_index.html')) { if (file_exists($conf['rootpath'] . '/conf-custom/index/standard_index.html_'.substr($conf['language'], 0, 2))) { - if(!file_exists($data['new']['document_root'].'/' . $web_folder . '/index.html')) $app->system->exec_safe('cp ? ?', $conf['rootpath'] . '/conf-custom/index/standard_index.html_'.substr($conf['language'], 0, 2), $data['new']['document_root'].'/' . $web_folder . '/index.html'); + if(!file_exists($data['new']['document_root'] . '/' . $web_folder . '/standard_index.html')) { + $app->system->exec_safe('cp ? ?', $conf['rootpath'] . '/conf-custom/index/standard_index.html_' . substr($conf['language'], 0, 2), $data['new']['document_root'] . '/' . $web_folder . '/standard_index.html'); + } if(is_file($conf['rootpath'] . '/conf-custom/index/favicon.ico')) { if(!file_exists($data['new']['document_root'].'/' . $web_folder . '/favicon.ico')) $app->system->exec_safe('cp ? ?', $conf['rootpath'] . '/conf-custom/index/favicon.ico', $data['new']['document_root'].'/' . $web_folder . '/'); @@ -705,19 +781,23 @@ class nginx_plugin { } } else { if (file_exists($conf['rootpath'] . '/conf-custom/index/standard_index.html')) { - if(!file_exists($data['new']['document_root'].'/' . $web_folder . '/index.html')) $app->system->exec_safe('cp ? ?', $conf['rootpath'] . '/conf-custom/index/standard_index.html', $data['new']['document_root'].'/' . $web_folder . '/index.html'); + if(!file_exists($data['new']['document_root'].'/' . $web_folder . '/standard_index.html')) $app->system->exec_safe('cp ? ?', $conf['rootpath'] . '/conf-custom/index/standard_index.html', $data['new']['document_root'].'/' . $web_folder . '/standard_index.html'); } else { - if(!file_exists($data['new']['document_root'].'/' . $web_folder . '/index.html')) $app->system->exec_safe('cp ? ?', $conf['rootpath'] . '/conf/index/standard_index.html_'.substr($conf['language'], 0, 2), $data['new']['document_root'].'/' . $web_folder . '/index.html'); - if(is_file($conf['rootpath'] . '/conf/index/favicon.ico')){ + if(!file_exists($data['new']['document_root'].'/' . $web_folder . '/standard_index.html')) $app->system->exec_safe('cp ? ?', $conf['rootpath'] . '/conf/index/standard_index.html_'.substr($conf['language'], 0, 2), $data['new']['document_root'].'/' . $web_folder . '/standard_index.html'); + if(is_file($conf['rootpath'] . '/conf/index/favicon.ico')) { if(!file_exists($data['new']['document_root'].'/' . $web_folder . '/favicon.ico')) $app->system->exec_safe('cp ? ?', $conf['rootpath'] . '/conf/index/favicon.ico', $data['new']['document_root'].'/' . $web_folder . '/'); } - if(is_file($conf['rootpath'] . '/conf/index/robots.txt')){ + if(is_file($conf['rootpath'] . '/conf/index/robots.txt')) { if(!file_exists($data['new']['document_root'].'/' . $web_folder . '/robots.txt')) $app->system->exec_safe('cp ? ?', $conf['rootpath'] . '/conf/index/robots.txt', $data['new']['document_root'].'/' . $web_folder . '/'); } } } } - $app->system->exec_safe('chmod -R a+r ?', $data['new']['document_root'].'/' . $web_folder . '/'); + // Set the a+r mod to the web_folder. + // Skip this for types where the target vhost already exists if the web_folder is "web". In this case, everything is setup already from the vhost setup + if ( ( $data['new']['type'] != 'vhostalias' && $data['new']['type'] != 'vhostsubdomain' ) || $web_folder != 'web') { + $app->system->exec_safe('chmod -R a+r ?', $data['new']['document_root'].'/' . $web_folder . '/'); + } //** Copy the error documents on update when the error document checkbox has been activated and was deactivated before } elseif ($this->action == 'update' && ($data['new']['type'] == 'vhost' || $data['new']['type'] == 'vhostsubdomain' || $data['new']['type'] == 'vhostalias') && $data['old']['errordocs'] == 0 && $data['new']['errordocs'] == 1) { @@ -772,7 +852,10 @@ class nginx_plugin { if($this->action == 'insert' || $data["new"]["system_user"] != $data["old"]["system_user"]) { // Chown and chmod the directories below the document root - $app->system->exec_safe('chown -R ?:? ?', $username, $groupname, $data['new']['document_root'].'/' . $web_folder); + // Skip this for types where the target vhost already exists if the web_folder is "web". In this case, everything is setup already from the vhost setup + if ( ( $data['new']['type'] != 'vhostalias' && $data['new']['type'] != 'vhostsubdomain' ) || $web_folder != 'web') { + $app->system->exec_safe( 'chown -R ?:? ?', $username, $groupname, $data['new']['document_root'] . '/' . $web_folder ); + } // The document root itself has to be owned by root in normal level and by the web owner in security level 20 if($web_config['security_level'] == 20) { $app->system->exec_safe('chown ?:? ?', $username, $groupname, $data['new']['document_root'].'/' . $web_folder); @@ -853,7 +936,7 @@ class nginx_plugin { //$app->system->chgrp($data['new']['document_root'].'/webdav',$groupname); $app->system->chown($data['new']['document_root'].'/private', $username); $app->system->chgrp($data['new']['document_root'].'/private', $groupname); - + if($web_folder != 'web'){ $app->system->chown($data['new']['document_root'].'/'.$web_folder, $username); $app->system->chgrp($data['new']['document_root'].'/'.$web_folder, $groupname); @@ -900,7 +983,7 @@ class nginx_plugin { } //$app->system->chown($data['new']['document_root'].'/webdav',$username); //$app->system->chgrp($data['new']['document_root'].'/webdav',$groupname); - + if($web_folder != 'web'){ $app->system->chown($data['new']['document_root'].'/'.$web_folder, $username); $app->system->chgrp($data['new']['document_root'].'/'.$web_folder, $groupname); @@ -941,7 +1024,7 @@ class nginx_plugin { $app->system->chown('/var/log/ispconfig/httpd/'.$data['new']['domain'].'/error.log', 'root'); $app->system->chgrp('/var/log/ispconfig/httpd/'.$data['new']['domain'].'/error.log', 'root'); } - + //* Create the vhost config file $app->load('tpl'); @@ -985,32 +1068,31 @@ class nginx_plugin { } if($data['new']['ip_address'] == '*' && $data['new']['ipv6_address'] == '') $tpl->setVar('ipv6_wildcard', 1); - // PHP-FPM - // Support for multiple PHP versions - /* - if(trim($data['new']['fastcgi_php_version']) != ''){ - $default_php_fpm = false; - list($custom_php_fpm_name, $custom_php_fpm_init_script, $custom_php_fpm_ini_dir, $custom_php_fpm_pool_dir) = explode(':', trim($data['new']['fastcgi_php_version'])); - if(substr($custom_php_fpm_ini_dir,-1) != '/') $custom_php_fpm_ini_dir .= '/'; - } else { - $default_php_fpm = true; - } - */ + $default_php_fpm = true; + if($data['new']['php'] == 'php-fpm' || $data['new']['php'] == 'hhvm'){ - if(trim($data['new']['fastcgi_php_version']) != ''){ - $default_php_fpm = false; - list($custom_php_fpm_name, $custom_php_fpm_init_script, $custom_php_fpm_ini_dir, $custom_php_fpm_pool_dir) = explode(':', trim($data['new']['fastcgi_php_version'])); - if(substr($custom_php_fpm_ini_dir, -1) != '/') $custom_php_fpm_ini_dir .= '/'; - } else { - $default_php_fpm = true; + if($data['new']['server_php_id'] != 0){ + $tmp_php = $app->db->queryOneRecord('SELECT * FROM server_php WHERE server_php_id = ?', $data['new']['server_php_id']); + if($tmp_php) { + $default_php_fpm = false; + $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['php_fpm_socket_dir']; + if(substr($custom_php_fpm_ini_dir, -1) != '/') $custom_php_fpm_ini_dir .= '/'; + } } } else { - if(trim($data['old']['fastcgi_php_version']) != '' && $data['old']['php'] != 'no'){ - $default_php_fpm = false; - list($custom_php_fpm_name, $custom_php_fpm_init_script, $custom_php_fpm_ini_dir, $custom_php_fpm_pool_dir) = explode(':', trim($data['old']['fastcgi_php_version'])); - if(substr($custom_php_fpm_ini_dir, -1) != '/') $custom_php_fpm_ini_dir .= '/'; - } else { - $default_php_fpm = true; + if($data['old']['server_php_id'] != 0 && $data['old']['php'] != 'no'){ + $tmp_php = $app->db->queryOneRecord('SELECT * FROM server_php WHERE server_php_id = ?', $data['old']['server_php_id']); + if($tmp_php) { + $default_php_fpm = false; + $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['php_fpm_socket_dir']; + if(substr($custom_php_fpm_ini_dir, -1) != '/') $custom_php_fpm_ini_dir .= '/'; + } } } @@ -1022,7 +1104,12 @@ class nginx_plugin { $pool_dir = trim($pool_dir); if(substr($pool_dir, -1) != '/') $pool_dir .= '/'; $pool_name = 'web'.$data['new']['domain_id']; - $socket_dir = $web_config['php_fpm_socket_dir']; + + if (!$default_php_fpm && !empty($custom_php_fpm_socket_dir)) { + $socket_dir = $custom_php_fpm_socket_dir; + } else { + $socket_dir = $web_config['php_fpm_socket_dir']; + } if(substr($socket_dir, -1) != '/') $socket_dir .= '/'; if($data['new']['php_fpm_use_socket'] == 'y'){ @@ -1185,31 +1272,34 @@ class nginx_plugin { $nginx_directives = $data['new']['nginx_directives']; // $vhost_data['enable_pagespeed'] = false; } - + if(!$nginx_directives) { + $nginx_directives = ''; // ensure it is not null + } + // folder_directive_snippets if(trim($data['new']['folder_directive_snippets']) != ''){ $data['new']['folder_directive_snippets'] = trim($data['new']['folder_directive_snippets']); $data['new']['folder_directive_snippets'] = str_replace("\r\n", "\n", $data['new']['folder_directive_snippets']); $data['new']['folder_directive_snippets'] = str_replace("\r", "\n", $data['new']['folder_directive_snippets']); $folder_directive_snippets_lines = explode("\n", $data['new']['folder_directive_snippets']); - + if(is_array($folder_directive_snippets_lines) && !empty($folder_directive_snippets_lines)){ foreach($folder_directive_snippets_lines as $folder_directive_snippets_line){ list($folder_directive_snippets_folder, $folder_directive_snippets_snippets_id) = explode(':', $folder_directive_snippets_line); - + $folder_directive_snippets_folder = trim($folder_directive_snippets_folder); $folder_directive_snippets_snippets_id = trim($folder_directive_snippets_snippets_id); - + if($folder_directive_snippets_folder != '' && intval($folder_directive_snippets_snippets_id) > 0 && preg_match('@^((?!(.*\.\.)|(.*\./)|(.*//))[^/][\w/_\.\-]{1,100})?$@', $folder_directive_snippets_folder)){ if(substr($folder_directive_snippets_folder, -1) != '/') $folder_directive_snippets_folder .= '/'; if(substr($folder_directive_snippets_folder, 0, 1) == '/') $folder_directive_snippets_folder = substr($folder_directive_snippets_folder, 1); - + $master_snippet = $app->db->queryOneRecord("SELECT * FROM directive_snippets WHERE directive_snippets_id = ? AND type = 'nginx' AND active = 'y' AND customer_viewable = 'y'", intval($folder_directive_snippets_snippets_id)); if(isset($master_snippet['snippet'])){ $folder_directive_snippets_trans = array('{FOLDER}' => $folder_directive_snippets_folder, '{FOLDERMD5}' => md5($folder_directive_snippets_folder)); $master_snippet['snippet'] = strtr($master_snippet['snippet'], $folder_directive_snippets_trans); $nginx_directives .= "\n\n".$master_snippet['snippet']; - + // create folder it it does not exist if(!is_dir($data['new']['document_root'].'/' . $web_folder.$folder_directive_snippets_folder)){ $app->system->mkdirpath($data['new']['document_root'].'/' . $web_folder.$folder_directive_snippets_folder); @@ -1221,7 +1311,7 @@ class nginx_plugin { } } } - + // use vLib for template logic if(trim($nginx_directives) != '') { $nginx_directives_new = ''; @@ -1238,7 +1328,7 @@ class nginx_plugin { if($nginx_directives_new != '') $nginx_directives = $nginx_directives_new; unset($nginx_directives_new); } - + // Make sure we only have Unix linebreaks $nginx_directives = str_replace("\r\n", "\n", $nginx_directives); $nginx_directives = str_replace("\r", "\n", $nginx_directives); @@ -1247,6 +1337,7 @@ class nginx_plugin { $trans = array( '{DOCROOT}' => $vhost_data['web_document_root_www'], '{DOCROOT_CLIENT}' => $vhost_data['web_document_root'], + '{DOMAIN}' => $vhost_data['domain'], '{FASTCGIPASS}' => 'fastcgi_pass '.($data['new']['php_fpm_use_socket'] == 'y'? 'unix:'.$fpm_socket : '127.0.0.1:'.$vhost_data['fpm_port']).';' ); foreach($nginx_directive_lines as $nginx_directive_line){ @@ -1260,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']; @@ -1382,7 +1472,7 @@ class nginx_plugin { } } else { // external URL - $rewrite_exclude = '(.?)/'; + $rewrite_exclude = '(?!/(\.well-known/acme-challenge))/'; if($data['new']['redirect_type'] == 'proxy'){ $vhost_data['use_proxy'] = 'y'; $rewrite_subdir = $tmp_redirect_path_parts['path']; @@ -1434,7 +1524,7 @@ class nginx_plugin { } } else { // external URL - $rewrite_exclude = '(.?)/'; + $rewrite_exclude = '(?!/(\.well-known/acme-challenge))/'; if($data['new']['redirect_type'] == 'proxy'){ $vhost_data['use_proxy'] = 'y'; $rewrite_subdir = $tmp_redirect_path_parts['path']; @@ -1484,7 +1574,7 @@ class nginx_plugin { } } else { // external URL - $rewrite_exclude = '(.?)/'; + $rewrite_exclude = '(?!/(\.well-known/acme-challenge))/'; if($data['new']['redirect_type'] == 'proxy'){ $vhost_data['use_proxy'] = 'y'; $rewrite_subdir = $tmp_redirect_path_parts['path']; @@ -1507,22 +1597,33 @@ class nginx_plugin { 'use_proxy' => ($data['new']['redirect_type'] == 'proxy' ? true:false)); } } - - // http2 or spdy? - $vhost_data['enable_http2'] = 'n'; - if($vhost_data['enable_spdy'] == 'y'){ - // check if nginx support http_v2; if so, use that instead of spdy - exec("2>&1 nginx -V | tr -- - '\n' | grep http_v2_module", $tmp_output, $tmp_retval); - if($tmp_retval == 0){ - $vhost_data['enable_http2'] = 'y'; - $vhost_data['enable_spdy'] = 'n'; - } - unset($tmp_output, $tmp_retval); + + //proxy protocol settings + if($web_config['vhost_proxy_protocol_enabled'] == "y"){ + if((int)$web_config['vhost_proxy_protocol_https_port'] > 0) { + $vhost_data['use_proxy_protocol'] = $data['new']['proxy_protocol']; + $vhost_data['proxy_protocol_http'] = (int)$web_config['vhost_proxy_protocol_http_port']; + $vhost_data['proxy_protocol_https'] = (int)$web_config['vhost_proxy_protocol_https_port']; + } else { + $vhost_data['use_proxy_protocol'] = "n"; + } + }else{ + $vhost_data['use_proxy_protocol'] = "n"; } - + // set logging variable $vhost_data['logging'] = $web_config['logging']; + // Provide TLS 1.3 support if Nginx version is >= 1.13.0 and when it was linked against OpenSSL(>=1.1.1) at build time and when it was linked against OpenSSL(>=1.1.1) at runtime. + $nginx_openssl_build_ver = $app->system->exec_safe('nginx -V 2>&1 | grep \'built with OpenSSL\' | sed \'s/.*built\([a-zA-Z ]*\)OpenSSL \([0-9.]*\).*/\2/\''); + $nginx_openssl_running_ver = $app->system->exec_safe('nginx -V 2>&1 | grep \'running with OpenSSL\' | sed \'s/.*running\([a-zA-Z ]*\)OpenSSL \([0-9.]*\).*/\2/\''); + if(version_compare($app->system->getnginxversion(true), '1.13.0', '>=') + && version_compare($nginx_openssl_build_ver, '1.1.1', '>=') + && (empty($nginx_openssl_running_ver) || version_compare($nginx_openssl_running_ver, '1.1.1', '>='))) { + $app->log('Enable TLS 1.3 for: '.$domain, LOGLEVEL_DEBUG); + $vhost_data['tls13_supported'] = "y"; + } + $tpl->setVar($vhost_data); $server_alias = array(); @@ -1798,7 +1899,7 @@ class nginx_plugin { } elseif($data['new']['type'] == 'vhostsubdomain' || $data['new']['type'] == 'vhostalias') { $stats_web_folder = $data['new']['web_folder']; } - + //* Create basic http auth for website statistics $tpl->setVar('stats_auth_passwd_file', $data['new']['document_root']."/" . $stats_web_folder . "/stats/.htpasswd_stats"); @@ -1882,6 +1983,26 @@ class nginx_plugin { $this->awstats_update($data, $web_config); } + //* Create GoAccess configuration + if($data['new']['stats_type'] == 'goaccess' && ($data['new']['type'] == 'vhost' || $data['new']['type'] == 'vhostsubdomain' || $data['new']['type'] == 'vhostalias')) { + $this->goaccess_update($data, $web_config); + } + + //* Remove the AWstats configuration file + if($data['old']['stats_type'] == 'awstats' && $data['new']['stats_type'] != 'awstats') { + $this->awstats_delete($data, $web_config); + } + + //* Remove the GoAccess configuration file + if($data['old']['stats_type'] == 'goaccess' && $data['new']['stats_type'] != 'goaccess') { + $this->goaccess_delete($data, $web_config); + } + + //* Remove the Webalizer configuration file + if($data['old']['stats_type'] == 'webalizer' && $data['new']['stats_type'] != 'webalizer') { + $this->webalizer_delete($data, $web_config); + } + //* Remove Stats-Folder when Statistics set to none if($data['new']['stats_type'] == '' && ($data['new']['type'] == 'vhost' || $data['new']['type'] == 'vhostsubdomain' || $data['new']['type'] == 'vhostalias')) { $app->file->removeDirectory($data['new']['document_root'].'/web/stats'); @@ -1932,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'; @@ -1943,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); @@ -1973,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.'~'); @@ -1995,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 { @@ -2059,9 +2173,9 @@ class nginx_plugin { } else { $app->system->exec_safe('umount ? 2>/dev/null', $data['old']['document_root'].'/'.$log_folder); } - + // remove letsencrypt if it exists (renew will always fail otherwise) - + $old_domain = $data['old']['domain']; if(substr($old_domain, 0, 2) === '*.') { // wildcard domain not yet supported by letsencrypt! @@ -2186,11 +2300,13 @@ class nginx_plugin { $fastcgi_starter_path = str_replace('[system_user]', $data['old']['system_user'], $web_config['fastcgi_starter_path']); if($data['old']['type'] == 'vhost') { if (is_dir($fastcgi_starter_path)) { + $app->system->set_immutable($fastcgi_starter_path, false, true); $app->system->exec_safe('rm -rf ?', $fastcgi_starter_path); } } else { $fcgi_starter_script = $fastcgi_starter_path.$web_config['fastcgi_starter_script'].'_web'.$data['old']['domain_id']; if (file_exists($fcgi_starter_script)) { + $app->system->set_immutable($fcgi_starter_script, false); $app->system->exec_safe('rm -f ?', $fcgi_starter_script); } } @@ -2212,11 +2328,13 @@ class nginx_plugin { $cgi_starter_path = str_replace('[system_user]', $data['old']['system_user'], $web_config['cgi_starter_path']); if($data['old']['type'] == 'vhost') { if (is_dir($cgi_starter_path)) { + $app->system->set_immutable($cgi_starter_path, false, true); $app->system->exec_safe('rm -rf ?', $cgi_starter_path); } } else { $cgi_starter_script = $cgi_starter_path.'php-cgi-starter_web'.$data['old']['domain_id']; if (file_exists($cgi_starter_script)) { + $app->system->set_immutable($cgi_starter_script, false); $app->system->exec_safe('rm -f ?', $cgi_starter_script); } } @@ -2504,6 +2622,101 @@ class nginx_plugin { //$app->services->restartServiceDelayed('httpd','reload'); } + + + //* Update the GoAccess configuration file + private function goaccess_update ($data, $web_config) { + global $app; + + $web_folder = $data['new']['web_folder']; + if($data['new']['type'] == 'vhost') $web_folder = 'web'; + + $goaccess_conf_locs = array('/etc/goaccess.conf', '/etc/goaccess/goaccess.conf'); + $count = 0; + + foreach($goaccess_conf_locs as $goa_loc) { + if(is_file($goa_loc) && (filesize($goa_loc) > 0)) { + $goaccess_conf_main = $goa_loc; + break; + } else { + $count++; + if($count == 2) { + $app->log("No GoAccess base config found. Make sure that GoAccess is installed and that the goaccess.conf does exist in /etc or /etc/goaccess", LOGLEVEL_WARN); + } + } + } + + if(!is_dir($data['new']['document_root'] . "/log/goaccess_db")) $app->system->mkdirpath($data['new']['document_root'] . "/log/goaccess_db"); + $goaccess_conf = $data['new']['document_root'].'/log/goaccess.conf'; + + /* + In case that you use a different log format, you should use a custom goaccess.conf which you'll have to put into /usr/local/ispconfig/server/conf-custom/. + By default the originaly with GoAccess shipped goaccess.conf from /etc/ will be used along with the log-format value COMBINED. + */ + + if(file_exists("/usr/local/ispconfig/server/conf-custom/goaccess.conf.master")) { + $app->system->copy("/usr/local/ispconfig/server/conf-custom/goaccess_index.php.master", $goaccess_conf); + + } elseif(!file_exists($goaccess_conf)) { + + /* + By default the goaccess.conf should get copied by the webserver plugin but in case it wasn't, or it got deleted by accident we gonna copy it again to the destination dir. + Also there was no /usr/local/ispconfig/server/conf-custom/goaccess.conf.master, so we gonna use /etc/goaccess.conf as the base conf. + */ + + $app->system->copy($goaccess_conf_main, $goaccess_conf); + $content = $app->system->file_get_contents($goaccess_conf, true); + $content = preg_replace('/^(#)?log-format COMBINED/m', "log-format COMBINED", $content); + $app->system->file_put_contents($goaccess_conf, $content, true); + unset($content); + + } + + if(file_exists($goaccess_conf)) { + $domain = $data['new']['domain']; + $content = $app->system->file_get_contents($goaccess_conf, true); + $content = preg_replace('/^(#)?html-report-title(.*)/m', "html-report-title $domain", $content); + $app->system->file_put_contents($goaccess_conf, $content, true); + unset($content); + + } + + if(is_file($goaccess_conf) && (filesize($goaccess_conf) > 0)) { + $app->log('Created GoAccess config file: '.$goaccess_conf, LOGLEVEL_DEBUG); + } + + if(is_file($data['new']['document_root']."/" . $web_folder . "/stats/index.html")) $app->system->unlink($data['new']['document_root']."/" . $web_folder . "/stats/index.html"); + if(file_exists("/usr/local/ispconfig/server/conf-custom/goaccess_index.php.master")) { + $app->system->copy("/usr/local/ispconfig/server/conf-custom/goaccess_index.php.master", $data['new']['document_root']."/" . $web_folder . "/stats/index.php"); + } else { + $app->system->copy("/usr/local/ispconfig/server/conf/goaccess_index.php.master", $data['new']['document_root']."/" . $web_folder . "/stats/index.php"); + } + } + + //* Delete the GoAccess configuration file + private function goaccess_delete ($data, $web_config) { + global $app; + + $goaccess_conf = $data['old']['document_root'] . "/log/goaccess.conf"; + + if ( @is_file($goaccess_conf) ) { + $app->system->unlink($goaccess_conf); + $app->log('Removed GoAccess config file: '.$goaccess_conf, LOGLEVEL_DEBUG); + } + } + + //* Delete the Webalizer configuration file + private function webalizer_delete ($data, $web_config) { + global $app; + + $webalizer_conf = $data['old']['document_root'] . "/log/webalizer.conf"; + + if ( @is_file($webalizer_conf) ) { + $app->system->unlink($webalizer_conf); + $app->log('Removed Webalizer config file: '.$webalizer_conf, LOGLEVEL_DEBUG); + } + } + //* Update the awstats configuration file private function awstats_update ($data, $web_config) { global $app; @@ -2559,7 +2772,7 @@ class nginx_plugin { private function hhvm_update($data, $web_config) { global $app, $conf; - + if(file_exists($conf['rootpath'] . '/conf-custom/hhvm_starter.master')) { $content = file_get_contents($conf['rootpath'] . '/conf-custom/hhvm_starter.master'); } else { @@ -2570,7 +2783,7 @@ class nginx_plugin { } else { $monit_content = file_get_contents($conf['rootpath'] . '/conf/hhvm_monit.master'); } - + if($data['new']['php'] == 'hhvm' && $data['old']['php'] != 'hhvm' || ($data['new']['php'] == 'hhvm' && isset($data['old']['custom_php_ini']) && isset($data['new']['custom_php_ini']) && $data['new']['custom_php_ini'] != $data['old']['custom_php_ini'])) { // Custom php.ini settings @@ -2583,7 +2796,7 @@ class nginx_plugin { foreach($required_php_snippets as $required_php_snippet){ $required_php_snippet = intval($required_php_snippet); if($required_php_snippet > 0){ - $php_snippet = $app->db->queryOneRecord("SELECT * FROM directive_snippets WHERE ".($snippet['master_directive_snippets_id'] > 0 ? 'master_' : '')."directive_snippets_id = ? AND type = 'php' AND active = 'y'", $required_php_snippet); + $php_snippet = $app->db->queryOneRecord("SELECT * FROM directive_snippets WHERE directive_snippets_id = ? AND type = 'php' AND active = 'y'", $required_php_snippet); $php_snippet['snippet'] = trim($php_snippet['snippet']); if($php_snippet['snippet'] != ''){ $custom_php_ini_settings .= "\n".$php_snippet['snippet']; @@ -2607,14 +2820,14 @@ class nginx_plugin { $app->system->exec_safe('chmod +x ? >/dev/null 2>&1', '/etc/init.d/hhvm_' . $data['new']['system_user']); $app->system->exec_safe('/usr/sbin/update-rc.d ? defaults >/dev/null 2>&1', 'hhvm_' . $data['new']['system_user']); $app->system->exec_safe('/etc/init.d/hhvm_' . $data['new']['system_user'] . ' restart >/dev/null 2>&1'); - + if(is_dir('/etc/monit/conf.d')){ $monit_content = str_replace('{SYSTEM_USER}', $data['new']['system_user'], $monit_content); file_put_contents('/etc/monit/conf.d/00-hhvm_' . $data['new']['system_user'], $monit_content); if(is_file('/etc/monit/conf.d/hhvm_' . $data['new']['system_user'])) unlink('/etc/monit/conf.d/hhvm_' . $data['new']['system_user']); exec('/etc/init.d/monit restart >/dev/null 2>&1'); } - + } elseif($data['new']['php'] != 'hhvm' && $data['old']['php'] == 'hhvm') { if($data['old']['system_user'] != ''){ exec('/etc/init.d/hhvm_' . $data['old']['system_user'] . ' stop >/dev/null 2>&1'); @@ -2622,7 +2835,7 @@ class nginx_plugin { unlink('/etc/init.d/hhvm_' . $data['old']['system_user']); if(is_file('/etc/hhvm/'.$data['old']['system_user'].'.ini')) unlink('/etc/hhvm/'.$data['old']['system_user'].'.ini'); } - + if(is_file('/etc/monit/conf.d/hhvm_' . $data['old']['system_user']) || is_file('/etc/monit/conf.d/00-hhvm_' . $data['old']['system_user'])){ if(is_file('/etc/monit/conf.d/hhvm_' . $data['old']['system_user'])){ unlink('/etc/monit/conf.d/hhvm_' . $data['old']['system_user']); @@ -2640,23 +2853,31 @@ class nginx_plugin { global $app, $conf; $pool_dir = trim($pool_dir); $rh_releasefiles = array('/etc/centos-release', '/etc/redhat-release'); - + // HHVM => PHP-FPM-Fallback + $default_php_fpm = true; + if($data['new']['php'] == 'php-fpm' || $data['new']['php'] == 'hhvm'){ - if(trim($data['new']['fastcgi_php_version']) != ''){ - $default_php_fpm = false; - list($custom_php_fpm_name, $custom_php_fpm_init_script, $custom_php_fpm_ini_dir, $custom_php_fpm_pool_dir) = explode(':', trim($data['new']['fastcgi_php_version'])); - if(substr($custom_php_fpm_ini_dir, -1) != '/') $custom_php_fpm_ini_dir .= '/'; - } else { - $default_php_fpm = true; + if($data['new']['server_php_id'] != 0){ + $tmp_php = $app->db->queryOneRecord('SELECT * FROM server_php WHERE server_php_id = ?', $data['new']['server_php_id']); + if($tmp_php) { + $default_php_fpm = false; + $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']; + if(substr($custom_php_fpm_ini_dir, -1) != '/') $custom_php_fpm_ini_dir .= '/'; + } } } else { - if(trim($data['old']['fastcgi_php_version']) != '' && $data['old']['php'] != 'no'){ - $default_php_fpm = false; - list($custom_php_fpm_name, $custom_php_fpm_init_script, $custom_php_fpm_ini_dir, $custom_php_fpm_pool_dir) = explode(':', trim($data['old']['fastcgi_php_version'])); - if(substr($custom_php_fpm_ini_dir, -1) != '/') $custom_php_fpm_ini_dir .= '/'; - } else { - $default_php_fpm = true; + if($data['old']['server_php_id'] != 0 && $data['old']['php'] != 'no'){ + $tmp_php = $app->db->queryOneRecord('SELECT * FROM server_php WHERE server_php_id = ?', $data['old']['server_php_id']); + if($tmp_php) { + $default_php_fpm = false; + $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']; + if(substr($custom_php_fpm_ini_dir, -1) != '/') $custom_php_fpm_ini_dir .= '/'; + } } } @@ -2701,12 +2922,12 @@ class nginx_plugin { $tpl->setVar('fpm_pool', $pool_name); $tpl->setVar('fpm_port', $web_config['php_fpm_start_port'] + $data['new']['domain_id'] - 1); $tpl->setVar('fpm_user', $data['new']['system_user']); - + //Red Hat workaround for group ownership of socket files foreach($rh_releasefiles as $rh_file) { if(file_exists($rh_file) && (filesize($rh_file) > 0)) { $tmp = file_get_contents($rh_file); - if(preg_match('/[67]+\.[0-9]+/m', $tmp)) { + if(preg_match('/[678]+\.[0-9]+/m', $tmp)) { $tpl->setVar('fpm_group', $data['new']['system_group']); $tpl->setVar('fpm_listen_group', $data['new']['system_group']); } @@ -2718,7 +2939,7 @@ class nginx_plugin { } break; } - + $tpl->setVar('fpm_listen_user', $data['new']['system_user']); $tpl->setVar('fpm_domain', $data['new']['domain']); $tpl->setVar('pm', $data['new']['pm']); @@ -2751,7 +2972,7 @@ class nginx_plugin { // Custom php.ini settings $final_php_ini_settings = array(); $custom_php_ini_settings = trim($data['new']['custom_php_ini']); - + if(intval($data['new']['directive_snippets_id']) > 0){ $snippet = $app->db->queryOneRecord("SELECT * FROM directive_snippets WHERE directive_snippets_id = ? AND type = 'nginx' AND active = 'y' AND customer_viewable = 'y'", intval($data['new']['directive_snippets_id'])); if(isset($snippet['required_php_snippets']) && trim($snippet['required_php_snippets']) != ''){ @@ -2760,7 +2981,7 @@ class nginx_plugin { foreach($required_php_snippets as $required_php_snippet){ $required_php_snippet = intval($required_php_snippet); if($required_php_snippet > 0){ - $php_snippet = $app->db->queryOneRecord("SELECT * FROM directive_snippets WHERE ".($snippet['master_directive_snippets_id'] > 0 ? 'master_' : '')."directive_snippets_id = ? AND type = 'php' AND active = 'y'", $required_php_snippet); + $php_snippet = $app->db->queryOneRecord("SELECT * FROM directive_snippets WHERE directive_snippets_id = ? AND type = 'php' AND active = 'y'", $required_php_snippet); $php_snippet['snippet'] = trim($php_snippet['snippet']); if($php_snippet['snippet'] != ''){ $custom_php_ini_settings .= "\n".$php_snippet['snippet']; @@ -2770,14 +2991,16 @@ class nginx_plugin { } } } - + $custom_session_save_path = false; + $custom_sendmail_path = false; if($custom_php_ini_settings != ''){ // Make sure we only have Unix linebreaks $custom_php_ini_settings = str_replace("\r\n", "\n", $custom_php_ini_settings); $custom_php_ini_settings = str_replace("\r", "\n", $custom_php_ini_settings); $ini_settings = explode("\n", $custom_php_ini_settings); if(is_array($ini_settings) && !empty($ini_settings)){ + $ini_settings = str_replace('{WEBROOT}', $data['new']['document_root'].'/web', $ini_settings); foreach($ini_settings as $ini_setting){ $ini_setting = trim($ini_setting); if(substr($ini_setting, 0, 1) == ';') continue; @@ -2788,6 +3011,7 @@ class nginx_plugin { if($value != ''){ $key = trim($key); if($key == 'session.save_path') $custom_session_save_path = true; + if($key == 'sendmail_path') $custom_sendmail_path = true; switch (strtolower($value)) { case '0': // PHP-FPM might complain about invalid boolean value if you use 0 @@ -2810,6 +3034,7 @@ class nginx_plugin { } $tpl->setVar('custom_session_save_path', ($custom_session_save_path ? 'y' : 'n')); + $tpl->setVar('custom_sendmail_path', ($custom_sendmail_path ? 'y' : 'n')); $tpl->setLoop('custom_php_ini_settings', $final_php_ini_settings); @@ -2854,12 +3079,17 @@ class nginx_plugin { private function php_fpm_pool_delete ($data, $web_config) { global $app, $conf; - if(trim($data['old']['fastcgi_php_version']) != '' && $data['old']['php'] != 'no'){ - $default_php_fpm = false; - list($custom_php_fpm_name, $custom_php_fpm_init_script, $custom_php_fpm_ini_dir, $custom_php_fpm_pool_dir) = explode(':', trim($data['old']['fastcgi_php_version'])); - if(substr($custom_php_fpm_ini_dir, -1) != '/') $custom_php_fpm_ini_dir .= '/'; - } else { - $default_php_fpm = true; + $default_php_fpm = true; + + if($data['old']['server_php_id'] != 0 && $data['old']['php'] != 'no'){ + $tmp_php = $app->db->queryOneRecord('SELECT * FROM server_php WHERE server_php_id = ?', $data['old']['server_php_id']); + if($tmp_php) { + $default_php_fpm = false; + $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']; + if(substr($custom_php_fpm_ini_dir, -1) != '/') $custom_php_fpm_ini_dir .= '/'; + } } if($default_php_fpm){ @@ -3212,6 +3442,166 @@ class nginx_plugin { return $seo_redirects; } + function _setup_jailkit_chroot() + { + global $app, $conf; + + $app->uses('system'); + + if (isset($this->jailkit_config) && isset($this->jailkit_config['jailkit_hardlinks'])) { + if ($this->jailkit_config['jailkit_hardlinks'] == 'yes') { + $options = array('hardlink'); + } elseif ($this->jailkit_config['jailkit_hardlinks'] == 'no') { + $options = array(); + } + } else { + $options = array('allow_hardlink'); + } + + // should move return here if $this->website['new_jailkit_hash'] == $this->website['last_jailkit_hash'] ? + + // check if the chroot environment is created yet if not create it with a list of program sections from the config + if (!is_dir($this->website['document_root'].'/etc/jailkit')) + { + $app->system->create_jailkit_chroot($this->website['document_root'], $this->jailkit_config['jailkit_chroot_app_sections'], $options); + $app->log("Added jailkit chroot", LOGLEVEL_DEBUG); + + $this->_add_jailkit_programs($options); + + $app->load('tpl'); + + $tpl = new tpl(); + $tpl->newTemplate("bash.bashrc.master"); + + $tpl->setVar('jailkit_chroot', true); + $tpl->setVar('domain', $this->website['domain']); + $tpl->setVar('home_dir', $this->_get_home_dir("")); + + $bashrc = $this->website['document_root'].'/etc/bash.bashrc'; + if(@is_file($bashrc) || @is_link($bashrc)) unlink($bashrc); + + file_put_contents($bashrc, $tpl->grab()); + unset($tpl); + + $app->log("Added bashrc script: ".$bashrc, LOGLEVEL_DEBUG); + + $tpl = new tpl(); + $tpl->newTemplate("motd.master"); + + $tpl->setVar('domain', $this->website['domain']); + + $motd = $this->website['document_root'].'/var/run/motd'; + if(@is_file($motd) || @is_link($motd)) unlink($motd); + + $app->system->file_put_contents($motd, $tpl->grab()); + + } else { + // force update existing jails + $options[] = 'force'; + + $sections = $this->jailkit_config['jailkit_chroot_app_sections']; + $programs = $this->jailkit_config['jailkit_chroot_app_programs'] . ' ' + . $this->jailkit_config['jailkit_chroot_cron_programs']; + + if ($this->website['new_jailkit_hash'] == $this->website['last_jailkit_hash']) { + return; + } + + $records = $app->db->queryAllRecords('SELECT web_folder FROM `web_domain` WHERE `parent_domain_id` = ? AND `document_root` = ? AND web_folder != \'\' AND web_folder IS NOT NULL AND `server_id` = ?', $this->website['domain_id'], $this->website['document_root'], $conf['server_id']); + foreach ($records as $record) { + $options[] = 'skip='.$record['web_folder']; + } + + $app->system->update_jailkit_chroot($this->website['document_root'], $sections, $programs, $options); + } + + // this gets last_jailkit_update out of sync with master db, but that is ok, + // as it is only used as a timestamp to moderate the frequency of updating on the slaves + $app->db->query("UPDATE `web_domain` SET `last_jailkit_update` = NOW(), `last_jailkit_hash` = ? WHERE `document_root` = ?", $this->website['new_jailkit_hash'], $this->website['document_root']); + } + + function _add_jailkit_programs($opts=array()) + { + global $app; + + $app->uses('system'); + + //copy over further programs and its libraries + $app->system->create_jailkit_programs($this->website['document_root'], $this->jailkit_config['jailkit_chroot_app_programs'], $opts); + $app->log("Added app programs to jailkit chroot", LOGLEVEL_DEBUG); + + $app->system->create_jailkit_programs($this->website['document_root'], $this->jailkit_config['jailkit_chroot_cron_programs'], $opts); + $app->log("Added cron programs to jailkit chroot", LOGLEVEL_DEBUG); + } + + function _get_home_dir($username) + { + return str_replace("[username]", $username, $this->jailkit_config['jailkit_chroot_home']); + } + + function _add_jailkit_user() + { + global $app; + + // add the user to the chroot + $jailkit_chroot_userhome = $this->_get_home_dir($this->website['system_user']); + + if(!is_dir($this->website['document_root'].'/etc')) $app->system->mkdir($this->website['document_root'].'/etc', 0755, true); + if(!is_file($this->website['document_root'].'/etc/passwd')) $app->system->exec_safe('touch ?', $this->website['document_root'].'/etc/passwd'); + + // IMPORTANT! + // ALWAYS create the user. Even if the user was created before + // if we check if the user exists, then a update (no shell -> jailkit) will not work + // and the user has FULL ACCESS to the root of the server! + $app->system->create_jailkit_user($this->website['system_user'], $this->website['document_root'], $jailkit_chroot_userhome); + + if(!is_dir($this->website['document_root'].$jailkit_chroot_userhome)) { + $app->system->mkdir($this->website['document_root'].$jailkit_chroot_userhome, 0750, true); + $app->system->chown($this->website['document_root'].$jailkit_chroot_userhome, $this->website['system_user']); + $app->system->chgrp($this->website['document_root'].$jailkit_chroot_userhome, $this->website['system_group']); + } + $app->log("Added created jailkit user home in : ".$this->website['document_root'].$jailkit_chroot_userhome, LOGLEVEL_DEBUG); + } + + private function _delete_jailkit_if_unused($parent_domain_id) { + global $app, $conf; + + // get jail directory + $parent_domain = $app->db->queryOneRecord("SELECT * FROM `web_domain` WHERE `domain_id` = ? OR `parent_domain_id` = ? AND `document_root` IS NOT NULL", $parent_domain_id, $parent_domain_id); + if (!is_dir($parent_domain['document_root'])) { + return; + } + + // chroot is used by php-fpm + if (isset($parent_domain['php_fpm_chroot']) && $parent_domain['php_fpm_chroot'] == 'y' && $parent_domain['php'] != 'no') { + return; + } + + // check for any shell_user using this jail + $inuse = $app->db->queryOneRecord('SELECT shell_user_id FROM `shell_user` WHERE `parent_domain_id` = ? AND `chroot` = ?', $parent_domain_id, 'jailkit'); + if($inuse) { + return; + } + + // check for any cron job using this jail + $inuse = $app->db->queryOneRecord('SELECT id FROM `cron` WHERE `parent_domain_id` = ? AND `type` = ?', $parent_domain_id, 'chrooted'); + if($inuse) { + return; + } + + $options = array(); + $records = $app->db->queryAllRecords('SELECT web_folder FROM `web_domain` WHERE `parent_domain_id` = ? AND `document_root` = ? AND web_folder != \'\' AND web_folder IS NOT NULL AND `server_id` = ?', $parent_domain_id, $parent_domain['document_root'], $conf['server_id']); + foreach ($records as $record) { + $options[] = 'skip='.$record['web_folder']; + } + + $app->system->delete_jailkit_chroot($parent_domain['document_root'], $options); + + // this gets last_jailkit_update out of sync with master db, but that is ok, + // as it is only used as a timestamp to moderate the frequency of updating on the slaves + $app->db->query("UPDATE `web_domain` SET `last_jailkit_update` = NOW(), `last_jailkit_hash` = NULL WHERE `document_root` = ?", $parent_domain['document_root']); + } + } // end class ?> diff --git a/server/plugins-available/nginx_reverseproxy_plugin.inc.php b/server/plugins-available/nginx_reverseproxy_plugin.inc.php index 1013042254ba2a2c63980394e6dc964021beb1f8..f35f40d34a2fd638de9532da7b7e30717c0c6e6b 100644 --- a/server/plugins-available/nginx_reverseproxy_plugin.inc.php +++ b/server/plugins-available/nginx_reverseproxy_plugin.inc.php @@ -111,7 +111,9 @@ class nginx_reverseproxy_plugin { $crt_file = $ssl_dir.'/'.$domain.'.crt'; $bundle_file = $ssl_dir.'/'.$domain.'.bundle'; - $vhost_data['nginx_directives'] = preg_replace("/\[IP\]/", $vhost_data['ip_address'], $vhost_data['nginx_directives']); + if($vhost_data['nginx_directives']) { + $vhost_data['nginx_directives'] = preg_replace("/\[IP\]/", $vhost_data['ip_address'], $vhost_data['nginx_directives']); + } if($data['new']['ssl'] == 'y' && @is_file($crt_file) && @is_file($key_file)) { diff --git a/server/plugins-available/openvz_plugin.inc.php b/server/plugins-available/openvz_plugin.inc.php index f17edb7b8c1882844b26eb6afb147eba9416075f..4be9c30ebf9b8c9daef2374928a1374d24f4ab8f 100644 --- a/server/plugins-available/openvz_plugin.inc.php +++ b/server/plugins-available/openvz_plugin.inc.php @@ -123,7 +123,7 @@ class openvz_plugin { //* new diskspace for ploop-containers requieres "vzctl set" if($data['new']['diskspace'] != $data['old']['diskspace']) { - escapeshell("vzctl set ? --diskspace ? --save", $veid, $data['new']['diskspace']."G"); + $app->system->exec_safe("vzctl set ? --diskspace ? --save", $veid, $data['new']['diskspace']."G"); } //* Apply config changes to the VM diff --git a/server/plugins-available/postfix_server_plugin.inc.php b/server/plugins-available/postfix_server_plugin.inc.php index ad48e3dee87064ed2ecc913a2ae5128fb90e8155..be81fb62a46c64baf21a94a8d9763fa0b2afea95 100644 --- a/server/plugins-available/postfix_server_plugin.inc.php +++ b/server/plugins-available/postfix_server_plugin.inc.php @@ -33,9 +33,6 @@ class postfix_server_plugin { var $plugin_name = 'postfix_server_plugin'; var $class_name = 'postfix_server_plugin'; - - var $postfix_config_dir = '/etc/postfix'; - //* This function is called during ispconfig installation to determine // if a symlink shall be created for this plugin. function onInstall() { @@ -73,28 +70,40 @@ class postfix_server_plugin { // The purpose of this plugin is to rewrite the main.cf file function update($event_name, $data) { 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']); $mail_config = $app->getconf->get_server_config($conf['server_id'], 'mail'); + // Get postfix version + exec('postconf -d mail_version 2>&1', $out); + $postfix_version = preg_replace('/.*=\s*/', '', $out[0]); + unset($out); + copy('/etc/postfix/main.cf', '/etc/postfix/main.cf~'); - + if ($mail_config['relayhost'].$mail_config['relayhost_user'].$mail_config['relayhost_password'] != $old_ini_data['mail']['relayhost'].$old_ini_data['mail']['relayhost_user'].$old_ini_data['mail']['relayhost_password']) { $content = file_exists('/etc/postfix/sasl_passwd') ? file_get_contents('/etc/postfix/sasl_passwd') : ''; - $content = preg_replace('/^'.preg_quote($old_ini_data['email']['relayhost']).'\s+[^\n]*(:?\n|)/m','',$content); + $content = preg_replace('/^'.preg_quote($old_ini_data['email']['relayhost'], '/').'\s+[^\n]*(:?\n|)/m','',$content); if (!empty($mail_config['relayhost_user']) || !empty($mail_config['relayhost_password'])) { $content .= "\n".$mail_config['relayhost'].' '.$mail_config['relayhost_user'].':'.$mail_config['relayhost_password']; } - + if (preg_replace('/^(#[^\n]*|\s+)(:?\n+|)/m','',$content) != '') { exec("postconf -e 'smtp_sasl_auth_enable = yes'"); } else { exec("postconf -e 'smtp_sasl_auth_enable = no'"); } - + $app->system->exec_safe("postconf -e ?", 'relayhost = '.$mail_config['relayhost']); file_put_contents('/etc/postfix/sasl_passwd', $content); chmod('/etc/postfix/sasl_passwd', 0600); @@ -103,131 +112,317 @@ class postfix_server_plugin { exec("postconf -e 'smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd'"); exec("postconf -e 'smtp_sasl_security_options ='"); exec('postmap /etc/postfix/sasl_passwd'); - exec($conf['init_scripts'] . '/' . 'postfix restart'); + $postfix_restart=true; } if($mail_config['realtime_blackhole_list'] != $old_ini_data['mail']['realtime_blackhole_list']) { - $rbl_updated = false; - $rbl_hosts = trim(preg_replace('/\s+/', '', $mail_config['realtime_blackhole_list'])); - if($rbl_hosts != ''){ - $rbl_hosts = explode(",", $rbl_hosts); - } + # reject_rbl_client is now in smtpd_client_restrictions, remove here: $options = preg_split("/,\s*/", exec("postconf -h smtpd_recipient_restrictions")); $new_options = array(); foreach ($options as $key => $value) { - if (!preg_match('/reject_rbl_client/', $value)) { - $new_options[] = $value; - } else { - if(is_array($rbl_hosts) && !empty($rbl_hosts) && !$rbl_updated){ - $rbl_updated = true; - foreach ($rbl_hosts as $key => $value) { - $value = trim($value); - if($value != '') $new_options[] = "reject_rbl_client ".$value; - } - } - } + $value = trim($value); + if ($value == '') continue; + if (preg_match('/^reject_rbl_client/', $value)) continue; + $new_options[] = $value; } - //* first time add rbl-list - if (!$rbl_updated && is_array($rbl_hosts) && !empty($rbl_hosts)) { + $app->system->exec_safe("postconf -e ?", 'smtpd_recipient_restrictions = '.implode(", ", $new_options)); + + $rbl_options = array(); + $rbl_hosts = trim(preg_replace('/\s+/', '', $mail_config['realtime_blackhole_list'])); + if($rbl_hosts != ''){ + $rbl_hosts = explode(",", $rbl_hosts); foreach ($rbl_hosts as $key => $value) { $value = trim($value); - if($value != '') $new_options[] = "reject_rbl_client ".$value; + if($value != '') $rbl_options[] = "reject_rbl_client ".$value; } } - $app->system->exec_safe("postconf -e ?", 'smtpd_recipient_restrictions = '.implode(", ", $new_options)); - exec('postfix reload'); + + $options = preg_split("/,\s*/", exec("postconf -h smtpd_client_restrictions")); + $new_options = array(); + foreach ($options as $key => $value) { + $value = trim($value); + if ($value == '') continue; + if (preg_match('/^reject_rbl_client/', $value)) continue; + $new_options[] = $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 + } + } + $app->system->exec_safe("postconf -e ?", 'smtpd_client_restrictions = '.implode(", ", $new_options)); } - - if($mail_config['reject_sender_login_mismatch'] != $old_ini_data['mail']['reject_sender_login_mismatch']) { - $options = explode(", ", exec("postconf -h smtpd_sender_restrictions")); + + if ($mail_config['reject_sender_login_mismatch'] != $old_ini_data['mail']['reject_sender_login_mismatch']) { + $options = preg_split("/,\s*/", exec("postconf -h smtpd_sender_restrictions")); $new_options = array(); foreach ($options as $key => $value) { - if (!preg_match('/reject_authenticated_sender_login_mismatch/', $value)) { - $new_options[] = $value; + $value = trim($value); + if ($value == '') continue; + if (preg_match('/reject_(authenticated_)?sender_login_mismatch/', $value)) { + continue; } + $new_options[] = $value; } - + if ($mail_config['reject_sender_login_mismatch'] == 'y') { - reset($new_options); $i = 0; - // insert after check_sender_access but before permit_... - while (isset($new_options[$i]) && substr($new_options[$i], 0, 19) == 'check_sender_access') ++$i; - array_splice($new_options, $i, 0, array('reject_authenticated_sender_login_mismatch')); + // insert before permit_mynetworks + for ($i = 0; isset($new_options[$i]); $i++) { + if ($new_options[$i] == 'permit_mynetworks') { + array_splice($new_options, $i, 0, array('reject_authenticated_sender_login_mismatch')); + break; + } + } + + // insert before permit_sasl_authenticated + for ($i = 0; isset($new_options[$i]); $i++) { + if ($new_options[$i] == 'permit_sasl_authenticated') { + array_splice($new_options, $i, 0, array('reject_sender_login_mismatch')); + break; + } + } } + $app->system->exec_safe("postconf -e ?", 'smtpd_sender_restrictions = '.implode(", ", $new_options)); - exec('postfix reload'); - } - - if($app->system->is_installed('dovecot')) { - $out = null; - exec("postconf -n virtual_transport", $out); - if ($mail_config["mailbox_virtual_uidgid_maps"] == 'y') { - // If dovecot switch to lmtp - if($out[0] != "virtual_transport = lmtp:unix:private/dovecot-lmtp") { - exec("postconf -e 'virtual_transport = lmtp:unix:private/dovecot-lmtp'"); - exec('postfix reload'); - $app->system->replaceLine("/etc/dovecot/dovecot.conf", "protocols = imap pop3", "protocols = imap pop3 lmtp"); - exec($conf['init_scripts'] . '/' . 'dovecot restart'); + } + + if ($mail_config['reject_unknown']) { + if (($mail_config['reject_unknown'] === 'client') || ($mail_config['reject_unknown'] === 'client_helo')) { + $options = preg_split("/,\s*/", exec("postconf -h smtpd_client_restrictions")); + $new_options = array(); + foreach ($options as $key => $value) { + $value = trim($value); + if ($value == '') continue; + if (preg_match('/reject_unknown(_client)?_hostname/', $value)) { + continue; + } + $new_options[] = $value; + } + + // insert before explicit permit, or append + for ($i = 0; isset($new_options[$i]); $i++) { + if ($new_options[$i] == 'permit') { + array_splice($new_options, $i, 0, array('reject_unknown_client_hostname')); + break; + } } + if ($i == count($new_options)) { + $new_options[] = 'reject_unknown_client_hostname'; + } + + $app->system->exec_safe("postconf -e ?", 'smtpd_client_restrictions = '.implode(", ", $new_options)); } else { - // If dovecot switch to dovecot - if($out[0] != "virtual_transport = dovecot") { - exec("postconf -e 'virtual_transport = dovecot'"); - exec('postfix reload'); - $app->system->replaceLine("/etc/dovecot/dovecot.conf", "protocols = imap pop3 lmtp", "protocols = imap pop3"); - exec($conf['init_scripts'] . '/' . 'dovecot restart'); + $options = preg_split("/,\s*/", exec("postconf -h smtpd_client_restrictions")); + $new_options = array(); + foreach ($options as $key => $value) { + $value = trim($value); + if ($value == '') continue; + if (preg_match('/reject_unknown(_client)?_hostname/', $value)) { + continue; + } + $new_options[] = $value; } + $app->system->exec_safe("postconf -e ?", 'smtpd_client_restrictions = '.implode(", ", $new_options)); } - } - if($mail_config['content_filter'] != $old_ini_data['mail']['content_filter']) { - 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'"); - - exec("postconf -e 'smtpd_sender_restrictions = check_sender_access mysql:/etc/postfix/mysql-virtual_sender.cf, permit_mynetworks, permit_sasl_authenticated'"); - + if (($mail_config['reject_unknown'] === 'helo') || ($mail_config['reject_unknown'] === 'client_helo')) { + $options = preg_split("/,\s*/", exec("postconf -h smtpd_helo_restrictions")); $new_options = array(); - $options = preg_split("/,\s*/", exec("postconf -h smtpd_recipient_restrictions")); foreach ($options as $key => $value) { - if (!preg_match('/check_policy_service\s+inet:127.0.0.1:10023/', $value)) { - $new_options[] = $value; + $value = trim($value); + if ($value == '') continue; + if (preg_match('/reject_unknown(_helo)?_hostname/', $value)) { + continue; + } + $new_options[] = $value; + } + + // insert before explicit permit, or append + for ($i = 0; isset($new_options[$i]); $i++) { + if ($new_options[$i] == 'permit') { + array_splice($new_options, $i, 0, array('reject_unknown_helo_hostname')); + break; } } - exec("postconf -e 'smtpd_recipient_restrictions = ".implode(", ", $new_options)."'"); - - // 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); + if ($i == count($new_options)) { + $new_options[] = 'reject_unknown_helo_hostname'; + } + + $app->system->exec_safe("postconf -e ?", 'smtpd_helo_restrictions = '.implode(", ", $new_options)); } else { - exec("postconf -X '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 = amavis:[127.0.0.1]:10024'"); - - exec("postconf -e 'smtpd_sender_restrictions = check_sender_access mysql:/etc/postfix/mysql-virtual_sender.cf regexp:/etc/postfix/tag_as_originating.re, permit_mynetworks, permit_sasl_authenticated, check_sender_access regexp:/etc/postfix/tag_as_foreign.re'"); + $options = preg_split("/,\s*/", exec("postconf -h smtpd_helo_restrictions")); + $new_options = array(); + foreach ($options as $key => $value) { + $value = trim($value); + if ($value == '') continue; + if (preg_match('/reject_unknown(_helo)?_hostname/', $value)) { + continue; + } + $new_options[] = $value; + } + $app->system->exec_safe("postconf -e ?", 'smtpd_helo_restrictions = '.implode(", ", $new_options)); + } + } + + if ($mail_config['stress_adaptive']) { + if ($mail_config['stress_adaptive'] == 'y') { + if (version_compare($postfix_version , '3.0', '>=')) { + $app->system->exec_safe("postconf -e ?", 'in_flow_delay = ${stress?{3}:{1}}s'); + $app->system->exec_safe("postconf -e ?", 'smtp_connect_timeout = ${stress?{10}:{30}}s'); + $app->system->exec_safe("postconf -e ?", 'smtp_helo_timeout = ${stress?{10}:{60}}s'); + $app->system->exec_safe("postconf -e ?", 'smtp_mail_timeout = ${stress?{10}:{60}}s'); + $app->system->exec_safe("postconf -e ?", 'smtpd_error_sleep_time = ${stress?{1}:{2}}s'); + $app->system->exec_safe("postconf -e ?", 'smtpd_hard_error_limit = ${stress?{1}:{10}}'); + $app->system->exec_safe("postconf -e ?", 'smtpd_recipient_overshoot_limit = ${stress?{60}:{600}}'); + $app->system->exec_safe("postconf -e ?", 'smtpd_soft_error_limit = ${stress?{2}:{5}}'); + $app->system->exec_safe("postconf -e ?", 'smtpd_timeout = ${stress?{10}:{60}}s'); + } elseif (version_compare($postfix_version , '2.5', '>=')) { + $app->system->exec_safe("postconf -e ?", 'in_flow_delay = ${stress?3}${stress:1}s'); + $app->system->exec_safe("postconf -e ?", 'smtp_connect_timeout = ${stress?10}${stress:30}s'); + $app->system->exec_safe("postconf -e ?", 'smtp_helo_timeout = ${stress?10}${stress:60}s'); + $app->system->exec_safe("postconf -e ?", 'smtp_mail_timeout = ${stress?10}${stress:60}s'); + $app->system->exec_safe("postconf -e ?", 'smtpd_error_sleep_time = ${stress?1}${stress:2}s'); + $app->system->exec_safe("postconf -e ?", 'smtpd_hard_error_limit = ${stress?1}${stress:10}'); + $app->system->exec_safe("postconf -e ?", 'smtpd_recipient_overshoot_limit = ${stress?60}${stress:600}'); + $app->system->exec_safe("postconf -e ?", 'smtpd_soft_error_limit = ${stress?2}${stress:5}'); + $app->system->exec_safe("postconf -e ?", 'smtpd_timeout = ${stress?10}${stress:60}s'); + } + } else { // mail_config['stress_adaptive'] == 'n' + exec("postconf -X 'in_flow_delay'"); + exec("postconf -X 'smtp_connect_timeout'"); + exec("postconf -X 'smtp_helo_timeout'"); + exec("postconf -X 'smtp_mail_timeout'"); + exec("postconf -X 'smtpd_error_sleep_time'"); + exec("postconf -X 'smtpd_hard_error_limit'"); + exec("postconf -X 'smtpd_recipient_overshoot_limit'"); + exec("postconf -X 'smtpd_soft_error_limit'"); + exec("postconf -X 'smtpd_timeout'"); } } - + + if($app->system->is_installed('dovecot')) { + $virtual_transport = 'dovecot'; + $configure_lmtp = false; + $dovecot_protocols = 'imap pop3'; + + //* dovecot-lmtpd + if( ($configure_lmtp = (is_file('/usr/lib/dovecot/lmtp') || is_file('/usr/libexec/dovecot/lmtp'))) || + ($mail_config["mailbox_virtual_uidgid_maps"] == 'y') ) + { + $virtual_transport = 'lmtp:unix:private/dovecot-lmtp'; + $dovecot_protocols .= ' lmtp'; + } + + //* dovecot-managesieved + if(is_file('/usr/lib/dovecot/managesieve') || is_file('/usr/libexec/dovecot/managesieve')) { + $dovecot_protocols .= ' sieve'; + } + + $out = null; + exec("postconf -n virtual_transport", $out); + if($out[0] != "virtual_transport = $virtual_transport") { + exec("postconf -e 'virtual_transport = $virtual_transport'"); + exec('postfix reload'); + } + + $out = null; + exec("grep '^protocols\s' /etc/dovecot/dovecot.conf", $out); + if($out[0] != "protocols = $dovecot_protocols") { + $app->system->replaceLine("/etc/dovecot/dovecot.conf", 'REGEX:/^protocols\s=/', "protocols = $dovecot_protocols"); + exec($conf['init_scripts'] . '/' . 'dovecot restart'); + } + } + + $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) { + $value = trim($value); + if ($value == '') continue; + if (preg_match("|check_recipient_access\s+proxy:mysql:${quoted_postfix_config_dir}/mysql-verify_recipients.cf|", $value)) { + continue; + } + $new_options[] = $value; + } + 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; + } + } + # postfix < 3.3 needs this when using reject_unverified_recipient: + if(version_compare($postfix_version, 3.3, '<')) { + exec("postconf -e 'enable_original_recipient = yes'"); + } + } + exec("postconf -e 'smtpd_recipient_restrictions = ".implode(", ", $new_options)."'"); + + $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 -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'"); + + 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'"); + + $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; + } + if (preg_match("|check_recipient_access\s+proxy:mysql:${quoted_postfix_config_dir}/mysql-verify_recipients.cf|", $value)) { + continue; + } + $new_options[] = $value; + } + exec("postconf -e 'smtpd_recipient_restrictions = ".implode(", ", $new_options)."'"); + + // 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'])) { $app->load('tpl'); @@ -236,7 +431,7 @@ class postfix_server_plugin { if($crypted_password) { $rspamd_password = $crypted_password; } - + $tpl = new tpl(); $tpl->newTemplate('rspamd_worker-controller.inc.master'); $tpl->setVar('rspamd_password', $rspamd_password); @@ -247,6 +442,6 @@ class postfix_server_plugin { exec("postconf -e 'mailbox_size_limit = ".intval($mail_config['mailbox_size_limit']*1024*1024)."'"); exec("postconf -e 'message_size_limit = ".intval($mail_config['message_size_limit']*1024*1024)."'"); - $app->services->restartServiceDelayed('postfix', 'reload'); + $app->services->restartServiceDelayed('postfix', ($postfix_restart ? 'restart' : 'reload')); } } // end class diff --git a/server/plugins-available/powerdns_plugin.inc.php b/server/plugins-available/powerdns_plugin.inc.php index 7ab23ec5494cd57d6f877e8a1afcbd864f48926f..82240f106dd157ffac5cff394752d787d94b4276 100644 --- a/server/plugins-available/powerdns_plugin.inc.php +++ b/server/plugins-available/powerdns_plugin.inc.php @@ -449,7 +449,7 @@ class powerdns_plugin { function notifySlave($data) { global $app; - + $pdns_control = $this->find_pdns_control(); if ( $pdns_control != false ) { $app->system->exec_safe($pdns_control . ' notify ?', rtrim($data["new"]["origin"],".")); @@ -458,7 +458,7 @@ class powerdns_plugin { function fetchFromMaster($data) { global $app; - + $pdns_control = $this->find_pdns_control(); if ( $pdns_control != false ) { $app->system->exec_safe($pdns_control . ' retrieve ?', rtrim($data["new"]["origin"],".")); @@ -502,7 +502,7 @@ class powerdns_plugin { } // If DNSSEC is wanted, enable it - if ($data['new']['dnssec_wanted'] === 'Y' && $data['old']['dnssec_wanted'] === 'N') { + if ($data['new']['dnssec_wanted'] === 'Y' && (is_null($data['old']['dnssec_wanted']) || $data['old']['dnssec_wanted'] === 'N')) { $this->soa_dnssec_create($data); } } diff --git a/server/plugins-available/rspamd_plugin.inc.php b/server/plugins-available/rspamd_plugin.inc.php index 212cb2c21c79a18be812d9b61e61c4ad9f20a574..112020deb7119f6c1c99dc018737239dfc148274 100644 --- a/server/plugins-available/rspamd_plugin.inc.php +++ b/server/plugins-available/rspamd_plugin.inc.php @@ -33,7 +33,7 @@ class rspamd_plugin { var $plugin_name = 'rspamd_plugin'; var $class_name = 'rspamd_plugin'; var $users_config_dir = '/etc/rspamd/local.d/users/'; - + //* This function is called during ispconfig installation to determine // if a symlink shall be created for this plugin. function onInstall() { @@ -98,7 +98,7 @@ class rspamd_plugin { return true; } - + /* This function is called when the plugin is loaded */ @@ -114,17 +114,21 @@ class rspamd_plugin { $app->plugins->registerEvent('spamfilter_wblist_insert', $this->plugin_name, 'spamfilter_wblist_insert'); $app->plugins->registerEvent('spamfilter_wblist_update', $this->plugin_name, 'spamfilter_wblist_update'); $app->plugins->registerEvent('spamfilter_wblist_delete', $this->plugin_name, 'spamfilter_wblist_delete'); - + //* global mail access filters $app->plugins->registerEvent('mail_access_insert', $this->plugin_name, 'spamfilter_wblist_insert'); $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'); $app->plugins->registerEvent('spamfilter_users_update', $this->plugin_name, 'user_settings_update'); @@ -139,13 +143,13 @@ class rspamd_plugin { $app->plugins->registerEvent('mail_forwarding_delete', $this->plugin_name, 'user_settings_update'); } - function user_settings_update($event_name, $data) { + function user_settings_update($event_name, $data, $internal = false) { global $app, $conf; - + if(!is_dir('/etc/rspamd')) { return; } - + $use_data = 'new'; if(substr($event_name, -7) === '_delete') { $mode = 'delete'; @@ -159,7 +163,7 @@ class rspamd_plugin { // get the config $app->uses('getconf,system,functions'); $mail_config = $app->getconf->get_server_config($conf['server_id'], 'mail'); - + $type = false; $identifier = false; $entry_id = false; @@ -180,7 +184,7 @@ class rspamd_plugin { $app->log('Invalid event name for rspamd_plugin: ' . $event_name, LOGLEVEL_WARN); return; } - + $is_domain = false; $email_address = $data[$use_data][$identifier]; $settings_name = $email_address; @@ -199,13 +203,43 @@ class rspamd_plugin { $email_address = '@' . $email_address; $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); return; } - + + $entries_to_update = [ + 'mail_user' => [], + 'mail_forwarding' => [] + ]; + if($is_domain === true) { + // get all child records to update / delete + $mailusers = $app->db->queryAllRecords("SELECT mu.* FROM mail_user as mu LEFT JOIN spamfilter_users as su ON (su.email = mu.email) WHERE mu.email LIKE ? AND su.id IS NULL", '%' . $email_address); + if(is_array($mailusers) && !empty($mailusers)) { + $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); + if(is_array($forwardings) && !empty($forwardings)) { + $entries_to_update['mail_forwarding'] = $forwardings; + } + } + + $old_settings_name = $settings_name; + $settings_name = $app->functions->idn_encode($settings_name); + + if($old_settings_name !== $settings_name) { + // we changed naming to idn-encoded form due to path check issues. Delete old file if existing. + $old_settings_file = $this->users_config_dir . str_replace('@', '_', $old_settings_name) . '.conf'; + if(is_file($old_settings_file)) { + unlink($old_settings_file); + } + } + $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') { @@ -213,17 +247,21 @@ class rspamd_plugin { unlink($settings_file); } } else { - $settings_priority = 20; if(isset($data[$use_data]['priority'])) { - $settings_priority = intval($data[$use_data]['priority']); - } elseif($is_domain === true) { - $settings_priority = 18; + $settings_priority = ($is_domain ? 10 : 20) + intval($data[$use_data]['priority']); + } else { + $settings_priority = ($is_domain ? 10 : 20) + 5; } - + // 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) { $greylisting = $check['greylisting']; @@ -233,17 +271,17 @@ class rspamd_plugin { } else { $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); - + $greylisting = $data[$use_data]['greylisting']; } - + if(!is_dir($this->users_config_dir)){ $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); } @@ -252,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); @@ -263,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); } @@ -285,7 +329,7 @@ class rspamd_plugin { } $tpl->setVar('rspamd_spam_tag_level', floatval($policy['rspamd_spam_tag_level'])); - $tpl->setVar('rspamd_spam_tag_method', floatval($policy['rspamd_spam_tag_method'])); + $tpl->setVar('rspamd_spam_tag_method', $policy['rspamd_spam_tag_method']); $tpl->setVar('rspamd_spam_kill_level', floatval($policy['rspamd_spam_kill_level'])); $tpl->setVar('rspamd_virus_kill_level', floatval($policy['rspamd_spam_kill_level']) + 1000); @@ -308,7 +352,16 @@ class rspamd_plugin { } } - if($mail_config['content_filter'] == 'rspamd'){ + if($is_domain === true) { + foreach($entries_to_update['mail_user'] as $entry) { + $this->user_settings_update('mail_user_' . $mode, ['old' => $entry, 'new' => $entry], true); + } + foreach($entries_to_update['mail_forwarding'] as $entry) { + $this->user_settings_update('mail_forwarding_' . $mode, ['old' => $entry, 'new' => $entry], true); + } + } + + if($internal !== true && $mail_config['content_filter'] == 'rspamd'){ $app->services->restartServiceDelayed('rspamd', 'reload'); } } @@ -324,7 +377,7 @@ class rspamd_plugin { $app->uses('getconf,system,functions'); $mail_config = $app->getconf->get_server_config($conf['server_id'], 'mail'); - + if(is_dir('/etc/rspamd')) { $global_filter = false; //* Create the config file @@ -343,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( @@ -354,12 +408,12 @@ class rspamd_plugin { ); } } - + if($data['new']['active'] == 'y' && is_array($filter) && !empty($filter)){ if(!is_dir($this->users_config_dir)){ $app->system->mkdirpath($this->users_config_dir); } - + $app->load('tpl'); $filter_from = $filter['from']; @@ -391,11 +445,16 @@ 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); - // we need to add 10 to priority to avoid mailbox/domain spamfilter settings overriding white/blacklists - $tpl->setVar('priority', intval($data['new']['priority']) + ($global_filter ? 10 : 20)); + // add 30/40 to priority to avoid collisions and prefer white/blacklists above mailbox/domain spamfilter settings + $tpl->setVar('priority', intval($data['new']['priority']) + ($global_filter ? 30 : 40)); $tpl->setVar('from', $filter_from); $tpl->setVar('recipient', $filter_rcpt); $tpl->setVar('hostname', $filter['hostname']); @@ -407,13 +466,13 @@ class rspamd_plugin { } elseif(is_file($wblist_file)) { 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'); } } } - + function spamfilter_wblist_delete($event_name, $data) { global $app, $conf; @@ -432,40 +491,71 @@ 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_users.conf.master'); - - $whitelist_ips = array(); - $ips = $app->db->queryAllRecords("SELECT * FROM server_ip WHERE server_id = ?", $conf['server_id']); - if(is_array($ips) && !empty($ips)){ - foreach($ips as $ip){ - $whitelist_ips[] = array('ip' => $ip['ip_address']); - } + 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"); + } + + $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('whitelist_ips', $whitelist_ips); - $app->system->file_put_contents('/etc/rspamd/local.d/users.conf', $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) { if(function_exists('filter_var')) { if(!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_IPV6)) { diff --git a/server/plugins-available/server_services_plugin.inc.php b/server/plugins-available/server_services_plugin.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..c3eb78f194656cdd847d8665ccda34da6382c652 --- /dev/null +++ b/server/plugins-available/server_services_plugin.inc.php @@ -0,0 +1,155 @@ +plugins->registerEvent('server_insert', 'server_services_plugin', 'insert'); + $app->plugins->registerEvent('server_update', 'server_services_plugin', 'update'); + $app->plugins->registerEvent('server_delete', 'server_services_delete', 'delete'); + + } + + function insert($event_name, $data) { + + $this->update($event_name, $data); + + } + + function delete($event_name, $data) { + + $this->update($event_name, $data); + + } + + function update($event_name, $data) { + global $app, $conf; + + $app->uses('getconf'); + $old_services = array(); + $new_services = array(); + foreach($this->services as $service) { + $old_services[$service] = $data['old'][$service]; + $new_services[$service] = $data['new'][$service]; + } + $changed_services=array_diff_assoc($new_services,$old_services); + foreach($changed_services as $service => $value) { + switch($service) { + case 'mail_server': + $config = $app->getconf->get_server_config($conf['server_id'], 'mail'); + $plugins = @($config['pop3_imap_daemon'] == 'dovecot')?$this->dovecot_plugins:$this->courier_plugins; + $plugins = array_merge($plugins, $this->mail_plugins); + $this->change_state($plugins, $value, $config); + break; + case 'web_server': + $config = $app->getconf->get_server_config($conf['server_id'], 'web'); + $plugins = @($config['server_type'] == 'apache')?$this->apache_plugins:$this->nginx_plugins; + $plugins = array_merge($plugins, $this->web_plugins); + $this->change_state($plugins, $value, $config); + break; + case 'dns_server': + $config = $app->getconf->get_server_config($conf['server_id'], 'dns'); + $plugins = @(isset($config['bind_user']))?$this->bind_plugins:$this->powerdns_plugins; + $this->change_state($plugins, $value, $config); + break; + case 'db_server': + $this->change_state($this->db_plugins, $value, $config); + break; + case 'vserver_server': + $this->change_state($this->openvz_plugins, $value, $config); + break; + case 'xmpp_server': + $this->change_state($this->xmpp_plugins, $value, $config); + break; + } + } + + } + + function change_state($plugins, $value, $config) { + + $enabled_dir = '/usr/local/ispconfig/server/plugins-enabled/'; + $available_dir = '/usr/local/ispconfig/server/plugins-available/'; + + if($value == 0) { //* disable services + foreach($plugins as $plugin) { + if(is_link($enabled_dir.$plugin.'.inc.php')) { + unlink($enabled_dir.$plugin.'.inc.php'); + } + } + } + if ($value == 1) { //* enable services + foreach($plugins as $plugin) { + if(is_file($available_dir.$plugin.'.inc.php') && !is_link($enabled_dir.$plugin.'.inc.php')) { + symlink($available_dir.$plugin.'.inc.php', $enabled_dir.$plugin.'.inc.php'); + } + } + } + + } + +} // end class + + + +?> diff --git a/server/plugins-available/shelluser_base_plugin.inc.php b/server/plugins-available/shelluser_base_plugin.inc.php index 9f19c2be58cb397f8b2fa4acf3b48c0ccca05440..2fc4f0dfc7cdc0b657825dbdfe51fbb299794b53 100755 --- a/server/plugins-available/shelluser_base_plugin.inc.php +++ b/server/plugins-available/shelluser_base_plugin.inc.php @@ -58,20 +58,20 @@ class shelluser_base_plugin { /* Register for the events */ - + $app->plugins->registerEvent('shell_user_insert', $this->plugin_name, 'insert'); $app->plugins->registerEvent('shell_user_update', $this->plugin_name, 'update'); $app->plugins->registerEvent('shell_user_delete', $this->plugin_name, 'delete'); - + } function insert($event_name, $data) { global $app, $conf; - + $app->uses('system,getconf'); - + $security_config = $app->getconf->get_security_config('permissions'); if($security_config['allow_shell_user'] != 'yes') { $app->log('Shell user plugin disabled by security settings.',LOGLEVEL_WARN); @@ -88,7 +88,7 @@ class shelluser_base_plugin { $app->log('Directory of the shell user is not valid.',LOGLEVEL_WARN); return false; } - + if(!$app->system->is_allowed_user($data['new']['username'], false, false) || !$app->system->is_allowed_user($data['new']['puser'], true, true) || !$app->system->is_allowed_group($data['new']['pgroup'], true, true)) { @@ -96,8 +96,16 @@ class shelluser_base_plugin { return false; } - if($data['new']['active'] != 'y') $data['new']['shell'] = '/bin/false'; - + if(is_file($data['new']['dir']) || is_link($data['new']['dir'])) { + $app->log('Shell user dir must not be existing file or symlink.', LOGLEVEL_WARN); + return false; + } elseif(!$app->system->is_allowed_path($data['new']['dir'])) { + $app->log('Shell user dir is not an allowed path: ' . $data['new']['dir'], LOGLEVEL_WARN); + return false; + } + + if($data['new']['active'] != 'y' || $data['new']['chroot'] == "jailkit") $data['new']['shell'] = '/bin/false'; + if($app->system->is_user($data['new']['puser'])) { // Get the UID of the parent user @@ -105,24 +113,20 @@ class shelluser_base_plugin { if($uid > $this->min_uid) { //* Remove webfolder protection $app->system->web_folder_protection($web['document_root'], false); - + //* Home directory of the new shell user - if($data['new']['chroot'] == 'jailkit') { - $homedir = $data['new']['dir']; - } else { - $homedir = $data['new']['dir'].'/home/'.$data['new']['username']; - } - + $homedir = $data['new']['dir'].'/home/'.$data['new']['username']; + // Create home base directory if it does not exist if(!is_dir($data['new']['dir'].'/home')){ $app->file->mkdirs($data['new']['dir'].'/home', '0755'); } - + // Change ownership of home base dir to root user $app->system->chown($data['new']['dir'].'/home','root'); $app->system->chgrp($data['new']['dir'].'/home','root'); $app->system->chmod($data['new']['dir'].'/home',0755); - + if(!is_dir($homedir)){ $app->file->mkdirs($homedir, '0750'); $app->system->chown($homedir,$data['new']['puser'],false); @@ -142,15 +146,14 @@ class shelluser_base_plugin { $app->log("Command chpasswd failed for user ".$data['new']['username'] . ' with code ' . $retval . ': ' . $stderr, LOGLEVEL_WARN); } } - + $app->system->chown($data['new']['dir'],$data['new']['username'],false); $app->system->chgrp($data['new']['dir'],$data['new']['pgroup'],false); - + // call the ssh-rsa update function $app->uses("getconf"); $this->data = $data; - $this->app = $app; $this->_setup_ssh_rsa(); //* Create .bash_history file @@ -165,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'; @@ -186,7 +194,7 @@ class shelluser_base_plugin { global $app, $conf; $app->uses('system,getconf'); - + $security_config = $app->getconf->get_security_config('permissions'); if($security_config['allow_shell_user'] != 'yes') { $app->log('Shell user plugin disabled by security settings.',LOGLEVEL_WARN); @@ -199,7 +207,7 @@ class shelluser_base_plugin { $app->log('Directory of the shell user is outside of website docroot.',LOGLEVEL_WARN); return false; } - + if(strpos($data['new']['dir'], '/../') !== false || substr($data['new']['dir'],-3) == '/..') { $app->log('Directory of the shell user is not valid.',LOGLEVEL_WARN); return false; @@ -211,14 +219,22 @@ class shelluser_base_plugin { $app->log('Shell user must not be root or in group root.',LOGLEVEL_WARN); return false; } - + + if(is_file($data['new']['dir']) || is_link($data['new']['dir'])) { + $app->log('Shell user dir must not be existing file or symlink.', LOGLEVEL_WARN); + return false; + } elseif(!$app->system->is_allowed_path($data['new']['dir'])) { + $app->log('Shell user dir is not an allowed path: ' . $data['new']['dir'], LOGLEVEL_WARN); + return false; + } + if($data['new']['active'] != 'y') $data['new']['shell'] = '/bin/false'; - + if($app->system->is_user($data['new']['puser'])) { // Get the UID of the parent user $uid = intval($app->system->getuid($data['new']['puser'])); if($uid > $this->min_uid) { - + //* Home directory of the shell user if($data['new']['chroot'] == 'jailkit') { $homedir = $data['new']['dir']; @@ -227,32 +243,29 @@ class shelluser_base_plugin { $homedir = $data['new']['dir'].'/home/'.$data['new']['username']; $homedir_old = $data['old']['dir'].'/home/'.$data['old']['username']; } - + $app->log("Homedir New: ".$homedir, LOGLEVEL_DEBUG); $app->log("Homedir Old: ".$homedir_old, LOGLEVEL_DEBUG); - + // Check if the user that we want to update exists, if not, we insert it if($app->system->is_user($data['old']['username'])) { //* Remove webfolder protection $app->system->web_folder_protection($web['document_root'], false); if($homedir != $homedir_old){ - $app->system->web_folder_protection($web['document_root'], false); // Rename dir, in case the new directory exists already. if(is_dir($homedir)) { $app->log("New Homedir exists, renaming it to ".$homedir.'_bak', LOGLEVEL_DEBUG); $app->system->rename($homedir,$homedir.'_bak'); } - + // Move old directory to new path $app->system->rename($homedir_old,$homedir); $app->file->mkdirs($homedir, '0750'); $app->system->chown($homedir,$data['new']['puser']); $app->system->chgrp($homedir,$data['new']['pgroup']); - $app->system->web_folder_protection($web['document_root'], true); } else { if(!is_dir($homedir)){ - $app->system->web_folder_protection($web['document_root'], false); if(!is_dir($data['new']['dir'].'/home')){ $app->file->mkdirs($data['new']['dir'].'/home', '0755'); $app->system->chown($data['new']['dir'].'/home','root'); @@ -261,7 +274,6 @@ class shelluser_base_plugin { $app->file->mkdirs($homedir, '0750'); $app->system->chown($homedir,$data['new']['puser']); $app->system->chgrp($homedir,$data['new']['pgroup']); - $app->system->web_folder_protection($web['document_root'], true); } } $app->system->usermod($data['old']['username'], 0, $app->system->getgid($data['new']['pgroup']), $homedir, $data['new']['shell'], $data['new']['password'], $data['new']['username']); @@ -270,7 +282,6 @@ class shelluser_base_plugin { // call the ssh-rsa update function $app->uses("getconf"); $this->data = $data; - $this->app = $app; $this->_setup_ssh_rsa(); //* Create .bash_history file @@ -280,7 +291,7 @@ class shelluser_base_plugin { $app->system->chown($homedir.'/.bash_history', $data['new']['username']); $app->system->chgrp($homedir.'/.bash_history', $data['new']['pgroup']); } - + //* Create .profile file if(!is_file($data['new']['dir']).'/.profile') { $app->system->touch($homedir.'/.profile'); @@ -307,33 +318,41 @@ class shelluser_base_plugin { global $app, $conf; $app->uses('system,getconf,services'); - + $security_config = $app->getconf->get_security_config('permissions'); if($security_config['allow_shell_user'] != 'yes') { $app->log('Shell user plugin disabled by security settings.',LOGLEVEL_WARN); return false; } + if(is_file($data['old']['dir']) || is_link($data['old']['dir'])) { + $app->log('Shell user dir must not be existing file or symlink.', LOGLEVEL_WARN); + return false; + } elseif(!$app->system->is_allowed_path($data['old']['dir'])) { + $app->log('Shell user dir is not an allowed path: ' . $data['old']['dir'], LOGLEVEL_WARN); + return false; + } + if($app->system->is_user($data['old']['username'])) { // Get the UID of the user $userid = intval($app->system->getuid($data['old']['username'])); if($userid > $this->min_uid) { $web = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".intval($data['old']['parent_domain_id'])); - + // check if we have to delete the dir $check = $app->db->queryOneRecord('SELECT shell_user_id FROM `shell_user` WHERE `dir` = ?', $data['old']['dir']); if(!$check && is_dir($data['old']['dir'])) { - + $web = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ?", $data['old']['parent_domain_id']); $app->system->web_folder_protection($web['document_root'], false); - + // delete dir if($data['new']['chroot'] == 'jailkit') { $homedir = $data['old']['dir']; } else { $homedir = $data['old']['dir'].'/home/'.$data['old']['username']; } - + if(substr($homedir, -1) !== '/') $homedir .= '/'; $files = array('.bash_logout', '.bash_history', '.bashrc', '.profile'); $dirs = array('.ssh', '.cache'); @@ -359,17 +378,22 @@ class shelluser_base_plugin { } unset($files); unset($dirs); - + $app->system->web_folder_protection($web['document_root'], true); } - + // We delete only non jailkit users, jailkit users will be deleted by the jailkit plugin. if ($data['old']['chroot'] != "jailkit") { - // if this web uses PHP-FPM, that PPH-FPM service must be stopped before we can delete this user + // if this web uses PHP-FPM, that PHP-FPM service must be stopped before we can delete this user if($web['php'] == 'php-fpm'){ - if(trim($web['fastcgi_php_version']) != ''){ + if($web['server_php_id'] != 0){ $default_php_fpm = false; - list($custom_php_fpm_name, $custom_php_fpm_init_script, $custom_php_fpm_ini_dir, $custom_php_fpm_pool_dir) = explode(':', trim($web['fastcgi_php_version'])); + $tmp_php = $app->db->queryOneRecord('SELECT * FROM server_php WHERE server_php_id = ?', $web['server_php_id']); + if($tmp_php) { + $custom_php_fpm_ini_dir = $tmp_php['php_fpm_ini_dir']; + $custom_php_fpm_init_script = $tmp_php['php_fpm_init_script']; + if(substr($custom_php_fpm_ini_dir, -1) != '/') $custom_php_fpm_ini_dir .= '/'; + } } else { $default_php_fpm = true; } @@ -404,13 +428,13 @@ class shelluser_base_plugin { private function _setup_ssh_rsa() { global $app; - $this->app->log("ssh-rsa setup shelluser_base", LOGLEVEL_DEBUG); + $app->log("ssh-rsa setup shelluser_base", LOGLEVEL_DEBUG); // Get the client ID, username, and the key - $domain_data = $this->app->db->queryOneRecord('SELECT sys_groupid FROM web_domain WHERE web_domain.domain_id = ?', $this->data['new']['parent_domain_id']); - $sys_group_data = $this->app->db->queryOneRecord('SELECT * FROM sys_group WHERE sys_group.groupid = ?', $domain_data['sys_groupid']); + $domain_data = $app->db->queryOneRecord('SELECT sys_groupid FROM web_domain WHERE web_domain.domain_id = ?', $this->data['new']['parent_domain_id']); + $sys_group_data = $app->db->queryOneRecord('SELECT * FROM sys_group WHERE sys_group.groupid = ?', $domain_data['sys_groupid']); $id = intval($sys_group_data['client_id']); $username= $sys_group_data['name']; - $client_data = $this->app->db->queryOneRecord('SELECT * FROM client WHERE client.client_id = ?', $id); + $client_data = $app->db->queryOneRecord('SELECT * FROM client WHERE client.client_id = ?', $id); $userkey = $client_data['ssh_rsa']; unset($domain_data); unset($client_data); @@ -442,7 +466,7 @@ class shelluser_base_plugin { //Generate ssh-rsa-keys $app->uses('functions'); $app->functions->generate_ssh_key($id, $username); - $this->app->log("ssh-rsa keypair generated for ".$username, LOGLEVEL_DEBUG); + $app->log("ssh-rsa keypair generated for ".$username, LOGLEVEL_DEBUG); }; if (!file_exists($sshkeys)){ @@ -465,7 +489,7 @@ class shelluser_base_plugin { // add the user's key $app->system->file_put_contents($sshkeys, $final_keys); $app->file->remove_blank_lines($sshkeys); - $this->app->log("ssh-rsa authorisation keyfile created in ".$sshkeys, LOGLEVEL_DEBUG); + $app->log("ssh-rsa authorisation keyfile created in ".$sshkeys, LOGLEVEL_DEBUG); } //* Get the keys @@ -501,7 +525,7 @@ class shelluser_base_plugin { // add the custom key $app->system->file_put_contents($sshkeys, $final_keys); $app->file->remove_blank_lines($sshkeys); - $this->app->log("ssh-rsa key updated in ".$sshkeys, LOGLEVEL_DEBUG); + $app->log("ssh-rsa key updated in ".$sshkeys, LOGLEVEL_DEBUG); // set proper file permissions $app->system->exec_safe("chown -R ?:? ?", $this->data['new']['puser'], $this->data['new']['pgroup'], $sshdir); diff --git a/server/plugins-available/shelluser_jailkit_plugin.inc.php b/server/plugins-available/shelluser_jailkit_plugin.inc.php index 43d636500808fdc59fc9637a8c1128a73c985b68..dbc3d8041b22b72180cf49a9eb9a931f7454796c 100755 --- a/server/plugins-available/shelluser_jailkit_plugin.inc.php +++ b/server/plugins-available/shelluser_jailkit_plugin.inc.php @@ -59,11 +59,11 @@ class shelluser_jailkit_plugin { /* Register for the events */ - + $app->plugins->registerEvent('shell_user_insert', $this->plugin_name, 'insert'); $app->plugins->registerEvent('shell_user_update', $this->plugin_name, 'update'); $app->plugins->registerEvent('shell_user_delete', $this->plugin_name, 'delete'); - + } @@ -72,14 +72,14 @@ class shelluser_jailkit_plugin { global $app, $conf; $app->uses('system,getconf'); - + $security_config = $app->getconf->get_security_config('permissions'); if($security_config['allow_shell_user'] != 'yes') { $app->log('Shell user plugin disabled by security settings.',LOGLEVEL_WARN); return false; } - - + + $web = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ?", $data['new']['parent_domain_id']); if(!$app->system->is_allowed_user($data['new']['username'], false, false) @@ -89,11 +89,20 @@ class shelluser_jailkit_plugin { return false; } + if(is_file($data['new']['dir']) || is_link($data['new']['dir'])) { + $app->log('Shell user dir must not be existing file or symlink.', LOGLEVEL_WARN); + return false; + } elseif(!$app->system->is_allowed_path($data['new']['dir'])) { + $app->log('Shell user dir is not an allowed path: ' . $data['new']['dir'], LOGLEVEL_WARN); + return false; + } + + if($app->system->is_user($data['new']['puser'])) { // Get the UID of the parent user $uid = intval($app->system->getuid($data['new']['puser'])); if($uid > $this->min_uid) { - + if($app->system->is_user($data['new']['username'])) { /** @@ -107,8 +116,12 @@ class shelluser_jailkit_plugin { // load the server configuration options $app->uses("getconf"); $this->data = $data; - $this->app = $app; $this->jailkit_config = $app->getconf->get_server_config($conf["server_id"], 'jailkit'); + foreach (array('jailkit_chroot_app_sections', 'jailkit_chroot_app_programs') as $section) { + if (isset($web[$section]) && $web[$section] != '' ) { + $this->jailkit_config[$section] = $web[$section]; + } + } $this->_update_website_security_level(); @@ -128,6 +141,7 @@ class shelluser_jailkit_plugin { $app->system->exec_safe($command, $data['new']['username']); $this->_update_website_security_level(); + $app->system->web_folder_protection($web['document_root'], true); $app->log("Jailkit Plugin -> insert username:".$data['new']['username'], LOGLEVEL_DEBUG); } else { @@ -151,14 +165,12 @@ class shelluser_jailkit_plugin { global $app, $conf; $app->uses('system,getconf'); - + $security_config = $app->getconf->get_security_config('permissions'); if($security_config['allow_shell_user'] != 'yes') { $app->log('Shell user plugin disabled by security settings.',LOGLEVEL_WARN); return false; } - - $web = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ?", $data['new']['parent_domain_id']); if(!$app->system->is_allowed_user($data['new']['username'], false, false) || !$app->system->is_allowed_user($data['new']['puser'], true, true) @@ -167,12 +179,22 @@ class shelluser_jailkit_plugin { return false; } + if(is_file($data['new']['dir']) || is_link($data['new']['dir'])) { + $app->log('Shell user dir must not be existing file or symlink.', LOGLEVEL_WARN); + return false; + } elseif(!$app->system->is_allowed_path($data['new']['dir'])) { + $app->log('Shell user dir is not an allowed path: ' . $data['new']['dir'], LOGLEVEL_WARN); + return false; + } + if($app->system->is_user($data['new']['puser'])) { + $web = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ?", $data['new']['parent_domain_id']); + // Get the UID of the parent user $uid = intval($app->system->getuid($data['new']['puser'])); if($uid > $this->min_uid) { - - + + if($app->system->is_user($data['new']['username'])) { /** @@ -184,14 +206,19 @@ class shelluser_jailkit_plugin { // load the server configuration options $app->uses("getconf"); $this->data = $data; - $this->app = $app; $this->jailkit_config = $app->getconf->get_server_config($conf["server_id"], 'jailkit'); + foreach (array('jailkit_chroot_app_sections', 'jailkit_chroot_app_programs') as $section) { + if (isset($web[$section]) && $web[$section] != '' ) { + $this->jailkit_config[$section] = $web[$section]; + } + } $this->_update_website_security_level(); $app->system->web_folder_protection($web['document_root'], false); $this->_setup_jailkit_chroot(); + $this->_add_jailkit_user(); //* call the ssh-rsa update function @@ -224,65 +251,98 @@ class shelluser_jailkit_plugin { global $app, $conf; $app->uses('system,getconf'); - + $security_config = $app->getconf->get_security_config('permissions'); if($security_config['allow_shell_user'] != 'yes') { $app->log('Shell user plugin disabled by security settings.',LOGLEVEL_WARN); return false; } - $web = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ?", $data['old']['parent_domain_id']); + if(is_file($data['old']['dir']) || is_link($data['old']['dir'])) { + $app->log('Shell user dir must not be existing file or symlink.', LOGLEVEL_WARN); + return false; + } elseif(!$app->system->is_allowed_path($data['old']['dir'])) { + $app->log('Shell user dir is not an allowed path: ' . $data['old']['dir'], LOGLEVEL_WARN); + return false; + } if ($data['old']['chroot'] == "jailkit") { + $web = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ?", $data['old']['parent_domain_id']); + $app->uses("getconf"); $this->jailkit_config = $app->getconf->get_server_config($conf["server_id"], 'jailkit'); + foreach (array('jailkit_chroot_app_sections', 'jailkit_chroot_app_programs', 'jailkit_do_not_remove_paths') as $section) { + if (isset($web[$section]) && $web[$section] != '' ) { + $this->jailkit_config[$section] = $web[$section]; + } + } $jailkit_chroot_userhome = $this->_get_home_dir($data['old']['username']); $app->system->web_folder_protection($web['document_root'], false); - + $userid = intval($app->system->getuid($data['old']['username'])); $command = 'killall -u ? ; '; $command .= 'userdel -f ? &> /dev/null'; $app->system->exec_safe($command, $data['old']['username'], $data['old']['username']); - + // Remove the jailed user from passwd and shadow file inside the jail - $app->system->removeLine($data['old']['dir'].'/etc/passwd', $data['old']['username']); - $app->system->removeLine($data['old']['dir'].'/etc/shadow', $data['old']['username']); + $app->system->removeLine($data['old']['dir'].'/etc/passwd', $data['old']['username'].':'); + $app->system->removeLine($data['old']['dir'].'/etc/shadow', $data['old']['username'].':'); if(@is_dir($data['old']['dir'].$jailkit_chroot_userhome)) { $this->_delete_homedir($data['old']['dir'].$jailkit_chroot_userhome,$userid,$data['old']['parent_domain_id']); - + $app->log("Jailkit Plugin -> delete chroot home:".$data['old']['dir'].$jailkit_chroot_userhome, LOGLEVEL_DEBUG); } + if (isset($web['delete_unused_jailkit']) && $web['delete_unused_jailkit'] == 'y') { + $this->_delete_jailkit_if_unused($web['domain_id']); + } + $app->system->web_folder_protection($web['document_root'], true); } $app->log("Jailkit Plugin -> delete username:".$data['old']['username'], LOGLEVEL_DEBUG); - } function _setup_jailkit_chroot() { - global $app; + global $app, $conf; - //check if the chroot environment is created yet if not create it with a list of program sections from the config + if (isset($this->jailkit_config) && isset($this->jailkit_config['jailkit_hardlinks'])) { + if ($this->jailkit_config['jailkit_hardlinks'] == 'yes') { + $options = array('hardlink'); + } elseif ($this->jailkit_config['jailkit_hardlinks'] == 'no') { + $options = array(); + } + } else { + $options = array('allow_hardlink'); + } + + $web = $app->db->queryOneRecord("SELECT domain, last_jailkit_hash FROM web_domain WHERE domain_id = ?", $this->data['new']["parent_domain_id"]); + + $last_updated = preg_split('/[\s,]+/', $this->jailkit_config['jailkit_chroot_app_sections'] + .' '.$this->jailkit_config['jailkit_chroot_app_programs'] + .' '.$this->jailkit_config['jailkit_chroot_cron_programs']); + $last_updated = array_unique($last_updated, SORT_REGULAR); + sort($last_updated, SORT_STRING); + $update_hash = hash('md5', implode(' ', $last_updated)); + + // should move return here if $update_hash == $web['last_jailkit_hash'] ? + + // check if the chroot environment is created yet if not create it with a list of program sections from the config if (!is_dir($this->data['new']['dir'].'/etc/jailkit')) { - $app->system->create_jailkit_chroot($this->data['new']['dir'], $this->jailkit_config['jailkit_chroot_app_sections']); - $this->app->log("Added jailkit chroot", LOGLEVEL_DEBUG); - - $this->_add_jailkit_programs(); + $app->system->create_jailkit_chroot($this->data['new']['dir'], $this->jailkit_config['jailkit_chroot_app_sections'], $options); + $app->log("Added jailkit chroot", LOGLEVEL_DEBUG); - //add bash.bashrc script - //we need to collect the domain name to be used as the HOSTNAME in the bashrc script - $web = $this->app->db->queryOneRecord("SELECT domain FROM web_domain WHERE domain_id = ?", $this->data['new']["parent_domain_id"]); + $this->_add_jailkit_programs($options); - $this->app->load('tpl'); + $app->load('tpl'); $tpl = new tpl(); $tpl->newTemplate("bash.bashrc.master"); @@ -297,7 +357,7 @@ class shelluser_jailkit_plugin { file_put_contents($bashrc, $tpl->grab()); unset($tpl); - $this->app->log("Added bashrc script: ".$bashrc, LOGLEVEL_DEBUG); + $app->log("Added bashrc script: ".$bashrc, LOGLEVEL_DEBUG); $tpl = new tpl(); $tpl->newTemplate("motd.master"); @@ -309,20 +369,42 @@ class shelluser_jailkit_plugin { $app->system->file_put_contents($motd, $tpl->grab()); + } else { + // force update existing jails + $options[] = 'force'; + + $sections = $this->jailkit_config['jailkit_chroot_app_sections']; + $programs = $this->jailkit_config['jailkit_chroot_app_programs'] . ' ' + . $this->jailkit_config['jailkit_chroot_cron_programs']; + + if ($update_hash == $web['last_jailkit_hash']) { + return; + } + + $records = $app->db->queryAllRecords('SELECT web_folder FROM `web_domain` WHERE `parent_domain_id` = ? AND `document_root` = ? AND web_folder != \'\' AND web_folder IS NOT NULL AND `server_id` = ?', $this->data['new']['parent_domain_id'], $this->data['new']['dir'], $conf['server_id']); + foreach ($records as $record) { + $options[] = 'skip='.$record['web_folder']; + } + + $app->system->update_jailkit_chroot($this->data['new']['dir'], $sections, $programs, $options); } + + // this gets last_jailkit_update out of sync with master db, but that is ok, + // as it is only used as a timestamp to moderate the frequency of updating on the slaves + $app->db->query("UPDATE `web_domain` SET `last_jailkit_update` = NOW(), `last_jailkit_hash` = ? WHERE `document_root` = ?", $update_hash, $this->data['new']['dir']); } - function _add_jailkit_programs() + function _add_jailkit_programs($opts=array()) { global $app; $jailkit_chroot_app_programs = preg_split("/[\s,]+/", $this->jailkit_config['jailkit_chroot_app_programs']); if(is_array($jailkit_chroot_app_programs) && !empty($jailkit_chroot_app_programs)){ foreach($jailkit_chroot_app_programs as $jailkit_chroot_app_program){ $jailkit_chroot_app_program = trim($jailkit_chroot_app_program); - if(is_file($jailkit_chroot_app_program) || is_dir($jailkit_chroot_app_program)){ + if(is_file($jailkit_chroot_app_program) || is_dir($jailkit_chroot_app_program)){ //copy over further programs and its libraries - $app->system->create_jailkit_programs($this->data['new']['dir'], $jailkit_chroot_app_program); - $this->app->log("Added programs to jailkit chroot", LOGLEVEL_DEBUG); + $app->system->create_jailkit_programs($this->data['new']['dir'], $jailkit_chroot_app_program, $opts); + $app->log("Added programs to jailkit chroot", LOGLEVEL_DEBUG); } } } @@ -337,7 +419,7 @@ class shelluser_jailkit_plugin { { global $app; - //add the user to the chroot + // add the user to the chroot $jailkit_chroot_userhome = $this->_get_home_dir($this->data['new']['username']); if(isset($this->data['old']['username'])) { $jailkit_chroot_userhome_old = $this->_get_home_dir($this->data['old']['username']); @@ -346,7 +428,7 @@ class shelluser_jailkit_plugin { } $jailkit_chroot_puserhome = $this->_get_home_dir($this->data['new']['puser']); - if(!is_dir($this->data['new']['dir'].'/etc')) mkdir($this->data['new']['dir'].'/etc', 0755); + if(!is_dir($this->data['new']['dir'].'/etc')) $app->system->mkdir($this->data['new']['dir'].'/etc', 0755, true); if(!is_file($this->data['new']['dir'].'/etc/passwd')) touch($this->data['new']['dir'].'/etc/passwd', 0755); // IMPORTANT! @@ -357,7 +439,7 @@ class shelluser_jailkit_plugin { $shell = '/usr/sbin/jk_chrootsh'; if($this->data['new']['active'] != 'y') $shell = '/bin/false'; - + $app->system->usermod($this->data['new']['username'], 0, 0, $this->data['new']['dir'].'/.'.$jailkit_chroot_userhome, $shell); $app->system->usermod($this->data['new']['puser'], 0, 0, $this->data['new']['dir'].'/.'.$jailkit_chroot_puserhome, '/usr/sbin/jk_chrootsh'); @@ -365,19 +447,19 @@ class shelluser_jailkit_plugin { if(is_dir($this->data['old']['dir'].$jailkit_chroot_userhome_old)) { $app->system->rename($this->data['old']['dir'].$jailkit_chroot_userhome_old,$this->data['new']['dir'].$jailkit_chroot_userhome); } else { - mkdir($this->data['new']['dir'].$jailkit_chroot_userhome, 0750, true); + $app->system->mkdir($this->data['new']['dir'].$jailkit_chroot_userhome, 0750, true); } } $app->system->chown($this->data['new']['dir'].$jailkit_chroot_userhome, $this->data['new']['username']); $app->system->chgrp($this->data['new']['dir'].$jailkit_chroot_userhome, $this->data['new']['pgroup']); - $this->app->log("Added created jailkit user home in : ".$this->data['new']['dir'].$jailkit_chroot_userhome, LOGLEVEL_DEBUG); + $app->log("Added created jailkit user home in : ".$this->data['new']['dir'].$jailkit_chroot_userhome, LOGLEVEL_DEBUG); if(!is_dir($this->data['new']['dir'].$jailkit_chroot_puserhome)) mkdir($this->data['new']['dir'].$jailkit_chroot_puserhome, 0750, true); $app->system->chown($this->data['new']['dir'].$jailkit_chroot_puserhome, $this->data['new']['puser']); $app->system->chgrp($this->data['new']['dir'].$jailkit_chroot_puserhome, $this->data['new']['pgroup']); - $this->app->log("Added jailkit parent user home in : ".$this->data['new']['dir'].$jailkit_chroot_puserhome, LOGLEVEL_DEBUG); + $app->log("Added jailkit parent user home in : ".$this->data['new']['dir'].$jailkit_chroot_puserhome, LOGLEVEL_DEBUG); } @@ -406,13 +488,13 @@ class shelluser_jailkit_plugin { private function _setup_ssh_rsa() { global $app; - $this->app->log("ssh-rsa setup shelluser_jailkit", LOGLEVEL_DEBUG); + $app->log("ssh-rsa setup shelluser_jailkit", LOGLEVEL_DEBUG); // Get the client ID, username, and the key - $domain_data = $this->app->db->queryOneRecord('SELECT sys_groupid FROM web_domain WHERE web_domain.domain_id = ?', $this->data['new']['parent_domain_id']); - $sys_group_data = $this->app->db->queryOneRecord('SELECT * FROM sys_group WHERE sys_group.groupid = ?', $domain_data['sys_groupid']); + $domain_data = $app->db->queryOneRecord('SELECT sys_groupid FROM web_domain WHERE web_domain.domain_id = ?', $this->data['new']['parent_domain_id']); + $sys_group_data = $app->db->queryOneRecord('SELECT * FROM sys_group WHERE sys_group.groupid = ?', $domain_data['sys_groupid']); $id = intval($sys_group_data['client_id']); $username= $sys_group_data['name']; - $client_data = $this->app->db->queryOneRecord('SELECT * FROM client WHERE client.client_id = ?', $id); + $client_data = $app->db->queryOneRecord('SELECT * FROM client WHERE client.client_id = ?', $id); $userkey = $client_data['ssh_rsa']; unset($domain_data); unset($client_data); @@ -432,8 +514,8 @@ class shelluser_jailkit_plugin { //Generate ssh-rsa-keys $app->uses('functions'); $app->functions->generate_ssh_key($id, $username); - - $this->app->log("ssh-rsa keypair generated for ".$username, LOGLEVEL_DEBUG); + + $app->log("ssh-rsa keypair generated for ".$username, LOGLEVEL_DEBUG); }; if (!file_exists($sshkeys)){ @@ -457,10 +539,13 @@ class shelluser_jailkit_plugin { // add the user's key file_put_contents($sshkeys, $final_keys); $app->file->remove_blank_lines($sshkeys); - $this->app->log("ssh-rsa authorisation keyfile created in ".$sshkeys, LOGLEVEL_DEBUG); + $app->log("ssh-rsa authorisation keyfile created in ".$sshkeys, LOGLEVEL_DEBUG); } //* Get the keys $existing_keys = file($sshkeys, FILE_IGNORE_NEW_LINES); + if(!$existing_keys) { + $existing_keys = array(); + } $new_keys = explode("\n", $sshrsa); $old_keys = explode("\n", $this->data['old']['ssh_rsa']); @@ -492,7 +577,7 @@ class shelluser_jailkit_plugin { // add the custom key $app->system->file_put_contents($sshkeys, $final_keys); $app->file->remove_blank_lines($sshkeys); - $this->app->log("ssh-rsa key updated in ".$sshkeys, LOGLEVEL_DEBUG); + $app->log("ssh-rsa key updated in ".$sshkeys, LOGLEVEL_DEBUG); // set proper file permissions $app->system->exec_safe("chown -R ?:? ?", $this->data['new']['puser'], $this->data['new']['pgroup'], $sshdir); @@ -500,17 +585,17 @@ class shelluser_jailkit_plugin { $app->system->exec_safe("chmod 600 ?", $sshkeys); } - + private function _delete_homedir($homedir,$userid,$parent_domain_id) { global $app, $conf; - + // check if we have to delete the dir $check = $app->db->queryOneRecord('SELECT shell_user_id FROM `shell_user` WHERE `dir` = ?', $homedir); - + if(!$check && is_dir($homedir)) { $web = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ?", $parent_domain_id); $app->system->web_folder_protection($web['document_root'], false); - + // delete dir if(substr($homedir, -1) !== '/') $homedir .= '/'; $files = array('.bash_logout', '.bash_history', '.bashrc', '.profile'); @@ -537,10 +622,49 @@ class shelluser_jailkit_plugin { } unset($files); unset($dirs); - + $app->system->web_folder_protection($web['document_root'], true); } - + + } + + private function _delete_jailkit_if_unused($parent_domain_id) { + global $app, $conf; + + // get jail directory + $parent_domain = $app->db->queryOneRecord("SELECT * FROM `web_domain` WHERE `domain_id` = ? OR `parent_domain_id` = ? AND `document_root` IS NOT NULL", $parent_domain_id, $parent_domain_id); + if (!is_dir($parent_domain['document_root'])) { + return; + } + + // chroot is used by php-fpm + if (isset($parent_domain['php_fpm_chroot']) && $parent_domain['php_fpm_chroot'] == 'y') { + return; + } + + // check for any shell_user using this jail + $inuse = $app->db->queryOneRecord('SELECT shell_user_id FROM `shell_user` WHERE `parent_domain_id` = ? AND `chroot` = ?', $parent_domain_id, 'jailkit'); + if($inuse) { + return; + } + + // check for any cron job using this jail + $inuse = $app->db->queryOneRecord('SELECT id FROM `cron` WHERE `parent_domain_id` = ? AND `type` = ?', $parent_domain_id, 'chrooted'); + if($inuse) { + return; + } + + $options = array(); + $records = $app->db->queryAllRecords('SELECT web_folder FROM `web_domain` WHERE `parent_domain_id` = ? AND `document_root` = ? AND web_folder != \'\' AND web_folder IS NOT NULL AND `server_id` = ?', $parent_domain_id, $parent_domain['document_root'], $conf['server_id']); + foreach ($records as $record) { + $options[] = 'skip='.$record['web_folder']; + } + + $app->system->delete_jailkit_chroot($parent_domain['document_root'], $options); + + // this gets last_jailkit_update out of sync with master db, but that is ok, + // as it is only used as a timestamp to moderate the frequency of updating on the slaves + $app->db->query("UPDATE `web_domain` SET `last_jailkit_update` = NOW(), `last_jailkit_hash` = NULL WHERE `document_root` = ?", $parent_domain['document_root']); } } // end class diff --git a/server/plugins-available/software_update_plugin.inc.php b/server/plugins-available/software_update_plugin.inc.php index 2626d1e75695bcefb79605ed7ae77e211a1755dd..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 @@ -289,6 +62,11 @@ class software_update_plugin { $app->log('Execeuted Debian / Ubuntu update', LOGLEVEL_DEBUG); } + //** Redhat, CentOS, Fedora + if(file_exists('/etc/redhat-release')) { + exec("which dnf &> /dev/null && dnf -y update || yum -y update"); + } + //** Gentoo Linux if(file_exists('/etc/gentoo-release')) { exec("glsa-check -f --nocolor affected"); diff --git a/server/plugins-available/webserver_plugin.inc.php b/server/plugins-available/webserver_plugin.inc.php index cca339ace01a5f123e6dd9167c568343d1906eed..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,6 +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'); } /** @@ -89,20 +99,26 @@ class webserver_plugin { //** add default php.ini files to check $check_files[] = array('file' => $web_config['php_ini_path_apache'], 'mode' => 'mod', - 'php_version' => ''); // default; - - $check_files[] = array('file' => $web_config['php_ini_path_cgi'], - 'mode' => '', // all but 'mod' and 'fast-cgi' - 'php_version' => ''); // default; + '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', - 'php_version' => ''); // default; + 'php_version' => 0); // default; } else { $check_files[] = array('file' => $web_config['php_ini_path_cgi'], 'mode' => 'fast-cgi', // all but 'mod' - 'php_version' => ''); // default; + '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; } @@ -112,11 +128,12 @@ class webserver_plugin { if($php['php_fastcgi_ini_dir'] && $php['php_fastcgi_ini_dir'] . '/php.ini' != $web_config['php_ini_path_cgi']) { $check_files[] = array('file' => $php['php_fastcgi_ini_dir'] . '/php.ini', 'mode' => 'fast-cgi', - 'php_version' => $php['php_fastcgi_ini_dir']); - } elseif($php['php_fpm_ini_dir'] && $php['php_fpm_ini_dir'] . '/php.ini' != $web_config['php_ini_path_cgi']) { + 'php_version' => $php['server_php_id']); + } + 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['php_fpm_ini_dir']); + 'php_version' => $php['server_php_id']); } } unset($php_versions); @@ -133,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']; @@ -144,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) { @@ -157,13 +186,168 @@ 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. + */ + function server_update($event_name, $data) { + global $app, $conf; + + // load the server configuration options + $app->uses('ini_parser,system'); + + $old = $app->ini_parser->parse_ini_string($data['old']['config']); + $new = $app->ini_parser->parse_ini_string($data['new']['config']); + if (is_array($old) && is_array($new) && isset($old['jailkit']) && isset($new['jailkit'])) { + $old = $old['jailkit']; + $new = $new['jailkit']; + } else { + $app->log('server_update: could not parse jailkit section of server config.', LOGLEVEL_WARN); + return; + } + + $hardlink_mode_changed = (boolean)(($old['jailkit_hardlinks'] != $new['jailkit_hardlinks']) && $new['jailkit_hardlinks'] != 'allow'); + + if (($old['jailkit_chroot_app_sections'] != $new['jailkit_chroot_app_sections']) || + ($old['jailkit_chroot_app_programs'] != $new['jailkit_chroot_app_programs']) || + ($old['jailkit_chroot_cron_programs'] != $new['jailkit_chroot_cron_programs']) || + ($hardlink_mode_changed && $new['jailkit_hardlinks'] != 'allow')) + { + $app->log('Jailkit config has changed, scheduling affected chroot jails to be updated.', LOGLEVEL_DEBUG); + + $web_domains = $app->db->queryAllRecords("SELECT * FROM web_domain WHERE type = 'vhost' AND server_id = ?", $conf['server_id']); + + foreach ($web_domains as $web) { + // we could check (php_fpm_chroot == y || jailkit shell user exists || jailkit cron exists), + // but will just shortcut the db checks to see if jailkit was setup previously: + if (!is_dir($web['document_root'].'/etc/jailkit')) { + continue; + } + + if ($hardlink_mode_changed || + // chroot cron programs changed + ($old['jailkit_chroot_cron_programs'] != $new['jailkit_chroot_cron_programs']) || + // jailkit sections changed and website does not overwrite + (($old['jailkit_chroot_app_sections'] != $new['jailkit_chroot_app_sections']) && + (!(isset($web['jailkit_chroot_app_sections']) && $web['jailkit_chroot_app_sections'] != '' ))) || + // jailkit apps changed and website does not overwrite + (($old['jailkit_chroot_app_programs'] != $new['jailkit_chroot_app_programs']) && + (!(isset($web['jailkit_chroot_app_programs']) && $web['jailkit_chroot_app_programs'] != '' )))) + { + + $sections = $new['jailkit_chroot_app_sections']; + if (isset($web['jailkit_chroot_app_sections']) && $web['jailkit_chroot_app_sections'] != '' ) { + $sections = $web['jailkit_chroot_app_sections']; + } + + $programs = $new['jailkit_chroot_app_programs']; + if (isset($web['jailkit_chroot_app_sections']) && $web['jailkit_chroot_app_sections'] != '' ) { + $programs = $web['jailkit_chroot_app_sections']; + } + + if (isset($new['jailkit_hardlinks'])) { + if ($new['jailkit_hardlinks'] == 'yes') { + $options = array('hardlink'); + } elseif ($new['jailkit_hardlinks'] == 'no') { + $options = array(); + } + } else { + $options = array('allow_hardlink'); + } + + $options[] = 'force'; + + // we could add a server config setting to allow updating these immediately: + // $app->system->update_jailkit_chroot($new['document_root'], $sections, $programs, $options); + // + // but to mitigate disk contention, will just queue "update needed" + // for jailkit maintenance cronjob via last_jailkit_update timestamp + $app->db->query("UPDATE `web_domain` SET `last_jailkit_update` = FROM_UNIXTIME(0) WHERE `document_root` = ?", $web['document_root']); + } + } + } + + $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/plugins-available/website_symlink_plugin.inc.php b/server/plugins-available/website_symlink_plugin.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..a17732c5e4abcceb1ecdc96f73f98387d0e21c63 --- /dev/null +++ b/server/plugins-available/website_symlink_plugin.inc.php @@ -0,0 +1,80 @@ + ../../web + */ +class website_symlink_plugin { + + var $plugin_name = 'website_symlink_plugin'; + var $class_name = 'website_symlink_plugin'; + + public function onInstall() { + global $conf; + + // Enable the following code section to activate the plugin automatically at install time + /* + if ($conf['services']['web'] == true) { + return true; + } + */ + + return false; + } + + public function onLoad() { + global $app; + + $app->plugins->registerEvent('web_domain_insert', $this->plugin_name, 'createSymlinkForWebDomain'); + $app->plugins->registerEvent('web_domain_update', $this->plugin_name, 'createSymlinkForWebDomain'); + + $app->plugins->registerEvent('shell_user_insert', $this->plugin_name, 'createSymlinkForShellUser'); + $app->plugins->registerEvent('shell_user_update', $this->plugin_name, 'createSymlinkForShellUser'); + } + + public function createSymlinkForWebDomain($event_name, $data) { + $homeDirectories = glob(sprintf('%s/home', $data['new']['document_root']) . '/*', GLOB_ONLYDIR); + + foreach ($homeDirectories as $dir) { + $target = sprintf('%s/web', $data['new']['document_root']); + $link = sprintf('%s/website', $dir); + + $this->createSymlink($target, $link); + } + } + + public function createSymlinkForShellUser($event_name, $data) { + $target = sprintf('%s/web', $data['new']['dir']); + $link = sprintf('%s/home/%s/website', $data['new']['dir'], $data['new']['username']); + + $this->createSymlink($target, $link); + } + + private function createSymlink($target, $link) { + global $app; + + if (file_exists($link)) { + $app->log(sprintf('Not creating symlink because "%s" already exists', $link), LOGLEVEL_DEBUG); + + return; + } + + if ($app->system->create_relative_link($target, $link)) { + $app->log(sprintf('Created symlink from "%s" to "%s"', $link, $target), LOGLEVEL_DEBUG); + } else { + $app->log(sprintf('Failed to create symlink from "%s" to "%s"', $link, $target), LOGLEVEL_WARN); + } + } +} \ No newline at end of file diff --git a/server/plugins-available/z_php_fpm_incron_reload_plugin.inc.php b/server/plugins-available/z_php_fpm_incron_reload_plugin.inc.php index f88cbe9c0b4cdc20f6e653acd25ba2fbaccf6e3d..628abe0a2d8d3187ec1d13c30e85549404b2b045 100644 --- a/server/plugins-available/z_php_fpm_incron_reload_plugin.inc.php +++ b/server/plugins-available/z_php_fpm_incron_reload_plugin.inc.php @@ -45,8 +45,8 @@ class z_php_fpm_incron_reload_plugin { function incronUpdate($eventName, $data) { global $app; - if ($data['new']['document_root'] === $data['old']['document_root']) { - $app->log('Document root unchanged. Not updating incron configuration.', LOGLEVEL_DEBUG); + if ($this->documentRootUnchanged($data) && $this->phpVersionUnchanged($data)) { + $app->log('Document root and PHP version unchanged. Not updating incron configuration.', LOGLEVEL_DEBUG); return; } @@ -59,6 +59,16 @@ class z_php_fpm_incron_reload_plugin { $this->teardown($data['old']); } + private function documentRootUnchanged($data) + { + return $data['new']['document_root'] === $data['old']['document_root']; + } + + private function phpVersionUnchanged($data) + { + return $data['new']['server_php_id'] === $data['old']['server_php_id']; + } + private function setup($data) { $triggerFile = $this->getTriggerFilePath($data['document_root']); @@ -67,7 +77,7 @@ class z_php_fpm_incron_reload_plugin { $this->createIncronConfiguration( $triggerFile, $data['system_user'], - $data['fastcgi_php_version'] + $data['server_php_id'] ); $this->restartIncronService(); @@ -96,7 +106,7 @@ class z_php_fpm_incron_reload_plugin { $app->uses('getconf'); $serverConfig = $app->getconf->get_server_config($conf['server_id'], 'web'); - return $serverConfig['php_fpm_incron_reload'] === 'y'; + return (isset($serverConfig['php_fpm_incron_reload']) && $serverConfig['php_fpm_incron_reload'] === 'y'); } private function createIncronConfiguration($triggerFile, $systemUser, $fastcgiPhpVersion) { @@ -163,12 +173,14 @@ class z_php_fpm_incron_reload_plugin { } private function getPhpService($fastcgiPhpVersion) { - $phpInfo = explode(':', $fastcgiPhpVersion); + global $app; + + $phpInfo = $app->db->queryOneRecord('SELECT * FROM server_php WHERE server_php_id = ?', $fastcgiPhpVersion); if (empty($phpInfo)) { return null; } - $phpService = $phpInfo[1]; + $phpService = $phpInfo['php_fpm_init_script']; if (empty($phpService)) { return null; } diff --git a/server/scripts/create_jailkit_chroot.sh b/server/scripts/create_jailkit_chroot.sh index cc39b6e4cf1767d9a93c4db5b657c46c06cce891..dc0f948735abcbb73639094683fbb77c8e16a455 100755 --- a/server/scripts/create_jailkit_chroot.sh +++ b/server/scripts/create_jailkit_chroot.sh @@ -21,7 +21,7 @@ CHROOT_APP_SECTIONS=$2 chown root:root $CHROOT_HOMEDIR ## Initialize the chroot into the specified directory with the specified applications -jk_init -f -k -c /etc/jailkit/jk_init.ini -j $CHROOT_HOMEDIR $CHROOT_APP_SECTIONS +jk_init -f -c /etc/jailkit/jk_init.ini -j $CHROOT_HOMEDIR $CHROOT_APP_SECTIONS ## Create the temp directory if [ ! -d "$CHROOT_HOMEDIR/tmp" ] diff --git a/server/scripts/create_jailkit_programs.sh b/server/scripts/create_jailkit_programs.sh index 11641f2c1ff506db996cb3063b2cefb41f985ff7..62ea1b2dc9a3377b01e3f7fb7ebf5a3e9311687a 100755 --- a/server/scripts/create_jailkit_programs.sh +++ b/server/scripts/create_jailkit_programs.sh @@ -17,4 +17,4 @@ fi CHROOT_HOMEDIR=$1 CHROOT_APP_PROGRAMS=$2 -jk_cp -k $CHROOT_HOMEDIR $CHROOT_APP_PROGRAMS +jk_cp -j $CHROOT_HOMEDIR $CHROOT_APP_PROGRAMS diff --git a/server/scripts/handle_mailbox_soft_deleted.sh b/server/scripts/handle_mailbox_soft_deleted.sh new file mode 100644 index 0000000000000000000000000000000000000000..7c7f280839d31233adabfd39832ed089e5fc66d3 --- /dev/null +++ b/server/scripts/handle_mailbox_soft_deleted.sh @@ -0,0 +1,49 @@ +#!/bin/bash + +# Archive directories for deleted mailboxes. +delay_days=7 + +# Test if there is something to do... to avoid 'No such file or directory' from find later. +ls /var/vmail/*/[a-z0-9.-]*-deleted-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] >/dev/null 2>&1 +if [ $? != 0 ]; then + exit 0; +fi + +function remove_soft_deleted_mailbox { + dir=$1 + + echo "Purging $dir" + rm -r "$dir" +} + +function compress_soft_deleted_mailbox { + dir=$1 + + backupfile="${dir}.tar.bz2" + + # Test if backup file already exists + if [ -f $backupfile ]; then + # Skip + echo "ERROR: Backupfile($backupfile) exists!" >&2 + continue + fi + + echo "Compressing for $dir" + tar cvfj "$backupfile" --remove-files "$dir" 2> >( grep -v "tar: Removing leading" >&2) +} + +# List deleted mailboxs to archive +# -mtime +7 ===> Only mailboxes deleted more then 7 days ago +# Test that the last dir component matches e.g. xxx-deleted-20220101094242 (14 digits) +# command: xxx-`date "+%Y%m%d%H%M%S"` +find /var/vmail/*/[a-z0-9.-]*-deleted-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] -maxdepth 0 -type d -mtime +$delay_days | while read line; do + # example $line: "/var/vmail/example.com/info-20220101094242" + + dir=$line + + # Uncomment the desired cleanup method below, or be creative and create your own. + + remove_soft_deleted_mailbox $dir + #compress_soft_deleted_mailbox $dir + +done diff --git a/server/scripts/ispconfig_patch b/server/scripts/ispconfig_patch index 4470552c137e7c5fc5c0ee62178c8492a2a463a4..c2adef9661e26aad3cd0befff21c2f5244c47226 100644 --- a/server/scripts/ispconfig_patch +++ b/server/scripts/ispconfig_patch @@ -44,7 +44,7 @@ function swriteln($text = '') { } function simple_query($query, $answers, $default) -{ +{ $finished = false; do { if(is_array($answers)) { @@ -54,25 +54,25 @@ function simple_query($query, $answers, $default) swrite($query.': '); } $input = sread(); - + //* Stop the installation if($input == 'quit') { swriteln("Patch terminated by user.\n"); die(); } - + //* Select the default if($input == '') { $answer = $default; $finished = true; } - + //* Set answer id valid if(!is_array($answers) || in_array($input, $answers)) { $answer = $input; $finished = true; } - + } while ($finished == false); swriteln(); return $answer; @@ -97,9 +97,9 @@ if(isset($cmd_opt['patch_id'])) { } echo "\n\n".str_repeat('-',80)."\n"; -echo " _____ ___________ _____ __ _ -|_ _/ ___| ___ \ / __ \ / _(_) - | | \ `--.| |_/ / | / \/ ___ _ __ | |_ _ __ _ +echo " _____ ___________ _____ __ _ +|_ _/ ___| ___ \ / __ \ / _(_) + | | \ `--.| |_/ / | / \/ ___ _ __ | |_ _ __ _ | | `--. \ __/ | | / _ \| '_ \| _| |/ _` | _| |_/\__/ / | | \__/\ (_) | | | | | | | (_| | \___/\____/\_| \____/\___/|_| |_|_| |_|\__, | @@ -127,13 +127,13 @@ if($patch_id == '') { die(); } -$patch_data = @file_get_contents('http://ispconfig.org/downloads/patches/' . $patch_id . '.diff'); +$patch_data = @file_get_contents('https://ispconfig.org/downloads/patches/' . $patch_id . '.diff'); if(!$patch_data) { swriteln("Patch with id " . $patch_id . " does not exist.\n"); die(); } -$patch_text = @file_get_contents('http://ispconfig.org/downloads/patches/' . $patch_id . '.txt'); +$patch_text = @file_get_contents('https://ispconfig.org/downloads/patches/' . $patch_id . '.txt'); if($patch_text) { if($auto) { $ok = 'y'; diff --git a/server/scripts/ispconfig_update.php b/server/scripts/ispconfig_update.php index 2c77607b6576a44bf8fb0a6ca70c9a4f3d94d214..ed416b6efa2d1e036c47ff9020ff5bba279e5f85 100644 --- a/server/scripts/ispconfig_update.php +++ b/server/scripts/ispconfig_update.php @@ -86,27 +86,20 @@ echo " _____ ___________ _____ __ _ |___/ "; echo "\n".str_repeat('-', 80)."\n"; echo "\n\n>> Update \n\n"; -echo "Please choose the update method. For production systems select 'stable'. \nWARNING: The update from GIT is only for development systems and may break your current setup. Do not use the GIT version on servers that host any live websites!\nNote: Update all slave server, before you update master server.\n\n"; +echo "Please choose the update method. For production systems select 'stable'. \nWARNING: The update from GIT is only for development systems and may break your current setup. Do not use the GIT version on servers that host any live websites!\nNote: On Multiserver systems, enable maintenance mode and update your master server first. Then update all slave servers, and disable maintenance mode when all servers are updated.\n\n"; -$method = simple_query('Select update method', array('stable', 'git-stable', 'git-master'), 'stable'); +$method = simple_query('Select update method', array('stable', 'nightly', 'git-develop'), 'stable'); if($method == 'stable') { $new_version = @file_get_contents('https://www.ispconfig.org/downloads/ispconfig3_version.txt') or die('Unable to retrieve version file.'); $new_version = trim($new_version); - if(version_compare($new_version, ISPC_APP_VERSION, '>')) { - passthru('/usr/local/ispconfig/server/scripts/update_stable.sh'); - exit; - } else { + if(version_compare($new_version, ISPC_APP_VERSION, '<=') && !in_array('--force', $argv, true)) { echo "There are no updates available for ISPConfig ".ISPC_APP_VERSION."\n"; + echo "If you are sure you want to update to stable anyway, please use --force parameter\n"; + echo "DOWNGRADING MAY CAUSE ISSUES!\n"; + exit(1); } -} elseif ($method == 'git-stable') { - passthru('/usr/local/ispconfig/server/scripts/update_from_dev_stable.sh'); - exit; -} else { - passthru('/usr/local/ispconfig/server/scripts/update_from_dev.sh'); - exit; } - - -?> +passthru('/usr/local/ispconfig/server/scripts/update_runner.sh ' . escapeshellarg($method)); +exit; diff --git a/server/scripts/ispconfig_update.sh b/server/scripts/ispconfig_update.sh index fc3450663449adec1cf5ed05922104e93de8e465..bc7e0ef754208a9edbaadbe9ae3e5ec1104407ea 100644 --- a/server/scripts/ispconfig_update.sh +++ b/server/scripts/ispconfig_update.sh @@ -20,7 +20,7 @@ then then cp -p ${n} ${n}.exec chmod +x ${n}.exec - exec ${n}.exec + exec ${n}.exec "$@" else # clean up tmp .exec file if [ "$(basename ${0})" == "ispconfig_update.sh.exec" ]; then @@ -31,7 +31,7 @@ then -d disable_classes= \ -d disable_functions= \ -d open_basedir= \ - /usr/local/ispconfig/server/scripts/ispconfig_update.php + /usr/local/ispconfig/server/scripts/ispconfig_update.php "$@" fi fi diff --git a/server/scripts/letsencrypt_post_hook.sh b/server/scripts/letsencrypt_post_hook.sh new file mode 100644 index 0000000000000000000000000000000000000000..caef1e2d210d2799a7765268994da39cc1226300 --- /dev/null +++ b/server/scripts/letsencrypt_post_hook.sh @@ -0,0 +1,60 @@ +#!/bin/bash + +### BEGIN INIT INFO +# Provides: LETSENCRYPT POST HOOK SCRIPT +# Required-Start: $local_fs $network +# Required-Stop: $local_fs +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: LETSENCRYPT POST HOOK SCRIPT +# Description: To force close http port 80 if it is by default closed, to be used by letsencrypt client standlone command +### END INIT INFO + +## 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. +## +## Eg. you can override the ispc_letsencrypt_firewall_disable() function then 'return 124' +## to customize the firewall setup. +if [ -e "/usr/local/ispconfig/server/conf-custom/scripts/letsencrypt_post_hook.sh" ] ; then + . /usr/local/ispconfig/server/conf-custom/scripts/letsencrypt_post_hook.sh + ret=$? + if [ $ret != 124 ]; then exit $ret; fi +fi + +declare -F ispc_letsencrypt_firewall_disable &>/dev/null || ispc_letsencrypt_firewall_disable() { + # delete 'ispc-letsencrypt' chain + iptables -D INPUT -p tcp --dport 80 -j ispc-letsencrypt + iptables -F ispc-letsencrypt + iptables -X ispc-letsencrypt +} + +ispc_letsencrypt_firewall_disable + + +# For RHEL, Centos or derivatives +if which yum &> /dev/null 2>&1 ; then + # Check if web server software is installed, start it if any + if [ rpm -q nginx ]; then service nginx start + elif [ rpm -q httpd ]; then service httpd start +# # If using firewalld +# elif [ rpm -q firewalld ] && [ `firewall-cmd --state` = running ]; then +# firewall-cmd --zone=public --permanent --remove-service=http +# firewall-cmd --reload +# # If using UFW +# elif [ rpm -q ufw ]; then ufw --force enable && ufw deny http + fi +# For Debian, Ubuntu or derivatives +elif apt-get -v >/dev/null 2>&1 ; then + # Check if web server software is installed, stop it if any + if [ $(dpkg-query -W -f='${Status}' nginx 2>/dev/null | grep -c "ok installed") -eq 1 ]; then service nginx start + elif [ $(dpkg-query -W -f='${Status}' apache2 2>/dev/null | grep -c "ok installed") -eq 1 ]; then service apache2 start +# # If using UFW +# elif [ $(dpkg-query -W -f='${Status}' ufw 2>/dev/null | grep -c "ok installed") -eq 1 ]; then ufw --force enable && ufw deny http + fi +## Try iptables as a final attempt +#else +# iptables -D INPUT -p tcp --dport 80 -j ACCEPT +# service iptables save +fi diff --git a/server/scripts/letsencrypt_pre_hook.sh b/server/scripts/letsencrypt_pre_hook.sh new file mode 100644 index 0000000000000000000000000000000000000000..41aa0184307cadd20a784c6a44c865d75052d0c4 --- /dev/null +++ b/server/scripts/letsencrypt_pre_hook.sh @@ -0,0 +1,61 @@ +#!/bin/bash + +### BEGIN INIT INFO +# Provides: LETSENCRYPT PRE HOOK SCRIPT +# Required-Start: $local_fs $network +# Required-Stop: $local_fs +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: LETSENCRYPT PRE HOOK SCRIPT +# Description: To force open http port 80 to be used by letsencrypt client standlone command +### END INIT INFO + +## 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. +## +## Eg. you can override the ispc_letsencrypt_firewall_enable() function then 'return 124' +## to customize the firewall setup. +if [ -e "/usr/local/ispconfig/server/conf-custom/scripts/letsencrypt_pre_hook.sh" ] ; then + . /usr/local/ispconfig/server/conf-custom/scripts/letsencrypt_pre_hook.sh + ret=$? + if [ $ret != 124 ]; then exit $ret; fi +fi + +declare -F ispc_letsencrypt_firewall_enable &>/dev/null || ispc_letsencrypt_firewall_enable() { + # create 'ispc-letsencrypt' chain with ACCEPT policy and send port 80 there + iptables -N ispc-letsencrypt + iptables -I ispc-letsencrypt -p tcp --dport 80 -j ACCEPT + iptables -A ispc-letsencrypt -j RETURN + iptables -I INPUT -p tcp --dport 80 -j ispc-letsencrypt +} + +ispc_letsencrypt_firewall_enable + +# For RHEL, Centos or derivatives +if which yum &> /dev/null 2>&1 ; then + # Check if web server software is installed, stop it if any + if [ rpm -q nginx ]; then service nginx stop; fi + if [ rpm -q httpd ]; then service httpd stop; fi +# # If using firewalld +# if [ rpm -q firewalld ] && [ `firewall-cmd --state` = running ]; then +# firewall-cmd --zone=public --permanent --add-service=http +# firewall-cmd --reload +# fi +# # If using UFW +# if [ rpm -q ufw ]; then ufw --force enable && ufw allow http; fi + +# For Debian, Ubuntu or derivatives +elif apt-get -v >/dev/null 2>&1 ; then + # Check if web server software is installed, stop it if any + if [ $(dpkg-query -W -f='${Status}' nginx 2>/dev/null | grep -c "ok installed") -eq 1 ]; then service nginx stop; fi + if [ $(dpkg-query -W -f='${Status}' apache2 2>/dev/null | grep -c "ok installed") -eq 1 ]; then service apache2 stop; fi +# # If using UFW +# if [ $(dpkg-query -W -f='${Status}' ufw 2>/dev/null | grep -c "ok installed") -eq 1 ]; then ufw --force enable && ufw allow http; fi + +## Try iptables as a final attempt +#else +# iptables -I INPUT -p tcp --dport 80 -j ACCEPT +# service iptables save +fi diff --git a/server/scripts/letsencrypt_renew_hook.sh b/server/scripts/letsencrypt_renew_hook.sh new file mode 100644 index 0000000000000000000000000000000000000000..5ec9912f59d87728b83cf0fcd233b78146d2f456 --- /dev/null +++ b/server/scripts/letsencrypt_renew_hook.sh @@ -0,0 +1,59 @@ +#!/bin/bash + +### BEGIN INIT INFO +# Provides: LETSENCRYPT RENEW HOOK SCRIPT +# Required-Start: $local_fs $network +# Required-Stop: $local_fs +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: LETSENCRYPT RENEW HOOK SCRIPT +# Description: Taken from LE4ISPC code. To be used to update ispserver.pem automatically after ISPConfig LE SSL certs are renewed and to reload / restart important ISPConfig server services +### END INIT INFO + +## 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 + ret=$? + if [ $ret != 124 ]; then exit $ret; fi +fi + +hostname=$(hostname -f) +if [ -d "/usr/local/ispconfig/server/scripts/${hostname}" ] ; then + lelive="/usr/local/ispconfig/server/scripts/${hostname}" ; +elif [ -d "/root/.acme.sh/${hostname}" ] ; then + lelive="/root/.acme.sh/${hostname}" ; +else + lelive="/etc/letsencrypt/live/${hostname}" ; +fi + +if [ -d "$lelive" ]; then + cd /usr/local/ispconfig/interface/ssl; ibak=ispserver.*.bak; ipem=ispserver.pem; icrt=ispserver.crt; ikey=ispserver.key + if ls $ibak 1> /dev/null 2>&1; then rm $ibak; fi + if [ -e "$ipem" ]; then mv $ipem $ipem-$(date +"%y%m%d%H%M%S").bak; cat $ikey $icrt > $ipem; chmod 600 $ipem; fi + 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 + # 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 + if [ $(dpkg-query -W -f='${Status}' monit 2>/dev/null | grep -c "ok installed") -eq 1 ]; then service monit restart; fi + if [ $(dpkg-query -W -f='${Status}' postfix 2>/dev/null | grep -c "ok installed") -eq 1 ]; then service postfix restart; fi + if [ $(dpkg-query -W -f='${Status}' dovecot-imapd 2>/dev/null | grep -c "ok installed") -eq 1 ]; then service dovecot restart; fi + if [ $(dpkg-query -W -f='${Status}' mysql 2>/dev/null | grep -c "ok installed") -eq 1 ]; then service mysql restart; fi + if [ $(dpkg-query -W -f='${Status}' mariadb 2>/dev/null | grep -c "ok installed") -eq 1 ]; then service mysql restart; fi + 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 diff --git a/server/scripts/update_from_dev.sh b/server/scripts/update_from_dev.sh index 0be65986d68b56fcf97e536447be8676f2ab7c24..430a1b5c7f7cab797648a182c090041372e8e352 100755 --- a/server/scripts/update_from_dev.sh +++ b/server/scripts/update_from_dev.sh @@ -1,29 +1,5 @@ #!/bin/bash -{ - umask 0077 \ - && tmpdir=`mktemp -dt "$(basename $0).XXXXXXXXXX"` \ - && test -d "${tmpdir}" \ - && cd "${tmpdir}" -} || { - echo 'mktemp failed' - exit 1 -} +echo "This script is no longer used. Please use ispconfig_update.sh instead." ; -wget -O ispconfig3-dev.tar.gz "https://git.ispconfig.org/ispconfig/ispconfig3/repository/archive.tar.gz?ref=master" -tar xzf ispconfig3-dev.tar.gz - -echo -n "Latest git version: " -ls -1d ispconfig3-master* -cd ispconfig3-master*/install - -php -q \ - -d disable_classes= \ - -d disable_functions= \ - -d open_basedir= \ - update.php - -cd /tmp -rm -rf "${tmpdir}" - -exit 0 +exit 1; diff --git a/server/scripts/update_from_dev_stable.sh b/server/scripts/update_from_dev_stable.sh index a5dc10605b1ce72f36cb5116067d077702d0f62f..430a1b5c7f7cab797648a182c090041372e8e352 100644 --- a/server/scripts/update_from_dev_stable.sh +++ b/server/scripts/update_from_dev_stable.sh @@ -1,29 +1,5 @@ #!/bin/bash -{ - umask 0077 \ - && tmpdir=`mktemp -dt "$(basename $0).XXXXXXXXXX"` \ - && test -d "${tmpdir}" \ - && cd "${tmpdir}" -} || { - echo 'mktemp failed' - exit 1 -} +echo "This script is no longer used. Please use ispconfig_update.sh instead." ; -wget -O ispconfig3-dev.tar.gz "https://git.ispconfig.org/ispconfig/ispconfig3/repository/archive.tar.gz?ref=stable-3.1" -tar xzf ispconfig3-dev.tar.gz - -echo -n "Latest git version: " -ls -1d ispconfig3-stable* -cd ispconfig3-stable*/install - -php -q \ - -d disable_classes= \ - -d disable_functions= \ - -d open_basedir= \ - update.php - -cd /tmp -rm -rf "${tmpdir}" - -exit 0 +exit 1; diff --git a/server/scripts/update_runner.sh b/server/scripts/update_runner.sh new file mode 100644 index 0000000000000000000000000000000000000000..f3eb684328875efb4fc03ee0cdd45bc16afc885d --- /dev/null +++ b/server/scripts/update_runner.sh @@ -0,0 +1,78 @@ +#!/bin/bash + +_UPD=1 + +# padding handles script being overwritten during updates +# see https://git.ispconfig.org/ispconfig/ispconfig3/issues/4227 + +################################################## +################################################## +################################################## +################################################## +################################################## +################################################## +################################################## +################################################## +################################################## +################################################## +################################################## +################################################## + +SOURCE=$1 +URL="" + +if [[ "$SOURCE" == "stable" ]] ; then + URL="https://www.ispconfig.org/downloads/ISPConfig-3-stable.tar.gz" +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/-/archive/develop/ispconfig3-develop.tar.gz" +else + echo "Please choose an installation source (stable, nightly, git-develop)" + exit 1 +fi + +CURDIR=$PWD + +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 + } + + echo "Downloading ISPConfig update." + wget -q -O ISPConfig-3.tar.gz "${URL}" + if [ -f ISPConfig-3.tar.gz ] + then + echo "Unpacking ISPConfig update." + tar xzf ISPConfig-3.tar.gz --strip-components=1 + cd install/ + php -q \ + -d disable_classes= \ + -d disable_functions= \ + -d open_basedir= \ + update.php + cd /tmp + rm -rf "${tmpdir}" + else + echo "Unable to download the update." + cd "$CURDIR" + exit 1 + fi + +fi + +cd "$CURDIR" +exit 0 +} diff --git a/server/scripts/update_stable.sh b/server/scripts/update_stable.sh index 854731077e764ff10a4c14e83d75793edc032847..430a1b5c7f7cab797648a182c090041372e8e352 100644 --- a/server/scripts/update_stable.sh +++ b/server/scripts/update_stable.sh @@ -1,54 +1,5 @@ #!/bin/bash -_UPD=1 +echo "This script is no longer used. Please use ispconfig_update.sh instead." ; -# padding handles script being overwritten during updates -# see https://git.ispconfig.org/ispconfig/ispconfig3/issues/4227 - -################################################## -################################################## -################################################## -################################################## -################################################## -################################################## -################################################## -################################################## -################################################## -################################################## -################################################## -################################################## - -{ -if [ -n "${_UPD}" ] -then - { - umask 0077 \ - && tmpdir=`mktemp -dt "$(basename $0).XXXXXXXXXX"` \ - && test -d "${tmpdir}" \ - && cd "${tmpdir}" - } || { - echo 'mktemp failed' - exit 1 - } - - wget https://www.ispconfig.org/downloads/ISPConfig-3-stable.tar.gz - if [ -f ISPConfig-3-stable.tar.gz ] - then - tar xvfz ISPConfig-3-stable.tar.gz - cd ispconfig3_install/install/ - php -q \ - -d disable_classes= \ - -d disable_functions= \ - -d open_basedir= \ - update.php - cd /tmp - rm -rf "${tmpdir}" - else - echo "Unable to download the update." - exit 1 - fi - -fi - -exit 0 -} +exit 1; diff --git a/server/server.php b/server/server.php index 106d3edc654f4dd9974b76fca0f183d1dd2d56cd..878376a154c22d4b773094aa93ec28106a595549 100644 --- a/server/server.php +++ b/server/server.php @@ -94,7 +94,7 @@ if ($app->dbmaster->testConnection()) { // retrieve admin email address for notifications $sys_ini = $app->db->queryOneRecord("SELECT * FROM sys_ini WHERE sysini_id = 1"); $conf['sys_ini'] = $app->ini_parser->parse_ini_string(stripslashes($sys_ini['config'])); - $conf['admin_mail'] = $conf['sys_ini']['mail']['admin_mail']; + $conf['admin_mail'] = (isset($conf['sys_ini']['mail']['admin_mail']) ? $conf['sys_ini']['mail']['admin_mail'] : ''); unset($sys_ini); /* @@ -170,9 +170,9 @@ if ($app->db->testConnection() && $app->dbmaster->testConnection()) { $app->modules->loadModules('all'); //** Load the plugins that are in the plugins-enabled folder $app->plugins->loadPlugins('all'); - + $app->plugins->raiseAction('server_plugins_loaded', ''); - + if ($tmp_num_records > 0) { $app->log("Found $tmp_num_records changes, starting update process.", LOGLEVEL_DEBUG); //** Go through the sys_datalog table and call the processing functions @@ -217,5 +217,5 @@ if ($needStartCore) { $app->log('Remove Lock: ' . $conf['temppath'] . $conf['fs_div'] . '.ispconfig_lock', LOGLEVEL_DEBUG); -die("finished.\n"); +die("finished server.php.\n"); ?>