digidoc_client 0.1.1 → 0.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: def114f38b327cd277bdc1e7b0d1e35faa36c26e
4
- data.tar.gz: 5941f074b02e0814004ba8d74cc027baaf884be2
3
+ metadata.gz: 225a15c978fa06d9f84aa749118ee378ff81ee1f
4
+ data.tar.gz: 4ed207821b4f5df451f31b4d7b3d262601e358ad
5
5
  SHA512:
6
- metadata.gz: 90a3a9da571a4c238eb49ac3fdfc3513a27b25b29196aa96a7ae6dc12c7780eeb47f2c3c2d0fbb569ce94eb38fd062734f4438dc318f5ee9dfde05c94a1bfa60
7
- data.tar.gz: b66573ea09748785bac0266f555697b1792ddcaa9b14538da263e61b2a43bb063c4f27435c56bfee5c198230ef8ad9ee7b995cf24b20b0ffac7df377ba4f16b6
6
+ metadata.gz: c57c02ac4baefe83045e6577102ced2722a60830865eba8741ac3d485400b0014d946e4d9d3a288566b3cc5a2859e35faba35d95ea28ea5c9563b99a06d3fbd6
7
+ data.tar.gz: 8a5ade4410c890d33fa7115b01e9afb415f5b8ad66dba37990ffa9fcc1ad5d3d8d83112558d158707be4047e49e5ea6be93a14ac192e5691ea90120298e87f20
data/Guardfile ADDED
@@ -0,0 +1,20 @@
1
+ guard 'rspec' do
2
+ watch(%r{^spec/.+_spec\.rb$})
3
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
4
+ watch('spec/spec_helper.rb') { "spec" }
5
+
6
+ # Rails example
7
+ watch(%r{^app/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
8
+ watch(%r{^app/(.*)(\.erb|\.haml)$}) { |m| "spec/#{m[1]}#{m[2]}_spec.rb" }
9
+ watch(%r{^app/controllers/(.+)_(controller)\.rb$}) { |m| ["spec/routing/#{m[1]}_routing_spec.rb", "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/acceptance/#{m[1]}_spec.rb"] }
10
+ watch(%r{^spec/support/(.+)\.rb$}) { "spec" }
11
+ watch('config/routes.rb') { "spec/routing" }
12
+ watch('app/controllers/application_controller.rb') { "spec/controllers" }
13
+
14
+ # Capybara features specs
15
+ watch(%r{^app/views/(.+)/.*\.(erb|haml)$}) { |m| "spec/features/#{m[1]}_spec.rb" }
16
+
17
+ # Turnip features and steps
18
+ watch(%r{^spec/acceptance/(.+)\.feature$})
19
+ watch(%r{^spec/acceptance/steps/(.+)_steps\.rb$}) { |m| Dir[File.join("**/#{m[1]}.feature")][0] || 'spec/acceptance' }
20
+ end
@@ -18,9 +18,14 @@ Gem::Specification.new do |s|
18
18
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
19
  s.require_paths = ["lib"]
20
20
 
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'
23
23
  s.add_dependency 'mime-types', '>= 1.16'
24
24
  s.add_dependency 'crack', '>= 0.1.8'
25
25
  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"
26
31
  end
@@ -7,11 +7,24 @@ require 'mime/types'
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 @@ module Digidoc
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 @@ module Digidoc
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 @@ module Digidoc
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 @@ module Digidoc
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 @@ module Digidoc
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 @@ module Digidoc
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 @@ module Digidoc
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 @@ module Digidoc
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 @@ module Digidoc
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 @@ module Digidoc
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 @@ module Digidoc
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 @@ module Digidoc
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 @@ module Digidoc
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 @@ module Digidoc
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 @@ module Digidoc
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 @@ module Digidoc
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)
@@ -1,3 +1,3 @@
1
1
  module Digidoc
2
- VERSION = "0.1.1"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+
3
+ describe Digidoc::Client do
4
+ describe "#authenticate" do
5
+ before do
6
+ @client = Digidoc::Client.new
7
+ @response = @client.authenticate(phone: phone)
8
+ end
9
+
10
+ let(:phone) {}
11
+
12
+ context '303' do
13
+ let(:phone) { '+37200001' }
14
+
15
+ it "returns error" do
16
+ @response.faultstring.should == '303'
17
+ end
18
+ end
19
+
20
+ context 'close_session' do
21
+ it 'closes session' do
22
+ @client.close_session
23
+ end
24
+ end
25
+ end
26
+ end
data/spec/spec.opts ADDED
@@ -0,0 +1,4 @@
1
+ --colour
2
+ --format specdoc
3
+ --loadby mtime
4
+ --reverse
@@ -0,0 +1,11 @@
1
+ require 'bundler/setup'
2
+ Bundler.setup
3
+
4
+ require 'digidoc_client'
5
+
6
+ RSpec.configure do |config|
7
+ config.mock_with :rspec
8
+ config.treat_symbols_as_metadata_keys_with_true_values = true
9
+ config.filter_run :focus => true
10
+ config.run_all_when_everything_filtered = true
11
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: digidoc_client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tarmo Talu
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-19 00:00:00.000000000 Z
11
+ date: 2014-05-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: httpclient
@@ -16,28 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - '>='
18
18
  - !ruby/object:Gem::Version
19
- version: 2.2.4
19
+ version: 2.3.4
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - '>='
25
25
  - !ruby/object:Gem::Version
26
- version: 2.2.4
26
+ version: 2.3.4
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: savon
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - '>='
32
32
  - !ruby/object:Gem::Version
33
- version: 0.9.7
33
+ version: 2.4.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - '>='
39
39
  - !ruby/object:Gem::Version
40
- version: 0.9.7
40
+ version: 2.4.0
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: mime-types
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -80,6 +80,76 @@ dependencies:
80
80
  - - '>='
81
81
  - !ruby/object:Gem::Version
82
82
  version: 1.4.0
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: guard
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: guard-rspec
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - '>='
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: growl
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - '>='
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - '>='
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: rb-fsevent
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - '>='
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - '>='
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
83
153
  description: An easy way to interact with Estonian DigiDoc services.
84
154
  email:
85
155
  - tarmo.talu@gmail.com
@@ -89,12 +159,16 @@ extra_rdoc_files: []
89
159
  files:
90
160
  - .gitignore
91
161
  - Gemfile
162
+ - Guardfile
92
163
  - README.markdown
93
164
  - Rakefile
94
165
  - digidoc_client.gemspec
95
166
  - lib/digidoc/client.rb
96
167
  - lib/digidoc/version.rb
97
168
  - lib/digidoc_client.rb
169
+ - spec/lib/client_spec.rb
170
+ - spec/spec.opts
171
+ - spec/spec_helper.rb
98
172
  homepage: http://github.com/tarmotalu/digidoc_client
99
173
  licenses: []
100
174
  metadata: {}
@@ -118,4 +192,7 @@ rubygems_version: 2.1.10
118
192
  signing_key:
119
193
  specification_version: 4
120
194
  summary: Ruby library to interact with Estonian DigiDoc services.
121
- test_files: []
195
+ test_files:
196
+ - spec/lib/client_spec.rb
197
+ - spec/spec.opts
198
+ - spec/spec_helper.rb