sepafm 0.1.5 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,8 +1,15 @@
1
1
  module Sepa
2
+
3
+ # Contains Danske Bank specific soap building functionality
2
4
  module DanskeSoapRequest
3
5
 
4
6
  private
5
7
 
8
+ # Determines which kind of request to build depending on command. Certificate requests differ
9
+ # from generic requests.
10
+ #
11
+ # @return [Nokogiri::XML] the built soap as a nokogiri document
12
+ # @todo remove `:get_user_info` since Danske Bank doesn't support it
6
13
  def find_correct_build
7
14
  case @command
8
15
  when :create_certificate
@@ -14,6 +21,12 @@ module Sepa
14
21
  end
15
22
  end
16
23
 
24
+ # Encrypts the application request with the public key of the bank encryption certificate got
25
+ # from the parameters. The actual encryption is done by {#encrypt_ar} and {#encrypt_key}
26
+ # methods. After the encryption, the encrypted application request xml is built by
27
+ # {#build_encrypted_ar} method
28
+ #
29
+ # @return [Nokogiri::XML] the encrypted application request as a nokogiri document
17
30
  def encrypt_application_request
18
31
  encryption_certificate = x509_certificate(@bank_encryption_certificate)
19
32
  encryption_public_key = encryption_certificate.public_key
@@ -24,14 +37,23 @@ module Sepa
24
37
  end
25
38
 
26
39
  # Encrypts a given symmetric encryption key with a public key and returns it in base64 encoded
27
- # format
40
+ # format.
41
+ #
42
+ # @param key [String] the key that will be encrypted
43
+ # @param public_key [OpenSSL::PKey::RSA] the public key that will be used to do the encryption
44
+ # @return [String] the encrypted key as a base64 encoded string
45
+ # @todo make more generic and move to utilities
28
46
  def encrypt_key(key, public_key)
29
47
  encrypted_key = public_key.public_encrypt(key)
30
48
  encode encrypted_key
31
49
  end
32
50
 
33
- # Encrypts the application request and returns it in base64 encoded format.
34
- # Also returns the key needed to decrypt it
51
+ # Encrypts the application request and returns it in base64 encoded format. Also returns the
52
+ # key needed to decrypt it. The encryption algorithm is 'DES-EDE3-CBC' and the iv is prepended
53
+ # to the encrypted data.
54
+ #
55
+ # @return [Array(String, String)] the encrypted application request and the key needed to
56
+ # decrypt it
35
57
  def encrypt_ar
36
58
  cipher = OpenSSL::Cipher.new('DES-EDE3-CBC').encrypt
37
59
 
@@ -46,6 +68,15 @@ module Sepa
46
68
  return encrypted_data, key
47
69
  end
48
70
 
71
+ # Builds the xml structure for the encrypted application request that can be base64 encoded
72
+ # and embedded to the soap.
73
+ #
74
+ # @param cert [#to_s] the certificate which public key was used for the asymmetric encryption
75
+ # @param encrypted_data [#to_s] the encrypted application request
76
+ # @param encrypted_key [#to_s] the encrypted key that was used for the symmetric encryption
77
+ # @return [Nokogiri::XML] the encrypted application request xml structure as a nokogiri
78
+ # document
79
+ # @todo rename
49
80
  def build_encrypted_ar(cert, encrypted_data, encrypted_key)
50
81
  ar = Nokogiri::XML File.open "#{AR_TEMPLATE_PATH}/encrypted_request.xml"
51
82
  set_node(ar, 'dsig|X509Certificate', cert)
@@ -54,6 +85,12 @@ module Sepa
54
85
  ar
55
86
  end
56
87
 
88
+ # Sets contents for generic request's nodes. Generic requests are:
89
+ # * Upload file
90
+ # * Download file
91
+ # * Download file list
92
+ #
93
+ # @todo make ReceiverId dynamic
57
94
  def set_generic_request_contents
58
95
  set_node(@template, 'bxd|SenderId', @customer_id)
59
96
  set_node(@template, 'bxd|RequestId', request_id)
@@ -63,6 +100,9 @@ module Sepa
63
100
  set_node(@template, 'bxd|ReceiverId', "DABAFIHH")
64
101
  end
65
102
 
