mirror of
https://github.com/opa334/TrollStore.git
synced 2026-07-02 03:00:39 +08:00
Readd ldid for use on iOS 14
This commit is contained in:
+191
-1
@@ -240,6 +240,105 @@ void setTSURLSchemeState(BOOL newState, NSString* customAppPath)
|
||||
}
|
||||
}
|
||||
|
||||
void installLdid(NSString* ldidToCopyPath, NSString* ldidVersion)
|
||||
{
|
||||
if(![[NSFileManager defaultManager] fileExistsAtPath:ldidToCopyPath]) return;
|
||||
|
||||
NSString* ldidPath = [trollStoreAppPath() stringByAppendingPathComponent:@"ldid"];
|
||||
NSString* ldidVersionPath = [trollStoreAppPath() stringByAppendingPathComponent:@"ldid.version"];
|
||||
|
||||
if([[NSFileManager defaultManager] fileExistsAtPath:ldidPath])
|
||||
{
|
||||
[[NSFileManager defaultManager] removeItemAtPath:ldidPath error:nil];
|
||||
}
|
||||
|
||||
[[NSFileManager defaultManager] copyItemAtPath:ldidToCopyPath toPath:ldidPath error:nil];
|
||||
|
||||
NSData* ldidVersionData = [ldidVersion dataUsingEncoding:NSUTF8StringEncoding];
|
||||
[ldidVersionData writeToFile:ldidVersionPath atomically:YES];
|
||||
|
||||
chmod(ldidPath.fileSystemRepresentation, 0755);
|
||||
chmod(ldidVersionPath.fileSystemRepresentation, 0644);
|
||||
}
|
||||
|
||||
BOOL isLdidInstalled(void)
|
||||
{
|
||||
NSString* ldidPath = [trollStoreAppPath() stringByAppendingPathComponent:@"ldid"];
|
||||
return [[NSFileManager defaultManager] fileExistsAtPath:ldidPath];
|
||||
}
|
||||
|
||||
int runLdid(NSArray* args, NSString** output, NSString** errorOutput)
|
||||
{
|
||||
NSString* ldidPath = [trollStoreAppPath() stringByAppendingPathComponent:@"ldid"];
|
||||
NSMutableArray* argsM = args.mutableCopy ?: [NSMutableArray new];
|
||||
[argsM insertObject:ldidPath.lastPathComponent atIndex:0];
|
||||
|
||||
NSUInteger argCount = [argsM count];
|
||||
char **argsC = (char **)malloc((argCount + 1) * sizeof(char*));
|
||||
|
||||
for (NSUInteger i = 0; i < argCount; i++)
|
||||
{
|
||||
argsC[i] = strdup([[argsM objectAtIndex:i] UTF8String]);
|
||||
}
|
||||
argsC[argCount] = NULL;
|
||||
|
||||
posix_spawn_file_actions_t action;
|
||||
posix_spawn_file_actions_init(&action);
|
||||
|
||||
int outErr[2];
|
||||
pipe(outErr);
|
||||
posix_spawn_file_actions_adddup2(&action, outErr[1], STDERR_FILENO);
|
||||
posix_spawn_file_actions_addclose(&action, outErr[0]);
|
||||
|
||||
int out[2];
|
||||
pipe(out);
|
||||
posix_spawn_file_actions_adddup2(&action, out[1], STDOUT_FILENO);
|
||||
posix_spawn_file_actions_addclose(&action, out[0]);
|
||||
|
||||
pid_t task_pid;
|
||||
int status = -200;
|
||||
int spawnError = posix_spawn(&task_pid, [ldidPath fileSystemRepresentation], &action, NULL, (char* const*)argsC, NULL);
|
||||
for (NSUInteger i = 0; i < argCount; i++)
|
||||
{
|
||||
free(argsC[i]);
|
||||
}
|
||||
free(argsC);
|
||||
|
||||
if(spawnError != 0)
|
||||
{
|
||||
NSLog(@"posix_spawn error %d\n", spawnError);
|
||||
return spawnError;
|
||||
}
|
||||
|
||||
do
|
||||
{
|
||||
if (waitpid(task_pid, &status, 0) != -1) {
|
||||
//printf("Child status %dn", WEXITSTATUS(status));
|
||||
} else
|
||||
{
|
||||
perror("waitpid");
|
||||
return -222;
|
||||
}
|
||||
} while (!WIFEXITED(status) && !WIFSIGNALED(status));
|
||||
|
||||
close(outErr[1]);
|
||||
close(out[1]);
|
||||
|
||||
NSString* ldidOutput = getNSStringFromFile(out[0]);
|
||||
if(output)
|
||||
{
|
||||
*output = ldidOutput;
|
||||
}
|
||||
|
||||
NSString* ldidErrorOutput = getNSStringFromFile(outErr[0]);
|
||||
if(errorOutput)
|
||||
{
|
||||
*errorOutput = ldidErrorOutput;
|
||||
}
|
||||
|
||||
return WEXITSTATUS(status);
|
||||
}
|
||||
|
||||
BOOL certificateHasDataForExtensionOID(SecCertificateRef certificate, CFStringRef oidString)
|
||||
{
|
||||
if(certificate == NULL || oidString == NULL)
|
||||
@@ -377,6 +476,52 @@ int signApp(NSString* appPath)
|
||||
return -1;
|
||||
}
|
||||
#else
|
||||
int signAdhoc(NSString *filePath, NSDictionary *entitlements)
|
||||
{
|
||||
if (@available(iOS 15, *)) {
|
||||
return codesign_sign_adhoc(filePath.fileSystemRepresentation, true, entitlements);
|
||||
}
|
||||
// If iOS 14 is so great, how come there is no iOS 14 2?????
|
||||
else {
|
||||
if(!isLdidInstalled()) return 173;
|
||||
|
||||
NSString *entitlementsPath = nil;
|
||||
NSString *signArg = @"-s";
|
||||
NSString* errorOutput;
|
||||
if(entitlements)
|
||||
{
|
||||
NSData *entitlementsXML = [NSPropertyListSerialization dataWithPropertyList:entitlements format:NSPropertyListXMLFormat_v1_0 options:0 error:nil];
|
||||
if (entitlementsXML) {
|
||||
entitlementsPath = [[NSTemporaryDirectory() stringByAppendingPathComponent:[NSUUID UUID].UUIDString] stringByAppendingPathExtension:@"plist"];
|
||||
[entitlementsXML writeToFile:entitlementsPath atomically:NO];
|
||||
signArg = [@"-S" stringByAppendingString:entitlementsPath];
|
||||
}
|
||||
|
||||
}
|
||||
int ldidRet = runLdid(@[signArg, filePath], nil, &errorOutput);
|
||||
if (entitlementsPath) {
|
||||
[[NSFileManager defaultManager] removeItemAtPath:entitlementsPath error:nil];
|
||||
}
|
||||
|
||||
NSLog(@"ldid exited with status %d", ldidRet);
|
||||
|
||||
NSLog(@"- ldid error output start -");
|
||||
|
||||
printMultilineNSString(errorOutput);
|
||||
|
||||
NSLog(@"- ldid error output end -");
|
||||
|
||||
if(ldidRet == 0)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
return 175;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int signApp(NSString* appPath)
|
||||
{
|
||||
NSDictionary* appInfoDict = infoDictionaryForAppPath(appPath);
|
||||
@@ -460,7 +605,7 @@ int signApp(NSString* appPath)
|
||||
}
|
||||
|
||||
// First attempt ad hoc signing
|
||||
int r = codesign_sign_adhoc(tmpPath.fileSystemRepresentation, true, entitlementsToUse);
|
||||
int r = signAdhoc(tmpPath, entitlementsToUse);
|
||||
if (r != 0) {
|
||||
NSLog(@"[%@] Adhoc signing failed with error code %d, continuing anyways...\n", filePath, r);
|
||||
}
|
||||
@@ -545,6 +690,7 @@ void applyPatchesToInfoDictionary(NSString* appPath)
|
||||
// 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
|
||||
// 173: app is not signed and cannot be signed because ldid not installed or didn't work
|
||||
// 174:
|
||||
int installApp(NSString* appPackagePath, BOOL sign, BOOL force, BOOL isTSUpdate, BOOL useInstalldMethod)
|
||||
{
|
||||
@@ -892,6 +1038,41 @@ int installTrollStore(NSString* pathToTar)
|
||||
NSString* tmpTrollStorePath = [tmpPayloadPath stringByAppendingPathComponent:@"TrollStore.app"];
|
||||
if(![[NSFileManager defaultManager] fileExistsAtPath:tmpTrollStorePath]) return 1;
|
||||
|
||||
if (@available(iOS 15, *)) {} else {
|
||||
// Transfer existing ldid installation if it exists
|
||||
// But only if the to-be-installed version of TrollStore is 1.5.0 or above
|
||||
// This is to make it possible to downgrade to older versions still
|
||||
|
||||
NSString* toInstallInfoPlistPath = [tmpTrollStorePath stringByAppendingPathComponent:@"Info.plist"];
|
||||
if(![[NSFileManager defaultManager] fileExistsAtPath:toInstallInfoPlistPath]) return 1;
|
||||
|
||||
NSDictionary* toInstallInfoDict = [NSDictionary dictionaryWithContentsOfFile:toInstallInfoPlistPath];
|
||||
NSString* toInstallVersion = toInstallInfoDict[@"CFBundleVersion"];
|
||||
|
||||
NSComparisonResult result = [@"1.5.0" compare:toInstallVersion options:NSNumericSearch];
|
||||
if(result != NSOrderedDescending)
|
||||
{
|
||||
NSString* existingLdidPath = [trollStoreAppPath() stringByAppendingPathComponent:@"ldid"];
|
||||
NSString* existingLdidVersionPath = [trollStoreAppPath() stringByAppendingPathComponent:@"ldid.version"];
|
||||
if([[NSFileManager defaultManager] fileExistsAtPath:existingLdidPath])
|
||||
{
|
||||
NSString* tmpLdidPath = [tmpTrollStorePath stringByAppendingPathComponent:@"ldid"];
|
||||
if(![[NSFileManager defaultManager] fileExistsAtPath:tmpLdidPath])
|
||||
{
|
||||
[[NSFileManager defaultManager] copyItemAtPath:existingLdidPath toPath:tmpLdidPath error:nil];
|
||||
}
|
||||
}
|
||||
if([[NSFileManager defaultManager] fileExistsAtPath:existingLdidVersionPath])
|
||||
{
|
||||
NSString* tmpLdidVersionPath = [tmpTrollStorePath stringByAppendingPathComponent:@"ldid.version"];
|
||||
if(![[NSFileManager defaultManager] fileExistsAtPath:tmpLdidVersionPath])
|
||||
{
|
||||
[[NSFileManager defaultManager] copyItemAtPath:existingLdidVersionPath toPath:tmpLdidVersionPath error:nil];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Merge existing URL scheme settings value
|
||||
if(!getTSURLSchemeState(nil))
|
||||
{
|
||||
@@ -1171,6 +1352,15 @@ int MAIN_NAME(int argc, char *argv[], char *envp[])
|
||||
}
|
||||
uninstallTrollStore(YES);
|
||||
}
|
||||
else if([cmd isEqualToString:@"install-ldid"])
|
||||
{
|
||||
if (@available(iOS 15, *)) {} else {
|
||||
if(args.count < 3) return -3;
|
||||
NSString* ldidPath = args[1];
|
||||
NSString* ldidVersion = args[2];
|
||||
installLdid(ldidPath, ldidVersion);
|
||||
}
|
||||
}
|
||||
else if([cmd isEqualToString:@"refresh"])
|
||||
{
|
||||
refreshAppRegistrations(YES);
|
||||
|
||||
Reference in New Issue
Block a user