authpwn_rails 0.17.2 → 0.18.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b095c66fb7394d72b05bd3c28f5c68a7c25c87ab
4
- data.tar.gz: ccb3d3ce5a0ed4be9caf9ae575124d496dd3b89d
3
+ metadata.gz: 65618dde26dcdad94e8dc8e72daa2f32fd9ceef2
4
+ data.tar.gz: 423f8dcf94083a6e5c3ab49f6c73caa8ed6567ed
5
5
  SHA512:
6
- metadata.gz: cd79f304e8a6251c48e03ae823b09968344fbb6706023c3934606bb2c14a46da30a8e09fbc96c2bd2c3464680fe00398fe80b9e73bac1cad28dc45f752c20f34
7
- data.tar.gz: 8086d3687c7cd22126e1d13863d39aa3f0e3ef179f54dfdf970863a960bb359c645351b203313a2d66416f78df41dbe6297deb896597d1867c83d439c5e2ffc2
6
+ metadata.gz: 434cb53b2466d1fa67cef7daa6b3d5a46a588568ebd82b7cef7533ac5c33e4f883b034113d8bc6a07911026e3f61d9617740e525a450aad5fb5081dd7c89bf07
7
+ data.tar.gz: 243f68501820c8eaecddc32d17ff36b5931ebdeacb703d0f09d696e4919ca92c687a2ea319878e155e30c2f7e63547d2aa2f394f38b73a41832e72c89f739005
data/.travis.yml CHANGED
@@ -9,6 +9,5 @@ gemfile:
9
9
  - Gemfile.rails41
10
10
  - Gemfile.rails42
11
11
  rvm:
12
- - 2.0.0
13
12
  - 2.1.0
14
- - rbx
13
+ - 2.2.0
data/Gemfile CHANGED
@@ -1,15 +1,15 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- gem 'rails', '>= 4.0.9'
3
+ gem 'rails', '>= 4.0.13'
4
4
 
5
5
  group :development do
6
- gem 'bundler', '>= 1.7.3'
6
+ gem 'bundler', '>= 1.6.6'
7
7
  gem 'mocha', '>= 0.14.0'
8
8
  gem 'jeweler', '>= 2.0.1'
9
9
  gem 'simplecov', '>= 0'
10
- gem 'mysql2', '>= 0.3.16'
10
+ gem 'mysql2', '>= 0.3.18'
11
11
  gem 'omniauth', '>= 1.2.2'
12
- gem 'pg', '>= 0.17.1'
12
+ gem 'pg', '>= 0.18.2'
13
13
  gem 'sqlite3', '>= 1.3.9'
14
14
  gem 'rubysl', platforms: [:rbx]
15
15
  gem 'rubysl-bundler', platforms: [:rbx]
data/Gemfile.lock CHANGED
@@ -1,42 +1,42 @@
1
1
  GEM
2
2
  remote: https://rubygems.org/
3
3
  specs:
4
- actionmailer (4.2.0)
5
- actionpack (= 4.2.0)
6
- actionview (= 4.2.0)
7
- activejob (= 4.2.0)
4
+ actionmailer (4.2.2)
5
+ actionpack (= 4.2.2)
6
+ actionview (= 4.2.2)
7
+ activejob (= 4.2.2)
8
8
  mail (~> 2.5, >= 2.5.4)
9
9
  rails-dom-testing (~> 1.0, >= 1.0.5)
10
- actionpack (4.2.0)
11
- actionview (= 4.2.0)
12
- activesupport (= 4.2.0)
13
- rack (~> 1.6.0)
10
+ actionpack (4.2.2)
11
+ actionview (= 4.2.2)
12
+ activesupport (= 4.2.2)
13
+ rack (~> 1.6)
14
14
  rack-test (~> 0.6.2)
15
15
  rails-dom-testing (~> 1.0, >= 1.0.5)
16
16
  rails-html-sanitizer (~> 1.0, >= 1.0.1)
17
- actionview (4.2.0)
18
- activesupport (= 4.2.0)
17
+ actionview (4.2.2)
18
+ activesupport (= 4.2.2)
19
19
  builder (~> 3.1)
20
20
  erubis (~> 2.7.0)
21
21
  rails-dom-testing (~> 1.0, >= 1.0.5)
22
22
  rails-html-sanitizer (~> 1.0, >= 1.0.1)
23
- activejob (4.2.0)
24
- activesupport (= 4.2.0)
23
+ activejob (4.2.2)
24
+ activesupport (= 4.2.2)
25
25
  globalid (>= 0.3.0)
26
- activemodel (4.2.0)
27
- activesupport (= 4.2.0)
26
+ activemodel (4.2.2)
27
+ activesupport (= 4.2.2)
28
28
  builder (~> 3.1)
29
- activerecord (4.2.0)
30
- activemodel (= 4.2.0)
31
- activesupport (= 4.2.0)
29
+ activerecord (4.2.2)
30
+ activemodel (= 4.2.2)
31
+ activesupport (= 4.2.2)
32
32
  arel (~> 6.0)
33
- activesupport (4.2.0)
33
+ activesupport (4.2.2)
34
34
  i18n (~> 0.7)
35
35
  json (~> 1.7, >= 1.7.7)
36
36
  minitest (~> 5.1)
37
37
  thread_safe (~> 0.3, >= 0.3.4)
38
38
  tzinfo (~> 1.1)
39
- addressable (2.3.6)
39
+ addressable (2.3.8)
40
40
  arel (6.0.0)
41
41
  builder (3.2.2)
42
42
  descendants_tracker (0.0.4)
@@ -46,8 +46,8 @@ GEM
46
46
  faraday (0.9.1)
47
47
  multipart-post (>= 1.2, < 3)
48
48
  ffi2-generators (0.1.1)
49
- git (1.2.8)
50
- github_api (0.12.2)
49
+ git (1.2.9.1)
50
+ github_api (0.12.3)
51
51
  addressable (~> 2.3)
52
52
  descendants_tracker (~> 0.0.4)
53
53
  faraday (~> 0.8, < 0.10)
@@ -55,11 +55,10 @@ GEM
55
55
  multi_json (>= 1.7.5, < 2.0)
56
56
  nokogiri (~> 1.6.3)
57
57
  oauth2
58
- globalid (0.3.0)
58
+ globalid (0.3.5)
59
59
  activesupport (>= 4.1.0)
60
- hashie (3.3.2)
61
- highline (1.6.21)
62
- hike (1.2.3)
60
+ hashie (3.4.2)
61
+ highline (1.7.2)
63
62
  i18n (0.7.0)
64
63
  jeweler (2.0.1)
65
64
  builder
@@ -70,23 +69,23 @@ GEM
70
69
  nokogiri (>= 1.5.10)
71
70
  rake
72
71
  rdoc
73
- json (1.8.2)
74
- jwt (1.2.0)
75
- loofah (2.0.1)
72
+ json (1.8.3)
73
+ jwt (1.5.0)
74
+ loofah (2.0.2)
76
75
  nokogiri (>= 1.5.9)