103
+ # Sets contents for create certificate requests.
104
+ #
105
+ # @todo rename
66
106
  def set_create_cert_contents
67
107
  set_node(@template, 'pkif|SenderId', @customer_id)
68
108
  set_node(@template, 'pkif|CustomerId', @customer_id)
@@ -72,6 +112,9 @@ module Sepa
72
112
  set_node(@template, 'pkif|Environment', @environment)
73
113
  end
74
114
 
115
+ # Sets contents for get bank certificate requests
116
+ #
117
+ # @todo rename
75
118
  def set_bank_certificate_contents
76
119
  set_node(@template, 'pkif|SenderId', @customer_id)
77
120
  set_node(@template, 'pkif|CustomerId', @customer_id)
@@ -80,6 +123,14 @@ module Sepa
80
123
  set_node(@template, 'pkif|InterfaceVersion', 1)
81
124
  end
82
125
 
126
+ # Builds Danske Bank's generic request soap. The processing order is as follows:
127
+ # 1. The contents of the soap are set
128
+ # 2. The application request is encrypted
129
+ # 3. The encrypted application request xml structure is embedded in the soap
130
+ # 4. The header is processed
131
+ # 5. The body is added to the header
132
+ #
133
+ # @return [Nokogiri::XML] the complete soap
83
134
  def build_danske_generic_request
84
135
  set_generic_request_contents
85
136
  encrypted_request = encrypt_application_request
@@ -89,6 +140,11 @@ module Sepa
89
140
  add_body_to_header
90
141
  end
91
142
 
143
+ # Builds Danske Bank's create certificate request soap. Environment is set to `:customertest`
144
+ # if set to `:test`. This request is encrypted but not signed.
145
+ #
146
+ # @return [Nokogiri::XML] the complete soap
147
+ # @todo rename
92
148
  def build_certificate_request
93
149
  @environment = :customertest if @environment == :test
94
150
  set_create_cert_contents
@@ -96,11 +152,20 @@ module Sepa
96
152
  add_encrypted_request_to_soap(encrypted_request)
97
153
  end
98
154
 
155
+ # Builds get bank certificate request soap. This request is neither signed nor encrypted.
156
+ #
157
+ # @return [Nokogiri::XML] the complete soap
99
158
  def build_get_bank_certificate_request
100
159
  set_bank_certificate_contents
101
160
  add_bank_certificate_body_to_soap
102
161
  end
103
162
 
163
+ # Adds encrypted application request xml structure to the soap. This method is used when
164
+ # building create certificate requests and the encrypted application request xml structure
165
+ # will not be base64 encoded.
166
+ #
167
+ # @param encrypted_request [Nokogiri::XML] the encrypted application request xml structure
168
+ # @return [Nokogiri::XML] the soap with the encrypted application request added to it
104
169
  def add_encrypted_request_to_soap(encrypted_request)
105
170
  encrypted_request = Nokogiri::XML(encrypted_request.to_xml)
106
171
  encrypted_request = encrypted_request.root
@@ -109,6 +174,12 @@ module Sepa
109
174
  @template
110
175
  end
111
176
 
177
+ # Adds the encrypted application request xml structure to generic request soap.
178
+ # The application request is base64 encoded before it is added to the soap.
179
+ #
180
+ # @param encrypted_request [Nokogiri::XML] the encrypted application request xml structure
181
+ # @return [Nokogiri::XML] the soap with the encrypted application request added to it
182
+ # @todo refactor possible unnecessary conversion away and rename
112
183
  def add_encrypted_generic_request_to_soap(encrypted_request)
113
184
  encrypted_request = Nokogiri::XML(encrypted_request.to_xml)
114
185
  encrypted_request = encrypted_request.root
@@ -118,6 +189,9 @@ module Sepa
118
189
  @template
119
190
  end
120
191
 
192
+ # Adds get bank certificate application request to the soap
193
+ #
194
+ # @return [Nokogiri::XML] the soap with the application request added to it
121
195
  def add_bank_certificate_body_to_soap
122
196
  ar = @application_request.to_nokogiri
123
197
 
@@ -127,6 +201,10 @@ module Sepa
127
201
  @template
128
202
  end
129
203
 
204
+ # Generates a random 10-character request id for Danske Bank's requests.
205
+ #
206
+ # @return [String] 10-character hexnumeric request id
207
+ # @todo move to utilities
130
208
  def request_id
