Skip to content

Commit 03db00b

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

File tree

1 file changed

+172
-0
lines changed

1 file changed

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

0 commit comments

Comments
 (0)