ronin-support 0.1.0 → 0.2.0.rc1

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.
Files changed (60) hide show
  1. data/ChangeLog.md +24 -0
  2. data/Gemfile +9 -1
  3. data/README.md +6 -3
  4. data/gemspec.yml +3 -1
  5. data/lib/ronin/extensions.rb +2 -1
  6. data/lib/ronin/extensions/file.rb +4 -0
  7. data/lib/ronin/extensions/ip_addr.rb +8 -0
  8. data/lib/ronin/extensions/kernel.rb +2 -0
  9. data/lib/ronin/extensions/string.rb +50 -11
  10. data/lib/ronin/formatting/extensions/binary.rb +2 -0
  11. data/lib/ronin/formatting/extensions/binary/file.rb +12 -1
  12. data/lib/ronin/formatting/extensions/binary/integer.rb +6 -0
  13. data/lib/ronin/formatting/extensions/binary/string.rb +20 -0
  14. data/lib/ronin/formatting/extensions/digest/file.rb +14 -0
  15. data/lib/ronin/formatting/extensions/digest/string.rb +8 -0
  16. data/lib/ronin/formatting/extensions/html.rb +21 -0
  17. data/lib/ronin/formatting/extensions/html/integer.rb +126 -0
  18. data/lib/ronin/formatting/extensions/html/string.rb +184 -0
  19. data/lib/ronin/formatting/extensions/http/integer.rb +7 -1
  20. data/lib/ronin/formatting/extensions/http/string.rb +10 -0
  21. data/lib/ronin/formatting/extensions/text.rb +2 -0
  22. data/lib/ronin/formatting/extensions/text/array.rb +10 -0
  23. data/lib/ronin/formatting/extensions/text/string.rb +44 -12
  24. data/lib/ronin/formatting/html.rb +20 -0
  25. data/lib/ronin/mixin.rb +89 -0
  26. data/lib/ronin/network/extensions/esmtp/net.rb +6 -0
  27. data/lib/ronin/network/extensions/http/net.rb +124 -51
  28. data/lib/ronin/network/extensions/imap/net.rb +4 -0
  29. data/lib/ronin/network/extensions/pop3/net.rb +4 -0
  30. data/lib/ronin/network/extensions/smtp/net.rb +73 -2
  31. data/lib/ronin/network/extensions/ssl/net.rb +4 -0
  32. data/lib/ronin/network/extensions/tcp/net.rb +16 -0
  33. data/lib/ronin/network/extensions/telnet/net.rb +4 -0
  34. data/lib/ronin/network/extensions/udp/net.rb +12 -0
  35. data/lib/ronin/network/http/http.rb +50 -29
  36. data/lib/ronin/network/http/proxy.rb +26 -0
  37. data/lib/ronin/network/imap.rb +4 -0
  38. data/lib/ronin/network/network.rb +2 -0
  39. data/lib/ronin/network/pop3.rb +4 -0
  40. data/lib/ronin/network/smtp/email.rb +43 -14
  41. data/lib/ronin/network/smtp/smtp.rb +6 -0
  42. data/lib/ronin/network/ssl.rb +2 -0
  43. data/lib/ronin/network/telnet.rb +16 -0
  44. data/lib/ronin/path.rb +6 -0
  45. data/lib/ronin/support/inflector.rb +3 -1
  46. data/lib/ronin/support/version.rb +1 -1
  47. data/lib/ronin/templates/erb.rb +4 -0
  48. data/lib/ronin/templates/template.rb +10 -0
  49. data/spec/extensions/string_spec.rb +4 -4
  50. data/spec/formatting/html/integer_spec.rb +66 -0
  51. data/spec/formatting/html/string_spec.rb +103 -0
  52. data/spec/formatting/http/string_spec.rb +1 -1
  53. data/spec/formatting/text/string_spec.rb +18 -66
  54. data/spec/mixin_spec.rb +53 -0
  55. data/spec/network/http/http_spec.rb +0 -7
  56. data/spec/network/http/proxy_spec.rb +2 -2
  57. data/spec/network/smtp/email_spec.rb +100 -0
  58. data/spec/path_spec.rb +13 -13
  59. data/spec/templates/helpers/data.rb +1 -1
  60. metadata +52 -33
