remailer 0.5.2 → 0.9.1
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/Gemfile +9 -0
- data/LICENSE.txt +19 -0
- data/{README.rdoc → README.md} +12 -11
- data/Rakefile +21 -11
- data/VERSION +1 -1
- data/lib/remailer/abstract_connection.rb +36 -20
- data/lib/remailer/imap/client.rb +1 -1
- data/lib/remailer/interpreter.rb +40 -19
- data/lib/remailer/interpreter/state_proxy.rb +1 -1
- data/lib/remailer/smtp/client.rb +20 -26
- data/lib/remailer/smtp/client/interpreter.rb +85 -12
- data/lib/remailer/smtp/server.rb +9 -4
- data/lib/remailer/smtp/server/interpreter.rb +16 -15
- data/lib/remailer/smtp/server/transaction.rb +9 -2
- data/lib/remailer/socks5/client/interpreter.rb +18 -13
- data/remailer.gemspec +33 -23
- data/test/bin/exercise +115 -0
- data/test/config.example.yml +15 -0
- data/test/config.rb +41 -0
- data/test/helper.rb +42 -23
- data/test/unit/remailer_imap_client_interpreter_test.rb +2 -2
- data/test/unit/remailer_imap_client_test.rb +10 -12
- data/test/unit/remailer_interpreter_state_proxy_test.rb +14 -14
- data/test/unit/remailer_interpreter_test.rb +36 -28
- data/test/unit/remailer_smtp_client_interpreter_test.rb +80 -33
- data/test/unit/remailer_smtp_client_test.rb +53 -55
- data/test/unit/remailer_smtp_server_test.rb +24 -18
- data/test/unit/remailer_socks5_client_interpreter_test.rb +71 -10
- data/test/unit/remailer_test.rb +2 -2
- metadata +66 -24
- data/test/config.example.rb +0 -17
|
@@ -1,9 +1,15 @@
|
|
|
1
|
-
|
|
1
|
+
require_relative '../helper'
|
|
2
|
+
|
|
3
|
+
class RemailerSMTPServerTest < MiniTest::Test
|
|
4
|
+
def random_server_port
|
|
5
|
+
@server_port ||= 9000 + rand(4096)
|
|
6
|
+
|
|
7
|
+
@server_port += 1
|
|
8
|
+
end
|
|
2
9
|
|
|
3
|
-
class RemailerSMTPServerTest < Test::Unit::TestCase
|
|
4
10
|
def test_bind
|
|
5
11
|
engine do
|
|
6
|
-
server_port =
|
|
12
|
+
server_port = random_server_port
|
|
7
13
|
|
|
8
14
|
server = Remailer::SMTP::Server.bind(nil, server_port)
|
|
9
15
|
|
|
@@ -13,14 +19,14 @@ class RemailerSMTPServerTest < Test::Unit::TestCase
|
|
|
13
19
|
|
|
14
20
|
def test_connect
|
|
15
21
|
engine do
|
|
16
|
-
server_port =
|
|
22
|
+
server_port = random_server_port
|
|
17
23
|
|
|
18
24
|
remote_ip = nil
|
|
19
25
|
|
|
20
26
|
server = Remailer::SMTP::Server.bind(
|
|
21
|
-
|
|
27
|
+
'127.0.0.1',
|
|
22
28
|
server_port,
|
|
23
|
-
:
|
|
29
|
+
on_connect: lambda { |_remote_ip| remote_ip = _remote_ip }
|
|
24
30
|
)
|
|
25
31
|
|
|
26
32
|
assert server
|
|
@@ -28,11 +34,13 @@ class RemailerSMTPServerTest < Test::Unit::TestCase
|
|
|
28
34
|
connected_host = nil
|
|
29
35
|
|
|
30
36
|
client = Remailer::SMTP::Client.open(
|
|
31
|
-
'
|
|
32
|
-
:
|
|
33
|
-
:
|
|
34
|
-
:
|
|
37
|
+
'127.0.0.1',
|
|
38
|
+
port: server_port,
|
|
39
|
+
debug: self.debug_channel,
|
|
40
|
+
connect: lambda { |success, host| connected_host = host }
|
|
35
41
|
)
|
|
42
|
+
|
|
43
|
+
assert client
|
|
36
44
|
|
|
37
45
|
assert_eventually(30) do
|
|
38
46
|
connected_host
|
|
@@ -45,24 +53,22 @@ class RemailerSMTPServerTest < Test::Unit::TestCase
|
|
|
45
53
|
|
|
46
54
|
def test_transaction
|
|
47
55
|
engine do
|
|
48
|
-
server_port =
|
|
56
|
+
server_port = random_server_port
|
|
49
57
|
|
|
50
58
|
transaction = nil
|
|
51
59
|
|
|
52
60
|
server = Remailer::SMTP::Server.bind(
|
|
53
|
-
|
|
61
|
+
'127.0.0.1',
|
|
54
62
|
server_port,
|
|
55
|
-
:
|
|
63
|
+
on_transaction: lambda { |_transaction| transaction = _transaction }
|
|
56
64
|
)
|
|
57
65
|
|
|
58
66
|
assert server
|
|
59
67
|
|
|
60
|
-
connected_host = nil
|
|
61
|
-
|
|
62
68
|
client = Remailer::SMTP::Client.open(
|
|
63
|
-
'
|
|
64
|
-
:
|
|
65
|
-
:
|
|
69
|
+
'127.0.0.1',
|
|
70
|
+
port: server_port,
|
|
71
|
+
debug: self.debug_channel
|
|
66
72
|
)
|
|
67
73
|
|
|
68
74
|
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
|
|
@@ -6,6 +6,7 @@ class SOCKS5Delegate
|
|
|
6
6
|
def initialize(options = nil)
|
|
7
7
|
@sent = [ ]
|
|
8
8
|
@options = (options or { })
|
|
9
|
+
@closed = false
|
|
9
10
|
end
|
|
10
11
|
|
|
11
12
|
def resolve_hostname(hostname)
|
|
@@ -52,15 +53,15 @@ class SOCKS5Delegate
|
|
|
52
53
|
end
|
|
53
54
|
end
|
|
54
55
|
|
|
55
|
-
class RemailerSOCKS5ClientInterpreterTest < Test
|
|
56
|
+
class RemailerSOCKS5ClientInterpreterTest < MiniTest::Test
|
|
56
57
|
def test_defaults
|
|
57
58
|
delegate = SOCKS5Delegate.new(
|
|
58
|
-
:
|
|
59
|
-
:
|
|
59
|
+
proxy: {
|
|
60
|
+
host: 'example.net'
|
|
60
61
|
}
|
|
61
62
|
)
|
|
62
63
|
|
|
63
|
-
interpreter = Remailer::SOCKS5::Client::Interpreter.new(:
|
|
64
|
+
interpreter = Remailer::SOCKS5::Client::Interpreter.new(delegate: delegate)
|
|
64
65
|
|
|
65
66
|
assert_equal :initialized, interpreter.state
|
|
66
67
|
assert_equal false, delegate.closed?
|
|
@@ -68,13 +69,13 @@ class RemailerSOCKS5ClientInterpreterTest < Test::Unit::TestCase
|
|
|
68
69
|
|
|
69
70
|
def test_simple_connection
|
|
70
71
|
delegate = SOCKS5Delegate.new(
|
|
71
|
-
:
|
|
72
|
-
:
|
|
73
|
-
:
|
|
74
|
-
:
|
|
72
|
+
host: '1.2.3.4',
|
|
73
|
+
port: 4321,
|
|
74
|
+
proxy: {
|
|
75
|
+
host: 'example.net'
|
|
75
76
|
}
|
|
76
77
|
)
|
|
77
|
-
interpreter = Remailer::SOCKS5::Client::Interpreter.new(:
|
|
78
|
+
interpreter = Remailer::SOCKS5::Client::Interpreter.new(delegate: delegate)
|
|
78
79
|
|
|
79
80
|
assert_equal :initialized, interpreter.state
|
|
80
81
|
assert_equal false, delegate.closed?
|
|
@@ -121,4 +122,64 @@ class RemailerSOCKS5ClientInterpreterTest < Test::Unit::TestCase
|
|
|
121
122
|
|
|
122
123
|
assert_equal :connected, interpreter.state
|
|
123
124
|
end
|
|
125
|
+
|
|
126
|
+
def test_combined_socks5_smtp
|
|
127
|
+
delegate = SOCKS5Delegate.new(
|
|
128
|
+
host: '1.2.3.4',
|
|
129
|
+
port: 4321,
|
|
130
|
+
proxy: {
|
|
131
|
+
host: 'example.net'
|
|
132
|
+
}
|
|
133
|
+
)
|
|
134
|
+
interpreter = Remailer::SOCKS5::Client::Interpreter.new(delegate: delegate)
|
|
135
|
+
|
|
136
|
+
assert_equal :initialized, interpreter.state
|
|
137
|
+
assert_equal false, delegate.closed?
|
|
138
|
+
|
|
139
|
+
sent = delegate.read
|
|
140
|
+
|
|
141
|
+
assert_equal 2, sent.length
|
|
142
|
+
|
|
143
|
+
assert_equal [ Remailer::SOCKS5::Client::Interpreter::SOCKS5_VERSION, 0 ], sent.unpack('CC')
|
|
144
|
+
|
|
145
|
+
reply = [
|
|
146
|
+
Remailer::SOCKS5::Client::Interpreter::SOCKS5_VERSION,
|
|
147
|
+
Remailer::SOCKS5::Client::Interpreter::SOCKS5_METHOD[:no_auth]
|
|
148
|
+
].pack('CC')
|
|
149
|
+
|
|
150
|
+
interpreter.process(reply)
|
|
151
|
+
|
|
152
|
+
assert_equal false, interpreter.error?
|
|
153
|
+
assert_equal :connect_through_proxy, interpreter.state
|
|
154
|
+
assert_equal '', reply
|
|
155
|
+
|
|
156
|
+
sent = delegate.read
|
|
157
|
+
|
|
158
|
+
assert sent, "No data received"
|
|
159
|
+
assert_equal 10, sent.length
|
|
160
|
+
|
|
161
|
+
assert_equal [
|
|
162
|
+
Remailer::SOCKS5::Client::Interpreter::SOCKS5_VERSION,
|
|
163
|
+
Remailer::SOCKS5::Client::Interpreter::SOCKS5_COMMAND[:connect],
|
|
164
|
+
0,
|
|
165
|
+
Remailer::SOCKS5::Client::Interpreter::SOCKS5_ADDRESS_TYPE[:ipv4],
|
|
166
|
+
[ 1, 2, 3, 4 ].pack('CCCC'),
|
|
167
|
+
4321
|
|
168
|
+
], sent.unpack('CCCCA4n')
|
|
169
|
+
|
|
170
|
+
buffer = [
|
|
171
|
+
Remailer::SOCKS5::Client::Interpreter::SOCKS5_VERSION,
|
|
172
|
+
0, # No error
|
|
173
|
+
0,
|
|
174
|
+
Remailer::SOCKS5::Client::Interpreter::SOCKS5_ADDRESS_TYPE[:ipv4],
|
|
175
|
+
[ 1, 2, 3, 4 ].pack('CCCC'),
|
|
176
|
+
4321
|
|
177
|
+
].pack('CCCCA4n') + '421 Welcome to an ESTMP Server'
|
|
178
|
+
|
|
179
|
+
interpreter.process(buffer)
|
|
180
|
+
|
|
181
|
+
assert_equal '421 Welcome to an ESTMP Server', buffer
|
|
182
|
+
|
|
183
|
+
assert_equal :connected, interpreter.state
|
|
184
|
+
end
|
|
124
185
|
end
|
data/test/unit/remailer_test.rb
CHANGED
metadata
CHANGED
|
@@ -1,41 +1,83 @@
|
|
|
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.9.1
|
|
6
5
|
platform: ruby
|
|
7
6
|
authors:
|
|
8
7
|
- Scott Tadman
|
|
9
|
-
autorequire:
|
|
8
|
+
autorequire:
|
|
10
9
|
bindir: bin
|
|
11
10
|
cert_chain: []
|
|
12
|
-
date:
|
|
11
|
+
date: 2020-09-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
|
+
- - ">="
|
|
28
25
|
- !ruby/object:Gem::Version
|
|
29
26
|
version: '0'
|
|
30
|
-
|
|
31
|
-
|
|
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: minitest-reporters
|
|
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
|
+
- - ">="
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: '0'
|
|
55
|
+
- !ruby/object:Gem::Dependency
|
|
56
|
+
name: juwelier
|
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
|
58
|
+
requirements:
|
|
59
|
+
- - ">="
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: '0'
|
|
62
|
+
type: :development
|
|
63
|
+
prerelease: false
|
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
+
requirements:
|
|
66
|
+
- - ">="
|
|
67
|
+
- !ruby/object:Gem::Version
|
|
68
|
+
version: '0'
|
|
69
|
+
description: EventMachine Mail Agent for SMTP and IMAP
|
|
70
|
+
email: tadman@postageapp.com
|
|
32
71
|
executables: []
|
|
33
72
|
extensions: []
|
|
34
73
|
extra_rdoc_files:
|
|
35
|
-
-
|
|
74
|
+
- LICENSE.txt
|
|
75
|
+
- README.md
|
|
36
76
|
files:
|
|
37
|
-
- .document
|
|
38
|
-
-
|
|
77
|
+
- ".document"
|
|
78
|
+
- Gemfile
|
|
79
|
+
- LICENSE.txt
|
|
80
|
+
- README.md
|
|
39
81
|
- Rakefile
|
|
40
82
|
- VERSION
|
|
41
83
|
- lib/remailer.rb
|
|
@@ -60,7 +102,9 @@ files:
|
|
|
60
102
|
- lib/remailer/socks5/client/interpreter.rb
|
|
61
103
|
- lib/remailer/support.rb
|
|
62
104
|
- remailer.gemspec
|
|
63
|
-
- test/
|
|
105
|
+
- test/bin/exercise
|
|
106
|
+
- test/config.example.yml
|
|
107
|
+
- test/config.rb
|
|
64
108
|
- test/helper.rb
|
|
65
109
|
- test/unit/remailer_imap_client_interpreter_test.rb
|
|
66
110
|
- test/unit/remailer_imap_client_test.rb
|
|
@@ -71,28 +115,26 @@ files:
|
|
|
71
115
|
- test/unit/remailer_smtp_server_test.rb
|
|
72
116
|
- test/unit/remailer_socks5_client_interpreter_test.rb
|
|
73
117
|
- test/unit/remailer_test.rb
|
|
74
|
-
homepage: http://github.com/
|
|
118
|
+
homepage: http://github.com/postageapp/remailer
|
|
75
119
|
licenses: []
|
|
76
|
-
|
|
120
|
+
metadata: {}
|
|
121
|
+
post_install_message:
|
|
77
122
|
rdoc_options: []
|
|
78
123
|
require_paths:
|
|
79
124
|
- lib
|
|
80
125
|
required_ruby_version: !ruby/object:Gem::Requirement
|
|
81
|
-
none: false
|
|
82
126
|
requirements:
|
|
83
|
-
- -
|
|
127
|
+
- - ">="
|
|
84
128
|
- !ruby/object:Gem::Version
|
|
85
129
|
version: '0'
|
|
86
130
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
87
|
-
none: false
|
|
88
131
|
requirements:
|
|
89
|
-
- -
|
|
132
|
+
- - ">="
|
|
90
133
|
- !ruby/object:Gem::Version
|
|
91
134
|
version: '0'
|
|
92
135
|
requirements: []
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
specification_version: 3
|
|
136
|
+
rubygems_version: 3.1.4
|
|
137
|
+
signing_key:
|
|
138
|
+
specification_version: 4
|
|
97
139
|
summary: Reactor-Ready SMTP Mailer
|
|
98
140
|
test_files: []
|
data/test/config.example.rb
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
TestConfig.smtp_server = {
|
|
2
|
-
:host => "smtp.example.com",
|
|
3
|
-
:identifier => "smtp.example.com"
|
|
4
|
-
}
|
|
5
|
-
|
|
6
|
-
TestConfig.public_smtp_server = {
|
|
7
|
-
:host => "smtp.gmail.com",
|
|
8
|
-
:identifier => "mx.google.com",
|
|
9
|
-
:username => "--your--username--gmail.com",
|
|
10
|
-
:password => "--your--password--",
|
|
11
|
-
:port => 587
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
TestConfig.proxy_server = "proxy.example.com"
|
|
15
|
-
|
|
16
|
-
TestConfig.recipient = "--your--email--"
|
|
17
|
-
TestConfig.sender = "--your--email--"
|