digidoc_client 0.1.0 → 0.1.1

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