Skip to content

Commit 361f94d

Browse files
zhoufenqinunknown
andauthored
exclude disabled secrets when getting kayvault secrets (Azure#14407)
Co-authored-by: unknown <[email protected]>
1 parent 18e6ea8 commit 361f94d

File tree

2 files changed

+91
-19
lines changed

2 files changed

+91
-19
lines changed

sdk/spring/azure-spring-boot/src/main/java/com/microsoft/azure/keyvault/spring/KeyVaultOperation.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import com.azure.core.util.paging.ContinuablePagedIterable;
1212
import com.azure.security.keyvault.secrets.SecretClient;
1313
import com.azure.security.keyvault.secrets.models.KeyVaultSecret;
14+
import com.azure.security.keyvault.secrets.models.SecretProperties;
1415
import java.util.HashMap;
1516
import java.util.List;
1617
import java.util.Locale;
@@ -125,6 +126,7 @@ private void refreshProperties() {
125126
.orElseGet(Stream::empty)
126127
.map(PagedResponse::getElements)
127128
.flatMap(i -> StreamSupport.stream(i.spliterator(), false))
129+
.filter(SecretProperties::isEnabled)
128130
.map(p -> secretClient.getSecret(p.getName(), p.getVersion()))
129131
.filter(Objects::nonNull)
130132
.collect(Collectors.toMap(

sdk/spring/azure-spring-boot/src/test/java/com/microsoft/azure/keyvault/spring/KeyVaultOperationUnitTest.java

Lines changed: 89 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,25 @@
66
import static org.assertj.core.api.Assertions.assertThat;
77
import static org.mockito.Mockito.when;
88

9+
import com.azure.core.http.HttpHeaders;
10+
import com.azure.core.http.HttpRequest;
11+
import com.azure.core.http.rest.PagedFlux;
12+
import com.azure.core.http.rest.PagedIterable;
13+
import com.azure.core.http.rest.PagedResponse;
14+
import com.azure.core.util.IterableStream;
915
import com.azure.security.keyvault.secrets.SecretClient;
1016
import com.azure.security.keyvault.secrets.models.KeyVaultSecret;
17+
import com.azure.security.keyvault.secrets.models.SecretProperties;
18+
import java.io.IOException;
1119
import java.util.Arrays;
1220
import java.util.LinkedHashMap;
1321
import java.util.List;
1422
import org.junit.Test;
1523
import org.junit.runner.RunWith;
1624
import org.mockito.Mock;
1725
import org.mockito.junit.MockitoJUnitRunner;
26+
import reactor.core.publisher.Flux;
27+
import reactor.core.publisher.Mono;
1828

1929
@RunWith(MockitoJUnitRunner.class)
2030
public class KeyVaultOperationUnitTest {
@@ -36,27 +46,27 @@ public class KeyVaultOperationUnitTest {
3646
private static final String TEST_AZURE_KEYVAULT_NAME = "acme-myproject-person-firstname";
3747

3848
private static final List<String> TEST_SPRING_RELAXED_BINDING_NAMES = Arrays.asList(
39-
TEST_SPRING_RELAXED_BINDING_NAME_0,
40-
TEST_SPRING_RELAXED_BINDING_NAME_1,
41-
TEST_SPRING_RELAXED_BINDING_NAME_2,
42-
TEST_SPRING_RELAXED_BINDING_NAME_3
49+
TEST_SPRING_RELAXED_BINDING_NAME_0,
50+
TEST_SPRING_RELAXED_BINDING_NAME_1,
51+
TEST_SPRING_RELAXED_BINDING_NAME_2,
52+
TEST_SPRING_RELAXED_BINDING_NAME_3
4353
);
4454

4555
@Mock
4656
private SecretClient keyVaultClient;
4757
private KeyVaultOperation keyVaultOperation;
4858

49-
public void setupSecretBundle(String id, String value, List<String> secretKeysConfig) {
59+
public void setupSecretBundle(List<String> secretKeysConfig) {
5060
keyVaultOperation = new KeyVaultOperation(
51-
keyVaultClient,
52-
0,
53-
secretKeysConfig,
54-
false);
61+
keyVaultClient,
62+
0,
63+
secretKeysConfig,
64+
false);
5565
}
5666

5767
@Test
5868
public void testGetWithNoSpecficSecretKeys() {
59-
setupSecretBundle(TEST_PROPERTY_NAME_1, TEST_PROPERTY_NAME_1, null);
69+
setupSecretBundle(null);
6070

6171
final LinkedHashMap<String, String> properties = new LinkedHashMap<>();
6272
properties.put("testpropertyname1", TEST_PROPERTY_NAME_1);
@@ -67,7 +77,7 @@ public void testGetWithNoSpecficSecretKeys() {
6777

6878
@Test
6979
public void testGetAndMissWhenSecretsProvided() {
70-
setupSecretBundle(TEST_PROPERTY_NAME_1, TEST_PROPERTY_NAME_1, SECRET_KEYS_CONFIG);
80+
setupSecretBundle(SECRET_KEYS_CONFIG);
7181

7282
final LinkedHashMap<String, String> properties = new LinkedHashMap<>();
7383
properties.put("key1", "value1");
@@ -84,15 +94,15 @@ public void testGetAndHitWhenSecretsProvided() {
8494
when(keyVaultClient.getSecret("key2")).thenReturn(new KeyVaultSecret("key2", "key2"));
8595
when(keyVaultClient.getSecret("key3")).thenReturn(new KeyVaultSecret("key3", "key3"));
8696

87-
setupSecretBundle(SECRET_KEY_1, SECRET_KEY_1, SECRET_KEYS_CONFIG);
97+
setupSecretBundle(SECRET_KEYS_CONFIG);
8898

8999
assertThat(keyVaultOperation.getProperty(SECRET_KEY_1)).isEqualToIgnoringCase(SECRET_KEY_1);
90100
}
91101

92102
@Test
93103
public void testList() {
94104
//test list with no specific secret keys
95-
setupSecretBundle(TEST_PROPERTY_NAME_1, TEST_PROPERTY_NAME_1, null);
105+
setupSecretBundle(null);
96106
final LinkedHashMap<String, String> properties = new LinkedHashMap<>();
97107
properties.put(TEST_PROPERTY_NAME_1, TEST_PROPERTY_NAME_1);
98108
keyVaultOperation.setProperties(properties);
@@ -104,7 +114,7 @@ public void testList() {
104114
when(keyVaultClient.getSecret("key1")).thenReturn(new KeyVaultSecret("key1", "key1"));
105115
when(keyVaultClient.getSecret("key2")).thenReturn(new KeyVaultSecret("key2", "key2"));
106116
when(keyVaultClient.getSecret("key3")).thenReturn(new KeyVaultSecret("key3", "key3"));
107-
setupSecretBundle(TEST_PROPERTY_NAME_1, TEST_PROPERTY_NAME_1, SECRET_KEYS_CONFIG);
117+
setupSecretBundle(SECRET_KEYS_CONFIG);
108118
final String[] specificResult = keyVaultOperation.getPropertyNames();
109119
assertThat(specificResult.length).isEqualTo(3);
110120
assertThat(specificResult[0]).isEqualTo(SECRET_KEYS_CONFIG.get(0));
@@ -113,27 +123,87 @@ public void testList() {
113123
@Test
114124
public void setTestSpringRelaxedBindingNames() {
115125
//test list with no specific secret keys
116-
setupSecretBundle(TEST_AZURE_KEYVAULT_NAME, TEST_AZURE_KEYVAULT_NAME, null);
126+
setupSecretBundle(null);
117127
LinkedHashMap<String, String> properties = new LinkedHashMap<>();
118128
properties.put("acme-myproject-person-firstname", TEST_AZURE_KEYVAULT_NAME);
119129
keyVaultOperation.setProperties(properties);
120130
TEST_SPRING_RELAXED_BINDING_NAMES
121-
.forEach(n -> assertThat(keyVaultOperation.getProperty(n)).isEqualTo(TEST_AZURE_KEYVAULT_NAME));
131+
.forEach(n -> assertThat(keyVaultOperation.getProperty(n)).isEqualTo(TEST_AZURE_KEYVAULT_NAME));
122132

123133
//test list with specific secret key configs
124-
setupSecretBundle(TEST_AZURE_KEYVAULT_NAME, TEST_AZURE_KEYVAULT_NAME, Arrays.asList(TEST_AZURE_KEYVAULT_NAME));
134+
setupSecretBundle(Arrays.asList(TEST_AZURE_KEYVAULT_NAME));
125135
properties = new LinkedHashMap<>();
126136
properties.put(TEST_AZURE_KEYVAULT_NAME, TEST_AZURE_KEYVAULT_NAME);
127137
keyVaultOperation.setProperties(properties);
128138
TEST_SPRING_RELAXED_BINDING_NAMES
129-
.forEach(n -> assertThat(keyVaultOperation.getProperty(n)).isEqualTo(TEST_AZURE_KEYVAULT_NAME));
139+
.forEach(n -> assertThat(keyVaultOperation.getProperty(n)).isEqualTo(TEST_AZURE_KEYVAULT_NAME));
130140

131-
setupSecretBundle(TEST_AZURE_KEYVAULT_NAME, TEST_AZURE_KEYVAULT_NAME, SECRET_KEYS_CONFIG);
141+
setupSecretBundle(SECRET_KEYS_CONFIG);
132142
properties = new LinkedHashMap<>();
133143
properties.put("key1", "key1");
134144
properties.put("key2", "key2");
135145
properties.put("key3", "key3");
136146
keyVaultOperation.setProperties(properties);
137147
TEST_SPRING_RELAXED_BINDING_NAMES.forEach(n -> assertThat(keyVaultOperation.getProperty(n)).isEqualTo(null));
138148
}
149+
150+
@Test
151+
public void getSecretsWithoutDisabled() {
152+
KeyVaultSecret enableSecret = new KeyVaultSecret("key1", "value1");
153+
enableSecret.getProperties().setEnabled(true);
154+
155+
KeyVaultSecret disableSecret = new KeyVaultSecret("key2", "value2");
156+
disableSecret.getProperties().setEnabled(false);
157+
158+
List<SecretProperties> properties = Arrays.asList(enableSecret.getProperties(), disableSecret.getProperties());
159+
OnePageResponse<SecretProperties> secretResponse = new OnePageResponse<>(properties);
160+
when(keyVaultClient.getSecret("key1", null)).thenReturn(enableSecret);
161+
when(keyVaultClient.listPropertiesOfSecrets())
162+
.thenReturn(new PagedIterable<>(new PagedFlux<>(() -> Mono.just(secretResponse))));
163+
setupSecretBundle(null);
164+
assertThat(keyVaultOperation.getPropertyNames().length == 1);
165+
assertThat(keyVaultOperation.getProperty("key1")).isNotNull();
166+
assertThat(keyVaultOperation.getProperty("key2")).isNull();
167+
168+
}
169+
170+
static class OnePageResponse<T> implements PagedResponse<T> {
171+
172+
List<T> properties = null;
173+
174+
OnePageResponse(List<T> properties) {
175+
this.properties = properties;
176+
}
177+
178+
@Override
179+
public IterableStream<T> getElements() {
180+
Flux<T> flux = Flux.fromIterable(properties);
181+
return new IterableStream<T>(flux);
182+
}
183+
184+
@Override
185+
public String getContinuationToken() {
186+
return null;
187+
}
188+
189+
@Override
190+
public int getStatusCode() {
191+
return 0;
192+
}
193+
194+
@Override
195+
public HttpHeaders getHeaders() {
196+
return null;
197+
}
198+
199+
@Override
200+
public HttpRequest getRequest() {
201+
return null;
202+
}
203+
204+
@Override
205+
public void close() throws IOException {
206+
207+
}
208+
}
139209
}

0 commit comments

Comments
 (0)