epics 2.11.0 → 3.0.0.rc1

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.
Files changed (245) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -1
  3. data/.semaphore/semaphore.yml +17 -8
  4. data/CHANGELOG.md +93 -0
  5. data/EBICS_REFERENCES.md +169 -0
  6. data/README.md +219 -50
  7. data/lib/epics/azv.rb +3 -10
  8. data/lib/epics/b2b.rb +3 -10
  9. data/lib/epics/bka.rb +3 -14
  10. data/lib/epics/builders/body_builder/base.rb +26 -0
  11. data/lib/epics/builders/body_builder/v2.rb +9 -0
  12. data/lib/epics/builders/body_builder/v3.rb +9 -0
  13. data/lib/epics/builders/body_builder.rb +6 -0
  14. data/lib/epics/builders/data_encryption_info_builder.rb +29 -0
  15. data/lib/epics/builders/data_transfer_builder/base.rb +52 -0
  16. data/lib/epics/builders/data_transfer_builder/v2.rb +9 -0
  17. data/lib/epics/builders/data_transfer_builder/v3.rb +12 -0
  18. data/lib/epics/builders/data_transfer_builder.rb +6 -0
  19. data/lib/epics/builders/header_builder/base.rb +26 -0
  20. data/lib/epics/builders/header_builder/v2.rb +9 -0
  21. data/lib/epics/builders/header_builder/v3.rb +9 -0
  22. data/lib/epics/builders/header_builder.rb +6 -0
  23. data/lib/epics/builders/mutable_builder.rb +28 -0
  24. data/lib/epics/builders/order_details_builder/base.rb +100 -0
  25. data/lib/epics/builders/order_details_builder/v2.rb +21 -0
  26. data/lib/epics/builders/order_details_builder/v3.rb +51 -0
  27. data/lib/epics/builders/order_details_builder.rb +10 -0
  28. data/lib/epics/builders/request_builder.rb +25 -0
  29. data/lib/epics/builders/static_builder/base.rb +75 -0
  30. data/lib/epics/builders/static_builder/v2.rb +9 -0
  31. data/lib/epics/builders/static_builder/v3.rb +9 -0
  32. data/lib/epics/builders/static_builder.rb +9 -0
  33. data/lib/epics/builders/transfer_receipt_builder.rb +19 -0
  34. data/lib/epics/builders/xml_builder/base.rb +92 -0
  35. data/lib/epics/builders/xml_builder/v24.rb +31 -0
  36. data/lib/epics/builders/xml_builder/v25.rb +31 -0
  37. data/lib/epics/builders/xml_builder/v3.rb +31 -0
  38. data/lib/epics/builders/xml_builder.rb +7 -0
  39. data/lib/epics/builders.rb +13 -0
  40. data/lib/epics/c2s.rb +3 -10
  41. data/lib/epics/c52.rb +2 -14
  42. data/lib/epics/c53.rb +2 -14
  43. data/lib/epics/c54.rb +2 -14
  44. data/lib/epics/c5n.rb +3 -14
  45. data/lib/epics/ccs.rb +3 -10
  46. data/lib/epics/cct.rb +3 -10
  47. data/lib/epics/cd1.rb +3 -10
  48. data/lib/epics/cdb.rb +3 -10
  49. data/lib/epics/cdd.rb +3 -10
  50. data/lib/epics/cds.rb +3 -10
  51. data/lib/epics/cdz.rb +3 -14
  52. data/lib/epics/cip.rb +3 -10
  53. data/lib/epics/client.rb +489 -125
  54. data/lib/epics/crypt/aes.rb +56 -0
  55. data/lib/epics/crypt/x_509.rb +52 -0
  56. data/lib/epics/crypt.rb +5 -0
  57. data/lib/epics/crz.rb +3 -14
  58. data/lib/epics/factories/crypt/aes_factory.rb +5 -0
  59. data/lib/epics/factories/crypt.rb +4 -0
  60. data/lib/epics/factories/request_factory/base.rb +236 -0
  61. data/lib/epics/factories/request_factory/v2.rb +194 -0
  62. data/lib/epics/factories/request_factory/v24.rb +32 -0
  63. data/lib/epics/factories/request_factory/v25.rb +31 -0
  64. data/lib/epics/factories/request_factory/v3.rb +305 -0
  65. data/lib/epics/factories/request_factory.rb +8 -0
  66. data/lib/epics/factories.rb +5 -0
  67. data/lib/epics/fdl.rb +3 -18
  68. data/lib/epics/ful.rb +3 -15
  69. data/lib/epics/generic_request.rb +31 -92
  70. data/lib/epics/generic_upload_request.rb +14 -67
  71. data/lib/epics/haa.rb +3 -9
  72. data/lib/epics/hac.rb +3 -14
  73. data/lib/epics/handlers/auth_signature_handler.rb +102 -0
  74. data/lib/epics/handlers/order_data_handler/base.rb +98 -0
  75. data/lib/epics/handlers/order_data_handler/v2.rb +39 -0
  76. data/lib/epics/handlers/order_data_handler/v24.rb +11 -0
  77. data/lib/epics/handlers/order_data_handler/v25.rb +11 -0
  78. data/lib/epics/handlers/order_data_handler/v3.rb +41 -0
  79. data/lib/epics/handlers/order_data_handler.rb +8 -0
  80. data/lib/epics/handlers/user_signature_handler/base.rb +10 -0
  81. data/lib/epics/handlers/user_signature_handler/v2.rb +17 -0
  82. data/lib/epics/handlers/user_signature_handler/v3.rb +17 -0
  83. data/lib/epics/handlers/user_signature_handler.rb +6 -0
  84. data/lib/epics/handlers.rb +6 -0
  85. data/lib/epics/hev.rb +2 -15
  86. data/lib/epics/hia.rb +4 -55
  87. data/lib/epics/hkd.rb +3 -9
  88. data/lib/epics/hpb.rb +3 -13
  89. data/lib/epics/hpd.rb +3 -9
  90. data/lib/epics/htd.rb +3 -9
  91. data/lib/epics/ini.rb +4 -46
  92. data/lib/epics/keyring.rb +17 -0
  93. data/lib/epics/letter_renderer.rb +17 -22
  94. data/lib/epics/ptk.rb +3 -14
  95. data/lib/epics/response.rb +34 -29
  96. data/lib/epics/services/crypt_service.rb +62 -0
  97. data/lib/epics/services/digest_resolver/base.rb +30 -0
  98. data/lib/epics/services/digest_resolver/v2.rb +13 -0
  99. data/lib/epics/services/digest_resolver/v3.rb +19 -0
  100. data/lib/epics/services/digest_resolver.rb +6 -0
  101. data/lib/epics/services.rb +5 -0
  102. data/lib/epics/signature.rb +50 -0
  103. data/lib/epics/{key.rb → signature_algorithm/base.rb} +14 -21
  104. data/lib/epics/signature_algorithm/rsa.rb +50 -0
  105. data/lib/epics/signature_algorithm/rsapkcs1.rb +16 -0
  106. data/lib/epics/signature_algorithm/rsapss.rb +20 -0
  107. data/lib/epics/signature_algorithm.rb +2 -0
  108. data/lib/epics/sta.rb +3 -14
  109. data/lib/epics/version.rb +1 -1
  110. data/lib/epics/vmk.rb +3 -14
  111. data/lib/epics/wss.rb +3 -9
  112. data/lib/epics/xct.rb +3 -10
  113. data/lib/epics/xds.rb +3 -10
  114. data/lib/epics/xe2.rb +3 -10
  115. data/lib/epics/xe3.rb +3 -10
  116. data/lib/epics/xek.rb +5 -0
  117. data/lib/epics/yct.rb +6 -0
  118. data/lib/epics/z01.rb +2 -14
  119. data/lib/epics/z52.rb +2 -14
  120. data/lib/epics/z53.rb +2 -14
  121. data/lib/epics/z54.rb +2 -14
  122. data/lib/epics/zsr.rb +5 -0
  123. data/lib/epics.rb +68 -5
  124. data/lib/letter/ini.erb +27 -6
  125. data/spec/aes_spec.rb +46 -0
  126. data/spec/auth_signature_handler_spec.rb +58 -0
  127. data/spec/builders_spec.rb +616 -0
  128. data/spec/certificate_handling_spec.rb +189 -0
  129. data/spec/client_setup_block_spec.rb +41 -0
  130. data/spec/client_spec.rb +143 -91
  131. data/spec/crypt_service_spec.rb +132 -0
  132. data/spec/date_range_spec.rb +46 -0
  133. data/spec/digest_resolver_spec.rb +164 -0
  134. data/spec/fixtures/bank_x509.pem +3 -0
  135. data/spec/fixtures/xml/haa.xml +40 -1
  136. data/spec/fixtures/xml/haa_receipt.xml +33 -30
  137. data/spec/fixtures/xml/haa_response_h004.xml +4 -0
  138. data/spec/fixtures/xml/haa_response_h005.xml +38 -0
  139. data/spec/fixtures/xml/hia_request_order_data.xml +24 -1
  140. data/spec/fixtures/xml/hpb_request.xml +1 -1
  141. data/spec/fixtures/xml/hpb_response_x509.xml +16 -0
  142. data/spec/fixtures/xml/htd_order_data_h005.xml +55 -0
  143. data/spec/fixtures/xml/jruby/hia.xml +20 -22
  144. data/spec/fixtures/xml/jruby/ini.xml +1 -3
  145. data/spec/fixtures/xml/ruby/hia.xml +21 -1
  146. data/spec/fixtures/xml/ruby/ini.xml +21 -1
  147. data/spec/handlers_spec.rb +267 -0
  148. data/spec/hpb_malformed_certificate_spec.rb +36 -0
  149. data/spec/key_file_decryption_spec.rb +27 -0
  150. data/spec/key_file_preservation_spec.rb +78 -0
  151. data/spec/keyring_spec.rb +349 -0
  152. data/spec/middleware/parse_ebics_spec.rb +2 -1
  153. data/spec/order_id_spec.rb +65 -0
  154. data/spec/orders/azv_spec.rb +63 -7
  155. data/spec/orders/b2b_spec.rb +68 -3
  156. data/spec/orders/bka_spec.rb +34 -4
  157. data/spec/orders/c2s_spec.rb +62 -9
  158. data/spec/orders/c52_spec.rb +34 -4
  159. data/spec/orders/c53_spec.rb +34 -4
  160. data/spec/orders/c54_spec.rb +36 -4
  161. data/spec/orders/c5n_spec.rb +36 -4
  162. data/spec/orders/camt_parity_spec.rb +80 -0
  163. data/spec/orders/ccs_spec.rb +62 -9
  164. data/spec/orders/cct_spec.rb +83 -9
  165. data/spec/orders/cd1_spec.rb +50 -7
  166. data/spec/orders/cdb_spec.rb +64 -7
  167. data/spec/orders/cdd_spec.rb +64 -7
  168. data/spec/orders/cds_spec.rb +74 -0
  169. data/spec/orders/cdz_spec.rb +67 -4
  170. data/spec/orders/cip_spec.rb +61 -9
  171. data/spec/orders/crz_spec.rb +67 -4
  172. data/spec/orders/fdl_spec.rb +143 -13
  173. data/spec/orders/ful_spec.rb +51 -10
  174. data/spec/orders/haa_spec.rb +115 -9
  175. data/spec/orders/hac_spec.rb +89 -10
  176. data/spec/orders/hev_spec.rb +1 -6
  177. data/spec/orders/hia_spec.rb +25 -22
  178. data/spec/orders/hkd_spec.rb +23 -4
  179. data/spec/orders/hpb_spec.rb +7 -4
  180. data/spec/orders/hpd_spec.rb +23 -4
  181. data/spec/orders/htd_spec.rb +23 -4
  182. data/spec/orders/ini_spec.rb +23 -18
  183. data/spec/orders/ptk_spec.rb +27 -4
  184. data/spec/orders/sta_spec.rb +129 -11
  185. data/spec/orders/vmk_spec.rb +36 -4
  186. data/spec/orders/wss_spec.rb +29 -3
  187. data/spec/orders/x_509_certificate_spec.rb +9 -1
  188. data/spec/orders/xct_spec.rb +63 -0
  189. data/spec/orders/xds_spec.rb +13 -6
  190. data/spec/orders/xe2_spec.rb +64 -7
  191. data/spec/orders/xe3_spec.rb +64 -7
  192. data/spec/orders/xek_spec.rb +31 -0
  193. data/spec/orders/yct_spec.rb +43 -0
  194. data/spec/orders/z01_spec.rb +34 -4
  195. data/spec/orders/z52_spec.rb +34 -4
  196. data/spec/orders/z53_spec.rb +34 -4
  197. data/spec/orders/z54_spec.rb +36 -4
  198. data/spec/orders/zsr_spec.rb +31 -0
  199. data/spec/request_factory_spec.rb +444 -0
  200. data/spec/response_business_error_spec.rb +45 -0
  201. data/spec/response_validation_spec.rb +23 -0
  202. data/spec/{key_spec.rb → signature_algorithm/rsa_pss_spec.rb} +4 -13
  203. data/spec/support/ebics_matcher.rb +17 -9
  204. data/spec/support/ebics_shared_examples.rb +642 -0
  205. data/spec/support/h005_client_helper.rb +23 -0
  206. data/spec/upload_digest_spec.rb +69 -0
  207. data/spec/user_signature_handler_spec.rb +25 -0
  208. data/spec/version_support_error_spec.rb +76 -0
  209. data/spec/xsd/{ebics_hev.xsd → H000/ebics_hev.xsd} +0 -0
  210. data/spec/xsd/H003/ebics.xsd +11 -0
  211. data/spec/xsd/H003/ebics_keymgmt_request.xsd +555 -0
  212. data/spec/xsd/H003/ebics_keymgmt_response.xsd +131 -0
  213. data/spec/xsd/H003/ebics_orders.xsd +1811 -0
  214. data/spec/xsd/H003/ebics_request.xsd +354 -0
  215. data/spec/xsd/H003/ebics_response.xsd +161 -0
  216. data/spec/xsd/{ebics_signature.xsd → H003/ebics_signature.xsd} +0 -0
  217. data/spec/xsd/H003/ebics_types.xsd +2361 -0
  218. data/spec/xsd/H003/xmldsig-core-schema.xsd +318 -0
  219. data/spec/xsd/H004/ebics_signature.xsd +217 -0
  220. data/spec/xsd/H005/ebics_H005.xsd +11 -0
  221. data/spec/xsd/H005/ebics_keymgmt_request_H005.xsd +523 -0
  222. data/spec/xsd/H005/ebics_keymgmt_response_H005.xsd +137 -0
  223. data/spec/xsd/H005/ebics_orders_H005.xsd +2094 -0
  224. data/spec/xsd/H005/ebics_request_H005.xsd +349 -0
  225. data/spec/xsd/H005/ebics_response_H005.xsd +167 -0
  226. data/spec/xsd/H005/ebics_signature_S002.xsd +177 -0
  227. data/spec/xsd/H005/ebics_types_H005.xsd +1885 -0
  228. data/spec/xsd/H005/xmldsig-core-schema.xsd +318 -0
  229. metadata +197 -36
  230. data/lib/epics/header_request.rb +0 -58
  231. data/lib/epics/middleware/xmlsig.rb +0 -16
  232. data/lib/epics/signer.rb +0 -40
  233. data/lib/epics/x_509_certificate.rb +0 -15
  234. data/lib/letter/ini_with_certs.erb +0 -335
  235. data/spec/generic_upload_spec.rb +0 -58
  236. data/spec/hpb_spec.rb +0 -15
  237. data/spec/signer_spec.rb +0 -34
  238. /data/spec/xsd/{ebics_H004.xsd → H004/ebics_H004.xsd} +0 -0
  239. /data/spec/xsd/{ebics_keymgmt_request_H004.xsd → H004/ebics_keymgmt_request_H004.xsd} +0 -0
  240. /data/spec/xsd/{ebics_keymgmt_response_H004.xsd → H004/ebics_keymgmt_response_H004.xsd} +0 -0
  241. /data/spec/xsd/{ebics_orders_H004.xsd → H004/ebics_orders_H004.xsd} +0 -0
  242. /data/spec/xsd/{ebics_request_H004.xsd → H004/ebics_request_H004.xsd} +0 -0
  243. /data/spec/xsd/{ebics_response_H004.xsd → H004/ebics_response_H004.xsd} +0 -0
  244. /data/spec/xsd/{ebics_types_H004.xsd → H004/ebics_types_H004.xsd} +0 -0
  245. /data/spec/xsd/{xmldsig-core-schema.xsd → H004/xmldsig-core-schema.xsd} +0 -0