131
209
  SecureRandom.hex(5)
132
210
  end
@@ -1,7 +1,13 @@
1
1
  module Sepa
2
+
3
+ # Handles Nordea specific response logic. Mainly certificate specific stuff.
2
4
  class NordeaResponse < Response
3
5
  include Utilities
4
6
 
7
+ # Extracts own signing certificate from the response.
8
+ #
9
+ # @return [String] own signing certificate as string it it is found
10
+ # @return [nil] if the certificate cannot be found
5
11
  def own_signing_certificate
6
12
  application_response = extract_application_response(NORDEA_PKI)
7
13
  at = 'xmlns|Certificate > xmlns|Certificate'
@@ -14,6 +20,12 @@ module Sepa
14
20
  cert.to_s
15
21
  end
16
22
 
23
+ # Returns the response code in the response. Overrides {Response#response_code} if {#command} is
24
+ # `:get_certificate`, because the namespace is different with that command.
25
+ #
26
+ # @return [String] response code if it is found
27
+ # @return [nil] if response code cannot be found
28
+ # @see Response#response_code
17
29
  def response_code
18
30
  return super unless command == :get_certificate
19
31
 
@@ -21,6 +33,12 @@ module Sepa
21
33
  node.content if node
22
34
  end
23
35
 
36
+ # Checks whether the certificate embedded in the response soap has been signed with Nordea's
37
+ # root certificate.
38
+ #
39
+ # @return [true] if certificate is trusted
40
+ # @return [false] if certificate fails to verify
41
+ # @see DanskeResponse#certificate_is_trusted?
24
42
  def certificate_is_trusted?
25
43
  verify_certificate_against_root_certificate(certificate, NORDEA_ROOT_CERTIFICATE)
26
44
  end
@@ -1,8 +1,14 @@
1
1
  module Sepa
2
+
3
+ # Contains Nordea specific soap building functionality
2
4
  module NordeaSoapRequest
3
5
 
4
6
  private
5
7
 
8
+ # Determines which soap request to build based on command. Certificate requests are built
9
+ # differently than generic requests.
10
+ #
11
+ # @return [Nokogiri::XML] the soap as a nokogiri document
6
12
  def find_correct_build
7
13
  case @command
8
14
  when :get_certificate
@@ -12,11 +18,17 @@ module Sepa
12
18
  end
13
19
  end
14
20
 
15
- # Builds : Get Certificate
21
+ # Sets contents for certificate request
22
+ #
23
+ # @return [Nokogiri::XML] the template with contents added to it
16
24
  def build_certificate_request
17
25
  set_body_contents
18
26
  end
19
27
 
28
+ # Sets soap body contents. Application request is base64 encoded here.
29
+ #
30
+ # @return [Nokogiri::XML] the soap with contents added to it
31
+ # @todo rename, because apparently only sets certificate contents
20
32
  def set_body_contents
21
33
  set_node(@template, 'cer|ApplicationRequest', @application_request.to_base64)
22
34
  set_node(@template, 'cer|SenderId', @customer_id)
@@ -26,13 +38,20 @@ module Sepa
26
38
  @template
27
39
  end
28
40
 
29
- # Builds : Get User Info, Download File, Download File List, Upload File
41
+ # Builds generic request which is a request made with commands:
42
+ # * Get User Info
43
+ # * Download File
44
+ # * Download File List
45
+ # * Upload File
46
+ #
47
+ # @return [Nokogiri::XML] the generic request soap
30
48
  def build_common_request
31
49
  common_set_body_contents
32
50
  process_header
33
51
  add_body_to_header
34
52
  end
35
53
 
54
+ # Sets nodes for generic requests, application request is base64 encoded here.
36
55
  def common_set_body_contents
37
56
  set_node(@template, 'bxd|ApplicationRequest', @application_request.to_base64)
38
57
  set_node(@template, 'bxd|SenderId', @customer_id)
@@ -43,6 +62,10 @@ module Sepa
43
62
  set_node(@template, 'bxd|ReceiverId', @target_id)
44
63
  end
45
64
 
65
+ # Generates a random request id for Nordea request
66
+ #
67
+ # @return [String] hexnumeric request id
68
+ # @todo move to utilities
46
69
  def request_id
