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..90347138 --- /dev/null +++ b/__tests__/permissions.spec.js @@ -0,0 +1,28 @@ +import { parseWebdavPermissions, Permission } from '../lib/permissions' + +const dataSet = [ + { input: undefined, permissions: Permission.NONE }, + { input: null, permissions: Permission.NONE }, + { 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..a9c62403 100644 --- a/lib/permissions.ts +++ b/lib/permissions.ts @@ -30,3 +30,31 @@ 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 = ''): number { + let permissions = Permission.NONE + + if (!permString) + return permissions + + 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 +}