@@ -0,0 +1,305 @@
1
+ class Epics::Factories::RequestFactory::V3 < Epics::Factories::RequestFactory::Base
2
+ def initialize(client)
3
+ @digest_resolver = Epics::Services::DigestResolver::V3.new
4
+ @user_signature_handle = Epics::Handlers::UserSignatureHandler::V3.new(client)
5
+ @crypt_service = Epics::Services::CryptService.new
6
+ super
7
+ end
8
+
9
+ def create_btd(options = {})
10
+ auth_signature_handler = Epics::Handlers::AuthSignatureHandler.new(@client.keyring)
11
+ request_builder.add_container_secured do |xml_builder|
12
+ xml_builder.add_header do |header_builder|
13
+ header_builder.add_static do |static_builder|
14
+ static_builder.add_host_id @client.host_id
15
+ static_builder.add_random_nonce
16
+ static_builder.add_timestamp Time.now.utc
17
+ static_builder.add_partner_id @client.partner_id
18
+ static_builder.add_user_id @client.user_id
19
+ static_builder.add_product @client.product_name, @client.locale
20
+ static_builder.add_order_details do |order_details_builder|
21
+ add_order_type(order_details_builder, 'BTD')
22
+ order_details_builder.add_btd_order_params **options
23
+ end
24
+ static_builder.add_bank_pubbey_digests(
25
+ @client.keyring.bank_authentication.version,
26
+ @digest_resolver.sign_digest(@client.keyring.bank_authentication),
27
+ @client.keyring.bank_encryption.version,
28
+ @digest_resolver.sign_digest(@client.keyring.bank_encryption)
29
+ )
30
+ static_builder.add_security_medium Epics::Builders::StaticBuilder::SECURITY_MEDIUM_0000
31
+ end
32
+ header_builder.add_mutable do |mutable_builder|
33
+ mutable_builder.add_transaction_phase Epics::Builders::MutableBuilder::PHASE_INITIALIZATION
34
+ end
35
+ end
36
+ xml_builder.add_body
37
+ auth_signature_handler.handle(xml_builder)
38
+ end
39
+ end
40
+
41
+ def create_btu(transaction_key, digest, num_segments, options = {})
42
+ signature_data = @user_signature_handle.handle(digest).to_xml
43
+ auth_signature_handler = Epics::Handlers::AuthSignatureHandler.new(@client.keyring)
44
+ request_builder.add_container_secured do |xml_builder|
45
+ xml_builder.add_header do |header_builder|
46
+ header_builder.add_static do |static_builder|
47
+ static_builder.add_host_id @client.host_id
48
+ static_builder.add_random_nonce
49
+ static_builder.add_timestamp Time.now.utc
50
+ static_builder.add_partner_id @client.partner_id
51
+ static_builder.add_user_id @client.user_id
52
+ static_builder.add_product @client.product_name, @client.locale
53
+ static_builder.add_order_details do |order_details_builder|
54
+ add_order_type(order_details_builder, 'BTU')
55
+ order_details_builder.add_btu_order_params **options
56
+ end
57
+ static_builder.add_bank_pubbey_digests(
58
+ @client.keyring.bank_authentication.version,
59
+ @digest_resolver.sign_digest(@client.keyring.bank_authentication),
60
+ @client.keyring.bank_encryption.version,
61
+ @digest_resolver.sign_digest(@client.keyring.bank_encryption)
62
+ )
63
+ static_builder.add_security_medium Epics::Builders::StaticBuilder::SECURITY_MEDIUM_0000
64
+ static_builder.add_num_segments num_segments
65
+ end
66
+ header_builder.add_mutable do |mutable_builder|
67
+ mutable_builder.add_transaction_phase Epics::Builders::MutableBuilder::PHASE_INITIALIZATION
68
+ end
69
+ end
70
+ xml_builder.add_body do |body_builder|
71
+ body_builder.add_data_transfer do |data_transfer_builder|
72
+ data_transfer_builder.add_data_encryption_info do |data_encryption_info_builder|
73
+ data_encryption_info_builder.add_encryption_pubkey_digest @client.keyring
74
+ data_encryption_info_builder.add_transaction_key transaction_key, @client.keyring
75
+ end
76
+ data_transfer_builder.add_signature_data signature_data, transaction_key
77
+ data_transfer_builder.add_data_digest @client.keyring.user_signature.version, digest
78
+ data_transfer_builder.add_additional_order_info
79
+ end
80
+ end
81
+ auth_signature_handler.handle(xml_builder)
82
+ end
83
+ end
84
+
85
+ # Client#C52 unzips the response, so the request has to ask for a ZIP container.
86
+ def create_c52(start_date, end_date, scope: nil, msg_name_version: nil, container_type: 'ZIP')
87
+ create_btd(
88
+ service_name: 'STM',
89
+ msg_name: 'camt.052',
90
+ scope: scope,
91
+ msg_name_version: msg_name_version,
92
+ container_type: container_type,
93
+ start_date: start_date,
94
+ end_date: end_date
95
+ )
96
+ end
97
+
98
+ def create_c53(start_date, end_date, scope: nil, msg_name_version: nil, container_type: 'ZIP')
99
+ create_btd(
100
+ service_name: 'EOP',
101
+ msg_name: 'camt.053',
102
+ container_type: container_type,
103
+ scope: scope,
104
+ msg_name_version: msg_name_version,
105
+ start_date: start_date,
106
+ end_date: end_date
107
+ )
108
+ end
109
+
110
+ def create_c54(start_date, end_date, scope: nil, msg_name_version: nil, container_type: 'ZIP')
111
+ create_btd(
112
+ service_name: 'REP',
113
+ msg_name: 'camt.054',
114
+ scope: scope,
115
+ msg_name_version: msg_name_version,
116
+ container_type: container_type,
117
+ start_date: start_date,
118
+ end_date: end_date
119
+ )
120
+ end
121
+
122
+ def create_sta(start_date, end_date)
123
+ create_btd(service_name: 'EOP', msg_name: 'mt940', start_date: start_date, end_date: end_date)
124
+ end
125
+
126
+ def create_vmk(start_date, end_date)
127
+ create_btd(service_name: 'STM', msg_name: 'mt942', start_date: start_date, end_date: end_date)
128
+ end
129
+ def create_z52(start_date, end_date, scope: nil, service_option: nil,
130
+ msg_name_version: nil, container_type: 'ZIP')
131
+ create_btd(
132
+ service_name: 'STM',
133
+ msg_name: 'camt.052',
134
+ scope: scope,
135
+ service_option: service_option,
136
+ msg_name_version: msg_name_version,
137
+ container_type: container_type,
138
+ start_date: start_date,
139
+ end_date: end_date
140
+ )
141
+ end
142
+ def create_z53(start_date, end_date, scope: nil, service_option: nil,
143
+ msg_name_version: nil, container_type: 'ZIP')
144
+ create_btd(
145
+ service_name: 'EOP',
146
+ msg_name: 'camt.053',
147
+ scope: scope,
148
+ service_option: service_option,
149
+ msg_name_version: msg_name_version,
150
+ container_type: container_type,
151
+ start_date: start_date,
152
+ end_date: end_date
153
+ )
154
+ end
155
+ def create_z54(start_date, end_date, scope: nil, service_option: 'XQRR',
156
+ msg_name_version: nil, container_type: 'ZIP')
157
+ create_btd(
158
+ service_name: 'EOP',
159
+ msg_name: 'camt.054',
160
+ scope: scope,
161
+ service_option: service_option,
162
+ msg_name_version: msg_name_version,
163
+ container_type: container_type,
164
+ start_date: start_date,
165
+ end_date: end_date
166
+ )
167
+ end
168
+ def create_xek(start_date, end_date, scope: nil, service_option: nil,
169
+ msg_name_version: nil, container_type: 'ZIP')
170
+ create_btd(
171
+ service_name: 'EOP',
172
+ msg_name: 'pdf',
173
+ scope: scope,
174
+ service_option: service_option,
175
+ msg_name_version: msg_name_version,
176
+ container_type: container_type,
177
+ start_date: start_date,
178
+ end_date: end_date
179
+ )
180
+ end
181
+ def create_z01(start_date, end_date, scope: nil, service_option: 'CH003GEN',
182
+ msg_name_version: nil, container_type: 'ZIP')
183
+ create_btd(
184
+ service_name: 'PSR',
185
+ msg_name: 'pain.002',
186
+ scope: scope,
187
+ service_option: service_option,
188
+ msg_name_version: msg_name_version,
189
+ container_type: container_type,
190
+ start_date: start_date,
191
+ end_date: end_date
192
+ )
193
+ end
194
+
195
+ def create_bka(start_date, end_date)
196
+ create_btd(service_name: 'EOP', scope: 'DE', msg_name: 'camt.053', container_type: 'ZIP', start_date: start_date, end_date: end_date)
197
+ end
198
+
199
+ def create_c5n(start_date, end_date)
200
+ create_btd(service_name: 'STM', scope: 'DE', service_option: 'SCI', msg_name: 'camt.054', container_type: 'ZIP', start_date: start_date, end_date: end_date)
201
+ end
202
+
203
+ def create_cdz(start_date, end_date)
204
+ create_btd(service_name: 'REP', scope: 'DE', service_option: 'SDD', msg_name: 'pain.002', container_type: 'ZIP', start_date: start_date, end_date: end_date)
205
+ end
206
+
207
+ def create_crz(start_date, end_date)
208
+ create_btd(service_name: 'REP', scope: 'DE', service_option: 'SCT', msg_name: 'pain.002', container_type: 'ZIP', start_date: start_date, end_date: end_date)
209
+ end
210
+
211
+ def create_azv(digest, transaction_key, **overrides)
212
+ create_btu(transaction_key, digest, 1, **{ service_name: 'XCT', scope: 'DE', msg_name: 'dtazv', filename: 'azv.dtazv.xxx.xml' }.merge(overrides))
213
+ end
214
+
215
+ def create_b2b(digest, transaction_key, **overrides)
216
+ create_btu(transaction_key, digest, 1, **{ service_name: 'SDD', scope: 'BIL', service_option: 'B2B', msg_name: 'pain.008', filename: 'b2b.pain.008.xxx.xml' }.merge(overrides))
217
+ end
218
+
219
+ def create_ccs(digest, transaction_key, **overrides)
220
+ create_btu(transaction_key, digest, 1, **{ service_name: 'SCT', scope: 'DE', msg_name: 'pain.001', filename: 'ccs.pain.001.xxx.xml' }.merge(overrides))
221
+ end
222
+
223
+ def create_cds(digest, transaction_key, **overrides)
224
+ create_btu(transaction_key, digest, 1, **{ service_name: 'SDD', scope: 'BIL', msg_name: 'pain.008', filename: 'cds.pain.008.xxx.xml' }.merge(overrides))
225
+ end
226
+
227
+ def create_c2s(digest, transaction_key, **overrides)
228
+ create_btu(transaction_key, digest, 1, **{ service_name: 'SDD', scope: 'BIL', msg_name: 'pain.008', filename: 'c2s.pain.008.xxx.xml' }.merge(overrides))
229
+ end
230
+
231
+ def create_ful(*, **)
232
+ raise Epics::VersionSupportError.new(3.0, 'below')
233
+ end
234
+
235
+ def create_fdl(*, **)
236
+ raise Epics::VersionSupportError.new(3.0, 'below')
237
+ end
238
+
239
+ def create_cd1(*, **)
240
+ raise Epics::VersionSupportError.new(3.0, 'below')
241
+ end
242
+
243
+ def create_wss(*, **)
244
+ raise Epics::VersionSupportError.new(3.0, 'below')
245
+ end
246
+
247
+ def create_xds(*, **)
248
+ raise Epics::VersionSupportError.new(3.0, 'below')
249
+ end
250
+
251
+ def create_xct(*, **)
252
+ raise Epics::VersionSupportError.new(3.0, 'below')
253
+ end
254
+ def create_zsr(start_date, end_date, scope: 'BIL', service_option: nil,
255
+ msg_name_version: nil, container_type: 'ZIP')
256
+ create_btd(
257
+ service_name: 'PSR',
258
+ msg_name: 'pain.002',
259
+ scope: scope,
260
+ service_option: service_option,
261
+ msg_name_version: msg_name_version,
262
+ container_type: container_type,
263
+ start_date: start_date,
264
+ end_date: end_date
265
+ )
266
+ end
267
+
268
+ def create_cct(digest, transaction_key, **overrides)
269
+ create_btu(transaction_key, digest, 1, **{ service_name: 'SCT', scope: 'DE', msg_name: 'pain.001', filename: 'cct.pain.001.xxx.xml' }.merge(overrides))
270
+ end
271
+
272
+ def create_cdd(digest, transaction_key, **overrides)
273
+ create_btu(transaction_key, digest, 1, **{ service_name: 'SDD', scope: 'DE', msg_name: 'pain.008', service_option: 'COR', filename: 'cdd.pain.008.xxx.xml' }.merge(overrides))
274
+ end
275
+
276
+ def create_cdb(digest, transaction_key, **overrides)
277
+ create_btu(transaction_key, digest, 1, **{ service_name: 'SDD', msg_name: 'pain.008', service_option: 'B2B', filename: 'cdb.pain.008.xxx.xml' }.merge(overrides))
278
+ end
279
+
280
+ def create_cip(digest, transaction_key, **overrides)
281
+ create_btu(transaction_key, digest, 1, **{ service_name: 'SCI', msg_name: 'pain.001', filename: 'cip.pain.001.xxx.xml' }.merge(overrides))
282
+ end
283
+
284
+ def create_xe2(digest, transaction_key, **overrides)
285
+ create_btu(transaction_key, digest, 1, **{ service_name: 'MCT', msg_name: 'pain.001', filename: 'xe2.pain.001.xxx.xml' }.merge(overrides))
286
+ end
287
+
288
+ def create_xe3(digest, transaction_key, **overrides)
289
+ create_btu(transaction_key, digest, 1, **{ service_name: 'SDD', msg_name: 'pain.008', filename: 'xe3.pain.008.xxx.xml' }.merge(overrides))
290
+ end
291
+
292
+ def create_yct(digest, transaction_key, **overrides)
293
+ create_btu(transaction_key, digest, 1, **{ service_name: 'MCT', scope: 'BIL', msg_name: 'pain.001', filename: 'yct.pain.001.xxx.xml' }.merge(overrides))
294
+ end
295
+
296
+ protected
297
+
298
+ def xml_builder
299
+ Epics::Builders::XmlBuilder::V3.new
300
+ end
301
+
302
+ def add_order_type(order_details_builder, order_type, with_es = false)
303
+ order_details_builder.add_admin_order_type order_type
304
+ end
305
+ end
@@ -0,0 +1,8 @@
1
+ module Epics::Factories::RequestFactory
2
+ end
3
+
4
+ require 'epics/factories/request_factory/base'
5
+ require 'epics/factories/request_factory/v2'
6
+ require 'epics/factories/request_factory/v24'
7
+ require 'epics/factories/request_factory/v25'
8
+ require 'epics/factories/request_factory/v3'
@@ -0,0 +1,5 @@
1
+ module Epics::Factories
2
+ end
3
+
4
+ require 'epics/factories/crypt'
5
+ require 'epics/factories/request_factory'
data/lib/epics/fdl.rb CHANGED
@@ -1,23 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class Epics::FDL < Epics::GenericRequest
4
- def header
5
- fdl_order_params = Hash.new.tap do |params|
6
- params[:DateRange] = {
7
- Start: options[:from],
8
- End: options[:to],
9
- } if options[:from] && options[:to]
10
- params[:FileFormat] = options[:file_format]
11
- end
12
-
13
- client.header_request.build(
14
- nonce: nonce,
15
- timestamp: timestamp,
16
- order_type: 'FDL',
17
- order_attribute: 'DZHNN',
18
- order_id: 'A00A',
19
- custom_order_params: { FDLOrderParams: fdl_order_params },
20
- mutable: { TransactionPhase: 'Initialisation' }
21
- )
4
+ def to_xml
5
+ builder = request_factory.create_fdl(options[:file_format], options[:from], options[:to])
6
+ builder.to_xml
22
7
  end
