mirror of
				https://github.com/opa334/TrollStore.git
				synced 2025-11-04 15:42:35 +08:00 
			
		
		
		
	Always prefer the string in com.apple.private.security.container-required (if it exists) to the bundle identifier when creating a data container
This commit is contained in:
		
							parent
							
								
									accf995dfc
								
							
						
					
					
						commit
						a22414d34a
					
				@ -42,7 +42,7 @@ NSDictionary *constructGroupsContainersForEntitlements(NSDictionary *entitlement
 | 
				
			|||||||
	return nil;
 | 
						return nil;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
BOOL constructContainerizationForEntitlements(NSDictionary *entitlements) {
 | 
					BOOL constructContainerizationForEntitlements(NSDictionary *entitlements, NSString **customContainerOut) {
 | 
				
			||||||
	NSNumber *noContainer = entitlements[@"com.apple.private.security.no-container"];
 | 
						NSNumber *noContainer = entitlements[@"com.apple.private.security.no-container"];
 | 
				
			||||||
	if (noContainer && [noContainer isKindOfClass:[NSNumber class]]) {
 | 
						if (noContainer && [noContainer isKindOfClass:[NSNumber class]]) {
 | 
				
			||||||
		if (noContainer.boolValue) {
 | 
							if (noContainer.boolValue) {
 | 
				
			||||||
@ -50,12 +50,15 @@ BOOL constructContainerizationForEntitlements(NSDictionary *entitlements) {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	NSNumber *containerRequired = entitlements[@"com.apple.private.security.container-required"];
 | 
						NSObject *containerRequired = entitlements[@"com.apple.private.security.container-required"];
 | 
				
			||||||
	if (containerRequired && [containerRequired isKindOfClass:[NSNumber class]]) {
 | 
						if (containerRequired && [containerRequired isKindOfClass:[NSNumber class]]) {
 | 
				
			||||||
		if (!containerRequired.boolValue) {
 | 
							if (!((NSNumber *)containerRequired).boolValue) {
 | 
				
			||||||
			return NO;
 | 
								return NO;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						else if (containerRequired && [containerRequired isKindOfClass:[NSString class]]) {
 | 
				
			||||||
 | 
							*customContainerOut = (NSString *)containerRequired;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return YES;
 | 
						return YES;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -97,8 +100,14 @@ void registerPath(NSString *path, BOOL unregister, BOOL forceSystem) {
 | 
				
			|||||||
	if([immutableAppBundleIdentifiers() containsObject:appBundleID.lowercaseString]) return;
 | 
						if([immutableAppBundleIdentifiers() containsObject:appBundleID.lowercaseString]) return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (appBundleID && !unregister) {
 | 
						if (appBundleID && !unregister) {
 | 
				
			||||||
		MCMContainer *appContainer = [NSClassFromString(@"MCMAppDataContainer") containerWithIdentifier:appBundleID createIfNecessary:YES existed:nil error:nil];
 | 
							NSString *appExecutablePath = [path stringByAppendingPathComponent:appInfoPlist[@"CFBundleExecutable"]];
 | 
				
			||||||
		NSString *containerPath = [appContainer url].path;
 | 
							NSDictionary *entitlements = dumpEntitlementsFromBinaryAtPath(appExecutablePath);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							NSString *appDataContainerID = appBundleID;
 | 
				
			||||||
 | 
							BOOL appContainerized = constructContainerizationForEntitlements(entitlements, &appDataContainerID);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							MCMContainer *appDataContainer = [NSClassFromString(@"MCMAppDataContainer") containerWithIdentifier:appDataContainerID createIfNecessary:YES existed:nil error:nil];
 | 
				
			||||||
 | 
							NSString *containerPath = [appDataContainer url].path;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		BOOL isRemovableSystemApp = [[NSFileManager defaultManager] fileExistsAtPath:[@"/System/Library/AppSignatures" stringByAppendingPathComponent:appBundleID]];
 | 
							BOOL isRemovableSystemApp = [[NSFileManager defaultManager] fileExistsAtPath:[@"/System/Library/AppSignatures" stringByAppendingPathComponent:appBundleID]];
 | 
				
			||||||
		BOOL registerAsUser = [path hasPrefix:@"/var/containers"] && !isRemovableSystemApp && !forceSystem;
 | 
							BOOL registerAsUser = [path hasPrefix:@"/var/containers"] && !isRemovableSystemApp && !forceSystem;
 | 
				
			||||||
@ -107,20 +116,16 @@ void registerPath(NSString *path, BOOL unregister, BOOL forceSystem) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		// Add entitlements
 | 
							// Add entitlements
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		NSString *appExecutablePath = [path stringByAppendingPathComponent:appInfoPlist[@"CFBundleExecutable"]];
 | 
					 | 
				
			||||||
		NSDictionary *entitlements = dumpEntitlementsFromBinaryAtPath(appExecutablePath);
 | 
					 | 
				
			||||||
		if (entitlements) {
 | 
							if (entitlements) {
 | 
				
			||||||
			dictToRegister[@"Entitlements"] = entitlements;
 | 
								dictToRegister[@"Entitlements"] = entitlements;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
		// Misc
 | 
							// Misc
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
		dictToRegister[@"ApplicationType"] = registerAsUser ? @"User" : @"System";
 | 
							dictToRegister[@"ApplicationType"] = registerAsUser ? @"User" : @"System";
 | 
				
			||||||
		dictToRegister[@"CFBundleIdentifier"] = appBundleID;
 | 
							dictToRegister[@"CFBundleIdentifier"] = appBundleID;
 | 
				
			||||||
		dictToRegister[@"CodeInfoIdentifier"] = appBundleID;
 | 
							dictToRegister[@"CodeInfoIdentifier"] = appBundleID;
 | 
				
			||||||
		dictToRegister[@"CompatibilityState"] = @0;
 | 
							dictToRegister[@"CompatibilityState"] = @0;
 | 
				
			||||||
		BOOL appContainerized = constructContainerizationForEntitlements(entitlements);
 | 
					 | 
				
			||||||
		dictToRegister[@"IsContainerized"] = @(appContainerized);
 | 
							dictToRegister[@"IsContainerized"] = @(appContainerized);
 | 
				
			||||||
		if (containerPath) {
 | 
							if (containerPath) {
 | 
				
			||||||
			dictToRegister[@"Container"] = containerPath;
 | 
								dictToRegister[@"Container"] = containerPath;
 | 
				
			||||||
@ -172,15 +177,17 @@ void registerPath(NSString *path, BOOL unregister, BOOL forceSystem) {
 | 
				
			|||||||
			NSString *pluginBundleID = [pluginInfoPlist objectForKey:@"CFBundleIdentifier"];
 | 
								NSString *pluginBundleID = [pluginInfoPlist objectForKey:@"CFBundleIdentifier"];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (!pluginBundleID) continue;
 | 
								if (!pluginBundleID) continue;
 | 
				
			||||||
			MCMContainer *pluginContainer = [NSClassFromString(@"MCMPluginKitPluginDataContainer") containerWithIdentifier:pluginBundleID createIfNecessary:YES existed:nil error:nil];
 | 
								NSString *pluginExecutablePath = [pluginPath stringByAppendingPathComponent:pluginInfoPlist[@"CFBundleExecutable"]];
 | 
				
			||||||
 | 
								NSDictionary *pluginEntitlements = dumpEntitlementsFromBinaryAtPath(pluginExecutablePath);
 | 
				
			||||||
 | 
								NSString *pluginDataContainerID = pluginBundleID;
 | 
				
			||||||
 | 
								BOOL pluginContainerized = constructContainerizationForEntitlements(pluginEntitlements, &pluginDataContainerID);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								MCMContainer *pluginContainer = [NSClassFromString(@"MCMPluginKitPluginDataContainer") containerWithIdentifier:pluginDataContainerID createIfNecessary:YES existed:nil error:nil];
 | 
				
			||||||
			NSString *pluginContainerPath = [pluginContainer url].path;
 | 
								NSString *pluginContainerPath = [pluginContainer url].path;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			NSMutableDictionary *pluginDict = [NSMutableDictionary dictionary];
 | 
								NSMutableDictionary *pluginDict = [NSMutableDictionary dictionary];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			// Add entitlements
 | 
								// Add entitlements
 | 
				
			||||||
 | 
					 | 
				
			||||||
			NSString *pluginExecutablePath = [pluginPath stringByAppendingPathComponent:pluginInfoPlist[@"CFBundleExecutable"]];
 | 
					 | 
				
			||||||
			NSDictionary *pluginEntitlements = dumpEntitlementsFromBinaryAtPath(pluginExecutablePath);
 | 
					 | 
				
			||||||
			if (pluginEntitlements) {
 | 
								if (pluginEntitlements) {
 | 
				
			||||||
				pluginDict[@"Entitlements"] = pluginEntitlements;
 | 
									pluginDict[@"Entitlements"] = pluginEntitlements;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
@ -191,7 +198,7 @@ void registerPath(NSString *path, BOOL unregister, BOOL forceSystem) {
 | 
				
			|||||||
			pluginDict[@"CFBundleIdentifier"] = pluginBundleID;
 | 
								pluginDict[@"CFBundleIdentifier"] = pluginBundleID;
 | 
				
			||||||
			pluginDict[@"CodeInfoIdentifier"] = pluginBundleID;
 | 
								pluginDict[@"CodeInfoIdentifier"] = pluginBundleID;
 | 
				
			||||||
			pluginDict[@"CompatibilityState"] = @0;
 | 
								pluginDict[@"CompatibilityState"] = @0;
 | 
				
			||||||
			BOOL pluginContainerized = constructContainerizationForEntitlements(pluginEntitlements);
 | 
								
 | 
				
			||||||
			pluginDict[@"IsContainerized"] = @(pluginContainerized);
 | 
								pluginDict[@"IsContainerized"] = @(pluginContainerized);
 | 
				
			||||||
			if (pluginContainerPath) {
 | 
								if (pluginContainerPath) {
 | 
				
			||||||
				pluginDict[@"Container"] = pluginContainerPath;
 | 
									pluginDict[@"Container"] = pluginContainerPath;
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user