]> git.saurik.com Git - apple/security.git/blob - OSX/utilities/entitlements.c
Security-59754.80.3.tar.gz
[apple/security.git] / OSX / utilities / entitlements.c
1 /*
2 * Copyright (c) 2020 Apple Inc. All Rights Reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
11 * file.
12 *
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
20 *
21 * @APPLE_LICENSE_HEADER_END@
22 */
23
24 #include "entitlements.h"
25
26 /// Moves the entitlement value from the original entitlement into the target entitlement.
27 static void transferEntitlement(CFMutableDictionaryRef entitlements, CFStringRef originalEntitlement, CFStringRef targetEntitlement)
28 {
29 CFTypeRef value = (CFStringRef)CFDictionaryGetValue(entitlements, originalEntitlement);
30 CFDictionaryAddValue(entitlements, targetEntitlement, value);
31 }
32
33 /// Determines if an entitlement needs fixup, which means it has a value for the original entitlement and no value for the
34 /// target entitlement.
35 static bool entitlementNeedsFixup(CFDictionaryRef entitlements, CFStringRef originalEntitlement, CFStringRef targetEntitlement)
36 {
37 // Entitlements only need fixup on macOS running on Apple Silicon, so just always fall through to the default case otherwise.
38 #if TARGET_OS_OSX && TARGET_CPU_ARM64
39 CFTypeRef originalValue = (CFStringRef)CFDictionaryGetValue(entitlements, originalEntitlement);
40 CFTypeRef newValue = (CFStringRef)CFDictionaryGetValue(entitlements, targetEntitlement);
41 if (originalValue != NULL && newValue == NULL) {
42 return true;
43 }
44 #endif
45 return false;
46 }
47
48 bool needsCatalystEntitlementFixup(CFDictionaryRef entitlements)
49 {
50 return entitlementNeedsFixup(entitlements, CFSTR("application-identifier"), CFSTR("com.apple.application-identifier")) ||
51 entitlementNeedsFixup(entitlements, CFSTR("aps-environment"), CFSTR("com.apple.developer.aps-environment"));
52 }
53
54 bool updateCatalystEntitlements(CFMutableDictionaryRef entitlements)
55 {
56 bool updated = false;
57 if (entitlementNeedsFixup(entitlements, CFSTR("application-identifier"), CFSTR("com.apple.application-identifier"))) {
58 transferEntitlement(entitlements, CFSTR("application-identifier"), CFSTR("com.apple.application-identifier"));
59 updated = true;
60 }
61 if (entitlementNeedsFixup(entitlements, CFSTR("aps-environment"), CFSTR("com.apple.developer.aps-environment"))) {
62 transferEntitlement(entitlements, CFSTR("aps-environment"), CFSTR("com.apple.developer.aps-environment"));
63 updated = true;
64 }
65 return updated;
66 }