letmein 0.0.4 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/VERSION +1 -1
- data/letmein.gemspec +2 -2
- data/lib/letmein.rb +35 -57
- data/test/letmein_test.rb +23 -36
- metadata +4 -4
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.5
|
data/letmein.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{letmein}
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.5"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Oleg Khabarov"]
|
12
|
-
s.date = %q{2011-03-
|
12
|
+
s.date = %q{2011-03-27}
|
13
13
|
s.description = %q{minimalistic authentication}
|
14
14
|
s.email = %q{oleg@khabarov.ca}
|
15
15
|
s.extra_rdoc_files = [
|
data/lib/letmein.rb
CHANGED
@@ -3,25 +3,41 @@ require 'bcrypt'
|
|
3
3
|
|
4
4
|
module LetMeIn
|
5
5
|
|
6
|
+
mattr_accessor :model, :identifier, :password, :salt
|
7
|
+
|
8
|
+
def self.initialize(params = {})
|
9
|
+
@@model = params[:model] || 'User'
|
10
|
+
@@identifier = params[:identifier] || 'email'
|
11
|
+
@@password = params[:password] || 'password_hash'
|
12
|
+
@@salt = params[:salt] || 'password_salt'
|
13
|
+
@@model.constantize.send :include, LetMeIn::Model
|
14
|
+
end
|
15
|
+
|
6
16
|
class Railtie < Rails::Railtie
|
7
17
|
config.after_initialize do
|
8
|
-
|
9
|
-
# is already loaded. This will force it.
|
10
|
-
Dir[Rails.root + 'app/models/**/*.rb'].each{|path| require path }
|
18
|
+
LetMeIn.initialize unless LetMeIn.model.present?
|
11
19
|
end
|
12
20
|
end
|
13
21
|
|
14
22
|
class Error < StandardError
|
15
23
|
end
|
16
24
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
+
module Model
|
26
|
+
def self.included(base)
|
27
|
+
base.instance_eval do
|
28
|
+
attr_accessor :password
|
29
|
+
before_save :encrypt_password
|
30
|
+
end
|
31
|
+
base.class_eval do
|
32
|
+
class_eval %Q^
|
33
|
+
def encrypt_password
|
34
|
+
if password.present?
|
35
|
+
self.send("#{LetMeIn.salt}=", BCrypt::Engine.generate_salt)
|
36
|
+
self.send("#{LetMeIn.password}=", BCrypt::Engine.hash_secret(password, self.send(LetMeIn.salt)))
|
37
|
+
end
|
38
|
+
end
|
39
|
+
^
|
40
|
+
end
|
25
41
|
end
|
26
42
|
end
|
27
43
|
|
@@ -32,7 +48,7 @@ module LetMeIn
|
|
32
48
|
|
33
49
|
def initialize(params = { })
|
34
50
|
unless params.blank?
|
35
|
-
self.identifier = params[:identifier] || params[LetMeIn.
|
51
|
+
self.identifier = params[:identifier] || params[LetMeIn.identifier.to_sym]
|
36
52
|
self.password = params[:password]
|
37
53
|
end
|
38
54
|
end
|
@@ -60,20 +76,16 @@ module LetMeIn
|
|
60
76
|
# Mapping to the identifier and authenticated object accessor
|
61
77
|
def method_missing(method_name, *args)
|
62
78
|
case method_name.to_s
|
63
|
-
|
64
|
-
self.identifier
|
65
|
-
|
66
|
-
|
67
|
-
when LetMeIn.configuration.model.underscore
|
68
|
-
self.authenticated_object
|
69
|
-
else
|
70
|
-
super
|
79
|
+
when LetMeIn.identifier then self.identifier
|
80
|
+
when "#{LetMeIn.identifier}=" then self.identifier = args[0]
|
81
|
+
when LetMeIn.model.underscore then self.authenticated_object
|
82
|
+
else super
|
71
83
|
end
|
72
84
|
end
|
73
85
|
|
74
86
|
def authenticate
|
75
|
-
object = LetMeIn.
|
76
|
-
self.authenticated_object = if object && object.send(LetMeIn.
|
87
|
+
object = LetMeIn.model.constantize.send("find_by_#{LetMeIn.identifier}", self.identifier)
|
88
|
+
self.authenticated_object = if object && object.send(LetMeIn.password) == BCrypt::Engine.hash_secret(self.password, object.send(LetMeIn.salt))
|
77
89
|
object
|
78
90
|
else
|
79
91
|
errors.add(:base, 'Failed to authenticate')
|
@@ -85,38 +97,4 @@ module LetMeIn
|
|
85
97
|
nil
|
86
98
|
end
|
87
99
|
end
|
88
|
-
|
89
|
-
module Model
|
90
|
-
def self.included(base)
|
91
|
-
base.extend ClassMethods
|
92
|
-
end
|
93
|
-
|
94
|
-
module ClassMethods
|
95
|
-
def letmein(*args)
|
96
|
-
LetMeIn.configuration.model = self.to_s
|
97
|
-
LetMeIn.configuration.identifier = args[0].to_s if args[0]
|
98
|
-
LetMeIn.configuration.password = args[1].to_s if args[1]
|
99
|
-
LetMeIn.configuration.salt = args[2].to_s if args[2]
|
100
|
-
|
101
|
-
attr_accessor :password
|
102
|
-
|
103
|
-
before_save :encrypt_password
|
104
|
-
|
105
|
-
class_eval %Q^
|
106
|
-
def encrypt_password
|
107
|
-
if password.present?
|
108
|
-
self.send("#{LetMeIn.configuration.salt}=", BCrypt::Engine.generate_salt)
|
109
|
-
self.send("#{LetMeIn.configuration.password}=", BCrypt::Engine.hash_secret(password, self.send(LetMeIn.configuration.salt)))
|
110
|
-
end
|
111
|
-
end
|
112
|
-
^
|
113
|
-
end
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
def self.configuration
|
118
|
-
@configuration ||= LetMeIn::Configuration.new
|
119
|
-
end
|
120
|
-
end
|
121
|
-
|
122
|
-
ActiveRecord::Base.send :include, LetMeIn::Model
|
100
|
+
end
|
data/test/letmein_test.rb
CHANGED
@@ -11,7 +11,6 @@ class User < ActiveRecord::Base
|
|
11
11
|
# example values for password info:
|
12
12
|
# pass: $2a$10$0MeSaaE3I7.0FQ5ZDcKPJeD1.FzqkcOZfEKNZ/DNN.w8xOwuFdBCm
|
13
13
|
# salt: $2a$10$0MeSaaE3I7.0FQ5ZDcKPJe
|
14
|
-
letmein :username, :pass_crypt, :pass_salt
|
15
14
|
end
|
16
15
|
|
17
16
|
class LetMeInTest < Test::Unit::TestCase
|
@@ -19,11 +18,13 @@ class LetMeInTest < Test::Unit::TestCase
|
|
19
18
|
ActiveRecord::Base.logger
|
20
19
|
ActiveRecord::Schema.define(:version => 1) do
|
21
20
|
create_table :users do |t|
|
22
|
-
t.column :
|
23
|
-
t.column :
|
24
|
-
t.column :
|
21
|
+
t.column :email, :string
|
22
|
+
t.column :password_hash, :string
|
23
|
+
t.column :password_salt, :string
|
25
24
|
end
|
26
25
|
end
|
26
|
+
LetMeIn.initialize
|
27
|
+
User.create!(:email => 'test@test.test', :password => 'test')
|
27
28
|
end
|
28
29
|
|
29
30
|
def teardown
|
@@ -32,56 +33,43 @@ class LetMeInTest < Test::Unit::TestCase
|
|
32
33
|
end
|
33
34
|
end
|
34
35
|
|
35
|
-
def test_configuration_defaults
|
36
|
-
assert config = LetMeIn::Configuration.new
|
37
|
-
assert_equal nil, config.model
|
38
|
-
assert_equal 'email', config.identifier
|
39
|
-
assert_equal 'password_hash', config.password
|
40
|
-
assert_equal 'password_salt', config.salt
|
41
|
-
end
|
42
|
-
|
43
36
|
def test_configuration_initialization
|
44
|
-
|
45
|
-
assert_equal '
|
46
|
-
assert_equal '
|
47
|
-
assert_equal '
|
48
|
-
assert_equal 'pass_salt', conf.salt
|
37
|
+
assert_equal 'User', LetMeIn.model
|
38
|
+
assert_equal 'email', LetMeIn.identifier
|
39
|
+
assert_equal 'password_hash', LetMeIn.password
|
40
|
+
assert_equal 'password_salt', LetMeIn.salt
|
49
41
|
end
|
50
42
|
|
51
43
|
def test_model_password_saving
|
52
|
-
user = User.
|
53
|
-
user.save!
|
54
|
-
user = User.find(user.id)
|
44
|
+
user = User.first
|
55
45
|
assert_equal nil, user.password
|
56
|
-
assert_match /.{60}/, user.
|
57
|
-
assert_match /.{29}/, user.
|
46
|
+
assert_match /.{60}/, user.password_hash
|
47
|
+
assert_match /.{29}/, user.password_salt
|
58
48
|
end
|
59
49
|
|
60
50
|
def test_session_initialization
|
61
|
-
session = LetMeIn::Session.new(:
|
62
|
-
assert_equal '
|
63
|
-
assert_equal '
|
51
|
+
session = LetMeIn::Session.new(:email => 'test@test.test', :password => 'test_pass')
|
52
|
+
assert_equal 'test@test.test', session.identifier
|
53
|
+
assert_equal 'test@test.test', session.email
|
64
54
|
assert_equal 'test_pass', session.password
|
65
55
|
|
66
|
-
session.
|
67
|
-
assert_equal 'new_user', session.identifier
|
68
|
-
assert_equal 'new_user', session.
|
56
|
+
session.email = 'new_user@test.test'
|
57
|
+
assert_equal 'new_user@test.test', session.identifier
|
58
|
+
assert_equal 'new_user@test.test', session.email
|
69
59
|
|
70
60
|
assert_equal nil, session.authenticated_object
|
71
61
|
assert_equal nil, session.user
|
72
62
|
end
|
73
63
|
|
74
64
|
def test_session_authentication
|
75
|
-
|
76
|
-
session = LetMeIn::Session.create(:username => 'test', :password => 'test')
|
65
|
+
session = LetMeIn::Session.create(:email => User.first.email, :password => 'test')
|
77
66
|
assert session.errors.blank?
|
78
|
-
assert_equal
|
79
|
-
assert_equal
|
67
|
+
assert_equal User.first, session.authenticated_object
|
68
|
+
assert_equal User.first, session.user
|
80
69
|
end
|
81
70
|
|
82
71
|
def test_session_authentication_failure
|
83
|
-
|
84
|
-
session = LetMeIn::Session.create(:username => 'test', :password => 'bad_pass')
|
72
|
+
session = LetMeIn::Session.create(:email => User.first.email, :password => 'bad_pass')
|
85
73
|
assert session.errors.present?
|
86
74
|
assert_equal 'Failed to authenticate', session.errors[:base].first
|
87
75
|
assert_equal nil, session.authenticated_object
|
@@ -89,8 +77,7 @@ class LetMeInTest < Test::Unit::TestCase
|
|
89
77
|
end
|
90
78
|
|
91
79
|
def test_session_authentication_exception
|
92
|
-
|
93
|
-
session = LetMeIn::Session.new(:username => 'test', :password => 'bad_pass')
|
80
|
+
session = LetMeIn::Session.new(:email => User.first.email, :password => 'bad_pass')
|
94
81
|
begin
|
95
82
|
session.save!
|
96
83
|
rescue LetMeIn::Error => e
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: 0.0.
|
8
|
+
- 5
|
9
|
+
version: 0.0.5
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Oleg Khabarov
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2011-03-
|
17
|
+
date: 2011-03-27 00:00:00 -04:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -108,7 +108,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
108
108
|
requirements:
|
109
109
|
- - ">="
|
110
110
|
- !ruby/object:Gem::Version
|
111
|
-
hash:
|
111
|
+
hash: 2972491954571850709
|
112
112
|
segments:
|
113
113
|
- 0
|
114
114
|
version: "0"
|