rack-prx_auth 0.2.1 → 0.3.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
  SHA256:
3
- metadata.gz: 0e57bda2725fe363d27b499e084653515fba6fdd2dd90af5ea42edce47fa2918
4
- data.tar.gz: 594cf56ce3d05aa865400dc092a166c4ef1cefb27018c1012116430018045373
3
+ metadata.gz: b87251008aee29e6d86aae5fbec89cbd77b08479a57bfe69a78b7ca8b765d75b
4
+ data.tar.gz: fb463afd9ea824de3c6bb7b0cb1115a5783c422d3c3edaf53583bd670ba72f54
5
5
  SHA512:
6
- metadata.gz: 62c7e985124f8809cd0b8afcece43a0107d5f8027740b319dad1a95c7760ea4ff3913c4e0b337beab1dbb5506a45e5ba6d9fbe41ca871b3cdcf3841a9f777a18
7
- data.tar.gz: 3d5f9d6a398fec46149e1413ad89d8990a9bc16b335f2aed1b3918f4e5ffdaa1545b9ecab89392a795dad48d267d0d464c2393be3a9f0639ac42c5f62a49640c
6
+ metadata.gz: d2688d966852da50ed3d9045b187790b106ddf7996f4964544c50128baeb1fa407871abcf90d094387c5e08e12fd27215145468462e65d9491e1bfb8c4ceec3b
7
+ data.tar.gz: b110467850548ec5f5e0b31951f782d0b303b1fa41c10f58b29cc9930894c22bb1aede5e419c7ec1d52fbd8ae022cf5385de8f2e0c454052dabcc7f667c83098
data/.gitignore CHANGED
@@ -13,3 +13,4 @@
13
13
  *.o
14
14
  *.a
15
15
  mkmf.log
16
+ .ruby-version
data/Gemfile CHANGED
@@ -2,6 +2,3 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in rack-prx_auth.gemspec
4
4
  gemspec
5
-
6
- gem 'guard'
7
- gem 'guard-minitest'
@@ -1,6 +1,8 @@
1
1
  module Rack
2
2
  class PrxAuth
3
3
  class TokenData
4
+ WILDCARD_RESOURCE_NAME = '*'
5
+
4
6
  attr_reader :attributes, :authorized_resources, :scopes
5
7
 
6
8
  def initialize(attrs = {})
@@ -22,13 +24,29 @@ module Rack
22
24
  end
23
25
 
24
26
  def authorized?(resource, scope=nil)
25
- if auth = authorized_resources[resource.to_s]
26
- scope.nil? || (scopes + auth.split(' ')).include?(scope.to_s)
27
+ if resource == WILDCARD_RESOURCE_NAME
28
+ globally_authorized?(scope)
29
+ elsif scope.nil?
30
+ authorized_for_resource?(resource, scope)
31
+ else
32
+ authorized_for_resource?(resource, scope) || globally_authorized?(scope)
27
33
  end
28
34
  end
29
35
 
36
+ def globally_authorized?(scope)
37
+ raise ArgumentError if scope.nil?
38
+
39
+ authorized_for_resource?(WILDCARD_RESOURCE_NAME, scope)
40
+ end
41
+
30
42
  private
31
43
 
44
+ def authorized_for_resource?(resource, scope=nil)
45
+ if auth = authorized_resources[resource.to_s]
46
+ scope.nil? || (scopes + auth.split(' ')).include?(scope.to_s)
47
+ end
48
+ end
49
+
32
50
  def unpack_aur(aur)
33
51
  aur.clone.tap do |result|
34
52
  unless result['$'].nil?
@@ -38,6 +56,9 @@ module Rack
38
56
  end
39
57
  end
40
58
  end
59
+ if result[WILDCARD_RESOURCE_NAME].nil? && result['0']
60
+ result[WILDCARD_RESOURCE_NAME] = result.delete('0')
61
+ end
41
62
  end
42
63
  end
43
64
  end
@@ -1,5 +1,5 @@
1
1
  module Rack
2
2
  class PrxAuth
3
- VERSION = "0.2.1"
3
+ VERSION = "0.3.0"
4
4
  end
5
5
  end
@@ -23,6 +23,8 @@ Gem::Specification.new do |spec|
23
23
  spec.add_development_dependency 'bundler', '~> 2.0'
24
24
  spec.add_development_dependency 'rake', '~> 10.0'
25
25
  spec.add_development_dependency 'coveralls', '~> 0'
26
+ spec.add_development_dependency 'guard'
27
+ spec.add_development_dependency 'guard-minitest'
26
28
 
27
29
  spec.add_dependency 'rack', '>= 1.5.2'
