7
7
require 'digest/sha1'
8
8
require 'nokogiri'
9
9
10
+ class NestedOpenStruct < OpenStruct
11
+ def initialize ( hash = nil )
12
+ @table = { }
13
+ if hash
14
+ for k , v in hash
15
+ @table [ k . to_sym ] = v . instance_of? ( Hash ) ? NestedOpenStruct . new ( v ) : v
16
+ new_ostruct_member ( k )
17
+ end
18
+ end
19
+ end
20
+ end
21
+
10
22
module Digidoc
11
23
TargetNamespace = 'http://www.sk.ee/DigiDocService/DigiDocService_2_3.wsdl'
12
- TestEndpointUrl = 'https://openxades.org:8443 /DigiDocService'
24
+ TestEndpointUrl = 'https://openxades.org:9443 /DigiDocService'
13
25
14
26
class Client
27
+ cattr_accessor :logger
15
28
attr_accessor :session_code , :endpoint_url , :respond_with_nested_struct , :embedded_datafiles
16
29
17
30
def initialize ( endpoint_url = TestEndpointUrl )
@@ -41,11 +54,11 @@ def authenticate(*args)
41
54
self . session_code = nil
42
55
43
56
# Make webservice call
44
- response = savon_client . request ( :wsdl , 'MobileAuthenticate' ) do |soap |
45
- soap . body = { 'CountryCode' => country_code , 'PhoneNo' => phone , 'Language' => language , 'ServiceName' => service_name ,
57
+ response = savon_client . call ( 'MobileAuthenticate' ) do |locals |
58
+ locals . message 'CountryCode' => country_code , 'PhoneNo' => phone , 'Language' => language , 'ServiceName' => service_name ,
46
59
'MessageToDisplay' => message_to_display , 'SPChallenge' => sp_challenge , 'MessagingMode' => messaging_mode ,
47
60
'AsyncConfiguration' => async_configuration , 'ReturnCertData' => return_cert_data ,
48
- 'ReturnRevocationData' => return_revocation_data , 'IdCode' => personal_code }
61
+ 'ReturnRevocationData' => return_revocation_data , 'IdCode' => personal_code
49
62
end
50
63
51
64
if soap_fault? ( response )
@@ -59,8 +72,8 @@ def authenticate(*args)
59
72
60
73
# Authentication status
61
74
def authentication_status ( session_code = self . session_code )
62
- response = savon_client . request ( :wsdl , 'GetMobileAuthenticateStatus' ) do |soap |
63
- soap . body = { 'Sesscode' => session_code }
75
+ response = savon_client . call ( 'GetMobileAuthenticateStatus' ) do |locals |
76
+ locals . message 'Sesscode' => session_code
64
77
end
65
78
66
79
result = soap_fault? ( response ) ? response . to_hash [ :fault ] : response . to_hash [ :get_mobile_authenticate_status_response ]
@@ -75,8 +88,8 @@ def start_session(*args)
75
88
signed_doc_file = options . delete ( :signed_doc_file )
76
89
signed_doc_xml = signed_doc_file . read if signed_doc_file
77
90
78
- response = savon_client . request ( :wsdl , 'StartSession' ) do |soap |
79
- soap . body = { 'bHoldSession' => true , 'SigDocXML' => signed_doc_xml }
91
+ response = savon_client . call ( 'StartSession' ) do |locals |
92
+ locals . message 'bHoldSession' => true , 'SigDocXML' => signed_doc_xml
80
93
end
81
94
82
95
if soap_fault? ( response )
@@ -95,8 +108,8 @@ def create_signed_doc(*args)
95
108
session_code = options . delete ( :session_code ) || self . session_code
96
109
version = options . delete ( :version ) || '1.3'
97
110
98
- response = savon_client . request ( :wsdl , 'CreateSignedDoc' ) do |soap |
99
- soap . body = { 'Sesscode' => session_code , 'Format' => 'DIGIDOC-XML' , 'Version' => version }
111
+ response = savon_client . call ( 'CreateSignedDoc' ) do |locals |
112
+ locals . message 'Sesscode' => session_code , 'Format' => 'DIGIDOC-XML' , 'Version' => version
100
113
end
101
114
102
115
result = soap_fault? ( response ) ? response . to_hash [ :fault ] : response . to_hash [ :create_signed_doc_response ]
@@ -116,10 +129,10 @@ def prepare_signature(*args)
116
129
city = options . delete ( :city )
117
130
postal_code = options . delete ( :postal_code )
118
131
119
- response = savon_client . request ( :wsdl , 'PrepareSignature' ) do |soap |
120
- soap . body = { 'Sesscode' => session_code , 'SignersCertificate' => signers_certificate ,
132
+ response = savon_client . call ( 'PrepareSignature' ) do |locals |
133
+ locals . message 'Sesscode' => session_code , 'SignersCertificate' => signers_certificate ,
121
134
'SignersTokenId' => signers_token_id , 'Role' => role , 'City' => city ,
122
- 'State' => state_or_province , 'PostalCode' => postal_code , 'Country' => country_name , 'SigningProfile' => signing_profile }
135
+ 'State' => state_or_province , 'PostalCode' => postal_code , 'Country' => country_name , 'SigningProfile' => signing_profile
123
136
end
124
137
125
138
result = soap_fault? ( response ) ? response . to_hash [ :fault ] : response . to_hash [ :prepare_signature_response ]
@@ -133,8 +146,8 @@ def finalize_signature(*args)
133
146
signature = options . delete ( :signature )
134
147
signature_id = options . delete ( :signature_id )
135
148
136
- response = savon_client . request ( :wsdl , 'FinalizeSignature' ) do |soap |
137
- soap . body = { 'Sesscode' => session_code , 'SignatureValue' => signature , 'SignatureId' => signature_id }
149
+ response = savon_client . call ( 'FinalizeSignature' ) do |locals |
150
+ locals . message 'Sesscode' => session_code , 'SignatureValue' => signature , 'SignatureId' => signature_id
138
151
end
139
152
140
153
result = soap_fault? ( response ) ? response . to_hash [ :fault ] : response . to_hash [ :finalize_signature_response ]
@@ -147,8 +160,8 @@ def notary(*args)
147
160
session_code = options . delete ( :session_code ) || self . session_code
148
161
signature_id = options . delete ( :signature_id )
149
162
150
- response = savon_client . request ( :wsdl , 'GetNotary' ) do |soap |
151
- soap . body = { 'Sesscode' => session_code , 'SignatureId' => signature_id }
163
+ response = savon_client . call ( 'GetNotary' ) do |locals |
164
+ locals . message 'Sesscode' => session_code , 'SignatureId' => signature_id
152
165
end
153
166
154
167
result = soap_fault? ( response ) ? response . to_hash [ :fault ] : response . to_hash [ :get_notary_response ]
@@ -177,13 +190,13 @@ def mobile_sign(*args)
177
190
postal_code = options . delete ( :postal_code )
178
191
phone = ensure_area_code ( phone )
179
192
180
- response = savon_client . request ( :wsdl , 'MobileSign' ) do |soap |
181
- soap . body = { 'Sesscode' => session_code , 'SignersCountry' => country_code , 'CountryName' => country_name ,
193
+ response = savon_client . call ( 'MobileSign' ) do |locals |
194
+ locals . message 'Sesscode' => session_code , 'SignersCountry' => country_code , 'CountryName' => country_name ,
182
195
'SignerPhoneNo' => phone , 'Language' => language , 'ServiceName' => service_name ,
183
196
'AdditionalDataToBeDisplayed' => message_to_display , 'MessagingMode' => messaging_mode ,
184
197
'AsyncConfiguration' => async_configuration , 'ReturnDocInfo' => return_doc_info ,
185
198
'ReturnDocData' => return_doc_data , 'SignerIDCode' => personal_code , 'Role' => role , 'City' => city ,
186
- 'StateOrProvince' => state_or_province , 'PostalCode' => postal_code }
199
+ 'StateOrProvince' => state_or_province , 'PostalCode' => postal_code
187
200
end
188
201
189
202
result = soap_fault? ( response ) ? response . to_hash [ :fault ] : response . to_hash [ :mobile_sign_response ]
@@ -198,8 +211,8 @@ def sign_status(*args)
198
211
return_doc_info = options . key? ( :return_doc_info ) ? options . delete ( :return_doc_info ) : false
199
212
wait_signature = options . key? ( :wait_signature ) ? options . delete ( :wait_signature ) : false
200
213
201
- response = savon_client . request ( :wsdl , 'GetStatusInfo' ) do |soap |
202
- soap . body = { 'Sesscode' => session_code , 'ReturnDocInfo' => return_doc_info , 'WaitSignature' => wait_signature }
214
+ response = savon_client . call ( 'GetStatusInfo' ) do |locals |
215
+ locals . message 'Sesscode' => session_code , 'ReturnDocInfo' => return_doc_info , 'WaitSignature' => wait_signature
203
216
end
204
217
205
218
result = soap_fault? ( response ) ? response . to_hash [ :fault ] : response . to_hash [ :get_status_info_response ]
@@ -211,9 +224,10 @@ def signed_doc_info(*args)
211
224
options = args . last || { }
212
225
session_code = options . delete ( :session_code ) || self . session_code
213
226
214
- response = savon_client . request ( :wsdl , 'GetSignedDocInfo' ) do |soap |
215
- soap . body = { 'Sesscode' => session_code }
227
+ response = savon_client . call ( 'GetSignedDocInfo' ) do |locals |
228
+ locals . message 'Sesscode' => session_code
216
229
end
230
+
217
231
result = soap_fault? ( response ) ? response . to_hash [ :fault ] : response . to_hash [ :get_signed_doc_info_response ]
218
232
respond_with_hash_or_nested ( result )
219
233
end
@@ -223,8 +237,8 @@ def save_signed_doc(*args, &block)
223
237
options = args . last || { }
224
238
session_code = options . delete ( :session_code ) || self . session_code
225
239
226
- response = savon_client . request ( :wsdl , 'GetSignedDoc' ) do |soap |
227
- soap . body = { 'Sesscode' => session_code }
240
+ response = savon_client . call ( 'GetSignedDoc' ) do |locals |
241
+ locals . message 'Sesscode' => session_code
228
242
end
229
243
230
244
if soap_fault? ( response )
@@ -250,8 +264,8 @@ def save_signed_doc(*args, &block)
250
264
251
265
# Closes current session
252
266
def close_session ( session_code = self . session_code )
253
- response = savon_client . request ( :wsdl , 'CloseSession' ) do |soap |
254
- soap . body = { 'Sesscode' => session_code }
267
+ response = savon_client . call ( 'CloseSession' ) do |locals |
268
+ locals . message 'Sesscode' => session_code
255
269
end
256
270
self . session_code = nil
257
271
@@ -269,7 +283,7 @@ def add_datafile(file, *args)
269
283
use_hashcode = false #options.key?(:use_hashcode) || true
270
284
filename = filename . gsub ( '/' , '-' )
271
285
272
- response = savon_client . request ( :wsdl , 'AddDataFile' ) do |soap |
286
+ response = savon_client . call ( 'AddDataFile' ) do |locals |
273
287
file_content = Base64 . encode64 ( file . read )
274
288
# Upload file to webservice
275
289
if use_hashcode
@@ -278,8 +292,8 @@ def add_datafile(file, *args)
278
292
self . embedded_datafiles << datafile
279
293
hex_sha1 = Digest ::SHA1 . hexdigest ( datafile )
280
294
digest_value = Base64 . encode64 ( hex_sha1 . lines . to_a . pack ( 'H*' ) )
281
- soap . body = { 'Sesscode' => session_code , 'FileName' => filename , 'MimeType' => mime_type , 'ContentType' => 'HASHCODE' ,
282
- 'Size' => file . size , 'DigestType' => 'sha1' , 'DigestValue' => digest_value }
295
+ locals . message 'Sesscode' => session_code , 'FileName' => filename , 'MimeType' => mime_type , 'ContentType' => 'HASHCODE' ,
296
+ 'Size' => file . size , 'DigestType' => 'sha1' , 'DigestValue' => digest_value
283
297
else
284
298
soap . body = { 'Sesscode' => session_code , 'FileName' => filename , 'MimeType' => mime_type , 'ContentType' => 'EMBEDDED_BASE64' ,
285
299
'Size' => file . size , 'Content' => file_content }
@@ -301,12 +315,15 @@ def ensure_area_code(phone)
301
315
end
302
316
303
317
def savon_client
304
- Savon ::Client . new do |wsdl , http |
305
- wsdl . endpoint = self . endpoint_url
306
- wsdl . namespace = TargetNamespace
307
- http . open_timeout = 10
308
- http . auth . ssl . verify_mode = :none # todo: add env dependency
309
- end
318
+ Savon . client (
319
+ raise_errors : false ,
320
+ endpoint : self . endpoint_url ,
321
+ namespace : TargetNamespace ,
322
+ open_timeout : 10 ,
323
+ ssl_version : :TLSv1 ,
324
+ ssl_verify_mode : :none ,
325
+ logger : Client . logger
326
+ )
310
327
end
311
328
312
329
def datafile ( filename , mime_type , size , content , id )
@@ -328,11 +345,11 @@ def respond_with_hash_or_nested(hash)
328
345
329
346
# Hex ID generator
330
347
def generate_unique_hex ( codeLength )
331
- validChars = ( "A" .."F" ) . to_a + ( "0" .."9" ) . to_a
332
- length = validChars . size
333
- hexCode = ''
334
- 1 . upto ( codeLength ) { |i | hexCode << validChars [ rand ( length -1 ) ] }
335
- hexCode
348
+ validChars = ( "A" .."F" ) . to_a + ( "0" .."9" ) . to_a
349
+ length = validChars . size
350
+ hexCode = ''
351
+ 1 . upto ( codeLength ) { |i | hexCode << validChars [ rand ( length -1 ) ] }
352
+ hexCode
336
353
end
337
354
338
355
# Generates unique challenge code (consumer token that gets scrumbled by gateway)
0 commit comments