@@ -58,6 +58,8 @@ module Net
58
58
  # @return [Net::IMAP]
59
59
  # The newly created IMAP session object.
60
60
  #
61
+ # @api public
62
+ #
61
63
  def Net.imap_connect(host,options={})
62
64
  host = host.to_s
63
65
  port = (options[:port] || Ronin::Network::IMAP.default_port)
@@ -109,6 +111,8 @@ module Net
109
111
  #
110
112
  # @see Net.imap_connect
111
113
  #
114
+ # @api public
115
+ #
112
116
  def Net.imap_session(host,options={})
113
117
  session = Net.imap_connect(host,options)
114
118
 
@@ -49,6 +49,8 @@ module Net
49
49
  # @return [Net::POP3]
50
50
  # The newly created POP3 session.
51
51
  #
52
+ # @api public
53
+ #
52
54
  def Net.pop3_connect(host,options={})
53
55
  host = host.to_s
54
56
  port = (options[:port] || Ronin::Network::POP3.default_port)
@@ -79,6 +81,8 @@ module Net
79
81
  #
80
82
  # @return [nil]
81
83
  #
84
+ # @api public
85
+ #
82
86
  def Net.pop3_session(host,options={})
83
87
  session = Net.pop3_connect(host,options)
84
88
 
@@ -17,16 +17,30 @@
17
17
  # along with Ronin Support. If not, see <http://www.gnu.org/licenses/>.
18
18
  #
19
19
 
20
+ require 'ronin/network/smtp/smtp'
20
21
  require 'ronin/network/smtp/email'
21
22
 
22
23
  require 'net/smtp'
23
24
 
24
25
  module Net
25
26
  #
26
- # @see Ronin::Network::SMTP.message
27
+ # Creates a new email message.
28
+ #
29
+ # @param [Hash] options
30
+ # Additional options for the email.
31
+ #
32
+ # @yield [email]
33
+ # The given block will be passed the new email.
34
+ #
35
+ # @yieldparam [Ronin::Network::SMTP::Email] email
36
+ # The new email.
37
+ #
38
+ # @see Ronin::Network::SMTP::Email.new
39
+ #
40
+ # @api public
27
41
  #
28
42
  def Net.smtp_message(options={},&block)
29
- Ronin::Network::SMTP.message(options,&block)
43
+ Ronin::Network::SMTP::Email.new(options,&block)
30
44
  end
31
45
 
32
46
  #
@@ -63,6 +77,11 @@ module Net
63
77
  # @return [Net::SMTP]
64
78
  # The SMTP session.
65
79
  #
80
+ # @example
81
+ # Net.smtp_connect('www.example.com', :user => 'joe')
82
+ #
83
+ # @api public
84
+ #
66
85
  def Net.smtp_connect(host,options={})
67
86
  host = host.to_s
68
87
  port = (options[:port] || Ronin::Network::SMTP.default_port)
@@ -95,8 +114,15 @@ module Net
95
114
  # @yieldparam [Net::SMTP] session
96
115
  # The SMTP session.
97
116
  #
117
+ # @example
118
+ # Net.smtp_session('www.example.com', :user => 'joe') do |smtp|
119
+ # # ...
120
+ # end
121
+ #
98
122
  # @see Net.smtp_connect
99
123
  #
124
+ # @api public
125
+ #
100
126
  def Net.smtp_session(host,options={})
101
127
  session = Net.smtp_connect(host,options)
102
128
 
@@ -105,4 +131,49 @@ module Net
105
131
  session.finish
106
132
  return nil
107
133
  end