23
8
  end
data/lib/epics/ful.rb CHANGED
@@ -1,18 +1,6 @@
1
- # frozen_string_literal: true
2
-
3
1
  class Epics::FUL < Epics::GenericUploadRequest
4
- def header
5
- ful_order_params = Hash.new.tap do |params|
6
- params[:FileFormat] = options[:file_format]
7
- end
8
-
9
- client.header_request.build(
10
- nonce: nonce,
11
- timestamp: timestamp,
12
- order_type: 'FUL',
13
- order_attribute: 'DZHNN',
14
- custom_order_params: { FULOrderParams: ful_order_params },
15
- mutable: { TransactionPhase: 'Initialisation' }
16
- )
2
+ def to_xml
3
+ builder = request_factory.create_ful(document_digest, transaction_key, file_format: options[:file_format])
4
+ builder.to_xml
17
5
  end
18
6
  end
@@ -8,115 +8,54 @@ class Epics::GenericRequest
8
8
  @options = options
9
9
  end
10
10
 
11
- def nonce
12
- SecureRandom.hex(16)
11
+ def request_factory
12
+ @request_factory ||= case client.version
13
+ when Epics::Keyring::VERSION_25
14
+ Epics::Factories::RequestFactory::V25.new(client)
15
+ when Epics::Keyring::VERSION_24
16
+ Epics::Factories::RequestFactory::V24.new(client)
17
+ when Epics::Keyring::VERSION_30
18
+ Epics::Factories::RequestFactory::V3.new(client)
19
+ end
13
20
  end
