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,100 @@
1
+ class Epics::Builders::OrderDetailsBuilder::Base
2
+ def initialize
3
+ Nokogiri::XML::Builder.new do |xml|
4
+ @xml = xml
5
+ xml.OrderDetails do
6
+ yield self
7
+ end
8
+ end
9
+ end
10
+
11
+ def add_order_type
12
+ raise NotImplementedError
13
+ end
14
+
15
+ def add_admin_order_type
16
+ raise NotImplementedError
17
+ end
18
+
19
+ def add_order_id(order_id)
20
+ @xml.OrderID order_id.to_s(36).upcase.rjust(4, '0')
21
+ self
22
+ end
23
+
24
+ def add_order_attribute(order_attribute)
25
+ raise NotImplementedError
26
+ end
27
+
28
+ def add_standard_order_params(start_date = nil, end_date = nil)
29
+ date_range = create_date_range(start_date, end_date)
30
+ @xml.StandardOrderParams do |xml|
31
+ xml.parent.add_child(date_range) if date_range
32
+ end
33
+ self
34
+ end
35
+
36
+ def add_fdl_order_params(format, start_date = nil, end_date = nil)
37
+ date_range = create_date_range(start_date, end_date)
38
+ @xml.FDLOrderParams do |xml|
39
+ xml.parent.add_child(date_range) if date_range
40
+ xml.FileFormat format
41
+ end
42
+ self
43
+ end
44
+
45
+ def add_ful_order_params(format)
46
+ @xml.FULOrderParams do |xml|
47
+ xml.FileFormat format
48
+ end
49
+ self
50
+ end
51
+
52
+ def add_btd_order_params
53
+ raise NotImplementedError
54
+ end
55
+
56
+ def add_btu_order_params
57
+ raise NotImplementedError
58
+ end
59
+
60
+ def doc
61
+ @xml.doc.root
62
+ end
63
+
64
+ protected
65
+
66
+ # Start and End are both mandatory within DateRange: no bounds means no range, one
67
+ # bound cannot be rendered at all.
68
+ def create_date_range(start_date, end_date)
69
+ return if start_date.nil? && end_date.nil?
70
+
71
+ if start_date.nil? || end_date.nil?
72
+ raise ArgumentError, 'DateRange requires both a start and an end date, got ' \
73
+ "start_date=#{start_date.inspect} end_date=#{end_date.inspect}"
74
+ end
75
+
76
+ start_date = coerce_date(start_date, 'start_date')
77
+ end_date = coerce_date(end_date, 'end_date')
78
+
79
+ Nokogiri::XML::Builder.new do |xml|
80
+ xml.DateRange do
81
+ xml.Start start_date.iso8601
82
+ xml.End end_date.iso8601
83
+ end
84
+ end.doc.root
85
+ end
86
+
87
+ # Start and End are xs:date; Time and DateTime would render an xs:dateTime with an
88
+ # offset and be rejected.
89
+ def coerce_date(value, name)
90
+ case value
91
+ when String
92
+ puts "DEPRECATION WARNING: #{name} is a String, use Date instead"
93
+ Date.parse(value)
94
+ when DateTime, Time
95
+ value.to_date
96
+ else
97
+ value
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,21 @@
1
+ class Epics::Builders::OrderDetailsBuilder::V2 < Epics::Builders::OrderDetailsBuilder::Base
2
+ def add_order_type(order_type)
3
+ @xml.OrderType order_type
4
+ end
5
+
6
+ def add_admin_order_type(order_type)
7
+ raise Epics::VersionSupportError, 3.0
8
+ end
9
+
10
+ def add_order_attribute(order_attribute)
11
+ @xml.OrderAttribute order_attribute
12
+ end
13
+
14
+ def add_btd_order_params
15
+ raise Epics::VersionSupportError, 3.0
16
+ end
17
+
18
+ def add_btu_order_params
19
+ raise Epics::VersionSupportError, 3.0
20
+ end
21
+ end
@@ -0,0 +1,51 @@
1
+ class Epics::Builders::OrderDetailsBuilder::V3 < Epics::Builders::OrderDetailsBuilder::Base
2
+ def add_order_type(_order_type)
3
+ raise Epics::VersionSupportError.new(3.0, 'below')
4
+ end
5
+
6
+ def add_admin_order_type(order_type)
7
+ @xml.AdminOrderType order_type
8
+ end
9
+
10
+ def add_order_attribute(_order_attribute)
11
+ raise Epics::VersionSupportError.new(3.0, 'below')
12
+ end
13
+
14
+ def add_btd_order_params(
15
+ service_name:, msg_name:, scope: nil, service_option: nil,
16
+ container_type: nil, start_date: nil, end_date: nil, msg_name_version: nil, msg_name_variant: nil, msg_name_format: nil
17
+ )
18
+ @xml.BTDOrderParams do |xml|
19
+ xml.Service do
20
+ xml.ServiceName service_name
21
+ xml.Scope scope if scope
22
+ xml.ServiceOption service_option if service_option
23
+ xml.Container '', containerType: container_type if container_type
24
+ msg_name_attributes = {}
25
+ msg_name_attributes[:version] = msg_name_version if msg_name_version
26
+ msg_name_attributes[:variant] = msg_name_variant if msg_name_variant
27
+ msg_name_attributes[:format] = msg_name_format if msg_name_format
28
+ xml.MsgName msg_name, msg_name_attributes
29
+ end
30
+ xml.parent.add_child(create_date_range(start_date, end_date)) if start_date && end_date
31
+ end
32
+ end
33
+
34
+ def add_btu_order_params(
35
+ filename:, service_name:, msg_name:, scope: nil, service_option: nil, container_type: nil, msg_name_version: nil, msg_name_variant: nil, msg_name_format: nil
36
+ )
37
+ @xml.BTUOrderParams fileName: filename do |xml|
38
+ xml.Service do
39
+ xml.ServiceName service_name
40
+ xml.Scope scope if scope
41
+ xml.ServiceOption service_option if service_option
42
+ xml.Container '', containerType: container_type if container_type
43
+ msg_name_attributes = {}
44
+ msg_name_attributes[:version] = msg_name_version if msg_name_version
45
+ msg_name_attributes[:variant] = msg_name_variant if msg_name_variant
46
+ msg_name_attributes[:format] = msg_name_format if msg_name_format
47
+ xml.MsgName msg_name, msg_name_attributes
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,10 @@
1
+ module Epics::Builders::OrderDetailsBuilder
2
+ ORDER_ATTRIBUTE_DZNNN = 'DZNNN'
3
+ ORDER_ATTRIBUTE_DZHNN = 'DZHNN'
4
+ ORDER_ATTRIBUTE_UZHNN = 'UZHNN'
5
+ ORDER_ATTRIBUTE_OZHNN = 'OZHNN'
6
+ end
7
+
8
+ require 'epics/builders/order_details_builder/base'
9
+ require 'epics/builders/order_details_builder/v2'
10
+ require 'epics/builders/order_details_builder/v3'
@@ -0,0 +1,25 @@
1
+ class Epics::Builders::RequestBuilder
2
+ def initialize(xml_builder)
3
+ @xml_builder = xml_builder
4
+ end
5
+
6
+ def add_container_unsecured(&)
7
+ @xml_builder.create_unsecured(&)
8
+ end
9
+
10
+ def add_container_secured_no_pubkey_digests(&)
11
+ @xml_builder.create_secured_no_pubkey_digests(&)
12
+ end
13
+
14
+ def add_container_secured(&)
15
+ @xml_builder.create_secured(&)
16
+ end
17
+
18
+ def add_container_unsigned(&)
19
+ @xml_builder.create_unsigned(&)
20
+ end
21
+
22
+ def add_container_hev(&)
23
+ @xml_builder.create_hev(&)
24
+ end
25
+ end
@@ -0,0 +1,75 @@
1
+ class Epics::Builders::StaticBuilder::Base
2
+ def initialize
3
+ Nokogiri::XML::Builder.new do |xml|
4
+ @xml = xml
5
+ xml.static do
6
+ yield self
7
+ end
8
+ end
9
+ end
10
+
11
+ def add_host_id(host_id)
12
+ @xml.HostID host_id
13
+ self
14
+ end
15
+
16
+ def add_nonce(data)
17
+ @xml.Nonce data
18
+ self
19
+ end
20
+
21
+ def add_random_nonce
22
+ add_nonce SecureRandom.hex(16)
23
+ end
24
+
25
+ def add_timestamp(datetime)
26
+ @xml.Timestamp datetime.iso8601
27
+ self
28
+ end
29
+
30
+ def add_partner_id(partner_id)
31
+ @xml.PartnerID partner_id
32
+ self
33
+ end
34
+
35
+ def add_user_id(user_id)
36
+ @xml.UserID user_id
37
+ self
38
+ end
39
+
40
+ def add_product(product, language)
41
+ @xml.Product product, Language: language
42
+ self
43
+ end
44
+
45
+ def add_order_details
46
+ raise NotImplementedError
47
+ end
48
+
49
+ def add_num_segments(num_segments)
50
+ @xml.NumSegments num_segments
51
+ self
52
+ end
53
+
54
+ def add_bank_pubbey_digests(authentication_version, authentication_digest, encryption_version, encryption_digest, algorithm = 'sha256')
55
+ @xml.BankPubKeyDigests do
56
+ @xml.Authentication Base64.strict_encode64(authentication_digest), Version: authentication_version, Algorithm: "http://www.w3.org/2001/04/xmlenc##{algorithm}"
57
+ @xml.Encryption Base64.strict_encode64(encryption_digest), Version: encryption_version, Algorithm: "http://www.w3.org/2001/04/xmlenc##{algorithm}"
58
+ end
59
+ self
60
+ end
61
+
62
+ def add_security_medium(security_medium)
63
+ @xml.SecurityMedium security_medium
64
+ self
65
+ end
66
+
67
+ def add_transaction_id(transaction_id)
68
+ @xml.TransactionID transaction_id
69
+ self
70
+ end
71
+
72
+ def doc
73
+ @xml.doc.root
74
+ end
75
+ end
@@ -0,0 +1,9 @@
1
+ class Epics::Builders::StaticBuilder::V2 < Epics::Builders::StaticBuilder::Base
2
+ def add_order_details
3
+ instance = Epics::Builders::OrderDetailsBuilder::V2.new do |instance|
4
+ yield instance
5
+ end
6
+ @xml.parent.add_child(instance.doc)
7
+ self
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ class Epics::Builders::StaticBuilder::V3 < Epics::Builders::StaticBuilder::Base
2
+ def add_order_details
3
+ instance = Epics::Builders::OrderDetailsBuilder::V3.new do |instance|
4
+ yield instance
5
+ end
6
+ @xml.parent.add_child(instance.doc)
7
+ self
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Epics::Builders::StaticBuilder
2
+ SECURITY_MEDIUM_0000 = '0000'
3
+ SECURITY_MEDIUM_0100 = '0100'
4
+ SECURITY_MEDIUM_0200 = '0200'
5
+ end
6
+
7
+ require 'epics/builders/static_builder/base'
8
+ require 'epics/builders/static_builder/v2'
9
+ require 'epics/builders/static_builder/v3'
@@ -0,0 +1,19 @@
1
+ class Epics::Builders::TransferReceiptBuilder
2
+ def initialize
3
+ Nokogiri::XML::Builder.new do |xml|
4
+ @xml = xml
5
+ xml.TransferReceipt(authenticate: true) do
6
+ yield self
7
+ end
8
+ end
9
+ end
10
+
11
+ def add_receipt_code(receipt_code)
12
+ @xml.ReceiptCode receipt_code
13
+ self
14
+ end
15
+
16
+ def doc
17
+ @xml.doc.root
18
+ end
19
+ end
@@ -0,0 +1,92 @@
1
+ class Epics::Builders::XmlBuilder::Base
2
+ EBICS_REQUEST = 'ebicsRequest'
3
+ EBICS_UNSECURED_REQUEST = 'ebicsUnsecuredRequest'
4
+ EBICS_UNSIGNED_REQUEST = 'ebicsUnsignedRequest'
5
+ EBICS_NO_PUB_KEY_DIGESTS = 'ebicsNoPubKeyDigestsRequest'
6
+ EBICS_HEV = 'ebicsHEVRequest'
7
+
8
+ def initialize
9
+ Nokogiri::XML::Builder.new do |xml|
10
+ @xml = xml
11
+ end
12
+ end
13
+
14
+ def create_unsecured(&)
15
+ create_h00x(EBICS_UNSECURED_REQUEST, &)
16
+ end
17
+
18
+ def create_secured_no_pubkey_digests(&)
19
+ create_h00x(EBICS_NO_PUB_KEY_DIGESTS, true, &)
20
+ end
21
+
22
+ def create_secured(&)
23
+ create_h00x(EBICS_REQUEST, true, &)
24
+ end
25
+
26
+ def create_unsigned(&)
27
+ create_h00x(EBICS_UNSIGNED_REQUEST, &)
28
+ end
29
+
30
+ def create_hev(&)
31
+ create_h000(EBICS_HEV, &)
32
+ end
33
+
34
+ def add_header
35
+ raise NotImplementedError
36
+ end
37
+
38
+ def add_body
39
+ raise NotImplementedError
40
+ end
41
+
42
+ def add_host_id(host_id)
43
+ @xml.HostID host_id
44
+ self
45
+ end
46
+
47
+ def xml
48
+ @xml
49
+ end
50
+
51
+ def to_xml
52
+ @xml.to_xml(save_with: Nokogiri::XML::Node::SaveOptions::AS_XML, encoding: 'utf-8')
53
+ end
54
+
55
+ protected
56
+
57
+ def h00x_version
58
+ raise NotImplementedError
59
+ end
60
+
61
+ def h00x_namespace
62
+ raise NotImplementedError
63
+ end
64
+
65
+ def h00x_schema_location
66
+ raise NotImplementedError
67
+ end
68
+
69
+ private
70
+
71
+ def create_h00x(container, secured = false)
72
+ namespaces = { xmlns: h00x_namespace }
73
+ namespaces['xmlns:ds'] = 'http://www.w3.org/2000/09/xmldsig#' if secured
74
+ namespaces['xmlns:xsi'] = 'http://www.w3.org/2001/XMLSchema-instance'
75
+ attributes = { Version: h00x_version, Revision: '1' }
76
+ attributes['xsi:schemaLocation'] = "#{h00x_namespace} #{h00x_schema_location}"
77
+ @xml.send(container, **namespaces, **attributes) do
78
+ yield self
79
+ end
80
+ self
81
+ end
82
+
83
+ def create_h000(container)
84
+ namespaces = { xmlns: 'http://www.ebics.org/H000' }
85
+ namespaces['xmlns:xsi'] = 'http://www.w3.org/2001/XMLSchema-instance'
86
+ namespaces['xsi:schemaLocation'] = 'http://www.ebics.org/H000 http://www.ebics.org/H000/ebics_hev.xsd'
87
+ @xml.send(container, **namespaces) do
88
+ yield self
89
+ end
90
+ self
91
+ end
92
+ end
@@ -0,0 +1,31 @@
1
+ class Epics::Builders::XmlBuilder::V24 < Epics::Builders::XmlBuilder::Base
2
+ def add_header
3
+ instance = Epics::Builders::HeaderBuilder::V2.new do |instance|
4
+ yield instance
5
+ end
6
+ @xml.parent.add_child(instance.doc)
7
+ self
8
+ end
9
+
10
+ def add_body
11
+ instance = Epics::Builders::BodyBuilder::V2.new do |instance|
12
+ yield instance if block_given?
13
+ end
14
+ @xml.parent.add_child(instance.doc)
15
+ self
16
+ end
17
+
18
+ protected
19
+
20
+ def h00x_version
21
+ 'H003'
22
+ end
23
+
24
+ def h00x_namespace
25
+ 'http://www.ebics.org/H003'
26
+ end
27
+
28
+ def h00x_schema_location
29
+ 'http://www.ebics.org/H003/ebics_H003.xsd'
30
+ end
31
+ end
@@ -0,0 +1,31 @@
1
+ class Epics::Builders::XmlBuilder::V25 < Epics::Builders::XmlBuilder::Base
2
+ def add_header
3
+ instance = Epics::Builders::HeaderBuilder::V2.new do |instance|
4
+ yield instance
5
+ end
6
+ @xml.parent.add_child(instance.doc)
7
+ self
8
+ end
9
+
10
+ def add_body
11
+ instance = Epics::Builders::BodyBuilder::V2.new do |instance|
12
+ yield instance if block_given?
13
+ end
14
+ @xml.parent.add_child(instance.doc)
15
+ self
16
+ end
17
+
18
+ protected
19
+
20
+ def h00x_version
21
+ 'H004'
22
+ end
23
+
24
+ def h00x_namespace
25
+ 'urn:org:ebics:H004'
26
+ end
27
+
28
+ def h00x_schema_location
29
+ 'http://www.ebics.org/H004/ebics_H004.xsd'
30
+ end
31
+ end
@@ -0,0 +1,31 @@
1
+ class Epics::Builders::XmlBuilder::V3 < Epics::Builders::XmlBuilder::Base
2
+ def add_header
3
+ instance = Epics::Builders::HeaderBuilder::V3.new do |instance|
4
+ yield instance
5
+ end
6
+ @xml.parent.add_child(instance.doc)
7
+ self
8
+ end
9
+
10
+ def add_body
11
+ instance = Epics::Builders::BodyBuilder::V3.new do |instance|
12
+ yield instance if block_given?
13
+ end
14
+ @xml.parent.add_child(instance.doc)
15
+ self
16
+ end
17
+
18
+ protected
19
+
20
+ def h00x_version
21
+ 'H005'
22
+ end
23
+
24
+ def h00x_namespace
25
+ 'urn:org:ebics:H005'
26
+ end
27
+
28
+ def h00x_schema_location
29
+ 'http://www.ebics.org/H005/ebics_H005.xsd'
30
+ end
31
+ end
@@ -0,0 +1,7 @@
1
+ module Epics::Builders::XmlBuilder
2
+ end
3
+
4
+ require 'epics/builders/xml_builder/base'
5
+ require 'epics/builders/xml_builder/v24'
6
+ require 'epics/builders/xml_builder/v25'
7
+ require 'epics/builders/xml_builder/v3'
@@ -0,0 +1,13 @@
1
+ module Epics::Builders
2
+ end
3
+
4
+ require 'epics/builders/body_builder'
5
+ require 'epics/builders/data_encryption_info_builder'
6
+ require 'epics/builders/data_transfer_builder'
7
+ require 'epics/builders/header_builder'
8
+ require 'epics/builders/mutable_builder'
9
+ require 'epics/builders/order_details_builder'
10
+ require 'epics/builders/request_builder'
11
+ require 'epics/builders/static_builder'
12
+ require 'epics/builders/transfer_receipt_builder'
13
+ require 'epics/builders/xml_builder'
data/lib/epics/c2s.rb CHANGED
@@ -1,13 +1,6 @@
1
1
  class Epics::C2S < Epics::GenericUploadRequest
