This commit is contained in:
opa334 2023-01-26 00:39:58 +01:00
parent 4db76d3ec5
commit 704d3ffd45
8 changed files with 36 additions and 39 deletions

View File

@ -10,6 +10,6 @@ trollstorehelper_CFLAGS = -fobjc-arc -I../Shared
trollstorehelper_CODESIGN_FLAGS = -Sentitlements.plist -K../cert.p12 trollstorehelper_CODESIGN_FLAGS = -Sentitlements.plist -K../cert.p12
trollstorehelper_INSTALL_PATH = /usr/local/bin trollstorehelper_INSTALL_PATH = /usr/local/bin
trollstorehelper_LIBRARIES = archive trollstorehelper_LIBRARIES = archive
trollstorehelper_PRIVATE_FRAMEWORKS = SpringBoardServices BackBoardServices trollstorehelper_PRIVATE_FRAMEWORKS = SpringBoardServices BackBoardServices MobileContainerManager
include $(THEOS_MAKE_PATH)/tool.mk include $(THEOS_MAKE_PATH)/tool.mk

View File

@ -591,18 +591,7 @@ int installApp(NSString* appPackagePath, BOOL sign, BOOL force, BOOL isTSUpdate,
NSString* appPayloadPath = [appPackagePath stringByAppendingPathComponent:@"Payload"]; NSString* appPayloadPath = [appPackagePath stringByAppendingPathComponent:@"Payload"];
NSArray* items = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:appPayloadPath error:nil]; NSString* appBundleToInstallPath = findAppPathInBundlePath(appPayloadPath);
if(!items) return 167;
NSString* appBundleToInstallPath;
for(NSString* item in items)
{
if([item.pathExtension isEqualToString:@"app"])
{
appBundleToInstallPath = [appPayloadPath stringByAppendingPathComponent:item];
break;
}
}
if(!appBundleToInstallPath) return 167; if(!appBundleToInstallPath) return 167;
NSString* appId = appIdForAppPath(appBundleToInstallPath); NSString* appId = appIdForAppPath(appBundleToInstallPath);
@ -626,7 +615,7 @@ int installApp(NSString* appPackagePath, BOOL sign, BOOL force, BOOL isTSUpdate,
if(signRet != 0) return signRet; if(signRet != 0) return signRet;
} }
MCMAppContainer* appContainer = [objc_getClass("MCMAppContainer") containerWithIdentifier:appId createIfNecessary:NO existed:nil error:nil]; MCMAppContainer* appContainer = [MCMAppContainer containerWithIdentifier:appId createIfNecessary:NO existed:nil error:nil];
if(appContainer) if(appContainer)
{ {
// App update // App update
@ -638,7 +627,7 @@ int installApp(NSString* appPackagePath, BOOL sign, BOOL force, BOOL isTSUpdate,
// Make sure the installed app is a TrollStore app or the container is empty (or the force flag is set) // Make sure the installed app is a TrollStore app or the container is empty (or the force flag is set)
NSURL* trollStoreMarkURL = [bundleContainerURL URLByAppendingPathComponent:@"_TrollStore"]; NSURL* trollStoreMarkURL = [bundleContainerURL URLByAppendingPathComponent:@"_TrollStore"];
if(!appBundleURL && ![trollStoreMarkURL checkResourceIsReachableAndReturnError:nil] && !force) if(appBundleURL && ![trollStoreMarkURL checkResourceIsReachableAndReturnError:nil] && !force)
{ {
NSLog(@"[installApp] already installed and not a TrollStore app... bailing out"); NSLog(@"[installApp] already installed and not a TrollStore app... bailing out");
return 171; return 171;
@ -680,10 +669,21 @@ int installApp(NSString* appPackagePath, BOOL sign, BOOL force, BOOL isTSUpdate,
// Do initial placeholder installation using LSApplicationWorkspace // Do initial placeholder installation using LSApplicationWorkspace
NSLog(@"[installApp] doing placeholder installation using LSApplicationWorkspace"); NSLog(@"[installApp] doing placeholder installation using LSApplicationWorkspace");
// The installApplication API (re)moves the app bundle, so in order to be able to later
// fall back to the custom method, we need to make a temporary copy just for using it on this API once
// Yeah this sucks, but there is no better solution unfortunately
NSError* tmpCopyError;
NSString* lsAppPackageTmpCopy = [NSTemporaryDirectory() stringByAppendingPathComponent:[NSUUID UUID].UUIDString];
if(![[NSFileManager defaultManager] copyItemAtPath:appPackagePath toPath:lsAppPackageTmpCopy error:&tmpCopyError])
{
NSLog(@"failed to make temporary copy of app packge: %@", tmpCopyError);
return 170;
}
NSError* installError; NSError* installError;
@try @try
{ {
systemMethodSuccessful = [[LSApplicationWorkspace defaultWorkspace] installApplication:[NSURL fileURLWithPath:appPackagePath] withOptions:@{ systemMethodSuccessful = [[LSApplicationWorkspace defaultWorkspace] installApplication:[NSURL fileURLWithPath:lsAppPackageTmpCopy] withOptions:@{
LSInstallTypeKey : @1, LSInstallTypeKey : @1,
@"PackageType" : @"Placeholder" @"PackageType" : @"Placeholder"
} error:&installError]; } error:&installError];
@ -698,8 +698,12 @@ int installApp(NSString* appPackagePath, BOOL sign, BOOL force, BOOL isTSUpdate,
{ {
NSLog(@"[installApp] encountered error %@ while trying to do placeholder install", installError); NSLog(@"[installApp] encountered error %@ while trying to do placeholder install", installError);
} }
[[NSFileManager defaultManager] removeItemAtPath:lsAppPackageTmpCopy error:nil];
} }
NSLog(@"[installApp] app bundle still exists? %d", [[NSFileManager defaultManager] fileExistsAtPath:appBundleToInstallPath]);
if(!systemMethodSuccessful) if(!systemMethodSuccessful)
{ {
// Custom method // Custom method
@ -707,7 +711,7 @@ int installApp(NSString* appPackagePath, BOOL sign, BOOL force, BOOL isTSUpdate,
NSLog(@"[installApp] doing custom installation using MCMAppContainer"); NSLog(@"[installApp] doing custom installation using MCMAppContainer");
NSError* mcmError; NSError* mcmError;
appContainer = [objc_getClass("MCMAppContainer") containerWithIdentifier:appId createIfNecessary:YES existed:nil error:&mcmError]; appContainer = [MCMAppContainer containerWithIdentifier:appId createIfNecessary:YES existed:nil error:&mcmError];
if(!appContainer || mcmError) if(!appContainer || mcmError)
{ {
@ -726,14 +730,13 @@ int installApp(NSString* appPackagePath, BOOL sign, BOOL force, BOOL isTSUpdate,
BOOL suc = [[NSFileManager defaultManager] copyItemAtPath:appBundleToInstallPath toPath:newAppBundlePath error:&copyError]; BOOL suc = [[NSFileManager defaultManager] copyItemAtPath:appBundleToInstallPath toPath:newAppBundlePath error:&copyError];
if(!suc) if(!suc)
{ {
NSLog(@"[installApp] Failed to copy app bundle for app %@, error: %@", appId, copyError); NSLog(@"[installApp] Failed to copy app bundle for app %@, error: %@", appId, copyError);
return 178; return 178;
} }
} }
} }
appContainer = [objc_getClass("MCMAppContainer") containerWithIdentifier:appId createIfNecessary:NO existed:nil error:nil]; appContainer = [MCMAppContainer containerWithIdentifier:appId createIfNecessary:NO existed:nil error:nil];
// Mark app as TrollStore app // Mark app as TrollStore app
NSURL* trollStoreMarkURL = [appContainer.url URLByAppendingPathComponent:@"_TrollStore"]; NSURL* trollStoreMarkURL = [appContainer.url URLByAppendingPathComponent:@"_TrollStore"];

View File

@ -16,16 +16,16 @@ NSDictionary* constructGroupsContainersForEntitlements(NSDictionary* entitlement
if(!entitlements) return nil; if(!entitlements) return nil;
NSString* entitlementForGroups; NSString* entitlementForGroups;
NSString* mcmClass; Class mcmClass;
if(systemGroups) if(systemGroups)
{ {
entitlementForGroups = @"com.apple.security.system-groups"; entitlementForGroups = @"com.apple.security.system-groups";
mcmClass = @"MCMSystemDataContainer"; mcmClass = [MCMSystemDataContainer class];
} }
else else
{ {
entitlementForGroups = @"com.apple.security.application-groups"; entitlementForGroups = @"com.apple.security.application-groups";
mcmClass = @"MCMSharedDataContainer"; mcmClass = [MCMSharedDataContainer class];
} }
NSArray* groupIDs = entitlements[entitlementForGroups]; NSArray* groupIDs = entitlements[entitlementForGroups];
@ -35,7 +35,7 @@ NSDictionary* constructGroupsContainersForEntitlements(NSDictionary* entitlement
for(NSString* groupID in groupIDs) for(NSString* groupID in groupIDs)
{ {
MCMContainer* container = [NSClassFromString(mcmClass) containerWithIdentifier:groupID createIfNecessary:YES existed:nil error:nil]; MCMContainer* container = [mcmClass containerWithIdentifier:groupID createIfNecessary:YES existed:nil error:nil];
if(container.url) if(container.url)
{ {
groupContainers[groupID] = container.url.path; groupContainers[groupID] = container.url.path;
@ -94,7 +94,6 @@ NSDictionary* constructEnvironmentVariablesForContainerPath(NSString* containerP
void registerPath(NSString* path, BOOL unregister, BOOL system) void registerPath(NSString* path, BOOL unregister, BOOL system)
{ {
if(!path) return; if(!path) return;
loadMCMFramework();
LSApplicationWorkspace* workspace = [LSApplicationWorkspace defaultWorkspace]; LSApplicationWorkspace* workspace = [LSApplicationWorkspace defaultWorkspace];
if(unregister && ![[NSFileManager defaultManager] fileExistsAtPath:path]) if(unregister && ![[NSFileManager defaultManager] fileExistsAtPath:path])

View File

@ -70,3 +70,9 @@ extern NSString *LSInstallTypeKey;
@interface MCMPluginKitPluginDataContainer : MCMDataContainer @interface MCMPluginKitPluginDataContainer : MCMDataContainer
@end @end
@interface MCMSystemDataContainer : MCMContainer
@end
@interface MCMSharedDataContainer : MCMContainer
@end

View File

@ -4,7 +4,6 @@
#define TrollStoreErrorDomain @"TrollStoreErrorDomain" #define TrollStoreErrorDomain @"TrollStoreErrorDomain"
extern void chineseWifiFixup(void); extern void chineseWifiFixup(void);
extern void loadMCMFramework(void);
extern NSString* safe_getExecutablePath(); extern NSString* safe_getExecutablePath();
extern NSString* rootHelperPath(void); extern NSString* rootHelperPath(void);
extern NSString* getNSStringFromFile(int fd); extern NSString* getNSStringFromFile(int fd);

View File

@ -26,15 +26,6 @@ void chineseWifiFixup(void)
} }
} }
void loadMCMFramework(void)
{
static dispatch_once_t onceToken;
dispatch_once (&onceToken, ^{
NSBundle* mcmBundle = [NSBundle bundleWithPath:@"/System/Library/PrivateFrameworks/MobileContainerManager.framework"];
[mcmBundle load];
});
}
extern char*** _NSGetArgv(); extern char*** _NSGetArgv();
NSString* safe_getExecutablePath() NSString* safe_getExecutablePath()
{ {
@ -379,9 +370,8 @@ NSArray* trollStoreInstalledAppBundlePaths()
NSString* trollStorePath() NSString* trollStorePath()
{ {
loadMCMFramework();
NSError* mcmError; NSError* mcmError;
MCMAppContainer* appContainer = [NSClassFromString(@"MCMAppContainer") containerWithIdentifier:@"com.opa334.TrollStore" createIfNecessary:NO existed:NULL error:&mcmError]; MCMAppContainer* appContainer = [MCMAppContainer containerWithIdentifier:@"com.opa334.TrollStore" createIfNecessary:NO existed:NULL error:&mcmError];
if(!appContainer) return nil; if(!appContainer) return nil;
return appContainer.url.path; return appContainer.url.path;
} }

View File

@ -9,7 +9,7 @@ APPLICATION_NAME = TrollStorePersistenceHelper
TrollStorePersistenceHelper_FILES = $(wildcard *.m) $(wildcard ../Shared/*.m) TrollStorePersistenceHelper_FILES = $(wildcard *.m) $(wildcard ../Shared/*.m)
TrollStorePersistenceHelper_FRAMEWORKS = UIKit CoreGraphics CoreServices TrollStorePersistenceHelper_FRAMEWORKS = UIKit CoreGraphics CoreServices
TrollStorePersistenceHelper_PRIVATE_FRAMEWORKS = Preferences TrollStorePersistenceHelper_PRIVATE_FRAMEWORKS = Preferences MobileContainerManager
TrollStorePersistenceHelper_CFLAGS = -fobjc-arc -I../Shared TrollStorePersistenceHelper_CFLAGS = -fobjc-arc -I../Shared
TrollStorePersistenceHelper_CODESIGN_FLAGS = -Sentitlements.plist -K../cert.p12 TrollStorePersistenceHelper_CODESIGN_FLAGS = -Sentitlements.plist -K../cert.p12

View File

@ -7,7 +7,7 @@ APPLICATION_NAME = TrollStore
TrollStore_FILES = $(wildcard *.m) $(wildcard ../Shared/*.m) TrollStore_FILES = $(wildcard *.m) $(wildcard ../Shared/*.m)
TrollStore_FRAMEWORKS = UIKit CoreGraphics CoreServices TrollStore_FRAMEWORKS = UIKit CoreGraphics CoreServices
TrollStore_PRIVATE_FRAMEWORKS = Preferences MobileIcons TrollStore_PRIVATE_FRAMEWORKS = Preferences MobileIcons MobileContainerManager
TrollStore_LIBRARIES = archive TrollStore_LIBRARIES = archive
TrollStore_CFLAGS = -fobjc-arc -I../Shared TrollStore_CFLAGS = -fobjc-arc -I../Shared
TrollStore_CODESIGN_FLAGS = -Sentitlements.plist -K../cert.p12 TrollStore_CODESIGN_FLAGS = -Sentitlements.plist -K../cert.p12