47
70
  SecureRandom.hex(17)
48
71
  end
data/lib/sepa/client.rb CHANGED
@@ -1,31 +1,181 @@
1
+ # Main module for this gem
1
2
  module Sepa
3
+
4
+ # Handles parameter validation, key initialization, {SoapBuilder} initialization, communicating
5
+ # with the bank and {Response} initialization.
2
6
  class Client
3
7
  include ActiveModel::Validations
4
8
  include Utilities
5
9
  include ErrorMessages
6
10
  include AttributeChecks
7
11
 
8
- attr_accessor :bank,
9
- :command,
10
- :content,
11
- :customer_id,
12
- :target_id,
13
- :environment,
14
- :file_reference,
15
- :file_type,
16
- :language,
17
- :status,
18
- :pin,
19
- :signing_private_key,
20
- :own_signing_certificate,
21
- :signing_csr,
22
- :encryption_private_key,
23
- :bank_encryption_certificate,
24
- :encryption_csr
25
12
 
13
+ # The bank that is used in this client. One of {BANKS}.
14
+ #
15
+ # @return [Symbol]
16
+ attr_accessor :bank
17
+
18
+ # The command that is used with this client. One of {AttributeChecks#allowed_commands}.
19
+ #
20
+ # @return [Symbol]
21
+ attr_accessor :command
22
+
23
+ # The payload in base64 encoded form. Used with upload file command.
24
+ #
25
+ # @return [String]
26
+ # @example Dummy payload
27
+ # 'a2lzc2E='
28
+ attr_accessor :content
29
+
30
+ # Customer id got from the bank.
31
+ #
32
+ # @return [String]
33
+ # @example Nordea's testing customer id
34
+ # '11111111'
35
+ attr_accessor :customer_id
36
+
37
+ # A file categorization id used by Nordea. Can be retrieved with get_user_info request. Not
38
+ # used with Danske Bank
39
+ #
40
+ # @return [String]
41
+ # @example Nordea's testing target id
42
+ # '11111111A1'
43
+ attr_accessor :target_id
44
+
45
+ # The environment to be used. One of {ENVIRONMENTS}.
46
+ #
47
+ # @return [Symbol]
48
+ attr_accessor :environment
49
+
50
+ # File reference number used in download_file requests.
51
+ #
52
+ # @return [String]
53
+ # @example
54
+ # '11111111A12006030319503000000010'
55
+ attr_accessor :file_reference
56
+
57
+ # The file type of the file that is about to be uploaded or downloaded. These vary by bank.
58
+ #
59
+ # @return [String]
60
+ # @example Nordea's electronic bank statement
61
+ # 'TITO'
62
+ attr_accessor :file_type
63
+
64
+ # The language to be used in this client. One of {LANGUAGES}.
65
+ #
66
+ # @return [String]
67
+ attr_accessor :language
68
+
69
+ # Used to filter files in download_file_list request. One of {STATUSES}.
70
+ #
71
+ # @return [String]
72
+ attr_accessor :status
73
+
74
+ # The one-time pin got for bank. Used with certificate requests.
75
+ #
76
+ # @return [String]
77
+ # @example Danske Bank's testing pin
78
+ # '1234'
79
+ attr_accessor :pin
80
+
81
+ # Signing private key which is used to sign the request
82
+ #
83
+ # @return [String]
84
+ # @example Nordea's testing private key
85
+ # '-----BEGIN RSA PRIVATE KEY-----
86
+ # MIICXQIBAAKBgQDC0UR8C1sm4bNDDBG6ZmS9iHYGMZhWwAxR6Iq06d7dtlJ6Kx8K
87
+ # r5NeovWAj0uh/J4BD0j+wObq0vzTKsPmJpJSpWboDvf0yyalb+LJlxV/uazzEA3n
88
+ # URJSA3pqTBkJT2kfraeAkOPaBSyS1jR+myhWwBF2u84WTR9NJRcpZ3ottwIDAQAB
89
+ # AoGBAKrfddv+8eI2kE68ZUhCyxVafXqNQXrFU4j8F7z6bBm28rxo2f87ZFzbPc2W
90
+ # 4dWghs2TJIkdlOxeRpbIqa5SIn+HBel8+6wo2gLO4g0bfT44Y1bqjRkdiPlSCJW0
91
+ # PV1hSd5SRVt7+0yGfCWy559Fzhc/mQQUkhkytc0zYeEwULYxAkEA3uTN7rvZuEcE
92
+ # sPUehmg8PyBUGYK9KFkr9FiI0cL8FpxZ0l9pW5DQI7pT9HWhrJp+78SKamcT8cHK
93
+ # 1OMBakxeXQJBAN/A52wpt2H6IM8Cxza3toQZhqo1mq4bcarUWq65IJ5jnfFtGdR2
94
+ # 9XUh65YlElUqyDWyuWXRFdeUabu1Qznj8yMCQDzLJUvvGpQDcskdIiVAuuXw2F9Y
95
+ # 5GTj5XQwzaiAyScVn/4cHe1mkw6bnJh5mQ4t2V9mOOaKlMsEs2DbRaCLkdUCQGWF
96
+ # Gbsqpkiu+0nRgd+itQ30ovQBREAwtX8DwG08E7+phRTwImMS4kWV8VT7VvkLYzFx
97
+ # +MpodleMv/hpwqm2ci8CQQCUEgwDBEp+FM+2Y5N1KwSGzGBL9LtpnAsqcLG9JxhO
98
+ # f4Mwz4xhPXMVlvq1wESLPrDUFQpZ4eOZ4XX2MTo4GH39
99
+ # -----END RSA PRIVATE KEY-----'
100
+ attr_accessor :signing_private_key
101
+
102
+ # Own signing certificate in "pem" format. Embedded in the request
103
+ #
104
+ # @return [String]
105
+ # @example Nordea's testing signing certificate
106
+ # '-----BEGIN CERTIFICATE-----
107
+ # MIIDwTCCAqmgAwIBAgIEAX1JuTANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJT
108
+ # RTEeMBwGA1UEChMVTm9yZGVhIEJhbmsgQUIgKHB1YmwpMR8wHQYDVQQDExZOb3Jk
109
+ # ZWEgQ29ycG9yYXRlIENBIDAxMRQwEgYDVQQFEws1MTY0MDYtMDEyMDAeFw0xMzA1
110
+ # MDIxMjI2MzRaFw0xNTA1MDIxMjI2MzRaMEQxCzAJBgNVBAYTAkZJMSAwHgYDVQQD
111
+ # DBdOb3JkZWEgRGVtbyBDZXJ0aWZpY2F0ZTETMBEGA1UEBRMKNTc4MDg2MDIzODCB
112
+ # nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwtFEfAtbJuGzQwwRumZkvYh2BjGY
113
+ # VsAMUeiKtOne3bZSeisfCq+TXqL1gI9LofyeAQ9I/sDm6tL80yrD5iaSUqVm6A73
114
+ # 9MsmpW/iyZcVf7ms8xAN51ESUgN6akwZCU9pH62ngJDj2gUsktY0fpsoVsARdrvO
115
+ # Fk0fTSUXKWd6LbcCAwEAAaOCAR0wggEZMAkGA1UdEwQCMAAwEQYDVR0OBAoECEBw
116
+ # 2cj7+XMAMBMGA1UdIAQMMAowCAYGKoVwRwEDMBMGA1UdIwQMMAqACEALddbbzwun
117
+ # MDcGCCsGAQUFBwEBBCswKTAnBggrBgEFBQcwAYYbaHR0cDovL29jc3Aubm9yZGVh
118
+ # LnNlL0NDQTAxMA4GA1UdDwEB/wQEAwIFoDCBhQYDVR0fBH4wfDB6oHigdoZ0bGRh
119
+ # cCUzQS8vbGRhcC5uYi5zZS9jbiUzRE5vcmRlYStDb3Jwb3JhdGUrQ0ErMDElMkNv
120
+ # JTNETm9yZGVhK0JhbmsrQUIrJTI4cHVibCUyOSUyQ2MlM0RTRSUzRmNlcnRpZmlj
121
+ # YXRlcmV2b2NhdGlvbmxpc3QwDQYJKoZIhvcNAQEFBQADggEBACLUPB1Gmq6286/s
122
+ # ROADo7N+w3eViGJ2fuOTLMy4R0UHOznKZNsuk4zAbS2KycbZsE5py4L8o+IYoaS8
123
+ # 8YHtEeckr2oqHnPpz/0Eg7wItj8Ad+AFWJqzbn6Hu/LQhlnl5JEzXzl3eZj9oiiJ
124
+ # 1q/2CGXvFomY7S4tgpWRmYULtCK6jode0NhgNnAgOI9uy76pSS16aDoiQWUJqQgV
125
+ # ydowAnqS9h9aQ6gedwbOdtkWmwKMDVXU6aRz9Gvk+JeYJhtpuP3OPNGbbC5L7NVd
126
+ # no+B6AtwxmG3ozd+mPcMeVuz6kKLAmQyIiBSrRNa5OrTkq/CUzxO9WUgTnm/Sri7
127
+ # zReR6mU=
128
+ # -----END CERTIFICATE-----'
129
+ attr_accessor :own_signing_certificate
130
+
131
+ # The signing certificate signing request. Used in certificate requests.
132
+ #
133
+ # @return [String]
134
+ # @example
135
+ # '-----BEGIN CERTIFICATE REQUEST-----
136
+ # MIIBczCB3QIBADA0MRIwEAYDVQQDEwlEZXZsYWIgT3kxETAPBgNVBAUTCDExMTEx
137
+ # MTExMQswCQYDVQQGEwJGSTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAo9wU
138
+ # c2Ys5hSso4nEanbc+RIhL71aS6GBGiWAegXjhlyb6dpwigrZBFPw4u6UZV/Vq7Y7
139
+ # Ku3uBq5rfZwk+lA+c/B634Eu0zWdI+EYfQxKVRrBrmhiGplKEtglHXbNmmMOn07e
140
+ # LPUaB0Ipx/6h/UczJGBINdtcuIbYVu0r7ZfyWbUCAwEAAaAAMA0GCSqGSIb3DQEB
141
+ # BQUAA4GBAIhh2o8mN4Byn+w1jdbhq6lxEXYqdqdh1F6GCajt2lQMUBgYP23I5cS/
142
+ # Z+SYNhu8vbj52cGQPAwEDN6mm5yLpcXu40wYzgWyfStLXV9d/b4hMy9qLMW00Dzb
143
+ # jo2ekdSDdw8qxKyxj1piv8oYzMd4fCjCpL+WDZtq7mdLErVZ92gH
144
+ # -----END CERTIFICATE REQUEST-----'
145
+ attr_accessor :signing_csr
146
+
147
+ # Own encryption private key. Used to decrypt the response. In "pem" format.
148
+ #
149
+ # @return [String]
150
+ # @see #signing_private_key The format is the same as in signing private key
151
+ attr_accessor :encryption_private_key
152
+
153
+ # Bank's encryption certificate. The request is encrypted with this so that the bank can decrypt
154
+ # the request with their private key. In "pem" format.
155
+ #
156
+ # @return [String]
157
+ # @see #own_signing_certificate The format is the same as in own signing certificate
158
+ attr_accessor :bank_encryption_certificate
159
+
160
+ # Encryption certificate signing request. This needs to be generated and is then sent to the
161
+ # bank to be signed.
162
+ #
163
+ # @return [String]
164
+ # @see #signing_csr The format is the same as in signing csr
165
+ attr_accessor :encryption_csr
166
+
167
+ # The list of banks that are currently supported by this gem
26
168
  BANKS = [:nordea, :danske]
