challah 1.1.1 → 1.2.0.rc

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 (88) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +12 -1
  3. data/README.md +3 -3
  4. data/app/models/authorization.rb +2 -2
  5. data/app/models/user.rb +2 -2
  6. data/lib/challah.rb +60 -53
  7. data/lib/challah/active_record_extensions.rb +23 -0
  8. data/lib/challah/{authorization.rb → concerns/authorizeable.rb} +14 -19
  9. data/lib/challah/concerns/user/attributeable.rb +73 -0
  10. data/lib/challah/{user/authentication.rb → concerns/user/authenticateable.rb} +2 -2
  11. data/lib/challah/concerns/user/authorizable.rb +32 -0
  12. data/lib/challah/concerns/user/findable.rb +45 -0
  13. data/lib/challah/{user/password.rb → concerns/user/passwordable.rb} +2 -2
  14. data/lib/challah/{user/providers.rb → concerns/user/provideable.rb} +46 -6
  15. data/lib/challah/concerns/user/validateable.rb +21 -0
  16. data/lib/challah/concerns/userable.rb +20 -0
  17. data/lib/challah/engine.rb +1 -2
  18. data/lib/challah/test.rb +52 -32
  19. data/lib/challah/version.rb +1 -1
  20. metadata +14 -76
  21. data/lib/challah/user.rb +0 -128
  22. data/lib/challah/user/attributes.rb +0 -28
  23. data/lib/challah/user/finders.rb +0 -31
  24. data/lib/challah/user/reflector.rb +0 -15
  25. data/test/controllers/controller_test.rb +0 -34
  26. data/test/controllers/restrictions_controller_test.rb +0 -95
  27. data/test/controllers/sessions_controller_test.rb +0 -42
  28. data/test/dummy/README.rdoc +0 -28
  29. data/test/dummy/Rakefile +0 -6
  30. data/test/dummy/app/assets/javascripts/application.js +0 -13
  31. data/test/dummy/app/assets/stylesheets/application.css +0 -13
  32. data/test/dummy/app/controllers/application_controller.rb +0 -5
  33. data/test/dummy/app/controllers/restrictions_controller.rb +0 -25
  34. data/test/dummy/app/helpers/application_helper.rb +0 -2
  35. data/test/dummy/app/models/user.rb +0 -15
  36. data/test/dummy/app/models/widget.rb +0 -3
  37. data/test/dummy/app/views/bakery/templates/layouts/sample.erb +0 -1
  38. data/test/dummy/app/views/bakery/templates/partials/sample.html.haml +0 -1
  39. data/test/dummy/app/views/bakery/templates/themes/sample.haml +0 -1
  40. data/test/dummy/app/views/layouts/application.html.erb +0 -14
  41. data/test/dummy/config.ru +0 -4
  42. data/test/dummy/config/application.rb +0 -24
  43. data/test/dummy/config/boot.rb +0 -5
  44. data/test/dummy/config/database.yml +0 -30
  45. data/test/dummy/config/environment.rb +0 -5
  46. data/test/dummy/config/environments/development.rb +0 -29
  47. data/test/dummy/config/environments/production.rb +0 -80
  48. data/test/dummy/config/environments/test.rb +0 -36
  49. data/test/dummy/config/initializers/backtrace_silencers.rb +0 -7
  50. data/test/dummy/config/initializers/filter_parameter_logging.rb +0 -4
  51. data/test/dummy/config/initializers/i18n.rb +0 -1
  52. data/test/dummy/config/initializers/inflections.rb +0 -16
  53. data/test/dummy/config/initializers/mime_types.rb +0 -5
  54. data/test/dummy/config/initializers/secret_token.rb +0 -12
  55. data/test/dummy/config/initializers/session_store.rb +0 -3
  56. data/test/dummy/config/initializers/wrap_parameters.rb +0 -14
  57. data/test/dummy/config/locales/en.yml +0 -23
  58. data/test/dummy/config/routes.rb +0 -5
  59. data/test/dummy/db/migrate/20140114212939_create_widgets.rb +0 -32
  60. data/test/dummy/db/migrate/20140307205735_create_users.challah_engine.rb +0 -34
  61. data/test/dummy/db/migrate/20140307205736_create_authorizations.challah_engine.rb +0 -21
  62. data/test/dummy/db/schema.rb +0 -81
  63. data/test/dummy/db/test.sqlite3 +0 -0
  64. data/test/dummy/log/test.log +0 -11547
  65. data/test/dummy/public/404.html +0 -58
  66. data/test/dummy/public/422.html +0 -58
  67. data/test/dummy/public/500.html +0 -57
  68. data/test/dummy/public/favicon.ico +0 -0
  69. data/test/dummy/tmp/cache/assets/test/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
  70. data/test/dummy/tmp/cache/assets/test/sprockets/2f5173deea6c795b8fdde723bb4b63af +0 -0
  71. data/test/dummy/tmp/cache/assets/test/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
  72. data/test/dummy/tmp/cache/assets/test/sprockets/cffd775d018f68ce5dba1ee0d951a994 +0 -0
  73. data/test/dummy/tmp/cache/assets/test/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
  74. data/test/dummy/tmp/cache/assets/test/sprockets/f7cbd26ba1d28d48de824f0e94586655 +0 -0
  75. data/test/factories.rb +0 -8
  76. data/test/models/authorization_test.rb +0 -20
  77. data/test/models/user_test.rb +0 -345
  78. data/test/services/audit_test.rb +0 -107
  79. data/test/services/cookie_store_test.rb +0 -97
  80. data/test/services/encrypter_test.rb +0 -73
  81. data/test/services/plugins_test.rb +0 -65
  82. data/test/services/random_test.rb +0 -22
  83. data/test/services/routes_test.rb +0 -11
  84. data/test/services/session_test.rb +0 -197
  85. data/test/services/signup_test.rb +0 -122
  86. data/test/services/simple_cookie_store_test.rb +0 -122
  87. data/test/support/stubs.rb +0 -88
  88. data/test/test_helper.rb +0 -47
