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--"
|