Created
July 17, 2015 22:22
-
-
Save kinncj/dfa3cd40c48be50cf76b to your computer and use it in GitHub Desktop.
Pebble OAuth Handler
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function hex_sha1(e){return binb2hex(core_sha1(str2binb(e),e.length*chrsz))}function b64_sha1(e){return binb2b64(core_sha1(str2binb(e),e.length*chrsz))}function str_sha1(e){return binb2str(core_sha1(str2binb(e),e.length*chrsz))}function hex_hmac_sha1(e,t){return binb2hex(core_hmac_sha1(e,t))}function b64_hmac_sha1(e,t){return binb2b64(core_hmac_sha1(e,t))}function str_hmac_sha1(e,t){return binb2str(core_hmac_sha1(e,t))}function sha1_vm_test(){return"a9993e364706816aba3e25717850c26c9cd0d89d"==hex_sha1("abc")}function core_sha1(e,t){e[t>>5]|=128<<24-t%32,e[(t+64>>9<<4)+15]=t;for(var r=Array(80),n=1732584193,a=-271733879,o=-1732584194,u=271733878,h=-1009589776,c=0;c<e.length;c+=16){for(var s=n,i=a,f=o,l=u,d=h,A=0;80>A;A++){16>A?r[A]=e[c+A]:r[A]=rol(r[A-3]^r[A-8]^r[A-14]^r[A-16],1);var m=safe_add(safe_add(rol(n,5),sha1_ft(A,a,o,u)),safe_add(safe_add(h,r[A]),sha1_kt(A)));h=u,u=o,o=rol(a,30),a=n,n=m}n=safe_add(n,s),a=safe_add(a,i),o=safe_add(o,f),u=safe_add(u,l),h=safe_add(h,d)}return Array(n,a,o,u,h)}function sha1_ft(e,t,r,n){return 20>e?t&r|~t&n:40>e?t^r^n:60>e?t&r|t&n|r&n:t^r^n}function sha1_kt(e){return 20>e?1518500249:40>e?1859775393:60>e?-1894007588:-899497514}function core_hmac_sha1(e,t){var r=str2binb(e);r.length>16&&(r=core_sha1(r,e.length*chrsz));for(var n=Array(16),a=Array(16),o=0;16>o;o++)n[o]=909522486^r[o],a[o]=1549556828^r[o];var u=core_sha1(n.concat(str2binb(t)),512+t.length*chrsz);return core_sha1(a.concat(u),672)}function safe_add(e,t){var r=(65535&e)+(65535&t),n=(e>>16)+(t>>16)+(r>>16);return n<<16|65535&r}function rol(e,t){return e<<t|e>>>32-t}function str2binb(e){for(var t=Array(),r=(1<<chrsz)-1,n=0;n<e.length*chrsz;n+=chrsz)t[n>>5]|=(e.charCodeAt(n/chrsz)&r)<<24-n%32;return t}function binb2str(e){for(var t="",r=(1<<chrsz)-1,n=0;n<32*e.length;n+=chrsz)t+=String.fromCharCode(e[n>>5]>>>24-n%32&r);return t}function binb2hex(e){for(var t=hexcase?"0123456789ABCDEF":"0123456789abcdef",r="",n=0;n<4*e.length;n++)r+=t.charAt(e[n>>2]>>8*(3-n%4)+4&15)+t.charAt(e[n>>2]>>8*(3-n%4)&15);return r}function binb2b64(e){for(var t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",r="",n=0;n<4*e.length;n+=3)for(var a=(e[n>>2]>>8*(3-n%4)&255)<<16|(e[n+1>>2]>>8*(3-(n+1)%4)&255)<<8|e[n+2>>2]>>8*(3-(n+2)%4)&255,o=0;4>o;o++)r+=8*n+6*o>32*e.length?b64pad:t.charAt(a>>6*(3-o)&63);return r}var hexcase=0,b64pad="",chrsz=8,OAuth;null==OAuth&&(OAuth={}),OAuth.setProperties=function(e,t){if(null!=e&&null!=t)for(var r in t)e[r]=t[r];return e},OAuth.setProperties(OAuth,{percentEncode:function(e){if(null==e)return"";if(e instanceof Array){for(var t="",r=0;r<e.length;++e)""!=t&&(t+="&"),t+=OAuth.percentEncode(e[r]);return t}return e=encodeURIComponent(e),e=e.replace(/\!/g,"%21"),e=e.replace(/\*/g,"%2A"),e=e.replace(/\'/g,"%27"),e=e.replace(/\(/g,"%28"),e=e.replace(/\)/g,"%29")},decodePercent:function(e){return null!=e&&(e=e.replace(/\+/g," ")),decodeURIComponent(e)},getParameterList:function(e){if(null==e)return[];if("object"!=typeof e)return OAuth.decodeForm(e+"");if(e instanceof Array)return e;var t=[];for(var r in e)t.push([r,e[r]]);return t},getParameterMap:function(e){if(null==e)return{};if("object"!=typeof e)return OAuth.getParameterMap(OAuth.decodeForm(e+""));if(e instanceof Array){for(var t={},r=0;r<e.length;++r){var n=e[r][0];void 0===t[n]&&(t[n]=e[r][1])}return t}return e},getParameter:function(e,t){if(!(e instanceof Array))return OAuth.getParameterMap(e)[t];for(var r=0;r<e.length;++r)if(e[r][0]==t)return e[r][1];return null},formEncode:function(e){for(var t="",r=OAuth.getParameterList(e),n=0;n<r.length;++n){var a=r[n][1];null==a&&(a=""),""!=t&&(t+="&"),t+=OAuth.percentEncode(r[n][0])+"="+OAuth.percentEncode(a)}return t},decodeForm:function(e){for(var t=[],r=e.split("&"),n=0;n<r.length;++n){var a=r[n];if(""!=a){var o,u,h=a.indexOf("=");0>h?(o=OAuth.decodePercent(a),u=null):(o=OAuth.decodePercent(a.substring(0,h)),u=OAuth.decodePercent(a.substring(h+1))),t.push([o,u])}}return t},setParameter:function(e,t,r){var n=e.parameters;if(n instanceof Array){for(var a=0;a<n.length;++a)n[a][0]==t&&(void 0===r?n.splice(a,1):(n[a][1]=r,r=void 0));void 0!==r&&n.push([t,r])}else n=OAuth.getParameterMap(n),n[t]=r,e.parameters=n},setParameters:function(e,t){for(var r=OAuth.getParameterList(t),n=0;n<r.length;++n)OAuth.setParameter(e,r[n][0],r[n][1])},completeRequest:function(e,t){null==e.method&&(e.method="GET");var r=OAuth.getParameterMap(e.parameters);null==r.oauth_consumer_key&&OAuth.setParameter(e,"oauth_consumer_key",t.consumerKey||""),null==r.oauth_token&&null!=t.token&&OAuth.setParameter(e,"oauth_token",t.token),null==r.oauth_version&&OAuth.setParameter(e,"oauth_version","1.0"),null==r.oauth_timestamp&&OAuth.setParameter(e,"oauth_timestamp",OAuth.timestamp()),null==r.oauth_nonce&&OAuth.setParameter(e,"oauth_nonce",OAuth.nonce(6)),OAuth.SignatureMethod.sign(e,t)},setTimestampAndNonce:function(e){OAuth.setParameter(e,"oauth_timestamp",OAuth.timestamp()),OAuth.setParameter(e,"oauth_nonce",OAuth.nonce(6))},addToURL:function(e,t){if(newURL=e,null!=t){var r=OAuth.formEncode(t);if(r.length>0){var n=e.indexOf("?");0>n?newURL+="?":newURL+="&",newURL+=r}}return newURL},getAuthorizationHeader:function(e,t){for(var r='OAuth realm="'+OAuth.percentEncode(e)+'"',n=OAuth.getParameterList(t),a=0;a<n.length;++a){var o=n[a],u=o[0];0==u.indexOf("oauth_")&&(r+=","+OAuth.percentEncode(u)+'="'+OAuth.percentEncode(o[1])+'"')}return r},correctTimestampFromSrc:function(e){e=e||"oauth_timestamp";var t=document.getElementsByTagName("script");if(null!=t&&t.length){var r=t[t.length-1].src;if(r){var n=r.indexOf("?");if(!(0>n)){parameters=OAuth.getParameterMap(OAuth.decodeForm(r.substring(n+1)));var a=parameters[e];null!=a&&OAuth.correctTimestamp(a)}}}},correctTimestamp:function(e){OAuth.timeCorrectionMsec=1e3*e-(new Date).getTime()},timeCorrectionMsec:0,timestamp:function(){var e=(new Date).getTime()+OAuth.timeCorrectionMsec;return Math.floor(e/1e3)},nonce:function(e){for(var t=OAuth.nonce.CHARS,r="",n=0;e>n;++n){var a=Math.floor(Math.random()*t.length);r+=t.substring(a,a+1)}return r}}),OAuth.nonce.CHARS="0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz",OAuth.declareClass=function(e,t,r){var n=e[t];if(e[t]=r,null!=r&&null!=n)for(var a in n)"prototype"!=a&&(r[a]=n[a]);return r},OAuth.declareClass(OAuth,"SignatureMethod",function(){}),OAuth.setProperties(OAuth.SignatureMethod.prototype,{sign:function(e){var t=OAuth.SignatureMethod.getBaseString(e),r=this.getSignature(t);return OAuth.setParameter(e,"oauth_signature",r),r},initialize:function(e,t){var r;r=null!=t.accessorSecret&&e.length>9&&"-Accessor"==e.substring(e.length-9)?t.accessorSecret:t.consumerSecret,this.key=OAuth.percentEncode(r)+"&"+OAuth.percentEncode(t.tokenSecret)}}),OAuth.setProperties(OAuth.SignatureMethod,{sign:function(e,t){var r=OAuth.getParameterMap(e.parameters).oauth_signature_method;(null==r||""==r)&&(r="HMAC-SHA1",OAuth.setParameter(e,"oauth_signature_method",r)),OAuth.SignatureMethod.newMethod(r,t).sign(e)},newMethod:function(e,t){var r=OAuth.SignatureMethod.REGISTERED[e];if(null!=r){var n=new r;return n.initialize(e,t),n}var a=new Error("signature_method_rejected"),o="";for(var u in OAuth.SignatureMethod.REGISTERED)""!=o&&(o+="&"),o+=OAuth.percentEncode(u);throw a.oauth_acceptable_signature_methods=o,a},REGISTERED:{},registerMethodClass:function(e,t){for(var r=0;r<e.length;++r)OAuth.SignatureMethod.REGISTERED[e[r]]=t},makeSubclass:function(e){var t=OAuth.SignatureMethod,r=function(){t.call(this)};return r.prototype=new t,r.prototype.getSignature=e,r.prototype.constructor=r,r},getBaseString:function(e){var t,r=e.action,n=r.indexOf("?");if(0>n)t=e.parameters;else{t=OAuth.decodeForm(r.substring(n+1));for(var a=OAuth.getParameterList(e.parameters),o=0;o<a.length;++o)t.push(a[o])}return OAuth.percentEncode(e.method.toUpperCase())+"&"+OAuth.percentEncode(OAuth.SignatureMethod.normalizeUrl(r))+"&"+OAuth.percentEncode(OAuth.SignatureMethod.normalizeParameters(t))},normalizeUrl:function(e){var t=OAuth.SignatureMethod.parseUri(e),r=t.protocol.toLowerCase(),n=t.authority.toLowerCase(),a="http"==r&&80==t.port||"https"==r&&443==t.port;if(a){var o=n.lastIndexOf(":");o>=0&&(n=n.substring(0,o))}var u=t.path;return u||(u="/"),r+"://"+n+u},parseUri:function(e){for(var t={key:["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],parser:{strict:/^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@\/]*):?([^:@\/]*))?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/}},r=t.parser.strict.exec(e),n={},a=14;a--;)n[t.key[a]]=r[a]||"";return n},normalizeParameters:function(e){if(null==e)return"";for(var t=OAuth.getParameterList(e),r=[],n=0;n<t.length;++n){var a=t[n];"oauth_signature"!=a[0]&&r.push([OAuth.percentEncode(a[0])+" "+OAuth.percentEncode(a[1]),a])}r.sort(function(e,t){return e[0]<t[0]?-1:e[0]>t[0]?1:0});for(var o=[],u=0;u<r.length;++u)o.push(r[u][1]);return OAuth.formEncode(o)}}),OAuth.SignatureMethod.registerMethodClass(["PLAINTEXT","PLAINTEXT-Accessor"],OAuth.SignatureMethod.makeSubclass(function(e){return this.key})),OAuth.SignatureMethod.registerMethodClass(["HMAC-SHA1","HMAC-SHA1-Accessor"],OAuth.SignatureMethod.makeSubclass(function(e){b64pad="=";var t=b64_hmac_sha1(this.key,e);return t}));try{OAuth.correctTimestampFromSrc()}catch(e){}module.exports=OAuth; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment