authem 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/LICENSE ADDED
@@ -0,0 +1,14 @@
1
+ DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
2
+ Version 2, December 2004
3
+
4
+ Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>
5
+
6
+ Everyone is permitted to copy and distribute verbatim or modified
7
+ copies of this license document, and changing it is allowed as long
8
+ as the name is changed.
9
+
10
+ DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
11
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
12
+
13
+ 0. You just DO WHAT THE FUCK YOU WANT TO.
14
+
data/README.markdown ADDED
@@ -0,0 +1,17 @@
1
+ # Authem
2
+
3
+ Authem is an authentication library for Ruby web applications.
4
+
5
+ ## Compatibility
6
+
7
+ Authem is tested against Ruby 1.8.7, 1.9.2, 1.9.3, Rubinius, and REE.
8
+
9
+ [![Build Status](https://secure.travis-ci.org/paulelliott/authem.png)](http://travis-ci.org/paulelliott/authem)
10
+
11
+ ## Contribute
12
+
13
+ Pull requests are welcome; please provide spec coverage for new code.
14
+
15
+ * `bundle install`
16
+ * `rake`
17
+
data/Rakefile ADDED
@@ -0,0 +1,11 @@
1
+ require 'rake/dsl_definition'
2
+ require 'bundler/setup'
3
+
4
+ require "rspec"
5
+ require "rspec/core/rake_task"
6
+
7
+ RSpec::Core::RakeTask.new(:spec) do |spec|
8
+ spec.pattern = "spec/**/*_spec.rb"
9
+ end
10
+
11
+ task :default => :spec
data/lib/authem.rb ADDED
@@ -0,0 +1,10 @@
1
+ module Authem
2
+ autoload :Config, 'authem/config'
3
+ autoload :ControllerSupport, 'authem/controller_support'
4
+ autoload :Model, 'authem/model'
5
+ autoload :Token, 'authem/token'
6
+
7
+ def self.configure(&block)
8
+ Config.configure(&block)
9
+ end
10
+ end
@@ -0,0 +1,13 @@
1
+ module Authem
2
+ module Config
3
+ extend self
4
+
5
+ attr_accessor :user_class, :sign_in_path
6
+
7
+ Authem::Config.sign_in_path ||= :sign_in
8
+
9
+ def configure
10
+ yield self
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,66 @@
1
+ module Authem::ControllerSupport
2
+ extend ActiveSupport::Concern
3
+
4
+ protected
5
+
6
+ def sign_in(email_or_user, password=nil, remember_me=nil)
7
+ if email_or_user.is_a? String
8
+ email_or_user = Authem::Config.user_class.authenticate(email_or_user, password)
9
+ end
10
+ if email_or_user.is_a? Authem::Model
11
+ establish_presence(email_or_user)
12
+ remember_me! if remember_me
13
+ email_or_user
14
+ end
15
+ end
16
+
17
+ def sign_out
18
+ clear_session
19
+ end
20
+
21
+ def remember_me!
22
+ cookies.permanent.signed[:remember_me] = current_user.id
23
+ end
24
+
25
+ def current_user
26
+ @current_user ||= (
27
+ if session[:user_id]
28
+ Authem::Config.user_class.find(session[:user_id])
29
+ elsif cookies[:remember_me].present?
30
+ user = Authem::Config.user_class.find(cookies.signed[:remember_me])
31
+ establish_presence(user) if user
32
+ end
33
+ )
34
+ end
35
+
36
+ def require_user
37
+ unless current_user
38
+ session[:return_to_url] = request.url
39
+ redirect_to Authem::Config.sign_in_path
40
+ end
41
+ end
42
+
43
+ def establish_presence(user)
44
+ return_to_url = session[:return_to_url]
45
+ clear_session
46
+ session[:return_to_url] = return_to_url
47
+ session[:user_id] = user.id
48
+ @current_user = user
49
+ end
50
+
51
+ def redirect_back_or_to(url, flash_hash = {})
52
+ url = session[:return_to_url] || url
53
+ session[:return_to_url] = nil
54
+ redirect_to(url, :flash => flash_hash)
55
+ end
56
+
57
+ def clear_session
58
+ cookies[:remember_me] = nil
59
+ reset_session
60
+ end
61
+
62
+ included do
63
+ helper_method :current_user
64
+ end
65
+
66
+ end
@@ -0,0 +1,44 @@
1
+ require 'bcrypt'
2
+
3
+ module Authem::Model
4
+ extend ::ActiveSupport::Concern
5
+
6
+ included do
7
+ Authem::Config.user_class = self
8
+
9
+ attr_accessor :password, :password_confirmation
10
+
11
+ attr_protected :crypted_password, :salt, :reset_password_token
12
+
13
+ validates_confirmation_of :password
14
+ validate :email, :presence => true, :uniqueness => true
15
+
16
+ def self.find_by_email(email)
17
+ where("upper(email) = ?", email.upcase).first
18
+ end
19
+
20
+ before_save :encrypt_password
21
+
22
+ def self.authenticate(email, password)
23
+ user = find_by_email(email)
24
+ user if user && user.crypted_password_matches?(password)
25
+ end
26
+ end
27
+
28
+ def crypted_password_matches?(password)
29
+ crypted_password.present? && ::BCrypt::Password.new(crypted_password) == [password, salt].join
30
+ end
31
+
32
+ def encrypt_password
33
+ if password.present?
34
+ self.salt = ::BCrypt::Engine.generate_salt
35
+ self.crypted_password = ::BCrypt::Password.create([password, salt].join)
36
+ end
37
+ end
38
+
39
+ def reset_password_token
40
+ update_attribute(:reset_password_token, Authem::Token.generate) if self[:reset_password_token].blank?
41
+ self[:reset_password_token]
42
+ end
43
+
44
+ end
@@ -0,0 +1,7 @@
1
+ class Authem::Token
2
+
3
+ def self.generate
4
+ Digest::SHA1.hexdigest(Time.now.to_s.split(//).sort_by {rand}.join)
5
+ end
6
+
7
+ end
@@ -0,0 +1,3 @@
1
+ module Authem
2
+ VERSION = '0.0.1'
3
+ end
metadata ADDED
@@ -0,0 +1,150 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: authem
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 0.0.1
6
+ platform: ruby
7
+ authors:
8
+ - Paul Elliott
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2012-01-17 00:00:00 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: activesupport
17
+ prerelease: false
18
+ requirement: &id001 !ruby/object:Gem::Requirement
19
+ none: false
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: "0"
24
+ type: :runtime
25
+ version_requirements: *id001
26
+ - !ruby/object:Gem::Dependency
27
+ name: bcrypt-ruby
28
+ prerelease: false
29
+ requirement: &id002 !ruby/object:Gem::Requirement
30
+ none: false
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: "0"
35
+ type: :runtime
36
+ version_requirements: *id002
37
+ - !ruby/object:Gem::Dependency
38
+ name: actionpack
39
+ prerelease: false
40
+ requirement: &id003 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ version: "0"
46
+ type: :development
47
+ version_requirements: *id003
48
+ - !ruby/object:Gem::Dependency
49
+ name: activerecord
50
+ prerelease: false
51
+ requirement: &id004 !ruby/object:Gem::Requirement
52
+ none: false
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: "0"
57
+ type: :development
58
+ version_requirements: *id004
59
+ - !ruby/object:Gem::Dependency
60
+ name: database_cleaner
61
+ prerelease: false
62
+ requirement: &id005 !ruby/object:Gem::Requirement
63
+ none: false
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: "0"
68
+ type: :development
69
+ version_requirements: *id005
70
+ - !ruby/object:Gem::Dependency
71
+ name: rake
72
+ prerelease: false
73
+ requirement: &id006 !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ">="
77
+ - !ruby/object:Gem::Version
78
+ version: "0"
79
+ type: :development
80
+ version_requirements: *id006
81
+ - !ruby/object:Gem::Dependency
82
+ name: rspec
83
+ prerelease: false
84
+ requirement: &id007 !ruby/object:Gem::Requirement
85
+ none: false
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: "0"
90
+ type: :development
91
+ version_requirements: *id007
92
+ - !ruby/object:Gem::Dependency
93
+ name: pg
94
+ prerelease: false
95
+ requirement: &id008 !ruby/object:Gem::Requirement
96
+ none: false
97
+ requirements:
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ version: "0"
101
+ type: :development
102
+ version_requirements: *id008
103
+ description: Authem provides a simple solution for email-based authentication.
104
+ email:
105
+ - paul@hashrocket.com
106
+ executables: []
107
+
108
+ extensions: []
109
+
110
+ extra_rdoc_files: []
111
+
112
+ files:
113
+ - lib/authem/config.rb
114
+ - lib/authem/controller_support.rb
115
+ - lib/authem/model.rb
116
+ - lib/authem/token.rb
117
+ - lib/authem/version.rb
118
+ - lib/authem.rb
119
+ - LICENSE
120
+ - README.markdown
121
+ - Rakefile
122
+ homepage: https://github.com/paulelliott/authem
123
+ licenses: []
124
+
125
+ post_install_message:
126
+ rdoc_options: []
127
+
128
+ require_paths:
129
+ - lib
130
+ required_ruby_version: !ruby/object:Gem::Requirement
131
+ none: false
132
+ requirements:
133
+ - - ">="
134
+ - !ruby/object:Gem::Version
135
+ version: "0"
136
+ required_rubygems_version: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ">="
140
+ - !ruby/object:Gem::Version
141
+ version: "0"
142
+ requirements: []
143
+
144
+ rubyforge_project:
145
+ rubygems_version: 1.8.6
146
+ signing_key:
147
+ specification_version: 3
148
+ summary: Authem authenticates them by email
149
+ test_files: []
150
+