Compare commits

...

1 Commits

Author SHA1 Message Date
Chris Ballinger 81245b79c0 Working on replacing CPAProxy with Tor.framework 2019-07-13 15:23:53 -07:00
14 changed files with 153 additions and 45 deletions

3
.gitmodules vendored
View File

@ -40,3 +40,6 @@
[submodule "Submodules/libsqlfs"]
path = Submodules/libsqlfs
url = git@github.com:ChatSecure/libsqlfs.git
[submodule "Submodules/Tor_framework"]
path = Submodules/Tor_framework
url = git@github.com:ChatSecure/Tor.framework.git

View File

@ -192,9 +192,6 @@
633105181A16D1A300C17BAE /* OTREncryptionManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OTREncryptionManager.m; sourceTree = "<group>"; };
6331051B1A16D1A300C17BAE /* OTRLanguageManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OTRLanguageManager.h; sourceTree = "<group>"; };
6331051C1A16D1A300C17BAE /* OTRLanguageManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OTRLanguageManager.m; sourceTree = "<group>"; };
6331051D1A16D1A300C17BAE /* OTROAuthRefresher.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OTROAuthRefresher.h; sourceTree = "<group>"; };
6331051E1A16D1A300C17BAE /* OTROAuthRefresher.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OTROAuthRefresher.m; sourceTree = "<group>"; };
633105211A16D1A300C17BAE /* OTRProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OTRProtocol.h; sourceTree = "<group>"; };
633105221A16D1A300C17BAE /* OTRProtocolManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OTRProtocolManager.h; sourceTree = "<group>"; };
633105231A16D1A300C17BAE /* OTRProtocolManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OTRProtocolManager.m; sourceTree = "<group>"; };
6331052E1A16D1A300C17BAE /* OTRSettingsManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OTRSettingsManager.h; sourceTree = "<group>"; };
@ -641,6 +638,7 @@
D9C6E6A01B71575300572273 /* OTRUsernameCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OTRUsernameCell.swift; sourceTree = "<group>"; };
D9CBBC571C642BAA005CD715 /* EnablePushViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = EnablePushViewController.swift; path = "ChatSecure/Classes/View Controllers/Onboarding/EnablePushViewController.swift"; sourceTree = SOURCE_ROOT; };
D9DB2D131F37AEBB005D64E4 /* OTRYapMessageSendAction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OTRYapMessageSendAction.swift; sourceTree = "<group>"; };
D9DE95F322DA86AD00E76C7A /* OTRTorManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OTRTorManager.swift; sourceTree = "<group>"; };
D9DEC3491FABC9F900BF1F7C /* Settings.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = Settings.bundle; sourceTree = "<group>"; };
D9E8277D1E2819F20071F40D /* strings.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; name = strings.json; path = OTRAssets/Strings/strings.json; sourceTree = SOURCE_ROOT; };
D9EEEDD11D27388600B8BC54 /* OTRvCard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OTRvCard.h; path = "Yap Storage/OTRvCard.h"; sourceTree = "<group>"; };
@ -800,13 +798,11 @@
633105161A16D1A300C17BAE /* OTRDatabaseView.m */,
633105171A16D1A300C17BAE /* OTREncryptionManager.h */,
633105181A16D1A300C17BAE /* OTREncryptionManager.m */,
6331051D1A16D1A300C17BAE /* OTROAuthRefresher.h */,
6331051E1A16D1A300C17BAE /* OTROAuthRefresher.m */,
633105211A16D1A300C17BAE /* OTRProtocol.h */,
633105221A16D1A300C17BAE /* OTRProtocolManager.h */,
633105231A16D1A300C17BAE /* OTRProtocolManager.m */,
6331052E1A16D1A300C17BAE /* OTRSettingsManager.h */,
6331052F1A16D1A300C17BAE /* OTRSettingsManager.m */,
D9DE95F322DA86AD00E76C7A /* OTRTorManager.swift */,
633105301A16D1A300C17BAE /* OTRTorManager.h */,
633105311A16D1A300C17BAE /* OTRTorManager.m */,
633AF2F81A7C3DBB0030A3FF /* OTRAudioSessionManager.h */,
@ -1563,6 +1559,7 @@
D9EC47841EFA043B00C39B25 /* [Carthage] Copy Frameworks */,
D92F96D821BA1E7A0056EA35 /* LicensePlist */,
42829843B1DFA068A70F83E8 /* [CP] Copy Pods Resources */,
2D0230D0CF74A4A7D7BA77AB /* [CP] Embed Pods Frameworks */,
);
buildRules = (
);
@ -1584,6 +1581,7 @@
6396AFB11A169D54009F3E6C /* Resources */,
D9BE0B531EFAFED800BDF8D8 /* [Carthage] Copy Frameworks */,
3CDE4234E348F4E767DA1980 /* [CP] Copy Pods Resources */,
142353818BBDB61EA63263C1 /* [CP] Embed Pods Frameworks */,
);
buildRules = (
);
@ -1795,6 +1793,30 @@
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
142353818BBDB61EA63263C1 /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"${PODS_ROOT}/Target Support Files/Pods-ChatSecureCorePods-ChatSecureTests/Pods-ChatSecureCorePods-ChatSecureTests-frameworks.sh",
"${PODS_ROOT}/Tor/Build/iOS/Tor.framework",
"${PODS_ROOT}/Tor/Build/iOS/Tor.framework.dSYM",
"${PODS_ROOT}/Tor/Build/iOS/93C43FE0-93A2-3408-873F-124872631203.bcsymbolmap",
"${PODS_ROOT}/Tor/Build/iOS/3534DE4E-110A-335A-9AFF-D9BBFF6BC8FE.bcsymbolmap",
);
name = "[CP] Embed Pods Frameworks";
outputPaths = (
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Tor.framework",
"${DWARF_DSYM_FOLDER_PATH}/Tor.framework.dSYM",
"${BUILT_PRODUCTS_DIR}/93C43FE0-93A2-3408-873F-124872631203.bcsymbolmap",
"${BUILT_PRODUCTS_DIR}/3534DE4E-110A-335A-9AFF-D9BBFF6BC8FE.bcsymbolmap",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-ChatSecureCorePods-ChatSecureTests/Pods-ChatSecureCorePods-ChatSecureTests-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
26A8ED395C5418B361347335 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
@ -1813,6 +1835,30 @@
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
2D0230D0CF74A4A7D7BA77AB /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"${PODS_ROOT}/Target Support Files/Pods-ChatSecureCorePods-ChatSecure/Pods-ChatSecureCorePods-ChatSecure-frameworks.sh",
"${PODS_ROOT}/Tor/Build/iOS/Tor.framework",
"${PODS_ROOT}/Tor/Build/iOS/Tor.framework.dSYM",
"${PODS_ROOT}/Tor/Build/iOS/93C43FE0-93A2-3408-873F-124872631203.bcsymbolmap",
"${PODS_ROOT}/Tor/Build/iOS/3534DE4E-110A-335A-9AFF-D9BBFF6BC8FE.bcsymbolmap",
);
name = "[CP] Embed Pods Frameworks";
outputPaths = (
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Tor.framework",
"${DWARF_DSYM_FOLDER_PATH}/Tor.framework.dSYM",
"${BUILT_PRODUCTS_DIR}/93C43FE0-93A2-3408-873F-124872631203.bcsymbolmap",
"${BUILT_PRODUCTS_DIR}/3534DE4E-110A-335A-9AFF-D9BBFF6BC8FE.bcsymbolmap",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-ChatSecureCorePods-ChatSecure/Pods-ChatSecureCorePods-ChatSecure-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
3CDE4234E348F4E767DA1980 /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;

View File

@ -7,12 +7,20 @@
//
@import Foundation;
@import CPAProxy;
@import Tor;
NS_ASSUME_NONNULL_BEGIN
@interface OTRTorManager : NSObject
@property (nonatomic, strong) CPAProxyManager *torManager;
//@property (nonatomic, strong) CPAProxyManager *torManager;
@property (nonatomic, strong, readonly) TORController *torController;
@property (nonatomic, class, readonly) OTRTorManager *shared;
@property (nonatomic, class, readonly) NSString *SOCKSHost;
@property (nonatomic, class, readonly) uint16_t SOCKSPort;
+ (instancetype) sharedInstance;
@end
NS_ASSUME_NONNULL_END

View File

@ -7,32 +7,49 @@
//
#import "OTRTorManager.h"
@import CPAProxy;
@import Tor;
@implementation OTRTorManager
- (instancetype) init {
if (self = [super init]) {
// Get resource paths for the torrc and geoip files from the main bundle
NSBundle *cpaProxyFrameworkBundle = [NSBundle bundleForClass:[CPAProxyManager class]];
NSURL *cpaProxyBundleURL = [cpaProxyFrameworkBundle URLForResource:@"CPAProxy" withExtension:@"bundle"];
NSBundle *cpaProxyBundle = [[NSBundle alloc] initWithURL:cpaProxyBundleURL];
NSParameterAssert(cpaProxyBundle != nil);
NSString *torrcPath = [[NSBundle mainBundle] pathForResource:@"torrc" ofType:nil]; // use custom torrc
NSString *geoipPath = [cpaProxyBundle pathForResource:@"geoip" ofType:nil];
NSString *dataDirectory = [[[[[NSFileManager defaultManager] URLsForDirectory:NSApplicationSupportDirectory inDomains:NSUserDomainMask] lastObject] URLByAppendingPathComponent:@"com.ChatSecure.Tor"] path];
// Initialize a CPAProxyManager
CPAConfiguration *configuration = [CPAConfiguration configurationWithTorrcPath:torrcPath geoipPath:geoipPath torDataDirectoryPath:dataDirectory];
configuration.isolateDestinationAddress = YES;
configuration.isolateDestinationPort = YES;
self.torManager = [CPAProxyManager proxyWithConfiguration:configuration];
// Tor.framework
[self setupTorFramework];
}
return self;
}
- (void) setupTorFramework {
NSString *dataDirectory = [[[[[NSFileManager defaultManager] URLsForDirectory:NSApplicationSupportDirectory inDomains:NSUserDomainMask] lastObject] URLByAppendingPathComponent:@"com.ChatSecure.Tor"] path];
TORConfiguration *configuration = [TORConfiguration new];
configuration.cookieAuthentication = @(YES);
configuration.dataDirectory = dataDirectory;
NSString *SOCKSPort = @(OTRTorManager.SOCKSPort).stringValue;
configuration.arguments = @[@"--ignore-missing-torrc",
@"--socksport", SOCKSPort,
@"--controlport", @"127.0.0.1:49060",];
TORThread *thread = [[TORThread alloc] initWithConfiguration:configuration];
[thread start];
NSURL *cookieURL = [configuration.dataDirectory URLByAppendingPathComponent:@"control_auth_cookie"];
NSData *cookie = [NSData dataWithContentsOfURL:cookieURL];
_torController = [[TORController alloc] initWithSocketHost:@"127.0.0.1" port:49060];
[_torController authenticateWithData:cookie completion:^(BOOL success, NSError *error) {
if (!success)
return;
id circuitObserver = nil;
circuitObserver = [_torController addObserverForCircuitEstablished:^(BOOL established) {
if (!established)
return;
NSLog(@"Tor connected");
[_torController removeObserver:circuitObserver];
}];
}];
}
#pragma - mark Singleton Methodd
+ (instancetype)sharedInstance
@ -46,4 +63,16 @@
return _sharedInstance;
}
+ (OTRTorManager*) shared {
return [self sharedInstance];
}
+ (NSString*) SOCKSHost {
return @"127.0.0.1";
}
+ (uint16_t) SOCKSPort {
return 49050;
}
@end

