digidoc_client 0.1.0 → 0.1.1

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: def114f38b327cd277bdc1e7b0d1e35faa36c26e
4
+ data.tar.gz: 5941f074b02e0814004ba8d74cc027baaf884be2
5
+ SHA512:
6
+ metadata.gz: 90a3a9da571a4c238eb49ac3fdfc3513a27b25b29196aa96a7ae6dc12c7780eeb47f2c3c2d0fbb569ce94eb38fd062734f4438dc318f5ee9dfde05c94a1bfa60
7
+ data.tar.gz: b66573ea09748785bac0266f555697b1792ddcaa9b14538da263e61b2a43bb063c4f27435c56bfee5c198230ef8ad9ee7b995cf24b20b0ffac7df377ba4f16b6
@@ -8,13 +8,13 @@ require 'digest/sha1'
8
8
  require 'nokogiri'
9
9
 
10
10
  module Digidoc
11
- TargetNamespace = 'http://www.sk.ee/DigiDocService/DigiDocService_2_3.wsdl'
11
+ TargetNamespace = 'http://www.sk.ee/DigiDocService/DigiDocService_2_3.wsdl'
12
12
  TestEndpointUrl = 'https://openxades.org:8443/DigiDocService'
13
-
13
+
14
14
  class Client
15
15
  attr_accessor :session_code, :endpoint_url, :respond_with_nested_struct, :embedded_datafiles
16
-
17
- def initialize(endpoint_url = TestEndpointUrl)
16
+
17
+ def initialize(endpoint_url = TestEndpointUrl)
18
18
  self.endpoint_url = endpoint_url || TestEndpointUrl
19
19
  self.respond_with_nested_struct = true
20
20
  self.embedded_datafiles = []
@@ -23,7 +23,7 @@ module Digidoc
23
23
  # Authentication message
24
24
  def authenticate(*args)
25
25
  options = args.last || {}
26
-
26
+
27
27
  phone = options.delete(:phone)
28
28
  personal_code = options.delete(:personal_code)
29
29
  country_code = options.delete(:country_code) || 'EE'
@@ -34,15 +34,15 @@ module Digidoc
34
34
  async_configuration = options.delete(:async_configuration) || 0
35
35
  return_cert_data = options.key?(:return_cert_data) ? options.delete(:return_cer_data) : true
36
36
  return_revocation_data = options.key?(:return_revocation_data) ? options.delete(:return_revocation_data) : true
37
-
37
+
38
38
  # SP challenge token
39
39
  sp_challenge = generate_sp_challenge
40
40
  phone = ensure_area_code(phone)
41
41
  self.session_code = nil
42
-
42
+
43
43
  # Make webservice call
44
44
  response = savon_client.request(:wsdl, 'MobileAuthenticate') do |soap|
