2.1
2
ChOma
|
@ -1 +1 @@
|
|||
Subproject commit defd14b0a3303aea7f345b6305619dd390176098
|
||||
Subproject commit 964023ddac2286ef8e843f90df64d44ac6a673df
|
19
Makefile
|
@ -1,6 +1,6 @@
|
|||
TOPTARGETS := all clean update
|
||||
|
||||
$(TOPTARGETS): pre_build make_fastPathSign make_roothelper make_trollstore make_trollhelper_embedded make_trollhelper_package assemble_trollstore build_installer15 build_installer64e
|
||||
$(TOPTARGETS): pre_build make_fastPathSign make_roothelper make_trollstore make_trollhelper_embedded make_trollhelper_package assemble_trollstore build_installer15 build_installer64e make_trollstore_lite
|
||||
|
||||
pre_build:
|
||||
@rm -rf ./_build 2>/dev/null || true
|
||||
|
@ -10,7 +10,7 @@ make_fastPathSign:
|
|||
@$(MAKE) -C ./Exploits/fastPathSign $(MAKECMDGOALS)
|
||||
|
||||
make_roothelper:
|
||||
@$(MAKE) -C ./RootHelper FINALPACKAGE=1 $(MAKECMDGOALS)
|
||||
@$(MAKE) -C ./RootHelper DEBUG=0 $(MAKECMDGOALS)
|
||||
|
||||
make_trollstore:
|
||||
@$(MAKE) -C ./TrollStore FINALPACKAGE=1 $(MAKECMDGOALS)
|
||||
|
@ -73,6 +73,21 @@ build_installer64e:
|
|||
popd
|
||||
@rm -rf ./_build/tmp64e
|
||||
|
||||
make_trollstore_lite:
|
||||
@$(MAKE) -C ./RootHelper DEBUG=0 TROLLSTORE_LITE=1
|
||||
@rm -rf ./TrollStoreLite/Resources/trollstorehelper
|
||||
@cp ./RootHelper/.theos/obj/trollstorehelper_lite ./TrollStoreLite/Resources/trollstorehelper
|
||||
@$(MAKE) -C ./TrollStoreLite package FINALPACKAGE=1
|
||||
@$(MAKE) -C ./RootHelper TROLLSTORE_LITE=1 clean
|
||||
@$(MAKE) -C ./TrollStoreLite clean
|
||||
@$(MAKE) -C ./RootHelper DEBUG=0 TROLLSTORE_LITE=1 THEOS_PACKAGE_SCHEME=rootless
|
||||
@rm -rf ./TrollStoreLite/Resources/trollstorehelper
|
||||
@cp ./RootHelper/.theos/obj/trollstorehelper_lite ./TrollStoreLite/Resources/trollstorehelper
|
||||
@$(MAKE) -C ./TrollStoreLite package FINALPACKAGE=1 THEOS_PACKAGE_SCHEME=rootless
|
||||
|
||||
else
|
||||
make_trollstore_lite:
|
||||
@$(MAKE) -C ./TrollStoreLite $(MAKECMDGOALS)
|
||||
endif
|
||||
|
||||
.PHONY: $(TOPTARGETS) pre_build assemble_trollstore make_trollhelper_package make_trollhelper_embedded build_installer15 build_installer64e
|
|
@ -1,19 +1,36 @@
|
|||
TARGET := iphone:clang:16.5:14.0
|
||||
ARCHS = arm64
|
||||
|
||||
ifdef TROLLSTORE_LITE
|
||||
HELPER_NAME = trollstorehelper_lite
|
||||
else
|
||||
HELPER_NAME = trollstorehelper
|
||||
TARGET_CODESIGN = ../Exploits/fastPathSign/fastPathSign
|
||||
endif
|
||||
|
||||
include $(THEOS)/makefiles/common.mk
|
||||
|
||||
TOOL_NAME = trollstorehelper
|
||||
TOOL_NAME = $(HELPER_NAME)
|
||||
|
||||
trollstorehelper_FILES = $(wildcard *.m) $(wildcard ../Shared/*.m) $(wildcard ../ChOma/src/*.c) ../Exploits/fastPathSign/src/coretrust_bug.c ../Exploits/fastPathSign/src/codesign.m
|
||||
trollstorehelper_CFLAGS = -fobjc-arc -I../Shared $(shell pkg-config --cflags libcrypto) -I../ChOma/src -I../Exploits/fastPathSign/src -I$(shell brew --prefix)/opt/libarchive/include
|
||||
trollstorehelper_LDFLAGS = -L../ChOma/external/ios -lcrypto
|
||||
trollstorehelper_CODESIGN_FLAGS = --entitlements entitlements.plist
|
||||
trollstorehelper_INSTALL_PATH = /usr/local/bin
|
||||
trollstorehelper_LIBRARIES = archive
|
||||
trollstorehelper_FRAMEWORKS = CoreTelephony
|
||||
trollstorehelper_PRIVATE_FRAMEWORKS = SpringBoardServices BackBoardServices MobileContainerManager FrontBoardServices RunningBoardServices
|
||||
$(HELPER_NAME)_FILES = $(wildcard *.m) $(wildcard ../Shared/*.m) $(wildcard ../ChOma/src/*.c)
|
||||
|
||||
ifndef TROLLSTORE_LITE
|
||||
$(HELPER_NAME)_FILES += ../Exploits/fastPathSign/src/coretrust_bug.c ../Exploits/fastPathSign/src/codesign.m
|
||||
$(HELPER_NAME)_CODESIGN_FLAGS = --entitlements entitlements.plist
|
||||
$(HELPER_NAME)_LDFLAGS = -L../ChOma/external/ios -lcrypto
|
||||
else
|
||||
$(HELPER_NAME)_CODESIGN_FLAGS = -Sentitlements.plist
|
||||
endif
|
||||
|
||||
$(HELPER_NAME)_CFLAGS = -fobjc-arc -I../Shared $(shell pkg-config --cflags libcrypto) -I../ChOma/src -I../Exploits/fastPathSign/src -I$(shell brew --prefix)/opt/libarchive/include
|
||||
|
||||
$(HELPER_NAME)_INSTALL_PATH = /usr/local/bin
|
||||
$(HELPER_NAME)_LIBRARIES = archive
|
||||
$(HELPER_NAME)_FRAMEWORKS = CoreTelephony
|
||||
$(HELPER_NAME)_PRIVATE_FRAMEWORKS = SpringBoardServices BackBoardServices MobileContainerManager FrontBoardServices RunningBoardServices
|
||||
|
||||
ifdef TROLLSTORE_LITE
|
||||
$(HELPER_NAME)_CFLAGS += -DTROLLSTORE_LITE -DDISABLE_SIGNING=1
|
||||
endif
|
||||
|
||||
include $(THEOS_MAKE_PATH)/tool.mk
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
Package: com.opa334.trollstoreroothelper
|
||||
Name: trollstoreroothelper
|
||||
Version: 2.0.15
|
||||
Version: 2.1
|
||||
Architecture: iphoneos-arm
|
||||
Description: An awesome tool of some sort!!
|
||||
Maintainer: opa334
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
#import <SpringBoardServices/SpringBoardServices.h>
|
||||
#import <FrontBoardServices/FBSSystemService.h>
|
||||
#import <Security/Security.h>
|
||||
#import <libroot.h>
|
||||
|
||||
#ifdef EMBEDDED_ROOT_HELPER
|
||||
#define MAIN_NAME rootHelperMain
|
||||
|
@ -243,6 +244,21 @@ void setTSURLSchemeState(BOOL newState, NSString* customAppPath)
|
|||
}
|
||||
}
|
||||
|
||||
#ifdef TROLLSTORE_LITE
|
||||
|
||||
BOOL isLdidInstalled(void)
|
||||
{
|
||||
// Since TrollStore Lite depends on ldid, we assume it exists
|
||||
return YES;
|
||||
}
|
||||
|
||||
NSString *getLdidPath(void)
|
||||
{
|
||||
return JBROOT_PATH(@"/usr/bin/ldid");
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
void installLdid(NSString* ldidToCopyPath, NSString* ldidVersion)
|
||||
{
|
||||
if(![[NSFileManager defaultManager] fileExistsAtPath:ldidToCopyPath]) return;
|
||||
|
@ -270,9 +286,16 @@ BOOL isLdidInstalled(void)
|
|||
return [[NSFileManager defaultManager] fileExistsAtPath:ldidPath];
|
||||
}
|
||||
|
||||
NSString *getLdidPath(void)
|
||||
{
|
||||
return [trollStoreAppPath() stringByAppendingPathComponent:@"ldid"];
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
int runLdid(NSArray* args, NSString** output, NSString** errorOutput)
|
||||
{
|
||||
NSString* ldidPath = [trollStoreAppPath() stringByAppendingPathComponent:@"ldid"];
|
||||
NSString* ldidPath = getLdidPath();
|
||||
NSMutableArray* argsM = args.mutableCopy ?: [NSMutableArray new];
|
||||
[argsM insertObject:ldidPath.lastPathComponent atIndex:0];
|
||||
|
||||
|
@ -300,6 +323,7 @@ int runLdid(NSArray* args, NSString** output, NSString** errorOutput)
|
|||
|
||||
pid_t task_pid;
|
||||
int status = -200;
|
||||
NSLog(@"About to spawn ldid (%@) with args %@", ldidPath, args);
|
||||
int spawnError = posix_spawn(&task_pid, [ldidPath fileSystemRepresentation], &action, NULL, (char* const*)argsC, NULL);
|
||||
for (NSUInteger i = 0; i < argCount; i++)
|
||||
{
|
||||
|
@ -309,7 +333,7 @@ int runLdid(NSArray* args, NSString** output, NSString** errorOutput)
|
|||
|
||||
if(spawnError != 0)
|
||||
{
|
||||
NSLog(@"posix_spawn error %d\n", spawnError);
|
||||
NSLog(@"ldid failed to spawn with error %d (%s)\n", spawnError, strerror(spawnError));
|
||||
return spawnError;
|
||||
}
|
||||
|
||||
|
@ -535,6 +559,7 @@ int signApp(NSString* appPath)
|
|||
|
||||
if(![[NSFileManager defaultManager] fileExistsAtPath:mainExecutablePath]) return 174;
|
||||
|
||||
#ifndef TROLLSTORE_LITE
|
||||
// Check if the bundle has had a supported exploit pre-applied
|
||||
EXPLOIT_TYPE declaredPreAppliedExploitType = getDeclaredExploitTypeFromInfoDictionary(appInfoDict);
|
||||
if(isPlatformVulnerableToExploitType(declaredPreAppliedExploitType))
|
||||
|
@ -570,6 +595,7 @@ int signApp(NSString* appPath)
|
|||
// On iOS 16+, binaries with certain entitlements requires developer mode to be enabled, so we'll check
|
||||
// while we're fixing entitlements
|
||||
BOOL requiresDevMode = NO;
|
||||
#endif
|
||||
|
||||
// The majority of IPA decryption utilities only decrypt the main executable of the app bundle
|
||||
// As a result, we cannot bail on the entire app if an additional binary is encrypted (e.g. app extensions)
|
||||
|
@ -592,6 +618,7 @@ int signApp(NSString* appPath)
|
|||
NSString *bundleId = infoDict[@"CFBundleIdentifier"];
|
||||
NSString *bundleExecutable = infoDict[@"CFBundleExecutable"];
|
||||
if (!bundleId || !bundleExecutable) continue;
|
||||
if ([bundleId isEqualToString:@""] || [bundleExecutable isEqualToString:@""]) continue;
|
||||
NSString *bundleMainExecutablePath = [[filePath stringByDeletingLastPathComponent] stringByAppendingPathComponent:bundleExecutable];
|
||||
if (![[NSFileManager defaultManager] fileExistsAtPath:bundleMainExecutablePath]) continue;
|
||||
|
||||
|
@ -620,6 +647,7 @@ int signApp(NSString* appPath)
|
|||
|
||||
if (!entitlementsToUse) entitlementsToUse = [NSMutableDictionary new];
|
||||
|
||||
#ifndef TROLLSTORE_LITE
|
||||
// Developer mode does not exist before iOS 16
|
||||
if (@available(iOS 16, *)){
|
||||
if (!requiresDevMode) {
|
||||
|
@ -664,15 +692,25 @@ int signApp(NSString* appPath)
|
|||
entitlementsToUse[@"com.apple.private.security.container-required"] = bundleId;
|
||||
}
|
||||
}
|
||||
signAdhoc(bundleMainExecutablePath, entitlementsToUse);
|
||||
#else
|
||||
// Since TrollStore Lite adhoc signs stuff, this means that on PMAP_CS devices, it will run with "PMAP_CS_IN_LOADED_TRUST_CACHE" trust level
|
||||
// We need to overwrite it so that the app runs as expected (Dopamine 2.1.5+ feature)
|
||||
entitlementsToUse[@"jb.pmap_cs_custom_trust"] = @"PMAP_CS_APP_STORE";
|
||||
#endif
|
||||
|
||||
int r = signAdhoc(bundleMainExecutablePath, entitlementsToUse);
|
||||
if (r != 0) return r;
|
||||
}
|
||||
}
|
||||
|
||||
// All entitlement related issues should be fixed at this point, so all we need to do is sign the entire bundle
|
||||
// And then apply the CoreTrust bypass to all executables
|
||||
// XXX: This only works because we're using ldid at the moment and that recursively signs everything
|
||||
signAdhoc(appPath, nil);
|
||||
int r = signAdhoc(appPath, nil);
|
||||
if (r != 0) return r;
|
||||
|
||||
#ifndef TROLLSTORE_LITE
|
||||
// Apply CoreTrust bypass
|
||||
enumerator = [[NSFileManager defaultManager] enumeratorAtURL:[NSURL fileURLWithPath:appPath] includingPropertiesForKeys:nil options:0 errorHandler:nil];
|
||||
while(fileURL = [enumerator nextObject])
|
||||
{
|
||||
|
@ -731,6 +769,35 @@ int signApp(NSString* appPath)
|
|||
// Postpone trying to enable dev mode until after the app is (successfully) installed
|
||||
return 182;
|
||||
}
|
||||
#else // TROLLSTORE_LITE
|
||||
// Just check for whether anything is fairplay encrypted
|
||||
enumerator = [[NSFileManager defaultManager] enumeratorAtURL:[NSURL fileURLWithPath:appPath] includingPropertiesForKeys:nil options:0 errorHandler:nil];
|
||||
while(fileURL = [enumerator nextObject])
|
||||
{
|
||||
NSString *filePath = fileURL.path;
|
||||
FAT *fat = fat_init_from_path(filePath.fileSystemRepresentation);
|
||||
if (fat) {
|
||||
NSLog(@"%@ is binary", filePath);
|
||||
MachO *macho = fat_find_preferred_slice(fat);
|
||||
if (macho) {
|
||||
if (macho_is_encrypted(macho)) {
|
||||
NSLog(@"[%@] Cannot apply CoreTrust bypass on an encrypted binary!", filePath);
|
||||
if (isSameFile(filePath, mainExecutablePath)) {
|
||||
// If this is the main binary, this error is fatal
|
||||
NSLog(@"[%@] Main binary is encrypted, cannot continue!", filePath);
|
||||
fat_free(fat);
|
||||
return 180;
|
||||
}
|
||||
else {
|
||||
// If not, we can continue but want to show a warning after the app is installed
|
||||
hasAdditionalEncryptedBinaries = YES;
|
||||
}
|
||||
}
|
||||
}
|
||||
fat_free(fat);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
if (hasAdditionalEncryptedBinaries) {
|
||||
return 184;
|
||||
|
@ -852,12 +919,19 @@ int installApp(NSString* appPackagePath, BOOL sign, BOOL force, BOOL isTSUpdate,
|
|||
NSURL* appBundleURL = findAppURLInBundleURL(bundleContainerURL);
|
||||
|
||||
// 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:TS_ACTIVE_MARKER];
|
||||
if(appBundleURL && ![trollStoreMarkURL checkResourceIsReachableAndReturnError:nil] && !force)
|
||||
{
|
||||
NSLog(@"[installApp] already installed and not a TrollStore app... bailing out");
|
||||
return 171;
|
||||
}
|
||||
else if (appBundleURL) {
|
||||
// When overwriting an app that has been installed with a different TrollStore flavor, make sure to remove the marker of said flavor
|
||||
NSURL *otherMarkerURL = [bundleContainerURL URLByAppendingPathComponent:TS_INACTIVE_MARKER];
|
||||
if ([otherMarkerURL checkResourceIsReachableAndReturnError:nil]) {
|
||||
[[NSFileManager defaultManager] removeItemAtURL:otherMarkerURL error:nil];
|
||||
}
|
||||
}
|
||||
|
||||
// Terminate app if it's still running
|
||||
if(!isTSUpdate)
|
||||
|
@ -963,7 +1037,7 @@ int installApp(NSString* appPackagePath, BOOL sign, BOOL force, BOOL isTSUpdate,
|
|||
appContainer = [MCMAppContainer containerWithIdentifier:appId createIfNecessary:NO existed:nil error:nil];
|
||||
|
||||
// Mark app as TrollStore app
|
||||
NSURL* trollStoreMarkURL = [appContainer.url URLByAppendingPathComponent:@"_TrollStore"];
|
||||
NSURL* trollStoreMarkURL = [appContainer.url URLByAppendingPathComponent:TS_ACTIVE_MARKER];
|
||||
if(![[NSFileManager defaultManager] fileExistsAtPath:trollStoreMarkURL.path])
|
||||
{
|
||||
NSError* creationError;
|
||||
|
@ -981,7 +1055,7 @@ int installApp(NSString* appPackagePath, BOOL sign, BOOL force, BOOL isTSUpdate,
|
|||
NSURL* updatedAppURL = findAppURLInBundleURL(appContainer.url);
|
||||
fixPermissionsOfAppBundle(updatedAppURL.path);
|
||||
if (!skipUICache) {
|
||||
if (!registerPath(updatedAppURL.path, 0, YES)) {
|
||||
if (!registerPath(updatedAppURL.path, 0, !shouldRegisterAsUserByDefault())) {
|
||||
[[NSFileManager defaultManager] removeItemAtURL:appContainer.url error:nil];
|
||||
return 181;
|
||||
}
|
||||
|
@ -1492,6 +1566,105 @@ int MAIN_NAME(int argc, char *argv[], char *envp[])
|
|||
NSString* appPath = args.lastObject;
|
||||
ret = uninstallAppByPath(appPath, useCustomMethod);
|
||||
}
|
||||
else if([cmd isEqualToString:@"refresh"])
|
||||
{
|
||||
refreshAppRegistrations(!shouldRegisterAsUserByDefault());
|
||||
}
|
||||
else if([cmd isEqualToString:@"refresh-all"])
|
||||
{
|
||||
cleanRestrictions();
|
||||
//refreshAppRegistrations(NO); // <- fixes app permissions resetting, causes apps to move around on home screen, so I had to disable it
|
||||
[[NSFileManager defaultManager] removeItemAtPath:@"/var/containers/Shared/SystemGroup/systemgroup.com.apple.lsd.iconscache/Library/Caches/com.apple.IconsCache" error:nil];
|
||||
[[LSApplicationWorkspace defaultWorkspace] _LSPrivateRebuildApplicationDatabasesForSystemApps:YES internal:YES user:YES];
|
||||
if (!shouldRegisterAsUserByDefault()) refreshAppRegistrations(YES);
|
||||
killall(@"backboardd", YES);
|
||||
}
|
||||
else if([cmd isEqualToString:@"url-scheme"])
|
||||
{
|
||||
if(args.count < 2) return -3;
|
||||
NSString* modifyArg = args.lastObject;
|
||||
BOOL newState = [modifyArg isEqualToString:@"enable"];
|
||||
if(newState == YES || [modifyArg isEqualToString:@"disable"])
|
||||
{
|
||||
setTSURLSchemeState(newState, nil);
|
||||
}
|
||||
}
|
||||
else if([cmd isEqualToString:@"reboot"])
|
||||
{
|
||||
[[FBSSystemService sharedService] reboot];
|
||||
// Give the system some time to reboot
|
||||
sleep(1);
|
||||
}
|
||||
else if([cmd isEqualToString:@"enable-jit"])
|
||||
{
|
||||
if(args.count < 2) return -3;
|
||||
NSString* userAppId = args.lastObject;
|
||||
ret = enableJIT(userAppId);
|
||||
}
|
||||
else if([cmd isEqualToString:@"modify-registration"])
|
||||
{
|
||||
if(args.count < 3) return -3;
|
||||
NSString* appPath = args[1];
|
||||
NSString* newRegistration = args[2];
|
||||
|
||||
NSString* trollStoreMark = [[appPath stringByDeletingLastPathComponent] stringByAppendingPathComponent:TS_ACTIVE_MARKER];
|
||||
if([[NSFileManager defaultManager] fileExistsAtPath:trollStoreMark])
|
||||
{
|
||||
registerPath(appPath, NO, [newRegistration isEqualToString:@"System"]);
|
||||
}
|
||||
}
|
||||
else if ([cmd isEqualToString:@"transfer-apps"])
|
||||
{
|
||||
bool oneFailed = false;
|
||||
for (NSString *appBundlePath in trollStoreInactiveInstalledAppBundlePaths()) {
|
||||
NSLog(@"Transfering %@...", appBundlePath);
|
||||
|
||||
// Ldid lacks the entitlement to sign in place
|
||||
// So copy to /tmp, resign, then replace >.<
|
||||
NSString *tmpPath = [NSTemporaryDirectory() stringByAppendingPathComponent:[NSUUID UUID].UUIDString];
|
||||
if (![[NSFileManager defaultManager] createDirectoryAtPath:tmpPath withIntermediateDirectories:YES attributes:nil error:nil]) return -3;
|
||||
|
||||
NSString *tmpAppPath = [tmpPath stringByAppendingPathComponent:appBundlePath.lastPathComponent];
|
||||
if (![[NSFileManager defaultManager] copyItemAtPath:appBundlePath toPath:tmpAppPath error:nil]) {
|
||||
[[NSFileManager defaultManager] removeItemAtPath:tmpPath error:nil];
|
||||
oneFailed = true;
|
||||
continue;
|
||||
}
|
||||
|
||||
NSLog(@"Copied %@ to %@", appBundlePath, tmpAppPath);
|
||||
|
||||
int signRet = signApp(tmpAppPath);
|
||||
NSLog(@"Signing %@ returned %d", tmpAppPath, signRet);
|
||||
|
||||
if (signRet == 0 || signRet == 182 || signRet == 184) { // Either 0 or non fatal error codes are fine
|
||||
[[NSFileManager defaultManager] removeItemAtPath:appBundlePath error:nil];
|
||||
[[NSFileManager defaultManager] moveItemAtPath:tmpAppPath toPath:appBundlePath error:nil];
|
||||
[[NSFileManager defaultManager] removeItemAtPath:tmpPath error:nil];
|
||||
}
|
||||
else {
|
||||
[[NSFileManager defaultManager] removeItemAtPath:tmpPath error:nil];
|
||||
oneFailed = true;
|
||||
continue;
|
||||
}
|
||||
|
||||
fixPermissionsOfAppBundle(appBundlePath);
|
||||
|
||||
NSString *containerPath = [appBundlePath stringByDeletingLastPathComponent];
|
||||
NSString *activeMarkerPath = [containerPath stringByAppendingPathComponent:TS_ACTIVE_MARKER];
|
||||
NSString *inactiveMarkerPath = [containerPath stringByAppendingPathComponent:TS_INACTIVE_MARKER];
|
||||
|
||||
NSData* emptyData = [NSData data];
|
||||
[emptyData writeToFile:activeMarkerPath options:0 error:nil];
|
||||
|
||||
[[NSFileManager defaultManager] removeItemAtPath:inactiveMarkerPath error:nil];
|
||||
|
||||
registerPath(appBundlePath, 0, !shouldRegisterAsUserByDefault());
|
||||
|
||||
NSLog(@"Transfered %@!", appBundlePath);
|
||||
}
|
||||
if (oneFailed) ret = -1;
|
||||
}
|
||||
#ifndef TROLLSTORE_LITE
|
||||
else if([cmd isEqualToString:@"install-trollstore"])
|
||||
{
|
||||
if(args.count < 2) return -3;
|
||||
|
@ -1516,19 +1689,6 @@ int MAIN_NAME(int argc, char *argv[], char *envp[])
|
|||
installLdid(ldidPath, ldidVersion);
|
||||
//}
|
||||
}
|
||||
else if([cmd isEqualToString:@"refresh"])
|
||||
{
|
||||
refreshAppRegistrations(YES);
|
||||
}
|
||||
else if([cmd isEqualToString:@"refresh-all"])
|
||||
{
|
||||
cleanRestrictions();
|
||||
//refreshAppRegistrations(NO); // <- fixes app permissions resetting, causes apps to move around on home screen, so I had to disable it
|
||||
[[NSFileManager defaultManager] removeItemAtPath:@"/var/containers/Shared/SystemGroup/systemgroup.com.apple.lsd.iconscache/Library/Caches/com.apple.IconsCache" error:nil];
|
||||
[[LSApplicationWorkspace defaultWorkspace] _LSPrivateRebuildApplicationDatabasesForSystemApps:YES internal:YES user:YES];
|
||||
refreshAppRegistrations(YES);
|
||||
killall(@"backboardd", YES);
|
||||
}
|
||||
else if([cmd isEqualToString:@"install-persistence-helper"])
|
||||
{
|
||||
if(args.count < 2) return -3;
|
||||
|
@ -1552,28 +1712,6 @@ int MAIN_NAME(int argc, char *argv[], char *envp[])
|
|||
NSString* userAppId = args.lastObject;
|
||||
registerUserPersistenceHelper(userAppId);
|
||||
}
|
||||
else if([cmd isEqualToString:@"modify-registration"])
|
||||
{
|
||||
if(args.count < 3) return -3;
|
||||
NSString* appPath = args[1];
|
||||
NSString* newRegistration = args[2];
|
||||
|
||||
NSString* trollStoreMark = [[appPath stringByDeletingLastPathComponent] stringByAppendingPathComponent:@"_TrollStore"];
|
||||
if([[NSFileManager defaultManager] fileExistsAtPath:trollStoreMark])
|
||||
{
|
||||
registerPath(appPath, NO, [newRegistration isEqualToString:@"System"]);
|
||||
}
|
||||
}
|
||||
else if([cmd isEqualToString:@"url-scheme"])
|
||||
{
|
||||
if(args.count < 2) return -3;
|
||||
NSString* modifyArg = args.lastObject;
|
||||
BOOL newState = [modifyArg isEqualToString:@"enable"];
|
||||
if(newState == YES || [modifyArg isEqualToString:@"disable"])
|
||||
{
|
||||
setTSURLSchemeState(newState, nil);
|
||||
}
|
||||
}
|
||||
else if([cmd isEqualToString:@"check-dev-mode"])
|
||||
{
|
||||
// switch the result, so 0 is enabled, and 1 is disabled/error
|
||||
|
@ -1584,18 +1722,7 @@ int MAIN_NAME(int argc, char *argv[], char *envp[])
|
|||
// assumes that checkDeveloperMode() has already been called
|
||||
ret = !armDeveloperMode(NULL);
|
||||
}
|
||||
else if([cmd isEqualToString:@"reboot"])
|
||||
{
|
||||
[[FBSSystemService sharedService] reboot];
|
||||
// Give the system some time to reboot
|
||||
sleep(1);
|
||||
}
|
||||
else if([cmd isEqualToString:@"enable-jit"])
|
||||
{
|
||||
if(args.count < 2) return -3;
|
||||
NSString* userAppId = args.lastObject;
|
||||
ret = enableJIT(userAppId);
|
||||
}
|
||||
#endif
|
||||
|
||||
NSLog(@"trollstorehelper returning %d", ret);
|
||||
return ret;
|
||||
|
|
|
@ -3,8 +3,28 @@
|
|||
|
||||
#define TrollStoreErrorDomain @"TrollStoreErrorDomain"
|
||||
|
||||
#define TS_MARKER @"_TrollStore"
|
||||
#define TS_LITE_MARKER @"_TrollStoreLite"
|
||||
#define TS_NAME @"TrollStore"
|
||||
#define TS_LITE_NAME @"Trollstore Lite"
|
||||
|
||||
#ifdef TROLLSTORE_LITE
|
||||
#define TS_ACTIVE_MARKER TS_LITE_MARKER
|
||||
#define TS_INACTIVE_MARKER TS_MARKER
|
||||
#define APP_ID @"com.opa334.TrollStoreLite"
|
||||
#define APP_NAME TS_LITE_NAME
|
||||
#define OTHER_APP_NAME TS_NAME
|
||||
#else
|
||||
#define TS_ACTIVE_MARKER TS_MARKER
|
||||
#define TS_INACTIVE_MARKER TS_LITE_MARKER
|
||||
#define APP_ID @"com.opa334.TrollStore"
|
||||
#define APP_NAME TS_NAME
|
||||
#define OTHER_APP_NAME TS_LITE_NAME
|
||||
#endif
|
||||
|
||||
extern void chineseWifiFixup(void);
|
||||
extern NSString *getExecutablePath(void);
|
||||
extern BOOL shouldRegisterAsUserByDefault(void);
|
||||
extern NSString* rootHelperPath(void);
|
||||
extern NSString* getNSStringFromFile(int fd);
|
||||
extern void printMultilineNSString(NSString* stringToPrint);
|
||||
|
@ -14,10 +34,11 @@ extern void respring(void);
|
|||
extern void fetchLatestTrollStoreVersion(void (^completionHandler)(NSString* latestVersion));
|
||||
extern void fetchLatestLdidVersion(void (^completionHandler)(NSString* latestVersion));
|
||||
|
||||
extern NSArray* trollStoreInstalledAppBundlePaths();
|
||||
extern NSArray* trollStoreInstalledAppContainerPaths();
|
||||
extern NSString* trollStorePath();
|
||||
extern NSString* trollStoreAppPath();
|
||||
extern NSArray* trollStoreInstalledAppBundlePaths(void);
|
||||
extern NSArray* trollStoreInactiveInstalledAppBundlePaths(void);
|
||||
extern NSArray* trollStoreInstalledAppContainerPaths(void);
|
||||
extern NSString* trollStorePath(void);
|
||||
extern NSString* trollStoreAppPath(void);
|
||||
|
||||
extern BOOL isRemovableSystemApp(NSString* appId);
|
||||
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
#import <spawn.h>
|
||||
#import <sys/sysctl.h>
|
||||
#import <mach-o/dyld.h>
|
||||
#import <libroot.h>
|
||||
|
||||
static EXPLOIT_TYPE gPlatformVulnerabilities;
|
||||
|
||||
|
@ -35,6 +36,25 @@ NSString *getExecutablePath(void)
|
|||
return [NSString stringWithUTF8String:selfPath];
|
||||
}
|
||||
|
||||
#ifdef TROLLSTORE_LITE
|
||||
|
||||
BOOL shouldRegisterAsUserByDefault(void)
|
||||
{
|
||||
if ([[NSFileManager defaultManager] fileExistsAtPath:JBROOT_PATH(@"/Library/MobileSubstrate/DynamicLibraries/AppSyncUnified-FrontBoard.dylib")]) {
|
||||
return YES;
|
||||
}
|
||||
return NO;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
BOOL shouldRegisterAsUserByDefault(void)
|
||||
{
|
||||
return NO;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef EMBEDDED_ROOT_HELPER
|
||||
NSString* rootHelperPath(void)
|
||||
{
|
||||
|
@ -315,7 +335,7 @@ void fetchLatestLdidVersion(void (^completionHandler)(NSString* latestVersion))
|
|||
github_fetchLatestVersion(@"opa334/ldid", completionHandler);
|
||||
}
|
||||
|
||||
NSArray* trollStoreInstalledAppContainerPaths()
|
||||
NSArray* trollStoreInstalledAppContainerPathsInternal(NSString *marker)
|
||||
{
|
||||
NSMutableArray* appContainerPaths = [NSMutableArray new];
|
||||
|
||||
|
@ -336,11 +356,12 @@ NSArray* trollStoreInstalledAppContainerPaths()
|
|||
BOOL exists = [[NSFileManager defaultManager] fileExistsAtPath:containerPath isDirectory:&isDirectory];
|
||||
if(exists && isDirectory)
|
||||
{
|
||||
NSString* trollStoreMark = [containerPath stringByAppendingPathComponent:@"_TrollStore"];
|
||||
NSString* trollStoreMark = [containerPath stringByAppendingPathComponent:marker];
|
||||
if([[NSFileManager defaultManager] fileExistsAtPath:trollStoreMark])
|
||||
{
|
||||
NSString* trollStoreApp = [containerPath stringByAppendingPathComponent:@"TrollStore.app"];
|
||||
if(![[NSFileManager defaultManager] fileExistsAtPath:trollStoreApp])
|
||||
NSString* trollStoreLiteApp = [containerPath stringByAppendingPathComponent:@"TrollStoreLite.app"];
|
||||
if(![[NSFileManager defaultManager] fileExistsAtPath:trollStoreApp] && ![[NSFileManager defaultManager] fileExistsAtPath:trollStoreLiteApp])
|
||||
{
|
||||
[appContainerPaths addObject:containerPath];
|
||||
}
|
||||
|
@ -351,10 +372,15 @@ NSArray* trollStoreInstalledAppContainerPaths()
|
|||
return appContainerPaths.copy;
|
||||
}
|
||||
|
||||
NSArray* trollStoreInstalledAppBundlePaths()
|
||||
NSArray *trollStoreInstalledAppContainerPaths(void)
|
||||
{
|
||||
return trollStoreInstalledAppContainerPathsInternal(TS_ACTIVE_MARKER);
|
||||
}
|
||||
|
||||
NSArray* trollStoreInstalledAppBundlePathsInternal(NSString *marker)
|
||||
{
|
||||
NSMutableArray* appPaths = [NSMutableArray new];
|
||||
for(NSString* containerPath in trollStoreInstalledAppContainerPaths())
|
||||
for(NSString* containerPath in trollStoreInstalledAppContainerPathsInternal(marker))
|
||||
{
|
||||
NSArray* items = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:containerPath error:nil];
|
||||
if(!items) return nil;
|
||||
|
@ -370,10 +396,20 @@ NSArray* trollStoreInstalledAppBundlePaths()
|
|||
return appPaths.copy;
|
||||
}
|
||||
|
||||
NSArray *trollStoreInstalledAppBundlePaths(void)
|
||||
{
|
||||
return trollStoreInstalledAppBundlePathsInternal(TS_ACTIVE_MARKER);
|
||||
}
|
||||
|
||||
NSArray *trollStoreInactiveInstalledAppBundlePaths(void)
|
||||
{
|
||||
return trollStoreInstalledAppBundlePathsInternal(TS_INACTIVE_MARKER);
|
||||
}
|
||||
|
||||
NSString* trollStorePath()
|
||||
{
|
||||
NSError* mcmError;
|
||||
MCMAppContainer* appContainer = [MCMAppContainer containerWithIdentifier:@"com.opa334.TrollStore" createIfNecessary:NO existed:NULL error:&mcmError];
|
||||
MCMAppContainer* appContainer = [MCMAppContainer containerWithIdentifier:APP_ID createIfNecessary:NO existed:NULL error:&mcmError];
|
||||
if(!appContainer) return nil;
|
||||
return appContainer.url.path;
|
||||
}
|
||||
|
|
|
@ -52,7 +52,7 @@
|
|||
<string>iPhoneOS</string>
|
||||
</array>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>2.0.15</string>
|
||||
<string>2.1</string>
|
||||
<key>LSRequiresIPhoneOS</key>
|
||||
<true/>
|
||||
<key>UIDeviceFamily</key>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
Package: com.opa334.trollstorehelper
|
||||
Name: TrollStore Helper
|
||||
Version: 2.0.15
|
||||
Version: 2.1
|
||||
Architecture: iphoneos-arm
|
||||
Description: Helper utility to install and manage TrollStore!
|
||||
Maintainer: opa334
|
||||
|
|
|
@ -50,7 +50,7 @@
|
|||
<string>iPhoneOS</string>
|
||||
</array>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>2.0.15</string>
|
||||
<string>2.1</string>
|
||||
<key>LSRequiresIPhoneOS</key>
|
||||
<true/>
|
||||
<key>UIDeviceFamily</key>
|
||||
|
|
|
@ -42,7 +42,7 @@ extern NSUserDefaults* trollStoreUserDefaults();
|
|||
errorDescription = @"Failed to create container for app bundle.";
|
||||
break;
|
||||
case 171:
|
||||
errorDescription = @"A non-TrollStore app with the same identifier is already installed. If you are absolutely sure it is not, you can force install it.";
|
||||
errorDescription = @"A non "APP_NAME@" or a "OTHER_APP_NAME@" app with the same identifier is already installed. If you are absolutely sure it is not, you can force install it.";
|
||||
break;
|
||||
case 172:
|
||||
errorDescription = @"The app does not contain an Info.plist file.";
|
||||
|
|
|
@ -130,6 +130,7 @@
|
|||
// or if it's the one from an old TrollStore version that's no longer supported
|
||||
- (void)handleLdidCheck
|
||||
{
|
||||
#ifndef TROLLSTORE_LITE
|
||||
//if (@available(iOS 16, *)) {} else {
|
||||
NSString* tsAppPath = [NSBundle mainBundle].bundlePath;
|
||||
|
||||
|
@ -141,6 +142,7 @@
|
|||
[TSInstallationController installLdid];
|
||||
}
|
||||
//}
|
||||
#endif
|
||||
}
|
||||
|
||||
- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
#import "TSSettingsAdvancedListController.h"
|
||||
#import "TSUtil.h"
|
||||
#import <Preferences/PSSpecifier.h>
|
||||
|
||||
extern NSUserDefaults* trollStoreUserDefaults();
|
||||
|
@ -39,7 +40,7 @@ extern NSUserDefaults* trollStoreUserDefaults();
|
|||
edit:nil];
|
||||
[installationMethodSegmentSpecifier setProperty:@YES forKey:@"enabled"];
|
||||
installationMethodSegmentSpecifier.identifier = @"installationMethodSegment";
|
||||
[installationMethodSegmentSpecifier setProperty:@"com.opa334.TrollStore" forKey:@"defaults"];
|
||||
[installationMethodSegmentSpecifier setProperty:APP_ID forKey:@"defaults"];
|
||||
[installationMethodSegmentSpecifier setProperty:@"installationMethod" forKey:@"key"];
|
||||
installationMethodSegmentSpecifier.values = @[@0, @1];
|
||||
installationMethodSegmentSpecifier.titleDictionary = @{@0 : @"installd", @1 : @"Custom"};
|
||||
|
@ -71,7 +72,7 @@ extern NSUserDefaults* trollStoreUserDefaults();
|
|||
edit:nil];
|
||||
[uninstallationMethodSegmentSpecifier setProperty:@YES forKey:@"enabled"];
|
||||
uninstallationMethodSegmentSpecifier.identifier = @"uninstallationMethodSegment";
|
||||
[uninstallationMethodSegmentSpecifier setProperty:@"com.opa334.TrollStore" forKey:@"defaults"];
|
||||
[uninstallationMethodSegmentSpecifier setProperty:APP_ID forKey:@"defaults"];
|
||||
[uninstallationMethodSegmentSpecifier setProperty:@"uninstallationMethod" forKey:@"key"];
|
||||
uninstallationMethodSegmentSpecifier.values = @[@0, @1];
|
||||
uninstallationMethodSegmentSpecifier.titleDictionary = @{@0 : @"installd", @1 : @"Custom"};
|
||||
|
|
|
@ -20,6 +20,7 @@ extern NSUserDefaults* trollStoreUserDefaults(void);
|
|||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reloadSpecifiers) name:UIApplicationWillEnterForegroundNotification object:nil];
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reloadSpecifiers) name:@"TrollStoreReloadSettingsNotification" object:nil];
|
||||
|
||||
#ifndef TROLLSTORE_LITE
|
||||
fetchLatestTrollStoreVersion(^(NSString* latestVersion)
|
||||
{
|
||||
NSString* currentVersion = [self getTrollStoreVersion];
|
||||
|
@ -64,6 +65,7 @@ extern NSUserDefaults* trollStoreUserDefaults(void);
|
|||
{
|
||||
_devModeEnabled = YES;
|
||||
}
|
||||
#endif
|
||||
[self reloadSpecifiers];
|
||||
}
|
||||
|
||||
|
@ -73,6 +75,7 @@ extern NSUserDefaults* trollStoreUserDefaults(void);
|
|||
{
|
||||
_specifiers = [NSMutableArray new];
|
||||
|
||||
#ifndef TROLLSTORE_LITE
|
||||
if(_newerVersion)
|
||||
{
|
||||
PSSpecifier* updateTrollStoreGroupSpecifier = [PSSpecifier emptyGroupSpecifier];
|
||||
|
@ -111,10 +114,23 @@ extern NSUserDefaults* trollStoreUserDefaults(void);
|
|||
enableDevModeSpecifier.buttonAction = @selector(enableDevModePressed);
|
||||
[_specifiers addObject:enableDevModeSpecifier];
|
||||
}
|
||||
#endif
|
||||
|
||||
PSSpecifier* utilitiesGroupSpecifier = [PSSpecifier emptyGroupSpecifier];
|
||||
utilitiesGroupSpecifier.name = @"Utilities";
|
||||
[utilitiesGroupSpecifier setProperty:@"If an app does not immediately appear after installation, respring here and it should appear afterwards." forKey:@"footerText"];
|
||||
|
||||
NSString *utilitiesDescription = @"";
|
||||
#ifdef TROLLSTORE_LITE
|
||||
if (shouldRegisterAsUserByDefault()) {
|
||||
utilitiesDescription = @"Apps will be registered as User by default since AppSync Unified is installed.\n\n";
|
||||
}
|
||||
else {
|
||||
utilitiesDescription = @"Apps will be registered as System by default since AppSync Unified is not installed. When apps loose their System registration and stop working, press \"Refresh App Registrations\" here to fix them.\n\n";
|
||||
}
|
||||
#endif
|
||||
utilitiesDescription = [utilitiesDescription stringByAppendingString:@"If an app does not immediately appear after installation, respring here and it should appear afterwards."];
|
||||
|
||||
[utilitiesGroupSpecifier setProperty:utilitiesDescription forKey:@"footerText"];
|
||||
[_specifiers addObject:utilitiesGroupSpecifier];
|
||||
|
||||
PSSpecifier* respringButtonSpecifier = [PSSpecifier preferenceSpecifierNamed:@"Respring"
|
||||
|
@ -130,6 +146,19 @@ extern NSUserDefaults* trollStoreUserDefaults(void);
|
|||
|
||||
[_specifiers addObject:respringButtonSpecifier];
|
||||
|
||||
PSSpecifier* refreshAppRegistrationsSpecifier = [PSSpecifier preferenceSpecifierNamed:@"Refresh App Registrations"
|
||||
target:self
|
||||
set:nil
|
||||
get:nil
|
||||
detail:nil
|
||||
cell:PSButtonCell
|
||||
edit:nil];
|
||||
refreshAppRegistrationsSpecifier.identifier = @"refreshAppRegistrations";
|
||||
[refreshAppRegistrationsSpecifier setProperty:@YES forKey:@"enabled"];
|
||||
refreshAppRegistrationsSpecifier.buttonAction = @selector(refreshAppRegistrationsPressed);
|
||||
|
||||
[_specifiers addObject:refreshAppRegistrationsSpecifier];
|
||||
|
||||
PSSpecifier* rebuildIconCacheSpecifier = [PSSpecifier preferenceSpecifierNamed:@"Rebuild Icon Cache"
|
||||
target:self
|
||||
set:nil
|
||||
|
@ -143,6 +172,23 @@ extern NSUserDefaults* trollStoreUserDefaults(void);
|
|||
|
||||
[_specifiers addObject:rebuildIconCacheSpecifier];
|
||||
|
||||
NSArray *inactiveBundlePaths = trollStoreInactiveInstalledAppBundlePaths();
|
||||
if (inactiveBundlePaths.count > 0) {
|
||||
PSSpecifier* transferAppsSpecifier = [PSSpecifier preferenceSpecifierNamed:[NSString stringWithFormat:@"Transfer %zu "OTHER_APP_NAME@" %@", inactiveBundlePaths.count, inactiveBundlePaths.count > 1 ? @"Apps" : @"App"]
|
||||
target:self
|
||||
set:nil
|
||||
get:nil
|
||||
detail:nil
|
||||
cell:PSButtonCell
|
||||
edit:nil];
|
||||
transferAppsSpecifier.identifier = @"transferApps";
|
||||
[transferAppsSpecifier setProperty:@YES forKey:@"enabled"];
|
||||
transferAppsSpecifier.buttonAction = @selector(transferAppsPressed);
|
||||
|
||||
[_specifiers addObject:transferAppsSpecifier];
|
||||
}
|
||||
|
||||
#ifndef TROLLSTORE_LITE
|
||||
//if (@available(iOS 16, *)) { } else {
|
||||
NSString* ldidPath = [NSBundle.mainBundle.bundlePath stringByAppendingPathComponent:@"ldid"];
|
||||
NSString* ldidVersionPath = [NSBundle.mainBundle.bundlePath stringByAppendingPathComponent:@"ldid.version"];
|
||||
|
@ -288,6 +334,7 @@ extern NSUserDefaults* trollStoreUserDefaults(void);
|
|||
[_specifiers addObject:_installPersistenceHelperSpecifier];
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
PSSpecifier* installationSettingsGroupSpecifier = [PSSpecifier emptyGroupSpecifier];
|
||||
installationSettingsGroupSpecifier.name = @"Security";
|
||||
|
@ -316,14 +363,14 @@ extern NSUserDefaults* trollStoreUserDefaults(void);
|
|||
installAlertConfigurationSpecifier.detailControllerClass = [PSListItemsController class];
|
||||
[installAlertConfigurationSpecifier setProperty:@"installationConfirmationValues" forKey:@"valuesDataSource"];
|
||||
[installAlertConfigurationSpecifier setProperty:@"installationConfirmationNames" forKey:@"titlesDataSource"];
|
||||
[installAlertConfigurationSpecifier setProperty:@"com.opa334.TrollStore" forKey:@"defaults"];
|
||||
[installAlertConfigurationSpecifier setProperty:APP_ID forKey:@"defaults"];
|
||||
[installAlertConfigurationSpecifier setProperty:@"installAlertConfiguration" forKey:@"key"];
|
||||
[installAlertConfigurationSpecifier setProperty:@0 forKey:@"default"];
|
||||
|
||||
[_specifiers addObject:installAlertConfigurationSpecifier];
|
||||
|
||||
PSSpecifier* otherGroupSpecifier = [PSSpecifier emptyGroupSpecifier];
|
||||
[otherGroupSpecifier setProperty:[NSString stringWithFormat:@"TrollStore %@\n\n© 2022-2024 Lars Fröder (opa334)\n\nTrollStore is NOT for piracy!\n\nCredits:\nGoogle TAG, @alfiecg_dev: CoreTrust bug\n@lunotech11, @SerenaKit, @tylinux, @TheRealClarity, @dhinakg, @khanhduytran0: Various contributions\n@ProcursusTeam: uicache, ldid\n@cstar_ow: uicache\n@saurik: ldid", [self getTrollStoreVersion]] forKey:@"footerText"];
|
||||
[otherGroupSpecifier setProperty:[NSString stringWithFormat:@"%@ %@\n\n© 2022-2024 Lars Fröder (opa334)\n\nTrollStore is NOT for piracy!\n\nCredits:\nGoogle TAG, @alfiecg_dev: CoreTrust bug\n@lunotech11, @SerenaKit, @tylinux, @TheRealClarity, @dhinakg, @khanhduytran0: Various contributions\n@ProcursusTeam: uicache, ldid\n@cstar_ow: uicache\n@saurik: ldid", APP_NAME, [self getTrollStoreVersion]] forKey:@"footerText"];
|
||||
[_specifiers addObject:otherGroupSpecifier];
|
||||
|
||||
PSSpecifier* advancedLinkSpecifier = [PSSpecifier preferenceSpecifierNamed:@"Advanced"
|
||||
|
@ -348,6 +395,7 @@ extern NSUserDefaults* trollStoreUserDefaults(void);
|
|||
[donateSpecifier setProperty:@YES forKey:@"enabled"];
|
||||
[_specifiers addObject:donateSpecifier];
|
||||
|
||||
#ifndef TROLLSTORE_LITE
|
||||
// Uninstall TrollStore
|
||||
PSSpecifier* uninstallTrollStoreSpecifier = [PSSpecifier preferenceSpecifierNamed:@"Uninstall TrollStore"
|
||||
target:self
|
||||
|
@ -361,7 +409,7 @@ extern NSUserDefaults* trollStoreUserDefaults(void);
|
|||
[uninstallTrollStoreSpecifier setProperty:NSClassFromString(@"PSDeleteButtonCell") forKey:@"cellClass"];
|
||||
uninstallTrollStoreSpecifier.buttonAction = @selector(uninstallTrollStorePressed);
|
||||
[_specifiers addObject:uninstallTrollStoreSpecifier];
|
||||
|
||||
#endif
|
||||
/*PSSpecifier* doTheDashSpecifier = [PSSpecifier preferenceSpecifierNamed:@"Do the Dash"
|
||||
target:self
|
||||
set:nil
|
||||
|
@ -439,7 +487,7 @@ extern NSUserDefaults* trollStoreUserDefaults(void);
|
|||
{
|
||||
if([[NSFileManager defaultManager] fileExistsAtPath:[@"/System/Library/AppSignatures" stringByAppendingPathComponent:appProxy.bundleIdentifier]])
|
||||
{
|
||||
NSURL* trollStoreMarkURL = [appProxy.bundleURL.URLByDeletingLastPathComponent URLByAppendingPathComponent:@"_TrollStore"];
|
||||
NSURL* trollStoreMarkURL = [appProxy.bundleURL.URLByDeletingLastPathComponent URLByAppendingPathComponent:TS_ACTIVE_MARKER];
|
||||
if(![trollStoreMarkURL checkResourceIsReachableAndReturnError:nil])
|
||||
{
|
||||
[appCandidates addObject:appProxy];
|
||||
|
@ -471,6 +519,52 @@ extern NSUserDefaults* trollStoreUserDefaults(void);
|
|||
[TSPresentationDelegate presentViewController:selectAppAlert animated:YES completion:nil];
|
||||
}
|
||||
|
||||
- (void)transferAppsPressed
|
||||
{
|
||||
UIAlertController *confirmationAlert = [UIAlertController alertControllerWithTitle:@"Transfer Apps" message:[NSString stringWithFormat:@"This option will transfer %zu apps from "OTHER_APP_NAME@" to "APP_NAME@". Continue?", trollStoreInactiveInstalledAppBundlePaths().count] preferredStyle:UIAlertControllerStyleAlert];
|
||||
|
||||
UIAlertAction* transferAction = [UIAlertAction actionWithTitle:@"Transfer" style:UIAlertActionStyleDefault handler:^(UIAlertAction* action)
|
||||
{
|
||||
[TSPresentationDelegate startActivity:@"Transfering"];
|
||||
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^
|
||||
{
|
||||
NSString *log;
|
||||
int transferRet = spawnRoot(rootHelperPath(), @[@"transfer-apps"], nil, &log);
|
||||
|
||||
dispatch_async(dispatch_get_main_queue(), ^
|
||||
{
|
||||
[TSPresentationDelegate stopActivityWithCompletion:^
|
||||
{
|
||||
[self reloadSpecifiers];
|
||||
|
||||
if (transferRet != 0) {
|
||||
NSArray *remainingApps = trollStoreInactiveInstalledAppBundlePaths();
|
||||
UIAlertController *errorAlert = [UIAlertController alertControllerWithTitle:@"Transfer Failed" message:[NSString stringWithFormat:@"Failed to transfer %zu %@", remainingApps.count, remainingApps.count > 1 ? @"apps" : @"app"] preferredStyle:UIAlertControllerStyleAlert];
|
||||
|
||||
UIAlertAction* copyLogAction = [UIAlertAction actionWithTitle:@"Copy Debug Log" style:UIAlertActionStyleDefault handler:^(UIAlertAction* action)
|
||||
{
|
||||
UIPasteboard* pasteboard = [UIPasteboard generalPasteboard];
|
||||
pasteboard.string = log;
|
||||
}];
|
||||
[errorAlert addAction:copyLogAction];
|
||||
|
||||
UIAlertAction* closeAction = [UIAlertAction actionWithTitle:@"Close" style:UIAlertActionStyleDefault handler:nil];
|
||||
[errorAlert addAction:closeAction];
|
||||
|
||||
[TSPresentationDelegate presentViewController:errorAlert animated:YES completion:nil];
|
||||
}
|
||||
}];
|
||||
});
|
||||
});
|
||||
}];
|
||||
[confirmationAlert addAction:transferAction];
|
||||
|
||||
UIAlertAction* cancelAction = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:nil];
|
||||
[confirmationAlert addAction:cancelAction];
|
||||
|
||||
[TSPresentationDelegate presentViewController:confirmationAlert animated:YES completion:nil];
|
||||
}
|
||||
|
||||
- (id)getURLSchemeEnabledForSpecifier:(PSSpecifier*)specifier
|
||||
{
|
||||
BOOL URLSchemeActive = (BOOL)[NSBundle.mainBundle objectForInfoDictionaryKey:@"CFBundleURLTypes"];
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
Package: com.opa334.trollstore
|
||||
Name: TrollStore
|
||||
Version: 2.0.15
|
||||
Version: 2.1
|
||||
Architecture: iphoneos-arm
|
||||
Description: An awesome application!
|
||||
Maintainer: opa334
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
NSUserDefaults* trollStoreUserDefaults(void)
|
||||
{
|
||||
return [[NSUserDefaults alloc] initWithSuiteName:[NSHomeDirectory() stringByAppendingPathComponent:@"Library/Preferences/com.opa334.TrollStore.plist"]];
|
||||
return [[NSUserDefaults alloc] initWithSuiteName:[NSHomeDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"Library/Preferences/%@.plist", APP_ID]]];
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
Resources/trollstorehelper
|
|
@ -0,0 +1,16 @@
|
|||
TARGET := iphone:clang:16.5:14.0
|
||||
INSTALL_TARGET_PROCESSES = TrollStoreLite
|
||||
ARCHS = arm64
|
||||
|
||||
include $(THEOS)/makefiles/common.mk
|
||||
|
||||
APPLICATION_NAME = TrollStoreLite
|
||||
|
||||
TrollStoreLite_FILES = $(wildcard ../TrollStore/*.m) $(wildcard ../Shared/*.m)
|
||||
TrollStoreLite_FRAMEWORKS = UIKit CoreGraphics CoreServices CoreTelephony
|
||||
TrollStoreLite_PRIVATE_FRAMEWORKS = Preferences MobileIcons MobileContainerManager
|
||||
TrollStoreLite_LIBRARIES = archive
|
||||
TrollStoreLite_CFLAGS = -fobjc-arc -I../Shared -I$(shell brew --prefix)/opt/libarchive/include -DTROLLSTORE_LITE
|
||||
TrollStoreLite_CODESIGN_FLAGS = -Sentitlements.plist
|
||||
|
||||
include $(THEOS_MAKE_PATH)/application.mk
|
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 4.0 KiB |
After Width: | Height: | Size: 6.7 KiB |
After Width: | Height: | Size: 2.4 KiB |
After Width: | Height: | Size: 5.4 KiB |
After Width: | Height: | Size: 9.1 KiB |
After Width: | Height: | Size: 3.3 KiB |
After Width: | Height: | Size: 7.0 KiB |
After Width: | Height: | Size: 3.5 KiB |
After Width: | Height: | Size: 8.5 KiB |
After Width: | Height: | Size: 9.3 KiB |
After Width: | Height: | Size: 3.8 KiB |
After Width: | Height: | Size: 9.1 KiB |
After Width: | Height: | Size: 17 KiB |
After Width: | Height: | Size: 4.5 KiB |
After Width: | Height: | Size: 12 KiB |
After Width: | Height: | Size: 5.6 KiB |
After Width: | Height: | Size: 13 KiB |
BIN
TrollStoreLite/Resources/Base.lproj/LaunchScreen.storyboardc/Kx4-55-vNS-view-9BB-B5-Vbi.nib
generated
Normal file
BIN
TrollStoreLite/Resources/Base.lproj/LaunchScreen.storyboardc/UITabBarController-9el-pn-lH0.nib
generated
Normal file
BIN
TrollStoreLite/Resources/Base.lproj/LaunchScreen.storyboardc/X3T-Aa-nEE-view-vAu-RC-m7d.nib
generated
Normal file
|
@ -0,0 +1,188 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>TrollStoreLite</string>
|
||||
<key>CFBundleDisplayName</key>
|
||||
<string>TrollStore Lite</string>
|
||||
<key>CFBundleIcons</key>
|
||||
<dict>
|
||||
<key>CFBundlePrimaryIcon</key>
|
||||
<dict>
|
||||
<key>CFBundleIconFiles</key>
|
||||
<array>
|
||||
<string>AppIcon29x29</string>
|
||||
<string>AppIcon40x40</string>
|
||||
<string>AppIcon57x57</string>
|
||||
<string>AppIcon60x60</string>
|
||||
</array>
|
||||
<key>UIPrerenderedIcon</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>CFBundleIcons~ipad</key>
|
||||
<dict>
|
||||
<key>CFBundlePrimaryIcon</key>
|
||||
<dict>
|
||||
<key>CFBundleIconFiles</key>
|
||||
<array>
|
||||
<string>AppIcon29x29</string>
|
||||
<string>AppIcon40x40</string>
|
||||
<string>AppIcon57x57</string>
|
||||
<string>AppIcon60x60</string>
|
||||
<string>AppIcon50x50</string>
|
||||
<string>AppIcon72x72</string>
|
||||
<string>AppIcon76x76</string>
|
||||
</array>
|
||||
<key>UIPrerenderedIcon</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>com.opa334.TrollStoreLite</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleSupportedPlatforms</key>
|
||||
<array>
|
||||
<string>iPhoneOS</string>
|
||||
</array>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>2.1</string>
|
||||
<key>LSRequiresIPhoneOS</key>
|
||||
<true/>
|
||||
<key>UIDeviceFamily</key>
|
||||
<array>
|
||||
<integer>1</integer>
|
||||
<integer>2</integer>
|
||||
</array>
|
||||
<key>UIRequiredDeviceCapabilities</key>
|
||||
<array>
|
||||
<string>armv7</string>
|
||||
</array>
|
||||
<key>UILaunchStoryboardName</key>
|
||||
<string>LaunchScreen</string>
|
||||
<key>UISupportedInterfaceOrientations</key>
|
||||
<array>
|
||||
<string>UIInterfaceOrientationPortrait</string>
|
||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||
</array>
|
||||
<key>UISupportedInterfaceOrientations~ipad</key>
|
||||
<array>
|
||||
<string>UIInterfaceOrientationPortrait</string>
|
||||
<string>UIInterfaceOrientationPortraitUpsideDown</string>
|
||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||
</array>
|
||||
<key>UIApplicationSceneManifest</key>
|
||||
<dict>
|
||||
<key>UIApplicationSupportsMultipleScenes</key>
|
||||
<false/>
|
||||
<key>UISceneConfigurations</key>
|
||||
<dict>
|
||||
<key>UIWindowSceneSessionRoleApplication</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>UISceneConfigurationName</key>
|
||||
<string>Default Configuration</string>
|
||||
<key>UISceneDelegateClassName</key>
|
||||
<string>TSSceneDelegate</string>
|
||||
</dict>
|
||||
</array>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>UTImportedTypeDeclarations</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>UTTypeConformsTo</key>
|
||||
<array>
|
||||
<string>public.data</string>
|
||||
</array>
|
||||
<key>UTTypeDescription</key>
|
||||
<string>iOS App</string>
|
||||
<key>UTTypeIconFiles</key>
|
||||
<array/>
|
||||
<key>UTTypeIdentifier</key>
|
||||
<string>com.apple.itunes.ipa</string>
|
||||
<key>UTTypeTagSpecification</key>
|
||||
<dict>
|
||||
<key>public.filename-extension</key>
|
||||
<array>
|
||||
<string>ipa</string>
|
||||
</array>
|
||||
<key>public.mime-type</key>
|
||||
<array/>
|
||||
</dict>
|
||||
</dict>
|
||||
</array>
|
||||
<key>CFBundleDocumentTypes</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>CFBundleTypeName</key>
|
||||
<string>iOS App</string>
|
||||
<key>LSHandlerRank</key>
|
||||
<string>Default</string>
|
||||
<key>LSItemContentTypes</key>
|
||||
<array>
|
||||
<string>com.apple.itunes.ipa</string>
|
||||
</array>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>CFBundleTypeName</key>
|
||||
<string>AirDrop friendly iOS app</string>
|
||||
<key>CFBundleTypeRole</key>
|
||||
<string>Viewer</string>
|
||||
<key>LSHandlerRank</key>
|
||||
<string>Owner</string>
|
||||
<key>LSItemContentTypes</key>
|
||||
<array>
|
||||
<string>com.opa334.trollstore.tipa</string>
|
||||
</array>
|
||||
</dict>
|
||||
</array>
|
||||
<key>UTExportedTypeDeclarations</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>UTTypeIdentifier</key>
|
||||
<string>com.opa334.trollstore.tipa</string>
|
||||
<key>UTTypeDescription</key>
|
||||
<string>AirDrop friendly iOS app</string>
|
||||
<key>UTTypeConformsTo</key>
|
||||
<array>
|
||||
<string>public.data</string>
|
||||
</array>
|
||||
<key>UTTypeTagSpecification</key>
|
||||
<dict>
|
||||
<key>public.filename-extension</key>
|
||||
<array>
|
||||
<string>tipa</string>
|
||||
</array>
|
||||
<key>public.mime-type</key>
|
||||
<string>application/trollstore-ipa</string>
|
||||
</dict>
|
||||
</dict>
|
||||
</array>
|
||||
<key>CFBundleURLTypes</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>CFBundleURLName</key>
|
||||
<string>com.apple.Magnifier</string>
|
||||
<key>CFBundleURLSchemes</key>
|
||||
<array>
|
||||
<string>apple-magnifier</string>
|
||||
</array>
|
||||
</dict>
|
||||
</array>
|
||||
<key>LSSupportsOpeningDocumentsInPlace</key>
|
||||
<false/>
|
||||
<key>TSRootBinaries</key>
|
||||
<array>
|
||||
<string>trollstorehelper</string>
|
||||
</array>
|
||||
</dict>
|
||||
</plist>
|
|
@ -0,0 +1,9 @@
|
|||
Package: com.opa334.trollstorelite
|
||||
Name: TrollStore Lite
|
||||
Version: 2.1
|
||||
Architecture: iphoneos-arm
|
||||
Description: TrollStore for jailbroken iOS
|
||||
Depends: ldid
|
||||
Maintainer: opa334
|
||||
Author: opa334
|
||||
Section: Applications
|
|
@ -0,0 +1,45 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>application-identifier</key>
|
||||
<string>com.opa334.TrollStore</string>
|
||||
<key>platform-application</key>
|
||||
<true/>
|
||||
<key>com.apple.security.exception.files.absolute-path.read-write</key>
|
||||
<array>
|
||||
<string>/</string>
|
||||
</array>
|
||||
<key>com.apple.security.exception.iokit-user-client-class</key>
|
||||
<array>
|
||||
<string>AGXDeviceUserClient</string>
|
||||
<string>IOSurfaceRootUserClient</string>
|
||||
</array>
|
||||
<key>com.apple.private.security.no-sandbox</key>
|
||||
<true/>
|
||||
<key>com.apple.private.persona-mgmt</key>
|
||||
<true/>
|
||||
<key>com.apple.private.security.container-manager</key>
|
||||
<true/>
|
||||
<key>com.apple.private.coreservices.canmaplsdatabase</key>
|
||||
<true/>
|
||||
<key>com.apple.lsapplicationworkspace.rebuildappdatabases</key>
|
||||
<true/>
|
||||
<key>com.apple.private.MobileContainerManager.allowed</key>
|
||||
<true/>
|
||||
<key>com.apple.private.MobileInstallationHelperService.InstallDaemonOpsEnabled</key>
|
||||
<true/>
|
||||
<key>com.apple.private.MobileInstallationHelperService.allowed</key>
|
||||
<true/>
|
||||
<key>com.apple.private.uninstall.deletion</key>
|
||||
<true/>
|
||||
<key>com.apple.private.security.storage.MobileDocuments</key>
|
||||
<true/>
|
||||
<key>com.apple.CommCenter.fine-grained</key>
|
||||
<array>
|
||||
<string>data-allowed-write</string>
|
||||
</array>
|
||||
<key>com.apple.springboard.opensensitiveurl</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|