77
76
  mail (2.6.3)
78
77
  mime-types (>= 1.16, < 3)
79
78
  metaclass (0.0.4)
80
- mime-types (2.4.3)
79
+ mime-types (2.6.1)
81
80
  mini_portile (0.6.2)
82
- minitest (5.5.1)
81
+ minitest (5.7.0)
83
82
  mocha (1.1.0)
84
83
  metaclass (~> 0.0.1)
85
- multi_json (1.10.1)
84
+ multi_json (1.11.1)
86
85
  multi_xml (0.5.5)
87
86
  multipart-post (2.0.0)
88
- mysql2 (0.3.17)
89
- nokogiri (1.6.5)
87
+ mysql2 (0.3.18)
88
+ nokogiri (1.6.6.2)
90
89
  mini_portile (~> 0.6.0)
91
90
  oauth2 (1.0.0)
92
91
  faraday (>= 0.8, < 0.10)
@@ -97,38 +96,36 @@ GEM
97
96
  omniauth (1.2.2)
98
97
  hashie (>= 1.2, < 4)
99
98
  rack (~> 1.0)
100
- pg (0.18.1)
101
- rack (1.6.0)
99
+ pg (0.18.2)
100
+ rack (1.6.2)
102
101
  rack-test (0.6.3)
103
102
  rack (>= 1.0)
104
- rails (4.2.0)
105
- actionmailer (= 4.2.0)
106
- actionpack (= 4.2.0)
107
- actionview (= 4.2.0)
108
- activejob (= 4.2.0)
109
- activemodel (= 4.2.0)
110
- activerecord (= 4.2.0)
111
- activesupport (= 4.2.0)
103
+ rails (4.2.2)
104
+ actionmailer (= 4.2.2)
105
+ actionpack (= 4.2.2)
106
+ actionview (= 4.2.2)
107
+ activejob (= 4.2.2)
108
+ activemodel (= 4.2.2)
109
+ activerecord (= 4.2.2)
110
+ activesupport (= 4.2.2)
112
111
  bundler (>= 1.3.0, < 2.0)
113
- railties (= 4.2.0)
112
+ railties (= 4.2.2)
114
113
  sprockets-rails
115
114
  rails-deprecated_sanitizer (1.0.3)
116
115
  activesupport (>= 4.2.0.alpha)
117
- rails-dom-testing (1.0.5)
116
+ rails-dom-testing (1.0.6)
118
117
  activesupport (>= 4.2.0.beta, < 5.0)
119
118
  nokogiri (~> 1.6.0)
120
119
  rails-deprecated_sanitizer (>= 1.0.1)
121
- rails-html-sanitizer (1.0.1)
120
+ rails-html-sanitizer (1.0.2)
122
121
  loofah (~> 2.0)
123
- railties (4.2.0)
124
- actionpack (= 4.2.0)
125
- activesupport (= 4.2.0)
122
+ railties (4.2.2)
123
+ actionpack (= 4.2.2)
124
+ activesupport (= 4.2.2)
126
125
  rake (>= 0.8.7)
127
126
  thor (>= 0.18.1, < 2.0)
128
127
  rake (10.4.2)
129
- rb-readline (0.5.2)
130
128
  rdoc (4.2.0)
131
- json (~> 1.4)
132
129
  rubysl (2.1.0)
133
130
  rubysl-abbrev (~> 2.0)
134
131
  rubysl-base64 (~> 2.0)
@@ -242,9 +239,9 @@ GEM
242
239
  rubysl-csv (2.0.2)
243
240
  rubysl-english (~> 2.0)
244
241
  rubysl-curses (2.0.1)
245
- rubysl-date (2.0.8)
242
+ rubysl-date (2.0.9)
246
243
  rubysl-delegate (2.0.1)
247
- rubysl-digest (2.0.3)
244
+ rubysl-digest (2.0.8)
248
245
  rubysl-drb (2.0.1)
249
246
  rubysl-e2mmap (2.0.0)
250
247
  rubysl-english (2.0.0)
@@ -267,8 +264,7 @@ GEM
267
264
  rubysl-io-nonblock (2.0.0)
268
265
  rubysl-io-wait (2.0.0)
269
266
  rubysl-ipaddr (2.0.0)
270
- rubysl-irb (2.1.0)
271
- rb-readline (~> 0.5)
267
+ rubysl-irb (2.1.1)
272
268
  rubysl-e2mmap (~> 2.0)
273
269
  rubysl-mathn (~> 2.0)
274
270
  rubysl-thread (~> 2.0)
@@ -295,7 +291,7 @@ GEM
295
291
  rubysl-observer (2.0.0)
296
292
  rubysl-open-uri (2.0.0)
297
293
  rubysl-open3 (2.0.0)
298
- rubysl-openssl (2.2.1)
294
+ rubysl-openssl (2.3.0)
299
295
  rubysl-optparse (2.0.1)
300
296
  rubysl-shellwords (~> 2.0)
301
297
  rubysl-ostruct (2.0.4)
@@ -320,7 +316,7 @@ GEM
320
316
  rubysl-tempfile (~> 2.0)
321
317
  rubysl-thread (~> 2.0)
322
318
  rubysl-rational (2.0.1)
323
- rubysl-resolv (2.1.0)
319
+ rubysl-resolv (2.1.2)
324
320
  rubysl-rexml (2.0.4)
325
321
  rubysl-rinda (2.0.1)
326
322
  rubysl-rss (2.0.0)
@@ -336,7 +332,7 @@ GEM
336
332
  rubysl-syslog (2.1.0)
337
333
  ffi2-generators (~> 0.1)
338
334
  rubysl-tempfile (2.0.1)
339
- rubysl-thread (2.0.2)
335
+ rubysl-thread (2.0.3)
340
336
  rubysl-thwait (2.0.0)
341
337
  rubysl-time (2.0.3)
342
338
  rubysl-timeout (2.0.0)
@@ -351,24 +347,20 @@ GEM
351
347
  rubysl-xmlrpc (2.0.0)
352
348
  rubysl-yaml (2.1.0)
353
349
  rubysl-zlib (2.0.1)
354
- simplecov (0.9.1)
350
+ simplecov (0.10.0)
355
351
  docile (~> 1.1.0)
356
- multi_json (~> 1.0)
357
- simplecov-html (~> 0.8.0)
358
- simplecov-html (0.8.0)
359
- sprockets (2.12.3)
360
- hike (~> 1.2)
361
- multi_json (~> 1.0)
352
+ json (~> 1.8)
353
+ simplecov-html (~> 0.10.0)
354
+ simplecov-html (0.10.0)
355
+ sprockets (3.2.0)
362
356
  rack (~> 1.0)
363
- tilt (~> 1.1, != 1.3.0)
364
- sprockets-rails (2.2.2)
357
+ sprockets-rails (2.3.1)
365
358
  actionpack (>= 3.0)
366
359
  activesupport (>= 3.0)
367
360
  sprockets (>= 2.8, < 4.0)
