epics 2.10.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 +97 -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 +491 -123
  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 +6 -0
  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 +69 -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 +63 -0
  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 +200 -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,56 @@
1
+ class Epics::Crypt::Aes
2
+ attr_writer :key, :key_length
3
+
4
+ def initialize
5
+ @cipher = {}
6
+ end
7
+
8
+ def decrypt(encrypted)
9
+ cipher = use_cipher(:decrypt)
10
+ unpad(cipher.update(encrypted) + cipher.final)
11
+ end
12
+
13
+ def encrypt(plaintext)
14
+ cipher = use_cipher(:encrypt)
15
+ cipher.update(pad(cipher, plaintext)) + cipher.final
16
+ end
17
+
18
+ def key
19
+ @key ||= create_cipher.random_key
20
+ end
21
+
22
+ def key_length
23
+ @key_length ||= 128
24
+ end
25
+
26
+ private
27
+
28
+ def create_cipher
29
+ @cipher[key_length] ||= OpenSSL::Cipher::AES.new(key_length, :CBC).tap do |cipher|
30
+ cipher.padding = 0
31
+ cipher.iv = 0.chr * cipher.iv_len
32
+ end
33
+ end
34
+
35
+ def use_cipher(method)
36
+ create_cipher.tap do |cipher|
37
+ cipher.reset
38
+ cipher.send(method)
39
+ cipher.key = key
40
+ end
41
+ end
42
+
43
+ def pad(cipher, text)
44
+ len = cipher.block_size * ((text.size / cipher.block_size) + 1)
45
+
46
+ text.ljust(len, [0].pack('C*')).tap do |padded|
47
+ padded[-1] = [len - text.size].pack('C*')
48
+ end
49
+ end
50
+
51
+ def unpad(text)
52
+ len = text[-1].unpack('C*').first
53
+
54
+ text[0...-len]
55
+ end
56
+ end
@@ -0,0 +1,52 @@
1
+ class Epics::Crypt::X509
2
+ extend Forwardable
3
+
4
+ # Swiss market practice guidelines §6.1 name 9999-12-31 as the "unlimited" validity
5
+ # date. An expired certificate means re-initialising with the bank.
6
+ UNLIMITED = Time.utc(9999, 12, 31, 23, 59, 59).freeze
7
+
8
+ KEY_USAGE = 'digitalSignature,nonRepudiation,keyEncipherment'.freeze
9
+
10
+ attr_reader :certificate
11
+
12
+ def_delegators :certificate, :issuer, :serial, :version, :to_der, :to_pem
13
+
14
+ # Self-signed certificate for `key`, which may be an OpenSSL::PKey::RSA or an
15
+ # Epics::SignatureAlgorithm wrapping one. `subject` takes an OpenSSL::X509::Name or
16
+ # any string OpenSSL::X509::Name.parse accepts.
17
+ def self.generate(key, subject:, not_before: nil, not_after: UNLIMITED, serial: nil)
18
+ key = key.key if key.respond_to?(:key)
19
+ name = subject.is_a?(OpenSSL::X509::Name) ? subject : OpenSSL::X509::Name.parse(subject)
20
+
21
+ certificate = OpenSSL::X509::Certificate.new
22
+ certificate.version = 2
23
+ certificate.serial = serial || SecureRandom.random_number(2**64)
24
+ certificate.subject = name
25
+ certificate.issuer = name
26
+ certificate.public_key = key.public_key
27
+ certificate.not_before = not_before || Time.now.utc
28
+ certificate.not_after = not_after
29
+
30
+ factory = OpenSSL::X509::ExtensionFactory.new
31
+ factory.subject_certificate = certificate
32
+ factory.issuer_certificate = certificate
33
+ certificate.add_extension(factory.create_extension('basicConstraints', 'CA:FALSE', true))
34
+ certificate.add_extension(factory.create_extension('keyUsage', KEY_USAGE, true))
35
+
36
+ certificate.sign(key, OpenSSL::Digest.new('SHA256'))
37
+
38
+ new(certificate.to_pem)
39
+ end
40
+
41
+ def initialize(content)
42
+ @certificate = OpenSSL::X509::Certificate.new(content)
43
+ end
44
+
45
+ def data
46
+ Base64.strict_encode64(certificate.to_der)
47
+ end
48
+
49
+ def fingerprint
50
+ Digest::SHA256.hexdigest(certificate.to_der).upcase
51
+ end
52
+ end
@@ -0,0 +1,5 @@
1
+ module Epics::Crypt
2
+ end
3
+
4
+ require 'epics/crypt/aes'
5
+ require 'epics/crypt/x_509'
data/lib/epics/crz.rb CHANGED
@@ -1,17 +1,6 @@
1
1
  class Epics::CRZ < Epics::GenericRequest
