Updated webclient to support the new registration logic.
This commit is contained in:
parent
285ecaacd0
commit
d821755b49
|
@ -82,37 +82,134 @@ angular.module('matrixService', [])
|
||||||
return $http(request);
|
return $http(request);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var doRegisterLogin = function(path, loginType, sessionId, userName, password, threepidCreds) {
|
||||||
|
var data = {};
|
||||||
|
if (loginType === "m.login.recaptcha") {
|
||||||
|
var challengeToken = Recaptcha.get_challenge();
|
||||||
|
var captchaEntry = Recaptcha.get_response();
|
||||||
|
data = {
|
||||||
|
type: "m.login.recaptcha",
|
||||||
|
challenge: challengeToken,
|
||||||
|
response: captchaEntry
|
||||||
|
};
|
||||||
|
}
|
||||||
|
else if (loginType === "m.login.email.identity") {
|
||||||
|
data = {
|
||||||
|
threepidCreds: threepidCreds
|
||||||
|
};
|
||||||
|
}
|
||||||
|
else if (loginType === "m.login.password") {
|
||||||
|
data = {
|
||||||
|
user_id: userName,
|
||||||
|
password: password
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sessionId) {
|
||||||
|
data.session = sessionId;
|
||||||
|
}
|
||||||
|
data.type = loginType;
|
||||||
|
console.log("doRegisterLogin >>> " + loginType);
|
||||||
|
return doRequest("POST", path, undefined, data);
|
||||||
|
};
|
||||||
|
|
||||||
return {
|
return {
|
||||||
/****** Home server API ******/
|
/****** Home server API ******/
|
||||||
prefix: prefixPath,
|
prefix: prefixPath,
|
||||||
|
|
||||||
// Register an user
|
// Register an user
|
||||||
register: function(user_name, password, threepidCreds, useCaptcha) {
|
register: function(user_name, password, threepidCreds, useCaptcha) {
|
||||||
// The REST path spec
|
// registration is composed of multiple requests, to check you can
|
||||||
|
// register, then to actually register. This deferred will fire when
|
||||||
|
// all the requests are done, along with the final response.
|
||||||
|
var deferred = $q.defer();
|
||||||
var path = "/register";
|
var path = "/register";
|
||||||
|
|
||||||
var data = {
|
// check we can actually register with this HS.
|
||||||
user_id: user_name,
|
doRequest("GET", path, undefined, undefined).then(
|
||||||
password: password,
|
function(response) {
|
||||||
threepidCreds: threepidCreds
|
console.log("/register [1] : "+JSON.stringify(response));
|
||||||
};
|
var flows = response.data.flows;
|
||||||
|
var knownTypes = [
|
||||||
|
"m.login.password",
|
||||||
|
"m.login.recaptcha",
|
||||||
|
"m.login.email.identity"
|
||||||
|
];
|
||||||
|
// if they entered 3pid creds, we want to use a flow which uses it.
|
||||||
|
var useThreePidFlow = threepidCreds != undefined;
|
||||||
|
var flowIndex = 0;
|
||||||
|
var firstRegType = undefined;
|
||||||
|
|
||||||
if (useCaptcha) {
|
for (var i=0; i<flows.length; i++) {
|
||||||
// Not all home servers will require captcha on signup, but if this flag is checked,
|
var isThreePidFlow = false;
|
||||||
// send captcha information.
|
if (flows[i].stages) {
|
||||||
// TODO: Might be nice to make this a bit more flexible..
|
for (var j=0; j<flows[i].stages.length; j++) {
|
||||||
var challengeToken = Recaptcha.get_challenge();
|
var regType = flows[i].stages[j];
|
||||||
var captchaEntry = Recaptcha.get_response();
|
if (knownTypes.indexOf(regType) === -1) {
|
||||||
var captchaType = "m.login.recaptcha";
|
deferred.reject("Unknown type: "+regType);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (regType == "m.login.email.identity") {
|
||||||
|
isThreePidFlow = true;
|
||||||
|
}
|
||||||
|
if (!useCaptcha && regType == "m.login.recaptcha") {
|
||||||
|
console.error("Web client setup to not use captcha, but HS demands a captcha.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
data.captcha = {
|
if ( (isThreePidFlow && useThreePidFlow) || (!isThreePidFlow && !useThreePidFlow) ) {
|
||||||
type: captchaType,
|
flowIndex = i;
|
||||||
challenge: challengeToken,
|
}
|
||||||
response: captchaEntry
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
return doRequest("POST", path, undefined, data);
|
if (knownTypes.indexOf(flows[i].type) == -1) {
|
||||||
|
deferred.reject("Unknown type: "+flows[i].type);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// looks like we can register fine, go ahead and do it.
|
||||||
|
console.log("Using flow " + JSON.stringify(flows[flowIndex]));
|
||||||
|
firstRegType = flows[flowIndex].type;
|
||||||
|
var sessionId = undefined;
|
||||||
|
|
||||||
|
// generic response processor so it can loop as many times as required
|
||||||
|
var loginResponseFunc = function(response) {
|
||||||
|
if (response.data.session) {
|
||||||
|
sessionId = response.data.session;
|
||||||
|
}
|
||||||
|
console.log("login response: " + JSON.stringify(response.data));
|
||||||
|
if (response.data.access_token) {
|
||||||
|
deferred.resolve(response);
|
||||||
|
}
|
||||||
|
else if (response.data.next) {
|
||||||
|
return doRegisterLogin(path, response.data.next, sessionId, user_name, password, threepidCreds).then(
|
||||||
|
loginResponseFunc,
|
||||||
|
function(err) {
|
||||||
|
deferred.reject(err);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
deferred.reject("Unknown continuation: "+JSON.stringify(response));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// set the ball rolling
|
||||||
|
doRegisterLogin(path, firstRegType, undefined, user_name, password, threepidCreds).then(
|
||||||
|
loginResponseFunc,
|
||||||
|
function(err) {
|
||||||
|
deferred.reject(err);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
},
|
||||||
|
function(err) {
|
||||||
|
deferred.reject(err);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
return deferred.promise;
|
||||||
},
|
},
|
||||||
|
|
||||||
// Create a room
|
// Create a room
|
||||||
|
|
Loading…
Reference in New Issue