Skip to content

Commit b141370

Browse files
committed
refactor: runtime entitlements helpers
1 parent e6c0ff4 commit b141370

1 file changed

Lines changed: 49 additions & 77 deletions

File tree

SideBackup/Models/Helpers.swift

Lines changed: 49 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -177,99 +177,71 @@ func SecTaskCopyValuesForEntitlements(
177177
_ error: UnsafeMutablePointer<Unmanaged<CFError>?>?
178178
) -> CFDictionary?
179179

180-
func releaseSecTask(_ task: SecTaskRef) {
181-
let cf = unsafeBitCast(task, to: CFTypeRef.self)
182-
CFRelease(cf)
183-
}
180+
func withSecTask(_ block: @escaping (SecTaskRef) -> Void) {
181+
guard let task = SecTaskCreateFromSelf(nil) else { return }
182+
block(task)
183+
CFRelease(unsafeBitCast(task, to: CFTypeRef.self))
184184

185-
func checkAppEntitlements(_ ents: [String]) -> [String: Any] {
186-
guard let task = SecTaskCreateFromSelf(nil) else {
187-
return [:]
188-
}
189-
defer {
190-
releaseSecTask(task)
191-
}
185+
}
192186

193-
guard let entitlements = SecTaskCopyValuesForEntitlements(task, ents as CFArray, nil) else {
194-
return [:]
187+
func withSecEntitlements(for entitlements: [String], _ block: @escaping (CFDictionary) -> Void) {
188+
withSecTask { task in
189+
if let entitlements = SecTaskCopyValuesForEntitlements(task, entitlements as CFArray, nil) {
190+
block(entitlements)
191+
}
195192
}
196-
197-
return (entitlements as NSDictionary) as? [String: Any] ?? [:]
198193
}
199194

200-
func checkAppEntitlement(_ ent: String) -> Bool {
201-
guard let task = SecTaskCreateFromSelf(nil) else {
202-
return false
203-
}
204-
defer {
205-
releaseSecTask(task)
195+
func withSecEntitlement(for entitlement: String, _ block: @escaping (CFTypeRef) -> Void) {
196+
withSecTask { task in
197+
if let entitlement = SecTaskCopyValueForEntitlement(task, entitlement as NSString, nil) {
198+
block(entitlement)
199+
}
206200
}
201+
}
207202

208-
guard let entitlement = SecTaskCopyValueForEntitlement(task, ent as NSString, nil) else {
209-
return false
203+
func checkAppEntitlements(_ ents: [String]) -> [String: Any] {
204+
var ret: [String: Any] = [:]
205+
withSecEntitlements(for: ents) { entitlements in
206+
ret = (entitlements as NSDictionary) as? [String: Any] ?? [:]
210207
}
208+
return ret
209+
}
211210

212-
if let number = entitlement as? NSNumber {
213-
return number.boolValue
214-
} else if let bool = entitlement as? Bool {
215-
return bool
211+
func checkAppEntitlement(_ ent: String) -> Bool {
212+
var ret: Bool = false
213+
withSecEntitlement(for: ent) { entitlement in
214+
if let num = entitlement as? NSNumber {
215+
ret = num.boolValue
216+
} else if let bool = entitlement as? Bool {
217+
ret = bool
218+
}
216219
}
217-
218-
return false
220+
return ret
219221
}
220222

221223
func getEntitlement(_ ent: String) -> String {
222-
guard let task = SecTaskCreateFromSelf(nil) else {
223-
return ""
224-
}
225-
defer {
226-
releaseSecTask(task)
227-
}
228-
229-
guard let entitlement = SecTaskCopyValueForEntitlement(
230-
task,
231-
ent as NSString,
232-
nil
233-
) else {
234-
return ""
235-
}
236-
237-
if let appGroupsArray = entitlement as? String {
238-
return appGroupsArray
239-
} else if let appGroupsNSArray = entitlement as? NSString as? String {
240-
return appGroupsNSArray
224+
var ret: String = ""
225+
withSecEntitlement(for: ent) { entitlement in
226+
if let entitlement = entitlement as? String {
227+
ret = entitlement
228+
} else if let entitlement = entitlement as? NSString as? String {
229+
ret = entitlement
230+
}
241231
}
242-
243-
return ""
232+
return ret
244233
}
245234

246-
247235
func getAppGroups() -> [String] {
248-
guard let task = SecTaskCreateFromSelf(nil) else {
249-
return []
250-
}
251-
defer {
252-
releaseSecTask(task)
253-
}
254-
255-
guard let entitlement = SecTaskCopyValueForEntitlement(
256-
task,
257-
"com.apple.security.application-groups" as NSString,
258-
nil
259-
) else {
260-
return []
261-
}
262-
263-
if let appGroupsArray = entitlement as? [String] {
264-
return appGroupsArray
265-
} else if let appGroupsNSArray = entitlement as? NSArray as? [String] {
266-
return appGroupsNSArray
267-
} else if CFGetTypeID(entitlement) == CFArrayGetTypeID() {
268-
let cfArray = entitlement as! CFArray
269-
return (cfArray as NSArray) as? [String] ?? []
236+
var ret: [String] = []
237+
withSecEntitlement(for: "com.apple.security.application-groups") { groups in
238+
if let groups = groups as? [String] {
239+
ret = groups
240+
} else if let groups = groups as? NSArray as? [String] {
241+
ret = groups
242+
} else if CFGetTypeID(groups) == CFArrayGetTypeID() {
243+
ret = groups as! CFArray as NSArray as? [String] ?? []
244+
}
270245
}
271-
272-
return []
246+
return ret
273247
}
274-
275-

0 commit comments

Comments
 (0)