368
361
  sqlite3 (1.3.10)
369
362
  thor (0.19.1)
370
- thread_safe (0.3.4)
371
- tilt (1.4.1)
363
+ thread_safe (0.3.5)
372
364
  tzinfo (1.2.2)
373
365
  thread_safe (~> 0.1)
374
366
 
@@ -376,13 +368,13 @@ PLATFORMS
376
368
  ruby
377
369
 
378
370
  DEPENDENCIES
379
- bundler (>= 1.7.3)
371
+ bundler (>= 1.6.6)
380
372
  jeweler (>= 2.0.1)
381
373
  mocha (>= 0.14.0)
382
- mysql2 (>= 0.3.16)
374
+ mysql2 (>= 0.3.18)
383
375
  omniauth (>= 1.2.2)
384
- pg (>= 0.17.1)
385
- rails (>= 4.0.9)
376
+ pg (>= 0.18.2)
377
+ rails (>= 4.0.13)
386
378
  rubysl
387
379
  rubysl-bundler
388
380
  rubysl-rake
data/Gemfile.rails4 CHANGED
@@ -1,15 +1,15 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- gem 'rails', '~> 4.0.9'
3
+ gem 'rails', '~> 4.0.13'
4
4
 
5
5
  group :development do
6
- gem 'bundler', '>= 1.6.2'
6
+ gem 'bundler', '>= 1.6.6'
7
7
  gem 'mocha', '>= 1.1.0'
8
8
  gem 'jeweler', '>= 2.0.1'
9
9
  gem 'simplecov', '>= 0'
10
- gem 'mysql2', '>= 0.3.16'
10
+ gem 'mysql2', '>= 0.3.18'
11
11
  gem 'omniauth', '>= 1.2.2'
12
- gem 'pg', '>= 0.17.1'
12
+ gem 'pg', '>= 0.18.2'
13
13
  gem 'sqlite3', '>= 1.3.10'
14
14
  gem 'rubysl', platforms: [:rbx]
15
15
  gem 'rubysl-bundler', platforms: [:rbx]
data/Gemfile.rails41 CHANGED
@@ -1,15 +1,15 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- gem 'rails', '~> 4.1.7'
3
+ gem 'rails', '~> 4.1.10'
4
4
 
5
5
  group :development do
6
- gem 'bundler', '>= 1.6.2'
6
+ gem 'bundler', '>= 1.6.6'
7
7
  gem 'mocha', '>= 1.1.0'
8
8
  gem 'jeweler', '>= 2.0.1'
9
9
  gem 'simplecov', '>= 0'
10
- gem 'mysql2', '>= 0.3.16'
10
+ gem 'mysql2', '>= 0.3.18'
11
11
  gem 'omniauth', '>= 1.2.2'
12
- gem 'pg', '>= 0.17.1'
12
+ gem 'pg', '>= 0.18.2'
13
13
  gem 'sqlite3', '>= 1.3.10'
14
14
  gem 'rubysl', platforms: [:rbx]
15
15
  gem 'rubysl-bundler', platforms: [:rbx]
data/Gemfile.rails42 CHANGED
@@ -1,15 +1,15 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- gem 'rails', '>= 4.2.0'
3
+ gem 'rails', '~> 4.2.2'
4
4
 
5
5
  group :development do
6
- gem 'bundler', '>= 1.6.2'
6
+ gem 'bundler', '>= 1.6.6'
7
7
  gem 'mocha', '>= 1.1.0'
8
8
  gem 'jeweler', '>= 2.0.1'
9
9
  gem 'simplecov', '>= 0'
10
- gem 'mysql2', '>= 0.3.16'
10
+ gem 'mysql2', '>= 0.3.18'
11
11
  gem 'omniauth', '>= 1.2.2'
12
- gem 'pg', '>= 0.17.1'
12
+ gem 'pg', '>= 0.18.2'
13
13
  gem 'sqlite3', '>= 1.3.10'
14
14
  gem 'rubysl', platforms: [:rbx]
15
15
  gem 'rubysl-bundler', platforms: [:rbx]
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.17.2
1
+ 0.18.0
@@ -0,0 +1,13 @@
1
+ # :namespace
2
+ module Tokens
3
+
4
+ # API tokens can be used to issue API calls on behalf of an account.
5
+ class Api < Tokens::Base
6
+ # NOTE: If we ever implement OAuth tokens, they should hang off of API
7
+ # tokens.
8
+
9
+ # For now, we allow exactly one API token for each user.
10
+ validates :user, uniqueness: { scope: :type }
11
+ end
12
+
13
+ end # namespace Tokens
@@ -27,8 +27,9 @@ class Base < ::Credential
27
27
  # Returns the authenticated User instance, or a symbol indicating the reason
28
28
  # why the (potentially valid) token code was rejected.
29
29
  def self.authenticate(code)
30
- credential = self.with_code(code).first
31
- credential ? credential.authenticate : :invalid
30
+ return :invalid unless token = self.with_code(code).first
31
+ return :invalid unless token.kind_of?(self)
32
+ token.authenticate
32
33
  end
33
34
 
34
35
  # Scope that uses a secret code.
@@ -2,16 +2,16 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: authpwn_rails 0.17.2 ruby lib
5
+ # stub: authpwn_rails 0.18.0 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "authpwn_rails"
9
- s.version = "0.17.2"
9
+ s.version = "0.18.0"
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
12
12
  s.require_paths = ["lib"]
13
13
  s.authors = ["Victor Costan"]
14
- s.date = "2015-01-11"
14
+ s.date = "2015-06-17"
15
15
  s.description = "Works with Facebook."
16
16
  s.email = "victor@costan.us"
17
17
  s.extra_rdoc_files = [
@@ -35,6 +35,7 @@ Gem::Specification.new do |s|
35
35
  "app/models/credentials/email.rb",
36
36
  "app/models/credentials/omni_auth_uid.rb",
37
37
  "app/models/credentials/password.rb",
38
+ "app/models/tokens/api.rb",
38
39
  "app/models/tokens/base.rb",
39
40
  "app/models/tokens/email_verification.rb",
40
41
  "app/models/tokens/one_time.rb",
@@ -72,16 +73,19 @@ Gem::Specification.new do |s|
72
73
  "lib/authpwn_rails/generators/templates/user.rb",
73
74
  "lib/authpwn_rails/generators/templates/users.yml",
74
75
  "lib/authpwn_rails/http_basic.rb",
76
+ "lib/authpwn_rails/http_token.rb",
75
77
  "lib/authpwn_rails/routes.rb",
76
78
  "lib/authpwn_rails/session.rb",
77
79
  "lib/authpwn_rails/session_controller.rb",
78
80
  "lib/authpwn_rails/session_mailer.rb",
79
81
  "lib/authpwn_rails/session_model.rb",
80
82
  "lib/authpwn_rails/test_extensions.rb",
83
+ "lib/authpwn_rails/user_extensions/api_token_field.rb",
81
84
  "lib/authpwn_rails/user_extensions/email_field.rb",
82
85
  "lib/authpwn_rails/user_extensions/password_field.rb",
83
86
  "lib/authpwn_rails/user_model.rb",
84
87
  "test/cookie_controller_test.rb",
88
+ "test/credentials/api_token_test.rb",
85
89
  "test/credentials/email_credential_test.rb",
86
90
  "test/credentials/email_verification_token_test.rb",
87
91
  "test/credentials/omni_auth_uid_credential_test.rb",
@@ -108,6 +112,7 @@ Gem::Specification.new do |s|
108
112
  "test/helpers/test_order.rb",
109
113
  "test/helpers/view_helpers.rb",
110
114
  "test/http_basic_controller_test.rb",
115
+ "test/http_token_controller_test.rb",
111
116
  "test/initializer_test.rb",
112
117
  "test/routes_test.rb",
113
118
  "test/session_controller_api_test.rb",
@@ -117,54 +122,55 @@ Gem::Specification.new do |s|
117
122
  "test/session_test.rb",
118
123
  "test/test_extensions_test.rb",
119
124
  "test/test_helper.rb",
125
+ "test/user_extensions/api_token_field_test.rb",
120
126
  "test/user_extensions/email_field_test.rb",
121
127
  "test/user_extensions/password_field_test.rb",
122
128
  "test/user_test.rb"
123
129
  ]
