unimatrix 2.6.1 → 2.7.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: 28d2103549405252207125b6785d714dd5081ef5
4
- data.tar.gz: 3a4abab733166f02af39b1e4032dac579dab249c
3
+ metadata.gz: 9f66b57e1dc33be3b0eb908b38cd7254c909dd6d
4
+ data.tar.gz: e7b5cd35824ca6b133b21763bd6806ccf3dc3c10
5
5
  SHA512:
6
- metadata.gz: 61ed4ba297fed678b5dc5f0289869afcec24e2f3f7d04d3200ded085802c4e21b0ad4679758d76bb98f5973cc3606f9c218fd7f82b6137857c0b14a44c482958
7
- data.tar.gz: 3d0f9d4cdddc93657e539e4f1b53820d7546d664468bd182f7c0fa010757f5a0fe21b2f73aa225b78235e32651b5b790de7c99da6d87abaf83a0bc833f825261
6
+ metadata.gz: 0a846a05eb1da761d8d5881f8843c688f00737b59d2efc7ab35bfc7bf63339e6ec8a5543179b454b4abf8e933be51584c98a6bcf28c64fdf9ae429074681b1cc
7
+ data.tar.gz: 9efc2ba34b1fa8dc1ff8683095ddfe5b15781262953a37a2aa671dfa3d57182c1dea4423e78e2b4c8074e39d0a274ebcac5f389cb8dbc12cedb47001dc7c5e8f
data/VERSION CHANGED
@@ -1 +1 @@
1
- 2.6.1
1
+ 2.7.0
@@ -69,8 +69,10 @@ require 'unimatrix/authorization/parser'
69
69
  require 'unimatrix/authorization/request'
70
70
  require 'unimatrix/authorization/response'
71
71
  require 'unimatrix/authorization/filters/requires_policies' if defined?( Rails )
72
+ require 'unimatrix/authorization/filters/requires_resource_owner' if defined?( Rails )
72
73
  require 'unimatrix/authorization/railtie' if defined?( Rails )
73
74
  require 'unimatrix/authorization/client_credentials_grant'
75
+ require 'unimatrix/authorization/error'
74
76
  require 'unimatrix/authorization/policy'
75
77
  require 'unimatrix/authorization/resource'
76
78
  require 'unimatrix/authorization/resource_owner'
@@ -0,0 +1,8 @@
1
+ module Unimatrix::Authorization
2
+
3
+ class Error < Unimatrix::Resource
4
+ field :error
5
+ field :error_description
6
+ end
7
+
8
+ end
@@ -1,5 +1,5 @@
1
1
  module Unimatrix::Authorization
2
-
2
+
3
3
  class RequiresPolicies
4
4
  def initialize( resource, options = {} )
5
5
  @resource_name = resource
@@ -8,8 +8,8 @@ module Unimatrix::Authorization
8
8
 
9
9
  def before( controller )
10
10
  access_token = controller.params[ 'access_token' ]
11
-
12
- realm_uuid = begin
11
+
12
+ realm_uuid = begin
13
13
  if controller.respond_to?( :realm_uuid )
14
14
  controller.realm_uuid
15
15
  elsif controller.respond_to?( :realm )
@@ -20,11 +20,11 @@ module Unimatrix::Authorization
20
20
  end
21
21
 
22
22
  if access_token.present?
23
- policies = controller.retrieve_policies(
24
- @resource_name,
25
- access_token,
26
- realm_uuid,
27
- @resource_server
23
+ policies = controller.retrieve_policies(
24
+ @resource_name,
25
+ access_token,
26
+ realm_uuid,
27
+ @resource_server
28
28
  )
29
29
 
30
30
  if policies.present? && policies.is_a?( Array ) &&
@@ -50,10 +50,10 @@ module Unimatrix::Authorization
50
50
  )
51
51
  end
52
52
  else
53
- controller.render_error(
53
+ controller.render_error(
54
54
  ::MissingParameterError,
55
55
  "The parameter 'access_token' is required."
56
- )
56
+ )
57
57
  end
