Merge pull request #57631 from nextcloud/fix/remove-share-permission-from-allow-editing

feat(sharing): remove share permission from "Allow editing" default
This commit is contained in:
F. E Noel Nfebe 2026-01-20 22:20:33 +01:00 committed by GitHub
commit 0e515dbe96
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
18 changed files with 32 additions and 19 deletions

View file

@ -95,11 +95,12 @@ export default {
preSelectedOption() {
// We remove the share permission for the comparison as it is not relevant for bundled permissions.
if ((this.share.permissions & ~ATOMIC_PERMISSIONS.SHARE) === BUNDLED_PERMISSIONS.READ_ONLY) {
const permissionsWithoutShare = this.share.permissions & ~ATOMIC_PERMISSIONS.SHARE
if (permissionsWithoutShare === BUNDLED_PERMISSIONS.READ_ONLY) {
return this.canViewText
} else if (this.share.permissions === BUNDLED_PERMISSIONS.ALL || this.share.permissions === BUNDLED_PERMISSIONS.ALL_FILE) {
} else if (permissionsWithoutShare === BUNDLED_PERMISSIONS.ALL || permissionsWithoutShare === BUNDLED_PERMISSIONS.ALL_FILE) {
return this.canEditText
} else if ((this.share.permissions & ~ATOMIC_PERMISSIONS.SHARE) === BUNDLED_PERMISSIONS.FILE_DROP) {
} else if (permissionsWithoutShare === BUNDLED_PERMISSIONS.FILE_DROP) {
return this.fileDropText
}

View file

@ -16,8 +16,8 @@ export const BUNDLED_PERMISSIONS = {
READ_ONLY: ATOMIC_PERMISSIONS.READ,
UPLOAD_AND_UPDATE: ATOMIC_PERMISSIONS.READ | ATOMIC_PERMISSIONS.UPDATE | ATOMIC_PERMISSIONS.CREATE | ATOMIC_PERMISSIONS.DELETE,
FILE_DROP: ATOMIC_PERMISSIONS.CREATE,
ALL: ATOMIC_PERMISSIONS.UPDATE | ATOMIC_PERMISSIONS.CREATE | ATOMIC_PERMISSIONS.READ | ATOMIC_PERMISSIONS.DELETE | ATOMIC_PERMISSIONS.SHARE,
ALL_FILE: ATOMIC_PERMISSIONS.UPDATE | ATOMIC_PERMISSIONS.READ | ATOMIC_PERMISSIONS.SHARE,
ALL: ATOMIC_PERMISSIONS.UPDATE | ATOMIC_PERMISSIONS.CREATE | ATOMIC_PERMISSIONS.READ | ATOMIC_PERMISSIONS.DELETE,
ALL_FILE: ATOMIC_PERMISSIONS.UPDATE | ATOMIC_PERMISSIONS.READ,
}
/**

View file

@ -20,7 +20,7 @@ describe('SharePermissionsToolBox', () => {
expect(addPermissions(ATOMIC_PERMISSIONS.NONE, ATOMIC_PERMISSIONS.READ)).toBe(ATOMIC_PERMISSIONS.READ)
expect(addPermissions(ATOMIC_PERMISSIONS.READ, ATOMIC_PERMISSIONS.READ)).toBe(ATOMIC_PERMISSIONS.READ)
expect(addPermissions(ATOMIC_PERMISSIONS.READ, ATOMIC_PERMISSIONS.UPDATE)).toBe(ATOMIC_PERMISSIONS.READ | ATOMIC_PERMISSIONS.UPDATE)
expect(addPermissions(ATOMIC_PERMISSIONS.READ | ATOMIC_PERMISSIONS.UPDATE, ATOMIC_PERMISSIONS.CREATE | ATOMIC_PERMISSIONS.DELETE | ATOMIC_PERMISSIONS.SHARE)).toBe(BUNDLED_PERMISSIONS.ALL)
expect(addPermissions(ATOMIC_PERMISSIONS.READ | ATOMIC_PERMISSIONS.UPDATE, ATOMIC_PERMISSIONS.CREATE | ATOMIC_PERMISSIONS.DELETE)).toBe(BUNDLED_PERMISSIONS.ALL)
expect(addPermissions(BUNDLED_PERMISSIONS.ALL, ATOMIC_PERMISSIONS.READ)).toBe(BUNDLED_PERMISSIONS.ALL)
expect(addPermissions(BUNDLED_PERMISSIONS.ALL, ATOMIC_PERMISSIONS.NONE)).toBe(BUNDLED_PERMISSIONS.ALL)
})
@ -32,7 +32,7 @@ describe('SharePermissionsToolBox', () => {
expect(subtractPermissions(ATOMIC_PERMISSIONS.READ | ATOMIC_PERMISSIONS.UPDATE, ATOMIC_PERMISSIONS.UPDATE)).toBe(ATOMIC_PERMISSIONS.READ)
expect(subtractPermissions(ATOMIC_PERMISSIONS.READ | ATOMIC_PERMISSIONS.UPDATE, ATOMIC_PERMISSIONS.CREATE | ATOMIC_PERMISSIONS.DELETE)).toBe(ATOMIC_PERMISSIONS.READ | ATOMIC_PERMISSIONS.UPDATE)
expect(subtractPermissions(ATOMIC_PERMISSIONS.READ | ATOMIC_PERMISSIONS.UPDATE, ATOMIC_PERMISSIONS.UPDATE | ATOMIC_PERMISSIONS.DELETE)).toBe(ATOMIC_PERMISSIONS.READ)
expect(subtractPermissions(BUNDLED_PERMISSIONS.ALL, ATOMIC_PERMISSIONS.READ)).toBe(ATOMIC_PERMISSIONS.UPDATE | ATOMIC_PERMISSIONS.CREATE | ATOMIC_PERMISSIONS.DELETE | ATOMIC_PERMISSIONS.SHARE)
expect(subtractPermissions(BUNDLED_PERMISSIONS.ALL, ATOMIC_PERMISSIONS.READ)).toBe(ATOMIC_PERMISSIONS.UPDATE | ATOMIC_PERMISSIONS.CREATE | ATOMIC_PERMISSIONS.DELETE)
})
test('Has permissions', () => {
@ -45,8 +45,8 @@ describe('SharePermissionsToolBox', () => {
})
test('Toggle permissions', () => {
expect(togglePermissions(BUNDLED_PERMISSIONS.ALL, BUNDLED_PERMISSIONS.UPLOAD_AND_UPDATE)).toBe(ATOMIC_PERMISSIONS.SHARE)
expect(togglePermissions(BUNDLED_PERMISSIONS.ALL, BUNDLED_PERMISSIONS.FILE_DROP)).toBe(ATOMIC_PERMISSIONS.READ | ATOMIC_PERMISSIONS.UPDATE | ATOMIC_PERMISSIONS.DELETE | ATOMIC_PERMISSIONS.SHARE)
expect(togglePermissions(BUNDLED_PERMISSIONS.ALL, BUNDLED_PERMISSIONS.UPLOAD_AND_UPDATE)).toBe(ATOMIC_PERMISSIONS.NONE)
expect(togglePermissions(BUNDLED_PERMISSIONS.ALL, BUNDLED_PERMISSIONS.FILE_DROP)).toBe(ATOMIC_PERMISSIONS.READ | ATOMIC_PERMISSIONS.UPDATE | ATOMIC_PERMISSIONS.DELETE)
expect(togglePermissions(BUNDLED_PERMISSIONS.ALL, ATOMIC_PERMISSIONS.NONE)).toBe(BUNDLED_PERMISSIONS.ALL)
expect(togglePermissions(ATOMIC_PERMISSIONS.NONE, BUNDLED_PERMISSIONS.ALL)).toBe(BUNDLED_PERMISSIONS.ALL)
expect(togglePermissions(ATOMIC_PERMISSIONS.READ, BUNDLED_PERMISSIONS.ALL)).toBe(BUNDLED_PERMISSIONS.ALL)

View file

@ -11,6 +11,7 @@ import debounce from 'debounce'
import PQueue from 'p-queue'
import { fetchNode } from '../../../files/src/services/WebdavClient.ts'
import {
ATOMIC_PERMISSIONS,
BUNDLED_PERMISSIONS,
} from '../lib/SharePermissionsToolBox.js'
import Share from '../models/Share.ts'
@ -139,10 +140,12 @@ export default {
hasCustomPermissions() {
const bundledPermissions = [
BUNDLED_PERMISSIONS.ALL,
BUNDLED_PERMISSIONS.ALL_FILE,
BUNDLED_PERMISSIONS.READ_ONLY,
BUNDLED_PERMISSIONS.FILE_DROP,
]
return !bundledPermissions.includes(this.share.permissions)
const permissionsWithoutShare = this.share.permissions & ~ATOMIC_PERMISSIONS.SHARE
return !bundledPermissions.includes(permissionsWithoutShare)
},
maxExpirationDateEnforced() {
if (this.isExpiryDateEnforced) {

View file

@ -1021,8 +1021,11 @@ export default {
handleDefaultPermissions() {
if (this.isNewShare) {
const defaultPermissions = this.config.defaultPermissions
if (defaultPermissions === BUNDLED_PERMISSIONS.READ_ONLY || defaultPermissions === BUNDLED_PERMISSIONS.ALL) {
this.sharingPermission = defaultPermissions.toString()
const permissionsWithoutShare = defaultPermissions & ~ATOMIC_PERMISSIONS.SHARE
if (permissionsWithoutShare === BUNDLED_PERMISSIONS.READ_ONLY
|| permissionsWithoutShare === BUNDLED_PERMISSIONS.ALL
|| permissionsWithoutShare === BUNDLED_PERMISSIONS.ALL_FILE) {
this.sharingPermission = permissionsWithoutShare.toString()
} else {
this.sharingPermission = 'custom'
this.share.permissions = defaultPermissions

View file

@ -76,6 +76,7 @@ describe('files_sharing: Public share - setting the default view mode', () => {
.findByRole('button', { name: /Actions/i })
.click()
cy.findByRole('menuitem', { name: /Customize link/i }).click()
cy.findByRole('button', { name: /Advanced settings/i }).click()
cy.findByRole('checkbox', { name: /Show files in grid view/i })
.scrollIntoView()
cy.findByRole('checkbox', { name: /Show files in grid view/i })

View file

@ -195,6 +195,7 @@ describe('files_sharing: Public share - downloading files', { testIsolation: tru
triggerActionForFile('test', 'details')
openLinkShareDetails(0)
cy.findByRole('button', { name: /advanced settings/i }).click()
cy.intercept('PUT', '**/ocs/v2.php/apps/files_sharing/api/v1/shares/*').as('update')
@ -210,12 +211,14 @@ describe('files_sharing: Public share - downloading files', { testIsolation: tru
cy.wait('@update')
openLinkShareDetails(0)
cy.findByRole('button', { name: /advanced settings/i }).click()
cy.findByRole('checkbox', { name: /hide download/i })
.should('be.checked')
cy.reload()
openLinkShareDetails(0)
cy.findByRole('button', { name: /advanced settings/i }).click()
cy.findByRole('checkbox', { name: /hide download/i })
.should('be.checked')
})

View file

@ -27,6 +27,7 @@ describe('files_sharing: sidebar tab', () => {
it('correctly lists shares by label with special characters', () => {
createLinkShare({ user: alice }, 'test')
openLinkShareDetails(0)
cy.findByRole('button', { name: /advanced settings/i }).click()
cy.findByRole('textbox', { name: /share label/i })
.should('be.visible')
.type('Alice\' share')

View file

@ -44,6 +44,7 @@ describe('files_sharing: Public share - View only', { testIsolation: true }, ()
.should('be.visible')
cy.get('[data-cy-files-sharing-share-permissions-bundle="read-only"]')
.click()
cy.findByRole('button', { name: /advanced settings/i }).click()
cy.findByRole('checkbox', { name: 'Hide download' })
.check({ force: true })
// save the update

2
dist/7257-7257.js vendored Normal file

File diff suppressed because one or more lines are too long

1
dist/7257-7257.js.map vendored Normal file

File diff suppressed because one or more lines are too long

1
dist/7257-7257.js.map.license vendored Symbolic link
View file

@ -0,0 +1 @@
7257-7257.js.license

2
dist/922-922.js vendored

File diff suppressed because one or more lines are too long

1
dist/922-922.js.map vendored

File diff suppressed because one or more lines are too long

View file

@ -1 +0,0 @@
922-922.js.license

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long