diff options
Diffstat (limited to 'MobileCydia.mm')
-rw-r--r-- | MobileCydia.mm | 342 |
1 files changed, 4 insertions, 338 deletions
diff --git a/MobileCydia.mm b/MobileCydia.mm index 1b3ba02..3b7e050 100644 --- a/MobileCydia.mm +++ b/MobileCydia.mm @@ -48,8 +48,6 @@ #include <UIKit/UIKit.h> #include "iPhonePrivate.h" -#include <IOKit/IOKitLib.h> - #include <QuartzCore/CALayer.h> #include <WebCore/WebCoreThread.h> @@ -227,16 +225,6 @@ union SplitHash { }; // }}} -@implementation NSDictionary (Cydia) -- (id) invokeUndefinedMethodFromWebScript:(NSString *)name withArguments:(NSArray *)arguments { - if (false); - else if ([name isEqualToString:@"get"]) - return [self objectForKey:[arguments objectAtIndex:0]]; - else if ([name isEqualToString:@"keys"]) - return [self allKeys]; - return nil; -} @end - static NSString *Colon_; NSString *Elision_; static NSString *Error_; @@ -792,34 +780,6 @@ bool isSectionVisible(NSString *section) { return hidden == nil || ![hidden boolValue]; } -static NSObject *CYIOGetValue(const char *path, NSString *property) { - io_registry_entry_t entry(IORegistryEntryFromPath(kIOMasterPortDefault, path)); - if (entry == MACH_PORT_NULL) - return nil; - - CFTypeRef value(IORegistryEntryCreateCFProperty(entry, (CFStringRef) property, kCFAllocatorDefault, 0)); - IOObjectRelease(entry); - - if (value == NULL) - return nil; - return [(id) value autorelease]; -} - -static NSString *CYHex(NSData *data, bool reverse = false) { - if (data == nil) - return nil; - - size_t length([data length]); - uint8_t bytes[length]; - [data getBytes:bytes]; - - char string[length * 2 + 1]; - for (size_t i(0); i != length; ++i) - sprintf(string + i * 2, "%.2x", bytes[reverse ? length - i - 1 : i]); - - return [NSString stringWithUTF8String:string]; -} - static NSString *VerifySource(NSString *href) { static RegEx href_r("(http(s?)://|file:///)[^# ]*"); if (!href_r(href)) { @@ -4227,17 +4187,12 @@ class CydiaLogCleaner : @end /* }}} */ -@interface CydiaObject : NSObject { - _H<CyteWebViewController> indirect_; +@interface CydiaObject : CyteObject { _transient id delegate_; } -- (id) initWithDelegate:(CyteWebViewController *)indirect; - @end -@class CydiaObject; - @interface CydiaWebViewController : CyteWebViewController { _H<CydiaObject> cydia_; } @@ -4251,85 +4206,30 @@ class CydiaLogCleaner : /* Web Scripting {{{ */ @implementation CydiaObject -- (id) initWithDelegate:(CyteWebViewController *)indirect { - if ((self = [super init]) != nil) { - indirect_ = indirect; - } return self; -} - - (void) setDelegate:(id)delegate { delegate_ = delegate; } -+ (NSArray *) _attributeKeys { - return [NSArray arrayWithObjects: - @"bittage", - @"bbsnum", - @"build", +- (NSArray *) attributeKeys { + return [[NSArray arrayWithObjects: @"cells", - @"coreFoundationVersionNumber", @"device", - @"ecid", - @"firmware", - @"hostname", - @"idiom", @"mcc", @"mnc", - @"model", @"operator", @"role", - @"serial", @"version", - nil]; -} - -- (NSArray *) attributeKeys { - return [[self class] _attributeKeys]; -} - -+ (BOOL) isKeyExcludedFromWebScript:(const char *)name { - return ![[self _attributeKeys] containsObject:[NSString stringWithUTF8String:name]] && [super isKeyExcludedFromWebScript:name]; + nil] arrayByAddingObjectsFromArray:[super attributeKeys]]; } - (NSString *) version { return Cydia_; } -- (unsigned) bittage { -#if 0 -#elif defined(__arm64__) - return 64; -#elif defined(__arm__) - return 32; -#else - return 0; -#endif -} - -- (NSString *) build { - return [NSString stringWithUTF8String:System_]; -} - -- (NSString *) coreFoundationVersionNumber { - return [NSString stringWithFormat:@"%.2f", kCFCoreFoundationVersionNumber]; -} - - (NSString *) device { return UniqueIdentifier(); } -- (NSString *) firmware { - return [[UIDevice currentDevice] systemVersion]; -} - -- (NSString *) hostname { - return [[UIDevice currentDevice] name]; -} - -- (NSString *) idiom { - return IsWildcat_ ? @"ipad" : @"iphone"; -} - - (NSArray *) cells { auto *$_CTServerConnectionCreate(reinterpret_cast<id (*)(void *, void *, void *)>(dlsym(RTLD_DEFAULT, "_CTServerConnectionCreate"))); if ($_CTServerConnectionCreate == NULL) @@ -4371,44 +4271,22 @@ class CydiaLogCleaner : return nil; } -- (NSString *) bbsnum { - return (id) CYHex((NSData *) CYIOGetValue("IOService:/AppleARMPE/baseband", @"snum"), false) ?: [NSNull null]; -} - -- (NSString *) ecid { - return (id) [CYHex((NSData *) CYIOGetValue("IODeviceTree:/chosen", @"unique-chip-id"), true) uppercaseString] ?: [NSNull null]; -} - -- (NSString *) serial { - return (NSString *) CYIOGetValue("IOService:/", @"IOPlatformSerialNumber"); -} - - (NSString *) role { return (id) [NSNull null]; } -- (NSString *) model { - return [NSString stringWithUTF8String:Machine_]; -} - + (NSString *) webScriptNameForSelector:(SEL)selector { if (false); else if (selector == @selector(addBridgedHost:)) return @"addBridgedHost"; else if (selector == @selector(addInsecureHost:)) return @"addInsecureHost"; - else if (selector == @selector(addInternalRedirect::)) - return @"addInternalRedirect"; else if (selector == @selector(addSource:::)) return @"addSource"; else if (selector == @selector(addTrivialSource:)) return @"addTrivialSource"; - else if (selector == @selector(close)) - return @"close"; else if (selector == @selector(du:)) return @"du"; - else if (selector == @selector(stringWithFormat:arguments:)) - return @"format"; else if (selector == @selector(getAllSources)) return @"getAllSources"; else if (selector == @selector(getApplicationInfo:value:)) @@ -4417,18 +4295,8 @@ class CydiaLogCleaner : return @"getDisplayIdentifiers"; else if (selector == @selector(getLocalizedNameForDisplayIdentifier:)) return @"getLocalizedNameForDisplayIdentifier"; - else if (selector == @selector(getKernelNumber:)) - return @"getKernelNumber"; - else if (selector == @selector(getKernelString:)) - return @"getKernelString"; else if (selector == @selector(getInstalledPackages)) return @"getInstalledPackages"; - else if (selector == @selector(getIORegistryEntry::)) - return @"getIORegistryEntry"; - else if (selector == @selector(getLocaleIdentifier)) - return @"getLocaleIdentifier"; - else if (selector == @selector(getPreferredLanguages)) - return @"getPreferredLanguages"; else if (selector == @selector(getPackageById:)) return @"getPackageById"; else if (selector == @selector(getMetadataKeys)) @@ -4439,18 +4307,8 @@ class CydiaLogCleaner : return @"getSessionValue"; else if (selector == @selector(installPackages:)) return @"installPackages"; - else if (selector == @selector(isReachable:)) - return @"isReachable"; - else if (selector == @selector(localizedStringForKey:value:table:)) - return @"localize"; - else if (selector == @selector(popViewController:)) - return @"popViewController"; else if (selector == @selector(refreshSources)) return @"refreshSources"; - else if (selector == @selector(registerFrame:)) - return @"registerFrame"; - else if (selector == @selector(removeButton)) - return @"removeButton"; else if (selector == @selector(saveConfig)) return @"saveConfig"; else if (selector == @selector(setMetadataValue::)) @@ -4459,42 +4317,8 @@ class CydiaLogCleaner : return @"setSessionValue"; else if (selector == @selector(substitutePackageNames:)) return @"substitutePackageNames"; - else if (selector == @selector(scrollToBottom:)) - return @"scrollToBottom"; - else if (selector == @selector(setAllowsNavigationAction:)) - return @"setAllowsNavigationAction"; - else if (selector == @selector(setBadgeValue:)) - return @"setBadgeValue"; - else if (selector == @selector(setButtonImage:withStyle:toFunction:)) - return @"setButtonImage"; - else if (selector == @selector(setButtonTitle:withStyle:toFunction:)) - return @"setButtonTitle"; - else if (selector == @selector(setHidesBackButton:)) - return @"setHidesBackButton"; - else if (selector == @selector(setHidesNavigationBar:)) - return @"setHidesNavigationBar"; - else if (selector == @selector(setNavigationBarStyle:)) - return @"setNavigationBarStyle"; - else if (selector == @selector(setNavigationBarTintRed:green:blue:alpha:)) - return @"setNavigationBarTintColor"; - else if (selector == @selector(setPasteboardString:)) - return @"setPasteboardString"; - else if (selector == @selector(setPasteboardURL:)) - return @"setPasteboardURL"; - else if (selector == @selector(setScrollAlwaysBounceVertical:)) - return @"setScrollAlwaysBounceVertical"; - else if (selector == @selector(setScrollIndicatorStyle:)) - return @"setScrollIndicatorStyle"; else if (selector == @selector(setToken:)) return @"setToken"; - else if (selector == @selector(setViewportWidth:)) - return @"setViewportWidth"; - else if (selector == @selector(statfs:)) - return @"statfs"; - else if (selector == @selector(supports:)) - return @"supports"; - else if (selector == @selector(unload)) - return @"unload"; else return nil; } @@ -4503,26 +4327,6 @@ class CydiaLogCleaner : return [self webScriptNameForSelector:selector] == nil; } -- (BOOL) supports:(NSString *)feature { - return [feature isEqualToString:@"window.open"]; -} - -- (void) unload { - [[indirect_ rootViewController] performSelectorOnMainThread:@selector(unloadData) withObject:nil waitUntilDone:NO]; -} - -- (void) setScrollAlwaysBounceVertical:(NSNumber *)value { - [indirect_ performSelectorOnMainThread:@selector(setScrollAlwaysBounceVerticalNumber:) withObject:value waitUntilDone:NO]; -} - -- (void) setScrollIndicatorStyle:(NSString *)style { - [indirect_ performSelectorOnMainThread:@selector(setScrollIndicatorStyleWithName:) withObject:style waitUntilDone:NO]; -} - -- (void) addInternalRedirect:(NSString *)from :(NSString *)to { - [CyteWebViewController performSelectorOnMainThread:@selector(addDiversion:) withObject:[[[Diversion alloc] initWithFrom:from to:to] autorelease] waitUntilDone:NO]; -} - - (NSDictionary *) getApplicationInfo:(NSString *)display value:(NSString *)key { char path[1024]; if (SBBundlePathForDisplayIdentifier(SBSSpringBoardServerPort(), [display UTF8String], path) != 0) @@ -4558,43 +4362,11 @@ class CydiaLogCleaner : return [NSNumber numberWithInt:value]; } -- (NSString *) getKernelString:(NSString *)name { - const char *string([name UTF8String]); - - size_t size; - if (sysctlbyname(string, NULL, &size, NULL, 0) == -1) - return (id) [NSNull null]; - - char value[size + 1]; - if (sysctlbyname(string, value, &size, NULL, 0) == -1) - return (id) [NSNull null]; - - // XXX: just in case you request something ludicrous - value[size] = '\0'; - - return [NSString stringWithCString:value]; -} - -- (NSObject *) getIORegistryEntry:(NSString *)path :(NSString *)entry { - NSObject *value(CYIOGetValue([path UTF8String], entry)); - - if (value != nil) - if ([value isKindOfClass:[NSData class]]) - value = CYHex((NSData *) value); - - return value; -} - - (NSArray *) getMetadataKeys { @synchronized (Values_) { return [Values_ allKeys]; } } -- (void) registerFrame:(DOMHTMLIFrameElement *)iframe { - WebFrame *frame([iframe contentFrame]); - [indirect_ registerFrame:frame]; -} - - (id) getMetadataValue:(NSString *)key { @synchronized (Values_) { return [Values_ objectForKey:key]; @@ -4631,12 +4403,6 @@ class CydiaLogCleaner : [InsecureHosts_ addObject:host]; } } -- (void) popViewController:(NSNumber *)value { - if (value == (id) [WebUndefined undefined]) - value = [NSNumber numberWithBool:YES]; - [indirect_ performSelectorOnMainThread:@selector(popViewControllerWithNumber:) withObject:value waitUntilDone:NO]; -} - - (void) addSource:(NSString *)href :(NSString *)distribution :(WebScriptObject *)sections { NSMutableArray *array([NSMutableArray arrayWithCapacity:[sections count]]); @@ -4690,27 +4456,6 @@ class CydiaLogCleaner : return (Package *) [NSNull null]; } -- (NSString *) getLocaleIdentifier { - return Locale_ == NULL ? (NSString *) [NSNull null] : (NSString *) CFLocaleGetIdentifier(Locale_); -} - -- (NSArray *) getPreferredLanguages { - return Languages_; -} - -- (NSArray *) statfs:(NSString *)path { - struct statfs stat; - - if (path == nil || statfs([path UTF8String], &stat) == -1) - return nil; - - return [NSArray arrayWithObjects: - [NSNumber numberWithUnsignedLong:stat.f_bsize], - [NSNumber numberWithUnsignedLong:stat.f_blocks], - [NSNumber numberWithUnsignedLong:stat.f_bfree], - nil]; -} - - (NSNumber *) du:(NSString *)path { NSNumber *value(nil); @@ -4732,14 +4477,6 @@ class CydiaLogCleaner : return value; } -- (void) close { - [indirect_ performSelectorOnMainThread:@selector(close) withObject:nil waitUntilDone:NO]; -} - -- (NSNumber *) isReachable:(NSString *)name { - return [NSNumber numberWithBool:CyteIsReachable([name UTF8String])]; -} - - (void) installPackages:(NSArray *)packages { [delegate_ performSelectorOnMainThread:@selector(installPackages:) withObject:packages waitUntilDone:NO]; } @@ -4761,81 +4498,10 @@ class CydiaLogCleaner : return [words componentsJoinedByString:@" "]; } -- (void) removeButton { - [indirect_ removeButton]; -} - -- (void) setButtonImage:(NSString *)button withStyle:(NSString *)style toFunction:(id)function { - [indirect_ setButtonImage:button withStyle:style toFunction:function]; -} - -- (void) setButtonTitle:(NSString *)button withStyle:(NSString *)style toFunction:(id)function { - [indirect_ setButtonTitle:button withStyle:style toFunction:function]; -} - -- (void) setBadgeValue:(id)value { - [indirect_ performSelectorOnMainThread:@selector(setBadgeValue:) withObject:value waitUntilDone:NO]; -} - -- (void) setAllowsNavigationAction:(NSString *)value { - [indirect_ performSelectorOnMainThread:@selector(setAllowsNavigationActionByNumber:) withObject:value waitUntilDone:NO]; -} - -- (void) setHidesBackButton:(NSString *)value { - [indirect_ performSelectorOnMainThread:@selector(setHidesBackButtonByNumber:) withObject:value waitUntilDone:NO]; -} - -- (void) setHidesNavigationBar:(NSString *)value { - [indirect_ performSelectorOnMainThread:@selector(setHidesNavigationBarByNumber:) withObject:value waitUntilDone:NO]; -} - -- (void) setNavigationBarStyle:(NSString *)value { - [indirect_ performSelectorOnMainThread:@selector(setNavigationBarStyle:) withObject:value waitUntilDone:NO]; -} - -- (void) setNavigationBarTintRed:(NSNumber *)red green:(NSNumber *)green blue:(NSNumber *)blue alpha:(NSNumber *)alpha { - float opacity(alpha == (id) [WebUndefined undefined] ? 1 : [alpha floatValue]); - UIColor *color([UIColor colorWithRed:[red floatValue] green:[green floatValue] blue:[blue floatValue] alpha:opacity]); - [indirect_ performSelectorOnMainThread:@selector(setNavigationBarTintColor:) withObject:color waitUntilDone:NO]; -} - -- (void) setPasteboardString:(NSString *)value { - [[objc_getClass("UIPasteboard") generalPasteboard] setString:value]; -} - -- (void) setPasteboardURL:(NSString *)value { - [[objc_getClass("UIPasteboard") generalPasteboard] setURL:[NSURL URLWithString:value]]; -} - - (void) setToken:(NSString *)token { // XXX: the website expects this :/ } -- (void) scrollToBottom:(NSNumber *)animated { - [indirect_ performSelectorOnMainThread:@selector(scrollToBottomAnimated:) withObject:animated waitUntilDone:NO]; -} - -- (void) setViewportWidth:(float)width { - [indirect_ setViewportWidthOnMainThread:width]; -} - -- (NSString *) stringWithFormat:(NSString *)format arguments:(WebScriptObject *)arguments { - //NSLog(@"SWF:\"%@\" A:%@", format, [arguments description]); - unsigned count([arguments count]); - id values[count]; - for (unsigned i(0); i != count; ++i) - values[i] = [arguments objectAtIndex:i]; - return [[[NSString alloc] initWithFormat:format arguments:reinterpret_cast<va_list>(values)] autorelease]; -} - -- (NSString *) localizedStringForKey:(NSString *)key value:(NSString *)value table:(NSString *)table { - if (reinterpret_cast<id>(value) == [WebUndefined undefined]) - value = nil; - if (reinterpret_cast<id>(table) == [WebUndefined undefined]) - table = nil; - return [[NSBundle mainBundle] localizedStringForKey:key value:value table:table]; -} - @end /* }}} */ |