Skip to content

Commit 77b8810

Browse files
committed
Show stiktool capabilities before first run. Fix instproxy get apps issue.
1 parent 44d81af commit 77b8810

File tree

7 files changed

+343
-72
lines changed

7 files changed

+343
-72
lines changed

StikJIT/MiniToolSupport/JSSupport/IDeviceJSBridge.m

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,21 +12,34 @@ @implementation IDeviceHandle
1212
@end
1313

1414

15-
NSDictionary *dictionaryFromPlistData(NSData *plistData, NSError **error) {
16-
if (!plistData) {
15+
NSDictionary *dictionaryFromPlist(plist_t plist, NSError **error) {
16+
if (!plist) {
1717
if (error) {
1818
*error = [NSError errorWithDomain:@"PlistConversionErrorDomain"
1919
code:1001
20-
userInfo:@{NSLocalizedDescriptionKey: @"Input plist data is nil."}];
20+
userInfo:@{NSLocalizedDescriptionKey: @"Input plist is nil."}];
2121
}
2222
return nil;
2323
}
24+
char* buf = 0;
25+
uint32_t plistlen = 0;
26+
// try bin plist first, if failed, we try xml plist
27+
plist_to_bin(plist, &buf, &plistlen);
2428

2529
NSPropertyListFormat format;
26-
NSDictionary *result = [NSPropertyListSerialization propertyListWithData:plistData
27-
options:NSPropertyListImmutable
28-
format:&format
29-
error:error];
30+
NSDictionary *result = [NSPropertyListSerialization propertyListWithData:[NSData dataWithBytes:buf length:plistlen]
31+
options:NSPropertyListImmutable format:&format error:error];
32+
plist_mem_free(buf);
33+
if (![result isKindOfClass:[NSDictionary class]]) {
34+
plist_to_xml(plist, &buf, &plistlen);
35+
if (error) {
36+
*error = nil;
37+
}
38+
result = [NSPropertyListSerialization propertyListWithData:[NSData dataWithBytes:buf length:plistlen]
39+
options:NSPropertyListImmutable format:&format error:error];
40+
plist_free(buf);
41+
}
42+
3043
if (![result isKindOfClass:[NSDictionary class]]) {
3144
if (error && !*error) {
3245
*error = [NSError errorWithDomain:@"PlistConversionErrorDomain"
@@ -78,11 +91,12 @@ @implementation IDeviceJSBridge {
7891
int maxDataId;
7992
}
8093

81-
- (instancetype)initWithContext:(JSContext*)context {
94+
- (instancetype)initWithContext:(JSContext*)context allowedFunctions:(NSArray<NSString*>*)allowedFunctions {
8295
maxHandleId = 0;
8396
maxDataId = 0;
8497
handles = [[NSMutableDictionary alloc] init];
8598
dataPool = [[NSMutableDictionary alloc] init];
99+
self->allowedFunctions = allowedFunctions;
86100
self->context = context;
87101
return self;
88102
}
@@ -150,6 +164,11 @@ - (void)didReceiveScriptMessage:(nonnull NSDictionary *)message resolve:(JSValue
150164
return;
151165
}
152166

167+
if(![self->allowedFunctions containsObject:message[@"command"]]) {
168+
[rejectFunc callWithArguments:@[[NSString stringWithFormat:@"calling %@ is not allowed! Declare it in toolInfo.json", message[@"command"]]]];
169+
return;
170+
}
171+
153172
NSString* handlerSelectorStr = [NSString stringWithFormat:@"%@WithBody:replyHandler:", message[@"command"]];
154173
if(![self respondsToSelector:NSSelectorFromString(handlerSelectorStr)]) {
155174
[rejectFunc callWithArguments:@[@"Invalid idevice function!"]];

StikJIT/MiniToolSupport/JSSupport/IDeviceJSBridgeInstallationProxy.m

Lines changed: 34 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -69,23 +69,24 @@ - (void)installation_proxy_get_appsWithBody:(NSDictionary *)body replyHandler:(n
6969
}
7070

7171
plist_t *app_list = (plist_t *)apps;
72-
NSMutableArray* ans = [[NSMutableArray alloc] init];
73-
for(int i = 0; i < apps_len; ++i) {
74-
char* buf = 0;
75-
uint32_t plistlen = 0;
76-
plist_to_bin(app_list[i], &buf, &plistlen);
77-
NSError* err2 = 0;
78-
NSDictionary* appDict = dictionaryFromPlistData([NSData dataWithBytes:buf length:plistlen], &err2);
79-
plist_mem_free(buf);
80-
if(err2) {
81-
replyHandler(nil, @"failed to parse plist data");
82-
return;
72+
do {
73+
NSMutableArray* ans = [[NSMutableArray alloc] init];
74+
for(int i = 0; i < apps_len; ++i) {
75+
NSError* err2 = 0;
76+
NSDictionary* appDict = dictionaryFromPlist(app_list[i], &err2);
77+
78+
if(err2) {
79+
replyHandler(nil, @"failed to parse plist data");
80+
break;
81+
}
82+
[ans addObject:appDict];
8383
}
84-
[ans addObject:appDict];
84+
replyHandler(ans, nil);
85+
} while(0);
86+
87+
for(int i = 0; i < apps_len; ++i) {
88+
plist_free(app_list[i]);
8589
}
86-
replyHandler(ans, nil);
87-
88-
8990
}
9091

9192
- (void)installation_proxy_installWithBody:(NSDictionary *)body replyHandler:(nonnull void (^)(id _Nullable, NSString * _Nullable))replyHandler {
@@ -266,33 +267,33 @@ - (void)installation_proxy_browseWithBody:(NSDictionary *)body replyHandler:(non
266267
plist_from_memory((void*)[optionsNSData bytes], (uint32_t)[optionsNSData length], &optionsPlist, 0);
267268
}
268269

269-
plist_t *apps = NULL;
270+
plist_t *app_list = NULL;
270271
size_t apps_len = 0;
271-
IdeviceFfiError* err = installation_proxy_browse(client, optionsPlist, &apps, &apps_len);
272+
IdeviceFfiError* err = installation_proxy_browse(client, optionsPlist, &app_list, &apps_len);
272273

273274
if (err) {
274275
replyHandler(nil, [self errFreeFromIdeviceFfiError:err]);
275276
return;
276277
}
277278

278-
NSMutableArray* ans = [[NSMutableArray alloc] init];
279-
for(int i = 0; i < apps_len; ++i) {
280-
char* buf = 0;
281-
uint32_t plistlen = 0;
282-
plist_to_bin(apps[i], &buf, &plistlen);
283-
NSError* err2 = 0;
284-
NSDictionary* appDict = dictionaryFromPlistData([NSData dataWithBytes:buf length:plistlen], &err2);
285-
plist_mem_free(buf);
286-
if(err2) {
287-
replyHandler(nil, @"failed to parse plist data");
288-
return;
289-
}
290-
[ans addObject:appDict];
291-
if([ans count] >= 100) {
292-
break;
279+
do {
280+
NSMutableArray* ans = [[NSMutableArray alloc] init];
281+
for(int i = 0; i < apps_len; ++i) {
282+
NSError* err2 = 0;
283+
NSDictionary* appDict = dictionaryFromPlist(app_list[i], &err2);
284+
285+
if(err2) {
286+
replyHandler(nil, @"failed to parse plist data");
287+
break;
288+
}
289+
[ans addObject:appDict];
293290
}
291+
replyHandler(ans, nil);
292+
} while(0);
293+
294+
for(int i = 0; i < apps_len; ++i) {
295+
plist_free(app_list[i]);
294296
}
295-
replyHandler(ans, nil);
296297

297298

298299
}

StikJIT/MiniToolSupport/JSSupport/JSSupport.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,10 @@
2323
@interface IDeviceJSBridge : NSObject {
2424
NSMutableDictionary<NSNumber*, IDeviceHandle*>* handles;
2525
NSMutableDictionary<NSNumber*, NSData*>* dataPool;
26+
NSArray<NSString*>* allowedFunctions;
2627
JSContext* context;
2728
}
28-
- (instancetype)initWithContext:(JSContext*)context;
29+
- (instancetype)initWithContext:(JSContext*)context allowedFunctions:(NSArray<NSString*>*)allowedFunctions;
2930
- (void)didReceiveScriptMessage:(NSDictionary *)message resolve:(JSValue*)resolveFunc reject:(JSValue*)rejectFunc;
3031
- (void)cleanUp;
3132
- (NSString*)errFreeFromIdeviceFfiError:(IdeviceFfiError*)err;
@@ -36,6 +37,6 @@
3637
@end
3738

3839

39-
NSDictionary *dictionaryFromPlistData(NSData *plistData, NSError **error);
40+
NSDictionary *dictionaryFromPlist(plist_t plist, NSError **error);
4041
NSData *plistDataFromDictionary(NSDictionary *dictionary, NSError **error);
4142
const char** cstrArrFromNSArray(NSArray* arr, int* validCount);

0 commit comments

Comments
 (0)