Skip to content

Commit

Permalink
feat(permissions): add webdav permissions parser
Browse files Browse the repository at this point in the history
Signed-off-by: John Molakvoæ <skjnldsv@protonmail.com>
  • Loading branch information
skjnldsv committed Jan 25, 2023
1 parent 18dbbb4 commit f1353cf
Show file tree
Hide file tree
Showing 4 changed files with 58 additions and 1 deletion.
6 changes: 6 additions & 0 deletions __tests__/index.spec.ts
Expand Up @@ -7,6 +7,7 @@ import {
File,
Folder,
Permission,
parseWebdavPermissions,
} from '../lib/index'

import { File as FileSource } from '../lib/files/file'
Expand Down Expand Up @@ -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')
Expand Down
26 changes: 26 additions & 0 deletions __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)
})
})
})
2 changes: 1 addition & 1 deletion lib/index.ts
Expand Up @@ -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 {
Expand Down
25 changes: 25 additions & 0 deletions lib/permissions.ts
Expand Up @@ -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
}

0 comments on commit f1353cf

Please sign in to comment.