Skip to content

Commit

Permalink
secrets provider: simple provider manager test
Browse files Browse the repository at this point in the history
  • Loading branch information
1azyman committed Feb 8, 2024
1 parent 6ceb064 commit acd03ca
Show file tree
Hide file tree
Showing 7 changed files with 99 additions and 18 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;

Expand Down Expand Up @@ -52,20 +52,12 @@ protected <ST> ST resolveSecret(@NotNull String key, @NotNull Class<ST> type) th
ST value = null;
if (valueFile.exists() && valueFile.isFile() && valueFile.canRead()) {
try (InputStream is = new FileInputStream(valueFile)) {
if (type == String.class) {
value = (ST) IOUtils.toString(is, charset);
} else if (type == ByteBuffer.class) {
value = (ST) ByteBuffer.wrap(IOUtils.toByteArray(is));
} else {
throw new IllegalStateException("Unknown type " + type);
}
} catch (Exception ex) {
throw new IllegalStateException("Couldn't read secret from " + valueFile.getAbsolutePath(), ex);
}
}
String content = IOUtils.toString(is, charset);

if (value == null) {
throw new EncryptionException("Secret " + key + " not found in provider " + getIdentifier());
value = mapValue(content, type);
} catch (IOException ex) {
throw new EncryptionException("Couldn't read secret from " + valueFile.getAbsolutePath(), ex);
}
}

return value;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,9 +57,6 @@ protected <ST> ST resolveSecret(@NotNull String key, @NotNull Class<ST> type) th
props.load(reader);

String value = props.getProperty(key);
if (value == null) {
throw new EncryptionException("No value for key '" + key + "' available in provider '" + getIdentifier() + "'");
}

return mapValue(value, type);
} catch (IOException ex) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,9 @@ private <ST> ST getOrResolveSecret(String key, Class<ST> type) throws Encryption
}

/**
* TODO document, should it return null or throw exception?
* Should return secret value for given key or null if the secret does not exist.
*
* @throws EncryptionException if the secret cannot be resolved (e.g. due to network problems, or unforeseen error)
*/
protected abstract <ST> ST resolveSecret(@NotNull String key, @NotNull Class<ST> type) throws EncryptionException;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ public synchronized void configure(SecretsResolver consumer, SecretsProvidersTyp
provider.initialize();

LOGGER.trace("Adding secrets provider: {} to resolver", identifier);

consumer.addSecretsProvider(provider);
existingProviders.remove(provider.getIdentifier());
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
/*
* Copyright (C) 2010-2024 Evolveum and contributors
*
* This work is dual-licensed under the Apache License 2.0
* and European Union Public License. See LICENSE file for details.
*/

package com.evolveum.midpoint.common;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import org.assertj.core.api.Assertions;
import org.jetbrains.annotations.NotNull;
import org.testng.annotations.Test;

import com.evolveum.midpoint.common.secrets.SecretsProviderManager;
import com.evolveum.midpoint.prism.crypto.SecretsProvider;
import com.evolveum.midpoint.prism.crypto.SecretsResolver;
import com.evolveum.midpoint.prism.xml.XmlTypeConverter;
import com.evolveum.midpoint.xml.ns._public.common.common_3.DockerSecretsProviderType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.EnvironmentVariablesSecretsProviderType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.PropertiesSecretsProviderType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.SecretsProvidersType;

public class SecretProviderManagerTest {

@Test
public void test100TestProvidersInitialization() throws Exception {
DockerSecretsProviderType docker = new DockerSecretsProviderType();
docker.setIdentifier("docker");

EnvironmentVariablesSecretsProviderType env = new EnvironmentVariablesSecretsProviderType();
env.setIdentifier("env");

PropertiesSecretsProviderType properties = new PropertiesSecretsProviderType();
properties.setIdentifier("properties");
properties.setPropertiesFile("./src/test/resources/test-provider.properties");
properties.setCache(XmlTypeConverter.createDuration("PT30S"));

SecretsProvidersType providers = new SecretsProvidersType();
providers.setDockerSecretsProvider(docker);
providers.setEnvironmentVariablesSecretsProvider(env);
providers.getPropertiesSecretsProvider().add(properties);

Map<String, SecretsProvider<?>> map = new ConcurrentHashMap<>();

SecretsResolver resolver = new SecretsResolver() {

@Override
public void addSecretsProvider(@NotNull SecretsProvider<?> provider) {
map.put(provider.getIdentifier(), provider);
}

@Override
public void removeSecretsProvider(@NotNull SecretsProvider<?> provider) {
map.remove(provider.getIdentifier());
}

@Override
public @NotNull List<SecretsProvider<?>> getSecretsProviders() {
return new ArrayList<>(map.values());
}
};

SecretsProviderManager manager = new SecretsProviderManager();
manager.configure(resolver, providers);

Assertions.assertThat(map).hasSize(3);

String value = map.get("properties").getSecretString("sample.key");
Assertions.assertThat(value).isEqualTo("jdoe");
}
}
8 changes: 8 additions & 0 deletions infra/common/src/test/resources/test-provider.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#
# Copyright (C) 2010-2024 Evolveum and contributors
#
# This work is dual-licensed under the Apache License 2.0
# and European Union Public License. See LICENSE file for details.
#

sample.key=jdoe
5 changes: 5 additions & 0 deletions infra/common/testng-unit.xml
Original file line number Diff line number Diff line change
Expand Up @@ -36,4 +36,9 @@
<class name="com.evolveum.midpoint.common.cleanup.CleanupActionProcessorTest" />
</classes>
</test>
<test name="Secret Providers" preserve-order="false">
<classes>
<class name="com.evolveum.midpoint.common.SecretProviderManagerTest" />
</classes>
</test>
</suite>

0 comments on commit acd03ca

Please sign in to comment.