0
0
mirror of https://github.com/postfixadmin/postfixadmin.git synced 2024-09-19 19:22:14 +02:00
postfixadmin/public/list.php
Dennis Lübke 5476bb3abd
Ignore CSV labels with a whitespace
Currently, exporting the alias list to CSV, the first column label is only a whitespace. For some reason the contents of this column consists of a long concatenation of "nbsp;"s.
This fix ignores the whitespace column label and gets rid of the "nbsp;nbsp;......" contents of this column.
This was successfully tested on a running installation of postfixadmin 3.2 on a Debian 11 system.
2023-02-01 12:28:58 +01:00

167 lines
4.9 KiB
PHP

<?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
$CONF = Config::getInstance()->getAll();
$smarty = PFASmarty::getInstance();
$table = safeget('table');
if (empty($table)) {
die("table parameter missing or invalid.");
}
$handlerclass = ucfirst($table) . 'Handler';
if (!preg_match('/^[a-z]+$/', $table) || !file_exists(dirname(__FILE__) . "/../model/$handlerclass.php")) { # validate $table
die("Invalid table name given!");
}
# default: domain admin restrictions
$is_superadmin = 0;
if (authentication_has_role('global-admin')) { # more permissions? Fine!
$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();
$list_admins = array($username);
if ($is_superadmin && $formconf['required_role'] != 'global-admin') { # 'simulate admin' dropdown doesn't make sense for superadmin-only modules
$list_admins = array_keys(list_admins());
}
if ($is_admin) {
authentication_require_role($formconf['required_role']);
} else {
if (empty($formconf['user_hardcoded_field'])) {
die($handlerclass . ' is not available for users');
}
}
$search = [];
$searchmode = [];
if (isset($_GET['search']) && is_array($_GET['search'])) {
$search = $_GET['search'];
} elseif (isset($_SESSION["search_$table"]) && is_array($_SESSION["search_$table"])) {
$search = $_SESSION["search_$table"];
}
if (isset($_GET['searchmode']) && is_array($_GET['searchmode'])) {
$searchmode = $_GET['searchmode'];
} elseif (isset($_SESSION["searchmode_$table"]) && is_array($_SESSION["searchmode_$table"])) {
$searchmode = $_SESSION["searchmode_$table"];
}
if (array_key_exists('reset_search', $_GET)) {
$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);
}
$fDomain = safepost('fDomain', safeget('domain', safesession('list-virtual:domain')));
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 "\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) {
$label = trim($field['label']);
if ($field['display_in_list'] && $label != '' && $label != ' ') { # don't show fields without a label and those with a whitespace
$header[] = html_entity_decode($label, ENT_COMPAT | ENT_HTML401, 'UTF-8');
$columns[] = $key;
}
}
fputcsv($out, $header);
# print items as csv
foreach ($items as $item) {
$fields = array();
// skip domains that do not match selected domain (see: https://github.com/postfixadmin/postfixadmin/issues/404)
if (!empty($fDomain) && $item['domain'] != $fDomain) {
continue;
}
foreach ($columns as $column) {
$values = $item[$column];
if (is_array($values)) {
$values = implode(',', $values);
}
$fields[] = $values;
}
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->assign('domain_selected', ''); /* stop list-virtual.tpl triggering a PHP notice */
$smarty->display('index.tpl');
}
/* vim: set expandtab softtabstop=4 tabstop=4 shiftwidth=4: */