toretore-simple_password_authentication 0.1.2 → 0.1.3

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.
@@ -0,0 +1,13 @@
1
+ <% form_tag login_url(:authenticator => "password") do -%>
2
+ <p class="input text">
3
+ <label for="username"><%= User.human_attribute_name('username') %></label>
4
+ <%= text_field_tag "username" %>
5
+ </p>
6
+ <p class="input password">
7
+ <label for="password"><%= User.human_attribute_name('password') %></label>
8
+ <%= password_field_tag "password" %>
9
+ </p>
10
+ <p class="submit button">
11
+ <%= submit_tag t('simple_password_authentication.new.button') %>
12
+ </p>
13
+ <% end -%>
@@ -0,0 +1,3 @@
1
+ <h2><%= t('simple_password_authentication.new.title') %></h2>
2
+
3
+ <%= render :partial => "password" %>
@@ -0,0 +1,11 @@
1
+ en:
2
+ simple_authentication:
3
+ authenticators:
4
+ password:
5
+ name: Password
6
+ link: Log in using a username and password
7
+ login_failed: Username or password is wrong
8
+ simple_password_authentication:
9
+ new:
10
+ title: Log in
11
+ button: Log in
@@ -0,0 +1,5 @@
1
+ Description:
2
+ Add fields to users table for username/password authentication
3
+
4
+ Example:
5
+ ./script/generate simple_password_authentication --migration User
@@ -0,0 +1,38 @@
1
+ class SimplePasswordAuthenticationGenerator < Rails::Generator::NamedBase
2
+ def manifest
3
+ record do |m|
4
+ m.migration_template "migration:migration.rb", "db/migrate", :assigns => password_auth_assigns,
5
+ :migration_file_name => "add_password_authentication_fields_to_#{custom_file_name}" if options[:migration]
6
+ end
7
+ end
8
+
9
+ private
10
+
11
+ def custom_file_name
12
+ custom_name = class_name.underscore.downcase
13
+ custom_name = custom_name.pluralize if ActiveRecord::Base.pluralize_table_names
14
+ custom_name
15
+ end
16
+
17
+ def password_auth_assigns
18
+ returning({}) do |assigns|
19
+ assigns[:migration_action] = "add"
20
+ assigns[:class_name] = "add_password_authentication_fields_to_#{custom_file_name}"
21
+ assigns[:table_name] = "users"
22
+ assigns[:attributes] = password_auth_attributes
23
+ end
24
+ end
25
+
26
+ def password_auth_attributes
27
+ returning attributes.dup do |attributes|
28
+ {"username" => "string", "hashed_password" => "string", "salt" => "string"}.each do |name, type|
29
+ attributes << Rails::Generator::GeneratedAttribute.new(name, type) unless attributes.any?{|a| a.name == name }
30
+ end
31
+ end
32
+ end
33
+
34
+ def add_options!(opt)
35
+ opt.on('--migration', 'Create migration'){|v| options[:migration] = true }
36
+ end
37
+
38
+ end
@@ -0,0 +1,10 @@
1
+ require "simple_authentication"
2
+ require "simple_password_authentication/password_authenticator"
3
+ require "simple_password_authentication/model_methods"
4
+ require "simple_password_authentication/controller_methods"
5
+
6
+ SimpleAuthentication::ModelMethods::User.send(:include, SimplePasswordAuthentication::ModelMethods::User)
7
+ SimpleAuthentication::ModelMethods::User::ClassMethods.send(:include, SimplePasswordAuthentication::ModelMethods::User::ClassMethods)
8
+ #User.send(:include, SimplePasswordAuthentication::ModelMethods::User::Behavior)
9
+ SimpleAuthentication::ControllerMethods::Logins.send(:include, SimplePasswordAuthentication::ControllerMethods::Logins)
10
+ I18n.load_path.unshift(File.join(File.dirname(__FILE__), '..', 'config', 'locales', 'simple_password_authentication.yml'))
@@ -0,0 +1,20 @@
1
+ module SimplePasswordAuthentication
2
+
3
+
4
+ module ControllerMethods
5
+
6
+
7
+ module Logins
8
+
9
+
10
+ def password
11
+ end
12
+
13
+
14
+ end
15
+
16
+
17
+ end
18
+
19
+
20
+ end
@@ -0,0 +1,82 @@
1
+ require "digest/sha1"
2
+
3
+ module SimplePasswordAuthentication
4
+
5
+
6
+ module ModelMethods
7
+
8
+
9
+ module User
10
+
11
+ attr_accessor :password
12
+
13
+ #Returns the salt value. If there is no value, one is generated.
14
+ def salt
15
+ read_attribute(:salt) or returning self.class.generate_salt do |s|
16
+ write_attribute(:salt, s)
17
+ end
18
+ end
19
+
20
+ #Force re-generation of salt value. Returns new value.
21
+ def salt!
22
+ returning self.class.generate_salt do |s|
23
+ write_attribute(:salt, s)
24
+ end
25
+ end
26
+
27
+ def hashed_password=(pw)
28
+ write_attribute(:hashed_password, self.class.hash_password(pw, salt))
29
+ end
30
+
31
+ def password=(pw)
32
+ self.hashed_password = @password = pw
33
+ end
34
+
35
+ def correct_password?(pw)
36
+ self.class.hash_password(pw, salt) == hashed_password
37
+ end
38
+
39
+ private
40
+
41
+
42
+ module ClassMethods
43
+
44
+ #Hashes a password using a salt value
45
+ def hash_password(pw, salt)
46
+ Digest::SHA1.hexdigest(salt+pw)
47
+ end
48
+
49
+ #Generate a random salt value
50
+ def generate_salt
51
+ Digest::SHA1.hexdigest(Time.now.to_f.to_s)
52
+ end
53
+
54
+ #Find a user using a username and password
55
+ #Returns the user if successful, false otherwise
56
+ def authenticate(username, password)
57
+ if user = find_by_username(username)
58
+ if user.correct_password?(password)
59
+ user
60
+ end
61
+ end
62
+ end
63
+
64
+ end
65
+
66
+
67
+ module Behavior
68
+
69
+ def self.included(model_class)
70
+ model_class.validates_presence_of :username, :hashed_password
71
+ model_class.validates_confirmation_of :password
72
+ model_class.validates_uniqueness_of :username
73
+ end
74
+
75
+ end
76
+
77
+
78
+ end
79
+
80
+ end
81
+
82
+ end
@@ -0,0 +1,20 @@
1
+ module SimpleAuthentication
2
+
3
+
4
+ class PasswordAuthenticator < Authenticator
5
+
6
+
7
+ def authentication_possible?
8
+ !params.values_at(:username, :password).any?{|v| v.blank? }
9
+ end
10
+
11
+
12
+ def authenticate
13
+ User.authenticate(params[:username], params[:password])
14
+ end
15
+
16
+
17
+ end
18
+
19
+
20
+ end
data/rails/init.rb ADDED
@@ -0,0 +1 @@
1
+ require "simple_password_authentication"
data/rails/install.rb ADDED
@@ -0,0 +1 @@
1
+ # Install hook code here
@@ -0,0 +1 @@
1
+ # Uninstall hook code here
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :simple_password_authentication do
3
+ # # Task goes here
4
+ # end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: toretore-simple_password_authentication
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tore Darell
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-03-09 00:00:00 -07:00
12
+ date: 2009-03-16 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -20,7 +20,7 @@ dependencies:
20
20
  requirements:
