authem 0.0.1

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/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
+