Skip to content

Commit 3c23fee

Browse files
committed
Checks that authenticated user has permission to create under this namespace
Previously, the project was always created under the authenticated user's namespace, but this not obvious behaviour.
1 parent 47e0ea8 commit 3c23fee

File tree

2 files changed

+63
-5
lines changed

2 files changed

+63
-5
lines changed

server/controllers/project.controller/__test__/createProject.test.js

Lines changed: 50 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,8 @@ describe('project.controller', () => {
169169

170170
it('returns 201 with id of created sketch', (done) => {
171171
const request = {
172-
user: { _id: 'abc123' },
172+
user: { _id: 'abc123', username: 'alice' },
173+
params: { username: 'alice' },
173174
body: {
174175
name: 'My sketch',
175176
files: {}
@@ -211,7 +212,8 @@ describe('project.controller', () => {
211212

212213
it('fails if slug is not unique', (done) => {
213214
const request = {
214-
user: { _id: 'abc123' },
215+
user: { _id: 'abc123', username: 'alice' },
216+
params: { username: 'alice' },
215217
body: {
216218
name: 'My sketch',
217219
slug: 'a-slug',
@@ -254,9 +256,50 @@ describe('project.controller', () => {
254256
promise.then(expectations, expectations).catch(expectations);
255257
});
256258

259+
it('fails if user does not have permission', (done) => {
260+
const request = {
261+
user: { _id: 'abc123', username: 'alice' },
262+
params: {
263+
username: 'dana',
264+
},
265+
body: {
266+
name: 'My sketch',
267+
slug: 'a-slug',
268+
files: {}
269+
}
270+
};
271+
const response = new Response();
272+
273+
const result = {
274+
_id: 'abc123',
275+
id: 'abc123',
276+
name: 'Project name',
277+
serveSecure: false,
278+
files: []
279+
};
280+
281+
ProjectInstanceMock.expects('isSlugUnique')
282+
.resolves({ isUnique: true, conflictingIds: [] });
283+
284+
ProjectInstanceMock.expects('save')
285+
.resolves(new Project(result));
286+
287+
const promise = apiCreateProject(request, response);
288+
289+
function expectations() {
290+
expect(response.status).toHaveBeenCalledWith(401);
291+
expect(response.json).toHaveBeenCalled();
292+
293+
done();
294+
}
295+
296+
promise.then(expectations, expectations).catch(expectations);
297+
});
298+
257299
it('returns validation errors on files input', (done) => {
258300
const request = {
259-
user: {},
301+
user: { username: 'alice' },
302+
params: { username: 'alice' },
260303
body: {
261304
name: 'My sketch',
262305
files: {
@@ -291,7 +334,8 @@ describe('project.controller', () => {
291334

292335
it('rejects file parameters not in object format', (done) => {
293336
const request = {
294-
user: { _id: 'abc123' },
337+
user: { _id: 'abc123', username: 'alice' },
338+
params: { username: 'alice' },
295339
body: {
296340
name: 'Wriggly worm',
297341
files: [{ name: 'file.js', content: 'var hello = true;' }]
@@ -318,7 +362,8 @@ describe('project.controller', () => {
318362

319363
it('rejects if files object in not provided', (done) => {
320364
const request = {
321-
user: { _id: 'abc123' },
365+
user: { _id: 'abc123', username: 'alice' },
366+
params: { username: 'alice' },
322367
body: {
323368
name: 'Wriggly worm',
324369
// files: {} is missing

server/controllers/project.controller/createProject.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,19 @@ export function apiCreateProject(req, res) {
5959
}
6060
}
6161

62+
function checkUserHasPermission() {
63+
if (req.user.username !== req.params.username) {
64+
console.log('no permission');
65+
const error = new ProjectValidationError(`'${req.user.username}' does not have permission to create for '${req.params.username}'`);
66+
error.code = 401;
67+
68+
throw error;
69+
}
70+
}
71+
6272
try {
73+
checkUserHasPermission();
74+
6375
const model = toModel(params);
6476

6577
return model.isSlugUnique()
@@ -76,6 +88,7 @@ export function apiCreateProject(req, res) {
7688

7789
throw error;
7890
})
91+
.then(checkUserHasPermission)
7992
.catch(handleErrors);
8093
} catch (err) {
8194
handleErrors(err);

0 commit comments

Comments
 (0)