summaryrefslogtreecommitdiff
path: root/src/jqueryRest.js
diff options
context:
space:
mode:
authorAzul <azul@riseup.net>2012-08-21 17:59:11 +0200
committerAzul <azul@riseup.net>2012-08-21 17:59:45 +0200
commit0461d76899379cb1e2ecd15456d2e6eb4fb8fa60 (patch)
tree1994adec7dd4c817f6419ea65efe96ce415bad82 /src/jqueryRest.js
parentd5e30a95e09bab18a55f9aad1572b6ae3e16e482 (diff)
moved srp-js files from lib to src
Diffstat (limited to 'src/jqueryRest.js')
-rw-r--r--src/jqueryRest.js127
1 files changed, 127 insertions, 0 deletions
diff --git a/src/jqueryRest.js b/src/jqueryRest.js
new file mode 100644
index 0000000..8c8163c
--- /dev/null
+++ b/src/jqueryRest.js
@@ -0,0 +1,127 @@
+jqueryRest = function() {
+
+ function getUrl()
+ {
+ return "";
+ }
+
+ function paths(path)
+ {
+ return path
+ }
+
+ // Perform ajax requests at the specified path, with the specified parameters
+ // Calling back the specified function.
+ function ajaxRequest(relative_path, params, callback)
+ {
+ var full_url = this.geturl() + this.paths(relative_path);
+ if( window.XMLHttpRequest)
+ xhr = new XMLHttpRequest();
+ else if (window.ActiveXObject){
+ try{
+ xhr = new ActiveXObject("Microsoft.XMLHTTP");
+ }catch (e){}
+ }
+ else
+ {
+ session.error_message("Ajax not supported.");
+ return;
+ }
+ if(xhr){
+ xhr.onreadystatechange = function() {
+ if(xhr.readyState == 4 && xhr.status == 200) {
+ callback(parseResponse());
+ }
+ };
+ xhr.open("POST", full_url, true);
+ xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
+ xhr.setRequestHeader("Content-length", params.length);
+ xhr.send(params);
+ }
+ else
+ {
+ session.error_message("Ajax failed.");
+ }
+ };
+
+ function parseResponse() {
+ if (responseIsXML()) {
+ return parseXML(xhr.responseXML);
+ } else if (responseIsJSON()) {
+ return JSON.parse(xhr.responseText);
+ }
+ };
+
+ function responseIsXML() {
+ return (xhr.responseType == 'document') ||
+ (xhr.getResponseHeader("Content-Type").indexOf('application/xml') >= 0)
+ }
+
+ function responseIsJSON() {
+ return (xhr.responseType == 'json') ||
+ (xhr.getResponseHeader("Content-Type").indexOf('application/json') >= 0)
+ }
+
+ function parseXML(xml) {
+ if (xml.getElementsByTagName("r").length > 0) {
+ return parseAttributesOfElement(xml.getElementsByTagName("r")[0]);
+ } else {
+ return parseNodes(xml.childNodes);
+ }
+ };
+
+ function parseAttributesOfElement(elem) {
+ var response = {};
+ for (var i = 0; i < elem.attributes.length; i++) {
+ var attrib = elem.attributes[i];
+ if (attrib.specified) {
+ response[attrib.name] = attrib.value;
+ }
+ }
+ return response;
+ };
+
+ function parseNodes(nodes) {
+ var response = {};
+ for (var i = 0; i < nodes.length; i++) {
+ var node = nodes[i];
+ response[node.tagName] = node.textContent || true;
+ }
+ return response;
+ };
+
+ // we do not fetch the salt from the server
+ function register(session, callback)
+ {
+ sendVerifier(session, callback);
+ }
+
+ function sendVerifier(session, callback) {
+ this.ajaxRequest("users", "user[login]=" + session.getI() +
+ "&user[password_salt]=" + session.getSalt() +
+ "&user[password_verifier]=" + session.getV().toString(16), callback);
+ }
+
+ function handshake(I, Astr, callback) {
+ this.ajaxRequest("handshake/", "I="+I+"&A="+Astr, callback);
+ }
+
+ function authenticate(M, callback) {
+ this.ajaxRequest("authenticate/", "M="+M, callback);
+ }
+
+ function upgrade(M, callback) {
+ this.ajaxRequest("upgrade/authenticate/", "M="+M, callback);
+ }
+
+ return {
+ geturl: getUrl,
+ paths: paths,
+ ajaxRequest: ajaxRequest,
+ register: register,
+ register_send_verifier: sendVerifier,
+ handshake: handshake,
+ authenticate: authenticate,
+ upgrade: upgrade
+ }
+}