169
+
170
+ # Languages that are currently supported by the gem
27
171
  LANGUAGES = ['FI', 'SE', 'EN']
172
+
173
+ # Environments that are currently supported by the gem
28
174
  ENVIRONMENTS = [:production, :test]
175
+
176
+ # Statuses that can be given to download file list command. When NEW is given, only those files
177
+ # that have not yet been downloaded will be listed. DOWNLOADED will list only downloaded files
178
+ # and ALL will list every file
29
179
  STATUSES = ['NEW', 'DOWNLOADED', 'ALL']
30
180
 
31
181
  validates :bank, inclusion: { in: BANKS }
@@ -46,6 +196,10 @@ module Sepa
46
196
  validate :check_file_reference
47
197
  validate :check_encryption_private_key
48
198
 
199
+ # Initializes the class. An optional hash of attributes can be given. Environment is set to
200
+ # production if not given, language to 'EN' and status to 'NEW'.
201
+ #
202
+ # @param hash [Hash] All the attributes of the client can be given to the construcor in a hash
49
203
  def initialize(hash = {})
50
204
  self.attributes hash
51
205
  self.environment ||= :production
@@ -67,12 +221,29 @@ module Sepa
67
221
  @environment = value.downcase.to_sym
68
222
  end
69
223
 
224
+ # Sets the attributes given in a hash
225
+ #
226
+ # @param hash [Hash] Hash of parameters
227
+ # @example
228
+ # {
229
+ # bank: :nordea,
230
+ # command: :download_file_list
231
+ # }
70
232
  def attributes(hash)