124
130
  s.homepage = "http://github.com/pwnall/authpwn_rails"
125
131
  s.licenses = ["MIT"]
126
- s.rubygems_version = "2.2.2"
132
+ s.rubygems_version = "2.4.6"
127
133
  s.summary = "User authentication for Rails 4 applications."
128
134
 
129
135
  if s.respond_to? :specification_version then
130
136
  s.specification_version = 4
131
137
 
132
138
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
133
- s.add_runtime_dependency(%q<rails>, [">= 4.0.9"])
134
- s.add_development_dependency(%q<bundler>, [">= 1.7.3"])
139
+ s.add_runtime_dependency(%q<rails>, [">= 4.0.13"])
140
+ s.add_development_dependency(%q<bundler>, [">= 1.6.6"])
135
141
  s.add_development_dependency(%q<mocha>, [">= 0.14.0"])
136
142
  s.add_development_dependency(%q<jeweler>, [">= 2.0.1"])
137
143
  s.add_development_dependency(%q<simplecov>, [">= 0"])
138
- s.add_development_dependency(%q<mysql2>, [">= 0.3.16"])
144
+ s.add_development_dependency(%q<mysql2>, [">= 0.3.18"])
139
145
  s.add_development_dependency(%q<omniauth>, [">= 1.2.2"])
140
- s.add_development_dependency(%q<pg>, [">= 0.17.1"])
146
+ s.add_development_dependency(%q<pg>, [">= 0.18.2"])
141
147
  s.add_development_dependency(%q<sqlite3>, [">= 1.3.9"])
142
148
  s.add_development_dependency(%q<rubysl>, [">= 0"])
143
149
  s.add_development_dependency(%q<rubysl-bundler>, [">= 0"])
144
150
  s.add_development_dependency(%q<rubysl-rake>, [">= 0"])
145
151
  else
146
- s.add_dependency(%q<rails>, [">= 4.0.9"])
147
- s.add_dependency(%q<bundler>, [">= 1.7.3"])
152
+ s.add_dependency(%q<rails>, [">= 4.0.13"])
153
+ s.add_dependency(%q<bundler>, [">= 1.6.6"])
148
154
  s.add_dependency(%q<mocha>, [">= 0.14.0"])
149
155
  s.add_dependency(%q<jeweler>, [">= 2.0.1"])
150
156
  s.add_dependency(%q<simplecov>, [">= 0"])
151
- s.add_dependency(%q<mysql2>, [">= 0.3.16"])
157
+ s.add_dependency(%q<mysql2>, [">= 0.3.18"])
152
158
  s.add_dependency(%q<omniauth>, [">= 1.2.2"])
153
- s.add_dependency(%q<pg>, [">= 0.17.1"])
159
+ s.add_dependency(%q<pg>, [">= 0.18.2"])
154
160
  s.add_dependency(%q<sqlite3>, [">= 1.3.9"])
155
161
  s.add_dependency(%q<rubysl>, [">= 0"])
156
162
  s.add_dependency(%q<rubysl-bundler>, [">= 0"])
157
163
  s.add_dependency(%q<rubysl-rake>, [">= 0"])
158
164
  end
159
165
  else
160
- s.add_dependency(%q<rails>, [">= 4.0.9"])
161
- s.add_dependency(%q<bundler>, [">= 1.7.3"])
166
+ s.add_dependency(%q<rails>, [">= 4.0.13"])
167
+ s.add_dependency(%q<bundler>, [">= 1.6.6"])
162
168
  s.add_dependency(%q<mocha>, [">= 0.14.0"])
163
169
  s.add_dependency(%q<jeweler>, [">= 2.0.1"])
164
170
  s.add_dependency(%q<simplecov>, [">= 0"])
165
- s.add_dependency(%q<mysql2>, [">= 0.3.16"])
171
+ s.add_dependency(%q<mysql2>, [">= 0.3.18"])
166
172
  s.add_dependency(%q<omniauth>, [">= 1.2.2"])
167
- s.add_dependency(%q<pg>, [">= 0.17.1"])
173
+ s.add_dependency(%q<pg>, [">= 0.18.2"])
168
174
  s.add_dependency(%q<sqlite3>, [">= 1.3.9"])
169
175
  s.add_dependency(%q<rubysl>, [">= 0"])
170
176
  s.add_dependency(%q<rubysl-bundler>, [">= 0"])
@@ -69,3 +69,7 @@ jane_omniauth_developer:
69
69
  name: developer,jane@gmail.com
70
70
  key: "1"
71
71
 
72
+ john_api_token:
73
+ user: john
74
+ type: Tokens::Api
75
+ name: WViSwbTAEMe0dzB_IHXyNG3UJ4VgDW3_6nKM_FLrc6w
@@ -6,6 +6,8 @@ class User < ActiveRecord::Base
6
6
  # include Authpwn::UserExtensions::EmailField
7
7
  # Virtual password attribute, with confirmation validation.
8
8
  # include Authpwn::UserExtensions::PasswordField
9
+ # Virtual API token attribute.
10
+ # include Authpwn::UserExtensions::ApiTokenField
9
11
 
10
12
  # Change this to customize user lookup in the e-mail/password signin process.
11
13
  #
@@ -5,8 +5,8 @@ class ActionController::Base
5
5
  # Keeps track of the currently authenticated user via the session.
6
6
  #
7
7
  # Assumes the existence of a User model. A bare ActiveModel model will do the
8
- # trick. Model instances must implement id, and the model class must implement
9
- # find_by_id.
8
+ # trick. Model instances must implement id, and the model class must
9
+ # implement find_by_id.
10
10
  def self.authenticates_using_http_basic(options = {})
11
11
  include Authpwn::HttpBasicControllerInstanceMethods
