You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
95 lines
3.3 KiB
95 lines
3.3 KiB
//
|
|
// FLEXAddressExplorerCoordinator.m
|
|
// FLEX
|
|
//
|
|
// Created by Tanner Bennett on 7/10/19.
|
|
// Copyright © 2019 Flipboard. All rights reserved.
|
|
//
|
|
|
|
#import "FLEXAddressExplorerCoordinator.h"
|
|
#import "FLEXGlobalsTableViewController.h"
|
|
#import "FLEXObjectExplorerFactory.h"
|
|
#import "FLEXObjectExplorerViewController.h"
|
|
#import "FLEXRuntimeUtility.h"
|
|
#import "FLEXUtility.h"
|
|
|
|
@interface FLEXGlobalsTableViewController (FLEXAddressExploration)
|
|
- (void)deselectSelectedRow;
|
|
- (void)tryExploreAddress:(NSString *)addressString safely:(BOOL)safely;
|
|
@end
|
|
|
|
@implementation FLEXAddressExplorerCoordinator
|
|
|
|
#pragma mark - FLEXGlobalsEntry
|
|
|
|
+ (NSString *)globalsEntryTitle:(FLEXGlobalsRow)row {
|
|
return @"🔎 Address Explorer";
|
|
}
|
|
|
|
+ (FLEXGlobalsTableViewControllerRowAction)globalsEntryRowAction:(FLEXGlobalsRow)row {
|
|
return ^(FLEXGlobalsTableViewController *host) {
|
|
|
|
NSString *title = @"Explore Object at Address";
|
|
NSString *message = @"Paste a hexadecimal address below, starting with '0x'. "
|
|
"Use the unsafe option if you need to bypass pointer validation, "
|
|
"but know that it may crash the app if the address is invalid.";
|
|
|
|
[FLEXAlert makeAlert:^(FLEXAlert *make) {
|
|
make.title(title).message(message);
|
|
make.configuredTextField(^(UITextField *textField) {
|
|
NSString *copied = UIPasteboard.generalPasteboard.string;
|
|
textField.placeholder = @"0x00000070deadbeef";
|
|
// Go ahead and paste our clipboard if we have an address copied
|
|
if ([copied hasPrefix:@"0x"]) {
|
|
textField.text = copied;
|
|
[textField selectAll:nil];
|
|
}
|
|
});
|
|
make.button(@"Explore").handler(^(NSArray<NSString *> *strings) {
|
|
[host tryExploreAddress:strings.firstObject safely:YES];
|
|
});
|
|
make.button(@"Unsafe Explore").destructiveStyle().handler(^(NSArray *strings) {
|
|
[host tryExploreAddress:strings.firstObject safely:NO];
|
|
});
|
|
make.button(@"Cancel").cancelStyle();
|
|
} showFrom:host];
|
|
|
|
};
|
|
}
|
|
|
|
@end
|
|
|
|
@implementation FLEXGlobalsTableViewController (FLEXAddressExploration)
|
|
|
|
- (void)deselectSelectedRow {
|
|
NSIndexPath *selected = self.tableView.indexPathForSelectedRow;
|
|
[self.tableView deselectRowAtIndexPath:selected animated:YES];
|
|
}
|
|
|
|
- (void)tryExploreAddress:(NSString *)addressString safely:(BOOL)safely {
|
|
NSScanner *scanner = [NSScanner scannerWithString:addressString];
|
|
unsigned long long hexValue = 0;
|
|
BOOL didParseAddress = [scanner scanHexLongLong:&hexValue];
|
|
const void *pointerValue = (void *)hexValue;
|
|
|
|
NSString *error = nil;
|
|
|
|
if (didParseAddress) {
|
|
if (safely && ![FLEXRuntimeUtility pointerIsValidObjcObject:pointerValue]) {
|
|
error = @"The given address is unlikely to be a valid object.";
|
|
}
|
|
} else {
|
|
error = @"Malformed address. Make sure it's not too long and starts with '0x'.";
|
|
}
|
|
|
|
if (!error) {
|
|
id object = (__bridge id)pointerValue;
|
|
FLEXObjectExplorerViewController *explorer = [FLEXObjectExplorerFactory explorerViewControllerForObject:object];
|
|
[self.navigationController pushViewController:explorer animated:YES];
|
|
} else {
|
|
[FLEXAlert showAlert:@"Uh-oh" message:error from:self];
|
|
[self deselectSelectedRow];
|
|
}
|
|
}
|
|
|
|
@end
|