134
+
135
+ #
136
+ # @since 0.2.0
137
+ #
138
+ # @param [String] host
139
+ # The host to connect to.
140
+ #
141
+ # @param [Hash] options
142
+ # Additional SMTP and Email options.
143
+ #
144
+ # @yield [email]
145
+ # The given block will be passed the new email to be sent.
146
+ #
147
+ # @yieldparam [Ronin::Network::SMTP::Email] email
148
+ # The new email to be sent.
149
+ #
150
+ # @see Net.smtp_session
151
+ #
152
+ # @example
153
+ # Net.smtp_send_message 'www.example.com', :to => 'joe@example.com',
154
+ # :from => 'eve@example.com',
155
+ # :subject => 'Hello',
156
+ # :message_id => 'XXXX',
157
+ # :body => 'Hello'
158
+ #
159
+ # @example Using the block.
160
+ # Net.smtp_send_message('www.example.com') do |email|
161
+ # email.to = 'joe@example.com'
162
+ # email.from 'eve@example.com'
163
+ # email.subject = 'Hello'
164
+ # email.message_id = 'XXXXXXXXXX'
165
+ # email.body << 'Hello!'
166
+ # end
167
+ #
168
+ # @since 0.2.0
169
+ #
170
+ # @api public
171
+ #
172
+ def Net.smtp_send_message(host,options={},&block)
173
+ email = Net.smtp_message(options,&block)
174
+
175
+ Net.smtp_session(host,options) do |smtp|
176
+ smtp.send_message(email.to_s, email.from, email.to)
177
+ end
178
+ end
108
179
  end
@@ -65,6 +65,8 @@ module Net
65
65
  # @example
66
66
  # socket = Net.ssl_connect('twitter.com',443)
67
67
  #
68
+ # @api public
69
+ #
68
70
  def Net.ssl_connect(host,port,options={})
69
71
  local_host = options[:local_host]
70
72
  local_port = options[:local_port]
@@ -134,6 +136,8 @@ module Net
134
136
  # sock.each_line { |line| puts line }
135
137
  # end
136
138
  #
139
+ # @api public
140
+ #
137
141
  def Net.ssl_session(host,port)
138
142
  ssl_socket = Net.ssl_connect(host,port)
139
143
 
@@ -54,6 +54,8 @@ module Net
54
54
  # sock.close
55
55
  # end
56
56
  #
57
+ # @api public
58
+ #
57
59
  def Net.tcp_connect(host,port,local_host=nil,local_port=nil)
58
60
  host = host.to_s
59
61
  local_host = if local_host
@@ -91,6 +93,8 @@ module Net
91
93
  # @yieldparam [TCPsocket] socket
92
94
  # The newly created TCPSocket object.
93
95
  #
96
+ # @api public
97
+ #
94
98
  def Net.tcp_connect_and_send(data,host,port,local_host=nil,local_port=nil)
95
99
  sock = Net.tcp_connect(host,port,local_host,local_port)
96
100
  sock.write(data)
@@ -124,6 +128,8 @@ module Net
124
128
  #
125
129
  # @return [nil]
126
130
  #
131
+ # @api public
132
+ #
127
133
  def Net.tcp_session(host,port,local_host=nil,local_port=nil)
128
134
  sock = Net.tcp_connect(host,port,local_host,local_port)
129
135
 
@@ -161,6 +167,8 @@ module Net
161
167
  # Net.tcp_banner('pop.gmail.com',25)
162
168
  # # => "220 mx.google.com ESMTP c20sm3096959rvf.1"
163
169
  #
170
+ # @api public
171
+ #
164
172
  def Net.tcp_banner(host,port,local_host=nil,local_port=nil)
165
173
  banner = nil
166
174
 
@@ -199,6 +207,8 @@ module Net
199
207
  # Net.tcp_send(buffer,'victim.com',80)
200
208
  # # => true
201
209
  #
210
+ # @api public
211
+ #
202
212
  def Net.tcp_send(data,host,port,local_host=nil,local_port=nil)
203
213
  Net.tcp_session(host,port,local_host,local_port) do |sock|
204
214
  sock.write(data)
@@ -222,6 +232,8 @@ module Net
222
232
  # @example
223
233
  # Net.tcp_server(1337)
224
234
  #
235
+ # @api public
236
+ #
225
237
  def Net.tcp_server(port,host='0.0.0.0')
226
238
  host = host.to_s
227
239
 
@@ -261,6 +273,8 @@ module Net
261
273
  # client2.close
262
274
  # end
263
275
  #
276
+ # @api public
277
+ #
264
278
  def Net.tcp_server_session(port,host='0.0.0.0',&block)