14
21
 
15
- def timestamp
16
- Time.now.utc.iso8601
22
+ def order_data_handle
23
+ @order_data_handle ||= case client.version
24
+ when Epics::Keyring::VERSION_25
25
+ Epics::Handlers::OrderDataHandler::V25.new(client)
26
+ when Epics::Keyring::VERSION_24
27
+ Epics::Handlers::OrderDataHandler::V24.new(client)
28
+ when Epics::Keyring::VERSION_30
29
+ Epics::Handlers::OrderDataHandler::V3.new(client)
30
+ end
17
31
  end
18
32
 
19
- def_delegators :client, :host_id, :user_id, :partner_id
20
-
21
- def root
22
- "ebicsRequest"
33
+ # BTF service parameters for the request, i.e. everything but the date range.
34
+ # Compacted so unset options fall through to the factory defaults.
35
+ def service_options
36
+ options.except(:from, :to).compact
23
37
  end
24
38
 
25
- def body
26
- Nokogiri::XML::Builder.new do |xml|
27
- xml.body
28
- end.doc.root
39
+ def nonce
40
+ SecureRandom.hex(16)
29
41
  end
30
42
 
31
- def header
32
- raise NotImplementedError
43
+ def timestamp
44
+ Time.now.utc.iso8601
33
45
  end
