mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	* Add .x as XDR/RPCGEN XDR/RPC language as documented in RFC5531, RFC4506. Samples are from glibc and RFCs. * Add Logos samples https://github.com/JonasGessner/NoCarrier/blob/master/NoCarrier.x - MITcf31f4e466/llvm-gcc-R3/gcc/testsuite/objc/execute/string1.x- GPL2f6415578fa/perapp-plugin/Tweak.x- GPL3d1b3e83888/NCHax.x- Apache * Add disambiguate heuristics for .x * Add RPC to vendor/README.md
		
			
				
	
	
		
			240 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			240 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| /*
 | |
|  *    ShadowSocks Per-App Proxy Plugin
 | |
|  *    https://github.com/linusyang/MobileShadowSocks
 | |
|  *
 | |
|  *    Copyright (c) 2014 Linus Yang <laokongzi@gmail.com>
 | |
|  *
 | |
|  *    This program 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.
 | |
|  *
 | |
|  *    This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.
 | |
|  *
 | |
|  */
 | |
| 
 | |
| #include <UIKit/UIKit.h>
 | |
| #include <libfinder/LFFinderController.h>
 | |
| 
 | |
| #define FUNC_NAME SCDynamicStoreCopyProxies
 | |
| #define ORIG_FUNC original_ ## FUNC_NAME
 | |
| #define CUST_FUNC custom_ ## FUNC_NAME
 | |
| 
 | |
| #define DECL_FUNC(ret, ...) \
 | |
|     extern ret FUNC_NAME(__VA_ARGS__); \
 | |
|     static ret (*ORIG_FUNC)(__VA_ARGS__); \
 | |
|     ret CUST_FUNC(__VA_ARGS__)
 | |
| 
 | |
| #define HOOK_FUNC() \
 | |
|     MSHookFunction(FUNC_NAME, (void *) CUST_FUNC, (void **) &ORIG_FUNC)
 | |
| 
 | |
| typedef const struct __SCDynamicStore *SCDynamicStoreRef;
 | |
| void MSHookFunction(void *symbol, void *replace, void **result);
 | |
| 
 | |
| static BOOL proxyEnabled = YES;
 | |
| static BOOL spdyDisabled = YES;
 | |
| static BOOL finderEnabled = YES;
 | |
| 
 | |
| static BOOL getValue(NSDictionary *dict, NSString *key, BOOL defaultVal)
 | |
| {
 | |
|     if (dict == nil || key == nil) {
 | |
|         return defaultVal;
 | |
|     }
 | |
|     NSNumber *valObj = [dict objectForKey:key];
 | |
|     if (valObj == nil) {
 | |
|         return defaultVal;
 | |
|     }
 | |
|     return [valObj boolValue];
 | |
| }
 | |
| 
 | |
| static void updateSettings(void)
 | |
| {
 | |
|     proxyEnabled = YES;
 | |
|     spdyDisabled = YES;
 | |
|     finderEnabled = YES;
 | |
|     NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:@"/var/mobile/Library/Preferences/com.linusyang.ssperapp.plist"];
 | |
|     if (dict != nil) {
 | |
|         NSString *bundleName = [[NSBundle mainBundle] bundleIdentifier];
 | |
|         if (getValue(dict, @"SSPerAppEnabled", NO) && bundleName != nil) {
 | |
|             NSString *entry = [[NSString alloc] initWithFormat:@"Enabled-%@", bundleName];
 | |
|             proxyEnabled = getValue(dict, entry, NO);
 | |
|             if (getValue(dict, @"SSPerAppReversed", NO)) {
 | |
|                 proxyEnabled = !proxyEnabled;
 | |
|             }
 | |
|             [entry release];
 | |
|         }
 | |
|         spdyDisabled = getValue(dict, @"SSPerAppDisableSPDY", YES);
 | |
|         finderEnabled = getValue(dict, @"SSPerAppFinder", YES);
 | |
|         [dict release];
 | |
|     }
 | |
| }
 | |
| 
 | |
| DECL_FUNC(CFDictionaryRef, SCDynamicStoreRef store)
 | |
| {
 | |
|     if (proxyEnabled) {
 | |
|         return ORIG_FUNC(store);
 | |
|     }
 | |
|     CFMutableDictionaryRef proxyDict = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
 | |
|     int zero = 0;
 | |
|     CFNumberRef zeroNumber = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &zero);
 | |
|     CFDictionarySetValue(proxyDict, CFSTR("HTTPEnable"), zeroNumber);
 | |
|     CFDictionarySetValue(proxyDict, CFSTR("HTTPProxyType"), zeroNumber);
 | |
|     CFDictionarySetValue(proxyDict, CFSTR("HTTPSEnable"), zeroNumber);
 | |
|     CFDictionarySetValue(proxyDict, CFSTR("ProxyAutoConfigEnable"), zeroNumber);
 | |
|     CFRelease(zeroNumber);
 | |
|     return proxyDict;
 | |
| }
 | |
| 
 | |
