aboutsummaryrefslogtreecommitdiff
path: root/src/fields
diff options
context:
space:
mode:
Diffstat (limited to 'src/fields')
-rw-r--r--src/fields/Doc.ts4
-rw-r--r--src/fields/util.ts11
2 files changed, 14 insertions, 1 deletions
diff --git a/src/fields/Doc.ts b/src/fields/Doc.ts
index 267defa4b..a1acc7060 100644
--- a/src/fields/Doc.ts
+++ b/src/fields/Doc.ts
@@ -508,6 +508,10 @@ export namespace Doc {
alias.aliasOf = doc;
alias.title = ComputedField.MakeFunction(`renameAlias(this, ${Doc.GetProto(doc).aliasNumber = NumCast(Doc.GetProto(doc).aliasNumber) + 1})`);
alias.author = Doc.CurrentUserEmail;
+
+ if (!doc.aliases) doc.aliases = new List<Doc>([alias]);
+ else Doc.AddDocToList(doc, "aliases", alias);
+
return alias;
}
diff --git a/src/fields/util.ts b/src/fields/util.ts
index 16517f25f..608ef506c 100644
--- a/src/fields/util.ts
+++ b/src/fields/util.ts
@@ -160,7 +160,8 @@ export function GetEffectiveAcl(target: any, in_prop?: string | symbol | number)
if (target[AclSym] && Object.keys(target[AclSym]).length) {
// if the current user is the author of the document / the current user is a member of the admin group
- if (target.__fields?.author === Doc.CurrentUserEmail || target.author === Doc.CurrentUserEmail || currentUserGroups.includes("admin")) return AclAdmin;
+ // but not if the doc in question is an alias - the current user will be the author of their alias rather than the original author
+ if ((Doc.CurrentUserEmail === (target.__fields?.author || target.author) && !(target.aliasOf || target.__fields?.aliasOf)) || currentUserGroups.includes("admin")) return AclAdmin;
// if the ACL is being overriden or the property being modified is one of the playground fields (which can be freely modified)
if (_overrideAcl || (in_prop && DocServer.PlaygroundFields?.includes(in_prop.toString()))) return AclEdit;
@@ -214,6 +215,14 @@ export function distributeAcls(key: string, acl: SharingPermissions, target: Doc
if (!inheritingFromCollection || !target[key] || HierarchyMapping.get(StrCast(target[key]))! > HierarchyMapping.get(acl)!) {
target[key] = acl;
changed = true;
+
+ // maps over the aliases of the document
+ if (target.aliases) {
+ DocListCast(target.aliases).map(alias => {
+ distributeAcls(key, acl, alias);
+ });
+ }
+
}
if (dataDoc && (!inheritingFromCollection || !dataDoc[key] || HierarchyMapping.get(StrCast(dataDoc[key]))! > HierarchyMapping.get(acl)!)) {