34
46
 
35
- def auth_signature
36
- Nokogiri::XML::Builder.new do |xml|
37
- xml.AuthSignature{
38
- xml.send('ds:SignedInfo') {
39
- xml.send('ds:CanonicalizationMethod', '', Algorithm: "http://www.w3.org/TR/2001/REC-xml-c14n-20010315")
40
- xml.send('ds:SignatureMethod', '', Algorithm: "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256")
41
- xml.send('ds:Reference', '', URI: "#xpointer(//*[@authenticate='true'])") {
42
- xml.send('ds:Transforms') {
43
- xml.send('ds:Transform', '', Algorithm: "http://www.w3.org/TR/2001/REC-xml-c14n-20010315")
44
- }
45
- xml.send('ds:DigestMethod', '', Algorithm: "http://www.w3.org/2001/04/xmlenc#sha256")
46
- xml.send('ds:DigestValue', '')
47
- }
48
- }
49
- xml.send('ds:SignatureValue', '')
50
- }
51
- end.doc.root
52
- end
47
+ def_delegators :client, :host_id, :user_id, :partner_id
53
48
 
54
49
  def to_transfer_xml
55
- Nokogiri::XML::Builder.new do |xml|
56
- xml.send(root, 'xmlns:ds' => 'http://www.w3.org/2000/09/xmldsig#', 'xmlns' => 'urn:org:ebics:H004', 'Version' => 'H004', 'Revision' => '1') {
57
- xml.header(authenticate: true) {
58
- xml.static {
59
- xml.HostID host_id
60
- xml.TransactionID transaction_id
61
- }
62
- xml.mutable {
63
- xml.TransactionPhase 'Transfer'
64
- xml.SegmentNumber(1, lastSegment: true)
65
- }
66
- }
67
- xml.parent.add_child(auth_signature)
68
- xml.body {
69
- xml.DataTransfer {
70
- xml.OrderData encrypted_order_data
71
- }
72
- }
73
- }
74
- end.to_xml(save_with: Nokogiri::XML::Node::SaveOptions::AS_XML, encoding: 'utf-8')
50
+ raise NotImplementedError
75
51
  end
