private static function verify_token($post_time = 5)
{
global $locale, $userdata, $defender;
$error = FALSE;
$defender->debug = FALSE;
$settings = fusion_get_settings();
$token_data = explode(".", stripinput($_POST['fusion_token']));
// check if the token has the correct format
if (count($token_data) == 3) {
list($tuser_id, $token_time, $hash) = $token_data;
$user_id = iMEMBER ? $userdata['user_id'] : 0;
$algo = $settings['password_algorithm'];
$salt = md5(isset($userdata['user_salt']) && !isset($_POST['login']) ? $userdata['user_salt'] . SECRET_KEY_SALT : SECRET_KEY_SALT);
// check if the logged user has the same ID as the one in token
if ($tuser_id != $user_id) {
$error = $locale['token_error_4'];
// make sure the token datestamp is a number
} elseif (!isnum($token_time)) {
$error = $locale['token_error_5'];
// check if the hash is valid
} elseif ($hash != hash_hmac($algo, $user_id . $token_time . stripinput($_POST['form_id']) . SECRET_KEY, $salt)) {
$error = $locale['token_error_7'];
// check if a post wasn't made too fast. Set $post_time to 0 for instant. Go for System Settings later.
} elseif (time() - $token_time < $post_time) {
$error = $locale['token_error_6'];
}
} else {
// token format is incorrect
$error = $locale['token_error_8'];
}
// Check if any error was set
if ($error !== FALSE) {
$defender->stop();
if ($defender->debug) {
addNotice('danger', $error);
}
return FALSE;
}
// If we made it so far everything is good
if ($defender->debug) {
addNotice('info', 'The token for "' . stripinput($_POST['form_id']) . '" has been validated successfully');
}
return TRUE;
}