Files
linguist/samples/Logos/Tweak.x
Dylan Simon 60f748d47b Add .x as XDR/RPCGEN (#3472)
* 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 - MIT
cf31f4e466/llvm-gcc-R3/gcc/testsuite/objc/execute/string1.x - GPL2
f6415578fa/perapp-plugin/Tweak.x - GPL3
d1b3e83888/NCHax.x - Apache

* Add disambiguate heuristics for .x

* Add RPC to vendor/README.md
2018-01-25 09:15:09 +00:00

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];
}