touchpass 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile.lock +3 -3
- data/bin/touchpass +1 -1
- data/lib/touchpass/client.rb +47 -18
- data/lib/touchpass/verification.rb +21 -1
- data/lib/touchpass/version.rb +1 -1
- data/spec/touchpass_client_spec.rb +15 -10
- metadata +1 -1
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
touchpass (0.0
|
4
|
+
touchpass (0.1.0)
|
5
5
|
geocoder (~> 1.1.0)
|
6
6
|
httparty (~> 0.8.0)
|
7
7
|
json (~> 1.6.5)
|
@@ -18,7 +18,7 @@ GEM
|
|
18
18
|
hashie
|
19
19
|
diff-lcs (1.1.3)
|
20
20
|
ffi (1.0.11)
|
21
|
-
geocoder (1.1.
|
21
|
+
geocoder (1.1.4)
|
22
22
|
growl (1.0.3)
|
23
23
|
guard (1.0.2)
|
24
24
|
ffi (>= 0.5.0)
|
@@ -41,7 +41,7 @@ GEM
|
|
41
41
|
diff-lcs (~> 1.1.3)
|
42
42
|
rspec-mocks (2.10.1)
|
43
43
|
thor (0.14.6)
|
44
|
-
xml-simple (1.1.
|
44
|
+
xml-simple (1.1.2)
|
45
45
|
yamler (0.1.0)
|
46
46
|
|
47
47
|
PLATFORMS
|
data/bin/touchpass
CHANGED
data/lib/touchpass/client.rb
CHANGED
@@ -69,7 +69,7 @@ module Touchpass
|
|
69
69
|
response
|
70
70
|
end
|
71
71
|
|
72
|
-
# Get details for a party
|
72
|
+
# Get details for a party (by party id)
|
73
73
|
def get_party_by_id(party_id, options = {})
|
74
74
|
require_api_key
|
75
75
|
require_param(party_id, "party id")
|
@@ -78,6 +78,7 @@ module Touchpass
|
|
78
78
|
submit_request("get", party_url_id(party_id), http_options)
|
79
79
|
end
|
80
80
|
|
81
|
+
# Get details for a party (by username)
|
81
82
|
def get_party(username, options = {})
|
82
83
|
require_api_key
|
83
84
|
require_param(username, "username")
|
@@ -87,7 +88,7 @@ module Touchpass
|
|
87
88
|
end
|
88
89
|
|
89
90
|
# Update details for a party
|
90
|
-
#
|
91
|
+
# options: :email, :first_name, :last_name, :username
|
91
92
|
def update_party_by_id(party_id, options = {})
|
92
93
|
require_api_key
|
93
94
|
require_param(party_id, "party id")
|
@@ -96,6 +97,8 @@ module Touchpass
|
|
96
97
|
submit_request("put", party_url_id(party_id), http_options)
|
97
98
|
end
|
98
99
|
|
100
|
+
# Update details for a party
|
101
|
+
# options: :email, :first_name, :last_name, :username
|
99
102
|
def update_party(username, options = {})
|
100
103
|
require_api_key
|
101
104
|
require_param(username, "username")
|
@@ -105,7 +108,7 @@ module Touchpass
|
|
105
108
|
end
|
106
109
|
|
107
110
|
# Register a new device for a party
|
108
|
-
#
|
111
|
+
# options: :messaging_type, :messaging_value
|
109
112
|
def register_device(username, udid, name, app_id, options = {})
|
110
113
|
require_api_key
|
111
114
|
require_param(username, "username")
|
@@ -156,7 +159,6 @@ module Touchpass
|
|
156
159
|
end
|
157
160
|
|
158
161
|
# Get all devices for a party
|
159
|
-
# needs: :username
|
160
162
|
def get_devices(username, options = {})
|
161
163
|
require_api_key
|
162
164
|
require_param(username, "username")
|
@@ -174,8 +176,7 @@ module Touchpass
|
|
174
176
|
end
|
175
177
|
end
|
176
178
|
|
177
|
-
# Get details for a specific device
|
178
|
-
# the device cannot be found
|
179
|
+
# Get details for a specific device
|
179
180
|
def get_device(username, device_id, options = {})
|
180
181
|
require_api_key
|
181
182
|
require_param(username, "username")
|
@@ -187,8 +188,8 @@ module Touchpass
|
|
187
188
|
submit_request("get", url, http_options)
|
188
189
|
end
|
189
190
|
|
190
|
-
# Update details of a device
|
191
|
-
#
|
191
|
+
# Update details of a device
|
192
|
+
# options: :name, :messaging_type, :messaging_value, :update_pub_key
|
192
193
|
def update_device(username, device_id, options = {})
|
193
194
|
require_api_key
|
194
195
|
require_param(username, "username")
|
@@ -201,7 +202,7 @@ module Touchpass
|
|
201
202
|
submit_request("put", url, http_options)
|
202
203
|
end
|
203
204
|
|
204
|
-
# Remove device
|
205
|
+
# Remove device
|
205
206
|
def remove_device(username, device_id, options = {})
|
206
207
|
require_api_key
|
207
208
|
require_param(username, "username")
|
@@ -225,7 +226,9 @@ module Touchpass
|
|
225
226
|
# them using each device's public key.
|
226
227
|
http_options = standard_http_options(options)
|
227
228
|
response = submit_request("get", "#{@hostname}/#{to_party}/devices", http_options)
|
228
|
-
|
229
|
+
|
230
|
+
vp_devices = response["devices"] || []
|
231
|
+
raise "VP has no registered devices" if vp_devices.empty?
|
229
232
|
|
230
233
|
# create a verification object
|
231
234
|
options = options.merge(:to_party => to_party)
|
@@ -233,7 +236,10 @@ module Touchpass
|
|
233
236
|
http_options = standard_http_options(options, %W{to_party to_device_id to_app_id})
|
234
237
|
http_options[:body].merge!(verification.http_params)
|
235
238
|
|
236
|
-
submit_request("post", "#{@hostname}/verifications", http_options)
|
239
|
+
response = submit_request("post", "#{@hostname}/verifications", http_options)
|
240
|
+
|
241
|
+
verification.attributes = response
|
242
|
+
verification
|
237
243
|
end
|
238
244
|
|
239
245
|
# Get a page of verifications for a particular party id
|
@@ -267,8 +273,25 @@ module Touchpass
|
|
267
273
|
submit_request("get", url, http_options)
|
268
274
|
end
|
269
275
|
|
276
|
+
# fetch verification until state is not 'created'
|
277
|
+
def poll_verification(verification_id, options = {})
|
278
|
+
http_options = standard_http_options(options)
|
279
|
+
timeout = options[:timeout] || 60 # default poll for 60 seconds
|
280
|
+
sleep_time = 5
|
281
|
+
response = nil
|
282
|
+
|
283
|
+
while timeout > 0
|
284
|
+
response = get_verification(verification_id)
|
285
|
+
break if response['state'] != Verification::STATE_CREATED
|
286
|
+
sleep sleep_time
|
287
|
+
timeout -= sleep_time
|
288
|
+
end
|
289
|
+
|
290
|
+
response
|
291
|
+
end
|
292
|
+
|
270
293
|
# Update Verification
|
271
|
-
#
|
294
|
+
# options: :address
|
272
295
|
def update_verification(verification_id, device_id, options = {})
|
273
296
|
require_api_key
|
274
297
|
require_param(verification_id, "verification id")
|
@@ -318,7 +341,6 @@ module Touchpass
|
|
318
341
|
end
|
319
342
|
|
320
343
|
# Reject a verification
|
321
|
-
# needs: :id
|
322
344
|
def reject_verification(verification_id, device_id, options = {})
|
323
345
|
require_api_key
|
324
346
|
require_param(verification_id, "verification id")
|
@@ -372,9 +394,13 @@ module Touchpass
|
|
372
394
|
msg = ""
|
373
395
|
if response['error']
|
374
396
|
msg = response['error']
|
375
|
-
elsif response['errors'].kind_of(Array)
|
376
|
-
|
377
|
-
|
397
|
+
elsif response['errors'].kind_of?(Array)
|
398
|
+
list = []
|
399
|
+
response['errors'].each do |error|
|
400
|
+
err = error['field'] && error['field'] != 'base' ? error['field'] + " " + error['message'] : error['message']
|
401
|
+
list.push(err) if err
|
402
|
+
end
|
403
|
+
msg = list.join(", ")
|
378
404
|
end
|
379
405
|
msg
|
380
406
|
end
|
@@ -407,7 +433,8 @@ module Touchpass
|
|
407
433
|
raise "#{name} required" unless value && value.to_s.length > 0
|
408
434
|
end
|
409
435
|
|
410
|
-
# Submit the request to the server and process the response (for errors)
|
436
|
+
# Submit the request to the server and process the response (for errors).
|
437
|
+
# raises an exception if errors are received in the response.
|
411
438
|
def submit_request(http_verb, request, options)
|
412
439
|
|
413
440
|
request = request + "." + REQUEST_FORMAT
|
@@ -436,7 +463,9 @@ module Touchpass
|
|
436
463
|
puts "DEBUG: "
|
437
464
|
end
|
438
465
|
|
439
|
-
response.to_hash
|
466
|
+
response = response.to_hash
|
467
|
+
raise error_message(response) if errors?(response)
|
468
|
+
response
|
440
469
|
end
|
441
470
|
|
442
471
|
end # class Touchpass::Client
|
@@ -1,9 +1,12 @@
|
|
1
1
|
module Touchpass
|
2
2
|
class Verification
|
3
3
|
|
4
|
+
STATE_CREATED = 'created'
|
5
|
+
|
4
6
|
attr_reader :crypted_salts, :crypted_tokens, :crypted_messages
|
5
7
|
attr_reader :claimed_token
|
6
8
|
attr_reader :location_verification, :claimed_prp, :resolution
|
9
|
+
attr_accessor :attributes
|
7
10
|
|
8
11
|
def initialize(vp_devices, options = {})
|
9
12
|
|
@@ -13,6 +16,7 @@ module Touchpass
|
|
13
16
|
@claimed_token = hashed_token
|
14
17
|
@vp_devices = vp_devices
|
15
18
|
@crypted_messages = []
|
19
|
+
@attributes = {}
|
16
20
|
|
17
21
|
# Encrypt message using each verifying party's (to_party) device public keys
|
18
22
|
add_message(options[:message]) if !options[:message].nil?
|
@@ -85,7 +89,23 @@ module Touchpass
|
|
85
89
|
|
86
90
|
params
|
87
91
|
end
|
88
|
-
|
92
|
+
|
93
|
+
def [](key)
|
94
|
+
@attributes.kind_of?(Hash) ? @attributes[key] : nil
|
95
|
+
end
|
96
|
+
|
97
|
+
def to_h
|
98
|
+
@attributes
|
99
|
+
end
|
100
|
+
|
101
|
+
def id
|
102
|
+
self['id']
|
103
|
+
end
|
104
|
+
|
105
|
+
def state
|
106
|
+
self['state']
|
107
|
+
end
|
108
|
+
|
89
109
|
private
|
90
110
|
|
91
111
|
def param_hash(values)
|
data/lib/touchpass/version.rb
CHANGED
@@ -56,8 +56,10 @@ describe "Touchpass Client" do
|
|
56
56
|
username.length.should be >= 15
|
57
57
|
email = "#{username}@geodica.com"
|
58
58
|
password = "password"
|
59
|
-
|
60
|
-
|
59
|
+
|
60
|
+
lambda {
|
61
|
+
new_party = tpclient.register_party(username, password, email)
|
62
|
+
}.should raise_exception(/username is too long/)
|
61
63
|
end
|
62
64
|
|
63
65
|
it "should not allow a party to register with an empty email address" do
|
@@ -184,8 +186,8 @@ describe "Touchpass Client" do
|
|
184
186
|
end
|
185
187
|
|
186
188
|
it "should allow for removal of a device by id" do
|
187
|
-
udid
|
188
|
-
messaging_value = random_hash # random string
|
189
|
+
udid = random_hash # a random string
|
190
|
+
messaging_value = random_hash # random string
|
189
191
|
|
190
192
|
new_device = tpclient.register_device(@new_party['username'], udid,
|
191
193
|
"#{@username}'s Device",
|
@@ -200,8 +202,9 @@ describe "Touchpass Client" do
|
|
200
202
|
retrieved_devices['devices'].should_not be nil
|
201
203
|
retrieved_devices['devices'].size.should be 0
|
202
204
|
|
203
|
-
|
204
|
-
|
205
|
+
lambda {
|
206
|
+
retrieved_device = tpclient.get_device(@username, new_device['id'])
|
207
|
+
}.should raise_exception(/Device cannot be found/)
|
205
208
|
end
|
206
209
|
|
207
210
|
end
|
@@ -307,11 +310,13 @@ describe "Touchpass Client" do
|
|
307
310
|
|
308
311
|
# We should *not* be able to canel or reject this verification
|
309
312
|
# since it's already been validated.
|
310
|
-
|
311
|
-
|
313
|
+
lambda {
|
314
|
+
response = @vp_client.cancel_verification(verification['id'], @new_device['id'])
|
315
|
+
}.should raise_exception(/has already been responded/)
|
312
316
|
|
313
|
-
|
314
|
-
|
317
|
+
lambda {
|
318
|
+
response = @vp_client.reject_verification(verification['id'], @new_device['id'])
|
319
|
+
}.should raise_exception(/has already been responded/)
|
315
320
|
end
|
316
321
|
end
|
317
322
|
|