28
30
  spec.add_dependency 'json', '>= 1.8.1'
@@ -3,12 +3,12 @@ require 'test_helper'
3
3
  describe Rack::PrxAuth::TokenData do
4
4
  it 'pulls user_id from sub' do
5
5
  token = Rack::PrxAuth::TokenData.new('sub' => 123)
6
- token.user_id.must_equal 123
6
+ assert token.user_id == 123
7
7
  end
8
8
 
9
9
  it 'pulls authorized_resources from aur' do
10
10
  token = Rack::PrxAuth::TokenData.new('aur' => {'123' => 'admin'})
11
- token.authorized_resources['123'].must_equal 'admin'
11
+ assert token.authorized_resources['123'] == 'admin'
12
12
  end
13
13
 
14
14
  it 'unpacks compressed aur into authorized_resources' do
@@ -18,9 +18,9 @@ describe Rack::PrxAuth::TokenData do
18
18
  'admin' => [456, 789, 1011]
19
19
  }
20
20
  })
21
- token.authorized_resources['$'].must_be_nil
22
- token.authorized_resources['789'].must_equal 'admin'
23
- token.authorized_resources['123'].must_equal 'member'
21
+ assert token.authorized_resources['$'].nil?
22
+ assert token.authorized_resources['789'] == 'admin'
23
+ assert token.authorized_resources['123'] == 'member'
24
24
  end
25
25
 
26
26
  describe '#authorized?' do
@@ -48,5 +48,59 @@ describe Rack::PrxAuth::TokenData do
48
48
  assert !token.authorized?(789)
49
49
  end
50
50
 
51
+ describe 'with wildcard role' do
52
+ let(:aur) { {'*' => 'peek', '123' => 'admin', '456' => 'member' } }
53
+
54
+ it 'applies wildcard tokens to queries with no matching aur' do
55
+ assert token.authorized?(789, :peek)
56
+ end
57
+
58
+ it 'does not authorize unscoped for wildcard resources' do
59
+ assert !token.authorized?(789)
60
+ end
61
+
62
+ it 'allows querying by wildcard resource directly' do
63
+ assert token.authorized?('*', :peek)
64
+ assert !token.authorized?('*', :admin)
65
+ end
66
+
67
+ it 'has a shorthand `gobally_authorized?` to query wildcard' do
68
+ assert token.globally_authorized?(:peek)
69
+ assert !token.globally_authorized?(:admin)
70
+ end
71
+
72
+ it 'treats global authorizations as additive to other explicit ones' do
73
+ assert token.authorized?(123, :peek)
74
+ end
75
+
76
+ it 'refuses to run `globally_authorized?` with no scope' do
77
+ assert_raises ArgumentError do
78
+ token.globally_authorized?
79
+ end
80
+ assert_raises ArgumentError do
81
+ token.authorized?('*')
82
+ end
83
+ end
84
+ end
85
+
86
+ describe 'wildcard fallback handling' do
87
+
88
+ describe 'with no primary wildcard present' do
89
+ let(:aur) { {'0' => 'peek', '123' => 'admin', '456' => 'member' } }
90
+
91
+ it 'applies fallback as a wildcard' do
92
+ assert token.authorized?(789, :peek)
93
+ end
94
+ end
95
+
96
+ describe 'with primary wildcard present' do
97
+ let(:aur) { {'*' => 'cook', '0' => 'peek', '123' => 'admin', '456' => 'member' } }
98
+
99
+ it 'does not apply the fallback as a wildcard' do
100
+ assert token.authorized?(789, :cook)
101
+ assert !token.authorized?(789, :peek)
102
+ end
103
+ end
104
+ end
51
105
  end
52
106
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rack-prx_auth
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eve Asher
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2019-07-01 00:00:00.000000000 Z
12
+ date: 2020-03-30 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -53,6 +53,34 @@ dependencies:
53
53
  - - "~>"
54
54
  - !ruby/object:Gem::Version
55
55
  version: '0'
56
+ - !ruby/object:Gem::Dependency
57
+ name: guard
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: guard-minitest
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
56
84
  - !ruby/object:Gem::Dependency
57
85
  name: rack
58
86
  requirement: !ruby/object:Gem::Requirement
@@ -139,8 +167,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
139
167
  - !ruby/object:Gem::Version
140
168
  version: '0'
141
169
  requirements: []
142
- rubyforge_project:
143
- rubygems_version: 2.7.6.2
170
+ rubygems_version: 3.0.1
144
171
  signing_key:
145
172
  specification_version: 4
146
173
  summary: Rack middleware that verifies and decodes a JWT token and attaches the token's