diff --git a/package.json b/package.json index f305a8b..84058c9 100644 --- a/package.json +++ b/package.json @@ -51,30 +51,30 @@ "eslint-config-screwdriver": "^3.0.0", "jenkins-mocha": "^4.0.0", "js-yaml": "^3.6.1", - "jsonwebtoken": "^8.2.1", + "jsonwebtoken": "^8.4.0", "mockery": "^2.0.0", "sinon": "^4.5.0" }, "dependencies": { - "aws-sdk": "^2.323.0", - "boom": "^7.2.0", - "catbox": "^10.0.2", + "aws-sdk": "^2.361.0", + "boom": "^7.2.2", + "catbox": "^10.0.5", "catbox-disk": "^3.0.0", - "catbox-memory": "^3.1.2", + "catbox-memory": "^3.1.4", "catbox-s3": "^4.0.0", "config": "^1.30.0", "good": "^8.1.1", "good-console": "^7.1.0", "good-squeeze": "^5.0.2", - "hapi": "^17.2.3", + "hapi": "^17.7.0", "hapi-auth-jwt2": "^8.1.0", - "hapi-swagger": "^9.1.1", + "hapi-swagger": "^9.1.3", "hoek": "^5.0.3", - "inert": "^5.1.0", + "inert": "^5.1.2", "joi": "13.1.2", "request": "^2.88.0", - "screwdriver-data-schema": "^18.11.5", - "vision": "^5.3.0", + "screwdriver-data-schema": "^18.34.2", + "vision": "^5.4.3", "winston": "^2.2.0" } } diff --git a/plugins/caches.js b/plugins/caches.js index afdb742..cd8ad45 100644 --- a/plugins/caches.js +++ b/plugins/caches.js @@ -336,7 +336,7 @@ exports.plugin = { }, { method: 'DELETE', path: '/caches/{scope}/{id}', - handler: async (request, h) => { + handler: (request, h) => { if (strategyConfig.plugin !== 's3') { return h.response(); } @@ -388,27 +388,30 @@ exports.plugin = { return boom.forbidden('Invalid scope'); } - try { - await req(opts, (err, response) => { - if (!err && response === true) { - return awsClient.invalidateCache(cachePath, (e) => { - if (e) { - console.log('Failed to invalidate cache: ', e); - } - - return Promise.resolve(); - }); - } else if (!err) { - return Promise.reject(new Error('User cannot invalidate cache.')); + return new Promise((resolve, reject) => req(opts, (err, response) => { + if (err) { + return reject(err); + } + + if (response.body === false) { + return reject('Permission denied'); + } + + return awsClient.invalidateCache(cachePath, (e) => { + if (e) { + return reject(e); } - return Promise.reject(err); + return resolve(); }); - } catch (err) { - return boom.forbidden(err); - } + })).then(() => h.response().code(200)) + .catch((err) => { + if (err === 'Permission denied') { + return boom.forbidden(err); + } - return h.response(); + return h.response().code(500); + }); }, options: { description: 'Invalidate cache folder', diff --git a/test/plugins/caches.test.js b/test/plugins/caches.test.js index 641e6d6..9c5b5d8 100644 --- a/test/plugins/caches.test.js +++ b/test/plugins/caches.test.js @@ -36,7 +36,9 @@ describe('events plugin test', () => { invalidateCache: sinon.stub().yields(null) }); - reqMock = sinon.stub().yields(null, { + reqMock = sinon.stub(); + + reqMock.yieldsAsync({ statusCode: 403 }); @@ -638,35 +640,9 @@ describe('events plugin test', () => { }); describe('DELETE /caches/:scope/:id', () => { - let getOptions; - let putOptions; let deleteOptions; beforeEach(() => { - getOptions = { - headers: { - 'x-foo': 'bar' - }, - credentials: { - jobId: mockJobID, - scope: ['build'] - }, - url: `/caches/jobs/${mockJobID}/foo` - }; - putOptions = { - method: 'PUT', - payload: 'THIS IS A TEST', - headers: { - 'x-foo': 'bar', - 'content-type': 'text/plain', - ignore: 'true' - }, - credentials: { - jobId: mockJobID, - scope: ['build'] - }, - url: `/caches/jobs/${mockJobID}/foo` - }; deleteOptions = { method: 'DELETE', headers: { @@ -682,18 +658,36 @@ describe('events plugin test', () => { }; }); - it('Throws error if user cannot invalidate cache', () => - server.inject(putOptions).then((postResponse) => { - assert.equal(postResponse.statusCode, 202); + it('Returns 200 if successfully invalidate cache', () => { + reqMock.yieldsAsync(null, { + statusCode: 200, + body: true + }); - return server.inject(getOptions).then((getResponse) => { - assert.equal(getResponse.statusCode, 200); + return server.inject(deleteOptions).then((deleteResponse) => { + assert.equal(deleteResponse.statusCode, 200); + }); + }); - return server.inject(deleteOptions).then((deleteResponse) => { - assert.equal(deleteResponse.statusCode, 403); - }); - }); - }) - ); + it('Returns 403 if user does not have permission', () => { + reqMock.yieldsAsync(null, { + statusCode: 200, + body: false + }); + + return server.inject(deleteOptions).then((deleteResponse) => { + assert.equal(deleteResponse.statusCode, 403); + }); + }); + + it('Returns 500 if user cannot invalidate cache', () => { + const err = new Error('bad'); + + reqMock.yieldsAsync(err); + + return server.inject(deleteOptions).then((deleteResponse) => { + assert.equal(deleteResponse.statusCode, 500); + }); + }); }); });