mirror of https://github.com/opa334/TrollStore.git
1.4.5b1
This commit is contained in:
parent
c572b1b84c
commit
67ec5ff14f
|
@ -48,25 +48,27 @@ NSArray<LSApplicationProxy*>* applicationsWithGroupId(NSString* groupId)
|
||||||
return enumerator.allObjects;
|
return enumerator.allObjects;
|
||||||
}
|
}
|
||||||
|
|
||||||
NSSet<NSString*>* appleURLSchemes(void)
|
NSSet<NSString*>* systemURLSchemes(void)
|
||||||
{
|
{
|
||||||
LSEnumerator* enumerator = [LSEnumerator enumeratorForApplicationProxiesWithOptions:0];
|
LSEnumerator* enumerator = [LSEnumerator enumeratorForApplicationProxiesWithOptions:0];
|
||||||
enumerator.predicate = [NSPredicate predicateWithFormat:@"bundleIdentifier BEGINSWITH 'com.apple'"];
|
|
||||||
|
|
||||||
NSMutableSet* systemURLSchemes = [NSMutableSet new];
|
NSMutableSet* systemURLSchemesSet = [NSMutableSet new];
|
||||||
LSApplicationProxy* proxy;
|
LSApplicationProxy* proxy;
|
||||||
while(proxy = [enumerator nextObject])
|
while(proxy = [enumerator nextObject])
|
||||||
{
|
{
|
||||||
for(NSString* claimedURLScheme in proxy.claimedURLSchemes)
|
if(isRemovableSystemApp(proxy.bundleIdentifier) || ![proxy.bundleURL.path hasPrefix:@"/private/var/containers"])
|
||||||
{
|
{
|
||||||
if([claimedURLScheme isKindOfClass:NSString.class])
|
for(NSString* claimedURLScheme in proxy.claimedURLSchemes)
|
||||||
{
|
{
|
||||||
[systemURLSchemes addObject:claimedURLScheme.lowercaseString];
|
if([claimedURLScheme isKindOfClass:NSString.class])
|
||||||
|
{
|
||||||
|
[systemURLSchemesSet addObject:claimedURLScheme.lowercaseString];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return systemURLSchemes.copy;
|
return systemURLSchemesSet.copy;
|
||||||
}
|
}
|
||||||
|
|
||||||
NSSet<NSString*>* immutableAppBundleIdentifiers(void)
|
NSSet<NSString*>* immutableAppBundleIdentifiers(void)
|
||||||
|
@ -535,7 +537,7 @@ void applyPatchesToInfoDictionary(NSString* appPath)
|
||||||
infoDictM[@"SBAppUsesLocalNotifications"] = @1;
|
infoDictM[@"SBAppUsesLocalNotifications"] = @1;
|
||||||
|
|
||||||
// Remove system claimed URL schemes if existant
|
// Remove system claimed URL schemes if existant
|
||||||
NSSet* appleSchemes = appleURLSchemes();
|
NSSet* appleSchemes = systemURLSchemes();
|
||||||
NSArray* CFBundleURLTypes = infoDictM[@"CFBundleURLTypes"];
|
NSArray* CFBundleURLTypes = infoDictM[@"CFBundleURLTypes"];
|
||||||
if([CFBundleURLTypes isKindOfClass:[NSArray class]])
|
if([CFBundleURLTypes isKindOfClass:[NSArray class]])
|
||||||
{
|
{
|
||||||
|
@ -705,7 +707,7 @@ int installApp(NSString* appPackagePath, BOOL sign, BOOL force, BOOL isTSUpdate)
|
||||||
if(suc)
|
if(suc)
|
||||||
{
|
{
|
||||||
NSLog(@"[installApp] App %@ installed, adding to icon cache now...", appId);
|
NSLog(@"[installApp] App %@ installed, adding to icon cache now...", appId);
|
||||||
registerPath((char*)newAppBundlePath.fileSystemRepresentation, 0, YES);
|
registerPath(newAppBundlePath, NO, YES);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -724,7 +726,7 @@ int uninstallApp(NSString* appPath, NSString* appId)
|
||||||
// Most likely the Info.plist is missing
|
// Most likely the Info.plist is missing
|
||||||
// (Hopefully this never happens)
|
// (Hopefully this never happens)
|
||||||
deleteSuc = [[NSFileManager defaultManager] removeItemAtPath:[appPath stringByDeletingLastPathComponent] error:nil];
|
deleteSuc = [[NSFileManager defaultManager] removeItemAtPath:[appPath stringByDeletingLastPathComponent] error:nil];
|
||||||
registerPath((char*)appPath.fileSystemRepresentation, 1, YES);
|
registerPath(appPath, YES, YES);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -839,7 +841,7 @@ int uninstallTrollStore(BOOL unregister)
|
||||||
|
|
||||||
if(unregister)
|
if(unregister)
|
||||||
{
|
{
|
||||||
registerPath((char*)trollStoreAppPath().fileSystemRepresentation, 1, YES);
|
registerPath(trollStoreAppPath(), YES, YES);
|
||||||
}
|
}
|
||||||
|
|
||||||
return [[NSFileManager defaultManager] removeItemAtPath:trollStore error:nil];
|
return [[NSFileManager defaultManager] removeItemAtPath:trollStore error:nil];
|
||||||
|
@ -902,15 +904,19 @@ int installTrollStore(NSString* pathToTar)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void refreshAppRegistrations()
|
void refreshAppRegistrations(BOOL system)
|
||||||
{
|
{
|
||||||
//registerPath((char*)trollStoreAppPath().fileSystemRepresentation, 1, YES);
|
// avoid registering TrollStore itself as user ever
|
||||||
registerPath((char*)trollStoreAppPath().fileSystemRepresentation, 0, YES);
|
if(system)
|
||||||
|
{
|
||||||
|
registerPath(trollStoreAppPath(), NO, system);
|
||||||
|
}
|
||||||
|
|
||||||
|
// the reason why there is even an option to register everything as user
|
||||||
|
// is because it fixes an issue where app permissions would reset during an icon cache reload
|
||||||
for(NSString* appPath in trollStoreInstalledAppBundlePaths())
|
for(NSString* appPath in trollStoreInstalledAppBundlePaths())
|
||||||
{
|
{
|
||||||
//registerPath((char*)appPath.fileSystemRepresentation, 1, YES);
|
registerPath(appPath, NO, system);
|
||||||
registerPath((char*)appPath.fileSystemRepresentation, 0, YES);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1081,7 +1087,7 @@ void cleanRestrictions(void)
|
||||||
|
|
||||||
[valuesArrM enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(NSString* value, NSUInteger idx, BOOL *stop)
|
[valuesArrM enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(NSString* value, NSUInteger idx, BOOL *stop)
|
||||||
{
|
{
|
||||||
if(![value hasPrefix:@"com.apple."])
|
if(!isRemovableSystemApp(value))
|
||||||
{
|
{
|
||||||
[valuesArrM removeObjectAtIndex:idx];
|
[valuesArrM removeObjectAtIndex:idx];
|
||||||
changed = YES;
|
changed = YES;
|
||||||
|
@ -1152,12 +1158,13 @@ int MAIN_NAME(int argc, char *argv[], char *envp[])
|
||||||
installLdid(ldidPath);
|
installLdid(ldidPath);
|
||||||
} else if([cmd isEqualToString:@"refresh"])
|
} else if([cmd isEqualToString:@"refresh"])
|
||||||
{
|
{
|
||||||
refreshAppRegistrations();
|
refreshAppRegistrations(YES);
|
||||||
} else if([cmd isEqualToString:@"refresh-all"])
|
} else if([cmd isEqualToString:@"refresh-all"])
|
||||||
{
|
{
|
||||||
cleanRestrictions();
|
cleanRestrictions();
|
||||||
|
refreshAppRegistrations(NO); // <- fix app permissions resetting
|
||||||
[[LSApplicationWorkspace defaultWorkspace] _LSPrivateRebuildApplicationDatabasesForSystemApps:YES internal:YES user:YES];
|
[[LSApplicationWorkspace defaultWorkspace] _LSPrivateRebuildApplicationDatabasesForSystemApps:YES internal:YES user:YES];
|
||||||
refreshAppRegistrations();
|
refreshAppRegistrations(YES);
|
||||||
killall(@"backboardd", YES);
|
killall(@"backboardd", YES);
|
||||||
} else if([cmd isEqualToString:@"install-persistence-helper"])
|
} else if([cmd isEqualToString:@"install-persistence-helper"])
|
||||||
{
|
{
|
||||||
|
@ -1181,7 +1188,7 @@ int MAIN_NAME(int argc, char *argv[], char *envp[])
|
||||||
NSString* trollStoreMark = [[appPath stringByDeletingLastPathComponent] stringByAppendingPathComponent:@"_TrollStore"];
|
NSString* trollStoreMark = [[appPath stringByDeletingLastPathComponent] stringByAppendingPathComponent:@"_TrollStore"];
|
||||||
if([[NSFileManager defaultManager] fileExistsAtPath:trollStoreMark])
|
if([[NSFileManager defaultManager] fileExistsAtPath:trollStoreMark])
|
||||||
{
|
{
|
||||||
registerPath((char*)appPath.fileSystemRepresentation, 0, [newRegistration isEqualToString:@"System"]);
|
registerPath(appPath, NO, [newRegistration isEqualToString:@"System"]);
|
||||||
}
|
}
|
||||||
} else if([cmd isEqualToString:@"url-scheme"])
|
} else if([cmd isEqualToString:@"url-scheme"])
|
||||||
{
|
{
|
||||||
|
|
|
@ -188,7 +188,7 @@ BOOL installApp(NSString* appPath, NSString* appId, BOOL sign, NSError** error)
|
||||||
|
|
||||||
NSLog(@"installApp copied app? %d, adding to uicache now...", suc);
|
NSLog(@"installApp copied app? %d, adding to uicache now...", suc);
|
||||||
|
|
||||||
registerPath((char*)newAppPath.UTF8String, 0);
|
registerPath(newAppPath, NO);
|
||||||
|
|
||||||
return YES;
|
return YES;
|
||||||
}
|
}
|
||||||
|
@ -198,7 +198,7 @@ BOOL uninstallApp(NSString* appId, NSError** error)
|
||||||
NSString* appPath = appPathForAppId(appId, error);
|
NSString* appPath = appPathForAppId(appId, error);
|
||||||
if(!appPath) return NO;
|
if(!appPath) return NO;
|
||||||
|
|
||||||
registerPath((char*)appPath.UTF8String, 1);
|
registerPath(appPath, YES);
|
||||||
|
|
||||||
return [[NSFileManager defaultManager] removeItemAtPath:[appPath stringByDeletingLastPathComponent] error:error];
|
return [[NSFileManager defaultManager] removeItemAtPath:[appPath stringByDeletingLastPathComponent] error:error];
|
||||||
}
|
}
|
||||||
|
@ -244,7 +244,7 @@ void uninstallAllApps(void)
|
||||||
for(NSString* appId in items)
|
for(NSString* appId in items)
|
||||||
{
|
{
|
||||||
NSString* appPath = appPathForAppId(appId, nil);
|
NSString* appPath = appPathForAppId(appId, nil);
|
||||||
registerPath((char*)appPath.UTF8String, 1);
|
registerPath(appPath, YES);
|
||||||
}
|
}
|
||||||
|
|
||||||
[[NSFileManager defaultManager] removeItemAtPath:TROLLSTORE_ROOT_PATH error:nil];
|
[[NSFileManager defaultManager] removeItemAtPath:TROLLSTORE_ROOT_PATH error:nil];
|
||||||
|
@ -255,7 +255,7 @@ BOOL uninstallTrollStore(void)
|
||||||
NSString* trollStore = [TROLLSTORE_MAIN_PATH stringByAppendingPathComponent:@"TrollStore.app"];
|
NSString* trollStore = [TROLLSTORE_MAIN_PATH stringByAppendingPathComponent:@"TrollStore.app"];
|
||||||
if(![[NSFileManager defaultManager] fileExistsAtPath:trollStore]) return NO;
|
if(![[NSFileManager defaultManager] fileExistsAtPath:trollStore]) return NO;
|
||||||
|
|
||||||
registerPath((char*)trollStore.UTF8String, 1);
|
registerPath(trollStore, YES);
|
||||||
return [[NSFileManager defaultManager] removeItemAtPath:trollStore error:nil];
|
return [[NSFileManager defaultManager] removeItemAtPath:trollStore error:nil];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
extern void registerPath(char *path, int unregister, BOOL system);
|
extern void registerPath(NSString* path, BOOL unregister, BOOL system);
|
|
@ -4,6 +4,7 @@
|
||||||
#import <objc/runtime.h>
|
#import <objc/runtime.h>
|
||||||
#import "dlfcn.h"
|
#import "dlfcn.h"
|
||||||
#import <TSUtil.h>
|
#import <TSUtil.h>
|
||||||
|
#import <version.h>
|
||||||
|
|
||||||
// uicache on steroids
|
// uicache on steroids
|
||||||
|
|
||||||
|
@ -90,10 +91,9 @@ NSDictionary* constructEnvironmentVariablesForContainerPath(NSString* containerP
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
void registerPath(char* cPath, int unregister, BOOL system)
|
void registerPath(NSString* path, BOOL unregister, BOOL system)
|
||||||
{
|
{
|
||||||
if(!cPath) return;
|
if(!path) return;
|
||||||
NSString* path = [NSString stringWithUTF8String:cPath];
|
|
||||||
loadMCMFramework();
|
loadMCMFramework();
|
||||||
|
|
||||||
LSApplicationWorkspace* workspace = [LSApplicationWorkspace defaultWorkspace];
|
LSApplicationWorkspace* workspace = [LSApplicationWorkspace defaultWorkspace];
|
||||||
|
@ -140,7 +140,7 @@ void registerPath(char* cPath, int unregister, BOOL system)
|
||||||
dictToRegister[@"Container"] = containerPath;
|
dictToRegister[@"Container"] = containerPath;
|
||||||
dictToRegister[@"EnvironmentVariables"] = constructEnvironmentVariablesForContainerPath(containerPath);
|
dictToRegister[@"EnvironmentVariables"] = constructEnvironmentVariablesForContainerPath(containerPath);
|
||||||
}
|
}
|
||||||
dictToRegister[@"IsDeletable"] = @NO;
|
dictToRegister[@"IsDeletable"] = @(![appBundleID isEqualToString:@"com.opa334.TrollStore"] && kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iOS_15_0);
|
||||||
dictToRegister[@"Path"] = path;
|
dictToRegister[@"Path"] = path;
|
||||||
dictToRegister[@"IsContainerized"] = @(constructContainerizationForEntitlements(entitlements));
|
dictToRegister[@"IsContainerized"] = @(constructContainerizationForEntitlements(entitlements));
|
||||||
dictToRegister[@"SignerOrganization"] = @"Apple Inc.";
|
dictToRegister[@"SignerOrganization"] = @"Apple Inc.";
|
||||||
|
@ -159,7 +159,7 @@ void registerPath(char* cPath, int unregister, BOOL system)
|
||||||
// Add group containers
|
// Add group containers
|
||||||
|
|
||||||
NSDictionary* appGroupContainers = constructGroupsContainersForEntitlements(entitlements, NO);
|
NSDictionary* appGroupContainers = constructGroupsContainersForEntitlements(entitlements, NO);
|
||||||
NSDictionary* systemGroupContainers = constructGroupsContainersForEntitlements(entitlements, NO);
|
NSDictionary* systemGroupContainers = constructGroupsContainersForEntitlements(entitlements, YES);
|
||||||
NSMutableDictionary* groupContainers = [NSMutableDictionary new];
|
NSMutableDictionary* groupContainers = [NSMutableDictionary new];
|
||||||
[groupContainers addEntriesFromDictionary:appGroupContainers];
|
[groupContainers addEntriesFromDictionary:appGroupContainers];
|
||||||
[groupContainers addEntriesFromDictionary:systemGroupContainers];
|
[groupContainers addEntriesFromDictionary:systemGroupContainers];
|
||||||
|
|
|
@ -19,6 +19,8 @@ extern NSArray* trollStoreInstalledAppContainerPaths();
|
||||||
extern NSString* trollStorePath();
|
extern NSString* trollStorePath();
|
||||||
extern NSString* trollStoreAppPath();
|
extern NSString* trollStoreAppPath();
|
||||||
|
|
||||||
|
extern BOOL isRemovableSystemApp(NSString* appId);
|
||||||
|
|
||||||
#import <UIKit/UIAlertController.h>
|
#import <UIKit/UIAlertController.h>
|
||||||
|
|
||||||
@interface UIAlertController (Private)
|
@interface UIAlertController (Private)
|
||||||
|
|
|
@ -326,6 +326,11 @@ NSString* trollStoreAppPath()
|
||||||
return [trollStorePath() stringByAppendingPathComponent:@"TrollStore.app"];
|
return [trollStorePath() stringByAppendingPathComponent:@"TrollStore.app"];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOL isRemovableSystemApp(NSString* appId)
|
||||||
|
{
|
||||||
|
return [[NSFileManager defaultManager] fileExistsAtPath:[@"/System/Library/AppSignatures" stringByAppendingPathComponent:appId]];
|
||||||
|
}
|
||||||
|
|
||||||
LSApplicationProxy* findPersistenceHelperApp(PERSISTENCE_HELPER_TYPE allowedTypes)
|
LSApplicationProxy* findPersistenceHelperApp(PERSISTENCE_HELPER_TYPE allowedTypes)
|
||||||
{
|
{
|
||||||
__block LSApplicationProxy* outProxy;
|
__block LSApplicationProxy* outProxy;
|
||||||
|
|
|
@ -84,7 +84,7 @@
|
||||||
|
|
||||||
lastGroupSpecifier = utilitiesGroupSpecifier;
|
lastGroupSpecifier = utilitiesGroupSpecifier;
|
||||||
|
|
||||||
if(isInstalled)
|
if(isInstalled || trollStoreInstalledAppContainerPaths().count)
|
||||||
{
|
{
|
||||||
PSSpecifier* refreshAppRegistrationsSpecifier = [PSSpecifier preferenceSpecifierNamed:@"Refresh App Registrations"
|
PSSpecifier* refreshAppRegistrationsSpecifier = [PSSpecifier preferenceSpecifierNamed:@"Refresh App Registrations"
|
||||||
target:self
|
target:self
|
||||||
|
@ -97,7 +97,9 @@
|
||||||
[refreshAppRegistrationsSpecifier setProperty:@YES forKey:@"enabled"];
|
[refreshAppRegistrationsSpecifier setProperty:@YES forKey:@"enabled"];
|
||||||
refreshAppRegistrationsSpecifier.buttonAction = @selector(refreshAppRegistrationsPressed);
|
refreshAppRegistrationsSpecifier.buttonAction = @selector(refreshAppRegistrationsPressed);
|
||||||
[_specifiers addObject:refreshAppRegistrationsSpecifier];
|
[_specifiers addObject:refreshAppRegistrationsSpecifier];
|
||||||
|
}
|
||||||
|
if(isInstalled)
|
||||||
|
{
|
||||||
PSSpecifier* uninstallTrollStoreSpecifier = [PSSpecifier preferenceSpecifierNamed:@"Uninstall TrollStore"
|
PSSpecifier* uninstallTrollStoreSpecifier = [PSSpecifier preferenceSpecifierNamed:@"Uninstall TrollStore"
|
||||||
target:self
|
target:self
|
||||||
set:nil
|
set:nil
|
||||||
|
|
|
@ -329,7 +329,7 @@ extern NSUserDefaults* trollStoreUserDefaults(void);
|
||||||
{
|
{
|
||||||
if(appProxy.installed && !appProxy.restricted)
|
if(appProxy.installed && !appProxy.restricted)
|
||||||
{
|
{
|
||||||
if([appProxy.bundleURL.path hasPrefix:@"/private/var/containers"])
|
if([[NSFileManager defaultManager] fileExistsAtPath:[@"/System/Library/AppSignatures" stringByAppendingPathComponent:appProxy.bundleIdentifier]])
|
||||||
{
|
{
|
||||||
NSURL* trollStoreMarkURL = [appProxy.bundleURL.URLByDeletingLastPathComponent URLByAppendingPathComponent:@"_TrollStore"];
|
NSURL* trollStoreMarkURL = [appProxy.bundleURL.URLByDeletingLastPathComponent URLByAppendingPathComponent:@"_TrollStore"];
|
||||||
if(![trollStoreMarkURL checkResourceIsReachableAndReturnError:nil])
|
if(![trollStoreMarkURL checkResourceIsReachableAndReturnError:nil])
|
||||||
|
|
Loading…
Reference in New Issue