@@ -1,58 +0,0 @@
1
- <!DOCTYPE html>
2
- <html>
3
- <head>
4
- <title>The page you were looking for doesn't exist (404)</title>
5
- <style>
6
- body {
7
- background-color: #EFEFEF;
8
- color: #2E2F30;
9
- text-align: center;
10
- font-family: arial, sans-serif;
11
- }
12
-
13
- div.dialog {
14
- width: 25em;
15
- margin: 4em auto 0 auto;
16
- border: 1px solid #CCC;
17
- border-right-color: #999;
18
- border-left-color: #999;
19
- border-bottom-color: #BBB;
20
- border-top: #B00100 solid 4px;
21
- border-top-left-radius: 9px;
22
- border-top-right-radius: 9px;
23
- background-color: white;
24
- padding: 7px 4em 0 4em;
25
- }
26
-
27
- h1 {
28
- font-size: 100%;
29
- color: #730E15;
30
- line-height: 1.5em;
31
- }
32
-
33
- body > p {
34
- width: 33em;
35
- margin: 0 auto 1em;
36
- padding: 1em 0;
37
- background-color: #F7F7F7;
38
- border: 1px solid #CCC;
39
- border-right-color: #999;
40
- border-bottom-color: #999;
41
- border-bottom-left-radius: 4px;
42
- border-bottom-right-radius: 4px;
43
- border-top-color: #DADADA;
44
- color: #666;
45
- box-shadow:0 3px 8px rgba(50, 50, 50, 0.17);
46
- }
47
- </style>
48
- </head>
49
-
50
- <body>
51
- <!-- This file lives in public/404.html -->
52
- <div class="dialog">
53
- <h1>The page you were looking for doesn't exist.</h1>
54
- <p>You may have mistyped the address or the page may have moved.</p>
55
- </div>
56
- <p>If you are the application owner check the logs for more information.</p>
57
- </body>
58
- </html>
@@ -1,58 +0,0 @@
1
- <!DOCTYPE html>
2
- <html>
3
- <head>
4
- <title>The change you wanted was rejected (422)</title>
5
- <style>
6
- body {
7
- background-color: #EFEFEF;
8
- color: #2E2F30;
9
- text-align: center;
10
- font-family: arial, sans-serif;
11
- }
12
-
13
- div.dialog {
14
- width: 25em;
15
- margin: 4em auto 0 auto;
16
- border: 1px solid #CCC;
17
- border-right-color: #999;
18
- border-left-color: #999;
19
- border-bottom-color: #BBB;
20
- border-top: #B00100 solid 4px;
21
- border-top-left-radius: 9px;
22
- border-top-right-radius: 9px;
23
- background-color: white;
24
- padding: 7px 4em 0 4em;
25
- }
26
-
27
- h1 {
28
- font-size: 100%;
29
- color: #730E15;
30
- line-height: 1.5em;
31
- }
32
-
33
- body > p {
34
- width: 33em;
35
- margin: 0 auto 1em;
36
- padding: 1em 0;
37
- background-color: #F7F7F7;
38
- border: 1px solid #CCC;
39
- border-right-color: #999;
40
- border-bottom-color: #999;
41
- border-bottom-left-radius: 4px;
42
- border-bottom-right-radius: 4px;
43
- border-top-color: #DADADA;
44
- color: #666;
45
- box-shadow:0 3px 8px rgba(50, 50, 50, 0.17);
46
- }
47
- </style>
48
- </head>
49
-
50
- <body>
51
- <!-- This file lives in public/422.html -->
52
- <div class="dialog">
53
- <h1>The change you wanted was rejected.</h1>
54
- <p>Maybe you tried to change something you didn't have access to.</p>
55
- </div>
56
- <p>If you are the application owner check the logs for more information.</p>
57
- </body>
58
- </html>
@@ -1,57 +0,0 @@
1
- <!DOCTYPE html>
2
- <html>
3
- <head>
4
- <title>We're sorry, but something went wrong (500)</title>
5
- <style>
6
- body {
7
- background-color: #EFEFEF;
8
- color: #2E2F30;
9
- text-align: center;
10
- font-family: arial, sans-serif;
11
- }
12
-
13
- div.dialog {
14
- width: 25em;
15
- margin: 4em auto 0 auto;
16
- border: 1px solid #CCC;
17
- border-right-color: #999;
18
- border-left-color: #999;
19
- border-bottom-color: #BBB;
20
- border-top: #B00100 solid 4px;
21
- border-top-left-radius: 9px;
22
- border-top-right-radius: 9px;
23
- background-color: white;
24
- padding: 7px 4em 0 4em;
25
- }
26
-
27
- h1 {
28
- font-size: 100%;
29
- color: #730E15;
30
- line-height: 1.5em;
31
- }
32
-
33
- body > p {
34
- width: 33em;
35
- margin: 0 auto 1em;
36
- padding: 1em 0;
37
- background-color: #F7F7F7;
38
- border: 1px solid #CCC;
39
- border-right-color: #999;
40
- border-bottom-color: #999;
41
- border-bottom-left-radius: 4px;
42
- border-bottom-right-radius: 4px;
43
- border-top-color: #DADADA;
44
- color: #666;
45
- box-shadow:0 3px 8px rgba(50, 50, 50, 0.17);
46
- }
47
- </style>
48
- </head>
49
-
50
- <body>
51
- <!-- This file lives in public/500.html -->
52
- <div class="dialog">
53
- <h1>We're sorry, but something went wrong.</h1>
54
- </div>
55
- <p>If you are the application owner check the logs for more information.</p>
56
- </body>
57
- </html>
File without changes
data/test/factories.rb DELETED
@@ -1,8 +0,0 @@
1
- # Define some basic factories for testing within our sample app
2
- FactoryGirl.define do
3
- factory :user do
4
- first_name 'Test'
5
- last_name 'User'
6
- sequence(:email) { |n| "email#{n}@example.com" }
7
- end
8
- end # end FactoryGirl.define
@@ -1,20 +0,0 @@
1
- require 'test_helper'
2
-
3
- class AuthorizationTest < ActiveSupport::TestCase
4
-
5
- context "The Authorization class" do
6
-
7
- should "have a list of attributes that are hashable" do
8
- expected_columns = %w( id uid token expires_at ).sort
9
-
10
- assert_equal expected_columns, Authorization.hashable_attributes.sort
11
- end
12
-
13
- should "have a reference to the users model" do
14
- assert_equal User, Authorization.user_model
15
- assert_equal 'users', Authorization.users_table_name
16
- end
17
-
18
- end
19
-
20
- end
@@ -1,345 +0,0 @@
1
- require 'test_helper'
2
-
3
- class UserTest < ActiveSupport::TestCase
4
- should validate_presence_of :email
5
- should validate_presence_of :first_name
6
- should validate_presence_of :last_name
7
-
8
- context "With an existing user" do
9
- setup do
10
- create(:user)
11
- end
12
-
13
- should validate_uniqueness_of :email
14
- end
15
-
16
- context "A User class" do
17
-
18
- should "find a user by username or email" do
19
- user_one = build(:user, :username => ' Test-user ', :email => 'tester@example.com')
20
- user_two = build(:user, :username => 'test-user-2 ', :email => 'tester2@example.com')
21
-
22
- user_one.password!('test123')
23
- user_two.password!('test123')
24
-
25
- user_one.save
26
- user_two.save
27
-
28
- assert_equal user_one, ::User.find_for_session('test-user')
29
- assert_equal user_one, ::User.find_for_session('tester@example.com')
30
-
31
- assert_equal user_one, ::User.find_for_session('Test-user')
32
- assert_equal user_one, ::User.find_for_session('tester@example.com')
33
-
34
- assert_equal user_two, ::User.find_for_session('test-user-2')
35
- assert_equal user_two, ::User.find_for_session('tester2@example.com')
36
-
37
- assert_equal nil, ::User.find_for_session(' ')
38
- assert_equal nil, ::User.find_for_session('not-existing')
39
- end
40
-
41
- should "have a reference to the authorizations model" do
42
- assert_equal Authorization, User.authorization_model
43
- assert_equal 'authorizations', User.authorizations_table_name
44
- end
45
-
46
- end
47
-
48
- context "A user instance" do
49
- should "have a name attribute that returns the full name" do
50
- user = ::User.new
51
-
52
- user.stubs(:first_name).returns('Cal')
53
- user.stubs(:last_name).returns('Ripken')
54
-
55
- assert_equal "Cal Ripken", user.name
56
- assert_equal "Cal R.", user.small_name
57
- end
58
-
59
- should "have an active? user flag" do
60
- user = ::User.new
61
-
62
- user.active = true
63
- assert_equal true, user.active
64
- assert_equal true, user.active?
65
- assert_equal true, user.valid_session?
66
-
67
- user.active = false
68
- assert_equal false, user.active
69
- assert_equal false, user.active?
70
- assert_equal false, user.valid_session?
71
- end
72
-
73
- # Only for Rails 3
74
- if defined?(ActiveModel::MassAssignmentSecurity::Error)
75
- should "not allow updating of certain protected attributes" do
76
- user = create(:user, :first_name => 'Old', :last_name => 'Nombre')
77
-
78
- assert_equal false, user.new_record?
79
-
80
- assert_equal 0, user.created_by
81
- assert_equal 'Old Nombre', user.name
82
-
83
- assert_raise ActiveModel::MassAssignmentSecurity::Error do
84
- user.update_attributes({
85
- :created_by => 1,
86
- :first_name => 'New',
87
- :last_name => 'Name'
88
- })
89
- end
90
-
91
- assert_equal 0, user.created_by
92
- end
93
- end
94
-
95
- should "create a user with password and authenticate them" do
96
- user = build(:user)
97
-
98
- user.password = 'abc123'
99
- user.password_confirmation = 'abc123'
100
- assert_equal 'abc123', user.password
101
-
102
- assert user.save
103
-
104
- assert_equal true, user.provider?(:password)
105
- assert_not_nil user.provider(:password)
106
-
107
- assert_equal true, user.authenticate('abc123')
108
- assert_equal true, user.authenticate(:password, 'abc123')
109
- assert_equal false, user.authenticate('test123')
110
- end
111
-
112
- should "be able to update a user without changing their password" do
113
- user = build(:user)
114
- user.password!('abc123')
115
- user.save
116
-
117
- assert_equal true, user.authenticate('abc123')
118
-
119
- user.first_name = 'New'
120
- user.password = ''
121
- user.password_confirmation = ''
122
- assert user.save
123
-
124
- assert_equal 'New', user.first_name
125
- assert_equal true, user.authenticate('abc123')
126
- end
127
-
128
- should "validate a password" do
129
- user = build(:user)
130
- user.password!('abc123')
131
- assert_equal true, user.valid?
132
-
133
- user.username = 'user123'
134
- user.password = ''
135
- user.password_confirmation = ''
136
- assert_equal false, user.valid?
137
- assert user.errors.full_messages.include?("Password can't be blank")
138
-
139
- user.password = 'abc'
140
- user.password_confirmation = 'abc'
141
- assert_equal false, user.valid?
142
- assert user.errors.full_messages.include?("Password is not a valid password. Please enter at least 4 letters or numbers.")
143
-
144
- user.password = 'abc456'
145
- user.password_confirmation = 'abc123'
146
- assert_equal false, user.valid?
147
- assert user.errors.full_messages.include?("Password does not match the confirmation password.")
148
- end
149
-
150
- should "create a password without confirmation when using !" do
151
- user = build(:user)
152
- user.password!('holla')
153
- assert_equal true, user.valid?
154
- end
155
-
156
- should "reasonable validate an email address" do
157
- user = build(:user)
158
-
159
- user.email = 'john@challah.me'
160
- assert_equal true, user.valid?
161
-
162
- user.email = 'john@challah.m@me.e'
163
- assert_equal false, user.valid?
164
- end
165
-
166
- should "always lower case a username when setting" do
167
- user = build(:user)
168
- user.username = 'JimBob'
169
- assert_equal 'jimbob', user.username
170
- end
171
-
172
- should "not authenticate with a password if none is given" do
173
- user = create(:user)
174
- assert_equal false, user.authenticate_with_password('abc123')
175
- end
176
-
177
- should "authenticate through various means by default" do
178
- user = build(:user)
179
- user.password!('abc123')
180
- user.save
181
-
182
- # By password
183
- assert_equal false, user.authenticate_with_password('test123')
184
- assert_equal false, user.authenticate(:password, 'test123')
185
- assert_equal false, user.authenticate('test123')
186
-
187
- assert_equal true, user.authenticate_with_password('abc123')
188
- assert_equal true, user.authenticate(:password, 'abc123')
189
- assert_equal true, user.authenticate('abc123')
190
-
191
- # By api key
192
- user.stubs(:api_key).returns('this-is-my-api-key')
193
-
194
- assert_equal true, user.authenticate_with_api_key('this-is-my-api-key')
195
- assert_equal true, user.authenticate_with_api_key('this-is-my-api-key')
196
-
197
- assert_equal false, user.authenticate_with_api_key('this-is-not-my-api-key')
198
- assert_equal false, user.authenticate_with_api_key('this-is-not-my-api-key')
199
-
200
- # With an unknown authentication method
201
- assert_equal false, user.authenticate(:blah, 'sdsd', 'sdlsk')
202
- end
203
-
204
- should "be able to change a username" do
205
- user = create(:user)
206
-
207
- user.password!('test123')
208
- user.username = 'john'
209
- user.save
210
-
211
- # reload
212
- user = User.find_by_id(user.id)
213
-
214
- assert_equal true, user.authenticate('test123')
215
- assert_equal 'john', user.username
216
-
217
- user.username = 'johndoe'
218
- user.save
219
-
220
- # reload
221
- user = User.find_by_id(user.id)
222
-
223
- assert_equal true, user.authenticate('test123')
224
- assert_equal 'johndoe', user.username
225
- end
226
-
227
- should "have successful and failed authentication methods" do
228
- user = create(:user)
229
-
230
- assert_nil user.last_session_ip
231
- assert_nil user.last_session_at
232
-
233
- assert_difference 'user.session_count', 1 do
234
- user.successful_authentication!('192.168.0.1')
235
- end
236
-
237
- assert_not_nil user.last_session_ip
238
- assert_not_nil user.last_session_at
239
-
240
- assert_difference 'user.failed_auth_count', 1 do
241
- user.failed_authentication!
242
- end
243
- end
244
-
245
- should "calculate an email hash on save" do
246
- user = build(:user)
247
-
248
- user.email = 'tester@challah.me'
249
- assert user.save
250
- assert_equal '859ea8a4ea69b321df4992ca14c08d6b', user.email_hash
251
-
252
- user.email = 'tester-too@challah.me'
253
- assert user.save
254
- assert_equal '45ab23dd8eb9a00f61cef27004b38b01', user.email_hash
255
- end
256
-
257
- should "have custom authorization providers" do
258
- user = create(:user)
259
-
260
- auth = Authorization.set({
261
- :user_id => user.id,
262
- :provider => 'custom',
263
- :uid => '12345',
264
- :token => 'abcdef1234569'
265
- })
266
-
267
- assert_equal false, user.provider?(:password)
268
- assert_equal nil, user.provider(:password)
269
-
270
- expected_auth = {
271
- :id => auth.id,
272
- :uid => '12345',
273
- :token => 'abcdef1234569',
274
- :expires_at => nil
275
- }
276
-
277
- assert_equal true, user.provider?(:custom)
278
- assert_equal true, user.custom_provider?
279
-
280
- assert_equal expected_auth, user.provider(:custom)
281
- assert_equal expected_auth, user.custom_provider
282
- end
283
-
284
- should "have default method_missing when not looking for a provider" do
285
- user = create(:user)
286
- assert_equal false, user.custom_provider?
287
-
288
- assert_raise NoMethodError do
289
- user.does_not_exist?
290
- end
291
- end
292
-
293
- should "clear authorizations when removing a user" do
294
- user = create(:user)
295
-
296
- Authorization.set({
297
- :user_id => user.id,
298
- :provider => 'custom',
299
- :uid => '12345',
300
- :token => 'abcdef1234569'
301
- })
302
-
303
- user.password!('test123')
304
- user.save
305
-
306
- assert_difference 'User.count', -1 do
307
- assert_difference 'Authorization.count', -2 do
308
- user.destroy
309
- end
310
- end
311
- end
312
-
313
- should "set provider attributes" do
314
- user = build(:user)
315
-
316
- user.provider_attributes = {
317
- :fake => { :uid => "1", "token" => 'me' }
318
- }
319
-
320
- assert_equal true, user.provider?(:fake)
321
- assert_equal true, user.valid_provider?(:fake)
322
-
323
- assert_difference [ 'User.count', 'Authorization.count' ], 1 do
324
- assert user.save
325
- end
326
- end
327
-
328
- should "not add invalid providers" do
329
- provider_attributes = {
330
- "fake" => { :uid => "1", "token" => 'not-me' }
331
- }
332
-
333
- user = build(:user, :provider_attributes => provider_attributes)
334
-
335
- assert_equal true, user.provider?(:fake)
336
- assert_equal false, user.valid_provider?(:fake)
337
-
338
- assert_difference [ 'User.count' ], 1 do
339
- assert_no_difference [ 'Authorization.count' ] do
340
- assert user.save
341
- end
342
- end
343
- end
344
- end
345
- end