ezii-ebics 0.1.0

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 57a0bc6b19b87f13c759a1a3e9c38f009eddd6d30eec20e11a860ac51f0d3092
4
+ data.tar.gz: e78ea6d59bac9b5c753bf4d85d69ef464a8046c3dea5a8af85e881e3266b51e9
5
+ SHA512:
6
+ metadata.gz: 5037694efa8ce807ff19b049df764885b8fb50cd7a38c97b434668db7239e84bb94e0b16b4f1f44a3b1303f8603c34512d9c649090184733f63cadca533c266e
7
+ data.tar.gz: 7fae7f66cc06841046468daf2cc87434eccbe8413d392edf8632ac0d8eac29a41b7eb027f46b111d3846681d31a2a59ccd587a1cb8bc30bfa70504ea53d9612a
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source :rubygems
2
+
3
+ gem 'nokogiri'
@@ -0,0 +1,12 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ mini_portile (0.6.0)
5
+ nokogiri (1.6.3.1)
6
+ mini_portile (= 0.6.0)
7
+
8
+ PLATFORMS
9
+ ruby
10
+
11
+ DEPENDENCIES
12
+ nokogiri
@@ -0,0 +1,24 @@
1
+ This is free and unencumbered software released into the public domain.
2
+
3
+ Anyone is free to copy, modify, publish, use, compile, sell, or
4
+ distribute this software, either in source code form or as a compiled
5
+ binary, for any purpose, commercial or non-commercial, and by any
6
+ means.
7
+
8
+ In jurisdictions that recognize copyright laws, the author or authors
9
+ of this software dedicate any and all copyright interest in the
10
+ software to the public domain. We make this dedication for the benefit
11
+ of the public at large and to the detriment of our heirs and
12
+ successors. We intend this dedication to be an overt act of
13
+ relinquishment in perpetuity of all present and future rights to this
14
+ software under copyright law.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
19
+ IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
20
+ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21
+ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22
+ OTHER DEALINGS IN THE SOFTWARE.
23
+
24
+ For more information, please refer to <http://unlicense.org>
@@ -0,0 +1,7 @@
1
+ # EBICS Ruby Client
2
+
3
+ ## Tested against EBICS XML Schema and german Commerzbank EBICS Server in production at sofortwohnen.com
4
+
5
+ * INI
6
+ * HIA
7
+ * HEV
@@ -0,0 +1,12 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = 'ezii-ebics'
3
+ s.version = '0.1.0'
4
+ s.licenses = ['MIT']
5
+ s.summary = "eZii EBICS Ruby Client"
6
+ s.description = "EBICS 2.5 H004 Implementation in Ruby."
7
+ s.authors = ["Manuel Korfmann"]
8
+ s.email = 'manu@korfmann.info'
9
+ s.files = Dir.glob("**/*")
10
+ s.require_path = 'lib'
11
+ s.homepage = 'https://ezii.ml'
12
+ end
File without changes
@@ -0,0 +1,27 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ MIIEowIBAAKCAQEA4AcfGjkEG3A2anPNgY5DLM+4/imMhy9ToxfpRG+0eLKhnoqH
3
+ n0BbbJyoU0DiKc2Oxs78qnFPNFx+Owb8pcO2HE4wJoa7n2KhSudHJmXaZffid//t
4
+ StFZSx3rhQmgYuR817yzDr9chiJtBFBdGEnUjKtQqatTbjQ6oBTXUqp1NkCiFzVr
5
+ pZ+EDcQpuxkleFlabhF6tNy9cqGr2O4oFF5xDEtTJkYEXKIDw4QJDyLY04yyYWFA
6
+ umL5WSUwoDoLpd/QF4bkZJv+ZCeb5kH5TrPD8uLNaDL26kUxsLlIDmnpwzv+CjKE
7
+ VY/pB+UeAXvASq3sJRnHeac7onTG4t/hZ9zO+QIDAQABAoIBAFjxGt0LU+Ec3M3I
8
+ qgdMlsjcs2Jc1oj5NihjHt5nxuvAZ8AM2alVILbvPzjGYsQb8xplJRT6JWrxacA/
9
+ luCs4ck9FYrGJQkzXDvjtHC/MUUYdBYWSnxQvzW+bDoGR2HbuuDf7urk+HPciRGU
10
+ YlF5RmSOw1iJR3dSTxAtFgug1yYxJnxcYdd0++ZTlaxltqhRMMVVJ/JLB6gPRlaN
11
+ mW4dRTfwTvCPOCRWsji4htdcaJzmWG74oHle9nMLP7iNucrZ1I2bPU5geCkPlgB/
12
+ ZW5jHsaMA5IAMFf79/3yLGWAjpcV0Us+/7bo3IlnLUhNefDmbadnN0ZNdw1kLjd9
13
+ tukuVfECgYEA/IzNFx+jxB91NqsSgqtwXdSGQvvLtdpNSvGhvZtsyFTta9g+J0za
14
+ QzvaxwPAqDi2rTnTWQrJnuJaM/cxxNlZYcqNMkzroNO8uR7mvrIYqzWLqIc/Fkse
15
+ BYADIeiKdjCqpMng8DUGi9jivB6nJ/g6zwkYoiCubhLsuXBwYlCnTC0CgYEA4xaT
16
+ IK724sH9KwHTEcOTDWZLGq8H8F/LrAudXv5BStc12a3cVDxLGML7lbxdR81UeiB4
17
+ PDjqytCqPEBe8dBqTBsiGuuuc5GUvXz9U5rW2NlBcCqUebbaHTTVGVnDlit7HmJU
18
+ PtB4pKk916JRmL3PDanz1kHBJnoPf+Mhtyn4MX0CgYBXWDMOTkkLaX3WfHAYdUaV
19
+ jQ0qWX9o06lrxAoWU4zZ9FVwuQc1/GR4YFkX/3pAM+0qGBe6cfqtUseztUinNiyt
20
+ n6oZvXS42MIqnD9dsKbLf+dfT/dHtI8bg9yRe6V3nvlFqPR83zn2X/p66XcSYc2l
21
+ ERZN7FOnijAJKpQTzKUvuQKBgGKIJQaFZDI3obXLcN3AUkn6HJRTZcpyhlj8ISha
22
+ gdILVx5ARd12286+q5LozECfYwwqkoDu4VFnALZr58ZcfALRsxajNGqIvFULqo9g
23
+ G+CzQ6V7lDjLkhAiIGSDgk3iR+WDHLK0meQ4WtD5aRYxJWn0WAybM0eSpq8CylpD
24
+ J6GxAoGBALUNRi/+pgeBxxhlHKt4E2YZggcrnbOTCK7tYaCENDc+DNRI4N6l7iUC
25
+ oErpv4iI5gAdvvIydjsGzPmiR8vkG77RJDdS0Z/bbv0C35ANZ16CDF4VUqDm1XM6
26
+ AEggZrAuSpS8saXhXfHvttga14JwPj91xlNgEtmQnhGVDOasmffj
27
+ -----END RSA PRIVATE KEY-----
@@ -0,0 +1,27 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ MIIEpAIBAAKCAQEA2exIRgXiwjlgplH8VChWedjxT/03cijQK9loIAYgSab8Oijb
3
+ 2HVaT08c6OnJ+ezbdGA9cI9iM01ATFx+Jul6V8tklAwhIkUju6HCc6knpT7q988K
4
+ yYdPmRy/R9l/NVvSXIQltQI9n8/ixywtVIkQfp8AlrcK+r60wUoegPTF9b/w6Fb5
5
+ pcfu0a+eVFP7J/Ij3n7Gb64emYzcPuFCRymfKwJHVG4z9vEwAlePzkMHCn30TYQe
6
+ pXOcLNb7x1FJj+8HcLzLcVviymkBfhnPHwBwy4eWBPlN9ryEsqDyC2Lf+oSXm88c
7
+ YiSZSyRaCoKmau1OpQJh49kKY8loAQicu4XSPwIDAQABAoIBAF1lBUh1R0yD+Kbv
8
+ JhwPOZh44Fquo++aDDVutFBdL8NA/IIUdrva93xb5IDxiS1CVH8Yq9wspyJjbjYL
9
+ wcj9cQBlW9KTLDQau4izd7nH+gS45UyVAAOEqRlul4+8Z+c/VfVucRaVQkHWf1Nq
10
+ 3HaJU3dgv4jYI614w9C+6jnMLXb3JAN6+TgM0Gsx+YvV9ZZ1kmxen4hHEk2qyp/z
11
+ bQrGIo37Za7WKjdn+TbkRqUv7hiPm5t5zW2mKv+yqEFf5ZRwkwMkh2t7p7saxoaH
12
+ ZE57XW41YCvpS90hUUxOjz/V7Foah1jHZhLT0qR+rOZOlx+Oc3tRxJVlY/hqBQLx
13
+ 4gQ4SmkCgYEA+nezNkCccOcqKig873xCscCOWwOXl63Y5vN+ASblWEcvnDD+By0u
14
+ 6GF0dFSz4X4fKfQMq42lm12CuAC0n+K3LliYNWwq2hT6BgCxElj6S1grHO9uG0fP
15
+ /cx8NoxcXfVvAj8n2qs8VrA+8/AVsoI9dQRyLR3UT0sc3VoUu/XgbqsCgYEA3ryO
16
+ ByAG1oliVCeS3zAZkUCzmWWXyxA5WxswiDVf1hZdDGgZcMcBLG6SB1PWhSDESdMb
17
+ AG/mf0Qk6keneRoprg7cAHgGYEPhSDREBonjqF3aSV3vrb5varq5HwFOmieoJnQU
18
+ fJVNi7W59JKdUdeOMupQ3Gpq6Ru8j6Ncy7nEWr0CgYBcXVgRYbJPUHAUK9KM3l4Z
19
+ /tCAb8qvfMTIJnMJKbbZ3yaHiumi696og4fWfoX3WfNUHVOu0AWKTemuwVPawlib
20
+ FsDKsqD621F4dTjXc0iaEGGVwhXwqYLiLU6BLzHA1ImjYnboBM2zijss6hSWR8Ey
21
+ LfmM+bsZorF6T4Xl6r5hEQKBgQCf5+pnPxzppJQNKqQMy3FvkG3f8Mm7JRioSarb
22
+ /sWg40lGAO5Swuwaw/7ed9gIl2+UOJSoCa4HLBr8fxjCnn/R0CUtyP162wC/X5Z+
23
+ wzvHwilWhrPtnkxK6WbB1aRik5nqkWer0Vxssrif1ypOeVxDPWlz9IpwdFM5I+UY
24
+ 9XL8WQKBgQC/4sufNIcsxLCKyayAYDnfNMzprzNIwBrr2arqL6qvuTOh5gftTKjw
25
+ 7jjyl+2dAqjCysKzspo/HMA6GB9rKu+AL5x8FYcyfjHUeiW3xqVChapc9kJy3jbf
26
+ mVFKdIQrHYRrGLD1Es725KIablMshxLLb04oKYDmIXO1vUPcDd+0Pg==
27
+ -----END RSA PRIVATE KEY-----
@@ -0,0 +1,17 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIDQDCCAiigAwIBAgIBATANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJGUjEOMAwGA1UEBxMF
3
+ UGFyaXMxEzARBgNVBAoTCkUuQi5JLkMuUy4xCTAHBgNVBAsTADEPMA0GA1UEAxMGRS4gQml4MB4X
4
+ DTA5MDcyNzA5MDYxNVoXDTE0MDcyNzA5MDYxNVowTjELMAkGA1UEBhMCRlIxDjAMBgNVBAcTBVBh
5
+ cmlzMRMwEQYDVQQKEwpFLkIuSS5DLlMuMQkwBwYDVQQLEwAxDzANBgNVBAMTBkUuIEJpeDCCASIw
6
+ DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANeOaO2fHl56a7bcS4FAnfTyvGiibmiyed9Jx1wi
7
+ fCojuzzLpnSVWnbDm2wyB1/YXK1V/cllK+LCrav48xMnoga0aRcVxrSCtpAW+PB6Wn1hKkNW2m/w
8
+ IuP1Vg+LB2EAsAVvCiMrCpyGKUUGNQ5x0Ph913xYUgZ41Rq/CNJ2w4AtuCgbr5KvRTwvKEv4JEJ5
9
+ qymedq3Yy1kt6t5HbQkLzMpMOBtMLzUBiZUv1sTApEtK39CdCI8GAEsZdW5ePSdr77y0qsA7QCTx
10
+ WliLpNDBx4BOuYJz9IdejqtNT4zAD7sQB6Yai54LzJ0lpHmA3baK3/Y3gBJqxC3WHSBf68x66icC
11
+ AwEAAaMpMCcwCwYDVR0PBAQDAgZAMAoGA1UdDgQDBAExMAwGA1UdIwQFMAOAATEwDQYJKoZIhvcN
12
+ AQELBQADggEBALo97IHqI3SfAS7rcTRGykCxqImtaDKJ3c77iKaUBIfJtBWuSxMLbLyC5xG5WQmS
13
+ /IdjSLp8WWetDylP2mkKvqk601UJGYHTnvUHblVY9MhG5kD6LB6bfjp6PfOm1629Mlmg5BCZ7cO1
14
+ +pEbQK2IE1MTreCYPiQyJJeT6umUKfeRgS3WFWCya/zfaLlCZDrRy+N8TVFKauMMKa8AugUn9eAm
15
+ 7CuKgt89RkH3ERhJUZWb5Rbo6ykvHzbpDjaCedtnobUURjKeiwNR8cM5Tt8yeH4fOh63vbYZWUBv
16
+ 3jQ5URJX2vHgkOP6sNB/E7/yqYPLxhj3E7Ty2d4/ru3yjJfRiVE=
17
+ -----END CERTIFICATE-----
@@ -0,0 +1,27 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ MIIEpAIBAAKCAQEAxDdGQbH114swLRsKsUp2bKgmqVJM6GGORGCs+2Q+nprnFZN0
3
+ a5g8bOY0j0pqkG/D1L/IIzUslnGg91K24GXPuGvthpGNjyEqqcUR2KXxnSiSIkDf
4
+ zgSPisuFoF0cwiYMWSYNgAqSE3+L1XUOC6EuYbRUAGMF3216kFb5Ky02ZtUX6y2I
5
+ gqqFQygIaQKd+uJtsWO4lhTo/J2G5hTmm0V2LO9yWuduwGH6kDjaeL7UfgGdlbjx
6
+ Es2eE66vNfppcAGLRZXpUp5/mAnRcFSJPUHJXXcnuLTsX30WxvSM2pha8yUj9uIR
7
+ KH4TxOIf0vRhPh5iScldKle35MsVTMxgXe7buwIDAQABAoIBAQCS9w+xXxjTI9am
8
+ wi1lE2/V/LBQfGtMVt2XS43lEXVxmHZjC7nUaQdBTb+qX8OngX79V9QQwuAtotg8
9
+ xwBg3QETkgsrktOjk+T/mbK/QbPR0bR64XqANZxKChyBO5yxsovnLgBImiJFZnAX
10
+ JoCpp0U1Ozr7uy+H5Nk7SVmBxHCN3dc5ommEyVR+Tp7lhCt8Rv9UdPkeqkdQNO2N
11
+ 9g/RA0NL/5WXGe7xXB45uD0PASL0GjL/uDq7pJXtFifa17lTvymHRnCSOICXIZfa
12
+ XGlPqUFoU60IOehRWEMMP2UfBwXVvLGvkp7QXvREw6GdhtlBfbHNM0g2mcvYXLsH
13
+ llBYWH0BAoGBAPIcvLdzZfIzAeOp5b3Kdsf6vou5Dftle83fJUZOZwl7xuYcfP9p
14
+ XjEsgbeoE3zjgIURkrZrY03sGsuWtSfcips0NnF2KGCYn+3Ff1ECAkkB9RvGc6zl
15
+ Cu5u5nv2QHDzNFE4VJ6LRabBPyzt2DYsmgZ1HxH2r7R3pLCSArMcGu+BAoGBAM94
16
+ lDuDCqMTYxZwwO0O2PiUwqIRMA41hwZOlGRge6AqPFzVc4kHUg8biL9oBlJ1xyAW
17
+ 0j7ztQyygtCWKWaWCHz504oHEHIpY9r6not+AViOlzqjhqzsfqljD95YADXTQ6jk
18
+ Bw9E7tiVwzf69Ecv6rdtJc3MBkARd+vOwqWiXik7AoGAaFwcuFKkmd6ErPZ50fIo
19
+ exDI+38b2MYotFfAQGrhHQReeqfC9XEcqcOOcnSfWdDSgAlQHRNy7Y6dCi5/DZyR
20
+ nk7GPOf6hZCkNyBPPcLI62FNnthO2jKsIJRrAvnlUwpx/aRzTRepQTTBH4OyE7/r
21
+ 8GahquOTXw3HTljRkxTFQ4ECgYATBDNaDRXRgrpnWShl0iGTD1eTsU2dT8yziEpT
22
+ tQA/2v8zZyEy4yfjWJu9J5TExCTfTRgySvZCVq5k3g6nZ4MZqXB5S1J3lFGhxaz4
23
+ jjEjY9Z6unhiqz6k2f6fW6ORS279MQFwpdnaokeFfwwa5kp2S5vWdCfygWdjhs0S
24
+ j4Jf9wKBgQDBJzBBxN7LObQTzButu0xLuKLs5EvrECJfyqBWNKcstgPNacG8UCru
25
+ lRbhkQOt5h/1Vb3jtbZSDipIKkAV5i5lzB50n33eyUkDp+SPvdDamCVDs86Sc5q2
26
+ 1zdWBwQLJ3iaB6PlJyPjtZMy3ZFSXW5Gqs52GvENVYAGcnX1wkK6SA==
27
+ -----END RSA PRIVATE KEY-----
@@ -0,0 +1,104 @@
1
+ require 'zlib'
2
+ require 'base64'
3
+ require 'erb'
4
+ require 'openssl'
5
+ require 'time'
6
+ require 'digest/sha2'
7
+
8
+ module EBICS
9
+ class Request
10
+ def render_order_data(name)
11
+ zipped_order_data = Zlib::Deflate.deflate raw_order_data(name)
12
+ Base64.strict_encode64(zipped_order_data)
13
+ end
14
+
15
+ def raw_order_data(name)
16
+ request_template(name)
17
+ end
18
+
19
+ def request_template(name)
20
+ raw = File.read(File.join(File.dirname(__FILE__), '../templates/' + name + '.erb'))
21
+ ERB.new(raw).result(binding)
22
+ end
23
+ end
24
+
25
+ class HEV < Request
26
+ attr_accessor :bank
27
+
28
+ def render
29
+ request_template('HEV.xml')
30
+ end
31
+ end
32
+
33
+ class INI < Request
34
+ attr_accessor :user
35
+ attr_accessor :bank
36
+
37
+ def render
38
+ request_template('INI.xml')
39
+ end
40
+ end
41
+
42
+ class HIA < Request
43
+ attr_accessor :user
44
+ attr_accessor :bank
45
+
46
+ def render
47
+ request_template('HIA.xml')
48
+ end
49
+ end
50
+
51
+
52
+ class User
53
+ attr_accessor :partner_id
54
+ attr_accessor :member_id
55
+ def initialize(&block)
56
+ @key_initializer = block
57
+ @keys = {}
58
+ end
59
+
60
+ def key(type)
61
+ @keys[type.to_sym] || (@keys[type] = initialize_key(type))
62
+ end
63
+
64
+ def initialize_key(type)
65
+ key = Key.new(type)
66
+ @key_initializer.call(key)
67
+ return key
68
+ end
69
+ end
70
+
71
+ class Bank
72
+ attr_accessor :host_id
73
+
74
+ end
75
+
76
+ class Key
77
+ attr_accessor :rsa, :type
78
+ attr_writer :created_at
79
+
80
+ def initialize(type)
81
+ @type = type
82
+ end
83
+
84
+ def public_modulus
85
+ Base64.strict_encode64(@rsa.public_key.n.to_s(16))
86
+ end
87
+
88
+ def public_exponent
89
+ Base64.strict_encode64(@rsa.public_key.e.to_s(2))
90
+ end
91
+
92
+ def public_sha_256
93
+ public_key_string = "#{ @rsa.public_key.e.to_s(16).downcase } #{ @rsa.public_key.n.to_s(16).downcase }"
94
+ public_key_string.gsub! /\A0/, ''
95
+ puts public_key_string
96
+ public_key_string.encode!('US-ASCII')
97
+ Digest::SHA256.hexdigest(public_key_string)
98
+ end
99
+
100
+ def created_at
101
+ @created_at.iso8601(10)
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,5 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <ebics:ebicsHEVRequest xsi:schemaLocation="http://www.ebics.org/H000 ebics_hev.xsd"
3
+ xmlns:ebics="http://www.ebics.org/H000" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
4
+ <ebics:HostID><%= @bank.host_id %></ebics:HostID>
5
+ </ebics:ebicsHEVRequest>
@@ -0,0 +1,22 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <ebicsUnsecuredRequest xmlns="http://www.ebics.org/H003" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Revision="1" Version="H003" xsi:schemaLocation="http://www.ebics.org/H003 http://www.ebics.org/H003/ebics_keymgmt_request.xsd">
3
+ <header authenticate="true">
4
+ <static>
5
+ <HostID><%= @bank.host_id%></HostID>
6
+ <PartnerID><%= @user.partner_id %></PartnerID>
7
+ <UserID><%= @user.member_id %></UserID>
8
+ <OrderDetails>
9
+ <OrderType>HIA</OrderType>
10
+ <OrderID>A026</OrderID>
11
+ <OrderAttribute>DZNNN</OrderAttribute>
12
+ </OrderDetails>
13
+ <SecurityMedium>0000</SecurityMedium>
14
+ </static>
15
+ <mutable/>
16
+ </header>
17
+ <body>
18
+ <DataTransfer>
19
+ <OrderData><%= render_order_data 'HIA_order_data.xml' %></OrderData>
20
+ </DataTransfer>
21
+ </body>
22
+ </ebicsUnsecuredRequest>
@@ -0,0 +1,25 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <HIARequestOrderData xmlns="http://www.ebics.org/H003" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xsi:schemaLocation="http://www.ebics.org/H003 http://www.ebics.org/H003/ebics_orders.xsd">
3
+ <AuthenticationPubKeyInfo>
4
+ <PubKeyValue>
5
+ <ds:RSAKeyValue>
6
+ <ds:Modulus><%= @user.key('x002').public_modulus %></ds:Modulus>
7
+ <ds:Exponent><%= @user.key('x002').public_exponent %></ds:Exponent>
8
+ </ds:RSAKeyValue>
9
+ </PubKeyValue>
10
+ <AuthenticationVersion>X002</AuthenticationVersion>
11
+ </AuthenticationPubKeyInfo>
12
+
13
+ <EncryptionPubKeyInfo>
14
+ <PubKeyValue>
15
+ <ds:RSAKeyValue>
16
+ <ds:Modulus><%= @user.key('e002').public_modulus %></ds:Modulus>
17
+ <ds:Exponent><%= @user.key('e002').public_exponent %></ds:Exponent>
18
+ </ds:RSAKeyValue>
19
+ </PubKeyValue>
20
+ <EncryptionVersion>E002</EncryptionVersion>
21
+ </EncryptionPubKeyInfo>
22
+
23
+ <PartnerID><%= @user.partner_id %></PartnerID>
24
+ <UserID><%= @user.member_id %></UserID>
25
+ </HIARequestOrderData>
@@ -0,0 +1,22 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <ebicsUnsecuredRequest xmlns="http://www.ebics.org/H003" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Revision="1" Version="H003" xsi:schemaLocation="http://www.ebics.org/H003 http://www.ebics.org/H003/ebics_keymgmt_request.xsd">
3
+ <header authenticate="true">
4
+ <static>
5
+ <HostID><%= @bank.host_id%></HostID>
6
+ <PartnerID><%= @user.partner_id %></PartnerID>
7
+ <UserID><%= @user.member_id %></UserID>
8
+ <OrderDetails>
9
+ <OrderType>INI</OrderType>
10
+ <OrderID>A025</OrderID>
11
+ <OrderAttribute>DZNNN</OrderAttribute>
12
+ </OrderDetails>
13
+ <SecurityMedium>0000</SecurityMedium>
14
+ </static>
15
+ <mutable/>
16
+ </header>
17
+ <body>
18
+ <DataTransfer>
19
+ <OrderData><%= render_order_data 'INI_order_data.xml' %></OrderData>
20
+ </DataTransfer>
21
+ </body>
22
+ </ebicsUnsecuredRequest>
@@ -0,0 +1,15 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <SignaturePubKeyOrderData xmlns="http://www.ebics.org/S001" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xsi:schemaLocation="http://www.ebics.org/S001 http://www.ebics.org/S001/ebics_signature.xsd">
3
+ <SignaturePubKeyInfo>
4
+ <PubKeyValue>
5
+ <ds:RSAKeyValue>
6
+ <ds:Modulus><%= @user.key('a005').public_modulus %></ds:Modulus>
7
+ <ds:Exponent><%= @user.key('a005').public_exponent %></ds:Exponent>
8
+ </ds:RSAKeyValue>
9
+ <TimeStamp><%= @user.key('a005').created_at %></TimeStamp>
10
+ </PubKeyValue>
11
+ <SignatureVersion>A005</SignatureVersion>
12
+ </SignaturePubKeyInfo>
13
+ <PartnerID><%= @user.partner_id %></PartnerID>
14
+ <UserID><%= @user.member_id %></UserID>
15
+ </SignaturePubKeyOrderData>
@@ -0,0 +1,92 @@
1
+ require 'minitest/autorun'
2
+ require 'nokogiri'
3
+ require_relative '../lib/ebics'
4
+
5
+ # TODO: Need to refactor every test cases.
6
+
7
+ class SchemaTest < MiniTest::Unit::TestCase
8
+ def setup
9
+ @bank = EBICS::Bank.new
10
+ @bank.host_id = 'EBIXH'
11
+
12
+ @user = EBICS::User.new do |key|
13
+ path = '../keys/' + key.type + '.pem'
14
+ if File.exists?(path)
15
+ key.rsa = OpenSSL::PKey::RSA.new(File.read(path))
16
+ else
17
+ key.rsa = OpenSSL::PKey::RSA.new(2048)
18
+ File.open(path, 'w') do |file|
19
+ file.write key.rsa.to_pem
20
+ end
21
+ end
22
+
23
+ key.created_at = File.mtime(path)
24
+ end
25
+
26
+ @user.partner_id = 'EBIXP'
27
+ @user.member_id = 'EBIXU'
28
+
29
+ @hia = EBICS::HIA.new
30
+ @hia.user = @user
31
+ @hia.bank = @bank
32
+
33
+ @ini = EBICS::INI.new
34
+ @ini.user = @user
35
+ @ini.bank = @bank
36
+
37
+ end
38
+
39
+ def test_ini_schema
40
+ doc = Nokogiri::XML(@ini.render.to_s.tap { |ini| ini })
41
+
42
+ Dir.chdir('../xsd/H003/') do
43
+ xsd = Nokogiri::XML::Schema(File.read('ebics.xsd'))
44
+ errors = []
45
+ xsd.validate(doc).each do |error|
46
+ errors << error
47
+ end
48
+ assert_empty errors, errors.join("\n")
49
+ end
50
+ end
51
+
52
+ def test_ini_order_data_schema
53
+ doc = Nokogiri::XML(@ini.raw_order_data('INI_order_data.xml').to_s.tap { |ini| puts ini })
54
+
55
+ Dir.chdir('../xsd/H003/') do
56
+ xsd = Nokogiri::XML::Schema(File.read('ebics_signature.xsd'))
57
+ errors = []
58
+ xsd.validate(doc).each do |error|
59
+ errors << error
60
+ end
61
+ assert_empty errors, errors.join("\n")
62
+ end
63
+ end
64
+
65
+
66
+ def test_hia_schema
67
+ doc = Nokogiri::XML(@hia.render.to_s.tap { |hia| puts hia })
68
+
69
+ Dir.chdir('../xsd/H003/') do
70
+ xsd = Nokogiri::XML::Schema(File.read('ebics.xsd'))
71
+ errors = []
72
+ xsd.validate(doc).each do |error|
73
+ errors << error
74
+ end
75
+ assert_empty errors, errors.join("\n")
76
+ end
77
+ end
78
+
79
+ def test_hia_order_data_schema
80
+ doc = Nokogiri::XML(@hia.raw_order_data('HIA_order_data.xml').to_s.tap { |hia| puts hia })
81
+
82
+ Dir.chdir('../xsd/H003/') do
83
+ xsd = Nokogiri::XML::Schema(File.read('ebics.xsd'))
84
+ errors = []
85
+ xsd.validate(doc).each do |error|
86
+ errors << error
87
+ end
88
+ assert_empty errors, errors.join("\n")
89
+ end
90
+ end
91
+ end
92
+