Commit 79ccbff2 authored by Chris Graham's avatar Chris Graham
Browse files

Fixed MANTIS-4109 (Infinite URL combinations due to redirects)

parent ecb30af3
Loading
Loading
Loading
Loading
+0 −0

File changed.

Preview suppressed by a .gitattributes entry or the file's encoding is unsupported.

+4 −2
Changes for pages/modules/join.php: 4 added lines, 2 removed lines.
Original line number Diff line number Diff line
@@ -149,7 +149,8 @@ class Module_join
            $map['email_address'] = $email_address;
        }
        $redirect = get_param_string('redirect', '');
        if ($redirect != '') {
        require_code('global4');
        if (($redirect != '') && (!is_unhelpful_redirect($redirect))) {
            $map['redirect'] = $redirect;
        }
        $url = build_url($map, '_SELF');
@@ -187,7 +188,8 @@ class Module_join

        $map = array('page' => '_SELF', 'type' => 'step3');
        $redirect = get_param_string('redirect', '');
        if ($redirect != '') {
        require_code('global4');
        if (($redirect != '') && (!is_unhelpful_redirect($redirect))) {
            $map['redirect'] = $redirect;
        }
        $url = build_url($map, '_SELF');
+2 −18
Changes for pages/modules/login.php: 2 added lines, 18 removed lines.
Original line number Diff line number Diff line
@@ -204,24 +204,8 @@ class Module_login
        // Where we will be redirected to after login, for GET requests (POST requests are handled further in the code)
        $redirect_default = get_self_url(true); // The default is to go back to where we are after login. Note that this is not necessarily the URL to the login module, as login screens happen on top of screens you're not allowed to access. If it is the URL to the login module, we'll realise this later in this code. This URL is coded to not redirect to root if we have $_POST, because we relay $_POST values and have intelligence (via $passion).
        $redirect = get_param_string('redirect', $redirect_default); // ... but often the login screen's URL tells us where to go back to
        $unhelpful_redirect = false;
        $unhelpful_url_stubs = array(
            static_evaluate_tempcode(build_url(array('page' => 'login'), '', null, false, false, true)),
            static_evaluate_tempcode(build_url(array('page' => 'login', 'type' => 'browse'), '', null, false, false, true)),
            static_evaluate_tempcode(build_url(array('page' => 'login', 'type' => 'login'), '', null, false, false, true)),
            static_evaluate_tempcode(build_url(array('page' => 'login', 'type' => 'logout'), '', null, false, false, true)),
            static_evaluate_tempcode(build_url(array('page' => 'login'), '_SELF', null, false, false, true)),
            static_evaluate_tempcode(build_url(array('page' => 'login', 'type' => 'browse'), '_SELF', null, false, false, true)),
            static_evaluate_tempcode(build_url(array('page' => 'login', 'type' => 'login'), '_SELF', null, false, false, true)),
            static_evaluate_tempcode(build_url(array('page' => 'login', 'type' => 'logout'), '_SELF', null, false, false, true)),
        );
        foreach ($unhelpful_url_stubs as $unhelpful_url_stub) {
            if (substr($redirect, 0, strlen($unhelpful_url_stub)) == $unhelpful_url_stub) {
                $unhelpful_redirect = true;
                break;
            }
        }
        if (($redirect != '') && (!$unhelpful_redirect)) {
        require_code('global4');
        if (($redirect != '') && (!is_unhelpful_redirect($redirect))) {
            $passion->attach(form_input_hidden('redirect', $redirect));
        } else { // We will only go to the zone-default page if an explicitly blank redirect URL is given or if the redirect would take us direct to another login or logout page
            global $ZONE;
+32 −0
Changes for sources/global4.php: 32 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -597,3 +597,35 @@ function find_normative_performance()
    $percentage = 100.0 * (0.055 / (microtime(true) - $t));
    return $percentage;
}

/**
 * Find if a particular redirect is itself pointing to a login/join page, and thus should not be injected as a nested redirect.
 *
 * @param  string $redirect Redirect to check
 * @return boolean If it is unhelpful
 */
function is_unhelpful_redirect($redirect)
{
    $unhelpful_url_stubs = array(
        static_evaluate_tempcode(build_url(array('page' => 'login'), '', null, false, false, true)),
        static_evaluate_tempcode(build_url(array('page' => 'login', 'type' => 'browse'), '', null, false, false, true)),
        static_evaluate_tempcode(build_url(array('page' => 'login', 'type' => 'login'), '', null, false, false, true)),
        static_evaluate_tempcode(build_url(array('page' => 'login', 'type' => 'logout'), '', null, false, false, true)),
        static_evaluate_tempcode(build_url(array('page' => 'login'), '_SELF', null, false, false, true)),
        static_evaluate_tempcode(build_url(array('page' => 'login', 'type' => 'browse'), '_SELF', null, false, false, true)),
        static_evaluate_tempcode(build_url(array('page' => 'login', 'type' => 'login'), '_SELF', null, false, false, true)),
        static_evaluate_tempcode(build_url(array('page' => 'login', 'type' => 'logout'), '_SELF', null, false, false, true)),
        static_evaluate_tempcode(build_url(array('page' => 'join'), '', null, false, false, true)),
        static_evaluate_tempcode(build_url(array('page' => 'join', 'type' => 'browse'), '', null, false, false, true)),
        static_evaluate_tempcode(build_url(array('page' => 'join', 'type' => 'step2'), '', null, false, false, true)),
        static_evaluate_tempcode(build_url(array('page' => 'join', 'type' => 'step3'), '', null, false, false, true)),
        static_evaluate_tempcode(build_url(array('page' => 'join', 'type' => 'step4'), '', null, false, false, true)),
    );
    foreach ($unhelpful_url_stubs as $unhelpful_url_stub) {
        if (substr($redirect, 0, strlen($unhelpful_url_stub)) == $unhelpful_url_stub) {
            return true;
        }
    }

    return false;
}