2
- def header
3
- client.header_request.build(
4
- nonce: nonce,
5
- timestamp: timestamp,
6
- order_type: 'C2S',
7
- order_attribute: 'DZHNN',
8
- order_params: {},
9
- num_segments: 1,
10
- mutable: { TransactionPhase: 'Initialisation' }
11
- )
2
+ def to_xml
3
+ builder = request_factory.create_c2s(document_digest, transaction_key, **options)
4
+ builder.to_xml
12
5
  end
13
6
  end
data/lib/epics/c52.rb CHANGED
@@ -1,17 +1,5 @@
1
1
  class Epics::C52 < Epics::GenericRequest
2
- def header
3
- client.header_request.build(
4
- nonce: nonce,
5
- timestamp: timestamp,
6
- order_type: 'C52',
7
- order_attribute: 'DZHNN',
8
- order_params: {
9
- DateRange: {
10
- Start: options[:from],
11
- End: options[:to]
12
- }
13
- },
14
- mutable: { TransactionPhase: 'Initialisation' }
15
- )
2
+ def to_xml
3
+ request_factory.create_c52(options[:from], options[:to], **service_options).to_xml
16
4
  end
17
5
  end
data/lib/epics/c53.rb CHANGED
@@ -1,17 +1,5 @@
1
1
  class Epics::C53 < Epics::GenericRequest
