Merge remote-tracking branch 'svnexport/master'

pull/2/head
David Goodwin 10 years ago
commit c3c12de58e

@ -9,8 +9,8 @@
# Last update:
# $Id$
SVN changes since 3.0 beta1 (2.91)
----------------------------------
Version 3.0 beta2 (2.92) - 2014/10/28 - SVN r1706
-------------------------------------------------
- AliasHandler: don't clean goto field when making alias inactive (bug#316)
- list-virtual: display quota even if $CONF[used_quotas] == NO (bug#307)

6
debian/changelog vendored

@ -1,3 +1,9 @@
postfixadmin (2.92-1) unstable; urgency=low
* New upstream release (effectively beta2 for v3.0)
-- David Goodwin <david@palepurple.co.uk> Wed, 28 Oct 2014 21:02:00 +0100
postfixadmin (2.91-1) unstable; urgency=low
* New upstream release (effectively beta for v3.0)

@ -32,11 +32,18 @@ if ( !preg_match('/^[a-z]+$/', $table) || !file_exists("model/$handlerclass.php"
die ("Invalid table name given!");
}
$handler = new $handlerclass(0, $username);
$is_admin = authentication_has_role('admin');
$handler = new $handlerclass(0, $username, $is_admin);
$formconf = $handler->webformConfig();
authentication_require_role($formconf['required_role']);
if ($is_admin) {
authentication_require_role($formconf['required_role']);
} else {
if (empty($formconf['user_hardcoded_field'])) {
die($handlerclass . ' is not available for users');
}
}
if ($handler->init($id)) { # errors will be displayed as last step anyway, no need for duplicated code ;-)
$handler->delete();

@ -39,11 +39,18 @@ $edit = safepost('edit', safeget('edit'));
$new = 0;
if ($edit == "") $new = 1;
$handler = new $handlerclass($new, $username);
$is_admin = authentication_has_role('admin');
$handler = new $handlerclass($new, $username, $is_admin);
$formconf = $handler->webformConfig();
authentication_require_role($formconf['required_role']);
if ($is_admin) {
authentication_require_role($formconf['required_role']);
} else {
if (empty($formconf['user_hardcoded_field'])) {
die($handlerclass . ' is not available for users');
}
}
if ($new == 0 || $formconf['early_init']) {
if (!$handler->init($edit)) {

@ -15,7 +15,7 @@
* Contains re-usable code.
*/
$version = '2.91';
$version = '2.92';
/**
* check_session
@ -385,13 +385,23 @@ function safesession ($param, $default="") {
* @param String PALANG_desc
* @param any optional $default
* @param array optional $options
* @param int $not_in_db
* @param int or $not_in_db - if array, can contain the remaining parameters as associated array
* @param ...
* @return array for $struct
*/
function pacol($allow_editing, $display_in_form, $display_in_list, $type, $PALANG_label, $PALANG_desc, $default = "", $options = array(), $not_in_db=0, $dont_write_to_db=0, $select="", $extrafrom="") {
function pacol($allow_editing, $display_in_form, $display_in_list, $type, $PALANG_label, $PALANG_desc, $default = "", $options = array(), $multiopt=0, $dont_write_to_db=0, $select="", $extrafrom="", $linkto="") {
if ($PALANG_label != '') $PALANG_label = Config::lang($PALANG_label);
if ($PALANG_desc != '') $PALANG_desc = Config::lang($PALANG_desc );
if (is_array($multiopt)) { # remaining parameters provided in named array
$not_in_db = 0; # keep default value
foreach ($multiopt as $key => $value) {
$$key = $value; # extract everything to the matching variable
}
} else {
$not_in_db = $multiopt;
}
return array(
'editable' => $allow_editing,
'display_in_form' => $display_in_form,
@ -405,6 +415,7 @@ function pacol($allow_editing, $display_in_form, $display_in_list, $type, $PALAN
'dont_write_to_db' => $dont_write_to_db,
'select' => $select, # replaces the field name after SELECT
'extrafrom' => $extrafrom, # added after FROM xy - useful for JOINs etc.
'linkto' => $linkto, # make the value a link - %s will be replaced with the ID
);
}
@ -1302,6 +1313,34 @@ function db_get_boolean($bool) {
}
}
/**
* Returns a query that reports the used quota ("x / y")
* @param string column containing used quota
* @param string column containing allowed quota
* @param string column that will contain "x / y"
* @return string
*/
function db_quota_text($count, $quota, $fieldname) {
return " CASE $quota
WHEN '-1' THEN coalesce($count,0)
ELSE CONCAT(coalesce($count,0), ' / ', $quota)
END AS $fieldname";
}
/**
* Returns a query that reports the used quota ("x / y")
* @param string column containing used quota
* @param string column containing allowed quota
* @param string column that will contain "x / y"
* @return string
*/
function db_quota_percent($count, $quota, $fieldname) {
return " CASE $quota
WHEN '-1' THEN -1
ELSE round(100 * coalesce($count,0) / $quota)
END AS $fieldname";
}
/**
* returns true if PostgreSQL is used, false otherwise
*/
@ -1578,21 +1617,54 @@ function db_in_clause($field, $values) {
* Call: db_where_clause (array $conditions, array $struct)
* param array $conditios: array('field' => 'value', 'field2' => 'value2, ...)
* param array $struct - field structure, used for automatic bool conversion
* param string $additional_raw_where - raw sniplet to include in the WHERE part - typically needs to start with AND
* param array $searchmode - operators to use (=, <, > etc.) - defaults to = if not specified for a field (see
* $allowed_operators for available operators)
*/
function db_where_clause($condition, $struct) {
function db_where_clause($condition, $struct, $additional_raw_where = '', $searchmode = array()) {
if (!is_array($condition)) {
die('db_where_cond: parameter $cond is not an array!');
} elseif(!is_array($searchmode)) {
die('db_where_cond: parameter $searchmode is not an array!');
} elseif (count($condition) == 0) {
die("db_where_cond: parameter is an empty array!"); # die() might sound harsh, but can prevent information leaks
} elseif(!is_array($struct)) {
die('db_where_cond: parameter $struct is not an array!');
}
$allowed_operators = explode(' ', '< > >= <= = != <> CONT LIKE');
$where_parts = array();
$having_parts = array();
foreach($condition as $field => $value) {
if (isset($struct[$field]) && $struct[$field]['type'] == 'bool') $value = db_get_boolean($value);
$parts[] = "$field='" . escape_string($value) . "'";
$operator = '=';
if (isset($searchmode[$field])) {
if (in_array($searchmode[$field], $allowed_operators)) {
$operator = $searchmode[$field];
if ($operator == 'CONT') { # CONT - as in "contains"
$operator = ' LIKE '; # add spaces
$value = '%' . $value . '%';
} elseif ($operator == 'LIKE') { # LIKE -without adding % wildcards (the search value can contain %)
$operator = ' LIKE '; # add spaces
}
} else {
die('db_where_clause: Invalid searchmode for ' . $field);
}
}
$querypart = $field . $operator . "'" . escape_string($value) . "'";
if($struct[$field]['select'] != '') {
$having_parts[$field] = $querypart;
} else {
$where_parts[$field] = $querypart;
}
}
$query = " WHERE ( " . join(" AND ", $parts) . " ) ";
$query = ' WHERE 1=1 ';
$query .= " $additional_raw_where ";
if (count($where_parts) > 0) $query .= " AND ( " . join(" AND ", $where_parts) . " ) ";
if (count($having_parts) > 0) $query .= " HAVING ( " . join(" AND ", $having_parts) . " ) ";
return $query;
}

@ -15,16 +15,20 @@ $PALANG['cancel'] = 'Отказ';
$PALANG['save'] = 'Запази'; # XXX Text change: "Save" -> "Save Changes"
$PALANG['confirm'] = 'Сигурни ли сте, че желаете да изтрието това?\n';
$PALANG['confirm_domain'] = 'Наистина ли искате да изтриете всички записи за този домейн? Това действие е необратимо!\n';
$PALANG['no_delete_permissions'] = 'You are not allowed to delete %s!'; # XXX
$PALANG['check_update'] = 'Check for update';
$PALANG['invalid_parameter'] = 'Невалиден параметър!'; # XXX
$PALANG['show'] = 'Show:'; # XXX
$PALANG['all'] = 'All'; # XXX
$PALANG['created'] = 'Created'; # XXX
$PALANG['unknown'] = 'unknown'; # XXX
$PALANG['download_csv'] = 'Download this list as CSV file'; # XXX
$PALANG['missing_field'] = 'Field %s is missing'; # XXX
$PALANG['must_be_numeric'] = '%s must be numeric'; # XXX
$PALANG['must_be_boolean'] = '%s must be boolean'; # XXX
$PALANG['invalid_value_given'] = 'Invalid value given for %s'; # XXX
$PALANG['edit_not_allowed'] = 'You are not allowed to edit %s'; # XXX
$PALANG['searchparams'] = 'Search parameters:'; # XXX
$PALANG['pFooter_logged_as'] = 'Потребител %s'; # XXX # XXX Text change: 'logged in as %s' (the 'in' was missing)
$PALANG['pLogin_welcome'] = 'Администратора може да се логне оттук за администриране на домейн.';

@ -14,16 +14,20 @@ $PALANG['cancel'] = 'Cancel'; # XXX
$PALANG['save'] = 'Save changes'; # XXX
$PALANG['confirm'] = '¿Segur que vols esborrar-lo?\n';
$PALANG['confirm_domain'] = 'Estas segur que vols borrar tots els registres d\'aquest domini? Això no podrà ser desfet!\n';
$PALANG['no_delete_permissions'] = 'You are not allowed to delete %s!'; # XXX
$PALANG['check_update'] = 'Check for update';
$PALANG['invalid_parameter'] = 'Invalid parameter!'; # XXX
$PALANG['show'] = 'Show:'; # XXX
$PALANG['all'] = 'All'; # XXX
$PALANG['created'] = 'Created'; # XXX
$PALANG['unknown'] = 'unknown'; # XXX
$PALANG['download_csv'] = 'Download this list as CSV file'; # XXX
$PALANG['missing_field'] = 'Field %s is missing'; # XXX
$PALANG['must_be_numeric'] = '%s must be numeric'; # XXX
$PALANG['must_be_boolean'] = '%s must be boolean'; # XXX
$PALANG['invalid_value_given'] = 'Invalid value given for %s'; # XXX
$PALANG['edit_not_allowed'] = 'You are not allowed to edit %s'; # XXX
$PALANG['searchparams'] = 'Search parameters:'; # XXX
$PALANG['pFooter_logged_as'] = 'Logged as %s'; # XXX # XXX Text change: 'logged in as %s' (the 'in' was missing)
$PALANG['pLogin_welcome'] = 'Login d\'administrador per l\'administració de dominis.';

@ -14,16 +14,20 @@ $PALANG['cancel'] = 'Cancel'; # XXX
$PALANG['save'] = 'Save changes'; # XXX
$PALANG['confirm'] = '是否确定删除?\n';
$PALANG['confirm_domain'] = '你是否确定要删除该域中的所有记录? 删除后不可恢复!\n';
$PALANG['no_delete_permissions'] = 'You are not allowed to delete %s!'; # XXX
$PALANG['check_update'] = '检查新版本';
$PALANG['invalid_parameter'] = 'Invalid parameter!'; # XXX
$PALANG['show'] = 'Show:'; # XXX
$PALANG['all'] = 'All'; # XXX
$PALANG['created'] = 'Created'; # XXX
$PALANG['unknown'] = 'unknown'; # XXX
$PALANG['download_csv'] = 'Download this list as CSV file'; # XXX
$PALANG['missing_field'] = 'Field %s is missing'; # XXX
$PALANG['must_be_numeric'] = '%s must be numeric'; # XXX
$PALANG['must_be_boolean'] = '%s must be boolean'; # XXX
$PALANG['invalid_value_given'] = 'Invalid value given for %s'; # XXX
$PALANG['edit_not_allowed'] = 'You are not allowed to edit %s'; # XXX
$PALANG['searchparams'] = 'Search parameters:'; # XXX
$PALANG['pFooter_logged_as'] = 'Logged as %s'; # XXX # XXX Text change: 'logged in as %s' (the 'in' was missing)
$PALANG['pLogin_welcome'] = '邮件管理员请从这里登录以管理你的域名.';

@ -18,16 +18,20 @@ $PALANG['cancel'] = 'Zrušit';
$PALANG['save'] = 'Uložit'; # XXX Text change: "Save" -> "Save changes"
$PALANG['confirm'] = 'Jste si jistí?\n';
$PALANG['confirm_domain'] = 'Opravdu chcete smazat všechny záznamy v této doméně Tohle nelze vrátit!\n';
$PALANG['no_delete_permissions'] = 'You are not allowed to delete %s!'; # XXX
$PALANG['check_update'] = 'Zkontrolovat aktualizace';
$PALANG['invalid_parameter'] = 'Neplatný parametr!';
$PALANG['show'] = 'Show:'; # XXX
$PALANG['all'] = 'All'; # XXX
$PALANG['created'] = 'Created'; # XXX
$PALANG['unknown'] = 'unknown'; # XXX
$PALANG['download_csv'] = 'Download this list as CSV file'; # XXX
$PALANG['missing_field'] = 'Field %s is missing'; # XXX
$PALANG['must_be_numeric'] = '%s must be numeric'; # XXX
$PALANG['must_be_boolean'] = '%s must be boolean'; # XXX
$PALANG['invalid_value_given'] = 'Invalid value given for %s'; # XXX
$PALANG['edit_not_allowed'] = 'You are not allowed to edit %s'; # XXX
$PALANG['searchparams'] = 'Search parameters:'; # XXX
$PALANG['pFooter_logged_as'] = 'Přihlášen jako %s'; # XXX Text change: 'logged in as %s' (the 'in' was missing)

@ -17,16 +17,20 @@ $PALANG['cancel'] = 'Annuller';
$PALANG['save'] = 'Gem'; # XXX Text change: "Save" -> "Save changes"
$PALANG['confirm'] = 'Er du sikker på du vil slette dette?\n';
$PALANG['confirm_domain'] = 'Vil du virkelig slette alle adresser for dette domæne? Dette kan ikke fortrydes!\n';
$PALANG['no_delete_permissions'] = 'You are not allowed to delete %s!'; # XXX
$PALANG['check_update'] = 'Søg efter opdateringer';
$PALANG['invalid_parameter'] = 'Ugyldig parameter.';
$PALANG['show'] = 'Show:'; # XXX
$PALANG['all'] = 'All'; # XXX
$PALANG['created'] = 'Created'; # XXX
$PALANG['unknown'] = 'unknown'; # XXX
$PALANG['download_csv'] = 'Download this list as CSV file'; # XXX
$PALANG['missing_field'] = 'Field %s is missing'; # XXX
$PALANG['must_be_numeric'] = '%s must be numeric'; # XXX
$PALANG['must_be_boolean'] = '%s must be boolean'; # XXX
$PALANG['invalid_value_given'] = 'Invalid value given for %s'; # XXX
$PALANG['edit_not_allowed'] = 'You are not allowed to edit %s'; # XXX
$PALANG['searchparams'] = 'Search parameters:'; # XXX
$PALANG['pFooter_logged_as'] = 'Indlogget som %s'; # XXX Text change: 'logged in as %s' (the 'in' was missing)

@ -15,16 +15,20 @@ $PALANG['cancel'] = 'Abbrechen';
$PALANG['save'] = 'Änderungen speichern';
$PALANG['confirm'] = 'Sind Sie sicher dass Sie das löschen wollen?\n';
$PALANG['confirm_domain'] = 'Wollen Sie wirklich alle Einträge dieser Domain löschen? Dies kann NICHT rückgängig gemacht werden!\n';
$PALANG['no_delete_permissions'] = 'You are not allowed to delete %s!'; # XXX
$PALANG['check_update'] = 'Auf Updates überprüfen';
$PALANG['invalid_parameter'] = 'Ungültiger Parameter!';
$PALANG['show'] = 'Anzeigen:';
$PALANG['all'] = 'Alle';
$PALANG['created'] = 'Erstellt';
$PALANG['unknown'] = 'unbekannt';
$PALANG['download_csv'] = 'Diese Liste als CSV-Datei herunterladen';
$PALANG['missing_field'] = 'Das Feld %s fehlt';
$PALANG['must_be_numeric'] = '%s muss numerisch sein';
$PALANG['must_be_boolean'] = "%s muss ein Bool'scher Wert sein";
$PALANG['invalid_value_given'] = 'Ungültiger Wert für %s angegeben';
$PALANG['edit_not_allowed'] = 'Sie dülrfen %s nicht bearbeiten!';
$PALANG['searchparams'] = 'Suchparameter:';
$PALANG['pFooter_logged_as'] = 'Angemeldet als %s';

@ -15,16 +15,20 @@ $PALANG['cancel'] = 'Cancel';
$PALANG['save'] = 'Save changes';
$PALANG['confirm'] = 'Are you sure you want to delete this?\n';
$PALANG['confirm_domain'] = 'Do you really want to delete all records for this domain? This can not be undone!\n';
$PALANG['no_delete_permissions'] = 'You are not allowed to delete %s!';
$PALANG['check_update'] = 'Check for update';
$PALANG['invalid_parameter'] = 'Invalid parameter!';
$PALANG['show'] = 'Show:';
$PALANG['all'] = 'All';
$PALANG['created'] = 'Created';
$PALANG['unknown'] = 'unknown';
$PALANG['download_csv'] = 'Download this list as CSV file';
$PALANG['missing_field'] = 'Field %s is missing';
$PALANG['must_be_numeric'] = '%s must be numeric';
$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['pFooter_logged_as'] = 'Logged in as %s';

@ -15,16 +15,20 @@ $PALANG['cancel'] = 'Cancelar';
$PALANG['save'] = 'Salvar'; # XXX Text change: "Save" -> "Save changes"
$PALANG['confirm'] = '¿Está seguro de que desea borrarlo?\n';
$PALANG['confirm_domain'] = '¿Está seguro de que desea borrar todos los registros de este dominio? ¡Esto no puede ser deshecho!\n';
$PALANG['no_delete_permissions'] = 'You are not allowed to delete %s!'; # XXX
$PALANG['check_update'] = 'Check for update'; # XXX
$PALANG['invalid_parameter'] = '¡Par&aacute;metro inválido!';
$PALANG['show'] = 'Show:'; # XXX
$PALANG['all'] = 'All'; # XXX
$PALANG['created'] = 'Created'; # XXX
$PALANG['unknown'] = 'unknown'; # XXX
$PALANG['download_csv'] = 'Download this list as CSV file'; # XXX
$PALANG['missing_field'] = 'Field %s is missing'; # XXX
$PALANG['must_be_numeric'] = '%s must be numeric'; # XXX
$PALANG['must_be_boolean'] = '%s must be boolean'; # XXX
$PALANG['invalid_value_given'] = 'Invalid value given for %s'; # XXX
$PALANG['edit_not_allowed'] = 'You are not allowed to edit %s'; # XXX
$PALANG['searchparams'] = 'Search parameters:'; # XXX
$PALANG['pFooter_logged_as'] = 'Autenticado como %s'; # XXX Text change: 'logged in as %s' (the 'in' was missing)
$PALANG['pLogin_welcome'] = 'Login de administrador para administración de dominios.';

@ -14,16 +14,20 @@ $PALANG['cancel'] = 'Cancel'; # XXX
$PALANG['save'] = 'Save changes'; # XXX
$PALANG['confirm'] = 'Oled kindel, et soovid seda kustutada?\n';
$PALANG['confirm_domain'] = 'Oled tõesti kindel, et tahad kustutada kõik kirjed sellele domeenile? Seda tegevust ei saa tagasi võtta!\n';
$PALANG['no_delete_permissions'] = 'You are not allowed to delete %s!'; # XXX
$PALANG['check_update'] = 'Check for update'; # XXX
$PALANG['invalid_parameter'] = 'Invalid parameter!'; # XXX
$PALANG['show'] = 'Show:'; # XXX
$PALANG['all'] = 'All'; # XXX
$PALANG['created'] = 'Created'; # XXX
$PALANG['unknown'] = 'unknown'; # XXX
$PALANG['download_csv'] = 'Download this list as CSV file'; # XXX
$PALANG['missing_field'] = 'Field %s is missing'; # XXX
$PALANG['must_be_numeric'] = '%s must be numeric'; # XXX
$PALANG['must_be_boolean'] = '%s must be boolean'; # XXX
$PALANG['invalid_value_given'] = 'Invalid value given for %s'; # XXX
$PALANG['edit_not_allowed'] = 'You are not allowed to edit %s'; # XXX
$PALANG['searchparams'] = 'Search parameters:'; # XXX
$PALANG['pFooter_logged_as'] = 'Logged as %s'; # XXX # XXX Text change: 'logged in as %s' (the 'in' was missing)
$PALANG['pLogin_welcome'] = 'E-posti haldaja, logi siit domeeni administreerimiseks sisse.';

@ -14,16 +14,20 @@ $PALANG['cancel'] = 'Cancel'; # XXX
$PALANG['save'] = 'Save changes'; # XXX
$PALANG['confirm'] = 'Ziur al zaude ezabatu nahi duzula?\n';
$PALANG['confirm_domain'] = 'Ziur al zaude domeinu honetako erregistro guztiak ezbatu nahi dituzula? Hau ezin izango da desegin!\n';
$PALANG['no_delete_permissions'] = 'You are not allowed to delete %s!'; # XXX
$PALANG['check_update'] = 'Check for update';
$PALANG['invalid_parameter'] = 'Invalid parameter!'; # XXX
$PALANG['show'] = 'Show:'; # XXX
$PALANG['all'] = 'All'; # XXX
$PALANG['created'] = 'Created'; # XXX
$PALANG['unknown'] = 'unknown'; # XXX
$PALANG['download_csv'] = 'Download this list as CSV file'; # XXX
$PALANG['missing_field'] = 'Field %s is missing'; # XXX
$PALANG['must_be_numeric'] = '%s must be numeric'; # XXX
$PALANG['must_be_boolean'] = '%s must be boolean'; # XXX
$PALANG['invalid_value_given'] = 'Invalid value given for %s'; # XXX
$PALANG['edit_not_allowed'] = 'You are not allowed to edit %s'; # XXX
$PALANG['searchparams'] = 'Search parameters:'; # XXX
$PALANG['pFooter_logged_as'] = 'Logged as %s'; # XXX # XXX Text change: 'logged in as %s' (the 'in' was missing)
$PALANG['pLogin_welcome'] = 'Kudeatzailearen logina domeinuak kudeatzeko.';

@ -15,16 +15,20 @@ $PALANG['cancel'] = 'Peruuta';
$PALANG['save'] = 'Tallenna'; # XXX Text change: "Save" -> "Save changes"
$PALANG['confirm'] = 'Oletko varma että haluat poistaa tämän?\n';
$PALANG['confirm_domain'] = 'Oletko varma että haluat poistaa kaikki tietueet tästä domainista? Tätä komentoa ei voi perua!\n';
$PALANG['no_delete_permissions'] = 'You are not allowed to delete %s!'; # XXX
$PALANG['check_update'] = 'Tarkista päivitykset';
$PALANG['invalid_parameter'] = 'Viallinen parametri!';
$PALANG['show'] = 'Show:'; # XXX
$PALANG['all'] = 'All'; # XXX
$PALANG['created'] = 'Created'; # XXX
$PALANG['unknown'] = 'unknown'; # XXX
$PALANG['download_csv'] = 'Download this list as CSV file'; # XXX
$PALANG['missing_field'] = 'Field %s is missing'; # XXX
$PALANG['must_be_numeric'] = '%s must be numeric'; # XXX
$PALANG['must_be_boolean'] = '%s must be boolean'; # XXX
$PALANG['invalid_value_given'] = 'Invalid value given for %s'; # XXX
$PALANG['edit_not_allowed'] = 'You are not allowed to edit %s'; # XXX
$PALANG['searchparams'] = 'Search parameters:'; # XXX
$PALANG['pFooter_logged_as'] = 'Kirjautunut sisään tunnuksella %s'; # XXX Text change: 'logged in as %s' (the 'in' was missing)
$PALANG['pLogin_welcome'] = 'Kirjautuminen';

@ -14,16 +14,20 @@ $PALANG['cancel'] = 'Cancel'; # XXX
$PALANG['save'] = 'Save changes'; # XXX
$PALANG['confirm'] = 'Ert tú vís(ur) í at tú vilt strika hetta?\n';
$PALANG['confirm_domain'] = 'Vilt tú veruliga strika allar upplýsingar fyri hetta navnaøki? Her kann ikki vendast aftur!\n';
$PALANG['no_delete_permissions'] = 'You are not allowed to delete %s!'; # XXX
$PALANG['check_update'] = 'Check for update'; # XXX
$PALANG['invalid_parameter'] = 'Invalid parameter!'; # XXX
$PALANG['show'] = 'Show:'; # XXX
$PALANG['all'] = 'All'; # XXX
$PALANG['created'] = 'Created'; # XXX
$PALANG['unknown'] = 'unknown'; # XXX
$PALANG['download_csv'] = 'Download this list as CSV file'; # XXX
$PALANG['missing_field'] = 'Field %s is missing'; # XXX
$PALANG['must_be_numeric'] = '%s must be numeric'; # XXX
$PALANG['must_be_boolean'] = '%s must be boolean'; # XXX
$PALANG['invalid_value_given'] = 'Invalid value given for %s'; # XXX
$PALANG['edit_not_allowed'] = 'You are not allowed to edit %s'; # XXX
$PALANG['searchparams'] = 'Search parameters:'; # XXX
$PALANG['pFooter_logged_as'] = 'Logged as %s'; # XXX # XXX Text change: 'logged in as %s' (the 'in' was missing)
$PALANG['pLogin_welcome'] = 'Umsitarar kunnu logga inn her fyri at umsita tykkara navnaøki.';

@ -16,16 +16,20 @@ $PALANG['cancel'] = 'Annuler';
$PALANG['save'] = 'Enregistrer les modifications';
$PALANG['confirm'] = 'Etes vous sur de vouloir supprimer cet enregistrement\n';
$PALANG['confirm_domain'] = 'Etes-vous sur de vouloir effacer tous les enregistrements dans ce domaine ? Cette opération ne pourra pas être annulée.\n';
$PALANG['no_delete_permissions'] = 'You are not allowed to delete %s!'; # XXX
$PALANG['check_update'] = 'Vérifier les mises à jour';
$PALANG['invalid_parameter'] = 'Paramètres invalides!';
$PALANG['show'] = 'Afficher:';
$PALANG['all'] = 'Tous';
$PALANG['created'] = 'Créé';
$PALANG['unknown'] = 'inconnu';
$PALANG['download_csv'] = 'Download this list as CSV file'; # XXX
$PALANG['missing_field'] = 'Le champ %s est manquant';
$PALANG['must_be_numeric'] = '%s doit être numérique';
$PALANG['must_be_boolean'] = '%s doit être booléen';
$PALANG['invalid_value_given'] = 'Valeur incorrecte pour %s';
$PALANG['edit_not_allowed'] = 'You are not allowed to edit %s'; # XXX
$PALANG['searchparams'] = 'Search parameters:'; # XXX
$PALANG['pFooter_logged_as'] = 'Connecté en tant que %s';
$PALANG['pLogin_welcome'] = 'Entrez votre adresse courriel pour administrer votre domaine.';

@ -13,16 +13,20 @@ $PALANG['cancel'] = 'Cancel'; # XXX
$PALANG['save'] = 'Save changes'; # XXX
$PALANG['confirm'] = 'Da li ste sigurni da želite ovo pobrisati?\n';
$PALANG['confirm_domain'] = 'Da li ste sigurni da želite pobrisati sve zapise za tu domenu? Zapisi ce biti zauvijek pobrisani!\n';
$PALANG['no_delete_permissions'] = 'You are not allowed to delete %s!'; # XXX
$PALANG['check_update'] = 'Provjeri da li postoji novija inačica';
$PALANG['invalid_parameter'] = 'Invalid parameter!'; # XXX
$PALANG['show'] = 'Show:'; # XXX
$PALANG['all'] = 'All'; # XXX
$PALANG['created'] = 'Created'; # XXX
$PALANG['unknown'] = 'unknown'; # XXX
$PALANG['download_csv'] = 'Download this list as CSV file'; # XXX
$PALANG['missing_field'] = 'Field %s is missing'; # XXX
$PALANG['must_be_numeric'] = '%s must be numeric'; # XXX
$PALANG['must_be_boolean'] = '%s must be boolean'; # XXX
$PALANG['invalid_value_given'] = 'Invalid value given for %s'; # XXX
$PALANG['edit_not_allowed'] = 'You are not allowed to edit %s'; # XXX
$PALANG['searchparams'] = 'Search parameters:'; # XXX
$PALANG['pFooter_logged_as'] = 'Logged as %s'; # XXX # XXX Text change: 'logged in as %s' (the 'in' was missing)
$PALANG['pLogin_welcome'] = 'Administratori prijavite se ovdje.';

@ -14,16 +14,20 @@ $PALANG['cancel'] = 'Cancel'; # XXX
$PALANG['save'] = 'Save changes'; # XXX
$PALANG['confirm'] = 'Biztos vagy benne hogy törlöd ezt?\n';
$PALANG['confirm_domain'] = 'Biztos hogy törölni akarod az összes bejegyzést ez alól a domain alól? Nem lehet visszahozni késõbb!\n';
$PALANG['no_delete_permissions'] = 'You are not allowed to delete %s!'; # XXX
$PALANG['check_update'] = 'Check for update'; # XXX
$PALANG['invalid_parameter'] = 'Invalid parameter!'; # XXX
$PALANG['show'] = 'Show:'; # XXX
$PALANG['all'] = 'All'; # XXX
$PALANG['created'] = 'Created'; # XXX
$PALANG['unknown'] = 'unknown'; # XXX
$PALANG['download_csv'] = 'Download this list as CSV file'; # XXX
$PALANG['missing_field'] = 'Field %s is missing'; # XXX
$PALANG['must_be_numeric'] = '%s must be numeric'; # XXX
$PALANG['must_be_boolean'] = '%s must be boolean'; # XXX
$PALANG['invalid_value_given'] = 'Invalid value given for %s'; # XXX
$PALANG['edit_not_allowed'] = 'You are not allowed to edit %s'; # XXX
$PALANG['searchparams'] = 'Search parameters:'; # XXX
$PALANG['pFooter_logged_as'] = '%s-ként bejelentkezve'; # XXX Text change: 'logged in as %s' (the 'in' was missing)

@ -14,16 +14,20 @@ $PALANG['cancel'] = 'Cancel'; # XXX
$PALANG['save'] = 'Save changes'; # XXX
$PALANG['confirm'] = 'Ertu viss um að þú viljir eyða þessu?\n';
$PALANG['confirm_domain'] = 'Ertu viss um að þú viljir eyða öllu sem tengist þessu léni? Það er ekki hægt að bakka með aðgerðina!\n';
$PALANG['no_delete_permissions'] = 'You are not allowed to delete %s!'; # XXX
$PALANG['check_update'] = 'Check for update'; # XXX
$PALANG['invalid_parameter'] = 'Invalid parameter!'; # XXX
$PALANG['show'] = 'Show:'; # XXX
$PALANG['all'] = 'All'; # XXX
$PALANG['created'] = 'Created'; # XXX
$PALANG['unknown'] = 'unknown'; # XXX
$PALANG['download_csv'] = 'Download this list as CSV file'; # XXX
$PALANG['missing_field'] = 'Field %s is missing'; # XXX
$PALANG['must_be_numeric'] = '%s must be numeric'; # XXX
$PALANG['must_be_boolean'] = '%s must be boolean'; # XXX
$PALANG['invalid_value_given'] = 'Invalid value given for %s'; # XXX
$PALANG['edit_not_allowed'] = 'You are not allowed to edit %s'; # XXX
$PALANG['searchparams'] = 'Search parameters:'; # XXX
$PALANG['pFooter_logged_as'] = 'Logged as %s'; # XXX # XXX Text change: 'logged in as %s' (the 'in' was missing)
$PALANG['pLogin_welcome'] = 'Póst kerfisstjóri tengist hér til að viðhalda póstkerfi lénsins þins.';

@ -15,16 +15,20 @@ $PALANG['cancel'] = 'Annulla';
$PALANG['save'] = 'registra'; # XXX Text change: "Save" -> "Save changes"
$PALANG['confirm'] = 'Sei certo di volerlo cancellare?\n';
$PALANG['confirm_domain'] = 'Sei sicuro di voler cancellare tutti gli indirizzi di questo dominio? Questa modifica sarà permanente!\n';
$PALANG['no_delete_permissions'] = 'You are not allowed to delete %s!'; # XXX
$PALANG['check_update'] = 'Verifica gli aggiornamenti';
$PALANG['invalid_parameter'] = 'Parametro non valido!';
$PALANG['show'] = 'Show:'; # XXX
$PALANG['all'] = 'All'; # XXX
$PALANG['created'] = 'Created'; # XXX
$PALANG['unknown'] = 'unknown'; # XXX
$PALANG['download_csv'] = 'Download this list as CSV file'; # XXX
$PALANG['missing_field'] = 'Field %s is missing'; # XXX
$PALANG['must_be_numeric'] = '%s must be numeric'; # XXX
$PALANG['must_be_boolean'] = '%s must be boolean'; # XXX
$PALANG['invalid_value_given'] = 'Invalid value given for %s'; # XXX
$PALANG['edit_not_allowed'] = 'You are not allowed to edit %s'; # XXX
$PALANG['searchparams'] = 'Search parameters:'; # XXX
$PALANG['pFooter_logged_as'] = 'Collegato come %s'; # XXX Text change: 'logged in as %s' (the 'in' was missing)
$PALANG['pLogin_welcome'] = 'Gli amministratori di posta devono effettuare il login qui per amministrare il proprio dominio.';

@ -15,16 +15,20 @@ $PALANG['cancel'] = 'キャンセル';
$PALANG['save'] = '変更を保存';
$PALANG['confirm'] = '本当に削除してもよろしいですか?\n';
$PALANG['confirm_domain'] = '本当にこのドメインのすべての情報を削除してもよろしいですか?これを元に戻すことはできません。\n';
$PALANG['no_delete_permissions'] = 'You are not allowed to delete %s!'; # XXX
$PALANG['check_update'] = '更新の確認';
$PALANG['invalid_parameter'] = '無効なパラメータです。';
$PALANG['show'] = '閲覧:';
$PALANG['all'] = '全て';
$PALANG['created'] = 'Created'; # XXX
$PALANG['unknown'] = 'unknown'; # XXX
$PALANG['download_csv'] = 'Download this list as CSV file'; # XXX
$PALANG['missing_field'] = 'Field %s is missing'; # XXX
$PALANG['must_be_numeric'] = '%s must be numeric'; # XXX
$PALANG['must_be_boolean'] = '%s must be boolean'; # XXX
$PALANG['invalid_value_given'] = 'Invalid value given for %s'; # XXX
$PALANG['edit_not_allowed'] = 'You are not allowed to edit %s'; # XXX
$PALANG['searchparams'] = 'Search parameters:'; # XXX
$PALANG['pFooter_logged_as'] = 'ログイン名 %s';

@ -14,16 +14,20 @@ $PALANG['cancel'] = 'Atšaukti';
$PALANG['save'] = 'Išsaugoti';
$PALANG['confirm'] = 'Tikrai norite šalinti?\n';
$PALANG['confirm_domain'] = 'Tikrai norite šalinti visus šios srities įrašus? Operacija negrįžtama!\n';
$PALANG['no_delete_permissions'] = 'You are not allowed to delete %s!'; # XXX
$PALANG['check_update'] = 'Patikrinti versiją';
$PALANG['invalid_parameter'] = 'Neteisingas parametras!';
$PALANG['show'] = 'Rodyti:';
$PALANG['all'] = 'Visi';
$PALANG['created'] = 'Sukurta';
$PALANG['unknown'] = 'unknown'; # XXX
$PALANG['download_csv'] = 'Download this list as CSV file'; # XXX
$PALANG['missing_field'] = 'Field %s is missing'; # XXX
$PALANG['must_be_numeric'] = '%s must be numeric'; # XXX
$PALANG['must_be_boolean'] = '%s must be boolean'; # XXX
$PALANG['invalid_value_given'] = 'Invalid value given for %s'; # XXX
$PALANG['edit_not_allowed'] = 'You are not allowed to edit %s'; # XXX
$PALANG['searchparams'] = 'Search parameters:'; # XXX
$PALANG['pFooter_logged_as'] = 'Prisijungęs kaip %s';
$PALANG['pLogin_welcome'] = 'Pašto srities administratorius.';

@ -14,16 +14,20 @@ $PALANG['cancel'] = 'Cancel'; # XXX
$PALANG['save'] = 'Save changes'; # XXX
$PALANG['confirm'] = 'Дали сте сигурни дека сакате да го избришете ова?\n';
$PALANG['confirm_domain'] = 'Дали сакате да ги избришете сите записи од овој домен? Ова не може да се поправи покасно!\n';
$PALANG['no_delete_permissions'] = 'You are not allowed to delete %s!'; # XXX
$PALANG['check_update'] = 'Check for update'; # XXX
$PALANG['invalid_parameter'] = 'Invalid parameter!'; # XXX
$PALANG['show'] = 'Show:'; # XXX
$PALANG['all'] = 'All'; # XXX
$PALANG['created'] = 'Created'; # XXX
$PALANG['unknown'] = 'unknown'; # XXX
$PALANG['download_csv'] = 'Download this list as CSV file'; # XXX
$PALANG['missing_field'] = 'Field %s is missing'; # XXX
$PALANG['must_be_numeric'] = '%s must be numeric'; # XXX
$PALANG['must_be_boolean'] = '%s must be boolean'; # XXX
$PALANG['invalid_value_given'] = 'Invalid value given for %s'; # XXX
$PALANG['edit_not_allowed'] = 'You are not allowed to edit %s'; # XXX
$PALANG['searchparams'] = 'Search parameters:'; # XXX
$PALANG['pFooter_logged_as'] = 'Logged as %s'; # XXX # XXX Text change: 'logged in as %s' (the 'in' was missing)
$PALANG['pLogin_welcome'] = 'Логин за администрирање на домени (Само за администратори!)';

@ -16,16 +16,20 @@ $PALANG['cancel'] = 'Avbryt';
$PALANG['save'] = 'Lagre'; # XXX Text change: "Save" -> "Save changes"
$PALANG['confirm'] = 'Er du sikker på at du ønsker å slette dette?\n';
$PALANG['confirm_domain'] = 'Ønsker du virkelig å slette alle oppføringer for dette domenet? Dette kan ikke angres!\n';
$PALANG['no_delete_permissions'] = 'You are not allowed to delete %s!'; # XXX
$PALANG['check_update'] = 'Se etter oppdatering';
$PALANG['invalid_parameter'] = 'Ugyldig parameter!';
$PALANG['show'] = 'Show:'; # XXX
$PALANG['all'] = 'All'; # XXX
$PALANG['created'] = 'Created'; # XXX
$PALANG['unknown'] = 'unknown'; # XXX
$PALANG['download_csv'] = 'Download this list as CSV file'; # XXX
$PALANG['missing_field'] = 'Field %s is missing'; # XXX
$PALANG['must_be_numeric'] = '%s must be numeric'; # XXX
$PALANG['must_be_boolean'] = '%s must be boolean'; # XXX
$PALANG['invalid_value_given'] = 'Invalid value given for %s'; # XXX
$PALANG['edit_not_allowed'] = 'You are not allowed to edit %s'; # XXX
$PALANG['searchparams'] = 'Search parameters:'; # XXX
$PALANG['pFooter_logged_as'] = 'Logget inn som %s'; # XXX Text change: 'logged in as %s' (the 'in' was missing)
$PALANG['pLogin_welcome'] = 'E-postadministratorer kan logge inn her for å administrere sine domener';

@ -15,16 +15,20 @@ $PALANG['cancel'] = 'Annuleren';
$PALANG['save'] = 'Wijzigingen opslaan';
$PALANG['confirm'] = 'Weet u het zeker dat u wilt verwijderen?\n';
$PALANG['confirm_domain'] = 'Weet u zeker dat u ALLE data van het domein wilt verwijderen? Dit kan niet ongedaan worden gemaakt!\n';
$PALANG['no_delete_permissions'] = 'You are not allowed to delete %s!'; # XXX
$PALANG['check_update'] = 'Zoeken naar nieuwe versie';
$PALANG['invalid_parameter'] = 'ongeldige parameter!';
$PALANG['show'] = 'Toon:';
$PALANG['all'] = 'Alle';
$PALANG['created'] = 'Aangemaakt'; #XXX
$PALANG['unknown'] = 'onbekend'; #XXX
$PALANG['download_csv'] = 'Download this list as CSV file'; # XXX
$PALANG['missing_field'] = 'Veld %s is niet aanwezig'; #XXX
$PALANG['must_be_numeric'] = '%s moet een getal zijn'; #XXX
$PALANG['must_be_boolean'] = '%s moet een boolean zijn'; #XXX
$PALANG['invalid_value_given'] = 'Foutief waarde ingevooerd %s'; # XXX
$PALANG['edit_not_allowed'] = 'You are not allowed to edit %s'; # XXX
$PALANG['searchparams'] = 'Search parameters:'; # XXX
$PALANG['pFooter_logged_as'] = 'aangemeld als %s';
$PALANG['pLogin_welcome'] = 'Mail beheerders log hier in om uw domeinen te beheren.';

@ -14,16 +14,20 @@ $PALANG['cancel'] = 'Cancel'; # XXX
$PALANG['save'] = 'Save changes'; # XXX
$PALANG['confirm'] = 'Vil du slette dette?\n';
$PALANG['confirm_domain'] = 'Vil du virkelig slette alle poster og domenet?\n';
$PALANG['no_delete_permissions'] = 'You are not allowed to delete %s!'; # XXX
$PALANG['check_update'] = 'Se etter oppdatering';
$PALANG['invalid_parameter'] = 'Invalid parameter!'; # XXX
$PALANG['show'] = 'Show:'; # XXX
$PALANG['all'] = 'All'; # XXX
$PALANG['created'] = 'Created'; # XXX
$PALANG['unknown'] = 'unknown'; # XXX
$PALANG['download_csv'] = 'Download this list as CSV file'; # XXX
$PALANG['missing_field'] = 'Field %s is missing'; # XXX
$PALANG['must_be_numeric'] = '%s must be numeric'; # XXX
$PALANG['must_be_boolean'] = '%s must be boolean'; # XXX
$PALANG['invalid_value_given'] = 'Invalid value given for %s'; # XXX
$PALANG['edit_not_allowed'] = 'You are not allowed to edit %s'; # XXX
$PALANG['searchparams'] = 'Search parameters:'; # XXX
$PALANG['pFooter_logged_as'] = 'Logged as %s'; # XXX # XXX Text change: 'logged in as %s' (the 'in' was missing)
$PALANG['pLogin_welcome'] = 'Postadministrator; Logg inn her for å administrere ditt domene';

@ -17,16 +17,20 @@ $PALANG['cancel'] = 'Anuluj';
$PALANG['save'] = 'Zapisz'; # XXX Text change: "Save" -> "Save changes"
$PALANG['confirm'] = 'Jesteś przekonany, że chcesz to usunąć?\n';
$PALANG['confirm_domain'] = 'Czy rzeczywiście chcesz usunąć wszystkie wpisy dla tej domeny? To jest proces nieodwracalny!\n';
$PALANG['no_delete_permissions'] = 'You are not allowed to delete %s!'; # XXX
$PALANG['check_update'] = 'Sprawdź aktualizację';
$PALANG['invalid_parameter'] = 'Błędny parametr!';
$PALANG['show'] = 'Show:'; # XXX
$PALANG['all'] = 'All'; # XXX
$PALANG['created'] = 'Created'; # XXX
$PALANG['unknown'] = 'unknown'; # XXX
$PALANG['download_csv'] = 'Download this list as CSV file'; # XXX
$PALANG['missing_field'] = 'Field %s is missing'; # XXX
$PALANG['must_be_numeric'] = '%s must be numeric'; # XXX
$PALANG['must_be_boolean'] = '%s must be boolean'; # XXX
$PALANG['invalid_value_given'] = 'Invalid value given for %s'; # XXX
$PALANG['edit_not_allowed'] = 'You are not allowed to edit %s'; # XXX
$PALANG['searchparams'] = 'Search parameters:'; # XXX
$PALANG['pFooter_logged_as'] = 'Zalogowano jako %s'; # XXX Text change: 'logged in as %s' (the 'in' was missing)
$PALANG['pLogin_welcome'] = 'Sekcja przeznaczona dla administratorów domen.';

@ -15,16 +15,20 @@ $PALANG['cancel'] = 'Cancelar';
$PALANG['save'] = 'Gravar'; # XXX Text change: "Save" -> "Save changes"
$PALANG['confirm'] = 'Tem certeza de que deseja remover?\n';
$PALANG['confirm_domain'] = 'Tem certeza de que deseja remover todos os registros deste domínio? Essa ação não pode ser desfeita!\n';
$PALANG['no_delete_permissions'] = 'You are not allowed to delete %s!'; # XXX
$PALANG['check_update'] = 'Checar por atualização';
$PALANG['invalid_parameter'] = 'Parâmetro inválido!';
$PALANG['show'] = 'Show:'; # XXX
$PALANG['all'] = 'All'; # XXX
$PALANG['created'] = 'Created'; # XXX
$PALANG['unknown'] = 'unknown'; # XXX
$PALANG['download_csv'] = 'Download this list as CSV file'; # XXX
$PALANG['missing_field'] = 'Field %s is missing'; # XXX
$PALANG['must_be_numeric'] = '%s must be numeric'; # XXX
$PALANG['must_be_boolean'] = '%s must be boolean'; # XXX
$PALANG['invalid_value_given'] = 'Invalid value given for %s'; # XXX
$PALANG['edit_not_allowed'] = 'You are not allowed to edit %s'; # XXX
$PALANG['searchparams'] = 'Search parameters:'; # XXX
$PALANG['pFooter_logged_as'] = 'Autenticado como %s'; # XXX Text change: 'logged in as %s' (the 'in' was missing)

@ -16,16 +16,20 @@ $PALANG['cancel'] = 'Отменить';
$PALANG['save'] = 'Сохранить изменения';
$PALANG['confirm'] = 'Вы уверены, что хотите удалить это?\n';
$PALANG['confirm_domain'] = 'Вы действительно хотите удалить все настройки для домена? Это действие нельзя будет отменить!\n';
$PALANG['no_delete_permissions'] = 'You are not allowed to delete %s!'; # XXX
$PALANG['check_update'] = 'Проверить обновление';
$PALANG['invalid_parameter'] = 'Некорректный параметр!';
$PALANG['show'] = 'Показать:';
$PALANG['all'] = 'Все';
$PALANG['created'] = 'Created'; # XXX
$PALANG['unknown'] = 'unknown'; # XXX
$PALANG['download_csv'] = 'Download this list as CSV file'; # XXX
$PALANG['missing_field'] = 'Field %s is missing'; # XXX
$PALANG['must_be_numeric'] = '%s must be numeric'; # XXX
$PALANG['must_be_boolean'] = '%s must be boolean'; # XXX
$PALANG['invalid_value_given'] = 'Invalid value given for %s'; # XXX
$PALANG['edit_not_allowed'] = 'You are not allowed to edit %s'; # XXX
$PALANG['searchparams'] = 'Search parameters:'; # XXX
$PALANG['pFooter_logged_as'] = 'Вошли как %s';

@ -15,16 +15,20 @@ $PALANG['cancel'] = 'Zrušiť';
$PALANG['save'] = 'Uložiť'; # XXX Text change: "Save" -> "Save changes"
$PALANG['confirm'] = 'Ste si istí?\n';
$PALANG['confirm_domain'] = 'Naozaj chcete zmazať všetky záznamy v tejto doméne? Toto nie je možné vrátiť!\n';
$PALANG['no_delete_permissions'] = 'You are not allowed to delete %s!'; # XXX
$PALANG['check_update'] = 'Skontrolovať aktualizácie';
$PALANG['invalid_parameter'] = 'Neplatný parameter!';
$PALANG['show'] = 'Show:'; # XXX
$PALANG['all'] = 'All'; # XXX
$PALANG['created'] = 'Created'; # XXX
$PALANG['unknown'] = 'unknown'; # XXX
$PALANG['download_csv'] = 'Download this list as CSV file'; # XXX
$PALANG['missing_field'] = 'Field %s is missing'; # XXX
$PALANG['must_be_numeric'] = '%s must be numeric'; # XXX
$PALANG['must_be_boolean'] = '%s must be boolean'; # XXX
$PALANG['invalid_value_given'] = 'Invalid value given for %s'; # XXX
$PALANG['edit_not_allowed'] = 'You are not allowed to edit %s'; # XXX
$PALANG['searchparams'] = 'Search parameters:'; # XXX
$PALANG['pFooter_logged_as'] = 'Prihlásený ako %s'; # XXX Text change: 'logged in as %s' (the 'in' was missing)
$PALANG['pLogin_welcome'] = 'Prihlásenie administrátorov pre správu domén';

@ -14,16 +14,20 @@ $PALANG['cancel'] = 'Cancel'; # XXX
$PALANG['save'] = 'Save'; # XXX # XXX Text change: "Save" -> "Save changes"
$PALANG['confirm'] = 'Ali ste prepričani, da želite brisati?\n';
$PALANG['confirm_domain'] = 'Ali ste prepričani, da želite brisati vse zapise za to domeno? Zapisi bodo izgubljeni za vedno!\n';
$PALANG['no_delete_permissions'] = 'You are not allowed to delete %s!'; # XXX
$PALANG['check_update'] = 'Preveri, če obstaja novejša različica';
$PALANG['invalid_parameter'] = 'Invalid parameter!'; # XXX
$PALANG['show'] = 'Show:'; # XXX
$PALANG['all'] = 'All'; # XXX
$PALANG['created'] = 'Created'; # XXX
$PALANG['unknown'] = 'unknown'; # XXX
$PALANG['download_csv'] = 'Download this list as CSV file'; # XXX
$PALANG['missing_field'] = 'Field %s is missing'; # XXX
$PALANG['must_be_numeric'] = '%s must be numeric'; # XXX
$PALANG['must_be_boolean'] = '%s must be boolean'; # XXX
$PALANG['invalid_value_given'] = 'Invalid value given for %s'; # XXX
$PALANG['edit_not_allowed'] = 'You are not allowed to edit %s'; # XXX
$PALANG['searchparams'] = 'Search parameters:'; # XXX
$PALANG['pFooter_logged_as'] = 'Logged as %s'; # XXX # XXX Text change: 'logged in as %s' (the 'in' was missing)
$PALANG['pLogin_welcome'] = 'Administratorji se prijavite tukaj.';

@ -16,16 +16,20 @@ $PALANG['cancel'] = 'Avbryt';
$PALANG['save'] = 'Spara'; # XXX Text change: "Save" -> "Save changes"
$PALANG['confirm'] = 'Är du säker på att du vill radera denna?\n';
$PALANG['confirm_domain'] = 'Vill du verkligen radera all data för denna domän? Kan ej ångras!\n';
$PALANG['no_delete_permissions'] = 'You are not allowed to delete %s!'; # XXX
$PALANG['check_update'] = 'Senaste versionen?';
$PALANG['invalid_parameter'] = 'Felaktig parameter!';
$PALANG['show'] = 'Show:'; # XXX
$PALANG['all'] = 'All'; # XXX
$PALANG['created'] = 'Created'; # XXX
$PALANG['unknown'] = 'unknown'; # XXX
$PALANG['download_csv'] = 'Download this list as CSV file'; # XXX
$PALANG['missing_field'] = 'Field %s is missing'; # XXX
$PALANG['must_be_numeric'] = '%s must be numeric'; # XXX
$PALANG['must_be_boolean'] = '%s must be boolean'; # XXX
$PALANG['invalid_value_given'] = 'Invalid value given for %s'; # XXX
$PALANG['edit_not_allowed'] = 'You are not allowed to edit %s'; # XXX
$PALANG['searchparams'] = 'Search parameters:'; # XXX
$PALANG['pFooter_logged_as'] = 'Inloggad som %s'; # XXX Text change: 'logged in as %s' (the 'in' was missing)
$PALANG['pLogin_welcome'] = 'Mail administratörer loggar in här för att sköta er domän.';

@ -14,16 +14,20 @@ $PALANG['cancel'] = 'Cancel'; # XXX
$PALANG['save'] = 'Save changes'; # XXX
$PALANG['confirm'] = 'Bunu silmek istediðinizden emin misiniz?\n';
$PALANG['confirm_domain'] = 'Bu domain için tüm kayýtlarý silmek istediðinizden emin misiniz? Bu iþlem geri alýnamaz!\n';
$PALANG['no_delete_permissions'] = 'You are not allowed to delete %s!'; # XXX
$PALANG['check_update'] = 'Check for update'; # XXX
$PALANG['invalid_parameter'] = 'Invalid parameter!'; # XXX
$PALANG['show'] = 'Show:'; # XXX
$PALANG['all'] = 'All'; # XXX
$PALANG['created'] = 'Created'; # XXX
$PALANG['unknown'] = 'unknown'; # XXX
$PALANG['download_csv'] = 'Download this list as CSV file'; # XXX
$PALANG['missing_field'] = 'Field %s is missing'; # XXX
$PALANG['must_be_numeric'] = '%s must be numeric'; # XXX
$PALANG['must_be_boolean'] = '%s must be boolean'; # XXX
$PALANG['invalid_value_given'] = 'Invalid value given for %s'; # XXX
$PALANG['edit_not_allowed'] = 'You are not allowed to edit %s'; # XXX
$PALANG['searchparams'] = 'Search parameters:'; # XXX
$PALANG['pFooter_logged_as'] = 'Logged in as %s'; # XXX
$PALANG['pLogin_welcome'] = 'Posta Yöneticileri buradan domainlerinizi yönetmek için giriþ yapabilirsiniz.';

@ -14,16 +14,20 @@ $PALANG['cancel'] = 'Cancel'; # XXX
$PALANG['save'] = 'Save changes'; # XXX
$PALANG['confirm'] = '是否確定刪除?\n';
$PALANG['confirm_domain'] = '你是否確定要刪除該網域中的所有記錄? 刪除後不可恢復!\n';
$PALANG['no_delete_permissions'] = 'You are not allowed to delete %s!'; # XXX
$PALANG['check_update'] = '檢查新版本';
$PALANG['invalid_parameter'] = 'Invalid parameter!'; # XXX
$PALANG['show'] = 'Show:'; # XXX
$PALANG['all'] = 'All'; # XXX
$PALANG['created'] = 'Created'; # XXX
$PALANG['unknown'] = 'unknown'; # XXX
$PALANG['download_csv'] = 'Download this list as CSV file'; # XXX
$PALANG['missing_field'] = 'Field %s is missing'; # XXX
$PALANG['must_be_numeric'] = '%s must be numeric'; # XXX
$PALANG['must_be_boolean'] = '%s must be boolean'; # XXX
$PALANG['invalid_value_given'] = 'Invalid value given for %s'; # XXX
$PALANG['edit_not_allowed'] = 'You are not allowed to edit %s'; # XXX
$PALANG['searchparams'] = 'Search parameters:'; # XXX
$PALANG['pFooter_logged_as'] = 'Logged as %s'; # XXX # XXX Text change: 'logged in as %s' (the 'in' was missing)
$PALANG['pLogin_welcome'] = '郵件管理員請從這裡登錄以管理你的網域名.';

@ -126,7 +126,7 @@ $alias_pagebrowser_query = "
";
$handler = new AliasHandler(0, $admin_username);
$handler->getList($list_param, $page_size, $fDisplay);
$handler->getList($list_param, array(), $page_size, $fDisplay);
$tAlias = $handler->result();

@ -0,0 +1,137 @@
<?php /**
* Postfix Admin
*
* LICENSE
* 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
*
* @version $Id$
* @license GNU GPL v2 or later.
*
* File: list.php
* List all items as a quick overview.
*
*/
require_once('common.php');
# if (safeget('token') != $_SESSION['PFA_token']) die('Invalid token!');
$username = authentication_get_username(); # enforce login
$table = safeget('table');
$handlerclass = ucfirst($table) . 'Handler';
if ( !preg_match('/^[a-z]+$/', $table) || !file_exists("model/$handlerclass.php")) { # validate $table
die ("Invalid table name given!");
}
# default: domain admin restrictions
$list_admins = array($username);
$is_superadmin = 0;
if (authentication_has_role('global-admin')) { # more permissions? Fine!
$list_admins = array_keys(list_admins());
$is_superadmin = 1;
$username = safepost('username', safeget('username', $username)); # prefer POST over GET variable
}
$is_admin = authentication_has_role('admin');
$handler = new $handlerclass(0, $username, $is_admin);
$formconf = $handler->webformConfig();
if ($is_admin) {
authentication_require_role($formconf['required_role']);
} else {
if (empty($formconf['user_hardcoded_field'])) {
die($handlerclass . ' is not available for users');
}
}
$search = safeget('search', safesession("search_$table", array()));
$searchmode = safeget('searchmode', safesession("searchmode_$table", array()));
if (!is_array($search) || !is_array($searchmode)) {
# avoid injection of raw SQL if $search is a string instead of an array
die("Invalid parameter");
}
if (safeget('reset_search', 0)) {
$search = array();
$searchmode = array();
}
$_SESSION["search_$table"] = $search;
$_SESSION["searchmode_$table"] = $searchmode;
if (count($search)) {
$handler->getList($search, $searchmode);
} else {
$handler->getList('');
}
$items = $handler->result();
if (count($handler->errormsg)) flash_error($handler->errormsg);
if (count($handler->infomsg)) flash_error($handler->infomsg);
if (safeget('output') == 'csv') {
$out = fopen('php://output', 'w');
header( 'Content-Type: text/csv; charset=utf-8' );
header( 'Content-Disposition: attachment;filename='.$table.'.csv');
print "\xEF\xBB\xBF"; # utf8 byte-order to indicate the file is utf8 encoded
# print "sep=;"; # hint that ; is used as seperator - breaks the utf8 flag in excel import!
print "\n";
if (!defined('ENT_HTML401')) { # for compability for PHP < 5.4.0
define('ENT_HTML401', 0);
}
# print column headers as csv
$header = array();
$columns = array();
foreach ($handler->getStruct() as $key => $field) {
if ($field['display_in_list'] && $field['label'] != '') { # don't show fields without a label
$header[] = html_entity_decode ( $field['label'], ENT_COMPAT | ENT_HTML401, 'UTF-8' );
$columns[] = $key;
}
}
fputcsv($out, $header, ';');
# print items as csv
foreach ($items as $item) {
$fields = array();
foreach ($columns as $column) {
$fields[] = $item[$column];
}
fputcsv($out, $fields, ';');
}
fclose($out);
} else { # HTML output
$smarty->assign('admin_list', $list_admins);
$smarty->assign('admin_selected', $username);
$smarty->assign('smarty_template', 'list');
$smarty->assign('struct', $handler->getStruct());
$smarty->assign('msg', $handler->getMsg());
$smarty->assign('table', $table);
$smarty->assign('items', $items);
$smarty->assign('id_field', $handler->getId_field());
$smarty->assign('formconf', $formconf);
$smarty->assign('search', $search);
$smarty->assign('searchmode', $searchmode);
$smarty->display ('index.tpl');
}
/* vim: set expandtab softtabstop=4 tabstop=4 shiftwidth=4: */
?>

@ -287,10 +287,10 @@ class AliasHandler extends PFAHandler {
return $db_result;
}
public function getList($condition, $limit=-1, $offset=-1) {
public function getList($condition, $searchmode = array(), $limit=-1, $offset=-1) {
# only list aliases that do not belong to mailboxes
# TODO: breaks if $condition is an array
return parent::getList( "__mailbox_username IS NULL AND ( $condition )", $limit, $offset);
return parent::getList( "__mailbox_username IS NULL AND ( $condition )", $searchmode, $limit, $offset);
}
protected function _validate_goto($field, $val) {

@ -1,4 +1,5 @@
<?php
# $Id$
/**
* class to handle 'delete' in Cli
*/

@ -1,4 +1,5 @@
<?php
# $Id$
/**
* class to handle add and edit in Cli
*

@ -1,4 +1,5 @@
<?php
# $Id$
class CliHelp extends Shell {

@ -0,0 +1,104 @@
<?php
# $Id$
/**
* class to display the database scheme (for usage in upgrade.php) in Cli
*
* extends the "Shell" class
*/
class CliScheme extends Shell {
public $handler_to_use = "";
public $new = 0;
/**
* Execution method always used for tasks
*/
public function execute() {
$module = preg_replace('/Handler$/', '', $this->handler_to_use);
$module = strtolower($module);
$handler = new $this->handler_to_use($this->new);
$struct = $handler->getStruct();
foreach (array_keys($struct) as $field) {
if ($field == 'created') {
$struct[$field]['db_code'] = '{DATE}';
} elseif ($field == 'modified') {
$struct[$field]['db_code'] = '{DATECURRENT}';
} else {
switch ($struct[$field]['type']) {
case 'int':
$struct[$field]['db_code'] = '{BIGINT}';
break;
case 'bool':
$struct[$field]['db_code'] = '{BOOLEAN}';
break;
default:
$struct[$field]['db_code'] = 'VARCHAR(255) {LATIN1} NOT NULL';
}
}
}
$this->out("For creating a new table with upgrade.php:");
$this->out("");
$this->out('db_query_parsed("');
$this->out(' CREATE TABLE {IF_NOT_EXISTS} " . table_by_key("' . $module . '") . " (');
# TODO: $module is not really correct - $handler->db_table would be
foreach (array_keys($struct) as $field) {
if ($struct[$field]['not_in_db'] == 0 && $struct[$field]['dont_write_to_db'] == 0) {
$this->out(" $field " . $struct[$field]['db_code'] . ",");
}
}
$this->out(" INDEX domain(domain,username), // <--- change as needed");
$this->out(" PRIMARY KEY (" . $handler->getId_field() . ")");
$this->out(' ) {MYISAM} ');
$this->out('");');
$this->out('');
$this->hr();
$this->out('For adding fields with upgrade.php:');
$this->out('');
$prev_field = '';
foreach (array_keys($struct) as $field) {
if ($struct[$field]['not_in_db'] == 0 && $struct[$field]['dont_write_to_db'] == 0) {
$this->out(" _db_add_field('$module', '$field',\t'" . $struct[$field]['db_code'] . "',\t'$prev_field');");
$prev_field = $field;
}
}
$this->out('');
$this->hr();
$this->out('Note that the above is only a template.');
$this->out('You might need to adjust some parts.');
return;
}
/**
* Displays help contents
*/
public function help() {
$module = preg_replace('/Handler$/', '', $this->handler_to_use);
$module = strtolower($module);
$this->out(
"Usage:
postfixadmin-cli $module scheme
Print the $module database scheme in a way that can be
pasted into upgrade.php.
");
$this->_stop();
}
}
/* vim: set expandtab softtabstop=4 tabstop=4 shiftwidth=4: */

@ -1,4 +1,5 @@
<?php
# $Id$
/**
* class to handle 'view' in Cli
*/

@ -30,9 +30,11 @@ class DomainHandler extends PFAHandler {
protected function initStruct() {
# TODO: shorter PALANG labels ;-)
$transp = Config::intbool('transport');
$quota = Config::intbool('quota');
$dom_q = Config::intbool('domain_quota');
$super = $this->is_superadmin;
$transp = min($super, Config::intbool('transport'));
$quota = min($super, Config::intbool('quota'));
$dom_q = min($super, Config::intbool('domain_quota'));
# NOTE: There are dependencies between alias_count, mailbox_count and total_quota.
# NOTE: If you disable "display in list" for one of them, the SQL query for the others might break.
@ -42,15 +44,15 @@ class DomainHandler extends PFAHandler {
# field name allow display in... type $PALANG label $PALANG description default / options / ...
# editing? form list
'domain' => pacol( $this->new, 1, 1, 'text', 'domain' , '' ),
'description' => pacol( 1, 1, 1, 'text', 'description' , '' ),
'aliases' => pacol( 1, 1, 1, 'num' , 'aliases' , 'pAdminEdit_domain_aliases_text' , Config::read('aliases') ),
'description' => pacol( $super, 1, 1, 'text', 'description' , '' ),
'aliases' => pacol( $super, $super, 1, 'num' , 'aliases' , 'pAdminEdit_domain_aliases_text' , Config::read('aliases') ),
'alias_count' => pacol( 0, 0, 1, 'vnum', '' , '' , '', '',
/*not_in_db*/ 0,
/*dont_write_to_db*/ 1,
/*select*/ 'coalesce(__alias_count,0) - coalesce(__mailbox_count,0) as alias_count',
/*extrafrom*/ 'left join ( select count(*) as __alias_count, domain as __alias_domain from ' . table_by_key('alias') .
' group by domain) as __alias on domain = __alias_domain'),
'mailboxes' => pacol( 1, 1, 1, 'num' , 'mailboxes' , 'pAdminEdit_domain_aliases_text' , Config::read('mailboxes') ),
'mailboxes' => pacol( $super, $super, 1, 'num' , 'mailboxes' , 'pAdminEdit_domain_aliases_text' , Config::read('mailboxes') ),
'mailbox_count' => pacol( 0, 0, 1, 'vnum', '' , '' , '', '',
/*not_in_db*/ 0,
/*dont_write_to_db*/ 1,
@ -65,11 +67,21 @@ class DomainHandler extends PFAHandler {
'quota' => pacol( $dom_q, $dom_q, $dom_q, 'num' , 'pAdminEdit_domain_quota' , 'pAdminEdit_domain_maxquota_text' , Config::read('domain_quota_default') ),
'transport' => pacol( $transp, $transp,$transp,'enum', 'transport' , 'pAdminEdit_domain_transport_text' , Config::read('transport_default') ,
/*options*/ Config::read('transport_options') ),
'backupmx' => pacol( 1, 1, 1, 'bool', 'pAdminEdit_domain_backupmx' , '' , 0),
'active' => pacol( 1, 1, 1, 'bool', 'active' , '' , 1 ),
'backupmx' => pacol( $super, $super, 1, 'bool', 'pAdminEdit_domain_backupmx' , '' , 0),
'active' => pacol( $super, $super, 1, 'bool', 'active' , '' , 1 ),
'default_aliases' => pacol( $this->new, $this->new, 0, 'bool', 'pAdminCreate_domain_defaultaliases', '' , 1,'', /*not in db*/ 1 ),
'created' => pacol( 0, 0, 1, 'ts', 'created' , '' ),
'modified' => pacol( 0, 0, 1, 'ts', 'last_modified' , '' ),
'_can_edit' => pacol( 0, 0, 1, 'int', '' , '' , 0 ,
/*options*/ '',
/*not_in_db*/ 0,
/*dont_write_to_db*/ 1,
/*select*/ $this->is_superadmin . ' as _can_edit' ),
'_can_delete' => pacol( 0, 0, 1, 'int', '' , '' , 0 ,
/*options*/ '',
/*not_in_db*/ 0,
/*dont_write_to_db*/ 1,
/*select*/ $this->is_superadmin . ' as _can_delete' ),
);
}
@ -95,12 +107,23 @@ class DomainHandler extends PFAHandler {
'create_button' => 'pAdminCreate_domain_button',
# various settings
'required_role' => 'global-admin',
'required_role' => 'admin',
'listview' => 'list-domain.php',
'early_init' => 0,
);
}
protected function beforestore() {
# TODO: is this function superfluous? _can_edit should already cover this
if ($this->is_superadmin) {
return true;
}
$this->errormsg[] = Config::Lang('edit_not_allowed', $this->id);
return false;
}
/**
* called by $this->store() after storing $this->values in the database
* can be used to update additional tables, call scripts etc.
@ -138,6 +161,12 @@ class DomainHandler extends PFAHandler {
* @return true on success false on failure
*/
public function delete() {
# TODO: check for _can_delete instead
if (! $this->is_superadmin) {
$this->errormsg[] = Config::Lang_f('no_delete_permissions', $this->id);
return false;
}
if ( ! $this->view() ) {
$this->errormsg[] = Config::Lang('domain_does_not_exist'); # TODO: can users hit this message at all? init() should already fail...
return false;

@ -12,7 +12,7 @@ abstract class PFAHandler {
public $infomsg = array();
# array of tasks available in CLI
public $taskNames = array('Help', 'Add', 'Update', 'Delete', 'View');
public $taskNames = array('Help', 'Add', 'Update', 'Delete', 'View', 'Scheme');
/**
* variables that must be defined in all *Handler classes
@ -25,10 +25,22 @@ abstract class PFAHandler {
# field containing the ID
protected $id_field = null;
# field containing the label
# defaults to $id_field if not set
protected $label_field = null;
# field(s) to use in the ORDER BY clause
# can contain multiple comma-separated fields
# defaults to $id_field if not set
protected $order_by = null;
# column containing the domain
# if a table does not contain a domain column, leave empty and override no_domain_field())
protected $domain_field = "";
# column containing the username (if logged in as non-admin)
protected $user_field = '';
# skip empty password fields in edit mode
# enabled by default to allow changing an admin, mailbox etc. without changing the password
# disable for "edit password" forms
@ -46,6 +58,14 @@ abstract class PFAHandler {
# set in __construct()
protected $admin_username = "";
# will be set to 0 if $admin_username is set and is not a superadmin
protected $is_superadmin = 1;
# if set, switch to user (non-admin) mode
protected $username = '';
# will be set to 0 if a user (non-admin) is logged in
protected $is_admin = 1;
# the ID of the current item (where item can be an admin, domain, mailbox, alias etc.)
# filled in init()
@ -55,6 +75,19 @@ abstract class PFAHandler {
# filled in domain_from_id() via init()
protected $domain = null;
# the label of the current item (for usage in error/info messages)
# filled in init() (only contains the "real" label in edit mode - in new mode, it will be the same as $id)
protected $label = null;
# can this item be edited?
# filled in init() (only in edit mode)
protected $can_edit = 1;
# can this item be deleted?
# filled in init() (only in edit mode)
protected $can_delete = 1;
# TODO: needs to be implemented in delete()
# structure of the database table, list, edit form etc.
# filled in initStruct()
protected $struct = array();
@ -88,23 +121,65 @@ abstract class PFAHandler {
* Constructor: fill $struct etc.
* @param integer - 0 is edit mode, set to 1 to switch to create mode
* @param string - if an admin_username is specified, permissions will be restricted to the domains this admin may manage
* @param integer - 0 if logged in as user, 1 if logged in as admin or superadmin
*/
public function __construct($new = 0, $admin_username = "") {
public function __construct($new = 0, $username = "", $is_admin = 1) {
# set label_field if not explicitely set
if (empty($this->label_field)) {
$this->label_field = $this->id_field;
}
# set order_by if not explicitely set
if (empty($this->order_by)) {
$this->order_by = $this->id_field;
}
if ($new) $this->new = 1;
$this->admin_username = $admin_username;
if ($is_admin) {
$this->admin_username = $username;
} else {
$this->username = $username;
$this->is_admin = 0;
$this->is_superadmin = 0;
}
if ($username != "" && (! authentication_has_role('global-admin') ) ) {
$this->is_superadmin = 0;
}
if ($this->domain_field == "") {
$this->no_domain_field();
} else {
if ($admin_username != "") {
$this->allowed_domains = list_domains_for_admin($admin_username);
if ($this->admin_username != "") {
$this->allowed_domains = list_domains_for_admin($username);
} else {
$this->allowed_domains = list_domains();
}
}
if ($this->user_field == '') {
$this->no_user_field();
}
$this->initStruct();
if (!isset($this->struct['_can_edit'])) {
$this->struct['_can_edit'] = pacol( 0, 0, 1, 'vnum', '' , '' , '', '',
/*not_in_db*/ 0,
/*dont_write_to_db*/ 1,
/*select*/ '1 as _can_edit'
);
}
if (!isset($this->struct['_can_delete'])) {
$this->struct['_can_delete'] = pacol( 0, 0, 1, 'vnum', '' , '' , '', '',
/*not_in_db*/ 0,
/*dont_write_to_db*/ 1,
/*select*/ '1 as _can_delete'
);
}
$struct_hook = Config::read($this->db_table . '_struct_hook');
if ( $struct_hook != 'NO' && function_exists($struct_hook) ) {
$this->struct = $struct_hook($this->struct);
@ -122,21 +197,37 @@ abstract class PFAHandler {
if ($this->admin_username != "") die('Attemp to restrict domains without setting $this->domain_field!');
}
/**
* ensure a lazy programmer can't give access to all items accidently
*
* to intentionally disable the check if $this->user_field is empty, override this function
*/
protected function no_user_field() {
if ($this->username != '') die('Attemp to restrict users without setting $this->user_field!');
}
/**
* init $this->struct (an array of pacol() results)
* see pacol() in functions.inc.php for all available parameters
*
* available values for the "type" column:
* text one line of text
* *vtxt "virtual" line of text, coming from JOINs etc.
* pass password (will be encrypted with pacrypt())
* num number
* txtl text "list" - array of one line texts
* vnum "virtual" number, coming from JOINs etc.
* *vnum "virtual" number, coming from JOINs etc.
* bool boolean (converted to 0/1, additional column _$field with yes/no)
* ts timestamp (created/modified)
* enum list of options, must be given in column "options" as array
* enma list of options, must be given in column "options" as associative array
* list like enum, but allow multiple selections
* *quot used / total quota ("5 / 10") - for field "quotausage", there must also be a "_quotausage_percent" (type vnum)
* You can use custom types, but you'll have to add handling for them in *Handler and the smarty templates
*
* Field types marked with * will automatically be skipped in store().
*
* All database tables should have a 'created' and a 'modified' column.
*
@ -183,6 +274,7 @@ abstract class PFAHandler {
*/
public function init($id) {
$this->id = strtolower($id);
$this->label = $this->id;
$exists = $this->view(false);
@ -196,11 +288,14 @@ abstract class PFAHandler {
# } else {
# return true;
}
} else { # edit mode
} else { # view or edit mode
if (!$exists) {
$this->errormsg[$this->id_field] = Config::lang($this->msg['error_does_not_exist']);
return false;
# } else {
} else {
$this->can_edit = $this->result['_can_edit'];
$this->can_delete = $this->result['_can_delete'];
$this->label = $this->result[$this->label_field];
# return true;
}
}
@ -255,6 +350,11 @@ abstract class PFAHandler {
* error messages (if any) are stored in $this->errormsg
*/
public function set($values) {
if ( !$this->can_edit ) {
$this->errormsg[] = Config::Lang_f('edit_not_allowed', $this->label);
return false;
}
if ($this->new == 1) {
$values[$this->id_field] = $this->id;
}
@ -372,6 +472,11 @@ abstract class PFAHandler {
case 'pass':
$db_values[$key] = pacrypt($db_values[$key]);
break;
case 'quot':
case 'vnum':
case 'vtxt':
unset ($db_values[$key]); # virtual field, never write it
break;
}
if ($this->struct[$key]['not_in_db'] == 1) unset ($db_values[$key]); # remove 'not in db' columns
if ($this->struct[$key]['dont_write_to_db'] == 1) unset ($db_values[$key]); # remove 'dont_write_to_db' columns
@ -383,7 +488,7 @@ abstract class PFAHandler {
$result = db_update($this->db_table, $this->id_field, $this->id, $db_values);
}
if ($result != 1) {
$this->errormsg[] = Config::lang_f($this->msg['store_error'], $this->id);
$this->errormsg[] = Config::lang_f($this->msg['store_error'], $this->label);
return false;
}
@ -395,7 +500,7 @@ abstract class PFAHandler {
if ($result) {
# return success message
# TODO: add option to override the success message (for example to include autogenerated passwords)
$this->infomsg['success'] = Config::lang_f($this->msg['successmessage'], $this->id);
$this->infomsg['success'] = Config::lang_f($this->msg['successmessage'], $this->label);
}
return $result;
@ -428,11 +533,13 @@ abstract class PFAHandler {
*
* @param array or string - condition (an array will be AND'ed using db_where_clause, a string will be directly used)
* (if you use a string, make sure it is correctly escaped!)
* - WARNING: will be changed to array only in the future, with an option to include a raw string inside the array
* @param array searchmode - operators to use (=, <, >) if $condition is an array. Defaults to = if not specified for a field.
* @param integer limit - maximum number of rows to return
* @param integer offset - number of first row to return
* @return array - rows (as associative array, with the ID as key)
*/
protected function read_from_db($condition, $limit=-1, $offset=-1) {
protected function read_from_db($condition, $searchmode = array(), $limit=-1, $offset=-1) {
$select_cols = array();
$yes = escape_string(Config::lang('YES'));
@ -472,18 +579,24 @@ abstract class PFAHandler {
$cols = join(',', $select_cols);
$table = table_by_key($this->db_table);
$additional_where = '';
if ($this->domain_field != "") {
$additional_where .= " AND " . db_in_clause($this->domain_field, $this->allowed_domains);
}
# if logged in as user, restrict to the items the user is allowed to see
if ( (!$this->is_admin) && $this->user_field != '') {
$additional_where .= " AND " . $this->user_field . " = '" . escape_string($this->username) . "' ";
}
if (is_array($condition)) {
$where = db_where_clause($condition, $this->struct);
$where = db_where_clause($condition, $this->struct, $additional_where, $searchmode);
} else {
if ($condition == "") $condition = '1=1';
$where = " WHERE ( $condition ) ";
$where = " WHERE ( $condition ) $additional_where";
}
if ($this->domain_field != "") {
$where .= " AND " . db_in_clause($this->domain_field, $this->allowed_domains);
}
$query = "SELECT $cols FROM $table $extrafrom $where ORDER BY " . $this->id_field;
$query = "SELECT $cols FROM $table $extrafrom $where ORDER BY " . $this->order_by;
$limit = (int) $limit; # make sure $limit and $offset are really integers
$offset = (int) $offset;
@ -535,13 +648,30 @@ abstract class PFAHandler {
/**
* get a list of one or more items with all values
* @param array or string $condition - see read_from_db for details
* WARNING: will be changed to array only in the future, with an option to include a raw string inside the array
* @param array - modes to use if $condition is an array - see read_from_db for details
* @param integer limit - maximum number of rows to return
* @param integer offset - number of first row to return
* @return bool - always true, no need to check ;-) (if $result is not an array, getList die()s)
* The data is stored in $this->result (as array of rows, each row is an associative array of column => value)
*/
public function getList($condition, $limit=-1, $offset=-1) {
$result = $this->read_from_db($condition, $limit, $offset);
public function getList($condition, $searchmode = array(), $limit=-1, $offset=-1) {
if (is_array($condition)) {
$real_condition = array();
foreach ($condition as $key => $value) {
# allow only access to fields the user can access to avoid information leaks via search parameters
if (isset($this->struct[$key]) && ($this->struct[$key]['display_in_list'] || $this->struct[$key]['display_in_form']) ) {
$real_condition[$key] = $value;
} else {
$this->errormsg[] = "Ignoring unknown search field $key";
}
}
} else {
# warning: no sanity checks are applied if $condition is not an array!
$real_condition = $condition;
}
$result = $this->read_from_db($real_condition, $searchmode, $limit, $offset);
if (!is_array($result)) {
error_log('getList: read_from_db didn\'t return an array. table: ' . $this->db_table . ' - condition: $condition - limit: $limit - offset: $offset');
@ -587,6 +717,10 @@ abstract class PFAHandler {
return $this->struct;
}
public function getMsg() {
return $this->msg;
}
public function getId_field() {
return $this->id_field;
}
@ -663,6 +797,15 @@ abstract class PFAHandler {
return false;
}
/**
* check if value of an enum field is in the list of allowed values
*/
protected function _inp_enma($field, $val) {
if(array_key_exists($val, $this->struct[$field]['options'])) return true;
$this->errormsg[$field] = Config::Lang_f('invalid_value_given', $field);
return false;
}
/**
* check if a password is secure enough
*/

@ -472,6 +472,7 @@ class PostfixAdmin {
$this->stdout(" add Add an item");
$this->stdout(" update Update an item");
$this->stdout(" delete Delete an item");
$this->stdout(" scheme Print database scheme (useful for developers only)");
$this->stdout(" help Print help output");
$this->stdout("");
$this->stdout("");

@ -17,7 +17,11 @@
<td class="label">{$field.label}</td>
<td>
{if $field.editable == 0}
{$value_{$key}}
{if $field.type == 'enma'}
{$struct.{$key}.options.{$value_{$key}}}
{else}
{$value_{$key}}
{/if}
{else}
{if $table == 'foo' && $key == 'bar'}
Special handling (td content) for {$table} / {$key}
@ -27,6 +31,10 @@
<select class="flat" name="value[{$key}]">
{html_options output=$struct.{$key}.options values=$struct.{$key}.options selected=$value_{$key}}
</select>
{elseif $field.type == 'enma'}
<select class="flat" name="value[{$key}]">
{html_options options=$struct.{$key}.options selected=$value_{$key}}
</select>
{elseif $field.type == 'list'}
<select class="flat" name="value[{$key}][]" size="10" multiple="multiple">
{html_options output=$struct.{$key}.options values=$struct.{$key}.options selected=$value_{$key}}

@ -0,0 +1,108 @@
<div id="overview">
<form name="frmOverview" method="post" action="">
{if ($admin_list|count > 1)}
{html_options name='username' output=$admin_list values=$admin_list selected=$admin_selected onchange="this.form.submit();"}
<input class="button" type="submit" name="go" value="{$PALANG.go}" />
{/if}
</form>
{#form_search#}
</div>
{if ($search|count > 0)}
<div class='searchparams'>
<p>{$PALANG.searchparams}
{foreach key=key item=field from=$search}
<span>{if $struct.$key.label}{$struct.$key.label}{else}{$key}{/if}
{if isset($searchmode.$key)}{$searchmode.$key}{else}={/if} {$field}
</span>
{/foreach}
<span><a href="list.php?table={$table}&reset_search=1">[x]</a></span>
</div>
{/if}
<div id="list">
<table border=0 id='admin_table'><!-- TODO: 'admin_table' needed because of CSS for table header -->
<tr class="header">
{foreach key=key item=field from=$struct}
{if $field.display_in_list == 1 && $field.label}{* don't show fields without a label *}
<td>{$field.label}</td>
{/if}
{/foreach}
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
{foreach from=$items item=item}
{#tr_hilightoff#}
{foreach key=key item=field from=$struct}
{if $field.display_in_list == 1 && $field.label}
{if $field.linkto != '' && ($item.$id_field != '' || $item.$id_field > 0) }
{assign "linkto" "{$field.linkto|replace:'%s':{$item.$id_field|escape:url}}"} {* TODO: use label field instead *}
{assign "linktext" "<a href='{$linkto}'>{$item.{$key}}</a>"}
{else}
{assign "linktext" $item.$key}
{/if}
{if $table == 'foo' && $key == 'bar'}
<td>Special handling (complete table row) for {$table} / {$key}</td></tr>
{else}
<td>
{if $table == 'foo' && $key == 'bar'}
Special handling (td content) for {$table} / {$key}
{* {elseif $table == 'domain' && $key == 'domain'}
<a href="list.php?table=domain&domain={$item.domain|escape:"url"}">{$item.domain}</a>
*}
{elseif $key == 'active'}
<a href="{#url_editactive#}{$table}&amp;id={$item.$id_field|escape:"url"}&amp;active={if ($item.active==0)}1{else}0{/if}&amp;token={$smarty.session.PFA_token|escape:"url"}">{$item._active}</a>
{elseif $field.type == 'bool'}
{assign "tmpkey" "_{$key}"}{$item.{$tmpkey}}
{elseif $field.type == 'list'}
{foreach key=key2 item=field2 from=$value_{$key}}<p>{$field2} {/foreach}
{elseif $field.type == 'pass'}
(hidden)
{elseif $field.type == 'quot'}
{assign "tmpkey" "_{$key}_percent"}
{if $item[$tmpkey]>90}
{assign var="quota_level" value="high"}
{elseif $item[$tmpkey]>55}
{assign var="quota_level" value="mid"}
{else}
{assign var="quota_level" value="low"}
{/if}
{if $item[$tmpkey] > -1}
<div class="quota quota_{$quota_level}" style="width:{$item[$tmpkey] *1.2}px;"></div>
<div class="quota_bg"></div></div>
<div class="quota_text quota_text_{$quota_level}">{$linktext}</div>
{else}
{$item[$key]}
{/if}
{elseif $field.type == 'txtl'}
{foreach key=key2 item=field2 from=$value_{$key}}<p>{$field2} {/foreach}
{else}
{$linktext}
{/if}
</td>
{/if}
{/if}
{/foreach}
<td>{if $item._can_edit}<a href="edit.php?table={$table|escape:"url"}&amp;edit={$item.$id_field|escape:"url"}">{$PALANG.edit}</a>{else}&nbsp;{/if}</td>
<td>{if $item._can_delete}<a href="{#url_delete#}?table={$table}&amp;delete={$item.$id_field|escape:"url"}&amp;token={$smarty.session.PFA_token|escape:"url"}"
onclick="return confirm ('{$PALANG.{$msg.confirm_delete}|replace:'%s':$item.$id_field}')">{$PALANG.del}</a>{else}&nbsp;{/if}</td>
</tr>
{/foreach}
</table>
<br /><a href="edit.php?table={$table|escape:"url"}" class="button">{$PALANG.{$formconf.create_button}}</a><br />
<br />
<br /><a href="list.php?table={$table|escape:"url"}&amp;output=csv">{$PALANG.download_csv}</a>
</div>
Loading…
Cancel
Save