1
0
mirror of https://github.com/matrix-org/matrix-js-sdk.git synced 2025-08-07 23:02:56 +03:00

Fix registration check your emails stage regression (#3616)

* Fix registration check your emails stage regression

* Simplify diff

* Add test
This commit is contained in:
Michael Telatynski
2023-07-24 15:08:17 +01:00
committed by GitHub
parent 6b018b6927
commit 533c21a515
2 changed files with 48 additions and 4 deletions

View File

@@ -375,7 +375,7 @@ describe("InteractiveAuth", () => {
await expect(ia.attemptAuth.bind(ia)).rejects.toThrow(new Error("No appropriate authentication flow found")); await expect(ia.attemptAuth.bind(ia)).rejects.toThrow(new Error("No appropriate authentication flow found"));
}); });
it("should handle unexpected error types without data propery set", async () => { it("should handle unexpected error types without data property set", async () => {
const doRequest = jest.fn(); const doRequest = jest.fn();
const stateUpdated = jest.fn(); const stateUpdated = jest.fn();
const requestEmailToken = jest.fn(); const requestEmailToken = jest.fn();
@@ -559,4 +559,40 @@ describe("InteractiveAuth", () => {
ia.chooseStage(); ia.chooseStage();
expect(ia.getChosenFlow()?.stages).toEqual([AuthType.Password]); expect(ia.getChosenFlow()?.stages).toEqual([AuthType.Password]);
}); });
it("should fire stateUpdated callback if with error when encountered", async () => {
const doRequest = jest.fn();
const stateUpdated = jest.fn();
const ia = new InteractiveAuth({
matrixClient: getFakeClient(),
doRequest: doRequest,
stateUpdated: stateUpdated,
requestEmailToken: jest.fn(),
authData: {
session: "sessionId",
flows: [{ stages: [AuthType.Password] }],
params: {
[AuthType.Password]: { param: "aa" },
},
},
});
// first we expect a call here
stateUpdated.mockImplementation((stage) => {
expect(stage).toEqual(AuthType.Password);
ia.submitAuthDict({
type: AuthType.Password,
});
});
// .. which should trigger a call here
doRequest.mockRejectedValue(new MatrixError({ errcode: "M_UNKNOWN", error: "This is an error" }));
await Promise.allSettled([ia.attemptAuth()]);
expect(stateUpdated).toHaveBeenCalledWith("m.login.password", {
errcode: "M_UNKNOWN",
error: "This is an error",
});
});
}); });

View File

@@ -264,8 +264,8 @@ export class InteractiveAuth<T> {
private readonly requestEmailTokenCallback: IOpts<T>["requestEmailToken"]; private readonly requestEmailTokenCallback: IOpts<T>["requestEmailToken"];
private readonly supportedStages?: Set<string>; private readonly supportedStages?: Set<string>;
// The current latest data received from the server during the user interactive auth flow. // The current latest data or error received from the server during the user interactive auth flow.
private data: IAuthData; private data: IAuthData & MatrixError["data"];
private emailSid?: string; private emailSid?: string;
private requestingEmailToken = false; private requestingEmailToken = false;
private attemptAuthDeferred: IDeferred<T> | null = null; private attemptAuthDeferred: IDeferred<T> | null = null;
@@ -549,7 +549,7 @@ export class InteractiveAuth<T> {
matrixError.data.session = (this.data as IAuthData).session; matrixError.data.session = (this.data as IAuthData).session;
} }
if (matrixError) { if (matrixError) {
this.data = matrixError.data as IAuthData; this.data = matrixError.data;
} }
try { try {
this.startNextAuthStage(); this.startNextAuthStage();
@@ -602,6 +602,14 @@ export class InteractiveAuth<T> {
return; return;
} }
if (this.data?.errcode || this.data?.error) {
this.stateUpdatedCallback(nextStage, {
errcode: this.data?.errcode || "",
error: this.data?.error || "",
});
return;
}
this.stateUpdatedCallback(nextStage, nextStage === EMAIL_STAGE_TYPE ? { emailSid: this.emailSid } : {}); this.stateUpdatedCallback(nextStage, nextStage === EMAIL_STAGE_TYPE ? { emailSid: this.emailSid } : {});
} }