Skip to content

Commit d1707ef

Browse files
Merge pull request #24 from rahulpnath/21-handleNoListPermission
Handle No List Permission for Secrets
2 parents 236075b + 4ece4a5 commit d1707ef

File tree

1 file changed

+31
-13
lines changed

1 file changed

+31
-13
lines changed

src/Azure/AzureKeyVaultConfigBuilder.cs

Lines changed: 31 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ public class AzureKeyVaultConfigBuilder : KeyValueConfigBuilder
3333
private string _uri;
3434
private string _version;
3535
private bool _preload;
36+
private bool _preloadFailed;
3637

3738
private KeyVaultClient _kvClient;
3839
private List<string> _allKeys;
@@ -116,7 +117,7 @@ public override ICollection<KeyValuePair<string, string>> GetAllValues(string pr
116117

117118
private async Task<string> GetValueAsync(string key)
118119
{
119-
if (!_preload || _allKeys.Contains(key, StringComparer.OrdinalIgnoreCase))
120+
if (!_preload || _preloadFailed || _allKeys.Contains(key, StringComparer.OrdinalIgnoreCase))
120121
{
121122
try
122123
{
@@ -145,20 +146,37 @@ private async Task<string> GetValueAsync(string key)
145146
private List<string> GetAllKeys()
146147
{
147148
List<string> keys = new List<string>(); // KeyVault keys are case-insensitive. There won't be case-duplicates. List<> should be fine.
148-
149-
// Get first page of secret keys
150-
var allSecrets = Task.Run(async () => { return await _kvClient.GetSecretsAsync(_uri); }).Result;
151-
foreach (var secretItem in allSecrets)
152-
keys.Add(secretItem.Identifier.Name);
153-
154-
// If there more more pages, get those too
155-
string nextPage = allSecrets.NextPageLink;
156-
while (!String.IsNullOrWhiteSpace(nextPage))
149+
try
157150
{
158-
var moreSecrets = Task.Run(async () => { return await _kvClient.GetSecretsNextAsync(nextPage); }).Result;
159-
foreach (var secretItem in moreSecrets)
151+
// Get first page of secret keys
152+
var allSecrets = Task.Run(async () => { return await _kvClient.GetSecretsAsync(_uri); }).Result;
153+
foreach (var secretItem in allSecrets)
160154
keys.Add(secretItem.Identifier.Name);
161-
nextPage = moreSecrets.NextPageLink;
155+
156+
// If there more more pages, get those too
157+
string nextPage = allSecrets.NextPageLink;
158+
while (!String.IsNullOrWhiteSpace(nextPage))
159+
{
160+
var moreSecrets = Task.Run(async () => { return await _kvClient.GetSecretsNextAsync(nextPage); }).Result;
161+
foreach (var secretItem in moreSecrets)
162+
keys.Add(secretItem.Identifier.Name);
163+
nextPage = moreSecrets.NextPageLink;
164+
}
165+
}
166+
catch (AggregateException ae)
167+
{
168+
ae.Handle(ex =>
169+
{
170+
var exAsKve = ex as KeyVaultErrorException;
171+
// If List Permission on Secrets in not available return empty list of keys
172+
if (exAsKve != null && exAsKve.Body.Error.Code == "Forbidden")
173+
{
174+
_preloadFailed = true;
175+
return true;
176+
}
177+
else
178+
return false;
179+
});
162180
}
163181

164182
return keys;

0 commit comments

Comments
 (0)