Skip to content

Commit 61984fb

Browse files
author
Will Toozs
committed
ARSN-422: add unit tests for formAuthCheck
1 parent 1244a1d commit 61984fb

File tree

1 file changed

+169
-0
lines changed

1 file changed

+169
-0
lines changed
+169
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,169 @@
1+
'use strict'; // eslint-disable-line strict
2+
3+
const assert = require('assert');
4+
const fakeTimers = require('@sinonjs/fake-timers');
5+
6+
const errors = require('../../../../lib/errors').default;
7+
8+
const createAlteredRequest = require('../../helpers').createAlteredRequest;
9+
const formAuthCheck = require('../../../../lib/auth/v4/formAuthCheck').check;
10+
const DummyRequestLogger = require('../../helpers').DummyRequestLogger;
11+
12+
const log = new DummyRequestLogger();
13+
14+
const method = 'POST';
15+
const path = decodeURIComponent('/mybucket');
16+
const host = 'localhost:8000';
17+
18+
const formatDate = now => now.toISOString().replace(/[:-]|\.\d{3}/g, '');
19+
20+
const requestDate = new Date(Date.now());
21+
22+
function prepPolicy(data, expiration = new Date(requestDate.getTime() + 15 * 60 * 1000)) {
23+
try {
24+
// 15 minutes
25+
const policy = { expiration: expiration.toISOString() };
26+
policy.conditions = Object.keys(data).map(key => ({ key: data[key] }));
27+
// return base64 version of policy
28+
return policy;
29+
} catch (e) {
30+
throw new Error('Policy is not a valid JSON');
31+
}
32+
}
33+
34+
const formData = {
35+
'x-amz-algorithm': 'AWS4-HMAC-SHA256',
36+
'x-amz-credential': `accessKey1/${formatDate(requestDate).split('T')[0]}/us-east-1/s3/aws4_request`,
37+
'x-amz-date': formatDate(requestDate),
38+
'x-amz-signature': '036c5d854aca98a003c1c155a' +
39+
'7723157d8148ad5888b3aee1133784eb5aec08b',
40+
};
41+
formData.policy = `${btoa(JSON.stringify(prepPolicy(formData)))}`;
42+
43+
const headers = {
44+
host,
45+
};
46+
const request = {
47+
method,
48+
path,
49+
headers,
50+
formData,
51+
};
52+
53+
describe('v4 formAuthCheck', () => {
54+
it('should return error if algorithm param incorrect', done => {
55+
const alteredRequest = createAlteredRequest({
56+
'x-amz-algorithm':
57+
'AWS4-HMAC-SHA1',
58+
}, 'formData', request, formData);
59+
const res = formAuthCheck(alteredRequest, log, alteredRequest.formData);
60+
assert.deepStrictEqual(res.err, errors.InvalidArgument);
61+
done();
62+
});
63+
64+
it('should return error if x-amz-credential param is undefined', done => {
65+
const alteredRequest = createAlteredRequest({
66+
'x-amz-credential':
67+
undefined,
68+
}, 'formData', request, formData);
69+
const res = formAuthCheck(alteredRequest, log, alteredRequest.formData);
70+
assert.deepStrictEqual(res.err, errors.InvalidArgument);
71+
done();
72+
});
73+
74+
it('should return error if credential param format incorrect', done => {
75+
const alteredRequest = createAlteredRequest({
76+
'x-amz-credential':
77+
'incorrectformat',
78+
}, 'formData', request, formData);
79+
const res = formAuthCheck(alteredRequest, log, alteredRequest.formData);
80+
assert.deepStrictEqual(res.err, errors.InvalidArgument);
81+
done();
82+
});
83+
84+
it('should return error if service set forth in ' +
85+
'credential param is not s3', done => {
86+
const alteredRequest = createAlteredRequest({
87+
'x-amz-credential':
88+
`accessKey1/${formatDate(requestDate).split('T')[0]}/us-east-1/EC2/aws4_request`,
89+
},
90+
'formData', request, formData);
91+
const res = formAuthCheck(alteredRequest, log, alteredRequest.formData);
92+
assert.deepStrictEqual(res.err, errors.InvalidArgument);
93+
done();
94+
});
95+
96+
it('should return error if requestType set forth in ' +
97+
'credential param is not aws4_request', done => {
98+
const alteredRequest = createAlteredRequest({
99+
'x-amz-credential':
100+
`accessKey1/${formatDate(requestDate).split('T')[0]}/us-east-1/s3/aws2_request`,
101+
},
102+
'formData', request, formData);
103+
const res = formAuthCheck(alteredRequest, log, alteredRequest.formData);
104+
assert.deepStrictEqual(res.err, errors.InvalidArgument);
105+
done();
106+
});
107+
108+
it('should return error if undefined x-amz-signature param', done => {
109+
const alteredRequest = createAlteredRequest({
110+
'x-amz-signature':
111+
undefined,
112+
}, 'formData', request, formData);
113+
const res = formAuthCheck(alteredRequest, log, alteredRequest.formData);
114+
assert.deepStrictEqual(res.err, errors.InvalidArgument);
115+
done();
116+
});
117+
118+
it('should return error if undefined x-amz-date param', done => {
119+
const alteredRequest = createAlteredRequest({
120+
'x-amz-date':
121+
undefined,
122+
}, 'formData', request, formData);
123+
const res = formAuthCheck(alteredRequest, log, alteredRequest.formData);
124+
assert.deepStrictEqual(res.err, errors.InvalidArgument);
125+
done();
126+
});
127+
128+
it('should return error if expiration param is too old', done => {
129+
const expiredDate = new Date(Date.now() - 30 * 60 * 1000);
130+
131+
// Update the expiration date in formData
132+
const alteredFormData = Object.assign({}, formData, {
133+
policy: `${btoa(JSON.stringify(prepPolicy(formData, expiredDate)))}`,
134+
});
135+
136+
// Assuming alteredRequest is the request object that includes formData
137+
const alteredRequest = Object.assign({}, request, {
138+
formData: alteredFormData,
139+
});
140+
141+
const res = formAuthCheck(alteredRequest, log, alteredRequest.formData);
142+
assert.deepStrictEqual(res.err, errors.AccessDenied);
143+
done();
144+
});
145+
146+
it('should return error if scope date from x-amz-credential param' +
147+
'does not match date from x-amz-date param', done => {
148+
const clock = fakeTimers.install({ now: 1454974984001 });
149+
const alteredRequest = createAlteredRequest({
150+
'x-amz-credential': 'accessKey1/20160209/' +
151+
'us-east-1/s3/aws4_request',
152+
}, 'formData', request, formData);
153+
const res = formAuthCheck(alteredRequest, log, alteredRequest.formData);
154+
clock.uninstall();
155+
assert.deepStrictEqual(res.err, errors.RequestTimeTooSkewed);
156+
done();
157+
});
158+
159+
it('should successfully return v4 and no error', done => {
160+
// Freezes time so date created within function will be Feb 8, 2016
161+
// (within 15 minutes of timestamp in request)
162+
const clock = fakeTimers.install({ now: 1454974984001 });
163+
const res = formAuthCheck(request, log, request.formData);
164+
clock.uninstall();
165+
assert.deepStrictEqual(res.err, null);
166+
assert.strictEqual(res.params.version, 4);
167+
done();
168+
});
169+
});

0 commit comments

Comments
 (0)