as2 0.7.0 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/test.yml +13 -13
- data/CHANGELOG.md +5 -0
- data/lib/as2/client/result.rb +3 -2
- data/lib/as2/client.rb +12 -4
- data/lib/as2/config.rb +12 -1
- data/lib/as2/server.rb +6 -6
- data/lib/as2/version.rb +1 -1
- data/lib/as2.rb +9 -0
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 96ec1c65d6997fc278267320f6228096129a87752c52127fdf2c9a6d6b1a8b43
|
4
|
+
data.tar.gz: b9305a892d2833a59ee286567132cee1b060936ae1f87f80d0de36a6660a6d2b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0c0aab2fb5d4282559cd0938d0bc540f0061a65d1a5eba7aa8f067a1f85fa746e599afeac5a9a4567456a737f2242bb73748b8460e4e398d612410536a3cafb8
|
7
|
+
data.tar.gz: 480ecc3810c376168a5778612c67c2db4eac48c0ea2da2fb782ba247ff0bc6400765b9b98b2835a7da9cd62d7cfdc37043dbee5b1278d3618c7782cd150b2182
|
data/.github/workflows/test.yml
CHANGED
@@ -9,26 +9,26 @@ name: test suite
|
|
9
9
|
|
10
10
|
on:
|
11
11
|
push:
|
12
|
-
branches:
|
12
|
+
branches: "**"
|
13
13
|
|
14
14
|
jobs:
|
15
15
|
test:
|
16
16
|
strategy:
|
17
17
|
fail-fast: false
|
18
18
|
matrix:
|
19
|
-
ruby: [
|
19
|
+
ruby: ["2.7", "3.0", "3.1", "3.2"]
|
20
20
|
|
21
21
|
runs-on: ubuntu-latest
|
22
22
|
|
23
23
|
steps:
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
24
|
+
- uses: actions/checkout@v2
|
25
|
+
- name: Set up Ruby
|
26
|
+
# To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
|
27
|
+
# change this to (see https://github.com/ruby/setup-ruby#versioning):
|
28
|
+
uses: ruby/setup-ruby@v1
|
29
|
+
with:
|
30
|
+
ruby-version: ${{ matrix.ruby }}
|
31
|
+
- name: Install dependencies
|
32
|
+
run: bundle install
|
33
|
+
- name: Run tests
|
34
|
+
run: bundle exec rake test
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
## 0.8.0, August 25, 2023
|
2
|
+
|
3
|
+
* Quote AS2-From/AS2-To identifiers which contain spaces. [#30](https://github.com/alexdean/as2/pull/30)
|
4
|
+
* Small improvements to aid integration testing with partners. [#31](https://github.com/alexdean/as2/pull/31)
|
5
|
+
|
1
6
|
## 0.7.0, August 25, 2023
|
2
7
|
|
3
8
|
Two improvements in compatibility with IBM Sterling, which could not understand
|
data/lib/as2/client/result.rb
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
module As2
|
2
2
|
class Client
|
3
3
|
class Result
|
4
|
-
attr_reader :response, :mic_matched, :mid_matched, :body, :disposition, :signature_verification_error, :exception, :outbound_message_id
|
4
|
+
attr_reader :request, :response, :mic_matched, :mid_matched, :body, :disposition, :signature_verification_error, :exception, :outbound_message_id
|
5
5
|
|
6
|
-
def initialize(response:, mic_matched:, mid_matched:, body:, disposition:, signature_verification_error:, exception:, outbound_message_id:)
|
6
|
+
def initialize(request:, response:, mic_matched:, mid_matched:, body:, disposition:, signature_verification_error:, exception:, outbound_message_id:)
|
7
|
+
@request = request
|
7
8
|
@response = response
|
8
9
|
@mic_matched = mic_matched
|
9
10
|
@mid_matched = mid_matched
|
data/lib/as2/client.rb
CHANGED
@@ -56,8 +56,8 @@ module As2
|
|
56
56
|
|
57
57
|
req = Net::HTTP::Post.new @partner.url.path
|
58
58
|
req['AS2-Version'] = '1.0' # 1.1 includes compression support, which we dont implement.
|
59
|
-
req['AS2-From'] = as2_from
|
60
|
-
req['AS2-To'] = as2_to
|
59
|
+
req['AS2-From'] = As2.quoted_system_identifier(as2_from)
|
60
|
+
req['AS2-To'] = As2.quoted_system_identifier(as2_to)
|
61
61
|
req['Subject'] = 'AS2 Transaction'
|
62
62
|
req['Content-Type'] = 'application/pkcs7-mime; smime-type=enveloped-data; name=smime.p7m'
|
63
63
|
req['Date'] = Time.now.rfc2822
|
@@ -99,9 +99,16 @@ module As2
|
|
99
99
|
# note: to pass this traffic through a debugging proxy (like Charles)
|
100
100
|
# set ENV['http_proxy'].
|
101
101
|
http = Net::HTTP.new(@partner.url.host, @partner.url.port)
|
102
|
-
|
102
|
+
|
103
|
+
use_ssl = @partner.url.scheme == 'https'
|
104
|
+
http.use_ssl = use_ssl
|
105
|
+
if use_ssl
|
106
|
+
if @partner.tls_verify_mode
|
107
|
+
http.verify_mode = @partner.tls_verify_mode
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
103
111
|
# http.set_debug_output $stderr
|
104
|
-
# http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
105
112
|
|
106
113
|
http.start do
|
107
114
|
resp = http.request(req)
|
@@ -120,6 +127,7 @@ module As2
|
|
120
127
|
end
|
121
128
|
|
122
129
|
Result.new(
|
130
|
+
request: req,
|
123
131
|
response: resp,
|
124
132
|
mic_matched: mdn_report[:mic_matched],
|
125
133
|
mid_matched: mdn_report[:mid_matched],
|
data/lib/as2/config.rb
CHANGED
@@ -12,7 +12,7 @@ module As2
|
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
15
|
-
class Partner < Struct.new :name, :url, :certificate, :mdn_format, :outbound_format
|
15
|
+
class Partner < Struct.new :name, :url, :certificate, :tls_verify_mode, :mdn_format, :outbound_format
|
16
16
|
def url=(url)
|
17
17
|
if url.kind_of? String
|
18
18
|
self['url'] = URI.parse url
|
@@ -42,6 +42,17 @@ module As2
|
|
42
42
|
def certificate=(certificate)
|
43
43
|
self['certificate'] = As2::Config.build_certificate(certificate)
|
44
44
|
end
|
45
|
+
|
46
|
+
# if set, will be used for SSL transmissions.
|
47
|
+
# @see `verify_mode` in https://ruby-doc.org/stdlib-2.7.1/libdoc/net/http/rdoc/Net/HTTP.html
|
48
|
+
def tls_verify_mode=(mode)
|
49
|
+
valid_modes = [nil, OpenSSL::SSL::VERIFY_NONE, OpenSSL::SSL::VERIFY_PEER]
|
50
|
+
if !valid_modes.include?(mode)
|
51
|
+
raise ArgumentError, "tls_verify_mode '#{mode}' must be one of #{valid_modes.inspect}"
|
52
|
+
end
|
53
|
+
|
54
|
+
self['tls_verify_mode'] = mode
|
55
|
+
end
|
45
56
|
end
|
46
57
|
|
47
58
|
class ServerInfo < Struct.new :name, :url, :certificate, :pkey, :domain
|
data/lib/as2/server.rb
CHANGED
@@ -69,8 +69,8 @@ module As2
|
|
69
69
|
|
70
70
|
options = {
|
71
71
|
'Reporting-UA' => @server_info.name,
|
72
|
-
'Original-Recipient' => "rfc822; #{@server_info.name}",
|
73
|
-
'Final-Recipient' => "rfc822; #{@server_info.name}",
|
72
|
+
'Original-Recipient' => "rfc822; #{As2.quoted_system_identifier(@server_info.name)}",
|
73
|
+
'Final-Recipient' => "rfc822; #{As2.quoted_system_identifier(@server_info.name)}",
|
74
74
|
'Original-Message-ID' => env['HTTP_MESSAGE_ID']
|
75
75
|
}
|
76
76
|
if failed
|
@@ -148,8 +148,8 @@ module As2
|
|
148
148
|
# TODO: if MIME-Version header is actually needed, should extract it out of smime_signed.
|
149
149
|
headers['MIME-Version'] = '1.0'
|
150
150
|
headers['Message-ID'] = As2.generate_message_id(@server_info)
|
151
|
-
headers['AS2-From'] = @server_info.name
|
152
|
-
headers['AS2-To'] = as2_to
|
151
|
+
headers['AS2-From'] = As2.quoted_system_identifier(@server_info.name)
|
152
|
+
headers['AS2-To'] = As2.quoted_system_identifier(as2_to)
|
153
153
|
headers['AS2-Version'] = '1.0'
|
154
154
|
headers['Connection'] = 'close'
|
155
155
|
|
@@ -191,8 +191,8 @@ module As2
|
|
191
191
|
headers['Content-Type'] = "multipart/signed; protocol=\"application/pkcs7-signature\"; micalg=\"#{micalg}\"; boundary=\"#{boundary}\""
|
192
192
|
headers['MIME-Version'] = '1.0'
|
193
193
|
headers['Message-ID'] = As2.generate_message_id(@server_info)
|
194
|
-
headers['AS2-From'] = @server_info.name
|
195
|
-
headers['AS2-To'] = as2_to
|
194
|
+
headers['AS2-From'] = As2.quoted_system_identifier(@server_info.name)
|
195
|
+
headers['AS2-To'] = As2.quoted_system_identifier(as2_to)
|
196
196
|
headers['AS2-Version'] = '1.0'
|
197
197
|
headers['Connection'] = 'close'
|
198
198
|
|
data/lib/as2/version.rb
CHANGED
data/lib/as2.rb
CHANGED
@@ -35,4 +35,13 @@ module As2
|
|
35
35
|
parsed = As2::Parser::DispositionNotificationOptions.parse(disposition_notification_options)
|
36
36
|
Array(parsed['signed-receipt-micalg']).find { |m| As2::DigestSelector.valid?(m) }
|
37
37
|
end
|
38
|
+
|
39
|
+
# surround an As2-From/As2-To value with double-quotes, if it contains a space.
|
40
|
+
def self.quoted_system_identifier(name)
|
41
|
+
if name.to_s.include?(' ')
|
42
|
+
"\"#{name}\""
|
43
|
+
else
|
44
|
+
name
|
45
|
+
end
|
46
|
+
end
|
38
47
|
end
|