remailer 0.5.2 → 0.6.0
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.
- checksums.yaml +7 -0
- data/.travis.yml +7 -0
- data/Gemfile +8 -0
- data/{README.rdoc → README.md} +9 -9
- data/Rakefile +8 -3
- data/VERSION +1 -1
- data/lib/remailer/abstract_connection.rb +2 -5
- data/lib/remailer/imap/client.rb +1 -1
- data/lib/remailer/interpreter.rb +8 -2
- data/lib/remailer/smtp/client.rb +14 -26
- data/lib/remailer/smtp/server.rb +1 -1
- data/lib/remailer/smtp/server/interpreter.rb +2 -2
- data/lib/remailer/socks5/client/interpreter.rb +16 -11
- data/remailer.gemspec +17 -7
- data/test/bin/exercise +115 -0
- data/test/config.example.rb +7 -7
- data/test/helper.rb +4 -4
- data/test/unit/remailer_imap_client_interpreter_test.rb +2 -2
- data/test/unit/remailer_imap_client_test.rb +4 -4
- data/test/unit/remailer_interpreter_state_proxy_test.rb +14 -14
- data/test/unit/remailer_interpreter_test.rb +3 -3
- data/test/unit/remailer_smtp_client_interpreter_test.rb +24 -24
- data/test/unit/remailer_smtp_client_test.rb +24 -24
- data/test/unit/remailer_smtp_server_test.rb +9 -9
- data/test/unit/remailer_socks5_client_interpreter_test.rb +70 -10
- data/test/unit/remailer_test.rb +2 -2
- metadata +43 -16
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 709e0bf509c227f3e6b529520bc82af7a02c9a43
|
4
|
+
data.tar.gz: d2e193e4690ae8d71004c1e0c4fdda782e5d786c
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 2ec11c9db71e13589670c3841824ccba7b47c27d2e1ee464885313a0364bd40fd4ad575b06d36ce0710b866caa18287b2858ada691ede63dc18dcc840e4b8030
|
7
|
+
data.tar.gz: f8a2688508db19e4c5804edfc11633db29ae9d4c21ec3ab0b1e7379aee1a64bf58abc1edf8290715f401e221697b974e0f0504d9adb569c7175e8e2a36f4615b
|
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/{README.rdoc → README.md}
RENAMED
@@ -1,8 +1,8 @@
|
|
1
|
-
|
1
|
+
# remailer
|
2
2
|
|
3
3
|
Client/Server Mail Networking Library for SMTP and IMAP
|
4
4
|
|
5
|
-
|
5
|
+
## Overview
|
6
6
|
|
7
7
|
This is an EventMachine Connection implementation of a high-performance
|
8
8
|
asynchronous SMTP client. Although EventMachine ships with a built-in SMTP
|
@@ -10,7 +10,7 @@ client, that version is limited to sending a single email per client,
|
|
10
10
|
and since establishing a client can be the majority of the time required
|
11
11
|
to send email, this limits throughput considerably.
|
12
12
|
|
13
|
-
|
13
|
+
## Use
|
14
14
|
|
15
15
|
The Remailer system consists of the Remailer::Connection class which works
|
16
16
|
within the EventMachine environment. To use it, create a client and then
|
@@ -21,7 +21,7 @@ make one or more requests to send email messages.
|
|
21
21
|
# messages to STDERR.
|
22
22
|
client = Remailer::SMTP::Client.open(
|
23
23
|
'smtp.google.com',
|
24
|
-
:
|
24
|
+
debug: STDERR
|
25
25
|
)
|
26
26
|
|
27
27
|
# Send a single email message through the client at the earliest
|
@@ -51,7 +51,7 @@ example is given here where the information is simply dumped on STDOUT:
|
|
51
51
|
|
52
52
|
client = Remailer::SMTP::Client.open(
|
53
53
|
'smtp.google.com',
|
54
|
-
:
|
54
|
+
debug: lambda { |type, message|
|
55
55
|
puts "#{type}> #{message.inspect}"
|
56
56
|
}
|
57
57
|
)
|
@@ -90,18 +90,18 @@ server. Success is defined as 250, errors vary:
|
|
90
90
|
|
91
91
|
A status code of nil is sent if the server timed out or the connection failed.
|
92
92
|
|
93
|
-
|
93
|
+
## Tests
|
94
94
|
|
95
95
|
In order to run tests, copy `test/config.example.rb` to `test/config.rb` and
|
96
96
|
adjust as required. For obvious reasons, passwords to SMTP test accounts are
|
97
97
|
not included in the source code of this library.
|
98
98
|
|
99
|
-
|
99
|
+
## Status
|
100
100
|
|
101
101
|
This software is currently experimental and is not recommended for production
|
102
102
|
use. Many of the internals may change significantly before a proper beta
|
103
103
|
release is made.
|
104
104
|
|
105
|
-
|
105
|
+
## Copyright
|
106
106
|
|
107
|
-
Copyright (c) 2010-
|
107
|
+
Copyright (c) 2010-2015 Scott Tadman, The Working Group
|
data/Rakefile
CHANGED
@@ -1,8 +1,13 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'rake'
|
3
3
|
|
4
|
+
require 'bundler/setup'
|
5
|
+
|
6
|
+
Bundler.require
|
7
|
+
|
4
8
|
begin
|
5
9
|
require 'jeweler'
|
10
|
+
|
6
11
|
Jeweler::Tasks.new do |gem|
|
7
12
|
gem.name = "remailer"
|
8
13
|
gem.summary = %Q{Reactor-Ready SMTP Mailer}
|
@@ -10,20 +15,20 @@ begin
|
|
10
15
|
gem.email = "scott@twg.ca"
|
11
16
|
gem.homepage = "http://github.com/twg/remailer"
|
12
17
|
gem.authors = [ "Scott Tadman" ]
|
13
|
-
gem.add_runtime_dependency 'eventmachine'
|
14
18
|
end
|
19
|
+
|
15
20
|
Jeweler::GemcutterTasks.new
|
21
|
+
|
16
22
|
rescue LoadError
|
17
23
|
puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
|
18
24
|
end
|
19
25
|
|
20
26
|
require 'rake/testtask'
|
27
|
+
|
21
28
|
Rake::TestTask.new(:test) do |test|
|
22
29
|
test.libs << 'lib' << 'test'
|
23
30
|
test.pattern = 'test/**/*_test.rb'
|
24
31
|
test.verbose = true
|
25
32
|
end
|
26
33
|
|
27
|
-
task :test => :check_dependencies
|
28
|
-
|
29
34
|
task :default => :test
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.6.0
|
@@ -245,6 +245,8 @@ class Remailer::AbstractConnection < EventMachine::Connection
|
|
245
245
|
|
246
246
|
rescue Object => e
|
247
247
|
STDERR.puts("[#{e.class}] #{e}")
|
248
|
+
|
249
|
+
raise e
|
248
250
|
end
|
249
251
|
|
250
252
|
def post_init
|
@@ -399,11 +401,6 @@ class Remailer::AbstractConnection < EventMachine::Connection
|
|
399
401
|
|
400
402
|
reset_timeout!
|
401
403
|
end
|
402
|
-
|
403
|
-
# Switches to use the SOCKS5 interpreter for all subsequent communication
|
404
|
-
def use_socks5_interpreter!
|
405
|
-
@interpreter = Remailer::SOCKS5::Client::Interpreter.new(:delegate => self)
|
406
|
-
end
|
407
404
|
|
408
405
|
# -- Callbacks and Notifications ------------------------------------------
|
409
406
|
|
data/lib/remailer/imap/client.rb
CHANGED
@@ -192,7 +192,7 @@ class Remailer::IMAP::Client < Remailer::AbstractConnection
|
|
192
192
|
protected
|
193
193
|
# Switches to use the IMAP interpreter for all subsequent communication
|
194
194
|
def use_imap_interpreter!
|
195
|
-
@interpreter = Interpreter.new(:
|
195
|
+
@interpreter = Interpreter.new(delegate: self)
|
196
196
|
end
|
197
197
|
|
198
198
|
def next_tag
|
data/lib/remailer/interpreter.rb
CHANGED
@@ -212,8 +212,8 @@ class Remailer::Interpreter
|
|
212
212
|
yield(parsed) if (block_given?)
|
213
213
|
|
214
214
|
interpret(*parsed)
|
215
|
-
|
216
|
-
break if (s.empty?)
|
215
|
+
|
216
|
+
break if (s.empty? or self.finished?)
|
217
217
|
end
|
218
218
|
end
|
219
219
|
|
@@ -290,6 +290,12 @@ class Remailer::Interpreter
|
|
290
290
|
def will_interpret?(proc, args)
|
291
291
|
true
|
292
292
|
end
|
293
|
+
|
294
|
+
# Should return true if this interpreter no longer wants any data, false
|
295
|
+
# otherwise. Subclasses should implement their own behavior here.
|
296
|
+
def finished?
|
297
|
+
false
|
298
|
+
end
|
293
299
|
|
294
300
|
# Returns true if an error has been generated, false otherwise. The error
|
295
301
|
# content can be retrived by calling error.
|
data/lib/remailer/smtp/client.rb
CHANGED
@@ -69,6 +69,11 @@ class Remailer::SMTP::Client < Remailer::AbstractConnection
|
|
69
69
|
end
|
70
70
|
end
|
71
71
|
|
72
|
+
# Switches to use the SOCKS5 interpreter for all subsequent communication
|
73
|
+
def use_socks5_interpreter!
|
74
|
+
@interpreter = Remailer::SOCKS5::Client::Interpreter.new(delegate: self)
|
75
|
+
end
|
76
|
+
|
72
77
|
# Closes the connection after all of the queued messages have been sent.
|
73
78
|
def close_when_complete!
|
74
79
|
@options[:close] = true
|
@@ -83,10 +88,10 @@ class Remailer::SMTP::Client < Remailer::AbstractConnection
|
|
83
88
|
end
|
84
89
|
|
85
90
|
message = {
|
86
|
-
:
|
87
|
-
:
|
88
|
-
:
|
89
|
-
:
|
91
|
+
from: from,
|
92
|
+
to: to,
|
93
|
+
data: data,
|
94
|
+
callback: block
|
90
95
|
}
|
91
96
|
|
92
97
|
@messages << message
|
@@ -108,10 +113,10 @@ class Remailer::SMTP::Client < Remailer::AbstractConnection
|
|
108
113
|
end
|
109
114
|
|
110
115
|
message = {
|
111
|
-
:
|
112
|
-
:
|
113
|
-
:
|
114
|
-
:
|
116
|
+
from: from,
|
117
|
+
to: to,
|
118
|
+
test: true,
|
119
|
+
callback: block
|
115
120
|
}
|
116
121
|
|
117
122
|
@messages << message
|
@@ -146,23 +151,6 @@ class Remailer::SMTP::Client < Remailer::AbstractConnection
|
|
146
151
|
def unbound?
|
147
152
|
!!@unbound
|
148
153
|
end
|
149
|
-
|
150
|
-
# This implements the EventMachine::Connection#receive_data method that
|
151
|
-
# is called each time new data is received from the socket.
|
152
|
-
def receive_data(data)
|
153
|
-
reset_timeout!
|
154
|
-
|
155
|
-
@buffer ||= ''
|
156
|
-
@buffer << data
|
157
|
-
|
158
|
-
if (interpreter = @interpreter)
|
159
|
-
interpreter.process(@buffer) do |reply|
|
160
|
-
debug_notification(:receive, "[#{interpreter.label}] #{reply.inspect}")
|
161
|
-
end
|
162
|
-
else
|
163
|
-
error_notification(:out_of_band, "Receiving data before a protocol has been established.")
|
164
|
-
end
|
165
|
-
end
|
166
154
|
|
167
155
|
# Returns the current state of the active interpreter, or nil if no state
|
168
156
|
# is assigned.
|
@@ -227,7 +215,7 @@ class Remailer::SMTP::Client < Remailer::AbstractConnection
|
|
227
215
|
|
228
216
|
# Switches to use the SMTP interpreter for all subsequent communication
|
229
217
|
def use_smtp_interpreter!
|
230
|
-
@interpreter = Interpreter.new(:
|
218
|
+
@interpreter = Interpreter.new(delegate: self)
|
231
219
|
end
|
232
220
|
|
233
221
|
# Callback receiver for when the proxy connection has been completed.
|
data/lib/remailer/smtp/server.rb
CHANGED
@@ -69,7 +69,7 @@ class Remailer::SMTP::Server < EventMachine::Protocols::LineAndTextProtocol
|
|
69
69
|
def post_init
|
70
70
|
super
|
71
71
|
|
72
|
-
@interpreter = Interpreter.new(:
|
72
|
+
@interpreter = Interpreter.new(delegate: self)
|
73
73
|
|
74
74
|
if (@on_connect)
|
75
75
|
@on_connect.call(@remote_ip)
|
@@ -103,8 +103,8 @@ class Remailer::SMTP::Server::Interpreter < Remailer::Interpreter
|
|
103
103
|
elsif (delegate.tls?)
|
104
104
|
delegate.send_line("220 TLS ready to start")
|
105
105
|
delegate.start_tls(
|
106
|
-
:
|
107
|
-
:
|
106
|
+
private_key_file: Remailer::SMTP::Server.private_key_path,
|
107
|
+
cert_chain_file: Remailer::SMTP::Server.ssl_cert_path
|
108
108
|
)
|
109
109
|
|
110
110
|
@tls_started = true
|
@@ -5,14 +5,14 @@ class Remailer::SOCKS5::Client::Interpreter < Remailer::Interpreter
|
|
5
5
|
SOCKS5_VERSION = 5
|
6
6
|
|
7
7
|
SOCKS5_METHOD = {
|
8
|
-
:
|
9
|
-
:
|
10
|
-
:
|
8
|
+
no_auth: 0,
|
9
|
+
gssapi: 1,
|
10
|
+
username_password: 2
|
11
11
|
}.freeze
|
12
12
|
|
13
13
|
SOCKS5_COMMAND = {
|
14
|
-
:
|
15
|
-
:
|
14
|
+
connect: 1,
|
15
|
+
bind: 2
|
16
16
|
}.freeze
|
17
17
|
|
18
18
|
SOCKS5_REPLY = {
|
@@ -28,9 +28,9 @@ class Remailer::SOCKS5::Client::Interpreter < Remailer::Interpreter
|
|
28
28
|
}.freeze
|
29
29
|
|
30
30
|
SOCKS5_ADDRESS_TYPE = {
|
31
|
-
:
|
32
|
-
:
|
33
|
-
:
|
31
|
+
ipv4: 1,
|
32
|
+
domainname: 3,
|
33
|
+
ipv6: 4
|
34
34
|
}.freeze
|
35
35
|
|
36
36
|
# == State Mapping ========================================================
|
@@ -114,9 +114,9 @@ class Remailer::SOCKS5::Client::Interpreter < Remailer::Interpreter
|
|
114
114
|
[
|
115
115
|
reply,
|
116
116
|
{
|
117
|
-
:
|
118
|
-
:
|
119
|
-
:
|
117
|
+
address: address,
|
118
|
+
port: port,
|
119
|
+
address_type: address_type
|
120
120
|
}
|
121
121
|
]
|
122
122
|
end
|
@@ -128,6 +128,7 @@ class Remailer::SOCKS5::Client::Interpreter < Remailer::Interpreter
|
|
128
128
|
|
129
129
|
default do |reply|
|
130
130
|
@reply = reply
|
131
|
+
|
131
132
|
enter_state(:failed)
|
132
133
|
end
|
133
134
|
end
|
@@ -189,4 +190,8 @@ class Remailer::SOCKS5::Client::Interpreter < Remailer::Interpreter
|
|
189
190
|
def label
|
190
191
|
'SOCKS5'
|
191
192
|
end
|
193
|
+
|
194
|
+
def finished?
|
195
|
+
self.state == :connected
|
196
|
+
end
|
192
197
|
end
|
data/remailer.gemspec
CHANGED
@@ -2,22 +2,26 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
+
# stub: remailer 0.6.0 ruby lib
|
5
6
|
|
6
7
|
Gem::Specification.new do |s|
|
7
8
|
s.name = "remailer"
|
8
|
-
s.version = "0.
|
9
|
+
s.version = "0.6.0"
|
9
10
|
|
10
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
12
|
+
s.require_paths = ["lib"]
|
11
13
|
s.authors = ["Scott Tadman"]
|
12
|
-
s.date = "
|
14
|
+
s.date = "2015-01-22"
|
13
15
|
s.description = "EventMachine SMTP Mail User Agent"
|
14
16
|
s.email = "scott@twg.ca"
|
15
17
|
s.extra_rdoc_files = [
|
16
|
-
"README.
|
18
|
+
"README.md"
|
17
19
|
]
|
18
20
|
s.files = [
|
19
21
|
".document",
|
20
|
-
"
|
22
|
+
".travis.yml",
|
23
|
+
"Gemfile",
|
24
|
+
"README.md",
|
21
25
|
"Rakefile",
|
22
26
|
"VERSION",
|
23
27
|
"lib/remailer.rb",
|
@@ -42,6 +46,7 @@ Gem::Specification.new do |s|
|
|
42
46
|
"lib/remailer/socks5/client/interpreter.rb",
|
43
47
|
"lib/remailer/support.rb",
|
44
48
|
"remailer.gemspec",
|
49
|
+
"test/bin/exercise",
|
45
50
|
"test/config.example.rb",
|
46
51
|
"test/helper.rb",
|
47
52
|
"test/unit/remailer_imap_client_interpreter_test.rb",
|
@@ -55,20 +60,25 @@ Gem::Specification.new do |s|
|
|
55
60
|
"test/unit/remailer_test.rb"
|
56
61
|
]
|
57
62
|
s.homepage = "http://github.com/twg/remailer"
|
58
|
-
s.
|
59
|
-
s.rubygems_version = "1.8.24"
|
63
|
+
s.rubygems_version = "2.2.2"
|
60
64
|
s.summary = "Reactor-Ready SMTP Mailer"
|
61
65
|
|
62
66
|
if s.respond_to? :specification_version then
|
63
|
-
s.specification_version =
|
67
|
+
s.specification_version = 4
|
64
68
|
|
65
69
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
66
70
|
s.add_runtime_dependency(%q<eventmachine>, [">= 0"])
|
71
|
+
s.add_development_dependency(%q<minitest>, [">= 0"])
|
72
|
+
s.add_development_dependency(%q<jeweler>, [">= 0"])
|
67
73
|
else
|
68
74
|
s.add_dependency(%q<eventmachine>, [">= 0"])
|
75
|
+
s.add_dependency(%q<minitest>, [">= 0"])
|
76
|
+
s.add_dependency(%q<jeweler>, [">= 0"])
|
69
77
|
end
|
70
78
|
else
|
71
79
|
s.add_dependency(%q<eventmachine>, [">= 0"])
|
80
|
+
s.add_dependency(%q<minitest>, [">= 0"])
|
81
|
+
s.add_dependency(%q<jeweler>, [">= 0"])
|
72
82
|
end
|
73
83
|
end
|
74
84
|
|
data/test/bin/exercise
ADDED
@@ -0,0 +1,115 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'eventmachine'
|
4
|
+
require 'optparse'
|
5
|
+
require 'securerandom'
|
6
|
+
|
7
|
+
$LOAD_PATH << File.expand_path('../../lib', File.dirname(__FILE__))
|
8
|
+
|
9
|
+
require 'remailer'
|
10
|
+
|
11
|
+
# == Support Methods ========================================================
|
12
|
+
|
13
|
+
class Exerciser
|
14
|
+
attr_reader :report
|
15
|
+
|
16
|
+
def initialize(options)
|
17
|
+
@options = options
|
18
|
+
@pending = [ ]
|
19
|
+
@report = { }
|
20
|
+
end
|
21
|
+
|
22
|
+
def test(server)
|
23
|
+
results = @report[server] = {
|
24
|
+
success: 0,
|
25
|
+
timeout: 0,
|
26
|
+
error: 0
|
27
|
+
}
|
28
|
+
|
29
|
+
@options[:count].times do
|
30
|
+
uuid = SecureRandom.uuid
|
31
|
+
|
32
|
+
@pending << uuid
|
33
|
+
|
34
|
+
connection_options = {
|
35
|
+
close: true,
|
36
|
+
proxy: {
|
37
|
+
host: @options[:proxy_host],
|
38
|
+
port: @options[:proxy_port]
|
39
|
+
},
|
40
|
+
connect: lambda do |success, host|
|
41
|
+
results[success ? :success : :error] += 1
|
42
|
+
@pending.delete(uuid)
|
43
|
+
end
|
44
|
+
}
|
45
|
+
|
46
|
+
if (@options[:verbose])
|
47
|
+
connection_options[:debug] = STDOUT
|
48
|
+
end
|
49
|
+
|
50
|
+
Remailer::SMTP::Client.open(server, connection_options)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def done?
|
55
|
+
@pending.empty?
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
# == Main ===================================================================
|
60
|
+
|
61
|
+
options = {
|
62
|
+
count: 1,
|
63
|
+
concurrency: 1,
|
64
|
+
proxy_host: 'localhost',
|
65
|
+
proxy_port: 1080
|
66
|
+
}
|
67
|
+
|
68
|
+
opts = OptionParser.new do |parser|
|
69
|
+
parser.banner = "Usage: exerciser [options] server [server [...]]"
|
70
|
+
parser.on('-n', '--count=n') do |n|
|
71
|
+
options[:count] = n.to_i
|
72
|
+
end
|
73
|
+
parser.on('-c', '--concurrency=n') do |n|
|
74
|
+
options[:concurrency] = n.to_i
|
75
|
+
end
|
76
|
+
parser.on('-X', '--proxy=s') do |s|
|
77
|
+
server, port = s.split(/:/)
|
78
|
+
|
79
|
+
options[:proxy_host] = server
|
80
|
+
|
81
|
+
if (port)
|
82
|
+
options[:proxy_port] = port.to_i
|
83
|
+
end
|
84
|
+
end
|
85
|
+
parser.on('-v', '--verbose') do
|
86
|
+
options[:verbose] = true
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
servers = opts.parse(*ARGV)
|
91
|
+
|
92
|
+
unless (servers.any?)
|
93
|
+
puts opts
|
94
|
+
exit(0)
|
95
|
+
end
|
96
|
+
|
97
|
+
EventMachine.run do
|
98
|
+
exerciser = Exerciser.new(options)
|
99
|
+
|
100
|
+
servers.each do |server|
|
101
|
+
exerciser.test(server)
|
102
|
+
end
|
103
|
+
|
104
|
+
EventMachine.add_periodic_timer(0.1) do
|
105
|
+
if (exerciser.done?)
|
106
|
+
puts '%-40s %-6s %-6s' % [ 'Server', 'Success', 'Fail' ]
|
107
|
+
puts '-' * 58
|
108
|
+
exerciser.report.each do |server, results|
|
109
|
+
puts '%-40s %6d %6d' % [ server, results[:success], results[:error] ]
|
110
|
+
end
|
111
|
+
|
112
|
+
EventMachine.stop_event_loop
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
data/test/config.example.rb
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
TestConfig.smtp_server = {
|
2
|
-
:
|
3
|
-
:
|
2
|
+
host: "smtp.example.com",
|
3
|
+
identifier: "smtp.example.com"
|
4
4
|
}
|
5
5
|
|
6
6
|
TestConfig.public_smtp_server = {
|
7
|
-
:
|
8
|
-
:
|
9
|
-
:
|
10
|
-
:
|
11
|
-
:
|
7
|
+
host: "smtp.gmail.com",
|
8
|
+
identifier: "mx.google.com",
|
9
|
+
username: "--your--username--gmail.com",
|
10
|
+
password: "--your--password--",
|
11
|
+
port: 587
|
12
12
|
}
|
13
13
|
|
14
14
|
TestConfig.proxy_server = "proxy.example.com"
|
data/test/helper.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
require 'rubygems'
|
2
|
-
|
2
|
+
|
3
|
+
gem 'minitest'
|
4
|
+
require 'minitest/autorun'
|
3
5
|
|
4
6
|
$LOAD_PATH.unshift(File.expand_path('../lib', File.dirname(__FILE__)))
|
5
7
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
@@ -14,8 +16,6 @@ rescue => e
|
|
14
16
|
raise "EventMachine gem could not be loaded: #{e.class}: #{e}"
|
15
17
|
end
|
16
18
|
|
17
|
-
puts $LOAD_PATH.inspect
|
18
|
-
|
19
19
|
require 'remailer'
|
20
20
|
|
21
21
|
class Proc
|
@@ -51,7 +51,7 @@ module TestTriggerHelper
|
|
51
51
|
end
|
52
52
|
end
|
53
53
|
|
54
|
-
class Test
|
54
|
+
class MiniTest::Test
|
55
55
|
def engine
|
56
56
|
exception = nil
|
57
57
|
|
@@ -1,6 +1,6 @@
|
|
1
|
-
|
1
|
+
require_relative '../helper'
|
2
2
|
|
3
|
-
class RemailerIMAPClientInterpreterTest < Test
|
3
|
+
class RemailerIMAPClientInterpreterTest < MiniTest::Test
|
4
4
|
def test_split_list_definition
|
5
5
|
assert_mapping(
|
6
6
|
'(\HasChildren \HasNoChildren) "/" "[Gmail]/All Mail"' =>
|
@@ -1,6 +1,6 @@
|
|
1
|
-
|
1
|
+
require_relative '../helper'
|
2
2
|
|
3
|
-
class RemailerIMAPClientTest < Test
|
3
|
+
class RemailerIMAPClientTest < MiniTest::Test
|
4
4
|
def setup
|
5
5
|
STDERR.sync = true
|
6
6
|
end
|
@@ -11,8 +11,8 @@ class RemailerIMAPClientTest < Test::Unit::TestCase
|
|
11
11
|
|
12
12
|
client = Remailer::IMAP::Client.open(
|
13
13
|
TestConfig.imap_server[:host],
|
14
|
-
:
|
15
|
-
:
|
14
|
+
debug: STDERR,
|
15
|
+
connect: lambda { |success, host| connected_host = host }
|
16
16
|
)
|
17
17
|
|
18
18
|
assert client
|
@@ -1,6 +1,6 @@
|
|
1
|
-
|
1
|
+
require_relative '../helper'
|
2
2
|
|
3
|
-
class RemailerInterpreterStateTest < Test
|
3
|
+
class RemailerInterpreterStateTest < MiniTest::Test
|
4
4
|
def test_defaults
|
5
5
|
options = { }
|
6
6
|
|
@@ -15,9 +15,9 @@ class RemailerInterpreterStateTest < Test::Unit::TestCase
|
|
15
15
|
proxy = Remailer::Interpreter::StateProxy.new(options)
|
16
16
|
|
17
17
|
expected = {
|
18
|
-
:
|
19
|
-
:
|
20
|
-
:
|
18
|
+
enter: [ lambda { } ],
|
19
|
+
default: [ lambda { } ],
|
20
|
+
leave: [ lambda { } ]
|
21
21
|
}.freeze
|
22
22
|
|
23
23
|
proxy.enter(&expected[:enter][0])
|
@@ -31,9 +31,9 @@ class RemailerInterpreterStateTest < Test::Unit::TestCase
|
|
31
31
|
options = { }
|
32
32
|
|
33
33
|
expected = {
|
34
|
-
:
|
35
|
-
:
|
36
|
-
:
|
34
|
+
enter: [ lambda { } ],
|
35
|
+
terminate: [ lambda { } ],
|
36
|
+
leave: [ lambda { } ]
|
37
37
|
}.freeze
|
38
38
|
|
39
39
|
Remailer::Interpreter::StateProxy.new(options) do
|
@@ -49,10 +49,10 @@ class RemailerInterpreterStateTest < Test::Unit::TestCase
|
|
49
49
|
options = { }
|
50
50
|
|
51
51
|
expected = {
|
52
|
-
:
|
53
|
-
:
|
54
|
-
:
|
55
|
-
:
|
52
|
+
enter: [ lambda { } ],
|
53
|
+
interpret: [ [ 10, lambda { } ], [ 1, lambda { } ] ],
|
54
|
+
default: [ lambda { } ],
|
55
|
+
leave: [ lambda { } ]
|
56
56
|
}.freeze
|
57
57
|
|
58
58
|
Remailer::Interpreter::StateProxy.new(options) do
|
@@ -80,7 +80,7 @@ class RemailerInterpreterStateTest < Test::Unit::TestCase
|
|
80
80
|
|
81
81
|
proxy.leave(&proc[1])
|
82
82
|
|
83
|
-
assert_equal({ :
|
84
|
-
assert_equal({ :
|
83
|
+
assert_equal({ enter: [ proc[0] ] }, options_a)
|
84
|
+
assert_equal({ leave: [ proc[1] ] }, options_b)
|
85
85
|
end
|
86
86
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
require_relative '../helper'
|
2
2
|
|
3
3
|
class ExampleDelegate
|
4
4
|
include TestTriggerHelper
|
@@ -105,7 +105,7 @@ class InterpreterWithAccessor < Remailer::Interpreter
|
|
105
105
|
attr_accessor :example
|
106
106
|
end
|
107
107
|
|
108
|
-
class RemailerInterpreterTest < Test
|
108
|
+
class RemailerInterpreterTest < MiniTest::Test
|
109
109
|
def test_default_state
|
110
110
|
assert_equal [ :initialized, :terminated ], Remailer::Interpreter.states_defined.collect { |s| s.to_s }.sort.collect { |s| s.to_sym }
|
111
111
|
assert_equal true, Remailer::Interpreter.state_defined?(:initialized)
|
@@ -128,7 +128,7 @@ class RemailerInterpreterTest < Test::Unit::TestCase
|
|
128
128
|
|
129
129
|
assert delegate.triggered
|
130
130
|
|
131
|
-
interpreter = Remailer::Interpreter.new(:
|
131
|
+
interpreter = Remailer::Interpreter.new(delegate: delegate)
|
132
132
|
|
133
133
|
assert_equal nil, delegate.attribute
|
134
134
|
assert_equal false, delegate.triggered[:method_no_args]
|
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
require_relative '../helper'
|
2
2
|
|
3
3
|
class SMTPDelegate
|
4
4
|
attr_accessor :options, :protocol, :active_message
|
@@ -62,7 +62,7 @@ class SMTPDelegate
|
|
62
62
|
end
|
63
63
|
end
|
64
64
|
|
65
|
-
class RemailerSMTPClientInterpreterTest < Test
|
65
|
+
class RemailerSMTPClientInterpreterTest < MiniTest::Test
|
66
66
|
def test_split_reply
|
67
67
|
assert_mapping(
|
68
68
|
'250 OK' => [ 250, 'OK' ],
|
@@ -127,12 +127,12 @@ class RemailerSMTPClientInterpreterTest < Test::Unit::TestCase
|
|
127
127
|
end
|
128
128
|
|
129
129
|
def test_delegate_options
|
130
|
-
delegate = SMTPDelegate.new(:
|
130
|
+
delegate = SMTPDelegate.new(use_tls: true)
|
131
131
|
|
132
132
|
assert_equal true, delegate.use_tls?
|
133
133
|
assert_equal false, delegate.requires_authentication?
|
134
134
|
|
135
|
-
delegate = SMTPDelegate.new(:
|
135
|
+
delegate = SMTPDelegate.new(username: 'test@example.com', password: 'tester')
|
136
136
|
|
137
137
|
assert_equal false, delegate.use_tls?
|
138
138
|
assert_equal true, delegate.requires_authentication?
|
@@ -140,7 +140,7 @@ class RemailerSMTPClientInterpreterTest < Test::Unit::TestCase
|
|
140
140
|
|
141
141
|
def test_standard_smtp_connection
|
142
142
|
delegate = SMTPDelegate.new
|
143
|
-
interpreter = Remailer::SMTP::Client::Interpreter.new(:
|
143
|
+
interpreter = Remailer::SMTP::Client::Interpreter.new(delegate: delegate)
|
144
144
|
|
145
145
|
assert_equal :initialized, interpreter.state
|
146
146
|
|
@@ -163,7 +163,7 @@ class RemailerSMTPClientInterpreterTest < Test::Unit::TestCase
|
|
163
163
|
|
164
164
|
def test_standard_smtp_connection_send_email
|
165
165
|
delegate = SMTPDelegate.new
|
166
|
-
interpreter = Remailer::SMTP::Client::Interpreter.new(:
|
166
|
+
interpreter = Remailer::SMTP::Client::Interpreter.new(delegate: delegate)
|
167
167
|
|
168
168
|
assert_equal :initialized, interpreter.state
|
169
169
|
|
@@ -184,9 +184,9 @@ class RemailerSMTPClientInterpreterTest < Test::Unit::TestCase
|
|
184
184
|
assert_equal true, delegate.closed?
|
185
185
|
|
186
186
|
delegate.active_message = {
|
187
|
-
:
|
188
|
-
:
|
189
|
-
:
|
187
|
+
from: 'from@example.com',
|
188
|
+
to: 'to@example.com',
|
189
|
+
data: "Subject: Test Message\r\n\r\nThis is a message!\r\n"
|
190
190
|
}
|
191
191
|
|
192
192
|
interpreter.enter_state(:send)
|
@@ -218,7 +218,7 @@ class RemailerSMTPClientInterpreterTest < Test::Unit::TestCase
|
|
218
218
|
|
219
219
|
def test_standard_esmtp_connection
|
220
220
|
delegate = SMTPDelegate.new
|
221
|
-
interpreter = Remailer::SMTP::Client::Interpreter.new(:
|
221
|
+
interpreter = Remailer::SMTP::Client::Interpreter.new(delegate: delegate)
|
222
222
|
|
223
223
|
assert_equal :initialized, interpreter.state
|
224
224
|
|
@@ -254,8 +254,8 @@ class RemailerSMTPClientInterpreterTest < Test::Unit::TestCase
|
|
254
254
|
end
|
255
255
|
|
256
256
|
def test_multi_line_hello_response
|
257
|
-
delegate = SMTPDelegate.new(:
|
258
|
-
interpreter = Remailer::SMTP::Client::Interpreter.new(:
|
257
|
+
delegate = SMTPDelegate.new(use_tls: true)
|
258
|
+
interpreter = Remailer::SMTP::Client::Interpreter.new(delegate: delegate)
|
259
259
|
|
260
260
|
assert_equal :initialized, interpreter.state
|
261
261
|
assert_equal :smtp, delegate.protocol
|
@@ -276,8 +276,8 @@ class RemailerSMTPClientInterpreterTest < Test::Unit::TestCase
|
|
276
276
|
end
|
277
277
|
|
278
278
|
def test_tls_connection_with_support
|
279
|
-
delegate = SMTPDelegate.new(:
|
280
|
-
interpreter = Remailer::SMTP::Client::Interpreter.new(:
|
279
|
+
delegate = SMTPDelegate.new(use_tls: true)
|
280
|
+
interpreter = Remailer::SMTP::Client::Interpreter.new(delegate: delegate)
|
281
281
|
|
282
282
|
assert_equal true, delegate.use_tls?
|
283
283
|
assert_equal :initialized, interpreter.state
|
@@ -307,8 +307,8 @@ class RemailerSMTPClientInterpreterTest < Test::Unit::TestCase
|
|
307
307
|
end
|
308
308
|
|
309
309
|
def test_tls_connection_without_support
|
310
|
-
delegate = SMTPDelegate.new(:
|
311
|
-
interpreter = Remailer::SMTP::Client::Interpreter.new(:
|
310
|
+
delegate = SMTPDelegate.new(use_tls: true)
|
311
|
+
interpreter = Remailer::SMTP::Client::Interpreter.new(delegate: delegate)
|
312
312
|
|
313
313
|
interpreter.process("220 mail.example.com ESMTP Exim 4.63\r\n")
|
314
314
|
assert_equal 'EHLO localhost.local', delegate.read
|
@@ -322,8 +322,8 @@ class RemailerSMTPClientInterpreterTest < Test::Unit::TestCase
|
|
322
322
|
end
|
323
323
|
|
324
324
|
def test_basic_smtp_plaintext_auth_accepted
|
325
|
-
delegate = SMTPDelegate.new(:
|
326
|
-
interpreter = Remailer::SMTP::Client::Interpreter.new(:
|
325
|
+
delegate = SMTPDelegate.new(username: 'tester@example.com', password: 'tester')
|
326
|
+
interpreter = Remailer::SMTP::Client::Interpreter.new(delegate: delegate)
|
327
327
|
|
328
328
|
assert delegate.requires_authentication?
|
329
329
|
|
@@ -348,8 +348,8 @@ class RemailerSMTPClientInterpreterTest < Test::Unit::TestCase
|
|
348
348
|
end
|
349
349
|
|
350
350
|
def test_basic_esmtp_plaintext_auth_accepted
|
351
|
-
delegate = SMTPDelegate.new(:
|
352
|
-
interpreter = Remailer::SMTP::Client::Interpreter.new(:
|
351
|
+
delegate = SMTPDelegate.new(username: 'tester@example.com', password: 'tester')
|
352
|
+
interpreter = Remailer::SMTP::Client::Interpreter.new(delegate: delegate)
|
353
353
|
|
354
354
|
interpreter.process("220 mail.example.com ESMTP Exim 4.63\r\n")
|
355
355
|
assert_equal 'EHLO localhost.local', delegate.read
|
@@ -368,8 +368,8 @@ class RemailerSMTPClientInterpreterTest < Test::Unit::TestCase
|
|
368
368
|
end
|
369
369
|
|
370
370
|
def test_basic_esmtp_plaintext_auth_rejected
|
371
|
-
delegate = SMTPDelegate.new(:
|
372
|
-
interpreter = Remailer::SMTP::Client::Interpreter.new(:
|
371
|
+
delegate = SMTPDelegate.new(username: 'tester@example.com', password: 'tester')
|
372
|
+
interpreter = Remailer::SMTP::Client::Interpreter.new(delegate: delegate)
|
373
373
|
|
374
374
|
interpreter.process("220 mx.google.com ESMTP\r\n")
|
375
375
|
assert_equal 'EHLO localhost.local', delegate.read
|
@@ -396,8 +396,8 @@ class RemailerSMTPClientInterpreterTest < Test::Unit::TestCase
|
|
396
396
|
end
|
397
397
|
|
398
398
|
def test_unexpected_response
|
399
|
-
delegate = SMTPDelegate.new(:
|
400
|
-
interpreter = Remailer::SMTP::Client::Interpreter.new(:
|
399
|
+
delegate = SMTPDelegate.new(username: 'tester@example.com', password: 'tester')
|
400
|
+
interpreter = Remailer::SMTP::Client::Interpreter.new(delegate: delegate)
|
401
401
|
|
402
402
|
interpreter.process("530 Go away\r\n")
|
403
403
|
|
@@ -1,6 +1,6 @@
|
|
1
|
-
|
1
|
+
require_relative '../helper'
|
2
2
|
|
3
|
-
class RemailerSMTPClientTest < Test
|
3
|
+
class RemailerSMTPClientTest < MiniTest::Test
|
4
4
|
def test_connect
|
5
5
|
engine do
|
6
6
|
debug = { }
|
@@ -8,8 +8,8 @@ class RemailerSMTPClientTest < Test::Unit::TestCase
|
|
8
8
|
|
9
9
|
connection = Remailer::SMTP::Client.open(
|
10
10
|
TestConfig.smtp_server[:host],
|
11
|
-
:
|
12
|
-
:
|
11
|
+
debug: STDERR,
|
12
|
+
connect: lambda { |success, host| connected_host = host }
|
13
13
|
)
|
14
14
|
|
15
15
|
after_complete_trigger = false
|
@@ -45,13 +45,13 @@ class RemailerSMTPClientTest < Test::Unit::TestCase
|
|
45
45
|
|
46
46
|
connection = Remailer::SMTP::Client.open(
|
47
47
|
'example.com',
|
48
|
-
:
|
49
|
-
:
|
48
|
+
debug: STDERR,
|
49
|
+
error: lambda { |code, message|
|
50
50
|
error_received = [ code, message ]
|
51
51
|
},
|
52
|
-
:
|
53
|
-
:
|
54
|
-
:
|
52
|
+
on_connect: lambda { on_connect = true },
|
53
|
+
on_error: lambda { on_error = true },
|
54
|
+
timeout: 1
|
55
55
|
)
|
56
56
|
|
57
57
|
assert_eventually(3) do
|
@@ -72,11 +72,11 @@ class RemailerSMTPClientTest < Test::Unit::TestCase
|
|
72
72
|
|
73
73
|
connection = Remailer::SMTP::Client.open(
|
74
74
|
'invalid-example-domain--x.com',
|
75
|
-
:
|
76
|
-
:
|
75
|
+
debug: STDERR,
|
76
|
+
error: lambda { |code, message|
|
77
77
|
error_received = [ code, message ]
|
78
78
|
},
|
79
|
-
:
|
79
|
+
timeout: 1
|
80
80
|
)
|
81
81
|
|
82
82
|
assert_eventually(3) do
|
@@ -93,10 +93,10 @@ class RemailerSMTPClientTest < Test::Unit::TestCase
|
|
93
93
|
|
94
94
|
connection = Remailer::SMTP::Client.open(
|
95
95
|
TestConfig.public_smtp_server[:host],
|
96
|
-
:
|
97
|
-
:
|
98
|
-
:
|
99
|
-
:
|
96
|
+
port: TestConfig.public_smtp_server[:port] || Remailer::SMTP::Client::SMTP_PORT,
|
97
|
+
debug: STDERR,
|
98
|
+
username: TestConfig.public_smtp_server[:username],
|
99
|
+
password: TestConfig.public_smtp_server[:password]
|
100
100
|
)
|
101
101
|
|
102
102
|
after_complete_trigger = false
|
@@ -129,10 +129,10 @@ class RemailerSMTPClientTest < Test::Unit::TestCase
|
|
129
129
|
|
130
130
|
connection = Remailer::SMTP::Client.open(
|
131
131
|
TestConfig.smtp_server[:host],
|
132
|
-
:
|
133
|
-
:
|
134
|
-
:
|
135
|
-
:
|
132
|
+
debug: STDERR,
|
133
|
+
proxy: {
|
134
|
+
proto: :socks5,
|
135
|
+
host: TestConfig.proxy_server
|
136
136
|
}
|
137
137
|
)
|
138
138
|
|
@@ -164,7 +164,7 @@ class RemailerSMTPClientTest < Test::Unit::TestCase
|
|
164
164
|
engine do
|
165
165
|
connection = Remailer::SMTP::Client.open(
|
166
166
|
TestConfig.smtp_server[:host],
|
167
|
-
:
|
167
|
+
debug: STDERR
|
168
168
|
)
|
169
169
|
|
170
170
|
assert_equal :initialized, connection.state
|
@@ -197,7 +197,7 @@ class RemailerSMTPClientTest < Test::Unit::TestCase
|
|
197
197
|
engine do
|
198
198
|
connection = Remailer::SMTP::Client.open(
|
199
199
|
TestConfig.smtp_server[:host],
|
200
|
-
:
|
200
|
+
debug: STDERR
|
201
201
|
)
|
202
202
|
|
203
203
|
assert_equal :initialized, connection.state
|
@@ -222,7 +222,7 @@ class RemailerSMTPClientTest < Test::Unit::TestCase
|
|
222
222
|
engine do
|
223
223
|
connection = Remailer::SMTP::Client.open(
|
224
224
|
TestConfig.smtp_server[:host],
|
225
|
-
:
|
225
|
+
debug: STDERR
|
226
226
|
)
|
227
227
|
|
228
228
|
assert_equal :initialized, connection.state
|
@@ -250,7 +250,7 @@ class RemailerSMTPClientTest < Test::Unit::TestCase
|
|
250
250
|
engine do
|
251
251
|
connection = Remailer::SMTP::Client.open(
|
252
252
|
TestConfig.smtp_server[:host],
|
253
|
-
:
|
253
|
+
debug: STDERR
|
254
254
|
)
|
255
255
|
|
256
256
|
assert_equal :initialized, connection.state
|
@@ -1,6 +1,6 @@
|
|
1
|
-
|
1
|
+
require_relative '../helper'
|
2
2
|
|
3
|
-
class RemailerSMTPServerTest < Test
|
3
|
+
class RemailerSMTPServerTest < MiniTest::Test
|
4
4
|
def test_bind
|
5
5
|
engine do
|
6
6
|
server_port = 8025
|
@@ -20,7 +20,7 @@ class RemailerSMTPServerTest < Test::Unit::TestCase
|
|
20
20
|
server = Remailer::SMTP::Server.bind(
|
21
21
|
nil,
|
22
22
|
server_port,
|
23
|
-
:
|
23
|
+
on_connect: lambda { |_remote_ip| remote_ip = _remote_ip }
|
24
24
|
)
|
25
25
|
|
26
26
|
assert server
|
@@ -29,9 +29,9 @@ class RemailerSMTPServerTest < Test::Unit::TestCase
|
|
29
29
|
|
30
30
|
client = Remailer::SMTP::Client.open(
|
31
31
|
'localhost',
|
32
|
-
:
|
33
|
-
:
|
34
|
-
:
|
32
|
+
port: server_port,
|
33
|
+
debug: STDERR,
|
34
|
+
connect: lambda { |success, host| connected_host = host }
|
35
35
|
)
|
36
36
|
|
37
37
|
assert_eventually(30) do
|
@@ -52,7 +52,7 @@ class RemailerSMTPServerTest < Test::Unit::TestCase
|
|
52
52
|
server = Remailer::SMTP::Server.bind(
|
53
53
|
nil,
|
54
54
|
server_port,
|
55
|
-
:
|
55
|
+
on_transaction: lambda { |_transaction| transaction = _transaction }
|
56
56
|
)
|
57
57
|
|
58
58
|
assert server
|
@@ -61,8 +61,8 @@ class RemailerSMTPServerTest < Test::Unit::TestCase
|
|
61
61
|
|
62
62
|
client = Remailer::SMTP::Client.open(
|
63
63
|
'localhost',
|
64
|
-
:
|
65
|
-
:
|
64
|
+
port: server_port,
|
65
|
+
debug: STDERR
|
66
66
|
)
|
67
67
|
|
68
68
|
sender = 'sender@example.com'.freeze
|
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
require_relative '../helper'
|
2
2
|
|
3
3
|
class SOCKS5Delegate
|
4
4
|
attr_reader :options
|
@@ -52,15 +52,15 @@ class SOCKS5Delegate
|
|
52
52
|
end
|
53
53
|
end
|
54
54
|
|
55
|
-
class RemailerSOCKS5ClientInterpreterTest < Test
|
55
|
+
class RemailerSOCKS5ClientInterpreterTest < MiniTest::Test
|
56
56
|
def test_defaults
|
57
57
|
delegate = SOCKS5Delegate.new(
|
58
|
-
:
|
59
|
-
:
|
58
|
+
proxy: {
|
59
|
+
host: 'example.net'
|
60
60
|
}
|
61
61
|
)
|
62
62
|
|
63
|
-
interpreter = Remailer::SOCKS5::Client::Interpreter.new(:
|
63
|
+
interpreter = Remailer::SOCKS5::Client::Interpreter.new(delegate: delegate)
|
64
64
|
|
65
65
|
assert_equal :initialized, interpreter.state
|
66
66
|
assert_equal false, delegate.closed?
|
@@ -68,13 +68,13 @@ class RemailerSOCKS5ClientInterpreterTest < Test::Unit::TestCase
|
|
68
68
|
|
69
69
|
def test_simple_connection
|
70
70
|
delegate = SOCKS5Delegate.new(
|
71
|
-
:
|
72
|
-
:
|
73
|
-
:
|
74
|
-
:
|
71
|
+
host: '1.2.3.4',
|
72
|
+
port: 4321,
|
73
|
+
proxy: {
|
74
|
+
host: 'example.net'
|
75
75
|
}
|
76
76
|
)
|
77
|
-
interpreter = Remailer::SOCKS5::Client::Interpreter.new(:
|
77
|
+
interpreter = Remailer::SOCKS5::Client::Interpreter.new(delegate: delegate)
|
78
78
|
|
79
79
|
assert_equal :initialized, interpreter.state
|
80
80
|
assert_equal false, delegate.closed?
|
@@ -121,4 +121,64 @@ class RemailerSOCKS5ClientInterpreterTest < Test::Unit::TestCase
|
|
121
121
|
|
122
122
|
assert_equal :connected, interpreter.state
|
123
123
|
end
|
124
|
+
|
125
|
+
def test_combined_socks5_smtp
|
126
|
+
delegate = SOCKS5Delegate.new(
|
127
|
+
host: '1.2.3.4',
|
128
|
+
port: 4321,
|
129
|
+
proxy: {
|
130
|
+
host: 'example.net'
|
131
|
+
}
|
132
|
+
)
|
133
|
+
interpreter = Remailer::SOCKS5::Client::Interpreter.new(delegate: delegate)
|
134
|
+
|
135
|
+
assert_equal :initialized, interpreter.state
|
136
|
+
assert_equal false, delegate.closed?
|
137
|
+
|
138
|
+
sent = delegate.read
|
139
|
+
|
140
|
+
assert_equal 2, sent.length
|
141
|
+
|
142
|
+
assert_equal [ Remailer::SOCKS5::Client::Interpreter::SOCKS5_VERSION, 0 ], sent.unpack('CC')
|
143
|
+
|
144
|
+
reply = [
|
145
|
+
Remailer::SOCKS5::Client::Interpreter::SOCKS5_VERSION,
|
146
|
+
Remailer::SOCKS5::Client::Interpreter::SOCKS5_METHOD[:no_auth]
|
147
|
+
].pack('CC')
|
148
|
+
|
149
|
+
interpreter.process(reply)
|
150
|
+
|
151
|
+
assert_equal false, interpreter.error?
|
152
|
+
assert_equal :connect_through_proxy, interpreter.state
|
153
|
+
assert_equal '', reply
|
154
|
+
|
155
|
+
sent = delegate.read
|
156
|
+
|
157
|
+
assert sent, "No data received"
|
158
|
+
assert_equal 10, sent.length
|
159
|
+
|
160
|
+
assert_equal [
|
161
|
+
Remailer::SOCKS5::Client::Interpreter::SOCKS5_VERSION,
|
162
|
+
Remailer::SOCKS5::Client::Interpreter::SOCKS5_COMMAND[:connect],
|
163
|
+
0,
|
164
|
+
Remailer::SOCKS5::Client::Interpreter::SOCKS5_ADDRESS_TYPE[:ipv4],
|
165
|
+
[ 1, 2, 3, 4 ].pack('CCCC'),
|
166
|
+
4321
|
167
|
+
], sent.unpack('CCCCA4n')
|
168
|
+
|
169
|
+
buffer = [
|
170
|
+
Remailer::SOCKS5::Client::Interpreter::SOCKS5_VERSION,
|
171
|
+
0, # No error
|
172
|
+
0,
|
173
|
+
Remailer::SOCKS5::Client::Interpreter::SOCKS5_ADDRESS_TYPE[:ipv4],
|
174
|
+
[ 1, 2, 3, 4 ].pack('CCCC'),
|
175
|
+
4321
|
176
|
+
].pack('CCCCA4n') + '421 Welcome to an ESTMP Server'
|
177
|
+
|
178
|
+
interpreter.process(buffer)
|
179
|
+
|
180
|
+
assert_equal '421 Welcome to an ESTMP Server', buffer
|
181
|
+
|
182
|
+
assert_equal :connected, interpreter.state
|
183
|
+
end
|
124
184
|
end
|
data/test/unit/remailer_test.rb
CHANGED
metadata
CHANGED
@@ -1,30 +1,55 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: remailer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.6.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Scott Tadman
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2015-01-22 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: eventmachine
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - ">="
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: '0'
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: minitest
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: jeweler
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
28
53
|
- !ruby/object:Gem::Version
|
29
54
|
version: '0'
|
30
55
|
description: EventMachine SMTP Mail User Agent
|
@@ -32,10 +57,12 @@ email: scott@twg.ca
|
|
32
57
|
executables: []
|
33
58
|
extensions: []
|
34
59
|
extra_rdoc_files:
|
35
|
-
- README.
|
60
|
+
- README.md
|
36
61
|
files:
|
37
|
-
- .document
|
38
|
-
-
|
62
|
+
- ".document"
|
63
|
+
- ".travis.yml"
|
64
|
+
- Gemfile
|
65
|
+
- README.md
|
39
66
|
- Rakefile
|
40
67
|
- VERSION
|
41
68
|
- lib/remailer.rb
|
@@ -60,6 +87,7 @@ files:
|
|
60
87
|
- lib/remailer/socks5/client/interpreter.rb
|
61
88
|
- lib/remailer/support.rb
|
62
89
|
- remailer.gemspec
|
90
|
+
- test/bin/exercise
|
63
91
|
- test/config.example.rb
|
64
92
|
- test/helper.rb
|
65
93
|
- test/unit/remailer_imap_client_interpreter_test.rb
|
@@ -73,26 +101,25 @@ files:
|
|
73
101
|
- test/unit/remailer_test.rb
|
74
102
|
homepage: http://github.com/twg/remailer
|
75
103
|
licenses: []
|
104
|
+
metadata: {}
|
76
105
|
post_install_message:
|
77
106
|
rdoc_options: []
|
78
107
|
require_paths:
|
79
108
|
- lib
|
80
109
|
required_ruby_version: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
110
|
requirements:
|
83
|
-
- -
|
111
|
+
- - ">="
|
84
112
|
- !ruby/object:Gem::Version
|
85
113
|
version: '0'
|
86
114
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
87
|
-
none: false
|
88
115
|
requirements:
|
89
|
-
- -
|
116
|
+
- - ">="
|
90
117
|
- !ruby/object:Gem::Version
|
91
118
|
version: '0'
|
92
119
|
requirements: []
|
93
120
|
rubyforge_project:
|
94
|
-
rubygems_version:
|
121
|
+
rubygems_version: 2.2.2
|
95
122
|
signing_key:
|
96
|
-
specification_version:
|
123
|
+
specification_version: 4
|
97
124
|
summary: Reactor-Ready SMTP Mailer
|
98
125
|
test_files: []
|