58
58
  end
59
59
  end
@@ -78,11 +78,11 @@ module Unimatrix::Authorization
78
78
  def policies
79
79
  @policies ||= begin
80
80
  # Used by Archivist requires_permission filter. TODO: deprecate
81
- retrieve_policies(
82
- @resource_name,
83
- params[ :access_token ],
81
+ retrieve_policies(
82
+ @resource_name,
83
+ params[ :access_token ],
84
84
  realm_uuid,
85
- @resource_server
85
+ @resource_server
86
86
  )
87
87
  end
88
88
  end
@@ -90,11 +90,11 @@ module Unimatrix::Authorization
90
90
  # In Rails app, this is overwritten by #retrieve_policies in railtie.rb
91
91
  def retrieve_policies( resource_name, access_token, realm_uuid, resource_server )
92
92
  if resource_name && access_token
93
- request_policies(
94
- resource_name,
95
- access_token,
96
- realm_uuid,
97
- resource_server
93
+ request_policies(
94
+ resource_name,
95
+ access_token,
96
+ realm_uuid,
97
+ resource_server
98
98
  )
99
99
  end
100
100
  end
@@ -0,0 +1,63 @@
1
+ module Unimatrix::Authorization
2
+
3
+ class RequiresResourceOwner
4
+
5
+ def before( controller )
6
+ access_token = controller.params[ 'access_token' ]
7
+
8
+ if access_token.present?
9
+ resource_owner = controller.retrieve_resource_owner( access_token )
10
+
11
+ if resource_owner.present? && resource_owner.is_a?( Array ) &&
12
+ resource_owner.first.type_name == 'resource_owner'
13
+ controller.resource_owner = resource_owner
14
+ else
15
+ controller.render_error(
16
+ ::ForbiddenError,
17
+ "The requested resource_owner could not be retrieved."
18
+ )
19
+ end
20
+ else
21
+ controller.render_error(
22
+ ::MissingParameterError,
23
+ "The parameter 'access_token' is required."
24
+ )
25
+ end
26
+ end
27
+ end
28
+
29
+ module ClassMethods
30
+ def requires_resource_owner( options = {} )
31
+ before_action(
32
+ RequiresResourceOwner.new,
33
+ options
34
+ )
35
+ end
36
+ end
37
+
38
+ def self.included( controller )
39
+ controller.extend( ClassMethods )
40
+ end
41
+
42
+ def resource_owner=( attributes )
43
+ @resource_owner = attributes
44
+ end
45
+
46
+ def resource_owner
47
+ @resource_owner ||= begin
48
+ retrieve_resource_owner( params[ :access_token ] )
49
+ end
50
+ end
51
+
52
+ # In Rails app, this is overwritten by #retrieve_resource_owner in railtie.rb
53
+ def retrieve_resource_owner( access_token )
54
+ if access_token
55
+ request_resource_owner( access_token )
56
+ end
57
+ end
58
+
59
+ def request_resource_owner( access_token )
60
+ Operation.new( '/resource_owner' ).where( access_token: access_token ).read
61
+ end
62
+
63
+ end
@@ -2,13 +2,14 @@ module Unimatrix::Authorization
2
2
 
3
3
  class Parser
4
4
 
5
- def initialize( content = {} )
5
+ def initialize( content = {}, request_path = "" )
6
6
  @content = content
7
+ @request_path = request_path
7
8
  yield self if block_given?
8
9
  end
9
10
 
10
11
  def name
11
- @content.keys.present? ? @content.keys.first : nil
12
+ @request_path[ 1...@request_path.length ]
12
13
  end
13
14
 
14
15
  def type_name
@@ -20,10 +21,14 @@ module Unimatrix::Authorization
20
21
 
21
22
  unless self.name.blank?
22
23
  if @content[ 'error' ]
23
- result = parse_resource( name, @content )
24
+ result = parse_resource( 'error', @content )
24
25
  else
25
- result = @content[ name ].map do | attributes |
26
- self.parse_resource( name, attributes )
26
+ unless @content[ name ].is_a?( Array )
27
+ result = [ parse_resource( name, @content ) ]
28
+ else
29
+ result = @content[ name ].map do | attributes |
30
+ parse_resource( name, attributes )
31
+ end
27
32
  end
28
33
  end
29
34
  end
@@ -43,7 +48,7 @@ module Unimatrix::Authorization
43
48
  end
44
49
  resource
45
50
  end
46
-
51
+
47
52
  end
48
53
 
49
54
  end
@@ -10,17 +10,26 @@ module Unimatrix::Authorization
10
10
 
11
11
  def retrieve_policies( resource_name, access_token, realm_uuid, resource_server )
12
12
  if resource_name && access_token
13
- key = params.respond_to?( 'to_unsafe_h' ) ?
14
- params.to_unsafe_h.sort.to_s :
15
- params.sort.to_s
16
-
13
+ key = [ resource_name, access_token, realm_uuid, resource_server ].join
14
+
17
15
  Rails.cache.fetch(
18
- Digest::SHA1.hexdigest( key ),
16
+ "keymaker-policies-#{ Digest::SHA1.hexdigest( key ) }",
19
17
  expires_in: 1.minute
20
18
  ) do
21
19
  request_policies( resource_name, access_token, realm_uuid, resource_server )
22
20
  end
23
21
  end
24
22
  end
25
-
23
+
24
+ def retrieve_resource_owner( access_token )
25
+ if access_token
26
+ Rails.cache.fetch(
27
+ "keymaker-resource_owner-#{ Digest::SHA1.hexdigest( access_token ) }",
28
+ expires_in: 1.minute
29
+ ) do
30
+ request_resource_owner( access_token )
31
+ end
32
+ end
33
+ end
34
+
26
35
  end
@@ -19,7 +19,8 @@ module Unimatrix::Authorization
19
19
 
20
20
  begin
21
21
  response = Response.new(
22
- @http.get( compose_request_path( path, parameters ) )
22
+ @http.get( compose_request_path( path, parameters ) ),
23
+ path
23
24
  )
24
25
  rescue Timeout::Error
25
26
  response = nil
@@ -38,7 +39,7 @@ module Unimatrix::Authorization
38
39
  )
39
40
  request.body = body.to_json
40
41
 
41
- response = Response.new( @http.request( request ) )
42
+ response = Response.new( @http.request( request ), path )
42
43
  rescue Timeout::Error
43
44
  response = nil
44
45
  end
@@ -6,14 +6,15 @@ module Unimatrix::Authorization
6
6
  attr_reader :body
7
7
  attr_reader :resources
8
8
 
9
- def initialize( http_response )
9
+ def initialize( http_response, path = "" )
10
+ @request_path = path
10
11
  @success = http_response.is_a?( Net::HTTPOK )
11
12
  @code = http_response.code
12
13
  @resources = []
13
14
  @body = decode_response_body( http_response )
14
15
 
15
16
  if ( @body && @body.respond_to?( :keys ) )
16
- Parser.new( @body ) do | parser |
17
+ Parser.new( @body, @request_path ) do | parser |
17
18
  @resources = parser.resources
18
19
  @success = !( parser.type_name == 'error' )
19
20
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: unimatrix
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.6.1
4
+ version: 2.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jackson Souza
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-03-28 00:00:00.000000000 Z
11
+ date: 2018-04-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -117,7 +117,9 @@ files:
117
117
  - lib/unimatrix/archivist/component.rb
118
118
  - lib/unimatrix/attribute_error.rb
119
119
  - lib/unimatrix/authorization/client_credentials_grant.rb
120
+ - lib/unimatrix/authorization/error.rb
120
121
  - lib/unimatrix/authorization/filters/requires_policies.rb
122
+ - lib/unimatrix/authorization/filters/requires_resource_owner.rb
121
123
  - lib/unimatrix/authorization/operation.rb
122
124
  - lib/unimatrix/authorization/parser.rb
123
125
  - lib/unimatrix/authorization/policy.rb