SF.net SVN: postfixadmin: [166] trunk
Brought to you by:
christian_boltz,
gingerdog
From: <chr...@us...> - 2007-10-30 00:18:54
|
Revision: 166 http://postfixadmin.svn.sourceforge.net/postfixadmin/?rev=166&view=rev Author: christian_boltz Date: 2007-10-29 17:18:53 -0700 (Mon, 29 Oct 2007) Log Message: ----------- - merged admin/delete.php into /delete.php - the WHERE fieldname is now hardcoded instead of being a $_GET parameter This fixes a possible security hole in admin/delete.php (only vulnerabe when logged in as global-admin) Modified Paths: -------------- trunk/admin/delete.php trunk/delete.php trunk/templates/admin_list-admin.tpl trunk/templates/admin_list-domain.tpl trunk/templates/overview.tpl Modified: trunk/admin/delete.php =================================================================== --- trunk/admin/delete.php 2007-10-26 06:13:46 UTC (rev 165) +++ trunk/admin/delete.php 2007-10-30 00:18:53 UTC (rev 166) @@ -1,161 +1,3 @@ <?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://www.postfixadmin.com or http://postfixadmin.sf.net - * - * @version $Id$ - * @license GNU GPL v2 or later. - * - * File: delete.php - * Used to delete a domain, mailbox or alias. - * - * Template File: message.tpl - * - * Template Variables: - * - * tMessage - * - * Form POST \ GET Variables: - * - * fTable - * fWhere - * fDelete - * fDomain - */ - -require_once('../common.php'); - -authentication_require_role('global-admin'); - -if ($_SERVER['REQUEST_METHOD'] == "GET") -{ - if (isset ($_GET['table'])) $fTable = escape_string ($_GET['table']); - if (isset ($_GET['where'])) $fWhere = escape_string ($_GET['where']); - if (isset ($_GET['delete'])) $fDelete = escape_string ($_GET['delete']); - if (isset ($_GET['domain'])) $fDomain = escape_string ($_GET['domain']); - - if ($CONF['database_type'] == "pgsql") db_query('BEGIN'); - - $error=0; - - if (empty ($fTable)) - { - $error = 1; - } - - if ($fTable == "domain") - { - $result_domain_admins = db_delete ($table_domain_admins,$fWhere,$fDelete); - $result_alias = db_delete ($table_alias,$fWhere,$fDelete); - $result_mailbox = db_delete ($table_mailbox,$fWhere,$fDelete); - $result_log = db_delete ($table_log,$fWhere,$fDelete); - if ($CONF['vacation'] == "YES") - { - $result_vacation = db_delete ($table_vacation,$fWhere,$fDelete); - } - $result_domain = db_delete ($table_domain,$fWhere,$fDelete); - - if (!$result_domain || !domain_postdeletion($fDelete)) - { - $error = 1; - $tMessage = $PALANG['pAdminDelete_domain_error']; - } - else - { - $url = "list-domain.php"; - } - } - - if ($fTable == "admin") - { - $result_admin = db_delete ($table_admin,$fWhere,$fDelete); - $result_domain_admins = db_delete ($table_domain_admins,$fWhere,$fDelete); - - if (!($result_admin == 1) and ($result_domain_admins >= 0)) - { - $error = 1; - $tMessage = $PALANG['pAdminDelete_admin_error']; - } - else - { - $url = "list-admin.php"; - } - } - - if ($fTable == "alias" or $fTable == "mailbox") - { - if ($CONF['database_type'] == "pgsql") db_query('BEGIN'); - $result = db_query ("DELETE FROM $table_alias WHERE address='$fDelete' AND domain='$fDomain'"); - if ($result['rows'] != 1) - { - $error = 1; - $tMessage = $PALANG['pDelete_delete_error'] . "<b>$fDelete</b> (alias)!</span>"; - } - else - { - $url = "list-virtual.php?domain=$fDomain"; - db_log ($SESSID_USERNAME , $fDomain, 'delete_alias', $fDelete); - } - - if (!$error) - { - $result = db_query ("SELECT * FROM $table_mailbox WHERE username='$fDelete' AND domain='$fDomain'"); - if ($result['rows'] == 1) - { - $result = db_query ("DELETE FROM $table_mailbox WHERE username='$fDelete' AND domain='$fDomain'"); - $postdel_res=mailbox_postdeletion($fDelete,$fDomain); - if ($result['rows'] != 1 || !$postdel_res) - { - $error = 1; - $tMessage = $PALANG['pDelete_delete_error'] . "<b>$fDelete</b> ("; - if ($result['rows']!=1) - { - $tMessage.='mailbox'; - if (!$postdel_res) $tMessage.=', '; - } - if (!$postdel_res) - { - $tMessage.='post-deletion'; - } - $tMessage.=')</span>'; - } - else - { - $url = "list-virtual.php?domain=$fDomain"; - db_query ("DELETE FROM $table_vacation WHERE email='$fDelete' AND domain='$fDomain'"); - db_log ($SESSID_USERNAME, $fDomain, 'delete_mailbox', $fDelete); - } - } - } - } - - if ($error == 1) - { - if ($CONF['database_type']=='pgsql') { db_query('ROLLBACK'); } - } else { - if ($CONF['database_type']=='pgsql') { db_query('COMMIT'); } - header ("Location: $url"); - exit; - } - - include ("../templates/header.tpl"); - include ("../templates/admin_menu.tpl"); - include ("../templates/message.tpl"); - include ("../templates/footer.tpl"); -} - -if ($_SERVER['REQUEST_METHOD'] == "POST") -{ - include ("../templates/header.tpl"); - include ("../templates/menu.tpl"); - include ("../templates/message.tpl"); - include ("../templates/footer.tpl"); -} -/* vim: set expandtab softtabstop=3 tabstop=3 shiftwidth=3: */ +require('../delete.php'); ?> Modified: trunk/delete.php =================================================================== --- trunk/delete.php 2007-10-26 06:13:46 UTC (rev 165) +++ trunk/delete.php 2007-10-30 00:18:53 UTC (rev 166) @@ -13,15 +13,10 @@ * @license GNU GPL v2 or later. * * File: delete.php - * Responsible for allowing for the deletion of domains; note if - * a domain is deleted, all mailboxes and aliases belonging to the - * domain are also removed. + * Used to delete admins, domains, mailboxes and aliases. + * Note: if a domain is deleted, all mailboxes and aliases belonging + * to the domain are also removed. * - * @version $Id$ - * @license GNU GPL v2 or later. - * - * Template Variables: - * * Template File: message.tpl * * Template Variables: @@ -30,6 +25,7 @@ * * Form POST \ GET Variables: * + * fTable * fDelete * fDomain */ @@ -39,12 +35,62 @@ authentication_require_role('admin'); $SESSID_USERNAME = authentication_get_username(); +$error = 0; -if ($_SERVER['REQUEST_METHOD'] == "GET") +$fTable = escape_string (safeget('table') ); # see the if blocks below for valid values +$fDelete = escape_string (safeget('delete')); +$fDomain = escape_string (safeget('domain')); + +$error=0; + +if ($fTable == "admin") { - if (isset ($_GET['delete'])) $fDelete = escape_string ($_GET['delete']); - if (isset ($_GET['domain'])) $fDomain = escape_string ($_GET['domain']); + authentication_require_role('global-admin'); + $fWhere = 'username'; + $result_admin = db_delete ($table_admin,$fWhere,$fDelete); + $result_domain_admins = db_delete ($table_domain_admins,$fWhere,$fDelete); + + if (!($result_admin == 1) and ($result_domain_admins >= 0)) + { + $error = 1; + $tMessage = $PALANG['pAdminDelete_admin_error']; + } + else + { + $url = "list-admin.php"; + header ("Location: $url"); + } +} # ($fTable == "admin") +elseif ($fTable == "domain") +{ + authentication_require_role('global-admin'); + $fWhere = 'domain'; + $result_domain_admins = db_delete ($table_domain_admins,$fWhere,$fDelete); + $result_alias = db_delete ($table_alias,$fWhere,$fDelete); + $result_mailbox = db_delete ($table_mailbox,$fWhere,$fDelete); + $result_log = db_delete ($table_log,$fWhere,$fDelete); + if ($CONF['vacation'] == "YES") + { + $result_vacation = db_delete ($table_vacation,$fWhere,$fDelete); + } + $result_domain = db_delete ($table_domain,$fWhere,$fDelete); + + if (!$result_domain || !domain_postdeletion($fDelete)) + { + $error = 1; + $tMessage = $PALANG['pAdminDelete_domain_error']; + } + else + { + $url = "list-domain.php"; + header ("Location: $url"); + } +} # ($fTable == "domain") + +elseif ($fTable == "alias" or $fTable == "mailbox") +{ + if (!check_owner ($SESSID_USERNAME, $fDomain)) { $error = 1; @@ -58,7 +104,6 @@ else { if ($CONF['database_type'] == "pgsql") db_query('BEGIN'); - $result = db_query ("DELETE FROM $table_alias WHERE address='$fDelete' AND domain='$fDomain'"); if ($result['rows'] != 1) { @@ -70,46 +115,67 @@ db_log ($SESSID_USERNAME, $fDomain, 'delete_alias', $fDelete); } - $result = db_query ("SELECT * FROM $table_mailbox WHERE username='$fDelete' AND domain='$fDomain'"); - if ($result['rows'] == 1) + if (!$error) { - $result = db_query ("DELETE FROM $table_mailbox WHERE username='$fDelete' AND domain='$fDomain'"); - $postdel_res = mailbox_postdeletion($fDelete,$fDomain); - if ($result['rows'] != 1 || !$postdel_res) + $result = db_query ("SELECT * FROM $table_mailbox WHERE username='$fDelete' AND domain='$fDomain'"); + if ($result['rows'] == 1) { - $error = 1; - $tMessage = $PALANG['pDelete_delete_error'] . "<b>$fDelete</b> ("; - if ($result['rows']!=1) + $result = db_query ("DELETE FROM $table_mailbox WHERE username='$fDelete' AND domain='$fDomain'"); + $postdel_res=mailbox_postdeletion($fDelete,$fDomain); + if ($result['rows'] != 1 || !$postdel_res) { - $tMessage.='mailbox'; - if (!$postdel_res) $tMessage.=', '; + $error = 1; + $tMessage = $PALANG['pDelete_delete_error'] . "<b>$fDelete</b> ("; + if ($result['rows']!=1) + { + $tMessage.='mailbox'; + if (!$postdel_res) $tMessage.=', '; + } + if (!$postdel_res) + { + $tMessage.='post-deletion'; + } + $tMessage.=')</span>'; } - if (!$postdel_res) $tMessage.='post-deletion'; - $tMessage.=')</span>'; + else + { + db_query ("DELETE FROM $table_vacation WHERE email='$fDelete' AND domain='$fDomain'"); + db_log ($SESSID_USERNAME, $fDomain, 'delete_mailbox', $fDelete); + } } - else - { - db_query ("DELETE FROM $table_vacation WHERE email='$fDelete' AND domain='$fDomain'"); - db_log ($SESSID_USERNAME, $fDomain, 'delete_mailbox', $fDelete); - } } } if ($error != 1) { if ($CONF['database_type'] == "pgsql") db_query('COMMIT'); - header ("Location: overview.php?domain=$fDomain"); + $url = "overview.php"; + if (authentication_has_role('global-admin')) $url = "list-virtual.php"; + header ("Location: $url?domain=$fDomain"); exit; } else { $tMessage = $PALANG['pDelete_delete_error'] . "<b>$fDelete</b> (physical mail)!</span>"; if ($CONF['database_type'] == "pgsql") db_query('ROLLBACK'); } +} # ($fTable == "alias" or $fTable == "mailbox") + +else +{ + # unknown $fTable value + flash_error($PALANG['invalid_parameter']); } -include ("./templates/header.tpl"); -include ("./templates/menu.tpl"); -include ("./templates/message.tpl"); -include ("./templates/footer.tpl"); +include ("$incpath/templates/header.tpl"); + +if (authentication_has_role('global-admin')) { + include ("$incpath/templates/admin_menu.tpl"); +} else { + include ("$incpath/templates/menu.tpl"); +} + +include ("$incpath/templates/message.tpl"); +include ("$incpath/templates/footer.tpl"); + /* vim: set expandtab softtabstop=3 tabstop=3 shiftwidth=3: */ ?> Modified: trunk/templates/admin_list-admin.tpl =================================================================== --- trunk/templates/admin_list-admin.tpl 2007-10-26 06:13:46 UTC (rev 165) +++ trunk/templates/admin_list-admin.tpl 2007-10-30 00:18:53 UTC (rev 166) @@ -22,7 +22,7 @@ $active = ($admin_properties[$i]['active'] == 1) ? $PALANG['YES'] : $PALANG['NO']; print " <td><a href=\"edit-active-admin.php?username=" . $list_admins[$i] . "\">" . $active . "</a></td>"; print " <td><a href=\"edit-admin.php?username=" . $list_admins[$i] . "\">" . $PALANG['edit'] . "</a></td>"; - print " <td><a href=\"delete.php?table=admin&where=username&delete=" . $list_admins[$i] . "\" onclick=\"return confirm ('" . $PALANG['confirm'] . $PALANG['pAdminList_admin_username'] . ": " . $list_admins[$i] . "')\">" . $PALANG['del'] . "</a></td>"; + print " <td><a href=\"delete.php?table=admin&delete=" . $list_admins[$i] . "\" onclick=\"return confirm ('" . $PALANG['confirm'] . $PALANG['pAdminList_admin_username'] . ": " . $list_admins[$i] . "')\">" . $PALANG['del'] . "</a></td>"; print " </tr>\n"; } } Modified: trunk/templates/admin_list-domain.tpl =================================================================== --- trunk/templates/admin_list-domain.tpl 2007-10-26 06:13:46 UTC (rev 165) +++ trunk/templates/admin_list-domain.tpl 2007-10-30 00:18:53 UTC (rev 166) @@ -75,7 +75,7 @@ $active = ($domain_properties[$i]['active'] == 1) ? $PALANG['YES'] : $PALANG['NO']; print "<td><a href=\"edit-active-domain.php?domain=" . $list_domains[$i] . "\">" . $active . "</a></td>"; print "<td><a href=\"edit-domain.php?domain=" . $list_domains[$i] . "\">" . $PALANG['edit'] . "</a></td>"; - print "<td><a href=\"delete.php?table=domain&where=domain&delete=" . $list_domains[$i] . "\" onclick=\"return confirm ('" . $PALANG['confirm_domain'] . $PALANG['pAdminList_admin_domain'] . ": " . $list_domains[$i] . "')\">" . $PALANG['del'] . "</a></td>"; + print "<td><a href=\"delete.php?table=domain&delete=" . $list_domains[$i] . "\" onclick=\"return confirm ('" . $PALANG['confirm_domain'] . $PALANG['pAdminList_admin_domain'] . ": " . $list_domains[$i] . "')\">" . $PALANG['del'] . "</a></td>"; print "</tr>\n"; } } Modified: trunk/templates/overview.tpl =================================================================== --- trunk/templates/overview.tpl 2007-10-26 06:13:46 UTC (rev 165) +++ trunk/templates/overview.tpl 2007-10-30 00:18:53 UTC (rev 166) @@ -125,7 +125,7 @@ $active = ($tAlias[$i]['active'] == 1) ? $PALANG['YES'] : $PALANG['NO']; print " <td><a href=\"edit-active.php?alias=" . urlencode ($tAlias[$i]['address']) . "&domain=$fDomain" . "\">" . $active . "</a></td>\n"; print " <td><a href=\"edit-alias.php?address=" . urlencode ($tAlias[$i]['address']) . "&domain=$fDomain" . "\">" . $PALANG['edit'] . "</a></td>\n"; - print " <td><a href=\"delete.php?delete=" . urlencode ($tAlias[$i]['address']) . "&domain=$fDomain" . "\"onclick=\"return confirm ('" . $PALANG['confirm'] . $PALANG['pOverview_get_aliases'] . ": ". $tAlias[$i]['address'] . "')\">" . $PALANG['del'] . "</a></td>\n"; + print " <td><a href=\"delete.php?table=alias&delete=" . urlencode ($tAlias[$i]['address']) . "&domain=$fDomain" . "\"onclick=\"return confirm ('" . $PALANG['confirm'] . $PALANG['pOverview_get_aliases'] . ": ". $tAlias[$i]['address'] . "')\">" . $PALANG['del'] . "</a></td>\n"; } else { @@ -134,7 +134,7 @@ $active = ($tAlias[$i]['active'] == 1) ? $PALANG['YES'] : $PALANG['NO']; print " <td><a href=\"edit-active.php?alias=" . urlencode ($tAlias[$i]['address']) . "&domain=$fDomain" . "\">" . $active . "</a></td>\n"; print " <td><a href=\"edit-alias.php?address=" . urlencode ($tAlias[$i]['address']) . "&domain=$fDomain" . "\">" . $PALANG['edit'] . "</a></td>\n"; - print " <td><a href=\"delete.php?delete=" . urlencode ($tAlias[$i]['address']) . "&domain=$fDomain" . "\"onclick=\"return confirm ('" . $PALANG['confirm'] . $PALANG['pOverview_get_aliases'] . ": ". $tAlias[$i]['address'] . "')\">" . $PALANG['del'] . "</a></td>\n"; + print " <td><a href=\"delete.php?table=mailbox&delete=" . urlencode ($tAlias[$i]['address']) . "&domain=$fDomain" . "\"onclick=\"return confirm ('" . $PALANG['confirm'] . $PALANG['pOverview_get_aliases'] . ": ". $tAlias[$i]['address'] . "')\">" . $PALANG['del'] . "</a></td>\n"; } else { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |