digidoc_client 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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