remailer 0.3.4 → 0.3.6
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/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.3.
|
1
|
+
0.3.6
|
data/lib/remailer/connection.rb
CHANGED
@@ -27,6 +27,7 @@ class Remailer::Connection < EventMachine::Connection
|
|
27
27
|
|
28
28
|
# == Properties ===========================================================
|
29
29
|
|
30
|
+
attr_accessor :active_message
|
30
31
|
attr_accessor :remote, :max_size, :protocol, :hostname
|
31
32
|
attr_accessor :pipelining, :tls_support, :auth_support
|
32
33
|
attr_accessor :timeout
|
@@ -51,6 +52,7 @@ class Remailer::Connection < EventMachine::Connection
|
|
51
52
|
# * error => Where to send errors (IO or Proc)
|
52
53
|
# * on_connect => Called upon successful connection (Proc)
|
53
54
|
# * on_error => Called upon connection error (Proc)
|
55
|
+
# * on_disconnect => Called when connection is closed (Proc)
|
54
56
|
# A block can be supplied in which case it will stand in as the :connect
|
55
57
|
# option. The block will recieve a first argument that is the status of
|
56
58
|
# the connection, and an optional second that is a diagnostic message.
|
@@ -130,6 +132,7 @@ class Remailer::Connection < EventMachine::Connection
|
|
130
132
|
STDERR.puts "#{e.class}: #{e}"
|
131
133
|
end
|
132
134
|
|
135
|
+
# Returns true if the connection requires TLS support, or false otherwise.
|
133
136
|
def use_tls?
|
134
137
|
!!@options[:use_tls]
|
135
138
|
end
|
@@ -195,12 +198,6 @@ class Remailer::Connection < EventMachine::Connection
|
|
195
198
|
end
|
196
199
|
end
|
197
200
|
|
198
|
-
# Returns the details of the active message being sent, or nil if no message
|
199
|
-
# is being sent.
|
200
|
-
def active_message
|
201
|
-
@active_message
|
202
|
-
end
|
203
|
-
|
204
201
|
# Reassigns the timeout which is specified in seconds. Values equal to
|
205
202
|
# or less than zero are ignored and a default is used instead.
|
206
203
|
def timeout=(value)
|
@@ -218,12 +215,14 @@ class Remailer::Connection < EventMachine::Connection
|
|
218
215
|
# a connection closed event.
|
219
216
|
def unbind
|
220
217
|
@interpreter = nil
|
221
|
-
|
218
|
+
|
222
219
|
if (@active_message)
|
223
220
|
if (callback = @active_message[:callback])
|
224
221
|
callback.call(nil)
|
225
222
|
end
|
226
223
|
end
|
224
|
+
|
225
|
+
send_callback(:on_disconnect)
|
227
226
|
end
|
228
227
|
|
229
228
|
# This implements the EventMachine::Connection#receive_data method that
|
@@ -244,15 +243,25 @@ class Remailer::Connection < EventMachine::Connection
|
|
244
243
|
end
|
245
244
|
|
246
245
|
def post_init
|
247
|
-
EventMachine.add_periodic_timer(1) do
|
246
|
+
@timer = EventMachine.add_periodic_timer(1) do
|
248
247
|
check_for_timeouts!
|
249
248
|
end
|
250
249
|
end
|
251
250
|
|
251
|
+
#
|
252
|
+
def detach
|
253
|
+
@timer.cancel
|
254
|
+
super
|
255
|
+
end
|
256
|
+
|
257
|
+
# Returns the current state of the active interpreter, or nil if no state
|
258
|
+
# is assigned.
|
252
259
|
def state
|
253
260
|
@interpreter and @interpreter.state
|
254
261
|
end
|
255
262
|
|
263
|
+
# Sends a single line to the remote host with the appropriate CR+LF
|
264
|
+
# delmiter at the end.
|
256
265
|
def send_line(line = '')
|
257
266
|
reset_timeout!
|
258
267
|
|
@@ -274,13 +283,18 @@ class Remailer::Connection < EventMachine::Connection
|
|
274
283
|
nil
|
275
284
|
end
|
276
285
|
|
286
|
+
# Resets the timeout time. Returns the time at which a timeout will occur.
|
277
287
|
def reset_timeout!
|
278
288
|
@timeout_at = Time.now + @timeout
|
279
289
|
end
|
280
290
|
|
291
|
+
# Checks for a timeout condition, and if one is detected, will close the
|
292
|
+
# connection and send appropriate callbacks.
|
281
293
|
def check_for_timeouts!
|
282
294
|
return if (!@timeout_at or Time.now < @timeout_at)
|
283
295
|
|
296
|
+
@timeout_at = nil
|
297
|
+
|
284
298
|
error_notification(:timeout, "Connection timed out")
|
285
299
|
debug_notification(:timeout, "Connection timed out")
|
286
300
|
message_callback(:timeout, "Connection timed out before send could complete")
|
@@ -293,42 +307,54 @@ class Remailer::Connection < EventMachine::Connection
|
|
293
307
|
close_connection
|
294
308
|
end
|
295
309
|
|
310
|
+
# Returns true if pipelining support has been detected on the connection,
|
311
|
+
# false otherwise.
|
296
312
|
def pipelining?
|
297
313
|
!!@pipelining
|
298
314
|
end
|
299
315
|
|
316
|
+
# Returns true if pipelining support has been detected on the connection,
|
317
|
+
# false otherwise.
|
300
318
|
def tls_support?
|
301
319
|
!!@tls_support
|
302
320
|
end
|
303
321
|
|
322
|
+
# Returns true if the connection has been closed, false otherwise.
|
304
323
|
def closed?
|
305
324
|
!!@closed
|
306
325
|
end
|
307
326
|
|
327
|
+
# Returns true if an error has occurred, false otherwise.
|
308
328
|
def error?
|
309
329
|
!!@error
|
310
330
|
end
|
311
|
-
|
331
|
+
|
332
|
+
# EventMachine: Enables TLS support on the connection.
|
312
333
|
def start_tls
|
313
334
|
debug_notification(:tls, "Started")
|
314
335
|
super
|
315
336
|
end
|
316
|
-
|
337
|
+
|
338
|
+
# EventMachine: Closes down the connection.
|
317
339
|
def close_connection
|
340
|
+
send_callback(:on_disconnect)
|
318
341
|
debug_notification(:closed, "Connection closed")
|
319
342
|
super
|
320
343
|
@closed = true
|
321
344
|
end
|
322
345
|
alias_method :close, :close_connection
|
323
346
|
|
347
|
+
# Switches to use the SOCKS5 interpreter for all subsequent communication
|
324
348
|
def use_socks5_interpreter!
|
325
349
|
@interpreter = Remailer::Connection::Socks5Interpreter.new(:delegate => self)
|
326
350
|
end
|
327
351
|
|
352
|
+
# Switches to use the SMTP interpreter for all subsequent communication
|
328
353
|
def use_smtp_interpreter!
|
329
354
|
@interpreter = Remailer::Connection::SmtpInterpreter.new(:delegate => self)
|
330
355
|
end
|
331
356
|
|
357
|
+
# Callback receiver for when the proxy connection has been completed.
|
332
358
|
def after_proxy_connected
|
333
359
|
use_smtp_interpreter!
|
334
360
|
end
|
@@ -161,7 +161,7 @@ class Remailer::Connection::SmtpInterpreter < Remailer::Interpreter
|
|
161
161
|
|
162
162
|
state :mail_from do
|
163
163
|
enter do
|
164
|
-
delegate.send_line("MAIL FROM
|
164
|
+
delegate.send_line("MAIL FROM:<#{delegate.active_message[:from]}>")
|
165
165
|
end
|
166
166
|
|
167
167
|
interpret(250) do
|
@@ -171,7 +171,7 @@ class Remailer::Connection::SmtpInterpreter < Remailer::Interpreter
|
|
171
171
|
|
172
172
|
state :rcpt_to do
|
173
173
|
enter do
|
174
|
-
delegate.send_line("RCPT TO
|
174
|
+
delegate.send_line("RCPT TO:<#{delegate.active_message[:to]}>")
|
175
175
|
end
|
176
176
|
|
177
177
|
interpret(250) do
|
@@ -253,7 +253,7 @@ class Remailer::Connection::SmtpInterpreter < Remailer::Interpreter
|
|
253
253
|
end
|
254
254
|
|
255
255
|
on_error do |reply_code, reply_message|
|
256
|
-
delegate.
|
256
|
+
delegate.message_callback(reply_code, reply_message)
|
257
257
|
delegate.debug_notification(:error, "[#{@state}] #{reply_code} #{reply_message}")
|
258
258
|
delegate.error_notification(reply_code, reply_message)
|
259
259
|
|
data/remailer.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{remailer}
|
8
|
-
s.version = "0.3.
|
8
|
+
s.version = "0.3.6"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Scott Tadman"]
|
12
|
-
s.date = %q{2010-12-
|
12
|
+
s.date = %q{2010-12-17}
|
13
13
|
s.description = %q{EventMachine capable SMTP engine}
|
14
14
|
s.email = %q{scott@twg.ca}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -192,13 +192,13 @@ class RemailerConnectionSmtpInterpreterTest < Test::Unit::TestCase
|
|
192
192
|
|
193
193
|
assert_equal :mail_from, interpreter.state
|
194
194
|
|
195
|
-
assert_equal 'MAIL FROM
|
195
|
+
assert_equal 'MAIL FROM:<from@example.com>', delegate.read
|
196
196
|
|
197
197
|
interpreter.process("250 OK\r\n")
|
198
198
|
|
199
199
|
assert_equal :rcpt_to, interpreter.state
|
200
200
|
|
201
|
-
assert_equal 'RCPT TO
|
201
|
+
assert_equal 'RCPT TO:<to@example.com>', delegate.read
|
202
202
|
|
203
203
|
interpreter.process("250 Accepted\r\n")
|
204
204
|
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 3
|
8
|
-
-
|
9
|
-
version: 0.3.
|
8
|
+
- 6
|
9
|
+
version: 0.3.6
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Scott Tadman
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-12-
|
17
|
+
date: 2010-12-17 00:00:00 -05:00
|
18
18
|
default_executable:
|
19
19
|
dependencies: []
|
20
20
|
|