Class: Legion::Extensions::Identity::Entra::Client

Inherits:
Object
  • Object
show all
Defined in:
lib/legion/extensions/identity/entra/client.rb

Constant Summary collapse

GRAPH_BASE =
'https://graph.microsoft.com/v1.0'

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeClient

Returns a new instance of Client.



77
78
79
80
# File 'lib/legion/extensions/identity/entra/client.rb', line 77

def initialize
  @connection = Concurrent::AtomicReference.new(nil)
  @access_token = Concurrent::AtomicReference.new(nil)
end

Class Method Details

.authenticated?(pattern: :delegated) ⇒ Boolean

Returns:

  • (Boolean)


60
61
62
# File 'lib/legion/extensions/identity/entra/client.rb', line 60

def authenticated?(pattern: :delegated)
  Legion::Extensions::Identity::Entra::Helpers::TokenManager.authenticated?(pattern)
end

.denied_scopes(pattern: :delegated) ⇒ Object



46
47
48
# File 'lib/legion/extensions/identity/entra/client.rb', line 46

def denied_scopes(pattern: :delegated)
  registry(pattern: pattern).denied
end

.graph(pattern: :delegated) ⇒ Object



24
25
26
# File 'lib/legion/extensions/identity/entra/client.rb', line 24

def graph(pattern: :delegated)
  instance(pattern: pattern).connection
end

.instance(pattern: :delegated) ⇒ Object



20
21
22
# File 'lib/legion/extensions/identity/entra/client.rb', line 20

def instance(pattern: :delegated)
  @instances.compute_if_absent(pattern.to_sym) { client_class_for(pattern).new }
end

.permitted?(scope, pattern: :delegated) ⇒ Boolean

Returns:

  • (Boolean)


34
35
36
# File 'lib/legion/extensions/identity/entra/client.rb', line 34

def permitted?(scope, pattern: :delegated)
  registry(pattern: pattern).permitted?(scope)
end

.permitted_all?(*scopes, pattern: :delegated) ⇒ Boolean

Returns:

  • (Boolean)


38
39
40
# File 'lib/legion/extensions/identity/entra/client.rb', line 38

def permitted_all?(*scopes, pattern: :delegated)
  registry(pattern: pattern).permitted_all?(*scopes)
end

.permitted_any?(*scopes, pattern: :delegated) ⇒ Boolean

Returns:

  • (Boolean)


42
43
44
# File 'lib/legion/extensions/identity/entra/client.rb', line 42

def permitted_any?(*scopes, pattern: :delegated)
  registry(pattern: pattern).permitted_any?(*scopes)
end

.registry(pattern: :delegated) ⇒ Object



28
29
30
31
32
# File 'lib/legion/extensions/identity/entra/client.rb', line 28

def registry(pattern: :delegated)
  @registries.compute_if_absent(pattern.to_sym) do
    Legion::Extensions::Identity::Entra::Helpers::ScopeRegistry.new(pattern: pattern)
  end
end

.reset!(pattern: nil) ⇒ Object



50
51
52
53
54
55
56
57
58
# File 'lib/legion/extensions/identity/entra/client.rb', line 50

def reset!(pattern: nil)
  if pattern
    @instances.delete(pattern.to_sym)
    @registries[pattern.to_sym]&.reset!
  else
    @instances.clear
    @registries.each_value(&:reset!)
  end
end

Instance Method Details

#access_tokenObject



117
118
119
120
121
122
123
124
125
# File 'lib/legion/extensions/identity/entra/client.rb', line 117

def access_token
  @access_token.set(nil) if token_expired?
  token = @access_token.get
  return token if token

  resolved = resolve_token
  @access_token.compare_and_set(nil, resolved)
  @access_token.get
end

#connectionObject



86
87
88
89
90
91
92
93
# File 'lib/legion/extensions/identity/entra/client.rb', line 86

def connection
  @connection.set(nil) if token_expired?
  conn = @connection.get
  return conn if conn

  @connection.compare_and_set(nil, build_connection)
  @connection.get
end

#delete(path) ⇒ Object



113
114
115
# File 'lib/legion/extensions/identity/entra/client.rb', line 113

def delete(path)
  connection.delete(path)
end

#get(path, params: {}) ⇒ Object



95
96
97
# File 'lib/legion/extensions/identity/entra/client.rb', line 95

def get(path, params: {})
  connection.get(path, params)
end

#patch(path, body: {}) ⇒ Object



106
107
108
109
110
111
# File 'lib/legion/extensions/identity/entra/client.rb', line 106

def patch(path, body: {})
  connection.patch(path) do |req|
    req.headers['Content-Type'] = 'application/json'
    req.body = json_dump(body)
  end
end

#patternObject

Raises:

  • (NotImplementedError)


82
83
84
# File 'lib/legion/extensions/identity/entra/client.rb', line 82

def pattern
  raise NotImplementedError, "#{self.class} must define #pattern"
end

#post(path, body: {}) ⇒ Object



99
100
101
102
103
104
# File 'lib/legion/extensions/identity/entra/client.rb', line 99

def post(path, body: {})
  connection.post(path) do |req|
    req.headers['Content-Type'] = 'application/json'
    req.body = json_dump(body)
  end
end