265
279
  server = Net.tcp_server(port,host,&block)
266
280
  server.close()
@@ -285,6 +299,8 @@ module Net
285
299
  # client.puts 'lol'
286
300
  # end
287
301
  #
302
+ # @api public
303
+ #
288
304
  def Net.tcp_single_server(port,host='0.0.0.0')
289
305
  host = host.to_s
290
306
 
@@ -88,6 +88,8 @@ module Net
88
88
  # Net.telnet_connect('towel.blinkenlights.nl')
89
89
  # # => #<Net::Telnet: ...>
90
90
  #
91
+ # @api public
92
+ #
91
93
  def Net.telnet_connect(host,options={})
92
94
  host = host.to_s
93
95
  telnet_options = {}
@@ -143,6 +145,8 @@ module Net
143
145
  #
144
146
  # @see Net.telnet_session
145
147
  #
148
+ # @api public
149
+ #
146
150
  def Net.telnet_session(host,options={})
147
151
  session = Net.telnet_connect(host,options)
148
152
 
@@ -53,6 +53,8 @@ module Net
53
53
  # puts sock.readlines
54
54
  # end
55
55
  #
56
+ # @api public
57
+ #
56
58
  def Net.udp_connect(host,port,local_host=nil,local_port=nil)
57
59
  host = host.to_s
58
60
  local_host = if local_host
@@ -93,6 +95,8 @@ module Net
93
95
  # @return [UDPSocket]
94
96
  # The newly created UDPSocket object.
95
97
  #
98
+ # @api public
99
+ #
96
100
  def Net.udp_connect_and_send(data,host,port,local_host=nil,local_port=nil)
97
101
  sock = Net.udp_connect(host,port,local_host,local_port)
98
102
  sock.write(data)
@@ -126,6 +130,8 @@ module Net
126
130
  #
127
131
  # @return [nil]
128
132
  #
133
+ # @api public
134
+ #
129
135
  def Net.udp_session(host,port,local_host=nil,local_port=nil)
130
136
  sock = Net.udp_connect(host,port,local_host,local_port)
131
137
 
@@ -159,6 +165,8 @@ module Net
159
165
  # @return [String]
160
166
  # The grabbed banner.
161
167
  #
168
+ # @api public
169
+ #
162
170
  def Net.udp_banner(host,port,local_host=nil,local_port=nil)
163
171
  banner = nil
164
172
 
@@ -185,6 +193,8 @@ module Net
185
193
  # @example
186
194
  # Net.udp_server(1337)
187
195
  #
196
+ # @api public
197
+ #
188
198
  def Net.udp_server(port,host='0.0.0.0')
189
199
  host = host.to_s
190
200
  server = UDPServer.new(host,port)
@@ -216,6 +226,8 @@ module Net
216
226
  # data, sender = server.recvfrom(1024)
217
227
  # end
218
228
  #
229
+ # @api public
230
+ #
219
231
  def Net.udp_server_session(port,host='0.0.0.0',&block)
220
232
  server = Net.udp_server(port,host,&block)
221
233
  server.close()
@@ -37,6 +37,8 @@ module Ronin
37
37
  # @see Proxy.new
38
38
  # @see Proxy.parse
39
39
  #
40
+ # @api public
41
+ #
40
42
  def HTTP.proxy
41
43
  @proxy ||= if ENV['HTTP_PROXY']
42
44
  Proxy.parse(ENV['HTTP_PROXY'])
@@ -58,6 +60,8 @@ module Ronin
58
60
  # The given proxy information was not a {Proxy}, `URI::HTTP`,
59
61
  # `Hash` or {String}.
60
62
  #
63
+ # @api public
64
+ #
61
65
  def HTTP.proxy=(new_proxy)
62
66
  @proxy = Proxy.create(new_proxy)
63
67
  end
@@ -68,6 +72,8 @@ module Ronin
68
72
  # @return [String, nil]
69
73
  # The default Ronin HTTP User-Agent.
70
74
  #
75
+ # @api public
76
+ #
71
77
  def HTTP.user_agent
72
78
  @user_agent ||= nil
