GetDb();
$error = "";
$forgotmessage = "";
$changepwhash = "";
/**
* A function to send lost password recovery email to a specified admin user (by name)
*
* @internal
* @access private
* @param string the username
* @return results from the attempt to send a message.
*/
function send_recovery_email($username)
{
$gCms = cmsms();
$config = $gCms->GetConfig();
$userops = $gCms->GetUserOperations();
$user = $userops->LoadUserByUsername($username);
$obj = cms_utils::get_module('CMSMailer');
if ($obj == null)
{
return false;
}
$obj->AddAddress($user->email, html_entity_decode($user->firstname . ' ' . $user->lastname));
$obj->SetSubject(lang('lostpwemailsubject',html_entity_decode(get_site_preference('sitename','CMSMS Site'))));
$url = $config['admin_url'] . '/login.php?recoverme=' . md5(md5($config['root_path'] . '--' . $user->username . md5($user->password)));
$body = lang('lostpwemail',html_entity_decode(get_site_preference('sitename','CMSMS Site')), $user->username, $url);
$obj->SetBody($body);
audit('','Core','Sent Lost Password Email for '.$username);
return $obj->Send();
}
/**
* A function find a matching user id given an identity hash
*
* @internal
* @access private
* @param string the hash
* @return object The matching user object if found, or null otherwise.
*/
function find_recovery_user($hash)
{
$gCms = cmsms();
$config = $gCms->GetConfig();
$userops = $gCms->GetUserOperations();
foreach ($userops->LoadUsers() as $user)
{
if ($hash == md5(md5($config['root_path'] . '--' . $user->username . md5($user->password))))
{
return $user;
}
}
return null;
}
//Redirect to the normal login screen if we hit cancel on the forgot pw one
//Otherwise, see if we have a forgotpw hit
if ((isset($_REQUEST['forgotpwform']) || isset($_REQUEST['forgotpwchangeform'])) && isset($_REQUEST['logincancel']))
{
redirect('login.php');
}
else if (isset($_REQUEST['forgotpwform']) && isset($_REQUEST['forgottenusername']))
{
$userops = $gCms->GetUserOperations();
$oneuser = $userops->LoadUserByUsername($_REQUEST['forgottenusername']);
if ($oneuser != null)
{
if ($oneuser->email == '')
{
$error = lang('nopasswordforrecovery');
}
else if (send_recovery_email($_REQUEST['forgottenusername']))
{
$warningLogin = lang('recoveryemailsent');
}
else
{
$error = lang('errorsendingemail');
}
}
else
{
Events::SendEvent('Core','LoginFailed',array('user'=>$_REQUEST['forgottenusername']));
$error = lang('usernotfound');
}
}
else if (isset($_REQUEST['recoverme']) && $_REQUEST['recoverme'])
{
$user = find_recovery_user($_REQUEST['recoverme']);
if ($user == null)
{
$error = lang('usernotfound');
}
else
{
$changepwhash = $_REQUEST['recoverme'];
}
}
else if (isset($_REQUEST['forgotpwchangeform']) && $_REQUEST['forgotpwchangeform'])
{
$user = find_recovery_user($_REQUEST['changepwhash']);
if ($user == null)
{
$error = lang('usernotfound');
}
else
{
if ($_REQUEST['password'] != '')
{
if ($_REQUEST['password'] == $_REQUEST['passwordagain'])
{
$user->SetPassword($_REQUEST['password']);
$user->Save();
// put mention into the admin log
$ip_passw_recovery = cms_utils::get_real_ip();
audit('','Core','Completed lost password recovery for: '.$user->username.' (IP: '.$ip_passw_recovery.')');
$acceptLogin = lang('passwordchangedlogin');
$changepwhash = '';
}
else
{
$error = lang('nopasswordmatch');
$changepwhash = $_REQUEST['changepwhash'];
}
}
else
{
$error = lang('nofieldgiven', array(lang('password')));
$changepwhash = $_REQUEST['changepwhash'];
}
}
}
if (isset($_SESSION['logout_user_now']))
{
debug_buffer("Logging out. Cleaning cookies and session variables.");
unset($_SESSION['logout_user_now']);
unset($_SESSION['cms_admin_user_id']);
unset($_SESSION[CMS_USER_KEY]);
cms_cookies::erase('cms_admin_user_id');
cms_cookies::erase('cms_passhash');
cms_cookies::erase(CMS_SECURE_PARAM_NAME);
}
else if ( isset($_SESSION['redirect_url']) )
{
$_SESSION["t_redirect_url"] = $_SESSION["redirect_url"];
$no_redirect = true;
$is_logged_in = check_login($no_redirect);
$_SESSION["redirect_url"] = $_SESSION["t_redirect_url"];
unset($_SESSION["t_redirect_url"]);
if (true == $is_logged_in)
{
$userid = get_userid();
$homepage = get_preference($userid,'homepage'.'index.php');
$homepage = str_replace('&','&',$homepage);
$tmp = explode('?',$homepage);
if( !file_exists($tmp[0]) ) $tmp[0] = 'index.php';
$tmp2 = array();
if( isset($tmp[1]) )
{
parse_str($tmp[1],$tmp2);
if( in_array('_s_',array_keys($tmp2)) ) unset($tmp2['_s_']);
if( in_array('sp_',array_keys($tmp2)) ) unset($tmp2['sp_']);
}
$tmp2[CMS_SECURE_PARAM_NAME] = $_SESSION[CMS_USER_KEY];
$tmp3 = array();
foreach( $tmp2 as $k => $v )
{
$tmp3[] = $k.'='.$v;
}
$homepage = $tmp[0].'?'.implode('&',$tmp3);
$homepage = html_entity_decode($homepage);
redirect($homepage);
}
}
if (isset($_POST["logincancel"]))
{
debug_buffer("Login cancelled. Returning to content.");
redirect($config["root_url"].'/index.php', true);
}
if (isset($_POST["username"]) && isset($_POST["password"])) {
$username = "";
if (isset($_POST["username"])) $username = cleanValue($_POST["username"]);
$password = "";
if (isset($_POST["password"])) $password = $_POST["password"];
$userops = $gCms->GetUserOperations();
$oneuser = $userops->LoadUserByUsername($username, $password, true, true);
debug_buffer("Got user by username");
debug_buffer($oneuser);
if ($username != "" && $password != "" && isset($oneuser) && $oneuser == true && isset($_POST["loginsubmit"]))
{
debug_buffer("Starting login procedure. Setting userid so that other pages will pick it up and set a cookie.");
generate_user_object($oneuser->id);
$_SESSION['login_user_id'] = $oneuser->id;
$_SESSION['login_user_username'] = $oneuser->username;
// put mention into the admin log
audit($oneuser->id, "Admin Username: ".$oneuser->username, 'Logged In');
#Now call the event
Events::SendEvent('Core', 'LoginPost', array('user' => &$oneuser));
// redirect to upgrade if db_schema it's old
$current_version = $CMS_SCHEMA_VERSION;
$query = "SELECT version from ".cms_db_prefix()."version";
$row = $db->GetRow($query);
if ($row) $current_version = $row["version"];
if ($current_version < $CMS_SCHEMA_VERSION)
{
redirect($gCms->config['root_url'] . "/install/upgrade.php");
}
if (isset($_POST['redirect_url']))
{
$_SESSION['redirect_url'] = $_POST['redirect_url'];
}
if (isset($_SESSION["redirect_url"]))
{
if (isset($gCms->config) and $gCms->config['debug'] == true)
{
echo "Debug is on. Redirecting disabled... Please click this link to continue.
";
echo "".$_SESSION["redirect_url"]."
";
foreach ($gCms->errors as $globalerror)
{
echo $globalerror;
}
}
else
{
// attempt to redirect to the originally requested page
$tmp = $_SESSION["redirect_url"];
unset($_SESSION["redirect_url"]);
if( strstr($tmp,CMS_SECURE_PARAM_NAME.'=') !== FALSE )
{
$the_url = new cms_url($tmp);
$the_url->set_queryvar(CMS_SECURE_PARAM_NAME,$_SESSION[CMS_USER_KEY]);
$tmp = (string)$the_url;
}
if( !strstr($tmp,'.php') || endswith($tmp,'/') )
{
// force the url to go to index.php
$tmp = $config['admin_url'].'/index.php?'.CMS_SECURE_PARAM_NAME.'='.$_SESSION[CMS_USER_KEY];
debug_to_log('change session var to '.$tmp);
}
redirect($tmp);
}
unset($_SESSION["redirect_url"]);
}
else
{
if (isset($config) and $config['debug'] == true)
{
$url = 'index.php?'.CMS_SECURE_PARAM_NAME.'='.$_SESSION[CMS_USER_KEY];
echo "Debug is on. Redirecting disabled... Please click this link to continue.
";
echo "{$url}
";
foreach ($gCms->errors as $globalerror)
{
echo $globalerror;
}
}
else
{
$homepage = get_preference($oneuser->id,'homepage');
// quick hacks to remove old secure param name from homepage url
// and replace with the correct one.
$homepage = str_replace('&','&',$homepage);
$tmp = explode('?',$homepage);
if( !file_exists($tmp[0]) ) $tmp[0] = 'index.php';
@parse_str($tmp[1],$tmp2);
if( in_array('_s_',array_keys($tmp2)) ) unset($tmp2['_s_']);
if( in_array('sp_',array_keys($tmp2)) ) unset($tmp2['sp_']);
$tmp2[CMS_SECURE_PARAM_NAME] = $_SESSION[CMS_USER_KEY];
foreach( $tmp2 as $k => $v )
{
$tmp3[] = $k.'='.$v;
}
$homepage = $tmp[0].'?'.implode('&',$tmp3);
// and redirect.
$homepage = html_entity_decode($homepage);
redirect($homepage);
}
}
return;
#redirect("index.php");
}
else if (isset($_POST['loginsubmit'])) { //No error if changing languages
$error .= lang('usernameincorrect');
debug_buffer("Login failed. Error is: " . $error);
Events::SendEvent('Core','LoginFailed',array('user'=>$_POST['username']));;
// put mention into the admin log
$ip_login_failed = cms_utils::get_real_ip();
if($ip_login_failed) // <- Silently ignore audit if return values is not ture, had admin XSS vulne.
audit('', '(IP: ' . $ip_login_failed . ') ' . "Admin Username: " . $username, 'Login Failed');
#Now call the event
//Events::SendEvent('Core', 'LoginPost', $username);
}
else
{
debug_buffer($_POST["loginsubmit"]);
}
}
// Language shizzle
cms_admin_sendheaders();
header("Content-Language: " . CmsNlsOperations::get_current_language());
//CHANGED
debug_buffer('debug is:' . $error);
$themeObject = cms_utils::get_theme_object();
$vars = array('error'=>$error);
if( isset($warningLogin) ) $vars['warningLogin'] = $warningLogin;
if( isset($acceptLogin) ) $vars['acceptLogin'] = $acceptLogin;
if( isset($changepwhash) ) $vars['changepwhash'] = $changepwhash;
$themeObject->do_login($vars);
?>
config) and $gCms->config['debug'] == true)
{
foreach ($gCms->errors as $globalerror)
{
echo $globalerror;
}
}
# vim:ts=4 sw=4 noet
?>