tor_extend 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Change.log +12 -0
- data/ReadME.txt +190 -0
- data/doc/ReadME_txt.html +301 -0
- data/doc/Tor.html +140 -0
- data/doc/Tor/Bridge.html +145 -0
- data/doc/Tor/CachedDesc.html +472 -0
- data/doc/Tor/Constants.html +185 -0
- data/doc/Tor/Router.html +146 -0
- data/doc/Tor/StatsObj.html +1209 -0
- data/doc/Tor/TController.html +1111 -0
- data/doc/created.rid +7 -0
- data/doc/images/add.png +0 -0
- data/doc/images/brick.png +0 -0
- data/doc/images/brick_link.png +0 -0
- data/doc/images/bug.png +0 -0
- data/doc/images/bullet_black.png +0 -0
- data/doc/images/bullet_toggle_minus.png +0 -0
- data/doc/images/bullet_toggle_plus.png +0 -0
- data/doc/images/date.png +0 -0
- data/doc/images/delete.png +0 -0
- data/doc/images/find.png +0 -0
- data/doc/images/loadingAnimation.gif +0 -0
- data/doc/images/macFFBgHack.png +0 -0
- data/doc/images/package.png +0 -0
- data/doc/images/page_green.png +0 -0
- data/doc/images/page_white_text.png +0 -0
- data/doc/images/page_white_width.png +0 -0
- data/doc/images/plugin.png +0 -0
- data/doc/images/ruby.png +0 -0
- data/doc/images/tag_blue.png +0 -0
- data/doc/images/tag_green.png +0 -0
- data/doc/images/transparent.png +0 -0
- data/doc/images/wrench.png +0 -0
- data/doc/images/wrench_orange.png +0 -0
- data/doc/images/zoom.png +0 -0
- data/doc/index.html +90 -0
- data/doc/js/darkfish.js +153 -0
- data/doc/js/jquery.js +18 -0
- data/doc/js/navigation.js +142 -0
- data/doc/js/search.js +94 -0
- data/doc/js/search_index.js +1 -0
- data/doc/js/searcher.js +228 -0
- data/doc/lib/constants_rb.html +96 -0
- data/doc/lib/httpmod_rb.html +95 -0
- data/doc/lib/tcontroller_rb.html +93 -0
- data/doc/lib/tor_extend_rb.html +97 -0
- data/doc/lib/tstats_rb.html +93 -0
- data/doc/rdoc.css +543 -0
- data/doc/table_of_contents.html +159 -0
- data/lib/constants.rb +106 -0
- data/lib/httpmod.rb +89 -0
- data/lib/tcontroller.rb +475 -0
- data/lib/tor_extend.rb +189 -0
- data/lib/tstats.rb +514 -0
- data/tor_extend.gemspec +26 -0
- metadata +138 -0
@@ -0,0 +1,159 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
|
3
|
+
<html>
|
4
|
+
<head>
|
5
|
+
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
|
6
|
+
|
7
|
+
<title>Table of Contents</title>
|
8
|
+
|
9
|
+
<link type="text/css" media="screen" href="./rdoc.css" rel="stylesheet">
|
10
|
+
|
11
|
+
<script type="text/javascript">
|
12
|
+
var rdoc_rel_prefix = "./";
|
13
|
+
</script>
|
14
|
+
|
15
|
+
<script type="text/javascript" charset="utf-8" src="./js/jquery.js"></script>
|
16
|
+
<script type="text/javascript" charset="utf-8" src="./js/navigation.js"></script>
|
17
|
+
<script type="text/javascript" charset="utf-8" src="./js/search_index.js"></script>
|
18
|
+
<script type="text/javascript" charset="utf-8" src="./js/search.js"></script>
|
19
|
+
<script type="text/javascript" charset="utf-8" src="./js/searcher.js"></script>
|
20
|
+
<script type="text/javascript" charset="utf-8" src="./js/darkfish.js"></script>
|
21
|
+
|
22
|
+
|
23
|
+
<body class="indexpage">
|
24
|
+
<h1>Table of Contents</h1>
|
25
|
+
|
26
|
+
<h2>Pages</h2>
|
27
|
+
<ul>
|
28
|
+
<li class="file">
|
29
|
+
<a href="ReadME_txt.html">ReadME</a>
|
30
|
+
</li>
|
31
|
+
|
32
|
+
</ul>
|
33
|
+
|
34
|
+
<h2 id="classes">Classes/Modules</h2>
|
35
|
+
<ul>
|
36
|
+
<li class="module">
|
37
|
+
<a href="Tor.html">Tor</a>
|
38
|
+
</li>
|
39
|
+
<li class="class">
|
40
|
+
<a href="Tor/Bridge.html">Tor::Bridge</a>
|
41
|
+
</li>
|
42
|
+
<li class="class">
|
43
|
+
<a href="Tor/CachedDesc.html">Tor::CachedDesc</a>
|
44
|
+
</li>
|
45
|
+
<li class="module">
|
46
|
+
<a href="Tor/Constants.html">Tor::Constants</a>
|
47
|
+
</li>
|
48
|
+
<li class="class">
|
49
|
+
<a href="Tor/Router.html">Tor::Router</a>
|
50
|
+
</li>
|
51
|
+
<li class="class">
|
52
|
+
<a href="Tor/StatsObj.html">Tor::StatsObj</a>
|
53
|
+
</li>
|
54
|
+
<li class="class">
|
55
|
+
<a href="Tor/TController.html">Tor::TController</a>
|
56
|
+
</li>
|
57
|
+
|
58
|
+
</ul>
|
59
|
+
|
60
|
+
<h2 id="methods">Methods</h2>
|
61
|
+
<ul>
|
62
|
+
|
63
|
+
<li class="method"><a href="Tor/CachedDesc.html#method-c-new">::new — Tor::CachedDesc</a>
|
64
|
+
|
65
|
+
<li class="method"><a href="Tor/TController.html#method-i-attach_stream">#attach_stream — Tor::TController</a>
|
66
|
+
|
67
|
+
<li class="method"><a href="Tor/TController.html#method-i-bridges">#bridges — Tor::TController</a>
|
68
|
+
|
69
|
+
<li class="method"><a href="Tor/TController.html#method-i-cir_status">#cir_status — Tor::TController</a>
|
70
|
+
|
71
|
+
<li class="method"><a href="Tor/TController.html#method-i-closeallcircuits">#closeallcircuits — Tor::TController</a>
|
72
|
+
|
73
|
+
<li class="method"><a href="Tor/TController.html#method-i-closecircuit">#closecircuit — Tor::TController</a>
|
74
|
+
|
75
|
+
<li class="method"><a href="Tor/StatsObj.html#method-i-continent_count">#continent_count — Tor::StatsObj</a>
|
76
|
+
|
77
|
+
<li class="method"><a href="Tor/StatsObj.html#method-i-continent_count_uniq">#continent_count_uniq — Tor::StatsObj</a>
|
78
|
+
|
79
|
+
<li class="method"><a href="Tor/StatsObj.html#method-i-continent_getfingerprint">#continent_getfingerprint — Tor::StatsObj</a>
|
80
|
+
|
81
|
+
<li class="method"><a href="Tor/StatsObj.html#method-i-continent_list">#continent_list — Tor::StatsObj</a>
|
82
|
+
|
83
|
+
<li class="method"><a href="Tor/StatsObj.html#method-i-continent_stat">#continent_stat — Tor::StatsObj</a>
|
84
|
+
|
85
|
+
<li class="method"><a href="Tor/StatsObj.html#method-i-continent_stat_uniq">#continent_stat_uniq — Tor::StatsObj</a>
|
86
|
+
|
87
|
+
<li class="method"><a href="Tor/StatsObj.html#method-i-country_count">#country_count — Tor::StatsObj</a>
|
88
|
+
|
89
|
+
<li class="method"><a href="Tor/StatsObj.html#method-i-country_count_uniq">#country_count_uniq — Tor::StatsObj</a>
|
90
|
+
|
91
|
+
<li class="method"><a href="Tor/StatsObj.html#method-i-country_getfingerprint">#country_getfingerprint — Tor::StatsObj</a>
|
92
|
+
|
93
|
+
<li class="method"><a href="Tor/StatsObj.html#method-i-country_getip">#country_getip — Tor::StatsObj</a>
|
94
|
+
|
95
|
+
<li class="method"><a href="Tor/StatsObj.html#method-i-country_list">#country_list — Tor::StatsObj</a>
|
96
|
+
|
97
|
+
<li class="method"><a href="Tor/StatsObj.html#method-i-country_stat">#country_stat — Tor::StatsObj</a>
|
98
|
+
|
99
|
+
<li class="method"><a href="Tor/StatsObj.html#method-i-country_stat_uniq">#country_stat_uniq — Tor::StatsObj</a>
|
100
|
+
|
101
|
+
<li class="method"><a href="Tor/CachedDesc.html#method-i-dbconnect">#dbconnect — Tor::CachedDesc</a>
|
102
|
+
|
103
|
+
<li class="method"><a href="Tor/TController.html#method-i-ds">#ds — Tor::TController</a>
|
104
|
+
|
105
|
+
<li class="method"><a href="Tor/TController.html#method-i-extendcir">#extendcir — Tor::TController</a>
|
106
|
+
|
107
|
+
<li class="method"><a href="Tor/TController.html#method-i-extendcir_slowly">#extendcir_slowly — Tor::TController</a>
|
108
|
+
|
109
|
+
<li class="method"><a href="Tor/StatsObj.html#method-i-genkml">#genkml — Tor::StatsObj</a>
|
110
|
+
|
111
|
+
<li class="method"><a href="Tor/TController.html#method-i-get_bridges">#get_bridges — Tor::TController</a>
|
112
|
+
|
113
|
+
<li class="method"><a href="Tor/StatsObj.html#method-i-get_countryname">#get_countryname — Tor::StatsObj</a>
|
114
|
+
|
115
|
+
<li class="method"><a href="Tor/TController.html#method-i-get_entryguards">#get_entryguards — Tor::TController</a>
|
116
|
+
|
117
|
+
<li class="method"><a href="Tor/CachedDesc.html#method-i-get_geoiprecord">#get_geoiprecord — Tor::CachedDesc</a>
|
118
|
+
|
119
|
+
<li class="method"><a href="Tor/TController.html#method-i-get_httperrors">#get_httperrors — Tor::TController</a>
|
120
|
+
|
121
|
+
<li class="method"><a href="Tor/StatsObj.html#method-i-get_latlng">#get_latlng — Tor::StatsObj</a>
|
122
|
+
|
123
|
+
<li class="method"><a href="Tor/TController.html#method-i-get_purposeip">#get_purposeip — Tor::TController</a>
|
124
|
+
|
125
|
+
<li class="method"><a href="Tor/StatsObj.html#method-i-get_uniqid">#get_uniqid — Tor::StatsObj</a>
|
126
|
+
|
127
|
+
<li class="method"><a href="Tor/TController.html#method-i-getconf">#getconf — Tor::TController</a>
|
128
|
+
|
129
|
+
<li class="method"><a href="Tor/TController.html#method-i-getinfo">#getinfo — Tor::TController</a>
|
130
|
+
|
131
|
+
<li class="method"><a href="Tor/TController.html#method-i-net_status">#net_status — Tor::TController</a>
|
132
|
+
|
133
|
+
<li class="method"><a href="Tor/TController.html#method-i-newstreams">#newstreams — Tor::TController</a>
|
134
|
+
|
135
|
+
<li class="method"><a href="Tor/CachedDesc.html#method-i-ors">#ors — Tor::CachedDesc</a>
|
136
|
+
|
137
|
+
<li class="method"><a href="Tor/CachedDesc.html#method-i-readall">#readall — Tor::CachedDesc</a>
|
138
|
+
|
139
|
+
<li class="method"><a href="Tor/TController.html#method-i-setconf">#setconf — Tor::TController</a>
|
140
|
+
|
141
|
+
<li class="method"><a href="Tor/TController.html#method-i-signal">#signal — Tor::TController</a>
|
142
|
+
|
143
|
+
<li class="method"><a href="Tor/TController.html#method-i-sr">#sr — Tor::TController</a>
|
144
|
+
|
145
|
+
<li class="method"><a href="Tor/CachedDesc.html#method-i-stat">#stat — Tor::CachedDesc</a>
|
146
|
+
|
147
|
+
<li class="method"><a href="Tor/StatsObj.html#method-i-topcountries">#topcountries — Tor::StatsObj</a>
|
148
|
+
|
149
|
+
<li class="method"><a href="Tor/StatsObj.html#method-i-topcountries_uniq">#topcountries_uniq — Tor::StatsObj</a>
|
150
|
+
|
151
|
+
</ul>
|
152
|
+
|
153
|
+
|
154
|
+
<footer id="validator-badges">
|
155
|
+
<p><a href="http://validator.w3.org/check/referer">[Validate]</a>
|
156
|
+
<p>Generated by <a href="https://github.com/rdoc/rdoc">RDoc</a> 3.11.
|
157
|
+
<p>Generated with the <a href="http://deveiate.org/projects/Darkfish-Rdoc/">Darkfish Rdoc Generator</a> 3.
|
158
|
+
</footer>
|
159
|
+
|
data/lib/constants.rb
ADDED
@@ -0,0 +1,106 @@
|
|
1
|
+
|
2
|
+
# This module contains constants for the Tor module such as a COUNLATLNG
|
3
|
+
module Tor::Constants
|
4
|
+
|
5
|
+
|
6
|
+
# This maps the coordinates of each country to its country code.
|
7
|
+
#
|
8
|
+
# *Get* *Coordinates* *for* *countries*
|
9
|
+
# Tor::Constants::COUNLATLNG["FR"] =>{:lat=>46.0, :lng=>2.0}
|
10
|
+
# Tor::Constants::COUNLATLNG["GB"] =>{:lat=>54.0, :lng=>-2.0}
|
11
|
+
# Tor::Constants::COUNLATLNG["FR"][:lat] =>46.0
|
12
|
+
# Tor::Constants::COUNLATLNG["GB"][lng] =>-2.0
|
13
|
+
#
|
14
|
+
# A1 and A2 - anonymous proxies and satelite providers - added using cordinates (0,0)
|
15
|
+
# IM, AX, JE added from the CIA factbook, the others from the Maxmind page
|
16
|
+
# <b>NOTE:</b> See the following links for more details
|
17
|
+
# CIA Factbook online [https://www.cia.gov/library/publications/the-world-factbook/fields/2011.html]
|
18
|
+
# Maxmind(2007) - Average Latitude and longitude for countries [http://www.maxmind.com/app/country_latlon]
|
19
|
+
COUNLATLNG = {
|
20
|
+
"AD"=>{:lat=>42.5, :lng=>1.5}, "AE"=>{:lat=>24.0, :lng=>54.0}, "AF"=>{:lat=>33.0, :lng=>65.0}, "AG"=>{:lat=>17.05, :lng=>-61.8},"AI"=>{:lat=>18.25, :lng=>-63.1667},
|
21
|
+
"AL"=>{:lat=>41.0, :lng=>20.0}, "AM"=>{:lat=>40.0, :lng=>45.0},"AN"=>{:lat=>12.25, :lng=>-68.75}, "AO"=>{:lat=>-12.5, :lng=>18.5},
|
22
|
+
"AP"=>{:lat=>35.0, :lng=>105.0}, "AQ"=>{:lat=>-90.0, :lng=>0.0}, "AR"=>{:lat=>-34.0, :lng=>-64.0}, "AS"=>{:lat=>-14.3333, :lng=>-170.0},
|
23
|
+
"AT"=>{:lat=>47.3333, :lng=>13.3333}, "AU"=>{:lat=>-27.0, :lng=>133.0}, "AW"=>{:lat=>12.5, :lng=>-69.9667}, "AZ"=>{:lat=>40.5, :lng=>47.5},
|
24
|
+
"BA"=>{:lat=>44.0, :lng=>18.0}, "BB"=>{:lat=>13.1667, :lng=>-59.5333}, "BD"=>{:lat=>24.0, :lng=>90.0}, "BE"=>{:lat=>50.8333, :lng=>4.0},
|
25
|
+
"BF"=>{:lat=>13.0, :lng=>-2.0}, "BG"=>{:lat=>43.0, :lng=>25.0}, "BH"=>{:lat=>26.0, :lng=>50.55}, "BI"=>{:lat=>-3.5, :lng=>30.0},
|
26
|
+
"BJ"=>{:lat=>9.5, :lng=>2.25}, "BM"=>{:lat=>32.3333, :lng=>-64.75}, "BN"=>{:lat=>4.5, :lng=>114.6667}, "BO"=>{:lat=>-17.0, :lng=>-65.0},
|
27
|
+
"BR"=>{:lat=>-10.0, :lng=>-55.0}, "BS"=>{:lat=>24.25, :lng=>-76.0}, "BT"=>{:lat=>27.5, :lng=>90.5}, "BV"=>{:lat=>-54.4333, :lng=>3.4},
|
28
|
+
"BW"=>{:lat=>-22.0, :lng=>24.0}, "BY"=>{:lat=>53.0, :lng=>28.0}, "BZ"=>{:lat=>17.25, :lng=>-88.75}, "CA"=>{:lat=>60.0, :lng=>-95.0},
|
29
|
+
"CC"=>{:lat=>-12.5, :lng=>96.8333}, "CD"=>{:lat=>0.0, :lng=>25.0}, "CF"=>{:lat=>7.0, :lng=>21.0}, "CG"=>{:lat=>-1.0, :lng=>15.0},
|
30
|
+
"CH"=>{:lat=>47.0, :lng=>8.0}, "CI"=>{:lat=>8.0, :lng=>-5.0}, "CK"=>{:lat=>-21.2333, :lng=>-159.7667}, "CL"=>{:lat=>-30.0, :lng=>-71.0},
|
31
|
+
"CM"=>{:lat=>6.0, :lng=>12.0}, "CN"=>{:lat=>35.0, :lng=>105.0}, "CO"=>{:lat=>4.0, :lng=>-72.0}, "CR"=>{:lat=>10.0, :lng=>-84.0},
|
32
|
+
"CU"=>{:lat=>21.5, :lng=>-80.0}, "CV"=>{:lat=>16.0, :lng=>-24.0}, "CX"=>{:lat=>-10.5, :lng=>105.6667}, "CY"=>{:lat=>35.0, :lng=>33.0},
|
33
|
+
"CZ"=>{:lat=>49.75, :lng=>15.5}, "DE"=>{:lat=>51.0, :lng=>9.0}, "DJ"=>{:lat=>11.5, :lng=>43.0}, "DK"=>{:lat=>56.0, :lng=>10.0},
|
34
|
+
"DM"=>{:lat=>15.4167, :lng=>-61.3333}, "DO"=>{:lat=>19.0, :lng=>-70.6667}, "DZ"=>{:lat=>28.0, :lng=>3.0}, "EC"=>{:lat=>-2.0, :lng=>-77.5},
|
35
|
+
"EE"=>{:lat=>59.0, :lng=>26.0}, "EG"=>{:lat=>27.0, :lng=>30.0}, "EH"=>{:lat=>24.5, :lng=>-13.0}, "ER"=>{:lat=>15.0, :lng=>39.0},
|
36
|
+
"ES"=>{:lat=>40.0, :lng=>-4.0}, "ET"=>{:lat=>8.0, :lng=>38.0}, "EU"=>{:lat=>47.0, :lng=>8.0}, "FI"=>{:lat=>64.0, :lng=>26.0},
|
37
|
+
"FJ"=>{:lat=>-18.0, :lng=>175.0}, "FK"=>{:lat=>-51.75, :lng=>-59.0}, "FM"=>{:lat=>6.9167, :lng=>158.25}, "FO"=>{:lat=>62.0, :lng=>-7.0},
|
38
|
+
"FR"=>{:lat=>46.0, :lng=>2.0}, "GA"=>{:lat=>-1.0, :lng=>11.75}, "GB"=>{:lat=>54.0, :lng=>-2.0}, "GD"=>{:lat=>12.1167, :lng=>-61.6667},
|
39
|
+
"GE"=>{:lat=>42.0, :lng=>43.5}, "GF"=>{:lat=>4.0, :lng=>-53.0}, "GH"=>{:lat=>8.0, :lng=>-2.0}, "GI"=>{:lat=>36.1833, :lng=>-5.3667},
|
40
|
+
"GL"=>{:lat=>72.0, :lng=>-40.0}, "GM"=>{:lat=>13.4667, :lng=>-16.5667}, "GN"=>{:lat=>11.0, :lng=>-10.0}, "GP"=>{:lat=>16.25,:lng=>-61.5833},
|
41
|
+
"GQ"=>{:lat=>2.0, :lng=>10.0}, "GR"=>{:lat=>39.0, :lng=>22.0}, "GS"=>{:lat=>-54.5, :lng=>-37.0}, "GT"=>{:lat=>15.5, :lng=>-90.25},
|
42
|
+
"GU"=>{:lat=>13.4667, :lng=>144.7833}, "GW"=>{:lat=>12.0, :lng=>-15.0}, "GY"=>{:lat=>5.0, :lng=>-59.0}, "HK"=>{:lat=>22.25, :lng=>114.1667}, "HM"=>{:lat=>-53.1, :lng=>72.5167}, "HN"=>{:lat=>15.0, :lng=>-86.5}, "HR"=>{:lat=>45.1667, :lng=>15.5}, "HT"=>{:lat=>19.0, :lng=>-72.4167},
|
43
|
+
"HU"=>{:lat=>47.0, :lng=>20.0}, "ID"=>{:lat=>-5.0, :lng=>120.0}, "IE"=>{:lat=>53.0, :lng=>-8.0}, "IL"=>{:lat=>31.5, :lng=>34.75},
|
44
|
+
"IN"=>{:lat=>20.0, :lng=>77.0}, "IO"=>{:lat=>-6.0, :lng=>71.5}, "IQ"=>{:lat=>33.0, :lng=>44.0}, "IR"=>{:lat=>32.0, :lng=>53.0},
|
45
|
+
"IS"=>{:lat=>65.0, :lng=>-18.0}, "IT"=>{:lat=>42.8333, :lng=>12.8333}, "JM"=>{:lat=>18.25, :lng=>-77.5}, "JO"=>{:lat=>31.0, :lng=>36.0},
|
46
|
+
"JP"=>{:lat=>36.0, :lng=>138.0}, "KE"=>{:lat=>1.0, :lng=>38.0}, "KG"=>{:lat=>41.0, :lng=>75.0}, "KH"=>{:lat=>13.0, :lng=>105.0},
|
47
|
+
"KI"=>{:lat=>1.4167, :lng=>173.0}, "KM"=>{:lat=>-12.1667, :lng=>44.25}, "KN"=>{:lat=>17.3333, :lng=>-62.75}, "KP"=>{:lat=>40.0, :lng=>127.0},
|
48
|
+
"KR"=>{:lat=>37.0, :lng=>127.5}, "KW"=>{:lat=>29.3375, :lng=>47.6581}, "KY"=>{:lat=>19.5, :lng=>-80.5}, "KZ"=>{:lat=>48.0, :lng=>68.0},
|
49
|
+
"LA"=>{:lat=>18.0, :lng=>105.0}, "LB"=>{:lat=>33.8333, :lng=>35.8333}, "LC"=>{:lat=>13.8833, :lng=>-61.1333}, "LI"=>{:lat=>47.1667, :lng=>9.5333},
|
50
|
+
"LK"=>{:lat=>7.0, :lng=>81.0}, "LR"=>{:lat=>6.5, :lng=>-9.5}, "LS"=>{:lat=>-29.5, :lng=>28.5}, "LT"=>{:lat=>56.0, :lng=>24.0},
|
51
|
+
"LU"=>{:lat=>49.75, :lng=>6.1667}, "LV"=>{:lat=>57.0, :lng=>25.0}, "LY"=>{:lat=>25.0, :lng=>17.0}, "MA"=>{:lat=>32.0, :lng=>-5.0},
|
52
|
+
"MC"=>{:lat=>43.7333, :lng=>7.4}, "MD"=>{:lat=>47.0, :lng=>29.0}, "ME"=>{:lat=>42.0, :lng=>19.0}, "MG"=>{:lat=>-20.0, :lng=>47.0},
|
53
|
+
"MH"=>{:lat=>9.0, :lng=>168.0}, "MK"=>{:lat=>41.8333, :lng=>22.0}, "ML"=>{:lat=>17.0, :lng=>-4.0}, "MM"=>{:lat=>22.0, :lng=>98.0},
|
54
|
+
"MN"=>{:lat=>46.0, :lng=>105.0}, "MO"=>{:lat=>22.1667, :lng=>113.55}, "MP"=>{:lat=>15.2, :lng=>145.75}, "MQ"=>{:lat=>14.6667, :lng=>-61.0},
|
55
|
+
"MR"=>{:lat=>20.0, :lng=>-12.0}, "MS"=>{:lat=>16.75, :lng=>-62.2}, "MT"=>{:lat=>35.8333, :lng=>14.5833}, "MU"=>{:lat=>-20.2833, :lng=>57.55},
|
56
|
+
"MV"=>{:lat=>3.25, :lng=>73.0}, "MW"=>{:lat=>-13.5, :lng=>34.0}, "MX"=>{:lat=>23.0, :lng=>-102.0}, "MY"=>{:lat=>2.5, :lng=>112.5},
|
57
|
+
"MZ"=>{:lat=>-18.25, :lng=>35.0}, "NA"=>{:lat=>-22.0, :lng=>17.0}, "NC"=>{:lat=>-21.5, :lng=>165.5}, "NE"=>{:lat=>16.0, :lng=>8.0},
|
58
|
+
"NF"=>{:lat=>-29.0333, :lng=>167.95}, "NG"=>{:lat=>10.0, :lng=>8.0}, "NI"=>{:lat=>13.0, :lng=>-85.0}, "NL"=>{:lat=>52.5, :lng=>5.75},
|
59
|
+
"NO"=>{:lat=>62.0, :lng=>10.0}, "NP"=>{:lat=>28.0, :lng=>84.0}, "NR"=>{:lat=>-0.5333, :lng=>166.9167}, "NU"=>{:lat=>-19.0333, :lng=>-169.8667},
|
60
|
+
"NZ"=>{:lat=>-41.0, :lng=>174.0}, "OM"=>{:lat=>21.0, :lng=>57.0}, "PA"=>{:lat=>9.0, :lng=>-80.0}, "PE"=>{:lat=>-10.0, :lng=>-76.0},
|
61
|
+
"PF"=>{:lat=>-15.0, :lng=>-140.0}, "PG"=>{:lat=>-6.0, :lng=>147.0}, "PH"=>{:lat=>13.0, :lng=>122.0}, "PK"=>{:lat=>30.0, :lng=>70.0},
|
62
|
+
"PL"=>{:lat=>52.0, :lng=>20.0}, "PM"=>{:lat=>46.8333, :lng=>-56.3333}, "PR"=>{:lat=>18.25, :lng=>-66.5}, "PS"=>{:lat=>32.0, :lng=>35.25},
|
63
|
+
"PT"=>{:lat=>39.5, :lng=>-8.0}, "PW"=>{:lat=>7.5, :lng=>134.5}, "PY"=>{:lat=>-23.0, :lng=>-58.0}, "QA"=>{:lat=>25.5, :lng=>51.25},
|
64
|
+
"RE"=>{:lat=>-21.1, :lng=>55.6}, "RO"=>{:lat=>46.0, :lng=>25.0}, "RS"=>{:lat=>44.0, :lng=>21.0}, "RU"=>{:lat=>60.0, :lng=>100.0},
|
65
|
+
"RW"=>{:lat=>-2.0, :lng=>30.0}, "SA"=>{:lat=>25.0, :lng=>45.0}, "SB"=>{:lat=>-8.0, :lng=>159.0}, "SC"=>{:lat=>-4.5833, :lng=>55.6667},
|
66
|
+
"SD"=>{:lat=>15.0, :lng=>30.0}, "SE"=>{:lat=>62.0, :lng=>15.0}, "SG"=>{:lat=>1.3667, :lng=>103.8}, "SH"=>{:lat=>-15.9333, :lng=>-5.7},
|
67
|
+
"SI"=>{:lat=>46.0, :lng=>15.0}, "SJ"=>{:lat=>78.0, :lng=>20.0}, "SK"=>{:lat=>48.6667, :lng=>19.5}, "SL"=>{:lat=>8.5, :lng=>-11.5},
|
68
|
+
"SM"=>{:lat=>43.7667, :lng=>12.4167}, "SN"=>{:lat=>14.0, :lng=>-14.0}, "SO"=>{:lat=>10.0, :lng=>49.0}, "SR"=>{:lat=>4.0, :lng=>-56.0},
|
69
|
+
"ST"=>{:lat=>1.0, :lng=>7.0}, "SV"=>{:lat=>13.8333, :lng=>-88.9167}, "SY"=>{:lat=>35.0, :lng=>38.0}, "SZ"=>{:lat=>-26.5, :lng=>31.5},
|
70
|
+
"TC"=>{:lat=>21.75, :lng=>-71.5833}, "TD"=>{:lat=>15.0, :lng=>19.0}, "TF"=>{:lat=>-43.0, :lng=>67.0}, "TG"=>{:lat=>8.0, :lng=>1.1667},
|
71
|
+
"TH"=>{:lat=>15.0, :lng=>100.0}, "TJ"=>{:lat=>39.0, :lng=>71.0}, "TK"=>{:lat=>-9.0, :lng=>-172.0}, "TM"=>{:lat=>40.0, :lng=>60.0},
|
72
|
+
"TN"=>{:lat=>34.0, :lng=>9.0}, "TO"=>{:lat=>-20.0, :lng=>-175.0}, "TR"=>{:lat=>39.0, :lng=>35.0}, "TT"=>{:lat=>11.0, :lng=>-61.0},
|
73
|
+
"TV"=>{:lat=>-8.0, :lng=>178.0}, "TW"=>{:lat=>23.5, :lng=>121.0}, "TZ"=>{:lat=>-6.0, :lng=>35.0}, "UA"=>{:lat=>49.0, :lng=>32.0},
|
74
|
+
"UG"=>{:lat=>1.0, :lng=>32.0}, "UM"=>{:lat=>19.2833, :lng=>166.6}, "US"=>{:lat=>38.0, :lng=>-97.0}, "UY"=>{:lat=>-33.0, :lng=>-56.0},
|
75
|
+
"UZ"=>{:lat=>41.0, :lng=>64.0}, "VA"=>{:lat=>41.9, :lng=>12.45}, "VC"=>{:lat=>13.25, :lng=>-61.2}, "VE"=>{:lat=>8.0, :lng=>-66.0},
|
76
|
+
"VG"=>{:lat=>18.5, :lng=>-64.5}, "VI"=>{:lat=>18.3333, :lng=>-64.8333}, "VN"=>{:lat=>16.0, :lng=>106.0}, "VU"=>{:lat=>-16.0, :lng=>167.0},
|
77
|
+
"WF"=>{:lat=>-13.3, :lng=>-176.2}, "WS"=>{:lat=>-13.5833, :lng=>-172.3333}, "YE"=>{:lat=>15.0, :lng=>48.0}, "YT"=>{:lat=>-12.8333, :lng=>45.1667},
|
78
|
+
"ZA"=>{:lat=>-29.0, :lng=>24.0}, "ZM"=>{:lat=>-15.0, :lng=>30.0}, "ZW"=>{:lat=>-20.0, :lng=>30.0}, "JE"=>{:lat=>49.25, :lng=>-2.16},
|
79
|
+
"IM"=>{:lat=>54.25, :lng=>4.5}, "AX"=>{:lat=>60.25, :lng=> 20},"A1"=>{:lat=>0, :lng=> 0},"A2"=>{:lat=>0, :lng=> 0}
|
80
|
+
}
|
81
|
+
|
82
|
+
# This determines where the tour goes to and which placemark ballons come up
|
83
|
+
# centres: South Africa, Benin, Switz, Ukraine, India, Australia, Paraguay, United States,France
|
84
|
+
#
|
85
|
+
WORLDTOUR={"ZA" => ["ZA1","NA1","KE1"],
|
86
|
+
"BJ" => ["BJ1","A11","NG1","CI1","SN1","DZ1","MA1","EG1","TN1"],
|
87
|
+
"CH" => ["FR1","ES1","LU1","GB1","BE1","NL1","DE1","IT1","IE1","AT1","SE1","DK1","UA1"],
|
88
|
+
"UA" => ["SA1","TR1","SY1","RU1","IR1"],
|
89
|
+
"IN" => ["IN1","KZ1","CN1","TH1","PK1"],
|
90
|
+
"AU" => ["AU1","NC1"],
|
91
|
+
"PY" => ["PY1","BR1","AR1","CL1"],
|
92
|
+
"US" => ["US1","US2","US3","US4","CA1","MX1"],
|
93
|
+
"FR" => ["FR1"] }
|
94
|
+
|
95
|
+
# FR1 is the centre, by default, centres 1 to 90 are read by default, and 91-200 change to black after 2seconds
|
96
|
+
# This can be changed using a the mix-in features of Ruby, using the keys {:lat , :lng,"red", "black"}
|
97
|
+
ATTACK_TOUR = {:lat => 46.0,
|
98
|
+
:lng => 2.0,
|
99
|
+
"red"=> (1..90).collect{|eachnum| "FR" + eachnum.to_s},
|
100
|
+
"black"=> (91..200).collect{|eachnum| "FR" + eachnum.to_s} }
|
101
|
+
#"red"=> ["FR240", "FR221", "FR46", "FR72", "FR226","FR4","FR179","FR182",],
|
102
|
+
#"black"=> ["FR92", "FR159", "FR196", "FR210", "FR17","218", "FR175","FR41" ] }
|
103
|
+
|
104
|
+
# This determines how long the program Tor::TController.extendcir_slowly() waits between each extension.
|
105
|
+
EXTEND_DELAY = 2.0
|
106
|
+
end
|
data/lib/httpmod.rb
ADDED
@@ -0,0 +1,89 @@
|
|
1
|
+
# httpmod functions - extends net/http
|
2
|
+
|
3
|
+
module Net #:nodoc:
|
4
|
+
class HTTP #:nodoc:
|
5
|
+
|
6
|
+
# Sends an HTTPRequest object REQUEST to the HTTP proxy such as polipo, and attach all new streams to the circuit specified in torctrl_cir.
|
7
|
+
# torctrl_cir = {:torctrl, :cirnum,:hop}
|
8
|
+
# Tor config must already be set to allow leaky circuits and attaching streams to the nodes other than the 3rd node.
|
9
|
+
# Similar to HTTP.request
|
10
|
+
# When called with a block, yields an HTTPResponse object.
|
11
|
+
# The body of this response will not have been read yet;
|
12
|
+
# the caller can process it using HTTPResponse#read_body,
|
13
|
+
# if desired.
|
14
|
+
#
|
15
|
+
# Returns a HTTPResponse object.
|
16
|
+
#
|
17
|
+
# This method never raises Net::* exceptions.
|
18
|
+
# The method has been implemented, but a circuit have been built to successfullty attach a stream to it.
|
19
|
+
#
|
20
|
+
def request_tor(req,torctrl_cir, body = nil, &block)
|
21
|
+
unless started?
|
22
|
+
start {
|
23
|
+
req['connection'] ||= 'close'
|
24
|
+
return request(req, body, &block)
|
25
|
+
}
|
26
|
+
end
|
27
|
+
if proxy_user()
|
28
|
+
req.proxy_basic_auth proxy_user(), proxy_pass() unless use_ssl?
|
29
|
+
end
|
30
|
+
req.set_body_internal body
|
31
|
+
res = transport_request_tor(req, torctrl_cir, &block)
|
32
|
+
if sspi_auth?(res)
|
33
|
+
sspi_auth(req)
|
34
|
+
res = transport_request_tor(req, torctrl_cir, &block)
|
35
|
+
end
|
36
|
+
res
|
37
|
+
end
|
38
|
+
|
39
|
+
# Sends an HTTPRequest object GET REQUEST to the HTTP proxy such as polipo, and attach all new streams to the circuit specified in torctrl_cir.
|
40
|
+
# torctrl_cir = {:torctrl, :cirnum,:hop}
|
41
|
+
# Tor config must already be set to allow leaky circuits and attaching streams to the nodes other than the 3rd node.
|
42
|
+
# Similar to HTTP.request_get
|
43
|
+
# The method has been implemented, but a circuit have been built to successfullty attach a stream to it.
|
44
|
+
#
|
45
|
+
def request_torget(path, torctrl_cir, initheader = nil, &block)
|
46
|
+
request_tor(Get.new(path, initheader),torctrl_cir, &block)
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
# This transports requests to the proxy specified in the HTTP request, and then attaches all new streams to a prespecified circuit.
|
52
|
+
# It works behind the scene when making requests using HTTP.request_torget and HTTP.request_tor
|
53
|
+
# Further development in progress.
|
54
|
+
# - Must create new stream if cirnum==0
|
55
|
+
# - Attempt to recreate the same circuit if the circuit is closed. support sending Circuit instance in the hash instead of just cirnum
|
56
|
+
# ...more work to be done probably be used to make a browser for Tor, with limited functionality. No flash/javascript/cookies to start with, so no tracking.
|
57
|
+
#
|
58
|
+
def transport_request_tor(req, torctrl_cir) #:nodoc:
|
59
|
+
# torctrl_cir = {:torctrl, :cirnum,:hop}
|
60
|
+
tcontrl = torctrl_cir[:torctrl]
|
61
|
+
cir_num = torctrl_cir[:cirnum]
|
62
|
+
hop_count = torctrl_cir[:hop] ? torctrl_cir[:hop] : 0
|
63
|
+
|
64
|
+
begin_transport req
|
65
|
+
req.exec @socket, @curr_http_version, edit_path(req.path)
|
66
|
+
|
67
|
+
#Get all new streams since the request was sent
|
68
|
+
b = tcontrl.newstreams
|
69
|
+
# attach all new streams to cir_num
|
70
|
+
b.each{|k|
|
71
|
+
tcontrl.attach_stream(k, cir_num,hop_count)
|
72
|
+
}
|
73
|
+
|
74
|
+
begin
|
75
|
+
res = HTTPResponse.read_new(@socket)
|
76
|
+
end while res.kind_of?(HTTPContinue)
|
77
|
+
res.reading_body(@socket, req.response_body_permitted?) {
|
78
|
+
yield res if block_given?
|
79
|
+
}
|
80
|
+
end_transport req, res
|
81
|
+
res
|
82
|
+
rescue => exception
|
83
|
+
D "Conn close because of error #{exception}"
|
84
|
+
@socket.close if @socket and not @socket.closed?
|
85
|
+
raise exception
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|
89
|
+
end
|
data/lib/tcontroller.rb
ADDED
@@ -0,0 +1,475 @@
|
|
1
|
+
module Tor
|
2
|
+
|
3
|
+
require 'socksify/http'
|
4
|
+
|
5
|
+
|
6
|
+
# Tor:TController is an extension of the Tor::Controller class, providing more methods.
|
7
|
+
# It inherits all methods from Tor::Controller and can be used to interact with Tor.
|
8
|
+
#
|
9
|
+
# <b>TController examples</b>
|
10
|
+
#
|
11
|
+
# require 'tor_extend'
|
12
|
+
# Tor::TController.new(:host=>@getbridge_config[:torcontrolhost],
|
13
|
+
# :port=>@getbridge_config[:torcontrolport])
|
14
|
+
# Tor::TController.new(:host=>"127.0.0.1",:port=>9051)
|
15
|
+
# Tor::TController.connect
|
16
|
+
# Tor::TController.authenticate("\"tor_control_password\"")
|
17
|
+
# Tor::TController.sr(:signal,"HUP")
|
18
|
+
# Tor::TController.sr(:signal,"newnym")
|
19
|
+
# Tor::TController.getinfo("ns/all")
|
20
|
+
# Tor::TController.net_status
|
21
|
+
# Tor::TController.closecircuit(15)
|
22
|
+
# Tor::TController.closeallcircuits
|
23
|
+
# Tor::TController.signal("reload"
|
24
|
+
# Tor::TController.extendcir(0,['or1','or2','or3'])
|
25
|
+
# Tor::TController.setconf("__DisablePredictedCircuits",1)
|
26
|
+
# Tor::TController.setconf("__LeaveStreamsUnattached",1)
|
27
|
+
# Tor::TController.getconf("ORPort")
|
28
|
+
# Tor::TController.getconf("__LeaveStreamsUnattached")
|
29
|
+
# Tor::TController.get_bridges( {:type=>'http',:port=>9050,:addr=>'127.0.0.1'} )
|
30
|
+
#
|
31
|
+
#
|
32
|
+
# For more details, visit [https://github.com/bendiken/tor-ruby#readme], [https://gitweb.torproject.org/torspec.git/tree]
|
33
|
+
#
|
34
|
+
class TController < Tor::Controller
|
35
|
+
|
36
|
+
# This returns the circuit-status in an array, or an empty array on failure
|
37
|
+
#
|
38
|
+
# <b>Get the circuit-status from Tor</b>.
|
39
|
+
#
|
40
|
+
# Tor::TController.cir_status
|
41
|
+
# ["46 BUILT ORa,ORb,ORc PURPOSE=GENERAL"]
|
42
|
+
def cir_status
|
43
|
+
cirstatus=getinfo("circuit-status")
|
44
|
+
end
|
45
|
+
|
46
|
+
|
47
|
+
# This attempts to close a single circuit.
|
48
|
+
#
|
49
|
+
# <b>Closing circuits</b>
|
50
|
+
# Tor::TController.closecircuit(15)
|
51
|
+
def closecircuit (circnum)
|
52
|
+
errorstate,ans=sr(:closecircuit," #{circnum}")
|
53
|
+
end
|
54
|
+
|
55
|
+
# This attempts to close all open circuits.
|
56
|
+
#
|
57
|
+
# <b>Closing all circuits</b>
|
58
|
+
#
|
59
|
+
# Tor::TController.closeallcircuits
|
60
|
+
def closeallcircuits
|
61
|
+
x=cir_status
|
62
|
+
if !x.empty?
|
63
|
+
x.each{|eachcircuit|
|
64
|
+
circnum = eachcircuit.match(/^\d+/)
|
65
|
+
closecircuit(circnum)
|
66
|
+
}
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
# Returns the an array of of directory servers from the consensus.
|
71
|
+
#
|
72
|
+
# Tor::TController.ds => [w.x.y.z:port, ...]
|
73
|
+
#
|
74
|
+
def ds
|
75
|
+
reply=[]
|
76
|
+
s = getinfo("ns/all")
|
77
|
+
case version
|
78
|
+
when /0.2.[01]/
|
79
|
+
z=2
|
80
|
+
when/0.2.2/
|
81
|
+
z = 4 # To accommodate r, s , w and p]
|
82
|
+
end
|
83
|
+
s.collect!{|eachs| eachs.start_with?("r ") ? eachs : nil }
|
84
|
+
s.delete nil
|
85
|
+
s.each{|eachs|
|
86
|
+
dsport=eachs.split[8].to_i
|
87
|
+
rip=eachs.split[6]
|
88
|
+
reply << "#{rip}:#{dsport}" if dsport!= 0
|
89
|
+
}
|
90
|
+
reply
|
91
|
+
end
|
92
|
+
|
93
|
+
|
94
|
+
# This creates/extends a circuit over multiple nodes. A new circuit is created if cir_num == 0.
|
95
|
+
#
|
96
|
+
# <b>Creating a new circuit</b>
|
97
|
+
#
|
98
|
+
# create_circ = Tor::TController.extendcir(0,['or1','or2','or3'])
|
99
|
+
def extendcir(circnum,or_list)
|
100
|
+
argor=" #{circnum} #{or_list.join(',')}"
|
101
|
+
extendcir=send_command(:extendcircuit,argor)
|
102
|
+
circuit_id=nil
|
103
|
+
readterm=true
|
104
|
+
while readterm do
|
105
|
+
case msg=read_reply
|
106
|
+
when /^\d+ CIRC \d+ BUILT/,/250 / #/^\d+ CIRC \d+ BUILT/
|
107
|
+
circuit_id=msg.scan(/\d+\Z/)[0]
|
108
|
+
readterm=false
|
109
|
+
when /^5\d\d /
|
110
|
+
readterm=false
|
111
|
+
when /^\d+ /
|
112
|
+
puts msg #like extended launched
|
113
|
+
else
|
114
|
+
puts msg,"\n"
|
115
|
+
end
|
116
|
+
end
|
117
|
+
#sr(:signal,"newnym")
|
118
|
+
circuit_id
|
119
|
+
end
|
120
|
+
|
121
|
+
# This builds a circuit to each member of the array argument, skipping any node that fails to connect.
|
122
|
+
# It returns the circuit number, and the longest successful circuit that was successfully built.
|
123
|
+
# There is a delay of 2.0 seconds after each extension, but this can be altered by defining Tor::EXTEND_DELAY constant.
|
124
|
+
#
|
125
|
+
# <b>Create a circuit as long as possible using 10 elements in an array</b>
|
126
|
+
# testarray = [A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z]
|
127
|
+
# Tor::TController.extendcir_slowly(testarray)
|
128
|
+
def extendcir_slowly(orarray)
|
129
|
+
ordelay = defined?(EXTEND_DELAY) ? EXTEND_DELAY : Constants::EXTEND_DELAY
|
130
|
+
cirnum = 0
|
131
|
+
circuit = []
|
132
|
+
orarray.each{|eachor|
|
133
|
+
cirnum=extendcir(cirnum,[eachor])
|
134
|
+
sleep(ordelay) # wait for a few seconds, and check if the circuit is was successful
|
135
|
+
p=cir_status.detect{|i| i =~ (/^#{cirnum} / )}
|
136
|
+
case p
|
137
|
+
when /FAILED/,nil
|
138
|
+
puts "cirnum=nil"
|
139
|
+
if eachor != circuit.last
|
140
|
+
cirnum = extendcir(0,circuit)
|
141
|
+
sleep(circuit.count)
|
142
|
+
elsif circuit.empty?
|
143
|
+
return nil # failed to build circuit at start, make sure orarray[0] is up
|
144
|
+
end
|
145
|
+
when /EXTENDED/, /BUILT/
|
146
|
+
circuit << eachor
|
147
|
+
puts "Extended! cirnum = #{cirnum}, circuit length = #{circuit.count}"
|
148
|
+
when /LAUNCHED/
|
149
|
+
sleep(1)
|
150
|
+
puts x=cir_status.detect{|a| a =~ /^#{cirnum}/}
|
151
|
+
circuit << eachor if (x =~ /BUILT/) or (x =~/EXTENDED/)
|
152
|
+
end
|
153
|
+
}
|
154
|
+
[cirnum,circuit]
|
155
|
+
end
|
156
|
+
|
157
|
+
# This gets 3 bridge IP addresses from the Tor bridge website. proxyconfig is optional.
|
158
|
+
# default proxyconfig = {:type=>'tor' ,:port=>9050,:addr=>'127.0.0.1'}
|
159
|
+
# The return format is fo the form:
|
160
|
+
# [HTTPcode, [{:bridgeip, :bridgeport},{:bridgeip, :bridgeport},{:bridgeip, :bridgeport}].
|
161
|
+
# The types can be one of 'tor', 'polipo', 'socks', 'http', 'https',nil, 'none'.
|
162
|
+
# torctrl_cirnum must have the form:
|
163
|
+
# torctrl_cirnum ={:torctrl=>Tor::TController, :cirnum=>cirnum,:hop=>hopcount}
|
164
|
+
#
|
165
|
+
# <b>Get 3 bridges</b>
|
166
|
+
#
|
167
|
+
# Tor::TController.get_bridges( {:proxytype=>'tor',:proxyport=>9050,:proxyaddr=>'127.0.0.1'} )
|
168
|
+
def get_bridges(url, cacheddesc, *config)
|
169
|
+
if config.empty?
|
170
|
+
proxyconfig={:type=>'tor' ,:port=>9050,:addr=>'127.0.0.1'}
|
171
|
+
else
|
172
|
+
proxyconfig = config[0]
|
173
|
+
end
|
174
|
+
if ! defined?(@myhttperrors)
|
175
|
+
@myhttperrors=0
|
176
|
+
end
|
177
|
+
case proxyconfig[:type]
|
178
|
+
when /none/i,nil
|
179
|
+
http_session=Net::HTTP.new(url.host,url.port)
|
180
|
+
when /socks/i,/tor/i
|
181
|
+
http_session=Net::HTTP.SOCKSProxy(proxyconfig[:addr], proxyconfig[:port]).new(url.host,url.port)
|
182
|
+
when /http/i,/https/i,/polipo/i
|
183
|
+
http_session=Net::HTTP::Proxy(proxyconfig[:addr], proxyconfig[:port]).new(url.host,url.port)
|
184
|
+
end
|
185
|
+
if url.scheme=="https"
|
186
|
+
http_session.use_ssl = true
|
187
|
+
http_session.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
188
|
+
else
|
189
|
+
http_session.use_ssl=false
|
190
|
+
end
|
191
|
+
bridges=[]
|
192
|
+
# Rescue from http error
|
193
|
+
begin
|
194
|
+
resp = http_session.get2 url.path # Let Tor choose circuit itself
|
195
|
+
# Additional code will be added shortly to attach the stream to the circuit directly
|
196
|
+
puts "#{resp.code} HTTP response"
|
197
|
+
#puts resp.body
|
198
|
+
respcode= resp.code=="200" ? 200:nil
|
199
|
+
if resp.code == "200"
|
200
|
+
torbridgeip=resp.body.scan(/\d+\.\d+\.\d+\.\d+\:\d+/)
|
201
|
+
torbridgeip.each{|eachbridge|
|
202
|
+
bridgeip,bridgeport= eachbridge.split(':')
|
203
|
+
x=Bridge.where(:ipaddr=>bridgeip, :port =>bridgeport)
|
204
|
+
if x.empty?
|
205
|
+
if (bridge_geoip=cacheddesc.get_geoiprecord(bridgeip)).nil?
|
206
|
+
Bridge.create(:ipaddr=>bridgeip, :port =>bridgeport,
|
207
|
+
:lat=>0, :lng=>0)
|
208
|
+
else
|
209
|
+
Bridge.create(:ipaddr=>bridgeip, :port =>bridgeport,
|
210
|
+
:lat=>bridge_geoip.latitude.to_f,
|
211
|
+
:lng=>bridge_geoip.longitude.to_f )
|
212
|
+
end
|
213
|
+
end
|
214
|
+
}
|
215
|
+
end
|
216
|
+
bridges = torbridgeip
|
217
|
+
rescue
|
218
|
+
@myhttperrors +=1
|
219
|
+
respcode=nil
|
220
|
+
bridges=[]
|
221
|
+
end
|
222
|
+
bridges #Return array of all bridges
|
223
|
+
end
|
224
|
+
|
225
|
+
# Returns all the brdiges in the database as an array.
|
226
|
+
#
|
227
|
+
# Tor::TController.bridges => [{:ipaddr, :port, :lat, :lng},...]
|
228
|
+
def bridges
|
229
|
+
Bridges.all
|
230
|
+
end
|
231
|
+
|
232
|
+
# This returns all the new streams that have not been assigned to a circuit
|
233
|
+
def newstreams
|
234
|
+
reply=[]
|
235
|
+
getinfo("stream-status").each{|eachstream|
|
236
|
+
case eachstream
|
237
|
+
when /\d+ NEW 0/
|
238
|
+
# It might be simpler to use this /\d+ NEW/
|
239
|
+
reply << eachstream.scan(/\d+/)[0]
|
240
|
+
end
|
241
|
+
}
|
242
|
+
reply
|
243
|
+
end
|
244
|
+
|
245
|
+
# This attaches streams to circuits. No documentation yet.
|
246
|
+
def attach_stream(stream_no, cir_num ,hop_count)
|
247
|
+
puts "attachstream"
|
248
|
+
if hop_count==0
|
249
|
+
sr(:attachstream,"#{stream_no} #{cir_num}")
|
250
|
+
else
|
251
|
+
sr(:attachstream,"#{stream_no} #{cir_num} HOP=#{hop_count}")
|
252
|
+
end
|
253
|
+
end
|
254
|
+
|
255
|
+
|
256
|
+
# This gets enty guards from the control port of tor using the getinfo "entry-guards" command
|
257
|
+
# and returns just the fingerprints in an array.
|
258
|
+
#
|
259
|
+
# <b>Get entry-guards</b>
|
260
|
+
#
|
261
|
+
# Tor::TController.get_entryguards #=> ["$abc123","$def456"...]
|
262
|
+
def get_entryguards
|
263
|
+
rslt = getinfo "entry-guards"
|
264
|
+
reply = rslt.collect{|eachguard|
|
265
|
+
case eachguard
|
266
|
+
when / unusable/
|
267
|
+
nil
|
268
|
+
else
|
269
|
+
"$"+ eachguard.split(/[~ =]/)[0]
|
270
|
+
end
|
271
|
+
}
|
272
|
+
reply.delete(nil)
|
273
|
+
reply
|
274
|
+
end
|
275
|
+
|
276
|
+
# This returns the number of HTTP errors from the Tor::TController.get_bridges command
|
277
|
+
#
|
278
|
+
def get_httperrors
|
279
|
+
@myhttperrors
|
280
|
+
end
|
281
|
+
|
282
|
+
# This gets the IP addresses for ORs based on the characteristics of the OR.
|
283
|
+
# Example of the properties include: _Fast_, _Guard_, _HSDir_, _Named_, _Running_, _Stable_, _V2Dir_, _Valid_, _Exit_.
|
284
|
+
#
|
285
|
+
# <b>Get all Exit, Fast and entry Guard ORs</b>
|
286
|
+
#
|
287
|
+
# Tor::TController.get_purposeip("Exit") #=> ["a.b.c.d","e.f.g.h"...]
|
288
|
+
# Tor::TController.get_purposeip("fast exit")
|
289
|
+
# Tor::TController.get_purposeip("Guard")
|
290
|
+
def get_purposeip(nodetype)
|
291
|
+
reply=[]
|
292
|
+
s = getinfo("ns/all")
|
293
|
+
ctr_i= s.size / 2
|
294
|
+
ctr_i.times{|j|
|
295
|
+
rip=s[j*2].split[6]
|
296
|
+
x=Router.where(:ipaddr=>rip)
|
297
|
+
if !x.empty?
|
298
|
+
finprint = "$" + x[0].fingerprint
|
299
|
+
matcharray=nodetype.split.collect{|eachtype|
|
300
|
+
if eachtype.start_with? '!'
|
301
|
+
matchme = eachtype[1..(eachtype.length-1)]
|
302
|
+
rslt = !(s[j*2+1] =~ (/#{matchme}/i))
|
303
|
+
rslt ? rslt : nil #return nil if false, or return the number
|
304
|
+
else
|
305
|
+
s[j*2+1] =~ (/#{eachtype}/i)
|
306
|
+
end
|
307
|
+
}
|
308
|
+
reply << finprint if !matcharray.include? nil
|
309
|
+
end
|
310
|
+
}
|
311
|
+
reply
|
312
|
+
end
|
313
|
+
|
314
|
+
# This gets a configuration from Tor. The arguments of this command might be case sensitive. It returns the protocol error message if it fails.
|
315
|
+
#
|
316
|
+
# <b>Get the present ORport Tor is using</b>
|
317
|
+
#
|
318
|
+
# Tor::TController.getconf("ORPort") #=>"9001"
|
319
|
+
# Tor::TController.getconf("__LeaveStreamsUnattached") #=>"1"
|
320
|
+
#
|
321
|
+
# For more details, see [https://gitweb.torproject.org/torspec.git/blob/HEAD:/control-spec.txt]
|
322
|
+
def getconf(confname)
|
323
|
+
send_command(:getconf, confname)
|
324
|
+
reply=[]
|
325
|
+
case msg=read_reply
|
326
|
+
when /250 /
|
327
|
+
msg.split(/250 \S*=/).last
|
328
|
+
else
|
329
|
+
msg
|
330
|
+
end
|
331
|
+
end
|
332
|
+
|
333
|
+
|
334
|
+
# This method sends the "GETINFO" protocol message with the arguments.
|
335
|
+
#
|
336
|
+
# <b>Getting more information from Tor</b>
|
337
|
+
#
|
338
|
+
# Tor::TController.getinfo("ns/all")
|
339
|
+
def getinfo(*args)
|
340
|
+
errorcode,ans = sr(:getinfo,*args)
|
341
|
+
ans
|
342
|
+
end
|
343
|
+
|
344
|
+
# This returns an array of hash tables with the fingerprints of all onion routers that have not been marked as down.
|
345
|
+
#
|
346
|
+
# <b>Get the network status from Tor</b>
|
347
|
+
#
|
348
|
+
# Tor::TController.net_status => [ {:fingerprint=>"$ABCD"},{:fingerprint=>"$EFGH"}...]
|
349
|
+
def net_status
|
350
|
+
case version
|
351
|
+
when /0.2.[01]/
|
352
|
+
net_status1
|
353
|
+
when/0.2.2/
|
354
|
+
net_status2
|
355
|
+
end
|
356
|
+
end
|
357
|
+
|
358
|
+
private
|
359
|
+
def net_status1 #:nodoc:
|
360
|
+
nstatus_array=getinfo("network-status")
|
361
|
+
sorted_networkstatus=[]
|
362
|
+
if !nstatus_array.empty?
|
363
|
+
netstatus=nstatus_array[0]
|
364
|
+
fingerprint=netstatus.split(/\S+=/)
|
365
|
+
fingerprint.delete_at(0) #delete the fingerprint stored for nickname=network-status
|
366
|
+
fingerprint.each{|eachfingerprint|
|
367
|
+
tmpfarray = eachfingerprint.split
|
368
|
+
tmpb=tmpfarray.collect{|element|
|
369
|
+
element.start_with?("!") ? nil:element
|
370
|
+
}
|
371
|
+
tmpb.delete(nil)
|
372
|
+
if tmpb.empty?
|
373
|
+
net_status = nil
|
374
|
+
else
|
375
|
+
sorted_networkstatus << {:fingerprint=>tmpb[0] }
|
376
|
+
end
|
377
|
+
}
|
378
|
+
end
|
379
|
+
sorted_networkstatus
|
380
|
+
end
|
381
|
+
|
382
|
+
def net_status2 #:nodoc:
|
383
|
+
@myhttperrors=0
|
384
|
+
nstatus_array=getinfo("network-status")
|
385
|
+
sorted_networkstatus=[]
|
386
|
+
if !nstatus_array.empty?
|
387
|
+
netstatus=nstatus_array[0]
|
388
|
+
fingerprint=netstatus.split.collect{|asd|
|
389
|
+
element = asd.split(/[=~]/)[0]
|
390
|
+
element.start_with?("!") ? nil:element
|
391
|
+
}
|
392
|
+
fingerprint.delete(nil)
|
393
|
+
#fingerprint.delete_at(0) #delete the fingerprint stored for nickname=network-status
|
394
|
+
fingerprint.each{|eachfingerprint|
|
395
|
+
sorted_networkstatus << {:fingerprint=>eachfingerprint }
|
396
|
+
}
|
397
|
+
end
|
398
|
+
sorted_networkstatus
|
399
|
+
end
|
400
|
+
|
401
|
+
public
|
402
|
+
# This sets a configuration in Tor to a value.
|
403
|
+
#
|
404
|
+
# <b>Setting Tor config</b>
|
405
|
+
#
|
406
|
+
# Tor::TController.setconf("__DisablePredictedCircuits",1) =>["OK", []]
|
407
|
+
# Tor::TController.setconf("__LeaveStreamsUnattached",1) =>["OK", []]
|
408
|
+
# Tor::TController.setconf("ORPort",9001) =>["OK", []]
|
409
|
+
def setconf(confname,value)
|
410
|
+
sr(:setconf,"#{confname}=#{value}")
|
411
|
+
end
|
412
|
+
|
413
|
+
# This method sends "signals" protocol message with the arguments.
|
414
|
+
#
|
415
|
+
# <b>Reload Tor config from file</b>
|
416
|
+
#
|
417
|
+
# Tor::TController.signal("RELOAD")
|
418
|
+
# Tor::TController.signal("HUP")
|
419
|
+
def signal(args)
|
420
|
+
reply=[]
|
421
|
+
case (args)
|
422
|
+
when /NEWNYM/i,/CLEARDNSCACHE/i,/RELOAD/i,/HUP/i,/DUMP/i,/USR1/i,/DEBUG/i,/USR2/i,/shutdown/i,/INT/i
|
423
|
+
errorcode,reply=sr(:signal, args)
|
424
|
+
close if args =~ /shutdown/i or args =~ /INT/i
|
425
|
+
when /HALT/i,/TERM/i
|
426
|
+
send_command(:signal, "HALT")
|
427
|
+
close
|
428
|
+
else
|
429
|
+
puts "#{args} not recognised by the at library development. Sending the signal nonetheless"
|
430
|
+
reply=sr(:signal,args)
|
431
|
+
end
|
432
|
+
reply
|
433
|
+
end
|
434
|
+
|
435
|
+
# This sends commands and returns the protocol response code along with an array
|
436
|
+
# containing the results with the following format \[errorcode,\[array_of_results]].
|
437
|
+
#
|
438
|
+
# <b>Send and receive commands</b>.
|
439
|
+
#
|
440
|
+
# Tor::TController.sr(:signal,"reload")
|
441
|
+
# Tor::TController.sr(:signal,"newnym")
|
442
|
+
def sr(command, *args)
|
443
|
+
send_command(command, *args)
|
444
|
+
reply=[]
|
445
|
+
readterm=true
|
446
|
+
while readterm do
|
447
|
+
# Read as much as possible until '250 OK' or error 5YZ
|
448
|
+
case msg=read_reply
|
449
|
+
when /^250 OK/
|
450
|
+
readterm=false
|
451
|
+
puts errorstate="OK"
|
452
|
+
when /^250[\+,\-,\s]/
|
453
|
+
reply << msg.split(/^\d+[\+,\-,\s]\S*=/).last unless msg=~/250\+/
|
454
|
+
errorstate = "OK"
|
455
|
+
when /^\./
|
456
|
+
when /^5\d\d /
|
457
|
+
if errorstate == "OK" # if a "2yz " code came before this then msg is part of response
|
458
|
+
reply << msg
|
459
|
+
else
|
460
|
+
puts msg
|
461
|
+
errorstate = msg.match(/^5\d\d/)
|
462
|
+
readterm=false
|
463
|
+
end
|
464
|
+
else
|
465
|
+
reply << msg
|
466
|
+
end
|
467
|
+
end
|
468
|
+
reply.delete(nil)
|
469
|
+
reply = errorstate=="OK" ? reply : []
|
470
|
+
[errorstate,reply]
|
471
|
+
end
|
472
|
+
|
473
|
+
|
474
|
+
end # end of class
|
475
|
+
end # end of module
|