authy 0.0.8 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +5 -5
- data/Gemfile.lock +19 -31
- data/README.md +7 -5
- data/VERSION +1 -1
- data/authy.gemspec +17 -17
- data/lib/authy.rb +4 -3
- data/lib/authy/api.rb +36 -4
- data/lib/authy/response.rb +14 -10
- data/spec/authy/response_spec.rb +5 -3
- metadata +20 -20
data/Gemfile
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
source "http://rubygems.org"
|
2
2
|
|
3
|
-
gem '
|
3
|
+
gem 'httpclient'
|
4
4
|
|
5
5
|
group :development do
|
6
6
|
gem "rspec"
|
7
7
|
gem 'pry'
|
8
|
-
gem "yard"
|
9
|
-
gem "rdoc"
|
10
|
-
gem "jeweler"
|
8
|
+
gem "yard"
|
9
|
+
gem "rdoc"
|
10
|
+
gem "jeweler"
|
11
11
|
gem "simplecov", ">= 0"
|
12
|
-
gem "reek"
|
12
|
+
gem "reek"
|
13
13
|
end
|
data/Gemfile.lock
CHANGED
@@ -1,18 +1,10 @@
|
|
1
1
|
GEM
|
2
2
|
remote: http://rubygems.org/
|
3
3
|
specs:
|
4
|
-
activesupport (3.2.11)
|
5
|
-
i18n (~> 0.6)
|
6
|
-
multi_json (~> 1.0)
|
7
4
|
coderay (1.0.8)
|
8
|
-
dcu-typhoeus (0.4.3)
|
9
|
-
activesupport (~> 3.2)
|
10
|
-
ffi (~> 1.0)
|
11
|
-
mime-types (~> 1.18)
|
12
5
|
diff-lcs (1.1.3)
|
13
|
-
ffi (1.3.1)
|
14
6
|
git (1.2.5)
|
15
|
-
|
7
|
+
httpclient (2.3.2)
|
16
8
|
jeweler (1.8.4)
|
17
9
|
bundler (~> 1.0)
|
18
10
|
git (>= 1.2.5)
|
@@ -20,22 +12,18 @@ GEM
|
|
20
12
|
rdoc
|
21
13
|
json (1.7.6)
|
22
14
|
method_source (0.8.1)
|
23
|
-
mime-types (1.19)
|
24
15
|
multi_json (1.5.0)
|
25
|
-
pry (0.9.
|
16
|
+
pry (0.9.11.4)
|
26
17
|
coderay (~> 1.0.5)
|
27
18
|
method_source (~> 0.8)
|
28
|
-
slop (~> 3.
|
19
|
+
slop (~> 3.4)
|
29
20
|
rake (10.0.3)
|
30
21
|
rdoc (3.12)
|
31
22
|
json (~> 1.4)
|
32
|
-
reek (1.
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
sexp_processor (~> 3.0)
|
37
|
-
ripper_ruby_parser (0.0.8)
|
38
|
-
sexp_processor (~> 3.0)
|
23
|
+
reek (1.3)
|
24
|
+
ruby2ruby (~> 2.0.0)
|
25
|
+
ruby_parser (~> 3.0.4)
|
26
|
+
sexp_processor
|
39
27
|
rspec (2.12.0)
|
40
28
|
rspec-core (~> 2.12.0)
|
41
29
|
rspec-expectations (~> 2.12.0)
|
@@ -44,28 +32,28 @@ GEM
|
|
44
32
|
rspec-expectations (2.12.1)
|
45
33
|
diff-lcs (~> 1.1.3)
|
46
34
|
rspec-mocks (2.12.1)
|
47
|
-
ruby2ruby (
|
48
|
-
ruby_parser (~>
|
49
|
-
sexp_processor (~>
|
50
|
-
ruby_parser (
|
51
|
-
sexp_processor (~>
|
52
|
-
sexp_processor (
|
35
|
+
ruby2ruby (2.0.1)
|
36
|
+
ruby_parser (~> 3.0.0)
|
37
|
+
sexp_processor (~> 4.0)
|
38
|
+
ruby_parser (3.0.4)
|
39
|
+
sexp_processor (~> 4.1)
|
40
|
+
sexp_processor (4.1.4)
|
53
41
|
simplecov (0.7.1)
|
54
42
|
multi_json (~> 1.0)
|
55
43
|
simplecov-html (~> 0.7.1)
|
56
44
|
simplecov-html (0.7.1)
|
57
|
-
slop (3.
|
45
|
+
slop (3.4.3)
|
58
46
|
yard (0.8.3)
|
59
47
|
|
60
48
|
PLATFORMS
|
61
49
|
ruby
|
62
50
|
|
63
51
|
DEPENDENCIES
|
64
|
-
|
65
|
-
jeweler
|
52
|
+
httpclient
|
53
|
+
jeweler
|
66
54
|
pry
|
67
|
-
rdoc
|
68
|
-
reek
|
55
|
+
rdoc
|
56
|
+
reek
|
69
57
|
rspec
|
70
58
|
simplecov
|
71
|
-
yard
|
59
|
+
yard
|
data/README.md
CHANGED
@@ -42,9 +42,10 @@ __NOTE: Token verification is only enforced if the user has completed registrati
|
|
42
42
|
response = Authy::API.verify(:id => user.authy_id, :token => 'token-user-entered')
|
43
43
|
|
44
44
|
if response.ok?
|
45
|
-
|
45
|
+
# token was valid, user can sign in
|
46
46
|
else
|
47
|
-
|
47
|
+
# token is invalid
|
48
|
+
end
|
48
49
|
|
49
50
|
### Forcing Verification
|
50
51
|
|
@@ -59,10 +60,11 @@ If you wish to verify tokens even if the user has not yet complete registration,
|
|
59
60
|
response = Authy::API.request_sms(:id => user.authy_id)
|
60
61
|
|
61
62
|
if response.ok?
|
62
|
-
|
63
|
+
# sms was sent
|
63
64
|
else
|
64
|
-
response.
|
65
|
-
|
65
|
+
response.errors
|
66
|
+
#sms failed to send
|
67
|
+
end
|
66
68
|
|
67
69
|
|
68
70
|
This call will be ignored if the user is using the Authy Mobile App. If you still want to send
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0
|
1
|
+
1.0.0
|
data/authy.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "authy"
|
8
|
-
s.version = "0.0
|
8
|
+
s.version = "0.1.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Authy", "David A. Cuadrado"]
|
12
|
-
s.date = "2013-01-
|
12
|
+
s.date = "2013-01-24"
|
13
13
|
s.description = "Ruby library to access Authy services"
|
14
14
|
s.email = "krawek@gmail.com"
|
15
15
|
s.executables = ["authy-api-console"]
|
@@ -48,33 +48,33 @@ Gem::Specification.new do |s|
|
|
48
48
|
s.specification_version = 3
|
49
49
|
|
50
50
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
51
|
-
s.add_runtime_dependency(%q<
|
51
|
+
s.add_runtime_dependency(%q<httpclient>, [">= 0"])
|
52
52
|
s.add_development_dependency(%q<rspec>, [">= 0"])
|
53
53
|
s.add_development_dependency(%q<pry>, [">= 0"])
|
54
|
-
s.add_development_dependency(%q<yard>, ["
|
55
|
-
s.add_development_dependency(%q<rdoc>, ["
|
56
|
-
s.add_development_dependency(%q<jeweler>, ["
|
54
|
+
s.add_development_dependency(%q<yard>, [">= 0"])
|
55
|
+
s.add_development_dependency(%q<rdoc>, [">= 0"])
|
56
|
+
s.add_development_dependency(%q<jeweler>, [">= 0"])
|
57
57
|
s.add_development_dependency(%q<simplecov>, [">= 0"])
|
58
|
-
s.add_development_dependency(%q<reek>, ["
|
58
|
+
s.add_development_dependency(%q<reek>, [">= 0"])
|
59
59
|
else
|
60
|
-
s.add_dependency(%q<
|
60
|
+
s.add_dependency(%q<httpclient>, [">= 0"])
|
61
61
|
s.add_dependency(%q<rspec>, [">= 0"])
|
62
62
|
s.add_dependency(%q<pry>, [">= 0"])
|
63
|
-
s.add_dependency(%q<yard>, ["
|
64
|
-
s.add_dependency(%q<rdoc>, ["
|
65
|
-
s.add_dependency(%q<jeweler>, ["
|
63
|
+
s.add_dependency(%q<yard>, [">= 0"])
|
64
|
+
s.add_dependency(%q<rdoc>, [">= 0"])
|
65
|
+
s.add_dependency(%q<jeweler>, [">= 0"])
|
66
66
|
s.add_dependency(%q<simplecov>, [">= 0"])
|
67
|
-
s.add_dependency(%q<reek>, ["
|
67
|
+
s.add_dependency(%q<reek>, [">= 0"])
|
68
68
|
end
|
69
69
|
else
|
70
|
-
s.add_dependency(%q<
|
70
|
+
s.add_dependency(%q<httpclient>, [">= 0"])
|
71
71
|
s.add_dependency(%q<rspec>, [">= 0"])
|
72
72
|
s.add_dependency(%q<pry>, [">= 0"])
|
73
|
-
s.add_dependency(%q<yard>, ["
|
74
|
-
s.add_dependency(%q<rdoc>, ["
|
75
|
-
s.add_dependency(%q<jeweler>, ["
|
73
|
+
s.add_dependency(%q<yard>, [">= 0"])
|
74
|
+
s.add_dependency(%q<rdoc>, [">= 0"])
|
75
|
+
s.add_dependency(%q<jeweler>, [">= 0"])
|
76
76
|
s.add_dependency(%q<simplecov>, [">= 0"])
|
77
|
-
s.add_dependency(%q<reek>, ["
|
77
|
+
s.add_dependency(%q<reek>, [">= 0"])
|
78
78
|
end
|
79
79
|
end
|
80
80
|
|
data/lib/authy.rb
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
$:.unshift File.expand_path("..", __FILE__)
|
2
2
|
|
3
|
-
require '
|
4
|
-
|
5
|
-
require 'typhoeus'
|
3
|
+
require 'httpclient'
|
4
|
+
require 'httpclient/include_client'
|
6
5
|
require 'json'
|
6
|
+
|
7
7
|
require 'authy/response'
|
8
8
|
require 'authy/models/user'
|
9
9
|
require 'authy/config'
|
10
10
|
require 'authy/api'
|
11
|
+
|
data/lib/authy/api.rb
CHANGED
@@ -4,7 +4,10 @@ module Authy
|
|
4
4
|
# Authy.api_uri = 'http://test-authy-api.heroku.com/'
|
5
5
|
#
|
6
6
|
class API
|
7
|
-
|
7
|
+
USER_AGENT = "authy-ruby"
|
8
|
+
|
9
|
+
extend HTTPClient::IncludeClient
|
10
|
+
include_http_client
|
8
11
|
|
9
12
|
def self.register_user(attributes)
|
10
13
|
api_key = attributes.delete(:api_key)
|
@@ -14,7 +17,7 @@ module Authy
|
|
14
17
|
}
|
15
18
|
|
16
19
|
url = "#{Authy.api_uri}/protected/json/users/new"
|
17
|
-
response =
|
20
|
+
response = http_client.post(url, :body => escape_query(params))
|
18
21
|
|
19
22
|
Authy::User.new(response)
|
20
23
|
end
|
@@ -29,7 +32,7 @@ module Authy
|
|
29
32
|
user_id = params.delete(:id) || params.delete('id')
|
30
33
|
|
31
34
|
url = "#{Authy.api_uri}/protected/json/verify/#{escape_for_url(token)}/#{escape_for_url(user_id)}"
|
32
|
-
response =
|
35
|
+
response = http_client.get(url, {:api_key => Authy.api_key}.merge(params))
|
33
36
|
|
34
37
|
Authy::Response.new(response)
|
35
38
|
end
|
@@ -41,7 +44,7 @@ module Authy
|
|
41
44
|
user_id = params.delete(:id) || params.delete('id')
|
42
45
|
|
43
46
|
url = "#{Authy.api_uri}/protected/json/sms/#{escape_for_url(user_id)}"
|
44
|
-
response =
|
47
|
+
response = http_client.get(url, {:api_key => Authy.api_key}.merge(params))
|
45
48
|
|
46
49
|
Authy::Response.new(response)
|
47
50
|
end
|
@@ -50,5 +53,34 @@ module Authy
|
|
50
53
|
def self.escape_for_url(field)
|
51
54
|
URI.escape(field.to_s.strip, Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))
|
52
55
|
end
|
56
|
+
|
57
|
+
# Copied and extended from httpclient's HTTP::Message#escape_query()
|
58
|
+
def self.escape_query(query, namespace = nil) # :nodoc:
|
59
|
+
pairs = []
|
60
|
+
query.each { |attr, value|
|
61
|
+
left = namespace ? "#{namespace}[#{attr.to_s}]" : attr.to_s
|
62
|
+
if values = Array.try_convert(value)
|
63
|
+
values.each { |value|
|
64
|
+
if value.respond_to?(:read)
|
65
|
+
value = value.read
|
66
|
+
end
|
67
|
+
|
68
|
+
if value.kind_of?(Hash)
|
69
|
+
pairs.push(escape_query(value, left+"[]"))
|
70
|
+
else
|
71
|
+
pairs.push(HTTP::Message.escape(left+ '[]') << '=' << HTTP::Message.escape(value.to_s))
|
72
|
+
end
|
73
|
+
}
|
74
|
+
elsif values = Hash.try_convert(value)
|
75
|
+
pairs.push(escape_query(values, left.dup))
|
76
|
+
else
|
77
|
+
if value.respond_to?(:read)
|
78
|
+
value = value.read
|
79
|
+
end
|
80
|
+
pairs.push(HTTP::Message.escape(left) << '=' << HTTP::Message.escape(value.to_s))
|
81
|
+
end
|
82
|
+
}
|
83
|
+
pairs.join('&')
|
84
|
+
end
|
53
85
|
end
|
54
86
|
end
|
data/lib/authy/response.rb
CHANGED
@@ -12,23 +12,30 @@ module Authy
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def ok?
|
15
|
-
@raw_response.
|
15
|
+
@raw_response.status == 200
|
16
16
|
end
|
17
|
+
alias :success? :ok?
|
17
18
|
|
18
19
|
def body
|
19
20
|
@raw_response.body
|
20
21
|
end
|
21
22
|
|
22
23
|
def code
|
23
|
-
@raw_response.
|
24
|
+
@raw_response.status
|
24
25
|
end
|
25
26
|
|
26
27
|
def error_msg
|
27
|
-
|
28
|
+
if ok?
|
29
|
+
"No error"
|
30
|
+
elsif self.empty?
|
31
|
+
self.body
|
32
|
+
else
|
33
|
+
self["message"] || "No error"
|
34
|
+
end
|
28
35
|
end
|
29
36
|
|
30
37
|
def errors
|
31
|
-
self[
|
38
|
+
self["errors"] || @errors
|
32
39
|
end
|
33
40
|
|
34
41
|
protected
|
@@ -41,12 +48,9 @@ module Authy
|
|
41
48
|
end
|
42
49
|
|
43
50
|
def parse_body
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
self[k] = v
|
48
|
-
end
|
49
|
-
rescue Exception => e
|
51
|
+
body = JSON.parse(@raw_response.body) rescue {}
|
52
|
+
body.each do |k,v|
|
53
|
+
self[k] = v
|
50
54
|
end
|
51
55
|
end
|
52
56
|
end
|
data/spec/authy/response_spec.rb
CHANGED
@@ -1,9 +1,10 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
1
3
|
describe "Authy::Response" do
|
2
4
|
before :each do
|
3
5
|
@fake_response = OpenStruct.new
|
4
6
|
@fake_response.body = {'v1' => 'r1','v2' => 42}.to_json
|
5
|
-
@fake_response.
|
6
|
-
@fake_response.curl_error_message = 'No error'
|
7
|
+
@fake_response.status = 200
|
7
8
|
|
8
9
|
@response = Authy::Response.new(@fake_response)
|
9
10
|
end
|
@@ -15,7 +16,7 @@ describe "Authy::Response" do
|
|
15
16
|
it "should be ok if the return code is 200" do
|
16
17
|
@response.ok?.should be_true
|
17
18
|
|
18
|
-
@fake_response.
|
19
|
+
@fake_response.status = 401
|
19
20
|
@response = Authy::Response.new(@fake_response)
|
20
21
|
@response.ok?.should be_false
|
21
22
|
end
|
@@ -24,6 +25,7 @@ describe "Authy::Response" do
|
|
24
25
|
@response.error_msg.should == "No error"
|
25
26
|
|
26
27
|
@fake_response.body = 'invalid json'
|
28
|
+
@fake_response.status = 401
|
27
29
|
@response = Authy::Response.new(@fake_response)
|
28
30
|
|
29
31
|
@response.error_msg.should == "invalid json"
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: authy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.0
|
5
|
+
version: 1.0.0
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Authy
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2013-01-
|
13
|
+
date: 2013-01-24 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -19,7 +19,7 @@ dependencies:
|
|
19
19
|
- - ! '>='
|
20
20
|
- !ruby/object:Gem::Version
|
21
21
|
version: '0'
|
22
|
-
name:
|
22
|
+
name: httpclient
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
requirement: !ruby/object:Gem::Requirement
|
@@ -64,50 +64,50 @@ dependencies:
|
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
none: false
|
66
66
|
requirements:
|
67
|
-
- -
|
67
|
+
- - ! '>='
|
68
68
|
- !ruby/object:Gem::Version
|
69
|
-
version: '0
|
69
|
+
version: '0'
|
70
70
|
name: yard
|
71
71
|
type: :development
|
72
72
|
prerelease: false
|
73
73
|
requirement: !ruby/object:Gem::Requirement
|
74
74
|
none: false
|
75
75
|
requirements:
|
76
|
-
- -
|
76
|
+
- - ! '>='
|
77
77
|
- !ruby/object:Gem::Version
|
78
|
-
version: '0
|
78
|
+
version: '0'
|
79
79
|
- !ruby/object:Gem::Dependency
|
80
80
|
version_requirements: !ruby/object:Gem::Requirement
|
81
81
|
none: false
|
82
82
|
requirements:
|
83
|
-
- -
|
83
|
+
- - ! '>='
|
84
84
|
- !ruby/object:Gem::Version
|
85
|
-
version: '
|
85
|
+
version: '0'
|
86
86
|
name: rdoc
|
87
87
|
type: :development
|
88
88
|
prerelease: false
|
89
89
|
requirement: !ruby/object:Gem::Requirement
|
90
90
|
none: false
|
91
91
|
requirements:
|
92
|
-
- -
|
92
|
+
- - ! '>='
|
93
93
|
- !ruby/object:Gem::Version
|
94
|
-
version: '
|
94
|
+
version: '0'
|
95
95
|
- !ruby/object:Gem::Dependency
|
96
96
|
version_requirements: !ruby/object:Gem::Requirement
|
97
97
|
none: false
|
98
98
|
requirements:
|
99
|
-
- -
|
99
|
+
- - ! '>='
|
100
100
|
- !ruby/object:Gem::Version
|
101
|
-
version:
|
101
|
+
version: '0'
|
102
102
|
name: jeweler
|
103
103
|
type: :development
|
104
104
|
prerelease: false
|
105
105
|
requirement: !ruby/object:Gem::Requirement
|
106
106
|
none: false
|
107
107
|
requirements:
|
108
|
-
- -
|
108
|
+
- - ! '>='
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version:
|
110
|
+
version: '0'
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
112
|
version_requirements: !ruby/object:Gem::Requirement
|
113
113
|
none: false
|
@@ -128,18 +128,18 @@ dependencies:
|
|
128
128
|
version_requirements: !ruby/object:Gem::Requirement
|
129
129
|
none: false
|
130
130
|
requirements:
|
131
|
-
- -
|
131
|
+
- - ! '>='
|
132
132
|
- !ruby/object:Gem::Version
|
133
|
-
version:
|
133
|
+
version: '0'
|
134
134
|
name: reek
|
135
135
|
type: :development
|
136
136
|
prerelease: false
|
137
137
|
requirement: !ruby/object:Gem::Requirement
|
138
138
|
none: false
|
139
139
|
requirements:
|
140
|
-
- -
|
140
|
+
- - ! '>='
|
141
141
|
- !ruby/object:Gem::Version
|
142
|
-
version:
|
142
|
+
version: '0'
|
143
143
|
description: Ruby library to access Authy services
|
144
144
|
email: krawek@gmail.com
|
145
145
|
executables:
|
@@ -182,7 +182,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
182
182
|
- !ruby/object:Gem::Version
|
183
183
|
segments:
|
184
184
|
- 0
|
185
|
-
hash:
|
185
|
+
hash: -14009376793020186
|
186
186
|
version: '0'
|
187
187
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
188
188
|
none: false
|