Comparing version 2.2.3 to 2.3.0
@@ -137,3 +137,81 @@ /* | ||
// Generate a bewit value for a given URI | ||
/* | ||
uri: 'http://example.com/resource?a=b' | ||
options: { | ||
// Required | ||
credentials: { | ||
id: 'dh37fgj492je', | ||
key: 'aoijedoaijsdlaksjdl', | ||
algorithm: 'sha256' // 'sha1', 'sha256' | ||
}, | ||
ttlSec: 60 * 60, // TTL in seconds | ||
// Optional | ||
ext: 'application-specific', // Application specific data sent via the ext attribute | ||
localtimeOffsetMsec: 400 // Time offset to sync with server time | ||
}; | ||
*/ | ||
bewit: function (uri, options) { | ||
// Validate inputs | ||
if (!uri || | ||
(typeof uri !== 'string') || | ||
!options || | ||
typeof options !== 'object' || | ||
!options.ttlSec) { | ||
return ''; | ||
} | ||
options.ext = (options.ext === null || options.ext === undefined ? '' : options.ext); // Zero is valid value | ||
// Application time | ||
var now = hawk.utils.now(options.localtimeOffsetMsec); | ||
// Validate credentials | ||
var credentials = options.credentials; | ||
if (!credentials || | ||
!credentials.id || | ||
!credentials.key || | ||
!credentials.algorithm) { | ||
return ''; | ||
} | ||
if (hawk.crypto.algorithms.indexOf(credentials.algorithm) === -1) { | ||
return ''; | ||
} | ||
// Parse URI | ||
uri = hawk.utils.parseUri(uri); | ||
// Calculate signature | ||
var exp = now + options.ttlSec; | ||
var mac = hawk.crypto.calculateMac('bewit', credentials, { | ||
ts: exp, | ||
nonce: '', | ||
method: 'GET', | ||
resource: uri.relative, // Maintain trailing '?' and query params | ||
host: uri.hostname, | ||
port: uri.port, | ||
ext: options.ext | ||
}); | ||
// Construct bewit: id\exp\mac\ext | ||
var bewit = credentials.id + '\\' + exp + '\\' + mac + '\\' + options.ext; | ||
return hawk.utils.base64urlEncode(bewit); | ||
}, | ||
// Validate server response | ||
@@ -531,2 +609,9 @@ | ||
return uri; | ||
}, | ||
base64urlEncode: function (value) { | ||
var wordArray = CryptoJS.enc.Utf8.parse(value); | ||
var encoded = CryptoJS.enc.Base64.stringify(wordArray); | ||
return encoded.replace(/\+/g, '-').replace(/\//g, '_').replace(/\=/g, ''); | ||
} | ||
@@ -533,0 +618,0 @@ }; |
@@ -210,6 +210,2 @@ // Load modules | ||
/* | ||
* credentials is an object with the following keys: 'id, 'key', 'algorithm'. | ||
* options is an object with the following optional keys: 'ext', 'localtimeOffsetMsec' | ||
*/ | ||
/* | ||
uri: 'http://example.com/resource?a=b' or object from Url.parse() | ||
@@ -216,0 +212,0 @@ options: { |
{ | ||
"name": "hawk", | ||
"description": "HTTP Hawk Authentication Scheme", | ||
"version": "2.2.3", | ||
"version": "2.3.0", | ||
"author": "Eran Hammer <eran@hammer.io> (http://hueniverse.com)", | ||
@@ -26,3 +26,3 @@ "contributors": [], | ||
"devDependencies": { | ||
"lab": "3.x.x" | ||
"lab": "4.x.x" | ||
}, | ||
@@ -29,0 +29,0 @@ "scripts": { |
@@ -6,3 +6,3 @@ ![hawk Logo](https://raw.github.com/hueniverse/hawk/master/images/hawk.png) | ||
Current version: **2.2** | ||
Current version: **2.3** | ||
@@ -9,0 +9,0 @@ Note: 2.x is the same exact protocol as 1.1. The version increment reflects a change in the internal error format |
@@ -17,7 +17,6 @@ // Load modules | ||
var lab = exports.lab = Lab.script(); | ||
var describe = lab.experiment; | ||
var it = lab.test; | ||
var expect = Lab.expect; | ||
var before = Lab.before; | ||
var after = Lab.after; | ||
var describe = Lab.experiment; | ||
var it = Lab.test; | ||
@@ -39,2 +38,200 @@ | ||
it('should generate a bewit then successfully authenticate it', function (done) { | ||
var req = { | ||
method: 'GET', | ||
url: '/resource/4?a=1&b=2', | ||
host: 'example.com', | ||
port: 80 | ||
}; | ||
credentialsFunc('123456', function (err, credentials) { | ||
var bewit = Browser.client.bewit('http://example.com/resource/4?a=1&b=2', { credentials: credentials, ttlSec: 60 * 60 * 24 * 365 * 100, ext: 'some-app-data' }); | ||
req.url += '&bewit=' + bewit; | ||
Hawk.uri.authenticate(req, credentialsFunc, {}, function (err, credentials, attributes) { | ||
expect(err).to.not.exist; | ||
expect(credentials.user).to.equal('steve'); | ||
expect(attributes.ext).to.equal('some-app-data'); | ||
done(); | ||
}); | ||
}); | ||
}); | ||
it('should generate a bewit then successfully authenticate it (no ext)', function (done) { | ||
var req = { | ||
method: 'GET', | ||
url: '/resource/4?a=1&b=2', | ||
host: 'example.com', | ||
port: 80 | ||
}; | ||
credentialsFunc('123456', function (err, credentials) { | ||
var bewit = Browser.client.bewit('http://example.com/resource/4?a=1&b=2', { credentials: credentials, ttlSec: 60 * 60 * 24 * 365 * 100 }); | ||
req.url += '&bewit=' + bewit; | ||
Hawk.uri.authenticate(req, credentialsFunc, {}, function (err, credentials, attributes) { | ||
expect(err).to.not.exist; | ||
expect(credentials.user).to.equal('steve'); | ||
done(); | ||
}); | ||
}); | ||
}); | ||
describe('#bewit', function () { | ||
it('returns a valid bewit value', function (done) { | ||
var credentials = { | ||
id: '123456', | ||
key: '2983d45yun89q', | ||
algorithm: 'sha256' | ||
}; | ||
var bewit = Browser.client.bewit('https://example.com/somewhere/over/the/rainbow', { credentials: credentials, ttlSec: 300, localtimeOffsetMsec: 1356420407232 - Hawk.utils.now(), ext: 'xandyandz' }); | ||
expect(bewit).to.equal('MTIzNDU2XDEzNTY0MjA3MDdca3NjeHdOUjJ0SnBQMVQxekRMTlBiQjVVaUtJVTl0T1NKWFRVZEc3WDloOD1ceGFuZHlhbmR6'); | ||
done(); | ||
}); | ||
it('returns a valid bewit value (explicit HTTP port)', function (done) { | ||
var credentials = { | ||
id: '123456', | ||
key: '2983d45yun89q', | ||
algorithm: 'sha256' | ||
}; | ||
var bewit = Browser.client.bewit('http://example.com:8080/somewhere/over/the/rainbow', { credentials: credentials, ttlSec: 300, localtimeOffsetMsec: 1356420407232 - Hawk.utils.now(), ext: 'xandyandz' }); | ||
expect(bewit).to.equal('MTIzNDU2XDEzNTY0MjA3MDdcaFpiSjNQMmNLRW80a3kwQzhqa1pBa1J5Q1p1ZWc0V1NOYnhWN3ZxM3hIVT1ceGFuZHlhbmR6'); | ||
done(); | ||
}); | ||
it('returns a valid bewit value (explicit HTTPS port)', function (done) { | ||
var credentials = { | ||
id: '123456', | ||
key: '2983d45yun89q', | ||
algorithm: 'sha256' | ||
}; | ||
var bewit = Browser.client.bewit('https://example.com:8043/somewhere/over/the/rainbow', { credentials: credentials, ttlSec: 300, localtimeOffsetMsec: 1356420407232 - Hawk.utils.now(), ext: 'xandyandz' }); | ||
expect(bewit).to.equal('MTIzNDU2XDEzNTY0MjA3MDdcL2t4UjhwK0xSaTdvQTRnUXc3cWlxa3BiVHRKYkR4OEtRMC9HRUwvVytTUT1ceGFuZHlhbmR6'); | ||
done(); | ||
}); | ||
it('returns a valid bewit value (null ext)', function (done) { | ||
var credentials = { | ||
id: '123456', | ||
key: '2983d45yun89q', | ||
algorithm: 'sha256' | ||
}; | ||
var bewit = Browser.client.bewit('https://example.com/somewhere/over/the/rainbow', { credentials: credentials, ttlSec: 300, localtimeOffsetMsec: 1356420407232 - Hawk.utils.now(), ext: null }); | ||
expect(bewit).to.equal('MTIzNDU2XDEzNTY0MjA3MDdcSUdZbUxnSXFMckNlOEN4dktQczRKbFdJQStValdKSm91d2dBUmlWaENBZz1c'); | ||
done(); | ||
}); | ||
it('errors on invalid options', function (done) { | ||
var credentials = { | ||
id: '123456', | ||
key: '2983d45yun89q', | ||
algorithm: 'sha256' | ||
}; | ||
var bewit = Browser.client.bewit('https://example.com/somewhere/over/the/rainbow', 4); | ||
expect(bewit).to.equal(''); | ||
done(); | ||
}); | ||
it('errors on missing uri', function (done) { | ||
var credentials = { | ||
id: '123456', | ||
key: '2983d45yun89q', | ||
algorithm: 'sha256' | ||
}; | ||
var bewit = Browser.client.bewit('', { credentials: credentials, ttlSec: 300, localtimeOffsetMsec: 1356420407232 - Hawk.utils.now(), ext: 'xandyandz' }); | ||
expect(bewit).to.equal(''); | ||
done(); | ||
}); | ||
it('errors on invalid uri', function (done) { | ||
var credentials = { | ||
id: '123456', | ||
key: '2983d45yun89q', | ||
algorithm: 'sha256' | ||
}; | ||
var bewit = Browser.client.bewit(5, { credentials: credentials, ttlSec: 300, localtimeOffsetMsec: 1356420407232 - Hawk.utils.now(), ext: 'xandyandz' }); | ||
expect(bewit).to.equal(''); | ||
done(); | ||
}); | ||
it('errors on invalid credentials (id)', function (done) { | ||
var credentials = { | ||
key: '2983d45yun89q', | ||
algorithm: 'sha256' | ||
}; | ||
var bewit = Browser.client.bewit('https://example.com/somewhere/over/the/rainbow', { credentials: credentials, ttlSec: 3000, ext: 'xandyandz' }); | ||
expect(bewit).to.equal(''); | ||
done(); | ||
}); | ||
it('errors on missing credentials', function (done) { | ||
var bewit = Browser.client.bewit('https://example.com/somewhere/over/the/rainbow', { ttlSec: 3000, ext: 'xandyandz' }); | ||
expect(bewit).to.equal(''); | ||
done(); | ||
}); | ||
it('errors on invalid credentials (key)', function (done) { | ||
var credentials = { | ||
id: '123456', | ||
algorithm: 'sha256' | ||
}; | ||
var bewit = Browser.client.bewit('https://example.com/somewhere/over/the/rainbow', { credentials: credentials, ttlSec: 3000, ext: 'xandyandz' }); | ||
expect(bewit).to.equal(''); | ||
done(); | ||
}); | ||
it('errors on invalid algorithm', function (done) { | ||
var credentials = { | ||
id: '123456', | ||
key: '2983d45yun89q', | ||
algorithm: 'hmac-sha-0' | ||
}; | ||
var bewit = Browser.client.bewit('https://example.com/somewhere/over/the/rainbow', { credentials: credentials, ttlSec: 300, ext: 'xandyandz' }); | ||
expect(bewit).to.equal(''); | ||
done(); | ||
}); | ||
it('errors on missing options', function (done) { | ||
var credentials = { | ||
id: '123456', | ||
key: '2983d45yun89q', | ||
algorithm: 'hmac-sha-0' | ||
}; | ||
var bewit = Browser.client.bewit('https://example.com/somewhere/over/the/rainbow'); | ||
expect(bewit).to.equal(''); | ||
done(); | ||
}); | ||
}); | ||
it('generates a header then successfully parse it (configuration)', function (done) { | ||
@@ -1242,3 +1439,17 @@ | ||
}); | ||
var str = "https://www.google.ca/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=url"; | ||
var base64str = "aHR0cHM6Ly93d3cuZ29vZ2xlLmNhL3dlYmhwP3NvdXJjZWlkPWNocm9tZS1pbnN0YW50Jmlvbj0xJmVzcHY9MiZpZT1VVEYtOCNxPXVybA"; | ||
describe('#base64urlEncode', function () { | ||
it('should base64 URL-safe decode a string', function (done) { | ||
expect(Browser.utils.base64urlEncode(str)).to.equal(base64str); | ||
done(); | ||
}); | ||
}); | ||
}); | ||
}); |
@@ -15,7 +15,6 @@ // Load modules | ||
var lab = exports.lab = Lab.script(); | ||
var describe = lab.experiment; | ||
var it = lab.test; | ||
var expect = Lab.expect; | ||
var before = Lab.before; | ||
var after = Lab.after; | ||
var describe = Lab.experiment; | ||
var it = Lab.test; | ||
@@ -22,0 +21,0 @@ |
@@ -14,7 +14,6 @@ // Load modules | ||
var lab = exports.lab = Lab.script(); | ||
var describe = lab.experiment; | ||
var it = lab.test; | ||
var expect = Lab.expect; | ||
var before = Lab.before; | ||
var after = Lab.after; | ||
var describe = Lab.experiment; | ||
var it = Lab.test; | ||
@@ -21,0 +20,0 @@ |
@@ -15,7 +15,6 @@ // Load modules | ||
var lab = exports.lab = Lab.script(); | ||
var describe = lab.experiment; | ||
var it = lab.test; | ||
var expect = Lab.expect; | ||
var before = Lab.before; | ||
var after = Lab.after; | ||
var describe = Lab.experiment; | ||
var it = Lab.test; | ||
@@ -22,0 +21,0 @@ |
@@ -16,7 +16,6 @@ // Load modules | ||
var lab = exports.lab = Lab.script(); | ||
var describe = lab.experiment; | ||
var it = lab.test; | ||
var expect = Lab.expect; | ||
var before = Lab.before; | ||
var after = Lab.after; | ||
var describe = Lab.experiment; | ||
var it = Lab.test; | ||
@@ -23,0 +22,0 @@ |
@@ -15,7 +15,6 @@ // Load modules | ||
var lab = exports.lab = Lab.script(); | ||
var describe = lab.experiment; | ||
var it = lab.test; | ||
var expect = Lab.expect; | ||
var before = Lab.before; | ||
var after = Lab.after; | ||
var describe = Lab.experiment; | ||
var it = Lab.test; | ||
@@ -22,0 +21,0 @@ |
@@ -15,7 +15,6 @@ // Load modules | ||
var lab = exports.lab = Lab.script(); | ||
var describe = lab.experiment; | ||
var it = lab.test; | ||
var expect = Lab.expect; | ||
var before = Lab.before; | ||
var after = Lab.after; | ||
var describe = Lab.experiment; | ||
var it = Lab.test; | ||
@@ -22,0 +21,0 @@ |
@@ -17,7 +17,6 @@ // Load modules | ||
var lab = exports.lab = Lab.script(); | ||
var describe = lab.experiment; | ||
var it = lab.test; | ||
var expect = Lab.expect; | ||
var before = Lab.before; | ||
var after = Lab.after; | ||
var describe = Lab.experiment; | ||
var it = Lab.test; | ||
@@ -24,0 +23,0 @@ |
@@ -15,7 +15,6 @@ // Load modules | ||
var lab = exports.lab = Lab.script(); | ||
var describe = lab.experiment; | ||
var it = lab.test; | ||
var expect = Lab.expect; | ||
var before = Lab.before; | ||
var after = Lab.after; | ||
var describe = Lab.experiment; | ||
var it = Lab.test; | ||
@@ -22,0 +21,0 @@ |
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
345909
4723