21
21
  - - "="
22
22
  - !ruby/object:Gem::Version
23
- version: 0.1.2
23
+ version: 0.1.3
24
24
  version:
25
25
  description: Password authentication for SimpleAuthentication
26
26
  email: toredarell@gmail.com
@@ -30,8 +30,26 @@ extensions: []
30
30
 
31
31
  extra_rdoc_files: []
32
32
 
33
- files: []
34
-
33
+ files:
34
+ - lib/simple_password_authentication.rb
35
+ - lib/simple_password_authentication
36
+ - lib/simple_password_authentication/password_authenticator.rb
37
+ - lib/simple_password_authentication/controller_methods.rb
38
+ - lib/simple_password_authentication/model_methods.rb
39
+ - rails/uninstall.rb
40
+ - rails/install.rb
41
+ - rails/init.rb
42
+ - config/locales
43
+ - config/locales/simple_password_authentication.yml
44
+ - app/views
45
+ - app/views/logins
46
+ - app/views/logins/password.html.erb
47
+ - app/views/logins/_password.html.erb
48
+ - generators/simple_password_authentication
49
+ - generators/simple_password_authentication/USAGE
50
+ - generators/simple_password_authentication/templates
51
+ - generators/simple_password_authentication/simple_password_authentication_generator.rb
52
+ - tasks/simple_password_authentication_tasks.rake
35
53
  has_rdoc: false
36
54
  homepage: http://github.com/toretore/simple_password_authentication
37
55
  post_install_message: