Land weave-0.5-api on weave. r=thunder.

This commit is contained in:
Edward Lee 2009-08-26 18:03:52 -07:00
commit e12767d926
5 changed files with 88 additions and 92 deletions

View File

@ -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');

View File

@ -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();
}); });

View File

@ -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));

View File

@ -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;

View File

@ -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");