71
233
  hash.each do |name, value|
72
234
  send("#{name}=", value)
73
235
  end
74
236
  end
75
237
 
238
+ # Sends request to the bank specified in the attributes. First a new {SoapBuilder} class is
239
+ # initialized with a hash of the parameters given to the client with the {#create_hash} method.
240
+ # After this, a Savon client is initialized with a WSDL file got from {#wsdl}. After this, the
241
+ # Savon client makes the actual call to the server with the {#command} and the constructed
242
+ # {SoapBuilder}. After the call, the xml is extracted from the Savon response and the response
243
+ # is then checked for any Savon::Error errors. After this a {Response} is initialized using
244
+ # the {#initialize_response} method with the xml response and possible errors.
245
+ # @raise [ArgumentError] if some of the parameters are not valid
246
+ # @return [Response]
76
247
  def send_request
77
248
  raise ArgumentError, errors.messages unless valid?
78
249
 
@@ -93,6 +264,11 @@ module Sepa
93
264
 
94
265
  private
95
266
 
267
+ # Creates a hash of all instance variables and their values. Before the actual hash is
268
+ # created, the {#signing_private_key} is converted to OpenSSL::PKey::RSA using
269
+ # {#initialize_signing_private_key} method.
270
+ #
271
+ # @return [Hash] All instance variables in a hash with their names as symbols as keys
96
272
  def create_hash
