mischa-clearance 0.3.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.
Files changed (46) hide show
  1. data/LICENSE +21 -0
  2. data/README.textile +136 -0
  3. data/Rakefile +83 -0
  4. data/TODO.textile +24 -0
  5. data/generators/clearance/USAGE +1 -0
  6. data/generators/clearance/clearance_generator.rb +69 -0
  7. data/generators/clearance/templates/app/controllers/application.rb +5 -0
  8. data/generators/clearance/templates/app/controllers/confirmations_controller.rb +3 -0
  9. data/generators/clearance/templates/app/controllers/passwords_controller.rb +3 -0
  10. data/generators/clearance/templates/app/controllers/sessions_controller.rb +3 -0
  11. data/generators/clearance/templates/app/controllers/users_controller.rb +3 -0
  12. data/generators/clearance/templates/app/models/clearance_mailer.rb +5 -0
  13. data/generators/clearance/templates/app/models/user.rb +3 -0
  14. data/generators/clearance/templates/app/views/clearance_mailer/change_password.html.erb +6 -0
  15. data/generators/clearance/templates/app/views/clearance_mailer/confirmation.html.erb +1 -0
  16. data/generators/clearance/templates/app/views/confirmations/new.html.erb +6 -0
  17. data/generators/clearance/templates/app/views/passwords/edit.html.erb +23 -0
  18. data/generators/clearance/templates/app/views/passwords/new.html.erb +15 -0
  19. data/generators/clearance/templates/app/views/sessions/new.html.erb +26 -0
  20. data/generators/clearance/templates/app/views/users/_form.html.erb +13 -0
  21. data/generators/clearance/templates/app/views/users/edit.html.erb +4 -0
  22. data/generators/clearance/templates/app/views/users/new.html.erb +4 -0
  23. data/generators/clearance/templates/test/factories.rb +9 -0
  24. data/generators/clearance/templates/test/functional/confirmations_controller_test.rb +5 -0
  25. data/generators/clearance/templates/test/functional/passwords_controller_test.rb +5 -0
  26. data/generators/clearance/templates/test/functional/sessions_controller_test.rb +5 -0
  27. data/generators/clearance/templates/test/functional/users_controller_test.rb +5 -0
  28. data/generators/clearance/templates/test/unit/clearance_mailer_test.rb +6 -0
  29. data/generators/clearance/templates/test/unit/user_test.rb +5 -0
  30. data/lib/clearance.rb +15 -0
  31. data/lib/clearance/app/controllers/application_controller.rb +84 -0
  32. data/lib/clearance/app/controllers/confirmations_controller.rb +46 -0
  33. data/lib/clearance/app/controllers/passwords_controller.rb +67 -0
  34. data/lib/clearance/app/controllers/sessions_controller.rb +79 -0
  35. data/lib/clearance/app/controllers/users_controller.rb +47 -0
  36. data/lib/clearance/app/models/clearance_mailer.rb +33 -0
  37. data/lib/clearance/app/models/user.rb +86 -0
  38. data/lib/clearance/test/functional/confirmations_controller_test.rb +85 -0
  39. data/lib/clearance/test/functional/passwords_controller_test.rb +188 -0
  40. data/lib/clearance/test/functional/sessions_controller_test.rb +148 -0
  41. data/lib/clearance/test/functional/users_controller_test.rb +69 -0
  42. data/lib/clearance/test/test_helper.rb +94 -0
  43. data/lib/clearance/test/unit/clearance_mailer_test.rb +63 -0
  44. data/lib/clearance/test/unit/user_test.rb +208 -0
  45. data/lib/clearance/version.rb +7 -0
  46. metadata +127 -0
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License
2
+
3
+ Copyright (c) 2008 thoughtbot, inc.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -0,0 +1,136 @@
1
+ h1. Clearance
2
+
3
+ Simple, complete Ruby web app authentication.
4
+
5
+ "We have clearance, Clarence.":http://www.youtube.com/v/mNRXJEE3Nz8
6
+
7
+ h2. Gem installation (Rails 2.1+)
8
+
9
+ In config/environments/test.rb:
10
+
11
+ config.gem 'mocha'
12
+ config.gem 'thoughtbot-shoulda', :lib => 'shoulda', :source => "http://gems.github.com"
13
+ config.gem 'thoughtbot-factory_girl', :lib => 'factory_girl', :source => "http://gems.github.com"
14
+
15
+ In config/environment.rb:
16
+
17
+ config.gem "thoughtbot-clearance", :lib => 'clearance', :source => 'http://gems.github.com/'
18
+
19
+ Then:
20
+
21
+ rake gems:install
22
+ rake gems:unpack
23
+
24
+ h2. Generator
25
+
26
+ In a greenfield application, just run the generator:
27
+
28
+ script/generate clearance
29
+
30
+ This will create:
31
+
32
+ app/controllers/confirmations_controller.rb
33
+ app/controllers/passwords_controller.rb
34
+ app/controllers/sessions_controller.rb
35
+ app/controllers/users_controller.rb
36
+ app/models/user.rb
37
+ app/models/user_mailer.rb
38
+ app/views/confirmations/new.html.erb
39
+ app/views/passwords/edit.html.erb
40
+ app/views/passwords/new.html.erb
41
+ app/views/sessions/new.html.erb
42
+ app/views/user_mailer/change_password.html.erb
43
+ app/views/user_mailer/confirmation.html.erb
44
+ app/views/users/_form.html.erb
45
+ app/views/users/edit.html.erb
46
+ app/views/users/new.html.erb
47
+ test/functional/confirmations_controller_test.rb
48
+ test/functional/passwords_controller_test.rb
49
+ test/functional/sessions_controller_test.rb
50
+ test/functional/users_controller_test.rb
51
+ test/unit/user_mailer_test.rb
52
+ test/unit/user_test.rb
53
+
54
+ Add the corresponding Clearance module for any file(s) you don't want to override. They are namespaced exactly like the directory structure of a Rails app:
55
+
56
+ app/models/user.rb already exists.
57
+ include Clearance::App::Models::User
58
+
59
+ h2. Tests
60
+
61
+ The tests use "Shoulda":http://thoughtbot.com/projects/shoulda >= 2.0.4 and "Factory Girl":http://thoughtbot.com/projects/factory_girl. You should create a User Factory:
62
+
63
+ Factory.sequence :email do |n|
64
+ "user#{n}@example.com"
65
+ end
66
+
67
+ Factory.define :user do |user|
68
+ user.email { Factory.next :email }
69
+ user.password "password"
70
+ user.password_confirmation "password"
71
+ end
72
+
73
+ In test/test_helper.rb:
74
+
75
+ class Test::Unit::TestCase
76
+ self.use_transactional_fixtures = true
77
+ self.use_instantiated_fixtures = false
78
+ include Clearance::Test::TestHelper
79
+ end
80
+
81
+ h2. Controllers
82
+
83
+ In app/controllers/application_controller.rb:
84
+
85
+ class ApplicationController < ActionController::Base
86
+ helper :all
87
+ protect_from_forgery
88
+ include Clearance::App::Controllers::ApplicationController
89
+ end
90
+
91
+ h2. Migration
92
+
93
+ Your users table needs a few columns.
94
+
95
+ create_table(:users) do |t|
96
+ t.string :email
97
+ t.string :crypted_password, :limit => 40
98
+ t.string :salt, :limit => 40
99
+ t.string :remember_token
100
+ t.datetime :remember_token_expires_at
101
+ t.boolean :confirmed, :default => false, :null => false
102
+ end
103
+
104
+ add_index :users, [:email, :crypted_password]
105
+ add_index :users, [:id, :salt]
106
+ add_index :users, :email
107
+ add_index :users, :remember_token
108
+
109
+ h2. Routes
110
+
111
+ map.resources :users
112
+ map.resource :session
113
+ map.resources :users, :has_one => :password
114
+ map.resources :users, :has_one => :confirmation
115
+ map.resources :passwords
116
+ map.root :controller => 'sessions', :action => 'new'
117
+
118
+ h2. Environments
119
+
120
+ In config/environments/test.rb and config/environments/development.rb:
121
+
122
+ HOST = "localhost"
123
+
124
+ In config/environment.rb:
125
+
126
+ DO_NOT_REPLY = "donotreply@example.com"
127
+ PROJECT_NAME = "my_app_name"
128
+
129
+ h2. Authors
130
+
131
+ * thoughtbot, inc.
132
+ * Dan Croak
133
+ * Jason Morrison
134
+ * Mike Burns
135
+ * Josh Nichols
136
+ * Mike Breen
@@ -0,0 +1,83 @@
1
+ require 'rake'
2
+ require 'rake/testtask'
3
+ require 'date'
4
+ require 'rake/gempackagetask'
5
+ require 'spec/rake/spectask'
6
+
7
+ def gem_files
8
+ FileList["[A-Z]*", "{generators,lib}/**/*"]
9
+ end
10
+
11
+ test_files_pattern = 'test/rails_root/test/{unit,functional,other}/**/*_test.rb'
12
+ namespace :test do
13
+ Rake::TestTask.new(:all => 'generator:tests') do |t|
14
+ t.libs << 'lib'
15
+ t.pattern = test_files_pattern
16
+ t.verbose = false
17
+ end
18
+
19
+ desc "Run all specs in spec directory (excluding plugin specs)"
20
+ Spec::Rake::SpecTask.new(:spec) do |t|
21
+ t.spec_opts = ['--options', "\"test/rails_root/spec/spec.opts\""]
22
+ t.spec_files = FileList['test/rails_root/spec/**/*_spec.rb']
23
+ end
24
+ end
25
+
26
+ desc "Run the test suite"
27
+ task :default => ['test:all', 'test:spec']
28
+
29
+ load 'lib/clearance/version.rb'
30
+
31
+ gemspec_doc = <<-GEMSPEC_DOC
32
+ s.date = "#{Date.today.strftime('%Y-%m-%d')}"
33
+ s.name = "clearance"
34
+ s.summary = "Fork of clearance"
35
+ s.email = "info@hashrocket.com"
36
+ s.version = "#{Clearance::Version::MAJOR}.#{Clearance::Version::MINOR}.#{Clearance::Version::PATCH}"
37
+ s.homepage = "http://github.com/hashrocket/clearance"
38
+ s.description = "Fork of clearance, not-purely-restful, but with Facebook goodness"
39
+ s.authors = [
40
+ "thoughtbot, inc.",
41
+ "Dan Croak",
42
+ "Josh Nichols",
43
+ "Jason Morrison",
44
+ "Mike Burns",
45
+ "Mike Breen",
46
+ "Hashrocket, Inc.",
47
+ "Les Hill",
48
+ "Jon Larkowski",
49
+ "Wes Gibbs"
50
+ ]
51
+ GEMSPEC_DOC
52
+
53
+ spec = Gem::Specification.new do |s|
54
+ eval(gemspec_doc)
55
+ s.files = gem_files
56
+ end
57
+
58
+ Rake::GemPackageTask.new(spec) do |pkg|
59
+ pkg.need_zip = true
60
+ pkg.need_tar = true
61
+ end
62
+
63
+ namespace :generator do
64
+ desc "Run the generator on the tests"
65
+ task :tests do
66
+ system "mkdir -p test/rails_root/vendor/plugins/clearance"
67
+ system "cp -R generators test/rails_root/vendor/plugins/clearance"
68
+ system "cd test/rails_root; ./script/generate clearance"
69
+ end
70
+ end
71
+
72
+ desc "Generate the Clearance gemspec"
73
+ task :gemspec do
74
+
75
+ File.open("clearance.gemspec", "w") do |file|
76
+ file.write "Gem::Specification.new do |s|\n"
77
+ file.write(gemspec_doc)
78
+ file.write " s.files = [\n"
79
+ file.write gem_files.map {|f| %Q{ "#{f}"}}.join(",\n")
80
+ file.write " ]\n"
81
+ file.write "end\n"
82
+ end
83
+ end
@@ -0,0 +1,24 @@
1
+ (highest priority first)
2
+
3
+ # activation code (like restful-auth) instead of salt?
4
+ # remove dependency on root_url?
5
+ # should_have_form should be pulled into shoulda
6
+ # generator should print out instructions to include modules existing files
7
+ # check to make sure attr_accessible doesn't override and w/ attr_protected
8
+ # move shoulda macros in test_helper to shoulda_macros folder
9
+ # add shoulda and factory girl dependencies to gemspec
10
+ # refactor Mailer default_url_options[:host] to something cleaner
11
+ # application controller uses protected, all other controllers use private
12
+ # add information about url_after_create to README or github wikis
13
+
14
+ ideas to steal from merb-auth:
15
+
16
+ # store current_user on the session, not controller
17
+ # respond with 401 Unauthorized when request requires authentication
18
+ # respond with 405 Method Not Allowed when action requested isn’t allowed
19
+ # 401 and 405 need to be in Exceptions controller or use safety_valve
20
+ # email confirmation is a strategy
21
+ # forgot password is a strategy
22
+ # salted password is a strategy
23
+
24
+ http://adam.speaksoutofturn.com/articles/entication_vs_orization.html
@@ -0,0 +1 @@
1
+ script/generate clearance
@@ -0,0 +1,69 @@
1
+ class ClearanceGenerator < Rails::Generator::Base
2
+
3
+ def manifest
4
+ record do |m|
5
+ m.directory File.join("app", "controllers")
6
+ ["app/controllers/confirmations_controller.rb",
7
+ "app/controllers/passwords_controller.rb",
8
+ "app/controllers/sessions_controller.rb",
9
+ "app/controllers/users_controller.rb"].each do |file|
10
+ m.file file, file
11
+ end
12
+
13
+ m.directory File.join("app", "models")
14
+ ["app/models/user.rb",
15
+ "app/models/clearance_mailer.rb"].each do |file|
16
+ m.file file, file
17
+ end
18
+
19
+ m.directory File.join("app", "views")
20
+ m.directory File.join("app", "views", "confirmations")
21
+ ["app/views/confirmations/new.html.erb"].each do |file|
22
+ m.file file, file
23
+ end
24
+
25
+ m.directory File.join("app", "views", "passwords")
26
+ ["app/views/passwords/new.html.erb",
27
+ "app/views/passwords/edit.html.erb"].each do |file|
28
+ m.file file, file
29
+ end
30
+
31
+ m.directory File.join("app", "views", "sessions")
32
+ ["app/views/sessions/new.html.erb"].each do |file|
33
+ m.file file, file
34
+ end
35
+
36
+ m.directory File.join("app", "views", "clearance_mailer")
37
+ ["app/views/clearance_mailer/change_password.html.erb",
38
+ "app/views/clearance_mailer/confirmation.html.erb"].each do |file|
39
+ m.file file, file
40
+ end
41
+
42
+ m.directory File.join("app", "views", "users")
43
+ ["app/views/users/_form.html.erb",
44
+ "app/views/users/edit.html.erb",
45
+ "app/views/users/new.html.erb"].each do |file|
46
+ m.file file, file
47
+ end
48
+
49
+ m.directory File.join("test", "functional")
50
+ ["test/functional/confirmations_controller_test.rb",
51
+ "test/functional/passwords_controller_test.rb",
52
+ "test/functional/sessions_controller_test.rb",
53
+ "test/functional/users_controller_test.rb"].each do |file|
54
+ m.file file, file
55
+ end
56
+
57
+ m.directory File.join("test", "unit")
58
+ ["test/unit/clearance_mailer_test.rb",
59
+ "test/unit/user_test.rb"].each do |file|
60
+ m.file file, file
61
+ end
62
+
63
+ ["test/factories.rb"].each do |file|
64
+ m.file file, file
65
+ end
66
+ end
67
+ end
68
+
69
+ end
@@ -0,0 +1,5 @@
1
+ class ApplicationController < ActionController::Base
2
+ helper :all
3
+ protect_from_forgery
4
+ include Clearance::App::Controllers::ApplicationController
5
+ end
@@ -0,0 +1,3 @@
1
+ class ConfirmationsController < ApplicationController
2
+ include Clearance::App::Controllers::ConfirmationsController
3
+ end
@@ -0,0 +1,3 @@
1
+ class PasswordsController < ApplicationController
2
+ include Clearance::App::Controllers::PasswordsController
3
+ end
@@ -0,0 +1,3 @@
1
+ class SessionsController < ApplicationController
2
+ include Clearance::App::Controllers::SessionsController
3
+ end
@@ -0,0 +1,3 @@
1
+ class UsersController < ApplicationController
2
+ include Clearance::App::Controllers::UsersController
3
+ end
@@ -0,0 +1,5 @@
1
+ class ClearanceMailer < ActionMailer::Base
2
+ default_url_options[:host] = HOST
3
+
4
+ include Clearance::App::Models::ClearanceMailer
5
+ end
@@ -0,0 +1,3 @@
1
+ class User < ActiveRecord::Base
2
+ include Clearance::App::Models::User
3
+ end
@@ -0,0 +1,6 @@
1
+ Someone, hopefully you, has requested that we send you a link to change your password.
2
+
3
+ Here's the link:
4
+ <%= edit_user_password_url @user, :email => @user.email, :password => @user.crypted_password %>
5
+
6
+ If you didn't request this, no need to freak out, your password hasn't been changed. You can just ignore this email.
@@ -0,0 +1 @@
1
+ <%= new_user_confirmation_url :user_id => @user, :salt => @user.salt %>
@@ -0,0 +1,6 @@
1
+ <% form_for :user, :url => user_confirmation_path(:user_id => @user,
2
+ :salt => @user.salt) do |form| %>
3
+ <div class="submit_field">
4
+ <%= form.submit 'Confirm' %>
5
+ </div>
6
+ <% end %>
@@ -0,0 +1,23 @@
1
+ <p>
2
+ Your password has been reset. Choose a new password below.
3
+ </p>
4
+
5
+ <%= error_messages_for :user %>
6
+ <% form_for(:user,
7
+ :url => user_password_path(
8
+ @user,
9
+ :email => @user.email,
10
+ :password => @user.crypted_password),
11
+ :html => { :method => :put }) do |form| %>
12
+ <div class="password_field">
13
+ <%= form.label :password, 'Choose password' %>
14
+ <%= form.password_field :password %>
15
+ </div>
16
+ <div class="password_field">
17
+ <%= form.label :password_confirmation, 'Verify password' %>
18
+ <%= form.password_field :password_confirmation %>
19
+ </div>
20
+ <div class="submit_field">
21
+ <%= form.submit 'Save this password' %>
22
+ </div>
23
+ <% end %>
@@ -0,0 +1,15 @@
1
+ <h2>Change your password</h2>
2
+
3
+ <p>
4
+ We will email you a link to change your password.
5
+ </p>
6
+
7
+ <% form_for :password, :url => passwords_path do |form| %>
8
+ <div class="text_field">
9
+ <%= form.label :email, 'Email address' %>
10
+ <%= form.text_field :email %>
11
+ </div>
12
+ <div class="submit_field">
13
+ <%= form.submit 'Reset password' %>
14
+ </div>
15
+ <% end %>
@@ -0,0 +1,26 @@
1
+ <% form_for :session, :url => session_path do |form| %>
2
+ <div class="text_field">
3
+ <%= form.label :email %>
4
+ <%= form.text_field :email %>
5
+ </div>
6
+ <div class="text_field">
7
+ <%= form.label :password %>
8
+ <%= form.password_field :password %>
9
+ </div>
10
+ <div class="text_field">
11
+ <%= form.check_box :remember_me %>
12
+ <%= form.label :remember_me %>
13
+ </div>
14
+ <div class="submit_field">
15
+ <%= form.submit 'Login', :disable_with => 'Please wait...' %>
16
+ </div>
17
+ <% end %>
18
+
19
+ <ul>
20
+ <li>
21
+ <%= link_to "Sign up", new_user_path %>
22
+ </li>
23
+ <li>
24
+ <%= link_to "Forgot My Password", new_password_path %>
25
+ </li>
26
+ </ul>