You've already forked matrix-js-sdk
mirror of
https://github.com/matrix-org/matrix-js-sdk.git
synced 2025-08-09 10:22:46 +03:00
Support polling
for out-of-band auth completion
This commit is contained in:
@@ -94,6 +94,8 @@ function InteractiveAuth(opts) {
|
|||||||
if (opts.sessionId) this._data.session = opts.sessionId;
|
if (opts.sessionId) this._data.session = opts.sessionId;
|
||||||
this._clientSecret = opts.clientSecret || this._matrixClient.generateClientSecret();
|
this._clientSecret = opts.clientSecret || this._matrixClient.generateClientSecret();
|
||||||
this._emailSid = opts.emailSid;
|
this._emailSid = opts.emailSid;
|
||||||
|
|
||||||
|
this._currentStage = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
InteractiveAuth.prototype = {
|
InteractiveAuth.prototype = {
|
||||||
@@ -117,6 +119,34 @@ InteractiveAuth.prototype = {
|
|||||||
return this._completionDeferred.promise;
|
return this._completionDeferred.promise;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Poll to check if the auth session or current stage has been
|
||||||
|
* completed out-of-band. If so, the attemptAuth promise will
|
||||||
|
* be resolved.
|
||||||
|
*/
|
||||||
|
poll: function() {
|
||||||
|
if (!this._data.session) return;
|
||||||
|
|
||||||
|
let authDict = {};
|
||||||
|
if (this._currentStage == EMAIL_STAGE_TYPE) {
|
||||||
|
// The email can be validated out-of-band, but we need to provide the
|
||||||
|
// creds so the HS can go & check it.
|
||||||
|
if (this._emailSid) {
|
||||||
|
const idServerParsedUrl = url.parse(this._matrixClient.getIdentityServerUrl());
|
||||||
|
authDict = {
|
||||||
|
type: EMAIL_STAGE_TYPE,
|
||||||
|
threepid_creds: {
|
||||||
|
sid: this._emailSid,
|
||||||
|
client_secret: this._clientSecret,
|
||||||
|
id_server: idServerParsedUrl.host,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.submitAuthDict(authDict);
|
||||||
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* get the auth session ID
|
* get the auth session ID
|
||||||
*
|
*
|
||||||
@@ -188,11 +218,13 @@ InteractiveAuth.prototype = {
|
|||||||
console.log("result from request: ", result);
|
console.log("result from request: ", result);
|
||||||
self._completionDeferred.resolve(result);
|
self._completionDeferred.resolve(result);
|
||||||
}, function(error) {
|
}, function(error) {
|
||||||
if (error.httpStatus !== 401 || !error.data || !error.data.flows) {
|
// sometimes UI auth errors don't come with flows
|
||||||
|
const haveFlows = Boolean(self._data.flows) || Boolean(error.data.flows);
|
||||||
|
if (error.httpStatus !== 401 || !error.data || !haveFlows) {
|
||||||
// doesn't look like an interactive-auth failure. fail the whole lot.
|
// doesn't look like an interactive-auth failure. fail the whole lot.
|
||||||
throw error;
|
throw error;
|
||||||
}
|
}
|
||||||
self._data = error.data;
|
if (error.data.flows) self._data = error.data;
|
||||||
self._startNextAuthStage();
|
self._startNextAuthStage();
|
||||||
},
|
},
|
||||||
).catch(this._completionDeferred.reject).done();
|
).catch(this._completionDeferred.reject).done();
|
||||||
@@ -208,6 +240,11 @@ InteractiveAuth.prototype = {
|
|||||||
if (!nextStage) {
|
if (!nextStage) {
|
||||||
throw new Error("No incomplete flows from the server");
|
throw new Error("No incomplete flows from the server");
|
||||||
}
|
}
|
||||||
|
if (nextStage == this._currentStage) {
|
||||||
|
// we've already started: don't re-start it
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this._currentStage = nextStage;
|
||||||
|
|
||||||
let stageError = null;
|
let stageError = null;
|
||||||
if (this._data.errcode || this._data.error) {
|
if (this._data.errcode || this._data.error) {
|
||||||
@@ -218,7 +255,9 @@ InteractiveAuth.prototype = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const stageStatus = {};
|
const stageStatus = {};
|
||||||
if (nextStage == EMAIL_STAGE_TYPE) stageStatus.busy = true;
|
if (nextStage == EMAIL_STAGE_TYPE) {
|
||||||
|
stageStatus.busy = true;
|
||||||
|
}
|
||||||
this._stateUpdatedCallback(nextStage, stageStatus);
|
this._stateUpdatedCallback(nextStage, stageStatus);
|
||||||
|
|
||||||
// Do stage-specific things to start the stage. These would be
|
// Do stage-specific things to start the stage. These would be
|
||||||
@@ -226,18 +265,10 @@ InteractiveAuth.prototype = {
|
|||||||
// were more of them.
|
// were more of them.
|
||||||
if (nextStage == EMAIL_STAGE_TYPE) {
|
if (nextStage == EMAIL_STAGE_TYPE) {
|
||||||
if (this._emailSid) {
|
if (this._emailSid) {
|
||||||
const idServerParsedUrl = url.parse(this._matrixClient.getIdentityServerUrl());
|
this.poll();
|
||||||
this.submitAuthDict({
|
|
||||||
type: EMAIL_STAGE_TYPE,
|
|
||||||
threepid_creds: {
|
|
||||||
sid: this._emailSid,
|
|
||||||
client_secret: this._clientSecret,
|
|
||||||
id_server: idServerParsedUrl.host,
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} else {
|
} else {
|
||||||
this._requestEmailToken().catch(this._completionDeferred.reject).finally(() => {
|
this._requestEmailToken().catch(this._completionDeferred.reject).finally(() => {
|
||||||
this._stateUpdatedCallback(nextStage, {busy: false});
|
this._stateUpdatedCallback(nextStage, { busy: false });
|
||||||
}).done();
|
}).done();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -262,7 +293,9 @@ InteractiveAuth.prototype = {
|
|||||||
this._clientSecret,
|
this._clientSecret,
|
||||||
1, // TODO: Multiple send attempts?
|
1, // TODO: Multiple send attempts?
|
||||||
nextLink
|
nextLink
|
||||||
);
|
).then((result) => {
|
||||||
|
this._emailSid = result.sid;
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Reference in New Issue
Block a user