diff --git a/src/org/torproject/android/service/TorService.java b/src/org/torproject/android/service/TorService.java index f22d8371..6709cad0 100644 --- a/src/org/torproject/android/service/TorService.java +++ b/src/org/torproject/android/service/TorService.java @@ -23,6 +23,7 @@ import java.io.PrintStream; import java.io.PrintWriter; import java.net.InetSocketAddress; import java.net.Proxy; +import java.net.ServerSocket; import java.net.Socket; import java.net.URL; import java.net.URLConnection; @@ -75,6 +76,7 @@ import android.support.v4.app.NotificationCompat; import android.support.v4.app.NotificationCompat.Builder; import android.util.Log; import android.widget.RemoteViews; +import android.widget.Toast; public class TorService extends Service implements TorServiceConstants, TorConstants, EventHandler { @@ -89,6 +91,11 @@ public class TorService extends Service implements TorServiceConstants, TorConst private Socket torConnSocket = null; private int mLastProcessId = -1; + + private int mPortHTTP = 8118; + private int mPortSOCKS = 9050; + + private static final int NOTIFY_ID = 1; private static final int TRANSPROXY_NOTIFY_ID = 2; private static final int ERROR_NOTIFY_ID = 3; @@ -646,7 +653,6 @@ public class TorService extends Service implements TorServiceConstants, TorConst fileControlPort = new File(appBinHome,"control.txt"); extraLines.append(TORRC_CONTROLPORT_FILE_KEY).append(' ').append(fileControlPort.getCanonicalPath()).append('\n'); - String socksPort = prefs.getString(TorConstants.PREF_SOCKS, TorServiceConstants.PORT_SOCKS_DEFAULT); String transPort = prefs.getString("pref_transport", TorServiceConstants.TOR_TRANSPROXY_PORT_DEFAULT+""); String dnsPort = prefs.getString("pref_dnsport", TorServiceConstants.TOR_DNS_PORT_DEFAULT+""); @@ -659,12 +665,9 @@ public class TorService extends Service implements TorServiceConstants, TorConst } extraLines.append("RunAsDaemon 1").append('\n'); - extraLines.append("AvoidDiskWrites 1").append('\n'); - - extraLines.append("CircuitStreamTimeout 120").append('\n'); - extraLines.append("SOCKSPort ").append(socksPort).append('\n'); + extraLines.append("SOCKSPort ").append("auto").append('\n'); extraLines.append("SafeSocks 0").append('\n'); extraLines.append("TestSocks 0").append('\n'); extraLines.append("WarnUnsafeSocks 1").append('\n'); @@ -674,7 +677,6 @@ public class TorService extends Service implements TorServiceConstants, TorConst extraLines.append("VirtualAddrNetwork 10.192.0.0/10").append('\n'); extraLines.append("AutomapHostsOnResolve 1").append('\n'); - extraLines.append(prefs.getString("pref_custom_torrc", "")); logNotice("updating torrc custom configuration..."); @@ -700,7 +702,7 @@ public class TorService extends Service implements TorServiceConstants, TorConst if (!fileBin.canExecute()) { logNotice("(re)Setting permission on binary: " + fileBin.getCanonicalPath()); - //Shell shell = Shell.startShell(new ArrayList(), appBinHome.getCanonicalPath()); + Shell shell = Shell.startShell(); shell.add(new SimpleCommand("chmod " + CHMOD_EXE_VALUE + ' ' + fileBin.getCanonicalPath())).waitForFinish(); @@ -740,7 +742,6 @@ public class TorService extends Service implements TorServiceConstants, TorConst currentStatus = STATUS_CONNECTING; - enableBinExec(fileTor); enableBinExec(filePolipo); enableBinExec(fileObfsclient); @@ -759,9 +760,28 @@ public class TorService extends Service implements TorServiceConstants, TorConst getHiddenServiceHostname (); - //checkAddressAndCountry(); } - + + private boolean flushTransparentProxyRules () throws Exception + { + + if (mHasRoot) + { + if (mTransProxy == null) + { + mTransProxy = new TorTransProxy(this, fileXtables); + + } + + mTransProxy.flushTransproxyRules(this); + + return true; + } + else + { + return false; + } + } /* * activate means whether to apply the users preferences @@ -777,7 +797,6 @@ public class TorService extends Service implements TorServiceConstants, TorConst mTransProxy = new TorTransProxy(this, fileXtables); } - SharedPreferences prefs = TorServiceUtils.getSharedPrefs(getApplicationContext()); @@ -925,8 +944,6 @@ public class TorService extends Service implements TorServiceConstants, TorConst private void updatePolipoConfig () throws FileNotFoundException, IOException { - SharedPreferences prefs = TorServiceUtils.getSharedPrefs(getApplicationContext()); - String socksPort = prefs.getString(TorConstants.PREF_SOCKS, TorServiceConstants.PORT_SOCKS_DEFAULT); File file = new File(appBinHome, POLIPOCONFIG_ASSET_KEY); @@ -934,8 +951,8 @@ public class TorService extends Service implements TorServiceConstants, TorConst props.load(new FileReader(file)); - props.put("socksParentProxy", "\"localhost:" + socksPort + "\""); - props.put("proxyPort","8118"); + props.put("socksParentProxy", "\"localhost:" + mPortSOCKS + "\""); + props.put("proxyPort",mPortHTTP+""); props.store(new FileWriter(file), "updated"); @@ -987,17 +1004,6 @@ public class TorService extends Service implements TorServiceConstants, TorConst } - /* - public String generateHashPassword () - { - - PasswordDigest d = PasswordDigest.generateDigest(); - byte[] s = d.getSecret(); // pass this to authenticate - String h = d.getHashedPassword(); // pass this to the Tor on startup. - - return null; - }*/ - private synchronized int initControlConnection (int maxTries) throws Exception, RuntimeException { int i = 0; @@ -1019,12 +1025,10 @@ public class TorService extends Service implements TorServiceConstants, TorConst torConnSocket = new Socket(IP_LOCALHOST, controlPort); torConnSocket.setSoTimeout(CONTROL_SOCKET_TIMEOUT); - boolean oo = true; - conn = new TorControlConnection(torConnSocket); conn.launchThread(true);//is daemon - logNotice( "SUCCESS connected to Tor control port"); + logNotice( "SUCCESS connected to Tor control port."); File fileCookie = new File(appCacheHome, TOR_CONTROL_COOKIE); @@ -1036,7 +1040,7 @@ public class TorService extends Service implements TorServiceConstants, TorConst fis.close(); conn.authenticate(cookie); - logNotice( "SUCCESS - authenticated to control port"); + logNotice( "SUCCESS - authenticated to control port."); sendCallbackStatusMessage(getString(R.string.tor_process_starting) + ' ' + getString(R.string.tor_process_complete)); @@ -1046,22 +1050,48 @@ public class TorService extends Service implements TorServiceConstants, TorConst if (ENABLE_DEBUG_LOG) { - //File fileLog = new File(getFilesDir(),"orbot-control-log.txt"); - //PrintWriter pr = new PrintWriter(new FileWriter(fileLog,true)); - //conn.setDebugging(pr); - File fileLog2 = new File(getFilesDir(),"orbot-tor-log.txt"); + fileLog2.setReadable(true); conn.setConf("Log", "debug file " + fileLog2.getCanonicalPath()); - } - String state = conn.getInfo("dormant"); - if (state != null && Integer.parseInt(state) == 0) - currentStatus = STATUS_ON; - else - currentStatus = STATUS_CONNECTING; + currentStatus = STATUS_CONNECTING; + String confSocks = conn.getInfo("net/listeners/socks"); + StringTokenizer st = new StringTokenizer(confSocks," "); + + confSocks = st.nextToken().split(":")[1]; + confSocks = confSocks.substring(0,confSocks.length()-1); + mPortSOCKS = Integer.parseInt(confSocks); + + SharedPreferences prefs = TorServiceUtils.getSharedPrefs(getApplicationContext()); + String socksPortPref = prefs.getString(TorConstants.PREF_SOCKS, TorServiceConstants.PORT_SOCKS_DEFAULT); + + try + { + int newSocksPort = Integer.parseInt(socksPortPref); + ServerSocket ss = new ServerSocket(newSocksPort); + ss.close(); + + ArrayList socksLines = new ArrayList(); + socksLines.add("SOCKSPort " + mPortSOCKS); + socksLines.add("SOCKSPort " + socksPortPref); + + conn.setConf(socksLines); + + mPortSOCKS = newSocksPort; + + sendCallbackLogMessage("Local SOCKS port: " + socksPortPref); + + } + catch (Exception e) + { + //sendCallbackLogMessage("ERROR adding SOCKS on port: " + socksPortPref); + sendCallbackLogMessage("Local SOCKS port: " + socksPortPref); + + } + return Integer.parseInt(torProcId); } @@ -1200,7 +1230,15 @@ public class TorService extends Service implements TorServiceConstants, TorConst * Returns the port number that the HTTP proxy is running on */ public int getHTTPPort() throws RemoteException { - return TorServiceConstants.PORT_HTTP; + return mPortHTTP; + } + + + /** + * Returns the port number that the HTTP proxy is running on + */ + public int getSOCKSPort() throws RemoteException { + return mPortSOCKS; } @@ -1274,7 +1312,7 @@ public class TorService extends Service implements TorServiceConstants, TorConst sb.append("): "); sb.append(status); - logNotice(sb.toString()); + debug(sb.toString()); } @@ -1390,8 +1428,23 @@ public class TorService extends Service implements TorServiceConstants, TorConst sb.append (" > "); } - logNotice(sb.toString()); - + if (ENABLE_DEBUG_LOG) + debug(sb.toString()); + else if(status.equals("BUILT")) + { + + if (currentStatus == STATUS_CONNECTING) + currentStatus = STATUS_ON; + + logNotice(sb.toString()); + + } + else if (status.equals("CLOSED")) + { + logNotice(sb.toString()); + + } + if (mShowExpandedNotifications) { //get IP from last nodename @@ -1407,15 +1460,6 @@ public class TorService extends Service implements TorServiceConstants, TorConst { hmBuiltNodes.remove(node.id); - //how check the IP's of any other nodes we have - for (String nodeId : hmBuiltNodes.keySet()) - { - node = hmBuiltNodes.get(nodeId); - - if (node.ipAddress == null) - mExecutor.execute(new ExternalIPFetcher(node)); - - } } } @@ -1456,7 +1500,7 @@ public class TorService extends Service implements TorServiceConstants, TorConst if (conn != null) { try { - //String nodeDetails = conn.getInfo("ns/id/"+nodes[0].id); + Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 8118)); URLConnection conn = new URL(ONIONOO_BASE_URL + mNode.id).openConnection(proxy); @@ -1683,8 +1727,6 @@ public class TorService extends Service implements TorServiceConstants, TorConst conn.signal("NEWNYM"); - //checkAddressAndCountry(); - } catch (Exception ioe){ debug("error requesting newnym: " + ioe.getLocalizedMessage()); @@ -1772,11 +1814,27 @@ public class TorService extends Service implements TorServiceConstants, TorConst } } + @Override public long[] getBandwidth() throws RemoteException { long[] bw = {lastRead,lastWritten,mTotalTrafficRead,mTotalTrafficWritten}; return bw; } + + @Override + public boolean flushTransProxy () throws RemoteException { + + try + { + return flushTransparentProxyRules(); + } + catch (Exception e) + { + Log.e(TAG,"error in transproxy",e); + return false; + } + + } }; private ArrayList mStatusBuffer = new ArrayList(); diff --git a/src/org/torproject/android/service/TorServiceConstants.java b/src/org/torproject/android/service/TorServiceConstants.java index c65c9a5d..19a99c89 100644 --- a/src/org/torproject/android/service/TorServiceConstants.java +++ b/src/org/torproject/android/service/TorServiceConstants.java @@ -51,7 +51,8 @@ public interface TorServiceConstants { public static int PORT_HTTP = 8118; //just like Privoxy! //Socks port client connects to, server is the Tor binary - public static String PORT_SOCKS_DEFAULT = "9050";//it can be auto, 0 or a port + public static String PORT_SOCKS_DEFAULT = "9050"; + //what is says! public final static String IP_LOCALHOST = "127.0.0.1";