mirror of
https://github.com/zulip/zulip.git
synced 2025-11-04 22:13:26 +00:00
channel: Simplify password change tracking.
Move the password tracking variables from setup to channel module. Track password_change requests in channel. Directly use xhr object to store `password_changes` information. Tests modified to accomodote this change by converting strings to objects.
This commit is contained in:
@@ -19,15 +19,6 @@ const xhr_401 = {
|
|||||||
responseText: '{"msg": "Use cannnot access XYZ"}',
|
responseText: '{"msg": "Use cannnot access XYZ"}',
|
||||||
};
|
};
|
||||||
|
|
||||||
const xhr_password_changes = new WeakMap();
|
|
||||||
xhr_password_changes.set(xhr_401, 0);
|
|
||||||
|
|
||||||
const setup = mock_esm("../../static/js/setup", {
|
|
||||||
password_change_in_progress: false,
|
|
||||||
password_changes: 0,
|
|
||||||
xhr_password_changes,
|
|
||||||
});
|
|
||||||
|
|
||||||
let login_to_access_shown = false;
|
let login_to_access_shown = false;
|
||||||
mock_esm("../../static/js/spectators", {
|
mock_esm("../../static/js/spectators", {
|
||||||
login_to_access: () => {
|
login_to_access: () => {
|
||||||
@@ -44,7 +35,7 @@ set_global("window", {
|
|||||||
const reload_state = zrequire("reload_state");
|
const reload_state = zrequire("reload_state");
|
||||||
const channel = zrequire("channel");
|
const channel = zrequire("channel");
|
||||||
|
|
||||||
const default_stub_xhr = "default-stub-xhr";
|
const default_stub_xhr = {"default-stub-xhr": 0};
|
||||||
|
|
||||||
const $ = mock_jquery({});
|
const $ = mock_jquery({});
|
||||||
|
|
||||||
@@ -176,7 +167,7 @@ test("normal_post", () => {
|
|||||||
|
|
||||||
let orig_success_called;
|
let orig_success_called;
|
||||||
let orig_error_called;
|
let orig_error_called;
|
||||||
const stub_xhr = "stub-xhr-normal-post";
|
const stub_xhr = {"stub-xhr-normal-post": 0};
|
||||||
|
|
||||||
test_with_mock_ajax({
|
test_with_mock_ajax({
|
||||||
xhr: stub_xhr,
|
xhr: stub_xhr,
|
||||||
@@ -273,12 +264,12 @@ test("authentication_error_401_password_change_in_progress", () => {
|
|||||||
// password_change_in_progress = true
|
// password_change_in_progress = true
|
||||||
check_ajax_options(options) {
|
check_ajax_options(options) {
|
||||||
page_params.is_spectator = true;
|
page_params.is_spectator = true;
|
||||||
setup.password_change_in_progress = true;
|
channel.set_password_change_in_progress(true);
|
||||||
|
|
||||||
options.simulate_error();
|
options.simulate_error();
|
||||||
assert.ok(!login_to_access_shown);
|
assert.ok(!login_to_access_shown);
|
||||||
|
|
||||||
setup.password_change_in_progress = false;
|
channel.set_password_change_in_progress(false);
|
||||||
page_params.is_spectator = false;
|
page_params.is_spectator = false;
|
||||||
login_to_access_shown = false;
|
login_to_access_shown = false;
|
||||||
},
|
},
|
||||||
@@ -372,7 +363,7 @@ test("retry", () => {
|
|||||||
test("too_many_pending", () => {
|
test("too_many_pending", () => {
|
||||||
channel.clear_for_tests();
|
channel.clear_for_tests();
|
||||||
$.ajax = () => {
|
$.ajax = () => {
|
||||||
const xhr = "stub";
|
const xhr = {stub: 0};
|
||||||
return xhr;
|
return xhr;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -3,9 +3,19 @@ import $ from "jquery";
|
|||||||
import * as blueslip from "./blueslip";
|
import * as blueslip from "./blueslip";
|
||||||
import {page_params} from "./page_params";
|
import {page_params} from "./page_params";
|
||||||
import * as reload_state from "./reload_state";
|
import * as reload_state from "./reload_state";
|
||||||
import * as setup from "./setup";
|
|
||||||
import * as spectators from "./spectators";
|
import * as spectators from "./spectators";
|
||||||
|
|
||||||
|
let password_change_in_progress = false;
|
||||||
|
export let password_changes = 0;
|
||||||
|
|
||||||
|
export function set_password_change_in_progress(value) {
|
||||||
|
password_change_in_progress = value;
|
||||||
|
if (!value) {
|
||||||
|
password_changes += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export const xhr_password_changes = new WeakMap();
|
||||||
|
|
||||||
const pending_requests = [];
|
const pending_requests = [];
|
||||||
|
|
||||||
export function clear_for_tests() {
|
export function clear_for_tests() {
|
||||||
@@ -56,10 +66,7 @@ function call(args, idempotent) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (xhr.status === 401) {
|
if (xhr.status === 401) {
|
||||||
if (
|
if (password_change_in_progress || xhr.password_changes !== password_changes) {
|
||||||
setup.password_change_in_progress ||
|
|
||||||
setup.xhr_password_changes.get(xhr) !== setup.password_changes
|
|
||||||
) {
|
|
||||||
// The backend for handling password change API requests
|
// The backend for handling password change API requests
|
||||||
// will replace the user's session; this results in a
|
// will replace the user's session; this results in a
|
||||||
// brief race where any API request will fail with a 401
|
// brief race where any API request will fail with a 401
|
||||||
@@ -135,6 +142,13 @@ function call(args, idempotent) {
|
|||||||
|
|
||||||
const jqXHR = $.ajax(args);
|
const jqXHR = $.ajax(args);
|
||||||
add_pending_request(jqXHR);
|
add_pending_request(jqXHR);
|
||||||
|
|
||||||
|
// Remember the number of completed password changes when the
|
||||||
|
// request was initiated. This allows us to detect race
|
||||||
|
// situations where a password change occurred before we got a
|
||||||
|
// response that failed due to the ongoing password change.
|
||||||
|
jqXHR.password_changes = password_changes;
|
||||||
|
|
||||||
return jqXHR;
|
return jqXHR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ import * as pill_typeahead from "./pill_typeahead";
|
|||||||
import * as settings_bots from "./settings_bots";
|
import * as settings_bots from "./settings_bots";
|
||||||
import * as settings_data from "./settings_data";
|
import * as settings_data from "./settings_data";
|
||||||
import * as settings_ui from "./settings_ui";
|
import * as settings_ui from "./settings_ui";
|
||||||
import * as setup from "./setup";
|
|
||||||
import * as ui_report from "./ui_report";
|
import * as ui_report from "./ui_report";
|
||||||
import * as user_pill from "./user_pill";
|
import * as user_pill from "./user_pill";
|
||||||
import * as user_profile from "./user_profile";
|
import * as user_profile from "./user_profile";
|
||||||
@@ -443,14 +442,14 @@ export function set_up() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
setup.set_password_change_in_progress(true);
|
channel.set_password_change_in_progress(true);
|
||||||
const opts = {
|
const opts = {
|
||||||
success_continuation() {
|
success_continuation() {
|
||||||
setup.set_password_change_in_progress(false);
|
channel.set_password_change_in_progress(false);
|
||||||
overlays.close_modal("#change_password_modal");
|
overlays.close_modal("#change_password_modal");
|
||||||
},
|
},
|
||||||
error_continuation() {
|
error_continuation() {
|
||||||
setup.set_password_change_in_progress(false);
|
channel.set_password_change_in_progress(false);
|
||||||
},
|
},
|
||||||
error_msg_element: change_password_error,
|
error_msg_element: change_password_error,
|
||||||
failure_msg_html: null,
|
failure_msg_html: null,
|
||||||
|
|||||||
@@ -6,17 +6,6 @@ import {page_params} from "./page_params";
|
|||||||
import * as util from "./util";
|
import * as util from "./util";
|
||||||
|
|
||||||
// Miscellaneous early setup.
|
// Miscellaneous early setup.
|
||||||
export let password_change_in_progress = false;
|
|
||||||
export let password_changes = 0;
|
|
||||||
export const xhr_password_changes = new WeakMap();
|
|
||||||
|
|
||||||
export function set_password_change_in_progress(value) {
|
|
||||||
password_change_in_progress = value;
|
|
||||||
if (!value) {
|
|
||||||
password_changes += 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$(() => {
|
$(() => {
|
||||||
if (util.is_mobile()) {
|
if (util.is_mobile()) {
|
||||||
// Disable the tutorial; it's ugly on mobile.
|
// Disable the tutorial; it's ugly on mobile.
|
||||||
@@ -47,14 +36,6 @@ $(() => {
|
|||||||
return this.outerWidth(...args) || 0;
|
return this.outerWidth(...args) || 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Remember the number of completed password changes when the
|
|
||||||
// request was initiated. This allows us to detect race
|
|
||||||
// situations where a password change occurred before we got a
|
|
||||||
// response that failed due to the ongoing password change.
|
|
||||||
$(document).ajaxSend((event, xhr) => {
|
|
||||||
xhr_password_changes.set(xhr, password_changes);
|
|
||||||
});
|
|
||||||
|
|
||||||
$.fn.expectOne = function () {
|
$.fn.expectOne = function () {
|
||||||
if (blueslip && this.length !== 1) {
|
if (blueslip && this.length !== 1) {
|
||||||
blueslip.error("Expected one element in jQuery set, " + this.length + " found");
|
blueslip.error("Expected one element in jQuery set, " + this.length + " found");
|
||||||
|
|||||||
Reference in New Issue
Block a user