76
52
 
77
53
  def to_receipt_xml
78
- Nokogiri::XML::Builder.new do |xml|
79
- xml.send(root, 'xmlns:ds' => 'http://www.w3.org/2000/09/xmldsig#', 'xmlns' => 'urn:org:ebics:H004', 'Version' => 'H004', 'Revision' => '1') {
80
- xml.header(authenticate: true) {
81
- xml.static {
82
- xml.HostID host_id
83
- xml.TransactionID(transaction_id)
84
- }
85
- xml.mutable {
86
- xml.TransactionPhase 'Receipt'
87
- }
88
- }
89
- xml.parent.add_child(auth_signature)
90
- xml.body {
91
- xml.TransferReceipt(authenticate: true) {
92
- xml.ReceiptCode 0
93
- }
94
- }
95
- }
96
- end.to_xml(save_with: Nokogiri::XML::Node::SaveOptions::AS_XML, encoding: 'utf-8')
54
+ builder = request_factory.create_transfer_receipt(transaction_id, 0)
55
+ builder.to_xml
97
56
  end
98
57
 
99
58
  def to_xml
100
- Nokogiri::XML::Builder.new do |xml|
101
- xml.send(root, 'xmlns:ds' => 'http://www.w3.org/2000/09/xmldsig#', 'xmlns' => 'urn:org:ebics:H004', 'Version' => 'H004', 'Revision'=> '1') {
102
- xml.parent.add_child(header)
103
- xml.parent.add_child(auth_signature)
104
- xml.parent.add_child(body)
105
- }
106
- end.to_xml(save_with: Nokogiri::XML::Node::SaveOptions::AS_XML, encoding: 'utf-8')
107
- end
108
-
109
- private
110
-
111
- def x509_data_xml(xml, x_509_certificate)
112
- return unless x_509_certificate
113
-
114
- xml.send('ds:X509Data') do
115
- xml.send('ds:X509IssuerSerial') do
116
- xml.send('ds:X509IssuerName', x_509_certificate.issuer)
117
- xml.send('ds:X509SerialNumber', x_509_certificate.version)
118
- end
119
- xml.send('ds:X509Certificate', x_509_certificate.data)
120
- end
59
+ raise NotImplementedError
121
60
  end
