UNPKG

oauth-signature

Version:
324 lines (292 loc) 16.5 kB
/* CryptoJS v3.1.2 code.google.com/p/crypto-js (c) 2009-2013 by Jeff Mott. All rights reserved. code.google.com/p/crypto-js/wiki/License */ var CryptoJS=CryptoJS||function(g,l){var e={},d=e.lib={},m=function(){},k=d.Base={extend:function(a){m.prototype=this;var c=new m;a&&c.mixIn(a);c.hasOwnProperty("init")||(c.init=function(){c.$super.init.apply(this,arguments)});c.init.prototype=c;c.$super=this;return c},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var c in a)a.hasOwnProperty(c)&&(this[c]=a[c]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}}, p=d.WordArray=k.extend({init:function(a,c){a=this.words=a||[];this.sigBytes=c!=l?c:4*a.length},toString:function(a){return(a||n).stringify(this)},concat:function(a){var c=this.words,q=a.words,f=this.sigBytes;a=a.sigBytes;this.clamp();if(f%4)for(var b=0;b<a;b++)c[f+b>>>2]|=(q[b>>>2]>>>24-8*(b%4)&255)<<24-8*((f+b)%4);else if(65535<q.length)for(b=0;b<a;b+=4)c[f+b>>>2]=q[b>>>2];else c.push.apply(c,q);this.sigBytes+=a;return this},clamp:function(){var a=this.words,c=this.sigBytes;a[c>>>2]&=4294967295<< 32-8*(c%4);a.length=g.ceil(c/4)},clone:function(){var a=k.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var c=[],b=0;b<a;b+=4)c.push(4294967296*g.random()|0);return new p.init(c,a)}}),b=e.enc={},n=b.Hex={stringify:function(a){var c=a.words;a=a.sigBytes;for(var b=[],f=0;f<a;f++){var d=c[f>>>2]>>>24-8*(f%4)&255;b.push((d>>>4).toString(16));b.push((d&15).toString(16))}return b.join("")},parse:function(a){for(var c=a.length,b=[],f=0;f<c;f+=2)b[f>>>3]|=parseInt(a.substr(f, 2),16)<<24-4*(f%8);return new p.init(b,c/2)}},j=b.Latin1={stringify:function(a){var c=a.words;a=a.sigBytes;for(var b=[],f=0;f<a;f++)b.push(String.fromCharCode(c[f>>>2]>>>24-8*(f%4)&255));return b.join("")},parse:function(a){for(var c=a.length,b=[],f=0;f<c;f++)b[f>>>2]|=(a.charCodeAt(f)&255)<<24-8*(f%4);return new p.init(b,c)}},h=b.Utf8={stringify:function(a){try{return decodeURIComponent(escape(j.stringify(a)))}catch(c){throw Error("Malformed UTF-8 data");}},parse:function(a){return j.parse(unescape(encodeURIComponent(a)))}}, r=d.BufferedBlockAlgorithm=k.extend({reset:function(){this._data=new p.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=h.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var c=this._data,b=c.words,f=c.sigBytes,d=this.blockSize,e=f/(4*d),e=a?g.ceil(e):g.max((e|0)-this._minBufferSize,0);a=e*d;f=g.min(4*a,f);if(a){for(var k=0;k<a;k+=d)this._doProcessBlock(b,k);k=b.splice(0,a);c.sigBytes-=f}return new p.init(k,f)},clone:function(){var a=k.clone.call(this); a._data=this._data.clone();return a},_minBufferSize:0});d.Hasher=r.extend({cfg:k.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){r.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(b,d){return(new a.init(d)).finalize(b)}},_createHmacHelper:function(a){return function(b,d){return(new s.HMAC.init(a, d)).finalize(b)}}});var s=e.algo={};return e}(Math); (function(){var g=CryptoJS,l=g.lib,e=l.WordArray,d=l.Hasher,m=[],l=g.algo.SHA1=d.extend({_doReset:function(){this._hash=new e.init([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(d,e){for(var b=this._hash.words,n=b[0],j=b[1],h=b[2],g=b[3],l=b[4],a=0;80>a;a++){if(16>a)m[a]=d[e+a]|0;else{var c=m[a-3]^m[a-8]^m[a-14]^m[a-16];m[a]=c<<1|c>>>31}c=(n<<5|n>>>27)+l+m[a];c=20>a?c+((j&h|~j&g)+1518500249):40>a?c+((j^h^g)+1859775393):60>a?c+((j&h|j&g|h&g)-1894007588):c+((j^h^ g)-899497514);l=g;g=h;h=j<<30|j>>>2;j=n;n=c}b[0]=b[0]+n|0;b[1]=b[1]+j|0;b[2]=b[2]+h|0;b[3]=b[3]+g|0;b[4]=b[4]+l|0},_doFinalize:function(){var d=this._data,e=d.words,b=8*this._nDataBytes,g=8*d.sigBytes;e[g>>>5]|=128<<24-g%32;e[(g+64>>>9<<4)+14]=Math.floor(b/4294967296);e[(g+64>>>9<<4)+15]=b;d.sigBytes=4*e.length;this._process();return this._hash},clone:function(){var e=d.clone.call(this);e._hash=this._hash.clone();return e}});g.SHA1=d._createHelper(l);g.HmacSHA1=d._createHmacHelper(l)})(); (function(){var g=CryptoJS,l=g.enc.Utf8;g.algo.HMAC=g.lib.Base.extend({init:function(e,d){e=this._hasher=new e.init;"string"==typeof d&&(d=l.parse(d));var g=e.blockSize,k=4*g;d.sigBytes>k&&(d=e.finalize(d));d.clamp();for(var p=this._oKey=d.clone(),b=this._iKey=d.clone(),n=p.words,j=b.words,h=0;h<g;h++)n[h]^=1549556828,j[h]^=909522486;p.sigBytes=b.sigBytes=k;this.reset()},reset:function(){var e=this._hasher;e.reset();e.update(this._iKey)},update:function(e){this._hasher.update(e);return this},finalize:function(e){var d= this._hasher;e=d.finalize(e);d.reset();return d.finalize(this._oKey.clone().concat(e))}})})(); /* CryptoJS v3.1.2 code.google.com/p/crypto-js (c) 2009-2013 by Jeff Mott. All rights reserved. code.google.com/p/crypto-js/wiki/License */ (function(){var h=CryptoJS,j=h.lib.WordArray;h.enc.Base64={stringify:function(b){var e=b.words,f=b.sigBytes,c=this._map;b.clamp();b=[];for(var a=0;a<f;a+=3)for(var d=(e[a>>>2]>>>24-8*(a%4)&255)<<16|(e[a+1>>>2]>>>24-8*((a+1)%4)&255)<<8|e[a+2>>>2]>>>24-8*((a+2)%4)&255,g=0;4>g&&a+0.75*g<f;g++)b.push(c.charAt(d>>>6*(3-g)&63));if(e=c.charAt(64))for(;b.length%4;)b.push(e);return b.join("")},parse:function(b){var e=b.length,f=this._map,c=f.charAt(64);c&&(c=b.indexOf(c),-1!=c&&(e=c));for(var c=[],a=0,d=0;d< e;d++)if(d%4){var g=f.indexOf(b.charAt(d-1))<<2*(d%4),h=f.indexOf(b.charAt(d))>>>6-2*(d%4);c[a>>>2]|=(g|h)<<24-8*(a%4);a++}return j.create(c,a)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}})(); /*! js-url - v2.5.2 - 2017-08-30 */!function(){var a=function(){function a(){}function b(a){return decodeURIComponent(a.replace(/\+/g," "))}function c(a,b){var c=a.charAt(0),d=b.split(c);return c===a?d:(a=parseInt(a.substring(1),10),d[a<0?d.length+a:a-1])}function d(a,c){for(var d=a.charAt(0),e=c.split("&"),f=[],g={},h=[],i=a.substring(1),j=0,k=e.length;j<k;j++)if(f=e[j].match(/(.*?)=(.*)/),f||(f=[e[j],e[j],""]),""!==f[1].replace(/\s/g,"")){if(f[2]=b(f[2]||""),i===f[1])return f[2];h=f[1].match(/(.*)\[([0-9]+)\]/),h?(g[h[1]]=g[h[1]]||[],g[h[1]][h[2]]=f[2]):g[f[1]]=f[2]}return d===a?g:g[i]}return function(b,e){var f,g={};if("tld?"===b)return a();if(e=e||window.location.toString(),!b)return e;if(b=b.toString(),f=e.match(/^mailto:([^\/].+)/))g.protocol="mailto",g.email=f[1];else{if((f=e.match(/(.*?)\/#\!(.*)/))&&(e=f[1]+f[2]),(f=e.match(/(.*?)#(.*)/))&&(g.hash=f[2],e=f[1]),g.hash&&b.match(/^#/))return d(b,g.hash);if((f=e.match(/(.*?)\?(.*)/))&&(g.query=f[2],e=f[1]),g.query&&b.match(/^\?/))return d(b,g.query);if((f=e.match(/(.*?)\:?\/\/(.*)/))&&(g.protocol=f[1].toLowerCase(),e=f[2]),(f=e.match(/(.*?)(\/.*)/))&&(g.path=f[2],e=f[1]),g.path=(g.path||"").replace(/^([^\/])/,"/$1"),b.match(/^[\-0-9]+$/)&&(b=b.replace(/^([^\/])/,"/$1")),b.match(/^\//))return c(b,g.path.substring(1));if(f=c("/-1",g.path.substring(1)),f&&(f=f.match(/(.*?)\.(.*)/))&&(g.file=f[0],g.filename=f[1],g.fileext=f[2]),(f=e.match(/(.*)\:([0-9]+)$/))&&(g.port=f[2],e=f[1]),(f=e.match(/(.*?)@(.*)/))&&(g.auth=f[1],e=f[2]),g.auth&&(f=g.auth.match(/(.*)\:(.*)/),g.user=f?f[1]:g.auth,g.pass=f?f[2]:void 0),g.hostname=e.toLowerCase(),"."===b.charAt(0))return c(b,g.hostname);a()&&(f=g.hostname.match(a()),f&&(g.tld=f[3],g.domain=f[2]?f[2]+"."+f[3]:void 0,g.sub=f[1]||void 0)),g.port=g.port||("https"===g.protocol?"443":"80"),g.protocol=g.protocol||("443"===g.port?"https":"http")}return b in g?g[b]:"{}"===b?g:void 0}}();"function"==typeof window.define&&window.define.amd?window.define("js-url",[],function(){return a}):("undefined"!=typeof window.jQuery&&window.jQuery.extend({url:function(a,b){return window.url(a,b)}}),window.url=a)}(); ;(function() { 'use strict'; // Check the existence of module and module.exports to detect node var isNode = (typeof module != 'undefined' && typeof module.exports != 'undefined'); function OAuthSignature() { } OAuthSignature.prototype.generate = function (httpMethod, url, parameters, consumerSecret, tokenSecret, options) { var signatureBaseString = new SignatureBaseString(httpMethod, url, parameters).generate(); var encodeSignature = true; if (options) { encodeSignature = options.encodeSignature; } return new HmacSha1Signature(signatureBaseString, consumerSecret, tokenSecret).generate(encodeSignature); }; // Specification: http://oauth.net/core/1.0/#anchor14 // url: if the scheme is missing, http will be added automatically function SignatureBaseString(httpMethod, url, parameters) { parameters = new ParametersLoader(parameters).get(); this._httpMethod = new HttpMethodElement(httpMethod).get(); this._url = new UrlElement(url).get(); this._parameters = new ParametersElement(parameters).get(); this._rfc3986 = new Rfc3986(); } SignatureBaseString.prototype = { generate : function () { // HTTP_METHOD & url & parameters return this._rfc3986.encode(this._httpMethod) + '&' + this._rfc3986.encode(this._url) + '&' + this._rfc3986.encode(this._parameters); } }; function HttpMethodElement(httpMethod) { this._httpMethod = httpMethod || ''; } HttpMethodElement.prototype = { get : function () { return this._httpMethod.toUpperCase(); } }; function UrlElement(url) { this._url = url || ''; } UrlElement.prototype = { get : function () { // The following is to prevent js-url from loading the window.location if (!this._url) { return this._url; } // FIXME: Make this behaviour explicit by returning warnings if (this._url.indexOf('://') == -1) { this._url = 'http://' + this._url; } // Handle parsing the url in node or in browser var parsedUrl = isNode ? this.parseInNode() : this.parseInBrowser(), // FIXME: Make this behaviour explicit by returning warnings scheme = (parsedUrl.scheme || 'http').toLowerCase(), // FIXME: Make this behaviour explicit by returning warnings authority = (parsedUrl.authority || '').toLocaleLowerCase(), path = parsedUrl.path || '', port = parsedUrl.port || ''; // FIXME: Make this behaviour explicit by returning warnings if ((port == 80 && scheme == 'http') || (port == 443 && scheme == 'https')) { port = ''; } var baseUrl = scheme + '://' + authority; baseUrl = baseUrl + (!!port ? ':' + port : ''); // FIXME: Make this behaviour explicit by returning warnings if (path == '/' && this._url.indexOf(baseUrl + path) === -1) { path = ''; } this._url = (scheme ? scheme + '://' : '') + authority + (port ? ':' + port : '') + path; return this._url; }, parseInBrowser : function () { return { scheme : url('protocol', this._url).toLowerCase(), authority : url('hostname', this._url).toLocaleLowerCase(), port : url('port', this._url), path :url('path', this._url) }; }, parseInNode : function () { var url = require('uri-js'), parsedUri = url.parse(this._url), scheme = parsedUri.scheme; // strip the ':' at the end of the scheme added by the url module if (scheme.charAt(scheme.length - 1) == ":") { scheme = scheme.substring(0, scheme.length - 1); } return { scheme : scheme, authority : parsedUri.host, port : parsedUri.port, path : parsedUri.path }; } }; function ParametersElement (parameters) { // Parameters format: { 'key': ['value 1', 'value 2'] }; this._parameters = parameters || {}; this._sortedKeys = []; this._normalizedParameters = []; this._rfc3986 = new Rfc3986(); this._sortParameters(); this._concatenateParameters(); } ParametersElement.prototype = { _sortParameters : function () { var key, encodedKey; for (key in this._parameters) { if (this._parameters.hasOwnProperty(key)) { encodedKey = this._rfc3986.encode(key); this._sortedKeys.push(encodedKey); } } this._sortedKeys.sort(); }, _concatenateParameters : function () { var i; for (i = 0; i < this._sortedKeys.length; i++) { this._normalizeParameter(this._sortedKeys[i]); } }, _normalizeParameter : function (encodedKey) { var i, key = this._rfc3986.decode(encodedKey), values = this._parameters[key], encodedValue; values.sort(); for (i = 0; i < values.length; i++) { encodedValue = this._rfc3986.encode(values[i]); this._normalizedParameters.push(encodedKey + '=' + encodedValue) } }, get : function () { return this._normalizedParameters.join('&'); } }; function ParametersLoader (parameters) { // Format: { 'key': ['value 1', 'value 2'] } this._parameters = {}; this._loadParameters(parameters || {}); } ParametersLoader.prototype = { _loadParameters : function (parameters) { if (parameters instanceof Array) { this._loadParametersFromArray(parameters); } else if (typeof parameters === 'object') { this._loadParametersFromObject(parameters); } }, _loadParametersFromArray : function (parameters) { var i; for (i = 0; i < parameters.length; i++) { this._loadParametersFromObject(parameters[i]); } }, _loadParametersFromObject : function (parameters) { var key; for (key in parameters) { if (parameters.hasOwnProperty(key)) { var stringValue = this._getStringFromParameter(parameters[key]); this._loadParameterValue(key, stringValue); } } }, _loadParameterValue : function (key, value) { var i; if (value instanceof Array) { for (i = 0; i < value.length; i++) { var stringValue = this._getStringFromParameter(value[i]); this._addParameter(key, stringValue); } if (value.length == 0) { this._addParameter(key, ''); } } else { this._addParameter(key, value); } }, _getStringFromParameter : function (parameter) { var stringValue = parameter || ''; try { if (typeof parameter === 'number' || typeof parameter === 'boolean') { stringValue = parameter.toString(); } } catch (e) {} return stringValue; }, _addParameter : function (key, value) { if (!this._parameters[key]) { this._parameters[key] = []; } this._parameters[key].push(value); }, get : function () { return this._parameters; } }; function Rfc3986() { } Rfc3986.prototype = { encode : function (decoded) { if (!decoded) { return ''; } // using implementation from: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FGlobal_Objects%2FencodeURIComponent return encodeURIComponent(decoded) .replace(/[!'()]/g, escape) .replace(/\*/g, "%2A"); }, decode : function (encoded) { if (!encoded) { return ''; } return decodeURIComponent(encoded); } }; function HmacSha1Signature(signatureBaseString, consumerSecret, tokenSecret) { this._rfc3986 = new Rfc3986(); this._text = signatureBaseString; this._key = this._rfc3986.encode(consumerSecret) + '&' + this._rfc3986.encode(tokenSecret); this._base64EncodedHash = new HmacSha1(this._text, this._key).getBase64EncodedHash(); } HmacSha1Signature.prototype = { generate : function (encode) { return encode === false ? this._base64EncodedHash : this._rfc3986.encode(this._base64EncodedHash); } }; function HmacSha1(text, key) { // load CryptoJs in the browser or in node this._cryptoJS = isNode ? require('crypto-js') : CryptoJS; this._text = text || ''; this._key = key || ''; this._hash = this._cryptoJS.HmacSHA1(this._text, this._key); } HmacSha1.prototype = { getBase64EncodedHash : function () { return this._hash.toString(this._cryptoJS.enc.Base64); } }; var oauthSignature = new OAuthSignature(); oauthSignature.SignatureBaseString = SignatureBaseString; oauthSignature.HttpMethodElement = HttpMethodElement; oauthSignature.UrlElement = UrlElement; oauthSignature.ParametersElement = ParametersElement; oauthSignature.ParametersLoader = ParametersLoader; oauthSignature.Rfc3986 = Rfc3986; oauthSignature.HmacSha1Signature = HmacSha1Signature; oauthSignature.HmacSha1 = HmacSha1; // support for the browser and nodejs if (isNode) { module.exports = oauthSignature; } else { window.oauthSignature = oauthSignature; } })();