2
- def header
3
- client.header_request.build(
4
- nonce: nonce,
5
- timestamp: timestamp,
6
- order_type: 'C53',
7
- order_attribute: 'DZHNN',
8
- order_params: {
9
- DateRange: {
10
- Start: options[:from],
11
- End: options[:to]
12
- }
13
- },
14
- mutable: { TransactionPhase: 'Initialisation' }
15
- )
2
+ def to_xml
3
+ request_factory.create_c53(options[:from], options[:to], **service_options).to_xml
16
4
  end
17
5
  end
data/lib/epics/c54.rb CHANGED
@@ -1,17 +1,5 @@
1
1
  class Epics::C54 < Epics::GenericRequest
2
- def header
3
- client.header_request.build(
4
- nonce: nonce,
5
- timestamp: timestamp,
6
- order_type: 'C54',
7
- order_attribute: 'DZHNN',
8
- order_params: {
9
- DateRange: {
10
- Start: options[:from],
11
- End: options[:to]
12
- }
13
- },
14
- mutable: { TransactionPhase: 'Initialisation' }
15
- )
2
+ def to_xml
3
+ request_factory.create_c54(options[:from], options[:to], **service_options).to_xml
16
4
  end
17
5
  end
data/lib/epics/c5n.rb CHANGED
@@ -1,17 +1,6 @@
1
1
  class Epics::C5N < Epics::GenericRequest
