defender::verify_token PHP Method

verify_token() private static method

Makes thorough checks of a posted token, and the token alone. It does not unset token.
private static verify_token ( integer $post_time = 5 ) : boolean
$post_time integer The time in seconds before a posted form is accepted, this is used to prevent spamming post submissions
return boolean
    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;
    }