mirror of
				https://github.com/zulip/zulip.git
				synced 2025-11-04 05:53:43 +00:00 
			
		
		
		
	This handles a rare race condition that occurs when the session hash is not updated by the backend during the password change process. This mostly occurs in puppeteer tests, but could occur to a user.
		
			
				
	
	
		
			73 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			73 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
"use strict";
 | 
						||
 | 
						||
const util = require("./util");
 | 
						||
 | 
						||
// Miscellaneous early setup.
 | 
						||
exports.password_change_in_progress = false;
 | 
						||
$(() => {
 | 
						||
    if (util.is_mobile()) {
 | 
						||
        // Disable the tutorial; it's ugly on mobile.
 | 
						||
        page_params.needs_tutorial = false;
 | 
						||
    }
 | 
						||
 | 
						||
    page_params.page_load_time = new Date().getTime();
 | 
						||
 | 
						||
    // Display loading indicator.  This disappears after the first
 | 
						||
    // get_events completes.
 | 
						||
    if (!page_params.needs_tutorial) {
 | 
						||
        loading.make_indicator($("#page_loading_indicator"), {
 | 
						||
            text: "Loading...",
 | 
						||
            abs_positioned: true,
 | 
						||
        });
 | 
						||
    }
 | 
						||
 | 
						||
    // This is an issue fix where in jQuery v3 the result of outerHeight on a node
 | 
						||
    // that doesn’t exist is now “undefined” rather than “null”, which means it
 | 
						||
    // will no longer cast to a Number but rather NaN. For this, we create the
 | 
						||
    // `safeOuterHeight` and `safeOuterWidth` functions to safely return a result
 | 
						||
    // (or 0).
 | 
						||
    $.fn.safeOuterHeight = function (...args) {
 | 
						||
        return this.outerHeight(...args) || 0;
 | 
						||
    };
 | 
						||
 | 
						||
    $.fn.safeOuterWidth = function (...args) {
 | 
						||
        return this.outerWidth(...args) || 0;
 | 
						||
    };
 | 
						||
 | 
						||
    // For some reason, jQuery wants this to be attached to an element.
 | 
						||
    $(document).ajaxError((event, xhr) => {
 | 
						||
        if (exports.password_change_in_progress) {
 | 
						||
            // The backend for handling password change API requests
 | 
						||
            // will replace the user's session; this results in a
 | 
						||
            // brief race where any API request will fail with a 401
 | 
						||
            // error after the old session is deactivated but before
 | 
						||
            // the new one has been propagated to the browser.  So we
 | 
						||
            // skip our normal HTTP 401 error handling if we're in the
 | 
						||
            // process of executing a password change.
 | 
						||
            return;
 | 
						||
        }
 | 
						||
 | 
						||
        if (xhr.status === 401) {
 | 
						||
            // We got logged out somehow, perhaps from another window
 | 
						||
            // changing the user's password, or a session timeout.  We
 | 
						||
            // could display an error message, but jumping right to
 | 
						||
            // the login page conveys the same information with a
 | 
						||
            // smoother re-login experience.
 | 
						||
            window.location.replace(page_params.login_page);
 | 
						||
        }
 | 
						||
    });
 | 
						||
 | 
						||
    if (typeof $ !== "undefined") {
 | 
						||
        $.fn.expectOne = function () {
 | 
						||
            if (blueslip && this.length !== 1) {
 | 
						||
                blueslip.error("Expected one element in jQuery set, " + this.length + " found");
 | 
						||
            }
 | 
						||
            return this;
 | 
						||
        };
 | 
						||
 | 
						||
        $.fn.within = function (sel) {
 | 
						||
            return $(this).is(sel) || $(this).closest(sel).length;
 | 
						||
        };
 | 
						||
    }
 | 
						||
});
 |