adium/adium

46d26d1fcbfd
Parents 0b511a094a1e
Children 89eb0d28dc0f
Add a "Tor (SOCKS5)" proxy option, which uses the Tor proxy option of libpurple.

This is basically a SOCKS5 proxy that forbids doing an DNS request locally, to prevent leaking information when using Tor.

Refs #15161
--- a/Frameworks/Adium Framework/Source/AIAccount.h Sun Mar 04 19:35:28 2012 +0100
+++ b/Frameworks/Adium Framework/Source/AIAccount.h Sun Mar 04 20:01:46 2012 +0100
@@ -54,7 +54,8 @@
Adium_Proxy_Default_HTTP,
Adium_Proxy_Default_SOCKS4,
Adium_Proxy_Default_SOCKS5,
- Adium_Proxy_None
+ Adium_Proxy_None,
+ Adium_Proxy_Tor
} AdiumProxyType;
//Privacy
@@ -330,6 +331,16 @@
*/
- (BOOL)shouldLogChat:(AIChat *)chat;
+/*!
+ * @brief The proxy's type used for this account.
+ */
+- (AdiumProxyType)proxyType;
+
+/*!
+ * @brief The proxy's hostname the user entered for this account.
+ */
+- (NSString *)proxyHost;
+
@end
@interface AIAccount (Private_ForSubclasses)
--- a/Frameworks/Adium Framework/Source/AIAccount.m Sun Mar 04 19:35:28 2012 +0100
+++ b/Frameworks/Adium Framework/Source/AIAccount.m Sun Mar 04 20:01:46 2012 +0100
@@ -96,6 +96,7 @@
Adium_Proxy_Default_HTTP_AS = 'DHTP',
Adium_Proxy_Default_SOCKS4_AS = 'DSK4',
Adium_Proxy_Default_SOCKS5_AS = 'DSK5',
+ Adium_Proxy_Tor_AS = 'TOS5',
Adium_Proxy_None_AS = 'NONE'
} AdiumProxyTypeApplescript;
@@ -1506,6 +1507,8 @@
return Adium_Proxy_Default_SOCKS4;
case Adium_Proxy_Default_SOCKS5_AS:
return Adium_Proxy_Default_SOCKS5;
+ case Adium_Proxy_Tor_AS:
+ return Adium_Proxy_Tor;
default:
return Adium_Proxy_None;
}
@@ -1526,6 +1529,8 @@
return Adium_Proxy_Default_SOCKS4_AS;
case Adium_Proxy_Default_SOCKS5:
return Adium_Proxy_Default_SOCKS5_AS;
+ case Adium_Proxy_Tor:
+ return Adium_Proxy_Tor_AS;
default:
return Adium_Proxy_None_AS;
}
--- a/Plugins/Purple Service/CBPurpleAccount.m Sun Mar 04 19:35:28 2012 +0100
+++ b/Plugins/Purple Service/CBPurpleAccount.m Sun Mar 04 20:01:46 2012 +0100
@@ -1993,6 +1993,9 @@
case Adium_Proxy_Default_SOCKS5:
purpleAccountProxyType = PURPLE_PROXY_SOCKS5;
break;
+ case Adium_Proxy_Tor:
+ purpleAccountProxyType = PURPLE_PROXY_TOR;
+ break;
case Adium_Proxy_None:
default:
purpleAccountProxyType = PURPLE_PROXY_NONE;
@@ -2002,7 +2005,16 @@
purple_proxy_info_set_type(proxy_info, purpleAccountProxyType);
if (proxyType != Adium_Proxy_None) {
- purple_proxy_info_set_host(proxy_info, (char *)[[proxyConfig objectForKey:@"Host"] UTF8String]);
+
+ /* In Tor mode, libpurple will not do any DNS queries itself, ever.
+ * However, if the user entered "localhost" as the proxy, then that will not be resolved either!
+ * Let's help the user here by replacing it with 127.0.0.1.
+ */
+ if ([[proxyConfig objectForKey:@"Host"] isEqualToString:@"localhost"]) {
+ purple_proxy_info_set_host(proxy_info, "127.0.0.1");
+ } else {
+ purple_proxy_info_set_host(proxy_info, (char *)[[proxyConfig objectForKey:@"Host"] UTF8String]);
+ }
purple_proxy_info_set_port(proxy_info, [(NSNumber*)[proxyConfig objectForKey:@"Port"] intValue]);
purple_proxy_info_set_username(proxy_info, (char *)[[proxyConfig objectForKey:@"Username"] UTF8String]);
--- a/Source/AIAccountProxySettings.m Sun Mar 04 19:35:28 2012 +0100
+++ b/Source/AIAccountProxySettings.m Sun Mar 04 20:01:46 2012 +0100
@@ -258,6 +258,7 @@
[proxyMenu addItem:[self _proxyMenuItemWithTitle:AILocalizedString(@"Systemwide HTTP Settings",nil) tag:Adium_Proxy_Default_HTTP]];
[proxyMenu addItem:[self _proxyMenuItemWithTitle:@"SOCKS4" tag:Adium_Proxy_SOCKS4]];
[proxyMenu addItem:[self _proxyMenuItemWithTitle:@"SOCKS5" tag:Adium_Proxy_SOCKS5]];
+ [proxyMenu addItem:[self _proxyMenuItemWithTitle:AILocalizedString(@"Tor (SOCKS5)",nil) tag:Adium_Proxy_Tor]];
[proxyMenu addItem:[self _proxyMenuItemWithTitle:@"HTTP" tag:Adium_Proxy_HTTP]];
return [proxyMenu autorelease];