12
12
  before_filter :authenticate_using_http_basic, options
@@ -0,0 +1,67 @@
1
+ require 'action_controller'
2
+
3
+ # :nodoc: adds authenticates_using_http_token
4
+ class ActionController::Base
5
+ # Keeps track of the currently authenticated user via the session.
6
+ #
7
+ # Assumes the existence of a User model. A bare ActiveModel model will do the
8
+ # trick. Model instances must implement id, and the model class must implement
9
+ # find_by_id.
10
+ def self.authenticates_using_http_token(options = {})
11
+ include Authpwn::HttpTokenControllerInstanceMethods
12
+ before_action :authenticate_using_http_token, options
13
+ end
14
+ end
15
+
16
+ # :nodoc: namespace
17
+ module Authpwn
18
+
19
+ # Included in controllers that call authenticates_using_http_token.
20
+ module HttpTokenControllerInstanceMethods
21
+ include Authpwn::CurrentUser
22
+
23
+ # The before_action that implements authenticates_using_http_token.
24
+ #
25
+ # If your ApplicationController contains authenticates_using_http_token, you
26
+ # can opt out in individual controllers using skip_before_action.
27
+ #
28
+ # skip_before_action :authenticate_using_http_filter
29
+ def authenticate_using_http_token
30
+ return if current_user
31
+ authenticate_with_http_token do |token_code, options|
32
+ auth = Tokens::Api.authenticate token_code
33
+
34
+ # NOTE: Setting the instance variable directly bypasses the session
35
+ # setup. Tokens are generally used in API contexts, so the session
36
+ # cookie would get ignored anyway.
37
+ @current_user = auth unless auth.kind_of? Symbol
38
+ end
39
+ end
40
+ private :authenticate_using_http_token
41
+
42
+ # Inform the user that their request is forbidden.
43
+ #
44
+ # If a user is logged on, this renders the session/forbidden view with a HTTP
45
+ # 403 code.
46
+ #
47
+ # If no user is logged in, a HTTP 403 code is returned, together with an
48
+ # HTTP Authentication header causing the user-agent (browser) to initiate
49
+ # http token authentication.
50
+ def bounce_to_http_token()
51
+ unless current_user
52
+ request_http_token_authentication
53
+ return
54
+ end
55
+
56
+ respond_to do |format|
57
+ format.html do
58
+ render 'session/forbidden', status: :forbidden
59
+ end
60
+ format.json do
61
+ render json: { error: "You're not allowed to access that" }
62
+ end
63
+ end
64
+ end
65
+ end # module Authpwn::HttpTokenControllerInstanceMethods
66
+
67
+ end # namespace Authpwn
@@ -127,6 +127,8 @@ module SessionController
127
127
 
128
128
  # GET /session/token/token-code
129
129
  def token
130
+ # NOTE: This repeats the code in Token::Base.authenticate, because we need
131
+ # the token.
130
132
  if token = Tokens::Base.with_code(params[:code]).first
131
133
  auth = token.authenticate
132
134
  else
@@ -59,7 +59,7 @@ module ControllerTestExtensions
59
59
  Tokens::Base.with_code(suid).first!.user
60
60
  end
61
61
 
62
- # Sets the HTTP Authentication header.
62
+ # Sets the HTTP Authentication header for Basic authentication.
63
63
  #
64
64
  # If no password is provided, the user's password is set to "password". This
65
65
  # change is normally reverted at the end of the test, as long as
@@ -95,6 +95,34 @@ module ControllerTestExtensions
95
95
  "Basic #{::Base64.strict_encode64("#{email}:#{password}")}"
96
96
  self
97
97
  end
98
+
99
+ # Sets the HTTP Authentication header for Token authentication.
100
+ #
101
+ # If the user doesn't have an API token, one is generated automatically. This
102
+ # change is normally reverted at the end of the test, as long as
103
+ # transactional fixtures are not disabled.
104
+ #
105
+ # If a token code is provided, the user's API token's code is forced to the
106
+ # given value.
107
+ #
108
+ # Tests that need to disable transactional fixures should delete the user's
109
+ # API token after completion.
110
+ def set_http_token_user(user, token_code = nil)
111
+ if user.nil?
112
+ request.env.delete 'HTTP_AUTHORIZATION'
113
+ return self
114
+ end
115
+
116
+ credential = Tokens::Api.where(user_id: user.id).first
117
+ credential ||= Tokens::Api.random_for(user)
118
+ unless token_code.nil?
119
+ credential.code = token_code
120
+ credential.save!
121
+ end
122
+
123
+ request.env['HTTP_AUTHORIZATION'] = "Token #{credential.code}"
124
+ self
125
+ end
98
126
  end # module Authpwn::ControllerTestExtensions
99
127
 
100
128
  end # namespace Authpwn
@@ -0,0 +1,30 @@
1
+ require 'active_model'
2
+ require 'active_support'
3
+
4
+ # :nodoc: namespace
5
+ module Authpwn
6
+
7
+ # :nodoc: namespace
8
+ module UserExtensions
9
+
10
+ # Augments the User model with a password virtual attribute.
11
+ module ApiTokenField
12
+ extend ActiveSupport::Concern
13
+
14
+ # Credentials::Password instance associated with this user.
15
+ def api_token_credential
16
+ credentials.find { |c| c.instance_of?(Tokens::Api) }
17
+ end
18
+
19
+ # The code from the user's API token credential.
20
+ #
21
+ # Creates an API token if the user doesn't already have one.
22
+ def api_token
23
+ credential = self.api_token_credential || Tokens::Api.random_for(self)
24
+ credential.code
25
+ end
26
+ end # module Authpwn::UserExtensions::ApiTokenField
27
+
28
+ end # module Authpwn::UserExtensions
29
+
30
+ end # module Authpwn
@@ -16,14 +16,6 @@ module PasswordField
16
16
  confirmation: { allow_nil: true }
17
17
  end
18
18
 
19
- module ClassMethods
20
- # The user who has a certain e-mail, or nil if the e-mail is unclaimed.
21
- def with_email(email)
22
- credential = Credentials::Email.where(name: email).includes(:user).first
23
- credential && credential.user
24
- end
25
- end
26
-
27
19
  # Credentials::Password instance associated with this user.
28
20
  def password_credential
29
21
  credentials.find { |c| c.instance_of?(Credentials::Password) }
data/lib/authpwn_rails.rb CHANGED
@@ -14,12 +14,14 @@ module Authpwn
14
14
 
15
15
  # Contains extensions to the User model.
16
16
  module UserExtensions
17
+ autoload :ApiTokenField, 'authpwn_rails/user_extensions/api_token_field.rb'
17
18
  autoload :EmailField, 'authpwn_rails/user_extensions/email_field.rb'
18
19
  autoload :PasswordField, 'authpwn_rails/user_extensions/password_field.rb'
19
20
  end
20
21
  end
21
22
 
22
23
  require 'authpwn_rails/http_basic.rb'
