devise_latcheable 0.0.2

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: ac3d2d79ef58d64be02863357e9918e77306d069
4
+ data.tar.gz: d7d0d3776541db5329a5b447347ee64a64c54acc
5
+ SHA512:
6
+ metadata.gz: 0d73534e4516d884c987d0c496427283c0437c5fde09014e581bf6b3e124f8be4afc2f4747a38bf915b0ec000207bb1cea8873e242fe26764d56f4a90949e421
7
+ data.tar.gz: d70bf7d306e4dc8bedaa57ed621351133b2ac2f46413fd30c82c1e876f0f43da24ccdc12237fa538b2e19ce07d02724c26fbf15e9ee9b31fd55238a0dfc91c67
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "http://rubygems.org"
2
+
3
+ gemspec
@@ -0,0 +1,9 @@
1
+ class DeviseLatcheable::RegistrationsController < Devise::RegistrationsController
2
+ before_filter :configure_permitted_parameters, :only => [:create]
3
+
4
+ protected
5
+
6
+ def configure_permitted_parameters
7
+ devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:email, :password, :password_confirmation, :pair_code) }
8
+ end
9
+ end
@@ -0,0 +1,32 @@
1
+ <h2>Sign up</h2>
2
+
3
+ <%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
4
+ <%= devise_error_messages! %>
5
+
6
+ <div class="field">
7
+ <%= f.label :email %><br />
8
+ <%= f.email_field :email, autofocus: true %>
9
+ </div>
10
+
11
+ <div class="field">
12
+ <%= f.label :password %>
13
+ <% if @minimum_password_length %>
14
+ <em>(<%= @minimum_password_length %> characters minimum)</em>
15
+ <% end %><br />
16
+ <%= f.password_field :password, autocomplete: "off" %>
17
+ </div>
18
+
19
+ <div class="field">
20
+ <%= f.label :password_confirmation %><br />
21
+ <%= f.password_field :password_confirmation, autocomplete: "off" %>
22
+ </div>
23
+
24
+ <div class="field">
25
+ <%= f.label :pair_code %><br />
26
+ <%= f.text_field :pair_code, autocomplete: "off" %>
27
+ </div>
28
+
29
+ <div class="actions">
30
+ <%= f.submit "Sign up" %>
31
+ </div>
32
+ <% end %>
@@ -0,0 +1,29 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "devise_latcheable/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = 'devise_latcheable'
7
+ s.version = DeviseLatcheable::VERSION.dup
8
+ s.platform = Gem::Platform::RUBY
9
+ s.summary = 'Devise extension that checks Latch status to log users in the app'
10
+ s.email = 'crresse@gmail.com'
11
+ # s.homepage = ''
12
+ s.description = s.summary
13
+ s.authors = ['Carlos Rodriguez']
14
+ s.license = 'MIT'
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
+ s.add_dependency('devise', '>= 3.0')
22
+ s.add_dependency('latchsdk', '>= 1.1')
23
+
24
+ # s.add_development_dependency('rake', '>= 0.9')
25
+ # s.add_development_dependency('rdoc', '>= 3')
26
+ s.add_development_dependency('rails', '>= 4.0')
27
+ # s.add_development_dependency('sqlite3')
28
+ # s.add_development_dependency('rspec-rails')
29
+ end
@@ -0,0 +1,13 @@
1
+ require 'latchsdk'
2
+ require 'devise'
3
+ require 'devise_latcheable/adapter'
4
+ require 'devise_latcheable/model'
5
+ require 'devise_latcheable/strategy'
6
+ require 'devise_latcheable/engine'
7
+
8
+ module DeviseLatcheable
9
+ end
10
+
11
+ Devise.add_module :latcheable,
12
+ route: :session, strategy: true,
13
+ controller: :sessions, model: 'devise_latcheable/model'
@@ -0,0 +1,34 @@
1
+ module Devise
2
+ module Latch
3
+ @yaml_config = YAML.load(File.read("config/latch.yml"))
4
+ @latch_instance = ::Latch.new @yaml_config['app_id'], @yaml_config['app_secret']
5
+
6
+ # => Pairs an user with the server.
7
+ # @returns Account ID on success and nil on failure
8
+ def self.pair(code)
9
+ res = @latch_instance.pair code
10
+ return nil if res.data.nil?
11
+ res.data['accountId']
12
+ end
13
+
14
+ # => Checks if the app lock is open
15
+ def self.unlocked?(account_id)
16
+ res = @latch_instance.status account_id
17
+ return false unless res.error.nil?
18
+
19
+ key = res.data['operations'].keys.first
20
+ status = res.data['operations'][key]['status']
21
+ status == 'on'
22
+ end
23
+
24
+ # => Removes the pairing from lath
25
+ def self.unpair(account_id)
26
+ res = @latch_instance.unpair account_id
27
+ res.error.nil? ? true : false
28
+ end
29
+
30
+ def self.config
31
+ @yaml_config
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,4 @@
1
+ module DeviseLatcheable
2
+ class Engine < Rails::Engine
3
+ end
4
+ end
@@ -0,0 +1,50 @@
1
+ module Devise
2
+ module Models
3
+ module Latcheable
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ # We only use pair code to pair the user with latch. Once it is
8
+ # paired, we dont need the pair code anymore, so we wont save
9
+ # it on the database
10
+ attr_accessor :pair_code
11
+
12
+ after_initialize :latch_enable
13
+
14
+ before_create :latch_pair!
15
+ before_destroy :latch_unpair!
16
+ end
17
+
18
+ def latch_enabled?
19
+ latch_enabled
20
+ end
21
+
22
+ def latch_unlocked?
23
+ return true unless latch_enabled?
24
+ return false if latch_account_id.nil?
25
+ Devise::Latch.unlocked? latch_account_id
26
+ end
27
+
28
+ def latch_unpair!
29
+ return true unless latch_enabled?
30
+ return true if latch_account_id.nil?
31
+ Devise::Latch.unpair latch_account_id
32
+ end
33
+
34
+ def latch_pair!
35
+ return true unless latch_enabled?
36
+
37
+ self.latch_account_id = Devise::Latch.pair pair_code
38
+
39
+ if latch_account_id.nil?
40
+ errors.add(:base, 'Invalid latch pair code')
41
+ return false
42
+ end
43
+ end
44
+
45
+ def latch_enable
46
+ self.latch_enabled = true if Devise::Latch.config['always_enabled'] == true
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,19 @@
1
+ require 'devise/strategies/authenticatable'
2
+
3
+ module Devise
4
+ module Strategies
5
+ class Latcheable < Authenticatable
6
+ def authenticate!
7
+ resource = mapping.to.find_by(authentication_hash)
8
+
9
+ if resource && validate(resource) { resource.latch_unlocked? }
10
+ success! resource
11
+ else
12
+ fail 'Latch is locked. Unlock and try again.'
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+
19
+ Warden::Strategies.add :latcheable, Devise::Strategies::Latcheable
@@ -0,0 +1,3 @@
1
+ module DeviseLatcheable
2
+ VERSION = "0.0.2".freeze
3
+ end
@@ -0,0 +1,19 @@
1
+ require 'rails/generators/active_record'
2
+
3
+ module ActiveRecord
4
+ module Generators
5
+ class DeviseLatcheableGenerator < ActiveRecord::Generators::Base
6
+ source_root File.expand_path("../../templates", __FILE__)
7
+ desc 'Creates a migration'
8
+ class_option :orm
9
+
10
+ def copy_devise_latcheable_migration
11
+ migration_template "migration.rb", "db/migrate/add_devise_latcheable_to_#{table_name}.rb"
12
+ end
13
+
14
+ def copy_config
15
+ template "latch.yml", "config/latch.yml"
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,16 @@
1
+ require 'rails/generators/named_base'
2
+
3
+ module DeviseLatcheable
4
+ module Generators
5
+ class DeviseLatcheableGenerator < Rails::Generators::NamedBase
6
+ source_root File.expand_path("../../templates", __FILE__)
7
+ namespace "devise_latcheable"
8
+
9
+ hook_for :orm
10
+
11
+ def show_readme
12
+ readme "README"
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,15 @@
1
+
2
+ ======================================
3
+ Only two more steps to go:
4
+
5
+ 1. Run rake db:migrate
6
+
7
+ 2. Modify config/latch.yml
8
+ Paste your app id and your app secret code there
9
+
10
+ Latch is enabled by default in all instances.
11
+
12
+ If you want to use it only in certain instances, set 'always_enabled' to false
13
+ on your latch.yml file and set latch_enabled to true in the instance
14
+ that should be checked against Latch
15
+ ======================================
@@ -0,0 +1,3 @@
1
+ app_id: 'YOUR_APP_ID'
2
+ app_secret: 'YOUR_APP_SECRET'
3
+ always_enabled: true
@@ -0,0 +1,6 @@
1
+ class AddDeviseLatcheableTo<%= table_name.camelize %> < ActiveRecord::Migration
2
+ def change
3
+ add_column :<%= table_name %>, :latch_account_id, :string
4
+ add_column :<%= table_name %>, :latch_enabled, :boolean
5
+ end
6
+ end
metadata ADDED
@@ -0,0 +1,100 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: devise_latcheable
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - Carlos Rodriguez
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-01-10 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: devise
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '3.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '3.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: latchsdk
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '1.1'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '1.1'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rails
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '4.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '4.0'
55
+ description: Devise extension that checks Latch status to log users in the app
56
+ email: crresse@gmail.com
57
+ executables: []
58
+ extensions: []
59
+ extra_rdoc_files: []
60
+ files:
61
+ - Gemfile
62
+ - app/controllers/devise_latcheable/registrations_controller.rb
63
+ - app/views/devise_latcheable/registrations/new.html.erb
64
+ - devise_latcheable.gemspec
65
+ - lib/devise_latcheable.rb
66
+ - lib/devise_latcheable/adapter.rb
67
+ - lib/devise_latcheable/engine.rb
68
+ - lib/devise_latcheable/model.rb
69
+ - lib/devise_latcheable/strategy.rb
70
+ - lib/devise_latcheable/version.rb
71
+ - lib/generators/active_record/devise_latcheable_generator.rb
72
+ - lib/generators/devise_latcheable/devise_latcheable_generator.rb
73
+ - lib/generators/templates/README
74
+ - lib/generators/templates/latch.yml
75
+ - lib/generators/templates/migration.rb
76
+ homepage:
77
+ licenses:
78
+ - MIT
79
+ metadata: {}
80
+ post_install_message:
81
+ rdoc_options: []
82
+ require_paths:
83
+ - lib
84
+ required_ruby_version: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ required_rubygems_version: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - ">="
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ requirements: []
95
+ rubyforge_project:
96
+ rubygems_version: 2.4.5
97
+ signing_key:
98
+ specification_version: 4
99
+ summary: Devise extension that checks Latch status to log users in the app
100
+ test_files: []