| @interface SettingTableViewController <LFFinderActionDelegate>
 | |
| 
 | |
| - (BOOL)useLibFinder;
 | |
| - (UIViewController *)allocFinderController;
 | |
| - (void)finderSelectedFilePath:(NSString *)path checkSanity:(BOOL)check;
 | |
| 
 | |
| @end
 | |
| 
 | |
| %group FinderHook
 | |
| 
 | |
| %hook SettingTableViewController
 | |
| - (BOOL)useLibFinder
 | |
| {
 | |
|     return finderEnabled;
 | |
| }
 | |
| 
 | |
| - (UIViewController *)allocFinderController
 | |
| {
 | |
|     LFFinderController* finder = [[LFFinderController alloc] initWithMode:LFFinderModeDefault];
 | |
|     finder.actionDelegate = self;
 | |
|     return finder;
 | |
| }
 | |
| 
 | |
| %new
 | |
| -(void)finder:(LFFinderController*)finder didSelectItemAtPath:(NSString*)path
 | |
| {
 | |
|     [self finderSelectedFilePath:path checkSanity:NO];
 | |
| }
 | |
| %end
 | |
| 
 | |
| %end
 | |
| 
 | |
| %group TwitterHook
 | |
| 
 | |
| %hook T1SPDYConfigurationChangeListener 
 | |
| - (BOOL)_shouldEnableSPDY
 | |
| {
 | |
|     if (spdyDisabled) {
 | |
|         return NO;
 | |
|     } else {
 | |
|         return %orig;
 | |
|     }
 | |
| }
 | |
| %end
 | |
| 
 | |
| %end
 | |
| 
 | |
| %group FacebookHook
 | |
| 
 | |
| %hook FBRequester
 | |
| - (BOOL)allowSPDY
 | |
| {
 | |
|     if (spdyDisabled) {
 | |
|         return NO;
 | |
|     } else {
 | |
|         return %orig;
 | |
|     }
 | |
| }
 | |
| 
 | |
| - (BOOL)useDNSCache
 | |
| {
 | |
|     if (spdyDisabled) {
 | |
|         return NO;
 | |
|     } else {
 | |
|         return %orig;
 | |
|     }
 | |
| }
 | |
| %end
 | |
| 
 | |
| %hook FBNetworkerRequest
 | |
| - (BOOL)disableSPDY
 | |
| {
 | |
|     if (spdyDisabled) {
 | |
|         return YES;
 | |
|     } else {
 | |
|         return %orig;
 | |
|     }
 | |
| }
 | |
| %end
 | |
| 
 | |
| %hook FBRequesterState
 | |
| - (BOOL)didUseSPDY
 | |
| {
 | |
|     if (spdyDisabled) {
 | |
|         return NO;
 | |
|     } else {
 | |
|         return %orig;
 | |
|     }
 | |
| }
 | |
| %end
 | |
| 
 | |
| %hook FBAppConfigService
 | |
| - (BOOL)disableDNSCache
 | |
| {
 | |
|     if (spdyDisabled) {
 | |
|         return YES;
 | |
|     } else {
 | |
|         return %orig;
 | |
|     }
 | |
| }
 | |
| %end
 | |
| 
 | |
| %hook FBNetworker
 | |
| - (BOOL)_shouldAllowUseOfDNSCache:(id)arg
 | |
| {
 | |
|     if (spdyDisabled) {
 | |
|         return NO;
 | |
|     } else {
 | |
|         return %orig;
 | |
|     }
 | |
| }
 | |
| %end
 | |
| 
 | |
| %hook FBAppSessionController
 | |
| - (BOOL)networkerShouldAllowUseOfDNSCache:(id)arg
 | |
| {
 | |
|     if (spdyDisabled) {
 | |
|         return NO;
 | |
|     } else {
 | |
|         return %orig;
 | |
|     }
 | |
| }
 | |
| %end
 | |
| 
 | |
| %end
 | |
| 
 | |
| %ctor
 | |
| {
 | |
|     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
 | |
|     NSString *bundleName = [[NSBundle mainBundle] bundleIdentifier];
 | |
|     if (bundleName != nil && ![bundleName isEqualToString:@"com.apple.springboard"]) {
 | |
|         updateSettings();
 | |
|         CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), NULL, (CFNotificationCallback) updateSettings, CFSTR("com.linusyang.ssperapp.settingschanged"), NULL, CFNotificationSuspensionBehaviorCoalesce);
 | |
|         if ([bundleName isEqualToString:@"com.linusyang.MobileShadowSocks"]) {
 | |
|             %init(FinderHook);
 | |
|         } else {
 | |
|             HOOK_FUNC();
 | |
|             if ([bundleName isEqualToString:@"com.atebits.Tweetie2"]) {
 | |
|                 %init(TwitterHook);
 | |
|             } else if ([bundleName isEqualToString:@"com.facebook.Facebook"]) {
 | |
|                 %init(FacebookHook);
 | |
|             }
 | |
|         }
 | |
|     }
 | |
|     [pool drain];
 | |
| }
 |