midi-smtp-server 3.1.2 → 3.2.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 +4 -4
- data/CHANGELOG.md +6 -0
- data/README.md +16 -3
- data/lib/midi-smtp-server/version.rb +3 -3
- data/lib/midi-smtp-server.rb +98 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2376ca7f3510ebe230523b2fd5629dc39a5c44f3415ce3980d1e27d156ac3397
|
4
|
+
data.tar.gz: eaeb5ae1fe8dd868b772d9dfa267665e2b0e8b6f63c4761cab2d861cac412499
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: da5d3c16c081cd3c34be74d1f745bcc015e5c1fa9bbcdf6d55552e1e2c30df831ad63c025c86e4ffda078dc37b1c7bcf16d14fe512dbb91bbabb54dd9b2ca944
|
7
|
+
data.tar.gz: acbdac6c519f20758e9af7922094032ce3d3bc67e4874d8b37bac283e408ca303cd3fc47ae51b360e3ef9d1bfddc68bc620f5a105e4a68ca4a3d0ca3fef73ef6
|
data/CHANGELOG.md
CHANGED
@@ -5,6 +5,12 @@ We suggest everybody using MidiSmtpServer to switch at least to latest 2.3.y. or
|
|
5
5
|
For upgrades from previous versions or outdated _MiniSmtpServer_ gem you may follow the guides at [Appendix Upgrade](https://midi-smtp-server.readthedocs.io/appendix_upgrade/) to get your code ready for the latest releases.
|
6
6
|
|
7
7
|
|
8
|
+
#### 3.2.1 (2023-08-15)
|
9
|
+
|
10
|
+
1. New feature [proxy](https://midi-smtp-server.readthedocs.io/feature_proxy) ([check issue 49](https://github.com/4commerce-technologies-AG/midi-smtp-server/issues/49))
|
11
|
+
2. mkdocs update for readthedocs
|
12
|
+
|
13
|
+
|
8
14
|
#### 3.1.2 (2023-05-06)
|
9
15
|
|
10
16
|
1. Minor fix for backwards compatibility to method `start` when not using pre_fork options.
|
data/README.md
CHANGED
@@ -76,7 +76,11 @@ This source code shows the example to receive messages via SMTP and store them t
|
|
76
76
|
|
77
77
|
## Installation
|
78
78
|
|
79
|
-
MidiSmtpServer is packaged as a RubyGem
|
79
|
+
MidiSmtpServer is packaged as a RubyGem and hosted on rubygems.
|
80
|
+
|
81
|
+
#### CLI
|
82
|
+
|
83
|
+
You can easily install the package by entering following at your command line:
|
80
84
|
|
81
85
|
`gem install midi-smtp-server`
|
82
86
|
|
@@ -84,6 +88,14 @@ Use the component in your project sources by:
|
|
84
88
|
|
85
89
|
`require 'midi-smtp-server'`
|
86
90
|
|
91
|
+
#### Gemfile
|
92
|
+
|
93
|
+
When a `Gemfile` handles your dependencies, please consider to use the [pessimistic operator](https://thoughtbot.com/blog/rubys-pessimistic-operator) at least:
|
94
|
+
|
95
|
+
`gem 'midi-smtp-server', '~> 3.1.2''`
|
96
|
+
|
97
|
+
All changes by PATCH versions are always functional and compatible with no issues on update!
|
98
|
+
|
87
99
|
<br>
|
88
100
|
|
89
101
|
|
@@ -147,9 +159,10 @@ We suggest everybody using MidiSmtpServer to switch at least to latest 2.3.y. or
|
|
147
159
|
For upgrades from previous versions or outdated _MiniSmtpServer_ gem you may follow the guides (see appendix) how to change your existing code to be compatible with the latest releases.
|
148
160
|
|
149
161
|
|
150
|
-
#### Latest release: 3.1
|
162
|
+
#### Latest release: 3.2.1 (2023-08-15)
|
151
163
|
|
152
|
-
1.
|
164
|
+
1. New feature [proxy](https://midi-smtp-server.readthedocs.io/feature_proxy) ([check issue 49](https://github.com/4commerce-technologies-AG/midi-smtp-server/issues/49))
|
165
|
+
2. mkdocs update for readthedocs
|
153
166
|
|
154
167
|
|
155
168
|
#### Changelog history
|
data/lib/midi-smtp-server.rb
CHANGED
@@ -33,6 +33,7 @@ module MidiSmtpServer
|
|
33
33
|
DEFAULT_IO_BUFFER_MAX_SIZE = 1 * 1024 * 1024
|
34
34
|
|
35
35
|
# default value for SMTPD extensions support
|
36
|
+
DEFAULT_PROXY_EXTENSION_ENABLED = false
|
36
37
|
DEFAULT_PIPELINING_EXTENSION_ENABLED = false
|
37
38
|
DEFAULT_INTERNATIONALIZATION_EXTENSIONS_ENABLED = false
|
38
39
|
|
@@ -214,6 +215,8 @@ module MidiSmtpServer
|
|
214
215
|
attr_reader :pipelining_extension
|
215
216
|
# handle SMTP 8BITMIME and SMTPUTF8 extension
|
216
217
|
attr_reader :internationalization_extensions
|
218
|
+
# handle PROXY connections
|
219
|
+
attr_reader :proxy_extension
|
217
220
|
|
218
221
|
# logging object, may be overridden by special loggers like YELL or others
|
219
222
|
attr_reader :logger
|
@@ -233,6 +236,7 @@ module MidiSmtpServer
|
|
233
236
|
# +io_buffer_max_size+:: max size of buffer (max line length) until \lf ist expected (DEFAULT_IO_BUFFER_MAX_SIZE, nil => disabled test)
|
234
237
|
# +pipelining_extension+:: set to true for support of SMTP PIPELINING extension (DEFAULT_PIPELINING_EXTENSION_ENABLED)
|
235
238
|
# +internationalization_extensions+:: set to true for support of SMTP 8BITMIME and SMTPUTF8 extensions (DEFAULT_INTERNATIONALIZATION_EXTENSIONS_ENABLED)
|
239
|
+
# +proxy_extension+:: set to true for supporting PROXY connections (DEFAULT_PROXY_EXTENSION_ENABLED)
|
236
240
|
# +auth_mode+:: enable builtin authentication support (:AUTH_FORBIDDEN [default], :AUTH_OPTIONAL, :AUTH_REQUIRED)
|
237
241
|
# +tls_mode+:: enable builtin TLS support (:TLS_FORBIDDEN [default], :TLS_OPTIONAL, :TLS_REQUIRED)
|
238
242
|
# +tls_cert_path+:: path to tls certificate chain file
|
@@ -257,6 +261,7 @@ module MidiSmtpServer
|
|
257
261
|
io_buffer_max_size: nil,
|
258
262
|
pipelining_extension: nil,
|
259
263
|
internationalization_extensions: nil,
|
264
|
+
proxy_extension: nil,
|
260
265
|
auth_mode: nil,
|
261
266
|
tls_mode: nil,
|
262
267
|
tls_cert_path: nil,
|
@@ -397,6 +402,8 @@ module MidiSmtpServer
|
|
397
402
|
# smtp extensions
|
398
403
|
@pipelining_extension = pipelining_extension.nil? ? DEFAULT_PIPELINING_EXTENSION_ENABLED : pipelining_extension
|
399
404
|
@internationalization_extensions = internationalization_extensions.nil? ? DEFAULT_INTERNATIONALIZATION_EXTENSIONS_ENABLED : internationalization_extensions
|
405
|
+
@proxy_extension = proxy_extension.nil? ? DEFAULT_PROXY_EXTENSION_ENABLED : proxy_extension
|
406
|
+
require 'ipaddr' if @proxy_extension
|
400
407
|
|
401
408
|
# check for authentication
|
402
409
|
@auth_mode = auth_mode.nil? ? DEFAULT_AUTH_MODE : auth_mode
|
@@ -482,6 +489,13 @@ module MidiSmtpServer
|
|
482
489
|
# the value is not allowed to return CR nor LF chars and will be stripped
|
483
490
|
def on_helo_event(ctx, helo_data) end
|
484
491
|
|
492
|
+
# event on PROXY
|
493
|
+
# you may raise an exception if you want to block some addresses
|
494
|
+
# you also may change or add any value of the hash:
|
495
|
+
# {proto, source_ip, source_host, source_port, dest_ip, dest_host, dest_port}
|
496
|
+
# a returned value hash is set as ctx[:server][:proxy]
|
497
|
+
def on_proxy_event(ctx, proxy_data) end
|
498
|
+
|
485
499
|
# check the authentication on AUTH
|
486
500
|
# if any value returned, that will be used for ongoing processing
|
487
501
|
# otherwise the original value will be used for authorization_id
|
@@ -772,7 +786,7 @@ module MidiSmtpServer
|
|
772
786
|
# process commands and handle special SmtpdExceptions
|
773
787
|
begin
|
774
788
|
# check for pipelining extension or violation
|
775
|
-
raise Smtpd500PipeliningException unless @pipelining_extension ||
|
789
|
+
raise Smtpd500PipeliningException unless !io_buffer_line_lf || @pipelining_extension || (proxy_extension && (session[:cmd_sequence] == :CMD_HELO)) || (session[:cmd_sequence] == :CMD_DATA)
|
776
790
|
|
777
791
|
# handle input line based on @crlf_mode
|
778
792
|
case crlf_mode
|
@@ -952,6 +966,88 @@ module MidiSmtpServer
|
|
952
966
|
return "250 OK #{session[:ctx][:server][:helo_response].to_s.strip}".strip
|
953
967
|
end
|
954
968
|
|
969
|
+
when @proxy_extension && (/^PROXY(\s+)/i)
|
970
|
+
# PROXY
|
971
|
+
# 250 Requested mail action okay, completed
|
972
|
+
# 421 <domain> Service not available, closing transmission channel
|
973
|
+
# 500 Syntax error, command unrecognised
|
974
|
+
# 501 Syntax error in parameters or arguments
|
975
|
+
# ---------
|
976
|
+
# Documentation at https://github.com/haproxy/haproxy/blob/master/doc/proxy-protocol.txt
|
977
|
+
# syntax
|
978
|
+
# PROXY PROTO source-ip dest-ip source-port dest-port
|
979
|
+
# supported commands:
|
980
|
+
# PROXY TCP4 255.255.255.255 255.255.255.255 65535 65535
|
981
|
+
# PROXY TCP6 ffff:f...f:ffff ffff:f...f:ffff 65535 65535
|
982
|
+
# PROXY UNKNOWN
|
983
|
+
# PROXY UNKNOWN ffff:f...f:ffff ffff:f...f:ffff 65535 65535
|
984
|
+
# ---------
|
985
|
+
# check valid command sequence
|
986
|
+
raise Smtpd503Exception if session[:cmd_sequence] != :CMD_HELO
|
987
|
+
# check valid command
|
988
|
+
raise Smtpd421Exception, 'Abort connection while illegal PROXY command!' unless line.match?(/^PROXY(\s+)(UNKNOWN(|(\s+).*)|TCP(4|6)(\s+)([0-9a-f.:]+)(\s+)([0-9a-f.:]+)(\s+)([0-9]+)(\s+)([0-9]+)(\s*))$/i)
|
989
|
+
# check command usage is allowed only once
|
990
|
+
raise Smtpd421Exception, 'Abort connection while PROXY already set!' if session[:ctx][:server][:proxy]
|
991
|
+
# get values from proxy command
|
992
|
+
cmd_data = line.gsub(/^PROXY\ /i, '').strip.gsub(/\s+/, ' ').split
|
993
|
+
# create an empty hash to inspect by event
|
994
|
+
proxy_data = {
|
995
|
+
proto: cmd_data[0].upcase,
|
996
|
+
source_ip: nil,
|
997
|
+
source_host: nil,
|
998
|
+
source_port: nil,
|
999
|
+
dest_ip: nil,
|
1000
|
+
dest_host: nil,
|
1001
|
+
dest_port: nil
|
1002
|
+
}
|
1003
|
+
# test proto
|
1004
|
+
unless proxy_data[:proto] == 'UNKNOWN'
|
1005
|
+
begin
|
1006
|
+
# try to build valid addresses from given strings
|
1007
|
+
proxy_data[:source_ip] = IPAddr.new(cmd_data[1])
|
1008
|
+
proxy_data[:source_port] = cmd_data[3].to_i
|
1009
|
+
proxy_data[:dest_ip] = IPAddr.new(cmd_data[2])
|
1010
|
+
proxy_data[:dest_port] = cmd_data[4].to_i
|
1011
|
+
# check that given addresses correct by type
|
1012
|
+
if proxy_data[:proto] == 'TCP4'
|
1013
|
+
raise unless proxy_data[:source_ip].ipv4?
|
1014
|
+
raise unless proxy_data[:dest_ip].ipv4?
|
1015
|
+
else
|
1016
|
+
raise unless proxy_data[:source_ip].ipv6?
|
1017
|
+
raise unless proxy_data[:dest_ip].ipv6?
|
1018
|
+
end
|
1019
|
+
# check that ports within valid ranges
|
1020
|
+
raise unless proxy_data[:source_port].between?(1, 65_535)
|
1021
|
+
raise unless proxy_data[:dest_port].between?(1, 65_535)
|
1022
|
+
|
1023
|
+
# update hash to inspect by event
|
1024
|
+
# normalize ip addresses
|
1025
|
+
proxy_data[:source_ip] = proxy_data[:source_ip].to_s
|
1026
|
+
proxy_data[:source_host] = proxy_data[:source_ip]
|
1027
|
+
proxy_data[:dest_ip] = proxy_data[:dest_ip].to_s
|
1028
|
+
proxy_data[:dest_host] = proxy_data[:dest_ip]
|
1029
|
+
|
1030
|
+
rescue StandardError
|
1031
|
+
# change exception into Smtpd exception and drop connection
|
1032
|
+
raise Smtpd421Exception, 'Abort connection for unsupported PROXY parameters!'
|
1033
|
+
end
|
1034
|
+
end
|
1035
|
+
|
1036
|
+
# call event to handle data
|
1037
|
+
return_value = on_proxy_event(session[:ctx], proxy_data)
|
1038
|
+
if return_value
|
1039
|
+
# overwrite data with returned value
|
1040
|
+
proxy_data = return_value
|
1041
|
+
end
|
1042
|
+
# if no error raised, append to server hash
|
1043
|
+
session[:ctx][:server][:proxy] = proxy_data
|
1044
|
+
|
1045
|
+
# reply nothing
|
1046
|
+
# otherwise on buffering clients or enabled feature pipelining
|
1047
|
+
# the original client will receive unhandleable responses
|
1048
|
+
# and gets interrupted
|
1049
|
+
return ''
|
1050
|
+
|
955
1051
|
when /^STARTTLS\s*$/i
|
956
1052
|
# STARTTLS
|
957
1053
|
# 220 Ready to start TLS
|
@@ -1294,6 +1390,7 @@ module MidiSmtpServer
|
|
1294
1390
|
remote_host: +'',
|
1295
1391
|
remote_ip: +'',
|
1296
1392
|
remote_port: +'',
|
1393
|
+
proxy: nil,
|
1297
1394
|
helo: +'',
|
1298
1395
|
helo_response: +'',
|
1299
1396
|
connected: +'',
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: midi-smtp-server
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.1
|
4
|
+
version: 3.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tom Freudenberg
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-08-15 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: MidiSmtpServer is the highly customizable ruby SMTP-Server and SMTP-Service
|
14
14
|
library with builtin support for AUTH and SSL/STARTTLS, 8BITMIME and SMTPUTF8, IPv4
|
@@ -34,7 +34,7 @@ metadata:
|
|
34
34
|
source_code_uri: https://github.com/4commerce-technologies-AG/midi-smtp-server
|
35
35
|
changelog_uri: https://github.com/4commerce-technologies-AG/midi-smtp-server#changes-and-updates
|
36
36
|
bug_tracker_uri: https://github.com/4commerce-technologies-AG/midi-smtp-server/issues
|
37
|
-
documentation_uri: https://www.rubydoc.info/gems/midi-smtp-server/3.1
|
37
|
+
documentation_uri: https://www.rubydoc.info/gems/midi-smtp-server/3.2.1
|
38
38
|
wiki_uri: https://midi-smtp-server.readthedocs.io/
|
39
39
|
post_install_message:
|
40
40
|
rdoc_options: []
|
@@ -51,7 +51,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
51
51
|
- !ruby/object:Gem::Version
|
52
52
|
version: '0'
|
53
53
|
requirements: []
|
54
|
-
rubygems_version: 3.4.
|
54
|
+
rubygems_version: 3.4.10
|
55
55
|
signing_key:
|
56
56
|
specification_version: 4
|
57
57
|
summary: MidiSmtpServer Class
|