diff --git a/pom.xml b/pom.xml
index a5dd7ab6..0b27a4f7 100644
--- a/pom.xml
+++ b/pom.xml
@@ -200,6 +200,16 @@
commons-exec
1.3
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ 2.15.3
+
+
+ io.github.jopenlibs
+ vault-java-driver
+ 6.2.0
+
diff --git a/src/main/java/org/onedatashare/transferservice/odstransferservice/OdsTransferService.java b/src/main/java/org/onedatashare/transferservice/odstransferservice/OdsTransferService.java
index 0a890310..6f3903a6 100644
--- a/src/main/java/org/onedatashare/transferservice/odstransferservice/OdsTransferService.java
+++ b/src/main/java/org/onedatashare/transferservice/odstransferservice/OdsTransferService.java
@@ -1,5 +1,6 @@
package org.onedatashare.transferservice.odstransferservice;
+import org.onedatashare.transferservice.odstransferservice.config.VaultConfiguration;
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@@ -13,6 +14,7 @@ public class OdsTransferService {
public static void main(String[] args) {
+ VaultConfiguration.loadSecrets();
SpringApplication.run(OdsTransferService.class, args);
}
diff --git a/src/main/java/org/onedatashare/transferservice/odstransferservice/config/VaultConfiguration.java b/src/main/java/org/onedatashare/transferservice/odstransferservice/config/VaultConfiguration.java
new file mode 100644
index 00000000..a42e4fb0
--- /dev/null
+++ b/src/main/java/org/onedatashare/transferservice/odstransferservice/config/VaultConfiguration.java
@@ -0,0 +1,107 @@
+package org.onedatashare.transferservice.odstransferservice.config;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.github.jopenlibs.vault.Vault;
+import io.github.jopenlibs.vault.VaultConfig;
+
+import java.net.URI;
+import java.net.URLEncoder;
+import java.net.http.HttpClient;
+import java.net.http.HttpRequest;
+import java.net.http.HttpResponse;
+import java.nio.charset.StandardCharsets;
+import java.util.Base64;
+import java.util.HashMap;
+import java.util.Map;
+
+
+import org.onedatashare.transferservice.odstransferservice.service.AuthenticationService;
+
+public class VaultConfiguration {
+ private static Vault vaultServiceInstance;
+ private static String vaultServerAddress = System.getenv("VAULT_URI");
+ private static String secretsPath = System.getenv("VAULT_SECRETS_PATH");
+ private static String shouldLoadSecrets = System.getenv("VAULT_LOAD_SECRETS");
+ private static String vaultTransferServiceUserRole = System.getenv("VAULT_TRANSFER_SERVICE_USER_ROLE");
+ private VaultConfiguration() {
+
+ }
+
+ public static void loadSecrets() {
+ try {
+
+ if (shouldLoadSecrets == null || !shouldLoadSecrets.equals("true")) {
+ return;
+ }
+ Vault vaultServiceInstance = getInstance();
+ var secrets = vaultServiceInstance.logical().read(secretsPath).getData();
+ for (Map.Entry kv : secrets.entrySet()) {
+ System.setProperty(kv.getKey(), kv.getValue());
+ }
+ } catch (Exception e) {
+ System.out.println("Exception while loading secrets from vault:" + e.getMessage());
+ }
+ }
+
+ public static Vault getInstance() throws Exception {
+
+ if (vaultServiceInstance == null) {
+ AuthenticationService authenticator = new AuthenticationService();
+ Map authTokens = authenticator.startDeviceAuthentication();
+ setOdsUserFromToken(authTokens.get("id_token").toString());
+ return authenticateVaultWithIdToken(authTokens.get("id_token").toString());
+
+ }
+ return vaultServiceInstance;
+ }
+
+ private static void setOdsUserFromToken(String idToken) throws Exception {
+ String payload = idToken.split("\\.")[1];
+ String decodedPayload = new String(Base64.getDecoder().decode(payload));
+ ObjectMapper objectMapper = new ObjectMapper();
+ HashMap decodedPayloadMap = objectMapper.readValue(decodedPayload, HashMap.class);
+ System.setProperty("ods.user", decodedPayloadMap.get("email").toString());
+ }
+
+ private static Vault authenticateVaultWithIdToken(String idToken) throws Exception {
+
+
+ String jwtLoginUri = vaultServerAddress + "/v1/auth/jwt/login";
+ HttpClient httpClient = HttpClient.newBuilder()
+ .version(HttpClient.Version.HTTP_2)
+ .build();
+ ObjectMapper objectMapper = new ObjectMapper();
+ Map vaultAuthPayload = new HashMap<>();
+ vaultAuthPayload.put("jwt", idToken);
+ vaultAuthPayload.put("role", vaultTransferServiceUserRole);
+ HttpRequest vaultAuthrequest = HttpRequest.newBuilder()
+ .POST(buildFormDataFromMap(vaultAuthPayload))
+ .uri(URI.create(jwtLoginUri))
+ .setHeader("User-Agent", "Java HttpClient Bot") // add request header
+ .header("Content-Type", "application/x-www-form-urlencoded")
+ .build();
+
+ HttpResponse vaultAuthresponse = httpClient.send(vaultAuthrequest, HttpResponse.BodyHandlers.ofString());
+ HashMap vaultAuthRespnseMap = objectMapper.readValue(vaultAuthresponse.body(), HashMap.class);
+ HashMap