Skip to content

Commit 3a19bc4

Browse files
committed
feat: properly distinguish between inherited and unset permissions in ACL ui
Signed-off-by: Robin Appelman <[email protected]>
1 parent 7d82233 commit 3a19bc4

File tree

4 files changed

+41
-21
lines changed

4 files changed

+41
-21
lines changed

src/client.js

+3
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,9 @@ class AclDavService {
228228
inheritedAclsById[id] = acl
229229
if (aclsById[id] == null) {
230230
aclsById[id] = acl
231+
} else {
232+
aclsById[id].inheritedMask = acl.mask;
233+
aclsById[id].inheritedPermissions = acl.permissions;
231234
}
232235
}
233236
return {

src/components/AclStateButton.vue

+13-7
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,9 @@
4444
<component :is="icon" :class="{inherited: isInherited}" :size="16" />
4545
</template>
4646
<NcActionRadio name="state"
47-
:checked="state === STATES.INHERIT_ALLOW || state === STATES.INHERIT_DENY"
47+
:checked="state === STATES.INHERIT_ALLOW || state === STATES.INHERIT_DENY || state === STATES.INHERIT_DEFAULT"
4848
:disabled="disabled"
49-
@change="$emit('update', STATES.INHERIT_ALLOW)">
49+
@change="$emit('update', STATES.INHERIT_DEFAULT)">
5050
{{ t('groupfolders', 'Inherit permission') }}
5151
</NcActionRadio>
5252
<NcActionRadio name="state"
@@ -68,16 +68,18 @@
6868
<script>
6969
import Check from 'vue-material-design-icons/Check.vue'
7070
import Cancel from 'vue-material-design-icons/Cancel.vue'
71+
import Minus from 'vue-material-design-icons/Minus.vue'
7172
import NcButton from '@nextcloud/vue/dist/Components/NcButton.js'
7273
import NcActions from '@nextcloud/vue/dist/Components/NcActions.js'
7374
import NcActionRadio from '@nextcloud/vue/dist/Components/NcActionRadio.js'
7475
import Tooltip from '@nextcloud/vue/dist/Directives/Tooltip.js'
7576

76-
const STATES = {
77+
export const STATES = {
7778
INHERIT_DENY: 0,
7879
INHERIT_ALLOW: 1,
79-
SELF_DENY: 2,
80-
SELF_ALLOW: 3,
80+
INHERIT_DEFAULT: 2,
81+
SELF_DENY: 3,
82+
SELF_ALLOW: 4,
8183
}
8284

8385
export default {
@@ -117,13 +119,15 @@ export default {
117119
},
118120
computed: {
119121
isAllowed() {
120-
return this.state & 1
122+
return this.state === STATES.INHERIT_ALLOW || this.state === STATES.SELF_ALLOW || this.state === STATES.INHERIT_DEFAULT
121123
},
122124
isInherited() {
123-
return (this.state & 2) === 0
125+
return this.state === STATES.INHERIT_ALLOW || this.state === STATES.INHERIT_DENY || this.state === STATES.INHERIT_DEFAULT
124126
},
125127
icon() {
126128
switch (this.state) {
129+
case STATES.INHERIT_DEFAULT:
130+
return Minus
127131
case STATES.INHERIT_ALLOW:
128132
case STATES.SELF_ALLOW:
129133
return Check
@@ -133,6 +137,8 @@ export default {
133137
},
134138
label() {
135139
switch (this.state) {
140+
case STATES.INHERIT_DEFAULT:
141+
return t('groupfolders', 'Unset')
136142
case STATES.INHERIT_DENY:
137143
return t('groupfolders', 'Denied (Inherited permission)')
138144
case STATES.INHERIT_ALLOW:

src/components/SharingSidebarView.vue

+23-14
Original file line numberDiff line numberDiff line change
@@ -83,31 +83,31 @@
8383
{{ getFullDisplayName(item.mappingDisplayName, item.mappingType) }}
8484
</td>
8585
<td class="state-column">
86-
<AclStateButton :state="getState(OC.PERMISSION_READ, item.permissions, item.mask, item.inherited)"
86+
<AclStateButton :state="getState(OC.PERMISSION_READ, item)"
8787
:inherited="item.inherited"
8888
:disabled="loading"
8989
@update="changePermission(item, OC.PERMISSION_READ, $event)" />
9090
</td>
9191
<td class="state-column">
92-
<AclStateButton :state="getState(OC.PERMISSION_UPDATE, item.permissions, item.mask, item.inherited)"
92+
<AclStateButton :state="getState(OC.PERMISSION_UPDATE, item)"
9393
:inherited="item.inherited"
9494
:disabled="loading"
9595
@update="changePermission(item, OC.PERMISSION_UPDATE, $event)" />
9696
</td>
9797
<td v-if="model.type === 'dir'" class="state-column">
98-
<AclStateButton :state="getState(OC.PERMISSION_CREATE, item.permissions, item.mask, item.inherited)"
98+
<AclStateButton :state="getState(OC.PERMISSION_CREATE, item)"
9999
:inherited="item.inherited"
100100
:disabled="loading"
101101
@update="changePermission(item, OC.PERMISSION_CREATE, $event)" />
102102
</td>
103103
<td class="state-column">
104-
<AclStateButton :state="getState(OC.PERMISSION_DELETE, item.permissions, item.mask, item.inherited)"
104+
<AclStateButton :state="getState(OC.PERMISSION_DELETE, item)"
105105
:inherited="item.inherited"
106106
:disabled="loading"
107107
@update="changePermission(item, OC.PERMISSION_DELETE, $event)" />
108108
</td>
109109
<td class="state-column">
110-
<AclStateButton :state="getState(OC.PERMISSION_SHARE, item.permissions, item.mask, item.inherited)"
110+
<AclStateButton :state="getState(OC.PERMISSION_SHARE, item)"
111111
:inherited="item.inherited"
112112
:disabled="loading"
113113
@update="changePermission(item, OC.PERMISSION_SHARE, $event)" />
@@ -157,7 +157,7 @@
157157
import Vue from 'vue'
158158
import axios from '@nextcloud/axios'
159159
import { generateUrl } from '@nextcloud/router'
160-
import AclStateButton from './AclStateButton.vue'
160+
import AclStateButton, {STATES} from './AclStateButton.vue'
161161
import Rule from './../model/Rule.js'
162162
import BinaryTools from './../BinaryTools.js'
163163
import client from './../client.js'
@@ -208,7 +208,7 @@ export default {
208208
return this.aclCanManage
209209
},
210210
isNotInherited() {
211-
return (permission, permissions, mask) => {
211+
return (permission, mask) => {
212212
return (permission & ~mask) === 0
213213
}
214214
},
@@ -218,10 +218,18 @@ export default {
218218
}
219219
},
220220
getState() {
221-
return (permission, permissions, mask, inherited) => {
222-
const inheritance = (!inherited && this.isNotInherited(permission, permissions, mask)) << 1
223-
const permitted = this.isAllowed(permission, permissions)
224-
return inheritance | permitted
221+
return (permission, item) => {
222+
const permitted = this.isAllowed(permission, item.permissions)
223+
if (this.isNotInherited(permission, item.mask)) {
224+
return permitted ? STATES.SELF_ALLOW : STATES.SELF_DENY
225+
} else {
226+
const inheritPermitted = this.isAllowed(permission, item.inheritedPermissions)
227+
if (this.isNotInherited(permission, item.inheritedMask)) {
228+
return inheritPermitted ? STATES.INHERIT_ALLOW : STATES.INHERIT_DENY
229+
} else {
230+
return STATES.INHERIT_DEFAULT
231+
}
232+
}
225233
}
226234
},
227235
},
@@ -242,6 +250,7 @@ export default {
242250
this.model = JSON.parse(JSON.stringify(this.fileInfo))
243251
client.propFind(this.model).then((data) => {
244252
if (data.acls) {
253+
console.log(data.acls);
245254
this.list = data.acls
246255
}
247256
this.inheritedAclsById = data.inheritedAclsById
@@ -328,13 +337,13 @@ export default {
328337
},
329338
changePermission(item, permission, $event) {
330339
const index = this.list.indexOf(item)
331-
const inherit = ($event < 2)
332-
const allow = ($event & (0b01)) === 1
340+
const inherit = $event === STATES.INHERIT_ALLOW || $event === STATES.INHERIT_DENY || $event === STATES.INHERIT_DEFAULT
341+
const allow = $event === STATES.SELF_ALLOW
333342
const bit = BinaryTools.firstHigh(permission)
334343
item = item.clone()
335344
if (inherit) {
336345
item.mask = BinaryTools.clear(item.mask, bit)
337-
// TODO check if: we can ignore permissions, since they are inherited
346+
// we can ignore permissions, since they are inherited
338347
} else {
339348
item.mask = BinaryTools.set(item.mask, bit)
340349
if (allow) {

src/model/Rule.js

+2
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ export default class Rule {
3838
this.mask = mask
3939
this.permissions = permissions
4040
this.inherited = inherited
41+
this.inheritedMask = 0;
42+
this.inheritedPermissions = 31;
4143
}
4244

4345
getProperties() {

0 commit comments

Comments
 (0)