45
- soap.body = {'CountryCode' => country_code, 'PhoneNo' => phone, 'Language' => language, 'ServiceName' => service_name,
45
+ soap.body = {'CountryCode' => country_code, 'PhoneNo' => phone, 'Language' => language, 'ServiceName' => service_name,
46
46
  'MessageToDisplay' => message_to_display, 'SPChallenge' => sp_challenge, 'MessagingMode' => messaging_mode,
47
47
  'AsyncConfiguration' => async_configuration, 'ReturnCertData' => return_cert_data,
48
48
  'ReturnRevocationData' => return_revocation_data, 'IdCode' => personal_code }
@@ -56,13 +56,13 @@ module Digidoc
56
56
  end
57
57
  respond_with_hash_or_nested(result)
58
58
  end
59
-
59
+
60
60
  # Authentication status
61
61
  def authentication_status(session_code = self.session_code)
62
62
  response = savon_client.request(:wsdl, 'GetMobileAuthenticateStatus') do |soap|
63
63
  soap.body = {'Sesscode' => session_code }
64
- end
65
-
64
+ end
65
+
66
66
  result = soap_fault?(response) ? response.to_hash[:fault] : response.to_hash[:get_mobile_authenticate_status_response]
67
67
  respond_with_hash_or_nested(result)
68
68
  end
@@ -74,38 +74,38 @@ module Digidoc
74
74
  options = args.last || {}
75
75
  signed_doc_file = options.delete(:signed_doc_file)
76
76
  signed_doc_xml = signed_doc_file.read if signed_doc_file
77
-
77
+
78
78
  response = savon_client.request(:wsdl, 'StartSession') do |soap|
79
79
  soap.body = { 'bHoldSession' => true, 'SigDocXML' => signed_doc_xml}
80
80
  end
81
-
81
+
82
82
  if soap_fault?(response)
83
- result = response.to_hash[:fault]
83
+ result = response.to_hash[:fault]
84
84
  else
85
85
  result = response.to_hash[:start_session_response]
86
86
  self.session_code = result[:sesscode]
87
87
  end
88
88
  respond_with_hash_or_nested(result)
89
89
  end
90
-
90
+
91
91
  # Creates DigiDoc container
92
92
  def create_signed_doc(*args)
93
93
  options = args.last || {}
94
-
94
+
95
95
  session_code = options.delete(:session_code) || self.session_code
96
96
  version = options.delete(:version) || '1.3'
97
-
97
+
98
98
  response = savon_client.request(:wsdl, 'CreateSignedDoc') do |soap|
99
99
  soap.body = {'Sesscode' => session_code, 'Format' => 'DIGIDOC-XML', 'Version' => version}
100
100
  end
101
-
101
+
102
102
  result = soap_fault?(response) ? response.to_hash[:fault] : response.to_hash[:create_signed_doc_response]
103
103
  respond_with_hash_or_nested(result)
104
104
  end
105
-
105
+
106
106
  def prepare_signature(*args)
107
107
  options = args.last || {}
108
-
108
+
109
109
  session_code = options.delete(:session_code) || self.session_code
110
110
  signers_certificate = options.delete(:signers_certificate)
111
111
  signers_token_id = options.delete(:signers_token_id)
@@ -114,51 +114,51 @@ module Digidoc
114
114
  state_or_province = options.delete(:state_or_province)
115
115
  role = options.delete(:role)
116
116
  city = options.delete(:city)
117
- postal_code = options.delete(:postal_code)
118
-
117
+ postal_code = options.delete(:postal_code)
118
+
119
119
  response = savon_client.request(:wsdl, 'PrepareSignature') do |soap|
120
- soap.body = {'Sesscode' => session_code, 'SignersCertificate' => signers_certificate,
120
+ soap.body = {'Sesscode' => session_code, 'SignersCertificate' => signers_certificate,
121
121
  'SignersTokenId' => signers_token_id, 'Role' => role, 'City' => city,
122
122
  'State' => state_or_province, 'PostalCode' => postal_code, 'Country' => country_name, 'SigningProfile' => signing_profile }
123
123
  end
124
-
124
+
125
125
  result = soap_fault?(response) ? response.to_hash[:fault] : response.to_hash[:prepare_signature_response]
126
- respond_with_hash_or_nested(result)
126
+ respond_with_hash_or_nested(result)
127
127
  end
128
-
128
+
129
129
  def finalize_signature(*args)
130
130
  options = args.last || {}
131
-
131
+
132
132
  session_code = options.delete(:session_code) || self.session_code
133
133
  signature = options.delete(:signature)
134
134
  signature_id = options.delete(:signature_id)
135
-
135
+
136
136
  response = savon_client.request(:wsdl, 'FinalizeSignature') do |soap|
137
137
  soap.body = {'Sesscode' => session_code, 'SignatureValue' => signature, 'SignatureId' => signature_id}
138
138
  end
139
-
139
+
140
140
  result = soap_fault?(response) ? response.to_hash[:fault] : response.to_hash[:finalize_signature_response]
141
- respond_with_hash_or_nested(result)
141
+ respond_with_hash_or_nested(result)
142
142
  end
143
143
 
144
144
  def notary(*args)
145
145
  options = args.last || {}
146
-
146
+
147
147
  session_code = options.delete(:session_code) || self.session_code
148
148
  signature_id = options.delete(:signature_id)
149
-
149
+
150
150
  response = savon_client.request(:wsdl, 'GetNotary') do |soap|
151
151
  soap.body = {'Sesscode' => session_code, 'SignatureId' => signature_id}
152
152
  end
153
-
153
+
154
154
  result = soap_fault?(response) ? response.to_hash[:fault] : response.to_hash[:get_notary_response]
155
- respond_with_hash_or_nested(result)
155
+ respond_with_hash_or_nested(result)
156
156
  end
157
-
157
+
158
158
  # Sign DigiDoc container
159
159
  def mobile_sign(*args)
160
160
  options = args.last || {}
161
-
161
+
162
162
  session_code = options.delete(:session_code) || self.session_code
163
163
  phone = options.delete(:phone)
164
164
  personal_code = options.delete(:personal_code)
@@ -176,99 +176,99 @@ module Digidoc
176
176
  city = options.delete(:city)
177
177
  postal_code = options.delete(:postal_code)
178
178
  phone = ensure_area_code(phone)
179
-
179
+
180
180
  response = savon_client.request(:wsdl, 'MobileSign') do |soap|
181
- soap.body = {'Sesscode' => session_code, 'SignersCountry' => country_code, 'CountryName' => country_name,
182
- 'SignerPhoneNo' => phone, 'Language' => language, 'ServiceName' => service_name,
181
+ soap.body = {'Sesscode' => session_code, 'SignersCountry' => country_code, 'CountryName' => country_name,
182
+ 'SignerPhoneNo' => phone, 'Language' => language, 'ServiceName' => service_name,
183
183
  'AdditionalDataToBeDisplayed' => message_to_display, 'MessagingMode' => messaging_mode,
184
184
  'AsyncConfiguration' => async_configuration, 'ReturnDocInfo' => return_doc_info,
185
185
  'ReturnDocData' => return_doc_data, 'SignerIDCode' => personal_code, 'Role' => role, 'City' => city,
186
186
  'StateOrProvince' => state_or_province, 'PostalCode' => postal_code }
187
187
  end
188
-
188
+
189
189
  result = soap_fault?(response) ? response.to_hash[:fault] : response.to_hash[:mobile_sign_response]
190
190
  respond_with_hash_or_nested(result)
191
191
  end
192
-
192
+
193
193
  # Get session status info.
194
194
  def sign_status(*args)
195
195
  options = args.last || {}
196
-
196
+
197
197
  session_code = options.delete(:session_code) || self.session_code
198
198
  return_doc_info = options.key?(:return_doc_info) ? options.delete(:return_doc_info) : false
199
199
  wait_signature = options.key?(:wait_signature) ? options.delete(:wait_signature) : false
200
-
200
+
201
201
  response = savon_client.request(:wsdl, 'GetStatusInfo') do |soap|
202
202
  soap.body = {'Sesscode' => session_code, 'ReturnDocInfo' => return_doc_info, 'WaitSignature' => wait_signature}
203
203
  end
204
-
204
+
205
205
  result = soap_fault?(response) ? response.to_hash[:fault] : response.to_hash[:get_status_info_response]
206
206
  respond_with_hash_or_nested(result)
207
207
  end
208
-
208
+
209
209
  # Get DigiDoc container status
210
210
  def signed_doc_info(*args)
211
- options = args.last || {}
211
+ options = args.last || {}
212
212
  session_code = options.delete(:session_code) || self.session_code
213
-
213
+
214
214
  response = savon_client.request(:wsdl, 'GetSignedDocInfo') do |soap|
215
215
  soap.body = {'Sesscode' => session_code }
216
216
  end
217
217
  result = soap_fault?(response) ? response.to_hash[:fault] : response.to_hash[:get_signed_doc_info_response]
218
218
  respond_with_hash_or_nested(result)
219
219
  end
220
-
220
+
221
221
  # Get DigiDoc container
222
222
  def save_signed_doc(*args, &block)
223
- options = args.last || {}
223
+ options = args.last || {}
224
224
  session_code = options.delete(:session_code) || self.session_code
225
-
225
+
226
226
  response = savon_client.request(:wsdl, 'GetSignedDoc') do |soap|
227
227
  soap.body = {'Sesscode' => session_code }
228
228
  end
229
-
229
+
230
230
  if soap_fault?(response)
231
231
  result = respond_with_hash_or_nested(response.to_hash[:fault])
232
232
  else
233
- escaped = Crack::XML.parse(response.http.body).to_hash['SOAP_ENV:Envelope']['SOAP_ENV:Body']['d:GetSignedDocResponse']['SignedDocData']
233
+ escaped = Crack::XML.parse(response.http.body).to_hash['SOAP_ENV:Envelope']['SOAP_ENV:Body']['dig:GetSignedDocResponse']['SignedDocData']
234
234
  # TODO: is escaping needed? - it removes original escaped & form XML
235
235
  digidoc_container = escaped#CGI.unescapeHTML(escaped)
236
-
236
+
237
237
  if embedded_datafiles.present?
238
238
  xmldata = Nokogiri::XML(digidoc_container)
239
239
  xmldata.root.elements.each { |el| el.replace(embedded_datafiles.shift) if el.name == 'DataFile' }
240
240
  digidoc_container = xmldata.to_xml
241
241
  end
242
-
242
+
243
243
  if block_given?
244
244
  yield digidoc_container
245
245
  else
246
246
  digidoc_container
247
247
  end
248
- end
248
+ end
249
249
  end
250
-
250
+
251
251
  # Closes current session
252
252
  def close_session(session_code = self.session_code)
253
253
  response = savon_client.request(:wsdl, 'CloseSession') do |soap|
254
254
  soap.body = {'Sesscode' => session_code }
255
255
  end
256
256
  self.session_code = nil
257
-
257
+
258
258
  result = soap_fault?(response) ? response.to_hash[:fault] : response.to_hash[:close_session_response]
259
259
  respond_with_hash_or_nested(result)
260
260
  end
261
-
261
+
262
262
  # Add datafile to DigiDoc container
263
263
  def add_datafile(file, *args)
264
264
  options = args.last || {}
265
-
265
+
266
266
  session_code = options.delete(:session_code) || self.session_code
267
267
  filename = options.delete(:filename) || File.basename(file.path)
268
268
  mime_type = options[:mime_type] || calc_mime_type(file)
269
269
  use_hashcode = false #options.key?(:use_hashcode) || true
270
270
  filename = filename.gsub('/', '-')
271
-
271
+
272
272
  response = savon_client.request(:wsdl, 'AddDataFile') do |soap|
273
273
  file_content = Base64.encode64(file.read)
274
274
  # Upload file to webservice
@@ -277,25 +277,25 @@ module Digidoc
277
277
  datafile = datafile(filename, mime_type, file.size, file_content, embedded_datafiles.size)
278
278
  self.embedded_datafiles << datafile
279
279
  hex_sha1 = Digest::SHA1.hexdigest(datafile)
280
- digest_value = Base64.encode64(hex_sha1.lines.to_a.pack('H*'))
281
- soap.body = {'Sesscode' => session_code, 'FileName' => filename, 'MimeType' => mime_type, 'ContentType' => 'HASHCODE',
280
+ 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
282
  'Size' => file.size, 'DigestType' => 'sha1', 'DigestValue' => digest_value}
283
283
  else
284
- soap.body = {'Sesscode' => session_code, 'FileName' => filename, 'MimeType' => mime_type, 'ContentType' => 'EMBEDDED_BASE64',
285
- 'Size' => file.size, 'Content' => file_content}
284
+ soap.body = {'Sesscode' => session_code, 'FileName' => filename, 'MimeType' => mime_type, 'ContentType' => 'EMBEDDED_BASE64',
285
+ 'Size' => file.size, 'Content' => file_content}
286
286
  end
287
287
  end
288
-
288
+
289
289
  result = soap_fault?(response) ? response.to_hash[:fault] : response.to_hash[:add_data_file_response]
290
290
  respond_with_hash_or_nested(result)
291
291
  end
292
-
293
- private
292
+
293
+ private
294
294
 
295
295
  def soap_fault?(response)
296
296
  response.http.body =~ /<*Fault>/
297
297
  end
298
-
298
+
299
299
  def ensure_area_code(phone)
300
300
  phone =~ /^\+/ ? phone : "+372#{phone}" unless phone.blank?
301
301
  end
@@ -308,16 +308,16 @@ module Digidoc
308
308
  http.auth.ssl.verify_mode = :none # todo: add env dependency
309
309
  end
310
310
  end
311
-
311
+
312
312
  def datafile(filename, mime_type, size, content, id)
313
313
  datafile = "<DataFile ContentType=\"EMBEDDED_BASE64\" Filename=\"#{filename}\" Id=\"D#{id}\" MimeType=\"#{mime_type}\" Size=\"#{size}\">#{content}</DataFile>"
314
314
  end
315
-
315
+
316
316
  def calc_mime_type(file)
317
317
  return unless file
318
318
  MIME::Types.type_for(File.basename(file.path)).first.try(:content_type) || 'text/plain'
319
319
  end
320
-
320
+
321
321
  def respond_with_hash_or_nested(hash)
322
322
  if respond_with_nested_struct
323
323
  NestedOpenStruct.new(hash)
@@ -325,7 +325,7 @@ module Digidoc
325
325
  hash
326
326
  end
327
327
  end
328
-
328
+
329
329
  # Hex ID generator
330
330
  def generate_unique_hex(codeLength)
331
331
  validChars = ("A".."F").to_a + ("0".."9").to_a
@@ -1,3 +1,3 @@
1
1
  module Digidoc
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
metadata CHANGED
@@ -1,71 +1,85 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: digidoc_client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
5
- prerelease:
4
+ version: 0.1.1
6
5
  platform: ruby
7
6
  authors:
8
7
  - Tarmo Talu
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2012-02-16 00:00:00.000000000 Z
11
+ date: 2014-02-19 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: httpclient
16
- requirement: &70266165239460 !ruby/object:Gem::Requirement
17
- none: false
15
+ requirement: !ruby/object:Gem::Requirement
18
16
  requirements:
19
- - - ! '>='
17
+ - - '>='
20
18
  - !ruby/object:Gem::Version
21
19
  version: 2.2.4
22
20
  type: :runtime
23
21
  prerelease: false
24
- version_requirements: *70266165239460
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: 2.2.4
25
27
  - !ruby/object:Gem::Dependency
26
28
  name: savon
27
- requirement: &70266165235620 !ruby/object:Gem::Requirement
28
- none: false
29
+ requirement: !ruby/object:Gem::Requirement
29
30
  requirements:
30
- - - ! '>='
31
+ - - '>='
31
32
  - !ruby/object:Gem::Version
32
33
  version: 0.9.7
33
34
  type: :runtime
34
35
  prerelease: false
35
- version_requirements: *70266165235620
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: 0.9.7
36
41
  - !ruby/object:Gem::Dependency
37
42
  name: mime-types
38
- requirement: &70266165247780 !ruby/object:Gem::Requirement
39
- none: false
43
+ requirement: !ruby/object:Gem::Requirement
40
44
  requirements:
41
- - - ! '>='
45
+ - - '>='
42
46
  - !ruby/object:Gem::Version
43
47
  version: '1.16'
44
48
  type: :runtime
45
49
  prerelease: false
46
- version_requirements: *70266165247780
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '1.16'
47
55
  - !ruby/object:Gem::Dependency
48
56
  name: crack
49
- requirement: &70266165242420 !ruby/object:Gem::Requirement
50
- none: false
57
+ requirement: !ruby/object:Gem::Requirement
51
58
  requirements:
52
- - - ! '>='
59
+ - - '>='
53
60
  - !ruby/object:Gem::Version
54
61
  version: 0.1.8
55
62
  type: :runtime
56
63
  prerelease: false
57
- version_requirements: *70266165242420
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: 0.1.8
58
69
  - !ruby/object:Gem::Dependency
59
70
  name: nokogiri
60
- requirement: &70266165265600 !ruby/object:Gem::Requirement
61
- none: false
71
+ requirement: !ruby/object:Gem::Requirement
62
72
  requirements:
63
- - - ! '>='
73
+ - - '>='
64
74
  - !ruby/object:Gem::Version
65
75
  version: 1.4.0
66
76
  type: :runtime
67
77
  prerelease: false
68
- version_requirements: *70266165265600
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: 1.4.0
69
83
  description: An easy way to interact with Estonian DigiDoc services.
70
84
  email:
71
85
  - tarmo.talu@gmail.com
@@ -83,26 +97,25 @@ files:
83
97
  - lib/digidoc_client.rb
84
98
  homepage: http://github.com/tarmotalu/digidoc_client
85
99
  licenses: []
100
+ metadata: {}
86
101
  post_install_message:
87
102
  rdoc_options: []
88
103
  require_paths:
89
104
  - lib
90
105
  required_ruby_version: !ruby/object:Gem::Requirement
91
- none: false
92
106
  requirements:
93
- - - ! '>='
107
+ - - '>='
94
108
  - !ruby/object:Gem::Version
95
109
  version: '0'
96
110
  required_rubygems_version: !ruby/object:Gem::Requirement
97
- none: false
98
111
  requirements:
99
- - - ! '>='
112
+ - - '>='
100
113
  - !ruby/object:Gem::Version
101
114
  version: '0'
102
115
  requirements: []
103
116
  rubyforge_project: digidoc_client
104
- rubygems_version: 1.8.11
117
+ rubygems_version: 2.1.10
105
118
  signing_key:
106
- specification_version: 3
119
+ specification_version: 4
107
120
  summary: Ruby library to interact with Estonian DigiDoc services.
108
121
  test_files: []