From 68df8c0b7bacec286d4798408b5a110bdac88986 Mon Sep 17 00:00:00 2001 From: "Jay Freeman (saurik)" Date: Thu, 16 Feb 2017 00:07:10 -0800 Subject: [PATCH] Put CydiaURLCache/NSURLConnection hook in CyteKit. --- CyteKit/URLCache.h | 31 +++++++++++++ CyteKit/URLCache.mm | 105 +++++++++++++++++++++++++++++++++++++++++++ Menes/ObjectHandle.h | 4 ++ MobileCydia.mm | 96 +-------------------------------------- Substrate.hpp | 13 ++++++ 5 files changed, 155 insertions(+), 94 deletions(-) create mode 100644 CyteKit/URLCache.h create mode 100644 CyteKit/URLCache.mm diff --git a/CyteKit/URLCache.h b/CyteKit/URLCache.h new file mode 100644 index 00000000..e363b8f1 --- /dev/null +++ b/CyteKit/URLCache.h @@ -0,0 +1,31 @@ +/* Cydia - iPhone UIKit Front-End for Debian APT + * Copyright (C) 2008-2015 Jay Freeman (saurik) +*/ + +/* GNU General Public License, Version 3 {{{ */ +/* + * Cydia is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * Cydia is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Cydia. If not, see . +**/ +/* }}} */ + +#ifndef CyteKit_URLCache_H +#define CyteKit_URLCache_H + +#include "SDURLCache/SDURLCache.h" + +@interface CyteURLCache : SDURLCache + +@end + +#endif//CyteKit_URLCache_H diff --git a/CyteKit/URLCache.mm b/CyteKit/URLCache.mm new file mode 100644 index 00000000..e5061307 --- /dev/null +++ b/CyteKit/URLCache.mm @@ -0,0 +1,105 @@ +/* Cydia - iPhone UIKit Front-End for Debian APT + * Copyright (C) 2008-2015 Jay Freeman (saurik) +*/ + +/* GNU General Public License, Version 3 {{{ */ +/* + * Cydia is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * Cydia is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Cydia. If not, see . +**/ +/* }}} */ + +#include "CyteKit/UCPlatform.h" + +#include "CyteKit/URLCache.h" +#include "Substrate.hpp" + +#include + +static _H CachedURLs_([NSMutableSet setWithCapacity:32]); + +@implementation CyteURLCache { +} + +- (void) logEvent:(NSString *)event forRequest:(NSURLRequest *)request { +#if !ForRelease + if (false); + else if ([event isEqualToString:@"no-cache"]) + event = @"!!!"; + else if ([event isEqualToString:@"store"]) + event = @">>>"; + else if ([event isEqualToString:@"invalid"]) + event = @"???"; + else if ([event isEqualToString:@"memory"]) + event = @"mem"; + else if ([event isEqualToString:@"disk"]) + event = @"ssd"; + else if ([event isEqualToString:@"miss"]) + event = @"---"; + + NSLog(@"%@: %@", event, [[request URL] absoluteString]); +#endif +} + +- (void) storeCachedResponse:(NSCachedURLResponse *)cached forRequest:(NSURLRequest *)request { + if (NSURLResponse *response = [cached response]) + if (NSString *mime = [response MIMEType]) + if ([mime isEqualToString:@"text/cache-manifest"]) { + NSURL *url([response URL]); + +#if !ForRelease + NSLog(@"###: %@", [url absoluteString]); +#endif + + @synchronized (CachedURLs_) { + [CachedURLs_ addObject:url]; + } + } + + [super storeCachedResponse:cached forRequest:request]; +} + +- (void) createDiskCachePath { + [super createDiskCachePath]; +} + +@end + +MSClassHook(NSURLConnection) + +MSHook(id, NSURLConnection$init$, NSURLConnection *self, SEL _cmd, NSURLRequest *request, id delegate, BOOL usesCache, int64_t maxContentLength, BOOL startImmediately, NSDictionary *connectionProperties) { + NSMutableURLRequest *copy([[request mutableCopy] autorelease]); + + NSURL *url([copy URL]); + + @synchronized (CachedURLs_) { + if (NSString *control = [copy valueForHTTPHeaderField:@"Cache-Control"]) + if ([control isEqualToString:@"max-age=0"]) + if ([CachedURLs_ containsObject:url]) { +#if !ForRelease + NSLog(@"~~~: %@", url); +#endif + + [copy setCachePolicy:NSURLRequestReturnCacheDataDontLoad]; + + [copy setValue:nil forHTTPHeaderField:@"Cache-Control"]; + [copy setValue:nil forHTTPHeaderField:@"If-Modified-Since"]; + [copy setValue:nil forHTTPHeaderField:@"If-None-Match"]; + } + } + + if ((self = _NSURLConnection$init$(self, _cmd, copy, delegate, usesCache, maxContentLength, startImmediately, connectionProperties)) != nil) { + } return self; +} + +CYHook(NSURLConnection, init$, _initWithRequest:delegate:usesCache:maxContentLength:startImmediately:connectionProperties:) diff --git a/Menes/ObjectHandle.h b/Menes/ObjectHandle.h index 9b8d57d7..727338b7 100644 --- a/Menes/ObjectHandle.h +++ b/Menes/ObjectHandle.h @@ -128,4 +128,8 @@ rproperty_(Class, field) \ wproperty_(Class, field, Field) \ @end +// XXX: I hate clang. Apple: please get over your petty hatred of GPL and fix your gcc fork +#define synchronized(lock) \ + synchronized(static_cast(lock)) + #endif//Menes_ObjectHandle_H diff --git a/MobileCydia.mm b/MobileCydia.mm index a5e9dbcc..d52a38ee 100644 --- a/MobileCydia.mm +++ b/MobileCydia.mm @@ -117,6 +117,7 @@ extern "C" { #include "CyteKit/RegEx.hpp" #include "CyteKit/TableViewCell.h" #include "CyteKit/TabBarController.h" +#include "CyteKit/URLCache.h" #include "CyteKit/WebScriptObject-Cyte.h" #include "CyteKit/WebViewController.h" #include "CyteKit/WebViewTableViewCell.h" @@ -125,8 +126,6 @@ extern "C" { #include "Cydia/MIMEAddress.h" #include "Cydia/LoadingViewController.h" #include "Cydia/ProgressEvent.h" - -#include "SDURLCache/SDURLCache.h" /* }}} */ /* Profiler {{{ */ @@ -199,10 +198,6 @@ void PrintTimes() { #define _end } /* }}} */ -// XXX: I hate clang. Apple: please get over your petty hatred of GPL and fix your gcc fork -#define synchronized(lock) \ - synchronized(static_cast(lock)) - extern NSString *Cydia_; #define lprintf(args...) fprintf(stderr, args) @@ -800,7 +795,6 @@ static _H SessionData_; static _H HostConfig_; static _H BridgedHosts_; static _H InsecureHosts_; -static _H CachedURLs_; static NSString *kCydiaProgressEventTypeError = @"Error"; static NSString *kCydiaProgressEventTypeInformation = @"Information"; @@ -8910,57 +8904,6 @@ static void HomeControllerReachabilityCallback(SCNetworkReachabilityRef reachabi @end /* }}} */ -@interface CYURLCache : SDURLCache { -} - -@end - -@implementation CYURLCache - -- (void) logEvent:(NSString *)event forRequest:(NSURLRequest *)request { -#if !ForRelease - if (false); - else if ([event isEqualToString:@"no-cache"]) - event = @"!!!"; - else if ([event isEqualToString:@"store"]) - event = @">>>"; - else if ([event isEqualToString:@"invalid"]) - event = @"???"; - else if ([event isEqualToString:@"memory"]) - event = @"mem"; - else if ([event isEqualToString:@"disk"]) - event = @"ssd"; - else if ([event isEqualToString:@"miss"]) - event = @"---"; - - NSLog(@"%@: %@", event, [[request URL] absoluteString]); -#endif -} - -- (void) storeCachedResponse:(NSCachedURLResponse *)cached forRequest:(NSURLRequest *)request { - if (NSURLResponse *response = [cached response]) - if (NSString *mime = [response MIMEType]) - if ([mime isEqualToString:@"text/cache-manifest"]) { - NSURL *url([response URL]); - -#if !ForRelease - NSLog(@"###: %@", [url absoluteString]); -#endif - - @synchronized (HostConfig_) { - [CachedURLs_ addObject:url]; - } - } - - [super storeCachedResponse:cached forRequest:request]; -} - -- (void) createDiskCachePath { - [super createDiskCachePath]; -} - -@end - @interface Cydia : CyteApplication < ConfirmationControllerDelegate, DatabaseDelegate, @@ -9868,7 +9811,7 @@ _trace(); [BridgedHosts_ addObject:[[NSURL URLWithString:CydiaURL(@"")] host]]; } - [NSURLCache setSharedURLCache:[[[CYURLCache alloc] + [NSURLCache setSharedURLCache:[[[CyteURLCache alloc] initWithMemoryCapacity:524288 diskCapacity:10485760 diskPath:Cache("SDURLCache") @@ -10095,33 +10038,6 @@ id Dealloc_(id self, SEL selector) { return object; }*/ -Class $NSURLConnection; - -MSHook(id, NSURLConnection$init$, NSURLConnection *self, SEL _cmd, NSURLRequest *request, id delegate, BOOL usesCache, int64_t maxContentLength, BOOL startImmediately, NSDictionary *connectionProperties) { - NSMutableURLRequest *copy([[request mutableCopy] autorelease]); - - NSURL *url([copy URL]); - - @synchronized (HostConfig_) { - if (NSString *control = [copy valueForHTTPHeaderField:@"Cache-Control"]) - if ([control isEqualToString:@"max-age=0"]) - if ([CachedURLs_ containsObject:url]) { -#if !ForRelease - NSLog(@"~~~: %@", url); -#endif - - [copy setCachePolicy:NSURLRequestReturnCacheDataDontLoad]; - - [copy setValue:nil forHTTPHeaderField:@"Cache-Control"]; - [copy setValue:nil forHTTPHeaderField:@"If-Modified-Since"]; - [copy setValue:nil forHTTPHeaderField:@"If-None-Match"]; - } - } - - if ((self = _NSURLConnection$init$(self, _cmd, copy, delegate, usesCache, maxContentLength, startImmediately, connectionProperties)) != nil) { - } return self; -} - Class $WAKWindow; static CGSize $WAKWindow$screenSize(WAKWindow *self, SEL _cmd) { @@ -10200,7 +10116,6 @@ int main(int argc, char *argv[]) { @synchronized (HostConfig_) { BridgedHosts_ = [NSMutableSet setWithCapacity:4]; InsecureHosts_ = [NSMutableSet setWithCapacity:4]; - CachedURLs_ = [NSMutableSet setWithCapacity:32]; } NSString *ui(@"ui/ios"); @@ -10219,13 +10134,6 @@ int main(int argc, char *argv[]) { if (Method method = class_getInstanceMethod($WAKWindow, @selector(screenSize))) method_setImplementation(method, (IMP) &$WAKWindow$screenSize); - $NSURLConnection = objc_getClass("NSURLConnection"); - Method NSURLConnection$init$(class_getInstanceMethod($NSURLConnection, @selector(_initWithRequest:delegate:usesCache:maxContentLength:startImmediately:connectionProperties:))); - if (NSURLConnection$init$ != NULL) { - _NSURLConnection$init$ = reinterpret_cast(method_getImplementation(NSURLConnection$init$)); - method_setImplementation(NSURLConnection$init$, reinterpret_cast(&$NSURLConnection$init$)); - } - $NSUserDefaults = objc_getClass("NSUserDefaults"); Method NSUserDefaults$objectForKey$(class_getInstanceMethod($NSUserDefaults, @selector(objectForKey:))); if (NSUserDefaults$objectForKey$ != NULL) { diff --git a/Substrate.hpp b/Substrate.hpp index 9826b567..57e89fbb 100644 --- a/Substrate.hpp +++ b/Substrate.hpp @@ -31,8 +31,21 @@ static inline Type_ &MSHookIvar(id self, const char *name) { return *reinterpret_cast(pointer); } +#define MSClassHook(name) \ + @class name; \ + static Class $ ## name = objc_getClass(#name); + #define MSHook(type, name, args...) \ static type (*_ ## name)(args); \ static type $ ## name(args) +#define CYHook(Type, Code, Name) \ +static struct Type ## $ ## Code { Type ## $ ## Code() { \ + Method Type ## $ ## Code(class_getInstanceMethod($ ## Type, @selector(Name))); \ + if (Type ## $ ## Code != NULL) { \ + _ ## Type ## $ ## Code = reinterpret_cast(method_getImplementation(Type ## $ ## Code)); \ + method_setImplementation(Type ## $ ## Code, reinterpret_cast(&$ ## Type ## $ ## Code)); \ + } \ +} } Type ## $ ## Code; + #endif//Substrate_HPP -- 2.45.2