live_ensure 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,5 @@
1
+ *DS_Store
2
+ *.gem
3
+ .bundle
4
+ Gemfile.lock
5
+ pkg/*
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ -f progress -c
data/.travis.yml ADDED
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.8.7
4
+ - 1.9.3
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in live_ensure.gemspec
4
+ gemspec
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2012 Inspire Studios Inc.
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject
9
+ to the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
16
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require 'rspec/core/rake_task'
2
+ require "bundler/gem_tasks"
3
+
4
+ RSpec::Core::RakeTask.new
5
+
6
+ task :default => :spec
@@ -0,0 +1,13 @@
1
+ require 'active_support/concern'
2
+
3
+ module Accessible
4
+ extend ActiveSupport::Concern
5
+
6
+ module ClassMethods
7
+ def accessible(*vars)
8
+ vars.each do |var|
9
+ define_method(var.to_s, proc{ @hash["#{var}"] })
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,24 @@
1
+ require 'active_support/concern'
2
+
3
+ module LiveEnsure
4
+ module Configure
5
+ extend ActiveSupport::Concern
6
+
7
+ module ClassMethods
8
+ def configure
9
+ yield configuration
10
+ end
11
+
12
+ def configuration
13
+ @configuration ||= Configuration.new
14
+ end
15
+
16
+ class Configuration
17
+ attr_accessor :api_key
18
+ attr_accessor :api_password
19
+ attr_accessor :api_agent_id
20
+ attr_accessor :enabled
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,6 @@
1
+ module LiveEnsure
2
+ class ServiceDown < StandardError; end
3
+ class InvalidResponse < StandardError; end
4
+ class AuthSessionError < StandardError; end
5
+ class ConnectionError < StandardError; end
6
+ end
@@ -0,0 +1,12 @@
1
+ module LiveEnsure
2
+ class Response
3
+
4
+ include Accessible
5
+
6
+ def initialize(response)
7
+ @response = response
8
+ @hash = {}
9
+ parse_response
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,40 @@
1
+ require 'live_ensure/accessible'
2
+ require 'live_ensure/response'
3
+ require 'live_ensure'
4
+ require 'live_ensure/errors'
5
+
6
+ module LiveEnsure
7
+ class SessionStatusResponse < Response
8
+ accessible :token, :message, :client, :session, :deviceHash, :knownDevice, :agent
9
+
10
+ def parse_response
11
+ @response_lines = @response.split("\n")
12
+ parse_token
13
+ parse_other
14
+ end
15
+
16
+ def parse_token
17
+ split_line = @response_lines.shift.split(':')
18
+ @hash['token'] = split_line[1]
19
+ end
20
+
21
+ def parse_other
22
+ @response_lines.each do |line|
23
+ key, val = line.split(':').map(&:strip)
24
+ @hash[key] = val
25
+ end
26
+ end
27
+
28
+ def valid?
29
+ @hash['message'] == 'SUCCESS'
30
+ end
31
+
32
+ def failed?
33
+ @hash['message'] == 'FAILED'
34
+ end
35
+
36
+ def undetermined?
37
+ @hash['message'] == 'SESSION_UNDETERMINED'
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,41 @@
1
+ require 'live_ensure/accessible'
2
+ require 'live_ensure/response'
3
+ require 'live_ensure'
4
+ require 'live_ensure/errors'
5
+
6
+ module LiveEnsure
7
+ class SetupResponse < Response
8
+ accessible :launch_url, :token, :code, :base_url
9
+
10
+ def parse_response
11
+ raise InvalidResponse unless vars.size > 0
12
+
13
+ parse_response_code
14
+ end
15
+
16
+ def parse_response_code
17
+ response_code = vars[0].split(':')
18
+
19
+ @hash['code'] = response_code[0].to_i
20
+
21
+ case @hash['code']
22
+ when 0
23
+ raise AuthSessionError
24
+ when 1
25
+ @hash['base_url'] = LiveEnsure::HOST
26
+ @hash['launch_url'] = "#{HOST}/launcher?sessionToken=#{response_code[1]}"
27
+ @hash['token'] = response_code[1]
28
+ when 2
29
+ raise ServiceDown
30
+ when 4
31
+ @hash['base_url'] = @vars[1]
32
+ @hash['launch_url'] = "#{@vars[1]}/launcher?sessionToken=#{response_code[1]}"
33
+ @hash['token'] = response_code[1]
34
+ end
35
+ end
36
+
37
+ def vars
38
+ @vars ||= @response.split("\n")
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,3 @@
1
+ module LiveEnsure
2
+ VERSION = "0.2.1"
3
+ end
@@ -0,0 +1,47 @@
1
+ require 'patron'
2
+
3
+ require 'live_ensure/accessible'
4
+ require 'live_ensure/configure'
5
+ require 'live_ensure/errors'
6
+ require 'live_ensure/session_status_response'
7
+ require 'live_ensure/setup_response'
8
+ require "live_ensure/version"
9
+
10
+ module LiveEnsure
11
+ HOST = "https://app.liveensure.com/live-identity"
12
+
13
+ include Configure
14
+
15
+ class << self
16
+
17
+ def request_launch(email)
18
+ SetupResponse.new(get(start_url(email)))
19
+ end
20
+
21
+ def session_status(token, base_url)
22
+ SessionStatusResponse.new(get(session_status_url(token), base_url))
23
+ end
24
+
25
+ def get(url, base_url = '')
26
+ connection = Patron::Session.new
27
+ connection.connect_timeout = 5
28
+ connection.timeout = 10
29
+ connection.base_url = base_url unless base_url.empty?
30
+ response = connection.get(url)
31
+
32
+ if response.status < 400
33
+ response.body
34
+ else
35
+ raise ConnectionError, response.status
36
+ end
37
+ end
38
+
39
+ def start_url(email)
40
+ "#{HOST}/idr/sessionStart/4/#{email}/#{configuration.api_agent_id}/#{configuration.api_key}/#{configuration.api_password}"
41
+ end
42
+
43
+ def session_status_url(token)
44
+ "/idr/sessionStatus/4/#{token}/#{configuration.api_key}/#{configuration.api_password}"
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,26 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "live_ensure/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "live_ensure"
7
+ s.version = LiveEnsure::VERSION
8
+ s.authors = ["Steve Thompson"]
9
+ s.email = ["me@stevedev.com"]
10
+ s.homepage = "http://www.inspirestudios.ca"
11
+ s.summary = %q{Live Ensure API for Ruby}
12
+ s.description = %q{Library for interfacing with Live Ensure's Two Factor Auth}
13
+
14
+ s.rubyforge_project = "live_ensure"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+
21
+ # specify any dependencies here; for example:
22
+ s.add_development_dependency "rake", "~> 0.9.2.2"
23
+ s.add_development_dependency "rspec", "~> 2.10"
24
+ s.add_runtime_dependency "patron", "~> 0.4"
25
+ s.add_runtime_dependency "activesupport", "~> 3.2.3"
26
+ end
data/readme.md ADDED
@@ -0,0 +1,108 @@
1
+ # LiveEnsure
2
+
3
+ [![Build Status](https://secure.travis-ci.org/InspireStudios/live_ensure.png)](http://travis-ci.org/InspireStudios/live_ensure)
4
+
5
+ Library for implementing two-factor auth via liveensure.com.
6
+
7
+ ## Getting Started
8
+
9
+ First, head over to http://www.liveensure.com/ to setup your account and get your API credentials.
10
+
11
+ Add a line to your gemfile:
12
+
13
+ ```ruby
14
+ gem 'live_ensure', :git => 'git@github.com:InspireStudios/live_ensure.git'
15
+ ```
16
+
17
+ Create an initializer for your rails app:
18
+
19
+ ```ruby
20
+ # /config/initializers/live_ensure.rb
21
+
22
+ LiveEnsure.configure do |config|
23
+ config.api_key = 'KEY'
24
+ config.api_password = 'PASSWORD'
25
+ config.api_agent_id = 'AGENT_ID'
26
+ config.enabled = true # Leave this out if you want to set it per environment
27
+ end
28
+ ```
29
+
30
+ Optionally, enable or disable per environment by adding to your development.rb/staging.rb/etc...
31
+
32
+ ```ruby
33
+ LiveEnsure.configure { |config| config.enabled = true }
34
+ ```
35
+
36
+ ## Implementing LiveEnsure
37
+
38
+ *Refer to the guides at http://support.liveensure.com/forums/20038873-guides for more details.*
39
+
40
+ Request a token:
41
+
42
+ ```ruby
43
+ @live_ensure = LiveEnsure.request_launch(email)
44
+ session[:live_ensure_token] = @live_ensure.token
45
+ session[:live_ensure_base_url] = @live_ensure.base_url
46
+ ```
47
+
48
+ Add to your view:
49
+
50
+ ```ruby
51
+ <%= content_tag(:iframe, '', { src: @live_ensure.launch_url, width: 190, height: 190, frameborder: 0}) %>
52
+ ```
53
+
54
+ You will need to setup an action to handle a session check using the LiveEnsure.session_status method to detect when the user has successfully authenticated. I use something like this on my sessions controller:
55
+
56
+ ```ruby
57
+ def check_auth
58
+ if session[:live_ensure_token]
59
+ response = LiveEnsure.session_status(session[:live_ensure_token], session[:live_ensure_base_url])
60
+ result = { status: response.message }
61
+ else
62
+ result = { status: 'no-token' }
63
+ end
64
+
65
+ render json: result
66
+ end
67
+ ```
68
+
69
+ Then I check it from the view using this javascript:
70
+
71
+ ```javascript
72
+ var check_auth_interval;
73
+
74
+ function checkAuth() {
75
+ $.getJSON('/check_auth', function(data) {
76
+
77
+ if (data.status == 'SUCCESS') {
78
+ location.href = '/complete_auth';
79
+ } else if (data.status == null || data.status == 'FAILED') {
80
+ location.href = '/login';
81
+ } else {
82
+ setTimeout(checkAuth, 1000);
83
+ }
84
+ });
85
+ }
86
+
87
+ $(function() {
88
+ check_auth_interval = setTimeout(checkAuth, 1000);
89
+ });
90
+ ```
91
+
92
+ When you get a success message and redirect to the final step, do another check on the session status:
93
+
94
+ ```ruby
95
+ response = LiveEnsure.session_status(session[:live_ensure_token], session[:live_ensure_base_url])
96
+
97
+ if response.valid?
98
+ # sign in the user!
99
+ else
100
+ # fail!
101
+ end
102
+ ```
103
+
104
+ Want to contribute? Write specs, and send me a detailed pull request.
105
+
106
+ ## License
107
+
108
+ Licensed under the MIT license: http://www.opensource.org/licenses/MIT
@@ -0,0 +1,103 @@
1
+ require 'live_ensure'
2
+
3
+ describe LiveEnsure do
4
+
5
+ def stub_patron(body = 'success')
6
+ @stub_response = stub('patron_response', :status => 200, :body => body)
7
+ Patron::Session.any_instance.stub(:get).and_return(@stub_response)
8
+ end
9
+
10
+ def configure_live_ensure
11
+ LiveEnsure.configure do |config|
12
+ config.api_key = 'API_KEY'
13
+ config.api_password = 'API_PASSWORD'
14
+ config.api_agent_id = 'AGENT_ID'
15
+ end
16
+ end
17
+
18
+ describe ".configure" do
19
+ it "should let you set the api_key" do
20
+ LiveEnsure.configure do |config|
21
+ config.api_key = '1234'
22
+ end
23
+
24
+ LiveEnsure.configuration.api_key.should == '1234'
25
+ end
26
+
27
+ it "should let you set the api_password" do
28
+ LiveEnsure.configure do |config|
29
+ config.api_password = '1234'
30
+ end
31
+
32
+ LiveEnsure.configuration.api_password.should == '1234'
33
+ end
34
+
35
+ it "should let you set the agent_id" do
36
+ LiveEnsure.configure do |config|
37
+ config.api_agent_id = '1234'
38
+ end
39
+
40
+ LiveEnsure.configuration.api_agent_id.should == '1234'
41
+ end
42
+
43
+ it "should let you set the enabled config" do
44
+ LiveEnsure.configure do |config|
45
+ config.enabled = true
46
+ end
47
+
48
+ LiveEnsure.configuration.enabled = true
49
+ end
50
+ end
51
+
52
+ describe ".request_launch" do
53
+ before do
54
+ configure_live_ensure
55
+ stub_patron("4:5yqUulMdWhmXStCWVlJCKDjl:1\nhttps://app01.liveensure.com/live-identity\n")
56
+ end
57
+
58
+ subject { LiveEnsure.request_launch('test@stevedev.com') }
59
+
60
+ it { should be_a LiveEnsure::SetupResponse }
61
+ its(:launch_url) { should == "https://app01.liveensure.com/live-identity/launcher?sessionToken=5yqUulMdWhmXStCWVlJCKDjl" }
62
+ its(:token) { should == '5yqUulMdWhmXStCWVlJCKDjl' }
63
+ end
64
+
65
+ describe ".session_status" do
66
+ let(:session_status_response) { "3:a3SDQmP8PUf6jdGqqTN9O7D5:6\nmessage: SESSION_UNDETERMINED\nclient: light plus\nsession: unknown\ndeviceHash: f234eb56bcde603d85176e6c1c3db473\nknownDevice: true\nagent: quick\n" }
67
+ let(:token) { '5yqUulMdWhmXStCWVlJCKDjl' }
68
+ let(:base_url) { 'https://app01.liveensure.com/live-identity/' }
69
+
70
+ before do
71
+ configure_live_ensure
72
+ stub_patron(session_status_response)
73
+ end
74
+
75
+ it "should raise an ArgumentError if the base_url is blank" do
76
+ expect {
77
+ LiveEnsure.session_status(token)
78
+ }.to raise_error ArgumentError
79
+ end
80
+
81
+ it "should return a SessionStatusResponse object" do
82
+ LiveEnsure.session_status(token, base_url).should be_a LiveEnsure::SessionStatusResponse
83
+ end
84
+ end
85
+
86
+ describe ".get" do
87
+ it "should create a new Patron session" do
88
+ session = Patron::Session.new
89
+ Patron::Session.should_receive(:new).and_return(session)
90
+
91
+ stub_patron
92
+ LiveEnsure.get('http://www.example.com')
93
+ end
94
+
95
+ it "should raise a ConnectionError if response status is >= 400" do
96
+ stub_patron
97
+ @stub_response.stub(:status => 404)
98
+ expect {
99
+ LiveEnsure.get('http://www.example.com')
100
+ }.to raise_error LiveEnsure::ConnectionError
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,69 @@
1
+ require 'live_ensure/session_status_response'
2
+
3
+ describe LiveEnsure::SessionStatusResponse do
4
+ let(:response) { "3:a3SDQmP8PUf6jdGqqTN9O7D5:6\nmessage: SESSION_UNDETERMINED\nclient: light plus\nsession: unknown\ndeviceHash: f234eb56bcde603d85176e6c1c3db473\nknownDevice: true\nagent: quick\n" }
5
+
6
+ describe "attrs" do
7
+ before do
8
+ @response = LiveEnsure::SessionStatusResponse.new(response)
9
+ end
10
+
11
+ subject { @response }
12
+
13
+ its(:message) { should == 'SESSION_UNDETERMINED' }
14
+ its(:token) { should == 'a3SDQmP8PUf6jdGqqTN9O7D5' }
15
+ its(:client) { should == 'light plus' }
16
+ its(:session) { should == 'unknown' }
17
+ its(:deviceHash) { should == 'f234eb56bcde603d85176e6c1c3db473' }
18
+ its(:knownDevice) { should == 'true' }
19
+ its(:agent) { should == 'quick' }
20
+ end
21
+
22
+ describe "#valid?" do
23
+ it "should be valid if message == SUCCESS" do
24
+ response_str = "3:a3SDQmP8PUf6jdGqqTN9O7D5:6\nmessage: SUCCESS\nclient: light plus\nsession: unknown\ndeviceHash: f234eb56bcde603d85176e6c1c3db473\nknownDevice: true\nagent: quick\n"
25
+ response = LiveEnsure::SessionStatusResponse.new(response_str)
26
+ response.should be_valid
27
+ end
28
+
29
+ it "should not be valid if message == FAILED" do
30
+ response_str = "3:a3SDQmP8PUf6jdGqqTN9O7D5:6\nmessage: FAILED\nclient: light plus\nsession: unknown\ndeviceHash: f234eb56bcde603d85176e6c1c3db473\nknownDevice: true\nagent: quick\n"
31
+ response = LiveEnsure::SessionStatusResponse.new(response_str)
32
+ response.should_not be_valid
33
+ end
34
+
35
+ it "should not be valid if message == SESSION_UNDETERMINED" do
36
+ response_str = "3:a3SDQmP8PUf6jdGqqTN9O7D5:6\nmessage: SESSION_UNDETERMINED\nclient: light plus\nsession: unknown\ndeviceHash: f234eb56bcde603d85176e6c1c3db473\nknownDevice: true\nagent: quick\n"
37
+ response = LiveEnsure::SessionStatusResponse.new(response_str)
38
+ response.should_not be_valid
39
+ end
40
+ end
41
+
42
+ describe "#failed?" do
43
+ it "should be failed if message == FAILED" do
44
+ response_str = "3:a3SDQmP8PUf6jdGqqTN9O7D5:6\nmessage: FAILED\nclient: light plus\nsession: unknown\ndeviceHash: f234eb56bcde603d85176e6c1c3db473\nknownDevice: true\nagent: quick\n"
45
+ response = LiveEnsure::SessionStatusResponse.new(response_str)
46
+ response.should be_failed
47
+ end
48
+
49
+ it "should not be valid if message != FAILED" do
50
+ response_str = "3:a3SDQmP8PUf6jdGqqTN9O7D5:6\nmessage: SUCCESS\nclient: light plus\nsession: unknown\ndeviceHash: f234eb56bcde603d85176e6c1c3db473\nknownDevice: true\nagent: quick\n"
51
+ response = LiveEnsure::SessionStatusResponse.new(response_str)
52
+ response.should_not be_failed
53
+ end
54
+ end
55
+
56
+ describe "#undetermined?" do
57
+ it "should be undetermined if message == SESSION_UNDETERMINED" do
58
+ response_str = "3:a3SDQmP8PUf6jdGqqTN9O7D5:6\nmessage: SESSION_UNDETERMINED\nclient: light plus\nsession: unknown\ndeviceHash: f234eb56bcde603d85176e6c1c3db473\nknownDevice: true\nagent: quick\n"
59
+ response = LiveEnsure::SessionStatusResponse.new(response_str)
60
+ response.should be_undetermined
61
+ end
62
+
63
+ it "should not be undetermined if message != SESSION_UNDETERMINED" do
64
+ response_str = "3:a3SDQmP8PUf6jdGqqTN9O7D5:6\nmessage: SUCCESS\nclient: light plus\nsession: unknown\ndeviceHash: f234eb56bcde603d85176e6c1c3db473\nknownDevice: true\nagent: quick\n"
65
+ response = LiveEnsure::SessionStatusResponse.new(response_str)
66
+ response.should_not be_undetermined
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,80 @@
1
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
2
+
3
+ require 'live_ensure/setup_response'
4
+
5
+ describe LiveEnsure::SetupResponse do
6
+ let(:input) { "4:5yqUulMdWhmXStCWVlJCKDjl:1\nhttps://app01.liveensure.com/live-identity\n" }
7
+
8
+ it "should accept the provided string" do
9
+ response = LiveEnsure::SetupResponse.new(input)
10
+ end
11
+
12
+ describe "attrs" do
13
+ before do
14
+ @response = LiveEnsure::SetupResponse.new("4:Foo:1\nhttps://app01.liveensure.com/live-identity\n")
15
+ end
16
+
17
+ subject { @response }
18
+
19
+ its(:launch_url) { should == "https://app01.liveensure.com/live-identity/launcher?sessionToken=Foo" }
20
+ its(:token) { should == "Foo" }
21
+ its(:code) { should == 4 }
22
+ its(:base_url) { should == 'https://app01.liveensure.com/live-identity' }
23
+ end
24
+
25
+ describe "invalid input" do
26
+ it "should throw an exeption if content of input is invalid" do
27
+ expect {
28
+ LiveEnsure::SetupResponse.new("")
29
+ }.to raise_error LiveEnsure::InvalidResponse
30
+ end
31
+ end
32
+
33
+ describe "response codes" do
34
+ describe "0" do
35
+ it "should raise an AuthSessionError" do
36
+ expect {
37
+ LiveEnsure::SetupResponse.new("0:null:error_code_or_message")
38
+ }.to raise_error LiveEnsure::AuthSessionError
39
+ end
40
+ end
41
+
42
+ describe "1" do
43
+ before do
44
+ response_string = "1:5yqUulMdWhmXStCWVlJCKDjl:successMessage\n"
45
+ @response = LiveEnsure::SetupResponse.new(response_string)
46
+ end
47
+
48
+ it "should return the default URL" do
49
+ @response.launch_url.should == "#{LiveEnsure::HOST}/launcher?sessionToken=5yqUulMdWhmXStCWVlJCKDjl"
50
+ end
51
+
52
+ it "should set the code to 1" do
53
+ @response.code.should == 1
54
+ end
55
+ end
56
+
57
+ describe "2" do
58
+ it "should raise a ServiceDown exception" do
59
+ expect {
60
+ LiveEnsure::SetupResponse.new('2:errorToken:service_down_message')
61
+ }.to raise_error LiveEnsure::ServiceDown
62
+ end
63
+ end
64
+
65
+ describe "4" do
66
+ before do
67
+ @response = LiveEnsure::SetupResponse.new(input)
68
+ end
69
+
70
+ it "should return the supplied URL instead of the default" do
71
+ @response.launch_url.should == 'https://app01.liveensure.com/live-identity/launcher?sessionToken=5yqUulMdWhmXStCWVlJCKDjl'
72
+ end
73
+
74
+ it "should set the code to 4" do
75
+ @response.code.should == 4
76
+ end
77
+ end
78
+ end
79
+
80
+ end
metadata ADDED
@@ -0,0 +1,111 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: live_ensure
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Steve Thompson
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-05-23 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rake
16
+ requirement: &70109444336520 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 0.9.2.2
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: *70109444336520
25
+ - !ruby/object:Gem::Dependency
26
+ name: rspec
27
+ requirement: &70109444197080 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ~>
31
+ - !ruby/object:Gem::Version
32
+ version: '2.10'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: *70109444197080
36
+ - !ruby/object:Gem::Dependency
37
+ name: patron
38
+ requirement: &70109444194640 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ~>
42
+ - !ruby/object:Gem::Version
43
+ version: '0.4'
44
+ type: :runtime
45
+ prerelease: false
46
+ version_requirements: *70109444194640
47
+ - !ruby/object:Gem::Dependency
48
+ name: activesupport
49
+ requirement: &70109444191580 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: 3.2.3
55
+ type: :runtime
56
+ prerelease: false
57
+ version_requirements: *70109444191580
58
+ description: Library for interfacing with Live Ensure's Two Factor Auth
59
+ email:
60
+ - me@stevedev.com
61
+ executables: []
62
+ extensions: []
63
+ extra_rdoc_files: []
64
+ files:
65
+ - .gitignore
66
+ - .rspec
67
+ - .travis.yml
68
+ - Gemfile
69
+ - MIT-LICENSE
70
+ - Rakefile
71
+ - lib/live_ensure.rb
72
+ - lib/live_ensure/accessible.rb
73
+ - lib/live_ensure/configure.rb
74
+ - lib/live_ensure/errors.rb
75
+ - lib/live_ensure/response.rb
76
+ - lib/live_ensure/session_status_response.rb
77
+ - lib/live_ensure/setup_response.rb
78
+ - lib/live_ensure/version.rb
79
+ - live_ensure.gemspec
80
+ - readme.md
81
+ - spec/live_ensure_spec.rb
82
+ - spec/session_status_response_spec.rb
83
+ - spec/setup_response_spec.rb
84
+ homepage: http://www.inspirestudios.ca
85
+ licenses: []
86
+ post_install_message:
87
+ rdoc_options: []
88
+ require_paths:
89
+ - lib
90
+ required_ruby_version: !ruby/object:Gem::Requirement
91
+ none: false
92
+ requirements:
93
+ - - ! '>='
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ required_rubygems_version: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ requirements: []
103
+ rubyforge_project: live_ensure
104
+ rubygems_version: 1.8.10
105
+ signing_key:
106
+ specification_version: 3
107
+ summary: Live Ensure API for Ruby
108
+ test_files:
109
+ - spec/live_ensure_spec.rb
110
+ - spec/session_status_response_spec.rb
111
+ - spec/setup_response_spec.rb