122
61
  end
@@ -1,80 +1,27 @@
1
1
  class Epics::GenericUploadRequest < Epics::GenericRequest
2
- attr_accessor :key
3
- attr_accessor :iv
4
- attr_accessor :document
2
+ attr_reader :document, :transaction_key
5
3
 
6
4
  def initialize(client, document, **options)
7
5
  super(client, **options)
8
6
  self.document = document
9
- self.key = cipher.random_key
10
- self.iv = 0.chr * cipher.iv_len
7
+ aes_factory = Epics::Factories::Crypt::AesFactory.new
8
+ aes = aes_factory.create
9
+ @transaction_key = aes.key
10
+ @crypt_service = Epics::Services::CryptService.new
11
11
  end
12
12
 
13
- def cipher
14
- @cipher ||= OpenSSL::Cipher.new("aes-128-cbc").tap { |cipher| cipher.encrypt }
13
+ # Normalized on the way in so the bytes hashed for the electronic signature are the
14
+ # bytes transmitted.
15
+ def document=(value)
16
+ @document = value.gsub(/\n|\r/, '')
15
17
  end
16
18
 
17
- def digester
18
- @digester ||= OpenSSL::Digest::SHA256.new
19
+ def document_digest
20
+ @crypt_service.hash(document)
19
21
  end
