OPS-226: interface for secrets (#39)

This commit is contained in:
Inal Arsanukaev 2022-11-02 13:18:30 +03:00 committed by GitHub
parent 98793ca223
commit b69c9d8ded
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 107 additions and 0 deletions

View File

@ -0,0 +1,4 @@
package dev.vality.adapter.common.exception;
public class SecretNotFoundException extends RuntimeException {
}

View File

@ -0,0 +1,4 @@
package dev.vality.adapter.common.exception;
public class SecretPathNotFoundException extends RuntimeException {
}

View File

@ -0,0 +1,13 @@
package dev.vality.adapter.common.secret;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
@Getter
@RequiredArgsConstructor
public enum DigestAlgorithms {
MD5("MD5"),
SHA256("SHA-256");
private final String name;
}

View File

@ -0,0 +1,15 @@
package dev.vality.adapter.common.secret;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
@Getter
@RequiredArgsConstructor
public enum HmacAlgorithms {
HMAC_MD5("HmacMD5"),
HMAC_SHA_1("HmacSHA1"),
HMAC_SHA_256("HmacSHA256"),
HMAC_SHA_512("HmacSHA512");
private final String name;
}

View File

@ -0,0 +1,16 @@
package dev.vality.adapter.common.secret;
import lombok.Data;
/**
* Идентификатор секрета в vault
* path - путь, по которому в vault хранятся секреты одного терминала. Хранится в options платежа.
* key - ключ секрета в vault по указанному пути
* Например, SecretRef{'tinkoff-merchant-882347345', 'PASSWORD'}
*/
@Data
public class SecretRef {
private String path;
private String key;
}

View File

@ -0,0 +1,45 @@
package dev.vality.adapter.common.secret;
import dev.vality.adapter.common.exception.SecretNotFoundException;
import dev.vality.adapter.common.exception.SecretPathNotFoundException;
import java.util.Map;
public interface SecretService {
/** Возвращает все секреты по заданному пути (по смыслу терминала)
* @param path - путь, по которому в vault хранятся секреты одного терминала. Хранится в options платежа.
* @return - kv всех секретов этого терминала, например {'TERMINAL_ID':'user11', 'PASSWORD':'Parolec1'}
* @throws SecretPathNotFoundException если путь не найден
*/
Map<String, SecretValue> getSecrets(String path) throws SecretPathNotFoundException;
/**
* Возвращает конкретный секрет из kv
* @param secretRef Идентификатор секрета, например, SecretRef{'tinkoff-merchant-882347345', 'PASSWORD'}
* @return Возвращает секрет
* @throws SecretNotFoundException если секрет не найден
*/
SecretValue getSecret(SecretRef secretRef) throws SecretNotFoundException;
/**
* Возвращает hex-encoded hmac-подпись data
* @param data Данные для подписи, например, invoiceId=123&amount=222
* @param secretRef Идентификатор секрета, например, SecretRef{'tinkoff-merchant-882347345', 'PASSWORD'}
* @param hmacAlgorithm Алгоритм подписи, например, HmacSHA256
* @return Возвращает подпись
* @throws SecretNotFoundException если секрет не найден
*/
String hmac(String data, SecretRef secretRef, HmacAlgorithms hmacAlgorithm) throws SecretNotFoundException;
/**
* Возвращает hex-encoded хэш от data + secret
* @param data Данные для подписи, например, invoiceId=123&amount=222
* @param secretRef Идентификатор секрета, например, SecretRef{'tinkoff-merchant-882347345', 'PASSWORD'}
* @param digestAlgorithm Алгоритм хэширования, например, MD5
* @return Возвращает подпись
* @throws SecretNotFoundException если секрет не найден
*/
String digest(String data, SecretRef secretRef, DigestAlgorithms digestAlgorithm) throws SecretNotFoundException;
}

View File

@ -0,0 +1,10 @@
package dev.vality.adapter.common.secret;
import lombok.Data;
import lombok.ToString;
@Data
public class SecretValue {
@ToString.Exclude
private String value;
}