73
79
  end
@@ -78,6 +84,8 @@ module Ronin
78
84
  # @param [String] agent
79
85
  # The new User-Agent string to use.
80
86
  #
87
+ # @api public
88
+ #
81
89
  def HTTP.user_agent=(agent)
82
90
  @user_agent = agent
83
91
  end
@@ -85,39 +93,40 @@ module Ronin
85
93
  #
86
94
  # Expands the URL into options.
87
95
  #
88
- # @param [URI::HTTP, String, nil] url
96
+ # @param [URI::HTTP, String] url
89
97
  # The URL to expand.
90
98
  #
91
99
  # @return [Hash{Symbol => Object}]
92
100
  # The options for the URL.
93
101
  #
102
+ # @api private
103
+ #
94
104
  def HTTP.expand_url(url)
95
- new_options = {
96
- :port => Net::HTTP.default_port,
97
- :path => '/'
98
- }
99
-
100
- if url
101
- url = case url
102
- when URI
103
- url
104
- when Hash
105
- URI::HTTP.build(url)
106
- else
107
- URI(url.to_s)
108
- end
109
-
110
- new_options[:ssl] = {} if url.scheme == 'https'
111
-
112
- new_options[:host] = url.host
113
- new_options[:port] = url.port
114
-
115
- new_options[:user] = url.user if url.user
116
- new_options[:password] = url.password if url.password
117
-
118
- new_options[:path] = url.path unless url.path.empty?
119
- new_options[:path] += "?#{url.query}" if url.query
120
- end
105
+ new_options = {}
106
+
107
+ url = case url
108
+ when URI
109
+ url
110
+ when Hash
111
+ URI::HTTP.build(url)
112
+ else
113
+ URI(url.to_s)
114
+ end
115
+
116
+ new_options[:ssl] = {} if url.scheme == 'https'
117
+
118
+ new_options[:host] = url.host
119
+ new_options[:port] = url.port
120
+
121
+ new_options[:user] = url.user if url.user
122
+ new_options[:password] = url.password if url.password
123
+
124
+ new_options[:path] = unless url.path.empty?
125
+ url.path
126
+ else
127
+ '/'
128
+ end
129
+ new_options[:path] += "?#{url.query}" if url.query
121
130
 
122
131
  return new_options
123
132
  end
@@ -152,15 +161,21 @@ module Ronin
152
161
  # @return [Hash]
153
162
  # The expanded version of options.
154
163
  #
164
+ # @api private
165
+ #
155
166
  def HTTP.expand_options(options={})
156
167
  new_options = options.dup
157
168
 
169
+ new_options[:port] ||= Net::HTTP.default_port
170
+ new_options[:path] ||= '/'
171
+
158
172
  if new_options[:ssl] == true
159
173
  new_options[:ssl] = {}
160
174
  end
161
175
 
162
- url = new_options.delete(:url)
163
- new_options.merge!(HTTP.expand_url(url))
176
+ if (url = new_options.delete(:url))
177
+ new_options.merge!(HTTP.expand_url(url))
178
+ end
164
179
 
165
180
  new_options[:proxy] = if new_options.has_key?(:proxy)
166
181
  HTTP::Proxy.create(new_options[:proxy])
@@ -181,6 +196,8 @@ module Ronin
181
196
  # @return [String]
182
197
  # The camel-case HTTP header name.
183
198
  #
199
+ # @api private
200
+ #
184
201
  def HTTP.header_name(name)
185
202
  words = name.to_s.split(/[\s+_-]/)
186
203
 
@@ -198,6 +215,8 @@ module Ronin
198
215
  # @return [Hash]
199
216
  # The camel-cased HTTP headers created from the given options.
200
217
  #
218
+ # @api private
219
+ #
201
220
  def HTTP.headers(options={})
202
221
  headers = {}
203
222
 
@@ -253,6 +272,8 @@ module Ronin
253
272
  #
254
273
  # @see HTTP.expand_options
255
274
  #
275
+ # @api private
276
+ #
256
277
  def HTTP.request(options={})
257
278
  unless options[:method]
258
279
  raise(ArgumentError,"the :method option must be specified")