0
0
mirror of https://github.com/postfixadmin/postfixadmin.git synced 2024-09-19 19:22:14 +02:00

Merge branch 'master' into michaelkrieger-patch-1

This commit is contained in:
David Goodwin 2024-01-11 08:51:17 +00:00 committed by GitHub
commit eda637df1a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
543 changed files with 15120 additions and 40059 deletions

View File

@ -3,33 +3,94 @@ name: GitHubBuild
on: [push]
jobs:
build:
runs-on: ubuntu-latest
lint_etc:
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v1
- uses: actions/checkout@v2
- name: Validate composer.json and composer.lock
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: 7.4
tools: composer
extensions: sqlite3
- name: run install.sh
run: /bin/bash install.sh
- name: check composer
run: composer validate
- name: setup templates_c
run: mkdir templates_c || true
# Needing to 'update' here isn't ideal, but we need to cope with tests that run under different PHP versions :-/
- name: Install dependencies
run: composer update --prefer-dist -n
- name: check formatting
run: composer check-format
- name: touch config.local.php
run: touch config.local.php
- name: psalm static analysis
run: composer psalm
testsuite:
needs: [lint_etc]
runs-on: ubuntu-22.04
strategy:
matrix:
php-versions: [ '7.4', '8.0', '8.1', '8.2', '8.3' ]
steps:
- uses: actions/checkout@v2
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php-versions }}
tools: composer
extensons: sqlite3
- name: run install.sh
run: /bin/bash install.sh
- name: touch config.local.php
run: touch config.local.php && php -v
- name: Install dependencies
run: composer install --prefer-dist --no-progress --no-suggest
run: composer install --prefer-dist -n
- name: Build/test
run: composer build
run: composer test
- name: setup coveralls
run: mkdir -p build/logs || true
build_coverage_report:
needs: [testsuite]
continue-on-error: true
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v2
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '7.4'
tools: composer
extensions: sqlite3
- name: run install.sh
run: /bin/bash install.sh
- name: touch config.local.php
run: touch config.local.php && php -v
- name: Install dependencies
run: composer update --prefer-dist -n
- name: build coveralls coverage
run: php -d xdebug.mode=coverage vendor/bin/phpunit tests
- name: Coveralls
run: php vendor/bin/php-coveralls -v --coverage_clover=coverage.xml || true
run: vendor/bin/php-coveralls --coverage_clover=build/logs/clover.xml -v || true
env:
COVERALLS_RUN_LOCALLY: 1
COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }}
COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }}

10
.gitignore vendored
View File

@ -1,7 +1,15 @@
/config.local.php
/templates_c/*.tpl.php
/templates_c/*menu.conf.php
/vendor/
/.php_cs.cache
/.idea
/vendor
/composer.lock
/coverage
/composer.phar
/composer_2.phar
/.php-cs-fixer.cache
/.phpunit.result.cache
/build
/tests/postfixadmin.sqlite.*.test
/phpstorm-docker-dev/

View File

@ -9,13 +9,12 @@ $finder = PhpCsFixer\Finder::create()
->files()->notName('config.inc.php')->notName('config.local.php')
->in(__DIR__);
return PhpCsFixer\Config::create()
$config = new PhpCsFixer\Config();
return $config
->setFinder($finder)
->setRules(array(
'@PSR2' => true,
'braces' => array(
'position_after_functions_and_oop_constructs' => 'same',
),
'@PSR12' => true,
'method_argument_space' => false, # don't break formatting in initStruct()
'no_spaces_inside_parenthesis' => false, # don't break formatting in initStruct()
));

View File

@ -3,6 +3,7 @@ php:
- 7.2
- 7.3
- 7.4
- 8.0
services:
- mysql

View File

@ -1,52 +1,69 @@
#
# Postfix Admin ADDITIONS
#
BEFORE YOU START
----------------
# BEFORE YOU START
**** ALL THESE SCRIPTS ARE CREATED BY THIRD PARTIES ****
**** THEY ARE AS IS, USE AT YOUR OWN RISK! ****
ADDITIONS
---------
# ADDITIONS
In this directory you will find additional scripts that are build by others.
- change_password.tgz
## change_password.tgz
by George Vieira <george at citadelcomputer dot com dot au>
SquirrelMail plugin to change your passwor
- cleanupdirs.pl
## cleanupdirs.pl
by jared bell <jared at beol dot net>
Displays a list of mailboxes that need to be deleted
- mailbox_remover.pl
## mailbox_remover.pl
by Petr Znojemsky
Deletes all unused mailboxes
- mkeveryone.pl
## mkeveryone.pl
by Joshua Preston
Generate an 'everybody' alias for a domain.
- pfa_maildir_cleanup.pl
## pfa_maildir_cleanup.pl
by Stephen Fulton <sfulton at esoteric dot ca>
Deletes all unused mailboxes
- postfixadmin-0.3-1.4.tar.gz
## postfixadmin-0.3-1.4.tar.gz
by Florian Kimmerl <info at spacekoeln dot de>
The Postfixadmin SquirrelMail plugin let users change their virtual alias,
vacation status/message and password.
- virtualmaildel.php
See also : https://github.com/postfixadmin/postfixadmin/tree/master/ADDITIONS/squirrelmail-plugin
## virtualmaildel.php
by George Vieira <george at citadelcomputer dot com dot au>
Deletes all unused mailboxes
## Example mailbox / domain scripts for Postfixadmin
- postfixadmin-mailbox-postcreation.sh
- postfixadmin-mailbox-postdeletion.sh
- postfixadmin-domain-postdeletion.sh
by Troels Arvin <troels@arvin.dk>
Examples of scripts relevant to the optional
$CONF['mailbox_postcreation_script'],
$CONF['mailbox_postdeletion_script'] and
$CONF['domain_postdeletion_script'] configuration options.
## Cyrus Quota Usage
See https://github.com/o-m-d/cyrus-quotausage-to-pfa

View File

@ -27,7 +27,7 @@ our $db_username="mail";
our $db_password="CHANGE_ME!";
# Where to create a lockfile; please ensure path exists.
our $run_dir="/var/run/fetchmail";
our $run_dir="/var/lock/fetchmail";
# in case you want to use dovecot deliver to put the mail directly into the users mailbox,
# set "mda" in the fetchmail table to the keyword "dovecot".
@ -54,6 +54,18 @@ sub log_and_die {
die $message;
}
sub escape_password {
$output = "";
for $i (0..length($_[0])-1){
$char = substr($_[0], $i, 1);
if ($char eq "\\" or $char eq "\"")
{
$output = $output . "\\";
}
$output = $output . $char;
}
return $output;
}
# read options and arguments
$configfile = "/etc/fetchmail-all/config";
@ -98,18 +110,18 @@ if($db_type eq "Pg") {
}
$sql = "
SELECT id,mailbox,src_server,src_auth,src_user,src_password,src_folder,fetchall,keep,protocol,mda,extra_options,usessl, sslcertck, sslcertpath, sslfingerprint
SELECT id,mailbox,src_server,src_auth,src_user,src_password,src_folder,fetchall,keep,protocol,mda,extra_options,usessl, sslcertck, sslcertpath, sslfingerprint, src_port
FROM fetchmail
WHERE $sql_cond > poll_time*60
";
my (%config);
map{
my ($id,$mailbox,$src_server,$src_auth,$src_user,$src_password,$src_folder,$fetchall,$keep,$protocol,$mda,$extra_options,$usessl,$sslcertck,$sslcertpath,$sslfingerprint)=@$_;
my ($id,$mailbox,$src_server,$src_auth,$src_user,$src_password,$src_folder,$fetchall,$keep,$protocol,$mda,$extra_options,$usessl,$sslcertck,$sslcertpath,$sslfingerprint,$src_port)=@$_;
syslog("info","fetch ${src_user}@${src_server} for ${mailbox}");
$cmd="user '${src_user}' there with password '".decode_base64($src_password)."'";
$cmd="user '${src_user}' there with password '".escape_password(decode_base64($src_password))."'";
$cmd.=" folder '${src_folder}'" if ($src_folder);
if ($mda) {
@ -148,7 +160,7 @@ TXT
print $file_handler $text;
close $file_handler;
$ret=`/usr/bin/fetchmail -f $filename -i $run_dir/fetchmail.pid`;
$ret=`/usr/bin/fetchmail -f $filename --pidfile $run_dir/fetchmail.pid`;
unlink $filename;

View File

@ -117,7 +117,7 @@ foreach my $maildir (keys(%directories)) {
close(TOUCH);
print "Archiving $maildir\n";
@args = ($archcmd, "cvzf", $archive, $maildir);
system(@args) == 0 or die "Creating archive for $maildir failed: $?"
system(@args) == 0 or die "Creating archive for $maildir failed: $?";
rmtree($maildir);
print localtime() . " $maildir has been deleted.\n";

View File

@ -8,7 +8,7 @@
# "somedomain.com". If $basedir/somedomain.com exists, it will
# be removed.
# The script will not actually delete the directory. I moves it
# The script will not actually delete the directory. It moves it
# to a special directory which may once in a while be cleaned up
# by the system administrator.

View File

@ -6,7 +6,7 @@
# The script looks at arguments 1 and 2, assuming that they
# indicate username and domain, respectively.
# The script will not actually delete the maildir. I moves it
# The script will not actually delete the maildir. It moves it
# to a special directory which may once in a while be cleaned up
# by the system administrator.

View File

@ -0,0 +1,19 @@
#!/bin/bash
# Example script for dovecot mail-crypt-plugin
# https://doc.dovecot.org/configuration_manual/mail_crypt_plugin/
IFS= read -r -d $'\0' OLD_PASSWORD
IFS= read -r -d $'\0' NEW_PASSWORD
# New user
if [ -z "$OLD_PASSWORD" ]; then
OLD_PASSWORD="$(openssl rand -hex 16)"
doveadm -o plugin/mail_crypt_private_password="$OLD_PASSWORD" mailbox cryptokey generate -u "$1" -U
fi
# If you're using dovecot >= 2.3.19, try this instead (See: https://github.com/postfixadmin/postfixadmin/issues/646)
# printf "%s\n%s\n" "$OLD_PASSWORD" "$NEW_PASSWORD" "$NEW_PASSWORD" | doveadm mailbox cryptokey password -u "$1" -N -O
# Password change
printf "%s\n%s\n" "$OLD_PASSWORD" "$NEW_PASSWORD" | doveadm mailbox cryptokey password -u "$1" -N -O ""

View File

@ -86,7 +86,11 @@ sub list_quota_usage {
$usage = $usage + 500;
$usage = int $usage / 1000;
}
if($insert_db == 1){execSql("UPDATE mailbox set quota_usage = $usage, quota_usage_date = CAST(NOW() AS DATE) WHERE username = '$email'");}
if($insert_db == 1)
{
execSql("INSERT INTO quota2 (username, bytes) values ('$email', $usage) ON DUPLICATE KEY UPDATE bytes = VALUES(bytes)");
}
print_list() if ($list == 1);
}
@ -144,8 +148,4 @@ sub help {
print "$0 [options...]\n";
print "-l|--list List quota used\n";
print "-i|--addmysql For insert quota used in database mysql\n";
}

View File

@ -1,4 +1,5 @@
<?php
// vim:ts=4:sw=4:et
ini_set('include_path', get_include_path() . ':' . dirname(__FILE__));

View File

@ -6,16 +6,19 @@
*/
function do_header() {
function do_header()
{
global $color;
displayPageHeader($color, 'None');
}
function do_footer() {
function do_footer()
{
echo "</body></html>";
}
function _display_password_form() {
function _display_password_form()
{
bindtextdomain('postfixadmin', SM_PATH . 'plugins/postfixadmin/locale');
textdomain('postfixadmin');
do_header('Postfixadmin Squirrelmail - Login');
@ -31,7 +34,8 @@ function _display_password_form() {
/**
* This returns a Zend_XmlRpc_Client instance - unless we can't log you in...
*/
function get_xmlrpc() {
function get_xmlrpc()
{
global $CONF;
require_once('Zend/XmlRpc/Client.php');
$client = new Zend_XmlRpc_Client($CONF['xmlrpc_url']);
@ -73,7 +77,8 @@ function get_xmlrpc() {
return $client;
}
function include_if_exists($filename) {
function include_if_exists($filename)
{
if (file_exists($filename)) {
include_once($filename);
}
@ -87,7 +92,8 @@ $optmode = 'display';
// Action: Checks if email is valid and returns TRUE if this is the case.
// Call: check_email (string email)
//
function check_email($email) {
function check_email($email)
{
$return = filter_var($email, FILTER_VALIDATE_EMAIL);
if ($return === false) {
return false;

View File

@ -1,4 +1,5 @@
<?php
require_once(dirname(__FILE__) . '/common.php');
$xmlrpc = get_xmlrpc();

View File

@ -99,7 +99,7 @@ if ($_SERVER['REQUEST_METHOD'] == "POST") {
$$key = $_POST[$key];
}
}
if (!empty($fBack)) {
$success = $vacation->remove();

View File

@ -1,22 +1,26 @@
<?php
// vim:ts=4:sw=4:et
if (!defined('SM_PATH')) {
die("Invalid internal state (don't access file directly)");
}
include_once(SM_PATH . 'functions/i18n.php');
function squirrelmail_plugin_init_postfixadmin() {
function squirrelmail_plugin_init_postfixadmin()
{
include(dirname(__FILE__) . '/config.php');
global $squirrelmail_plugin_hooks;
$squirrelmail_plugin_hooks['optpage_register_block']['postfixadmin'] = 'postfixadmin_optpage_register_block';
}
function postfixadmin_version() {
function postfixadmin_version()
{
return '2.3.0';
}
function postfixadmin_optpage_register_block() {
function postfixadmin_optpage_register_block()
{
// Gets added to the user's OPTIONS page.
global $optpage_blocks;
global $AllowVacation;

View File

@ -46,7 +46,8 @@ if (! is_dir($homedir)) {
//
// Recursive Delete Function
//
function deldir($dir) {
function deldir($dir)
{
$current_dir = opendir($dir);
while ($entryname = readdir($current_dir)) {
if (is_dir("$dir/$entryname") and ($entryname != "." and $entryname!="..")) {

View File

@ -4,17 +4,143 @@
# This source file is subject to the GPL license that is bundled with
# this package in the file LICENSE.TXT.
#
# Further details on the project are available at http://postfixadmin.sf.net
# Further details on the project are available at https://github.com/postfixadmin/postfixadmin
Version X.X - master
MASTER (should have all changes from 3.3.10 plus)
------
- MFA/TOTP support (see https://github.com/postfixadmin/postfixadmin/pull/753 - thank you @svenseeberg and @drunken-sod)
- Update composer's PHP requirement to PHP 7.4+ (which matches Wordpress etc, PHP project is supporting 8.1<->8.3)
- Make fetchmail.pl respect src_port (thanks @tempixx - see #784)
- Improve github action (php 8.2)
- Add Javascript username validation to prevent illegal characters (see #765; thanks @verdinago)
- Fix typos / broken links etc (see #761; thanks @knofte)
- Add initial support for OpenDKIM domain key handling (see #631; thanks @Freddo3000 )
- vacation.pl updates - (log4perl warnings, typos etc, logging to file, localhost connection stuff - see https://github.com/postfixadmin/postfixadmin/discussions/648 thanks @puck)
- fix display of active buttons in the bootstrap theme (see #749 - thanks @reinks2112)
- fix theme logo + config interaction (see #718; thanks @dkatheininge)
- fix pacrypt + php_crypt:MD5
- fix dovecot:CRYPT-METHOD (see #708; thanks @Coeur2Boeuf)
- fix CSV alias export (see #703; thanks @dennis2society)
- upgrade bundled jquery (v1.12.4 to v3.7.0) (fixes jquery ajax security problem, postfixadmin isn't vulnerable, see #734; thanks @tibor-banfalvi)
- Require 'composer' for library installation (see install.sh)
- Remove the dependency on 'doveadm pw' and support more hash mechanisms (see: #491)
- Update debian/ patch (see #529)
- Support $CONF['database_port'] when connecting to MySQL (see #549)
- Add optional Dovecot mail-crypt plugin support - see https://github.com/postfixadmin/postfixadmin/issues/408
- Add $CONF['site_url'] to allow administrators to override a detected site url (e.g. used in password recovery emails; see https://github.com/postfixadmin/postfixadmin/issues/446 )
- Code reformat as PHPCS has a mind of it's own (function/method opening brace change of position)
- Improved UTF8 support in vacation (see https://github.com/postfixadmin/postfixadmin/pull/484)
- Fix quota levels losing config control (see bfc7af5c8efe2a68c47286cc870b56cb4f929a3f)
- vacation.pl: improve autoreply detection (see https://github.com/postfixadmin/postfixadmin/pull/482
- vacation.pl: improve headers in auto-reply mails (add: "Auto-Submitted: auto-replied") see https://github.com/postfixadmin/postfixadmin/pull/483
- vacation.pl: allow smtp helo to be customised; see https://github.com/postfixadmin/postfixadmin/pull/495
- dark theme - use `$CONF['theme_css'] = 'css/dark-theme.css';` to enable - see https://github.com/postfixadmin/postfixadmin/issues/569, thanks @polymeer
- support 'send email' using smtp+ssl, smtp+starttls or smtp - see https://github.com/postfixadmin/postfixadmin/pull/566, thanks @davidebeatrici
- support smtpd_sender_login_maps via documents - see https://github.com/postfixadmin/postfixadmin/pull/565, thanks @davidebeatrici
- fix database collation issues (try and use latin1_general_ci everywhere)
Version 3.3.13 - 2022/12/08
-------------------------------------------------
- MySQL collation fix for quota/quota2 tables ( see https://github.com/postfixadmin/postfixadmin/issues/690 )
- Fix MySQL not liking "alter table drop constraint ..." which seems to be MariaDB only (see #561 and #687) (thank you @stefanomarty)
Version 3.3.12 - 2022/12/04
-------------------------------------------------
- MySQL collation setting change, see https://github.com/postfixadmin/postfixadmin/issues/595 (and #327 and #552)
- Upgrade Smarty to 4.3.0 (see also #541)
- Improve PHP 8.1/8.2 compatability (see #632)
Version 3.3.11 - 2022/03/02
-------------------------------------------------
- Fix PHP 8 compatability for crypt() usage (see https://github.com/postfixadmin/postfixadmin/issues/547)
- Support $CONF['database_port'] for MySQL databases (see https://github.com/postfixadmin/postfixadmin/issues/549 and https://github.com/postfixadmin/postfixadmin/issues/553)
Version 3.3.10 - 2021/08/09
-------------------------------------------------
- Merge password expiration fixes from https://github.com/postfixadmin/postfixadmin/pull/493
- Remove html readonly attribute from user's vacation page to/from selectors.
- vacation.pl - allow smtp helo to be specified (see https://github.com/postfixadmin/postfixadmin/pull/495)
- Security fix - ClickJacking protection (thanks @huntr-helper / @ranjit-git) (see https://github.com/postfixadmin/postfixadmin/issues/523)
- Security fix (low risk) - Improve randomness with PFA_token for CSRF protection (thanks @michaellrowley)
- Fix viewlog to allow admins to see all domains (thanks @pgimalac, https://github.com/postfixadmin/postfixadmin/issues/516)
- Disable password autocompletion in edit forms (thanks @gabrielfin, see https://github.com/postfixadmin/postfixadmin/pull/510)
Version 3.3.9 - 2021/05/12
-------------------------------------------------
- Improve Ukrainian language (ua.lang) (thanks: andrew.kudrinov)
- Ensure we update timestamp fields (created / modified) when performing db operations, see: https://github.com/postfixadmin/postfixadmin/issues/469
- Add domain_admins.id pk column for non-sqlite users, see: https://github.com/postfixadmin/postfixadmin/issues/475
- Add fix for MySQL error where a default datetime value in the domain field breaks the upgrade.php db schema update, see https://github.com/postfixadmin/postfixadmin/issues/489
- Bug fix quota levels (now user configurable again; thanks @csware, see https://github.com/postfixadmin/postfixadmin/commit/bfc7af5c8efe2a68c47286cc870b56cb4f929a3f
Version 3.3.8 - 2021/03/04
-------------------------------------------------
- Fix invalid template referenced in broadcast-message.php; see https://github.com/postfixadmin/postfixadmin/issues/465
- Fix PostgreSQL boolean issue in setup (unable to add superuser); see https://github.com/postfixadmin/postfixadmin/issues/461
- Fix SQL error on password change; see https://github.com/postfixadmin/postfixadmin/issues/456
- Add Ukrainian language (thanks: andrew.kudrinov)
Version 3.3.7 - 2021/01/17
-------------------------------------------------
- Fix missing db_connection_string() function from master; see https://github.com/postfixadmin/postfixadmin/issues/454
Version 3.3.6 - 2021/01/17 - Do not use (setup.php broken)
-------------------------------------------------
- Improve setup.php - output error_log location, try and detect if there is a problem calling pacrypt() (dovecot).
Version 3.3.5 - 2021/01/27
-------------------------------------------------
- Fix include path for password-change.php and improve UI for password-recover / password-change (nav bar was missing, remove table layout, fix labels not visible) (see https://github.com/postfixadmin/postfixadmin/issues/430
- Fix users/edit-alias to remove unnecessary space (see https://github.com/postfixadmin/postfixadmin/issues/442)
- Improve documentation
- Improve password length check example in config.inc.php (see //github.com/postfixadmin/postfixadmin/issues/423)
- Improve ADDITIONS/update_quota.pl (update to use quota2 table)
- Check for some config setting, and do not error if they are not set (see https://github.com/postfixadmin/postfixadmin/issues/437)
- Add pt-pt (portugese) translation (thanks Numo Carrilho/Nunix)
- Fix missing template variable 'domain_selected'
Version 3.3.4 - 2021/01/19
-------------------------------------------------
- Fix forgot-password (theme + trying to use class before autoload registered) (see //github.com/postfixadmin/postfixadmin/issues/427)
- Fix PHP 8.0 issues (string{} offset in CLI, psalm warning about string + int in MailboxHandler)
- Add PHP 8.0 to travis build + hopefully fix build
- Fix editform to add linefeeds on for e.g. alias editing (see https://github.com/postfixadmin/postfixadmin/pull/424)
- Fix mysql_crypt password hash - not all MySQL variants have RANDOM_BYTES function, so use our PHP based salt instead. (see https://github.com/postfixadmin/postfixadmin/issues/422)
Version 3.3.3 - 2021/01/14
-------------------------------------------------
- Improve error handling around login (require non-empty password; cope with pacrypt() throwing an exception; see https://github.com/postfixadmin/postfixadmin/issues/420)
- Improve setup.php (show error messages in admin creation form, fix unable to create admin - see https://github.com/postfixadmin/postfixadmin/issues/418)
Version 3.3.2 - 2021/01/13
-------------------------------------------------
- Add in the ability to specify a hash prefix with php_crypt password format, useful for Dovecot replacement. ( https://github.com/postfixadmin/postfixadmin/issues/344 )
- Add documentation (DOCUMENTS/HASHING.md)
- Fix issue with vacation form not saving; vacation start/end is now stored with time, and users/ nav links ( https://github.com/postfixadmin/postfixadmin/issues/416 )
Version 3.3.1 - 2021/01/11
-------------------------------------------------
- Fix issue with cli not working ( see https://github.com/postfixadmin/postfixadmin/issues/415 )
- Fix issue with theme not working (if $CONF['theme_css'] was defined in config). ( see https://github.com/postfixadmin/postfixadmin/issues/410 )
- Fix links in footer ( see https://github.com/postfixadmin/postfixadmin/issues/412 )
Version 3.3 - 2021/01/09
-------------------------------------------------
- PostfixAdmin requires PHP 7.0 or greater.
- Change setup.php to use PHP's password_hash() for the config setup_password . (breaking change, existing setup passwords will fail to work and need regenerating)
- Change setup.php to not reveal system paths etc until a setup_password is configured and provided (see: https://github.com/postfixadmin/postfixadmin/issues/402 )
- Move to bootstrap theme ( see https://github.com/postfixadmin/postfixadmin/pull/172 )
- Improve vacation.pl (better utf-8 support)
- Improve DB connections (PDO, SSL)
- Add sha512.b64 password hash support (see https://github.com/postfixadmin/postfixadmin/issues/58)
- Add support for password expiration (see https://github.com/postfixadmin/postfixadmin/pull/200 and README.password_expiration )
- Improve ADDITIONS/postfixadmin-mailbox-postcreate.sh
- Add Date header into smtp_from() (see https://github.com/postfixadmin/postfixadmin/issues/203 )
- PostgreSQL fixes ( 1e158245d613fd1d8d5c1d59e26e940eb71f5b32 )
- vacation.pl fixes (perl libraries; see https://github.com/postfixadmin/postfixadmin/pull/194 )
- Add bootstrap theme (default not changed yet) ( see https://github.com/postfixadmin/postfixadmin/pull/172 )
- Improve CSV export from list.php
- Various misc. changes from static analysis (psalm)
- Update installation instructions. (see: https://github.com/postfixadmin/postfixadmin/issues/189 https://github.com/postfixadmin/postfixadmin/issues/188 )
@ -23,6 +149,7 @@ Version X.X - master
- MySQL 8 compatibility (see https://github.com/postfixadmin/postfixadmin/pull/175 )
- Internally the database functions have been refactored to use PDO rather than the lower level mysql_, mysqli_, pg_ etc functions. ( see: https://github.com/postfixadmin/postfixadmin/pull/231 )
- Usage of dovecot deliver as fetchmail mda
- Corrupted Turkish language file fixed and missing translations are added.
Version 3.2 - 2018/05/02
-------------------------------------------------

View File

@ -56,6 +56,16 @@ namespace inbox {
protocols = "imap pop3"
# change to 'no' if you don't have ssl cert/keys, and comment out ssl_cert/ssl_key
ssl = yes
# If you're using LetsEncrypt/certbot see e.g. /etc/letsencrypt/live/MyDomain/fullchain.pem.
#
# cat server.crt server.key > dovecot.pem
#
# Make sure dovecot can read these file(s)
#
# If you use doveadm for your PostfixAdmin hashing, the webserver will also need read access to these files
# See also : https://github.com/postfixadmin/postfixadmin/blob/master/DOCUMENTS/HASHING.md#dovecotmethod
ssl_cert = </etc/dovecot/private/dovecot.pem
ssl_key = </etc/dovecot/private/dovecot.pem
@ -127,19 +137,50 @@ password_query = SELECT username AS user,password FROM mailbox WHERE username =
# Query to retrieve user information, note uid matches dovecot.conf AND Postfix virtual_uid_maps parameter.
# MYSQL:
user_query = SELECT CONCAT('/var/mail/vmail/', maildir) AS home, 1001 AS uid, 1001 AS gid,
CONCAT('*:bytes=', quota) AS quota_rule FROM mailbox WHERE username = '%u' AND active='1'
user_query = SELECT CONCAT('/var/mail/vmail/', maildir) AS home, 1001 AS uid, 1001 AS gid, CONCAT('*:bytes=', quota) AS quota_rule FROM mailbox WHERE username = '%u' AND active='1'
# PostgreSQL:
# user_query = SELECT '/var/mail/vmail/' || maildir AS home, 1001 AS uid, 1001 AS gid,
# '*:bytes=' || quota AS quota_rule FROM mailbox WHERE username = '%u' AND active = '1'
# see: https://doc.dovecot.org/configuration_manual/authentication/sql/#id6
iterate_query = SELECT username as user FROM mailbox WHERE active = '1'
#END /etc/dovecot/dovecot-sql.conf
If you make use of the separate smtp_active flag in the mailbox table of postfixadmin by
enabling the configuration parameter $CONF['smtp_active_flag'] = YES in postfixadmin configuration
and you're using dovecot sasl with postfix, the dovecot queries can be updated to use the different flag for smtp:
password_query = SELECT username AS user,password FROM mailbox WHERE username = '%u' AND (('%s' = 'smtp' AND smtp_active = '1') OR ('%s' <> 'smtp' AND active = '1'))
user_query = SELECT CONCAT('/var/mail/vmail/', maildir) AS home, 1001 AS uid, 1001 AS gid, CONCAT('*:bytes=', quota) AS quota_rule FROM mailbox WHERE username = '%u' AND (('%s' = 'smtp' AND smtp_active = '1') OR ('%s' <> 'smtp' AND active = '1'))
3. Permissions
--------------
Applicable to those older versions of Postfixadmin (before v 3.4) (see also https://github.com/postfixadmin/postfixadmin/pull/491)
With Dovecot 2.3.11 (ish?), if you are using the Postfixadmin dovecot password hashing backend - so your Postfixadmin configuration looks like
`$CONF['encrypt'] = 'dovecot:something';`
then the system user account running the PostfixAdmin code (normally the webserver user
account, like www-data or http or nobody) will need ...
* read access to any SSL certificate files defined in /etc/dovecot/dovecot.conf
(check: ssl_key, ssl_cert)
* read/write access to /run/dovecot/stats-writer
* Fixable with: `usermod -aG dovecot www-data``
Please note, Postfixadmin does not need to run on the same server as the Dovecot server.
See also the following tickets which contain discussions and solutions :
* https://github.com/postfixadmin/postfixadmin/issues/381 (Unable to login after Dovecot upgrade)
* https://github.com/postfixadmin/postfixadmin/issues/398 (Dovecotpw needs to read my TLS cert and private key)
3. Dovecot v1.0 quota support (optional)
4. Dovecot v1.0 quota support (optional)
----------------------------------------
Please note that you need to use Dovecot's own local delivery agent to
@ -226,3 +267,13 @@ If you use dovecot 1.2 or newer,
- use the 'quota2' table (also created by setup.php)
- set $CONF['new_quota_table'] = 'YES'
5. Dovecot Allowed IPs and App Password support (optional)
----------------------------------------------------------
To enhance end user security, Postfixadmin supports a set of features that
need implementation in the Dovecot login SQL queries.
The following features are available:
* Restrict login to a list of allowed remote IP addresses.
* Allow login with app passwords.

View File

@ -34,3 +34,24 @@ Frequently Asked Questions:
if it doesn't for you, try editing $CONF['emailcheck_resolve_domain'] to 'NO' in
config.inc.php and try again.
5) Postfixadmin is telling me an error occurred, and I should look at the server error logs for more details. Where do I look?
- This depends on your server setup (distribution, how PHP is executed etc).
- Postfixadmin typically calls PHP's error_log() function to log some detail about errors. This may write to :
* /var/log/syslog
* /var/log/apache2/error.log
* /var/log/php7.4-fpm.log (or equivalent for your PHP version)
* or somewhere you may have manually configured.
You can change where it logs by adding something like :
```PHP
ini_set('error_log', '/tmp/postfixadmin.log'); // example only
```
into config.local.php, or you can change your PHP configuration.
See also: https://stackoverflow.com/questions/5127838/where-does-php-store-the-error-log-php5-apache-fastcgi-cpanel

229
DOCUMENTS/HASHING.md Normal file
View File

@ -0,0 +1,229 @@
# PostfixAdmin Password Hash Support.
How are your passwords stored in the database.
They should not be stored in plain text.
Whatever format you choose will need to be supported by your IMAP server (and whatever provides SASL auth for Postfix)
If you can, use a format that includes a different salt per password (e.g. one of the crypt variants, like Blowfish (BLF-CRYPT) or Argon2I/Argon2ID).
Try and avoid formats that are unsalted hashes (md5, SHA1) as these offer minimal protection in the event of a data leak.
## Configuration
See config.inc.php (or config.local.php) and look for
```php
$CONF['encrypt'] = 'something';
```
## Supported Formats
This document is probably not complete.
It possibly provides better documentation than was present before. This may not say much.
Supported hash formats include :
* MD5-CRYPT (aka MD5),
* SHA1,
* SHA1-CRYPT,
* SSHA (4 char salted sha1),
* BLF-CRYPT (Blowfish),
* SHA512,
* SHA512-CRYPT,
* ARGON2I,
* ARGON2ID,
* SHA256,
* SHA256-CRYPT,
* PLAIN-MD5 (aka md5)
* CRYPT
Historically PostfixAdmin has supported all dovecot algorithms (methods) by using the 'doveadm' system binary. As of early 2023 (?), we attempted to use a native/PHP implementation for a number of these to remove issues caused by use of proc_open / dovecot file permissions etc (see e.g. #379).
It's recommended you use the algorithm/mechanism from your MTA, and configure PostfixAdmin with the same value prefixed by the MTA name -
For example, if dovecot has `default_pass_scheme = SHA256` use `$CONF['encrypt'] = 'SHA256'; ` in PostfixAdmin.
| Dovecot pass scheme | PostfixAdmin `$CONF['encrypt']` setting |
|---------------------|-----------------------------------------|
| SHA256 | SHA256 |
| SHA256-CRYPT.B64 | SHA256-CRYPT.B64 |
| SHA256-CRYPT | SHA256-CRYPT |
| SHA512-CRYPT | SHA512-CRYPT |
| ARGON2I | ARGON2I |
| ARGON2ID | ARGON2ID |
| Courier Example | PostfixAdmin |
|-----------------|--------------|
| md5 | courier:md5 |
| md5raw | courier:md5raw |
| sha1 | courier:sha1 |
| ssha | courier:ssha |
| sha256 | courier:sha256 |
### cleartext
No hashing. May be useful for debugging.
Insecure. Try to avoid. May be useful for legacy purposes.
### mysql_encrypt
Uses the MYSQL ENCRYPT() function (this uses 'crypt' underneath).
Can be secure.
Requires MySQL.
Should use a sha512 salt for new values.
### md5crypt
md5crypt = uses md5crypt() function - in a 'crypt' like format.
e.g.
`$1$c9809462$M0zeLuOvixH61C2csGN.U0`
You should not use this for new installations
(it probably does not offer a high level of security)
### md5
PHP's md5() function.
You should not use this (it does not offer a high level of security), but is probably better than cleartext.
### system
Uses PHP's crypt function.
Probably throws an E_NOTICE.
Example : `$1$tWgqTIuF$1HFciCXrhVpACGjBMxNr/0`
### authlib
See source code. Presumably useful for Courier based installations.
#### With `$CONF['authlib_default_flavor'] = 'md5raw`;`
might give something like :
`{md5raw}3858f62230ac3c915f300c664312c63f`
Based on md5, so avoid.
#### With `$CONF['authlib_default_flavor'] = 'crypt`;`
Uses PHP Crypt.
`{crypt}blfqitzeBpyAE`
Presumably weak.
#### With `$CONF['authlib_default_flavor'] = 'SHA';`
Uses sha1, base64 encoded. Unsalted. Avoid.
### dovecot:METHOD
May use dovecot binary to produce hash, if the format you request isn't in PFACrypt::DOVECOT_NATIVE
Using a format that PostfixAdmin doesn't support natively has the following pros/cons :
#### Pros
* Minimal dependency on PostfixAdmin / PHP code.
* Hash should definitely work with dovecot!
#### Cons
* file permissions and/or execution of doveadm by the web server may be problematic.
* requires: proc_open(...) - which might be blocked by e.g. safemode.
* doveadm may not be installed.
* possible issues with SELinux
* See https://github.com/postfixadmin/postfixadmin/issues/398 (file permissions)
#### Incomplete list of CRYPT-METHOD
* CRAM-MD5
* SHA
* SHA1
* SHA256
* SHA512
* CLEAR
* CLEARTEXT
* PLAIN
* PLAIN-TRUNC
If in doubt, try `dovecot:SHA512`
Dovecot generated passwords in your database should look a bit like :
`{SHA256}JMQi5oHxwb0IKGx6r10jpfCI3NsLIZgGs6nleSRPAMU=`
If you have problems, start by checking you can generate one on the command line using e.g
`doveadm pw -s SHA256`
### php_crypt
Potentially the most secure.
By default it will generate a SHA512 salt. Output in crypt format.
Other methods :
* BLOWFISH
* SHA512
* SHA256
* DES (avoid)
* MD5 (avoid)
e.g.
`$6$emcsNNrzGZSN64mI$A/bmacTGSp2UrdcPvaROrR2FPQS5KlnoU.a/0zmfpaubBO9o1ZcgyQIic4Qb59SMxA2H8YxgS1XILO1wZhjkZ0`
You can specify the salting method using a :METHOD in the specification.
e.g.
`$CONF['encrypt'] = 'php_crypt:SHA512';`
You can make the hashing more 'difficult' by specifying an additional parameter like :
`$CONF['encrypt'] = 'php_crypt:SHA512:5000';`
which should change the 'cost' (BLOWFISH) or rounds (SHA256, SHA512).
finally you can ask that the generated hash has a specific prefix (e.g. {SHA512} ) like :
`$CONF['encrypt'] = 'php_crypt:SHA512:5000:{SHA512-CRYPT}';`
### sha512.b64
See https://github.com/postfixadmin/postfixadmin/issues/58
No dovecot dependency; should support migration from md5crypt
Output is base64 encoded i.e. a hash like :
* `$6$emcsNNrzGZSN64mI$A/bmacTGSp2UrdcPvaROrR2FPQS5KlnoU.a/0zmfpaubBO9o1ZcgyQIic4Qb59SMxA2H8YxgS1XILO1wZhjkZ0`
is base64 encoded into :
* JDYkZW1jc05OcnpHWlNONjRtSSRBL2JtY...
and then formatted to become :
* {SHA512-CRYPT.B64}JDYkZW1jc05OcnpHWlNONjRtSSRBL2JtY....
This format should support older passwords with a {MD5-CRYPT} prefix, to allow you to migrate.

56
DOCUMENTS/Migration.md Normal file
View File

@ -0,0 +1,56 @@
# Migrating to Postfixadmin from other products
## From Postfix
Where a database structure like this exists :
See also: https://github.com/postfixadmin/postfixadmin/issues/468
```SQL
CREATE TABLE `virtual_domains` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) CHARACTER SET latin1 NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci;
CREATE TABLE `virtual_aliases` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`domain_id` int(11) NOT NULL,
`source` varchar(40) CHARACTER SET latin1 NOT NULL,
`destination` varchar(80) CHARACTER SET latin1 NOT NULL,
PRIMARY KEY (`id`),
KEY `domain_id` (`domain_id`),
CONSTRAINT `virtual_aliases_ibfk_1` FOREIGN KEY (`domain_id`) REFERENCES `virtual_domains` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=465 DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci;
CREATE TABLE `virtual_users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`domain_id` int(11) NOT NULL,
`user` varchar(40) CHARACTER SET latin1 NOT NULL,
`password` varchar(32) CHARACTER SET latin1 NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `UNIQUE_EMAIL` (`domain_id`,`user`),
CONSTRAINT `virtual_users_ibfk_1` FOREIGN KEY (`domain_id`) REFERENCES `virtual_domains` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=114 DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci;
```
## Possible route
You'll need to modify the below to match how your mailboxes are stored on disk (the maildir).
It assumes the password hash format is compatible. If not some sort of blanket reset is probably required.
### Migrate domains
`insert into domain (domain, description, transport) select name, name, 'virtual' from postfix_legacy.virtual_domains;`
### Migrate users
` insert into mailbox (username, password, name, maildir, local_part, domain) select concat(user, '@', d.name), password, user, concat(d.name, '/', user), user, d.name FROM postfix_legacy.virtual_users INNER JOIN postfix_legacy.virtual_domains d ON postfix_legacy.virtual_users.domain_id = d.id;`
### Migrate Aliases
`insert into alias (address, goto, domain) select concat(a.source, '@', d.name), a.destination, d.name FROM postfix_legacy.virtual_aliases a INNER JOIN postfix_legacy.virtual_domains d ON d.id = a.domain_id;`

37
DOCUMENTS/OPENDKIM.txt Normal file
View File

@ -0,0 +1,37 @@
#
# OpenDKIM configuration for Postfix Admin
# Originally written by: Fredrik <Freddo> Falk
#
More complete OpenDKIM documentation:
http://www.opendkim.org/opendkim.8.html
http://www.opendkim.org/opendkim.conf.5.html
http://www.opendkim.org/opendkim-genkey.8.html
https://github.com/trusteddomainproject/OpenDKIM/blob/master/opendkim/README.SQL
Here are the relevant parts of OpenDKIM v2.11.x configuration for Postfixadmin setup.
Please refer to OpenDKIM documentation for complete information.
The setup gets KeyTable and SigningTable info from MySQL, allowing domain admins to edit and add domain keys as well as
assign which authors will use them.
1. PostfixAdmin Setup
-----------------
Add `$CONF['dkim'] = 'YES';` to your `config.local.php`, and optionally ``$CONF['dkim_all_admins'] = 'YES';` to allow
non-super-admins to add domain keys and signtable entries.
2. OpenDKIM setup
-----------------
Ensure that the version of OpenDKIM supports databases/OpenDBX.
After that, simply add the following to your /etc/opendkim.conf:
```
SigningTable dsn:mysql://{USER}:{PASSWORD}@{HOST}/{DATABASE}/table=dkim_signing?keycol=author?datacol=dkim_id
KeyTable dsn:mysql://{USER}:{PASSWORD}@{HOST}/{DATABASE}/table=dkim?keycol=id?datacol=domain_name,selector,private_key
```
Replace {USER}, {PASSWORD}, {HOST}, and {DATABASE} with your values.

View File

@ -32,6 +32,36 @@ transport_maps = proxy:mysql:/etc/postfix/sql/mysql_transport_maps.cf
virtual_mailbox_base = /var/mail/vmail
# or whereever you want to store the mails
If you are using dovecot sasl for authentication you can configure Postfix main.cf:
smtpd_sasl_path = private/auth
smtpd_sasl_type = dovecot
smtpd_sasl_authenticated_header = yes
If using the Postfix submission service you could configure as follows in master.cf
submission inet n - n - - smtpd
-o syslog_name=postfix/submission
-o stress=
-o smtpd_sasl_auth_enable=yes
-o smtpd_delay_reject=no
-o smtpd_etrn_restrictions=reject
-o smtpd_helo_restrictions=
-o smtpd_client_restrictions=submission_client_checks
-o smtpd_sender_restrictions=submission_sender_checks
-o smtpd_recipient_restrictions=submission_recipient_checks
-o smtpd_tls_security_level=encrypt
and in main.cf:
smtpd_sender_login_maps = proxy:mysql:/etc/postfix/mysql-login_maps_dovecot.cf
smtpd_sasl_auth_enable = no
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated reject_unauth_destination
smtpd_restriction_classes = submission_recipient_checks, submission_sender_checks
submission_recipient_checks = reject_unknown_recipient_domain,permit_sasl_authenticated,reject_unauth_destination
submission_sender_checks = reject_sender_login_mismatch
submission_client_checks = permit_sasl_authenticated,reject_unauth_destination
Where you chose to store the .cf files doesn't really matter, but they will
have database passwords stored in plain text so they should be readable only
by user postfix, or in a directory only accessible to user postfix.
@ -125,8 +155,9 @@ user = postfix
password = password
hosts = localhost
dbname = postfix
query = SELECT transport FROM domain WHERE domain='%s' AND active = '1'
#query = SELECT transport FROM domain WHERE domain='%s' AND active = '1' AND transport != 'virtual'
# Enforce virtual transport (catches internal virtual domains and avoid mails being lost in other transport maps)
query = SELECT REPLACE(transport, 'virtual', ':') AS transport FROM domain WHERE domain='%s' AND active = '1'
(See above note re Concat + PostgreSQL)

View File

@ -0,0 +1,110 @@
# Description
This extension adds support for password expiration.
It is designed to have expiration on users passwords. An email is sent when the password is expiring in 30 days, then 14 days, then 7 days.
It is strongly inspired by https://abridge2devnull.com/posts/2014/09/29/dovecot-user-password-expiration-notifications-updated-4122015/, and adapted to fit with Postfix Admin & Roundcube's password plugin
Expiration unit is day
Expiration value for domain is set through Postfix Admin GUI
# Installation
Password Expiration is merged with PostfixAdmin - so no additional database changes should be necessary.
## Database Fields
* mailbox.password_expiry - timestamp, when the mailbox password expires.
* domain.password_expiry - default duration for when a password will expire
Changes in MySQL/MariaDB mailbox table (as defined in `$CONF['database_tables']` from config.inc.php):
## Changes in Postfix Admin :
To enable password expiration, add the following to your config.inc.php file:
`$CONF['password_expiration'] = 'YES';`
## RoundCube Password Plugin
If you are using Roundcube's password plugin, you should also adapt the `$config['password_query']` value.
I recommend to use:
`$config['password_query'] = 'UPDATE mailbox SET password=%c, modified = now(), password_expiry = now() + interval 90 day';`
of course, you may adapt to the expiration value to suit.
## Changes in Dovecot (adapt if you use another LDA)
Edit dovecot-mysql.conf file, and replace the user_query (and only this one) to be based on this query:
```
password_query = SELECT username as user, password, concat('/var/vmail/', maildir) as userdb_var, concat('maildir:/var/vmail/', maildir) as userdb_mail, 20001 as userdb_uid, 20001 as userdb_gid, m.domain FROM mailbox m, domain d where d.domain = m.domain and m.username = '%u' AND m.active = '1' AND (m.password_expiry > now() or d.password_expiry = 0)
```
Of course, you may require to adapt the uid, gid, maildir and table to your setup.
## Changes in system
You need to have a script running on a daily basis to check password expiration and send emails 30, 14 and 7 days before password expiration. An example is given below.
Edit the script to adapt the variables to your setup.
This script is using `postfixadmin.my.cnf` to read credentials, which might look a bit like :
```ini
[client]
user = me
password = secret
host = hostname
```
Edit this file to enter a DB user that is allowed to access (read only) your database.
You could create a new MySQL user with only SELECT permission on mailbox.username and mailbox.password_expiry.
This file should be protected from other users (e.g. chmod 400).
### Expiration Script
```bash
#!/bin/bash
# Adapt to your setup
# Be careful who you run this script as; other system users may be able to write to the postfixadmin database, inject
# malicious data into e.g. mailbox.username and then be able to execute commands as the user running this script.
# So, please try to avoid running this script as root.
POSTFIX_DB="postfixadmin"
MYSQL_CREDENTIALS_FILE="postfixadmin.my.cnf"
REPLY_ADDRESS="noreply@example.com"
# Change this list to change notification times and when ...
for INTERVAL in 30 14 7
do
LOWER=$(( $INTERVAL - 1 ))
QUERY="SELECT username,password_expiry FROM mailbox WHERE password_expiry > now() + interval $LOWER DAY AND password_expiry < NOW() + interval $INTERVAL DAY"
mysql --defaults-extra-file="$MYSQL_CREDENTIALS_FILE" "$POSTFIX_DB" -B -N -e "$QUERY" | while IFS=$'\t' read -a RESULT ; do
EMAIL_TO=${RESULT[0]}
PASSWORD_EXPIRE=${RESULT[1]}
# basic attempt at validating email address looks legit.
if [[ "$EMAIL_TO" =~ ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$ ]]
then
echo -e "Dear User, \n Your password will expire on ${PASSWORD_EXPIRE}" | mail -s "Password $INTERVAL days before expiration notification" -r $REPLY_ADDRESS "${EMAIL_TO}"
fi
done
done
```

View File

@ -32,6 +32,7 @@ virtual_uid_maps = static:8
virtual_gid_maps = static:8
local_transport = virtual
local_recipient_maps = $virtual_mailbox_maps
smtpd_sender_login_maps = proxy:pgsql:/etc/postfix/pgsql/virtual_sender_maps.cf
```
and for Postfix SASL support :
@ -46,6 +47,12 @@ smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
```
Please note that `smtpd_sender_login_maps` is only taken into account when a relevant restriction is specified in `smtpd_sender_restrictions`.
By default a client can send emails from any addresses!
For reference: http://www.postfix.org/postconf.5.html#reject_sender_login_mismatch
## /etc/postfix/pgsql/relay_domains.cf
```
@ -99,6 +106,16 @@ dbname = postfix
query = SELECT maildir FROM mailbox WHERE username='%s' AND active = true
```
## /etc/postfix/pgsql/virtual_sender_maps.cf
```
user = postfix
password = whatever
hosts = localhost
dbname = postfix
query = SELECT username FROM mailbox WHERE username='%s' AND active = true
```
# Dovecot
@ -217,5 +234,21 @@ default_pass_scheme = MD5-CRYPT
password_query = SELECT username AS user,password FROM mailbox WHERE username = '%u' AND active='1'
# Query to retrieve user information, note uid matches dovecot.conf AND Postfix virtual_uid_maps parameter.
user_query = SELECT '/var/vmail/mail/' || maildir AS home, 8 as uid, 8 as gid FROM mailbox WHERE username = '%u' AND active = '1'
user_query = SELECT '/var/mail/vmail/' || maildir AS home, 8 as uid, 8 as gid FROM mailbox WHERE username = '%u' AND active = '1'
```
Password query with app password and allowed remote IP support:
```
password query = SELECT user, password FROM (\
SELECT username AS user, password, '0' AS is_app_password FROM\
mailbox\
UNION\
SELECT username AS user, password, '1' AS is_app_password FROM mailbox_app_password\
)\
WHERE user='%u' AND password='%w' AND active=1 AND\
(\
"%r" IN (SELECT ip FROM totp_exception_address WHERE username="%u" OR username IS NULL OR username="@%d")\
OR (SELECT totp_secret FROM mailbox WHERE usenamer="%u") IS NULL\
OR is_app_password='1'\
)
```

View File

@ -1,48 +0,0 @@
*Description
This extension adds support for password expiration.
It is designed to have expiration on users passwords. An email is sent when the password is expiring in 30 days, then 14 days, then 7 days.
It is strongly inspired by https://abridge2devnull.com/posts/2014/09/29/dovecot-user-password-expiration-notifications-updated-4122015/, and adapted to fit with Postfix Admin & Roundcube's password plugin
Expiration unit is day
Expiration value for domain is set through Postfix Admin GUI
*Installation
Perform the following changes:
**Changes in MySQL/MariaDB mailbox table (as defined in $CONF['database_tables'] from config.inc.php):
You are invited to backup your DB first, and ensure the table name is correct.
Execute the attached SQL script (password_expiration.sql) that will add the required columns. The expiration value for existing users will be set to 90 days. If you want a different value, edit line 2 in the script and replace 90 by the required value.
**Changes in Postfix Admin :
To enable password expiration, add the following to your config.inc.php file:
$CONF['password_expiration'] = 'YES';
All my tests are performed using $CONF['encrypt'] = 'md5crypt';
**If you are using Roundcube's password plugin, you should also adapt the $config['password_query'] value.
I recommend to use:
$config['password_query'] = 'UPDATE mailbox SET password=%c, modified = now(), password_expiry = now() + interval 90 day';
of cource you may adapt to the expected expiration value
All my tests are performed using $config['password_algorithm'] = 'md5-crypt';
**Changes in Dovecot (adapt if you use another LDA)
Edit dovecot-mysql.conf file, and replace the user_query (and only this one) by this query:
password_query = SELECT username as user, password, concat('/var/vmail/', maildir) as userdb_var, concat('maildir:/var/vmail/', maildir) as userdb_mail, 20001 as userdb_uid, 20001 as userdb_gid, m.domain FROM mailbox m, domain d where d.domain = m.domain and m.username = '%u' AND m.active = '1' AND (m.password_expiry > now() or d.password_expiry = 0)
Of course you may require to adapt the uid, gid, maildir and table to your setup
**Changes in system
You need to have a script running on a daily basis to check password expiration and send emails 30, 14 and 7 days before password expiration (script attached: check_mailpass_expiration.sh).
Edit the script to adapt the variables to your setup.
This script is using postfixadmin.my.cnf to read credentials. Edit this file to enter a DB user that is allowed to access (read-write) your database. This file should be protected from any user (chmod 400).

View File

@ -1,13 +1,13 @@
Security and PostfixAdmin
-------------------------
While the developers of PostfixAdmin believe the software to be
While the developers of PostfixAdmin believe the software to be
secure, there is no guarantee that it will continue to do be so
in the future - especially as new types of exploit are discovered.
(After all, this software is without warranty!)
In the event you do discover a vulnerability in this software,
please report it to the development mailing list, or contact
please report it to the development mailing list, or contact
one of the developers directly.
@ -19,26 +19,68 @@ DATABASE USER SECURITY
You may wish to consider the following :
1. Postfix only requires READ access to the database tables.
2. The virtual vacation support (if used) only needs to WRITE to
2. The virtual vacation support (if used) only needs to WRITE to
the vacation_notification table (and read alias and vacation).
3. PostfixAdmin itself needs to be able to READ and WRITE to
3. PostfixAdmin itself needs to be able to READ and WRITE to
all the tables.
4. PostfixAdmin's setup.php additionally needs permissions to CREATE
and ALTER tables in the PostfixAdmin database. For PostgreSQL, also
permissions for CREATE FUNCTION and CREATE TRIGGER are needed.
In other words: setup.php needs all permissions on the PostfixAdmin
database.
permissions for CREATE FUNCTION and CREATE TRIGGER are needed.
In other words: setup.php needs all permissions on the PostfixAdmin
database.
Using the above, you can improve security by creating separate
database user accounts for each of the above roles, and limit
Using the above, you can improve security by creating separate
database user accounts for each of the above roles, and limit
the permissions available to them as appropriate.
FILE SYSTEM SECURITY
--------------------
PostfixAdmin does not require write support on the underlying
PostfixAdmin does not require write support on the underlying
filesystem with the following exceptions:
- the templates_c directory where Smarty caches the templates
- PHP's session.save_path to store session files
END USER SECURITY
-----------------
To enhance the security of admin and mailbox user accounts, Postfixadmin
supports a set of different features:
1. Multi-factor authentication with TOTP for admin and mailbox users.
2. Synchronize the TOTP secret with a Mail front end, for example
Roundcubemail. This enables TRUSTED mail user clients (MUAs) to
implement MFA internally.
3. Enable MUAs with allowed IP addresses to log in with username and
password. Use this feature with care. It basically deactivates MFA
for specified IPs. This feature is intended for mail user clients
that implement MFA themselves, for example Roundcubemail. However,
this can also be used to deactivate MFA when a VPN is used or other
use cases.
4. Allow SMTP, IMAP and POP login with app passwords when a TOTP secret
is set. The app passwords cannot be used to log in at Postfixadmin
itself. That means only the normal user password plus the TOTP factor
allow adding, changing or removing app passwords.
These features are DEACTIVATED by default because they need to be
supported by your MTA/MDA configuration to become effective. Please
read carefully through the documentation before activating these
features.
To activate those features, run through the following procedure:
1. Change your MDA (and if required MTA) password query. You can
take a look at the example query listed in the
Postfix-Dovecot-Postgresql-Example.md file. The example should work
for Dovecot out of the box.
2. Set up synchronization of TOTP secrets with a mail user client
application. This is important. Otherwise MFA will not be used to
protect access to mails.
Use the mailbox_post_TOTP_change_secret_script setting in the
config.inc.php. The mailbox username and domain will be passed
as parameters, the shared secret via stdin. For Roundcubemail you can
have a look at the scripts/examples/sync-roundcubemail-totp.php example.
3. Activate TOTP and app passwords in the config.inc.php by setting
$CONF['totp'] = 'YES';
$CONF['app_passwords'] = 'YES';

View File

@ -1,16 +1,20 @@
------------------------------------
Recreating a superadmin account
# Recreating a superadmin account
Login to setup.php using the setup_password you have setup config.local.php to contain.
When you run setup.php you will be required to enter a super user name and password.
This user will be able to login and modify any domain or setting. Hence, superadmin!.
From setup.php you can add a 'superadmin' account. This account can access any domain or mailboxes defined within Postfixadmin.
With that login you can create new superadmins (and you should delete or change the
password of admin@domain.tld). If that user is no longer there or you didn't use
the .TXT files, you could add another manually from the database.
The 'superadmin' account is able to create additional 'admin' users which have their access restricted to domains of your choice.
In case you forgot your superadmin username or password, you can create a new
superadmin account using setup.php.
## Forgotten setup_password
If you also have forgotten your setup password, you can use setup.php to configure
a new setup password.
In case you forgot your superadmin username or password, you can create a new superadmin account using setup.php.
## Forgotten superadmin username(s)
Once you have authenticated with your setup_password on setup.php, a list of superadmin usernames is printed out.
## Forgotten superadmin password
The easiest approach is to create a new superadmin user, and then using a database tool of your choice update the old
user with the password hash to have the password hash of a new user.

View File

@ -1,24 +1,14 @@
#
# Postfix Admin
# by Mischa Peters <mischa at high5 dot net>
# Copyright (c) 2002 - 2005 High5!
# Licensed under GPL for more info check GPL-LICENSE.TXT
#
REQUIRED!!
----------
- You are using Postfix 2.0 or higher.
- You are using Apache 1.3.27 / Lighttpd 1.3.15 or higher.
- You are using PHP 5.1.2 or higher.
- You are using MySQL 3.23 or higher OR PostgreSQL v7.4+
- You are using PHP 7.0 or higher.
- You are using MySQL 5.6 or higher OR PostgreSQL v8+
READ THIS FIRST!
----------------
This document describes upgrading from an older PostfixAdmin version
(>= v1.5x)
It's recommend that you install Postfix Admin in a new folder and not
on-top of the old install!! (At the very least, make sure you have backups of
the database and relevant filesystem!)
@ -26,7 +16,6 @@ the database and relevant filesystem!)
When upgrading Postfix Admin, make sure you backup your database before
running upgrade.php.
1. Backup the Database
----------------------
When you install from a previous version make sure you backup your database
@ -66,7 +55,7 @@ needs to be writeable for your webserver.
(if your Apache runs as user "www-data")
If you have SELinux enabled, also run (adust the path to match your setup)
If you have SELinux enabled, also run (adjust the path to match your setup)
$ sudo semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/utils/pfadmin/public/templates_c(/.*)?"
$ sudo restorecon -Rv /var/www/utils/pfadmin/
@ -98,7 +87,7 @@ into the form, and setup.php will echo out the hashed value (which needs to go i
The setup_password removes the requirement for you to delete setup.php, and also closes a security hole.
Since version 2.2 of Postfixadmin, setup.php can perform the needed database
updates automatically .
updates automatically.
If you update from 2.1 or older, also create a superadmin account using setup.php.

View File

@ -0,0 +1,82 @@
# Some screenshots of Postfixadmin
## 1. Setup process
When you visit visit https://your-site.com/postfixadmin/setup.php you'll see this -
![Initial setup greeting page](setup-step1.png?raw=true "Initial setup load")
After creating and adding the setup password hash into your config file, and then logging into the setup page with that password, you should see :
![Setup after auth](setup-step2.png?raw=true "Setup after auth")
If there are any hosting errors, or issues with your environment, they may be listed here.
Create a new admin account using your setup password .... then you can login as an admin and start creating domains and mailboxes.
## 2. As an Admin user
### Login
![Admin Login](admin-login.png?raw=true "Admin Login")
### Welcome page
![Admin Welcome](admin-welcome.png?raw=true "Admin welcome")
### View other admins
![Admin list](admin-list.png?raw=true "Admin list")
### View mailboxes and aliases for domain
![Virtual overview](mailboxes-and-forwards-for-domain.png?raw=true "Viewing aliases and mailboxes for a domain")
### Add mailbox
You can create as many mailboxes as you want ...
![Mailbox adding](mailbox-adding.png?raw=true "Creating a new mailbox")
### Add aliases (forwards)
![Foward adding](create-new-alias.png?raw=true "Creating a new forward")
### Add Fetchmail config for mailbox
![Setup Fetchmail](fetchmail-new-config.png?raw=true "Fetchmail settings")
### Add a Domain Key for use with OpenDKIM
![Add Domain Key](dkim-add-domain-key.png?raw=true "Fetchmail settings")
### Add a Sign Table Entry for use with OpenDKIM
![Add Sign Table Entry](dkim-add-sign-table-entry.png?raw=true "Fetchmail settings")
## 3. As a User
### Login
![User loginl](users-login.png?raw=true "User login")
### Welcome page
![User welcome](users-welcome.png?raw=true "User welcome")
### Change your mail forward
![User - edit mail forward(s)](users-edit-mail-forward.png?raw=true "User mail forwards")
### Set / Unset autoresponse (Vacation)
![User - autoresponder](users-enable-vacation-autoresponse.png?raw=true "User setup autoresponder")
### I forgot my password
![User - forgot password](users-forgotten-password.png?raw=true "User forgot password")

View File

@ -1,2 +0,0 @@
Random Screenshots taken on 2007/09/25, using a version of Postfixadmin from subversion.

Binary file not shown.

After

Width:  |  Height:  |  Size: 217 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 170 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 222 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 186 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 332 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 217 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 211 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 218 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 227 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 316 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 142 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 350 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 451 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 188 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 208 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 162 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 171 KiB

View File

@ -7,14 +7,13 @@
REQUIREMENTS
------------
- Postfix 2.0 or higher.
- Apache 1.3.27 / Lighttpd 1.3.15 or higher.
- PHP 5.1.2 or higher.
- Postfix
- Apache / Lighttpd
- PHP 7.0 or greater (for web server)
- one of the following databases:
- MySQL 3.23 or higher (5.x recommended)
- MariaDB (counts as MySQL ;-)
- PostgreSQL 7.4 (or higher)
- SQLite 3.12 (or higher)
- MariaDB/MySQL
- PostgreSQL
- SQLite
READ THIS FIRST!
@ -33,28 +32,39 @@ There are also lots of HOWTOs around the web. Be warned that many of them
Please stick to the PostfixAdmin documentation, and use those HOWTOs only if
you need some additional information that is missing in the PostfixAdmin
DOCUMENTS/ folder.
- http://bliki.rimuhosting.com/space/knowledgebase/linux/mail/postfixadmin+on+debian+sarge (Postfix+MySQL+Postfixadmin+Dovecot)
- http://en.gentoo-wiki.com/wiki/Virtual_mail_server_using_Postfix,_Courier_and_PostfixAdmin (Postfix+MySQL+Postfixadmin+Courier)
- https://www.linuxbabe.com/redhat/postfixadmin-create-virtual-mailboxes-centos-mail-server (Postfix+MySQL+Postfixadmin+Dovecot)
1. Unarchive new Postfix Admin
------------------------------
(if you installed PostfixAdmin as RPM or DEB package, you can obviously skip this step.)
(if you installed PostfixAdmin as RPM or DEB package, you can skip this step.)
Assuming we are installing Postfixadmin into /srv/postfixadmin, then something like this should work :
Assuming we are installing Postfixadmin into /srv/postfixadmin, then something like this should work. Please check https://github.com/postfixadmin/postfixadmin/releases to get the latest stable release first (the 3.2.10 version/url below is probably stale)
$ cd /srv/
$ wget -O postfixadmin.tgz https://github.com/postfixadmin/postfixadmin/archive/postfixadmin-3.2.tar.gz
$ wget -O postfixadmin.tgz https://github.com/postfixadmin/postfixadmin/archive/postfixadmin-3.3.10.tar.gz
$ tar -zxvf postfixadmin.tgz
$ mv postfixadmin-postfixadmin-3.2 postfixadmin
$ mv postfixadmin-postfixadmin-3.3 postfixadmin
Alternatively :
$ cd /srv
$ git clone https://github.com/postfixadmin/postfixadmin.git
$ cd postfixadmin
$ git checkout postfixadmin-3.2.2
$ git checkout postfixadmin-3.3.10
If you're happy to try out newer functionality and perhaps hit unfixed bugs, you can try the 'master' branch by a `git checkout master` (or don't run the final git checkout in the above list).
If you're using the 'master' branch, you'll need to also run :
```bash
/bin/bash install.sh
```
Which will
* install the 'composer' tool locally (composer.phar) and
* download dependent PHP libraries.
* create a templates_c directory if one does not exist.
2. Setup Web Server
-------------------
@ -71,7 +81,7 @@ or setup an alias in your webserver config. For Apache, use:
-------------------
With your chosen/preferred database server (i.e. MySQL or PostgreSQL),
you need to create a new database. A good name for this could be :
you need to create a new database. A good name for this could be:
postfix
@ -79,21 +89,25 @@ The mechanics of creating the database vary depending on which server
you are using. Most users will find using phpMyAdmin or phpPgAdmin the
easiest route.
If you wish to use the command line, you'll need to do something like :
If you wish to use the command line, you'll need to do something like:
For MySQL:
CREATE DATABASE postfix;
CREATE USER 'postfix'@'localhost' IDENTIFIED BY 'choose_a_password';
GRANT ALL PRIVILEGES ON `postfix` . * TO 'postfix'@'localhost';
FLUSH PRIVILEGES;
For PostgreSQL:
CREATE USER postfix WITH PASSWORD 'whatever';
CREATE DATABASE postfix OWNER postfix ENCODING 'unicode';
For SQLite:
$mkdir /srv/postfixadmin/database
$touch /srv/postfixadmin/database/postfixadmin.db
$sudo chown -R www-data:www-data /srv/postfixadmin/database
```bash
mkdir /srv/postfixadmin/database
touch /srv/postfixadmin/database/postfixadmin.db
sudo chown -R www-data:www-data /srv/postfixadmin/database
```
(both the directory and the database need to be writeable)
4. Configure PostfixAdmin so it can find the database
@ -103,10 +117,11 @@ Create /srv/postfixadmin/config.local.php file for your local configuration:
<?php
$CONF['database_type'] = 'mysqli';
$CONF['database_host'] = 'some-server.domain.com';
$CONF['database_user'] = 'postfix';
$CONF['database_password'] = 'postfixadmin';
$CONF['database_name'] = 'postfix';
$CONF['encrypt'] = 'dovecot:SHA512';
$CONF['configured'] = true;
?>
@ -115,7 +130,7 @@ See config.inc.php for all available config options and their default value.
You can also edit config.inc.php instead of creating a config.local.php,
but this will make updates harder and is therefore not recommended.
The most important settings are those for your database server.
The most important settings are those for your database server, and the hashing mechanism to be used to store passwords in your database.
You must also change the line that says :
@ -137,32 +152,64 @@ The easiest way to do this is
$ mkdir -p /srv/postfixadmin/templates_c
$ chown -R www-data /srv/postfixadmin/templates_c
(If you're using e.g. CentOS or another distribution which enables SELinux, something like the following may be necessary as well :
```chcon -R -t httpd_sys_content_rw_t /usr/share/postfixadmin/templates_c```
)
4a. SELinux (CentOS/Fedora etc)
-------------------------------
If you're using e.g. CentOS (or another distribution) which enables SELinux, something like the following will be necessary:
```bash
semanage fcontext -a -t httpd_sys_content_t "/srv/postfixadmin(/.*)?"
semanage fcontext -a -t httpd_sys_rw_content_t "/srv/postfixadmin/templates_c(/.*)?"
restorecon -R /srv/postfixadmin
```
(Allow the webserver to read /srv/postfixadmin/* and write to /srv/postfixadmin/templates_c/*)
And if the webserver (PHP) needs to make network connections out to a database server, you'll probably need this:
```bash
semanage boolean -m --on httpd_can_network_connect_db
````
If additionally, needing the webserver (PHP) to talk to an imap server, then you'll probably also need:
```bash
semanage boolean -m --on httpd_can_network_connect
````
5. Check settings, and create Admin user
----------------------------------------
Hit http://yourserver.tld/postfixadmin/setup.php in a web browser.
You should see a list of 'OK' messages.
You need to generate a 'setup_password' which is your way of proving you are the 'admin' responsible for this install. Alternatively, run :
The setup.php script will attempt to create the database structure
(or upgrade it if you're coming from a previous version).
```bash
php -r "echo password_hash('some password here', PASSWORD_DEFAULT);"
```
Assuming everything is OK you can specify a password (which you'll
need to use setup.php again in the future); when you submit the form,
the hashed value (which you need to enter into config.inc.php is echoed
out - with appropriate instructions on what to do with it).
and put the output of that into your config.local.php file - e.g.
create the admin user using the form displayed.
```PHP
$CONF['setup_password'] = '$2y$10$3ybxsh278eAlZKlLf8Zp9e4hmuDaW/TCYd5IZagV7coeAfzBW/GzC';
```
You need to specify that same password in the setup.php page, and click 'Login with setup_password'
You should then see a list of 'OK' messages.
The setup.php script will attempt to create the database structure (or upgrade it if you're coming from a previous version).
You can then create an Superadmin user (or add another), using the form displayed (you'll need to re-enter the setup password).
6. Use PostfixAdmin
-------------------
This is all that is needed. Fire up your browser and go to the site that you
specified to host Postfix Admin.
This is all that is needed. Fire up your browser and go to the site that you specified to host Postfix Admin. Login with the Superadmin user you've just created.
7. Integration with Postfix, Dovecot etc.
-----------------------------------------
@ -184,7 +231,7 @@ See config.inc.php - see xmlrpc_enabled key (defaults to off).
You'll need to install a copy of the Zend Framework (version 1.12.x) within Postfixadmin
or your PHP include_path (see header within xmlrpc.php).
NOTE: The XMLRPC interface is _not compatible_ with Zend Framework version 2.x.
You'll need to enable the xmlrpc link (see config.inc.php)
You'll need to enable the xmlrpc link (see config.inc.php).
8. More information
-------------------
@ -192,8 +239,8 @@ You'll need to enable the xmlrpc link (see config.inc.php)
The code and issue tracker is on GitHub:
https://github.com/postfixadmin/postfixadmin
IRC - a community of people may be able to help in #postfixadmin on irc.freenode.net.
See http://webchat.freenode.net/
IRC - a community of people may be able to help in #postfixadmin on Libera.Chat.
See https://web.libera.chat/
Legacy forum posts are on SourceForce at
https://sourceforge.net/projects/postfixadmin

View File

@ -1,9 +1,10 @@
![GitHubBuild](https://github.com/postfixadmin/postfixadmin/workflows/GitHubBuild/badge.svg)
[![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/postfixadmin/Lobby)
[![Coverage Status](https://coveralls.io/repos/github/postfixadmin/postfixadmin/badge.svg?branch=master)](https://coveralls.io/github/postfixadmin/postfixadmin?branch=master)
![GitHub repo size](https://img.shields.io/github/repo-size/postfixadmin/postfixadmin)
[![Chat](https://img.shields.io/badge/chat-on%20freenode-brightgreen.svg)](https://kiwiirc.com/nextclient/irc.freenode.net/#postfixadmin)
[![IRC Chat - #postfixadmin](https://img.shields.io/badge/IRC%20libera-brightgreen.svg)](https://web.libera.chat/#postfixadmin)
<a href="https://github.com/postfixadmin/postfixadmin/pulse" alt="Activity">
<img src="https://img.shields.io/github/commit-activity/m/postfixadmin/postfixadmin" /></a>
# PostfixAdmin
An open source, web based interface for managing domains/mailboxes/aliases etc on a Postfix based mail server.
@ -27,15 +28,34 @@ Integrates with :
- Users have the ability to login, change their password or vacation (out of office) status.
- Integration with Squirrelmail / Roundcube (via plugins)
- Optional XMLRPC based API
- Supports PHP5.6+
- Supports PHP7.2+ (older versions of PHP should work with older releases)
[Some screenshots of Postfixadmin in action (as admin and user)](DOCUMENTS/screenshots/README.md)
## Releases / Development note
- While you can install PostfixAdmin from 'git' using the 'master' branch, 'master' is our main development version. It may work. It may contain funky new exciting stuff. It may "eat your data".
- If you want an easy life, use a published release - see: https://github.com/postfixadmin/postfixadmin/releases or it's branch (e.g. postfixadmin_3.3)
- Latest significant changes should be listed in the appropriate CHANGELOG.TXT file.
## Useful Links
- [Probably all you need to read (pdf)](http://blog.cboltz.de/uploads/postfixadmin-30-english.pdf)
- http://postfixadmin.sf.net - the current homepage for the project
- [Docker Images](https://github.com/postfixadmin/docker)
- [What is it? (txt)](/DOCUMENTS/POSTFIXADMIN.txt)
- [Installation instructions](/INSTALL.TXT)
- [Wiki](https://sourceforge.net/p/postfixadmin/wiki/)
- [Mailing list](https://sourceforge.net/p/postfixadmin/discussion/676076)
- [IRC channel](irc://irc.freenode.net/postfixadmin) (#postfixadmin on irc.freenode.net).
- [IRC channel](irc://irc.libera.chat/#postfixadmin) (#postfixadmin on Libera.chat).
## Related Projects
- https://github.com/aqeltech/Dockerised-GUI-Mailserver
- https://github.com/mailserver2/mailserver
mailserver2/mailserver is a simple and full-featured mail server build as a set of multiple docker images. Features:
Postfix, PostfixAdmin, Dovecot, Rspamd, Clamav, Zeyple, Sieve, Fetchmail, Rainloop, Unbound/NSD, Træfik, {Let's Encrypt,custom,Self-signed Certificate} SSL, Supports PostgeSQL, MySQL, (beta) LDAP backends. Automated builds on DockerHub and Integration tests with Travis CI

23
SECURITY.md Normal file
View File

@ -0,0 +1,23 @@
# Security Policy
## Supported Versions
As of 2021/08 -
| Version | Supported |
| ------- | ------------------ |
| 'dev' | :x: GitHub 'master' branch, use at own risk! |
| 3.3.x | :white_check_mark: |
| 3.2.x | Security/critical fixes only |
| < 3.2.x | :x: |
Releases are published at :
* https://github.com/postfixadmin/postfixadmin/releases
* ocassionally at https://sourceforge.net/projects/postfixadmin/ - sometimes with RPM/DEB packages.
## Reporting a Vulnerability
Either message GingerDog or cboltz on the PostfixAdmin libera chat - IRC channel, or email. Email addresses can be found in the 'git' changelog.

View File

@ -91,3 +91,15 @@ Additional authors:
sending vacation mails, even if one or multiple of the recipients the alias points to has vacation
currently active.
2022-10-20 Jan Kruis <jan@crossreference.nl>
Add configuration parameter $replace_from ,$replace_until and $date_format for the subroutine replace_string
the subroutine replace_string replaces in the bodytext the text defined at $replace_from and $replace_until with the date of active from and active until in the format specified at $date_format.
Add configuration parameter $account_check and $account_name if account_check is set it will add the value of name of the mailbox in front of the email and it is shown as sender,
if no name is specified at the mailbox, the variable friendly-name is placed in front of the email and it is shown as sender otherwise the email will show as sender.
2023-08-18 Andrew Ruthven <andrew@etc.gen.nz>
Minor improvements to the use of Log4Perl
Fix handling of the default $smtp_client setthing of 'localhost'
if we aren't connecting to the SMTP server on localhost.

View File

@ -1,6 +1,6 @@
#!/usr/bin/perl
#
# Virtual Vacation 4.2
# Virtual Vacation 4.2.1
#
# See Contributions.txt for a list of contributions.
# https://github.com/postfixadmin/postfixadmin/blob/master/VIRTUAL_VACATION/Contributions.txt
@ -28,9 +28,11 @@ use Email::Sender::Transport::SMTP;
use Email::Simple;
use Email::Simple::Creator;
use Try::Tiny;
use Log::Log4perl qw(get_logger :levels);
use Log::Log4perl qw(get_logger :levels :nowarn);
use File::Basename;
use Net::DNS;
use Time::Piece;
# ========== begin configuration ==========
# IMPORTANT: If you put passwords into this script, then remember
@ -53,16 +55,25 @@ our $vacation_domain = 'autoreply.example.org';
our $recipient_delimiter = '+';
# SMTP server used to send vacation e-mails, leave empty to look up the MX of the sending domain and deliver it directly (might break DKIM signatures, mail archiving etc.)
our $smtp_server = 'localhost';
# port to connect to; defaults to 25 for non-SSL, 465 for 'ssl', 587 for 'starttls'
our $smtp_server_port = 25;
# this is the helo we [the vacation script] use on connection; you may need to change this to your hostname or something,
# depending upon what smtp helo restrictions you have in place within Postfix.
# this is the local address to connect from
our $smtp_client = 'localhost';
# this is the helo we [the vacation script] use on connection; you may need to change this to your hostname or something,
# depending upon what SMTP helo restrictions you have in place within Postfix.
our $smtp_helo = 'localhost.localdomain';
# send mail encrypted or plaintext
# if 'starttls', use STARTTLS; if 'ssl' (or 1), connect securely; otherwise, no security
our $smtp_ssl = 'starttls';
# if 1, connect securely via SSL
# if 'starttls', connect using starttls (plaintext+neg TLS)
# if 'maybestarttls' - try starttls, otherwise plaintext.
# if 0 (default), plain text, no security
# See also : https://metacpan.org/pod/Email::Sender::Transport::SMTP
our $smtp_ssl = 0;
# maximum time in secs to wait for server; default is 120
our $smtp_timeout = '120';
@ -72,15 +83,22 @@ our $smtp_authid = '';
# sasl_password: the password to use for auth; required if username is provided
our $smtp_authpwd = '';
# This specifies the mail 'from' name which is shown to recipients of vacation replies.
# If you leave it empty, the vacation mail will contain:
# If you leave it empty, the vacation mail will contain:
# From: <original@recipient.domain>
# If you specify something here you'd instead see something like :
# From: Some Friendly Name <original@recipient.domain>
our $friendly_from = '';
# If accountname_check is set it will add the account name in front of the email "AccountName <original@recipient.domain>" if the accountname is not a empty string
# otherwise $friendly_name will be set in front of the email if not empty.
our $accountname_check = 0;
our $account_name = ''; # leave this blank it will be filled with 'name' field from table 'mailbox'
# Set to 1 to enable logging to syslog.
our $syslog = 0;
our $syslog = 1;
# path to logfile, when empty logging is suppressed
# change to e.g. /dev/null if you want nothing logged.
@ -104,7 +122,7 @@ our $interval = 0;
# be answered when $custom_noreply_pattern is set to 1.
# default = 0
our $custom_noreply_pattern = 0;
our $noreply_pattern = 'bounce|do-not-reply|facebook|linkedin|list-|myspace|twitter';
our $noreply_pattern = 'bounce|do-not-reply|facebook|linkedin|list-|myspace|twitter';
# Never send vacation mails for the following recipient email addresses.
# Useful for e.g. aliases pointing to multiple recipients which have vacation active
@ -113,8 +131,23 @@ our $noreply_pattern = 'bounce|do-not-reply|facebook|linkedin|list-|myspace|twit
# default = ''
# preventing vacation notifications for recipient info@example.org would look like this:
# our $no_vacation_pattern = 'info\@example\.org';
our $no_vacation_pattern = 'info\@example\.org';
our $no_vacation_pattern = 'info\@example\.org';
#
# The subroutine replace_string replaces in the body text the text defined at $replace_from and $replace_until with the date of activefrom and activeuntil in the format specified at $date_format.
#
# Like :
#
# %Y/%m/%d => 2022/10/01
# %d-%m-%Y => 01-10-2022
# %d %b %y => 01 Oct 2022
#
# see for more option
# https://www.tutorialspoint.com/perl/perl_date_time.htm
our $replace_from = "<%From_Date>"; #You can place your own replacement text here for active from
our $replace_until = "<%Until_Date>"; #You can place your own replacement text here for active until
our $date_format = '%Y-%m-%d';
# instead of changing this script, you can put your settings to /etc/mail/postfixadmin/vacation.conf
# or /etc/postfixadmin/vacation.conf just use Perl syntax there to fill the variables listed above
@ -130,6 +163,15 @@ if (-f '/etc/mail/postfixadmin/vacation.conf') {
# =========== end configuration ===========
# Try and enable log_to_file if syslog is disabled
if ($syslog == 0 && $log_to_file == 0 && (
(-f $logfile && -w $logfile)
||
(! -f $logfile && -w dirname($logfile)))
) {
$log_to_file=1;
}
if($log_to_file == 1) {
if (( ! -w $logfile ) && (! -w dirname($logfile))) {
# Cannot log; no where to write to.
@ -159,7 +201,7 @@ if($test_mode == 1) {
$appender->layout($log_layout);
$logger->add_appender($appender);
$logger->debug('Test mode enabled');
} else {
$logger = get_logger();
if($log_to_file == 1) {
@ -208,7 +250,7 @@ if (!$dbh) {
my $db_true; # MySQL and PgSQL use different values for TRUE, and unicode support...
if ($db_type eq 'mysql') {
$dbh->do('SET CHARACTER SET utf8;');
$dbh->do('SET CHARACTER SET utf8mb4;');
$db_true = '1';
} else { # Pg
$dbh->do("SET CLIENT_ENCODING TO 'UTF8'");
@ -220,7 +262,7 @@ if ($db_type eq 'mysql') {
my $loopcount=0;
#
# Get interval_time for email user from the vacation table
# Get interval_time for email user from the vacation table
#
sub get_interval {
my ($to) = @_;
@ -312,7 +354,7 @@ sub already_notified {
}
#
# Check to see if there is a vacation record against a specific email address.
# Check to see if there is a vacation record against a specific email address.
#
sub check_for_vacation {
my ($email_to_check) =@_;
@ -323,9 +365,67 @@ sub check_for_vacation {
return $rv;
}
#
# Get Accountname stored in name of table mailbox
#
sub get_accountname {
my ($from_mailbox) =@_;
my $logger = get_logger();
# try and determine if email address has vacation turned on; we
# have to do alias searching, and domain aliasing resolution for this.
my $query = qq{SELECT name FROM mailbox WHERE username=? };
my $stm = $dbh->prepare($query) or panic_prepare($query);
$stm->execute($to) or panic_execute($query,"username='$from_mailbox'");
my @row = $stm->fetchrow_array;
my $rv = $stm->rows;
my $accountname = $row[0];
return $accountname;
}
#
# Replace <%From_Date> with date part of activefrom from the vacation table on base of email
# Replace <%Until_Date> with date part of activeuntil from the vacation table on base of email
#
# The variable $replace_from and $replace_until will have the <%From_Date> and <%Until_Date> replacement text
sub replace_string {
my ($to) =@_;
my $logger = get_logger();
my $query = qq{SELECT body,activefrom,activeuntil FROM vacation WHERE email=? };
my $stm = $dbh->prepare($query) or panic_prepare($query);
$stm->execute($to) or panic_execute($query,"email='$to'");
my @row = $stm->fetchrow_array;
my $rv = $stm->rows;
my $vacation_body = $row[0];
my $f_date = $row[1];
my $u_date = $row[2];
#
# Note !! do not replace '%Y-%m-%d' with date_format because this is the format that f_date and u_date are are filled with date in this format
# $date_format is used to display the dates in your choice of format.
#
my $date_f = Time::Piece->strptime($f_date,'%Y-%m-%d');
$f_date = $date_f->strftime($date_format);
my $date_u = Time::Piece->strptime($u_date,'%Y-%m-%d');
$u_date = $date_u->strftime($date_format);
$vacation_body = replace_a_string($vacation_body,$replace_from,$f_date);
$vacation_body = replace_a_string($vacation_body,$replace_until,$u_date);
$logger->debug ("From = $f_date Until = $u_date ** for Email = $to Body = $vacation_body ");
return $vacation_body;
}
sub replace_a_string {
my ( $result,$what_goes_out,$what_goes_in) =@_;
$result =~ s/$what_goes_out/$what_goes_in/ig;
return $result;
}
# try and determine if email address has vacation turned on;
# we have to do alias searching, and domain aliasing resolution for this.
# If found, return ($num_matches, $real_email);
sub find_real_address {
my ($email) = @_;
@ -438,9 +538,9 @@ sub send_vacation_email {
}
$logger->debug("Will send vacation response for $orig_messageid: FROM: $email (orig_to: $orig_to), TO: $orig_from; VACATION SUBJECT: $row[0] ; VACATION BODY: $row[1]");
my $subject = $row[0];
$subject = Encode::decode_utf8( $subject ) if( !Encode::is_utf8( $subject ) );
$subject = Encode::decode_utf8($subject) if (!Encode::is_utf8($subject));
$orig_subject = decode("mime-header", $orig_subject);
$subject =~ s/\$SUBJECT/$orig_subject/g;
if ($subject ne $row[0]) {
@ -448,24 +548,36 @@ sub send_vacation_email {
}
my $body = $row[1];
$body = Encode::decode_utf8( $body ) if( !Encode::is_utf8( $body ) );
$body = Encode::decode_utf8($body) if (!Encode::is_utf8($body));
## Replace <%Time> marks in the Body string with dates form the table vacation
$body = replace_string ($email);
my $from = $email;
my $to = $orig_from;
# part of the username in the email && part of the domain in the email
my ($email_username_part, $email_domain_part) = split(/@/, $email);
if ($smtp_server eq '') {
# part of the username in the email && part of the domain in the email
my (undef, $email_domain_part) = split(/@/, $email);
my $resolver = Net::DNS::Resolver->new;
my @mx = mx($resolver, $email_domain_part);
my $smtp_server;
if (@mx) {
$smtp_server = @mx[0]->exchange;
$logger->debug("Found MX record <$smtp_server> for user <$email>!");
} else {
$logger->error("Unable to find MX record for user <$email>, error message: ".$resolver->errorstring);
exit(0);
my $resolver = Net::DNS::Resolver->new;
my @mx = mx($resolver, $email_domain_part);
if (@mx) {
$smtp_server = @mx[0]->exchange;
$logger->debug("Found MX record <$smtp_server> for user <$email>!");
} else {
$logger->error("Unable to find MX record for user <$email>, error message: ".$resolver->errorstring);
exit(0);
}
}
# We can't use localhost as the local bind interface if we're trying
# to connect to an SMTP server that isn't on localhost, we won't be
# able to route to that server.
if ($smtp_server ne 'localhost' && $smtp_client eq 'localhost') {
$smtp_client = undef;
};
my $smtp_params = {
host => $smtp_server,
port => $smtp_server_port,
@ -475,6 +587,7 @@ sub send_vacation_email {
ssl => $smtp_ssl,
timeout => $smtp_timeout,
localaddr => $smtp_client,
helo => $smtp_helo,
debug => 0,
};
@ -486,16 +599,34 @@ sub send_vacation_email {
my $transport = Email::Sender::Transport::SMTP->new($smtp_params);
$subject = Encode::encode_utf8( $subject ) if( Encode::is_utf8( $subject ) );
$body = Encode::encode_utf8( $body ) if( Encode::is_utf8( $body ) );
# QUESTION !!
#I think the two lines below (which I have commented out in) are no longer necessary, they appear earlier in the script see line 490 and 498
#
# --> $subject = Encode::encode_utf8($subject) if(Encode::is_utf8($subject));
# --> $body = Encode::encode_utf8($body) if(Encode::is_utf8($body));
#
my $email_from = $from ;
my $account_name = get_accountname($from);
if ($friendly_from ne'') {
$email_from = encode_mimewords($friendly_from, 'Charset', 'UTF-8') . " <$from>";
}
if (($accountname_check ==1) and ($account_name ne '')) {
$email_from = encode_mimewords($account_name, 'Charset', 'UTF-8') . " <$from>";
}
$logger->debug("** From = $from Email_from = $email_from Friendly_name = $friendly_from Accountname = $account_name **\n");
$email = Email::Simple->create(
header => [
To => $to,
From => $from,
From => $email_from,
Subject => encode_mimewords($subject, 'Charset', 'UTF-8'),
Precedence => 'junk',
'Content-Type' => "text/plain; charset=utf-8",
'X-Loop' => 'Postfix Admin Virtual Vacation',
'Auto-Submitted' => 'auto-replied',
],
body => $body,
);
@ -512,7 +643,7 @@ sub send_vacation_email {
if (@_) {
$logger->error("Failed to send vacation response to $to from $from subject $subject: @_");
} else {
$logger->debug("Vacation response sent to $to from $from subject $subject sent\n");
$logger->debug("Vacation response sent to $to from $from subject $subject Email $email_from sent\n");
}
}
}
@ -556,14 +687,14 @@ sub strip_address {
sub panic_prepare {
my ($arg) = @_;
my $logger = get_logger();
$logger->error("Could not prepare sql statement: '$arg'");
$logger->error("Could not prepare SQL statement: '$arg'");
exit(0);
}
sub panic_execute {
my ($arg,$param) = @_;
my $logger = get_logger();
$logger->error("Could not execute sql statement - '$arg' with parameters '$param'");
$logger->error("Could not execute SQL statement - '$arg' with parameters '$param'");
exit(0);
}
@ -573,7 +704,7 @@ sub check_and_clean_from_address {
my ($address) = @_;
my $logger = get_logger();
if($address =~ /^(noreply|postmaster|mailer\-daemon|listserv|majordomo|owner\-|request\-|bounces\-)/i ||
if($address =~ /^(noreply|no\-reply|do_not_reply|no_reply|postmaster|mailer\-daemon|listserv|majordomo|owner\-|request\-|bounces\-)/i ||
$address =~ /\-(owner|request|bounces)\@/i ||
($custom_noreply_pattern == 1 && $address =~ /^.*($noreply_pattern).*/i) ) {
$logger->debug("sender $address contains $1 - will not send vacation message");
@ -587,6 +718,7 @@ sub check_and_clean_from_address {
#$logger->debug("Address cleaned up to $address");
return $address;
}
########################### main #################################
# Take headers apart
@ -606,6 +738,7 @@ while (<STDIN>) {
elsif (/^message\-id:\s*(.*)\s*\n$/i) { $messageid = $1; $lastheader = \$messageid; }
elsif (/^x\-spam\-(flag|status):\s+yes/i) { $logger->debug("x-spam-$1: yes found; exiting"); exit (0); }
elsif (/^x\-facebook\-notify:/i) { $logger->debug('Mail from facebook, ignoring'); exit(0); }
elsif (/^x\-amazon\-mail\-relay\-type:\s*notification/i) { $logger->debug('Notification mail from Amazon, ignoring'); exit(0); }
elsif (/^precedence:\s+(bulk|list|junk)/i) { $logger->debug("precedence: $1 found; exiting"); exit (0); }
elsif (/^x\-loop:\s+postfix\ admin\ virtual\ vacation/i) { $logger->debug('x-loop: postfix admin virtual vacation found; exiting'); exit (0); }
elsif (/^Auto\-Submitted:\s*no/i) { next; }
@ -617,7 +750,7 @@ while (<STDIN>) {
elsif (/^(x\-(avas\-spam|spamtest|crm114|razor|pyzor)\-status):\s+(spam)/i) { $logger->debug("$1: $3 found; exiting"); exit (0); }
elsif (/^(x\-osbf\-lua\-score):\s+[0-9\/\.\-\+]+\s+\[([-S])\]/i) { $logger->debug("$1: $2 found; exiting"); exit (0); }
elsif (/^x\-autogenerated:\s*reply/i) { $logger->debug('x-autogenerated found; exiting'); exit (0); }
elsif (/^x\-auto\-response\-suppress:\s*oof/i) { $logger->debug('x-auto-response-suppress: oof found; exiting'); exit (0); }
elsif (/^(x\-auto\-response\-suppress):\s*(oof|all)/i) { $logger->debug("$1: $2 found; exiting"); exit (0); }
else {$lastheader = '' ; }
}
@ -641,9 +774,9 @@ if(!$from || !$to || !$messageid || !$smtp_sender || !$smtp_recipient) {
}
$logger->debug("Email headers have to: '$to' and From: '$from'");
if ($to =~ /^.*($no_vacation_pattern).*/i) {
if ($to =~ /^.*($no_vacation_pattern).*/i) {
$logger->debug("Will not send vacation reply for messages to $to");
exit(0);
exit(0);
}
$to = strip_address($to);

View File

@ -1,20 +0,0 @@
#!/bin/bash
#Adapt to your setup
POSTFIX_DB="postfix_test"
MYSQL_CREDENTIALS_FILE="postfixadmin.my.cnf"
REPLY_ADDRESS=noreply@example.com
# Change this list to change notification times and when ...
for INTERVAL in 30 14 7
do
LOWER=$(( $INTERVAL - 1 ))
QUERY="SELECT username,password_expiry FROM mailbox WHERE password_expiry > now() + interval $LOWER DAY AND password_expiry < NOW() + interval $INTERVAL DAY"
mysql --defaults-extra-file="$MYSQL_CREDENTIALS_FILE" "$POSTFIX_DB" -B -e "$QUERY" | while read -a RESULT ; do
echo -e "Dear User, \n Your password will expire on ${RESULT[1]}" | mail -s "Password 30 days before expiration notication" -r $REPLY_ADDRESS ${RESULT[0]}
done
done

View File

@ -1,4 +1,7 @@
<?php
require_once(dirname(__FILE__) . '/vendor/autoload.php');
/**
* Postfix Admin
*
@ -15,10 +18,19 @@
* environment and ensures other functions are loaded.
*/
if (!defined('POSTFIXADMIN')) { # already defined if called from setup.php
define('POSTFIXADMIN', 1); # checked in included files
// See: https://github.com/postfixadmin/postfixadmin/pull/541 - try and check if the user has a turkish locale and warn?
$old = setlocale(LC_ALL, 'C');
if (preg_match('/_TR/i', $old)) {
error_log("WARNING: You may have a Turkish locale set; this breaks the loading of some libraries (Smarty) we depend upon.");
// don't revert back to $old?
} else {
setlocale(LC_ALL, $old); // revert back.
}
if (!defined('POSTFIXADMIN_CLI')) {
if (!defined('POSTFIXADMIN')) {
define('POSTFIXADMIN', 1);
if (!defined('POSTFIXADMIN_CLI')) { // postfixadmin-cli
// this is the default; see also https://sourceforge.net/p/postfixadmin/bugs/347/
session_cache_limiter('nocache');
session_name('postfixadmin_session');
@ -27,26 +39,14 @@ if (!defined('POSTFIXADMIN')) { # already defined if called from setup.php
if (empty($_SESSION['flash'])) {
$_SESSION['flash'] = array();
}
// avoid clickjacking attacks?
header('X-Frame-Options: DENY');
}
}
$incpath = dirname(__FILE__);
/**
* @param string $class
* __autoload implementation, for use with spl_autoload_register().
*/
function postfixadmin_autoload($class) {
$PATH = dirname(__FILE__) . '/model/' . $class . '.php';
if (is_file($PATH)) {
require_once($PATH);
return true;
}
return false;
}
spl_autoload_register('postfixadmin_autoload');
if (!is_file("$incpath/config.inc.php")) {
die("config.inc.php is missing!");
}
@ -62,13 +62,12 @@ if (isset($CONF['configured']) && !defined('PHPUNIT_TEST')) {
}
}
Config::write($CONF);
Config::getInstance()->setAll($CONF);
$PALANG = [];
require_once("$incpath/languages/language.php");
require_once("$incpath/functions.inc.php");
if (extension_loaded('Phar') && ( version_compare(PHP_VERSION, '7.0.0') < 0)) {
require_once("$incpath/lib/random_compat.phar");
}
if (defined('POSTFIXADMIN_CLI')) {
$language = 'en'; # TODO: make configurable or autodetect from locale settings
@ -87,13 +86,11 @@ if (!empty($CONF['language_hook']) && function_exists($CONF['language_hook'])) {
Config::write('__LANG', $PALANG);
unset($incpath);
if (!defined('POSTFIXADMIN_CLI')) {
if (!is_file(dirname(__FILE__) . "/lib/smarty.inc.php")) {
die("smarty.inc.php is missing! Something is wrong...");
if (!isset($PALANG)) {
die("environment not setup correctly");
}
require_once(dirname(__FILE__) . "/lib/smarty.inc.php");
Smarty_Autoloader::register();
}
/* vim: set expandtab softtabstop=4 tabstop=4 shiftwidth=4: */

7
composer-update.sh Normal file
View File

@ -0,0 +1,7 @@
#!/bin/bash
# for github :
composer update --no-dev
# for local testing/dev:
# composer update

View File

@ -2,7 +2,10 @@
"name": "postfixadmin/postfixadmin",
"description": "web based administration interface for Postfix mail servers",
"type": "project",
"license": "GPL-2.0",
"license": "GPL-2.0-only",
"config": {
"preferred-install":"dist"
},
"scripts": {
"build" : [
"@check-format",
@ -11,32 +14,41 @@
"@psalm",
"@test"
],
"check-format": "php-cs-fixer fix --ansi --dry-run --diff",
"format": "php-cs-fixer fix --ansi",
"lint": "@php ./vendor/bin/parallel-lint --exclude vendor/ --exclude lib/block_random_int.php --exclude lib/array_column.php .",
"test": "DATABASE=sqlite ./vendor/bin/phpunit --coverage-clover ./coverage.xml tests/",
"check-format": "@php vendor/bin/php-cs-fixer fix --ansi --dry-run --diff",
"format": "@php vendor/bin/php-cs-fixer fix --ansi",
"lint": "@php ./vendor/bin/parallel-lint --exclude vendor/ .",
"test": "@php ./vendor/bin/phpunit --coverage-clover ./clover.xml tests/",
"test-fixup": "mkdir -p templates_c ; test -f config.local.php || touch config.local.php",
"psalm": "@php ./vendor/bin/psalm --no-cache --show-info=false "
"psalm": "@php ./vendor/bin/psalm.phar --no-cache --show-info=false "
},
"require": {
"php": ">=7.0"
"php": ">=7.4",
"smarty/smarty": "^3|^4",
"postfixadmin/password-hashing": "^0.0.1",
"endroid/qr-code": "^4.6",
"spomky-labs/otphp": "^10.0"
},
"require-dev": {
"ext-mysqli": "*",
"ext-sqlite3": "*",
"friendsofphp/php-cs-fixer": "*",
"jakub-onderka/php-parallel-lint": "^1.0",
"php": ">7.2.0",
"php-coveralls/php-coveralls" : "*",
"phpunit/phpunit": "^6|^7",
"vimeo/psalm":"^3.0",
"ext-mbstring": "*",
"friendsofphp/php-cs-fixer": "^3.0",
"php-parallel-lint/php-parallel-lint": "^1.0",
"php": ">= 7.4",
"php-coveralls/php-coveralls": "*",
"phpunit/phpunit": "8.*",
"psalm/phar":"^4.0",
"shardj/zf1-future" : "^1.12"
},
"autoload": {
"classmap" : [ "model/" ],
"files": [
"config.inc.php",
"functions.inc.php",
"lib/smarty/libs/bootstrap.php"
"functions.inc.php"
]
},
"support": {
"irc": "irc://irc.libera.chat/postfixadmin",
"issues": "https://github.com/postfixadmin/postfixadmin/issues"
}
}

View File

@ -141,13 +141,18 @@ $CONF['database_tables'] = array (
'vacation' => 'vacation',
'vacation_notification' => 'vacation_notification',
'quota' => 'quota',
'quota2' => 'quota2',
'quota2' => 'quota2',
'dkim' => 'dkim',
'dkim_signing' => 'dkim_signing',
);
// Site Admin
// Define the Site Admin's email address below.
// This will be used to send emails from to create mailboxes and
// from Send Email / Broadcast message pages.
// This will be used to send emails from to
// * create mailboxes and
// * Send Email / Broadcast message pages and
// * In password reset emails.
//
// Leave blank to send email from the logged-in Admin's Email address.
$CONF['admin_email'] = '';
@ -167,34 +172,47 @@ $CONF['admin_name'] = 'Postmaster';
$CONF['smtp_server'] = 'localhost';
$CONF['smtp_port'] = '25';
// The communication layer used.
//
// 'plain' Everything in plain text (standard port: 25).
// 'tls' TLS/SSL from the very beginning (standard port: 465).
// 'starttls' "STARTTLS" in plain text and then TLS/SSL (standard port: 587).
$CONF['smtp_type'] = 'plain';
// SMTP Client
// Hostname (FQDN) of the server hosting Postfix Admin
// Used in the HELO when sending emails from Postfix Admin
$CONF['smtp_client'] = '';
// Set 'YES' to use TLS when sending emails.
$CONF['smtp_sendmail_tls'] = 'NO';
// Encrypt - how passwords are stored/hashed in the database.
//
// See: https://github.com/postfixadmin/postfixadmin/blob/master/DOCUMENTS/HASHING.md
//
// - PLAIN, CLEAR or CLEARTEXT - plain text variants, may be useful for testing.
//
// - ARGON2ID, ARGON2I, SHA512-CRYPT, SHA256-CRYPT or BLF-CRYPT might be good options.
//
// - other, older variants are :
// - md5crypt,
// - md5,
// - system,
// - mysql_encrypt - mysql's password()
// - dovecot:CRYPT-METHOD = use dovecotpw -s 'CRYPT-METHOD'.
// - Note: dovecot relies on doveadm binary, and suitable permissions on config files - see https://github.com/postfixadmin/postfixadmin/issues/398
//
// - authlib = support for courier-authlib style passwords - also set $CONF['authlib_default_flavor']
//
// - php_crypt:CRYPT-METHOD:DIFFICULTY:PREFIX = use PHP built in crypt()-function. Example: php_crypt:SHA512:50000
// - php_crypt CRYPT-METHOD: Supported values are DES, MD5, BLOWFISH, SHA256, SHA512 (default)
// - php_crypt - DIFFICULTY: Larger value is more secure, but uses more CPU and time for each login.
// - php_crypt - DIFFICULTY: Set this according to your CPU processing power.
// - php_crypt - DIFFICULTY: Supported values are BLOWFISH:4-31, SHA256:1000-999999999, SHA512:1000-999999999
// - php_crypt - DIFFICULTY: leave empty to use default values (BLOWFISH:10, SHA256:5000, SHA512:5000). Example: php_crypt:SHA512
// - php_crypt - PREFIX: hash has specified prefix - example: php_crypt:SHA512::{SHA256-CRYPT}
//
// - sha512.b64 - {SHA512-CRYPT.B64} (base64 encoded sha512 crypt) (no dovecot dependency; should support migration from md5crypt)
// Encrypt
// In what way do you want the passwords to be crypted?
// md5crypt = internal postfix admin md5
// md5 = md5 sum of the password
// system = whatever you have set as your PHP system default
// cleartext = clear text passwords (ouch!)
// mysql_encrypt = useful for PAM integration
// authlib = support for courier-authlib style passwords - also set $CONF['authlib_default_flavor']
// dovecot:CRYPT-METHOD = use dovecotpw -s 'CRYPT-METHOD'. Example: dovecot:CRAM-MD5
// php_crypt:CRYPT-METHOD:DIFFICULTY = use PHP built in crypt()-function. Example: php_crypt:SHA512:50000
// - php_crypt CRYPT-METHOD: Supported values are DES, MD5, BLOWFISH, SHA256, SHA512
// - php_crypt DIFFICULTY: Larger value is more secure, but uses more CPU and time for each login.
// - php_crypt DIFFICULTY: Set this according to your CPU processing power.
// - php_crypt DIFFICULTY: Supported values are BLOWFISH:4-31, SHA256:1000-999999999, SHA512:1000-999999999
// - php_crypt DIFFICULTY: leave empty to use default values (BLOWFISH:10, SHA256:5000, SHA512:5000). Example: php_crypt:SHA512
// IMPORTANT:
// - don't use dovecot:* methods that include the username in the hash - you won't be able to login to PostfixAdmin in this case
// - you'll need at least dovecot 2.1 for salted passwords ('doveadm pw' 2.0.x doesn't support the '-t' option)
// - dovecot 2.0.0 - 2.0.7 is not supported
$CONF['encrypt'] = 'md5crypt';
$CONF['encrypt'] = 'php_crypt'; // SHA512
// In what flavor should courier-authlib style passwords be encrypted?
// (only used if $CONF['encrypt'] == 'authlib')
@ -227,8 +245,19 @@ $CONF['password_validation'] = array(
'/.{5}/' => 'password_too_short 5', # minimum length 5 characters
'/([a-zA-Z].*){3}/' => 'password_no_characters 3', # must contain at least 3 characters
'/([0-9].*){2}/' => 'password_no_digits 2', # must contain at least 2 digits
# '/([!\".,*&^%$£)(_+=\-`\'#@~\[\]\\<>\/].*){1,}/' => 'password_no_special 1', # must contain at least 1 special character
/* support a 'callable' value which if it returns a non-empty string will be assumed to have failed, non-empty string should be a PALANG key */
// 'length_check' => function($password) { if (strlen(trim($password)) < 3) { return 'password_too_short'; } },
);
// Username legal characters
// New/changed usernames will be checked against this regular expression with javascript
// during entry, offending characters not displaying.
// For example:
// $CONF['username_legal_chars'] = '^[a-zA-Z0-9-_.]+$';
$CONF['username_legal_chars'] = '';
// Generate Password
// Generate a random password for a mailbox or admin and display it.
// If you want to automagically generate passwords set this to 'YES'.
@ -314,7 +343,9 @@ function maildir_name_hook($domain, $user) {
Note: Adding a field to $struct adds the handling of this field in
PostfixAdmin, but it does not create it in the database. You have to do
that yourself.
that yourself.
Note: If you add fields here and you want them to be displayed in the
virtual lists, you must also modify the corresponding virtual-list template.
Please follow the naming policy for custom database fields and tables on
https://sourceforge.net/p/postfixadmin/wiki/Custom_fields/
to avoid clashes with future versions of PostfixAdmin.
@ -338,6 +369,8 @@ $CONF['alias_struct_hook'] = '';
$CONF['mailbox_struct_hook'] = '';
$CONF['alias_domain_struct_hook'] = '';
$CONF['fetchmail_struct_hook'] = '';
$CONF['dkim_struct_hook'] = '';
$CONF['dkim_signing_struct_hook'] = '';
// Default Domain Values
@ -510,6 +543,25 @@ $CONF['emailcheck_resolve_domain']='YES';
// from being the destination for an alias
$CONF['emailcheck_localaliasonly']='NO';
// Use TOTP for logging into Postfixadmin, can be overridden for listed
// IPs to allow access by software that provide their own checking.
// Exceptions can be of user, domain or global scope.
// This also bundles several menu items in a "security" dropdown.
$CONF['totp'] = 'NO';
// Use revokable application passwords to limit the risk of storing a
// password in another system. These passwords can not access Postfixadmin.
$CONF['app_passwords'] = 'NO';
// OpenDKIM stuff
// Enable the dkim database component
$CONF['dkim'] = 'NO';
// Allow regular admins to add/edit/remove dkim entries
$CONF['dkim_all_admins'] = 'NO';
// End OpenDKIM stuff
// Optional:
// Analyze alias gotos and display a colored block in the first column
// indicating if an alias or mailbox appears to deliver to a non-existent
@ -556,47 +608,94 @@ $CONF['show_custom_colors']=array("lightgreen","lightblue");
// Set to "" to disable this check.
$CONF['recipient_delimiter'] = "";
// Optional:
/**
* NOTE FOR OPTIONAL SCRIPTS BELOW.
*
* These scripts will probably be called by your webserver user (typically 'www-data').
*
* Execution may fail for a number of reasons, perhaps :
* * PHP is running in 'safe mode'
* * you have operating system features like SELinux or Apparmor
* * Unix file ownership/permission restrictions
*
* Your mail system probably requires different ownership (e.g. courier, dovecot, mail ...)
*
* You will probably need to use 'sudo' either within the script, or when calling it, to resolve issues of ownership/permission.
*
* Details about errors from execution should be logged into PHP's error_log.
*
* See also: https://github.com/postfixadmin/postfixadmin/blob/master/DOCUMENTS/FAQ.txt
*
*/
// Optional: See NOTE above.
// Script to run after creation of mailboxes.
// Note that this may fail if PHP is run in "safe mode", or if
// operating system features (such as SELinux) or limitations
// prevent the web-server from executing external scripts.
// Parameters: (1) username (2) domain (3) maildir (4) quota
// $CONF['mailbox_postcreation_script']='sudo -u courier /usr/local/bin/postfixadmin-mailbox-postcreation.sh';
$CONF['mailbox_postcreation_script'] = '';
// Optional:
// Optional: See NOTE above.
// Script to run after alteration of mailboxes.
// Note that this may fail if PHP is run in "safe mode", or if
// operating system features (such as SELinux) or limitations
// prevent the web-server from executing external scripts.
// Parameters: (1) username (2) domain (3) maildir (4) quota
// $CONF['mailbox_postedit_script']='sudo -u courier /usr/local/bin/postfixadmin-mailbox-postedit.sh';
$CONF['mailbox_postedit_script'] = '';
// Optional:
// Optional: See NOTE above.
// Script to run after deletion of mailboxes.
// Note that this may fail if PHP is run in "safe mode", or if
// operating system features (such as SELinux) or limitations
// prevent the web-server from executing external scripts.
// Parameters: (1) username (2) domain
// $CONF['mailbox_postdeletion_script']='sudo -u courier /usr/local/bin/postfixadmin-mailbox-postdeletion.sh';
$CONF['mailbox_postdeletion_script'] = '';
// Optional:
// Optional: See NOTE above.
// Script to run after setting a mailbox password. (New mailbox [old password = empty] or change existing password)
// Disables changing password without entering old password.
// Parameters: (1) username (2) domain
// STDIN: old password + \0 + new password
// $CONF['mailbox_postpassword_script']='sudo -u dovecot /usr/local/bin/postfixadmin-mailbox-postpassword.sh';
$CONF['mailbox_postpassword_script'] = '';
// Optional: See NOTE above.
// Script to run after setting a mailbox TOTP secret.
// Parameters: (1) username (2) domain
// STDIN: TOTP secret + \0
// $CONF['mailbox_post_TOTP_change_secret_script']='sudo -u dovecot /usr/local/bin/postfixadmin-mailbox-postpassword.sh';
$CONF['mailbox_post_TOTP_change_secret_script'] = '';
// Optional: See NOTE above.
// Script to run after adding an exception address (disable TOTP).
// Parameters: (1) username (2) ip
// STDIN: TOTP secret + \0
// $CONF['mailbox_post_exception_add_script']='sudo -u dovecot /usr/local/bin/postfixadmin-mailbox-postpassword.sh';
$CONF['mailbox_post_totp_exception_add_script'] = '';
// Optional: See NOTE above.
// Script to run after deleting an exception address (disable TOTP).
// Parameters: (1) username (2) ip
// STDIN: TOTP secret + \0
// $CONF['mailbox_post_totp_exception_delete_script']='sudo -u dovecot /usr/local/bin/postfixadmin-mailbox-postpassword.sh';
$CONF['mailbox_post_totp_exception_delete_script'] = '';
// Optional: See NOTE above.
// Script to run after adding an app password.
// Parameters: (1) username (2) app description
// STDIN: password + \0
// $CONF['mailbox_postapppassword_script']='sudo -u dovecot /usr/local/bin/postfixadmin-mailbox-postpassword.sh';
$CONF['mailbox_postapppassword_script'] = '';
// Optional: See NOTE above.
// Script to run after creation of domains.
// Note that this may fail if PHP is run in "safe mode", or if
// operating system features (such as SELinux) or limitations
// prevent the web-server from executing external scripts.
// Parameters: (1) domain
//$CONF['domain_postcreation_script']='sudo -u courier /usr/local/bin/postfixadmin-domain-postcreation.sh';
$CONF['domain_postcreation_script'] = '';
// Optional:
// Optional: See NOTE above.
// Script to run after alteation of domains.
// Parameters: (1) domain
//$CONF['domain_postedit_script']='sudo -u courier /usr/local/bin/postfixadmin-domain-postedit.sh';
$CONF['domain_postedit_script'] = '';
// Optional: See NOTE above.
// Script to run after deletion of domains.
// Note that this may fail if PHP is run in "safe mode", or if
// operating system features (such as SELinux) or limitations
// prevent the web-server from executing external scripts.
// Parameters: (1) domain
// $CONF['domain_postdeletion_script']='sudo -u courier /usr/local/bin/postfixadmin-domain-postdeletion.sh';
$CONF['domain_postdeletion_script'] = '';
@ -679,7 +778,7 @@ $CONF['theme'] = 'default';
// Specify your own favicon, logo and CSS file
$CONF['theme_favicon'] = 'images/favicon.ico';
$CONF['theme_logo'] = 'images/logo-default.png';
$CONF['theme_css'] = 'css/default.css';
$CONF['theme_css'] = 'css/bootstrap.css';
// If you want to customize some styles without editing the $CONF['theme_css'] file,
// you can add a custom CSS file. It will be included after $CONF['theme_css'].
$CONF['theme_custom_css'] = '';
@ -692,9 +791,26 @@ $CONF['xmlrpc_enabled'] = false;
//Account expiration info
//If enabled, mailbox passwords have a password_expiry field set, which is updated each time the password is changed, based on the parent domain's password_expiry (days) value.
//More details in README.password_expiration
//More details in Password_Expiration.md
$CONF['password_expiration'] = 'YES';
// If defined, use this rather than trying to construct it from $_SERVER parameters.
// used in (at least) password-recover.php.
$CONF['site_url'] = null;
$CONF['version'] = '3.4-dev';
// The smtp_active_flag when set to YES enables editing of the smtp_active
// field of the mailbox table. The smtp_active field can be used to enable
// or disable smtp sending for a mailbox separately to other mailbox functions.
// This can be useful if you want the ability to stop a user sending email
// while still allowing receipt of new mail and reading existing email.
// Please refer to DOCUMENTS/DOVECOT.txt for an example of how to configure this.
// The default is NO for backwards compatibility. Only enable this if you
// have also set up the SQL queries that make use of the smtp_active field
// in your Dovecot SQL configuration.
$CONF['smtp_active_flag'] = 'NO';
// If you want to keep most settings at default values and/or want to ensure
// that future updates work without problems, you can use a separate config
// file (config.local.php) instead of editing this file and override some

View File

@ -17,8 +17,16 @@ url_fetchmail_new_entry = edit.php?table=fetchmail
# sendmail
url_sendmail = sendmail.php
url_broadcast_message = broadcast-message.php
# dkim
url_dkim = list.php?table=dkim
url_dkim_signing = list.php?table=dkimsigning
url_dkim_newkey = edit.php?table=dkim
url_dkim_newsign = edit.php?table=dkimsigning
# password
url_password = edit.php?table=adminpassword
url_totp = totp.php
url_totp_exceptions = totp-exceptions.php
url_app_passwords = app-passwords.php
# backup
url_backup = backup.php
# viewlog
@ -31,6 +39,7 @@ url_user_main = main.php
url_user_edit_alias = edit-alias.php
url_user_vacation = vacation.php
url_user_password = password.php
url_user_totp = totp.php
url_user_logout = login.php

View File

@ -20,3 +20,5 @@ The first stop would be the Postfixadmin Website, Forum or IRC channel.
See :
- http://postfixadmin.sf.net
- #postfixadmin on irc.freenode.net
-- Christoph Martin <martin@uni-mainz.de>, Mon, 27 Jun 2016 16:58:12 +0200

236
debian/changelog vendored
View File

@ -1,25 +1,153 @@
postfixadmin (3.2-1) unstable; urgency=low
postfixadmin (3.3.10-2) unstable; urgency=medium
* New upstream release - PostfixAdmin v3.2
* remove unnessesary fix for mysqli instead of mysql
* fix permissions of templates_c directory
-- David Goodwin <david@palepurple.co.uk> Wed, 02 May 2018 21:36:01 +0100
-- Christoph Martin <martin@uni-mainz.de> Thu, 19 Aug 2021 23:30:30 +0200
postfixadmin (3.1-1) unstable; urgency=low
postfixadmin (3.3.10-1) unstable; urgency=medium
* New upstream release
* update watch file
* New upstream version 3.3.10
* fix lighttpd config (closes: #987998)
* include templates_c directory in /var/cache (closes: #926253)
* offer mysqli instead mysql as PHP database type (closes: #857791)
* symlink /etc/postfixadmin/config.local.php to
/usr/share/postfixadmin/config.local.php (closes: #926354)
-- David Goodwin <david@palepurple.co.uk> Sun, 25 Jun 2017 16:27:01 +0000
-- Christoph Martin <martin@uni-mainz.de> Mon, 16 Aug 2021 19:05:26 +0200
postfixadmin (3.0.2-1) unstable; urgency=low
postfixadmin (3.3.7-1) unstable; urgency=medium
* Security fix (don't delete protected aliases, CVE-2017-5930)
* New upstream version 3.3.7
* recommend sqlite3 instead of sqlite (closes: #905726)
* fix alias in apache config (closes: #965075)
* fix dependency on mariadb-server (closes: #968931)
-- Christoph Martin <martin@uni-mainz.de> Wed, 03 Mar 2021 14:57:26 +0100
postfixadmin (3.3.5-1) unstable; urgency=medium
* New upstream version 3.3.5
-- Christoph Martin <martin@uni-mainz.de> Thu, 28 Jan 2021 08:23:28 +0100
postfixadmin (3.3.4-1) unstable; urgency=medium
* New upstream version 3.3.4
-- Christoph Martin <martin@uni-mainz.de> Mon, 25 Jan 2021 10:46:01 +0100
postfixadmin (3.3.3-1) unstable; urgency=medium
* New upstream version 3.3.3
-- Christoph Martin <martin@uni-mainz.de> Mon, 18 Jan 2021 16:23:33 +0100
postfixadmin (3.3.1-1) unstable; urgency=medium
* New upstream version 3.3.1
-- Christoph Martin <martin@uni-mainz.de> Tue, 12 Jan 2021 11:44:54 +0100
postfixadmin (3.2.4-1) unstable; urgency=medium
* New upstream version 3.2.4
-- Christoph Martin <martin@uni-mainz.de> Mon, 21 Sep 2020 11:13:46 +0200
postfixadmin (3.2.1-4) unstable; urgency=medium
[ Debian Janitor ]
* Trim trailing whitespace.
* Wrap long lines in changelog entries: 3.0.2-2, 3.0.2-1, 3.0.1-2.
* Bump debhelper from deprecated 7 to 12.
* Set debhelper-compat version in Build-Depends.
* Set upstream metadata fields: Bug-Database, Bug-Submit, Repository,
Repository-Browse.
-- Christoph Martin <martin@uni-mainz.de> Mon, 14 Sep 2020 16:10:16 +0200
postfixadmin (3.2.1-3) unstable; urgency=medium
[ Jean-Michel Vourgère ]
* Update apache2 configuration (closes: #926252)
[ Christian Schrötter ]
* Fix missing SSL at persistent MySQLi reconnect
-- Christoph Martin <martin@uni-mainz.de> Mon, 10 Feb 2020 15:50:48 +0100
postfixadmin (3.2.1-2) unstable; urgency=medium
* remove backported code which results in errors (closes: #920564)
* link /usr/share/postfixadmin/scripts/postfixadmin-cli to /usr/bin
closes: #920264)
-- Christoph Martin <martin@uni-mainz.de> Mon, 28 Jan 2019 14:16:05 +0100
postfixadmin (3.2.1-1) unstable; urgency=medium
* fix debian/changelog
* New upstream version 3.2.1
-- Christoph Martin <martin@uni-mainz.de> Mon, 14 Jan 2019 11:44:58 +0100
postfixadmin (3.2-4) unstable; urgency=medium
[ Christoph Martin ]
* fix sqlite database upgrade (closes: #909263)
[ Ondřej Nový ]
* d/rules: Remove trailing whitespaces
-- Christoph Martin <martin@uni-mainz.de> Fri, 28 Sep 2018 11:19:19 +0200
postfixadmin (3.2-3) unstable; urgency=medium
* include missing lib folder (closes: #908605)
-- Christoph Martin <martin@uni-mainz.de> Wed, 12 Sep 2018 09:17:27 +0200
postfixadmin (3.2-2) unstable; urgency=medium
* reupload with missing public folder included (closes: #908317)
-- Christoph Martin <martin@uni-mainz.de> Mon, 10 Sep 2018 11:40:37 +0200
postfixadmin (3.2-1) unstable; urgency=medium
[ Christoph Martin ]
* Move watch target to github
* Move Vcs-* to Salsa
* New upstream version 3.2
-- Christoph Martin <martin@uni-mainz.de> Fri, 04 May 2018 11:39:57 +0200
postfixadmin (3.0.2-2) unstable; urgency=medium
* fix mysql connection problems (closes: #861260) see:
https://github.com/postfixadmin/postfixadmin/issues/38 and
https://github.com/postfixadmin/postfixadmin/commit/6ee85ac6cc427392a1d37339e45a5dbb4b96461c
-- Christoph Martin <martin@uni-mainz.de> Thu, 27 Apr 2017 12:43:15 +0200
postfixadmin (3.0.2-1) unstable; urgency=high
[ David Goodwin ]
* Security fix (don't delete protected aliases, CVE-2017-5930) (closes:
#854742)
* Fix MySQL vacation.cache column (regression fix)
-- David Goodwin <david@palepurple.co.uk> Wed, 08 Feb 2017 19:30:00 +0000
[ Christoph Martin ]
* remove recommends zendframework (closes: #780418)
-- Christoph Martin <martin@uni-mainz.de> Fri, 10 Feb 2017 15:08:46 +0100
postfixadmin (3.0.1-2) unstable; urgency=low
* Try and make dependencies less strict (and perhaps work for Ubuntu Precise as well)
* Try and make dependencies less strict (and perhaps work for Ubuntu Precise
as well)
-- David Goodwin <david@palepurple.co.uk> Mon, 10 Oct 2016 20:00:00 +0100
@ -29,42 +157,101 @@ postfixadmin (3.0.1-1) unstable; urgency=low
-- David Goodwin <david@palepurple.co.uk> Mon, 19 Sep 2016 10:08:00 +0100
postfixadmin (3.0-2) unstable; urgency=medium
* include missing files (closes: #847074)
-- Christoph Martin <martin@uni-mainz.de> Thu, 08 Dec 2016 15:06:27 +0100
postfixadmin (3.0-1) unstable; urgency=low
[ David Goodwin ]
* New upstream release
-- David Goodwin <david@palepurple.co.uk> Sun, 11 Sep 2016 18:42:00 +0100
[ Christoph Martin ]
* merge Debian changes
postfixadmin (2.93-2) unstable; urgency=low
-- Christoph Martin <martin@uni-mainz.de> Wed, 09 Nov 2016 15:43:41 +0100
postfixadmin (2.93-2) unstable; urgency=medium
[ Christoph Martin ]
* add fix for missing token bug (closes: #825151)
* add depend on php-mbstring
[ David Goodwin ]
* Replace debian/ using Debian v2.3.7-2. See Debian's #821643
* This adds : PHP7 and Apache 2.4 support.
-- David Goodwin <david@palepurple.co.uk> Sun, 22 May 2016 19:41:01 +0100
-- Christoph Martin <christoph.martin@uni-mainz.de> Thu, 07 Jul 2016 16:36:08 +0200
postfixadmin (2.93-1) unstable; urgency=low
* New upstream release (effectively beta3 for v3.0)
* update dependencies to allow mariadb as database
[ David Goodwin ]
* New upstream release (closes: #819218)
* update dependencies to allow mariadb as database (closes: #778794)
-- David Goodwin <david@palepurple.co.uk> Sat, 26 Sep 2015 15:05:00 +0100
[ Christoph Martin ]
* merge to Debian build
* include patch remove code which needs mysql >= 5.6
* update standards version to 3.9.6
postfixadmin (2.92-1) unstable; urgency=low
-- Christoph Martin <martin@uni-mainz.de> Mon, 27 Jun 2016 17:59:10 +0200
* New upstream release (effectively beta2 for v3.0)
postfixadmin (2.3.7-2) unstable; urgency=medium
-- David Goodwin <david@palepurple.co.uk> Wed, 28 Oct 2014 21:02:00 +0100
* depend on php instead of php7 (closes: #821643)
postfixadmin (2.91-1) unstable; urgency=low
-- Christoph Martin <martin@uni-mainz.de> Fri, 20 May 2016 15:34:04 +0200
* New upstream release (effectively beta for v3.0)
postfixadmin (2.3.7-1) unstable; urgency=medium
-- David Goodwin <david@palepurple.co.uk> Tue, 06 May 2014 21:36:00 +0100
[ Norman Meßtorff ]
* [76ef] change recommends of postgresql-server (not existing) to postgresql.
Thanks to Michael Neuffer (Closes: 699602)
* [4bb5] Change suggestion of transitional package dovecot-common
to dovecot-core
* [f06f] Add new recommended package 'zendframework'
Thanks to Benedikt Trefzer (Closes: 684080)
* [d25a] rules: remove not needed target 'prep'
* [47f7] control: update standards-version to 3.9.5 without changes
* [6f51] Imported Upstream version 2.3.7 (Closes: #741969)
* [4256] Remove patch 0002-fix-sql-injection_show_alias
* [0e04] Update Vcs-* tags in control file
* [4f90] remove legacy apache configuration in prerm, if existing
[ Gaudenz Steinlin ]
* [a5a3] Apache 2.4 transition (Closes: #669834)
* [68fe] Use doveadm pw instead of dovecotpw by default (Closes: #706698)
* [1da4] Remove wwwconfig-common support (Closes: #691936, #719933)
* [b509] Add myself as uploader
* [f628] Rename lighttpd config to 90-postfixadmin.conf
* [a0e6] Remove config symlink for lighttpd in postinst
-- Gaudenz Steinlin <gaudenz@debian.org> Mon, 06 Oct 2014 13:27:25 +0200
postfixadmin (2.3.5-3) unstable; urgency=high
[ Norman Messtorff ]
* [a620b76] fix possible SQL injection of $show_alias in function
gen_show status()
-- Norman Messtorff <normes@normes.org> Sun, 23 Mar 2014 19:07:23 +0100
postfixadmin (2.3.5-2+deb7u1) wheezy-security; urgency=high
* Non-maintainer upload
* SECURITY: fix SQL injection in show_gen_status()
This is only exploitable by authenticated users able
to create new aliases.
Upstream commit: http://sourceforge.net/p/postfixadmin/code/1650
-- Gaudenz Steinlin <gaudenz@debian.org> Thu, 20 Mar 2014 10:41:47 +0100
postfixadmin (2.3.5-2) unstable; urgency=low
* Added .po translation files (Closes: 667951, #667962, #668202, #668288)
* Closes: #668298, #668301, #668405, #668635
* Added .po translation files (Closes: #667951, #667962, #668202, #668288,
#668298, #668301, #668405, #668635)
* Updated standards version to 3.9.3 without changes.
-- Norman Messtorff <normes@normes.org> Thu, 26 Apr 2012 20:55:57 +0200
@ -74,4 +261,3 @@ postfixadmin (2.3.5-1) unstable; urgency=low
* Initial Debian release (Closes: #247225)
-- Norman Messtorff <normes@normes.org> Sun, 15 Jan 2012 12:27:28 +0100

12
debian/control vendored
View File

@ -3,16 +3,16 @@ Section: admin
Priority: optional
Maintainer: Norman Messtorff <normes@normes.org>
Uploaders: Gaudenz Steinlin <gaudenz@debian.org>, Christoph Martin <martin@uni-mainz.de>
Build-Depends: debhelper (>= 7), po-debconf, dh-apache2
Standards-Version: 3.9.5
Vcs-Git: git://anonscm.debian.org/collab-maint/postfixadmin.git
Vcs-Browser: https://anonscm.debian.org/cgit/collab-maint/postfixadmin.git
Build-Depends: debhelper-compat (= 12), po-debconf, dh-apache2
Standards-Version: 3.9.6
Vcs-Browser: https://salsa.debian.org/debian/postfixadmin
Vcs-Git: https://salsa.debian.org/debian/postfixadmin.git
Homepage: http://postfixadmin.sourceforge.net
Package: postfixadmin
Architecture: all
Depends: debconf (>= 0.5), dbconfig-common, wwwconfig-common, apache2 | lighttpd | httpd, libapache2-mod-php | php-cgi | php-fpm | php, php-mysql | php-mysqlnd | php-pgsql | php-pgsql | php-sqlite3, php-mbstring, default-mysql-client | mysql-client | postgresql-client | mariadb-client
Recommends: postfix-mysql | postfix-pgsql, virtual-mysql-server | postgresql | sqlite (>= 3.12.0) | mariadb-server, zendframework, php-imap, dovecot-core | courier-authlib-mysql | courier-authlib-postgresql, php-cli
Depends: debconf (>= 0.5), dbconfig-common, wwwconfig-common, apache2 | lighttpd | httpd, libapache2-mod-php | php-cgi | php-fpm | php, php-imap, php-mysql | php-mysqlnd | php-pgsql | php-sqlite3, php-mbstring, default-mysql-client | postgresql-client | mariadb-client, ${misc:Depends}
Recommends: postfix-mysql | postfix-pgsql, virtual-mysql-server | postgresql | sqlite3 (>= 3.12.0) | mariadb-server, zendframework, dovecot-core | courier-authlib-mysql | courier-authlib-postgresql, php-cli
Description: Virtual mail hosting interface for Postfix
Postfixadmin is a web interface to manage virtual users and domains
for a Postfix mail transport agent. It supports Virtual mailboxes,

View File

@ -1,8 +1,8 @@
--- a/config.inc.php
+++ b/config.inc.php
@@ -31,6 +31,16 @@
################################################################################
@@ -14,6 +14,16 @@
* Contains configuration options.
*/
+// Debian: This loads the automatic generated DB credentials from /etc/postfixadmin/dbconfig.inc.php
+$db_config = dirname(__FILE__) . '/dbconfig.inc.php';
@ -15,9 +15,9 @@
+ $dbserver = 'localhost';
+}
/*****************************************************************
* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -39,7 +49,7 @@
################################################################################
# #
@@ -38,7 +48,7 @@
* Doing this implies you have changed this file as required.
* i.e. configuring database etc; specifying setup.php password etc.
*/
@ -26,7 +26,7 @@
// In order to setup Postfixadmin, you MUST specify a hashed password here.
// To create the hash, visit setup.php in a browser and type a password into the field,
@@ -98,11 +108,11 @@ function language_hook($PALANG, $language) {
@@ -97,11 +107,11 @@
// mysqli = MySQL 4.1+ or MariaDB
// pgsql = PostgreSQL
// sqlite = SQLite 3
@ -41,5 +41,5 @@
+$CONF['database_password'] = $dbpass;
+$CONF['database_name'] = $dbname;
// Database SSL Config
// Database SSL Config (PDO/MySQLi only)
$CONF['database_use_ssl'] = false;

View File

@ -1,8 +1,7 @@
usr/share/postfixadmin
usr/share/postfixadmin/scripts
usr/share/postfixadmin/public
usr/share/postfixadmin/lib
usr/share/doc/postfixadmin
var/cache/postfixadmin
usr/bin
usr/share/postfixadmin
#usr/share/postfixadmin/css
usr/share/doc/postfixadmin
etc/postfixadmin
etc/apache2/conf-available
var/cache/postfixadmin/templates_c

0
debian/postfixadmin.docs vendored Executable file → Normal file
View File

View File

@ -13,4 +13,4 @@ ADDITIONS/delete-mailq-by-domain.pl
ADDITIONS/pfa_maildir_cleanup.pl
ADDITIONS/quota_usage.pl
ADDITIONS/fetchmail.pl
ADDITIONS/README.TXT
ADDITIONS/README.md

View File

@ -1,9 +1,11 @@
*.php usr/share/postfixadmin
public usr/share/postfixadmin
languages usr/share/postfixadmin
model usr/share/postfixadmin
templates usr/share/postfixadmin
lib usr/share/postfixadmin
configs usr/share/postfixadmin
languages usr/share/postfixadmin
lib usr/share/postfixadmin
model usr/share/postfixadmin
scripts usr/share/postfixadmin
templates usr/share/postfixadmin
configs usr/share/postfixadmin
debian/lighttpd/90-postfixadmin.conf etc/lighttpd/conf-available
debian/apache/postfixadmin.conf etc/apache2/conf-available

View File

@ -1,2 +1 @@
etc/postfixadmin/config.inc.php usr/share/postfixadmin/config.inc.php
var/cache/postfixadmin usr/share/postfixadmin/templates_c

View File

@ -23,15 +23,9 @@ fi
if [ -d /usr/share/postfixadmin/templates_c ]; then
find /usr/share/postfixadmin/templates_c -type f -exec rm -r {} \;
fi
if [ -d /usr/share/postfixadmin/templates_c ]; then
chown www-data /usr/share/postfixadmin/templates_c
if [ -d /var/cache/postfixadmin/templates_c ]; then
find /var/cache/postfixadmin/templates_c -type f -exec rm -r {} \;
fi
if [ -d /var/cache/postfixadmin ]; then
find /var/cache/postfixadmin -type f -exec rm -r {} \;
chown www-data /var/cache/postfixadmin
fi
#DEBHELPER#
exit 0

View File

@ -1,4 +1,4 @@
#!/bin/bash
#!/bin/sh
set -e
. /usr/share/debconf/confmodule

9
debian/rules vendored
View File

@ -11,7 +11,7 @@ export DEBVERSION = $(shell grep -E "postfixadmin .([0-9]+|\.)+" debian/changelo
# Create a needed tar.gz file to build a non-nativ .dpkg
prep:
rm -f ../postfixadmin_*orig.tar.gz
cd ..; tar --exclude-vcs --exclude=$(notdir ${CURDIR})/debian --exclude=$(notdir ${CURDIR})/.pc -cvzf postfixadmin_${DEBVERSION}.orig.tar.gz $(notdir ${CURDIR})
cd ..; tar --exclude-vcs --exclude=$(notdir ${CURDIR})/debian --exclude=$(notdir ${CURDIR})/.pc -cvzf postfixadmin_${DEBVERSION}.orig.tar.gz $(notdir ${CURDIR})
build: build-arch build-indep
build-arch: build-stamp
@ -33,7 +33,10 @@ install: build
dh_install
dh_apache2
mv debian/postfixadmin/usr/share/postfixadmin/config.inc.php debian/postfixadmin/etc/postfixadmin/config.inc.php
ln -s /usr/share/postfixadmin/scripts/postfixadmin-cli debian/postfixadmin/usr/bin/postfixadmin-cli
ln -s /etc/postfixadmin/config.local.php debian/postfixadmin/usr/share/postfixadmin/config.local.php
find debian/postfixadmin -name .svn | xargs -r rm -r
ln -s ../share/postfixadmin/scripts/postfixadmin-cli debian/postfixadmin/usr/bin/
ln -s /var/cache/postfixadmin/templates_c debian/postfixadmin/usr/share/postfixadmin/
# Build architecture-independent files here.
binary-indep: build install
@ -46,6 +49,8 @@ binary-indep: build install
dh_link
dh_compress
dh_fixperms
chown www-data debian/postfixadmin/var/cache/postfixadmin/templates_c -R
chmod 700 debian/postfixadmin/var/cache/postfixadmin/templates_c
dh_installdeb
dh_gencontrol
dh_md5sums

4
debian/upstream/metadata vendored Normal file
View File

@ -0,0 +1,4 @@
Bug-Database: https://github.com/postfixadmin/postfixadmin/issues
Bug-Submit: https://github.com/postfixadmin/postfixadmin/issues/new
Repository: https://github.com/postfixadmin/postfixadmin.git
Repository-Browse: https://github.com/postfixadmin/postfixadmin

4
debian/watch vendored
View File

@ -1,2 +1,2 @@
version=3
http://sf.net/postfixadmin/postfixadmin-([\d\.]+)\.tar\.gz
version=4
https://github.com/postfixadmin/postfixadmin/releases .*/postfixadmin-(\d[\d.]*)\.tar\.gz

File diff suppressed because it is too large Load Diff

62
install.sh Normal file
View File

@ -0,0 +1,62 @@
#!/bin/bash
set -eu
# PostfixAdmin install script.
# 1. Downloads 'composer.phar' to the current directory.
# 2. Runs 'php composer.phar install' which should install required runtime libraries for Postfixadmin
# 3. Runs 'mkdir templates_c && chmod 777 templates_c'
PATH=/bin:/usr/bin:/usr/local/bin
export PATH
COMPOSER_URL=https://getcomposer.org/download/latest-stable/composer.phar
type php >/dev/null 2>&1 || { echo >&2 "I require php but it's not installed. Aborting."; exit 1; }
cd "$(dirname "$0")"
# Check for $(pwd)/composer.phar
echo " * Checking for composer.phar "
if [ ! -f composer.phar ]; then
echo " * Trying to download composer.phar from $COMPOSER_URL "
# try and download it one way or another
if [ -x /usr/bin/wget ]; then
wget -q -O composer.phar $COMPOSER_URL
else
if [ -x /usr/bin/curl ]; then
curl -o composer.phar $COMPOSER_URL
else
echo " ** Could not find wget or curl; please download $COMPOSER_URL to pwd" >/dev/stderr
exit 1
fi
fi
fi
echo " * Running composer install --no-dev"
php composer.phar install --prefer-dist -n --no-dev
if [ ! -d templates_c ]; then
mkdir -p templates_c && chmod 777 templates_c
echo
echo " Warning: "
echo " templates_c directory didn't exist, now created."
echo
echo " You should change the ownership and reduce permissions on templates_c to 750. "
echo " The ownership needs to match the user used to execute PHP scripts, perhaps 'www-data' or 'httpd'"
echo
echo " e.g. chown www-data templates_c && chmod 750 templates_c"
echo
fi
echo
echo "Please continue configuration / setup within your web browser. "
echo "See also : https://github.com/postfixadmin/postfixadmin/blob/master/INSTALL.TXT#L58 "
echo

View File

@ -18,6 +18,7 @@ $PALANG['confirm_delete_admin'] = 'Do you really want to delete the admin %s?';
$PALANG['confirm_delete_alias'] = 'Do you really want to delete the alias %s?'; # XXX
$PALANG['confirm_delete_aliasdomain'] = 'Do you really want to delete the alias domain %s?'; # XXX
$PALANG['confirm_delete_domain'] = 'Наистина ли искате да изтриете всички записи за този домейн? Това действие е необратимо!\n (%s)'; # XXX text changed to: 'Do you really want to delete all records for the domain %s? This can not be undone'
$PALANG['confirm_delete_dkim'] = 'Do you really want to delete the domain key entry %s?'; # XXX
$PALANG['confirm_delete_fetchmail'] = 'Do you really want to delete the fetchmail job %s?'; # XXX
$PALANG['confirm_delete_mailbox'] = 'Do you really want to delete the mailbox %s?'; # XXX
$PALANG['confirm_delete_vacation'] = 'Do you really want to delete the vacation message for %s?'; # XXX
@ -53,14 +54,16 @@ $PALANG['add_alias_domain'] = 'Добави Alias Domain'; # XXX check text - sh
$PALANG['add_mailbox'] = 'Създай нова пощенска кутия'; # XXX check text - should be 'Add Mailbox'
$PALANG['pMenu_fetchmail'] = 'Fetch Email'; # XXX
$PALANG['pMenu_sendmail'] = 'Изпрати Email';
$PALANG['pMenu_dkim'] = 'Domain Keys'; # XXX
$PALANG['pMenu_dkim_signing'] = 'Signing Table'; # XXX
$PALANG['pMenu_password'] = 'Парола';
$PALANG['pMenu_viewlog'] = 'Преглед на Log';
$PALANG['pMenu_logout'] = 'Изход';
$PALANG['pMain_welcome'] = 'Добре дошли!';
$PALANG['pMain_overview'] = 'Преглед на alias-ите и пощенските кутии. Оттук можете да редактирате/триете.';
$PALANG['pMain_create_alias'] = 'Създаване на нов alias за вашият домейн.'; # XXX check text - should be 'Create a new alias for your domain.'
$PALANG['pMain_create_mailbox'] = 'Създаване на нова пощенска кутия за вашия домейн.';
$PALANG['pMain_overview'] = 'Преглед на alias-ите и пощенските кутии. Оттук можете да редактирате/триете.'; # XXX Text changed to "List your domains. You can edit / delete them from here."
$PALANG['pMain_create_alias'] = 'Създаване на нов alias за вашият домейн.'; # # XXX Text changed to "Create a new email forward."
$PALANG['pMain_create_mailbox'] = 'Създаване на нова пощенска кутия за вашия домейн.'; # XXX Text changed to "Create a new mailbox."
$PALANG['pMain_sendmail'] = 'Изпрати е-мейл до един от новосъздадени пощенски кутии.';
$PALANG['pMain_password'] = 'Смяна на паролата за администраторския акаунт.';
$PALANG['pMain_viewlog'] = 'Преглед на log файла.';
@ -80,6 +83,7 @@ $PALANG['pOverview_welcome'] = 'Преглед на ';
$PALANG['pOverview_alias_domain_aliases'] = 'Alias Domains'; # XXX
$PALANG['pOverview_alias_address'] = 'От';
$PALANG['active'] = 'Активен';
$PALANG['smtp_active'] = 'Smtp';
$PALANG['and_x_more'] = '[and %s more...]'; # XXX
$PALANG['pOverview_mailbox_username'] = 'Е-мейл';
$PALANG['name'] = 'Име';
@ -127,6 +131,7 @@ $PALANG['alias_updated'] = 'The alias %s has been updated!'; # XXX
$PALANG['pCreate_alias_catchall_text'] = 'За да създадете catch-all използвайте "*" за alias. За пренасочване на домейн към домейн използвайте "*@domain.tld" в полето Към.'; # XXX check/beautify - was split in two lines before
$PALANG['mailbox_alias_cant_be_deleted'] = 'This alias belongs to a mailbox and can\'t be deleted!'; # XXX
$PALANG['protected_alias_cant_be_deleted'] = 'The alias %s is protected and can only be deleted by a superadmin'; # XXX
$PALANG['alias_points_to_itself'] = 'Alias may not point to itself'; # XXX
$PALANG['pEdit_alias_welcome'] = 'Редактиране на alias за вашия домейн.'; # XXX Text change to: 'Edit forwarding settings'
$PALANG['pEdit_alias_help'] = 'Един запис на ред.'; # XXX Text change to: 'Accepts multiple targets, one entry per line.'
@ -162,6 +167,8 @@ $PALANG['pEdit_mailbox_password_text_error'] = 'Паролите, които с
$PALANG['pEdit_mailbox_quota'] = 'Обем';
$PALANG['pEdit_mailbox_quota_text'] = 'MB';
$PALANG['mb_max'] = 'MB (max: %s)'; # XXX
$PALANG['mb_max_unlimited'] = 'MB (max: unlimited)'; # XXX
$PALANG['mb_max_disabled'] = 'MB (max: disabled)'; # XXX
$PALANG['pEdit_mailbox_quota_text_error'] = 'Обема, който сте дали е твърде голям!';
$PALANG['pEdit_mailbox_domain_error'] = 'Този домейн не е ваш: ';
$PALANG['pEdit_mailbox_result_error'] = 'Не мога да модифицирам пощенската кутия!';
@ -199,6 +206,7 @@ $PALANG['reply_once_per_day'] = 'Reply once a day'; # XXX
$PALANG['reply_once_per_week'] = 'Reply once per week'; # XXX
$PALANG['pViewlog_welcome'] = 'Разглеждане на последните %s действия за ';
$PALANG['pViewlog_welcome_all'] = 'View the last %s actions '; # XXX
$PALANG['pViewlog_timestamp'] = 'Дата';
$PALANG['pViewlog_action'] = 'Действие';
$PALANG['pViewlog_data'] = 'Данни';
@ -238,6 +246,32 @@ $PALANG['pSendmail_body'] = 'Текст';
$PALANG['pSendmail_button'] = 'Изпрати';
$PALANG['pSendmail_result_error'] = 'Не мога да изпратя съобщението! (%s)'; # XXX text change - new: Unable to send email to %s!
$PALANG['pSendmail_result_success'] = 'Съобщението беше изпратено! (%s)'; # XXX text change - new: Email sent to %s.
$PALANG['pDkim_new_key'] = 'Add Domain Key'; # XXX
$PALANG['pDkim_new_sign'] = 'Add Sign Table Entry'; # XXX
$PALANG['pDkim_edit_key'] = 'Edit Domain Key'; # XXX
$PALANG['pDkim_edit_sign'] = 'Edit Sign Table Entry'; # XXX
$PALANG['pDkim_field_selector'] = 'Selector'; # XXX
$PALANG['pDkim_field_pkey'] = 'Private Key'; # XXX
$PALANG['pDkim_field_pub'] = 'Public Key'; # XXX
$PALANG['pDkim_field_author'] = 'Author'; # XXX
$PALANG['pDkim_field_dkim_id'] = 'Domain Key'; # XXX
$PALANG['pDkim_field_selector_desc'] = 'Defines the name of the selector to be used when signing messages'; # XXX
$PALANG['pDkim_field_domain_desc'] = 'Defines the domain which will use this key for signing'; # XXX
$PALANG['pDkim_field_pkey_desc'] = 'PEM-formatted private key to be used for signing all messages'; # XXX
$PALANG['pDkim_field_pub_desc'] = 'PEM-formatted public key'; # XXX
$PALANG['pDkim_field_author_desc'] = 'Author that will use this key for signing. Can be either mailbox or domain, with mailbox taking precedence.'; # XXX
$PALANG['pDkim_field_dkim_id_desc'] = 'Domain Key that this author will use'; # XXX
$PALANG['dkim_already_exists'] = 'This Domain Key has already been added!'; # XXX
$PALANG['dkim_does_not_exist'] = 'This Domain Key does not exist!'; # XXX
$PALANG['dkim_signing_already_exists'] = 'This Domain Signing Entry already exsits!'; # XXX
$PALANG['dkim_signing_does_not_exist'] = 'This Domain Signing Entry does not exist!'; # XXX
$PALANG['pViewlog_action_create_dkim_entry'] = 'create domain key entry'; # XXX
$PALANG['pViewlog_action_edit_dkim_entry'] = 'edit domain key entry'; # XXX
$PALANG['pViewlog_action_delete_dkim_entry'] = 'delete domain key entry'; # XXX
$PALANG['pViewlog_action_create_dkim_signing_entry'] = 'create domain signing entry'; # XXX
$PALANG['pViewlog_action_edit_dkim_signing_entry'] = 'edit domain signing entry'; # XXX
$PALANG['pViewlog_action_delete_dkim_signing_entry'] = 'delete domain signing entry'; # XXX
$PALANG['pMain_dkim'] = 'Add a Domain Key for use with OpenDKIM.'; # XXX
$PALANG['pAdminMenu_list_admin'] = 'Списък с админите';
$PALANG['pAdminMenu_list_domain'] = 'Списък с домейните';
@ -267,10 +301,12 @@ $PALANG['pAdminCreate_domain_result_success'] = 'Домейна бе добав
$PALANG['domain_updated'] = 'The domain %s has been updated.'; # XXX
$PALANG['pAdminDelete_admin_error'] = 'Unable to delete admin!'; # XXX
$PALANG['domain_postdel_failed'] = 'Грешка при изтриването на домейна!'; # XXX Text changed to: The domain postdeletion script failed, check the error log for details!
$PALANG['domain_postedit_failed'] = 'The domain postedit script failed, check the error log for details!'; # XXX
$PALANG['domain_postcreate_failed'] = 'The domain postcreate script failed, check the error log for details!'; # XXX
$PALANG['mailbox_postdel_failed'] = 'The mailbox postdeletion script failed, check the error log for details!'; # XXX
$PALANG['mailbox_postedit_failed'] = 'The mailbox postedit script failed, check the error log for details!'; # XXX
$PALANG['mailbox_postcreate_failed'] = 'The mailbox postcreate script failed, check the error log for details!'; # XXX
$PALANG['mailbox_postpassword_failed'] = 'The mailbox postpassword script failed, check the error log for details!'; # XXX
$PALANG['pAdminDelete_alias_domain_error'] = 'Unable to remove domain alias!'; # XXX
$PALANG['domain_conflict_vacation_domain'] = 'You can\'t use the vacation domain as mail domain!'; # XXX
@ -319,7 +355,7 @@ $PALANG['pUsersVacation_welcome_text'] = 'Вие вече си имате кон
$PALANG['pUsersVacation_subject_text'] = 'Out of Office'; # XXX
$PALANG['message'] = 'Текст'; # XXX text changed to 'Message'
$PALANG['pUsersVacation_body_text'] = <<<EOM
Няма да бъда на разположение от <date> до <date>.
Няма да бъда на разположение от <%From_Date> до <%Until_Date>.
При спешност можете да се свържете с <contact person>.
EOM;
$PALANG['pUsersVacation_activefrom'] = 'Active from'; # XXX
@ -347,6 +383,7 @@ $PALANG['pStatus_popimap'] = 'POP/IMAP '; # XXX
$PALANG['password_too_short'] = "Password is too short - requires %s characters"; # XXX
$PALANG['password_no_characters'] = "Your password must contain at least %s letters (A-Z, a-z)."; # XXX
$PALANG['password_no_digits'] = "Your password must contain at least %s digit(s)."; # XXX
$PALANG['password_no_special'] = "Your password must contain at least %s special character(s)."; # XXX
$PALANG['pInvalidDomainRegex'] = "Invalid domain name %s, fails regexp check"; # XXX
$PALANG['pInvalidDomainDNS'] = "Invalid domain %s, and/or not discoverable in DNS"; # XXX
$PALANG['pInvalidMailRegex'] = "Invalid email address %s, fails regexp check"; # XXX
@ -402,6 +439,62 @@ $PALANG['dateformat_pgsql'] = 'YYYY-mm-dd'; # translators: rearrange to your loc
$PALANG['dateformat_mysql'] = '%Y-%m-%d'; # translators: rearrange to your local date format, but make sure it's a valid MySQL date format # XXX
$PALANG['password_expiration'] = 'Pass expires'; # XXX
$PALANG['password_expiration_desc'] = 'Date when password will expire'; # XXX
$PALANG['To_Mailbox'] = 'Mailbox'; # XXX # XXX
$PALANG['To_Forward_Only'] = 'Forward Only'; # XXX # XXX
$PALANG['pLegal_char_warning'] = 'Illegal character'; # XXX
$PALANG['copy'] = 'Copy'; # XXX
$PALANG['generate'] = 'Generate'; # XXX
$PALANG['pMenu_security'] = 'Security'; # XXX
$PALANG['pMenu_totp'] = 'TOTP'; # XXX
$PALANG['pMenu_totp_exceptions'] = 'TOTP exceptions'; # XXX
$PALANG['pMenu_app_passwords'] = 'Application passwords'; # XXX
$PALANG['pUsersMain_totp_exceptions'] = 'Allow trusted IP-addresses to access your mailbox without TOTP'; # XXX
$PALANG['pUsersMenu_totp'] = 'Change TOTP'; # XXX
$PALANG['pTOTP_welcome'] = 'Setup your Time-based One-time Password'; # XXX
$PALANG['pUsersMain_totp'] = 'Setup your Time-based One-time Password'; # XXX
$PALANG['pTOTP_secret'] = 'TOTP secret'; # XXX
$PALANG['pTOTP_code'] = 'TOTP code'; # XXX
$PALANG['pTOTP_secret_result_error'] = 'Could not change TOTP secret'; # XXX
$PALANG['change_TOTP'] = 'Change TOTP settings'; # XXX
$PALANG['pTOTP_code_mismatch'] = 'Incorrect one-time-password entered'; # XXX
$PALANG['pTOTP_qr'] = 'TOTP QR-code'; # XXX
$PALANG['pTOTP_confirm'] = 'Please confirm your login by providing your current TOTP code'; # XXX
$PALANG['pTotp_failed'] = 'Your entered code is not valid. Please use a current code.'; # XXX
$PALANG['pTotp_stored'] = 'You successfully confirmed your new TOTP secret.'; # XXX
$PALANG['pTotp_exceptions_welcome'] = 'Add TOPT-exempt address'; # XXX
$PALANG['pTotp_exceptions_user'] = 'Username (or domain for admins)'; # XXX
$PALANG['pTotp_exceptions_add'] = 'Add exception'; # XXX
$PALANG['pTotp_exceptions_address'] = 'IP-Address'; # XXX
$PALANG['pTotp_exceptions_description'] = 'Description'; # XXX
$PALANG['pTotp_exceptions_list'] = 'Existing exceptions'; # XXX
$PALANG['pTotp_exceptions_revoke'] = 'Revoke'; # XXX
$PALANG['pTotp_exceptions_revoked'] = 'Exception revoked'; # XXX
$PALANG['pTotp_exception_result_success'] = 'Exception added'; # XXX
$PALANG['pTotp_exception_result_error'] = 'Could not add exception'; # XXX
$PALANG['pEdit_totp_exception_result_error'] = 'Unable to modify TOTP exceptions'; # XXX
$PALANG['pException_ip_empty_error'] = 'IP cannot be empty'; # XXX
$PALANG['pException_desc_empty_error'] = 'Description cannot be empty'; # XXX
$PALANG['pException_user_entire_domain_error'] = 'Only admins can add exceptions for an entire domain.'; # XXX
$PALANG['pException_user_global_error'] = 'Only superadmins can add global exceptions'; # XXX
$PALANG['pUsersMain_app_passwords'] = 'Setup revokable app passwords with reduced privileges'; # XXX
$PALANG['pApp_passwords_list'] = 'Existing application passwords'; # XXX
$PALANG['pApp_password_revoked'] = 'Exception revoked'; # XXX
$PALANG['pApp_passwords_welcome'] = 'Add application password'; # XXX
$PALANG['pAppPassAdd_result_success'] = 'Added an application password'; # XXX
$PALANG['pAppPassAdd_pass_empty_error'] = 'Password cannot be empty'; # XXX
$PALANG['pAppPassAdd_result_error'] = 'Could not add application password'; # XXX
$PALANG['MFA_submit'] = 'Confirm login'; # XXX
$PALANG['pViewlog_action_add_totp_exception'] = 'Add TOTP exception'; # XXX
$PALANG['pViewlog_action_delete_totp_exception'] = 'Delete TOTP exception'; # XXX
$PALANG['pViewlog_action_add_app_password'] = 'Add application password'; # XXX
$PALANG['mailbox_postapppassword_failed'] = 'The mailbox postapppassword script failed, check the error log for details!'; # XXX
$PALANG['mailbox_post_totp_exception_delete_failed'] = 'The mailbox post totp exception delete script failed, check the error log for details!'; # XXX
$PALANG['mailbox_post_totp_exception_add_failed'] = 'The mailbox post totp exception add script failed, check the error log for details!'; # XXX
$PALANG['mailbox_post_TOTP_change_failed'] = 'The mailbox post totp secret change script failed, check the error log for details!'; # XXX
$PALANG['TOTP_already_configured'] = 'TOTP is already configured for this account, do you want to change your secret?'; # XXX
$PALANG['pApp_passwords_add'] = 'Add application-specific password'; # XXX
$PALANG['please_keep_this_as_last_entry'] = ''; # needed for language-check.sh
/* vim: set expandtab ft=php softtabstop=3 tabstop=3 shiftwidth=3: */

View File

@ -17,6 +17,7 @@ $PALANG['confirm_delete_admin'] = 'Do you really want to delete the admin %s?';
$PALANG['confirm_delete_alias'] = 'Do you really want to delete the alias %s?'; # XXX
$PALANG['confirm_delete_aliasdomain'] = 'Do you really want to delete the alias domain %s?'; # XXX
$PALANG['confirm_delete_domain'] = 'Estas segur que vols borrar tots els registres d\'aquest domini? Això no podrà ser desfet!\n (%s)'; # XXX text changed to: 'Do you really want to delete all records for the domain %s? This can not be undone'
$PALANG['confirm_delete_dkim'] = 'Do you really want to delete the domain key entry %s?'; # XXX
$PALANG['confirm_delete_fetchmail'] = 'Do you really want to delete the fetchmail job %s?'; # XXX
$PALANG['confirm_delete_mailbox'] = 'Do you really want to delete the mailbox %s?'; # XXX
$PALANG['confirm_delete_vacation'] = 'Do you really want to delete the vacation message for %s?'; # XXX
@ -51,14 +52,16 @@ $PALANG['add_alias_domain'] = 'Add Alias Domain'; # XXX
$PALANG['add_mailbox'] = 'Afegir bústia';
$PALANG['pMenu_fetchmail'] = 'Fetch Email'; # XXX
$PALANG['pMenu_sendmail'] = 'Enviar e-mail';
$PALANG['pMenu_dkim'] = 'Domain Keys'; # XXX
$PALANG['pMenu_dkim_signing'] = 'Signing Table'; # XXX
$PALANG['pMenu_password'] = 'Contrasenya';
$PALANG['pMenu_viewlog'] = 'Veure Logs';
$PALANG['pMenu_logout'] = 'Sortir';
$PALANG['pMain_welcome'] = 'Benvingut al Postfix Admin!';
$PALANG['pMain_overview'] = 'Llistat dels seus àlies i bústies. Pot editar-los / borrar-los des d\'aquí.';
$PALANG['pMain_create_alias'] = 'Creació d\'un nou àlies pel seu domini.'; # XXX check text - should be 'Create a new alias for your domain.'
$PALANG['pMain_create_mailbox'] = 'Creació d\'una nova bústia pel seu domini.';
$PALANG['pMain_overview'] = 'Llistat dels seus àlies i bústies. Pot editar-los / borrar-los des d\'aquí.'; # XXX Text changed to "List your domains. You can edit / delete them from here."
$PALANG['pMain_create_alias'] = 'Creació d\'un nou àlies pel seu domini.'; # # XXX Text changed to "Create a new email forward."
$PALANG['pMain_create_mailbox'] = 'Creació d\'una nova bústia pel seu domini.'; # XXX Text changed to "Create a new mailbox."
$PALANG['pMain_sendmail'] = 'Enviar un e-mail a una de les bústies acabades de crear.';
$PALANG['pMain_password'] = 'Canviar la contrasenya per la seva compta d\'administració.';
$PALANG['pMain_viewlog'] = 'Veure Logs.';
@ -78,6 +81,7 @@ $PALANG['pOverview_welcome'] = 'Resum de ';
$PALANG['pOverview_alias_domain_aliases'] = 'Alias Domains'; # XXX
$PALANG['pOverview_alias_address'] = 'De';
$PALANG['active'] = 'Actiu';
$PALANG['smtp_active'] = 'Smtp';
$PALANG['and_x_more'] = '[and %s more...]'; # XXX
$PALANG['pOverview_mailbox_username'] = 'E-mail'; # XXX
$PALANG['name'] = 'Nom';
@ -125,6 +129,7 @@ $PALANG['alias_updated'] = 'The alias %s has been updated!'; # XXX
$PALANG['pCreate_alias_catchall_text'] = 'Per crear un àlies general usi "*" com a àlies. Per una redirecció de domini a domini, usi "*@domain.tld" com a Destí.'; # XXX check/beautify - was split in two lines before
$PALANG['mailbox_alias_cant_be_deleted'] = 'This alias belongs to a mailbox and can\'t be deleted!'; # XXX
$PALANG['protected_alias_cant_be_deleted'] = 'The alias %s is protected and can only be deleted by a superadmin'; # XXX
$PALANG['alias_points_to_itself'] = 'Alias may not point to itself'; # XXX
$PALANG['pEdit_alias_welcome'] = 'Editi un àlies pel seu domini.'; # XXX Text change to: 'Edit forwarding settings'
$PALANG['pEdit_alias_help'] = 'Una entrada per línia.'; # XXX Text change to: 'Accepts multiple targets, one entry per line.'
@ -160,6 +165,8 @@ $PALANG['pEdit_mailbox_password_text_error'] = 'Les contrasenyes introduides no
$PALANG['pEdit_mailbox_quota'] = 'Quota'; # XXX
$PALANG['pEdit_mailbox_quota_text'] = 'MB';
$PALANG['mb_max'] = 'MB (max: %s)'; # XXX
$PALANG['mb_max_unlimited'] = 'MB (max: unlimited)'; # XXX
$PALANG['mb_max_disabled'] = 'MB (max: disabled)'; # XXX
$PALANG['pEdit_mailbox_quota_text_error'] = 'La quota especificada és massa alta!';
$PALANG['pEdit_mailbox_domain_error'] = 'Aquest domini no et pertany: ';
$PALANG['pEdit_mailbox_result_error'] = 'Imposible canviar la contrasenya!';
@ -197,6 +204,7 @@ $PALANG['reply_once_per_day'] = 'Reply once a day'; # XXX
$PALANG['reply_once_per_week'] = 'Reply once per week'; # XXX
$PALANG['pViewlog_welcome'] = 'Veure les últimes %s accions per ';
$PALANG['pViewlog_welcome_all'] = 'Veure les últimes %s accions ';
$PALANG['pViewlog_timestamp'] = 'Data/Hora';
$PALANG['pViewlog_action'] = 'Acció';
$PALANG['pViewlog_data'] = 'Dades';
@ -236,6 +244,32 @@ $PALANG['pSendmail_body'] = 'Cos';
$PALANG['pSendmail_button'] = 'Enviar missatge';
$PALANG['pSendmail_result_error'] = 'Imposible crear la bústia! (%s)'; # XXX text change - new: Unable to send email to %s!
$PALANG['pSendmail_result_success'] = 'La bústia ha estat creada! (%s)'; # XXX text change - new: Email sent to %s.
$PALANG['pDkim_new_key'] = 'Add Domain Key'; # XXX
$PALANG['pDkim_new_sign'] = 'Add Sign Table Entry'; # XXX
$PALANG['pDkim_edit_key'] = 'Edit Domain Key'; # XXX
$PALANG['pDkim_edit_sign'] = 'Edit Sign Table Entry'; # XXX
$PALANG['pDkim_field_selector'] = 'Selector'; # XXX
$PALANG['pDkim_field_pkey'] = 'Private Key'; # XXX
$PALANG['pDkim_field_pub'] = 'Public Key'; # XXX
$PALANG['pDkim_field_author'] = 'Author'; # XXX
$PALANG['pDkim_field_dkim_id'] = 'Domain Key'; # XXX
$PALANG['pDkim_field_selector_desc'] = 'Defines the name of the selector to be used when signing messages'; # XXX
$PALANG['pDkim_field_domain_desc'] = 'Defines the domain which will use this key for signing'; # XXX
$PALANG['pDkim_field_pkey_desc'] = 'PEM-formatted private key to be used for signing all messages'; # XXX
$PALANG['pDkim_field_pub_desc'] = 'PEM-formatted public key'; # XXX
$PALANG['pDkim_field_author_desc'] = 'Author that will use this key for signing. Can be either mailbox or domain, with mailbox taking precedence.'; # XXX
$PALANG['pDkim_field_dkim_id_desc'] = 'Domain Key that this author will use'; # XXX
$PALANG['dkim_already_exists'] = 'This Domain Key has already been added!'; # XXX
$PALANG['dkim_does_not_exist'] = 'This Domain Key does not exist!'; # XXX
$PALANG['dkim_signing_already_exists'] = 'This Domain Signing Entry already exsits!'; # XXX
$PALANG['dkim_signing_does_not_exist'] = 'This Domain Signing Entry does not exist!'; # XXX
$PALANG['pViewlog_action_create_dkim_entry'] = 'create domain key entry'; # XXX
$PALANG['pViewlog_action_edit_dkim_entry'] = 'edit domain key entry'; # XXX
$PALANG['pViewlog_action_delete_dkim_entry'] = 'delete domain key entry'; # XXX
$PALANG['pViewlog_action_create_dkim_signing_entry'] = 'create domain signing entry'; # XXX
$PALANG['pViewlog_action_edit_dkim_signing_entry'] = 'edit domain signing entry'; # XXX
$PALANG['pViewlog_action_delete_dkim_signing_entry'] = 'delete domain signing entry'; # XXX
$PALANG['pMain_dkim'] = 'Add a Domain Key for use with OpenDKIM.'; # XXX
$PALANG['pAdminMenu_list_admin'] = 'Llistat d\'administradors';
$PALANG['pAdminMenu_list_domain'] = 'Llistat de dominis';
@ -265,10 +299,12 @@ $PALANG['pAdminCreate_domain_result_success'] = 'El domini ha estat afegit! (%s)
$PALANG['domain_updated'] = 'The domain %s has been updated.'; # XXX
$PALANG['pAdminDelete_admin_error'] = 'Unable to delete admin!'; # XXX
$PALANG['domain_postdel_failed'] = 'The domain postdeletion script failed, check the error log for details!'; # XXX
$PALANG['domain_postedit_failed'] = 'The domain postedit script failed, check the error log for details!'; # XXX
$PALANG['domain_postcreate_failed'] = 'The domain postcreate script failed, check the error log for details!'; # XXX
$PALANG['mailbox_postdel_failed'] = 'The mailbox postdeletion script failed, check the error log for details!'; # XXX
$PALANG['mailbox_postedit_failed'] = 'The mailbox postedit script failed, check the error log for details!'; # XXX
$PALANG['mailbox_postcreate_failed'] = 'The mailbox postcreate script failed, check the error log for details!'; # XXX
$PALANG['mailbox_postpassword_failed'] = 'The mailbox postpassword script failed, check the error log for details!'; # XXX
$PALANG['pAdminDelete_alias_domain_error'] = 'Unable to remove domain alias!'; # XXX
$PALANG['domain_conflict_vacation_domain'] = 'You can\'t use the vacation domain as mail domain!'; # XXX
@ -318,7 +354,7 @@ $PALANG['pUsersVacation_welcome_text'] = 'Ja disposa d\'una resposta automàtica
$PALANG['pUsersVacation_subject_text'] = 'Fora de la feina';
$PALANG['message'] = 'Cos'; # XXX text changed to 'Message'
$PALANG['pUsersVacation_body_text'] = <<<EOM
Seré fora des del <date> fins al <date>.
Seré fora des del <%From_Date> fins al <%Until_Date>.
Per assumptes urgents pot contactar amb mi a <contact person>.
EOM;
$PALANG['pUsersVacation_activefrom'] = 'Active from'; # XXX
@ -346,6 +382,7 @@ $PALANG['pStatus_popimap'] = 'POP/IMAP '; # XXX
$PALANG['password_too_short'] = "Password is too short - requires %s characters"; # XXX
$PALANG['password_no_characters'] = "Your password must contain at least %s letters (A-Z, a-z)."; # XXX
$PALANG['password_no_digits'] = "Your password must contain at least %s digit(s)."; # XXX
$PALANG['password_no_special'] = "Your password must contain at least %s special character(s)."; # XXX
$PALANG['pInvalidDomainRegex'] = "Invalid domain name %s, fails regexp check"; # XXX
$PALANG['pInvalidDomainDNS'] = "Invalid domain %s, and/or not discoverable in DNS"; # XXX
$PALANG['pInvalidMailRegex'] = "Invalid email address %s, fails regexp check"; # XXX
@ -401,6 +438,62 @@ $PALANG['dateformat_pgsql'] = 'YYYY-mm-dd'; # translators: rearrange to your loc
$PALANG['dateformat_mysql'] = '%Y-%m-%d'; # translators: rearrange to your local date format, but make sure it's a valid MySQL date format # XXX
$PALANG['password_expiration'] = 'Pass expires'; # XXX
$PALANG['password_expiration_desc'] = 'Date when password will expire'; # XXX
$PALANG['To_Mailbox'] = 'Mailbox'; # XXX # XXX
$PALANG['To_Forward_Only'] = 'Forward Only'; # XXX # XXX
$PALANG['pLegal_char_warning'] = 'Caràcter il·legal';
$PALANG['copy'] = 'Còpia';
$PALANG['generate'] = 'Generat';
$PALANG['pMenu_security'] = 'Seguretat';
$PALANG['pMenu_totp'] = 'TOTP';
$PALANG['pMenu_totp_exceptions'] = 'excepcions TOTP';
$PALANG['pMenu_app_passwords'] = 'contrasenyes d\'aplicació';
$PALANG['pUsersMain_totp_exceptions'] = 'Permeteu que les adreces IP de confiança accedeixin a la vostra bústia sense TOTP';
$PALANG['pUsersMenu_totp'] = 'Canvi TOTP';
$PALANG['pTOTP_welcome'] = 'Configuració de la contrasenya d\'una sola vegada basada en el temps';
$PALANG['pUsersMain_totp'] = 'Configuració de la contrasenya d\'una sola vegada basada en el temps';
$PALANG['pTOTP_secret'] = 'TOTP secret';
$PALANG['pTOTP_code'] = 'Codi TOTP';
$PALANG['pTOTP_secret_result_error'] = 'TOTP secret';
$PALANG['change_TOTP'] = 'Canviar configuració TOTP';
$PALANG['pTOTP_code_mismatch'] = 'Nom d\'usuari';
$PALANG['pTOTP_qr'] = 'Preguntes Freqüents - FAQ';
$PALANG['pTOTP_confirm'] = 'Si us plau, confirmeu el vostre inici de sessió proporcionant el vostre codi TOTP actual';
$PALANG['pTotp_failed'] = 'El teu codi introduït no és vàlid. Si us plau, introdueix dins de la caixa de text els caràcters que veu a la imatge de sota. Això és requerit per evitar enviaments automàtics.';
$PALANG['pTotp_stored'] = 'Totp - Totp';
$PALANG['pTotp_exceptions_welcome'] = 'Afegir adreça TOPT-exempta';
$PALANG['pTotp_exceptions_user'] = 'Nom d\'usuari (o domini d\'administració)';
$PALANG['pTotp_exceptions_add'] = 'Afegir excepció';
$PALANG['pTotp_exceptions_address'] = 'Adreça IP';
$PALANG['pTotp_exceptions_description'] = 'Descripció';
$PALANG['pTotp_exceptions_list'] = 'excepcions existents';
$PALANG['pTotp_exceptions_revoke'] = 'Revoke';
$PALANG['pTotp_exceptions_revoked'] = 'Exclusió revocada';
$PALANG['pTotp_exception_result_success'] = 'Excepcional afegit';
$PALANG['pTotp_exception_result_error'] = 'No hi ha excepcions';
$PALANG['pEdit_totp_exception_result_error'] = 'No es poden modificar excepcions de TOTP';
$PALANG['pException_ip_empty_error'] = 'IP no pot ser buit';
$PALANG['pException_desc_empty_error'] = 'No hi ha comentaris';
$PALANG['pException_user_entire_domain_error'] = 'Només els administradors poden afegir excepcions per a un domini sencer.';
$PALANG['pException_user_global_error'] = 'Només els superadmins poden afegir excepcions globals';
$PALANG['pUsersMain_app_passwords'] = 'Configuració de contrasenyes d\'app amb permissos reduïts';
$PALANG['pApp_passwords_list'] = 'Preguntes Freqüents - FAQ';
$PALANG['pApp_password_revoked'] = 'Exclusió revocada';
$PALANG['pApp_passwords_welcome'] = 'Afegir contrasenya d\'aplicació';
$PALANG['pAppPassAdd_result_success'] = 'Afegit una contrasenya d\'aplicació';
$PALANG['pAppPassAdd_pass_empty_error'] = 'La contrasenya no pot ser buida';
$PALANG['pAppPassAdd_result_error'] = 'No es pot afegir la contrasenya de l\'aplicació';
$PALANG['MFA_submit'] = 'Confirmar contrasenya';
$PALANG['pViewlog_action_add_totp_exception'] = 'Afegir excepció TOTP';
$PALANG['pViewlog_action_delete_totp_exception'] = 'Suprimeix l\'excepció TOTP';
$PALANG['pViewlog_action_add_app_password'] = 'Afegir contrasenya d\'aplicació';
$PALANG['mailbox_postapppassword_failed'] = 'L\'script de postapppassword de la bústia ha fallat, comproveu el registre d\'errors per obtenir més informació.';
$PALANG['mailbox_post_totp_exception_delete_failed'] = 'L\'escriptura d\'esborrament de l\'excepció de la bústia de correu va fallar, comproveu el registre d\'errors per obtenir més detalls.';
$PALANG['mailbox_post_totp_exception_add_failed'] = 'L\'excepció de la bústia de correu a totp ha fallat l\'escriptura, comproveu el registre d\'errors per obtenir més detalls.';
$PALANG['mailbox_post_TOTP_change_failed'] = 'La bústia de correu ha fallat l\'script de canvi secret, comproveu el registre d\'errors per obtenir més informació.';
$PALANG['TOTP_already_configured'] = 'TOTP ja està configurat per aquest compte, vols canviar el teu secret?';
$PALANG['pApp_passwords_add'] = 'Afegir la contrasenya específica de l\'aplicació';
$PALANG['please_keep_this_as_last_entry'] = ''; # needed for language-check.sh
/* vim: set expandtab ft=php softtabstop=3 tabstop=3 shiftwidth=3: */

View File

@ -17,6 +17,7 @@ $PALANG['confirm_delete_admin'] = 'Do you really want to delete the admin %s?';
$PALANG['confirm_delete_alias'] = 'Do you really want to delete the alias %s?'; # XXX
$PALANG['confirm_delete_aliasdomain'] = 'Do you really want to delete the alias domain %s?'; # XXX
$PALANG['confirm_delete_domain'] = '你是否确定要删除该域中的所有记录? 删除后不可恢复!\n (%s)'; # XXX text changed to: 'Do you really want to delete all records for the domain %s? This can not be undone'
$PALANG['confirm_delete_dkim'] = 'Do you really want to delete the domain key entry %s?'; # XXX
$PALANG['confirm_delete_fetchmail'] = 'Do you really want to delete the fetchmail job %s?'; # XXX
$PALANG['confirm_delete_mailbox'] = 'Do you really want to delete the mailbox %s?'; # XXX
$PALANG['confirm_delete_vacation'] = 'Do you really want to delete the vacation message for %s?'; # XXX
@ -52,14 +53,16 @@ $PALANG['add_alias_domain'] = 'Add Alias Domain'; # XXX
$PALANG['add_mailbox'] = '新建邮箱'; # XXX check text - should be 'Add Mailbox'
$PALANG['pMenu_fetchmail'] = 'Fetch Email'; # XXX
$PALANG['pMenu_sendmail'] = '发送邮件';
$PALANG['pMenu_dkim'] = 'Domain Keys'; # XXX
$PALANG['pMenu_dkim_signing'] = 'Signing Table'; # XXX
$PALANG['pMenu_password'] = '修改密码';
$PALANG['pMenu_viewlog'] = '查看日志';
$PALANG['pMenu_logout'] = '退出';
$PALANG['pMain_welcome'] = '欢迎来到Postfix Admin!';
$PALANG['pMain_overview'] = '显示你的邮件别名和邮箱. 你可以在这儿进行编辑/删除操作.';
$PALANG['pMain_create_alias'] = '在您的域中新建一个别名.'; # XXX check text - should be 'Create a new alias for your domain.'
$PALANG['pMain_create_mailbox'] = '在您的域中新建一个邮箱.';
$PALANG['pMain_overview'] = '显示你的邮件别名和邮箱. 你可以在这儿进行编辑/删除操作.'; # XXX Text changed to "List your domains. You can edit / delete them from here."
$PALANG['pMain_create_alias'] = '在您的域中新建一个别名.'; # # XXX Text changed to "Create a new email forward."
$PALANG['pMain_create_mailbox'] = '在您的域中新建一个邮箱.'; # XXX Text changed to "Create a new mailbox."
$PALANG['pMain_sendmail'] = '发一封邮件到你新建的一个邮箱中.';
$PALANG['pMain_password'] = '修改你的管理员密码.';
$PALANG['pMain_viewlog'] = '查看日志文件.';
@ -79,6 +82,7 @@ $PALANG['pOverview_welcome'] = '浏览 ';
$PALANG['pOverview_alias_domain_aliases'] = 'Alias Domains'; # XXX
$PALANG['pOverview_alias_address'] = '前往';
$PALANG['active'] = '活动';
$PALANG['smtp_active'] = 'Smtp';
$PALANG['and_x_more'] = '[and %s more...]'; # XXX
$PALANG['pOverview_mailbox_username'] = '邮件地址';
$PALANG['name'] = '姓名';
@ -126,6 +130,7 @@ $PALANG['alias_updated'] = 'The alias %s has been updated!'; # XXX
$PALANG['pCreate_alias_catchall_text'] = '要将所有的邮件全部转发请使用"*"作为别名. 域到域的转发请使用"*@domain.tld".'; # XXX check/beautify - was split in two lines before
$PALANG['mailbox_alias_cant_be_deleted'] = 'This alias belongs to a mailbox and can\'t be deleted!'; # XXX
$PALANG['protected_alias_cant_be_deleted'] = 'The alias %s is protected and can only be deleted by a superadmin'; # XXX
$PALANG['alias_points_to_itself'] = 'Alias may not point to itself'; # XXX
$PALANG['pEdit_alias_welcome'] = '编辑你域名中的别名.'; # XXX Text change to: 'Edit forwarding settings'
$PALANG['pEdit_alias_help'] = '每行一条记录.'; # XXX # XXX Text change to: 'Accepts multiple targets, one entry per line.'
@ -161,6 +166,8 @@ $PALANG['pEdit_mailbox_password_text_error'] = '你输入的两个新密码不
$PALANG['pEdit_mailbox_quota'] = '限制';
$PALANG['pEdit_mailbox_quota_text'] = 'MB';
$PALANG['mb_max'] = 'MB (max: %s)'; # XXX
$PALANG['mb_max_unlimited'] = 'MB (max: unlimited)'; # XXX
$PALANG['mb_max_disabled'] = 'MB (max: disabled)'; # XXX
$PALANG['pEdit_mailbox_quota_text_error'] = '你输入的容量限制超出范围!';
$PALANG['pEdit_mailbox_domain_error'] = '你没有该域的管理权限: ';
$PALANG['pEdit_mailbox_result_error'] = '不能编辑该邮箱!';
@ -198,6 +205,7 @@ $PALANG['reply_once_per_day'] = 'Reply once a day'; # XXX
$PALANG['reply_once_per_week'] = 'Reply once per week'; # XXX
$PALANG['pViewlog_welcome'] = '查看最新的%s项操作日志 域名: ';
$PALANG['pViewlog_welcome_all'] = 'View the last %s actions '; # XXX
$PALANG['pViewlog_timestamp'] = '时间';
$PALANG['pViewlog_action'] = '操作';
$PALANG['pViewlog_data'] = '内容';
@ -237,6 +245,32 @@ $PALANG['pSendmail_body'] = '内容';
$PALANG['pSendmail_button'] = '发送';
$PALANG['pSendmail_result_error'] = '建立邮箱失败! (%s)'; # XXX text change - new: Unable to send email to %s!
$PALANG['pSendmail_result_success'] = '建立邮箱成功! (%s)'; # XXX text change - new: Email sent to %s.
$PALANG['pDkim_new_key'] = 'Add Domain Key'; # XXX
$PALANG['pDkim_new_sign'] = 'Add Sign Table Entry'; # XXX
$PALANG['pDkim_edit_key'] = 'Edit Domain Key'; # XXX
$PALANG['pDkim_edit_sign'] = 'Edit Sign Table Entry'; # XXX
$PALANG['pDkim_field_selector'] = 'Selector'; # XXX
$PALANG['pDkim_field_pkey'] = 'Private Key'; # XXX
$PALANG['pDkim_field_pub'] = 'Public Key'; # XXX
$PALANG['pDkim_field_author'] = 'Author'; # XXX
$PALANG['pDkim_field_dkim_id'] = 'Domain Key'; # XXX
$PALANG['pDkim_field_selector_desc'] = 'Defines the name of the selector to be used when signing messages'; # XXX
$PALANG['pDkim_field_domain_desc'] = 'Defines the domain which will use this key for signing'; # XXX
$PALANG['pDkim_field_pkey_desc'] = 'PEM-formatted private key to be used for signing all messages'; # XXX
$PALANG['pDkim_field_pub_desc'] = 'PEM-formatted public key'; # XXX
$PALANG['pDkim_field_author_desc'] = 'Author that will use this key for signing. Can be either mailbox or domain, with mailbox taking precedence.'; # XXX
$PALANG['pDkim_field_dkim_id_desc'] = 'Domain Key that this author will use'; # XXX
$PALANG['dkim_already_exists'] = 'This Domain Key has already been added!'; # XXX
$PALANG['dkim_does_not_exist'] = 'This Domain Key does not exist!'; # XXX
$PALANG['dkim_signing_already_exists'] = 'This Domain Signing Entry already exsits!'; # XXX
$PALANG['dkim_signing_does_not_exist'] = 'This Domain Signing Entry does not exist!'; # XXX
$PALANG['pViewlog_action_create_dkim_entry'] = 'create domain key entry'; # XXX
$PALANG['pViewlog_action_edit_dkim_entry'] = 'edit domain key entry'; # XXX
$PALANG['pViewlog_action_delete_dkim_entry'] = 'delete domain key entry'; # XXX
$PALANG['pViewlog_action_create_dkim_signing_entry'] = 'create domain signing entry'; # XXX
$PALANG['pViewlog_action_edit_dkim_signing_entry'] = 'edit domain signing entry'; # XXX
$PALANG['pViewlog_action_delete_dkim_signing_entry'] = 'delete domain signing entry'; # XXX
$PALANG['pMain_dkim'] = 'Add a Domain Key for use with OpenDKIM.'; # XXX
$PALANG['pAdminMenu_list_admin'] = '管理员清单';
$PALANG['pAdminMenu_list_domain'] = '域名清单';
@ -266,10 +300,12 @@ $PALANG['pAdminCreate_domain_result_success'] = '新增域成功! (%s)'; # XXX T
$PALANG['domain_updated'] = 'The domain %s has been updated.'; # XXX
$PALANG['pAdminDelete_admin_error'] = 'Unable to delete admin!'; # XXX
$PALANG['domain_postdel_failed'] = 'The domain postdeletion script failed, check the error log for details!'; # XXX
$PALANG['domain_postedit_failed'] = 'The domain postedit script failed, check the error log for details!'; # XXX
$PALANG['domain_postcreate_failed'] = 'The domain postcreate script failed, check the error log for details!'; # XXX
$PALANG['mailbox_postdel_failed'] = 'The mailbox postdeletion script failed, check the error log for details!'; # XXX
$PALANG['mailbox_postedit_failed'] = 'The mailbox postedit script failed, check the error log for details!'; # XXX
$PALANG['mailbox_postcreate_failed'] = 'The mailbox postcreate script failed, check the error log for details!'; # XXX
$PALANG['mailbox_postpassword_failed'] = 'The mailbox postpassword script failed, check the error log for details!'; # XXX
$PALANG['pAdminDelete_alias_domain_error'] = 'Unable to remove domain alias!'; # XXX
$PALANG['domain_conflict_vacation_domain'] = 'You can\'t use the vacation domain as mail domain!'; # XXX
@ -318,7 +354,7 @@ $PALANG['pUsersVacation_welcome_text'] = '你已经设置了自动回复! (%s)';
$PALANG['pUsersVacation_subject_text'] = '我现在无法回信';
$PALANG['message'] = '内容'; # XXX text changed to 'Message'
$PALANG['pUsersVacation_body_text'] = <<<EOM
我在 <date> 到 <date> 这段时间内暂时无法回信.
我在 <%From_Date> 到 <%Until_Date> 这段时间内暂时无法回信.
如果你有急事请与 <contact person> 联系.
EOM;
$PALANG['pUsersVacation_activefrom'] = 'Active from'; # XXX
@ -346,6 +382,7 @@ $PALANG['pStatus_popimap'] = 'POP/IMAP '; # XXX
$PALANG['password_too_short'] = "Password is too short - requires %s characters"; # XXX
$PALANG['password_no_characters'] = "Your password must contain at least %s letters (A-Z, a-z)."; # XXX
$PALANG['password_no_digits'] = "Your password must contain at least %s digit(s)."; # XXX
$PALANG['password_no_special'] = "Your password must contain at least %s special character(s)."; # XXX
$PALANG['pInvalidDomainRegex'] = "Invalid domain name %s, fails regexp check"; # XXX
$PALANG['pInvalidDomainDNS'] = "Invalid domain %s, and/or not discoverable in DNS"; # XXX
$PALANG['pInvalidMailRegex'] = "Invalid email address %s, fails regexp check"; # XXX
@ -401,6 +438,63 @@ $PALANG['dateformat_pgsql'] = 'YYYY-mm-dd'; # translators: rearrange to your loc
$PALANG['dateformat_mysql'] = '%Y-%m-%d'; # translators: rearrange to your local date format, but make sure it's a valid MySQL date format # XXX
$PALANG['password_expiration'] = 'Pass expires'; # XXX
$PALANG['password_expiration_desc'] = 'Date when password will expire'; # XXX
$PALANG['To_Mailbox'] = 'Mailbox'; # XXX # XXX
$PALANG['To_Forward_Only'] = 'Forward Only'; # XXX # XXX
$PALANG['pLegal_char_warning'] = '非法性质';
$PALANG['copy'] = '页: 1';
$PALANG['generate'] = '基因';
$PALANG['pMenu_security'] = '安全';
$PALANG['pMenu_totp'] = '附 件';
$PALANG['pMenu_totp_exceptions'] = '附 件';
$PALANG['pMenu_app_passwords'] = '申请密码';
$PALANG['pUsersMain_totp_exceptions'] = '允许信使的IP地址在无邮管处的情况下进入你的邮箱';
$PALANG['pUsersMenu_totp'] = 'B. 变革';
$PALANG['pTOTP_welcome'] = '设置基于时间的一次性密码';
$PALANG['pUsersMain_totp'] = '设置基于时间的一次性密码';
$PALANG['pTOTP_secret'] = '附 件';
$PALANG['pTOTP_code'] = 'TP代码';
$PALANG['pTOTP_secret_result_error'] = '不能改变秘密做法';
$PALANG['change_TOTP'] = 'A. 变化情况';
$PALANG['pTOTP_code_mismatch'] = '输入的单时密码不正确';
$PALANG['pTOTP_qr'] = 'TOTP QR 代码';
$PALANG['pTOTP_confirm'] = '请通过提供您目前的《入境许可证法》确认您的原样。';
$PALANG['pTotp_failed'] = '你加入的法典无效。 请使用现行法典。';
$PALANG['pTotp_stored'] = '你成功地确认了你的新的特工秘密。';
$PALANG['pTotp_exceptions_welcome'] = '致开幕词';
$PALANG['pTotp_exceptions_user'] = '用户名(或行政领域)';
$PALANG['pTotp_exceptions_add'] = '增 编';
$PALANG['pTotp_exceptions_address'] = 'IP-Address';
$PALANG['pTotp_exceptions_description'] = '说明';
$PALANG['pTotp_exceptions_list'] = '现有例外';
$PALANG['pTotp_exceptions_revoke'] = '退约';
$PALANG['pTotp_exceptions_revoked'] = '撤销的例外情况';
$PALANG['pTotp_exception_result_success'] = '例外增加';
$PALANG['pTotp_exception_result_error'] = '否';
$PALANG['pEdit_totp_exception_result_error'] = '无法修改许可证制度的例外情况';
$PALANG['pException_ip_empty_error'] = '知识产权不能空洞';
$PALANG['pException_desc_empty_error'] = '描述不能空洞';
$PALANG['pException_user_entire_domain_error'] = '只有行政才能增加整个领域的例外情况。';
$PALANG['pException_user_global_error'] = '只有超级行政才能增加全球例外情况';
$PALANG['pUsersMain_app_passwords'] = '设置可撤销的、特权减少的密码';
$PALANG['pApp_passwords_list'] = '现有申请密码';
$PALANG['pApp_password_revoked'] = '撤销的例外情况';
$PALANG['pApp_passwords_welcome'] = '附录';
$PALANG['pAppPassAdd_result_success'] = '添加申请密码';
$PALANG['pAppPassAdd_pass_empty_error'] = '口号不能空洞';
$PALANG['pAppPassAdd_result_error'] = '不要增加申请密码';
$PALANG['MFA_submit'] = 'Confirmlogin';
$PALANG['pViewlog_action_add_totp_exception'] = '附 件';
$PALANG['pViewlog_action_delete_totp_exception'] = '删除备选案文';
$PALANG['pViewlog_action_add_app_password'] = '附录';
$PALANG['mailbox_postapppassword_failed'] = '邮箱的邮递申请词稿失败,核对错误记录,以供参考!';
$PALANG['mailbox_post_totp_exception_delete_failed'] = '邮箱邮箱邮箱破除稿失败,详细核对错误记录!';
$PALANG['mailbox_post_totp_exception_add_failed'] = '邮箱邮箱的特例添加文字失败,核对错误的标识,以供参考!';
$PALANG['mailbox_post_TOTP_change_failed'] = '邮箱邮箱贴上秘密变更信稿的工作失败了,核对错误记录的细节!';
$PALANG['TOTP_already_configured'] = '你是否想改变你的秘密?';
$PALANG['pApp_passwords_add'] = '添加针对具体申请的密码';
$PALANG['please_keep_this_as_last_entry'] = ''; # needed for language-check.sh
/* vim: set expandtab ft=php softtabstop=3 tabstop=3 shiftwidth=3: */

View File

@ -24,6 +24,7 @@ $PALANG['confirm_delete_admin'] = 'Opravdu chcete smazat účet správce %s?';
$PALANG['confirm_delete_alias'] = 'Opravdu chcete smazat přesměrování %s?';
$PALANG['confirm_delete_aliasdomain'] = 'Opravdu chcete smazat přesměrování domény %s?';
$PALANG['confirm_delete_domain'] = 'Opravdu chcete smazat všechny záznamy pro doménu %s? Tohle nelze vrátit!';
$PALANG['confirm_delete_dkim'] = 'Do you really want to delete the domain key entry %s?'; # XXX
$PALANG['confirm_delete_fetchmail'] = 'Opravdu chcete smazat úlohu pro stažení pošty %s?';
$PALANG['confirm_delete_mailbox'] = 'Opravdu chcete smazat schránku %s?';
$PALANG['confirm_delete_vacation'] = 'Opravdu chcete smazat správu o nepřítomnosti pro %s?';
@ -60,14 +61,16 @@ $PALANG['add_alias_domain'] = 'Přidat přesměrování domény';
$PALANG['add_mailbox'] = 'Přidat schránku';
$PALANG['pMenu_fetchmail'] = 'Stahování pošty';
$PALANG['pMenu_sendmail'] = 'Poslat email';
$PALANG['pMenu_dkim'] = 'Domain Keys'; # XXX
$PALANG['pMenu_dkim_signing'] = 'Signing Table'; # XXX
$PALANG['pMenu_password'] = 'Změnit heslo';
$PALANG['pMenu_viewlog'] = 'Prohlížet log';
$PALANG['pMenu_logout'] = 'Odhlásit';
$PALANG['pMain_welcome'] = 'Vítejte v Postfix Adminu!';
$PALANG['pMain_overview'] = 'Výpis přesměrování a schránek. Můžete je zde upravovat a mazat.';
$PALANG['pMain_create_alias'] = 'Vytvořit nové přesměrování pro vaši doménu.';
$PALANG['pMain_create_mailbox'] = 'Vytvořit schránku v této doméně.';
$PALANG['pMain_overview'] = 'Výpis Vašich domén. Můžete je zde upravovat a mazat.';
$PALANG['pMain_create_alias'] = 'Vytvořit nové přesměrování e-mailu.';
$PALANG['pMain_create_mailbox'] = 'Vytvořit novou schránku.';
$PALANG['pMain_sendmail'] = 'Poslat email do jedné z nově vytvořených schránek.';
$PALANG['pMain_password'] = 'Změnit heslo administrátorského účtu.';
$PALANG['pMain_viewlog'] = 'Prohlížet záznamy změn v doméně.';
@ -87,6 +90,7 @@ $PALANG['pOverview_welcome'] = 'Přehled domény ';
$PALANG['pOverview_alias_domain_aliases'] = 'Přesměrované domény';
$PALANG['pOverview_alias_address'] = 'Od';
$PALANG['active'] = 'Aktivní';
$PALANG['smtp_active'] = 'Smtp';
$PALANG['and_x_more'] = '[a %s dalších...]';
$PALANG['pOverview_mailbox_username'] = 'Email';
$PALANG['name'] = 'Jméno';
@ -134,6 +138,7 @@ $PALANG['alias_updated'] = 'Přesměrování %s bylo upraveno!';
$PALANG['pCreate_alias_catchall_text'] = 'Pro vytvoření doménového koše použijte * jako alias. Pro přesměrování doména -> doména použijte *@domain.tld jako cíl.';
$PALANG['mailbox_alias_cant_be_deleted'] = 'Toto přesměrování je svázáno s emailem a nemůže být proto vymazáno!';
$PALANG['protected_alias_cant_be_deleted'] = 'Tento alias %s je chráněný a může být odstraněn pouze superadministrátorem';
$PALANG['alias_points_to_itself'] = 'Alias nemůže směřovat sám na sebe';
$PALANG['pEdit_alias_welcome'] = 'Upravit nastavení přesměrování.';
$PALANG['pEdit_alias_help'] = 'Je možné zadat více cílových adres, jeden záznam na řádek.';
@ -147,15 +152,15 @@ $PALANG['pEdit_alias_forward_only'] = 'Přesměrovat pouze na dané adresy.';
$PALANG['pEdit_alias_result_error'] = 'Nepodařilo se upravit přesměrování! (%s)';
$PALANG['pCreate_mailbox_welcome'] = 'Vytvořit novou lokální schránku v doméně.';
$PALANG['pCreate_mailbox_local_part_error'] = 'Should be the bit before the @ sign.'; # XXX
$PALANG['pCreate_mailbox_local_part_error'] = 'Toto je ta část adresy před zavináčem (@).';
$PALANG['pCreate_mailbox_username_text_error1'] = 'Adresa není platná!';
$PALANG['pCreate_mailbox_username_text_error3'] = 'Dosáhli jste limitu, nemů&cedil;ete vytvářet další schránky!';
$PALANG['pCreate_mailbox_password_text'] = 'Heslo pro POP3/IMAP/SMTP';
$PALANG['pCreate_mailbox_name_text'] = 'Celé jméno';
$PALANG['pCreate_mailbox_phone'] = 'Mobile phone'; # XXX
$PALANG['pCreate_mailbox_phone_desc'] = "Used to send a SMS if the password is forgotten"; # XXX
$PALANG['pCreate_mailbox_email'] = 'Other e-mail'; # XXX
$PALANG['pCreate_mailbox_email_desc'] = "Used if the password is forgotten"; # XXX
$PALANG['pCreate_mailbox_phone'] = 'Mobilní telefon';
$PALANG['pCreate_mailbox_phone_desc'] = "Použito k zaslání SMS v případě zapomenutí hesla";
$PALANG['pCreate_mailbox_email'] = 'Jiný e-mail';
$PALANG['pCreate_mailbox_email_desc'] = "Použito pro obnovu hesla v případě ztráty hesla";
$PALANG['pCreate_mailbox_mail'] = 'Odeslat uvítací email';
$PALANG['pCreate_mailbox_result_error'] = 'Vytvoření schránky %s selhalo!';
$PALANG['pCreate_mailbox_result_success'] = 'Schránka %s byla přidána do tabulky schránek!';
@ -169,6 +174,8 @@ $PALANG['pEdit_mailbox_password_text_error'] = 'Zadaná hesla se neshodují!';
$PALANG['pEdit_mailbox_quota'] = 'Místo';
$PALANG['pEdit_mailbox_quota_text'] = 'MB';
$PALANG['mb_max'] = 'MB (maximálně: %s)';
$PALANG['mb_max_unlimited'] = 'MB (maximálně: unlimited)'; # XXX
$PALANG['mb_max_disabled'] = 'MB (maximálně: disabled)'; # XXX
$PALANG['pEdit_mailbox_quota_text_error'] = 'Zadané místo je příliš velké!';
$PALANG['pEdit_mailbox_domain_error'] = 'Tato doména není vaše: ';
$PALANG['pEdit_mailbox_result_error'] = 'Nepodařilo se upravit schránku!';
@ -183,13 +190,13 @@ $PALANG['pPassword_password_text_error'] = 'Zadaná hesla jsou rozdílná nebo p
$PALANG['change_password'] = 'Změna hesla';
$PALANG['pPassword_result_error'] = 'Nepodařilo se změnit heslo! (%s)';
$PALANG['pPassword_result_success'] = 'Heslo bylo změněno! (%s)';
$PALANG['pPassword_recovery_title'] = 'Follow the instructions to reset your password.'; # XXX
$PALANG['pPassword_recovery_button'] = 'Send me the code'; # XXX
$PALANG['pPassword_recovery_email_body'] = "Hello,\n\nUse the following link to change your email password :\n%s\n\nRegards,\n\n" . $CONF['admin_name']; # XXX
$PALANG['pPassword_recovery_sms_body'] = "Hello,\nThe code to change your password is: %s\n" . $CONF['admin_name']; # XXX
$PALANG['pPassword_recovery_processed'] = "We processed your request. If you entered a valid username, you'll receive an email/SMS with a password code."; # XXX
$PALANG['pPassword_password_code'] = 'Code sent by email/SMS'; # XXX
$PALANG['pPassword_code_text_error'] = 'Invalid code'; # XXX
$PALANG['pPassword_recovery_title'] = 'Pro obnovu hesla k Vaší e-mailové schránce postupujte podle instrukcí.';
$PALANG['pPassword_recovery_button'] = 'Zaslat kód pro obnovu hesla';
$PALANG['pPassword_recovery_email_body'] = "Dobrý den,\n\npro obnovu hesla k Vaší e-mailové schránce použijte tento odkaz :\n%s\n\nS pozdravem\n\n" . $CONF['admin_name'];
$PALANG['pPassword_recovery_sms_body'] = "Kod pro obnovu hesla: %s\n" . $CONF['admin_name'];
$PALANG['pPassword_recovery_processed'] = "Váš požadavek byl přijat. Pokud bylo zadáno platné uživatelské jméno, bude Vám zaslán e-mail/SMS s kódem pro obnovu hesla.";
$PALANG['pPassword_password_code'] = 'Kód byl zaslán na záložní e-mailovou adresu/SMS';
$PALANG['pPassword_code_text_error'] = 'Neplatný kód';
$PALANG['pEdit_vacation_set'] = 'Změnit / nastavit zprávu o nepřítomnosti';
$PALANG['pEdit_vacation_remove'] = 'Odstranit zprávu o nepřítomnosti';
@ -208,6 +215,7 @@ $PALANG['reply_once_per_day'] = 'Odpovědět jednou za den';
$PALANG['reply_once_per_week'] = 'Odpovědět jednou za týden';
$PALANG['pViewlog_welcome'] = 'Prohlížet %s posledních akcí pro ';
$PALANG['pViewlog_welcome_all'] = 'Prohlížet %s posledních akcí ';
$PALANG['pViewlog_timestamp'] = 'Časová značka';
$PALANG['pViewlog_action'] = 'Akce';
$PALANG['pViewlog_data'] = 'Poznámka';
@ -248,6 +256,32 @@ $PALANG['pSendmail_body'] = 'Obsah';
$PALANG['pSendmail_button'] = 'Poslat email';
$PALANG['pSendmail_result_error'] = 'Email na %s se nepodařilo odeslat!';
$PALANG['pSendmail_result_success'] = 'Email odeslán na %s';
$PALANG['pDkim_new_key'] = 'Add Domain Key'; # XXX
$PALANG['pDkim_new_sign'] = 'Add Sign Table Entry'; # XXX
$PALANG['pDkim_edit_key'] = 'Edit Domain Key'; # XXX
$PALANG['pDkim_edit_sign'] = 'Edit Sign Table Entry'; # XXX
$PALANG['pDkim_field_selector'] = 'Selector'; # XXX
$PALANG['pDkim_field_pkey'] = 'Private Key'; # XXX
$PALANG['pDkim_field_pub'] = 'Public Key'; # XXX
$PALANG['pDkim_field_author'] = 'Author'; # XXX
$PALANG['pDkim_field_dkim_id'] = 'Domain Key'; # XXX
$PALANG['pDkim_field_selector_desc'] = 'Defines the name of the selector to be used when signing messages'; # XXX
$PALANG['pDkim_field_domain_desc'] = 'Defines the domain which will use this key for signing'; # XXX
$PALANG['pDkim_field_pkey_desc'] = 'PEM-formatted private key to be used for signing all messages'; # XXX
$PALANG['pDkim_field_pub_desc'] = 'PEM-formatted public key'; # XXX
$PALANG['pDkim_field_author_desc'] = 'Author that will use this key for signing. Can be either mailbox or domain, with mailbox taking precedence.'; # XXX
$PALANG['pDkim_field_dkim_id_desc'] = 'Domain Key that this author will use'; # XXX
$PALANG['dkim_already_exists'] = 'This Domain Key has already been added!'; # XXX
$PALANG['dkim_does_not_exist'] = 'This Domain Key does not exist!'; # XXX
$PALANG['dkim_signing_already_exists'] = 'This Domain Signing Entry already exsits!'; # XXX
$PALANG['dkim_signing_does_not_exist'] = 'This Domain Signing Entry does not exist!'; # XXX
$PALANG['pViewlog_action_create_dkim_entry'] = 'create domain key entry'; # XXX
$PALANG['pViewlog_action_edit_dkim_entry'] = 'edit domain key entry'; # XXX
$PALANG['pViewlog_action_delete_dkim_entry'] = 'delete domain key entry'; # XXX
$PALANG['pViewlog_action_create_dkim_signing_entry'] = 'create domain signing entry'; # XXX
$PALANG['pViewlog_action_edit_dkim_signing_entry'] = 'edit domain signing entry'; # XXX
$PALANG['pViewlog_action_delete_dkim_signing_entry'] = 'delete domain signing entry'; # XXX
$PALANG['pMain_dkim'] = 'Add a Domain Key for use with OpenDKIM.'; # XXX
$PALANG['pAdminMenu_list_admin'] = 'Administrátoři domén';
$PALANG['pAdminMenu_list_domain'] = 'Domény';
@ -278,10 +312,12 @@ $PALANG['domain_updated'] = 'Doména %s byla aktualizována.';
$PALANG['pAdminDelete_admin_error'] = 'Nepodařilo se odstranit admin uživatele!';
$PALANG['domain_postdel_failed'] = 'Spuštění skriptu po smazání domény selhalo, zkontrolujte log soubor!';
$PALANG['domain_postedit_failed'] = 'Spuštění skriptu po úpravě domény selhalo, zkontrolujte log soubor!';
$PALANG['domain_postcreate_failed'] = 'Spuštění skriptu po vytvoření domény selhalo, zkontrolujte log soubor!';
$PALANG['mailbox_postdel_failed'] = 'Spuštění skriptu po smazání schránky selhalo, zkontrolujte log soubor!';
$PALANG['mailbox_postedit_failed'] = 'Spuštení skriptu po úpravě schránky selhalo, zkontrolujte log soubor!';
$PALANG['mailbox_postcreate_failed'] = 'Spuštení skriptu po vytvoření schránky selhalo, zkontrolujte log soubor!';
$PALANG['mailbox_postpassword_failed'] = 'Spuštení skriptu po úpravě hesla schránky selhalo, zkontrolujte log soubor!';
$PALANG['pAdminDelete_alias_domain_error'] = 'Nepodařilo se odstranit přesměrování domény!';
$PALANG['domain_conflict_vacation_domain'] = 'Doménu využitou pro zprávy o nepřítomnosti nelze použít jako mailovou doménu!';
@ -315,7 +351,7 @@ $PALANG['pAdminEdit_admin_result_success'] = 'Administrátor %s byl upraven!';
$PALANG['pUsersLogin_welcome'] = 'Zde se přihlašují uživatelé pro změnu hesla, přesměrování nebo automatické odpovědi.';
$PALANG['pUsersLogin_username_incorrect'] = 'Nesprávné uživatelské jmeno. Přihlašujte se svojí emailovou adresou!';
$PALANG['pUsersLogin_password_incorrect'] = 'Nesprávné heslo!';
$PALANG['pUsersLogin_password_recover'] = 'I forgot my password'; # XXX
$PALANG['pUsersLogin_password_recover'] = 'Obnovit zapomenuté heslo';
$PALANG['pUsersMenu_vacation'] = 'Automatická odpověď';
$PALANG['pUsersMenu_edit_alias'] = 'Změna přesměrování';
@ -352,14 +388,15 @@ $PALANG['pBroadcast_error_empty'] = 'Pole Od, Předmět a Zpráva by neměly bý
$PALANG['broadcast_mailboxes_only'] = 'Pouze poslat do schránek';
$PALANG['broadcast_to_domains'] = 'Poslat na domény:';
$PALANG['pStatus_undeliverable'] = 'možná NEDORUČITELNÉ ';
$PALANG['pStatus_disabled'] = 'Account disabled '; # XXX
$PALANG['pStatus_expired'] = 'Password expired '; # XXX
$PALANG['pStatus_vacation'] = 'Vacation enabled '; # XXX
$PALANG['pStatus_disabled'] = 'Účet pozastaven ';
$PALANG['pStatus_expired'] = 'Heslo expirováno ';
$PALANG['pStatus_vacation'] = 'Aktivní mód dovolené ';
$PALANG['pStatus_custom'] = 'Doručeno do ';
$PALANG['pStatus_popimap'] = 'POP/IMAP ';
$PALANG['password_too_short'] = "Heslo je příliš krátké - je vyžadováno minimálně %s znaků";
$PALANG['password_no_characters'] = "Heslo musí obsahovat alespoň %s znak(-y)."; # XXX text changed to "Your password must contain at least %s letters (A-Z, a-z)."
$PALANG['password_no_characters'] = "Heslo musí obsahovat alespoň %s písmen/a (A-Z, a-z).";
$PALANG['password_no_digits'] = "Heslo musí obsahovat alespoň %s číslici(-ce).";
$PALANG['password_no_special'] = "Your password must contain at least %s special character(s)."; # XXX
$PALANG['pInvalidDomainRegex'] = "Neplatné doménové jméno %s, nevyhovělo regulárnímu výrazu";
$PALANG['pInvalidDomainDNS'] = "Neplatná doména %s, a/nebo nezjištěn DNS záznam.";
$PALANG['pInvalidMailRegex'] = "Neplatná emailová adresa %s, nevyhověla regulárnímu výrazu.";
@ -377,7 +414,7 @@ $PALANG['pFetchmail_password_missing'] = 'Prosím zadejte heslo ke vzdálené sc
$PALANG['pFetchmail_field_id'] = 'ID';
$PALANG['pFetchmail_field_mailbox'] = 'Schránka';
$PALANG['pFetchmail_field_src_server'] = 'Server';
$PALANG['pFetchmail_field_src_port'] = 'Port'; # XXX
$PALANG['pFetchmail_field_src_port'] = 'Port';
$PALANG['pFetchmail_field_src_auth'] = 'Typ autentizace';
$PALANG['pFetchmail_field_src_user'] = 'Uživatel';
$PALANG['pFetchmail_field_src_password'] = $PALANG['password']; # needed until fetchmail is migrated into FetchmailHandler
@ -397,7 +434,7 @@ $PALANG['pFetchmail_field_returned_text'] = 'Výstupní text';
$PALANG['pFetchmail_desc_id'] = 'ID záznamu';
$PALANG['pFetchmail_desc_mailbox'] = 'Místní schránka';
$PALANG['pFetchmail_desc_src_server'] = 'Vzdálený server';
$PALANG['pFetchmail_desc_src_port'] = 'Remote port number, if a non-standard remote port is needed. (0: use default)'; # XXX
$PALANG['pFetchmail_desc_src_port'] = 'Číslo vzdáleného portu, pokud je potřeba zadat nestandardní (0: použij výchozí)';
$PALANG['pFetchmail_desc_src_auth'] = 'Většinou \'password\''; # Translators: Please do NOT translate 'password' here
$PALANG['pFetchmail_desc_src_user'] = 'Vzdálený uživatel';
$PALANG['pFetchmail_desc_src_password'] = 'Heslo vzdáleného uživatele';
@ -413,8 +450,66 @@ $PALANG['pFetchmail_desc_date'] = 'Datum posledního stažení pošt
$PALANG['pFetchmail_desc_returned_text'] = 'Výstupní textový záznam posledního stahování pošty';
$PALANG['dateformat_pgsql'] = 'dd-mm-YYYY'; # translators: rearrange to your local date format, but make sure it's a valid PostgreSQL date format
$PALANG['dateformat_mysql'] = '%d.%m.%Y'; # translators: rearrange to your local date format, but make sure it's a valid MySQL date format
$PALANG['password_expiration'] = 'Pass expires'; # XXX
$PALANG['password_expiration_desc'] = 'Date when password will expire'; # XXX
$PALANG['password_expiration'] = 'Heslo expiruje';
$PALANG['password_expiration_desc'] = 'Datum expirace hesla';
$PALANG['To_Mailbox'] = 'Mailbox'; # XXX # XXX
$PALANG['To_Forward_Only'] = 'Forward Only'; # XXX # XXX
$PALANG['pLegal_char_warning'] = 'Nelegální charakter';
$PALANG['copy'] = 'Čeština';
$PALANG['generate'] = 'Generovat';
$PALANG['pMenu_security'] = 'Bezpečnost';
$PALANG['pMenu_totp'] = 'Čeština';
$PALANG['pMenu_totp_exceptions'] = 'Výjimku TOTP';
$PALANG['pMenu_app_passwords'] = 'Aplikační hesla';
$PALANG['pUsersMain_totp_exceptions'] = 'Povolit důvěryhodné IP adresy pro přístup k vaší poštovní schránce bez TOTP';
$PALANG['pUsersMenu_totp'] = 'Změna TOTP';
$PALANG['pTOTP_welcome'] = 'Nastavení hesla na bázi času';
$PALANG['pUsersMain_totp'] = 'Nastavení hesla na bázi času';
$PALANG['pTOTP_secret'] = 'TOTP tajemství';
$PALANG['pTOTP_code'] = 'TOTP kód';
$PALANG['pTOTP_secret_result_error'] = 'Nelze změnit tajemství TOTP';
$PALANG['change_TOTP'] = 'Změna nastavení TOTP';
$PALANG['pTOTP_code_mismatch'] = 'Nesprávná jednostranná slova zadané';
$PALANG['pTOTP_qr'] = 'TOTP QR kód';
$PALANG['pTOTP_confirm'] = 'Prosím, potvrďte svůj login tím, že vám poskytne aktuální kód TOTP';
$PALANG['pTotp_failed'] = 'Váš zadaný kód není platný. Použijte aktuální kód.';
$PALANG['pTotp_stored'] = 'Úspěšně potvrzujete, že Váš nový TOTP tajemství.';
$PALANG['pTotp_exceptions_welcome'] = 'Přidat adresu TOPT-exempt';
$PALANG['pTotp_exceptions_user'] = 'Uživatelské jméno (nebo doména pro administrátory)';
$PALANG['pTotp_exceptions_add'] = 'Přidat výjimku';
$PALANG['pTotp_exceptions_address'] = 'IP-Adresa';
$PALANG['pTotp_exceptions_description'] = 'Čeština';
$PALANG['pTotp_exceptions_list'] = 'Stávající výjimky';
$PALANG['pTotp_exceptions_revoke'] = 'Čeština';
$PALANG['pTotp_exceptions_revoked'] = 'S výjimkou odvolání';
$PALANG['pTotp_exception_result_success'] = 'S výjimkou přidané';
$PALANG['pTotp_exception_result_error'] = 'Nelze přidat výjimku';
$PALANG['pEdit_totp_exception_result_error'] = 'Nelze upravit výjimky TOTP';
$PALANG['pException_ip_empty_error'] = 'IP nelze vyprázdnit';
$PALANG['pException_desc_empty_error'] = 'Popis nelze vyprázdnit';
$PALANG['pException_user_entire_domain_error'] = 'Pouze administrátory mohou přidávat výjimky pro celou doménu.';
$PALANG['pException_user_global_error'] = 'Pouze superadminy mohou přidat globální výjimky';
$PALANG['pUsersMain_app_passwords'] = 'Nastavení revokovatelné heslo aplikace se sníženou oprávněními';
$PALANG['pApp_passwords_list'] = 'Stávající heslo aplikace';
$PALANG['pApp_password_revoked'] = 'S výjimkou odvolání';
$PALANG['pApp_passwords_welcome'] = 'Přidat heslo aplikace';
$PALANG['pAppPassAdd_result_success'] = 'Přidáno heslo aplikace';
$PALANG['pAppPassAdd_pass_empty_error'] = 'Heslo nelze vyprázdnit';
$PALANG['pAppPassAdd_result_error'] = 'Nelze přidat heslo aplikace';
$PALANG['MFA_submit'] = 'Potvrzení přihlášení';
$PALANG['pViewlog_action_add_totp_exception'] = 'Přidat výjimku TOTP';
$PALANG['pViewlog_action_delete_totp_exception'] = 'Odstranění výjimky TOTP';
$PALANG['pViewlog_action_add_app_password'] = 'Přidat heslo aplikace';
$PALANG['mailbox_postapppassword_failed'] = 'Poapppassword skript selhal, zkontrolujte protokol chyby pro podrobnosti!';
$PALANG['mailbox_post_totp_exception_delete_failed'] = 'Schránkový příspěvek totp výjimka odstranění skriptu selhal, zkontrolujte protokol chyby pro podrobnosti!';
$PALANG['mailbox_post_totp_exception_add_failed'] = 'Poštovní schránka post totp výjimka přidat skript selhal, zkontrolujte protokol chyby pro podrobnosti!';
$PALANG['mailbox_post_TOTP_change_failed'] = 'Poštovní schránka post totp tajné změny skriptu selhal, zkontrolujte protokol chyby pro podrobnosti!';
$PALANG['TOTP_already_configured'] = 'TOTP je již nakonfigurován pro tento účet, chcete změnit tajemství?';
$PALANG['pApp_passwords_add'] = 'Přidat heslo specifické pro aplikaci';
$PALANG['please_keep_this_as_last_entry'] = ''; # needed for language-check.sh
/* vim: set expandtab ft=php softtabstop=3 tabstop=3 shiftwidth=3: */

View File

@ -20,6 +20,7 @@ $PALANG['confirm_delete_admin'] = 'Do you really want to delete the admin %s?';
$PALANG['confirm_delete_alias'] = 'Do you really want to delete the alias %s?'; # XXX
$PALANG['confirm_delete_aliasdomain'] = 'Do you really want to delete the alias domain %s?'; # XXX
$PALANG['confirm_delete_domain'] = 'Vil du virkelig slette alle adresser for dette domæne? Dette kan ikke fortrydes!\n (%s)'; # XXX text changed to: 'Do you really want to delete all records for the domain %s? This can not be undone'
$PALANG['confirm_delete_dkim'] = 'Do you really want to delete the domain key entry %s?'; # XXX
$PALANG['confirm_delete_fetchmail'] = 'Do you really want to delete the fetchmail job %s?'; # XXX
$PALANG['confirm_delete_mailbox'] = 'Do you really want to delete the mailbox %s?'; # XXX
$PALANG['confirm_delete_vacation'] = 'Do you really want to delete the vacation message for %s?'; # XXX
@ -56,14 +57,16 @@ $PALANG['add_alias_domain'] = 'Tilføje alias domæne'; # XXX check text - shoul
$PALANG['add_mailbox'] = 'Tilføj postboks';
$PALANG['pMenu_fetchmail'] = 'Hent email';
$PALANG['pMenu_sendmail'] = 'Send email';
$PALANG['pMenu_dkim'] = 'Domain Keys'; # XXX
$PALANG['pMenu_dkim_signing'] = 'Signing Table'; # XXX
$PALANG['pMenu_password'] = 'Adgangskode';
$PALANG['pMenu_viewlog'] = 'Vis log';
$PALANG['pMenu_logout'] = 'Log ud';
$PALANG['pMain_welcome'] = 'Velkommen til PostfixAdmin!';
$PALANG['pMain_overview'] = 'Vis alle aliases og postbokse. Du kan redigere/slette dem herfra.';
$PALANG['pMain_create_alias'] = 'Tilføj et nyt alias til et domæne.'; # XXX check text - should be 'Create a new alias for your domain.'
$PALANG['pMain_create_mailbox'] = 'Tilføj en ny postboks til et domæne.';
$PALANG['pMain_overview'] = 'Vis alle aliases og postbokse. Du kan redigere/slette dem herfra.'; # XXX Text changed to "List your domains. You can edit / delete them from here."
$PALANG['pMain_create_alias'] = 'Tilføj et nyt alias til et domæne.'; # # XXX Text changed to "Create a new email forward."
$PALANG['pMain_create_mailbox'] = 'Tilføj en ny postboks til et domæne.'; # XXX Text changed to "Create a new mailbox."
$PALANG['pMain_sendmail'] = 'Send en email til en eksisterende postboks.';
$PALANG['pMain_password'] = 'Ændre adgangskoden til din administratorkonto.';
$PALANG['pMain_viewlog'] = 'Vis logfiler.';
@ -83,6 +86,7 @@ $PALANG['pOverview_welcome'] = 'Oversigt for ';
$PALANG['pOverview_alias_domain_aliases'] = 'Alias domæner';
$PALANG['pOverview_alias_address'] = 'Alias';
$PALANG['active'] = 'Aktiv';
$PALANG['smtp_active'] = 'Smtp';
$PALANG['and_x_more'] = '[og %s til...]';
$PALANG['pOverview_mailbox_username'] = 'Emailadresse';
$PALANG['name'] = 'Navn';
@ -131,6 +135,7 @@ $PALANG['alias_updated'] = 'The alias %s has been updated!'; # XXX
$PALANG['pCreate_alias_catchall_text'] = 'For at tilføje et stjerne-alias, brug en "*" som alias. For domæne til domæne-videresending brug "*@domæne.tld" som modtager.'; # XXX check/beautify - was split in two lines before
$PALANG['mailbox_alias_cant_be_deleted'] = 'This alias belongs to a mailbox and can\'t be deleted!'; # XXX
$PALANG['protected_alias_cant_be_deleted'] = 'The alias %s is protected and can only be deleted by a superadmin'; # XXX
$PALANG['alias_points_to_itself'] = 'Alias may not point to itself'; # XXX
$PALANG['pEdit_alias_welcome'] = 'Rediger alias.'; # XXX Text change to: 'Edit forwarding settings'
$PALANG['pEdit_alias_help'] = 'En modtager pr. linje.'; # XXX # XXX Text change to: 'Accepts multiple targets, one entry per line.'
@ -166,6 +171,8 @@ $PALANG['pEdit_mailbox_password_text_error'] = 'Adgangskoderne er ikke ens!';
$PALANG['pEdit_mailbox_quota'] = 'Kvota';
$PALANG['pEdit_mailbox_quota_text'] = 'MB';
$PALANG['mb_max'] = 'MB (max: %s)'; # XXX
$PALANG['mb_max_unlimited'] = 'MB (max: unlimited)'; # XXX
$PALANG['mb_max_disabled'] = 'MB (max: disabled)'; # XXX
$PALANG['pEdit_mailbox_quota_text_error'] = 'Den ønskede kvota er for høj!';
$PALANG['pEdit_mailbox_domain_error'] = 'Dette domæne er ikke dit: ';
$PALANG['pEdit_mailbox_result_error'] = 'Kan ikke ændre adgangskoden!';
@ -205,6 +212,7 @@ $PALANG['reply_once_per_day'] = 'Reply once a day'; # XXX
$PALANG['reply_once_per_week'] = 'Reply once per week'; # XXX
$PALANG['pViewlog_welcome'] = 'Vis de sidste %s poster for ';
$PALANG['pViewlog_welcome_all'] = 'Vis de sidste %s poster ';
$PALANG['pViewlog_timestamp'] = 'Tidsstempel';
$PALANG['pViewlog_action'] = 'Handling';
$PALANG['pViewlog_data'] = 'Data';
@ -245,6 +253,32 @@ $PALANG['pSendmail_body'] = 'Meddelelse';
$PALANG['pSendmail_button'] = 'Send email';
$PALANG['pSendmail_result_error'] = 'Kan ikke sende email! (%s)'; # XXX text change - new: Unable to send email to %s!
$PALANG['pSendmail_result_success'] = 'Email sendt! (%s)'; # XXX text change - new: Email sent to %s.
$PALANG['pDkim_new_key'] = 'Add Domain Key'; # XXX
$PALANG['pDkim_new_sign'] = 'Add Sign Table Entry'; # XXX
$PALANG['pDkim_edit_key'] = 'Edit Domain Key'; # XXX
$PALANG['pDkim_edit_sign'] = 'Edit Sign Table Entry'; # XXX
$PALANG['pDkim_field_selector'] = 'Selector'; # XXX
$PALANG['pDkim_field_pkey'] = 'Private Key'; # XXX
$PALANG['pDkim_field_pub'] = 'Public Key'; # XXX
$PALANG['pDkim_field_author'] = 'Author'; # XXX
$PALANG['pDkim_field_dkim_id'] = 'Domain Key'; # XXX
$PALANG['pDkim_field_selector_desc'] = 'Defines the name of the selector to be used when signing messages'; # XXX
$PALANG['pDkim_field_domain_desc'] = 'Defines the domain which will use this key for signing'; # XXX
$PALANG['pDkim_field_pkey_desc'] = 'PEM-formatted private key to be used for signing all messages'; # XXX
$PALANG['pDkim_field_pub_desc'] = 'PEM-formatted public key'; # XXX
$PALANG['pDkim_field_author_desc'] = 'Author that will use this key for signing. Can be either mailbox or domain, with mailbox taking precedence.'; # XXX
$PALANG['pDkim_field_dkim_id_desc'] = 'Domain Key that this author will use'; # XXX
$PALANG['dkim_already_exists'] = 'This Domain Key has already been added!'; # XXX
$PALANG['dkim_does_not_exist'] = 'This Domain Key does not exist!'; # XXX
$PALANG['dkim_signing_already_exists'] = 'This Domain Signing Entry already exsits!'; # XXX
$PALANG['dkim_signing_does_not_exist'] = 'This Domain Signing Entry does not exist!'; # XXX
$PALANG['pViewlog_action_create_dkim_entry'] = 'create domain key entry'; # XXX
$PALANG['pViewlog_action_edit_dkim_entry'] = 'edit domain key entry'; # XXX
$PALANG['pViewlog_action_delete_dkim_entry'] = 'delete domain key entry'; # XXX
$PALANG['pViewlog_action_create_dkim_signing_entry'] = 'create domain signing entry'; # XXX
$PALANG['pViewlog_action_edit_dkim_signing_entry'] = 'edit domain signing entry'; # XXX
$PALANG['pViewlog_action_delete_dkim_signing_entry'] = 'delete domain signing entry'; # XXX
$PALANG['pMain_dkim'] = 'Add a Domain Key for use with OpenDKIM.'; # XXX
$PALANG['pAdminMenu_list_admin'] = 'Administratorliste';
$PALANG['pAdminMenu_list_domain'] = 'Domæne-liste';
@ -275,10 +309,12 @@ $PALANG['domain_updated'] = 'The domain %s has been updated.'; # XXX
$PALANG['pAdminDelete_admin_error'] = 'Administratoren kunne ikke slettes.';
$PALANG['domain_postdel_failed'] = 'Domænet kunne ikke slettes!'; # XXX Text changed to: The domain postdeletion script failed, check the error log for details!
$PALANG['domain_postedit_failed'] = 'The domain postedit script failed, check the error log for details!'; # XXX
$PALANG['domain_postcreate_failed'] = 'The domain postcreate script failed, check the error log for details!'; # XXX
$PALANG['mailbox_postdel_failed'] = 'The mailbox postdeletion script failed, check the error log for details!'; # XXX
$PALANG['mailbox_postedit_failed'] = 'The mailbox postedit script failed, check the error log for details!'; # XXX
$PALANG['mailbox_postcreate_failed'] = 'The mailbox postcreate script failed, check the error log for details!'; # XXX
$PALANG['mailbox_postpassword_failed'] = 'The mailbox postpassword script failed, check the error log for details!'; # XXX
$PALANG['pAdminDelete_alias_domain_error'] = 'Domæne-aliaset kunne ikke slettes!';
$PALANG['domain_conflict_vacation_domain'] = 'You can\'t use the vacation domain as mail domain!'; # XXX
@ -359,6 +395,7 @@ $PALANG['pStatus_popimap'] = 'POP/IMAP ';
$PALANG['password_too_short'] = "Adgangskoden er for kort. Der kræves mindst %s tegn";
$PALANG['password_no_characters'] = "Your password must contain at least %s letters (A-Z, a-z)."; # XXX
$PALANG['password_no_digits'] = "Your password must contain at least %s digit(s)."; # XXX
$PALANG['password_no_special'] = "Your password must contain at least %s special character(s)."; # XXX
$PALANG['pInvalidDomainRegex'] = "Ugyldigt domæne-navn %s. Fejlede regulært udtryks-tjek";
$PALANG['pInvalidDomainDNS'] = "Ugyldigt domæne %s, og/eller ikke fundet i DNS";
$PALANG['pInvalidMailRegex'] = "Ugyldig emailadresse %s. Fejlede regulært udtryks-tjek"; # XXX %s added, check if text is ok
@ -415,7 +452,66 @@ $PALANG['dateformat_pgsql'] = 'YYYY-mm-dd'; # translators: rearrange to your loc
$PALANG['dateformat_mysql'] = '%Y-%m-%d'; # translators: rearrange to your local date format, but make sure it's a valid MySQL date format # XXX
$PALANG['password_expiration'] = 'Pass expires'; # XXX
$PALANG['password_expiration_desc'] = 'Date when password will expire'; # XXX
$PALANG['To_Mailbox'] = 'Mailbox'; # XXX # XXX
$PALANG['To_Forward_Only'] = 'Forward Only'; # XXX # XXX
$PALANG['pLegal_char_warning'] = 'Ulovlig figur';
$PALANG['copy'] = 'Kopiere Kopier';
$PALANG['generate'] = 'Generer Generer';
$PALANG['pMenu_security'] = 'Sikkerhed for sikkerhed';
$PALANG['pMenu_totp'] = 'TOTP';
$PALANG['pMenu_totp_exceptions'] = 'Undtagelser';
$PALANG['pMenu_app_passwords'] = 'Ansøgningsadgangskoder';
$PALANG['pUsersMain_totp_exceptions'] = 'Tillad betroede IP-adresser til at få adgang til din postkasse uden TOTP';
$PALANG['pUsersMenu_totp'] = 'Ændre TOTP';
$PALANG['pTOTP_welcome'] = 'Opsætning af din Time-baseret engangsadgangskode';
$PALANG['pUsersMain_totp'] = 'Opsætning af din Time-baseret engangsadgangskode';
$PALANG['pTOTP_secret'] = 'TOTP hemmelighed';
$PALANG['pTOTP_code'] = 'TOTP kode';
$PALANG['pTOTP_secret_result_error'] = 'Kan ikke ændre TOTP hemmelighed';
$PALANG['change_TOTP'] = 'Ændre indstillingerne for TOTP';
$PALANG['pTOTP_code_mismatch'] = 'Forkert et-time-password indtastet';
$PALANG['pTOTP_qr'] = 'Log ind';
$PALANG['pTOTP_confirm'] = 'Bekræft venligst dit login ved at give din nuværende TOTP-kode';
$PALANG['pTotp_failed'] = 'Din indtastede kode er ikke gyldig. Brug venligst en aktuel kode.';
$PALANG['pTotp_stored'] = 'Du har bekræftet din nye TOTP hemmelighed.';
$PALANG['pTotp_exceptions_welcome'] = 'Tilføj TOPT-exempt adresse';
$PALANG['pTotp_exceptions_user'] = 'Brugernavn (eller domæne for administratorer)';
$PALANG['pTotp_exceptions_add'] = 'Tilføj undtagelse';
$PALANG['pTotp_exceptions_address'] = 'IP-adresse';
$PALANG['pTotp_exceptions_description'] = 'Beskrivelse Beskrivelse Beskrivelse Beskrivelse';
$PALANG['pTotp_exceptions_list'] = 'Eksisterende undtagelser';
$PALANG['pTotp_exceptions_revoke'] = 'Revoke';
$PALANG['pTotp_exceptions_revoked'] = 'Undtagelse ophævet';
$PALANG['pTotp_exception_result_success'] = 'Undtagelse tilføjet';
$PALANG['pTotp_exception_result_error'] = 'Kan ikke tilføje undtagelse';
$PALANG['pEdit_totp_exception_result_error'] = 'Kan ikke ændre TOTP undtagelser';
$PALANG['pException_ip_empty_error'] = 'IP kan ikke være tomt';
$PALANG['pException_desc_empty_error'] = 'Beskrivelse kan ikke være tomt';
$PALANG['pException_user_entire_domain_error'] = 'Kun administratorer kan tilføje undtagelser for et helt domæne.';
$PALANG['pException_user_global_error'] = 'Kun superadmins kan tilføje globale undtagelser';
$PALANG['pUsersMain_app_passwords'] = 'Opsætning af hemmelige app-adgangskoder med reducerede privilegier';
$PALANG['pApp_passwords_list'] = 'Eksisterende applikationsadgangskoder';
$PALANG['pApp_password_revoked'] = 'Undtagelse ophævet';
$PALANG['pApp_passwords_welcome'] = 'Tilføj adgangskode';
$PALANG['pAppPassAdd_result_success'] = 'Tilføjet en adgangskode';
$PALANG['pAppPassAdd_pass_empty_error'] = 'Adgangskode kan ikke være tomt';
$PALANG['pAppPassAdd_result_error'] = 'Kan ikke tilføje ansøgningsadgangskode';
$PALANG['MFA_submit'] = 'Bekræft login';
$PALANG['pViewlog_action_add_totp_exception'] = 'Tilføj TOTP undtagelse';
$PALANG['pViewlog_action_delete_totp_exception'] = 'Slette TOTP undtagelse';
$PALANG['pViewlog_action_add_app_password'] = 'Tilføj adgangskode';
$PALANG['mailbox_postapppassword_failed'] = 'postkassen postapppassword script mislykkedes, kontrollere fejlen log for detaljer!';
$PALANG['mailbox_post_totp_exception_delete_failed'] = 'postkassen post totp undtagelse slette script mislykkedes, kontrollere fejlen log for detaljer!';
$PALANG['mailbox_post_totp_exception_add_failed'] = 'postkassen post totp undtagelse tilføjer script mislykkedes, kontrollere fejlen log for detaljer!';
$PALANG['mailbox_post_TOTP_change_failed'] = 'postkassen post totp hemmeligt ændring script mislykkedes, kontrollere fejlen log for detaljer!';
$PALANG['TOTP_already_configured'] = 'TOTP er allerede konfigureret til denne konto, ønsker du at ændre din hemmelighed?';
$PALANG['pApp_passwords_add'] = 'Tilføj adgangskode';
$PALANG['please_keep_this_as_last_entry'] = ''; # needed for language-check.sh
/* vim: set expandtab ft=php softtabstop=3 tabstop=3 shiftwidth=3: */
?>

View File

@ -18,6 +18,7 @@ $PALANG['confirm_delete_admin'] = 'Wollen Sie wirklich den Admin %s löschen?';
$PALANG['confirm_delete_alias'] = 'Wollen Sie wirklich den Alias %s löschen?';
$PALANG['confirm_delete_aliasdomain'] = 'Wollen Sie wirklich die Admin-Domain %s löschen?';
$PALANG['confirm_delete_domain'] = 'Wollen Sie wirklich alle Einträge der Domain %s löschen? Dies kann NICHT rückgängig gemacht werden!';
$PALANG['confirm_delete_dkim'] = 'Do you really want to delete the domain key entry %s?'; # XXX
$PALANG['confirm_delete_fetchmail'] = 'Wollen Sie wirklich den Fetchmail-Job %s löschen?';
$PALANG['confirm_delete_mailbox'] = 'Wollen Sie wirklich die Mailbox %s löschen?';
$PALANG['confirm_delete_vacation'] = 'Wollen Sie wirklich die Abwesenheitsnachricht für %s löschen?';
@ -54,14 +55,16 @@ $PALANG['add_alias_domain'] = 'Alias-Domain hinzufügen';
$PALANG['add_mailbox'] = 'Mailbox hinzufügen';
$PALANG['pMenu_fetchmail'] = 'E-Mail Abruf';
$PALANG['pMenu_sendmail'] = 'Email versenden';
$PALANG['pMenu_dkim'] = 'Domain Keys'; # XXX
$PALANG['pMenu_dkim_signing'] = 'Signing Table'; # XXX
$PALANG['pMenu_password'] = 'Passwort ändern';
$PALANG['pMenu_viewlog'] = 'Log ansehen';
$PALANG['pMenu_logout'] = 'Logout';
$PALANG['pMain_welcome'] = 'Willkommen zu Postfix Admin!';
$PALANG['pMain_overview'] = 'Listet Ihre Aliase und Mailboxen auf. Sie können sie hier bearbeiten und löschen.';
$PALANG['pMain_create_alias'] = 'Neuen Alias für Ihre Domain anlegen';
$PALANG['pMain_create_mailbox'] = 'Legt eine neue Mailbox für Ihre Domain an.';
$PALANG['pMain_overview'] = 'Listet Ihre Domains auf. Sie können sie hier bearbeiten und löschen.';
$PALANG['pMain_create_alias'] = 'Neue Weiterleitung für Ihre Domain anlegen';
$PALANG['pMain_create_mailbox'] = 'Neue Mailbox für Ihre Domain anlegen.';
$PALANG['pMain_sendmail'] = 'Versenden Sie eine Email.';
$PALANG['pMain_password'] = 'Ändern Sie Ihr Admin-Passwort.';
$PALANG['pMain_viewlog'] = 'Lassen Sie sich das Log anzeigen.';
@ -81,6 +84,7 @@ $PALANG['pOverview_welcome'] = 'Überblick über ';
$PALANG['pOverview_alias_domain_aliases'] = 'Alias-Domains';
$PALANG['pOverview_alias_address'] = 'Von';
$PALANG['active'] = 'Aktiv';
$PALANG['smtp_active'] = 'Smtp';
$PALANG['and_x_more'] = '[und %s weitere...]';
$PALANG['pOverview_mailbox_username'] = 'Email';
$PALANG['name'] = 'Name';
@ -128,6 +132,7 @@ $PALANG['alias_updated'] = 'Der Alias %s wurde geändert.';
$PALANG['pCreate_alias_catchall_text'] = 'Um alle Adressen abzudecken benutzen Sie einen "*" als Alias. Um ganze Domains an andere Domains weiterzuleiten benutzen Sie "*@domain.tld" im "An"-Feld.';
$PALANG['mailbox_alias_cant_be_deleted'] = 'Dieser Alias gehört zu einer Mailbox und kann nicht gelöscht werden!';
$PALANG['protected_alias_cant_be_deleted'] = 'Der Alias %s ist geschützt und kann nur von einem Superadmin gelöscht werden.';
$PALANG['alias_points_to_itself'] = 'Der Alias zeigt auf sich selbst';
$PALANG['pEdit_alias_welcome'] = 'Weiterleitungs-Einstellungen ändern';
$PALANG['pEdit_alias_help'] = 'Angabe mehrerer Ziele möglich, ein Eintrag pro Zeile.';
@ -141,7 +146,7 @@ $PALANG['pEdit_alias_forward_only'] = 'Nur zur angegebenen Adresse weiterleiten.
$PALANG['pEdit_alias_result_error'] = 'Ändern des Aliases %s ist fehlgeschlagen!';
$PALANG['pCreate_mailbox_welcome'] = 'Legen Sie eine neue Mailbox für Ihre Domain an.';
$PALANG['pCreate_mailbox_local_part_error'] = 'Should be the bit before the @ sign.'; # XXX
$PALANG['pCreate_mailbox_local_part_error'] = 'Sollte der Teil vor dem @ Zeichen sein.';
$PALANG['pCreate_mailbox_username_text_error1'] = 'Die EMAIL ist nicht korrekt!';
$PALANG['pCreate_mailbox_username_text_error3'] = 'Sie dürfen leider nicht mehr Mailboxen für diese Domain anlegen!';
$PALANG['pCreate_mailbox_password_text'] = 'Passwort für POP3/IMAP';
@ -163,6 +168,8 @@ $PALANG['pEdit_mailbox_password_text_error'] = 'Die beiden Passwörter sind nich
$PALANG['pEdit_mailbox_quota'] = 'Quota';
$PALANG['pEdit_mailbox_quota_text'] = 'MB';
$PALANG['mb_max'] = 'MB (max: %s)';
$PALANG['mb_max_unlimited'] = 'MB (max: unbegrenzt)';
$PALANG['mb_max_disabled'] = 'MB (max: deaktiviert)';
$PALANG['pEdit_mailbox_quota_text_error'] = 'Das angegebene Quota ist zu hoch!';
$PALANG['pEdit_mailbox_domain_error'] = 'Diese Domain gehört nicht Ihnen: ';
$PALANG['pEdit_mailbox_result_error'] = 'Mailbox kann nicht geändert werden!';
@ -202,6 +209,7 @@ $PALANG['reply_once_per_day'] = 'Einmal pro Tag antworten';
$PALANG['reply_once_per_week'] = 'Einmal pro Woche antworten';
$PALANG['pViewlog_welcome'] = 'Zeigt die letzten %s Aktionen für ';
$PALANG['pViewlog_welcome_all'] = 'Zeigt die letzten %s Aktionen ';
$PALANG['pViewlog_timestamp'] = 'Zeitpunkt';
$PALANG['pViewlog_action'] = 'Aktion';
$PALANG['pViewlog_data'] = 'Daten';
@ -242,6 +250,32 @@ $PALANG['pSendmail_body'] = 'Text';
$PALANG['pSendmail_button'] = 'Nachricht versenden';
$PALANG['pSendmail_result_error'] = 'Mail konnte nicht an %s gesendet werden!';
$PALANG['pSendmail_result_success'] = 'Mail an %s gesendet.';
$PALANG['pDkim_new_key'] = 'Add Domain Key'; # XXX
$PALANG['pDkim_new_sign'] = 'Add Sign Table Entry'; # XXX
$PALANG['pDkim_edit_key'] = 'Edit Domain Key'; # XXX
$PALANG['pDkim_edit_sign'] = 'Edit Sign Table Entry'; # XXX
$PALANG['pDkim_field_selector'] = 'Selector'; # XXX
$PALANG['pDkim_field_pkey'] = 'Private Key'; # XXX
$PALANG['pDkim_field_pub'] = 'Public Key'; # XXX
$PALANG['pDkim_field_author'] = 'Author'; # XXX
$PALANG['pDkim_field_dkim_id'] = 'Domain Key'; # XXX
$PALANG['pDkim_field_selector_desc'] = 'Defines the name of the selector to be used when signing messages'; # XXX
$PALANG['pDkim_field_domain_desc'] = 'Defines the domain which will use this key for signing'; # XXX
$PALANG['pDkim_field_pkey_desc'] = 'PEM-formatted private key to be used for signing all messages'; # XXX
$PALANG['pDkim_field_pub_desc'] = 'PEM-formatted public key'; # XXX
$PALANG['pDkim_field_author_desc'] = 'Author that will use this key for signing. Can be either mailbox or domain, with mailbox taking precedence.'; # XXX
$PALANG['pDkim_field_dkim_id_desc'] = 'Domain Key that this author will use'; # XXX
$PALANG['dkim_already_exists'] = 'This Domain Key has already been added!'; # XXX
$PALANG['dkim_does_not_exist'] = 'This Domain Key does not exist!'; # XXX
$PALANG['dkim_signing_already_exists'] = 'This Domain Signing Entry already exsits!'; # XXX
$PALANG['dkim_signing_does_not_exist'] = 'This Domain Signing Entry does not exist!'; # XXX
$PALANG['pViewlog_action_create_dkim_entry'] = 'create domain key entry'; # XXX
$PALANG['pViewlog_action_edit_dkim_entry'] = 'edit domain key entry'; # XXX
$PALANG['pViewlog_action_delete_dkim_entry'] = 'delete domain key entry'; # XXX
$PALANG['pViewlog_action_create_dkim_signing_entry'] = 'create domain signing entry'; # XXX
$PALANG['pViewlog_action_edit_dkim_signing_entry'] = 'edit domain signing entry'; # XXX
$PALANG['pViewlog_action_delete_dkim_signing_entry'] = 'delete domain signing entry'; # XXX
$PALANG['pMain_dkim'] = 'Add a Domain Key for use with OpenDKIM.'; # XXX
$PALANG['pAdminMenu_list_admin'] = 'Admin Liste';
$PALANG['pAdminMenu_list_domain'] = 'Domain Liste';
@ -271,11 +305,13 @@ $PALANG['pAdminCreate_domain_result_success'] = 'Die Domain %s wurde angelegt.';
$PALANG['domain_updated'] = 'Die Domain %s wurde geändert.';
$PALANG['pAdminDelete_admin_error'] = 'Admin kann nicht gelöscht werden!';
$PALANG['domain_postdel_failed'] = 'Fehler beim Ausführen des domain postdeletion-Scripts, überprüfen Sie das Error-Log für Details!';
$PALANG['domain_postcreate_failed'] = 'Fehler beim Ausführen des domain postcreation-Scripts, überprüfen Sie das Error-Log für Details!';
$PALANG['mailbox_postdel_failed'] = 'Fehler beim Ausführen des mailbox postdeletion-Scripts, überprüfen Sie das Error-Log für Details!';
$PALANG['mailbox_postedit_failed'] = 'Fehler beim Ausführen des mailbox postedit-Scripts, überprüfen Sie das Error-Log für Details!';
$PALANG['mailbox_postcreate_failed'] = 'Fehler beim Ausführen des mailbox postcreate-Scripts, überprüfen Sie das Error-Log für Details!';
$PALANG['domain_postdel_failed'] = 'Fehler beim Ausführen des domain postdeletion-Scripts. Für Details überprüfen Sie das Error-Log!';
$PALANG['domain_postedit_failed'] = 'Fehler beim Ausführen des domain postedit-Scripts. Für Details überprüfen Sie das Error-Log!';
$PALANG['domain_postcreate_failed'] = 'Fehler beim Ausführen des domain postcreation-Scripts. Für Details überprüfen Sie das Error-Log!';
$PALANG['mailbox_postdel_failed'] = 'Fehler beim Ausführen des mailbox postdeletion-Scripts. Für Details überprüfen Sie das Error-Log!';
$PALANG['mailbox_postedit_failed'] = 'Fehler beim Ausführen des mailbox postedit-Scripts. Für Details überprüfen Sie das Error-Log!';
$PALANG['mailbox_postcreate_failed'] = 'Fehler beim Ausführen des mailbox postcreate-Scripts. Für Details überprüfen Sie das Error-Log!';
$PALANG['mailbox_postpassword_failed'] = 'Fehler beim Ausführen des mailbox postpassword-Scripts. Für Details überprüfen Sie das Error-Log!';
$PALANG['pAdminDelete_alias_domain_error'] = 'Alias-Domain konnte nicht gelöscht werden!';
$PALANG['domain_conflict_vacation_domain'] = 'Sie können die Vacation-Domain nicht als Maildomain benutzen!';
@ -324,7 +360,7 @@ $PALANG['pUsersVacation_welcome_text'] = 'Automatische Antwort für %s ist aktiv
$PALANG['pUsersVacation_subject_text'] = 'Ich bin weg...';
$PALANG['message'] = 'Nachricht';
$PALANG['pUsersVacation_body_text'] = <<<EOM
Ich bin vom <date> bis <date> nicht zu Hause / im Büro.
Ich bin vom <%From_Date> bis <%Until_Date> nicht zu Hause / im Büro.
In dringenden Fällen setzen Sie sich bitte mit <contact person> in Verbindung.
Vielen Dank für Ihr Verständnis.
EOM;
@ -357,6 +393,7 @@ $PALANG['pStatus_popimap'] = 'POP/IMAP ';
$PALANG['password_too_short'] = "Das Passwort ist zu kurz - mindestens %s Zeichen benötigt";
$PALANG['password_no_characters'] = "Ihr Passwort muss mindestens %s Buchstaben (A-Z, a-z) enthalten.";
$PALANG['password_no_digits'] = "Ihr Passwort muss mindestens %s Ziffer(n) enthalten.";
$PALANG['password_no_special'] = "Ihr Passwort muss mindestens %s Sonderzeichen enthalten.";
$PALANG['pInvalidDomainRegex'] = "Ungültiger Domainname %s - Überprüfung per RegEx fehlgeschlagen";
$PALANG['pInvalidDomainDNS'] = "Ungültige Domain %s - nicht per DNS auflösbar";
$PALANG['pInvalidMailRegex'] = "Ungültige Mailadresse %s - Überprüfung per RegEx fehlgeschlagen";
@ -412,7 +449,64 @@ $PALANG['pFetchmail_desc_returned_text'] = 'Textausgabe des letzten Mailabruf
$PALANG['dateformat_pgsql'] = 'dd.mm.YYYY'; # translators: rearrange to your local date format, but make sure it's a valid PostgreSQL date format
$PALANG['dateformat_mysql'] = '%d.%m.%Y'; # translators: rearrange to your local date format, but make sure it's a valid MySQL date format
$PALANG['password_expiration'] = 'Password läuft ab';
$PALANG['password_expiration_desc'] = 'Date when password will expire'; # XXX
$PALANG['password_expiration_desc'] = 'Datum, an dem das Passwort abläuft';
$PALANG['To_Mailbox'] = 'Mailbox'; # XXX # XXX
$PALANG['To_Forward_Only'] = 'Forward Only'; # XXX # XXX
$PALANG['pLegal_char_warning'] = 'Illegaler Charakter';
$PALANG['copy'] = 'Kopie';
$PALANG['generate'] = 'Generieren';
$PALANG['pMenu_security'] = 'Sicherheit';
$PALANG['pMenu_totp'] = 'TOTP';
$PALANG['pMenu_totp_exceptions'] = 'TOTP Ausnahmen';
$PALANG['pMenu_app_passwords'] = 'Anwendungspasswörter';
$PALANG['pUsersMain_totp_exceptions'] = 'Erlauben Sie vertrauenswürdige IP-Adressen ohne TOTP auf Ihr Postfach zugreifen';
$PALANG['pUsersMenu_totp'] = 'Änderung von TOTP';
$PALANG['pTOTP_welcome'] = 'Richten Sie Ihr zeitbasiertes Einmal-Passwort ein';
$PALANG['pUsersMain_totp'] = 'Richten Sie Ihr zeitbasiertes Einmal-Passwort ein';
$PALANG['pTOTP_secret'] = 'TOTP Geheimnis';
$PALANG['pTOTP_code'] = 'TOTP-Code';
$PALANG['pTOTP_secret_result_error'] = 'konnte nicht ändern TOTP Geheimnis';
$PALANG['change_TOTP'] = 'TOTP-Einstellungen ändern';
$PALANG['pTOTP_code_mismatch'] = 'Falsches Ein-Zeit-Passwort eingegeben';
$PALANG['pTOTP_qr'] = 'TOTP QR-Code';
$PALANG['pTOTP_confirm'] = 'Bitte bestätigen Sie Ihre Anmeldung durch die Bereitstellung Ihres aktuellen TOTP-Codes';
$PALANG['pTotp_failed'] = 'Ihr eingegebener Code ist nicht gültig. Bitte benutzen Sie einen aktuellen Code.';
$PALANG['pTotp_stored'] = 'Sie haben Ihr neues TOTP-Geheimnis erfolgreich bestätigt.';
$PALANG['pTotp_exceptions_welcome'] = 'TOPT-exempt Adresse hinzufügen';
$PALANG['pTotp_exceptions_user'] = 'Benutzername (oder Domain für Administratoren)';
$PALANG['pTotp_exceptions_add'] = 'Ausnahme';
$PALANG['pTotp_exceptions_address'] = 'IP-Adresse';
$PALANG['pTotp_exceptions_description'] = 'Warenbezeichnung';
$PALANG['pTotp_exceptions_list'] = 'Vorhandene Ausnahmen';
$PALANG['pTotp_exceptions_revoke'] = 'Einnahmen';
$PALANG['pTotp_exceptions_revoked'] = 'Ausnahme widerrufen';
$PALANG['pTotp_exception_result_success'] = 'Ausnahme hinzugefügt';
$PALANG['pTotp_exception_result_error'] = 'Kann keine Ausnahme hinzufügen';
$PALANG['pEdit_totp_exception_result_error'] = 'Nicht zu ändern TOTP Ausnahmen';
$PALANG['pException_ip_empty_error'] = 'IP kann nicht leer sein';
$PALANG['pException_desc_empty_error'] = 'Beschreibung kann nicht leer sein';
$PALANG['pException_user_entire_domain_error'] = 'Nur Admins können Ausnahmen für eine ganze Domain hinzufügen.';
$PALANG['pException_user_global_error'] = 'Nur Superadmins können globale Ausnahmen hinzufügen';
$PALANG['pUsersMain_app_passwords'] = 'Setup abnehmbare App-Passwörter mit reduzierten Privilegien';
$PALANG['pApp_passwords_list'] = 'Vorhandene Anwendungspasswörter';
$PALANG['pApp_password_revoked'] = 'Ausnahme widerrufen';
$PALANG['pApp_passwords_welcome'] = 'Anwendungskennwort hinzufügen';
$PALANG['pAppPassAdd_result_success'] = 'Ein Anwendungs-Passwort hinzugefügt';
$PALANG['pAppPassAdd_pass_empty_error'] = 'Passwort kann nicht leer sein';
$PALANG['pAppPassAdd_result_error'] = 'Das Anwendungskennwort nicht hinzufügen';
$PALANG['MFA_submit'] = 'Anmeldung bestätigen';
$PALANG['pViewlog_action_add_totp_exception'] = 'TOTP Ausnahme';
$PALANG['pViewlog_action_delete_totp_exception'] = 'TOTP Ausnahme löschen';
$PALANG['pViewlog_action_add_app_password'] = 'Anwendungskennwort hinzufügen';
$PALANG['mailbox_postapppassword_failed'] = 'Das Postbox Postapppassword-Skript fehlgeschlagen, überprüfen Sie das Fehlerprotokoll für Details!';
$PALANG['mailbox_post_totp_exception_delete_failed'] = 'Die Mailbox Post totp Ausnahme löschen Skript fehlgeschlagen, überprüfen Sie das Fehlerprotokoll für Details!';
$PALANG['mailbox_post_totp_exception_add_failed'] = 'Die Postbox Post totp Ausnahme hinzufügen Skript fehlgeschlagen, überprüfen Sie das Fehlerprotokoll für Details!';
$PALANG['mailbox_post_TOTP_change_failed'] = 'Das Mailbox Post totp Secret Change Skript ist fehlgeschlagen, überprüfen Sie das Fehlerprotokoll für Details!';
$PALANG['TOTP_already_configured'] = 'TOTP ist bereits für dieses Konto konfiguriert, möchten Sie Ihr Geheimnis ändern?';
$PALANG['pApp_passwords_add'] = 'Anwendungsspezifisches Passwort hinzufügen';
$PALANG['please_keep_this_as_last_entry'] = ''; # needed for language-check.sh
/* vim: set expandtab ft=php softtabstop=3 tabstop=3 shiftwidth=3: */

View File

@ -18,6 +18,7 @@ $PALANG['confirm_delete_admin'] = 'Do you really want to delete the admin %s?';
$PALANG['confirm_delete_alias'] = 'Do you really want to delete the alias %s?';
$PALANG['confirm_delete_aliasdomain'] = 'Do you really want to delete the alias domain %s?';
$PALANG['confirm_delete_domain'] = 'Do you really want to delete all records for the domain %s? This can not be undone!';
$PALANG['confirm_delete_dkim'] = 'Do you really want to delete the domain key entry %s?';
$PALANG['confirm_delete_fetchmail'] = 'Do you really want to delete the fetchmail job %s?';
$PALANG['confirm_delete_mailbox'] = 'Do you really want to delete the mailbox %s?';
$PALANG['confirm_delete_vacation'] = 'Do you really want to delete the vacation message for %s?';
@ -36,6 +37,8 @@ $PALANG['must_be_boolean'] = '%s must be boolean';
$PALANG['invalid_value_given'] = 'Invalid value given for %s';
$PALANG['edit_not_allowed'] = 'You are not allowed to edit %s';
$PALANG['searchparams'] = 'Search parameters:';
$PALANG['copy'] = 'Copy';
$PALANG['generate'] = 'Generate';
$PALANG['pFooter_logged_as'] = 'Logged in as %s';
@ -49,19 +52,25 @@ $PALANG['pLogin_login_users'] = 'Users click here to login to the user section.'
$PALANG['pMenu_main'] = 'Main';
$PALANG['pMenu_overview'] = 'Overview';
$PALANG['add_alias'] = 'Add Alias';
$PALANG['add_alias'] = 'Add Forward';
$PALANG['add_alias_domain'] = 'Add Alias Domain';
$PALANG['add_mailbox'] = 'Add Mailbox';
$PALANG['pMenu_fetchmail'] = 'Fetch Email';
$PALANG['pMenu_sendmail'] = 'Send Email';
$PALANG['pMenu_dkim'] = 'Domain Keys';
$PALANG['pMenu_dkim_signing'] = 'Signing Table';
$PALANG['pMenu_security'] = 'Security';
$PALANG['pMenu_password'] = 'Password';
$PALANG['pMenu_totp'] = 'TOTP';
$PALANG['pMenu_totp_exceptions'] = 'TOTP exceptions';
$PALANG['pMenu_app_passwords'] = 'Application passwords';
$PALANG['pMenu_viewlog'] = 'View Log';
$PALANG['pMenu_logout'] = 'Logout';
$PALANG['pMain_welcome'] = 'Welcome to Postfix Admin!';
$PALANG['pMain_overview'] = 'List your aliases and mailboxes. You can edit / delete them from here.';
$PALANG['pMain_create_alias'] = 'Create a new alias for your domain.';
$PALANG['pMain_create_mailbox'] = 'Create a new mailbox for your domain.';
$PALANG['pMain_overview'] = 'List your domains. You can edit / delete them from here.';
$PALANG['pMain_create_alias'] = 'Create a new email forward.';
$PALANG['pMain_create_mailbox'] = 'Create a new mailbox.';
$PALANG['pMain_sendmail'] = 'Send an email to one of your newly created mailboxes.';
$PALANG['pMain_password'] = 'Change the password for your admin account.';
$PALANG['pMain_viewlog'] = 'View the log files.';
@ -74,13 +83,14 @@ $PALANG['pOverview_up_arrow'] = 'Go Top';
$PALANG['pOverview_right_arrow'] = 'Next Page';
$PALANG['pOverview_left_arrow'] = 'Previous Page';
$PALANG['pOverview_alias_domain_title'] = ':: Domain Aliases';
$PALANG['pOverview_alias_title'] = ':: Aliases';
$PALANG['pOverview_alias_title'] = ':: Forwards ';
$PALANG['pOverview_mailbox_title'] = ':: Mailboxes';
$PALANG['go'] = 'Go';
$PALANG['pOverview_welcome'] = 'Overview for ';
$PALANG['pOverview_alias_domain_aliases'] = 'Alias Domains';
$PALANG['pOverview_alias_address'] = 'From';
$PALANG['active'] = 'Active';
$PALANG['smtp_active'] = 'Smtp';
$PALANG['and_x_more'] = '[and %s more...]';
$PALANG['pOverview_mailbox_username'] = 'Email';
$PALANG['name'] = 'Name';
@ -129,10 +139,11 @@ $PALANG['alias_updated'] = 'The alias %s has been updated!';
$PALANG['pCreate_alias_catchall_text'] = 'To create a catch-all use an "*" as alias.'; # XXX don't propagate usage of *@target-domain.com for domain-aliasing any longer
$PALANG['mailbox_alias_cant_be_deleted'] = 'This alias belongs to a mailbox and can\'t be deleted!';
$PALANG['protected_alias_cant_be_deleted'] = 'The alias %s is protected and can only be deleted by a superadmin';
$PALANG['alias_points_to_itself'] = 'Forward may not point to itself';
$PALANG['pEdit_alias_welcome'] = 'Edit forwarding settings';
$PALANG['pEdit_alias_help'] = 'Accepts multiple targets, one entry per line.';
$PALANG['alias'] = 'Alias';
$PALANG['alias'] = 'Forward';
$PALANG['to'] = 'To';
$PALANG['pEdit_alias_goto_text_error1'] = 'You didn\'t enter anything at To';
$PALANG['pEdit_alias_goto_text_error2'] = 'The email address that you have entered is not valid: ';
@ -164,10 +175,52 @@ $PALANG['pEdit_mailbox_password_text_error'] = 'The passwords that you supplied
$PALANG['pEdit_mailbox_quota'] = 'Quota';
$PALANG['pEdit_mailbox_quota_text'] = 'MB';
$PALANG['mb_max'] = 'MB (max: %s)';
$PALANG['mb_max_unlimited'] = 'MB (max: unlimited)';
$PALANG['mb_max_disabled'] = 'MB (max: disabled)';
$PALANG['pEdit_mailbox_quota_text_error'] = 'The quota that you specified is too high!';
$PALANG['pEdit_mailbox_domain_error'] = 'This domain is not yours: ';
$PALANG['pEdit_mailbox_result_error'] = 'Unable to modify the mailbox!';
$PALANG['pUsersMain_totp_exceptions'] = 'Allow trusted IP-addresses to access your mailbox without TOTP';
$PALANG['pUsersMenu_totp'] = 'Change TOTP';
$PALANG['pTOTP_welcome'] = 'Setup your Time-based One-time Password';
$PALANG['pUsersMain_totp'] = 'Setup your Time-based One-time Password';
$PALANG['pTOTP_secret'] = 'TOTP secret';
$PALANG['pTOTP_code'] = 'TOTP code (empty to disable)';
$PALANG['pTOTP_secret_result_error'] = 'Could not change TOTP secret';
$PALANG['change_TOTP'] = 'Change TOTP settings';
$PALANG['pTOTP_code_mismatch'] = 'Incorrect one-time-password entered';
$PALANG['pTOTP_qr'] = 'TOTP QR-code';
$PALANG['pTOTP_confirm'] = 'Please confirm your login by providing your current TOTP code';
$PALANG['pTotp_failed'] = 'Your entered code is not valid. Please use a current code.';
$PALANG['pTotp_stored'] = 'You successfully confirmed your new TOTP secret.';
$PALANG['pTotp_exceptions_welcome'] = 'Add TOPT-exempt address';
$PALANG['pTotp_exceptions_user'] = 'Username (or domain for admins)';
$PALANG['pTotp_exceptions_add'] = 'Add exception';
$PALANG['pTotp_exceptions_address'] = 'IP-Address';
$PALANG['pTotp_exceptions_description'] = 'Description';
$PALANG['pTotp_exceptions_list'] = 'Existing exceptions';
$PALANG['pTotp_exceptions_revoke'] = 'Revoke';
$PALANG['pTotp_exceptions_revoked'] = 'Exception revoked';
$PALANG['pTotp_exception_result_success'] = 'Exception added';
$PALANG['pTotp_exception_result_error'] = 'Could not add exception';
$PALANG['pEdit_totp_exception_result_error'] = 'Unable to modify TOTP exceptions';
$PALANG['pException_ip_empty_error'] = 'IP cannot be empty';
$PALANG['pException_desc_empty_error'] = 'Description cannot be empty';
$PALANG['pException_user_entire_domain_error'] = 'Only admins can add exceptions for an entire domain.';
$PALANG['pException_user_global_error'] = 'Only superadmins can add global exceptions';
$PALANG['pUsersMain_app_passwords'] = 'Setup revokable app passwords with reduced privileges';
$PALANG['pApp_passwords_list'] = 'Existing application passwords';
$PALANG['pApp_password_revoked'] = 'Exception revoked';
$PALANG['pApp_passwords_welcome'] = 'Add application password';
$PALANG['pMenu_app_passwords'] = 'Application passwords';
$PALANG['pAppPassAdd_result_success'] = 'Added an application password';
$PALANG['pAppPassAdd_pass_empty_error'] = 'Password cannot be empty';
$PALANG['pAppPassAdd_result_error'] = 'Could not add application password';
#$PALANG[''] = '';
$PALANG['MFA_submit'] = 'Confirm login';
$PALANG['pPassword_welcome'] = 'Change your login password.';
$PALANG['pPassword_admin'] = 'Login';
$PALANG['pPassword_password_current'] = 'Current Password';
@ -204,10 +257,13 @@ $PALANG['reply_once_per_day'] = 'Reply once a day';
$PALANG['reply_once_per_week'] = 'Reply once a week';
$PALANG['pViewlog_welcome'] = 'View the last %s actions for ';
$PALANG['pViewlog_welcome_all'] = 'View the last %s actions ';
$PALANG['pViewlog_timestamp'] = 'Timestamp';
$PALANG['pViewlog_action'] = 'Action';
$PALANG['pViewlog_data'] = 'Data';
$PALANG['pViewlog_action_add_totp_exception'] = 'Add TOTP exception';
$PALANG['pViewlog_action_delete_totp_exception'] = 'Delete TOTP exception';
$PALANG['pViewlog_action_create_domain'] = 'create domain';
$PALANG['pViewlog_action_delete_domain'] = 'delete domain';
$PALANG['pViewlog_action_edit_domain'] = 'edit domain';
@ -224,6 +280,7 @@ $PALANG['pViewlog_action_edit_alias'] = 'edit alias';
$PALANG['pViewlog_action_edit_alias_state'] = 'edit alias active';
$PALANG['pViewlog_action_edit_alias_domain_state'] = 'edit alias domain active';
$PALANG['pViewlog_action_edit_password'] = 'change password';
$PALANG['pViewlog_action_add_app_password'] = 'Add application password';
$PALANG['pViewlog_action_create_admin'] = 'create admin';
$PALANG['pViewlog_action_edit_admin'] = 'edit admin';
$PALANG['pViewlog_action_delete_admin'] = 'delete admin';
@ -245,6 +302,33 @@ $PALANG['pSendmail_button'] = 'Send Message';
$PALANG['pSendmail_result_error'] = 'Unable to send email to %s!';
$PALANG['pSendmail_result_success'] = 'Email sent to %s.';
$PALANG['pDkim_new_key'] = 'Add Domain Key';
$PALANG['pDkim_new_sign'] = 'Add Sign Table Entry';
$PALANG['pDkim_edit_key'] = 'Edit Domain Key';
$PALANG['pDkim_edit_sign'] = 'Edit Sign Table Entry';
$PALANG['pDkim_field_selector'] = 'Selector';
$PALANG['pDkim_field_pkey'] = 'Private Key';
$PALANG['pDkim_field_pub'] = 'Public Key';
$PALANG['pDkim_field_author'] = 'Author';
$PALANG['pDkim_field_dkim_id'] = 'Domain Key';
$PALANG['pDkim_field_selector_desc'] = 'Defines the name of the selector to be used when signing messages';
$PALANG['pDkim_field_domain_desc'] = 'Defines the domain which will use this key for signing';
$PALANG['pDkim_field_pkey_desc'] = 'PEM-formatted private key to be used for signing all messages';
$PALANG['pDkim_field_pub_desc'] = 'PEM-formatted public key';
$PALANG['pDkim_field_author_desc'] = 'Author that will use this key for signing. Can be either mailbox or domain, with mailbox taking precedence.';
$PALANG['pDkim_field_dkim_id_desc'] = 'Domain Key that this author will use';
$PALANG['dkim_already_exists'] = 'This Domain Key has already been added!';
$PALANG['dkim_does_not_exist'] = 'This Domain Key does not exist!';
$PALANG['dkim_signing_already_exists'] = 'This Domain Signing Entry already exsits!';
$PALANG['dkim_signing_does_not_exist'] = 'This Domain Signing Entry does not exist!';
$PALANG['pViewlog_action_create_dkim_entry'] = 'create domain key entry';
$PALANG['pViewlog_action_edit_dkim_entry'] = 'edit domain key entry';
$PALANG['pViewlog_action_delete_dkim_entry'] = 'delete domain key entry';
$PALANG['pViewlog_action_create_dkim_signing_entry'] = 'create domain signing entry';
$PALANG['pViewlog_action_edit_dkim_signing_entry'] = 'edit domain signing entry';
$PALANG['pViewlog_action_delete_dkim_signing_entry'] = 'delete domain signing entry';
$PALANG['pMain_dkim'] = 'Add a Domain Key for use with OpenDKIM.';
$PALANG['pAdminMenu_list_admin'] = 'Admin List';
$PALANG['pAdminMenu_list_domain'] = 'Domain List';
$PALANG['pAdminMenu_list_virtual'] = 'Virtual List';
@ -256,7 +340,7 @@ $PALANG['pAdminMenu_create_domain'] = 'New Domain';
$PALANG['pAdminList_admin_count'] = 'Domains';
$PALANG['description'] = 'Description';
$PALANG['aliases'] = 'Aliases';
$PALANG['aliases'] = 'Forwards';
$PALANG['pAdminList_domain_quota'] = 'Domain quota (MB)';
$PALANG['pAdminList_domain_backupmx'] = 'Backup MX';
$PALANG['last_modified'] = 'Last modified';
@ -274,10 +358,17 @@ $PALANG['domain_updated'] = 'The domain %s has been updated.';
$PALANG['pAdminDelete_admin_error'] = 'Unable to delete admin!';
$PALANG['domain_postdel_failed'] = 'The domain postdeletion script failed, check the error log for details!';
$PALANG['domain_postedit_failed'] = 'The domain postedit script failed, check the error log for details!';
$PALANG['domain_postcreate_failed'] = 'The domain postcreate script failed, check the error log for details!';
$PALANG['mailbox_postdel_failed'] = 'The mailbox postdeletion script failed, check the error log for details!';
$PALANG['mailbox_postedit_failed'] = 'The mailbox postedit script failed, check the error log for details!';
$PALANG['mailbox_postcreate_failed'] = 'The mailbox postcreate script failed, check the error log for details!';
$PALANG['mailbox_postpassword_failed'] = 'The mailbox postpassword script failed, check the error log for details!';
$PALANG['mailbox_postapppassword_failed'] = 'The mailbox postapppassword script failed, check the error log for details!';
$PALANG['mailbox_post_totp_exception_delete_failed'] = 'The mailbox post totp exception delete script failed, check the error log for details!';
$PALANG['mailbox_post_totp_exception_add_failed'] = 'The mailbox post totp exception add script failed, check the error log for details!';
$PALANG['mailbox_post_TOTP_change_failed'] = 'The mailbox post totp secret change script failed, check the error log for details!';
$PALANG['pAdminDelete_alias_domain_error'] = 'Unable to remove domain alias!';
$PALANG['domain_conflict_vacation_domain'] = 'You can\'t use the vacation domain as mail domain!';
@ -326,9 +417,10 @@ $PALANG['pUsersVacation_welcome_text'] = 'Auto response for %s is active!';
$PALANG['pUsersVacation_subject_text'] = 'Out of Office';
$PALANG['message'] = 'Message';
$PALANG['pUsersVacation_body_text'] = <<<EOM
I will be away from <date> until <date>.
I will be away from <%From_Date> until <%Until_Date>.
For urgent matters you can contact <contact person>.
EOM;
# *** for explanation about <%From_Date> en <%Until_Date> look at vaction.pl [ replace_string ] ***
$PALANG['pUsersVacation_activefrom'] = 'Active from';
$PALANG['pUsersVacation_activeuntil'] = 'Active until';
@ -359,6 +451,7 @@ $PALANG['pStatus_popimap'] = 'POP/IMAP ';
$PALANG['password_too_short'] = "Password is too short - requires %s characters";
$PALANG['password_no_characters'] = "Your password must contain at least %s letters (A-Z, a-z).";
$PALANG['password_no_digits'] = "Your password must contain at least %s digit(s).";
$PALANG['password_no_special'] = "Your password must contain at least %s special character(s).";
$PALANG['pInvalidDomainRegex'] = "Invalid domain name %s, fails regexp check";
$PALANG['pInvalidDomainDNS'] = "Invalid domain %s, and/or not discoverable in DNS";
$PALANG['pInvalidMailRegex'] = "Invalid email address %s, fails regexp check";
@ -417,6 +510,12 @@ $PALANG['dateformat_mysql'] = '%Y-%m-%d'; # translators: rearrange to your loc
$PALANG['password_expiration'] = 'Pass expires';
$PALANG['password_expiration_desc'] = 'Date when password will expire';
$PALANG['To_Mailbox'] = 'Mailbox'; # XXX
$PALANG['To_Forward_Only'] = 'Forward Only'; # XXX
$PALANG['pLegal_char_warning'] = 'Illegal character';
$PALANG['TOTP_already_configured'] = 'TOTP is already configured for this account, do you want to change your secret?';
$PALANG['pApp_passwords_add'] = 'Add application-specific password';
$PALANG['please_keep_this_as_last_entry'] = ''; # needed for language-check.sh
/* vim: set expandtab ft=php softtabstop=3 tabstop=3 shiftwidth=3: */
?>

View File

@ -18,6 +18,7 @@ $PALANG['confirm_delete_admin'] = 'Do you really want to delete the admin %s?';
$PALANG['confirm_delete_alias'] = 'Do you really want to delete the alias %s?'; # XXX
$PALANG['confirm_delete_aliasdomain'] = 'Do you really want to delete the alias domain %s?'; # XXX
$PALANG['confirm_delete_domain'] = '¿Está seguro de que desea borrar todos los registros de este dominio? ¡Esto no puede ser deshecho!\n (%s)'; # XXX text changed to: 'Do you really want to delete all records for the domain %s? This can not be undone'
$PALANG['confirm_delete_dkim'] = 'Do you really want to delete the domain key entry %s?'; # XXX
$PALANG['confirm_delete_fetchmail'] = 'Do you really want to delete the fetchmail job %s?'; # XXX
$PALANG['confirm_delete_mailbox'] = 'Do you really want to delete the mailbox %s?'; # XXX
$PALANG['confirm_delete_vacation'] = 'Do you really want to delete the vacation message for %s?'; # XXX
@ -52,14 +53,16 @@ $PALANG['add_alias_domain'] = 'Añadir alias de dominio'; # XXX check text - sh
$PALANG['add_mailbox'] = 'Añadir buzón';
$PALANG['pMenu_fetchmail'] = 'Obtener Emails';
$PALANG['pMenu_sendmail'] = 'Enviar e-mail';
$PALANG['pMenu_dkim'] = 'Domain Keys'; # XXX
$PALANG['pMenu_dkim_signing'] = 'Signing Table'; # XXX
$PALANG['pMenu_password'] = 'Contraseña';
$PALANG['pMenu_viewlog'] = 'Ver Logs';
$PALANG['pMenu_logout'] = 'Salir';
$PALANG['pMain_welcome'] = '¡Bienvenido a Postfix Admin!';
$PALANG['pMain_overview'] = 'Listado de sus alias y buzones. Puede editarlos / borrarlos desde aquí.';
$PALANG['pMain_create_alias'] = 'Creación de un nuevo alias para su dominio.'; # XXX check text - should be 'Create a new alias for your domain.'
$PALANG['pMain_create_mailbox'] = 'Creación de un nuevo buzón para su dominio.';
$PALANG['pMain_overview'] = 'Listado de sus alias y buzones. Puede editarlos / borrarlos desde aquí.'; # XXX Text changed to "List your domains. You can edit / delete them from here."
$PALANG['pMain_create_alias'] = 'Creación de un nuevo alias para su dominio.'; # # XXX Text changed to "Create a new email forward."
$PALANG['pMain_create_mailbox'] = 'Creación de un nuevo buzón para su dominio.'; # XXX Text changed to "Create a new mailbox."
$PALANG['pMain_sendmail'] = 'Enviar un e­mail a uno de los buzones recientemente creados.';
$PALANG['pMain_password'] = 'Cambiar la contraseña para su cuenta de administración.';
$PALANG['pMain_viewlog'] = 'Ver Logs.';
@ -79,6 +82,7 @@ $PALANG['pOverview_welcome'] = 'Resumen de ';
$PALANG['pOverview_alias_domain_aliases'] = 'Alias de Dominios';
$PALANG['pOverview_alias_address'] = 'De';
$PALANG['active'] = 'Activo';
$PALANG['smtp_active'] = 'Smtp';
$PALANG['and_x_more'] = '[y %s más...]';
$PALANG['pOverview_mailbox_username'] = 'E-mail';
$PALANG['name'] = 'Nombre';
@ -126,6 +130,7 @@ $PALANG['alias_updated'] = 'The alias %s has been updated!'; # XXX
$PALANG['pCreate_alias_catchall_text'] = 'Para crear un alias general use "*" como alias. Para una redirección de dominio a dominio, use "*@domain.tld" como Destino.'; # XXX check/beautify - was split in two lines before
$PALANG['mailbox_alias_cant_be_deleted'] = 'This alias belongs to a mailbox and can\'t be deleted!'; # XXX
$PALANG['protected_alias_cant_be_deleted'] = 'The alias %s is protected and can only be deleted by a superadmin'; # XXX
$PALANG['alias_points_to_itself'] = 'Alias may not point to itself'; # XXX
$PALANG['pEdit_alias_welcome'] = 'Edite un alias para su dominio.'; # XXX Text change to: 'Edit forwarding settings'
$PALANG['pEdit_alias_help'] = 'Una entrada por línea.'; # XXX # XXX Text change to: 'Accepts multiple targets, one entry per line.'
@ -161,6 +166,8 @@ $PALANG['pEdit_mailbox_password_text_error'] = '¡Las contraseñas introducidas
$PALANG['pEdit_mailbox_quota'] = 'Cuota';
$PALANG['pEdit_mailbox_quota_text'] = 'MB';
$PALANG['mb_max'] = 'MB (max: %s)'; # XXX
$PALANG['mb_max_unlimited'] = 'MB (max: unlimited)'; # XXX
$PALANG['mb_max_disabled'] = 'MB (max: disabled)'; # XXX
$PALANG['pEdit_mailbox_quota_text_error'] = '¡La cuota especificada es demasiado alta!';
$PALANG['pEdit_mailbox_domain_error'] = 'Este dominio no le pertenece: ';
$PALANG['pEdit_mailbox_result_error'] = '¡Imposible cambiar la contraseña!';
@ -199,6 +206,7 @@ $PALANG['reply_once_per_day'] = 'Reply once a day'; # XXX
$PALANG['reply_once_per_week'] = 'Reply once per week'; # XXX
$PALANG['pViewlog_welcome'] = 'Ver las últimas %s acciones para ';
$PALANG['pViewlog_welcome_all'] = 'Ver las últimas %s acciones ';
$PALANG['pViewlog_timestamp'] = 'Fecha/Hora';
$PALANG['pViewlog_action'] = 'Acción';
$PALANG['pViewlog_data'] = 'Datos';
@ -238,6 +246,32 @@ $PALANG['pSendmail_body'] = 'Cuerpo';
$PALANG['pSendmail_button'] = 'Enviar mensaje';
$PALANG['pSendmail_result_error'] = '¡Imposible enviar el email! (%s)'; # XXX text change - new: Unable to send email to %s!
$PALANG['pSendmail_result_success'] = '¡Email enviado! (%s)'; # XXX text change - new: Email sent to %s.
$PALANG['pDkim_new_key'] = 'Add Domain Key'; # XXX
$PALANG['pDkim_new_sign'] = 'Add Sign Table Entry'; # XXX
$PALANG['pDkim_edit_key'] = 'Edit Domain Key'; # XXX
$PALANG['pDkim_edit_sign'] = 'Edit Sign Table Entry'; # XXX
$PALANG['pDkim_field_selector'] = 'Selector'; # XXX
$PALANG['pDkim_field_pkey'] = 'Private Key'; # XXX
$PALANG['pDkim_field_pub'] = 'Public Key'; # XXX
$PALANG['pDkim_field_author'] = 'Author'; # XXX
$PALANG['pDkim_field_dkim_id'] = 'Domain Key'; # XXX
$PALANG['pDkim_field_selector_desc'] = 'Defines the name of the selector to be used when signing messages'; # XXX
$PALANG['pDkim_field_domain_desc'] = 'Defines the domain which will use this key for signing'; # XXX
$PALANG['pDkim_field_pkey_desc'] = 'PEM-formatted private key to be used for signing all messages'; # XXX
$PALANG['pDkim_field_pub_desc'] = 'PEM-formatted public key'; # XXX
$PALANG['pDkim_field_author_desc'] = 'Author that will use this key for signing. Can be either mailbox or domain, with mailbox taking precedence.'; # XXX
$PALANG['pDkim_field_dkim_id_desc'] = 'Domain Key that this author will use'; # XXX
$PALANG['dkim_already_exists'] = 'This Domain Key has already been added!'; # XXX
$PALANG['dkim_does_not_exist'] = 'This Domain Key does not exist!'; # XXX
$PALANG['dkim_signing_already_exists'] = 'This Domain Signing Entry already exsits!'; # XXX
$PALANG['dkim_signing_does_not_exist'] = 'This Domain Signing Entry does not exist!'; # XXX
$PALANG['pViewlog_action_create_dkim_entry'] = 'create domain key entry'; # XXX
$PALANG['pViewlog_action_edit_dkim_entry'] = 'edit domain key entry'; # XXX
$PALANG['pViewlog_action_delete_dkim_entry'] = 'delete domain key entry'; # XXX
$PALANG['pViewlog_action_create_dkim_signing_entry'] = 'create domain signing entry'; # XXX
$PALANG['pViewlog_action_edit_dkim_signing_entry'] = 'edit domain signing entry'; # XXX
$PALANG['pViewlog_action_delete_dkim_signing_entry'] = 'delete domain signing entry'; # XXX
$PALANG['pMain_dkim'] = 'Add a Domain Key for use with OpenDKIM.'; # XXX
$PALANG['pAdminMenu_list_admin'] = 'Lista de administradores';
$PALANG['pAdminMenu_list_domain'] = 'Lista de dominios';
@ -267,10 +301,12 @@ $PALANG['pAdminCreate_domain_result_success'] = '¡El dominio ha sido añadido!
$PALANG['domain_updated'] = 'The domain %s has been updated.'; # XXX
$PALANG['pAdminDelete_admin_error'] = 'Unable to delete admin!'; # XXX
$PALANG['domain_postdel_failed'] = '¡No se pudo eliminar el dominio!'; # XXX Text changed to: The domain postdeletion script failed, check the error log for details!
$PALANG['domain_postedit_failed'] = 'The domain postedit script failed, check the error log for details!'; # XXX
$PALANG['domain_postcreate_failed'] = 'The domain postcreate script failed, check the error log for details!'; # XXX
$PALANG['mailbox_postdel_failed'] = 'The mailbox postdeletion script failed, check the error log for details!'; # XXX
$PALANG['mailbox_postedit_failed'] = 'The mailbox postedit script failed, check the error log for details!'; # XXX
$PALANG['mailbox_postcreate_failed'] = 'The mailbox postcreate script failed, check the error log for details!'; # XXX
$PALANG['mailbox_postpassword_failed'] = 'The mailbox postpassword script failed, check the error log for details!'; # XXX
$PALANG['pAdminDelete_alias_domain_error'] = '¡No se pudo eliminar el alias de dominio!';
$PALANG['domain_conflict_vacation_domain'] = 'You can\'t use the vacation domain as mail domain!'; # XXX
@ -320,7 +356,7 @@ $PALANG['pUsersVacation_welcome_text'] = '¡Ya dispone de una respuesta automát
$PALANG['pUsersVacation_subject_text'] = 'Fuera del trabajo';
$PALANG['message'] = 'Mensaje';
$PALANG['pUsersVacation_body_text'] = <<<EOM
Estaré fuera desde <date> hasta <date>.
Estaré fuera desde <%From_Date> hasta <%Until_Date>.
Para asuntos urgentes, puede contactar conmigo en <contact person>.
EOM;
$PALANG['pUsersVacation_activefrom'] = 'Active from'; # XXX
@ -348,6 +384,7 @@ $PALANG['pStatus_popimap'] = 'POP/IMAP '; # XXX
$PALANG['password_too_short'] = "La contraseña es demasiado corta - se necesitan %s caracteres";
$PALANG['password_no_characters'] = "Your password must contain at least %s letters (A-Z, a-z)."; # XXX
$PALANG['password_no_digits'] = "Your password must contain at least %s digit(s)."; # XXX
$PALANG['password_no_special'] = "Your password must contain at least %s special character(s)."; # XXX
$PALANG['pInvalidDomainRegex'] = "El nombre de dominio %s es inválido, no se ajusta a la expresión regular";
$PALANG['pInvalidDomainDNS'] = "El dominio %s no es válido, y/o no tiene resolución DNS";
$PALANG['pInvalidMailRegex'] = "La dirección de email no es válidas, no se ajusta a la expresión regular (%s)"; # XXX %s added - but it should be in the text, not at the end
@ -403,6 +440,63 @@ $PALANG['dateformat_pgsql'] = 'YYYY-mm-dd'; # translators: rearrange to your loc
$PALANG['dateformat_mysql'] = '%Y-%m-%d'; # translators: rearrange to your local date format, but make sure it's a valid MySQL date format # XXX
$PALANG['password_expiration'] = 'Pass expires'; # XXX
$PALANG['password_expiration_desc'] = 'Date when password will expire'; # XXX
$PALANG['To_Mailbox'] = 'Mailbox'; # XXX # XXX
$PALANG['To_Forward_Only'] = 'Forward Only'; # XXX # XXX
$PALANG['pLegal_char_warning'] = 'Carácter ilegal';
$PALANG['copy'] = 'Copiado';
$PALANG['generate'] = 'Generar';
$PALANG['pMenu_security'] = 'Seguridad';
$PALANG['pMenu_totp'] = 'TOTP';
$PALANG['pMenu_totp_exceptions'] = 'Excepciones de los programas';
$PALANG['pMenu_app_passwords'] = 'Contraseñas de aplicación';
$PALANG['pUsersMain_totp_exceptions'] = 'Permitir direcciones IP confiables para acceder a su buzón de correo sin TOTP';
$PALANG['pUsersMenu_totp'] = 'Cambio';
$PALANG['pTOTP_welcome'] = 'Configura tu contraseña de una sola vez basada en el tiempo';
$PALANG['pUsersMain_totp'] = 'Configura tu contraseña de una sola vez basada en el tiempo';
$PALANG['pTOTP_secret'] = 'ToTP secret';
$PALANG['pTOTP_code'] = 'Código postal';
$PALANG['pTOTP_secret_result_error'] = 'No podría cambiar el secreto de TOTP';
$PALANG['change_TOTP'] = 'Cambiar la configuración TOTP';
$PALANG['pTOTP_code_mismatch'] = 'Incorrecto una sola vez-password ingresado';
$PALANG['pTOTP_qr'] = 'TOTP QR-code';
$PALANG['pTOTP_confirm'] = 'Por favor, confirme su login proporcionando su código TOTP actual';
$PALANG['pTotp_failed'] = 'Su código de entrada no es válido. Por favor, utilice un código actual.';
$PALANG['pTotp_stored'] = 'Usted confirmó con éxito su nuevo secreto TOTP.';
$PALANG['pTotp_exceptions_welcome'] = 'Add TOPT-exempt address';
$PALANG['pTotp_exceptions_user'] = 'Nombre de usuario (o dominio para los administradores)';
$PALANG['pTotp_exceptions_add'] = 'A excepción';
$PALANG['pTotp_exceptions_address'] = 'IP-Address';
$PALANG['pTotp_exceptions_description'] = 'Descripción';
$PALANG['pTotp_exceptions_list'] = 'Existing exceptions';
$PALANG['pTotp_exceptions_revoke'] = 'Revocación';
$PALANG['pTotp_exceptions_revoked'] = 'Excepción revocada';
$PALANG['pTotp_exception_result_success'] = 'Excepción añadida';
$PALANG['pTotp_exception_result_error'] = 'No se puede añadir excepción';
$PALANG['pEdit_totp_exception_result_error'] = 'Incapaz de modificar excepciones TOTP';
$PALANG['pException_ip_empty_error'] = 'IP no puede estar vacía';
$PALANG['pException_desc_empty_error'] = 'Descripción no puede estar vacía';
$PALANG['pException_user_entire_domain_error'] = 'Sólo los administradores pueden añadir excepciones para todo un dominio.';
$PALANG['pException_user_global_error'] = 'Sólo superadmins pueden añadir excepciones globales';
$PALANG['pUsersMain_app_passwords'] = 'Configuración de contraseñas de aplicación recuperables con privilegios reducidos';
$PALANG['pApp_passwords_list'] = 'contraseñas de aplicación existentes';
$PALANG['pApp_password_revoked'] = 'Excepción revocada';
$PALANG['pApp_passwords_welcome'] = 'Agregar contraseña de aplicación';
$PALANG['pAppPassAdd_result_success'] = 'Añadido una contraseña de aplicación';
$PALANG['pAppPassAdd_pass_empty_error'] = 'La contraseña no puede estar vacía';
$PALANG['pAppPassAdd_result_error'] = 'No se puede agregar contraseña de aplicación';
$PALANG['MFA_submit'] = 'Confirme el login';
$PALANG['pViewlog_action_add_totp_exception'] = 'Add TOTP exception';
$PALANG['pViewlog_action_delete_totp_exception'] = 'Suprímase la excepción TOTP';
$PALANG['pViewlog_action_add_app_password'] = 'Agregar contraseña de aplicación';
$PALANG['mailbox_postapppassword_failed'] = 'El script de correo postalapppassword falla, comprueba el registro de errores para detalles!';
$PALANG['mailbox_post_totp_exception_delete_failed'] = 'La excepción de correo postal totp delete script falló, compruebe el registro de error para detalles!';
$PALANG['mailbox_post_totp_exception_add_failed'] = 'La excepción de correo postal totp añadir script falló, comprobar el registro de error para detalles!';
$PALANG['mailbox_post_TOTP_change_failed'] = 'El correo postal totp secret change script falló, comprueba el registro de errores para detalles!';
$PALANG['TOTP_already_configured'] = 'TOTP ya está configurado para esta cuenta, ¿quieres cambiar tu secreto?';
$PALANG['pApp_passwords_add'] = 'Añadir contraseña específica para aplicaciones';
$PALANG['please_keep_this_as_last_entry'] = ''; # needed for language-check.sh
/* vim: set expandtab ft=php softtabstop=3 tabstop=3 shiftwidth=3: */

View File

@ -17,6 +17,7 @@ $PALANG['confirm_delete_admin'] = 'Do you really want to delete the admin %s?';
$PALANG['confirm_delete_alias'] = 'Do you really want to delete the alias %s?'; # XXX
$PALANG['confirm_delete_aliasdomain'] = 'Do you really want to delete the alias domain %s?'; # XXX
$PALANG['confirm_delete_domain'] = 'Oled tõesti kindel, et tahad kustutada kõik kirjed sellele domeenile? Seda tegevust ei saa tagasi võtta!\n (%s)'; # XXX text changed to: 'Do you really want to delete all records for the domain %s? This can not be undone'
$PALANG['confirm_delete_dkim'] = 'Do you really want to delete the domain key entry %s?'; # XXX
$PALANG['confirm_delete_fetchmail'] = 'Do you really want to delete the fetchmail job %s?'; # XXX
$PALANG['confirm_delete_mailbox'] = 'Do you really want to delete the mailbox %s?'; # XXX
$PALANG['confirm_delete_vacation'] = 'Do you really want to delete the vacation message for %s?'; # XXX
@ -52,14 +53,16 @@ $PALANG['add_alias_domain'] = 'Add Alias Domain'; # XXX
$PALANG['add_mailbox'] = 'Lisa postkast';
$PALANG['pMenu_fetchmail'] = 'Fetch Email'; # XXX
$PALANG['pMenu_sendmail'] = 'Saada kiri';
$PALANG['pMenu_dkim'] = 'Domain Keys'; # XXX
$PALANG['pMenu_dkim_signing'] = 'Signing Table'; # XXX
$PALANG['pMenu_password'] = 'Parool';
$PALANG['pMenu_viewlog'] = 'Vaata logi';
$PALANG['pMenu_logout'] = 'Logi välja';
$PALANG['pMain_welcome'] = 'Tere tulemast domeeni(de) administreerimise liidesesse!';
$PALANG['pMain_overview'] = 'Loetelu aliastest ja postkastidest. Siin saab neid muuta ja kustutada.';
$PALANG['pMain_create_alias'] = 'Loo uus alias domeenile.'; # XXX check text - should be 'Create a new alias for your domain.'
$PALANG['pMain_create_mailbox'] = 'Loo uus postkast domeenile.';
$PALANG['pMain_overview'] = 'Loetelu aliastest ja postkastidest. Siin saab neid muuta ja kustutada.'; # XXX Text changed to "List your domains. You can edit / delete them from here."
$PALANG['pMain_create_alias'] = 'Loo uus alias domeenile.'; # XXX Text changed to "Create a new email forward."
$PALANG['pMain_create_mailbox'] = 'Loo uus postkast domeenile.'; # XXX Text changed to "Create a new mailbox."
$PALANG['pMain_sendmail'] = 'Saada kiri äsjaloodud postkasti.';
$PALANG['pMain_password'] = 'Muuda haldamise konto parool.';
$PALANG['pMain_viewlog'] = 'Vaata logi faili.';
@ -79,6 +82,7 @@ $PALANG['pOverview_welcome'] = 'Ülevaade domeenist: ';
$PALANG['pOverview_alias_domain_aliases'] = 'Alias Domains'; # XXX
$PALANG['pOverview_alias_address'] = 'Kellelt';
$PALANG['active'] = 'Aktiivne';
$PALANG['smtp_active'] = 'Smtp';
$PALANG['and_x_more'] = '[and %s more...]'; # XXX
$PALANG['pOverview_mailbox_username'] = 'E-posti aadress';
$PALANG['name'] = 'Nimi';
@ -126,6 +130,7 @@ $PALANG['alias_updated'] = 'The alias %s has been updated!'; # XXX
$PALANG['pCreate_alias_catchall_text'] = 'Loomaks püüa-kõik aadressi kasuta aliasena "*". Domeenilt domeenile edasisaatmiseks kasuta kellele väljal "*@domeen.xx".'; # XXX check/beautify - was split in two lines before
$PALANG['mailbox_alias_cant_be_deleted'] = 'This alias belongs to a mailbox and can\'t be deleted!'; # XXX
$PALANG['protected_alias_cant_be_deleted'] = 'The alias %s is protected and can only be deleted by a superadmin'; # XXX
$PALANG['alias_points_to_itself'] = 'Alias may not point to itself'; # XXX
$PALANG['pEdit_alias_welcome'] = 'Muuda aliast.'; # XXX Text change to: 'Edit forwarding settings'
$PALANG['pEdit_alias_help'] = 'Üks kirje rea kohta.'; # XXX Text change to: 'Accepts multiple targets, one entry per line.'
@ -161,6 +166,8 @@ $PALANG['pEdit_mailbox_password_text_error'] = 'Sisestatud paroolid ei kattu!';
$PALANG['pEdit_mailbox_quota'] = 'Kettaruumi piirang';
$PALANG['pEdit_mailbox_quota_text'] = 'MB';
$PALANG['mb_max'] = 'MB (max: %s)'; # XXX
$PALANG['mb_max_unlimited'] = 'MB (max: unlimited)'; # XXX
$PALANG['mb_max_disabled'] = 'MB (max: disabled)'; # XXX
$PALANG['pEdit_mailbox_quota_text_error'] = 'Sisestatud kettaruumi piirang on liiga kõrge!';
$PALANG['pEdit_mailbox_domain_error'] = 'Puuduvad õigused. Domeen: ';
$PALANG['pEdit_mailbox_result_error'] = 'Postkasti muutmine ebaõnnestus!';
@ -198,6 +205,7 @@ $PALANG['reply_once_per_day'] = 'Reply once a day'; # XXX
$PALANG['reply_once_per_week'] = 'Reply once per week'; # XXX
$PALANG['pViewlog_welcome'] = 'Vaata %s viimast muudatust domeeniga ';
$PALANG['pViewlog_welcome_all'] = 'View the last %s actions '; # XXX
$PALANG['pViewlog_timestamp'] = 'Ajatempel';
$PALANG['pViewlog_action'] = 'Toiming';
$PALANG['pViewlog_data'] = 'Andmed';
@ -237,6 +245,32 @@ $PALANG['pSendmail_body'] = 'Põhitekst';
$PALANG['pSendmail_button'] = 'Saada teade';
$PALANG['pSendmail_result_error'] = 'Postkasti loomine ebaõnnestus! (%s)'; # XXX text change - new: Unable to send email to %s!
$PALANG['pSendmail_result_success'] = 'Postkast on loodud! (%s)'; # XXX text change - new: Email sent to %s.
$PALANG['pDkim_new_key'] = 'Add Domain Key'; # XXX
$PALANG['pDkim_new_sign'] = 'Add Sign Table Entry'; # XXX
$PALANG['pDkim_edit_key'] = 'Edit Domain Key'; # XXX
$PALANG['pDkim_edit_sign'] = 'Edit Sign Table Entry'; # XXX
$PALANG['pDkim_field_selector'] = 'Selector'; # XXX
$PALANG['pDkim_field_pkey'] = 'Private Key'; # XXX
$PALANG['pDkim_field_pub'] = 'Public Key'; # XXX
$PALANG['pDkim_field_author'] = 'Author'; # XXX
$PALANG['pDkim_field_dkim_id'] = 'Domain Key'; # XXX
$PALANG['pDkim_field_selector_desc'] = 'Defines the name of the selector to be used when signing messages'; # XXX
$PALANG['pDkim_field_domain_desc'] = 'Defines the domain which will use this key for signing'; # XXX
$PALANG['pDkim_field_pkey_desc'] = 'PEM-formatted private key to be used for signing all messages'; # XXX
$PALANG['pDkim_field_pub_desc'] = 'PEM-formatted public key'; # XXX
$PALANG['pDkim_field_author_desc'] = 'Author that will use this key for signing. Can be either mailbox or domain, with mailbox taking precedence.'; # XXX
$PALANG['pDkim_field_dkim_id_desc'] = 'Domain Key that this author will use'; # XXX
$PALANG['dkim_already_exists'] = 'This Domain Key has already been added!'; # XXX
$PALANG['dkim_does_not_exist'] = 'This Domain Key does not exist!'; # XXX
$PALANG['dkim_signing_already_exists'] = 'This Domain Signing Entry already exsits!'; # XXX
$PALANG['dkim_signing_does_not_exist'] = 'This Domain Signing Entry does not exist!'; # XXX
$PALANG['pViewlog_action_create_dkim_entry'] = 'create domain key entry'; # XXX
$PALANG['pViewlog_action_edit_dkim_entry'] = 'edit domain key entry'; # XXX
$PALANG['pViewlog_action_delete_dkim_entry'] = 'delete domain key entry'; # XXX
$PALANG['pViewlog_action_create_dkim_signing_entry'] = 'create domain signing entry'; # XXX
$PALANG['pViewlog_action_edit_dkim_signing_entry'] = 'edit domain signing entry'; # XXX
$PALANG['pViewlog_action_delete_dkim_signing_entry'] = 'delete domain signing entry'; # XXX
$PALANG['pMain_dkim'] = 'Add a Domain Key for use with OpenDKIM.'; # XXX
$PALANG['pAdminMenu_list_admin'] = 'Haldajad';
$PALANG['pAdminMenu_list_domain'] = 'Domeenid';
@ -266,10 +300,12 @@ $PALANG['pAdminCreate_domain_result_success'] = 'Domeen on lisatud! (%s)'; # XXX
$PALANG['domain_updated'] = 'The domain %s has been updated.'; # XXX
$PALANG['pAdminDelete_admin_error'] = 'Unable to delete admin!'; # XXX
$PALANG['domain_postdel_failed'] = 'The domain postdeletion script failed, check the error log for details!'; # XXX
$PALANG['domain_postedit_failed'] = 'The domain postedit script failed, check the error log for details!'; # XXX
$PALANG['domain_postcreate_failed'] = 'The domain postcreate script failed, check the error log for details!'; # XXX
$PALANG['mailbox_postdel_failed'] = 'The mailbox postdeletion script failed, check the error log for details!'; # XXX
$PALANG['mailbox_postedit_failed'] = 'The mailbox postedit script failed, check the error log for details!'; # XXX
$PALANG['mailbox_postcreate_failed'] = 'The mailbox postcreate script failed, check the error log for details!'; # XXX
$PALANG['mailbox_postpassword_failed'] = 'The mailbox postpassword script failed, check the error log for details!'; # XXX
$PALANG['pAdminDelete_alias_domain_error'] = 'Unable to remove domain alias!'; # XXX
$PALANG['domain_conflict_vacation_domain'] = 'You can\'t use the vacation domain as mail domain!'; # XXX
@ -318,10 +354,10 @@ $PALANG['pUsersVacation_welcome_text'] = 'Automaatne vastus on juba seadistatud!
$PALANG['pUsersVacation_subject_text'] = 'Kontorist väljas';
$PALANG['message'] = 'Põhitekst'; # XXX text changed to 'Message'
$PALANG['pUsersVacation_body_text'] = <<<EOM
Olen kontorist eemal alates <date> kuni <date>.
Olen kontorist eemal alates <%From_Date> kuni <%Until_Date>.
Kiireloomuliste asjade korral palun kontakteeru <kontakt isik>.
I will be away from <date> until <date>.
I will be away from <%From_Date> until <%Until_Date>.
For urgent matters you can contact <contact person>.
EOM;
$PALANG['pUsersVacation_activefrom'] = 'Active from'; # XXX
@ -350,6 +386,7 @@ $PALANG['pStatus_popimap'] = 'POP/IMAP '; # XXX
$PALANG['password_too_short'] = "Password is too short - requires %s characters"; # XXX
$PALANG['password_no_characters'] = "Your password must contain at least %s letters (A-Z, a-z)."; # XXX
$PALANG['password_no_digits'] = "Your password must contain at least %s digit(s)."; # XXX
$PALANG['password_no_special'] = "Your password must contain at least %s special character(s)."; # XXX
$PALANG['pInvalidDomainRegex'] = "Invalid domain name %s, fails regexp check"; # XXX
$PALANG['pInvalidDomainDNS'] = "Invalid domain %s, and/or not discoverable in DNS"; # XXX
$PALANG['pInvalidMailRegex'] = "Invalid email address %s, fails regexp check"; # XXX
@ -405,6 +442,63 @@ $PALANG['dateformat_pgsql'] = 'YYYY-mm-dd'; # translators: rearrange to your loc
$PALANG['dateformat_mysql'] = '%Y-%m-%d'; # translators: rearrange to your local date format, but make sure it's a valid MySQL date format # XXX
$PALANG['password_expiration'] = 'Pass expires'; # XXX
$PALANG['password_expiration_desc'] = 'Date when password will expire'; # XXX
$PALANG['To_Mailbox'] = 'Mailbox'; # XXX # XXX
$PALANG['To_Forward_Only'] = 'Forward Only'; # XXX # XXX
$PALANG['pLegal_char_warning'] = 'Illegal character'; # XXX
$PALANG['copy'] = 'Copy'; # XXX
$PALANG['generate'] = 'Generate'; # XXX
$PALANG['pMenu_security'] = 'Security'; # XXX
$PALANG['pMenu_totp'] = 'TOTP'; # XXX
$PALANG['pMenu_totp_exceptions'] = 'TOTP exceptions'; # XXX
$PALANG['pMenu_app_passwords'] = 'Application passwords'; # XXX
$PALANG['pUsersMain_totp_exceptions'] = 'Allow trusted IP-addresses to access your mailbox without TOTP'; # XXX
$PALANG['pUsersMenu_totp'] = 'Change TOTP'; # XXX
$PALANG['pTOTP_welcome'] = 'Setup your Time-based One-time Password'; # XXX
$PALANG['pUsersMain_totp'] = 'Setup your Time-based One-time Password'; # XXX
$PALANG['pTOTP_secret'] = 'TOTP secret'; # XXX
$PALANG['pTOTP_code'] = 'TOTP code'; # XXX
$PALANG['pTOTP_secret_result_error'] = 'Could not change TOTP secret'; # XXX
$PALANG['change_TOTP'] = 'Change TOTP settings'; # XXX
$PALANG['pTOTP_code_mismatch'] = 'Incorrect one-time-password entered'; # XXX
$PALANG['pTOTP_qr'] = 'TOTP QR-code'; # XXX
$PALANG['pTOTP_confirm'] = 'Please confirm your login by providing your current TOTP code'; # XXX
$PALANG['pTotp_failed'] = 'Your entered code is not valid. Please use a current code.'; # XXX
$PALANG['pTotp_stored'] = 'You successfully confirmed your new TOTP secret.'; # XXX
$PALANG['pTotp_exceptions_welcome'] = 'Add TOPT-exempt address'; # XXX
$PALANG['pTotp_exceptions_user'] = 'Username (or domain for admins)'; # XXX
$PALANG['pTotp_exceptions_add'] = 'Add exception'; # XXX
$PALANG['pTotp_exceptions_address'] = 'IP-Address'; # XXX
$PALANG['pTotp_exceptions_description'] = 'Description'; # XXX
$PALANG['pTotp_exceptions_list'] = 'Existing exceptions'; # XXX
$PALANG['pTotp_exceptions_revoke'] = 'Revoke'; # XXX
$PALANG['pTotp_exceptions_revoked'] = 'Exception revoked'; # XXX
$PALANG['pTotp_exception_result_success'] = 'Exception added'; # XXX
$PALANG['pTotp_exception_result_error'] = 'Could not add exception'; # XXX
$PALANG['pEdit_totp_exception_result_error'] = 'Unable to modify TOTP exceptions'; # XXX
$PALANG['pException_ip_empty_error'] = 'IP cannot be empty'; # XXX
$PALANG['pException_desc_empty_error'] = 'Description cannot be empty'; # XXX
$PALANG['pException_user_entire_domain_error'] = 'Only admins can add exceptions for an entire domain.'; # XXX
$PALANG['pException_user_global_error'] = 'Only superadmins can add global exceptions'; # XXX
$PALANG['pUsersMain_app_passwords'] = 'Setup revokable app passwords with reduced privileges'; # XXX
$PALANG['pApp_passwords_list'] = 'Existing application passwords'; # XXX
$PALANG['pApp_password_revoked'] = 'Exception revoked'; # XXX
$PALANG['pApp_passwords_welcome'] = 'Add application password'; # XXX
$PALANG['pAppPassAdd_result_success'] = 'Added an application password'; # XXX
$PALANG['pAppPassAdd_pass_empty_error'] = 'Password cannot be empty'; # XXX
$PALANG['pAppPassAdd_result_error'] = 'Could not add application password'; # XXX
$PALANG['MFA_submit'] = 'Confirm login'; # XXX
$PALANG['pViewlog_action_add_totp_exception'] = 'Add TOTP exception'; # XXX
$PALANG['pViewlog_action_delete_totp_exception'] = 'Delete TOTP exception'; # XXX
$PALANG['pViewlog_action_add_app_password'] = 'Add application password'; # XXX
$PALANG['mailbox_postapppassword_failed'] = 'The mailbox postapppassword script failed, check the error log for details!'; # XXX
$PALANG['mailbox_post_totp_exception_delete_failed'] = 'The mailbox post totp exception delete script failed, check the error log for details!'; # XXX
$PALANG['mailbox_post_totp_exception_add_failed'] = 'The mailbox post totp exception add script failed, check the error log for details!'; # XXX
$PALANG['mailbox_post_TOTP_change_failed'] = 'The mailbox post totp secret change script failed, check the error log for details!'; # XXX
$PALANG['TOTP_already_configured'] = 'TOTP is already configured for this account, do you want to change your secret?'; # XXX
$PALANG['pApp_passwords_add'] = 'Add application-specific password'; # XXX
$PALANG['please_keep_this_as_last_entry'] = ''; # needed for language-check.sh
/* vim: set expandtab ft=php softtabstop=3 tabstop=3 shiftwidth=3: */

View File

@ -17,6 +17,7 @@ $PALANG['confirm_delete_admin'] = 'Do you really want to delete the admin %s?';
$PALANG['confirm_delete_alias'] = 'Do you really want to delete the alias %s?'; # XXX
$PALANG['confirm_delete_aliasdomain'] = 'Do you really want to delete the alias domain %s?'; # XXX
$PALANG['confirm_delete_domain'] = 'Ziur al zaude domeinu honetako erregistro guztiak ezbatu nahi dituzula? Hau ezin izango da desegin!\n (%s)'; # XXX text changed to: 'Do you really want to delete all records for the domain %s? This can not be undone'
$PALANG['confirm_delete_dkim'] = 'Do you really want to delete the domain key entry %s?'; # XXX
$PALANG['confirm_delete_fetchmail'] = 'Do you really want to delete the fetchmail job %s?'; # XXX
$PALANG['confirm_delete_mailbox'] = 'Do you really want to delete the mailbox %s?'; # XXX
$PALANG['confirm_delete_vacation'] = 'Do you really want to delete the vacation message for %s?'; # XXX
@ -51,14 +52,16 @@ $PALANG['add_alias_domain'] = 'Add Alias Domain'; # XXX
$PALANG['add_mailbox'] = 'Postontzia gehitu';
$PALANG['pMenu_fetchmail'] = 'Fetch Email'; # XXX
$PALANG['pMenu_sendmail'] = 'e-maila bidali';
$PALANG['pMenu_dkim'] = 'Domain Keys'; # XXX
$PALANG['pMenu_dkim_signing'] = 'Signing Table'; # XXX
$PALANG['pMenu_password'] = 'Pasahitza';
$PALANG['pMenu_viewlog'] = 'Logak ikusi';
$PALANG['pMenu_logout'] = 'Irten';
$PALANG['pMain_welcome'] = 'Ongietorri Postfix Adminera!';
$PALANG['pMain_overview'] = 'Alias eta postontzien zerrenda. Hemendik aldatu / ezabatu ditzakezu.';
$PALANG['pMain_create_alias'] = 'Zure domeinuarentzako alias berri baten sorkuntza.'; # XXX check text - should be 'Create a new alias for your domain.'
$PALANG['pMain_create_mailbox'] = 'Zure domeinuarentzako postontzi berri baten sorkuntza.';
$PALANG['pMain_overview'] = 'Alias eta postontzien zerrenda. Hemendik aldatu / ezabatu ditzakezu.'; # XXX Text changed to "List your domains. You can edit / delete them from here."
$PALANG['pMain_create_alias'] = 'Zure domeinuarentzako alias berri baten sorkuntza.'; # XXX Text changed to "Create a new email forward."
$PALANG['pMain_create_mailbox'] = 'Zure domeinuarentzako postontzi berri baten sorkuntza.'; # XXX Text changed to "Create a new mailbox."
$PALANG['pMain_sendmail'] = 'Duela gutxi sorturiko postontziren batera e-mail bat bidali.';
$PALANG['pMain_password'] = 'Kudeatzaile konturako pasahitza aldatu.';
$PALANG['pMain_viewlog'] = 'Logak ikusi.';
@ -78,6 +81,7 @@ $PALANG['pOverview_welcome'] = 'Laburpena ';
$PALANG['pOverview_alias_domain_aliases'] = 'Alias Domains'; # XXX
$PALANG['pOverview_alias_address'] = 'Igorlea';
$PALANG['active'] = 'Aktibatua';
$PALANG['smtp_active'] = 'Smtp';
$PALANG['and_x_more'] = '[and %s more...]'; # XXX
$PALANG['pOverview_mailbox_username'] = 'E-mail';
$PALANG['name'] = 'Izena';
@ -124,6 +128,7 @@ $PALANG['alias_updated'] = 'The alias %s has been updated!'; # XXX
$PALANG['pCreate_alias_catchall_text'] = 'Alias orokor bat sortzeko "*" erabil ezazu alias gisa. Domeinuz domeinurako birbideraketa baterako Norako gisa "*@domain.tld" erabil ezazu.'; # XXX check/beautify - was split in two lines before
$PALANG['mailbox_alias_cant_be_deleted'] = 'This alias belongs to a mailbox and can\'t be deleted!'; # XXX
$PALANG['protected_alias_cant_be_deleted'] = 'The alias %s is protected and can only be deleted by a superadmin'; # XXX
$PALANG['alias_points_to_itself'] = 'Alias may not point to itself'; # XXX
$PALANG['pEdit_alias_welcome'] = 'Domeinuarentzat aliasa aldatu.'; # XXX Text change to: 'Edit forwarding settings'
$PALANG['pEdit_alias_help'] = 'Lerroko sarrera bat.'; # XXX # XXX Text change to: 'Accepts multiple targets, one entry per line.'
@ -159,6 +164,8 @@ $PALANG['pEdit_mailbox_password_text_error'] = 'Sartutako pasahitzak ez datoz ba
$PALANG['pEdit_mailbox_quota'] = 'Kuota';
$PALANG['pEdit_mailbox_quota_text'] = 'MB';
$PALANG['mb_max'] = 'MB (max: %s)'; # XXX
$PALANG['mb_max_unlimited'] = 'MB (max: unlimited)'; # XXX
$PALANG['mb_max_disabled'] = 'MB (max: disabled)'; # XXX
$PALANG['pEdit_mailbox_quota_text_error'] = 'Zehazturiko kuota altuegia da!';
$PALANG['pEdit_mailbox_domain_error'] = 'Ez zara domeinu honen jabe: ';
$PALANG['pEdit_mailbox_result_error'] = 'Ezinezkoa pasahitza aldatzea!';
@ -196,6 +203,7 @@ $PALANG['reply_once_per_day'] = 'Reply once a day'; # XXX
$PALANG['reply_once_per_week'] = 'Reply once per week'; # XXX
$PALANG['pViewlog_welcome'] = 'Honen azken %s ekintzak ikusi ';
$PALANG['pViewlog_welcome_all'] = 'View the last %s actions '; # XXX
$PALANG['pViewlog_timestamp'] = 'Data/ordua';
$PALANG['pViewlog_action'] = 'Ekintza';
$PALANG['pViewlog_data'] = 'Datuak';
@ -235,6 +243,32 @@ $PALANG['pSendmail_body'] = 'Gorputza';
$PALANG['pSendmail_button'] = 'Mezua bidali';
$PALANG['pSendmail_result_error'] = 'Ezinezkoa postontzia sortzea! (%s)'; # XXX text change - new: Unable to send email to %s!
$PALANG['pSendmail_result_success'] = 'Postontzia sortuta! (%s)'; # XXX text change - new: Email sent to %s.
$PALANG['pDkim_new_key'] = 'Add Domain Key'; # XXX
$PALANG['pDkim_new_sign'] = 'Add Sign Table Entry'; # XXX
$PALANG['pDkim_edit_key'] = 'Edit Domain Key'; # XXX
$PALANG['pDkim_edit_sign'] = 'Edit Sign Table Entry'; # XXX
$PALANG['pDkim_field_selector'] = 'Selector'; # XXX
$PALANG['pDkim_field_pkey'] = 'Private Key'; # XXX
$PALANG['pDkim_field_pub'] = 'Public Key'; # XXX
$PALANG['pDkim_field_author'] = 'Author'; # XXX
$PALANG['pDkim_field_dkim_id'] = 'Domain Key'; # XXX
$PALANG['pDkim_field_selector_desc'] = 'Defines the name of the selector to be used when signing messages'; # XXX
$PALANG['pDkim_field_domain_desc'] = 'Defines the domain which will use this key for signing'; # XXX
$PALANG['pDkim_field_pkey_desc'] = 'PEM-formatted private key to be used for signing all messages'; # XXX
$PALANG['pDkim_field_pub_desc'] = 'PEM-formatted public key'; # XXX
$PALANG['pDkim_field_author_desc'] = 'Author that will use this key for signing. Can be either mailbox or domain, with mailbox taking precedence.'; # XXX
$PALANG['pDkim_field_dkim_id_desc'] = 'Domain Key that this author will use'; # XXX
$PALANG['dkim_already_exists'] = 'This Domain Key has already been added!'; # XXX
$PALANG['dkim_does_not_exist'] = 'This Domain Key does not exist!'; # XXX
$PALANG['dkim_signing_already_exists'] = 'This Domain Signing Entry already exsits!'; # XXX
$PALANG['dkim_signing_does_not_exist'] = 'This Domain Signing Entry does not exist!'; # XXX
$PALANG['pViewlog_action_create_dkim_entry'] = 'create domain key entry'; # XXX
$PALANG['pViewlog_action_edit_dkim_entry'] = 'edit domain key entry'; # XXX
$PALANG['pViewlog_action_delete_dkim_entry'] = 'delete domain key entry'; # XXX
$PALANG['pViewlog_action_create_dkim_signing_entry'] = 'create domain signing entry'; # XXX
$PALANG['pViewlog_action_edit_dkim_signing_entry'] = 'edit domain signing entry'; # XXX
$PALANG['pViewlog_action_delete_dkim_signing_entry'] = 'delete domain signing entry'; # XXX
$PALANG['pMain_dkim'] = 'Add a Domain Key for use with OpenDKIM.'; # XXX
$PALANG['pAdminMenu_list_admin'] = 'Kudeatzaile zerrenda';
$PALANG['pAdminMenu_list_domain'] = 'Domeinu zerrenda';
@ -264,10 +298,12 @@ $PALANG['pAdminCreate_domain_result_success'] = 'Domeinua gehituta! (%s)'; # XXX
$PALANG['domain_updated'] = 'The domain %s has been updated.'; # XXX
$PALANG['pAdminDelete_admin_error'] = 'Unable to delete admin!'; # XXX
$PALANG['domain_postdel_failed'] = 'The domain postdeletion script failed, check the error log for details!'; # XXX
$PALANG['domain_postedit_failed'] = 'The domain postedit script failed, check the error log for details!'; # XXX
$PALANG['domain_postcreate_failed'] = 'The domain postcreate script failed, check the error log for details!'; # XXX
$PALANG['mailbox_postdel_failed'] = 'The mailbox postdeletion script failed, check the error log for details!'; # XXX
$PALANG['mailbox_postedit_failed'] = 'The mailbox postedit script failed, check the error log for details!'; # XXX
$PALANG['mailbox_postcreate_failed'] = 'The mailbox postcreate script failed, check the error log for details!'; # XXX
$PALANG['mailbox_postpassword_failed'] = 'The mailbox postpassword script failed, check the error log for details!'; # XXX
$PALANG['pAdminDelete_alias_domain_error'] = 'Unable to remove domain alias!'; # XXX
$PALANG['domain_conflict_vacation_domain'] = 'You can\'t use the vacation domain as mail domain!'; # XXX
@ -317,7 +353,7 @@ $PALANG['pUsersVacation_welcome_text'] = 'Erantzun automatiko bat konfiguratuta
$PALANG['pUsersVacation_subject_text'] = 'Lanetik kanpo';
$PALANG['message'] = 'Gorputza'; # XXX text changed to 'Message'
$PALANG['pUsersVacation_body_text'] = <<<EOM
<date>-tik <date> arte kanpoan egongo naiz.
<%From_Date>-tik <%Until_Date> arte kanpoan egongo naiz.
Larrialdiko gaientzat, hemen <contact person> kontakta dezakezu nirekin.
EOM;
$PALANG['pUsersVacation_activefrom'] = 'Active from'; # XXX
@ -345,6 +381,7 @@ $PALANG['pStatus_popimap'] = 'POP/IMAP '; # XXX
$PALANG['password_too_short'] = "Password is too short - requires %s characters"; # XXX
$PALANG['password_no_characters'] = "Your password must contain at least %s letters (A-Z, a-z)."; # XXX
$PALANG['password_no_digits'] = "Your password must contain at least %s digit(s)."; # XXX
$PALANG['password_no_special'] = "Your password must contain at least %s special character(s)."; # XXX
$PALANG['pInvalidDomainRegex'] = "Invalid domain name %s, fails regexp check"; # XXX
$PALANG['pInvalidDomainDNS'] = "Invalid domain %s, and/or not discoverable in DNS"; # XXX
$PALANG['pInvalidMailRegex'] = "Invalid email address %s, fails regexp check"; # XXX
@ -400,6 +437,63 @@ $PALANG['dateformat_pgsql'] = 'YYYY-mm-dd'; # translators: rearrange to your loc
$PALANG['dateformat_mysql'] = '%Y-%m-%d'; # translators: rearrange to your local date format, but make sure it's a valid MySQL date format # XXX
$PALANG['password_expiration'] = 'Pass expires'; # XXX
$PALANG['password_expiration_desc'] = 'Date when password will expire'; # XXX
$PALANG['To_Mailbox'] = 'Mailbox'; # XXX # XXX
$PALANG['To_Forward_Only'] = 'Forward Only'; # XXX # XXX
$PALANG['pLegal_char_warning'] = 'Illegal character'; # XXX
$PALANG['copy'] = 'Copy'; # XXX
$PALANG['generate'] = 'Generate'; # XXX
$PALANG['pMenu_security'] = 'Security'; # XXX
$PALANG['pMenu_totp'] = 'TOTP'; # XXX
$PALANG['pMenu_totp_exceptions'] = 'TOTP exceptions'; # XXX
$PALANG['pMenu_app_passwords'] = 'Application passwords'; # XXX
$PALANG['pUsersMain_totp_exceptions'] = 'Allow trusted IP-addresses to access your mailbox without TOTP'; # XXX
$PALANG['pUsersMenu_totp'] = 'Change TOTP'; # XXX
$PALANG['pTOTP_welcome'] = 'Setup your Time-based One-time Password'; # XXX
$PALANG['pUsersMain_totp'] = 'Setup your Time-based One-time Password'; # XXX
$PALANG['pTOTP_secret'] = 'TOTP secret'; # XXX
$PALANG['pTOTP_code'] = 'TOTP code'; # XXX
$PALANG['pTOTP_secret_result_error'] = 'Could not change TOTP secret'; # XXX
$PALANG['change_TOTP'] = 'Change TOTP settings'; # XXX
$PALANG['pTOTP_code_mismatch'] = 'Incorrect one-time-password entered'; # XXX
$PALANG['pTOTP_qr'] = 'TOTP QR-code'; # XXX
$PALANG['pTOTP_confirm'] = 'Please confirm your login by providing your current TOTP code'; # XXX
$PALANG['pTotp_failed'] = 'Your entered code is not valid. Please use a current code.'; # XXX
$PALANG['pTotp_stored'] = 'You successfully confirmed your new TOTP secret.'; # XXX
$PALANG['pTotp_exceptions_welcome'] = 'Add TOPT-exempt address'; # XXX
$PALANG['pTotp_exceptions_user'] = 'Username (or domain for admins)'; # XXX
$PALANG['pTotp_exceptions_add'] = 'Add exception'; # XXX
$PALANG['pTotp_exceptions_address'] = 'IP-Address'; # XXX
$PALANG['pTotp_exceptions_description'] = 'Description'; # XXX
$PALANG['pTotp_exceptions_list'] = 'Existing exceptions'; # XXX
$PALANG['pTotp_exceptions_revoke'] = 'Revoke'; # XXX
$PALANG['pTotp_exceptions_revoked'] = 'Exception revoked'; # XXX
$PALANG['pTotp_exception_result_success'] = 'Exception added'; # XXX
$PALANG['pTotp_exception_result_error'] = 'Could not add exception'; # XXX
$PALANG['pEdit_totp_exception_result_error'] = 'Unable to modify TOTP exceptions'; # XXX
$PALANG['pException_ip_empty_error'] = 'IP cannot be empty'; # XXX
$PALANG['pException_desc_empty_error'] = 'Description cannot be empty'; # XXX
$PALANG['pException_user_entire_domain_error'] = 'Only admins can add exceptions for an entire domain.'; # XXX
$PALANG['pException_user_global_error'] = 'Only superadmins can add global exceptions'; # XXX
$PALANG['pUsersMain_app_passwords'] = 'Setup revokable app passwords with reduced privileges'; # XXX
$PALANG['pApp_passwords_list'] = 'Existing application passwords'; # XXX
$PALANG['pApp_password_revoked'] = 'Exception revoked'; # XXX
$PALANG['pApp_passwords_welcome'] = 'Add application password'; # XXX
$PALANG['pAppPassAdd_result_success'] = 'Added an application password'; # XXX
$PALANG['pAppPassAdd_pass_empty_error'] = 'Password cannot be empty'; # XXX
$PALANG['pAppPassAdd_result_error'] = 'Could not add application password'; # XXX
$PALANG['MFA_submit'] = 'Confirm login'; # XXX
$PALANG['pViewlog_action_add_totp_exception'] = 'Add TOTP exception'; # XXX
$PALANG['pViewlog_action_delete_totp_exception'] = 'Delete TOTP exception'; # XXX
$PALANG['pViewlog_action_add_app_password'] = 'Add application password'; # XXX
$PALANG['mailbox_postapppassword_failed'] = 'The mailbox postapppassword script failed, check the error log for details!'; # XXX
$PALANG['mailbox_post_totp_exception_delete_failed'] = 'The mailbox post totp exception delete script failed, check the error log for details!'; # XXX
$PALANG['mailbox_post_totp_exception_add_failed'] = 'The mailbox post totp exception add script failed, check the error log for details!'; # XXX
$PALANG['mailbox_post_TOTP_change_failed'] = 'The mailbox post totp secret change script failed, check the error log for details!'; # XXX
$PALANG['TOTP_already_configured'] = 'TOTP is already configured for this account, do you want to change your secret?'; # XXX
$PALANG['pApp_passwords_add'] = 'Add application-specific password'; # XXX
$PALANG['please_keep_this_as_last_entry'] = ''; # needed for language-check.sh
/* vim: set expandtab ft=php softtabstop=3 tabstop=3 shiftwidth=3: */

View File

@ -18,6 +18,7 @@ $PALANG['confirm_delete_admin'] = 'Do you really want to delete the admin %s?';
$PALANG['confirm_delete_alias'] = 'Do you really want to delete the alias %s?'; # XXX
$PALANG['confirm_delete_aliasdomain'] = 'Do you really want to delete the alias domain %s?'; # XXX
$PALANG['confirm_delete_domain'] = 'Oletko varma että haluat poistaa kaikki tietueet tästä domainista? Tätä komentoa ei voi perua!\n (%s)'; # XXX text changed to: 'Do you really want to delete all records for the domain %s? This can not be undone'
$PALANG['confirm_delete_dkim'] = 'Do you really want to delete the domain key entry %s?'; # XXX
$PALANG['confirm_delete_fetchmail'] = 'Do you really want to delete the fetchmail job %s?'; # XXX
$PALANG['confirm_delete_mailbox'] = 'Do you really want to delete the mailbox %s?'; # XXX
$PALANG['confirm_delete_vacation'] = 'Do you really want to delete the vacation message for %s?'; # XXX
@ -53,14 +54,16 @@ $PALANG['add_alias_domain'] = 'Lisää alias domain'; # XXX check text - should
$PALANG['add_mailbox'] = 'Lisää postilaatikko';
$PALANG['pMenu_fetchmail'] = 'Hae sähköpostit';
$PALANG['pMenu_sendmail'] = 'Lähetä postia';
$PALANG['pMenu_dkim'] = 'Domain Keys'; # XXX
$PALANG['pMenu_dkim_signing'] = 'Signing Table'; # XXX
$PALANG['pMenu_password'] = 'Salasana';
$PALANG['pMenu_viewlog'] = 'Näytä loki';
$PALANG['pMenu_logout'] = 'Kirjaudu ulos';
$PALANG['pMain_welcome'] = 'Tervetuloa sähköpostin hallintaan.';
$PALANG['pMain_overview'] = 'Listaa aliakset ja postilaatikot. Voit muokata ja poistaa niitä tästä.';
$PALANG['pMain_create_alias'] = 'Luo uusi alias domainiin.'; # XXX check text - should be 'Create a new alias for your domain.'
$PALANG['pMain_create_mailbox'] = 'Luo uusi postilaatikko domainiin.';
$PALANG['pMain_overview'] = 'Listaa aliakset ja postilaatikot. Voit muokata ja poistaa niitä tästä.'; # XXX Text changed to "List your domains. You can edit / delete them from here."
$PALANG['pMain_create_alias'] = 'Luo uusi alias domainiin.'; # XXX Text changed to "Create a new email forward."
$PALANG['pMain_create_mailbox'] = 'Luo uusi postilaatikko domainiin.'; # XXX Text changed to "Create a new mailbox."
$PALANG['pMain_sendmail'] = 'Lähetä sähköpostia juuri luotuun postilaatikkoon.';
$PALANG['pMain_password'] = 'Vaihda hallintatunnuksen salasanaa.';
$PALANG['pMain_viewlog'] = 'Näytä lokitiedostot.';
@ -80,6 +83,7 @@ $PALANG['pOverview_welcome'] = 'Yleisnäkymä ';
$PALANG['pOverview_alias_domain_aliases'] = 'Alias Domainit';
$PALANG['pOverview_alias_address'] = 'Keneltä';
$PALANG['active'] = 'Aktiivinen';
$PALANG['smtp_active'] = 'Smtp';
$PALANG['and_x_more'] = '[ja %s lisää...]';
$PALANG['pOverview_mailbox_username'] = 'Sähköposti';
$PALANG['name'] = 'Nimi';
@ -127,6 +131,7 @@ $PALANG['alias_updated'] = 'The alias %s has been updated!'; # XXX
$PALANG['pCreate_alias_catchall_text'] = 'Jos haluat luoda catch-all osoitteen käytä "*" merkkiä aliaksena. Ohjaus domainista domainiin tapahtuu käyttämällä "*@domain.tld" Kenelle: -osoitteena.'; # XXX check/beautify - was split in two lines before
$PALANG['mailbox_alias_cant_be_deleted'] = 'This alias belongs to a mailbox and can\'t be deleted!'; # XXX
$PALANG['protected_alias_cant_be_deleted'] = 'The alias %s is protected and can only be deleted by a superadmin'; # XXX
$PALANG['alias_points_to_itself'] = 'Alias may not point to itself'; # XXX
$PALANG['pEdit_alias_welcome'] = 'Muokkaa aliasta.'; # XXX Text change to: 'Edit forwarding settings'
$PALANG['pEdit_alias_help'] = 'Yksi kohta per rivi.'; # XXX # XXX Text change to: 'Accepts multiple targets, one entry per line.'
$PALANG['alias'] = 'Alias';
@ -161,6 +166,8 @@ $PALANG['pEdit_mailbox_password_text_error'] = 'Antamasi salasanat eivät täsm
$PALANG['pEdit_mailbox_quota'] = 'Kiintiö';
$PALANG['pEdit_mailbox_quota_text'] = 'MB';
$PALANG['mb_max'] = 'MB (max: %s)'; # XXX
$PALANG['mb_max_unlimited'] = 'MB (max: unlimited)'; # XXX
$PALANG['mb_max_disabled'] = 'MB (max: disabled)'; # XXX
$PALANG['pEdit_mailbox_quota_text_error'] = 'Antamasi kiintiö on liian korkea!';
$PALANG['pEdit_mailbox_domain_error'] = 'Tämä domaini ei ole sinun: ';
$PALANG['pEdit_mailbox_result_error'] = 'Postilaatikon muokkaus ei onnistunut!';
@ -198,6 +205,7 @@ $PALANG['reply_once_per_day'] = 'Reply once a day'; # XXX
$PALANG['reply_once_per_week'] = 'Reply once per week'; # XXX
$PALANG['pViewlog_welcome'] = 'Näytä viimeiset kymmenen tapahtumaa domainille ';
$PALANG['pViewlog_welcome_all'] = 'View the last %s actions '; # XXX
$PALANG['pViewlog_timestamp'] = 'Aikaleima';
$PALANG['pViewlog_action'] = 'Tapahtuma';
$PALANG['pViewlog_data'] = 'Tiedot';
@ -237,6 +245,32 @@ $PALANG['pSendmail_body'] = 'Viesti';
$PALANG['pSendmail_button'] = 'Lähetä viesti';
$PALANG['pSendmail_result_error'] = 'Sähköpostin lähetys ei onnistunut! (%s)'; # XXX text change - new: Unable to send email to %s!
$PALANG['pSendmail_result_success'] = 'Sähköposti lähetetty! (%s)'; # XXX text change - new: Email sent to %s.
$PALANG['pDkim_new_key'] = 'Add Domain Key'; # XXX
$PALANG['pDkim_new_sign'] = 'Add Sign Table Entry'; # XXX
$PALANG['pDkim_edit_key'] = 'Edit Domain Key'; # XXX
$PALANG['pDkim_edit_sign'] = 'Edit Sign Table Entry'; # XXX
$PALANG['pDkim_field_selector'] = 'Selector'; # XXX
$PALANG['pDkim_field_pkey'] = 'Private Key'; # XXX
$PALANG['pDkim_field_pub'] = 'Public Key'; # XXX
$PALANG['pDkim_field_author'] = 'Author'; # XXX
$PALANG['pDkim_field_dkim_id'] = 'Domain Key'; # XXX
$PALANG['pDkim_field_selector_desc'] = 'Defines the name of the selector to be used when signing messages'; # XXX
$PALANG['pDkim_field_domain_desc'] = 'Defines the domain which will use this key for signing'; # XXX
$PALANG['pDkim_field_pkey_desc'] = 'PEM-formatted private key to be used for signing all messages'; # XXX
$PALANG['pDkim_field_pub_desc'] = 'PEM-formatted public key'; # XXX
$PALANG['pDkim_field_author_desc'] = 'Author that will use this key for signing. Can be either mailbox or domain, with mailbox taking precedence.'; # XXX
$PALANG['pDkim_field_dkim_id_desc'] = 'Domain Key that this author will use'; # XXX
$PALANG['dkim_already_exists'] = 'This Domain Key has already been added!'; # XXX
$PALANG['dkim_does_not_exist'] = 'This Domain Key does not exist!'; # XXX
$PALANG['dkim_signing_already_exists'] = 'This Domain Signing Entry already exsits!'; # XXX
$PALANG['dkim_signing_does_not_exist'] = 'This Domain Signing Entry does not exist!'; # XXX
$PALANG['pViewlog_action_create_dkim_entry'] = 'create domain key entry'; # XXX
$PALANG['pViewlog_action_edit_dkim_entry'] = 'edit domain key entry'; # XXX
$PALANG['pViewlog_action_delete_dkim_entry'] = 'delete domain key entry'; # XXX
$PALANG['pViewlog_action_create_dkim_signing_entry'] = 'create domain signing entry'; # XXX
$PALANG['pViewlog_action_edit_dkim_signing_entry'] = 'edit domain signing entry'; # XXX
$PALANG['pViewlog_action_delete_dkim_signing_entry'] = 'delete domain signing entry'; # XXX
$PALANG['pMain_dkim'] = 'Add a Domain Key for use with OpenDKIM.'; # XXX
$PALANG['pAdminMenu_list_admin'] = 'Ylläpitäjä Lista';
$PALANG['pAdminMenu_list_domain'] = 'Domain Lista';
@ -266,10 +300,12 @@ $PALANG['pAdminCreate_domain_result_success'] = 'Domain on lisätty! (%s)'; # XX
$PALANG['domain_updated'] = 'The domain %s has been updated.'; # XXX
$PALANG['pAdminDelete_admin_error'] = 'Unable to delete admin!'; # XXX
$PALANG['domain_postdel_failed'] = 'Domainin voitu poistaa!'; # XXX Text changed to: The domain postdeletion script failed, check the error log for details!
$PALANG['domain_postedit_failed'] = 'The domain postedit script failed, check the error log for details!'; # XXX
$PALANG['domain_postcreate_failed'] = 'The domain postcreate script failed, check the error log for details!'; # XXX
$PALANG['mailbox_postdel_failed'] = 'The mailbox postdeletion script failed, check the error log for details!'; # XXX
$PALANG['mailbox_postedit_failed'] = 'The mailbox postedit script failed, check the error log for details!'; # XXX
$PALANG['mailbox_postcreate_failed'] = 'The mailbox postcreate script failed, check the error log for details!'; # XXX
$PALANG['mailbox_postpassword_failed'] = 'The mailbox postpassword script failed, check the error log for details!'; # XXX
$PALANG['pAdminDelete_alias_domain_error'] = 'Domainin aliasta ei voitu poistaa!';
$PALANG['domain_conflict_vacation_domain'] = 'You can\'t use the vacation domain as mail domain!'; # XXX
@ -346,6 +382,7 @@ $PALANG['pStatus_popimap'] = 'POP/IMAP ';
$PALANG['password_too_short'] = "Salasana on liian lyhyt, vaaditaan %s merkkiä";
$PALANG['password_no_characters'] = "Your password must contain at least %s letters (A-Z, a-z)."; # XXX
$PALANG['password_no_digits'] = "Your password must contain at least %s digit(s)."; # XXX
$PALANG['password_no_special'] = "Your password must contain at least %s special character(s)."; # XXX
$PALANG['pInvalidDomainRegex'] = "Virheellinen domain nimi %s, ei läpäise regexp testiä";
$PALANG['pInvalidDomainDNS'] = "Virheellinen domain %s ja/tai ei löydy nimipalvelimista";
$PALANG['pInvalidMailRegex'] = "Virheellinen sähköpostiosoite, ei läpäise regexp testiä (%s)"; # XXX %s added - but it should be in the text, not at the end
@ -401,6 +438,63 @@ $PALANG['dateformat_pgsql'] = 'YYYY-mm-dd'; # translators: rearrange to your loc
$PALANG['dateformat_mysql'] = '%Y-%m-%d'; # translators: rearrange to your local date format, but make sure it's a valid MySQL date format # XXX
$PALANG['password_expiration'] = 'Pass expires'; # XXX
$PALANG['password_expiration_desc'] = 'Date when password will expire'; # XXX
$PALANG['To_Mailbox'] = 'Mailbox'; # XXX # XXX
$PALANG['To_Forward_Only'] = 'Forward Only'; # XXX # XXX
$PALANG['pLegal_char_warning'] = 'Laitonta luonnetta';
$PALANG['copy'] = 'Kopioita';
$PALANG['generate'] = 'Sukupolvi';
$PALANG['pMenu_security'] = 'Turvallisuusturvallisuus';
$PALANG['pMenu_totp'] = 'Totta';
$PALANG['pMenu_totp_exceptions'] = 'TOTP-poikkeukset';
$PALANG['pMenu_app_passwords'] = 'Käytä salasanoja';
$PALANG['pUsersMain_totp_exceptions'] = 'Salli luotettujen IP-osoitteiden käyttää postilaatikkoasi ilman TOTP: tä';
$PALANG['pUsersMenu_totp'] = 'Muutos TOTP';
$PALANG['pTOTP_welcome'] = 'Aseta aikapohjainen One-time Password';
$PALANG['pUsersMain_totp'] = 'Aseta aikapohjainen One-time Password';
$PALANG['pTOTP_secret'] = 'Totp salaisuus';
$PALANG['pTOTP_code'] = 'TOTP-koodi';
$PALANG['pTOTP_secret_result_error'] = 'Ei voi muuttaa salaisuutta';
$PALANG['change_TOTP'] = 'Muuta TOTP-asetuksia';
$PALANG['pTOTP_code_mismatch'] = 'Väärä kertakäyttöinen salasana';
$PALANG['pTOTP_qr'] = 'TOTP QR-koodi';
$PALANG['pTOTP_confirm'] = 'Vahvista kirjautumisesi tarjoamalla nykyisen TOTP-koodisi.';
$PALANG['pTotp_failed'] = 'Syötetty koodi ei ole voimassa. Käytä nykyistä koodia.';
$PALANG['pTotp_stored'] = 'Olet onnistuneesti vahvistanut uuden TotP-salaisuutesi.';
$PALANG['pTotp_exceptions_welcome'] = 'Lisää TOPT-vapaa osoite';
$PALANG['pTotp_exceptions_user'] = 'Käyttäjänimi (tai domain for admins)';
$PALANG['pTotp_exceptions_add'] = 'Lisä poikkeus';
$PALANG['pTotp_exceptions_address'] = 'IP-osoite';
$PALANG['pTotp_exceptions_description'] = 'Kuvaus';
$PALANG['pTotp_exceptions_list'] = 'olemassa olevia poikkeuksia';
$PALANG['pTotp_exceptions_revoke'] = 'peruutus';
$PALANG['pTotp_exceptions_revoked'] = 'Poikkeus peruutettu';
$PALANG['pTotp_exception_result_success'] = 'Poikkeus lisätty';
$PALANG['pTotp_exception_result_error'] = 'Poikkeusta ei voi lisätä';
$PALANG['pEdit_totp_exception_result_error'] = 'TOTP-poikkeuksia ei voi muuttaa';
$PALANG['pException_ip_empty_error'] = 'IP ei voi olla tyhjä';
$PALANG['pException_desc_empty_error'] = 'Kuvaus ei voi olla tyhjä';
$PALANG['pException_user_entire_domain_error'] = 'Vain annokset voivat lisätä poikkeuksia koko verkkotunnukselle.';
$PALANG['pException_user_global_error'] = 'Vain superadminit voivat lisätä maailmanlaajuisia poikkeuksia';
$PALANG['pUsersMain_app_passwords'] = 'Aseta peruutettavia sovellusssalasanoja, joilla on alennetut etuoikeudet';
$PALANG['pApp_passwords_list'] = 'Nykyiset sovellusssalasanat';
$PALANG['pApp_password_revoked'] = 'Poikkeus peruutettu';
$PALANG['pApp_passwords_welcome'] = 'Lisää sovelluksen salasana';
$PALANG['pAppPassAdd_result_success'] = 'Lisätään sovelluksen salasana';
$PALANG['pAppPassAdd_pass_empty_error'] = 'Password ei voi olla tyhjä';
$PALANG['pAppPassAdd_result_error'] = 'Ei voi lisätä salasanaa';
$PALANG['MFA_submit'] = 'Vahvista logiikka';
$PALANG['pViewlog_action_add_totp_exception'] = 'Lisää TOTP-poikkeus';
$PALANG['pViewlog_action_delete_totp_exception'] = 'Poikkeuksen poistaminen';
$PALANG['pViewlog_action_add_app_password'] = 'Lisää sovelluksen salasana';
$PALANG['mailbox_postapppassword_failed'] = 'Postilaatikko postapppassword script epäonnistui, tarkista virheloki yksityiskohtiin!';
$PALANG['mailbox_post_totp_exception_delete_failed'] = 'Postilaatikkopoikkeuspoikkeus poistettu käsikirjoitus epäonnistui, tarkista virheloki yksityiskohtiin!';
$PALANG['mailbox_post_totp_exception_add_failed'] = 'Postilaatikkopoikkeuksen lisäosa käsikirjoitus epäonnistui, tarkista virheloki yksityiskohtiin!';
$PALANG['mailbox_post_TOTP_change_failed'] = 'Postilaatikkopostilaatikko totp salainen muutos käsikirjoitus epäonnistui, tarkista virheloki yksityiskohtiin!';
$PALANG['TOTP_already_configured'] = 'TOTP on jo määritetty tälle tilille, haluatko muuttaa salaisuutesi?';
$PALANG['pApp_passwords_add'] = 'Lisää sovelluskohtainen salasana';
$PALANG['please_keep_this_as_last_entry'] = ''; # needed for language-check.sh
/* vim: set expandtab ft=php softtabstop=3 tabstop=3 shiftwidth=3: */

Some files were not shown because too many files have changed in this diff Show More