Skip to content

Commit a3d2000

Browse files
committed
Moved to Savon 2.
1 parent 8f79014 commit a3d2000

File tree

2 files changed

+66
-44
lines changed

2 files changed

+66
-44
lines changed

digidoc_client.gemspec

+7-2
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,14 @@ Gem::Specification.new do |s|
1818
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
1919
s.require_paths = ["lib"]
2020

21-
s.add_dependency 'httpclient', '>= 2.2.4'
22-
s.add_dependency 'savon', '>= 0.9.7'
21+
s.add_dependency 'httpclient', '>= 2.3.4'
22+
s.add_dependency 'savon', '>= 2.4.0'
2323
s.add_dependency 'mime-types', '>= 1.16'
2424
s.add_dependency 'crack', '>= 0.1.8'
2525
s.add_dependency 'nokogiri', '>= 1.4.0'
26+
s.add_development_dependency "rspec"
27+
s.add_development_dependency "guard"
28+
s.add_development_dependency "guard-rspec"
29+
s.add_development_dependency "growl"
30+
s.add_development_dependency "rb-fsevent"
2631
end

lib/digidoc/client.rb

+59-42
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,24 @@
77
require 'digest/sha1'
88
require 'nokogiri'
99

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+
1022
module Digidoc
1123
TargetNamespace = 'http://www.sk.ee/DigiDocService/DigiDocService_2_3.wsdl'
12-
TestEndpointUrl = 'https://openxades.org:8443/DigiDocService'
24+
TestEndpointUrl = 'https://openxades.org:9443/DigiDocService'
1325

1426
class Client
27+
cattr_accessor :logger
1528
attr_accessor :session_code, :endpoint_url, :respond_with_nested_struct, :embedded_datafiles
1629

1730
def initialize(endpoint_url = TestEndpointUrl)
@@ -41,11 +54,11 @@ def authenticate(*args)
4154
self.session_code = nil
4255

4356
# 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,
4659
'MessageToDisplay' => message_to_display, 'SPChallenge' => sp_challenge, 'MessagingMode' => messaging_mode,
4760
'AsyncConfiguration' => async_configuration, 'ReturnCertData' => return_cert_data,
48-
'ReturnRevocationData' => return_revocation_data, 'IdCode' => personal_code }
61+
'ReturnRevocationData' => return_revocation_data, 'IdCode' => personal_code
4962
end
5063

5164
if soap_fault?(response)
@@ -59,8 +72,8 @@ def authenticate(*args)
5972

6073
# Authentication status
6174
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
6477
end
6578

6679
result = soap_fault?(response) ? response.to_hash[:fault] : response.to_hash[:get_mobile_authenticate_status_response]
@@ -75,8 +88,8 @@ def start_session(*args)
7588
signed_doc_file = options.delete(:signed_doc_file)
7689
signed_doc_xml = signed_doc_file.read if signed_doc_file
7790

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
8093
end
8194

8295
if soap_fault?(response)
@@ -95,8 +108,8 @@ def create_signed_doc(*args)
95108
session_code = options.delete(:session_code) || self.session_code
96109
version = options.delete(:version) || '1.3'
97110

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
100113
end
101114

102115
result = soap_fault?(response) ? response.to_hash[:fault] : response.to_hash[:create_signed_doc_response]
@@ -116,10 +129,10 @@ def prepare_signature(*args)
116129
city = options.delete(:city)
117130
postal_code = options.delete(:postal_code)
118131

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,
121134
'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
123136
end
124137

125138
result = soap_fault?(response) ? response.to_hash[:fault] : response.to_hash[:prepare_signature_response]
@@ -133,8 +146,8 @@ def finalize_signature(*args)
133146
signature = options.delete(:signature)
134147
signature_id = options.delete(:signature_id)
135148

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
138151
end
139152

140153
result = soap_fault?(response) ? response.to_hash[:fault] : response.to_hash[:finalize_signature_response]
@@ -147,8 +160,8 @@ def notary(*args)
147160
session_code = options.delete(:session_code) || self.session_code
148161
signature_id = options.delete(:signature_id)
149162

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
152165
end
153166

154167
result = soap_fault?(response) ? response.to_hash[:fault] : response.to_hash[:get_notary_response]
@@ -177,13 +190,13 @@ def mobile_sign(*args)
177190
postal_code = options.delete(:postal_code)
178191
phone = ensure_area_code(phone)
179192

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,
182195
'SignerPhoneNo' => phone, 'Language' => language, 'ServiceName' => service_name,
183196
'AdditionalDataToBeDisplayed' => message_to_display, 'MessagingMode' => messaging_mode,
184197
'AsyncConfiguration' => async_configuration, 'ReturnDocInfo' => return_doc_info,
185198
'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
187200
end
188201

189202
result = soap_fault?(response) ? response.to_hash[:fault] : response.to_hash[:mobile_sign_response]
@@ -198,8 +211,8 @@ def sign_status(*args)
198211
return_doc_info = options.key?(:return_doc_info) ? options.delete(:return_doc_info) : false
199212
wait_signature = options.key?(:wait_signature) ? options.delete(:wait_signature) : false
200213

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
203216
end
204217

205218
result = soap_fault?(response) ? response.to_hash[:fault] : response.to_hash[:get_status_info_response]
@@ -211,9 +224,10 @@ def signed_doc_info(*args)
211224
options = args.last || {}
212225
session_code = options.delete(:session_code) || self.session_code
213226

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
216229
end
230+
217231
result = soap_fault?(response) ? response.to_hash[:fault] : response.to_hash[:get_signed_doc_info_response]
218232
respond_with_hash_or_nested(result)
219233
end
@@ -223,8 +237,8 @@ def save_signed_doc(*args, &block)
223237
options = args.last || {}
224238
session_code = options.delete(:session_code) || self.session_code
225239

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
228242
end
229243

230244
if soap_fault?(response)
@@ -250,8 +264,8 @@ def save_signed_doc(*args, &block)
250264

251265
# Closes current session
252266
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
255269
end
256270
self.session_code = nil
257271

@@ -269,7 +283,7 @@ def add_datafile(file, *args)
269283
use_hashcode = false #options.key?(:use_hashcode) || true
270284
filename = filename.gsub('/', '-')
271285

272-
response = savon_client.request(:wsdl, 'AddDataFile') do |soap|
286+
response = savon_client.call('AddDataFile') do |locals|
273287
file_content = Base64.encode64(file.read)
274288
# Upload file to webservice
275289
if use_hashcode
@@ -278,8 +292,8 @@ def add_datafile(file, *args)
278292
self.embedded_datafiles << datafile
279293
hex_sha1 = Digest::SHA1.hexdigest(datafile)
280294
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
283297
else
284298
soap.body = {'Sesscode' => session_code, 'FileName' => filename, 'MimeType' => mime_type, 'ContentType' => 'EMBEDDED_BASE64',
285299
'Size' => file.size, 'Content' => file_content}
@@ -301,12 +315,15 @@ def ensure_area_code(phone)
301315
end
302316

303317
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+
)
310327
end
311328

312329
def datafile(filename, mime_type, size, content, id)
@@ -328,11 +345,11 @@ def respond_with_hash_or_nested(hash)
328345

329346
# Hex ID generator
330347
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
336353
end
337354

338355
# Generates unique challenge code (consumer token that gets scrumbled by gateway)

0 commit comments

Comments
 (0)