97
273
  initialize_signing_private_key
98
274
  iv = {}
@@ -108,11 +284,14 @@ module Sepa
108
284
  iv
109
285
  end
110
286
 
287
+ # Converts the {#signing_private_key} from String to OpenSSL::PKey::RSA
288
+ # @return [OpenSSL::PKey::RSA]
111
289
  def initialize_signing_private_key
112
290
  @signing_private_key = rsa_key(@signing_private_key) if @signing_private_key
113
291
  end
114
292
 
115
- # Returns path to WSDL file
293
+ # Returns path to WSDL file according to {#bank} and {#command}
294
+ # @return [String] Path to the WSDL file of the bank and command
116
295
  def wsdl
117
296
  case bank
118
297
  when :nordea
@@ -132,6 +311,12 @@ module Sepa
132
311
  "#{WSDL_PATH}/#{file}"
133
312
  end
134
313
 
314
+ # Initializes {Response} as correct class for a bank. Also converts possible
315
+ # {#encryption_private_key} from String to OpenSSL::PKey::RSA.
316
+ #
317
+ # @param error [String] Possible error got from {#send_request}
318
+ # @param response [String] A soap response in plain xml
319
+ # @return [Response] A {Response} with a correct class for a bank
135
320
  def initialize_response(error, response)