2
- def header
3
- client.header_request.build(
4
- nonce: nonce,
5
- timestamp: timestamp,
6
- order_type: 'CRZ',
7
- order_attribute: 'DZHNN',
8
- order_params: !!options[:from] && !!options[:to] ? {
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_crz(options[:from], options[:to])
4
+ builder.to_xml
16
5
  end
17
6
  end
@@ -0,0 +1,5 @@
1
+ class Epics::Factories::Crypt::AesFactory
2
+ def create
3
+ Epics::Crypt::Aes.new
4
+ end
5
+ end
@@ -0,0 +1,4 @@
1
+ module Epics::Factories::Crypt
2
+ end
3
+
4
+ require 'epics/factories/crypt/aes_factory'
@@ -0,0 +1,236 @@
1
+ class Epics::Factories::RequestFactory::Base
2
+ ORDER_TYPES = %w[
3
+ azv b2b btd btu bka
4
+ c2s c5n c52 c53 c54 ccs cct cd1 cdb cdd cds cdz cip crz
5
+ fdl ful h3k haa hac hev hia hkd hpb hpd htd ini ptk spr sta
6
+ vmk wss xct xds xe2 xe3 xek yct z01 z52 z53 z54 zsr
7
+ ].freeze
8
+
9
+ (ORDER_TYPES - %w[
10
+ b2b bka c2s c5n c52 c53 c54 ccs cct cd1 cdb cdd cds cdz cip crz
11
+ fdl ful h3k haa hac hev hia hkd hpb hpd htd ini ptk spr
12
+ sta vmk wss xds xe2 xe3 z01 z52 z53 z54
13
+ ]).each do |type|
14
+ define_method("create_#{type}") { |*| raise NotImplementedError }
15
+ end
16
+
17
+ def initialize(client)
18
+ @client = client
19
+ end
20
+
21
+ def add_order_type(order_details_builder, order_type, with_es = false)
22
+ raise NotImplementedError
23
+ end
24
+
25
+ def create_hev
26
+ request_builder.add_container_hev do |xml_builder|
27
+ xml_builder.add_host_id @client.host_id
28
+ end
29
+ end
30
+
31
+ def create_ini(order_data)
32
+ request_builder.add_container_unsecured do |xml_builder|
33
+ xml_builder.add_header do |header_builder|
34
+ header_builder.add_static do |static_builder|
35
+ static_builder.add_host_id @client.host_id
36
+ static_builder.add_partner_id @client.partner_id
37
+ static_builder.add_user_id @client.user_id
38
+ static_builder.add_product @client.product_name, @client.locale
39
+ static_builder.add_order_details do |order_details_builder|
40
+ add_order_type(order_details_builder, 'INI')
41
+ end
42
+ static_builder.add_security_medium Epics::Builders::StaticBuilder::SECURITY_MEDIUM_0000
43
+ end
44
+ header_builder.add_mutable
45
+ end
46
+ xml_builder.add_body do |body_builder|
47
+ body_builder.add_data_transfer do |data_transfer_builder|
48
+ data_transfer_builder.add_order_data order_data
49
+ end
50
+ end
51
+ end
52
+ end
53
+
54
+ def create_hia(order_data)
55
+ request_builder.add_container_unsecured do |xml_builder|
56
+ xml_builder.add_header do |header_builder|
57
+ header_builder.add_static do |static_builder|
58
+ static_builder.add_host_id @client.host_id
59
+ static_builder.add_partner_id @client.partner_id
60
+ static_builder.add_user_id @client.user_id
61
+ static_builder.add_product @client.product_name, @client.locale
62
+ static_builder.add_order_details do |order_details_builder|
63
+ add_order_type(order_details_builder, 'HIA')
64
+ end
65
+ static_builder.add_security_medium Epics::Builders::StaticBuilder::SECURITY_MEDIUM_0000
66
+ end
67
+ header_builder.add_mutable
68
+ end
69
+ xml_builder.add_body do |body_builder|
70
+ body_builder.add_data_transfer do |data_transfer_builder|
71
+ data_transfer_builder.add_order_data order_data
72
+ end
73
+ end
74
+ end
75
+ end
76
+
77
+ def create_h3k(*, **)
78
+ raise NotImplementedError
79
+ end
80
+
81
+ def create_hpb
82
+ auth_signature_handler = Epics::Handlers::AuthSignatureHandler.new(@client.keyring)
83
+ request_builder.add_container_secured_no_pubkey_digests do |xml_builder|
84
+ xml_builder.add_header do |header_builder|
85
+ header_builder.add_static do |static_builder|
86
+ static_builder.add_host_id @client.host_id
87
+ static_builder.add_random_nonce
88
+ static_builder.add_timestamp Time.now.utc
89
+ static_builder.add_partner_id @client.partner_id
90
+ static_builder.add_user_id @client.user_id
91
+ static_builder.add_product @client.product_name, @client.locale
92
+ static_builder.add_order_details do |order_details_builder|
93
+ add_order_type(order_details_builder, 'HPB')
94
+ end
95
+ static_builder.add_security_medium Epics::Builders::StaticBuilder::SECURITY_MEDIUM_0000
96
+ end
97
+ header_builder.add_mutable
98
+ end
99
+ xml_builder.add_body
100
+ auth_signature_handler.handle(xml_builder)
101
+ end
102
+ end
103
+
104
+ def create_spr(*, **)
105
+ raise NotImplementedError
106
+ end
107
+
108
+ def create_hpd
109
+ build_standard_request('HPD')
110
+ end
111
+
112
+ def create_hkd
113
+ build_standard_request('HKD')
114
+ end
115
+
116
+ def create_htd
117
+ build_standard_request('HTD')
118
+ end
119
+
120
+ def create_haa
121
+ build_standard_request('HAA')
122
+ end
123
+
124
+ def create_hac(start_date, end_date)
125
+ build_standard_request('HAC', start_date: start_date, end_date: end_date)
126
+ end
127
+
128
+ def create_ptk(start_date, end_date)
129
+ build_standard_request('PTK', start_date: start_date, end_date: end_date)
130
+ end
131
+
132
+ def create_fdl(format, start_date, end_date)
133
+ build_standard_request('FDL') do |order_details_builder|
134
+ order_details_builder.add_fdl_order_params(format, start_date, end_date)
135
+ end
136
+ end
137
+
138
+ def create_ful(digest, transaction_key, file_format:)
139
+ raise NotImplementedError
140
+ end
141
+
142
+ def create_transfer_receipt(transaction_id, acknowledged)
143
+ auth_signature_handler = Epics::Handlers::AuthSignatureHandler.new(@client.keyring)
144
+ request_builder.add_container_secured do |xml_builder|
145
+ xml_builder.add_header do |header_builder|
146
+ header_builder.add_static do |static_builder|
147
+ static_builder.add_host_id @client.host_id
148
+ static_builder.add_transaction_id transaction_id
149
+ end
150
+ header_builder.add_mutable do |mutable_builder|
151
+ mutable_builder.add_transaction_phase Epics::Builders::MutableBuilder::PHASE_RECEIPT
152
+ end
153
+ end
154
+ xml_builder.add_body do |body_builder|
155
+ body_builder.add_transfer_receipt do |transfer_receipt_builder|
156
+ transfer_receipt_builder.add_receipt_code acknowledged
157
+ end
158
+ end
159
+ auth_signature_handler.handle(xml_builder)
160
+ end
161
+ end
162
+
163
+ def create_transfer_upload(transaction_id, transaction_key, order_data, segment_number, is_last_segment = false)
164
+ auth_signature_handler = Epics::Handlers::AuthSignatureHandler.new(@client.keyring)
165
+ request_builder.add_container_secured do |xml_builder|
166
+ xml_builder.add_header do |header_builder|
167
+ header_builder.add_static do |static_builder|
168
+ static_builder.add_host_id @client.host_id
169
+ static_builder.add_transaction_id transaction_id
170
+ end
171
+ header_builder.add_mutable do |mutable_builder|
172
+ mutable_builder.add_transaction_phase Epics::Builders::MutableBuilder::PHASE_TRANSFER
173
+ mutable_builder.add_segment_number segment_number, is_last_segment
174
+ end
175
+ end
176
+ xml_builder.add_body do |body_builder|
177
+ body_builder.add_data_transfer do |data_transfer_builder|
178
+ data_transfer_builder.add_order_data(order_data, transaction_key)
179
+ end if order_data
180
+ end
181
+ auth_signature_handler.handle(xml_builder)
182
+ end
183
+ end
184
+
185
+ def create_transfer_download(transaction_id, segment_number, is_last_segment = false)
186
+ create_transfer_upload(transaction_id, nil, nil, segment_number, is_last_segment)
187
+ end
188
+
189
+ protected
190
+
191
+ def xml_builder
192
+ raise NotImplementedError
193
+ end
194
+
195
+ def request_builder
196
+ Epics::Builders::RequestBuilder.new(xml_builder)
197
+ end
198
+
199
+ private
200
+
201
+ def build_standard_request(order_type, start_date: nil, end_date: nil, with_es: false)
202
+ auth_signature_handler = Epics::Handlers::AuthSignatureHandler.new(@client.keyring)
203
+ request_builder.add_container_secured do |xml_builder|
204
+ xml_builder.add_header do |header_builder|
205
+ header_builder.add_static do |static_builder|
206
+ static_builder.add_host_id @client.host_id
207
+ static_builder.add_random_nonce
208
+ static_builder.add_timestamp Time.now.utc
209
+ static_builder.add_partner_id @client.partner_id
210
+ static_builder.add_user_id @client.user_id
211
+ static_builder.add_product @client.product_name, @client.locale
212
+ static_builder.add_order_details do |order_details_builder|
213
+ add_order_type(order_details_builder, order_type, with_es)
214
+ if block_given?
215
+ yield order_details_builder
216
+ else
217
+ order_details_builder.add_standard_order_params start_date, end_date
218
+ end
219
+ end
220
+ static_builder.add_bank_pubbey_digests(
221
+ @client.keyring.bank_authentication.version,
222
+ @digest_resolver.sign_digest(@client.keyring.bank_authentication),
223
+ @client.keyring.bank_encryption.version,
224
+ @digest_resolver.sign_digest(@client.keyring.bank_encryption)
225
+ )
226
+ static_builder.add_security_medium Epics::Builders::StaticBuilder::SECURITY_MEDIUM_0000
227
+ end
228
+ header_builder.add_mutable do |mutable_builder|
229
+ mutable_builder.add_transaction_phase Epics::Builders::MutableBuilder::PHASE_INITIALIZATION
230
+ end
231
+ end
232
+ xml_builder.add_body
233
+ auth_signature_handler.handle(xml_builder)
234
+ end
235
+ end
236
+ end
@@ -0,0 +1,194 @@
1
+ class Epics::Factories::RequestFactory::V2 < Epics::Factories::RequestFactory::Base
2
+ %w[btd btu].each do |type|
3
+ define_method("create_#{type}") { |*| raise Epics::VersionSupportError, 3.0 }
4
+ end
5
+
6
+ def initialize(client)
7
+ @digest_resolver = Epics::Services::DigestResolver::V2.new
8
+ @user_signature_handle = Epics::Handlers::UserSignatureHandler::V2.new(client)
9
+ super
10
+ end
11
+
12
+ def create_bka(start_date, end_date)
13
+ build_download_request('BKA', start_date: start_date, end_date: end_date)
14
+ end
15
+
16
+ def create_z01(start_date, end_date, **)
17
+ build_download_request('Z01', start_date: start_date, end_date: end_date)
18
+ end
19
+
20
+ def create_c52(start_date, end_date, **)
21
+ build_download_request('C52', start_date: start_date, end_date: end_date)
22
+ end
23
+
24
+ def create_c53(start_date, end_date, **)
25
+ build_download_request('C53', start_date: start_date, end_date: end_date)
26
+ end
27
+
28
+ def create_c54(start_date, end_date, **)
29
+ build_download_request('C54', start_date: start_date, end_date: end_date)
30
+ end
31
+
32
+ def create_c5n(start_date, end_date)
33
+ build_download_request('C5N', start_date: start_date, end_date: end_date)
34
+ end
35
+
36
+ def create_cdz(start_date, end_date)
37
+ build_download_request('CDZ', start_date: start_date, end_date: end_date)
38
+ end
39
+
40
+ def create_crz(start_date, end_date)
41
+ build_download_request('CRZ', start_date: start_date, end_date: end_date)
42
+ end
43
+
44
+ def create_sta(start_date, end_date)
45
+ build_download_request('STA', start_date: start_date, end_date: end_date)
46
+ end
47
+
48
+ def create_vmk(start_date, end_date)
49
+ build_download_request('VMK', start_date: start_date, end_date: end_date)
50
+ end
51
+
52
+ def create_wss
53
+ build_download_request('WSS')
54
+ end
55
+
56
+ def create_z52(start_date, end_date, **)
57
+ build_download_request('Z52', start_date: start_date, end_date: end_date)
58
+ end
59
+
60
+ def create_z53(start_date, end_date, **)
61
+ build_download_request('Z53', start_date: start_date, end_date: end_date)
62
+ end
63
+
64
+ def create_z54(start_date, end_date, **)
65
+ build_download_request('Z54', start_date: start_date, end_date: end_date)
66
+ end
67
+
68
+ def create_b2b(digest, transaction_key, **)
69
+ signature_data = @user_signature_handle.handle(digest).to_xml
70
+ build_upload_request('B2B', transaction_key, signature_data, 1, true)
71
+ end
72
+
73
+ def create_c2s(digest, transaction_key, **)
74
+ signature_data = @user_signature_handle.handle(digest).to_xml
75
+ build_upload_request('C2S', transaction_key, signature_data, 1, false)
76
+ end
77
+
78
+ def create_ccs(digest, transaction_key, **)
79
+ signature_data = @user_signature_handle.handle(digest).to_xml
80
+ build_upload_request('CCS', transaction_key, signature_data, 1, false)
81
+ end
82
+
83
+ def create_cct(digest, transaction_key, **)
84
+ signature_data = @user_signature_handle.handle(digest).to_xml
85
+ build_upload_request('CCT', transaction_key, signature_data, 1, true)
86
+ end
87
+
88
+ def create_cds(digest, transaction_key, **)
89
+ signature_data = @user_signature_handle.handle(digest).to_xml
90
+ build_upload_request('CDS', transaction_key, signature_data, 1, false)
91
+ end
92
+
93
+ def create_azv(digest, transaction_key, **)
94
+ create_cd1(digest, transaction_key)
95
+ end
96
+
97
+ def create_cd1(digest, transaction_key, **)
98
+ signature_data = @user_signature_handle.handle(digest).to_xml
99
+ build_upload_request('CD1', transaction_key, signature_data, 1, true)
100
+ end
101
+
102
+ def create_cdd(digest, transaction_key, **)
103
+ signature_data = @user_signature_handle.handle(digest).to_xml
104
+ build_upload_request('CDD', transaction_key, signature_data, 1, true)
105
+ end
106
+
107
+ def create_cdb(digest, transaction_key, **)
108
+ signature_data = @user_signature_handle.handle(digest).to_xml
109
+ build_upload_request('CDB', transaction_key, signature_data, 1, true)
110
+ end
111
+
112
+ def create_cip(digest, transaction_key, **)
113
+ signature_data = @user_signature_handle.handle(digest).to_xml
114
+ build_upload_request('CIP', transaction_key, signature_data, 1, true)
115
+ end
116
+
117
+ def create_xct(digest, transaction_key, **)
118
+ signature_data = @user_signature_handle.handle(digest).to_xml
119
+ build_upload_request('XCT', transaction_key, signature_data, 1, true)
120
+ end
121
+
122
+ def create_xds(digest, transaction_key, **)
123
+ signature_data = @user_signature_handle.handle(digest).to_xml
124
+ build_upload_request('XDS', transaction_key, signature_data, 1, true)
125
+ end
126
+
127
+ def create_xe2(digest, transaction_key, **)
128
+ signature_data = @user_signature_handle.handle(digest).to_xml
129
+ build_upload_request('XE2', transaction_key, signature_data, 1, true)
130
+ end
131
+
132
+ def create_xe3(digest, transaction_key, **)
133
+ signature_data = @user_signature_handle.handle(digest).to_xml
134
+ build_upload_request('XE3', transaction_key, signature_data, 1, true)
135
+ end
136
+
137
+ def create_ful(digest, transaction_key, file_format:)
138
+ signature_data = @user_signature_handle.handle(digest).to_xml
139
+ build_upload_request('FUL', transaction_key, signature_data, 1) do |order_details_builder|
140
+ order_details_builder.add_ful_order_params(file_format)
141
+ end
142
+ end
143
+
144
+ private
145
+
146
+ def build_download_request(order_type, start_date: nil, end_date: nil, &)
147
+ build_standard_request(order_type, start_date: start_date, end_date: end_date, &)
148
+ end
149
+
150
+ def build_upload_request(order_type, transaction_key, signature_data, num_segments, with_es = false)
151
+ auth_signature_handler = Epics::Handlers::AuthSignatureHandler.new(@client.keyring)
152
+ request_builder.add_container_secured do |xml_builder|
153
+ xml_builder.add_header do |header_builder|
154
+ header_builder.add_static do |static_builder|
155
+ static_builder.add_host_id @client.host_id
156
+ static_builder.add_random_nonce
157
+ static_builder.add_timestamp Time.now.utc
158
+ static_builder.add_partner_id @client.partner_id
159
+ static_builder.add_user_id @client.user_id
160
+ static_builder.add_product @client.product_name, @client.locale
161
+ static_builder.add_order_details do |order_details_builder|
162
+ add_order_type(order_details_builder, order_type, with_es)
163
+ if block_given?
164
+ yield order_details_builder
165
+ else
166
+ order_details_builder.add_standard_order_params
167
+ end
168
+ end
169
+ static_builder.add_bank_pubbey_digests(
170
+ @client.keyring.bank_authentication.version,
171
+ @digest_resolver.sign_digest(@client.keyring.bank_authentication),
172
+ @client.keyring.bank_encryption.version,
173
+ @digest_resolver.sign_digest(@client.keyring.bank_encryption)
174
+ )
175
+ static_builder.add_security_medium Epics::Builders::StaticBuilder::SECURITY_MEDIUM_0000
176
+ static_builder.add_num_segments num_segments
177
+ end
178
+ header_builder.add_mutable do |mutable_builder|
179
+ mutable_builder.add_transaction_phase Epics::Builders::MutableBuilder::PHASE_INITIALIZATION
180
+ end
181
+ end
182
+ xml_builder.add_body do |body_builder|
183
+ body_builder.add_data_transfer do |data_transfer_builder|
184
+ data_transfer_builder.add_data_encryption_info do |data_encryption_info_builder|
185
+ data_encryption_info_builder.add_encryption_pubkey_digest @client.keyring
186
+ data_encryption_info_builder.add_transaction_key transaction_key, @client.keyring
187
+ end
188
+ data_transfer_builder.add_signature_data signature_data, transaction_key
189
+ end
190
+ end
191
+ auth_signature_handler.handle(xml_builder)
192
+ end
193
+ end
194
+ end
@@ -0,0 +1,32 @@
1
+ class Epics::Factories::RequestFactory::V24 < Epics::Factories::RequestFactory::V2
2
+ NOT_IMPLEMENTED_ORDER_TYPES = %w[
3
+ xek yct zsr
4
+ ].freeze
5
+
6
+ NOT_IMPLEMENTED_ORDER_TYPES.each do |type|
7
+ define_method("create_#{type}") { |*, **| raise Epics::VersionSupportError, 3.0 }
8
+ end
9
+
10
+ protected
11
+
12
+ def xml_builder
13
+ Epics::Builders::XmlBuilder::V24.new
14
+ end
15
+
16
+ def add_order_type(order_details_builder, order_type, with_es = false)
17
+ order_attribute = case order_type
18
+ when 'INI', 'HIA'
19
+ Epics::Builders::OrderDetailsBuilder::ORDER_ATTRIBUTE_DZNNN
20
+ else
21
+ if with_es
22
+ Epics::Builders::OrderDetailsBuilder::ORDER_ATTRIBUTE_OZHNN
23
+ else
24
+ Epics::Builders::OrderDetailsBuilder::ORDER_ATTRIBUTE_DZHNN
25
+ end
26
+ end
27
+
28
+ order_details_builder.add_order_type order_type
29
+ order_details_builder.add_order_id @client.next_order_id
30
+ order_details_builder.add_order_attribute order_attribute
31
+ end
32
+ end
@@ -0,0 +1,31 @@
1
+ class Epics::Factories::RequestFactory::V25 < Epics::Factories::RequestFactory::V2
2
+ NOT_IMPLEMENTED_ORDER_TYPES = %w[
3
+ xek yct zsr
4
+ ].freeze
5
+
6
+ NOT_IMPLEMENTED_ORDER_TYPES.each do |type|
7
+ define_method("create_#{type}") { |*, **| raise Epics::VersionSupportError, 3.0 }
8
+ end
9
+
10
+ protected
11
+
12
+ def xml_builder
13
+ Epics::Builders::XmlBuilder::V25.new
14
+ end
15
+
16
+ def add_order_type(order_details_builder, order_type, with_es = false)
17
+ order_attribute = case order_type
18
+ when 'INI', 'HIA'
19
+ Epics::Builders::OrderDetailsBuilder::ORDER_ATTRIBUTE_DZNNN
20
+ else
21
+ if with_es
22
+ Epics::Builders::OrderDetailsBuilder::ORDER_ATTRIBUTE_OZHNN
23
+ else
24
+ Epics::Builders::OrderDetailsBuilder::ORDER_ATTRIBUTE_DZHNN
25
+ end
26
+ end
27
+
28
+ order_details_builder.add_order_type order_type
29
+ order_details_builder.add_order_attribute order_attribute
30
+ end
31
+ end