diff --git a/exec/load/oauth.js b/exec/load/oauth.js new file mode 100644 index 0000000000000000000000000000000000000000..defe6fba53fda967d071423bfced0eb1a7e6148e --- /dev/null +++ b/exec/load/oauth.js @@ -0,0 +1,104 @@ +load('hmac.js'); +load('http.js'); + +function _encodeURIComponent(str) { + return encodeURIComponent(str).replace( + /[!'()*]/g, function(c) { return '%' + c.charCodeAt(0).toString(16); } + ); +} + +function generate_nonce(l) { + var s = ''; + var c = '0123456789ABCDEFabcdef'.split(''); + for (var n = 0; n < l; n++) s += c[Math.floor(Math.random() * c.length)]; + return s; +} + +function merge_objects() { + var o = {}; + Array.prototype.slice.call(arguments).forEach( + function (e) { Object.keys(e).forEach(function (f) { o[f] = e[f]; }); } + ); + return o; +} + +function param_stringify(params, quote, delim) { + return Object.keys(params).map( + function (e) { + return ( + _encodeURIComponent(e) + '=' + + (quote ? '"' : '') + + _encodeURIComponent(params[e]) + + (quote ? '"' : '') + ); + } + ).sort().join(delim); +} + +var OAuth1_Client = function () { + + function build_oauth_params(consumer_key, token) { + var obj = { + oauth_consumer_key : consumer_key, + oauth_nonce : generate_nonce(32), + oauth_signature_method : 'HMAC-SHA1', + oauth_timestamp : time() + '', + oauth_version : '1.0' + }; + if (token) obj.oauth_token = token; + return obj; + } + + function get_base_string(method, url, params, data) { + if (data) params = merge_objects(params, data); + return ( + _encodeURIComponent(method) + '&' + + _encodeURIComponent(url) + '&' + + _encodeURIComponent(param_stringify(params, false, '&')) + ); + } + + function get_signature(base_string, consumer_secret, token_secret) { + return base64_encode( + hmac_sha1( + _encodeURIComponent(consumer_secret) + + '&' + + (token_secret ? _encodeURIComponent(token_secret) : ''), + base_string + ) + ); + } + + this.get = function (url, key, secret, token, token_secret) { + url = url.split('?'); + var _url = url.shift(); + var data = {}; + if (url.length > 0) { + url.join('?').split('&').forEach( + function (e) { + e = e.split('='); + if (e.length < 2) return; + data[e][0] = data[e][1]; + } + ); + } + var params = build_oauth_params(key, token); + var base_string = get_base_string('GET', _url, params, data); + params.oauth_signature = get_signature(base_string, secret, token_secret); + return (new HTTPRequest( + false, false, + { Authorization : 'OAuth ' + param_stringify(params, true, ', ') } + )).Get(_url + '?' + param_stringify(data, false, '&')); + } + + this.post = function (url, data, key, secret, token, token_secret) { + var params = build_oauth_params(key, token); + var base_string = get_base_string('POST', url, params, data); + params.oauth_signature = get_signature(base_string, secret, token_secret); + return (new HTTPRequest( + false, false, + { Authorization : 'OAuth ' + param_stringify(params, true, ', ') } + )).Post(url, param_stringify(data, false, '&')); + } + +} \ No newline at end of file