TBR: Swift: Restrict delta to permissions relevant to syncgroups & collections
Syncgroups and collections can only use certain ACLs, e.g. read/admin
or read/write/admin. Filter deltas to ACLs based on type. Matches
Java implementation.
Change-Id: I6f1dfebc1b71e7ff07fd6510af2a70eaf1fe0fa5
diff --git a/Syncbase/Source/AccessList.swift b/Syncbase/Source/AccessList.swift
index 5cb2032..5710c0c 100644
--- a/Syncbase/Source/AccessList.swift
+++ b/Syncbase/Source/AccessList.swift
@@ -73,8 +73,25 @@
}
}
+ static func applyDeltaForCollection(permissions: Permissions, delta: AccessList) throws -> Permissions {
+ let parsed = try applyDeltaParsed(permissions, delta: delta)
+ var filtered: Permissions = [:]
+ filtered[Tags.Read.rawValue] = parsed[Tags.Read.rawValue]
+ filtered[Tags.Write.rawValue] = parsed[Tags.Write.rawValue]
+ filtered[Tags.Admin.rawValue] = parsed[Tags.Admin.rawValue]
+ return filtered
+ }
+
+ static func applyDeltaForSyncgroup(permissions: Permissions, delta: AccessList) throws -> Permissions {
+ let parsed = try applyDeltaParsed(permissions, delta: delta)
+ var filtered: Permissions = [:]
+ filtered[Tags.Read.rawValue] = parsed[Tags.Read.rawValue]
+ filtered[Tags.Admin.rawValue] = parsed[Tags.Admin.rawValue]
+ return filtered
+ }
+
/// Applies delta to perms, returning the updates permissions.
- static func applyDelta(permissions: Permissions, delta: AccessList) throws -> Permissions {
+ static func applyDeltaParsed(permissions: Permissions, delta: AccessList) throws -> Permissions {
var perms = permissions
for (userId, level) in delta.users {
let bp = try blessingPatternFromAlias(userId)
diff --git a/Syncbase/Source/Collection.swift b/Syncbase/Source/Collection.swift
index ece4d19..43fb4a5 100644
--- a/Syncbase/Source/Collection.swift
+++ b/Syncbase/Source/Collection.swift
@@ -113,7 +113,7 @@
try SyncbaseError.wrap {
let vCx = try db.collection(self.collectionId).coreCollection
let perms = try vCx.getPermissions()
- try AccessList.applyDelta(perms, delta: delta)
+ try AccessList.applyDeltaForCollection(perms, delta: delta)
try vCx.setPermissions(perms)
}
}
diff --git a/Syncbase/Source/Syncgroup.swift b/Syncbase/Source/Syncgroup.swift
index 615de16..cbb8803 100644
--- a/Syncbase/Source/Syncgroup.swift
+++ b/Syncbase/Source/Syncgroup.swift
@@ -114,7 +114,7 @@
try SyncbaseError.wrap {
// TODO(sadovsky): Make it so SyncgroupSpec can be updated as part of a batch?
let versionedSpec = try self.coreSyncgroup.getSpec()
- let permissions = try AccessList.applyDelta(versionedSpec.spec.permissions, delta: delta)
+ let permissions = try AccessList.applyDeltaForSyncgroup(versionedSpec.spec.permissions, delta: delta)
let oldSpec = versionedSpec.spec
try self.coreSyncgroup.setSpec(VersionedSpec(
spec: SyncgroupSpec(description: oldSpec.description,