mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-14 22:05:44 +00:00
Land weave-0.5-api on weave. r=thunder.
This commit is contained in:
commit
e12767d926
@ -75,7 +75,6 @@ Collection.prototype = {
|
|||||||
args.push('older=' + this.older);
|
args.push('older=' + this.older);
|
||||||
else if (this.newer) {
|
else if (this.newer) {
|
||||||
args.push('newer=' + this.newer);
|
args.push('newer=' + this.newer);
|
||||||
args.push('modified=' + this.newer); // tmp hack for older servers
|
|
||||||
}
|
}
|
||||||
if (this.full)
|
if (this.full)
|
||||||
args.push('full=1');
|
args.push('full=1');
|
||||||
|
@ -225,16 +225,18 @@ SyncEngine.prototype = {
|
|||||||
return null;
|
return null;
|
||||||
if (url[url.length-1] != '/')
|
if (url[url.length-1] != '/')
|
||||||
url += '/';
|
url += '/';
|
||||||
url += "0.3/user/";
|
url += "0.5/";
|
||||||
return url;
|
return url;
|
||||||
},
|
},
|
||||||
|
|
||||||
get engineURL() {
|
get engineURL() {
|
||||||
return this.baseURL + ID.get('WeaveID').username + '/' + this.name + '/';
|
return this.baseURL + ID.get('WeaveID').username +
|
||||||
|
'/storage/' + this.name + '/';
|
||||||
},
|
},
|
||||||
|
|
||||||
get cryptoMetaURL() {
|
get cryptoMetaURL() {
|
||||||
return this.baseURL + ID.get('WeaveID').username + '/crypto/' + this.name;
|
return this.baseURL + ID.get('WeaveID').username +
|
||||||
|
'/storage/crypto/' + this.name;
|
||||||
},
|
},
|
||||||
|
|
||||||
get lastSync() {
|
get lastSync() {
|
||||||
@ -470,8 +472,11 @@ SyncEngine.prototype = {
|
|||||||
if (!resp.success)
|
if (!resp.success)
|
||||||
throw resp;
|
throw resp;
|
||||||
|
|
||||||
if (up.data.modified > this.lastSync)
|
// Record the modified time of the upload
|
||||||
this.lastSync = up.data.modified;
|
let modified = resp.headers["X-Weave-Timestamp"];
|
||||||
|
if (modified > this.lastSync)
|
||||||
|
this.lastSync = modified;
|
||||||
|
|
||||||
up.clearRecords();
|
up.clearRecords();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -202,32 +202,31 @@ WeaveSvc.prototype = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
get baseURL() {
|
get baseURL() {
|
||||||
let url = Svc.Prefs.get("serverURL");
|
return Utils.getURLPref("serverURL");
|
||||||
if (!url)
|
|
||||||
throw "No server URL set";
|
|
||||||
if (url[url.length-1] != '/')
|
|
||||||
url += '/';
|
|
||||||
url += "0.3/";
|
|
||||||
return url;
|
|
||||||
},
|
},
|
||||||
set baseURL(value) {
|
set baseURL(value) {
|
||||||
Svc.Prefs.set("serverURL", value);
|
Svc.Prefs.set("serverURL", value);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
get miscURL() {
|
||||||
|
return Utils.getURLPref("miscURL");
|
||||||
|
},
|
||||||
|
set miscURL(value) {
|
||||||
|
Svc.Prefs.set("miscURL", value);
|
||||||
|
},
|
||||||
|
|
||||||
get clusterURL() {
|
get clusterURL() {
|
||||||
let url = Svc.Prefs.get("clusterURL");
|
return Utils.getURLPref("clusterURL", null, "0.5/");
|
||||||
if (!url)
|
|
||||||
return null;
|
|
||||||
if (url[url.length-1] != '/')
|
|
||||||
url += '/';
|
|
||||||
url += "0.3/user/";
|
|
||||||
return url;
|
|
||||||
},
|
},
|
||||||
set clusterURL(value) {
|
set clusterURL(value) {
|
||||||
Svc.Prefs.set("clusterURL", value);
|
Svc.Prefs.set("clusterURL", value);
|
||||||
this._genKeyURLs();
|
this._genKeyURLs();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
get userURL() {
|
||||||
|
return this.clusterURL + this.username;
|
||||||
|
},
|
||||||
|
|
||||||
get userPath() { return ID.get('WeaveID').username; },
|
get userPath() { return ID.get('WeaveID').username; },
|
||||||
|
|
||||||
get isLoggedIn() { return this._loggedIn; },
|
get isLoggedIn() { return this._loggedIn; },
|
||||||
@ -261,9 +260,9 @@ WeaveSvc.prototype = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
_genKeyURLs: function WeaveSvc__genKeyURLs() {
|
_genKeyURLs: function WeaveSvc__genKeyURLs() {
|
||||||
let url = this.clusterURL + this.username;
|
let url = this.userURL;
|
||||||
PubKeys.defaultKeyUri = url + "/keys/pubkey";
|
PubKeys.defaultKeyUri = url + "/storage/keys/pubkey";
|
||||||
PrivKeys.defaultKeyUri = url + "/keys/privkey";
|
PrivKeys.defaultKeyUri = url + "/storage/keys/privkey";
|
||||||
},
|
},
|
||||||
|
|
||||||
_checkCrypto: function WeaveSvc__checkCrypto() {
|
_checkCrypto: function WeaveSvc__checkCrypto() {
|
||||||
@ -458,16 +457,16 @@ WeaveSvc.prototype = {
|
|||||||
findCluster: function WeaveSvc_findCluster(username) {
|
findCluster: function WeaveSvc_findCluster(username) {
|
||||||
this._log.debug("Finding cluster for user " + username);
|
this._log.debug("Finding cluster for user " + username);
|
||||||
|
|
||||||
let res = new Resource(this.baseURL + "api/register/chknode/" + username);
|
let res = new Resource(this.baseURL + "1/" + username + "/node/weave");
|
||||||
try {
|
try {
|
||||||
let node = res.get();
|
let node = res.get();
|
||||||
switch (node.status) {
|
switch (node.status) {
|
||||||
case 404:
|
case 404:
|
||||||
this._log.debug("Using serverURL as data cluster (multi-cluster support disabled)");
|
this._log.debug("Using serverURL as data cluster (multi-cluster support disabled)");
|
||||||
return Svc.Prefs.get("serverURL");
|
return this.baseURL;
|
||||||
case 0:
|
case 0:
|
||||||
case 200:
|
case 200:
|
||||||
return "https://" + node + "/";
|
return node;
|
||||||
default:
|
default:
|
||||||
this._log.debug("Unexpected response code: " + node.status);
|
this._log.debug("Unexpected response code: " + node.status);
|
||||||
break;
|
break;
|
||||||
@ -517,11 +516,7 @@ WeaveSvc.prototype = {
|
|||||||
if (isLogin)
|
if (isLogin)
|
||||||
this.clusterURL = url;
|
this.clusterURL = url;
|
||||||
|
|
||||||
if (url[url.length-1] != '/')
|
let res = new Resource(this.userURL + "/info/collections");
|
||||||
url += '/';
|
|
||||||
url += "0.3/user/";
|
|
||||||
|
|
||||||
let res = new Resource(url + username);
|
|
||||||
res.authenticator = {
|
res.authenticator = {
|
||||||
onRequest: function(headers) {
|
onRequest: function(headers) {
|
||||||
headers['Authorization'] = 'Basic ' + btoa(username + ':' + password);
|
headers['Authorization'] = 'Basic ' + btoa(username + ':' + password);
|
||||||
@ -601,16 +596,11 @@ WeaveSvc.prototype = {
|
|||||||
|
|
||||||
changePassword: function WeaveSvc_changePassword(newpass)
|
changePassword: function WeaveSvc_changePassword(newpass)
|
||||||
this._catch(this._notify("changepwd", "", function() {
|
this._catch(this._notify("changepwd", "", function() {
|
||||||
function enc(x) encodeURIComponent(x);
|
let url = this.baseURL + '1/' + username + "/password";
|
||||||
let message = "uid=" + enc(this.username) + "&password=" +
|
|
||||||
enc(this.password) + "&new=" + enc(newpass);
|
|
||||||
let url = Svc.Prefs.get('tmpServerURL') + '0.3/api/register/chpwd';
|
|
||||||
let res = new Weave.Resource(url);
|
let res = new Weave.Resource(url);
|
||||||
res.authenticator = new Weave.NoOpAuthenticator();
|
res.authenticator = new Weave.NoOpAuthenticator();
|
||||||
res.setHeader("Content-Type", "application/x-www-form-urlencoded",
|
|
||||||
"Content-Length", message.length);
|
|
||||||
|
|
||||||
let resp = res.post(message);
|
let resp = res.post(newpass);
|
||||||
if (resp.status != 200) {
|
if (resp.status != 200) {
|
||||||
this._log.info("Password change failed: " + resp);
|
this._log.info("Password change failed: " + resp);
|
||||||
throw "Could not change password";
|
throw "Could not change password";
|
||||||
@ -739,41 +729,31 @@ WeaveSvc.prototype = {
|
|||||||
|
|
||||||
_errorStr: function WeaveSvc__errorStr(code) {
|
_errorStr: function WeaveSvc__errorStr(code) {
|
||||||
switch (code.toString()) {
|
switch (code.toString()) {
|
||||||
case "0":
|
case "1":
|
||||||
return "uid-in-use";
|
return "illegal-method";
|
||||||
case "-1":
|
case "2":
|
||||||
return "invalid-http-method";
|
return "invalid-captcha";
|
||||||
case "-2":
|
case "3":
|
||||||
return "uid-missing";
|
return "invalid-username";
|
||||||
case "-3":
|
case "4":
|
||||||
return "uid-invalid";
|
return "cannot-overwrite-resource";
|
||||||
case "-4":
|
case "5":
|
||||||
return "mail-invalid";
|
return "userid-mismatch";
|
||||||
case "-5":
|
case "6":
|
||||||
return "mail-in-use";
|
return "json-parse-failure";
|
||||||
case "-6":
|
case "7":
|
||||||
return "captcha-challenge-missing";
|
return "invalid-password";
|
||||||
case "-7":
|
case "8":
|
||||||
return "captcha-response-missing";
|
return "invalid-record";
|
||||||
case "-8":
|
case "9":
|
||||||
return "password-missing";
|
return "weak-password";
|
||||||
case "-9":
|
|
||||||
return "internal-server-error";
|
|
||||||
case "-10":
|
|
||||||
return "server-quota-exceeded";
|
|
||||||
case "-11":
|
|
||||||
return "missing-new-field";
|
|
||||||
case "-12":
|
|
||||||
return "password-incorrect";
|
|
||||||
default:
|
default:
|
||||||
return "generic-server-error";
|
return "generic-server-error";
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
checkUsername: function WeaveSvc_checkUsername(username) {
|
checkUsername: function WeaveSvc_checkUsername(username) {
|
||||||
let url = Svc.Prefs.get('tmpServerURL') +
|
let url = this.baseURL + "1/" + username;
|
||||||
"0.3/api/register/checkuser/" + username;
|
|
||||||
|
|
||||||
let res = new Resource(url);
|
let res = new Resource(url);
|
||||||
res.authenticator = new NoOpAuthenticator();
|
res.authenticator = new NoOpAuthenticator();
|
||||||
|
|
||||||
@ -790,35 +770,29 @@ WeaveSvc.prototype = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
createAccount: function WeaveSvc_createAccount(username, password, email,
|
createAccount: function WeaveSvc_createAccount(username, password, email,
|
||||||
captchaChallenge, captchaResponse) {
|
captchaChallenge, captchaResponse)
|
||||||
function enc(x) encodeURIComponent(x);
|
{
|
||||||
let message = "uid=" + enc(username) + "&password=" + enc(password) +
|
let payload = JSON.stringify({
|
||||||
"&mail=" + enc(email) + "&recaptcha_challenge_field=" +
|
"password": password, "email": email,
|
||||||
enc(captchaChallenge) + "&recaptcha_response_field=" + enc(captchaResponse);
|
"captcha-challenge": captchaChallenge,
|
||||||
|
"captcha-response": captchaResponse
|
||||||
|
});
|
||||||
|
|
||||||
let url = Svc.Prefs.get('tmpServerURL') + '0.3/api/register/new';
|
let url = this.baseURL + '1/' + username;
|
||||||
let res = new Resource(url);
|
let res = new Resource(url);
|
||||||
res.authenticator = new Weave.NoOpAuthenticator();
|
res.authenticator = new Weave.NoOpAuthenticator();
|
||||||
res.setHeader("Content-Type", "application/x-www-form-urlencoded",
|
|
||||||
"Content-Length", message.length);
|
|
||||||
|
|
||||||
let error = "generic-server-error";
|
let error = "generic-server-error";
|
||||||
try {
|
try {
|
||||||
let register = res.post(message);
|
let register = res.put(payload);
|
||||||
if (register.success) {
|
if (register.success) {
|
||||||
this._log.info("Account created: " + register);
|
this._log.info("Account created: " + register);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Must have failed, so figure out the reason
|
// Must have failed, so figure out the reason
|
||||||
switch (register.status) {
|
if (register.status == 400)
|
||||||
case 400:
|
error = this._errorStr(register);
|
||||||
error = this._errorStr(register);
|
|
||||||
break;
|
|
||||||
case 417:
|
|
||||||
error = "captcha-incorrect";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
catch(ex) {
|
catch(ex) {
|
||||||
this._log.warn("Failed to create account: " + ex);
|
this._log.warn("Failed to create account: " + ex);
|
||||||
@ -833,7 +807,7 @@ WeaveSvc.prototype = {
|
|||||||
let reset = false;
|
let reset = false;
|
||||||
|
|
||||||
this._log.debug("Fetching global metadata record");
|
this._log.debug("Fetching global metadata record");
|
||||||
let meta = Records.import(this.clusterURL + this.username + "/meta/global");
|
let meta = Records.import(this.userURL + "/storage/meta/global");
|
||||||
|
|
||||||
let remoteVersion = (meta && meta.payload.storageVersion)?
|
let remoteVersion = (meta && meta.payload.storageVersion)?
|
||||||
meta.payload.storageVersion : "";
|
meta.payload.storageVersion : "";
|
||||||
@ -1238,7 +1212,7 @@ WeaveSvc.prototype = {
|
|||||||
Sync.sleep(2000);
|
Sync.sleep(2000);
|
||||||
|
|
||||||
this._log.debug("Uploading new metadata record");
|
this._log.debug("Uploading new metadata record");
|
||||||
meta = new WBORecord(this.clusterURL + this.username + "/meta/global");
|
meta = new WBORecord(this.userURL + "/storage/meta/global");
|
||||||
meta.payload.syncID = Clients.syncID;
|
meta.payload.syncID = Clients.syncID;
|
||||||
this._updateRemoteVersion(meta);
|
this._updateRemoteVersion(meta);
|
||||||
},
|
},
|
||||||
@ -1264,19 +1238,18 @@ WeaveSvc.prototype = {
|
|||||||
wipeServer: function WeaveSvc_wipeServer(engines)
|
wipeServer: function WeaveSvc_wipeServer(engines)
|
||||||
this._catch(this._notify("wipe-server", "", function() {
|
this._catch(this._notify("wipe-server", "", function() {
|
||||||
// Grab all the collections for the user
|
// Grab all the collections for the user
|
||||||
let userURL = this.clusterURL + this.username + "/";
|
let res = new Resource(this.userURL + "/info/collections");
|
||||||
let res = new Resource(userURL);
|
|
||||||
res.get();
|
res.get();
|
||||||
|
|
||||||
// Get the array of collections and delete each one
|
// Get the array of collections and delete each one
|
||||||
let allCollections = JSON.parse(res.data);
|
let allCollections = JSON.parse(res.data);
|
||||||
for each (let name in allCollections) {
|
for (let name in allCollections) {
|
||||||
try {
|
try {
|
||||||
// If we have a list of engines, make sure it's one we want
|
// If we have a list of engines, make sure it's one we want
|
||||||
if (engines && engines.indexOf(name) == -1)
|
if (engines && engines.indexOf(name) == -1)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
new Resource(userURL + name).delete();
|
new Resource(this.userURL + "/storage/" + name).delete();
|
||||||
}
|
}
|
||||||
catch(ex) {
|
catch(ex) {
|
||||||
this._log.debug("Exception on wipe of '" + name + "': " + Utils.exceptionStr(ex));
|
this._log.debug("Exception on wipe of '" + name + "': " + Utils.exceptionStr(ex));
|
||||||
|
@ -488,6 +488,25 @@ let Utils = {
|
|||||||
return url;
|
return url;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// ensures url ends with a slash, optionally adds an extra string at the end
|
||||||
|
slashify: function Weave_slashify(url, extra) {
|
||||||
|
if (url[url.length-1] != '/')
|
||||||
|
url += '/';
|
||||||
|
if (extra)
|
||||||
|
url += extra;
|
||||||
|
return url;
|
||||||
|
},
|
||||||
|
|
||||||
|
//
|
||||||
|
getURLPref: function Weave_getURLPref(pref, def, extra) {
|
||||||
|
let url = Svc.Prefs.get(pref);
|
||||||
|
if (!url && typeof(def) == "undefined")
|
||||||
|
throw pref + " not set";
|
||||||
|
else if (!url)
|
||||||
|
return def;
|
||||||
|
return Utils.slashify(url, extra);
|
||||||
|
},
|
||||||
|
|
||||||
xpath: function Weave_xpath(xmlDoc, xpathString) {
|
xpath: function Weave_xpath(xmlDoc, xpathString) {
|
||||||
let root = xmlDoc.ownerDocument == null ?
|
let root = xmlDoc.ownerDocument == null ?
|
||||||
xmlDoc.documentElement : xmlDoc.ownerDocument.documentElement;
|
xmlDoc.documentElement : xmlDoc.ownerDocument.documentElement;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
pref("extensions.weave.serverURL", "https://auth.services.mozilla.com/");
|
pref("extensions.weave.serverURL", "https://auth.services.mozilla.com/user/");
|
||||||
pref("extensions.weave.tmpServerURL", "https://services.mozilla.com/");
|
pref("extensions.weave.miscURL", "https://auth.services.mozilla.com/misc/");
|
||||||
|
|
||||||
pref("extensions.weave.encryption", "aes-256-cbc");
|
pref("extensions.weave.encryption", "aes-256-cbc");
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user