24
+ require 'authpwn_rails/http_token.rb'
23
25
  require 'authpwn_rails/routes.rb'
24
26
  require 'authpwn_rails/session.rb'
25
27
  require 'authpwn_rails/test_extensions.rb'
@@ -27,7 +29,7 @@ require 'authpwn_rails/test_extensions.rb'
27
29
  if defined?(Rails)
28
30
  require 'authpwn_rails/engine.rb'
29
31
 
30
- # HACK(costan): this works around a known Rails bug
32
+ # HACK(pwnall): this works around a known Rails bug
31
33
  # https://rails.lighthouseapp.com/projects/8994/tickets/1905-apphelpers-within-plugin-not-being-mixed-in
32
34
  require File.expand_path('../../app/helpers/session_helper.rb', __FILE__)
33
35
  ActionController::Base.helper SessionHelper
@@ -0,0 +1,65 @@
1
+ require File.expand_path('../../test_helper', __FILE__)
2
+
3
+ class ApiTokenTest < ActiveSupport::TestCase
4
+ def setup
5
+ @credential = Tokens::Api.new
6
+ @credential.code = 'AyCMIixa5C7BBqU-XFI7l7IaUFJ4zQZPmcK6oNb3FLo'
7
+ @credential.user = users(:bill)
8
+ end
9
+
10
+ test 'setup' do
11
+ assert @credential.valid?
12
+ end
13
+
14
+ test 'code required' do
15
+ @credential.code = nil
16
+ assert !@credential.valid?
17
+ end
18
+
19
+ test 'code uniqueness' do
20
+ @credential.code = credentials(:jane_token).code
21
+ assert !@credential.valid?
22
+ end
23
+
24
+ test 'user required' do
25
+ @credential.user = nil
26
+ assert !@credential.valid?
27
+ end
28
+
29
+ test 'user uniqueness' do
30
+ @credential.user = credentials(:john_api_token).user
31
+ assert !@credential.valid?
32
+ end
33
+
34
+ test 'spend does nothing' do
35
+ credential = credentials(:john_api_token)
36
+ assert_equal Tokens::Api, credential.class, 'bad setup'
37
+
38
+ assert_no_difference 'Credential.count' do
39
+ credential.spend
40
+ end
41
+ end
42
+
43
+ test 'expired?' do
44
+ @credential.updated_at = Time.now - 1.year
45
+ assert_equal false, @credential.expired?
46
+ end
47
+
48
+ test 'spend does not update old token' do
49
+ old_updated_at = @credential.updated_at = Time.now - 1.year
50
+ @credential.spend
51
+ assert_equal old_updated_at, @credential.updated_at
52
+ end
53
+
54
+ test 'random_for' do
55
+ user = users(:jane)
56
+ credential = nil
57
+ assert_difference 'Credential.count', 1 do
58
+ credential = Tokens::Api.random_for user
59
+ end
60
+ saved_credential = Tokens::Base.with_code(credential.code).first
61
+ assert saved_credential, 'token was not saved'
62
+ assert_equal saved_credential, credential, 'wrong token returned'
63
+ assert_equal user, saved_credential.user
64
+ end
65
+ end
@@ -21,7 +21,7 @@ class OneTimeTokenCredentialTest < ActiveSupport::TestCase
21
21
  assert !@credential.valid?
22
22
  end
23
23
 
24
- test 'user presence' do
24
+ test 'user required' do
25
25
  @credential.user = nil
26
26
  assert !@credential.valid?
27
27
  end
@@ -21,7 +21,7 @@ class TokenCredentialTest < ActiveSupport::TestCase
21
21
  assert !@credential.valid?
22
22
  end
23
23
 
24
- test 'user presence' do
24
+ test 'user required' do
25
25
  @credential.user = nil
26
26
  assert !@credential.valid?
27
27
  end
@@ -46,7 +46,7 @@ class TokenCredentialTest < ActiveSupport::TestCase
46
46
 
47
47
  test 'with_code' do
48
48
  john = 'YZ-Fo8HX6_NyU6lVZXYi6cMDLV5eAgt35UTF5l8bD6A'
49
- john2 = 'bDSU4tzfjuob79e3R0ykLcOGTBBYvuBWWJ9V06tQrCE'
49
+ john_email = 'bDSU4tzfjuob79e3R0ykLcOGTBBYvuBWWJ9V06tQrCE'
50
50
  jane = '6TXe1vv7BgOw0BkJ1hzUKO6G08fLk4sVfJ3wPDZHS-c'
51
51
  bogus = 'AyCMIixa5C7BBqU-XFI7l7IaUFJ4zQZPmcK6oNb3FLo'
52
52
  assert_equal credentials(:john_token),
@@ -54,7 +54,7 @@ class TokenCredentialTest < ActiveSupport::TestCase
54
54
  assert_equal credentials(:jane_token),
55
55
  Tokens::Base.with_code(jane).first!
56
56
  assert_equal credentials(:john_email_token),
57
- Tokens::Base.with_code(john2).first
57
+ Tokens::Base.with_code(john_email).first
58
58
  assert_nil Tokens::Base.with_code(bogus).first
59
59
  assert_raise ActiveRecord::RecordNotFound do
60
60
  Tokens::Base.with_code('john@gmail.com').first!
@@ -77,13 +77,27 @@ class TokenCredentialTest < ActiveSupport::TestCase
77
77
 
78
78
  test 'class authenticate' do
79
79
  john = 'YZ-Fo8HX6_NyU6lVZXYi6cMDLV5eAgt35UTF5l8bD6A'
80
+ john_email = 'bDSU4tzfjuob79e3R0ykLcOGTBBYvuBWWJ9V06tQrCE'
80
81
  jane = '6TXe1vv7BgOw0BkJ1hzUKO6G08fLk4sVfJ3wPDZHS-c'
81
82
  bogus = 'AyCMIixa5C7BBqU-XFI7l7IaUFJ4zQZPmcK6oNb3FLo'
83
+
82
84
  assert_equal users(:john), Tokens::Base.authenticate(john)
85
+ assert_equal users(:john), Tokens::Base.authenticate(john_email)
83
86
  assert_equal users(:jane), Tokens::Base.authenticate(jane)
84
87
  assert_equal :invalid, Tokens::Base.authenticate(bogus)
85
88
  end
86
89
 
90
+ test 'class authenticate with non-base class' do
91
+ john = 'YZ-Fo8HX6_NyU6lVZXYi6cMDLV5eAgt35UTF5l8bD6A'
92
+ john_email = 'bDSU4tzfjuob79e3R0ykLcOGTBBYvuBWWJ9V06tQrCE'
93
+ bogus = 'AyCMIixa5C7BBqU-XFI7l7IaUFJ4zQZPmcK6oNb3FLo'
94
+
95
+ assert_equal :invalid, Tokens::EmailVerification.authenticate(john)
96
+ assert_equal users(:john),
97
+ Tokens::EmailVerification.authenticate(john_email)
98
+ assert_equal :invalid, Tokens::EmailVerification.authenticate(bogus)
99
+ end
100
+
87
101
  test 'class authenticate on expired tokens' do
