@samitouri / QOSami-HFS / commits / 149f4c53

test: create_folder

Massimo Melina committed Nov 28, 2023 at 12:59 UTC 149f4c530d2da4be19bec1eeb389d481b30e4b7a
2 files changed +15 -11
src/frontEndApis.ts
+4 -3
@@ -10,7 +10,7 @@ import {
10 HTTP_BAD_REQUEST, HTTP_CONFLICT, HTTP_FAILED_DEPENDENCY, HTTP_FORBIDDEN,
11 HTTP_NOT_FOUND, HTTP_SERVER_ERROR, HTTP_UNAUTHORIZED
12 } from './const'
13 -import { hasPermission, urlToNode } from './vfs'
13 +import { hasPermission, statusCodeForMissingPerm, urlToNode } from './vfs'
14 import { mkdir, rename, rm } from 'fs/promises'
15 import { dirname, join } from 'path'
16 import { getUploadMeta } from './upload'
@@ -55,8 +55,9 @@ export const frontEndApis: ApiHandlers = {
55 const parentNode = await urlToNode(uri, ctx)
56 if (!parentNode)
57 return new ApiError(HTTP_NOT_FOUND, 'parent not found')
58 - if (!hasPermission(parentNode, 'can_upload', ctx))
59 - return new ApiError(HTTP_FORBIDDEN)
58 + const err = statusCodeForMissingPerm(parentNode, 'can_upload', ctx)
59 + if (err)
60 + return new ApiError(err)
61 try {
62 await mkdir(join(parentNode.source!, name))
63 return {}
tests/test.ts
+11 -8
@@ -16,7 +16,8 @@ const username = 'rejetto'
16 const password = 'password'
17 const API = '/~/api/'
18 const BASE_URL = 'http://localhost'
19 -const UPLOAD_URI = '/for-admins/upload/temp/gpl.png'
19 +const UPLOAD_ROOT = '/for-admins/upload'
20 +const UPLOAD_DEST = UPLOAD_ROOT + '/temp/gpl.png'
21
22 describe('basics', () => {
23 //before(async () => appStarted)
@@ -93,7 +94,8 @@ describe('basics', () => {
94 headers: { Referer: 'https://some-website.com/try-to-trick/x.com/' }
95 }))
96
96 - testUpload('upload.need account', UPLOAD_URI, 401)
97 + testUpload('upload.need account', UPLOAD_DEST, 401)
98 + it('create_folder', reqApi('create_folder', { uri: UPLOAD_ROOT, name: 'temp' }, 401))
99 it('delete.no perm', reqApi('delete', { uri: '/for-admins' }, 403))
100 it('delete.need account', reqApi('delete', { uri: '/for-admins/upload' }, 401))
101 it('rename.no perm', reqApi('delete', { uri: '/for-admins', dest: 'any' }, 403))
@@ -109,16 +111,17 @@ describe('accounts', () => {
111
112 describe('after-login', () => {
113 before(() => login(username))
114 + it('create_folder', reqApi('create_folder', { uri: UPLOAD_ROOT, name: 'temp' }, 200))
115 it('inherit.perm', reqList('/for-admins/', { inList:['alfa.txt'] }))
116 it('inherit.disabled', reqList('/for-disabled/', 401))
117 testUpload('upload.never', '/random', 403)
115 - testUpload('upload.ok', UPLOAD_URI, 200)
116 - testUpload('upload.crossing', UPLOAD_URI.replace('temp', '../..'), 418)
118 + testUpload('upload.ok', UPLOAD_DEST, 200)
119 + testUpload('upload.crossing', UPLOAD_DEST.replace('temp', '../..'), 418)
120 const renameTo = 'z'
118 - it('rename.ok', reqApi('rename', { uri: UPLOAD_URI, dest: renameTo }, 200))
119 - it('delete.miss renamed', reqApi('delete', { uri: UPLOAD_URI }, 404))
120 - it('delete.ok', reqApi('delete', { uri: dirname(UPLOAD_URI) + '/' + renameTo }, 200))
121 - it('delete.miss deleted', reqApi('delete', { uri: UPLOAD_URI }, 404))
121 + it('rename.ok', reqApi('rename', { uri: UPLOAD_DEST, dest: renameTo }, 200))
122 + it('delete.miss renamed', reqApi('delete', { uri: UPLOAD_DEST }, 404))
123 + it('delete.ok', reqApi('delete', { uri: dirname(UPLOAD_DEST) + '/' + renameTo }, 200))
124 + it('delete.miss deleted', reqApi('delete', { uri: UPLOAD_DEST }, 404))
125 after(() =>
126 rmSync(join(__dirname, 'temp'), { recursive: true}))
127 })