Change logic for path (#49)

This commit is contained in:
struga 2023-01-19 20:19:10 +07:00 committed by GitHub
parent 63a76cb0d4
commit 26b607d603
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 49 additions and 37 deletions

View File

@ -12,7 +12,7 @@
</parent>
<artifactId>adapter-common-lib</artifactId>
<version>1.1.7</version>
<version>1.2.7</version>
<packaging>jar</packaging>
<name>adapter-common-lib</name>

View File

@ -8,41 +8,51 @@ import java.util.Map;
public interface SecretService {
/** Возвращает все секреты по заданному пути (по смыслу терминала)
/**
* Возвращает все секреты по заданному пути (по смыслу терминала)
*
* @param serviceName - имя сервиса, которому принадлежат секреты. Хранится в настройках сервиса.
* @param path - путь, по которому в vault хранятся секреты одного терминала. Хранится в options платежа.
* @return - kv всех секретов этого терминала, например {'TERMINAL_ID':'user11', 'PASSWORD':'Parolec1'}
* @throws SecretPathNotFoundException если путь не найден
*/
Map<String, SecretValue> getSecrets(String path) throws SecretPathNotFoundException;
Map<String, SecretValue> 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 serviceName - имя сервиса, которому принадлежат секреты. Хранится в настройках сервиса.
* @param data Данные для подписи, например, invoiceId=123&amount=222
* @param secretRef Идентификатор секрета, например, SecretRef{'tinkoff-merchant-882347345', 'PASSWORD'}
* @param secretRef Идентификатор секрета, например, SecretRef{'882347345', 'PASSWORD'}
* @param hmacAlgorithm Алгоритм подписи, например, HmacSHA256
* @return Возвращает подпись
* @throws SecretNotFoundException если секрет не найден
* @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 serviceName - имя сервиса, которому принадлежат секреты. Хранится в настройках сервиса.
* @param data Данные для подписи, например, invoiceId=123&amount=222
* @param secretRef Идентификатор секрета, например, SecretRef{'tinkoff-merchant-882347345', 'PASSWORD'}
* @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;
}

View File

@ -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<String, SecretValue> getSecrets(String path) throws SecretPathNotFoundException {
var map = vaultTemplate.opsForVersionedKeyValue(SECRET_PATH).get(path);
public Map<String, SecretValue> 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());
}

View File

@ -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
));
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);
}
}