From f1353cf6279daa9c47755bedaae3a52566ce0db1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=20Molakvo=C3=A6?= Date: Wed, 25 Jan 2023 09:25:42 +0100 Subject: [PATCH] feat(permissions): add webdav permissions parser MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: John Molakvoæ --- __tests__/index.spec.ts | 6 ++++++ __tests__/permissions.spec.js | 26 ++++++++++++++++++++++++++ lib/index.ts | 2 +- lib/permissions.ts | 25 +++++++++++++++++++++++++ 4 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 __tests__/permissions.spec.js diff --git a/__tests__/index.spec.ts b/__tests__/index.spec.ts index aa8cbceb..b7e170d8 100644 --- a/__tests__/index.spec.ts +++ b/__tests__/index.spec.ts @@ -7,6 +7,7 @@ import { File, Folder, Permission, + parseWebdavPermissions, } from '../lib/index' import { File as FileSource } from '../lib/files/file' @@ -54,6 +55,11 @@ describe('Exports checks', () => { expect(typeof Permission).toBe('object') }) + test('parseWebdavPermissions', () => { + expect(parseWebdavPermissions).toBeTruthy() + expect(typeof parseWebdavPermissions).toBe('function') + }) + test('File', () => { expect(File).toBeTruthy() expect(typeof File).toBe('function') diff --git a/__tests__/permissions.spec.js b/__tests__/permissions.spec.js new file mode 100644 index 00000000..641e578d --- /dev/null +++ b/__tests__/permissions.spec.js @@ -0,0 +1,26 @@ +import { parseWebdavPermissions, Permission } from '../lib/permissions' + +const dataSet = [ + { input: '-', permissions: Permission.NONE }, + { input: 'C', permissions: Permission.CREATE }, + { input: 'K', permissions: Permission.CREATE }, + { input: 'G', permissions: Permission.READ }, + { input: 'W', permissions: Permission.UPDATE }, + { input: 'N', permissions: Permission.UPDATE }, + { input: 'V', permissions: Permission.UPDATE }, + { input: 'D', permissions: Permission.DELETE }, + { input: 'R', permissions: Permission.SHARE }, + { input: 'CKGW', permissions: Permission.CREATE | Permission.READ | Permission.UPDATE }, + { input: 'GR', permissions: Permission.READ | Permission.SHARE }, + { input: 'GD', permissions: Permission.READ | Permission.DELETE }, + { input: 'RGDNVW', permissions: Permission.UPDATE | Permission.READ | Permission.DELETE | Permission.SHARE }, + { input: 'RGDNVCK', permissions: Permission.UPDATE | Permission.READ | Permission.DELETE | Permission.CREATE | Permission.SHARE }, +] + +describe('parseWebdavPermissions', () => { + dataSet.forEach(({ input, permissions }) => { + it(`expect ${input} to be ${permissions}`, () => { + expect(parseWebdavPermissions(input)).toBe(permissions) + }) + }) +}) diff --git a/lib/index.ts b/lib/index.ts index 959afcd6..3c0f5dcc 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -28,7 +28,7 @@ import { type Entry, getNewFileMenu, NewFileMenu } from './newFileMenu' export { FileType } from './files/fileType' export { File } from './files/file' export { Folder } from './files/folder' -export { Permission } from './permissions' +export { Permission, parseWebdavPermissions } from './permissions' declare global { interface Window { diff --git a/lib/permissions.ts b/lib/permissions.ts index efdc341f..02ac1ed0 100644 --- a/lib/permissions.ts +++ b/lib/permissions.ts @@ -30,3 +30,28 @@ export enum Permission { SHARE = 16, ALL = 31, } + +/** + * Parse the webdav permission string to a permission enum + * @see https://github.com/nextcloud/server/blob/71f698649f578db19a22457cb9d420fb62c10382/lib/public/Files/DavUtil.php#L58-L88 + */ +export const parseWebdavPermissions = function(permString: string = 'CK'): number { + let permissions = Permission.NONE + + if (permString.includes('C') || permString.includes('K')) + permissions |= Permission.CREATE + + if (permString.includes('G')) + permissions |= Permission.READ + + if (permString.includes('W') || permString.includes('N') || permString.includes('V')) + permissions |= Permission.UPDATE + + if (permString.includes('D')) + permissions |= Permission.DELETE + + if (permString.includes('R')) + permissions |= Permission.SHARE + + return permissions +}