diff --git a/Helper/control b/Helper/control index 07e838f..ad89a46 100644 --- a/Helper/control +++ b/Helper/control @@ -1,6 +1,6 @@ Package: com.opa334.trollstoreroothelper Name: trollstoreroothelper -Version: 1.0 +Version: 1.0.1 Architecture: iphoneos-arm Description: An awesome tool of some sort!! Maintainer: opa334 diff --git a/Helper/main.m b/Helper/main.m index 64bbdb5..2daa446 100644 --- a/Helper/main.m +++ b/Helper/main.m @@ -243,10 +243,13 @@ BOOL signApp(NSString* appPath, NSError** error) return ldidRet == 0; } -BOOL installApp(NSString* appPath, BOOL sign, NSError** error) +// 170: failed to create container for app bundle +// 171: a non trollstore app with the same identifier is already installled +// 172: no info.plist found in app +int installApp(NSString* appPath, BOOL sign, NSError** error) { NSString* appId = appIdForAppPath(appPath); - if(!appId) return NO; + if(!appId) return 172; if(sign) { @@ -261,15 +264,27 @@ BOOL installApp(NSString* appPath, BOOL sign, NSError** error) if(!appContainer || mcmError) { if(error) *error = mcmError; - return NO; + return 170; + } + + // check if the bundle is empty + BOOL isEmpty = YES; + NSArray* bundleItems = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:appContainer.url.path error:error]; + for(NSString* bundleItem in bundleItems) + { + if([bundleItem.pathExtension isEqualToString:@"app"]) + { + isEmpty = NO; + break; + } } // Make sure there isn't already an app store app installed with the same identifier NSURL* trollStoreMarkURL = [appContainer.url URLByAppendingPathComponent:@"_TrollStore"]; - if(existed && ![trollStoreMarkURL checkResourceIsReachableAndReturnError:nil]) + if(existed && !isEmpty && ![trollStoreMarkURL checkResourceIsReachableAndReturnError:nil]) { NSLog(@"[installApp] already installed and not a TrollStore app... bailing out"); - return NO; + return 171; } // Apply correct permissions @@ -297,7 +312,7 @@ BOOL installApp(NSString* appPath, BOOL sign, NSError** error) // chown 0 all root binaries NSDictionary* mainInfoDictionary = [NSDictionary dictionaryWithContentsOfFile:[appPath stringByAppendingPathComponent:@"Info.plist"]]; - if(!mainInfoDictionary) return NO; + if(!mainInfoDictionary) return 172; NSObject* tsRootBinaries = mainInfoDictionary[@"TSRootBinaries"]; if([tsRootBinaries isKindOfClass:[NSArray class]]) { @@ -349,18 +364,18 @@ BOOL installApp(NSString* appPath, BOOL sign, NSError** error) NSLog(@"[installApp] app installed, adding to icon cache now..."); registerPath((char*)newAppPath.UTF8String, 0); - return YES; + return 0; } else { - return suc; + return 1; } } -BOOL uninstallApp(NSString* appId, NSError** error) +int uninstallApp(NSString* appId, NSError** error) { NSString* appPath = appPathForAppId(appId, error); - if(!appPath) return NO; + if(!appPath) return 1; LSApplicationProxy* appProxy = [LSApplicationProxy applicationProxyForIdentifier:appId]; NSLog(@"appProxy: %@", appProxy); @@ -398,23 +413,36 @@ BOOL uninstallApp(NSString* appId, NSError** error) NSLog(@"deleting %@", [appPath stringByDeletingLastPathComponent]); // delete app - return [[NSFileManager defaultManager] removeItemAtPath:[appPath stringByDeletingLastPathComponent] error:error]; + BOOL deleteSuc = [[NSFileManager defaultManager] removeItemAtPath:[appPath stringByDeletingLastPathComponent] error:error]; + if(deleteSuc) + { + return 0; + } + else + { + return 1; + } } -BOOL installIpa(NSString* ipaPath, NSError** error) +// 166: IPA does not exist or is not accessible +// 167: IPA does not appear to contain an app + +int installIpa(NSString* ipaPath, NSError** error) { + if(![[NSFileManager defaultManager] fileExistsAtPath:ipaPath]) return 166; + BOOL suc = NO; NSString* tmpPath = [NSTemporaryDirectory() stringByAppendingPathComponent:[NSUUID UUID].UUIDString]; suc = [[NSFileManager defaultManager] createDirectoryAtPath:tmpPath withIntermediateDirectories:NO attributes:nil error:error]; - if(!suc) return NO; + if(!suc) return 1; extract(ipaPath, tmpPath); NSString* tmpPayloadPath = [tmpPath stringByAppendingPathComponent:@"Payload"]; NSArray* items = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:tmpPayloadPath error:error]; - if(!items) return NO; + if(!items) return 167; NSString* tmpAppPath; for(NSString* item in items) @@ -425,13 +453,13 @@ BOOL installIpa(NSString* ipaPath, NSError** error) break; } } - if(!tmpAppPath) return NO; + if(!tmpAppPath) return 167; - suc = installApp(tmpAppPath, YES, error); + int ret = installApp(tmpAppPath, YES, error); [[NSFileManager defaultManager] removeItemAtPath:tmpAppPath error:nil]; - return suc; + return ret; } void uninstallAllApps(void) @@ -470,17 +498,17 @@ BOOL installTrollStore(NSString* pathToTar) /*}*/ - if(![[NSFileManager defaultManager] fileExistsAtPath:pathToTar]) return NO; - if(![pathToTar.pathExtension isEqualToString:@"tar"]) return NO; + if(![[NSFileManager defaultManager] fileExistsAtPath:pathToTar]) return 1; + if(![pathToTar.pathExtension isEqualToString:@"tar"]) return 1; NSString* tmpPath = [NSTemporaryDirectory() stringByAppendingPathComponent:[NSUUID UUID].UUIDString]; BOOL suc = [[NSFileManager defaultManager] createDirectoryAtPath:tmpPath withIntermediateDirectories:NO attributes:nil error:nil]; - if(!suc) return NO; + if(!suc) return 1; extract(pathToTar, tmpPath); NSString* tmpTrollStore = [tmpPath stringByAppendingPathComponent:@"TrollStore.app"]; - if(![[NSFileManager defaultManager] fileExistsAtPath:tmpTrollStore]) return NO; + if(![[NSFileManager defaultManager] fileExistsAtPath:tmpTrollStore]) return 1; // Save existing ldid installation if it exists NSString* existingLdidPath = [trollStoreAppPath() stringByAppendingPathComponent:@"ldid"]; @@ -629,33 +657,33 @@ int main(int argc, char *argv[], char *envp[]) { NSBundle* mcmBundle = [NSBundle bundleWithPath:@"/System/Library/PrivateFrameworks/MobileContainerManager.framework"]; [mcmBundle load]; - BOOL suc = NO; + int ret = 0; NSError* error; NSString* cmd = [NSString stringWithUTF8String:argv[1]]; if([cmd isEqualToString:@"install"]) { - if(argc <= 2) return -2; + if(argc <= 2) return -3; NSString* ipaPath = [NSString stringWithUTF8String:argv[2]]; - suc = installIpa(ipaPath, &error); + ret = installIpa(ipaPath, &error); } else if([cmd isEqualToString:@"uninstall"]) { - if(argc <= 2) return -2; + if(argc <= 2) return -3; NSString* appId = [NSString stringWithUTF8String:argv[2]]; - suc = uninstallApp(appId, &error); + ret = uninstallApp(appId, &error); } else if([cmd isEqualToString:@"install-trollstore"]) { - if(argc <= 2) return -2; + if(argc <= 2) return -3; NSString* tsTar = [NSString stringWithUTF8String:argv[2]]; - suc = installTrollStore(tsTar); - NSLog(@"installed troll store? %d", suc); + ret = installTrollStore(tsTar); + NSLog(@"installed troll store? %d", ret==0); } else if([cmd isEqualToString:@"uninstall-trollstore"]) { uninstallAllApps(); uninstallTrollStore(YES); } else if([cmd isEqualToString:@"install-ldid"]) { - if(argc <= 2) return -2; + if(argc <= 2) return -3; NSString* ldidPath = [NSString stringWithUTF8String:argv[2]]; installLdid(ldidPath); } else if([cmd isEqualToString:@"refresh"]) @@ -667,7 +695,7 @@ int main(int argc, char *argv[], char *envp[]) { refreshAppRegistrations(); } else if([cmd isEqualToString:@"install-persistence-helper"]) { - if(argc <= 2) return -2; + if(argc <= 2) return -3; NSString* systemAppId = [NSString stringWithUTF8String:argv[2]]; installPersistenceHelper(systemAppId); } else if([cmd isEqualToString:@"uninstall-persistence-helper"]) @@ -680,6 +708,8 @@ int main(int argc, char *argv[], char *envp[]) { NSLog(@"error: %@", error); } - return !suc; + NSLog(@"returning %d", ret); + + return ret; } } diff --git a/Installer/TrollInstaller/TrollInstaller/Base.lproj/Main.storyboard b/Installer/TrollInstaller/TrollInstaller/Base.lproj/Main.storyboard index 9a1385e..207e557 100644 --- a/Installer/TrollInstaller/TrollInstaller/Base.lproj/Main.storyboard +++ b/Installer/TrollInstaller/TrollInstaller/Base.lproj/Main.storyboard @@ -52,8 +52,8 @@ Installer -