View File

@ -0,0 +1 @@

View File

@ -217,9 +217,8 @@ typedef NS_ENUM(NSInteger, XMPPClientState) {
// File Transfer
NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration ephemeralSessionConfiguration];
if ([self isKindOfClass:[OTRXMPPTorManager class]]) {
CPAProxyManager *tor = [OTRTorManager sharedInstance].torManager;
NSString *proxyHost = tor.SOCKSHost;
NSUInteger proxyPort = tor.SOCKSPort;
NSString *proxyHost = OTRTorManager.SOCKSHost;
NSUInteger proxyPort = OTRTorManager.SOCKSPort;
NSDictionary *proxyDict = @{
(NSString *)kCFStreamPropertySOCKSProxyHost : proxyHost,
(NSString *)kCFStreamPropertySOCKSProxyPort : @(proxyPort)

View File

@ -21,7 +21,7 @@
@implementation OTRXMPPTorManager
- (void) connectUserInitiated:(BOOL)userInitiated {
if ([OTRTorManager sharedInstance].torManager.isConnected) {
if (OTRTorManager.shared.torController.isConnected) {
[super connectUserInitiated:userInitiated];
} else {
NSError * error = [NSError errorWithDomain:OTRXMPPErrorDomain code:OTRXMPPErrorCodeTorError userInfo:@{NSLocalizedDescriptionKey:NSLocalizedString(@"Need to connect to Tor first.", @"")}];
@ -37,8 +37,8 @@
// override
- (void) setupStream {
[super setupStream];
NSString *proxyHost = [OTRTorManager sharedInstance].torManager.SOCKSHost;
NSUInteger proxyPort = [OTRTorManager sharedInstance].torManager.SOCKSPort;
NSString *proxyHost = OTRTorManager.SOCKSHost;
NSUInteger proxyPort = OTRTorManager.SOCKSPort;
if ([self.xmppStream isKindOfClass:[ProxyXMPPStream class]]) {
ProxyXMPPStream *proxyStream = (ProxyXMPPStream*)self.xmppStream;
[proxyStream setProxyHost:proxyHost port:proxyPort version:GCDAsyncSocketSOCKSVersion5];

View File

@ -56,19 +56,21 @@
if (account.accountType == OTRAccountTypeXMPPTor) {
//check tor is running
if ([OTRTorManager sharedInstance].torManager.status == CPAStatusOpen) {
if (OTRTorManager.shared.torController.isConnected) {
[self finishRegisteringWithForm:form account:account];
} else if ([OTRTorManager sharedInstance].torManager.status == CPAStatusClosed) {
[[OTRTorManager sharedInstance].torManager setupWithCompletion:^(NSString *socksHost, NSUInteger socksPort, NSError *error) {
if (error) {
} else {
id circuitObserver = nil;
circuitObserver = [OTRTorManager.shared.torController addObserverForCircuitEstablished:^(BOOL established) {
if (!established) {
NSError *error = [NSError errorWithDomain:@"com.tor.error" code:1 userInfo:nil];
dispatch_async(dispatch_get_main_queue(), ^{
completion(account,error);
});
} else {
[OTRTorManager.shared.torController removeObserver:circuitObserver];
[self finishRegisteringWithForm:form account:account];
}
} progress:progress];
}];
}
} else {
[self finishRegisteringWithForm:form account:account];

View File

@ -210,19 +210,22 @@
if (account.accountType == OTRAccountTypeXMPPTor) {
//check tor is running
if ([OTRTorManager sharedInstance].torManager.status == CPAStatusOpen) {
if (OTRTorManager.shared.torController.isConnected) {
[self finishConnectingWithForm:form account:account];
} else if ([OTRTorManager sharedInstance].torManager.status == CPAStatusClosed) {
[[OTRTorManager sharedInstance].torManager setupWithCompletion:^(NSString *socksHost, NSUInteger socksPort, NSError *error) {
if (error) {
} else {
id circuitObserver = nil;
circuitObserver = [OTRTorManager.shared.torController addObserverForCircuitEstablished:^(BOOL established) {
if (!established) {
NSError *error = [NSError errorWithDomain:@"com.tor.error" code:1 userInfo:nil];
dispatch_async(dispatch_get_main_queue(), ^{
completion(account,error);
});
} else {
[OTRTorManager.shared.torController removeObserver:circuitObserver];
[self finishConnectingWithForm:form account:account];
}
} progress:progress];
}];
}
} else {
[self finishConnectingWithForm:form account:account];

View File

@ -344,6 +344,14 @@ name: SQLCipher, nameSpecified:
body: Copyright (c) 2008, …
version: 4.2.0
name: Tor, nameSpecified:
body: Copyright (c) 2015-2…
version: 400.5.1
name: Tor, nameSpecified:
body: Copyright (c) 2015-2…
version: 400.5.1
name: TTTAttributedLabel, nameSpecified:
body: Copyright (c) 2011 M…
version: 2.0.0

View File

@ -51,6 +51,7 @@ TODO: Add long description of the pod here.
s.dependency 'ProxyKit/Client', '~> 1.2.0'
s.dependency 'GCDWebServer', '~> 3.4'
s.dependency 'CPAProxy'
s.dependency 'Tor'
s.dependency 'XMPPFramework/Swift'
s.dependency 'ChatSecure-Push-iOS'

View File

@ -52,6 +52,7 @@ abstract_target 'ChatSecureCorePods' do
pod 'ProxyKit/Client', '~> 1.2.0'
pod 'GCDWebServer', '~> 3.4'
pod 'CPAProxy', :path => 'Submodules/CPAProxy/CPAProxy.podspec'
pod 'Tor', :podspec => 'Submodules/Tor_framework/Tor.podspec'
pod 'XMPPFramework/Swift', :path => 'Submodules/XMPPFramework/XMPPFramework.podspec'
pod 'ChatSecure-Push-iOS', :path => 'Submodules/ChatSecure-Push-iOS/ChatSecure-Push-iOS.podspec'

View File

@ -63,6 +63,7 @@ PODS:
- SAMKeychain (~> 1.5)
- SignalProtocolObjC
- SQLCipher (~> 4.2.0)
- Tor
- TTTAttributedLabel (~> 2.0)
- TUSafariActivity (~> 1.0)
- XLForm (~> 4.0.0)
@ -174,6 +175,7 @@ PODS:
- SQLCipher/common (4.2.0)
- SQLCipher/standard (4.2.0):
- SQLCipher/common
- Tor (400.5.1)
- TTTAttributedLabel (2.0.0)
- TUSafariActivity (1.0.4)
- XLForm (4.0.1)
@ -283,6 +285,7 @@ DEPENDENCIES:
- QRCodeReaderViewController (~> 4.0)
- SignalProtocolObjC (from `Submodules/SignalProtocol-ObjC/SignalProtocolObjC.podspec`)
- SQLCipher (~> 4.2)
- Tor (from `Submodules/Tor_framework/Tor.podspec`)
- TUSafariActivity (~> 1.0)
- XMPPFramework/Swift (from `Submodules/XMPPFramework/XMPPFramework.podspec`)
- YapDatabase/SQLCipher (from `Submodules/YapDatabase/YapDatabase.podspec`)
@ -350,6 +353,8 @@ EXTERNAL SOURCES:
:git: https://github.com/gmertk/ParkedTextField.git
SignalProtocolObjC:
:path: Submodules/SignalProtocol-ObjC/SignalProtocolObjC.podspec
Tor:
:podspec: Submodules/Tor_framework/Tor.podspec
XMPPFramework:
:path: Submodules/XMPPFramework/XMPPFramework.podspec
YapDatabase:
@ -373,7 +378,7 @@ SPEC CHECKSUMS:
BBlock: c56d7f72597ffe1634fcdc73836c5c0fed3271be
BButton: ab0f2ed3b998ae73c5188b57d270d81e4a1eeb27
ChatSecure-Push-iOS: ed51f98bc019be9e2d859604677a21a4ee68422e
ChatSecureCore: ae0bc3f0fa3d811121d7ec103e1b827aeb344d96
ChatSecureCore: c9a76fc1a5e1f0546e45f740d31cdc60de5e2a1f
CocoaAsyncSocket: eafaa68a7e0ec99ead0a7b35015e0bf25d2c8987
CocoaLumberjack: 2f44e60eb91c176d471fdba43b9e3eae6a721947
CPAProxy: b1b33221b6ad297169cb813b6bbefd2a69ea9aad
@ -407,6 +412,7 @@ SPEC CHECKSUMS:
SignalProtocolC: 051512e9f3abfeb4120c5e9673af9ae0ee370070
SignalProtocolObjC: b992ed29c3b7b453510ff0102ed16ef143f7efd2
SQLCipher: 0187a2180ac288ea686b670b7141da62cd013b16
Tor: 0dc8a8b0384133645b97faa589220d58432ec593
TTTAttributedLabel: 8cffe8e127e4e82ff3af1e5386d4cd0ad000b656
TUSafariActivity: afc55a00965377939107ce4fdc7f951f62454546
XLForm: b8d47a9a00fb6166981cb40de7169d70d611e9be
@ -415,6 +421,6 @@ SPEC CHECKSUMS:
YapTaskQueue: f3b23875bead71a7ee57b65637ce9c0e98b68c34
ZXingObjC: fdbb269f25dd2032da343e06f10224d62f537bdb
PODFILE CHECKSUM: b141f51290d05663f08b633a34ffb15eee02707b
PODFILE CHECKSUM: e37c7446a07a8cba3c312b14db6732f79e95c63f
COCOAPODS: 1.7.4

@ -0,0 +1 @@
Subproject commit 40e90e97d2f01fe0fc2ebac00e2caeca941c9f75