adva_user 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.
Files changed (95) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE +22 -0
  5. data/README +114 -0
  6. data/README.md +29 -0
  7. data/Rakefile +2 -0
  8. data/adva_user.gemspec +17 -0
  9. data/app/controllers/admin/base_account_controller.rb +13 -0
  10. data/app/controllers/admin/users_controller.rb +95 -0
  11. data/app/controllers/password_controller.rb +36 -0
  12. data/app/controllers/session_controller.rb +30 -0
  13. data/app/helpers/users_helper.rb +27 -0
  14. data/app/models/account.rb +7 -0
  15. data/app/models/membership.rb +16 -0
  16. data/app/models/password_mailer.rb +43 -0
  17. data/app/models/user.rb +106 -0
  18. data/app/views/admin/users/_form.html.erb +29 -0
  19. data/app/views/admin/users/_sidebar.html.erb +8 -0
  20. data/app/views/admin/users/edit.html.erb +7 -0
  21. data/app/views/admin/users/index.html.erb +13 -0
  22. data/app/views/admin/users/new.html.erb +5 -0
  23. data/app/views/admin/users/show.html.erb +27 -0
  24. data/app/views/layouts/login.html.erb +24 -0
  25. data/app/views/password/edit.html.erb +14 -0
  26. data/app/views/password/new.html.erb +13 -0
  27. data/app/views/password_mailer/reset_password_email.html.erb +3 -0
  28. data/app/views/password_mailer/updated_password_email.html.erb +1 -0
  29. data/app/views/session/new.html.erb +17 -0
  30. data/config/initializers/menus.rb +25 -0
  31. data/config/routes.rb +14 -0
  32. data/db/migrate/20080402000001_create_users_table.rb +33 -0
  33. data/db/migrate/20080402000005_create_memberships_table.rb +13 -0
  34. data/db/migrate/20090625124502_create_accounts.rb +13 -0
  35. data/db/migrate/20090625133231_add_account_to_user.rb +10 -0
  36. data/lib/action_controller/authenticate_anonymous.rb +70 -0
  37. data/lib/action_controller/authenticate_user.rb +201 -0
  38. data/lib/active_record/belongs_to_author.rb +37 -0
  39. data/lib/adva_user.rb +28 -0
  40. data/lib/adva_user/version.rb +3 -0
  41. data/lib/login/helper_integration.rb +11 -0
  42. data/lib/login/mail_config.rb +39 -0
  43. data/test/contexts.rb +42 -0
  44. data/test/fixtures.rb +18 -0
  45. data/test/functional/admin/users_controller_test.rb +176 -0
  46. data/test/functional/password_controller_test.rb +96 -0
  47. data/test/functional/session_controller_test.rb +1 -0
  48. data/test/functional/user_controller_test.rb +95 -0
  49. data/test/integration/anonymous_login_test.rb +39 -0
  50. data/test/integration/edit_user_test.rb +44 -0
  51. data/test/integration/memberships_test.rb +52 -0
  52. data/test/integration/user_deletion_test.rb +27 -0
  53. data/test/integration/user_login_test.rb +53 -0
  54. data/test/integration/user_login_with_remember_me_test.rb +20 -0
  55. data/test/integration/user_registration_test.rb +64 -0
  56. data/test/test_helper.rb +1 -0
  57. data/test/unit/cells/user_cell_test.rb +13 -0
  58. data/test/unit/helpers/users_helper_test.rb +52 -0
  59. data/test/unit/models/account_test.rb +21 -0
  60. data/test/unit/models/anonymous_test.rb +54 -0
  61. data/test/unit/models/password_mailer_test.rb +26 -0
  62. data/test/unit/models/user_mailer_test.rb +16 -0
  63. data/test/unit/models/user_test.rb +173 -0
  64. data/vendor/gems/authentication/.gitignore +17 -0
  65. data/vendor/gems/authentication/Gemfile +4 -0
  66. data/vendor/gems/authentication/LICENSE +22 -0
  67. data/vendor/gems/authentication/MIT-LICENSE +38 -0
  68. data/vendor/gems/authentication/README +39 -0
  69. data/vendor/gems/authentication/README.md +29 -0
  70. data/vendor/gems/authentication/RUNNING_UNIT_TESTS +13 -0
  71. data/vendor/gems/authentication/Rakefile +61 -0
  72. data/vendor/gems/authentication/authentication.gemspec +17 -0
  73. data/vendor/gems/authentication/lib/authentication.rb +270 -0
  74. data/vendor/gems/authentication/lib/authentication/active_record_extensions.rb +11 -0
  75. data/vendor/gems/authentication/lib/authentication/bogus.rb +13 -0
  76. data/vendor/gems/authentication/lib/authentication/hash_helper.rb +26 -0
  77. data/vendor/gems/authentication/lib/authentication/ldap.rb +49 -0
  78. data/vendor/gems/authentication/lib/authentication/remember_me.rb +52 -0
  79. data/vendor/gems/authentication/lib/authentication/salted_hash.rb +53 -0
  80. data/vendor/gems/authentication/lib/authentication/single_token.rb +53 -0
  81. data/vendor/gems/authentication/lib/authentication/version.rb +3 -0
  82. data/vendor/gems/authentication/lib/radius/dictionary +207 -0
  83. data/vendor/gems/authentication/test_backup/abstract_unit.rb +30 -0
  84. data/vendor/gems/authentication/test_backup/active_record_extension_test.rb +17 -0
  85. data/vendor/gems/authentication/test_backup/authentication_test.rb +231 -0
  86. data/vendor/gems/authentication/test_backup/database.yml +12 -0
  87. data/vendor/gems/authentication/test_backup/fixtures/user.rb +3 -0
  88. data/vendor/gems/authentication/test_backup/fixtures/users.yml +3 -0
  89. data/vendor/gems/authentication/test_backup/options_test.rb +100 -0
  90. data/vendor/gems/authentication/test_backup/remember_me_test.rb +41 -0
  91. data/vendor/gems/authentication/test_backup/salted_hash_test.rb +38 -0
  92. data/vendor/gems/authentication/test_backup/schema.rb +10 -0
  93. data/vendor/gems/authentication/test_backup/single_token_test.rb +44 -0
  94. data/vendor/gems/authentication/test_backup/test_helper.rb +8 -0
  95. metadata +157 -0
