Skip to content

Commit 0762a42

Browse files
authored
Fix permissions for mixins/tags (#10294)
* Fix permissions for mixins/tags Signed-off-by: Denis Bykhov <bykhov.denis@gmail.com> * Fix Signed-off-by: Denis Bykhov <bykhov.denis@gmail.com> --------- Signed-off-by: Denis Bykhov <bykhov.denis@gmail.com>
1 parent a10dde0 commit 0762a42

File tree

15 files changed

+54
-30
lines changed

15 files changed

+54
-30
lines changed

foundations/server/packages/middleware/src/spacePermissions.ts

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -174,10 +174,10 @@ export class SpacePermissionsMiddleware extends BaseMiddleware implements Middle
174174
const permissions = this.permissionsBySpace[space]?.[account.uuid] ?? []
175175
let withoutMatch: Permission | undefined
176176
for (const permission of permissions) {
177-
if (permission.txClass === undefined || permission.txClass !== tx._class) continue
177+
if (!isTxClassMatched(tx, permission)) continue
178178
if (
179179
permission.objectClass !== undefined &&
180-
!this.context.hierarchy.isDerived(tx.objectClass, permission.objectClass)
180+
!this.context.hierarchy.isDerived(getTxObjectClass(tx), permission.objectClass)
181181
) {
182182
continue
183183
}
@@ -203,12 +203,13 @@ export class SpacePermissionsMiddleware extends BaseMiddleware implements Middle
203203

204204
if (this.restrictedSpaces.has(space)) {
205205
const attachedDocAncestors = this.context.hierarchy.getAncestors(core.class.AttachedDoc)
206-
const ancestors = this.context.hierarchy.getAncestors(tx.objectClass)
206+
const ancestors = this.context.hierarchy.getAncestors(getTxObjectClass(tx))
207207
const targetAncestors = ancestors.filter((a) => !attachedDocAncestors.includes(a))
208+
const txClass = getTxClass(tx)
208209

209210
const permissions = this.context.modelDb.findAllSync(core.class.Permission, {
210211
objectClass: { $in: targetAncestors },
211-
txClass: tx._class
212+
txClass
212213
})
213214
const matched = permissions.filter((p) => {
214215
if (p.txMatch === undefined) return false
@@ -460,3 +461,20 @@ export class SpacePermissionsMiddleware extends BaseMiddleware implements Middle
460461
}
461462
}
462463
}
464+
465+
function getTxClass (tx: Tx): Ref<Class<Tx>> {
466+
let _class = tx._class
467+
if (tx._class === core.class.TxMixin && Object.keys((tx as TxMixin<Doc, Doc>).attributes).length > 0) {
468+
_class = core.class.TxUpdateDoc
469+
}
470+
return _class
471+
}
472+
473+
function isTxClassMatched (tx: Tx, permission: Permission): boolean {
474+
const txClass = getTxClass(tx)
475+
return permission.txClass === txClass
476+
}
477+
478+
function getTxObjectClass (tx: TxCUD<Doc>): Ref<Class<Doc>> {
479+
return tx._class === core.class.TxMixin ? (tx as TxMixin<Doc, Doc>).mixin : tx.objectClass
480+
}

plugins/card-resources/src/components/CreateCardPopup.svelte

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,16 @@
217217
<Component is={extension.component} props={{ collaborators, data, space: _space }} on:change={handleChange} />
218218
{/if}
219219
</div>
220+
221+
<div slot="afterContent" class="error p-4 flex-row-reverse">
222+
{#if !allowed}
223+
<Label label={view.string.NoCreatePermissionTitle} />
224+
{/if}
225+
</div>
220226
</Modal>
221227

222228
<style lang="scss">
229+
.error {
230+
color: var(--theme-error-color);
231+
}
223232
</style>

plugins/contact-resources/src/utils.ts

Lines changed: 10 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -751,33 +751,18 @@ export const permissionsStore = derived(
751751
}
752752
)
753753

754-
const spaceTypesQuery = createQuery(true)
755754
const permissionsQuery = createQuery(true)
756-
type TargetClassesProjection = Record<Ref<Class<Space>>, number>
757755

758-
spaceTypesQuery.query(core.class.SpaceType, {}, (types) => {
759-
const targetClasses = types.reduce<TargetClassesProjection>((acc, st) => {
760-
acc[st.targetClass] = 1
761-
return acc
762-
}, {})
763-
764-
permissionsQuery.query(
765-
core.class.Space,
766-
{},
767-
(res) => {
768-
spacesStore.set(res)
769-
},
770-
{
771-
showArchived: true,
772-
projection: {
773-
_id: 1,
774-
type: 1,
775-
members: 1,
776-
...targetClasses
777-
} as any
778-
}
779-
)
780-
})
756+
permissionsQuery.query(
757+
core.class.Space,
758+
{},
759+
(res) => {
760+
spacesStore.set(res)
761+
},
762+
{
763+
showArchived: true
764+
}
765+
)
781766

782767
export function getAccountClient (): AccountClient {
783768
const accountsUrl = getMetadata(login.metadata.AccountsUrl)

plugins/view-assets/lang/cs.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
"Role": "Role",
1616
"DeleteObject": "Smazat objekt",
1717
"DeleteObjectConfirm": "Chcete smazat {count, plural, =1 {tento objekt} other {těchto # objektů}}?",
18+
"NoCreatePermissionTitle": "Nemáte dostatečná oprávnění pro vytvoření",
1819
"DeletePopupNoPermissionTitle": "Nemáte dostatečná oprávnění pro smazání.",
1920
"DeletePopupNoPermissionLabel": "Kontaktujte prosím osoby ze seznamu níže, aby to mohly provést.",
2021
"DeletePopupCreatorLabel": "Tvůrci (mohou mazat pouze objekty, které vytvořili):",

plugins/view-assets/lang/de.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
"Role": "Rolle",
1616
"DeleteObject": "Objekt löschen",
1717
"DeleteObjectConfirm": "Möchten Sie {count, plural, =1 {dieses Objekt} other {diese # Objekte}} löschen?",
18+
"NoCreatePermissionTitle": "Keine ausreichenden Berechtigungen zum Erstellen",
1819
"DeletePopupNoPermissionTitle": "Keine ausreichenden Berechtigungen zum Löschen.",
1920
"DeletePopupNoPermissionLabel": "Bitte kontaktieren Sie Personen aus der folgenden Liste.",
2021
"DeletePopupCreatorLabel": "Ersteller (können nur von ihnen erstellte Objekte löschen):",

plugins/view-assets/lang/en.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
"Role": "Role",
1616
"DeleteObject": "Delete object",
1717
"DeleteObjectConfirm": "Do you want to delete {count, plural, =1 {this object} other {these # objects}}?",
18+
"NoCreatePermissionTitle": "Not enough permissions to create",
1819
"DeletePopupNoPermissionTitle": "Not enough permissions to delete.",
1920
"DeletePopupNoPermissionLabel": "Please contact people from the list below for them to do so.",
2021
"DeletePopupCreatorLabel": "Creators (can delete only ones that were created by them):",

plugins/view-assets/lang/es.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
"Role": "Rol",
1616
"DeleteObject": "Eliminar objeto",
1717
"DeleteObjectConfirm": "¿Desea eliminar {count, plural, =1 {este objeto} other {estos # objetos}}?",
18+
"NoCreatePermissionTitle": "Permisos insuficientes para crear",
1819
"DeletePopupNoPermissionTitle": "Permisos insuficientes para eliminar.",
1920
"DeletePopupNoPermissionLabel": "Por favor, contacte con las personas de la siguiente lista para que puedan eliminarlo.",
2021
"DeletePopupCreatorLabel": "Creadores (pueden eliminar solo los que ellos crearon):",

plugins/view-assets/lang/fr.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
"Role": "Rôle",
1616
"DeleteObject": "Supprimer l'objet",
1717
"DeleteObjectConfirm": "Voulez-vous supprimer {count, plural, =1 {cet objet} other {ces # objets}} ?",
18+
"NoCreatePermissionTitle": "Permissions insuffisantes pour créer",
1819
"DeletePopupNoPermissionTitle": "Permissions insuffisantes pour supprimer.",
1920
"DeletePopupNoPermissionLabel": "Veuillez contacter les personnes de la liste ci-dessous pour qu'elles le fassent.",
2021
"DeletePopupCreatorLabel": "Créateurs (peuvent supprimer uniquement ceux qu'ils ont créés) :",

plugins/view-assets/lang/it.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
"Role": "Ruolo",
1616
"DeleteObject": "Elimina oggetto",
1717
"DeleteObjectConfirm": "Vuoi eliminare {count, plural, =1 {questo oggetto} other {questi # oggetti}}?",
18+
"NoCreatePermissionTitle": "Permessi insufficienti per creare",
1819
"DeletePopupNoPermissionTitle": "Permessi insufficienti per eliminare.",
1920
"DeletePopupNoPermissionLabel": "Contatta le persone della lista qui sotto affinché possano farlo.",
2021
"DeletePopupCreatorLabel": "Creatori (possono eliminare solo quelli creati da loro):",

plugins/view-assets/lang/ja.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
"Role": "役割",
1616
"DeleteObject": "オブジェクトを削除",
1717
"DeleteObjectConfirm": "{count, plural, =1 {このオブジェクト} other {これらの # 個のオブジェクト}}を削除しますか?",
18+
"NoCreatePermissionTitle": "作成する権限がありません",
1819
"DeletePopupNoPermissionTitle": "削除する権限がありません。",
1920
"DeletePopupNoPermissionLabel": "削除するには、以下のリストの担当者にご連絡ください。",
2021
"DeletePopupCreatorLabel": "作成者 (自分で作成したもののみ削除できます):",

0 commit comments

Comments
 (0)