88
102
  john = 'YZ-Fo8HX6_NyU6lVZXYi6cMDLV5eAgt35UTF5l8bD6A'
89
103
  jane = '6TXe1vv7BgOw0BkJ1hzUKO6G08fLk4sVfJ3wPDZHS-c'
@@ -11,6 +11,9 @@ def setup_authpwn_routes
11
11
  resource :http_basic, controller: 'http_basic' do
12
12
  collection { get :bouncer }
13
13
  end
14
+ resource :http_token, controller: 'http_token' do
15
+ collection { get :bouncer }
16
+ end
14
17
 
15
18
  authpwn_session controller: 'bare_session', method_names: 'bare_session',
16
19
  omniauth_path_prefix: '/bare_auth'
@@ -83,8 +83,8 @@ class HttpBasicControllerTest < ActionController::TestCase
83
83
  assert_equal "User: #{jane_id}", response.body
84
84
  end
85
85
 
86
- test "invalid user_pid in session" do
87
- get :show, {}, current_user_pid: 'random@user.com'
86
+ test "invalid authpwn_suid in session" do
87
+ get :show, {}, authpwn_suid: 'random@user.com'
88
88
  assert_response :success
89
89
  assert_nil assigns(:current_user)
90
90
  end
@@ -0,0 +1,128 @@
1
+ require File.expand_path('../test_helper', __FILE__)
2
+
3
+ # Mock controller used for testing session handling.
4
+ class HttpTokenController < ApplicationController
5
+ authenticates_using_http_token
6
+
7
+ def show
8
+ if current_user
9
+ render text: "User: #{current_user.id}"
10
+ else
11
+ render text: "No user"
12
+ end
13
+ end
14
+
15
+ def bouncer
16
+ bounce_to_http_token
17
+ end
18
+ end
19
+
20
+ class HttpTokenControllerTest < ActionController::TestCase
21
+ setup do
22
+ @user = users(:john)
23
+ end
24
+
25
+ test "no user_id in session cookie or header" do
26
+ get :show
27
+ assert_response :success
28
+ assert_nil assigns(:current_user)
29
+ assert_equal 'No user', response.body
30
+ end
31
+
32
+ test "valid user_id in session cookie" do
33
+ set_session_current_user @user
34
+ get :show
35
+ assert_response :success
36
+ assert_nil assigns(:current_user)
37
+ assert_equal 'No user', response.body
38
+ end
39
+
40
+ test "valid user credentials in header" do
41
+ set_http_token_user @user
42
+ get :show
43
+ assert_equal @user, assigns(:current_user)
44
+ assert_equal nil, session_current_user,
45
+ 'Token authentication should not update the session'
46
+
47
+ john_id = ActiveRecord::FixtureSet.identify :john
48
+ assert_equal "User: #{john_id}", response.body
49
+ end
50
+
51
+ test "invalid token in header" do
52
+ set_http_token_user @user
53
+ Tokens::Api.where(user_id: @user.id).destroy_all
54
+ get :show
55
+ assert_nil assigns(:current_user)
56
+ assert_equal 'No user', response.body
57
+ end
58
+
59
+ test "uses Tokens::Api.authenticate" do
60
+ Tokens::Api.expects(:authenticate).at_least_once.with('ap1-c0d3').
61
+ returns @user
62
+ set_http_token_user @user, 'ap1-c0d3'
63
+ get :show
64
+ assert_equal @user, assigns(:current_user)
65
+ assert_equal nil, session_current_user,
66
+ 'Token authentication should not update the session'
67
+
68
+ john_id = ActiveRecord::FixtureSet.identify :john
69
+ assert_equal "User: #{john_id}", response.body
70
+ end
71
+
72
+ test "reset user credentials in header" do
73
+ set_http_token_user @user
74
+ set_http_token_user nil
75
+ get :show
76
+ assert_nil assigns(:current_user)
77
+ assert_equal 'No user', response.body
78
+ end
79
+
80
+ test "newly created API token in header" do
81
+ user = users(:jane)
82
+ set_http_token_user user
83
+ get :show
84
+ assert_equal user, assigns(:current_user)
85
+ assert_equal nil, session_current_user,
86
+ 'Token authentication should not update the session'
87
+
88
+ jane_id = ActiveRecord::FixtureSet.identify :jane
89
+ assert_equal "User: #{jane_id}", response.body
90
+ end
91
+
92
+ test "invalid authpwn_suid in session" do
93
+ get :show, {}, authpwn_suid: 'random@user.com'
94
+ assert_response :success
95
+ assert_nil assigns(:current_user)
96
+ end
97
+
98
+ test "valid user bounced to http authentication" do
99
+ set_http_token_user @user
100
+ get :bouncer
101
+ assert_response :forbidden
102
+ assert_template 'session/forbidden'
103
+ assert_select 'a[href="/session"][data-method="delete"]', 'sign out'
104
+ end
105
+
106
+ test "valid user bounced in json" do
107
+ set_http_token_user @user
108
+ get :bouncer, format: 'json'
109
+ assert_response :ok
110
+ data = ActiveSupport::JSON.decode response.body
111
+ assert_match(/not allowed/i, data['error'])
112
+ end
113
+
114
+ test "no user_id bounced to http authentication" do
115
+ get :bouncer
116
+ assert_response :unauthorized
117
+ assert_equal 'Token realm="Application"',
118
+ response.headers['WWW-Authenticate']
119
+ end
120
+
121
+ test "no user_id bounced in json" do
122
+ get :bouncer, format: 'json'
123
+ assert_response :unauthorized
124
+ assert_equal 'Token realm="Application"',
125
+ response.headers['WWW-Authenticate']
126
+ end
127
+ end
128
+
@@ -1,6 +1,5 @@
1
1
  require File.expand_path('../test_helper', __FILE__)
2
2
 
3
- require 'authpwn_rails/generators/templates/session_controller.rb'
4
-
5
3
  # Run the tests in the generator, to make sure they pass.
6
4
  require 'authpwn_rails/generators/templates/session_controller_test.rb'
5
+
@@ -1,6 +1,4 @@
1
1
  require File.expand_path('../test_helper', __FILE__)
2
2
 
3
- require 'authpwn_rails/generators/templates/session_mailer.rb'
4
-
5
3
  # Run the tests in the generator, to make sure they pass.
6
4
  require 'authpwn_rails/generators/templates/session_mailer_test.rb'
data/test/test_helper.rb CHANGED
@@ -29,5 +29,9 @@ require 'helpers/test_order.rb'
29
29
  # Simulate Rails' initializer loading.
30
30
  require 'authpwn_rails/generators/templates/initializer.rb'
31
31
 
32
+ # Simulate Rails' autoloading.
33
+ require 'authpwn_rails/generators/templates/session_mailer.rb'
34
+ require 'authpwn_rails/generators/templates/session_controller.rb'
35
+
32
36
  # Rails stubbing is only needed by the initializer, and breaks tests.
