From 030ab8fd583c01ee3fc048fa158002ce798742aa Mon Sep 17 00:00:00 2001 From: opa334 Date: Thu, 1 Dec 2022 00:37:01 +0100 Subject: [PATCH] 1.4.5b2 --- RootHelper/main.m | 1 + Shared/CoreServices.h | 8 +++ Shared/TSUtil.m | 78 ++++++++++++++++++++++----- TrollStore/TSAppInfo.m | 1 - TrollStore/TSAppTableViewController.h | 3 +- TrollStore/TSAppTableViewController.m | 16 ++++++ TrollStore/TSInstallationController.m | 10 ++-- 7 files changed, 97 insertions(+), 20 deletions(-) diff --git a/RootHelper/main.m b/RootHelper/main.m index 280319b..37e7a40 100644 --- a/RootHelper/main.m +++ b/RootHelper/main.m @@ -1163,6 +1163,7 @@ int MAIN_NAME(int argc, char *argv[], char *envp[]) { cleanRestrictions(); refreshAppRegistrations(NO); // <- fix app permissions resetting + sleep(5); // <- fix app permission fix causing apps to move on home screen (?) [[LSApplicationWorkspace defaultWorkspace] _LSPrivateRebuildApplicationDatabasesForSystemApps:YES internal:YES user:YES]; refreshAppRegistrations(YES); killall(@"backboardd", YES); diff --git a/Shared/CoreServices.h b/Shared/CoreServices.h index 4a21547..b24dd1f 100644 --- a/Shared/CoreServices.h +++ b/Shared/CoreServices.h @@ -31,6 +31,14 @@ extern NSString *LSInstallTypeKey; - (void)enumerateApplicationsOfType:(NSUInteger)type block:(void (^)(LSApplicationProxy*))block; - (BOOL)installApplication:(NSURL*)appPackageURL withOptions:(NSDictionary*)options error:(NSError**)error; - (BOOL)uninstallApplication:(NSString*)appId withOptions:(NSDictionary*)options; +- (void)addObserver:(id)arg1; +- (void)removeObserver:(id)arg1; +@end + +@protocol LSApplicationWorkspaceObserverProtocol +@optional +-(void)applicationsDidInstall:(id)arg1; +-(void)applicationsDidUninstall:(id)arg1; @end @interface LSEnumerator : NSEnumerator diff --git a/Shared/TSUtil.m b/Shared/TSUtil.m index 8bdfe02..5c38262 100644 --- a/Shared/TSUtil.m +++ b/Shared/TSUtil.m @@ -54,14 +54,21 @@ NSString* rootHelperPath(void) } #endif +int fd_is_valid(int fd) +{ + return fcntl(fd, F_GETFD) != -1 || errno != EBADF; +} + NSString* getNSStringFromFile(int fd) { NSMutableString* ms = [NSMutableString new]; ssize_t num_read; char c; + if(!fd_is_valid(fd)) return @""; while((num_read = read(fd, &c, sizeof(c)))) { [ms appendString:[NSString stringWithFormat:@"%c", c]]; + if(c == '\n') break; } return ms.copy; } @@ -79,7 +86,7 @@ void printMultilineNSString(NSString* stringToPrint) int spawnRoot(NSString* path, NSArray* args, NSString** stdOut, NSString** stdErr) { NSMutableArray* argsM = args.mutableCopy ?: [NSMutableArray new]; - [argsM insertObject:path.lastPathComponent atIndex:0]; + [argsM insertObject:path atIndex:0]; NSUInteger argCount = [argsM count]; char **argsC = (char **)malloc((argCount + 1) * sizeof(char*)); @@ -132,6 +139,41 @@ int spawnRoot(NSString* path, NSArray* args, NSString** stdOut, NSString** stdEr return spawnError; } + __block volatile BOOL _isRunning = YES; + NSMutableString* outString = [NSMutableString new]; + NSMutableString* errString = [NSMutableString new]; + dispatch_semaphore_t sema = 0; + dispatch_queue_t logQueue; + if(stdOut || stdErr) + { + logQueue = dispatch_queue_create("com.opa334.TrollStore.LogCollector", NULL); + sema = dispatch_semaphore_create(0); + + int outPipe = out[0]; + int outErrPipe = outErr[0]; + + __block BOOL outEnabled = (BOOL)stdOut; + __block BOOL errEnabled = (BOOL)stdErr; + dispatch_async(logQueue, ^ + { + while(_isRunning) + { + @autoreleasepool + { + if(outEnabled) + { + [outString appendString:getNSStringFromFile(outPipe)]; + } + if(errEnabled) + { + [errString appendString:getNSStringFromFile(outErrPipe)]; + } + } + } + dispatch_semaphore_signal(sema); + }); + } + do { if (waitpid(task_pid, &status, 0) != -1) { @@ -139,24 +181,36 @@ int spawnRoot(NSString* path, NSArray* args, NSString** stdOut, NSString** stdEr } else { perror("waitpid"); + _isRunning = NO; return -222; } } while (!WIFEXITED(status) && !WIFSIGNALED(status)); - if(stdOut) + _isRunning = NO; + if(stdOut || stdErr) { - close(out[1]); - NSString* output = getNSStringFromFile(out[0]); - *stdOut = output; + if(stdOut) + { + close(out[1]); + } + if(stdErr) + { + close(outErr[1]); + } + + // wait for logging queue to finish + dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER); + + if(stdOut) + { + *stdOut = outString.copy; + } + if(stdErr) + { + *stdErr = errString.copy; + } } - if(stdErr) - { - close(outErr[1]); - NSString* errorOutput = getNSStringFromFile(outErr[0]); - *stdErr = errorOutput; - } - return WEXITSTATUS(status); } diff --git a/TrollStore/TSAppInfo.m b/TrollStore/TSAppInfo.m index b8867b5..4a2f9ff 100644 --- a/TrollStore/TSAppInfo.m +++ b/TrollStore/TSAppInfo.m @@ -362,7 +362,6 @@ extern UIImage* imageWithSize(UIImage* image, CGSize size); { [self closeArchive]; } - NSLog(@"open"); _archive = archive_read_new(); archive_read_support_format_all(_archive); archive_read_support_filter_all(_archive); diff --git a/TrollStore/TSAppTableViewController.h b/TrollStore/TSAppTableViewController.h index 16d3e65..09ff0f3 100644 --- a/TrollStore/TSAppTableViewController.h +++ b/TrollStore/TSAppTableViewController.h @@ -1,7 +1,8 @@ #import #import "TSAppInfo.h" +#import -@interface TSAppTableViewController : UITableViewController +@interface TSAppTableViewController : UITableViewController { UIImage* _placeholderIcon; NSArray* _cachedAppInfos; diff --git a/TrollStore/TSAppTableViewController.m b/TrollStore/TSAppTableViewController.m index 368be5f..b77377c 100644 --- a/TrollStore/TSAppTableViewController.m +++ b/TrollStore/TSAppTableViewController.m @@ -79,10 +79,16 @@ UIImage* imageWithSize(UIImage* image, CGSize size) [self loadAppInfos]; _placeholderIcon = [UIImage _applicationIconImageForBundleIdentifier:@"com.apple.WebSheet" format:iconFormatToUse() scale:[UIScreen mainScreen].scale]; _cachedIcons = [NSMutableDictionary new]; + [[LSApplicationWorkspace defaultWorkspace] addObserver:self]; } return self; } +- (void)dealloc +{ + [[LSApplicationWorkspace defaultWorkspace] removeObserver:self]; +} + - (void)reloadTable { [self loadAppInfos]; @@ -467,4 +473,14 @@ UIImage* imageWithSize(UIImage* image, CGSize size) [TSPresentationDelegate presentViewController:appSelectAlert animated:YES completion:nil]; } +- (void)applicationsDidInstall:(id)arg1 +{ + [self reloadTable]; +} + +- (void)applicationsDidUninstall:(id)arg1 +{ + [self reloadTable]; +} + @end \ No newline at end of file diff --git a/TrollStore/TSInstallationController.m b/TrollStore/TSInstallationController.m index fd02b6d..9fedb61 100644 --- a/TrollStore/TSInstallationController.m +++ b/TrollStore/TSInstallationController.m @@ -17,8 +17,8 @@ extern NSUserDefaults* trollStoreUserDefaults(void); dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^ { // Install IPA - //NSString* log; - int ret = [[TSApplicationsManager sharedInstance] installIpa:pathToIPA force:force log:nil]; + NSString* log; + int ret = [[TSApplicationsManager sharedInstance] installIpa:pathToIPA force:force log:&log]; NSError* error; if(ret != 0) @@ -54,12 +54,12 @@ extern NSUserDefaults* trollStoreUserDefaults(void); } else { - /*UIAlertAction* copyLogAction = [UIAlertAction actionWithTitle:@"Copy Log" style:UIAlertActionStyleDefault handler:^(UIAlertAction* action) + UIAlertAction* copyLogAction = [UIAlertAction actionWithTitle:@"Copy Debug Log" style:UIAlertActionStyleDefault handler:^(UIAlertAction* action) { UIPasteboard* pasteboard = [UIPasteboard generalPasteboard]; pasteboard.string = log; }]; - [errorAlert addAction:copyLogAction];*/ + [errorAlert addAction:copyLogAction]; } [TSPresentationDelegate presentViewController:errorAlert animated:YES completion:nil]; @@ -187,6 +187,4 @@ extern NSUserDefaults* trollStoreUserDefaults(void); }); } -//+ (void)showInstallAppAlertForFile:(NSString*)pathToIPA - @end \ No newline at end of file