20
22
 
21
- def body
22
- Nokogiri::XML::Builder.new do |xml|
23
- xml.body {
24
- xml.DataTransfer {
25
- xml.DataEncryptionInfo(authenticate: true) {
26
- xml.EncryptionPubKeyDigest(client.bank_e.public_digest, Version: 'E002', Algorithm: "http://www.w3.org/2001/04/xmlenc#sha256")
27
- xml.TransactionKey Base64.encode64(client.bank_e.key.public_encrypt(self.key)).gsub(/\n/,'')
28
- }
29
- xml.SignatureData(encrypted_order_signature, authenticate: true)
30
- }
31
- }
32
- end.doc.root
23
+ def to_transfer_xml
24
+ builder = request_factory.create_transfer_upload(transaction_id, transaction_key, document, 1, true)
25
+ builder.to_xml
33
26
  end
34
-
35
- def order_signature
36
- Nokogiri::XML::Builder.new do |xml|
37
- xml.UserSignatureData('xmlns' => 'http://www.ebics.org/S001', 'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance', 'xsi:schemaLocation' => 'http://www.ebics.org/S001 http://www.ebics.org/S001/ebics_signature.xsd') {
38
- xml.OrderSignatureData {
39
- xml.SignatureVersion "A006"
40
- xml.SignatureValue signature_value
41
- xml.PartnerID partner_id
42
- xml.UserID user_id
43
- }
44
- }
45
- end.to_xml(save_with: Nokogiri::XML::Node::SaveOptions::AS_XML, encoding: 'utf-8')
46
- end
47
-
48
- def signature_value
49
- client.a.sign( digester.digest(document.gsub(/\n|\r/, "")) )
50
- end
51
-
52
- def encrypt(d)
53
- cipher.reset
54
- cipher.padding = 0
55
- cipher.key = self.key
56
- cipher.iv = self.iv
57
- (cipher.update(pad(d)) + cipher.final)
58
- end
59
-
60
- def encrypted_order_data
61
- dst = Zlib::Deflate.deflate(document)
62
-
63
- Base64.encode64(encrypt(dst)).gsub(/\n/,'')
64
- end
65
-
66
- def encrypted_order_signature
67
- dst = Zlib::Deflate.deflate(order_signature)
68
-
69
- Base64.encode64(encrypt(dst)).gsub(/\n/,'')
70
- end
71
-
72
- def pad(d)
73
- len = cipher.block_size*((d.size / cipher.block_size)+1)
74
-
75
- d.ljust(len, [0].pack("C*")).tap do |padded|
76
- padded[-1] = [len - d.size].pack("C*")
77
- end
78
- end
79
-
80
27
  end
data/lib/epics/haa.rb CHANGED
@@ -1,12 +1,6 @@
1
1
  class Epics::HAA < Epics::GenericRequest
2
- def header
3
- client.header_request.build(
4
- nonce: nonce,
5
- timestamp: timestamp,
6
- order_type: 'HAA',
7
- order_attribute: 'DZHNN',
8
- order_params: {},
9
- mutable: { TransactionPhase: 'Initialisation' }
10
- )
2
+ def to_xml
3
+ builder = request_factory.create_haa
4
+ builder.to_xml
11
5
  end
12
6
  end
data/lib/epics/hac.rb CHANGED
@@ -2,19 +2,8 @@ class Epics::HAC < Epics::GenericRequest
2
2
  # By default HAC only returns data for transactions which have not yet been fetched. Therefore,
3
3
  # most applications not not have to specify a date range, but can simply fetch the status and
4
4
  # be done
5
- def header
6
- client.header_request.build(
7
- nonce: nonce,
8
- timestamp: timestamp,
9
- order_type: 'HAC',
10
- order_attribute: 'DZHNN',
11
- order_params: !!options[:from] && !!options[:to] ? {
12
- DateRange: {
13
- Start: options[:from],
14
- End: options[:to]
15
- }
16
- } : {},
17
- mutable: { TransactionPhase: 'Initialisation' }
18
- )
5
+ def to_xml
6
+ builder = request_factory.create_hac(options[:from], options[:to])
7
+ builder.to_xml
19
8
  end
20
9
  end