33
37
  require 'helpers/rails_undo.rb'
@@ -0,0 +1,34 @@
1
+ require File.expand_path('../../test_helper', __FILE__)
2
+
3
+ class UserWithApiToken < User
4
+ include Authpwn::UserExtensions::ApiTokenField
5
+ end
6
+
7
+ class ApiTokenFieldTest < ActiveSupport::TestCase
8
+ def setup
9
+ @john = UserWithApiToken.find_by_id users(:john).id
10
+ @jane = UserWithApiToken.find_by_id users(:jane).id
11
+ @bill = UserWithApiToken.find_by_id users(:bill).id
12
+ end
13
+
14
+ test 'api_token_credential' do
15
+ assert_equal credentials(:john_api_token), @john.api_token_credential
16
+ assert_equal nil, @jane.api_token_credential
17
+ assert_equal nil, @bill.api_token_credential
18
+ end
19
+
20
+ test 'api_token with existing credential' do
21
+ assert_equal credentials(:john_api_token).code, @john.api_token
22
+ assert_equal nil, @jane.api_token_credential
23
+ assert_equal nil, @bill.api_token_credential
24
+ end
25
+
26
+ test 'api_token without existing credential' do
27
+ assert_equal nil, @jane.api_token_credential
28
+ token_code = @jane.api_token
29
+ assert_not_equal nil, @jane.api_token_credential
30
+ assert_equal @jane.api_token_credential.code, token_code
31
+ assert_not_equal credentials(:john_api_token).code, token_code
32
+ assert_equal nil, @bill.api_token_credential
33
+ end
34
+ end
@@ -8,9 +8,9 @@ class EmailFieldTest < ActiveSupport::TestCase
8
8
  def setup
9
9
  @user = UserWithEmail.new email: 'blah@gmail.com'
10
10
 
11
- @john = UserWithEmail.find_by_id(users(:john).id)
12
- @jane = UserWithEmail.find_by_id(users(:jane).id)
13
- @bill = UserWithEmail.find_by_id(users(:bill).id)
11
+ @john = UserWithEmail.find_by_id users(:john).id
12
+ @jane = UserWithEmail.find_by_id users(:jane).id
13
+ @bill = UserWithEmail.find_by_id users(:bill).id
14
14
  end
15
15
 
16
16
  test 'setup' do
@@ -9,9 +9,9 @@ class PasswordFieldTest < ActiveSupport::TestCase
9
9
  @user = UserWithPassword.new password: 'awesome',
10
10
  password_confirmation: 'awesome'
11
11
 
12
- @john = UserWithPassword.find_by_id(users(:john).id)
13
- @jane = UserWithPassword.find_by_id(users(:jane).id)
14
- @bill = UserWithPassword.find_by_id(users(:bill).id)
12
+ @john = UserWithPassword.find_by_id users(:john).id
13
+ @jane = UserWithPassword.find_by_id users(:jane).id
14
+ @bill = UserWithPassword.find_by_id users(:bill).id
15
15
  end
16
16
 
17
17
  test 'setup' do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: authpwn_rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.17.2
4
+ version: 0.18.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Victor Costan
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-01-11 00:00:00.000000000 Z
11
+ date: 2015-06-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -16,28 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 4.0.9
19
+ version: 4.0.13
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 4.0.9
26
+ version: 4.0.13
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 1.7.3
33
+ version: 1.6.6
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: 1.7.3
40
+ version: 1.6.6
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: mocha
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -86,14 +86,14 @@ dependencies:
86
86
  requirements:
87
87
  - - ">="
88
88
  - !ruby/object:Gem::Version
89
- version: 0.3.16
89
+ version: 0.3.18
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - ">="
95
95
  - !ruby/object:Gem::Version
96
- version: 0.3.16
96
+ version: 0.3.18
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: omniauth
99
99
  requirement: !ruby/object:Gem::Requirement
@@ -114,14 +114,14 @@ dependencies:
114
114
  requirements:
115
115
  - - ">="
116
116
  - !ruby/object:Gem::Version
117
- version: 0.17.1
117
+ version: 0.18.2
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
122
  - - ">="
123
123
  - !ruby/object:Gem::Version
124
- version: 0.17.1
124
+ version: 0.18.2
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: sqlite3
127
127
  requirement: !ruby/object:Gem::Requirement
@@ -202,6 +202,7 @@ files:
202
202
  - app/models/credentials/email.rb
203
203
  - app/models/credentials/omni_auth_uid.rb
204
204
  - app/models/credentials/password.rb
205
+ - app/models/tokens/api.rb
205
206
  - app/models/tokens/base.rb
206
207
  - app/models/tokens/email_verification.rb
207
208
  - app/models/tokens/one_time.rb
@@ -239,16 +240,19 @@ files:
239
240
  - lib/authpwn_rails/generators/templates/user.rb
240
241
  - lib/authpwn_rails/generators/templates/users.yml
241
242
  - lib/authpwn_rails/http_basic.rb
243
+ - lib/authpwn_rails/http_token.rb
242
244
  - lib/authpwn_rails/routes.rb
243
245
  - lib/authpwn_rails/session.rb
244
246
  - lib/authpwn_rails/session_controller.rb
245
247
  - lib/authpwn_rails/session_mailer.rb
246
248
  - lib/authpwn_rails/session_model.rb
247
249
  - lib/authpwn_rails/test_extensions.rb
250
+ - lib/authpwn_rails/user_extensions/api_token_field.rb
248
251
  - lib/authpwn_rails/user_extensions/email_field.rb
249
252
  - lib/authpwn_rails/user_extensions/password_field.rb
250
253
  - lib/authpwn_rails/user_model.rb
251
254
  - test/cookie_controller_test.rb
255
+ - test/credentials/api_token_test.rb
252
256
  - test/credentials/email_credential_test.rb
253
257
  - test/credentials/email_verification_token_test.rb
254
258
  - test/credentials/omni_auth_uid_credential_test.rb
@@ -275,6 +279,7 @@ files:
275
279
  - test/helpers/test_order.rb
276
280
  - test/helpers/view_helpers.rb
277
281
  - test/http_basic_controller_test.rb
282
+ - test/http_token_controller_test.rb
278
283
  - test/initializer_test.rb
279
284
  - test/routes_test.rb
280
285
  - test/session_controller_api_test.rb
@@ -284,6 +289,7 @@ files:
284
289
  - test/session_test.rb
285
290
  - test/test_extensions_test.rb
286
291
  - test/test_helper.rb
292
+ - test/user_extensions/api_token_field_test.rb
287
293
  - test/user_extensions/email_field_test.rb
288
294
  - test/user_extensions/password_field_test.rb
289
295
  - test/user_test.rb
@@ -307,7 +313,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
307
313
  version: '0'
308
314
  requirements: []
309
315
  rubyforge_project:
310
- rubygems_version: 2.2.2
316
+ rubygems_version: 2.4.6
311
317
  signing_key:
312
318
  specification_version: 4
313
319
  summary: User authentication for Rails 4 applications.