136
321
  options = {
137
322
  response: response,
@@ -1,27 +1,68 @@
1
1
  module Sepa
2
+
3
+ # Contains error messages used in this gem
2
4
  module ErrorMessages
3
- CUSTOMER_ID_ERROR_MESSAGE = 'Customer Id needs to be present and needs to have a length of less than 17 characters'
5
+
6
+ # Error message which is shown when {Client#customer_id} validation fails
7
+ CUSTOMER_ID_ERROR_MESSAGE =
8
+ 'Customer Id needs to be present and needs to have a length of less than 17 characters'
9
+
10
+ # Error message which is shown when {Client#environment} validation fails
4
11
  ENVIRONMENT_ERROR_MESSAGE = 'Environment needs to be either production or test'
12
+
13
+ # Error message which is shown when {Client#target_id} validation fails
5
14
  TARGET_ID_ERROR_MESSAGE = 'Target Id needs to be present and under 80 characters'
15
+
16
+ # Error message which is shown when {Client#file_type} validation fails
6
17
  FILE_TYPE_ERROR_MESSAGE = 'File type needs to be present and under 35 characters'
18
+
19
+ # Error message which is shown when {Client#content} validation fails
7
20
  CONTENT_ERROR_MESSAGE = 'Content needs to be present for this command'
21
+
22
+ # Error message which is shown when {Client#signing_csr} validation fails
8
23
  SIGNING_CERT_REQUEST_ERROR_MESSAGE = 'Invalid signing certificate request'
24
+
25
+ # Error message which is shown when {Client#encryption_csr} validation fails
9
26
  ENCRYPTION_CERT_REQUEST_ERROR_MESSAGE = 'Invalid encryption certificate request'
10
- PIN_ERROR_MESSAGE = 'Pin needs to be present for this command and cannot be more than 10 characters'
27
+
28
+ # Error message which is shown when {Client#pin} validation fails
29
+ PIN_ERROR_MESSAGE =
30
+ 'Pin needs to be present for this command and cannot be more than 10 characters'
31
+
32
+ # Error message which is shown when {Client#bank_encryption_certificate} validation fails
11
33
  ENCRYPTION_CERT_ERROR_MESSAGE = 'Invalid encryption certificate'
12
- STATUS_ERROR_MESSAGE = 'Status is required for this command and must be either NEW, DOWNLOADED or ALL'
13
- FILE_REFERENCE_ERROR_MESSAGE = 'File reference is required for this command and must be under 33 characters'
14
- ENCRYPTION_PRIVATE_KEY_ERROR_MESSAGE = 'Encryption private key is needed for this bank and this command'
15
- NOT_OK_RESPONSE_CODE_ERROR_MESSAGE = 'The response from the bank suggested there was ' \
16
- 'something wrong with your request, check your parameters and try again'
17
34
 
18
- DECRYPTION_ERROR_MESSAGE = 'The response could not be decrypted with the private key ' \
19
- 'that you gave. Check that the key is the private key of your own encryption certificate'
35
+ # Error message which is shown when {Client#status} validation fails
36
+ STATUS_ERROR_MESSAGE =
37
+ 'Status is required for this command and must be either NEW, DOWNLOADED or ALL'
38
+
39
+ # Error message which is shown when {Client#file_reference} validation fails
40
+ FILE_REFERENCE_ERROR_MESSAGE =
41
+ 'File reference is required for this command and must be under 33 characters'
42
+
43
+ # Error message which is shown when {Client#encryption_private_key} validation fails
44
+ ENCRYPTION_PRIVATE_KEY_ERROR_MESSAGE =
45
+ 'Encryption private key is needed for this bank and this command'
46
+
47
+ # Error message which is shown when {Response#response_code} validation fails
48
+ NOT_OK_RESPONSE_CODE_ERROR_MESSAGE =
49
+ 'The response from the bank suggested there was something wrong with your request, check ' \
50
+ 'your parameters and try again'
51
+
52
+ # Error message which is shown when the response got from the bank cannot be decrypted with the
53
+ # private key that is given to the client
54
+ DECRYPTION_ERROR_MESSAGE =
55
+ 'The response could not be decrypted with the private key that you gave. Check that the ' \
56
+ 'key is the private key of your own encryption certificate'
20
57
 
21
- HASH_ERROR_MESSAGE = 'The hashes in the response did not match which means that the data in ' \
22
- 'the response is not intact'
58
+ # Error message which is shown when the hash embedded in the {Response} soap doesn't match the
59
+ # locally calculated one.
60
+ HASH_ERROR_MESSAGE =
61
+ 'The hashes in the response did not match which means that the data in the response is not ' \
62
+ 'intact'
23
63
 
24
- SIGNATURE_ERROR_MESSAGE = 'The signature in the response did not verify and the response ' \
25
- 'cannot be trusted'
64
+ # Error message which is shown when the signature in {Response} cannot be verified.
65
+ SIGNATURE_ERROR_MESSAGE =
66
+ 'The signature in the response did not verify and the response cannot be trusted'
26
67
  end
27
68
  end