From 26b607d60356f8dbacbcb06b31bbc7bd9229bd94 Mon Sep 17 00:00:00 2001 From: struga Date: Thu, 19 Jan 2023 20:19:10 +0700 Subject: [PATCH] Change logic for path (#49) --- pom.xml | 2 +- .../adapter/common/secret/SecretService.java | 34 ++++++++++++------- .../common/secret/VaultSecretService.java | 24 ++++++------- .../common/secret/VaultSecretServiceTest.java | 26 ++++++++------ 4 files changed, 49 insertions(+), 37 deletions(-) diff --git a/pom.xml b/pom.xml index ccc8378..e5270dd 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,7 @@ adapter-common-lib - 1.1.7 + 1.2.7 jar adapter-common-lib diff --git a/src/main/java/dev/vality/adapter/common/secret/SecretService.java b/src/main/java/dev/vality/adapter/common/secret/SecretService.java index 91cf71a..e2facc0 100644 --- a/src/main/java/dev/vality/adapter/common/secret/SecretService.java +++ b/src/main/java/dev/vality/adapter/common/secret/SecretService.java @@ -8,41 +8,51 @@ import java.util.Map; public interface SecretService { - /** Возвращает все секреты по заданному пути (по смыслу терминала) - * @param path - путь, по которому в vault хранятся секреты одного терминала. Хранится в options платежа. + /** + * Возвращает все секреты по заданному пути (по смыслу терминала) + * + * @param serviceName - имя сервиса, которому принадлежат секреты. Хранится в настройках сервиса. + * @param path - путь, по которому в vault хранятся секреты одного терминала. Хранится в options платежа. * @return - kv всех секретов этого терминала, например {'TERMINAL_ID':'user11', 'PASSWORD':'Parolec1'} * @throws SecretPathNotFoundException если путь не найден */ - Map getSecrets(String path) throws SecretPathNotFoundException; + Map getSecrets(String serviceName, String path) throws SecretPathNotFoundException; /** * Возвращает конкретный секрет из kv - * @param secretRef Идентификатор секрета, например, SecretRef{'tinkoff-merchant-882347345', 'PASSWORD'} + * + * @param serviceName - имя сервиса, которому принадлежат секреты. Хранится в настройках сервиса. + * @param secretRef Идентификатор секрета, например, SecretRef{'882347345', 'PASSWORD'} * @return Возвращает секрет * @throws SecretNotFoundException если секрет не найден */ - SecretValue getSecret(SecretRef secretRef) throws SecretNotFoundException; + SecretValue getSecret(String serviceName, SecretRef secretRef) throws SecretNotFoundException; /** * Возвращает hex-encoded hmac-подпись data. Секрет должен быть hex-encoded. - * @param data Данные для подписи, например, invoiceId=123&amount=222 - * @param secretRef Идентификатор секрета, например, SecretRef{'tinkoff-merchant-882347345', 'PASSWORD'} + * + * @param serviceName - имя сервиса, которому принадлежат секреты. Хранится в настройках сервиса. + * @param data Данные для подписи, например, invoiceId=123&amount=222 + * @param secretRef Идентификатор секрета, например, SecretRef{'882347345', 'PASSWORD'} * @param hmacAlgorithm Алгоритм подписи, например, HmacSHA256 * @return Возвращает подпись * @throws SecretNotFoundException если секрет не найден - * @throws HexDecodeException если секрет не в hex-формате + * @throws HexDecodeException если секрет не в hex-формате */ - String hmac(String data, SecretRef secretRef, HmacAlgorithms hmacAlgorithm) + String hmac(String serviceName, String data, SecretRef secretRef, HmacAlgorithms hmacAlgorithm) throws SecretNotFoundException, HexDecodeException; /** * Возвращает hex-encoded хэш от data + secret - * @param data Данные для подписи, например, invoiceId=123&amount=222 - * @param secretRef Идентификатор секрета, например, SecretRef{'tinkoff-merchant-882347345', 'PASSWORD'} + * + * @param serviceName - имя сервиса, которому принадлежат секреты. Хранится в настройках сервиса. + * @param data Данные для подписи, например, invoiceId=123&amount=222 + * @param secretRef Идентификатор секрета, например, SecretRef{'882347345', 'PASSWORD'} * @param digestAlgorithm Алгоритм хэширования, например, MD5 * @return Возвращает подпись * @throws SecretNotFoundException если секрет не найден */ - String digest(String data, SecretRef secretRef, DigestAlgorithms digestAlgorithm) throws SecretNotFoundException; + String digest(String serviceName, String data, SecretRef secretRef, DigestAlgorithms digestAlgorithm) + throws SecretNotFoundException; } diff --git a/src/main/java/dev/vality/adapter/common/secret/VaultSecretService.java b/src/main/java/dev/vality/adapter/common/secret/VaultSecretService.java index 74d5278..8dc84e9 100644 --- a/src/main/java/dev/vality/adapter/common/secret/VaultSecretService.java +++ b/src/main/java/dev/vality/adapter/common/secret/VaultSecretService.java @@ -12,14 +12,11 @@ import java.util.stream.Collectors; @RequiredArgsConstructor public class VaultSecretService implements SecretService { - public static final String VAULT_PATH = "VAULT_PATH"; - private static final String SECRET_PATH = "secret"; - private final VaultTemplate vaultTemplate; @Override - public Map getSecrets(String path) throws SecretPathNotFoundException { - var map = vaultTemplate.opsForVersionedKeyValue(SECRET_PATH).get(path); + public Map getSecrets(String serviceName, String path) throws SecretPathNotFoundException { + var map = vaultTemplate.opsForVersionedKeyValue(serviceName).get(path); if (map == null || map.getData() == null) { throw new SecretPathNotFoundException(path); } @@ -28,26 +25,27 @@ public class VaultSecretService implements SecretService { } @Override - public SecretValue getSecret(SecretRef secretRef) throws SecretNotFoundException { - String secret = getSecretString(secretRef); + public SecretValue getSecret(String serviceName, SecretRef secretRef) throws SecretNotFoundException { + String secret = getSecretString(serviceName, secretRef); return new SecretValue(secret); } @Override - public String hmac(String data, SecretRef secretRef, HmacAlgorithms hmacAlgorithm) + public String hmac(String serviceName, String data, SecretRef secretRef, HmacAlgorithms hmacAlgorithm) throws SecretNotFoundException, HexDecodeException { - String hexSecret = getSecretString(secretRef); + String hexSecret = getSecretString(serviceName, secretRef); return new HmacSigner().sign(data, hexSecret, secretRef, hmacAlgorithm); } @Override - public String digest(String data, SecretRef secretRef, DigestAlgorithms algorithm) throws SecretNotFoundException { - String secret = getSecretString(secretRef); + public String digest(String serviceName, String data, SecretRef secretRef, DigestAlgorithms algorithm) + throws SecretNotFoundException { + String secret = getSecretString(serviceName, secretRef); return new DigestSigner().sign(data, secret, algorithm); } - private String getSecretString(SecretRef secretRef) throws SecretNotFoundException { - var map = vaultTemplate.opsForVersionedKeyValue(SECRET_PATH).get(secretRef.getPath()); + private String getSecretString(String serviceName, SecretRef secretRef) throws SecretNotFoundException { + var map = vaultTemplate.opsForVersionedKeyValue(serviceName).get(secretRef.getPath()); if (map == null || map.getData() == null || map.getData().get(secretRef.getKey()) == null) { throw new SecretNotFoundException(secretRef.toString()); } diff --git a/src/test/java/dev/vality/adapter/common/secret/VaultSecretServiceTest.java b/src/test/java/dev/vality/adapter/common/secret/VaultSecretServiceTest.java index d4d831b..83a5398 100644 --- a/src/test/java/dev/vality/adapter/common/secret/VaultSecretServiceTest.java +++ b/src/test/java/dev/vality/adapter/common/secret/VaultSecretServiceTest.java @@ -23,6 +23,7 @@ public class VaultSecretServiceTest { public static final String SIMPLE_SECRET = "sbdhfvh2y32bub"; public static final String HMAC_KEY = "hmacKey"; public static final String HMAC_SECRET = "6d6b6c6172657772"; + public static final String SERVICE_NAME = "secret"; private static VaultSecretService vaultService; private static final String TEST_PATH = "test-terminal-123"; @@ -35,40 +36,43 @@ public class VaultSecretServiceTest { VaultEndpoint vaultEndpoint = VaultEndpoint.create("localhost", container.getFirstMappedPort()); vaultEndpoint.setScheme("http"); VaultTemplate vaultTemplate = new VaultTemplate(vaultEndpoint, new TokenAuthentication("my-root-token")); - vaultTemplate.opsForVersionedKeyValue("secret").put(TEST_PATH, + vaultTemplate.opsForVersionedKeyValue(SERVICE_NAME).put(TEST_PATH, Map.of(SIMPLE_KEY, SIMPLE_SECRET, - HMAC_KEY, HMAC_SECRET - )); + HMAC_KEY, HMAC_SECRET + )); vaultService = new VaultSecretService(vaultTemplate); - } @Test public void testGetSecrets() { - assertNotNull(vaultService.getSecrets(TEST_PATH)); - assertThrows(SecretPathNotFoundException.class, () -> vaultService.getSecrets("kekek")); + assertNotNull(vaultService.getSecrets(SERVICE_NAME, TEST_PATH)); + assertThrows(SecretPathNotFoundException.class, () -> vaultService.getSecrets(SERVICE_NAME, "kekek")); } @Test public void testGetSecret() { - assertEquals(SIMPLE_SECRET, vaultService.getSecret(new SecretRef(TEST_PATH, SIMPLE_KEY)).getValue()); - assertThrows(SecretNotFoundException.class, () -> vaultService.getSecret(new SecretRef(TEST_PATH, "der"))); + assertEquals(SIMPLE_SECRET, + vaultService.getSecret(SERVICE_NAME, new SecretRef(TEST_PATH, SIMPLE_KEY)).getValue()); + assertThrows(SecretNotFoundException.class, + () -> vaultService.getSecret(SERVICE_NAME, new SecretRef(TEST_PATH, "der"))); } @Test public void testHmac() { String expected = HmacEncryption.calculateHMacSha256("some_dat", "6d6b6c6172657772"); SecretRef hmacRef = new SecretRef(TEST_PATH, HMAC_KEY); - String actual = vaultService.hmac("some_dat", hmacRef, HmacAlgorithms.HMAC_SHA_256); + String actual = vaultService.hmac(SERVICE_NAME, "some_dat", hmacRef, HmacAlgorithms.HMAC_SHA_256); assertEquals(expected, actual); assertThrows(HexDecodeException.class, - () -> vaultService.hmac("some_dat", new SecretRef(TEST_PATH,SIMPLE_KEY), HmacAlgorithms.HMAC_MD5)); + () -> vaultService.hmac(SERVICE_NAME, "some_dat", new SecretRef(TEST_PATH, SIMPLE_KEY), + HmacAlgorithms.HMAC_MD5)); } @Test public void digest() { String expected = DigestUtils.md5Hex("some_da" + SIMPLE_SECRET); - String actual = vaultService.digest("some_da", new SecretRef(TEST_PATH, SIMPLE_KEY), DigestAlgorithms.MD5); + String actual = vaultService.digest(SERVICE_NAME, "some_da", new SecretRef(TEST_PATH, SIMPLE_KEY), + DigestAlgorithms.MD5); assertEquals(expected, actual); } } \ No newline at end of file