aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xconfigure6
-rw-r--r--darwin-bootstrap/safemode-ui-hook.m32
-rw-r--r--darwin-bootstrap/substituted.m10
-rwxr-xr-xscript/gen-deb.sh3
4 files changed, 41 insertions, 10 deletions
diff --git a/configure b/configure
index b7d8335..7d12f35 100755
--- a/configure
+++ b/configure
@@ -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