@@ -0,0 +1,30 @@
1
+ # NOTE: Inherited from acts_as_versioned
2
+
3
+ $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
4
+
5
+ require 'test/unit'
6
+ require File.expand_path(File.join(File.dirname(__FILE__),
7
+ '..', '..', '..', '..', 'config', 'environment.rb'))
8
+ require 'active_record/fixtures'
9
+
10
+ config = YAML::load(IO.read(File.join(File.dirname(__FILE__), 'database.yml')))
11
+ ActiveRecord::Base.logger =
12
+ Logger.new(File.join(File.dirname(__FILE__), 'debug.log'))
13
+ ActiveRecord::Base.establish_connection(config[ENV['DB'] || 'sqlite3'])
14
+
15
+ load(File.join(File.dirname(__FILE__), 'schema.rb'))
16
+
17
+ Test::Unit::TestCase.fixture_path = File.join(File.dirname(__FILE__),'fixtures')
18
+ $LOAD_PATH.unshift(Test::Unit::TestCase.fixture_path)
19
+
20
+ class Test::Unit::TestCase #:nodoc:
21
+ def create_fixtures(*table_names)
22
+ if block_given?
23
+ Fixtures.create_fixtures(Test::Unit::TestCase.fixture_path, table_names) { yield }
24
+ else
25
+ Fixtures.create_fixtures(Test::Unit::TestCase.fixture_path, table_names)
26
+ end
27
+ end
28
+
29
+ require File.join(File.dirname(__FILE__), 'test_helper.rb')
30
+ end
@@ -0,0 +1,17 @@
1
+ require 'test/unit'
2
+ require File.join(File.dirname(__FILE__), 'abstract_unit')
3
+
4
+ # Test minor enhancements to ActiveRecord
5
+ class ActiveRecordExtensionTest < Test::Unit::TestCase
6
+ def test_column_includes
7
+ assert ColumnTest.includes_all_columns?(:foo, :bar)
8
+ assert !ColumnTest.includes_all_columns?(:foo, :boo)
9
+ end
10
+ end
11
+
12
+ class ColumnTest < ActiveRecord::Base
13
+ # Fake the column names
14
+ def self.column_names
15
+ %w(id name foo bar baz)
16
+ end
17
+ end
@@ -0,0 +1,231 @@
1
+ require 'test/unit'
2
+ require File.join(File.dirname(__FILE__), 'abstract_unit')
3
+
4
+ # Will test the various dispatch methods mixed into the user model to enable
5
+ # use of the various authentication and token modules. The main goal of this
6
+ # test case is not to test the actual authentication but the process of
7
+ # dispatching the methods to the various classes that implement the actual
8
+ # authentication.
9
+ class AuthenticationTest < Test::Unit::TestCase
10
+ fixtures :users
11
+
12
+ def teardown
13
+ (RecordedUser.authentication_modules + RecordedUser.token_modules).each do |mod|
14
+ mod.cleanup
15
+ end
16
+ end
17
+
18
+ def test_create_user_without_token_or_password
19
+ assert_nothing_raised { User.create! :first_name => 'John', :last_name => 'Doe' }
20
+ end
21
+
22
+ def test_authentication_first_success
23
+ first = RecordedUser.authentication_modules.first
24
+ first.send_back :authenticate, true
25
+
26
+ jack_with_test_password
27
+ assert @jack.authenticate('test')
28
+
29
+ jack_test_auth_message first
30
+ end
31
+
32
+ def test_authentication_first_fail_later_success
33
+ first = RecordedUser.authentication_modules.first
34
+ first.send_back :authenticate, false
35
+ last = RecordedUser.authentication_modules.last
36
+ last.send_back :authenticate, true
37
+
38
+ jack_with_test_password
39
+ assert @jack.authenticate('test')
40
+
41
+ jack_test_auth_message first, last
42
+ end
43
+
44
+ def test_authentication_no_success
45
+ first = RecordedUser.authentication_modules.first
46
+ first.send_back :authenticate, false
47
+ last = RecordedUser.authentication_modules.last
48
+ last.send_back :authenticate, false
49
+
50
+ jack_with_test_password
51
+ assert !@jack.authenticate('test')
52
+
53
+ jack_test_auth_message first, last
54
+ end
55
+
56
+ def test_authentication_with_token
57
+ first = RecordedUser.token_modules.first
58
+ first.send_back :authenticate, true
59
+
60
+ tok = jack_token
61
+ assert @jack.authenticate(tok)
62
+
63
+ jack_test_token_message tok, first
64
+ end
65
+
66
+ def test_authentication_with_token_first_fail_later_success
67
+ first = RecordedUser.token_modules.first
68
+ first.send_back :authenticate, false
69
+ last = RecordedUser.token_modules.last
70
+ last.send_back :authenticate, true
71
+
72
+ tok = jack_token
73
+ assert @jack.authenticate(tok)
74
+
75
+ jack_test_token_message tok, first, last
76
+ end
77
+
78
+ def test_authentication_with_token_no_success
79
+ first = RecordedUser.token_modules.first
80
+ first.send_back :authenticate, false
81
+ last = RecordedUser.token_modules.last
82
+ last.send_back :authenticate, false
83
+
84
+ tok = jack_token
85
+ assert_nil tok
86
+ assert !@jack.authenticate(tok)
87
+
88
+ jack_test_token_message tok, first, last
89
+ end
90
+
91
+ def test_assign_token_first_success
92
+ first = RecordedUser.token_modules.first
93
+ first.send_back :assign_token, 'test_token'
94
+
95
+ tok = jack_token
96
+ assert_equal 'test_token', tok
97
+ jack_test_assign_tok_message first
98
+ end
99
+
100
+ def test_assign_token_first_fail_later_success
101
+ first = RecordedUser.token_modules.first
102
+ first.send_back :assign_token, nil
103
+ last = RecordedUser.token_modules.last
104
+ last.send_back :assign_token, 'last_token'
105
+
106
+ tok = jack_token
107
+ assert_equal 'last_token', tok
108
+ jack_test_assign_tok_message first, last
109
+ end
110
+
111
+ def test_assign_token_no_success
112
+ first = RecordedUser.token_modules.first
113
+ first.send_back :assign_token, nil
114
+ last = RecordedUser.token_modules.last
115
+ last.send_back :assign_token, nil
116
+
117
+ tok = jack_token
118
+ assert_nil tok
119
+ jack_test_assign_tok_message first, last
120
+ end
121
+
122
+ def test_assign_password
123
+ first = RecordedUser.authentication_modules.first
124
+ last = RecordedUser.authentication_modules.last
125
+
126
+ jane = RecordedUser.new :first_name => 'Jane', :last_name => 'Doe'
127
+ jane.password = 'testing'
128
+ jane.save!
129
+ jane.reload
130
+
131
+ [first, last].each do |auth|
132
+ message = auth.last_message
133
+
134
+ assert_equal :assign_password, message.first
135
+ assert_equal jane, message[1]
136
+ assert_equal 'testing', message[2]
137
+ end
138
+ end
139
+
140
+ def test_blank_password_does_not_overwrite
141
+ jenny = User.new :first_name => 'Jenny'
142
+ jenny.password = 'test'
143
+ jenny.save!
144
+ jenny.reload
145
+ jenny.password = ""
146
+ jenny.save!
147
+ jenny.reload
148
+ assert jenny.authenticate('test')
149
+ end
150
+
151
+ private
152
+
153
+ def jack_with_test_password
154
+ @jack = RecordedUser.new :first_name => 'Jack'
155
+ @jack.password = 'test'
156
+ @jack.save!
157
+ @jack.reload
158
+ end
159
+
160
+ def jack_token
161
+ @jack = RecordedUser.new :first_name => 'Jack'
162
+ tok = @jack.assign_token 'test'
163
+ @jack.save!
164
+ @jack.reload
165
+ tok
166
+ end
167
+
168
+ def jack_test_auth_message(*auths)
169
+ auths.each do |auth|
170
+ message = auth.last_message
171
+ assert_equal :authenticate, message.first
172
+ assert_equal @jack, message[1]
173
+ assert_equal 'test', message[2]
174
+ end
175
+ end
176
+
177
+ def jack_test_token_message(token, *toks)
178
+ toks.each do |tok|
179
+ message = tok.last_message
180
+ assert_equal :authenticate, message.first
181
+ assert_equal @jack, message[1]
182
+ assert_equal token, message[2]
183
+ end
184
+ end
185
+
186
+ def jack_test_assign_tok_message(*toks)
187
+ toks.each do |tok|
188
+ message = tok.last_message
189
+ assert_equal :assign_token, message.first
190
+ assert_equal @jack, message[1]
191
+ assert_equal 3.days.from_now.to_date, message[3].to_date
192
+ end
193
+ end
194
+ end
195
+
196
+ # Utility class that will record everything passed in so we can test the
197
+ # receipt of the various messages with the various arguments. This class is
198
+ # working both as a cryptor and tokener.
199
+ class AuthRecorder
200
+ def initialize(*args)
201
+ @record = []
202
+ @returns = {}
203
+ end
204
+ def method_missing(meth, *args)
205
+ @record << [meth, *args]
206
+ @returns[meth]
207
+ end
208
+ def send_back(meth, ret)
209
+ @returns[meth] = ret
210
+ end
211
+ def last_message
212
+ @record.last
213
+ end
214
+ def cleanup
215
+ @record = []
216
+ @returns = {}
217
+ end
218
+ def assign_token(*args)
219
+ method_missing :assign_token, *args
220
+ end
221
+ def assign_password(*args)
222
+ method_missing :assign_password, *args
223
+ end
224
+ end
225
+
226
+ # Class configured to use a few AuthRecorders
227
+ class RecordedUser < User
228
+ acts_as_authenticated_user \
229
+ :authenticate_with => ['AuthRecorder']*2,
230
+ :token_with => ['AuthRecorder']*2
231
+ end
@@ -0,0 +1,12 @@
1
+ sqlite:
2
+ :adapter: sqlite
3
+ :dbfile: authentication_plugin_test.sqlite.db
4
+ sqlite3:
5
+ :adapter: sqlite3
6
+ :dbfile: authentication_plugin_test.sqlite3.db
7
+ mysql:
8
+ :adapter: mysql
9
+ :host: localhost
10
+ :username: rails
11
+ :password:
12
+ :database: authentication_plugin_test
@@ -0,0 +1,3 @@
1
+ class User < ActiveRecord::Base
2
+ acts_as_authenticated_user
3
+ end
@@ -0,0 +1,3 @@
1
+ joe:
2
+ id: 1
3
+ name: Joe
@@ -0,0 +1,100 @@
1
+ require 'test/unit'
2
+ require File.join(File.dirname(__FILE__), 'abstract_unit')
3
+
4
+ # The goal of this test case is to ensure that the options processing of the
5
+ # macro function are being handled properly.
6
+ class OptionsTest < Test::Unit::TestCase
7
+
8
+ def test_no_args
9
+ auth_mods = UserNoArgs.authentication_modules
10
+ token_mods = UserNoArgs.token_modules
11
+
12
+ assert_equal 1, auth_mods.size
13
+ assert_equal 2, token_mods.size
14
+
15
+ assert_instance_of Authentication::SaltedHash, auth_mods.first
16
+ assert_instance_of Authentication::RememberMe, token_mods.first
17
+ assert_instance_of Authentication::SingleToken, token_mods.last
18
+ end
19
+
20
+ def test_with_auth_mod
21
+ auth_mods = UserWithAuthMod.authentication_modules
22
+ assert_equal 1, auth_mods.size
23
+ assert_instance_of BasicAuthMod, auth_mods.first
24
+ end
25
+
26
+ def test_with_token_mod
27
+ token_mods = UserWithTokenMod.token_modules
28
+ assert_equal 1, token_mods.size
29
+ assert_instance_of BasicTokenMod, token_mods.first
30
+ end
31
+
32
+ def test_multiple_mods
33
+ auth_mods = UserWithMultipleMods.authentication_modules
34
+ assert_equal 2, auth_mods.size
35
+ assert_instance_of BasicAuthMod, auth_mods.first
36
+ assert_instance_of Authentication::SaltedHash, auth_mods.last
37
+ end
38
+
39
+ def test_mods_with_args
40
+ auth_mods = UserWithArgMod.authentication_modules
41
+ assert_equal 1, auth_mods.size
42
+ assert_instance_of ArgAuthMod, auth_mods.first
43
+ assert_equal 1, auth_mods.first.args.size
44
+ assert_equal 'test', auth_mods.first.args.first[:server]
45
+ end
46
+
47
+ def test_multiple_mods_with_args
48
+ auth_mods = UserWithMultipleArgs.authentication_modules
49
+ assert_equal 2, auth_mods.size
50
+ assert_instance_of ArgAuthMod, auth_mods.first
51
+ assert_instance_of AnotherArgAuthMod, auth_mods.last
52
+ assert_equal 1, auth_mods.first.args.size
53
+ assert_equal 'test', auth_mods.first.args.first[:server]
54
+ assert_equal 'testing', auth_mods.last.args.first[:server]
55
+ end
56
+ end
57
+
58
+ class UserNoArgs < ActiveRecord::Base
59
+ acts_as_authenticated_user
60
+ end
61
+
62
+ class BasicAuthMod
63
+ end
64
+
65
+ class UserWithAuthMod < ActiveRecord::Base
66
+ acts_as_authenticated_user :authenticate_with => 'BasicAuthMod'
67
+ end
68
+
69
+ class BasicTokenMod
70
+ end
71
+
72
+ class UserWithTokenMod < ActiveRecord::Base
73
+ acts_as_authenticated_user :token_with => 'BasicTokenMod'
74
+ end
75
+
76
+ class UserWithMultipleMods < ActiveRecord::Base
77
+ acts_as_authenticated_user :authenticate_with =>
78
+ ['BasicAuthMod', 'Authentication::SaltedHash']
79
+ end
80
+
81
+ class ArgAuthMod
82
+ def initialize(*args)
83
+ self.args = args
84
+ end
85
+ attr_accessor :args
86
+ end
87
+ class AnotherArgAuthMod < ArgAuthMod
88
+ end
89
+
90
+ class UserWithArgMod < ActiveRecord::Base
91
+ acts_as_authenticated_user :authenticate_with =>
92
+ {'ArgAuthMod' => {:server => 'test'}}
93
+ end
94
+
95
+ class UserWithMultipleArgs < ActiveRecord::Base
96
+ acts_as_authenticated_user :authenticate_with => [
97
+ {'ArgAuthMod' => {:server => 'test'}},
98
+ {'AnotherArgAuthMod' => {:server => 'testing'}}
99
+ ]
100
+ end
@@ -0,0 +1,41 @@
1
+ require 'test/unit'
2
+ require File.join(File.dirname(__FILE__), 'abstract_unit')
3
+
4
+ # Tests RememberMe to see if it can allocate remember me tokens and
5
+ # validate those tokens correctly. This is very similar to single
6
+ # token except that it stores in a different field and will not care
7
+ # about expiration
8
+ class RememberMe < Test::Unit::TestCase
9
+ include Authentication::HashHelper
10
+ fixtures :users
11
+
12
+ def setup
13
+ @tokener = Authentication::RememberMe.new
14
+
15
+ @joe = users(:joe)
16
+ @key = @tokener.assign_token @joe, 'remember me'
17
+ @joe.save!
18
+ @joe.reload
19
+ end
20
+
21
+ def test_assign_remember_me
22
+ assert_equal hash_string(@key), @joe.remember_me
23
+ end
24
+
25
+ def test_authenticate
26
+ assert @tokener.authenticate(@joe, @key)
27
+ assert !@tokener.authenticate(@joe, "invalid key")
28
+ end
29
+
30
+ def test_expiration_does_not_matter
31
+ expired_key = @tokener.assign_token @joe, 'remember me', 1.day.ago
32
+ @joe.save!
33
+ @joe.reload
34
+
35
+ assert @tokener.authenticate(@joe, expired_key)
36
+ end
37
+
38
+ def test_non_remember_me
39
+ assert_nil @tokener.assign_token(@joe, 'invalid', 3.days.from_now)
40
+ end
41
+ end
@@ -0,0 +1,38 @@
1
+ require 'test/unit'
2
+ require File.join(File.dirname(__FILE__), 'abstract_unit')
3
+
4
+ # Tests SaltedHash class to ensure it can authenticate and assign
5
+ # passwords correctly
6
+ class SaltedHashTest < Test::Unit::TestCase
7
+ fixtures :users
8
+
9
+ def setup
10
+ @password = "foobazzle"
11
+ @crypter = Authentication::SaltedHash.new
12
+
13
+ @joe = users(:joe)
14
+ @crypter.assign_password @joe, @password
15
+ @joe.save!
16
+ @joe.reload
17
+ end
18
+
19
+ # We are basically just going to test that it gets assigned. We can
20
+ # really only test if it was assigned the right value when we test
21
+ # authenticate
22
+ def test_assign_password
23
+ assert_not_nil @joe.password_salt
24
+ assert_not_nil @joe.password_hash
25
+ end
26
+
27
+ def test_authenticate
28
+ assert @crypter.authenticate(@joe, @password)
29
+ assert !@crypter.authenticate(@joe, "false password")
30
+ end
31
+
32
+ def test_model_validation
33
+ class << User; alias_method :backup_column_names, :column_names end
34
+ def User.column_names; %w(id name password) end
35
+ assert !@crypter.authenticate(@joe, @password)
36
+ class << User; alias_method :column_names, :backup_column_names end
37
+ end
38
+ end