diff options
author | Azul <azul@riseup.net> | 2012-08-21 17:59:11 +0200 |
---|---|---|
committer | Azul <azul@riseup.net> | 2012-08-21 17:59:45 +0200 |
commit | 0461d76899379cb1e2ecd15456d2e6eb4fb8fa60 (patch) | |
tree | 1994adec7dd4c817f6419ea65efe96ce415bad82 /src/jqueryRest.js | |
parent | d5e30a95e09bab18a55f9aad1572b6ae3e16e482 (diff) |
moved srp-js files from lib to src
Diffstat (limited to 'src/jqueryRest.js')
-rw-r--r-- | src/jqueryRest.js | 127 |
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 + } +} |