requireLogin();
App::sslOn();
require_once 'codebase/lib/PageNumbers.inc.php';
require_once 'codebase/lib/SessionCache.inc.php';
require_once 'codebase/lib/FormValidator.inc.php';
require_once 'codebase/lib/SortOrder.inc.php';
require_once 'codebase/lib/TemplateGlue.inc.php';
require_once 'codebase/lib/Prefs.inc.php';
require_once 'codebase/lib/RecordLock.inc.php';
require_once 'codebase/lib/RecordVersion.inc.php';
/******************************************************************************
* CODE CONFIG
*****************************************************************************/
// Titles and navigation header.
$nav->addPage(_("Administrators"), $_SERVER['PHP_SELF']);
// The object to validate form input.
$fv = new FormValidator();
// Instantiate a sorting object with the default sort and order. Add SQL for each column.
$so = new SortOrder('admin_id', 'DESC');
$so->setColumn('admin_id', 'admin_id ASC', 'admin_id DESC');
$so->setColumn('username', 'username ASC', 'username DESC');
$so->setColumn('userpass', 'userpass ASC', 'userpass DESC');
$so->setColumn('first_name', 'first_name ASC', 'first_name DESC');
$so->setColumn('last_name', 'last_name ASC', 'last_name DESC');
$so->setColumn('phone', 'phone ASC', 'phone DESC');
$so->setColumn('email', 'email ASC', 'email DESC');
$so->setColumn('priv', 'priv ASC', 'priv DESC');
$so->setColumn('seconds_online', 'seconds_online ASC', 'seconds_online DESC');
$so->setColumn('added_datetime', 'added_datetime ASC', 'added_datetime DESC');
$so->setColumn('last_login_datetime', 'last_login_datetime ASC', 'last_login_datetime DESC');
$so->setColumn('last_access_datetime', 'last_access_datetime ASC', 'last_access_datetime DESC');
$so->setColumn('last_login_ip', 'last_login_ip ASC', 'last_login_ip DESC');
// Instantiate page numbers. Total items are set and calculation is done in the getRecordList function.
$page = new PageNumbers();
$page->setPerPage(getFormData('per_page'), 50);
$page->setPageNumber(getFormData('page_number'));
/******************************************************************************
* MAIN
*****************************************************************************/
// We may want to use the add/edit interface from another script, so this
// allows us to remember which page we came from so we can go back there.
if (getFormData('boomerang', false)) {
App::setBoomerangURL($_SERVER['HTTP_REFERER'], 'admins');
}
if (getFormData('break_list_cache', false)) {
// Break the cache because we are changing the list data.
SessionCache::breakCache($_SERVER['PHP_SELF']);
}
// What action to take.
switch (getFormData('op')) {
case 'add' :
// Initialize variables for the form template.
$frm =& addRecordForm();
$nav->addPage(_("Add Admin"));
$main_template = 'admin_form.ihtml';
break;
case 'edit' :
// Initialize variables for the form template.
$frm =& editRecordForm(getFormData('admin_id'));
$nav->addPage(_("Edit Admin"));
$main_template = 'admin_form.ihtml';
break;
case 'del' :
deleteRecord(getFormData('admin_id'));
if (App::validBoomerangURL('admins')) {
// Display boomerang page.
App::dieBoomerangURL('admins');
}
// Display default page.
App::dieURL($_SERVER['PHP_SELF']);
break;
case 'insert' :
if (getFormdata('cancel', false)) {
App::dieURL($_SERVER['PHP_SELF']);
}
validateInput();
if ($fv->anyErrors()) {
$frm =& addRecordForm();
$frm = array_merge($frm, getFormData());
$nav->addPage(_("Add Admin"));
$main_template = 'admin_form.ihtml';
} else {
$admin_id = insertRecord(getFormData());
if (getFormdata('repeat', false)) {
// Display function again.
App::dieURL($_SERVER['PHP_SELF'] . '?op=add');
} else if (App::validBoomerangURL('admins')) {
// Display boomerang page.
App::dieBoomerangURL('admins');
}
// Display default page.
App::dieURL($_SERVER['PHP_SELF']);
}
break;
case 'update' :
if (getFormdata('reset', false)) {
App::raiseMsg(_("Saved values have been reloaded."), MSG_NOTICE, __FILE__, __LINE__);
App::dieURL($_SERVER['PHP_SELF'] . '?op=edit&admin_id=' . getFormData('admin_id'));
}
if (getFormdata('cancel', false)) {
// Remove lock
$lock =& RecordLock::getInstance($GLOBALS['auth']);
$lock->select('admin_tbl', 'admin_id', getFormData('admin_id'));
$lock->remove();
if (App::validBoomerangURL('admins')) {
// Display boomerang page.
App::dieBoomerangURL('admins');
}
// Display default page.
App::dieURL($_SERVER['PHP_SELF']);
}
validateInput();
if ($fv->anyErrors()) {
$frm =& editRecordForm(getFormData('admin_id'));
$frm = array_merge($frm, getFormData());
$nav->addPage(_("Edit Admin"));
$main_template = 'admin_form.ihtml';
} else {
updateRecord(getFormData());
if (getFormdata('repeat', false)) {
// Display edit function with next available ID.
$qid = DB::query("SELECT admin_id FROM admin_tbl WHERE admin_id > '" . addslashes(getFormData('admin_id')) . "' ORDER BY admin_id ASC LIMIT 1");
if (list($next_id) = mysql_fetch_row($qid)) {
App::dieURL($_SERVER['PHP_SELF'] . '?op=edit&admin_id=' . $next_id);
} else {
App::raiseMsg(_("Cannot edit next, the end of the list was reached"), MSG_NOTICE, __FILE__, __LINE__);
}
} else if (App::validBoomerangURL('admins')) {
// Display boomerang page.
App::dieBoomerangURL('admins');
}
// Display default page.
App::dieURL($_SERVER['PHP_SELF']);
}
break;
default :
$list =& getRecordList();
$main_template = 'admin_list.ihtml';
break;
}
/******************************************************************************
* TEMPLATE INITIALIZATION
*****************************************************************************/
include 'header.ihtml';
include 'codebase/services/templates/' . $main_template;
include 'footer.ihtml';
/******************************************************************************
* FUNCTIONS
*****************************************************************************/
function validateInput()
{
global $fv, $auth;
// If the username was changed during edit, verify.
if (((getFormData('username') != getFormData('old_username')) && 'update' == getFormData('op'))
|| 'insert' == getFormData('op')) {
if ($auth->usernameExists(getFormData('username'))) {
$fv->addError('username', sprintf(_("The username %s already exists. Please choose another."), getFormData('username')));
}
}
// If the username was changed during edit, verify.
if (getFormData('priv') == 'root' && 'root' != $auth->getVal('priv')) {
$fv->addError('priv', sprintf(_("You do not have clearance to create a user with root privileges."), null));
}
$fv->numericRange('admin_id', -32768, 32767, _("Admin id must be a valid number between -32768 and 32767."));
$fv->isEmpty('username', _("Username cannot be blank."));
$fv->stringLength('username', 0, 255, _("Username must contain less than 256 characters."));
$fv->isEmpty('userpass', _("Passwords cannot be blank."));
$fv->stringLength('userpass', 6, 36, _("Passwords must be between 6 and 36 characters long."));
$fv->stringLength('first_name', 0, 255, _("First name must contain less than 256 characters."));
$fv->stringLength('last_name', 0, 255, _("Last name must contain less than 256 characters."));
$fv->stringLength('phone', 0, 255, _("Phone must contain less than 256 characters."));
$fv->validatePhone('phone');
$fv->stringLength('email', 0, 255, _("Email must contain less than 256 characters."));
$fv->validateEmail('email');
$fv->stringLength('county', 0, 255, _("County has an invalid selection."));
$fv->stringLength('priv', 0, 255, _("Priv has an invalid selection."));
}
function &addRecordForm()
{
// set default values for the reset of the fields.
$frm['priv'] = 'admin';
$frm['new_op'] = 'insert';
$frm['submit_caption'] = _("Add admin");
$frm['repeat_caption'] = _("Add & repeat");
$frm['cancel_caption'] = _("Cancel");
return $frm;
}
function &editRecordForm($id)
{
$lock =& RecordLock::getInstance($GLOBALS['auth']);
$lock->select('admin_tbl', 'admin_id', $id);
if ($lock->isLocked() && !$lock->isMine()) {
$lock->dieErrorPage();
} else {
// Get the information for the form.
$qid = DB::query("
SELECT * from admin_tbl
WHERE admin_id = '" . addslashes($id) . "'
");
if (!$frm = mysql_fetch_assoc($qid)) {
App::logMsg('Could not find record with admin_id: ' . $id, LOG_WARNING, __FILE__, __LINE__);
App::raiseMsg(sprintf(_("The requested record %s could not be found"), $id), MSG_ERR, __FILE__, __LINE__);
App::dieBoomerangURL();
}
// Lock this record.
$lock->set('admin_tbl', 'admin_id', $id, $frm['address']);
// Set misc values for the form.
$frm['old_username'] = $frm['username'];
$frm['userpass'] = '***************';
$frm['new_op'] = 'update';
$frm['submit_caption'] = _("Save changes");
$frm['repeat_caption'] = _("Save & edit next");
$frm['reset_caption'] = _("Reset");
$frm['cancel_caption'] = _("Cancel");
$frm['admin_id'] = $id;
return $frm;
}
}
function deleteRecord($id)
{
global $auth;
$lock =& RecordLock::getInstance($GLOBALS['auth']);
$lock->select('admin_tbl', 'admin_id', $id);
if ($lock->isLocked() && !$lock->isMine()) {
$lock->dieErrorPage();
} else {
// Break the cache because we are changing the list data.
SessionCache::breakCache($_SERVER['PHP_SELF']);
// Get the information for this object.
$qid = DB::query("
SELECT username, priv from admin_tbl
WHERE admin_id = '" . addslashes($id) . "'
");
if (! list($name, $priv) = mysql_fetch_row($qid)) {
App::logMsg('Could not find record with admin_id: ' . $id, LOG_WARNING, __FILE__, __LINE__);
App::raiseMsg(sprintf(_("The requested record %s could not be found"), $id), MSG_ERR, __FILE__, __LINE__);
App::dieBoomerangURL();
}
// Get the information for this object.
$qid = DB::query("SELECT COUNT(*) from admin_tbl");
list($num_admins) = mysql_fetch_row($qid);
if ('root' == $priv && 'root' != $auth->getVal('priv')) {
// Only root users can delete root users!
App::raiseMsg(_("You do not have clearance to delete a root administrator."), MSG_NOTICE, __FILE__, __LINE__);
} else if ($num_admins <= 1) {
// There must always be at least one admnistrator!
App::raiseMsg(_("You cannot delete the only administrator in the database. There must be at least one to log in and create other users."), MSG_NOTICE, __FILE__, __LINE__);
} else if ($auth->getVal('user_id') == $id) {
// Do not delete yourself!
App::raiseMsg(_("You cannot delete yourself."), MSG_NOTICE, __FILE__, __LINE__);
} else {
// Delete the record.
DB::query("DELETE FROM admin_tbl WHERE admin_id = '" . addslashes($id) . "'");
App::raiseMsg(sprintf(_("The admin %s has been deleted."), $name), MSG_SUCCESS, __FILE__, __LINE__);
}
// Unlock record.
$lock->remove();
}
}
function insertRecord($frm)
{
global $auth;
// Break the cache because we are changing the list data.
SessionCache::breakCache($_SERVER['PHP_SELF']);
// Insert record data.
DB::query("
INSERT INTO admin_tbl (
username,
first_name,
last_name,
phone,
email,
priv,
added_datetime
) VALUES (
'" . addslashes($frm['username']) . "',
'" . addslashes($frm['first_name']) . "',
'" . addslashes($frm['last_name']) . "',
'" . addslashes($frm['phone']) . "',
'" . addslashes($frm['email']) . "',
'" . addslashes($frm['priv']) . "',
NOW()
)
");
$last_insert_id = mysql_insert_id(DB::getDBH());
// Set admin password.
$auth->setPassword($last_insert_id, $frm['userpass']);
App::raiseMsg(sprintf(_("The admin %s has been added."), $frm['username']), MSG_SUCCESS, __FILE__, __LINE__);
return $last_insert_id;
}
function updateRecord($frm)
{
global $auth;
$lock =& RecordLock::getInstance($GLOBALS['auth']);
$lock->select('admin_tbl', 'admin_id', $frm['admin_id']);
if ($lock->isLocked() && !$lock->isMine()) {
$lock->dieErrorPage();
} else {
// Break the cache because we are changing the list data.
SessionCache::breakCache($_SERVER['PHP_SELF']);
// If the userpass is left blank or with the filler **** characters, we don't want to update it.
if (!empty($frm['userpass']) && !preg_match('/[\*]{4,}/', $frm['userpass'])) {
// Set user password.
$auth->setPassword($frm['admin_id'], $frm['userpass']);
}
// Update record data.
DB::query("
UPDATE admin_tbl SET
username = '" . addslashes($frm['username']) . "',
first_name = '" . addslashes($frm['first_name']) . "',
last_name = '" . addslashes($frm['last_name']) . "',
phone = '" . addslashes($frm['phone']) . "',
email = '" . addslashes($frm['email']) . "',
priv = '" . addslashes($frm['priv']) . "'
WHERE admin_id = '" . addslashes($frm['admin_id']) . "'
");
App::raiseMsg(sprintf(_("The admin %s has been updated."), $frm['username']), MSG_SUCCESS, __FILE__, __LINE__);
// Unlock record.
$lock->remove();
}
}
function &getRecordList()
{
global $page;
global $so;
// Build search query if $qry is not empty.
$sql_delim = 'WHERE';
$search_where_clause = '';
$qry = getFormData('search_query');
if (!empty($qry)) {
$qry_words = preg_split('/[^\w]/', $qry);
for ($i=0; $isetTotalItems($num_results);
$page->calculate();
// Final SQL, with sort and page limiters.
$sql = "
SELECT * FROM admin_tbl
$where_clause
" . $so->getSortOrderSQL() . "
" . $page->getLimitSQL() . "
";
// A unique key for this query, with the total_items in case db records
// were added since the last cache. This identifies a unique set of
// cached data, but we must refer to the list that is cached by a more
// generic name. so that we can flush the cache (if records updated)
// without knowing the hash.
$cache_hash = md5($sql . '|' . $page->total_items);
if (Prefs::getValue('cache_hash', $_SERVER['PHP_SELF']) != $cache_hash) {
SessionCache::breakCache($_SERVER['PHP_SELF']);
Prefs::setValue('cache_hash', $cache_hash, $_SERVER['PHP_SELF']);
}
if (SessionCache::isCached($_SERVER['PHP_SELF']) && FALSE) { ///
// Get the cached results.
$list = SessionCache::getCache($_SERVER['PHP_SELF']);
} else {
// If the list is not already cached, query now.
$qid = DB::query($sql);
// Fill an array with the items for this page.
while ($row = mysql_fetch_assoc($qid)) {
$list[] = $row;
}
// Cache the results.
SessionCache::putCache($list, $_SERVER['PHP_SELF']);
}
return $list;
}
?>