From 4057df0c900106926ba462c3bbfa27f01d2edc7c Mon Sep 17 00:00:00 2001 From: Daniel Hougaard Date: Wed, 9 Apr 2025 16:03:05 +0400 Subject: [PATCH 1/6] feat(secrets): add secrets to system properties --- README.md | 5 ++++- .../java/com/infisical/sdk/resources/SecretsClient.java | 8 +++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 7784d44..5a0ba3d 100644 --- a/README.md +++ b/README.md @@ -114,7 +114,8 @@ public List ListSecrets( String secretPath, Boolean expandSecretReferences, Boolean recursive, - Boolean includeImports + Boolean includeImports, + Boolean setSecretsOnSystemProperties ) throws InfisicalException @@ -128,6 +129,7 @@ List secrets = await sdk.Secrets().ListSecrets( false, // Should expand secret references false, // Should get secrets recursively from sub folders false, // Should include imports + false // Should set the fetched secrets as key/value pairs on the system properties. Makes the secrets accessible as System.getProperty("") ); ``` @@ -138,6 +140,7 @@ List secrets = await sdk.Secrets().ListSecrets( - `expandSecretReferences` (boolean): Whether to expand secret references. - `recursive` (boolean): Whether to list secrets recursively. - `includeImports` (boolean): Whether to include imported secrets. +- `setSecretsOnSystemProperties` (boolean): Set the retrieved secrets as key/value pairs on the system properties, making them accessible through `System.getProperty("")` **Returns:** - `List`: The response containing the list of secrets. diff --git a/src/main/java/com/infisical/sdk/resources/SecretsClient.java b/src/main/java/com/infisical/sdk/resources/SecretsClient.java index c290774..72b7854 100644 --- a/src/main/java/com/infisical/sdk/resources/SecretsClient.java +++ b/src/main/java/com/infisical/sdk/resources/SecretsClient.java @@ -16,7 +16,7 @@ public SecretsClient(ApiClient apiClient) { this.httpClient = apiClient; } - public List ListSecrets(String projectId, String environmentSlug, String secretPath, Boolean expandSecretReferences, Boolean recursive, Boolean includeImports) throws InfisicalException { + public List ListSecrets(String projectId, String environmentSlug, String secretPath, Boolean expandSecretReferences, Boolean recursive, Boolean includeImports, Boolean setSecretsOnSystemProperties) throws InfisicalException { var url = String.format("%s%s", this.httpClient.GetBaseUrl(), "/api/v3/secrets/raw"); var queryParameters = new QueryBuilder() @@ -30,6 +30,12 @@ public List ListSecrets(String projectId, String environmentSlug, String var listSecrets = this.httpClient.get(url, queryParameters, ListSecretsResponse.class); + if (setSecretsOnSystemProperties) { + for (Secret secret : listSecrets.getSecrets()) { + System.setProperty(secret.getSecretKey(), secret.getSecretValue()); + } + } + return listSecrets.getSecrets(); } From 4081b2f8dc60bc81e60dd0e8a3678e9a78afe253 Mon Sep 17 00:00:00 2001 From: Daniel Hougaard Date: Wed, 9 Apr 2025 16:07:39 +0400 Subject: [PATCH 2/6] fix: upgrade deprecated workflow package --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index c953fb2..1154327 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -38,7 +38,7 @@ jobs: - name: Upload Test Results if: always() - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: test-results path: target/surefire-reports/ From 37029c0abea7d721f169774c31d52942063f082d Mon Sep 17 00:00:00 2001 From: Daniel Hougaard Date: Wed, 9 Apr 2025 16:07:49 +0400 Subject: [PATCH 3/6] Delete .DS_Store --- .DS_Store | Bin 6148 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .DS_Store diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index d60892a0030bc22c309a450999a86e0b12e29b2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKOHRWu5Pfb7{je!JHb^-^C2kO^cEN%TT!6NzqC!YeTO^j*BhJEIkdWXgtl*7p zs>Y#PgwTxSdH%c^+s{%Q12Dt;zpxYB*!|a5V;%!`lk6pCLC%kWwaCk>U=FrO6T|qIgK^;;k3GM1=)z&_%*^9wHvWZT{KLaUmJSm;RIduC0#yZ? zuGyFSf4uwsUk%chDxeDdD+NqzbU7MwOa5-HZBFjmh~ Date: Wed, 9 Apr 2025 16:07:56 +0400 Subject: [PATCH 4/6] Update .gitignore --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 7330ec1..6955970 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ /scripts/node_modules /target -.idea \ No newline at end of file +.idea +.DS_Store \ No newline at end of file From 938b9536ab9644367f4cf40331eb6a584fbe998e Mon Sep 17 00:00:00 2001 From: Daniel Hougaard Date: Wed, 9 Apr 2025 16:09:08 +0400 Subject: [PATCH 5/6] fix: tests failing --- .../java/com/infisical/sdk/InfisicalSdkTest.java | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/test/java/com/infisical/sdk/InfisicalSdkTest.java b/src/test/java/com/infisical/sdk/InfisicalSdkTest.java index 469f8ec..9433453 100644 --- a/src/test/java/com/infisical/sdk/InfisicalSdkTest.java +++ b/src/test/java/com/infisical/sdk/InfisicalSdkTest.java @@ -1,17 +1,15 @@ package com.infisical.sdk; -import com.infisical.sdk.util.EnvironmentVariables; -import com.infisical.sdk.util.InfisicalException; - -import com.infisical.sdk.util.RandomUtil; -import org.junit.jupiter.api.*; -import com.infisical.sdk.config.SdkConfig; - import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; - +import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.infisical.sdk.config.SdkConfig; +import com.infisical.sdk.util.EnvironmentVariables; +import com.infisical.sdk.util.InfisicalException; +import com.infisical.sdk.util.RandomUtil; + public class InfisicalSdkTest { private static final Logger logger = LoggerFactory.getLogger(InfisicalSdkTest.class); @@ -33,7 +31,7 @@ public void TestListSecrets() { }); try { - var secrets = sdk.Secrets().ListSecrets(envVars.getProjectId(), "dev", "/", false, false, false); + var secrets = sdk.Secrets().ListSecrets(envVars.getProjectId(), "dev", "/", false, false, false, false); logger.info("Secrets length {}", secrets.size()); } catch (InfisicalException e) { From fa162111514606bafcc05af852f2f587ae314efe Mon Sep 17 00:00:00 2001 From: Daniel Hougaard Date: Wed, 9 Apr 2025 16:23:44 +0400 Subject: [PATCH 6/6] fix: overload ListSecrets to avoid breaking changes --- .../sdk/resources/SecretsClient.java | 182 ++++++++++-------- 1 file changed, 100 insertions(+), 82 deletions(-) diff --git a/src/main/java/com/infisical/sdk/resources/SecretsClient.java b/src/main/java/com/infisical/sdk/resources/SecretsClient.java index 72b7854..3dbc8ec 100644 --- a/src/main/java/com/infisical/sdk/resources/SecretsClient.java +++ b/src/main/java/com/infisical/sdk/resources/SecretsClient.java @@ -1,110 +1,128 @@ package com.infisical.sdk.resources; -import com.infisical.sdk.api.QueryBuilder; -import com.infisical.sdk.models.*; - -import com.infisical.sdk.util.Helper; +import java.util.List; import com.infisical.sdk.api.ApiClient; +import com.infisical.sdk.api.QueryBuilder; +import com.infisical.sdk.models.CreateSecretInput; +import com.infisical.sdk.models.DeleteSecretInput; +import com.infisical.sdk.models.ListSecretsResponse; +import com.infisical.sdk.models.Secret; +import com.infisical.sdk.models.SingleSecretResponse; +import com.infisical.sdk.models.UpdateSecretInput; +import com.infisical.sdk.util.Helper; import com.infisical.sdk.util.InfisicalException; -import java.util.List; public class SecretsClient { - private final ApiClient httpClient; - - public SecretsClient(ApiClient apiClient) { - this.httpClient = apiClient; + private final ApiClient httpClient; + + public SecretsClient(ApiClient apiClient) { + this.httpClient = apiClient; + } + + // Overload to avoid breaking changes for new setSecretsOnSystemProperties + // parameter + public List ListSecrets(String projectId, String environmentSlug, String secretPath, + Boolean expandSecretReferences, Boolean recursive, Boolean includeImports) throws InfisicalException { + return ListSecrets(projectId, environmentSlug, secretPath, expandSecretReferences, recursive, includeImports, + false); + } + + public List ListSecrets(String projectId, String environmentSlug, String secretPath, + Boolean expandSecretReferences, Boolean recursive, Boolean includeImports, Boolean setSecretsOnSystemProperties) + throws InfisicalException { + var url = String.format("%s%s", this.httpClient.GetBaseUrl(), "/api/v3/secrets/raw"); + + var queryParameters = new QueryBuilder() + .add("workspaceId", projectId) + .add("environment", environmentSlug) + .add("secretPath", secretPath) + .add("expandSecretReferences", Helper.booleanToString(expandSecretReferences)) + .add("recursive", Helper.booleanToString(recursive)) + .add("includeImports", Helper.booleanToString(includeImports)) + .build(); + + var listSecrets = this.httpClient.get(url, queryParameters, ListSecretsResponse.class); + + if (setSecretsOnSystemProperties) { + for (Secret secret : listSecrets.getSecrets()) { + System.setProperty(secret.getSecretKey(), secret.getSecretValue()); + } } - public List ListSecrets(String projectId, String environmentSlug, String secretPath, Boolean expandSecretReferences, Boolean recursive, Boolean includeImports, Boolean setSecretsOnSystemProperties) throws InfisicalException { - var url = String.format("%s%s", this.httpClient.GetBaseUrl(), "/api/v3/secrets/raw"); + return listSecrets.getSecrets(); + } - var queryParameters = new QueryBuilder() - .add("workspaceId", projectId) - .add("environment", environmentSlug) - .add("secretPath", secretPath) - .add("expandSecretReferences", Helper.booleanToString(expandSecretReferences)) - .add("recursive", Helper.booleanToString(recursive)) - .add("includeImports", Helper.booleanToString(includeImports)) - .build(); + public Secret GetSecret(String secretName, String projectId, String environmentSlug, String secretPath, + Boolean expandSecretReferences, Boolean includeImports, String secretType) throws InfisicalException { + var url = String.format("%s%s", this.httpClient.GetBaseUrl(), String.format("/api/v3/secrets/raw/%s", secretName)); - var listSecrets = this.httpClient.get(url, queryParameters, ListSecretsResponse.class); + var queryParameters = new QueryBuilder() + .add("workspaceId", projectId) + .add("environment", environmentSlug) + .add("secretPath", secretPath) + .add("expandSecretReferences", Helper.booleanToString(expandSecretReferences)) + .add("includeImports", Helper.booleanToString(includeImports)) + .add("type", secretType) + .build(); - if (setSecretsOnSystemProperties) { - for (Secret secret : listSecrets.getSecrets()) { - System.setProperty(secret.getSecretKey(), secret.getSecretValue()); - } - } + var result = this.httpClient.get(url, queryParameters, SingleSecretResponse.class); - return listSecrets.getSecrets(); - } + return result.getSecret(); + } - public Secret GetSecret(String secretName, String projectId, String environmentSlug, String secretPath, Boolean expandSecretReferences, Boolean includeImports, String secretType) throws InfisicalException { - var url = String.format("%s%s", this.httpClient.GetBaseUrl(), String.format("/api/v3/secrets/raw/%s", secretName)); + public Secret UpdateSecret(String secretName, String projectId, String environmentSlug, String secretPath, + String newSecretValue, String newSecretName) throws InfisicalException { + var url = String.format("%s%s", this.httpClient.GetBaseUrl(), String.format("/api/v3/secrets/raw/%s", secretName)); - var queryParameters = new QueryBuilder() - .add("workspaceId", projectId) - .add("environment", environmentSlug) - .add("secretPath", secretPath) - .add("expandSecretReferences", Helper.booleanToString(expandSecretReferences)) - .add("includeImports", Helper.booleanToString(includeImports)) - .add("type", secretType) - .build(); + var inputBuilder = UpdateSecretInput.builder() + .secretPath(secretPath) + .projectId(projectId) + .environmentSlug(environmentSlug) + .newSecretName(newSecretName) + .secretValue(newSecretValue); - var result = this.httpClient.get(url, queryParameters, SingleSecretResponse.class); + if (newSecretName != null) + inputBuilder.newSecretName(newSecretName); + if (newSecretName != null) + inputBuilder.secretValue(newSecretValue); - return result.getSecret(); - } + var requestInput = inputBuilder.build(); - public Secret UpdateSecret(String secretName, String projectId, String environmentSlug, String secretPath, String newSecretValue, String newSecretName) throws InfisicalException { - var url = String.format("%s%s", this.httpClient.GetBaseUrl(), String.format("/api/v3/secrets/raw/%s", secretName)); + var result = this.httpClient.patch(url, requestInput, SingleSecretResponse.class); - var inputBuilder = UpdateSecretInput.builder() - .secretPath(secretPath) - .projectId(projectId) - .environmentSlug(environmentSlug) - .newSecretName(newSecretName) - .secretValue(newSecretValue); + return result.getSecret(); + } - if (newSecretName != null) inputBuilder.newSecretName(newSecretName); - if (newSecretName != null) inputBuilder.secretValue(newSecretValue); + public Secret CreateSecret(String secretName, String secretValue, String projectId, String environmentSlug, + String secretPath) throws InfisicalException { + var url = String.format("%s%s", this.httpClient.GetBaseUrl(), String.format("/api/v3/secrets/raw/%s", secretName)); - var requestInput = inputBuilder.build(); + var createSecretInput = CreateSecretInput.builder() + .secretPath(secretPath) + .projectId(projectId) + .environmentSlug(environmentSlug) + .secretValue(secretValue) + .build(); + createSecretInput.setSecretValue(!secretValue.isEmpty() ? secretValue : ""); - var result = this.httpClient.patch(url, requestInput, SingleSecretResponse.class); + var result = this.httpClient.post(url, createSecretInput, SingleSecretResponse.class); - return result.getSecret(); - } - - - public Secret CreateSecret(String secretName, String secretValue, String projectId, String environmentSlug, String secretPath) throws InfisicalException { - var url = String.format("%s%s", this.httpClient.GetBaseUrl(), String.format("/api/v3/secrets/raw/%s", secretName)); + return result.getSecret(); + } - var createSecretInput = CreateSecretInput.builder() - .secretPath(secretPath) - .projectId(projectId) - .environmentSlug(environmentSlug) - .secretValue(secretValue) - .build(); + public Secret DeleteSecret(String secretName, String projectId, String environmentSlug, String secretPath) + throws InfisicalException { + var url = String.format("%s%s", this.httpClient.GetBaseUrl(), String.format("/api/v3/secrets/raw/%s", secretName)); - createSecretInput.setSecretValue(!secretValue.isEmpty() ? secretValue : ""); + var deleteSecretInput = DeleteSecretInput.builder() + .secretPath(secretPath) + .projectId(projectId) + .environmentSlug(environmentSlug) + .build(); - var result = this.httpClient.post(url, createSecretInput, SingleSecretResponse.class); - - return result.getSecret(); - } - - public Secret DeleteSecret(String secretName, String projectId, String environmentSlug, String secretPath) throws InfisicalException { - var url = String.format("%s%s", this.httpClient.GetBaseUrl(), String.format("/api/v3/secrets/raw/%s", secretName)); - - var deleteSecretInput = DeleteSecretInput.builder() - .secretPath(secretPath) - .projectId(projectId) - .environmentSlug(environmentSlug) - .build(); - - var result = this.httpClient.delete(url, deleteSecretInput, SingleSecretResponse.class); - return result.getSecret(); - } + var result = this.httpClient.delete(url, deleteSecretInput, SingleSecretResponse.class); + return result.getSecret(); + } } \ No newline at end of file