sepafm 1.1.8 → 1.1.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +8 -6
- data/Rakefile +1 -1
- data/lib/sepa/application_request.rb +12 -18
- data/lib/sepa/application_response.rb +0 -2
- data/lib/sepa/attribute_checks.rb +33 -28
- data/lib/sepa/banks/danske/danske_response.rb +9 -25
- data/lib/sepa/banks/danske/soap_danske.rb +1 -1
- data/lib/sepa/banks/nordea/nordea_response.rb +2 -16
- data/lib/sepa/banks/op/op_response.rb +5 -23
- data/lib/sepa/banks/samlink/samlink_response.rb +35 -0
- data/lib/sepa/banks/samlink/soap_samlink.rb +14 -0
- data/lib/sepa/certificates/samlink_certificate.pem +29 -0
- data/lib/sepa/certificates/samlink_root_certificate.pem +32 -0
- data/lib/sepa/client.rb +35 -8
- data/lib/sepa/error_messages.rb +16 -18
- data/lib/sepa/response.rb +7 -11
- data/lib/sepa/soap_builder.rb +7 -17
- data/lib/sepa/utilities.rb +4 -5
- data/lib/sepa/version.rb +1 -1
- data/lib/sepa/wsdl/wsdl_samlink_cert_production.xml +82 -0
- data/lib/sepa/wsdl/wsdl_samlink_cert_test.xml +82 -0
- data/lib/sepa/wsdl/wsdl_samlink_production.xml +160 -0
- data/lib/sepa/wsdl/wsdl_samlink_test.xml +160 -0
- data/lib/sepa/xml_schemas/samlink/CertApplicationRequest.xsd +105 -0
- data/lib/sepa/xml_schemas/samlink/CertApplicationResponse.xsd +88 -0
- data/lib/sepa/xml_templates/application_request/download_file.xml +0 -1
- data/lib/sepa/xml_templates/application_request/download_file_list.xml +0 -1
- data/lib/sepa/xml_templates/application_request/samlink/get_certificate.xml +12 -0
- data/lib/sepa/xml_templates/application_request/samlink/renew_certificate.xml +29 -0
- data/lib/sepa/xml_templates/soap/samlink/get_certificate.xml +14 -0
- data/lib/sepa/xml_templates/soap/samlink/renew_certificate.xml +14 -0
- data/lib/sepafm.rb +43 -31
- data/readme.md +1 -0
- data/sepafm.gemspec +2 -2
- data/test/custom_assertions.rb +30 -28
- data/test/sepa/banks/danske/danske_cert_response_test.rb +13 -10
- data/test/sepa/banks/danske/danske_generic_soap_builder_test.rb +9 -31
- data/test/sepa/banks/danske/danske_get_bank_cert_test.rb +4 -5
- data/test/sepa/banks/danske/danske_response_test.rb +2 -3
- data/test/sepa/banks/danske/responses/create_cert_corrupted.xml +15 -0
- data/test/sepa/banks/nordea/nordea_application_request_test.rb +4 -6
- data/test/sepa/banks/nordea/nordea_application_response_test.rb +14 -15
- data/test/sepa/banks/nordea/nordea_cert_request_soap_builder_test.rb +1 -3
- data/test/sepa/banks/nordea/nordea_generic_soap_builder_test.rb +6 -16
- data/test/sepa/banks/nordea/nordea_response_test.rb +11 -11
- data/test/sepa/banks/op/op_cert_application_request_test.rb +1 -1
- data/test/sepa/banks/op/op_cert_request_soap_builder_test.rb +0 -1
- data/test/sepa/banks/op/op_response_test.rb +2 -2
- data/test/sepa/banks/samlink/responses/dfl.xml +21 -0
- data/test/sepa/banks/samlink/responses/gc_error_30.xml +21 -0
- data/test/sepa/banks/samlink/responses/rc.xml +21 -0
- data/test/sepa/banks/samlink/samlink_application_request_test.rb +36 -0
- data/test/sepa/banks/samlink/samlink_cert_application_request_test.rb +13 -0
- data/test/sepa/banks/samlink/samlink_cert_request_soap_builder_test.rb +13 -0
- data/test/sepa/banks/samlink/samlink_generic_soap_builder_test.rb +34 -0
- data/test/sepa/banks/samlink/samlink_renew_cert_application_request_test.rb +36 -0
- data/test/sepa/banks/samlink/samlink_renew_cert_request_soap_builder_test.rb +26 -0
- data/test/sepa/banks/samlink/samlink_response_test.rb +71 -0
- data/test/sepa/client_test.rb +32 -6
- data/test/sepa/fixtures.rb +169 -7
- data/test/sepa/sepa_test.rb +1 -1
- data/test/test_helper.rb +8 -7
- data/test_client/data/certs_example.rb +9 -9
- data/test_client/data/params_example.rb +18 -19
- data/test_client/test_client.rb +6 -0
- metadata +41 -5
data/test/custom_assertions.rb
CHANGED
@@ -1,41 +1,43 @@
|
|
1
1
|
require 'minitest/assertions'
|
2
2
|
|
3
|
-
module Minitest
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
3
|
+
module Minitest
|
4
|
+
module Assertions
|
5
|
+
def assert_same_items(expected, actual)
|
6
|
+
assert same_items(expected, actual),
|
7
|
+
"Expected #{expected.inspect} and #{actual.inspect} to have the same items"
|
8
|
+
end
|
8
9
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
10
|
+
def refute_same_items(expected, actual)
|
11
|
+
refute same_items(expected, actual),
|
12
|
+
"Expected #{expected.inspect} and #{actual.inspect} would not have the same items"
|
13
|
+
end
|
13
14
|
|
14
|
-
|
15
|
-
|
15
|
+
def assert_valid_against_schema(schema, document)
|
16
|
+
errors = []
|
16
17
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
18
|
+
Dir.chdir(SCHEMA_PATH) do
|
19
|
+
xsd = Nokogiri::XML::Schema(IO.read(schema))
|
20
|
+
xsd.validate(document).each do |error|
|
21
|
+
errors << error
|
22
|
+
end
|
21
23
|
end
|
22
|
-
end
|
23
24
|
|
24
|
-
|
25
|
-
|
25
|
+
assert errors.empty?, "The following schema validations failed:\n#{errors.join("\n")}"
|
26
|
+
end
|
26
27
|
|
27
|
-
|
28
|
-
|
29
|
-
|
28
|
+
def refute_valid_against_schema(schema, document)
|
29
|
+
Dir.chdir(SCHEMA_PATH) do
|
30
|
+
xsd = Nokogiri::XML::Schema(IO.read(schema))
|
30
31
|
|
31
|
-
|
32
|
+
refute xsd.valid?(document)
|
33
|
+
end
|
32
34
|
end
|
33
|
-
end
|
34
35
|
|
35
|
-
|
36
|
+
private
|
36
37
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
38
|
+
def same_items(expected, actual)
|
39
|
+
actual.is_a?(Enumerable) && expected.is_a?(Enumerable) &&
|
40
|
+
expected.count == actual.count && actual.all? { |e| expected.include?(e) }
|
41
|
+
end
|
42
|
+
end
|
41
43
|
end
|
@@ -1,23 +1,28 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
3
|
class DanskeCertResponseTest < ActiveSupport::TestCase
|
4
|
-
|
5
4
|
setup do
|
6
5
|
options = {
|
7
|
-
|
8
|
-
|
6
|
+
response: File.read("#{DANSKE_TEST_RESPONSE_PATH}get_bank_cert.xml"),
|
7
|
+
command: :get_bank_certificate,
|
9
8
|
}
|
10
9
|
@get_bank_cert_response = Sepa::DanskeResponse.new options
|
11
10
|
|
12
11
|
options = {
|
13
|
-
|
14
|
-
|
12
|
+
response: File.read("#{DANSKE_TEST_RESPONSE_PATH}create_cert.xml"),
|
13
|
+
command: :create_certificate,
|
15
14
|
}
|
16
15
|
@create_certificate_response = Sepa::DanskeResponse.new options
|
17
16
|
|
17
|
+
options = {
|
18
|
+
response: File.read("#{DANSKE_TEST_RESPONSE_PATH}create_cert_corrupted.xml"),
|
19
|
+
command: :create_certificate,
|
20
|
+
}
|
21
|
+
@create_certificate_corrupted_response = Sepa::DanskeResponse.new options
|
22
|
+
|
18
23
|
options = {
|
19
24
|
response: File.read("#{DANSKE_TEST_RESPONSE_PATH}get_bank_certificate_not_ok.xml"),
|
20
|
-
command: :get_bank_certificate
|
25
|
+
command: :get_bank_certificate,
|
21
26
|
}
|
22
27
|
@get_bank_certificate_not_ok_response = Sepa::DanskeResponse.new options
|
23
28
|
end
|
@@ -75,9 +80,8 @@ class DanskeCertResponseTest < ActiveSupport::TestCase
|
|
75
80
|
end
|
76
81
|
|
77
82
|
test 'hashes shouldnt match when data is corrupted' do
|
78
|
-
assert_output
|
79
|
-
@
|
80
|
-
refute @create_certificate_response.hashes_match?({ verbose: true })
|
83
|
+
assert_output(/These digests failed to verify: {"#response"=>"2vCYl3h7ksRgk7IyV2axgpXxTWM="}/) do
|
84
|
+
refute @create_certificate_corrupted_response.hashes_match?(verbose: true)
|
81
85
|
end
|
82
86
|
end
|
83
87
|
|
@@ -107,5 +111,4 @@ class DanskeCertResponseTest < ActiveSupport::TestCase
|
|
107
111
|
x509_certificate certificate
|
108
112
|
end
|
109
113
|
end
|
110
|
-
|
111
114
|
end
|
@@ -1,19 +1,7 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
3
|
class DanskeGenericSoapBuilderTest < ActiveSupport::TestCase
|
4
|
-
|
5
4
|
def setup
|
6
|
-
keys_path = File.expand_path('../keys', __FILE__)
|
7
|
-
|
8
|
-
signing_private_key_path = "#{keys_path}/signing_key.pem"
|
9
|
-
signing_private_key = File.read signing_private_key_path
|
10
|
-
|
11
|
-
signing_certificate_path = "#{keys_path}/own_signing_cert.pem"
|
12
|
-
signing_certificate = File.read signing_certificate_path
|
13
|
-
|
14
|
-
encryption_certificate_path = "#{keys_path}/own_enc_cert.pem"
|
15
|
-
encryption_certificate = File.read encryption_certificate_path
|
16
|
-
|
17
5
|
@danske_generic_params = danske_generic_params
|
18
6
|
|
19
7
|
# Convert keys in danske generic params, because this is usually done by the client
|
@@ -71,13 +59,13 @@ class DanskeGenericSoapBuilderTest < ActiveSupport::TestCase
|
|
71
59
|
@danske_generic_params[:command] = :wrong_command
|
72
60
|
|
73
61
|
assert_raises(ArgumentError) do
|
74
|
-
|
62
|
+
Sepa::SoapBuilder.new(@danske_generic_params)
|
75
63
|
end
|
76
64
|
end
|
77
65
|
|
78
66
|
def test_sender_id_is_properly_set
|
79
67
|
assert_equal @danske_generic_params[:customer_id],
|
80
|
-
|
68
|
+
@doc.at("//bxd:SenderId", 'bxd' => 'http://model.bxd.fi').content
|
81
69
|
end
|
82
70
|
|
83
71
|
def test_request_id_is_properly_set
|
@@ -120,7 +108,7 @@ class DanskeGenericSoapBuilderTest < ActiveSupport::TestCase
|
|
120
108
|
).content
|
121
109
|
|
122
110
|
actual_certificate = x509_certificate(
|
123
|
-
@danske_generic_params.fetch(:own_signing_certificate)
|
111
|
+
@danske_generic_params.fetch(:own_signing_certificate),
|
124
112
|
).to_s
|
125
113
|
|
126
114
|
actual_certificate = actual_certificate.split('-----BEGIN CERTIFICATE-----')[1]
|
@@ -141,10 +129,7 @@ class DanskeGenericSoapBuilderTest < ActiveSupport::TestCase
|
|
141
129
|
"//env:Body", 'env' => 'http://schemas.xmlsoap.org/soap/envelope/'
|
142
130
|
)
|
143
131
|
|
144
|
-
body_node = body_node
|
145
|
-
mode = Nokogiri::XML::XML_C14N_EXCLUSIVE_1_0,
|
146
|
-
inclusive_namespaces = nil, with_comments = false
|
147
|
-
)
|
132
|
+
body_node = canonicalize_exclusively(body_node)
|
148
133
|
|
149
134
|
actual_digest = encode(sha1.digest(body_node)).strip
|
150
135
|
|
@@ -173,7 +158,7 @@ class DanskeGenericSoapBuilderTest < ActiveSupport::TestCase
|
|
173
158
|
timestamp = Time.strptime(timestamp_node.content, '%Y-%m-%dT%H:%M:%S%z')
|
174
159
|
|
175
160
|
assert timestamp <= (Time.now + 300) &&
|
176
|
-
|
161
|
+
timestamp > ((Time.now + 300) - 60)
|
177
162
|
end
|
178
163
|
|
179
164
|
def test_header_timestamps_digest_is_calculated_correctly
|
@@ -188,10 +173,7 @@ class DanskeGenericSoapBuilderTest < ActiveSupport::TestCase
|
|
188
173
|
"//wsu:Timestamp", 'wsu' => wsu
|
189
174
|
)
|
190
175
|
|
191
|
-
timestamp_node = timestamp_node
|
192
|
-
mode = Nokogiri::XML::XML_C14N_EXCLUSIVE_1_0, inclusive_namespaces = nil,
|
193
|
-
with_comments = false
|
194
|
-
)
|
176
|
+
timestamp_node = canonicalize_exclusively(timestamp_node)
|
195
177
|
|
196
178
|
actual_digest = encode(sha1.digest(timestamp_node)).strip
|
197
179
|
|
@@ -205,18 +187,15 @@ class DanskeGenericSoapBuilderTest < ActiveSupport::TestCase
|
|
205
187
|
|
206
188
|
added_signature = @doc.at(
|
207
189
|
"//dsig:SignatureValue",
|
208
|
-
'dsig' => 'http://www.w3.org/2000/09/xmldsig#'
|
190
|
+
'dsig' => 'http://www.w3.org/2000/09/xmldsig#',
|
209
191
|
).content
|
210
192
|
|
211
193
|
signed_info_node = @doc.at("//dsig:SignedInfo", 'dsig' => 'http://www.w3.org/2000/09/xmldsig#')
|
212
194
|
|
213
|
-
signed_info_node = signed_info_node
|
214
|
-
mode = Nokogiri::XML::XML_C14N_EXCLUSIVE_1_0, inclusive_namespaces = nil,
|
215
|
-
with_comments = false
|
216
|
-
)
|
195
|
+
signed_info_node = canonicalize_exclusively(signed_info_node)
|
217
196
|
|
218
197
|
actual_signature = encode(
|
219
|
-
private_key.sign(sha1, signed_info_node)
|
198
|
+
private_key.sign(sha1, signed_info_node),
|
220
199
|
).gsub(/\s+/, "")
|
221
200
|
|
222
201
|
assert_equal actual_signature, added_signature
|
@@ -251,5 +230,4 @@ class DanskeGenericSoapBuilderTest < ActiveSupport::TestCase
|
|
251
230
|
assert_nil application_request.at('ApplicationRequest')
|
252
231
|
assert_not_nil application_request.at('xenc|EncryptedData')
|
253
232
|
end
|
254
|
-
|
255
233
|
end
|
@@ -1,14 +1,13 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
3
|
class DanskeGetBankCertTest < ActiveSupport::TestCase
|
4
|
-
|
5
4
|
def setup
|
6
5
|
@get_bank_cert_params = {
|
7
6
|
bank: :danske,
|
8
7
|
command: :get_bank_certificate,
|
9
8
|
bank_root_cert_serial: '1111110002',
|
10
9
|
customer_id: '360817',
|
11
|
-
request_id: SecureRandom.hex(5)
|
10
|
+
request_id: SecureRandom.hex(5),
|
12
11
|
}
|
13
12
|
|
14
13
|
@doc = Sepa::SoapBuilder.new(@get_bank_cert_params)
|
@@ -33,12 +32,12 @@ class DanskeGetBankCertTest < ActiveSupport::TestCase
|
|
33
32
|
|
34
33
|
def test_sender_id_is_properly_set
|
35
34
|
assert_equal @get_bank_cert_params[:customer_id],
|
36
|
-
|
35
|
+
@doc.at('SenderId', 'xmlns' => @pkif).content
|
37
36
|
end
|
38
37
|
|
39
38
|
def test_customer_id_is_properly_set
|
40
39
|
assert_equal @get_bank_cert_params[:customer_id],
|
41
|
-
|
40
|
+
@doc.at('CustomerId', 'xmlns' => @pkif).content
|
42
41
|
end
|
43
42
|
|
44
43
|
def test_header_request_id_is_properly_set
|
@@ -62,7 +61,7 @@ class DanskeGetBankCertTest < ActiveSupport::TestCase
|
|
62
61
|
|
63
62
|
def test_bank_root_cert_serial_is_correctly_set
|
64
63
|
assert_equal @get_bank_cert_params[:bank_root_cert_serial],
|
65
|
-
|
64
|
+
@doc.at('BankRootCertificateSerialNo', 'xmlns' => @elem).content
|
66
65
|
end
|
67
66
|
|
68
67
|
def test_request_timestamp_is_set_correctly
|
@@ -3,7 +3,6 @@ require 'test_helper'
|
|
3
3
|
# Tests Danske Bank specific response stuff
|
4
4
|
class DanskeResponseTest < ActiveSupport::TestCase
|
5
5
|
setup do
|
6
|
-
|
7
6
|
# The private key of the certificate used to encrypt
|
8
7
|
# the response which can be used to decrypt it
|
9
8
|
encryption_private_key = '-----BEGIN RSA PRIVATE KEY-----
|
@@ -37,7 +36,7 @@ l+Ul4l4+FfAysq3a7b3xoQ59kN1CrEWqDo2KqndxGv6wQft3n/dxnQ==
|
|
37
36
|
options = {
|
38
37
|
response: File.read("#{DANSKE_TEST_RESPONSE_PATH}/download_file_list.xml"),
|
39
38
|
command: :download_file_list,
|
40
|
-
encryption_private_key: rsa_key(encryption_private_key)
|
39
|
+
encryption_private_key: rsa_key(encryption_private_key),
|
41
40
|
}
|
42
41
|
@download_file_list_response = Sepa::DanskeResponse.new options
|
43
42
|
end
|
@@ -87,7 +86,7 @@ ufGDBuk6Qe7BSx+/iYvjK1o/IP42RSwj7Ar/IaQuzzfxsflqrGA=
|
|
87
86
|
options = {
|
88
87
|
response: File.read("#{DANSKE_TEST_RESPONSE_PATH}/download_file_list.xml"),
|
89
88
|
command: :download_file_list,
|
90
|
-
encryption_private_key: rsa_key(wrong_encryption_private_key)
|
89
|
+
encryption_private_key: rsa_key(wrong_encryption_private_key),
|
91
90
|
}
|
92
91
|
response = Sepa::DanskeResponse.new options
|
93
92
|
|
@@ -0,0 +1,15 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:pkif="http://danskebank.dk/PKI/PKIFactoryService" xmlns:elem="http://danskebank.dk/PKI/PKIFactoryService/elements" xmlns:xd="http://www.w3.org/2000/09/xmldsig#"><soapenv:Header/><soapenv:Body><CreateCertificateOut xmlns="http://danskebank.dk/PKI/PKIFactoryService"><pkif:ResponseHeader xmlns=""><pkif:SenderId>360817</pkif:SenderId><pkif:CustomerId>360817</pkif:CustomerId><pkif:RequestId>fad29587b6</pkif:RequestId><pkif:Timestamp>2014-08-06T11:00:03Z</pkif:Timestamp><pkif:InterfaceVersion>1</pkif:InterfaceVersion><pkif:Environment>customertest</pkif:Environment></pkif:ResponseHeader><tns:CreateCertificateResponse xml:id="response" xmlns:tns="http://danskebank.dk/PKI/PKIFactoryService/elements" xmlns=""><tns:ReturnCode>00</tns:ReturnCode><tns:ReturnText>OK</tns:ReturnText><tns:EncryptionCert>MIIDnzCCAoegAwIBAgIHHoy+tGx4NjANBgkqhkiG9w0BAQsFADCBwjEQMA4GA1UEAxMHREJHQ0FEQjELMAkGA1UEBhMCREsxEzARBgNVBAcTCkNvcGVuaGFnZW4xEDAOBgNVBAgTB0Rlbm1hcmsxGjAYBgNVBAoTEURhbnNrZSBCYW5rIEdyb3VwMRgwFgYDVQQLEw9EYW5za2UgQmFuayBBL1MxGDAWBgNVBAUTDzYxMTI2MjI4MjIzMDEwMTEJMAcGA1UEBBMAMQkwBwYDVQQqEwAxCTAHBgNVBAwTADEJMAcGA1UEERMAMB4XDTEwMDUyODExMTgzOVoXDTEyMDUyNzExMTgzOVowgaYxIDAeBgNVBAMTF0JFTkdUU1NPTiBPRyBGUi4gSkVOU0VOMQswCQYDVQQGEwJESzEcMBoGA1UEChMTREJUUyBERU1PIDEuICgzNEFLKTEeMBwGA1UECxMVQ09SUE9SQVRFIERFVkVMT1BNRU5UMTcwNQYDVQQFEy5TRS1LRVJIVi9EQUJBOjAwOTIxMDA4NDEtQUdSOjA2MTA0OC1VU1I6MDYxMTMzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCvWdhjVCuWXWu4H8WqUJGuvme+6l0g37fAXur3Xm28RChzvhue7pvwhtsZEyHN3Oa9DhLMV9UQC4wy5Md7Js+rm2HtgOtM2LMorE4GeoTYpi5f1fbYDUqHj2ygkkWDqQ9v0xSCJkGIyW+1vsrcId+DDlZqBacuXwtv5xy8plmX7wIDAQABozgwNjAJBgNVHQ4EAgQAMBkGA1UdIwQSMBCADsLGxMP29vnBwsTCxsTDMA4GA1UdDwEB/wQEAwIEMDANBgkqhkiG9w0BAQsFAAOCAQEAkITeNDN6Mxkb8AXF9SjZ1xfWD+yZcyb5wqQmpvwlM1gfovvV5mW/r2Wgn8uyhwwZd8dDJClNRslQeQrV8FbmCF8uh0dr1z2pt/t3u6lZ5YH1MWmLKGpJ8gGnWkRwEtkeZCuaD+Nji6YCGqCPytmKae+CFvz46XrvQ+VxfoqD8IlSoT2Himw6kfbE7H5oyJtuBSjozz+zz9GE09HQzCn3j1AX1jF0U0qFOXOR185NnDHtQPBytUOOBHBNog1+bVfby7E1nmXum38pMVnv5ReSvnhKhmusmxkHaKCGwgYCoKMvsXntHStvmH/t4tGdNyLvmC/88GYfoBXtNrsuZV3Ew==</tns:EncryptionCert><tns:SigningCert>MIIDnzCCAoegAwIBAgIHHoy+tGx4NTANBgkqhkiG9w0BAQsFADCBwjEQMA4GA1UEAxMHREJHQ0FEQjELMAkGA1UEBhMCREsxEzARBgNVBAcTCkNvcGVuaGFnZW4xEDAOBgNVBAgTB0Rlbm1hcmsxGjAYBgNVBAoTEURhbnNrZSBCYW5rIEdyb3VwMRgwFgYDVQQLEw9EYW5za2UgQmFuayBBL1MxGDAWBgNVBAUTDzYxMTI2MjI4MjIzMDEwMTEJMAcGA1UEBBMAMQkwBwYDVQQqEwAxCTAHBgNVBAwTADEJMAcGA1UEERMAMB4XDTEwMDUyODExMTgzOVoXDTEyMDUyNzExMTgzOVowgaYxIDAeBgNVBAMTF0JFTkdUU1NPTiBPRyBGUi4gSkVOU0VOMQswCQYDVQQGEwJESzEcMBoGA1UEChMTREJUUyBERU1PIDEuICgzNEFLKTEeMBwGA1UECxMVQ09SUE9SQVRFIERFVkVMT1BNRU5UMTcwNQYDVQQFEy5TRS1LRVJIVi9EQUJBOjAwOTIxMDA4NDEtQUdSOjA2MTA0OC1VU1I6MDYxMTMzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCfh+ajEvsFS1kByPsjReO+EmyFglGDiCBh7voya2aSbvGMQm/aAYugTliAhoklq4adwUwqjf86gon3ZdUMDBmDpJiPlxeexBHesOjr32hxzO8u67tS5o1xfDex3ga192g+94pAJsqmn3Fc8LJ0Wn2zJPtYCTYvbrx6551QLiD3fwIDAQABozgwNjAJBgNVHQ4EAgQAMBkGA1UdIwQSMBCADsLGxMP29vnBwsTCxsTDMA4GA1UdDwEB/wQEAwIGwDANBgkqhkiG9w0BAQsFAAOCAQEASgxJaAoWP08MKVnuvNxG7EkmogFUfKCX7fWrHYxDzEs5uhnRQ6IR4GitTHEM/BE5KNGu6MuHuKMhp4HuMBg5YzaFtk5yFk+K6BjLEEFwz/NBFLyrtPmrezxjmxMYx4PRTqeyEthOIkZ1KFQvzxB1Vg2Kt5fqdvxKVODAFstJB2nE3uICnrOQmHlo/R/1rp0J/VQnOsWdgKmIFhFlFdFpWhI7m1ry7cuilHPdCHq+M83jGfTYVXulwbxDYv0LPHZGzCxoAnxZQM4r2HqwXTCZiRT/eP+fEv7A571aHb9GhJhQQQ0lStd1vhOJu1LlO3fe68SSKSye5CozKwvvlEwbag==</tns:SigningCert><tns:CACert>MIIEFzCCAv+gAwIBAgIFAc+WvjUwDQYJKoZIhvcNAQELBQAwgZgxEDAOBgNVBAMTB0RCR1JPT1QxCzAJBgNVBAYTAkRLMRMwEQYDVQQHEwpDb3BlbmhhZ2VuMRAwDgYDVQQIEwdEZW5tYXJrMRowGAYDVQQKExFEYW5za2UgQmFuayBHcm91cDEaMBgGA1UECxMRRGFuc2tlIEJhbmsgR3JvdXAxGDAWBgNVBAUTDzYxMTI2MjI4MTEzMDAwMzAeFw0xMDEwMTEwMDAwMDBaFw0yMDEwMTEwMDAwMDBaMIGaMRAwDgYDVQQDEwdEQkdTV0RLMQswCQYDVQQGEwJESzETMBEGA1UEBxMKQ29wZW5oYWdlbjEQMA4GA1UECBMHRGVubWFyazEaMBgGA1UEChMRRGFuc2tlIEJhbmsgR3JvdXAxHDAaBgNVBAsTE0RhbnNrZSBCYW5rIERlbm1hcmsxGDAWBgNVBAUTDzYxMTI2MjI4NzczMDEwMTCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgCggEBAOC0DrY9Q4HzHQ/BWr/RWB1GOq+90BiGN85uhWAeGGMI2od/ahn/R7zl8+MNcMLAuVHB8LvzRrC3lxZqjNvRKv8fYsMgwdmdYtBwiqHINpXTLjQxtLEWqEu5fiMZAi1oFE08YAkCDLUGopbkY+d2KULqxFK2blwHi3m0jOwuZGiw4ELeChGcELsOpCT/oJU5mR3dFHbRs3HBgWmuFwJKvwHNZeNAmrCwEUWqw1x4MjQRHRGl10TfTNqPrd7zyTfyR0+GPy1INxHwWZroBUc9j54ONX9pV6x835WedHdo80UxImjCiIruClzsMAXYtvsC3d9xgk9oLNFIVPRe2fTs07ECAQOjZjBkMB8GA1UdIwQYMBaAFLU6ie9kUC8x5CDLauuTRJBL35qYMB0GA1UdDgQWBBQO5nD7QkqlQCrxigdJncTYo20tIzAOBgNVHQ8BAf8EBAMCAQYwEgYDVR0TAQH/BAgwBgEB/wIBADANBgkqhkiG9w0BAQsFAAOCAQEAQPCp0H3g88CZZurq0kS76ozBVRiLZ3V8S0+IYi0dmMCfTpW/qnEzMGn+NlHOvgkm5C2VaHCdbEzZPsvv4cx2YrqpsFf8x+Ts6W2r3VVjOdve5u0Oj1CK/ONwaqUl5p4SxRCfnv6sSh6TwxhJF/zESiHXLdyWdJf+NkXsATE6QB4ZjgaGw1NcvhnDUvbbfUZ1zOTIf7+wUpfCNCJi0T1sFvJ88nYkVoQmVWQFS7Kwj+kwQ1ILfnp/1xbycrt1XNxZ8SkRDAWOJARY0fS/C0o7/1t/SB2ePrY/g0U8ZWi0B6odT5isGNpLOKzhD5YGjbKGesC9GEnhmhLoawXU7b4Wcw==</tns:CACert><tns:RequestId/><Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
|
3
|
+
<SignedInfo>
|
4
|
+
<CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
|
5
|
+
<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
|
6
|
+
<Reference URI="#response">
|
7
|
+
<Transforms>
|
8
|
+
<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
|
9
|
+
<Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
|
10
|
+
</Transforms>
|
11
|
+
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
|
12
|
+
<DigestValue>2vCYl3h7ksRgk7IyV2axgpXxTWM=</DigestValue>
|
13
|
+
</Reference>
|
14
|
+
</SignedInfo>
|
15
|
+
<SignatureValue>Vxs+AC28A9SGKjbuXKaWDZ3nxd1PW/JT5CJth7hGpv6+G/M/uiIKvHipdM5VilLdgPg8ocICJaKTPXg+pMzT2UkqgAQHBCh4JGBkIz0TR5tTppCs5pPO+rd/z6fGQU7gELLddh21pa58QtgAswgJtiIOupFG+wS5ocZTH//vryP/Rxh4VivMNg/jnvse2nETnchk+WCDl5iB0xbsuVRyAvFlw0SL1VWSqmLsDInoo8rQAFoc5A51mqP4ODaqSiK4shml7pOxj/JmRNrDQYOFuVoVIt/M/RTJWzc8nzXnnHc3ssSBKCsXv/x/mAmLBvBDpBOYQxLvu8zdFkLGZTGp+Q==</SignatureValue><KeyInfo><X509Data><X509Certificate>MIIEADCCAuigAwIBAgIFAMa3bfQwDQYJKoZIhvcNAQELBQAwgZgxEDAOBgNVBAMTB0RCR1JPT1QxCzAJBgNVBAYTAkRLMRMwEQYDVQQHEwpDb3BlbmhhZ2VuMRAwDgYDVQQIEwdEZW5tYXJrMRowGAYDVQQKExFEYW5za2UgQmFuayBHcm91cDEaMBgGA1UECxMRRGFuc2tlIEJhbmsgR3JvdXAxGDAWBgNVBAUTDzYxMTI2MjI4MTExMDAwMjAeFw0xNDA3MDcwMDAwMDBaFw0xNjA2MjYwMDAwMDBaMIGXMQ8wDQYDVQQDEwZEUFNJR04xCzAJBgNVBAYTAkRLMRMwEQYDVQQHEwpDb3BlbmhhZ2VuMRAwDgYDVQQIEwdEZW5tYXJrMRowGAYDVQQKExFEYW5za2UgQmFuayBHcm91cDEaMBgGA1UECxMRRGFuc2tlIEJhbmsgR3JvdXAxGDAWBgNVBAUTDzYxMTI2MjI4MzkxMDAwNDCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgCggEBAMTopJ9GZXRkKm4Rq9M92EawXIfSI7VL0sykOzLfBzrgYMpqJ7rFxJe7nzECw22TeQ/3m4Gjnhe8XVaKSUDbfYfWzWD44iiZfecMaDZYIyR3g7GMwQowfwTqHhSEjFgfzH3QuGH2KGmqycvyuNGsbWjzvDAov8Yf7F88A4aOkseISO3Vmt2ElKm+gs09z7pwak6OxegDu5ZySS39kpTvq1DK3w2vXkEQGJUYOnDG/723v/hK3GjxclViu1OGSga7UJApjm3ky4s9EWoumf/vLBAnqRp6biOKnkGmOJEJlT00VWjaRoDarKOjgC7b/05Xp0ynDSOwqvTI92BdAQwfgEsCAQOjUjBQMB8GA1UdIwQYMBaAFIT65b/ekUlm38WKUsOzt7MgHMdtMB0GA1UdDgQWBBSh3exlGZ8eC4EiAVvbxenmc9faUzAOBgNVHQ8BAf8EBAMCBsAwDQYJKoZIhvcNAQELBQADggEBACjZJx8+UEcAYXJzstd+6E2wBNmmSvUTiuG7+Vws4+l4eqLLrHkhi66FOEwPdnf5/t8k7h5ry61aEf+HdUcQuYRrf7hJPkFjxaMcMGss4uURjVt/R/GhWMgu6cYgUIq0NHIMqdYH4dM/19qv7E+je2D3BuJOE3ucqe4Ywd+W2WP8HGlA3PkpMV78SPA9N/Usg3VX2KVbdS3idTpSMpxQftjWXmJtef0KawvYmYOw7i+eazHmv5mgxhgCvJSCPHN6oGS7v5AVVz9RCjSWEKIXZE0wRSLuTFYzt7/7CgRsdTVwpkFzn+ZJUAjYBPhZQ3Xn3p03DyCFsvtLxwE17UpUFUU=</X509Certificate><X509IssuerSerial><X509IssuerName>serialNumber=611262281110002, OU=Danske Bank Group, O=Danske Bank Group, ST=Denmark, L=Copenhagen, C=DK, CN=DBGROOT</X509IssuerName><X509SerialNumber>3333910004</X509SerialNumber></X509IssuerSerial></X509Data></KeyInfo></Signature></tns:CreateCertificateResponse></CreateCertificateOut></soapenv:Body></soapenv:Envelope>
|
@@ -178,7 +178,7 @@ class NordeaApplicationRequestTest < ActiveSupport::TestCase
|
|
178
178
|
assert_raises(ArgumentError) do
|
179
179
|
@nordea_generic_params[:command] = :wrong_kind_of_command
|
180
180
|
ar = Sepa::ApplicationRequest.new(@nordea_generic_params)
|
181
|
-
|
181
|
+
ar.get_as_base64
|
182
182
|
end
|
183
183
|
end
|
184
184
|
|
@@ -201,10 +201,9 @@ class NordeaApplicationRequestTest < ActiveSupport::TestCase
|
|
201
201
|
end
|
202
202
|
|
203
203
|
def test_signature_is_constructed_correctly
|
204
|
-
#private_key = @params.fetch(:private_key)
|
205
|
-
|
206
204
|
signed_info_node = @doc_file.at_css(
|
207
|
-
|
205
|
+
"dsig|SignedInfo", 'dsig' => 'http://www.w3.org/2000/09/xmldsig#'
|
206
|
+
)
|
208
207
|
|
209
208
|
# The value of the signature node in the constructed ar
|
210
209
|
calculated_signature = @doc_file.at_css(
|
@@ -216,8 +215,7 @@ class NordeaApplicationRequestTest < ActiveSupport::TestCase
|
|
216
215
|
private_key = rsa_key(File.read("#{keys_path}/nordea.key"))
|
217
216
|
|
218
217
|
sha1 = OpenSSL::Digest::SHA1.new
|
219
|
-
actual_signature = encode(private_key.sign(
|
220
|
-
sha1, signed_info_node.canonicalize))
|
218
|
+
actual_signature = encode(private_key.sign(sha1, signed_info_node.canonicalize))
|
221
219
|
|
222
220
|
# And then of course assert the two are equal
|
223
221
|
assert_equal calculated_signature, actual_signature
|
@@ -8,28 +8,28 @@ class NordeaApplicationResponseTest < ActiveSupport::TestCase
|
|
8
8
|
def setup
|
9
9
|
options = {
|
10
10
|
response: File.read("#{NORDEA_TEST_RESPONSE_PATH}/dfl.xml"),
|
11
|
-
command: :download_file_list
|
11
|
+
command: :download_file_list,
|
12
12
|
}
|
13
13
|
@dfl = Sepa::NordeaResponse.new(options).application_response
|
14
14
|
@dfl_doc = xml_doc @dfl
|
15
15
|
|
16
16
|
options = {
|
17
17
|
response: File.read("#{NORDEA_TEST_RESPONSE_PATH}/uf.xml"),
|
18
|
-
command: :upload_file
|
18
|
+
command: :upload_file,
|
19
19
|
}
|
20
20
|
@uf = Sepa::NordeaResponse.new(options).application_response
|
21
21
|
@uf_doc = xml_doc @dfl
|
22
22
|
|
23
23
|
options = {
|
24
24
|
response: File.read("#{NORDEA_TEST_RESPONSE_PATH}/df_tito.xml"),
|
25
|
-
command: :download_file
|
25
|
+
command: :download_file,
|
26
26
|
}
|
27
27
|
@df_tito = Sepa::NordeaResponse.new(options).application_response
|
28
28
|
@df_tito_doc = xml_doc @df_tito
|
29
29
|
|
30
30
|
options = {
|
31
31
|
response: File.read("#{NORDEA_TEST_RESPONSE_PATH}/gui.xml"),
|
32
|
-
command: :get_user_info
|
32
|
+
command: :get_user_info,
|
33
33
|
}
|
34
34
|
@gui = Sepa::NordeaResponse.new(options).application_response
|
35
35
|
@gui_doc = xml_doc @gui
|
@@ -90,7 +90,7 @@ class NordeaApplicationResponseTest < ActiveSupport::TestCase
|
|
90
90
|
def test_invalid_df_hash_check_should_not_verify
|
91
91
|
digest_value_node = @df_tito_doc.at_css(
|
92
92
|
'xmlns|DigestValue',
|
93
|
-
'xmlns' => 'http://www.w3.org/2000/09/xmldsig#'
|
93
|
+
'xmlns' => 'http://www.w3.org/2000/09/xmldsig#',
|
94
94
|
)
|
95
95
|
|
96
96
|
digest_value_node.content = digest_value_node.content[4..-1]
|
@@ -101,7 +101,7 @@ class NordeaApplicationResponseTest < ActiveSupport::TestCase
|
|
101
101
|
def test_invalid_gui_hash_check_should_not_verify
|
102
102
|
digest_value_node = @gui_doc.at_css(
|
103
103
|
'xmlns|DigestValue',
|
104
|
-
'xmlns' => 'http://www.w3.org/2000/09/xmldsig#'
|
104
|
+
'xmlns' => 'http://www.w3.org/2000/09/xmldsig#',
|
105
105
|
)
|
106
106
|
|
107
107
|
digest_value_node.content = '1234' + digest_value_node.content
|
@@ -128,7 +128,7 @@ class NordeaApplicationResponseTest < ActiveSupport::TestCase
|
|
128
128
|
def test_corrupted_signature_in_dfl_should_fail_signature_verification
|
129
129
|
signature_node = @dfl_doc.at_css(
|
130
130
|
'xmlns|SignatureValue',
|
131
|
-
'xmlns' => 'http://www.w3.org/2000/09/xmldsig#'
|
131
|
+
'xmlns' => 'http://www.w3.org/2000/09/xmldsig#',
|
132
132
|
)
|
133
133
|
|
134
134
|
signature_node.content = signature_node.content[4..-1]
|
@@ -139,7 +139,7 @@ class NordeaApplicationResponseTest < ActiveSupport::TestCase
|
|
139
139
|
def test_corrupted_signature_in_uf_should_fail_signature_verification
|
140
140
|
signature_node = @uf_doc.at_css(
|
141
141
|
'xmlns|SignatureValue',
|
142
|
-
'xmlns' => 'http://www.w3.org/2000/09/xmldsig#'
|
142
|
+
'xmlns' => 'http://www.w3.org/2000/09/xmldsig#',
|
143
143
|
)
|
144
144
|
|
145
145
|
signature_node.content = signature_node.content[0..-5]
|
@@ -150,7 +150,7 @@ class NordeaApplicationResponseTest < ActiveSupport::TestCase
|
|
150
150
|
def test_corrupted_signature_in_df_should_fail_signature_verification
|
151
151
|
signature_node = @df_tito_doc.at_css(
|
152
152
|
'xmlns|SignatureValue',
|
153
|
-
'xmlns' => 'http://www.w3.org/2000/09/xmldsig#'
|
153
|
+
'xmlns' => 'http://www.w3.org/2000/09/xmldsig#',
|
154
154
|
)
|
155
155
|
|
156
156
|
signature_node.content = 'a' + signature_node.content[1..-1]
|
@@ -161,7 +161,7 @@ class NordeaApplicationResponseTest < ActiveSupport::TestCase
|
|
161
161
|
def test_corrupted_signature_in_gui_should_fail_signature_verification
|
162
162
|
signature_node = @gui_doc.at_css(
|
163
163
|
'xmlns|SignatureValue',
|
164
|
-
'xmlns' => 'http://www.w3.org/2000/09/xmldsig#'
|
164
|
+
'xmlns' => 'http://www.w3.org/2000/09/xmldsig#',
|
165
165
|
)
|
166
166
|
|
167
167
|
signature_node.content = 'zombi' + signature_node.content[1..-1]
|
@@ -172,7 +172,7 @@ class NordeaApplicationResponseTest < ActiveSupport::TestCase
|
|
172
172
|
def test_should_raise_error_if_certificate_corrupted_in_dfl
|
173
173
|
cert_node = @dfl_doc.at_css(
|
174
174
|
'xmlns|X509Certificate',
|
175
|
-
'xmlns' => 'http://www.w3.org/2000/09/xmldsig#'
|
175
|
+
'xmlns' => 'http://www.w3.org/2000/09/xmldsig#',
|
176
176
|
)
|
177
177
|
|
178
178
|
cert_node.content = cert_node.content[0..-5]
|
@@ -185,7 +185,7 @@ class NordeaApplicationResponseTest < ActiveSupport::TestCase
|
|
185
185
|
def test_should_raise_error_if_certificate_corrupted_in_uf
|
186
186
|
cert_node = @uf_doc.at_css(
|
187
187
|
'xmlns|X509Certificate',
|
188
|
-
'xmlns' => 'http://www.w3.org/2000/09/xmldsig#'
|
188
|
+
'xmlns' => 'http://www.w3.org/2000/09/xmldsig#',
|
189
189
|
)
|
190
190
|
|
191
191
|
cert_node.content = cert_node.content[4..-1]
|
@@ -198,7 +198,7 @@ class NordeaApplicationResponseTest < ActiveSupport::TestCase
|
|
198
198
|
def test_should_raise_error_if_certificate_corrupted_in_df
|
199
199
|
cert_node = @df_tito_doc.at_css(
|
200
200
|
'xmlns|X509Certificate',
|
201
|
-
'xmlns' => 'http://www.w3.org/2000/09/xmldsig#'
|
201
|
+
'xmlns' => 'http://www.w3.org/2000/09/xmldsig#',
|
202
202
|
)
|
203
203
|
|
204
204
|
cert_node.content = "n5iw#{cert_node.content}"
|
@@ -211,7 +211,7 @@ class NordeaApplicationResponseTest < ActiveSupport::TestCase
|
|
211
211
|
def test_should_raise_error_if_certificate_corrupted_in_gui
|
212
212
|
cert_node = @gui_doc.at_css(
|
213
213
|
'xmlns|X509Certificate',
|
214
|
-
'xmlns' => 'http://www.w3.org/2000/09/xmldsig#'
|
214
|
+
'xmlns' => 'http://www.w3.org/2000/09/xmldsig#',
|
215
215
|
)
|
216
216
|
|
217
217
|
cert_node.content = encode 'voivoi'
|
@@ -235,5 +235,4 @@ class NordeaApplicationResponseTest < ActiveSupport::TestCase
|
|
235
235
|
test 'to_s works' do
|
236
236
|
assert_equal @uf, @uf_ar.to_s
|
237
237
|
end
|
238
|
-
|
239
238
|
end
|
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
3
|
class NordeaCertRequestSoapBuilderTest < ActiveSupport::TestCase
|
4
|
-
|
5
4
|
def setup
|
6
5
|
@nordea_get_certificate_params = nordea_get_certificate_params
|
7
6
|
@certrequest = Sepa::SoapBuilder.new(@nordea_get_certificate_params)
|
@@ -30,7 +29,7 @@ class NordeaCertRequestSoapBuilderTest < ActiveSupport::TestCase
|
|
30
29
|
def test_should_raise_error_if_command_not_correct
|
31
30
|
@nordea_get_certificate_params[:command] = :wrong_command
|
32
31
|
assert_raises(ArgumentError) do
|
33
|
-
|
32
|
+
Sepa::SoapBuilder.new(@nordea_get_certificate_params).to_xml
|
34
33
|
end
|
35
34
|
end
|
36
35
|
|
@@ -58,5 +57,4 @@ class NordeaCertRequestSoapBuilderTest < ActiveSupport::TestCase
|
|
58
57
|
def test_should_validate_against_schema
|
59
58
|
assert_valid_against_schema 'soap.xsd', @xml
|
60
59
|
end
|
61
|
-
|
62
60
|
end
|
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
3
|
class NordeaGenericSoapBuilderTest < ActiveSupport::TestCase
|
4
|
-
|
5
4
|
def setup
|
6
5
|
@nordea_generic_params = nordea_generic_params
|
7
6
|
|
@@ -62,13 +61,13 @@ class NordeaGenericSoapBuilderTest < ActiveSupport::TestCase
|
|
62
61
|
@nordea_generic_params[:command] = :wrong_command
|
63
62
|
|
64
63
|
assert_raises(ArgumentError) do
|
65
|
-
|
64
|
+
Sepa::SoapBuilder.new(@nordea_generic_params)
|
66
65
|
end
|
67
66
|
end
|
68
67
|
|
69
68
|
def test_sender_id_is_properly_set
|
70
69
|
assert_equal @nordea_generic_params[:customer_id],
|
71
|
-
|
70
|
+
@doc.xpath("//bxd:SenderId", 'bxd' => 'http://model.bxd.fi').first.content
|
72
71
|
end
|
73
72
|
|
74
73
|
# Just testing that the content of the node is an actual hex number and that
|
@@ -156,10 +155,7 @@ class NordeaGenericSoapBuilderTest < ActiveSupport::TestCase
|
|
156
155
|
"//env:Body", 'env' => 'http://schemas.xmlsoap.org/soap/envelope/'
|
157
156
|
).first
|
158
157
|
|
159
|
-
body_node = body_node
|
160
|
-
mode = Nokogiri::XML::XML_C14N_EXCLUSIVE_1_0, inclusive_namespaces = nil,
|
161
|
-
with_comments = false
|
162
|
-
)
|
158
|
+
body_node = canonicalize_exclusively(body_node)
|
163
159
|
|
164
160
|
actual_digest = encode(sha1.digest(body_node)).strip
|
165
161
|
|
@@ -202,10 +198,7 @@ class NordeaGenericSoapBuilderTest < ActiveSupport::TestCase
|
|
202
198
|
"//wsu:Timestamp", 'wsu' => wsu
|
203
199
|
).first
|
204
200
|
|
205
|
-
timestamp_node = timestamp_node
|
206
|
-
mode = Nokogiri::XML::XML_C14N_EXCLUSIVE_1_0, inclusive_namespaces = nil,
|
207
|
-
with_comments = false
|
208
|
-
)
|
201
|
+
timestamp_node = canonicalize_exclusively(timestamp_node)
|
209
202
|
|
210
203
|
actual_digest = encode(sha1.digest(timestamp_node)).strip
|
211
204
|
|
@@ -224,13 +217,10 @@ class NordeaGenericSoapBuilderTest < ActiveSupport::TestCase
|
|
224
217
|
"//dsig:SignedInfo", 'dsig' => 'http://www.w3.org/2000/09/xmldsig#'
|
225
218
|
).first
|
226
219
|
|
227
|
-
signed_info_node = signed_info_node
|
228
|
-
mode = Nokogiri::XML::XML_C14N_EXCLUSIVE_1_0, inclusive_namespaces = nil,
|
229
|
-
with_comments = false
|
230
|
-
)
|
220
|
+
signed_info_node = canonicalize_exclusively(signed_info_node)
|
231
221
|
|
232
222
|
actual_signature = encode(
|
233
|
-
signing_private_key.sign(sha1, signed_info_node)
|
223
|
+
signing_private_key.sign(sha1, signed_info_node),
|
234
224
|
).gsub(/\s+/, "")
|
235
225
|
|
236
226
|
assert_equal actual_signature, added_signature
|
@@ -6,67 +6,67 @@ class NordeaResponseTest < ActiveSupport::TestCase
|
|
6
6
|
setup do
|
7
7
|
options = {
|
8
8
|
response: File.read("#{NORDEA_TEST_RESPONSE_PATH}/dfl.xml"),
|
9
|
-
command: :download_file_list
|
9
|
+
command: :download_file_list,
|
10
10
|
}
|
11
11
|
@dfl = Sepa::NordeaResponse.new options
|
12
12
|
|
13
13
|
options = {
|
14
14
|
response: File.read("#{NORDEA_TEST_RESPONSE_PATH}/uf.xml"),
|
15
|
-
command: :upload_file
|
15
|
+
command: :upload_file,
|
16
16
|
}
|
17
17
|
@uf = Sepa::NordeaResponse.new options
|
18
18
|
|
19
19
|
options = {
|
20
20
|
response: File.read("#{NORDEA_TEST_RESPONSE_PATH}/df_tito.xml"),
|
21
|
-
command: :download_file
|
21
|
+
command: :download_file,
|
22
22
|
}
|
23
23
|
@df_tito = Sepa::NordeaResponse.new options
|
24
24
|
|
25
25
|
options = {
|
26
26
|
response: File.read("#{NORDEA_TEST_RESPONSE_PATH}/df_ktl.xml"),
|
27
|
-
command: :download_file
|
27
|
+
command: :download_file,
|
28
28
|
}
|
29
29
|
@df_ktl = Sepa::NordeaResponse.new options
|
30
30
|
|
31
31
|
options = {
|
32
32
|
response: File.read("#{NORDEA_TEST_RESPONSE_PATH}/gui.xml"),
|
33
|
-
command: :get_user_info
|
33
|
+
command: :get_user_info,
|
34
34
|
}
|
35
35
|
@gui = Sepa::NordeaResponse.new options
|
36
36
|
|
37
37
|
options = {
|
38
38
|
response: File.read("#{NORDEA_TEST_RESPONSE_PATH}/gc.xml"),
|
39
|
-
command: :get_certificate
|
39
|
+
command: :get_certificate,
|
40
40
|
}
|
41
41
|
@gc = Sepa::NordeaResponse.new options
|
42
42
|
|
43
43
|
options = {
|
44
44
|
response: File.read("#{NORDEA_TEST_RESPONSE_PATH}/rc.xml"),
|
45
|
-
command: :renew_certificate
|
45
|
+
command: :renew_certificate,
|
46
46
|
}
|
47
47
|
@rc = Sepa::NordeaResponse.new options
|
48
48
|
|
49
49
|
options = {
|
50
50
|
response: File.read("#{NORDEA_TEST_RESPONSE_PATH}/not_ok_response_code.xml"),
|
51
|
-
command: :download_file_list
|
51
|
+
command: :download_file_list,
|
52
52
|
}
|
53
53
|
@not_ok_response_code_response = Sepa::NordeaResponse.new options
|
54
54
|
|
55
55
|
options = {
|
56
56
|
response: File.read("#{NORDEA_TEST_RESPONSE_PATH}/download_file_list_no_content.xml"),
|
57
|
-
command: :download_file_list
|
57
|
+
command: :download_file_list,
|
58
58
|
}
|
59
59
|
@response_with_code_24 = Sepa::NordeaResponse.new options
|
60
60
|
|
61
61
|
options = {
|
62
62
|
response: File.read("#{NORDEA_TEST_RESPONSE_PATH}/invalid/timestamp_altered.xml"),
|
63
|
-
command: :download_file_list
|
63
|
+
command: :download_file_list,
|
64
64
|
}
|
65
65
|
@timestamp_altered = Sepa::NordeaResponse.new options
|
66
66
|
|
67
67
|
options = {
|
68
68
|
response: File.read("#{NORDEA_TEST_RESPONSE_PATH}/invalid/body_altered.xml"),
|
69
|
-
command: :upload_file
|
69
|
+
command: :upload_file,
|
70
70
|
}
|
71
71
|
@body_altered = Sepa::NordeaResponse.new options
|
72
72
|
end
|
@@ -59,7 +59,7 @@ class OpCertApplicationRequestTest < ActiveSupport::TestCase
|
|
59
59
|
end
|
60
60
|
|
61
61
|
test "hmac is not set" do
|
62
|
-
refute @xml.at_css("HMAC"), "HMAC should not be set, but is #{@xml.at_css(
|
62
|
+
refute @xml.at_css("HMAC"), "HMAC should not be set, but is #{@xml.at_css('HMAC')}"
|
63
63
|
end
|
64
64
|
|
65
65
|
test "validates against schema" do
|