2
- def header
3
- client.header_request.build(
4
- nonce: nonce,
5
- timestamp: timestamp,
6
- order_type: 'C5N',
7
- order_attribute: 'DZHNN',
8
- order_params: {
9
- DateRange: {
10
- Start: options[:from],
11
- End: options[:to]
12
- }
13
- },
14
- mutable: { TransactionPhase: 'Initialisation' }
15
- )
2
+ def to_xml
3
+ builder = request_factory.create_c5n(options[:from], options[:to])
4
+ builder.to_xml
16
5
  end
17
6
  end
data/lib/epics/ccs.rb CHANGED
@@ -1,13 +1,6 @@
1
1
  class Epics::CCS < Epics::GenericUploadRequest
2
- def header
3
- client.header_request.build(
4
- nonce: nonce,
5
- timestamp: timestamp,
6
- order_type: 'CCS',
7
- order_attribute: 'DZHNN',
8
- order_params: {},
9
- num_segments: 1,
10
- mutable: { TransactionPhase: 'Initialisation' }
11
- )
2
+ def to_xml
3
+ builder = request_factory.create_ccs(document_digest, transaction_key, **options)
4
+ builder.to_xml
12
5
  end
13
6
  end
data/lib/epics/cct.rb CHANGED
@@ -1,13 +1,6 @@
1
1
  class Epics::CCT < Epics::GenericUploadRequest
2
- def header
3
- client.header_request.build(
4
- nonce: nonce,
5
- timestamp: timestamp,
6
- order_type: 'CCT',
7
- order_attribute: 'OZHNN',
8
- order_params: {},
9
- num_segments: 1,
10
- mutable: { TransactionPhase: 'Initialisation' }
11
- )
2
+ def to_xml
3
+ builder = request_factory.create_cct(document_digest, transaction_key, **options)
4
+ builder.to_xml
12
5
  end
13
6
  end