lex-identity-entra 0.3.1 → 0.4.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: bebdd4c4aa004549f0263c8556d2ff39ce4f187f945341021033d510d23d4fb2
4
- data.tar.gz: 10144fbe3fb835731c30ee97d3e874bc921fd5e8084e054e93aedc5375f1bbdf
3
+ metadata.gz: e6731d955e0a738ca12ad20875132f4b3e008e56313e20a8be750ecd5fc96942
4
+ data.tar.gz: 785a786e42520016f0e3220e646aefed11da78375b2e8870f872a7a0c71bfd07
5
5
  SHA512:
6
- metadata.gz: 88137e50c75426f3306ab2427e4f1bb81e630d3453186cab9667884f7e17322277c5c77097bdee5d332ea84097854a1424f19d82f528076d49890021411a62d8
7
- data.tar.gz: de2187f7d7eb71435e70dc6de3eb4ceb8d817f979c5df9cfa1f6e3680aa9b59ca0ce5160c721766b2e33317c0f070d41b07303399de5d04595521254062d662d
6
+ metadata.gz: bf3abe1ea0891638459bc7b5ed151d61a5346af07f2599bcede3af0a3f606f04853fd8b0320e3eb5584045243c1b047d3c84f43dbe218d7e95cf31d2a392892f
7
+ data.tar.gz: 66e861f841b907ca63e1dc452458930afdba359c0a99b042b11e523164d3c919159fca0117c8469094903932ba83ae5dcd0e5a329c43df72488c92054a4100a4
data/CHANGELOG.md CHANGED
@@ -2,6 +2,17 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [0.4.0] - 2026-05-18
6
+
7
+ ### Fixed
8
+ - Token refresher actors (workload_identity, application, managed_identity) no longer activate when credentials are absent; eliminates noisy WARN/INFO spam on local dev.
9
+ - Vault read/write operations now require a resolved canonical name before constructing vault paths; prevents 403 errors from writing to `users/anonymous/...` or `users/default/...` before identity resolves.
10
+ - Removed `'default'` fallback from `vault_path`; returns nil when canonical name is unavailable.
11
+
12
+ ### Changed
13
+ - `canonical_name_available?` helper added to TokenManager; guards all vault operations and backfill logic.
14
+ - Tokens save to local disk first, backfill to vault once identity resolves to real canonical name.
15
+
5
16
  ## [0.3.1] - 2026-05-15
6
17
 
7
18
  ### Fixed
@@ -22,7 +22,8 @@ module Legion
22
22
  end
23
23
 
24
24
  def enabled? # rubocop:disable Legion/Extension/ActorEnabledSideEffects
25
- true
25
+ auth = Legion::Extensions::Identity::Entra::Helpers::TokenManager.settings_auth
26
+ auth[:tenant_id] && auth[:client_id] && auth[:client_secret]
26
27
  end
27
28
 
28
29
  def manual
@@ -36,7 +36,7 @@ module Legion
36
36
  log.debug("TokenManager.token_data: qualifier=#{qualifier} refresh=#{refresh}")
37
37
  vault_data = from_vault_data(qualifier)
38
38
  other_data = vault_data || from_local_data(qualifier) || from_memory(qualifier)
39
- if other_data && !vault_data && vault_available? && trusted_process_identity?
39
+ if other_data && !vault_data && vault_available? && canonical_name_available?
40
40
  log.info("TokenManager.token_data: backfilling #{qualifier} token to vault")
41
41
  backfill_saved = save_to_vault(qualifier, access_token: other_data[:access_token],
42
42
  refresh_token: other_data[:refresh_token],
@@ -85,7 +85,7 @@ module Legion
85
85
  end
86
86
 
87
87
  def from_vault_data(qualifier)
88
- return nil unless vault_available? && trusted_process_identity?
88
+ return nil unless vault_available? && canonical_name_available?
89
89
 
90
90
  path = vault_path(qualifier)
91
91
  log.debug("TokenManager.from_vault_data: reading kv/#{path}")
@@ -112,6 +112,7 @@ module Legion
112
112
  def save_to_vault(qualifier, access_token:, refresh_token:, expires_at:,
113
113
  scopes: nil, tenant_id: nil, client_id: nil, scope_fingerprint: nil)
114
114
  return unless vault_available?
115
+ return unless canonical_name_available?
115
116
 
116
117
  path = vault_path(qualifier)
117
118
  cluster = Legion::Crypt.respond_to?(:default_cluster_name) ? Legion::Crypt.default_cluster_name : 'vault'
@@ -279,13 +280,9 @@ module Legion
279
280
  auth = settings_auth
280
281
  pattern_settings = auth[qualifier.to_sym]
281
282
  return pattern_settings[:vault_path] if pattern_settings.is_a?(Hash) && pattern_settings[:vault_path]
283
+ return nil unless canonical_name_available?
282
284
 
283
- identity = if trusted_process_identity?
284
- Legion::Identity::Process.canonical_name
285
- else
286
- 'default'
287
- end
288
- "users/#{identity}/entra/#{qualifier}/auth"
285
+ "users/#{Legion::Identity::Process.canonical_name}/entra/#{qualifier}/auth"
289
286
  end
290
287
 
291
288
  def local_path(qualifier)
@@ -354,6 +351,14 @@ module Legion
354
351
 
355
352
  %i[configured verified authenticated].include?(Legion::Identity::Process.trust)
356
353
  end
354
+
355
+ def canonical_name_available?
356
+ return false unless defined?(Legion::Identity::Process)
357
+ return false unless Legion::Identity::Process.respond_to?(:canonical_name)
358
+
359
+ name = Legion::Identity::Process.canonical_name
360
+ !name.nil? && !name.empty? && name != 'anonymous'
361
+ end
357
362
  end
358
363
  end
359
364
  end
@@ -22,7 +22,8 @@ module Legion
22
22
  end
23
23
 
24
24
  def enabled? # rubocop:disable Legion/Extension/ActorEnabledSideEffects
25
- true
25
+ ENV.fetch('IDENTITY_ENDPOINT', nil) || ENV.fetch('AZURE_IMDS_ENABLED', nil) ||
26
+ Legion::Settings.dig(:identity, :entra, :managed_identity, :enabled)
26
27
  end
27
28
 
28
29
  def manual
@@ -4,7 +4,7 @@ module Legion
4
4
  module Extensions
5
5
  module Identity
6
6
  module Entra
7
- VERSION = '0.3.1'
7
+ VERSION = '0.4.0'
8
8
  end
9
9
  end
10
10
  end
@@ -22,7 +22,9 @@ module Legion
22
22
  end
23
23
 
24
24
  def enabled? # rubocop:disable Legion/Extension/ActorEnabledSideEffects
25
- true
25
+ ENV.fetch('AZURE_TENANT_ID', nil) &&
26
+ ENV.fetch('AZURE_CLIENT_ID', nil) &&
27
+ ENV.fetch('AZURE_FEDERATED_TOKEN_FILE', nil)
26
28
  end
27
29
 
28
30
  def manual
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lex-identity-entra
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Esity