jtorctl.patch 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. diff --git a/net/freehaven/tor/control/TorControlCommands.java b/net/freehaven/tor/control/TorControlCommands.java
  2. index 36482d5..14486e3 100644
  3. --- a/net/freehaven/tor/control/TorControlCommands.java
  4. +++ b/net/freehaven/tor/control/TorControlCommands.java
  5. @@ -144,5 +144,8 @@ public interface TorControlCommands {
  6. "No such OR",
  7. };
  8. + public static final String HS_ADDRESS = "onionAddress";
  9. + public static final String HS_PRIVKEY = "onionPrivKey";
  10. +
  11. }
  12. diff --git a/net/freehaven/tor/control/TorControlConnection.java b/net/freehaven/tor/control/TorControlConnection.java
  13. index 9524612..c0f2070 100644
  14. --- a/net/freehaven/tor/control/TorControlConnection.java
  15. +++ b/net/freehaven/tor/control/TorControlConnection.java
  16. @@ -736,11 +736,111 @@ public class TorControlConnection implements TorControlCommands {
  17. sendAndWaitForResponse("TAKEOWNERSHIP\r\n", null);
  18. }
  19. + /**
  20. + * Tells Tor to generate and set up a new onion service using the best
  21. + * supported algorithm.
  22. + * <p/>
  23. + * ADD_ONION was added in Tor 0.2.7.1-alpha.
  24. + */
  25. + public Map<String,String> addOnion(Map<Integer,String> portLines)
  26. + throws IOException {
  27. + return addOnion("NEW:BEST", portLines, null);
  28. + }
  29. +
  30. + /**
  31. + * Tells Tor to generate and set up a new onion service using the best
  32. + * supported algorithm.
  33. + * <p/>
  34. + * ADD_ONION was added in Tor 0.2.7.1-alpha.
  35. + */
  36. + public Map<String,String> addOnion(Map<Integer,String> portLines,
  37. + boolean ephemeral, boolean detach)
  38. + throws IOException {
  39. + return addOnion("NEW:BEST", portLines, ephemeral, detach);
  40. + }
  41. +
  42. + /**
  43. + * Tells Tor to set up an onion service using the provided private key.
  44. + * <p/>
  45. + * ADD_ONION was added in Tor 0.2.7.1-alpha.
  46. + */
  47. + public Map<String,String> addOnion(String privKey,
  48. + Map<Integer,String> portLines)
  49. + throws IOException {
  50. + return addOnion(privKey, portLines, null);
  51. + }
  52. +
  53. + /**
  54. + * Tells Tor to set up an onion service using the provided private key.
  55. + * <p/>
  56. + * ADD_ONION was added in Tor 0.2.7.1-alpha.
  57. + */
  58. + public Map<String,String> addOnion(String privKey,
  59. + Map<Integer,String> portLines,
  60. + boolean ephemeral, boolean detach)
  61. + throws IOException {
  62. + List<String> flags = new ArrayList<String>();
  63. + if (ephemeral)
  64. + flags.add("DiscardPK");
  65. + if (detach)
  66. + flags.add("Detach");
  67. + return addOnion(privKey, portLines, flags);
  68. + }
  69. +
  70. + /**
  71. + * Tells Tor to set up an onion service.
  72. + * <p/>
  73. + * ADD_ONION was added in Tor 0.2.7.1-alpha.
  74. + */
  75. + public Map<String,String> addOnion(String privKey,
  76. + Map<Integer,String> portLines,
  77. + List<String> flags)
  78. + throws IOException {
  79. + if (privKey.indexOf(':') < 0)
  80. + throw new IllegalArgumentException("Invalid privKey");
  81. + if (portLines == null || portLines.size() < 1)
  82. + throw new IllegalArgumentException("Must provide at least one port line");
  83. + StringBuilder b = new StringBuilder();
  84. + b.append("ADD_ONION ").append(privKey);
  85. + if (flags != null && flags.size() > 0) {
  86. + b.append(" Flags=");
  87. + String separator = "";
  88. + for (String flag : flags) {
  89. + b.append(separator).append(flag);
  90. + separator = ",";
  91. + }
  92. + }
  93. + for (Map.Entry<Integer,String> portLine : portLines.entrySet()) {
  94. + int virtPort = portLine.getKey();
  95. + String target = portLine.getValue();
  96. + b.append(" Port=").append(virtPort);
  97. + if (target != null && target.length() > 0)
  98. + b.append(",").append(target);
  99. + }
  100. + b.append("\r\n");
  101. + List<ReplyLine> lst = sendAndWaitForResponse(b.toString(), null);
  102. + Map<String,String> ret = new HashMap<String,String>();
  103. + ret.put(HS_ADDRESS, (lst.get(0)).msg.split("=", 2)[1]);
  104. + if (lst.size() > 2)
  105. + ret.put(HS_PRIVKEY, (lst.get(1)).msg.split("=", 2)[1]);
  106. + return ret;
  107. + }
  108. +
  109. + /**
  110. + * Tells Tor to take down an onion service previously set up with
  111. + * addOnion(). The hostname excludes the .onion extension.
  112. + * <p/>
  113. + * DEL_ONION was added in Tor 0.2.7.1-alpha.
  114. + */
  115. + public void delOnion(String hostname) throws IOException {
  116. + sendAndWaitForResponse("DEL_ONION " + hostname + "\r\n", null);
  117. + }
  118. +
  119. /** Tells Tor to forget any cached client state relating to the hidden
  120. * service with the given hostname (excluding the .onion extension).
  121. */
  122. public void forgetHiddenService(String hostname) throws IOException {
  123. - sendAndWaitForResponse("FORGETHS " + hostname + "\r\n", null);
  124. + sendAndWaitForResponse("HSFORGET " + hostname + "\r\n", null);
  125. }
  126. }