diff options
-rwxr-xr-x | configure | 6 | ||||
-rw-r--r-- | darwin-bootstrap/safemode-ui-hook.m | 32 | ||||
-rw-r--r-- | darwin-bootstrap/substituted.m | 10 | ||||
-rwxr-xr-x | script/gen-deb.sh | 3 |
4 files changed, 41 insertions, 10 deletions
@@ -199,15 +199,15 @@ if settings.enable_ios_bootstrap: override_ldflags=['-framework', 'UIKit', '-framework', 'Foundation', '-dead_strip']+settings.host.ldflags, ), 'exec', - '(out)/safety-dance/SafetyDance.app/SafetyDance', + '(out)/SafetyDance.app/SafetyDance', [ '(src)/darwin-bootstrap/safety-dance/AutoGrid.m', '(src)/darwin-bootstrap/safety-dance/main.m', ] ) - emitter.add_command(settings, ['(out)/safety-dance/SafetyDance.app/Info.plist'], ['(src)/darwin-bootstrap/safety-dance/Info.plist'], ['plutil -convert binary1 -o (outs[0]) (ins[0])']) + emitter.add_command(settings, ['(out)/SafetyDance.app/Info.plist'], ['(src)/darwin-bootstrap/safety-dance/Info.plist'], ['plutil -convert binary1 -o (outs[0]) (ins[0])']) for out in ['Default.png', 'Default@2x.png']: - emitter.add_command(settings, ['(out)/safety-dance/SafetyDance.app/'+out], ['(src)/darwin-bootstrap/safety-dance/white.png'], ['cp (ins[0]) (outs[0])']) + emitter.add_command(settings, ['(out)/SafetyDance.app/'+out], ['(src)/darwin-bootstrap/safety-dance/white.png'], ['cp (ins[0]) (outs[0])']) emitter.add_command(settings, ['safety-dance'], list(filter(lambda out: '/safety-dance/' in out, emitter.all_outs)), [], phony=True) ls = ['(out)/libsubstitute.dylib'] diff --git a/darwin-bootstrap/safemode-ui-hook.m b/darwin-bootstrap/safemode-ui-hook.m index f762c6d..8fe228f 100644 --- a/darwin-bootstrap/safemode-ui-hook.m +++ b/darwin-bootstrap/safemode-ui-hook.m @@ -12,6 +12,7 @@ static bool g_did_exit_safety_dance; @interface _SBApplicationController - (id)applicationWithBundleIdentifier:(NSString *)identifier; ++ (instancetype)sharedInstanceIfExists; @end @interface _SBSetupManager @@ -26,21 +27,40 @@ static bool g_did_exit_safety_dance; static id (*old_setupApplication)(id, SEL); static id my_setupApplication(id self, SEL sel) { - if (g_did_say_in_setup_mode) - return [self applicationWithBundleIdentifier:@"com.ex.SafetyDance"]; + if (g_did_say_in_setup_mode) { + id app = [self applicationWithBundleIdentifier:@"com.ex.SafetyDance"]; + if (app) { + /* definitely shouldn't be nil, given below check, but... */ + return app; + } + } return old_setupApplication(self, sel); } static bool (*old_updateInSetupMode)(id, SEL); static bool my_updateInSetupMode(id self, SEL sel) { - if (g_did_exit_safety_dance) { - g_did_say_in_setup_mode = false; - return old_updateInSetupMode(self, sel); - } else { + bool should_say = !g_did_exit_safety_dance; + if (should_say) { + _SBApplicationController *controller = + [objc_getClass("SBApplicationController") sharedInstanceIfExists]; + if (!controller) { + NSLog(@"substitute safe mode: SBApplicationController missing..."); + should_say = false; + } else if (![controller + applicationWithBundleIdentifier:@"com.ex.SafetyDance"]) { + NSLog(@"substitute safe mode: SafetyDance app missing or unregistered"); + should_say = false; + } + } + + if (should_say) { /* take priority over real setup */ g_did_say_in_setup_mode = true; [self _setInSetupMode:true]; return true; + } else { + g_did_say_in_setup_mode = false; + return old_updateInSetupMode(self, sel); } } diff --git a/darwin-bootstrap/substituted.m b/darwin-bootstrap/substituted.m index 43654c2..2c3217b 100644 --- a/darwin-bootstrap/substituted.m +++ b/darwin-bootstrap/substituted.m @@ -77,6 +77,12 @@ enum convert_filters_ret { - (enum convert_filters_ret) convertFiltersForBundleInfo:(NSDictionary *)plist_dict toXPCReply:(xxpc_object_t)out_info { + + for (NSString *key in [plist_dict allKeys]) { + if (!([key isEqualToString:@"Filter"])) + return INVALID; + } + NSDictionary *filter = [plist_dict objectForKey:@"Filter"]; if (!filter) return PROVISIONAL_PASS; @@ -201,7 +207,9 @@ enum convert_filters_ret { _argv0 = [NSString stringWithCString:argv0 encoding:NSUTF8StringEncoding]; - _is_springboard = [_argv0 isEqualToString:@"SpringBoard"]; + NSString *sb_exe = + @"/System/Library/CoreServices/SpringBoard.app/SpringBoard"; + _is_springboard = [_argv0 isEqualToString:sb_exe]; xxpc_object_t bundles = xxpc_array_create(NULL, 0); diff --git a/script/gen-deb.sh b/script/gen-deb.sh index f39dbd3..999765c 100755 --- a/script/gen-deb.sh +++ b/script/gen-deb.sh @@ -14,12 +14,15 @@ mkdir -p $debroot/usr/include/substitute cp lib/substitute.h $debroot/usr/include/substitute/ cp substrate/substrate.h $debroot/usr/include/substitute/ mkdir -p $debroot/Library/Substitute/DynamicLibraries +cp darwin-bootstrap/safemode-ui-hook.plist out/safemode-ui-hook.dylib $debroot/Library/Substitute/DynamicLibraries/ mkdir -p $debroot/Library/Substitute/Helpers cp out/{posixspawn-hook.dylib,bundle-loader.dylib,unrestrict,inject-into-launchd,substituted} $debroot/Library/Substitute/Helpers/ mkdir -p $debroot/etc/rc.d ln -s /Library/Substitute/Helpers/inject-into-launchd $debroot/etc/rc.d/substitute mkdir -p $debroot/Library/LaunchDaemons cp darwin-bootstrap/com.ex.substituted.plist $debroot/Library/LaunchDaemons/ +mkdir -p $debroot/Applications/SafetyDance.app +cp -a out/SafetyDance.app/{*.png,Info.plist,SafetyDance} $debroot/Applications/SafetyDance.app/ cp -a darwin-bootstrap/DEBIAN $debroot/ sed "s#{VERSION}#$version#g" darwin-bootstrap/DEBIAN/control > $debroot/DEBIAN/control #... add bootstrap stuff |