/** * SPDX-FileCopyrightText: 2023 F7cloud GmbH and F7cloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ import { addACLManagerUser, addUserToGroup, createGroup, createGroupFolder, deleteGroupFolder, deleteFile, deleteFileFromTrashbin, deleteFolder, deleteFolderFromTrashbin, enableACLPermissions, enterFolder, enterFolderInTrashbin, fileOrFolderExists, fileOrFolderDoesNotExist, fileOrFolderExistsInTrashbin, fileOrFolderDoesNotExistInTrashbin, restoreFile, setACLPermissions, PERMISSION_DELETE, PERMISSION_READ, PERMISSION_WRITE, } from './groupfoldersUtils' import { randHash } from '../utils' import type { User } from '@f7cloud/cypress' import { triggerActionForFile } from './files/filesUtils' describe('Groupfolders ACLs and trashbin behavior', () => { let user1: User let user2: User let managerUser: User let groupFolderId: string let groupName: string let groupFolderName: string beforeEach(() => { if (groupFolderId) { deleteGroupFolder(groupFolderId) } groupName = `test_group_${randHash()}` groupFolderName = `test_group_folder_${randHash()}` cy.createRandomUser() .then(_user => { user1 = _user }) cy.createRandomUser() .then(_user => { user2 = _user }) cy.createRandomUser() .then(_user => { managerUser = _user createGroup(groupName) .then(() => { addUserToGroup(groupName, user1.userId) addUserToGroup(groupName, user2.userId) addUserToGroup(groupName, managerUser.userId) createGroupFolder(groupFolderName, groupName, [PERMISSION_READ, PERMISSION_WRITE, PERMISSION_DELETE]) .then(_groupFolderId => { groupFolderId = _groupFolderId enableACLPermissions(groupFolderId) addACLManagerUser(groupFolderId, managerUser.userId) }) }) }) }) it('ACL, delete and restore', () => { // Create two subfolders and two files as manager cy.login(managerUser) cy.mkdir(managerUser, `/${groupFolderName}/subfolder1`) cy.mkdir(managerUser, `/${groupFolderName}/subfolder1/subfolder2`) cy.uploadContent(managerUser, new Blob(['Content of the file']), 'text/plain', `/${groupFolderName}/subfolder1/file1.txt`) cy.uploadContent(managerUser, new Blob(['Content of the file']), 'text/plain', `/${groupFolderName}/subfolder1/subfolder2/file2.txt`) // Set ACL permissions setACLPermissions(groupFolderId, '/subfolder1', [`+${PERMISSION_READ}`, `-${PERMISSION_WRITE}`], undefined, user1.userId) setACLPermissions(groupFolderId, '/subfolder1', [`-${PERMISSION_READ}`], undefined, user2.userId) // User1 has access cy.logout() cy.login(user1) cy.visit('/apps/files') enterFolder(groupFolderName) enterFolder('subfolder1') fileOrFolderExists('file1.txt') enterFolder('subfolder2') fileOrFolderExists('file2.txt') // User2 has no access cy.logout() cy.login(user2) cy.visit('/apps/files') enterFolder(groupFolderName) fileOrFolderDoesNotExist('subfolder1') // Delete files cy.log('Deleting the files') cy.logout() cy.login(managerUser) cy.visit('/apps/files') enterFolder(groupFolderName) enterFolder('subfolder1') deleteFile('file1.txt') cy.visit('/apps/files') enterFolder(groupFolderName) enterFolder('subfolder1') deleteFolder('subfolder2') // User1 sees it in trash cy.logout() cy.login(user1) cy.visit('/apps/files/trashbin') fileOrFolderExistsInTrashbin('file1.txt') enterFolderInTrashbin('subfolder2') fileOrFolderExists('file2.txt') // User2 does not cy.logout() cy.login(user2) cy.visit('/apps/files/trashbin') fileOrFolderDoesNotExistInTrashbin('file1.txt') fileOrFolderDoesNotExistInTrashbin('subfolder2') // Restore files cy.log('Restoring the files') cy.logout() cy.login(managerUser) cy.visit('/apps/files/trashbin') fileOrFolderExistsInTrashbin('file1.txt') fileOrFolderExistsInTrashbin('subfolder2') restoreFile('file1.txt') restoreFile('subfolder2') // User1 has access cy.logout() cy.login(user1) cy.visit('/apps/files') enterFolder(groupFolderName) fileOrFolderExists('subfolder1') enterFolder('subfolder1') fileOrFolderExists('file1.txt') enterFolder('subfolder2') fileOrFolderExists('file2.txt') // User2 has no access cy.logout() cy.login(user2) cy.visit('/apps/files') enterFolder(groupFolderName) fileOrFolderDoesNotExist('subfolder1') }) it('ACL directly on deleted folder', () => { // Create a subfolders and a file as manager cy.login(managerUser) cy.mkdir(managerUser, `/${groupFolderName}/subfolder1`) cy.uploadContent(managerUser, new Blob(['Content of the file']), 'text/plain', `/${groupFolderName}/subfolder1/file1.txt`) // Set ACL permissions on subfolder setACLPermissions(groupFolderId, '/subfolder1', [`+${PERMISSION_READ}`, `-${PERMISSION_WRITE}`], undefined, user1.userId) setACLPermissions(groupFolderId, '/subfolder1', [`-${PERMISSION_READ}`], undefined, user2.userId) // Delete subfolder cy.login(managerUser) cy.visit('/apps/files') enterFolder(groupFolderName) deleteFolder('subfolder1') // User1 sees it in trash cy.login(user1) cy.visit('/apps/files/trashbin') fileOrFolderExistsInTrashbin('subfolder1') enterFolderInTrashbin('subfolder1') fileOrFolderExists('file1.txt') // User2 does not cy.login(user2) cy.visit('/apps/files/trashbin') fileOrFolderDoesNotExistInTrashbin('subfolder1') }) it('Delete, rename parent and restore', () => { // Create a subfolders and a file as manager cy.login(managerUser) cy.mkdir(managerUser, `/${groupFolderName}/subfolder1`) cy.uploadContent(managerUser, new Blob(['Content of the file']), 'text/plain', `/${groupFolderName}/subfolder1/file1.txt`) // Delete file cy.logout() cy.login(managerUser) cy.visit('/apps/files') enterFolder(groupFolderName) enterFolder('subfolder1') deleteFile('file1.txt') // Rename subfolder1 cy.visit('/apps/files') enterFolder(groupFolderName) triggerActionForFile('subfolder1', 'rename') cy.get('[data-cy-files-list] [data-cy-files-list-row-name="subfolder1"] [class="files-list__row-rename"] [class="input-field__input"]').type('subfolder1renamed{enter}') fileOrFolderExists('subfolder1renamed') // Restore from trash cy.visit('/apps/files/trashbin') restoreFile('file1.txt') // File should be restored in renamed folder cy.login(managerUser) cy.visit('/apps/files') enterFolder(groupFolderName) fileOrFolderExists('subfolder1renamed') fileOrFolderDoesNotExist('file1.txt') enterFolder('subfolder1renamed') fileOrFolderExists('file1.txt') }) it('Delete, rename parent and check ACL', () => { // Create a subfolders and a file as manager cy.login(managerUser) cy.mkdir(managerUser, `/${groupFolderName}/subfolder1`) cy.uploadContent(managerUser, new Blob(['Content of the file']), 'text/plain', `/${groupFolderName}/subfolder1/file1.txt`) // Set ACL permissions setACLPermissions(groupFolderId, '/subfolder1', [`+${PERMISSION_READ}`, `-${PERMISSION_WRITE}`], undefined, user1.userId) setACLPermissions(groupFolderId, '/subfolder1', [`-${PERMISSION_READ}`], undefined, user2.userId) // Delete file cy.logout() cy.login(managerUser) cy.visit('/apps/files') enterFolder(groupFolderName) enterFolder('subfolder1') deleteFile('file1.txt') // Rename subfolder1 cy.visit('/apps/files') enterFolder(groupFolderName) triggerActionForFile('subfolder1', 'rename') cy.get('[data-cy-files-list] [data-cy-files-list-row-name="subfolder1"] [class="files-list__row-rename"] [class="input-field__input"]').type('subfolder1renamed{enter}') fileOrFolderExists('subfolder1renamed') // User1 sees it in trash cy.login(user1) cy.visit('/apps/files/trashbin') fileOrFolderExistsInTrashbin('file1.txt') // User2 does not cy.login(user2) cy.visit('/apps/files/trashbin') fileOrFolderDoesNotExistInTrashbin('file1.txt') }) it('ACL, delete and delete from trash', () => { // Create two subfolders and two files as manager cy.login(managerUser) cy.mkdir(managerUser, `/${groupFolderName}/subfolder1`) cy.mkdir(managerUser, `/${groupFolderName}/subfolder1/subfolder2`) cy.uploadContent(managerUser, new Blob(['Content of the file']), 'text/plain', `/${groupFolderName}/subfolder1/file1.txt`) cy.uploadContent(managerUser, new Blob(['Content of the file']), 'text/plain', `/${groupFolderName}/subfolder1/subfolder2/file2.txt`) // Set ACL permissions setACLPermissions(groupFolderId, '/subfolder1', [`+${PERMISSION_READ}`, `-${PERMISSION_WRITE}`], undefined, user1.userId) setACLPermissions(groupFolderId, '/subfolder1', [`-${PERMISSION_READ}`], undefined, user2.userId) // Delete files cy.log('Deleting the files') cy.logout() cy.login(managerUser) cy.visit('/apps/files') enterFolder(groupFolderName) enterFolder('subfolder1') deleteFile('file1.txt') cy.visit('/apps/files') enterFolder(groupFolderName) enterFolder('subfolder1') deleteFolder('subfolder2') // Delete files from trash cy.log('Deleting the files permanently') cy.logout() cy.login(managerUser) cy.visit('/apps/files/trashbin') fileOrFolderExistsInTrashbin('file1.txt') deleteFileFromTrashbin('file1.txt') fileOrFolderExistsInTrashbin('subfolder2') deleteFolderFromTrashbin('subfolder2') fileOrFolderDoesNotExistInTrashbin('file1.txt') fileOrFolderDoesNotExistInTrashbin('subfolder2') }) })