From 580529b1c35eb53ef06e0f8688a0d3c83c93932b Mon Sep 17 00:00:00 2001 From: Fang-Pen Lin Date: Wed, 15 Oct 2025 18:15:55 -0700 Subject: [PATCH 1/6] Add google java format docker compose and update README about it --- README.md | 11 ++++++++++- compose.yaml | 15 +++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 compose.yaml diff --git a/README.md b/README.md index 9b87073..4f1361b 100644 --- a/README.md +++ b/README.md @@ -37,4 +37,13 @@ Please do not file GitHub issues or post on our public forum for security vulner Infisical takes security issues very seriously. If you have any concerns about Infisical or believe you have uncovered a vulnerability, please get in touch via the e-mail address security@infisical.com. In the message, try to provide a description of the issue and ideally a way of reproducing it. The security team will get back to you as soon as possible. -Note that this security address should be used only for undisclosed vulnerabilities. Please report any security problems to us before disclosing it publicly. \ No newline at end of file +Note that this security address should be used only for undisclosed vulnerabilities. Please report any security problems to us before disclosing it publicly. + +## Code style + +The Java code in this project should be formatted with [google-java-format](https://github.com/google/google-java-format). +To run it for all the Java files in the project, use the following command: + +```bash +docker-compose run format +``` diff --git a/compose.yaml b/compose.yaml new file mode 100644 index 0000000..102de74 --- /dev/null +++ b/compose.yaml @@ -0,0 +1,15 @@ +version: '3.8' + +services: + format: + image: cimg/openjdk:21.0 + volumes: + - .:/app + working_dir: /app + environment: + - GOOGLE_JAVA_FORMAT_VERSION=1.30.0 + command: > + bash -c ' + curl -sSL https://github.com/google/google-java-format/releases/download/v${GOOGLE_JAVA_FORMAT_VERSION}/google-java-format-${GOOGLE_JAVA_FORMAT_VERSION}-all-deps.jar -o /tmp/google-java-format.jar && + java -jar /tmp/google-java-format.jar --replace $(find . -type f -name "*.java") + ' \ No newline at end of file From 30da363885ffa375fbdfb8a3a59181061ee4330c Mon Sep 17 00:00:00 2001 From: Fang-Pen Lin Date: Wed, 15 Oct 2025 18:16:28 -0700 Subject: [PATCH 2/6] Format code --- .../java/com/infisical/sdk/InfisicalSdk.java | 31 +- .../java/com/infisical/sdk/api/ApiClient.java | 341 +++++++++--------- .../com/infisical/sdk/api/QueryBuilder.java | 20 +- .../com/infisical/sdk/config/SdkConfig.java | 2 +- .../com/infisical/sdk/models/Approval.java | 52 ++- .../sdk/models/CreateFolderInput.java | 4 +- .../sdk/models/CreateSecretInput.java | 19 +- .../sdk/models/DeleteFolderInput.java | 5 +- .../sdk/models/DeleteSecretInput.java | 15 +- .../java/com/infisical/sdk/models/Folder.java | 1 - .../sdk/models/LdapAuthLoginInput.java | 33 +- .../sdk/models/ListFoldersInput.java | 6 +- .../sdk/models/ListFoldersResponse.java | 5 +- .../sdk/models/ListSecretsResponse.java | 14 +- .../sdk/models/MachineIdentityCredential.java | 22 +- .../java/com/infisical/sdk/models/Secret.java | 48 ++- .../sdk/models/SingleFolderResponse.java | 2 +- .../sdk/models/SingleSecretResponse.java | 13 +- .../java/com/infisical/sdk/models/Tag.java | 21 +- .../sdk/models/UniversalAuthLoginInput.java | 7 +- .../sdk/models/UpdateFolderInput.java | 6 +- .../sdk/models/UpdateSecretInput.java | 23 +- .../sdk/resources/FoldersClient.java | 29 +- .../sdk/resources/SecretsClient.java | 173 +++++---- .../java/com/infisical/sdk/util/Helper.java | 19 +- .../sdk/util/InfisicalException.java | 37 +- .../sdk/util/ObjectToMapConverter.java | 66 ++-- .../com/infisical/sdk/InfisicalSdkTest.java | 219 ++++++----- .../sdk/auth/AwsAuthProviderTest.java | 4 +- .../sdk/util/EnvironmentVariables.java | 68 ++-- .../com/infisical/sdk/util/RandomUtil.java | 25 +- 31 files changed, 672 insertions(+), 658 deletions(-) diff --git a/src/main/java/com/infisical/sdk/InfisicalSdk.java b/src/main/java/com/infisical/sdk/InfisicalSdk.java index bd95b1e..b01228f 100644 --- a/src/main/java/com/infisical/sdk/InfisicalSdk.java +++ b/src/main/java/com/infisical/sdk/InfisicalSdk.java @@ -5,40 +5,39 @@ import com.infisical.sdk.resources.AuthClient; import com.infisical.sdk.resources.FoldersClient; import com.infisical.sdk.resources.SecretsClient; -import com.squareup.okhttp.OkHttpClient; -import com.squareup.okhttp.Request; - public class InfisicalSdk { - private SecretsClient secretsClient; - private FoldersClient foldersClient; - private AuthClient authClient; + private SecretsClient secretsClient; + private FoldersClient foldersClient; + private AuthClient authClient; - private ApiClient apiClient; + private ApiClient apiClient; public InfisicalSdk(SdkConfig config) { - this.apiClient = new ApiClient(config.getSiteUrl(), null); + this.apiClient = new ApiClient(config.getSiteUrl(), null); this.authClient = new AuthClient(apiClient, this::onAuthenticate); this.secretsClient = new SecretsClient(apiClient); } private void onAuthenticate(String accessToken) { - this.apiClient = new ApiClient(apiClient.GetBaseUrl(), accessToken); + this.apiClient = new ApiClient(apiClient.GetBaseUrl(), accessToken); - this.secretsClient = new SecretsClient(apiClient); - this.foldersClient = new FoldersClient(apiClient); - this.authClient = new AuthClient(apiClient, this::onAuthenticate); + this.secretsClient = new SecretsClient(apiClient); + this.foldersClient = new FoldersClient(apiClient); + this.authClient = new AuthClient(apiClient, this::onAuthenticate); } public AuthClient Auth() { - return this.authClient; + return this.authClient; } + public SecretsClient Secrets() { - return this.secretsClient; + return this.secretsClient; } + public FoldersClient Folders() { - return this.foldersClient; + return this.foldersClient; } -} \ No newline at end of file +} diff --git a/src/main/java/com/infisical/sdk/api/ApiClient.java b/src/main/java/com/infisical/sdk/api/ApiClient.java index ae73e3e..7969360 100644 --- a/src/main/java/com/infisical/sdk/api/ApiClient.java +++ b/src/main/java/com/infisical/sdk/api/ApiClient.java @@ -3,212 +3,213 @@ import com.google.gson.Gson; import com.infisical.sdk.util.InfisicalException; import com.squareup.okhttp.*; - import java.io.IOException; import java.util.Map; public class ApiClient { - private final OkHttpClient client; - - private String accessToken; - private String baseUrl; + private final OkHttpClient client; - private static final MediaType JSON = MediaType.parse("application/json; charset=utf-8"); + private String accessToken; + private String baseUrl; - public ApiClient(String baseUrl, String accessToken) { - this.client = new OkHttpClient(); - this.baseUrl = baseUrl; + private static final MediaType JSON = MediaType.parse("application/json; charset=utf-8"); - if (accessToken != null) { - this.accessToken = accessToken; - } + public ApiClient(String baseUrl, String accessToken) { + this.client = new OkHttpClient(); + this.baseUrl = baseUrl; - this.formatBaseUrl(); + if (accessToken != null) { + this.accessToken = accessToken; } - private void formatBaseUrl() { - // Remove trailing slash if present - if (this.baseUrl.endsWith("/")) { - this.baseUrl = this.baseUrl.substring(0, this.baseUrl.length() - 1); - } - - // Check if URL starts with protocol - if (!this.baseUrl.matches("^[a-zA-Z]+://.*")) { - this.baseUrl = "http://" + this.baseUrl; - } + this.formatBaseUrl(); + } - // Add /api if not present - if (this.baseUrl.endsWith("/api")) { - this.baseUrl = this.baseUrl.substring(0, this.baseUrl.length() - 4); - } + private void formatBaseUrl() { + // Remove trailing slash if present + if (this.baseUrl.endsWith("/")) { + this.baseUrl = this.baseUrl.substring(0, this.baseUrl.length() - 1); } - public String GetBaseUrl(){ - return this.baseUrl; + // Check if URL starts with protocol + if (!this.baseUrl.matches("^[a-zA-Z]+://.*")) { + this.baseUrl = "http://" + this.baseUrl; } - @SuppressWarnings(value = "lombok") - public OkHttpClient getClient() { - return this.client; + // Add /api if not present + if (this.baseUrl.endsWith("/api")) { + this.baseUrl = this.baseUrl.substring(0, this.baseUrl.length() - 4); } + } - private String formatErrorMessage(Response response) throws IOException { - String message = String.format("Unexpected response: %s", response); + public String GetBaseUrl() { + return this.baseUrl; + } - try (ResponseBody errorBody = response.body()) { - if (errorBody != null) { - String bodyString = errorBody.string(); - if (!bodyString.isEmpty()) { - message += String.format(" - %s", bodyString); - } - } - } + @SuppressWarnings(value = "lombok") + public OkHttpClient getClient() { + return this.client; + } - return message; - } + private String formatErrorMessage(Response response) throws IOException { + String message = String.format("Unexpected response: %s", response); - public R post(String url, T requestBody, Class responseType) throws InfisicalException { - try { - // convert request to json - var gson = new Gson(); - String jsonBody = gson.toJson(requestBody); - - // Build request - var requestBuilder = new Request.Builder() - .url(url) - .post(RequestBody.create(JSON, jsonBody)) - .header("Accept", "application/json"); - - - if (this.accessToken != null && !this.accessToken.isEmpty()) { - requestBuilder.addHeader("Authorization", "Bearer " + this.accessToken); - } - var request = requestBuilder.build(); - - Response response = client.newCall(request).execute(); - try (ResponseBody responseBody = response.body()) { - if (!response.isSuccessful()) { - throw new IOException(this.formatErrorMessage(response)); - } - - if (responseBody == null) { - throw new IOException("Response body is null"); - } - - String responseJson = responseBody.string(); - return gson.fromJson(responseJson, responseType); - } - } catch (IOException e) { - throw new InfisicalException(e); + try (ResponseBody errorBody = response.body()) { + if (errorBody != null) { + String bodyString = errorBody.string(); + if (!bodyString.isEmpty()) { + message += String.format(" - %s", bodyString); } + } } - public R get(String baseUrl, Map queryParams, Class responseType) throws InfisicalException { - try { - HttpUrl.Builder urlBuilder = HttpUrl.parse(baseUrl).newBuilder(); + return message; + } + + public R post(String url, T requestBody, Class responseType) throws InfisicalException { + try { + // convert request to json + var gson = new Gson(); + String jsonBody = gson.toJson(requestBody); + + // Build request + var requestBuilder = + new Request.Builder() + .url(url) + .post(RequestBody.create(JSON, jsonBody)) + .header("Accept", "application/json"); + + if (this.accessToken != null && !this.accessToken.isEmpty()) { + requestBuilder.addHeader("Authorization", "Bearer " + this.accessToken); + } + var request = requestBuilder.build(); + + Response response = client.newCall(request).execute(); + try (ResponseBody responseBody = response.body()) { + if (!response.isSuccessful()) { + throw new IOException(this.formatErrorMessage(response)); + } - if (queryParams != null) { - queryParams.forEach(urlBuilder::addQueryParameter); - } + if (responseBody == null) { + throw new IOException("Response body is null"); + } - var requestBuilder = new Request.Builder() - .url(urlBuilder.build()) - .get() - .header("Accept", "application/json"); + String responseJson = responseBody.string(); + return gson.fromJson(responseJson, responseType); + } + } catch (IOException e) { + throw new InfisicalException(e); + } + } - if (this.accessToken != null && !this.accessToken.isEmpty()) { - requestBuilder.addHeader("Authorization", "Bearer " + this.accessToken); - } + public R get(String baseUrl, Map queryParams, Class responseType) + throws InfisicalException { + try { + HttpUrl.Builder urlBuilder = HttpUrl.parse(baseUrl).newBuilder(); - var request = requestBuilder.build(); + if (queryParams != null) { + queryParams.forEach(urlBuilder::addQueryParameter); + } + var requestBuilder = + new Request.Builder().url(urlBuilder.build()).get().header("Accept", "application/json"); - Response response = client.newCall(request).execute(); - try (ResponseBody responseBody = response.body()) { - if (!response.isSuccessful()) { - throw new IOException(this.formatErrorMessage(response)); - } + if (this.accessToken != null && !this.accessToken.isEmpty()) { + requestBuilder.addHeader("Authorization", "Bearer " + this.accessToken); + } - if (responseBody == null) { - throw new IOException("Response body is null"); - } + var request = requestBuilder.build(); - var gson = new Gson(); - String responseJson = responseBody.string(); - return gson.fromJson(responseJson, responseType); - } - } catch (IOException e) { - throw new InfisicalException(e); + Response response = client.newCall(request).execute(); + try (ResponseBody responseBody = response.body()) { + if (!response.isSuccessful()) { + throw new IOException(this.formatErrorMessage(response)); } + + if (responseBody == null) { + throw new IOException("Response body is null"); + } + + var gson = new Gson(); + String responseJson = responseBody.string(); + return gson.fromJson(responseJson, responseType); + } + } catch (IOException e) { + throw new InfisicalException(e); } + } + + public R patch(String url, T requestBody, Class responseType) + throws InfisicalException { + try { + // convert request to json + var gson = new Gson(); + String jsonBody = gson.toJson(requestBody); + + // Build request + var requestBuilder = + new Request.Builder() + .url(url) + .patch(RequestBody.create(JSON, jsonBody)) + .header("Accept", "application/json"); + + if (this.accessToken != null && !this.accessToken.isEmpty()) { + requestBuilder.addHeader("Authorization", "Bearer " + this.accessToken); + } + var request = requestBuilder.build(); + + Response response = client.newCall(request).execute(); + try (ResponseBody responseBody = response.body()) { + if (!response.isSuccessful()) { + throw new IOException(this.formatErrorMessage(response)); + } - public R patch(String url, T requestBody, Class responseType) throws InfisicalException { - try { - // convert request to json - var gson = new Gson(); - String jsonBody = gson.toJson(requestBody); - - // Build request - var requestBuilder = new Request.Builder() - .url(url) - .patch(RequestBody.create(JSON, jsonBody)) - .header("Accept", "application/json"); - - if (this.accessToken != null && !this.accessToken.isEmpty()) { - requestBuilder.addHeader("Authorization", "Bearer " + this.accessToken); - } - var request = requestBuilder.build(); - - Response response = client.newCall(request).execute(); - try (ResponseBody responseBody = response.body()) { - if (!response.isSuccessful()) { - throw new IOException(this.formatErrorMessage(response)); - } - - if (responseBody == null) { - throw new IOException("Response body is null"); - } - - String responseJson = responseBody.string(); - return gson.fromJson(responseJson, responseType); - } - } catch (IOException e) { - throw new InfisicalException(e); + if (responseBody == null) { + throw new IOException("Response body is null"); } + + String responseJson = responseBody.string(); + return gson.fromJson(responseJson, responseType); + } + } catch (IOException e) { + throw new InfisicalException(e); } + } + + public R delete(String url, T requestBody, Class responseType) + throws InfisicalException { + try { + // convert request to json + var gson = new Gson(); + String jsonBody = gson.toJson(requestBody); + + // Build request + var requestBuilder = + new Request.Builder() + .url(url) + .delete(RequestBody.create(JSON, jsonBody)) + .header("Accept", "application/json"); + + if (this.accessToken != null && !this.accessToken.isEmpty()) { + requestBuilder.addHeader("Authorization", "Bearer " + this.accessToken); + } + var request = requestBuilder.build(); + + Response response = client.newCall(request).execute(); + try (ResponseBody responseBody = response.body()) { + if (!response.isSuccessful()) { + throw new IOException(this.formatErrorMessage(response)); + } - public R delete(String url, T requestBody, Class responseType) throws InfisicalException { - try { - // convert request to json - var gson = new Gson(); - String jsonBody = gson.toJson(requestBody); - - // Build request - var requestBuilder = new Request.Builder() - .url(url) - .delete(RequestBody.create(JSON, jsonBody)) - .header("Accept", "application/json"); - - if (this.accessToken != null && !this.accessToken.isEmpty()) { - requestBuilder.addHeader("Authorization", "Bearer " + this.accessToken); - } - var request = requestBuilder.build(); - - Response response = client.newCall(request).execute(); - try (ResponseBody responseBody = response.body()) { - if (!response.isSuccessful()) { - throw new IOException(this.formatErrorMessage(response)); - } - - if (responseBody == null) { - throw new IOException("Response body is null"); - } - - String responseJson = responseBody.string(); - return gson.fromJson(responseJson, responseType); - } - } catch (IOException e) { - throw new InfisicalException(e); + if (responseBody == null) { + throw new IOException("Response body is null"); } + + String responseJson = responseBody.string(); + return gson.fromJson(responseJson, responseType); + } + } catch (IOException e) { + throw new InfisicalException(e); } -} \ No newline at end of file + } +} diff --git a/src/main/java/com/infisical/sdk/api/QueryBuilder.java b/src/main/java/com/infisical/sdk/api/QueryBuilder.java index 9131a70..c01580c 100644 --- a/src/main/java/com/infisical/sdk/api/QueryBuilder.java +++ b/src/main/java/com/infisical/sdk/api/QueryBuilder.java @@ -4,16 +4,16 @@ import java.util.Map; public class QueryBuilder { - private final Map params = new HashMap<>(); + private final Map params = new HashMap<>(); - public QueryBuilder add(String key, Object value) { - if (value != null) { - params.put(key, value.toString()); - } - return this; + public QueryBuilder add(String key, Object value) { + if (value != null) { + params.put(key, value.toString()); } + return this; + } - public Map build() { - return params; - } -} \ No newline at end of file + public Map build() { + return params; + } +} diff --git a/src/main/java/com/infisical/sdk/config/SdkConfig.java b/src/main/java/com/infisical/sdk/config/SdkConfig.java index d3b78a3..965c4f2 100644 --- a/src/main/java/com/infisical/sdk/config/SdkConfig.java +++ b/src/main/java/com/infisical/sdk/config/SdkConfig.java @@ -27,4 +27,4 @@ public SdkConfig build() { return new SdkConfig(this); } } -} \ No newline at end of file +} diff --git a/src/main/java/com/infisical/sdk/models/Approval.java b/src/main/java/com/infisical/sdk/models/Approval.java index 381daf3..f4e715d 100644 --- a/src/main/java/com/infisical/sdk/models/Approval.java +++ b/src/main/java/com/infisical/sdk/models/Approval.java @@ -1,46 +1,44 @@ package com.infisical.sdk.models; - - import com.google.gson.annotations.SerializedName; import lombok.Data; // Currently not supported for identities @Data public class Approval { - @SerializedName("id") - private String id; + @SerializedName("id") + private String id; - @SerializedName("policyId") - private String policyId; + @SerializedName("policyId") + private String policyId; - @SerializedName("hasMerged") - private boolean hasMerged; + @SerializedName("hasMerged") + private boolean hasMerged; - @SerializedName("status") - private String status; + @SerializedName("status") + private String status; - @SerializedName("slug") - private String slug; + @SerializedName("slug") + private String slug; - @SerializedName("folderId") - private String folderId; + @SerializedName("folderId") + private String folderId; - @SerializedName("createdAt") - private String createdAt; + @SerializedName("createdAt") + private String createdAt; - @SerializedName("updatedAt") - private String updatedAt; + @SerializedName("updatedAt") + private String updatedAt; - @SerializedName("isReplicated") - private boolean isReplicated; + @SerializedName("isReplicated") + private boolean isReplicated; - @SerializedName("committerUserId") - private String committerUserId; + @SerializedName("committerUserId") + private String committerUserId; - @SerializedName("statusChangedByUserId") - private String statusChangedByUserId; + @SerializedName("statusChangedByUserId") + private String statusChangedByUserId; - @SerializedName("bypassReason") - private String bypassReason; -} \ No newline at end of file + @SerializedName("bypassReason") + private String bypassReason; +} diff --git a/src/main/java/com/infisical/sdk/models/CreateFolderInput.java b/src/main/java/com/infisical/sdk/models/CreateFolderInput.java index 76ebd74..23190b1 100644 --- a/src/main/java/com/infisical/sdk/models/CreateFolderInput.java +++ b/src/main/java/com/infisical/sdk/models/CreateFolderInput.java @@ -1,7 +1,6 @@ package com.infisical.sdk.models; import com.google.gson.annotations.SerializedName; - import com.infisical.sdk.util.Helper; import lombok.Builder; import lombok.Data; @@ -43,5 +42,4 @@ public String validate() { return null; } - -} \ No newline at end of file +} diff --git a/src/main/java/com/infisical/sdk/models/CreateSecretInput.java b/src/main/java/com/infisical/sdk/models/CreateSecretInput.java index e8c9b8d..999d5c9 100644 --- a/src/main/java/com/infisical/sdk/models/CreateSecretInput.java +++ b/src/main/java/com/infisical/sdk/models/CreateSecretInput.java @@ -1,6 +1,5 @@ package com.infisical.sdk.models; - import com.google.gson.annotations.SerializedName; import lombok.Builder; import lombok.Data; @@ -8,15 +7,15 @@ @Data @Builder public class CreateSecretInput { - @SerializedName("environment") - private String environmentSlug; + @SerializedName("environment") + private String environmentSlug; - @SerializedName("workspaceId") - private String projectId; + @SerializedName("workspaceId") + private String projectId; - @SerializedName("secretPath") - private String secretPath; + @SerializedName("secretPath") + private String secretPath; - @SerializedName("secretValue") - private String secretValue; -} \ No newline at end of file + @SerializedName("secretValue") + private String secretValue; +} diff --git a/src/main/java/com/infisical/sdk/models/DeleteFolderInput.java b/src/main/java/com/infisical/sdk/models/DeleteFolderInput.java index 238079d..a31371e 100644 --- a/src/main/java/com/infisical/sdk/models/DeleteFolderInput.java +++ b/src/main/java/com/infisical/sdk/models/DeleteFolderInput.java @@ -18,7 +18,8 @@ public class DeleteFolderInput { private String folderId; @SerializedName("path") - @Builder.Default private String folderPath = "/"; + @Builder.Default + private String folderPath = "/"; public String validate() { if (Helper.isNullOrEmpty(projectId)) { @@ -39,4 +40,4 @@ public String validate() { return null; } -} \ No newline at end of file +} diff --git a/src/main/java/com/infisical/sdk/models/DeleteSecretInput.java b/src/main/java/com/infisical/sdk/models/DeleteSecretInput.java index 5d95649..041c0bb 100644 --- a/src/main/java/com/infisical/sdk/models/DeleteSecretInput.java +++ b/src/main/java/com/infisical/sdk/models/DeleteSecretInput.java @@ -1,6 +1,5 @@ package com.infisical.sdk.models; - import com.google.gson.annotations.SerializedName; import lombok.Builder; import lombok.Data; @@ -8,12 +7,12 @@ @Data @Builder public class DeleteSecretInput { - @SerializedName("environment") - private String environmentSlug; + @SerializedName("environment") + private String environmentSlug; - @SerializedName("workspaceId") - private String projectId; + @SerializedName("workspaceId") + private String projectId; - @SerializedName("secretPath") - private String secretPath; -} \ No newline at end of file + @SerializedName("secretPath") + private String secretPath; +} diff --git a/src/main/java/com/infisical/sdk/models/Folder.java b/src/main/java/com/infisical/sdk/models/Folder.java index a56e750..102ed7d 100644 --- a/src/main/java/com/infisical/sdk/models/Folder.java +++ b/src/main/java/com/infisical/sdk/models/Folder.java @@ -34,5 +34,4 @@ public class Folder { @SerializedName("lastSecretModified") private String lastSecretModified; - } diff --git a/src/main/java/com/infisical/sdk/models/LdapAuthLoginInput.java b/src/main/java/com/infisical/sdk/models/LdapAuthLoginInput.java index c984272..00ca415 100644 --- a/src/main/java/com/infisical/sdk/models/LdapAuthLoginInput.java +++ b/src/main/java/com/infisical/sdk/models/LdapAuthLoginInput.java @@ -1,6 +1,5 @@ package com.infisical.sdk.models; - import com.infisical.sdk.util.Helper; import lombok.Builder; import lombok.Data; @@ -8,23 +7,23 @@ @Data @Builder public class LdapAuthLoginInput { - private String identityId; - private String username; - private String password; - - public String validate() { - if (Helper.isNullOrEmpty(identityId)) { - return "Identity ID is required"; - } + private String identityId; + private String username; + private String password; - if (Helper.isNullOrEmpty(username)) { - return "Username is required"; - } + public String validate() { + if (Helper.isNullOrEmpty(identityId)) { + return "Identity ID is required"; + } - if (Helper.isNullOrEmpty(password)) { - return "Password is required"; - } + if (Helper.isNullOrEmpty(username)) { + return "Username is required"; + } - return null; + if (Helper.isNullOrEmpty(password)) { + return "Password is required"; } -} \ No newline at end of file + + return null; + } +} diff --git a/src/main/java/com/infisical/sdk/models/ListFoldersInput.java b/src/main/java/com/infisical/sdk/models/ListFoldersInput.java index ad02f09..94b39e4 100644 --- a/src/main/java/com/infisical/sdk/models/ListFoldersInput.java +++ b/src/main/java/com/infisical/sdk/models/ListFoldersInput.java @@ -1,7 +1,6 @@ package com.infisical.sdk.models; import com.google.gson.annotations.SerializedName; - import com.infisical.sdk.util.Helper; import lombok.Builder; import lombok.Data; @@ -16,7 +15,8 @@ public class ListFoldersInput { private String environmentSlug; @SerializedName("path") - @Builder.Default private String folderPath = "/"; + @Builder.Default + private String folderPath = "/"; @SerializedName("recursive") private Boolean recursive; @@ -36,4 +36,4 @@ public String validate() { return null; } -} \ No newline at end of file +} diff --git a/src/main/java/com/infisical/sdk/models/ListFoldersResponse.java b/src/main/java/com/infisical/sdk/models/ListFoldersResponse.java index 3a242f2..4545a75 100644 --- a/src/main/java/com/infisical/sdk/models/ListFoldersResponse.java +++ b/src/main/java/com/infisical/sdk/models/ListFoldersResponse.java @@ -1,8 +1,7 @@ package com.infisical.sdk.models; -import java.util.List; - import com.google.gson.annotations.SerializedName; +import java.util.List; public class ListFoldersResponse { @SerializedName("folders") @@ -11,4 +10,4 @@ public class ListFoldersResponse { public List getFolders() { return folders; } -} \ No newline at end of file +} diff --git a/src/main/java/com/infisical/sdk/models/ListSecretsResponse.java b/src/main/java/com/infisical/sdk/models/ListSecretsResponse.java index 29a5dfb..eac9109 100644 --- a/src/main/java/com/infisical/sdk/models/ListSecretsResponse.java +++ b/src/main/java/com/infisical/sdk/models/ListSecretsResponse.java @@ -1,15 +1,13 @@ package com.infisical.sdk.models; - import com.google.gson.annotations.SerializedName; - import java.util.List; public class ListSecretsResponse { - @SerializedName("secrets") - private List secrets; + @SerializedName("secrets") + private List secrets; - public List getSecrets() { - return secrets; - } -} \ No newline at end of file + public List getSecrets() { + return secrets; + } +} diff --git a/src/main/java/com/infisical/sdk/models/MachineIdentityCredential.java b/src/main/java/com/infisical/sdk/models/MachineIdentityCredential.java index 9491e99..2c4c4be 100644 --- a/src/main/java/com/infisical/sdk/models/MachineIdentityCredential.java +++ b/src/main/java/com/infisical/sdk/models/MachineIdentityCredential.java @@ -1,23 +1,21 @@ package com.infisical.sdk.models; - import com.google.gson.annotations.SerializedName; -import lombok.Data; - import java.math.BigDecimal; +import lombok.Data; @Data public class MachineIdentityCredential { - @SerializedName("accessToken") - private String accessToken = null; + @SerializedName("accessToken") + private String accessToken = null; - @SerializedName("expiresIn") - private BigDecimal expiresIn = null; + @SerializedName("expiresIn") + private BigDecimal expiresIn = null; - @SerializedName("accessTokenMaxTTL") - private BigDecimal accessTokenMaxTTL = null; + @SerializedName("accessTokenMaxTTL") + private BigDecimal accessTokenMaxTTL = null; - @SerializedName("tokenType") - private String tokenType = null; -} \ No newline at end of file + @SerializedName("tokenType") + private String tokenType = null; +} diff --git a/src/main/java/com/infisical/sdk/models/Secret.java b/src/main/java/com/infisical/sdk/models/Secret.java index bd97219..d806e34 100644 --- a/src/main/java/com/infisical/sdk/models/Secret.java +++ b/src/main/java/com/infisical/sdk/models/Secret.java @@ -1,42 +1,40 @@ package com.infisical.sdk.models; - - import com.google.gson.annotations.SerializedName; import lombok.Data; @Data public class Secret { - @SerializedName("id") - private String id; + @SerializedName("id") + private String id; - @SerializedName("workspace") - private String projectId; + @SerializedName("workspace") + private String projectId; - @SerializedName("environment") - private String environment; + @SerializedName("environment") + private String environment; - @SerializedName("version") - private String version; + @SerializedName("version") + private String version; - @SerializedName("type") - private String type; + @SerializedName("type") + private String type; - @SerializedName("secretKey") - private String secretKey; + @SerializedName("secretKey") + private String secretKey; - @SerializedName("secretValue") - private String secretValue; + @SerializedName("secretValue") + private String secretValue; - @SerializedName("secretComment") - private String secretComment; + @SerializedName("secretComment") + private String secretComment; - @SerializedName("createdAt") - private String createdAt; + @SerializedName("createdAt") + private String createdAt; - @SerializedName("updatedAt") - private String updatedAt; + @SerializedName("updatedAt") + private String updatedAt; - @SerializedName("secretPath") - private String secretPath; -} \ No newline at end of file + @SerializedName("secretPath") + private String secretPath; +} diff --git a/src/main/java/com/infisical/sdk/models/SingleFolderResponse.java b/src/main/java/com/infisical/sdk/models/SingleFolderResponse.java index 9854190..211a272 100644 --- a/src/main/java/com/infisical/sdk/models/SingleFolderResponse.java +++ b/src/main/java/com/infisical/sdk/models/SingleFolderResponse.java @@ -9,4 +9,4 @@ public class SingleFolderResponse { public Folder getFolder() { return folder; } -} \ No newline at end of file +} diff --git a/src/main/java/com/infisical/sdk/models/SingleSecretResponse.java b/src/main/java/com/infisical/sdk/models/SingleSecretResponse.java index 80e4e01..ffb7128 100644 --- a/src/main/java/com/infisical/sdk/models/SingleSecretResponse.java +++ b/src/main/java/com/infisical/sdk/models/SingleSecretResponse.java @@ -1,16 +1,13 @@ package com.infisical.sdk.models; - import com.google.gson.annotations.SerializedName; import lombok.Getter; @Getter public class SingleSecretResponse { - @SerializedName("secret") - private Secret secret; - - - @SerializedName("approval") - private Approval approval; + @SerializedName("secret") + private Secret secret; -} \ No newline at end of file + @SerializedName("approval") + private Approval approval; +} diff --git a/src/main/java/com/infisical/sdk/models/Tag.java b/src/main/java/com/infisical/sdk/models/Tag.java index cd1f03b..ee81889 100644 --- a/src/main/java/com/infisical/sdk/models/Tag.java +++ b/src/main/java/com/infisical/sdk/models/Tag.java @@ -1,22 +1,19 @@ package com.infisical.sdk.models; - - import com.google.gson.annotations.SerializedName; import lombok.Data; @Data public class Tag { - @SerializedName("id") - private String id; - - @SerializedName("slug") - private String slug; + @SerializedName("id") + private String id; - @SerializedName("color") - private String color; + @SerializedName("slug") + private String slug; - @SerializedName("name") - private String name; + @SerializedName("color") + private String color; -} \ No newline at end of file + @SerializedName("name") + private String name; +} diff --git a/src/main/java/com/infisical/sdk/models/UniversalAuthLoginInput.java b/src/main/java/com/infisical/sdk/models/UniversalAuthLoginInput.java index b5e9b1e..5b8051e 100644 --- a/src/main/java/com/infisical/sdk/models/UniversalAuthLoginInput.java +++ b/src/main/java/com/infisical/sdk/models/UniversalAuthLoginInput.java @@ -1,12 +1,11 @@ package com.infisical.sdk.models; - import lombok.Builder; import lombok.Data; @Data @Builder public class UniversalAuthLoginInput { - private String clientId; - private String clientSecret; -} \ No newline at end of file + private String clientId; + private String clientSecret; +} diff --git a/src/main/java/com/infisical/sdk/models/UpdateFolderInput.java b/src/main/java/com/infisical/sdk/models/UpdateFolderInput.java index 19a0a0e..553cb5f 100644 --- a/src/main/java/com/infisical/sdk/models/UpdateFolderInput.java +++ b/src/main/java/com/infisical/sdk/models/UpdateFolderInput.java @@ -18,12 +18,12 @@ public class UpdateFolderInput { private String folderId; @SerializedName("path") - @Builder.Default private String folderPath = "/"; + @Builder.Default + private String folderPath = "/"; @SerializedName("name") private String newFolderName; - public String validate() { if (Helper.isNullOrEmpty(projectId)) { return "Project ID is required"; @@ -47,4 +47,4 @@ public String validate() { return null; } -} \ No newline at end of file +} diff --git a/src/main/java/com/infisical/sdk/models/UpdateSecretInput.java b/src/main/java/com/infisical/sdk/models/UpdateSecretInput.java index 45e1de2..a445f55 100644 --- a/src/main/java/com/infisical/sdk/models/UpdateSecretInput.java +++ b/src/main/java/com/infisical/sdk/models/UpdateSecretInput.java @@ -1,6 +1,5 @@ package com.infisical.sdk.models; - import com.google.gson.annotations.SerializedName; import lombok.Builder; import lombok.Data; @@ -8,18 +7,18 @@ @Data @Builder public class UpdateSecretInput { - @SerializedName("environment") - private String environmentSlug; + @SerializedName("environment") + private String environmentSlug; - @SerializedName("workspaceId") - private String projectId; + @SerializedName("workspaceId") + private String projectId; - @SerializedName("secretPath") - private String secretPath; + @SerializedName("secretPath") + private String secretPath; - @SerializedName("secretValue") - private String secretValue; + @SerializedName("secretValue") + private String secretValue; - @SerializedName("newSecretName") - private String newSecretName; -} \ No newline at end of file + @SerializedName("newSecretName") + private String newSecretName; +} diff --git a/src/main/java/com/infisical/sdk/resources/FoldersClient.java b/src/main/java/com/infisical/sdk/resources/FoldersClient.java index 65307d1..0eeeec8 100644 --- a/src/main/java/com/infisical/sdk/resources/FoldersClient.java +++ b/src/main/java/com/infisical/sdk/resources/FoldersClient.java @@ -1,13 +1,11 @@ package com.infisical.sdk.resources; -import java.util.ArrayList; -import java.util.List; - import com.infisical.sdk.api.ApiClient; import com.infisical.sdk.models.*; import com.infisical.sdk.util.Helper; import com.infisical.sdk.util.InfisicalException; import com.infisical.sdk.util.ObjectToMapConverter; +import java.util.List; public class FoldersClient { private final ApiClient httpClient; @@ -25,12 +23,13 @@ public Folder Create(CreateFolderInput input) throws InfisicalException { } public Folder Get(String folderId) throws InfisicalException { - if(Helper.isNullOrEmpty(folderId)) { + if (Helper.isNullOrEmpty(folderId)) { throw new InfisicalException("Folder ID is required"); } - - var url = String.format("%s%s", this.httpClient.GetBaseUrl(), String.format("/api/v1/folders/%s", folderId)); + var url = + String.format( + "%s%s", this.httpClient.GetBaseUrl(), String.format("/api/v1/folders/%s", folderId)); var result = this.httpClient.get(url, null, SingleFolderResponse.class); return result.getFolder(); @@ -44,7 +43,9 @@ public List List(ListFoldersInput input) throws InfisicalException { } var url = String.format("%s%s", this.httpClient.GetBaseUrl(), "/api/v1/folders"); - var result = this.httpClient.get(url, ObjectToMapConverter.toStringMap(input), ListFoldersResponse.class); + var result = + this.httpClient.get( + url, ObjectToMapConverter.toStringMap(input), ListFoldersResponse.class); return result.getFolders(); } @@ -56,9 +57,12 @@ public Folder Update(UpdateFolderInput input) throws InfisicalException { throw new InfisicalException(validationMsg); } - var url = String.format("%s%s", this.httpClient.GetBaseUrl(), String.format("/api/v1/folders/%s", input.getFolderId())); + var url = + String.format( + "%s%s", + this.httpClient.GetBaseUrl(), String.format("/api/v1/folders/%s", input.getFolderId())); - var result = this.httpClient.patch(url, input, SingleFolderResponse.class); + var result = this.httpClient.patch(url, input, SingleFolderResponse.class); return result.getFolder(); } @@ -69,10 +73,13 @@ public Folder Delete(DeleteFolderInput input) throws InfisicalException { throw new InfisicalException(validationMsg); } - var url = String.format("%s%s", this.httpClient.GetBaseUrl(), String.format("/api/v1/folders/%s", input.getFolderId())); + var url = + String.format( + "%s%s", + this.httpClient.GetBaseUrl(), String.format("/api/v1/folders/%s", input.getFolderId())); var result = this.httpClient.delete(url, input, SingleFolderResponse.class); return result.getFolder(); } -} \ No newline at end of file +} diff --git a/src/main/java/com/infisical/sdk/resources/SecretsClient.java b/src/main/java/com/infisical/sdk/resources/SecretsClient.java index 3dbc8ec..4930df0 100644 --- a/src/main/java/com/infisical/sdk/resources/SecretsClient.java +++ b/src/main/java/com/infisical/sdk/resources/SecretsClient.java @@ -1,7 +1,5 @@ package com.infisical.sdk.resources; -import java.util.List; - import com.infisical.sdk.api.ApiClient; import com.infisical.sdk.api.QueryBuilder; import com.infisical.sdk.models.CreateSecretInput; @@ -12,6 +10,7 @@ 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; @@ -22,25 +21,44 @@ public SecretsClient(ApiClient 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, + 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) + 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 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); @@ -53,39 +71,58 @@ public List ListSecrets(String projectId, String environmentSlug, String return listSecrets.getSecrets(); } - 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 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(); + 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 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 result = this.httpClient.get(url, queryParameters, SingleSecretResponse.class); return result.getSecret(); } - 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 inputBuilder = UpdateSecretInput.builder() - .secretPath(secretPath) - .projectId(projectId) - .environmentSlug(environmentSlug) - .newSecretName(newSecretName) - .secretValue(newSecretValue); - - if (newSecretName != null) - inputBuilder.newSecretName(newSecretName); - if (newSecretName != null) - inputBuilder.secretValue(newSecretValue); + 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 inputBuilder = + UpdateSecretInput.builder() + .secretPath(secretPath) + .projectId(projectId) + .environmentSlug(environmentSlug) + .newSecretName(newSecretName) + .secretValue(newSecretValue); + + if (newSecretName != null) inputBuilder.newSecretName(newSecretName); + if (newSecretName != null) inputBuilder.secretValue(newSecretValue); var requestInput = inputBuilder.build(); @@ -94,16 +131,25 @@ public Secret UpdateSecret(String secretName, String projectId, String environme 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)); - - var createSecretInput = CreateSecretInput.builder() - .secretPath(secretPath) - .projectId(projectId) - .environmentSlug(environmentSlug) - .secretValue(secretValue) - .build(); + 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 createSecretInput = + CreateSecretInput.builder() + .secretPath(secretPath) + .projectId(projectId) + .environmentSlug(environmentSlug) + .secretValue(secretValue) + .build(); createSecretInput.setSecretValue(!secretValue.isEmpty() ? secretValue : ""); @@ -112,17 +158,22 @@ public Secret CreateSecret(String secretName, String secretValue, String project return result.getSecret(); } - public Secret DeleteSecret(String secretName, String projectId, String environmentSlug, String secretPath) + 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 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(); } -} \ No newline at end of file +} diff --git a/src/main/java/com/infisical/sdk/util/Helper.java b/src/main/java/com/infisical/sdk/util/Helper.java index ccd5a3f..c17c994 100644 --- a/src/main/java/com/infisical/sdk/util/Helper.java +++ b/src/main/java/com/infisical/sdk/util/Helper.java @@ -1,17 +1,12 @@ package com.infisical.sdk.util; - - public class Helper { + public static boolean isNullOrEmpty(String str) { + return str == null || str.trim().isEmpty(); + } - public static boolean isNullOrEmpty(String str) { - return str == null || str.trim().isEmpty(); - } - - - public static String booleanToString(Boolean b) { - return b == null ? null : b.toString(); - } - -} \ No newline at end of file + public static String booleanToString(Boolean b) { + return b == null ? null : b.toString(); + } +} diff --git a/src/main/java/com/infisical/sdk/util/InfisicalException.java b/src/main/java/com/infisical/sdk/util/InfisicalException.java index e291e74..6b546bb 100644 --- a/src/main/java/com/infisical/sdk/util/InfisicalException.java +++ b/src/main/java/com/infisical/sdk/util/InfisicalException.java @@ -1,29 +1,26 @@ package com.infisical.sdk.util; - -import lombok.Getter; - import java.io.IOException; +import lombok.Getter; public class InfisicalException extends Exception { - @Getter - private final String message; - private final StackTraceElement[] stackTrace; + @Getter private final String message; + private final StackTraceElement[] stackTrace; - public InfisicalException(String message) { - super(message); // Pass message to the parent Exception class - this.message = message; - this.stackTrace = null; - } + public InfisicalException(String message) { + super(message); // Pass message to the parent Exception class + this.message = message; + this.stackTrace = null; + } - // Constructor that takes the original ApiException - public InfisicalException(IOException cause) { - this.stackTrace = cause.getStackTrace(); + // Constructor that takes the original ApiException + public InfisicalException(IOException cause) { + this.stackTrace = cause.getStackTrace(); - if (cause.getMessage() != null) { - this.message = cause.getMessage(); - } else { - this.message = null; - } + if (cause.getMessage() != null) { + this.message = cause.getMessage(); + } else { + this.message = null; } -} \ No newline at end of file + } +} diff --git a/src/main/java/com/infisical/sdk/util/ObjectToMapConverter.java b/src/main/java/com/infisical/sdk/util/ObjectToMapConverter.java index 3605aee..7b4d4a3 100644 --- a/src/main/java/com/infisical/sdk/util/ObjectToMapConverter.java +++ b/src/main/java/com/infisical/sdk/util/ObjectToMapConverter.java @@ -8,38 +8,38 @@ import java.util.Map; public class ObjectToMapConverter { - private static final ObjectMapper objectMapper; - - static { - objectMapper = new ObjectMapper(); - objectMapper.registerModule(new JavaTimeModule()); - } - - public static Map toStringMap(Object obj) { - Map result = new HashMap<>(); - Class clazz = obj.getClass(); - - while (clazz != null) { - for (Field field : clazz.getDeclaredFields()) { - field.setAccessible(true); - try { - Object value = field.get(obj); - - // Use @SerializedName if present, otherwise use field name - String key = field.getName(); - SerializedName serializedName = field.getAnnotation(SerializedName.class); - if (serializedName != null) { - key = serializedName.value(); - } - - result.put(key, value != null ? value.toString() : null); - } catch (IllegalAccessException e) { - // Skip inaccessible fields - } - } - clazz = clazz.getSuperclass(); + private static final ObjectMapper objectMapper; + + static { + objectMapper = new ObjectMapper(); + objectMapper.registerModule(new JavaTimeModule()); + } + + public static Map toStringMap(Object obj) { + Map result = new HashMap<>(); + Class clazz = obj.getClass(); + + while (clazz != null) { + for (Field field : clazz.getDeclaredFields()) { + field.setAccessible(true); + try { + Object value = field.get(obj); + + // Use @SerializedName if present, otherwise use field name + String key = field.getName(); + SerializedName serializedName = field.getAnnotation(SerializedName.class); + if (serializedName != null) { + key = serializedName.value(); + } + + result.put(key, value != null ? value.toString() : null); + } catch (IllegalAccessException e) { + // Skip inaccessible fields } - - return result; + } + clazz = clazz.getSuperclass(); } -} \ No newline at end of file + + return result; + } +} diff --git a/src/test/java/com/infisical/sdk/InfisicalSdkTest.java b/src/test/java/com/infisical/sdk/InfisicalSdkTest.java index 9433453..9311124 100644 --- a/src/test/java/com/infisical/sdk/InfisicalSdkTest.java +++ b/src/test/java/com/infisical/sdk/InfisicalSdkTest.java @@ -1,167 +1,156 @@ package com.infisical.sdk; 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; - +import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class InfisicalSdkTest { - private static final Logger logger = LoggerFactory.getLogger(InfisicalSdkTest.class); - @Test - public void TestListSecrets() { - var envVars = new EnvironmentVariables(); - - - var sdk = new InfisicalSdk(new SdkConfig.Builder() - .withSiteUrl(envVars.getSiteUrl()) - .build() - ); - - assertDoesNotThrow(() -> { - sdk.Auth().UniversalAuthLogin( - envVars.getMachineIdentityClientId(), - envVars.getMachineIdentityClientSecret() - ); + private static final Logger logger = LoggerFactory.getLogger(InfisicalSdkTest.class); + + @Test + public void TestListSecrets() { + var envVars = new EnvironmentVariables(); + + var sdk = new InfisicalSdk(new SdkConfig.Builder().withSiteUrl(envVars.getSiteUrl()).build()); + + assertDoesNotThrow( + () -> { + sdk.Auth() + .UniversalAuthLogin( + envVars.getMachineIdentityClientId(), envVars.getMachineIdentityClientSecret()); }); - try { - var secrets = sdk.Secrets().ListSecrets(envVars.getProjectId(), "dev", "/", false, false, false, false); - logger.info("Secrets length {}", secrets.size()); + try { + var secrets = + sdk.Secrets().ListSecrets(envVars.getProjectId(), "dev", "/", false, false, false, false); + logger.info("Secrets length {}", secrets.size()); - } catch (InfisicalException e) { - throw new AssertionError(e); - } + } catch (InfisicalException e) { + throw new AssertionError(e); } + } - @Test - public void TestGetSecret() { - var envVars = new EnvironmentVariables(); + @Test + public void TestGetSecret() { + var envVars = new EnvironmentVariables(); - var sdk = new InfisicalSdk(new SdkConfig.Builder() - .withSiteUrl(envVars.getSiteUrl()) - .build() - ); + var sdk = new InfisicalSdk(new SdkConfig.Builder().withSiteUrl(envVars.getSiteUrl()).build()); - assertDoesNotThrow(() -> { - sdk.Auth().UniversalAuthLogin( - envVars.getMachineIdentityClientId(), - envVars.getMachineIdentityClientSecret() - ); + assertDoesNotThrow( + () -> { + sdk.Auth() + .UniversalAuthLogin( + envVars.getMachineIdentityClientId(), envVars.getMachineIdentityClientSecret()); }); - try { - var secret = sdk.Secrets().GetSecret("SECRET", envVars.getProjectId(), "dev", "/", null, null, null); + try { + var secret = + sdk.Secrets().GetSecret("SECRET", envVars.getProjectId(), "dev", "/", null, null, null); - logger.info("TestGetSecret: Secret {}", secret); + logger.info("TestGetSecret: Secret {}", secret); - if (secret == null) { - throw new AssertionError("Secret not found"); - } + if (secret == null) { + throw new AssertionError("Secret not found"); + } - } catch (InfisicalException e) { - throw new AssertionError(e); - } + } catch (InfisicalException e) { + throw new AssertionError(e); } + } - @Test - public void TestUpdateSecret() { - var envVars = new EnvironmentVariables(); + @Test + public void TestUpdateSecret() { + var envVars = new EnvironmentVariables(); - var sdk = new InfisicalSdk(new SdkConfig.Builder() - .withSiteUrl(envVars.getSiteUrl()) - .build() - ); + var sdk = new InfisicalSdk(new SdkConfig.Builder().withSiteUrl(envVars.getSiteUrl()).build()); - assertDoesNotThrow(() -> { - sdk.Auth().UniversalAuthLogin( - envVars.getMachineIdentityClientId(), - envVars.getMachineIdentityClientSecret() - ); + assertDoesNotThrow( + () -> { + sdk.Auth() + .UniversalAuthLogin( + envVars.getMachineIdentityClientId(), envVars.getMachineIdentityClientSecret()); }); - try{ - var updatedSecret = sdk.Secrets().UpdateSecret("SECRET", envVars.getProjectId(), "dev", "/", "new-value-123", null); - - logger.info("TestUpdateSecret: Secret {}", updatedSecret); + try { + var updatedSecret = + sdk.Secrets() + .UpdateSecret("SECRET", envVars.getProjectId(), "dev", "/", "new-value-123", null); - } catch (InfisicalException e) { - throw new AssertionError(e); - } + logger.info("TestUpdateSecret: Secret {}", updatedSecret); + } catch (InfisicalException e) { + throw new AssertionError(e); } + } - @Test - public void TestCreateSecret() { - var envVars = new EnvironmentVariables(); + @Test + public void TestCreateSecret() { + var envVars = new EnvironmentVariables(); - var sdk = new InfisicalSdk(new SdkConfig.Builder() - .withSiteUrl(envVars.getSiteUrl()) - .build() - ); + var sdk = new InfisicalSdk(new SdkConfig.Builder().withSiteUrl(envVars.getSiteUrl()).build()); - assertDoesNotThrow(() -> { - sdk.Auth().UniversalAuthLogin( - envVars.getMachineIdentityClientId(), - envVars.getMachineIdentityClientSecret() - ); + assertDoesNotThrow( + () -> { + sdk.Auth() + .UniversalAuthLogin( + envVars.getMachineIdentityClientId(), envVars.getMachineIdentityClientSecret()); }); - try { - var secretValue = RandomUtil.generateRandomString(36); - var secretName = RandomUtil.generateRandomString(36); + try { + var secretValue = RandomUtil.generateRandomString(36); + var secretName = RandomUtil.generateRandomString(36); - var secret = sdk.Secrets().CreateSecret(secretName, secretValue, envVars.getProjectId(), "dev", "/"); + var secret = + sdk.Secrets().CreateSecret(secretName, secretValue, envVars.getProjectId(), "dev", "/"); - if(secret == null) { - throw new AssertionError("Secret not found"); - } + if (secret == null) { + throw new AssertionError("Secret not found"); + } - logger.info("TestCreateSecret: Secret {}", secret); - sdk.Secrets().DeleteSecret(secretName, envVars.getProjectId(), "dev", "/"); + logger.info("TestCreateSecret: Secret {}", secret); + sdk.Secrets().DeleteSecret(secretName, envVars.getProjectId(), "dev", "/"); - } catch (InfisicalException e) { - throw new AssertionError(e); - } + } catch (InfisicalException e) { + throw new AssertionError(e); } + } - @Test - public void TestDeleteSecret() { - var envVars = new EnvironmentVariables(); + @Test + public void TestDeleteSecret() { + var envVars = new EnvironmentVariables(); - var sdk = new InfisicalSdk(new SdkConfig.Builder() - .withSiteUrl(envVars.getSiteUrl()) - .build() - ); + var sdk = new InfisicalSdk(new SdkConfig.Builder().withSiteUrl(envVars.getSiteUrl()).build()); - assertDoesNotThrow(() -> { - sdk.Auth().UniversalAuthLogin( - envVars.getMachineIdentityClientId(), - envVars.getMachineIdentityClientSecret() - ); + assertDoesNotThrow( + () -> { + sdk.Auth() + .UniversalAuthLogin( + envVars.getMachineIdentityClientId(), envVars.getMachineIdentityClientSecret()); }); - try { - var secretValue = RandomUtil.generateRandomString(36); - var secretName = RandomUtil.generateRandomString(36); + try { + var secretValue = RandomUtil.generateRandomString(36); + var secretName = RandomUtil.generateRandomString(36); - sdk.Secrets().CreateSecret(secretName, secretValue, envVars.getProjectId(), "dev", "/"); + sdk.Secrets().CreateSecret(secretName, secretValue, envVars.getProjectId(), "dev", "/"); - var deletedSecret = sdk.Secrets().DeleteSecret(secretName, envVars.getProjectId(), "dev", "/"); + var deletedSecret = + sdk.Secrets().DeleteSecret(secretName, envVars.getProjectId(), "dev", "/"); - if(deletedSecret == null) { - throw new AssertionError("Secret not found"); - } + if (deletedSecret == null) { + throw new AssertionError("Secret not found"); + } - logger.info("TestDeleteSecret: Secret {}", deletedSecret); + logger.info("TestDeleteSecret: Secret {}", deletedSecret); - } catch (InfisicalException e) { - throw new AssertionError(e); - } + } catch (InfisicalException e) { + throw new AssertionError(e); } -} \ No newline at end of file + } +} diff --git a/src/test/java/com/infisical/sdk/auth/AwsAuthProviderTest.java b/src/test/java/com/infisical/sdk/auth/AwsAuthProviderTest.java index a124a9b..1545ac3 100644 --- a/src/test/java/com/infisical/sdk/auth/AwsAuthProviderTest.java +++ b/src/test/java/com/infisical/sdk/auth/AwsAuthProviderTest.java @@ -66,7 +66,9 @@ void testFromCredentials() throws JsonProcessingException { Map.entry("X-Amz-Date", "20251002T231159Z"), Map.entry( "Authorization", - "AWS4-HMAC-SHA256 Credential=MOCK_ACCESS_KEY/20251002/us-west-2/sts/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date;x-amz-security-token, Signature=9b1b93454bea36297168ed67a861df12d17136f47cbdf5d23b1daa0fe704742b")), + "AWS4-HMAC-SHA256 Credential=MOCK_ACCESS_KEY/20251002/us-west-2/sts/aws4_request," + + " SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date;x-amz-security-token," + + " Signature=9b1b93454bea36297168ed67a861df12d17136f47cbdf5d23b1daa0fe704742b")), actualHeaders); } diff --git a/src/test/java/com/infisical/sdk/util/EnvironmentVariables.java b/src/test/java/com/infisical/sdk/util/EnvironmentVariables.java index b118d4c..4e1af84 100644 --- a/src/test/java/com/infisical/sdk/util/EnvironmentVariables.java +++ b/src/test/java/com/infisical/sdk/util/EnvironmentVariables.java @@ -1,44 +1,42 @@ package com.infisical.sdk.util; - -import lombok.Getter; - public class EnvironmentVariables { - private String machineIdentityClientId; - private String machineIdentityClientSecret; - private String projectId; - private String siteUrl; + private String machineIdentityClientId; + private String machineIdentityClientSecret; + private String projectId; + private String siteUrl; - public EnvironmentVariables() throws RuntimeException { - this.machineIdentityClientId = System.getenv("INFISICAL_MACHINE_IDENTITY_CLIENT_ID"); - this.machineIdentityClientSecret = System.getenv("INFISICAL_MACHINE_IDENTITY_CLIENT_SECRET"); - this.projectId = System.getenv("INFISICAL_PROJECT_ID"); - this.siteUrl = System.getenv("INFISICAL_SITE_URL"); + public EnvironmentVariables() throws RuntimeException { + this.machineIdentityClientId = System.getenv("INFISICAL_MACHINE_IDENTITY_CLIENT_ID"); + this.machineIdentityClientSecret = System.getenv("INFISICAL_MACHINE_IDENTITY_CLIENT_SECRET"); + this.projectId = System.getenv("INFISICAL_PROJECT_ID"); + this.siteUrl = System.getenv("INFISICAL_SITE_URL"); - if ( - machineIdentityClientId == null || - machineIdentityClientSecret == null || - projectId == null || - siteUrl == null || - machineIdentityClientId.isEmpty() || - machineIdentityClientSecret.isEmpty() || - siteUrl.isEmpty() || - projectId.isEmpty()) { - throw new RuntimeException("One or more required environment variables are not set"); - } + if (machineIdentityClientId == null + || machineIdentityClientSecret == null + || projectId == null + || siteUrl == null + || machineIdentityClientId.isEmpty() + || machineIdentityClientSecret.isEmpty() + || siteUrl.isEmpty() + || projectId.isEmpty()) { + throw new RuntimeException("One or more required environment variables are not set"); } + } + public String getMachineIdentityClientId() { + return machineIdentityClientId; + } - public String getMachineIdentityClientId() { - return machineIdentityClientId; - } - public String getMachineIdentityClientSecret() { - return machineIdentityClientSecret; - } - public String getProjectId() { - return projectId; - } - public String getSiteUrl() { - return siteUrl; - } + public String getMachineIdentityClientSecret() { + return machineIdentityClientSecret; + } + + public String getProjectId() { + return projectId; + } + + public String getSiteUrl() { + return siteUrl; + } } diff --git a/src/test/java/com/infisical/sdk/util/RandomUtil.java b/src/test/java/com/infisical/sdk/util/RandomUtil.java index 2c859f4..b5fb20e 100644 --- a/src/test/java/com/infisical/sdk/util/RandomUtil.java +++ b/src/test/java/com/infisical/sdk/util/RandomUtil.java @@ -1,22 +1,19 @@ package com.infisical.sdk.util; - import java.util.Random; public class RandomUtil { - private static String candidateChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmopqrstuvwxyz"; - - - public static String generateRandomString(Integer length) { - StringBuilder salt = new StringBuilder(); - Random rnd = new Random(); - while (salt.length() < length) { - int index = (int) (rnd.nextFloat() * candidateChars.length()); - salt.append(candidateChars.charAt(index)); - } - - return salt.toString(); + private static String candidateChars = + "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmopqrstuvwxyz"; + + public static String generateRandomString(Integer length) { + StringBuilder salt = new StringBuilder(); + Random rnd = new Random(); + while (salt.length() < length) { + int index = (int) (rnd.nextFloat() * candidateChars.length()); + salt.append(candidateChars.charAt(index)); } + return salt.toString(); + } } - From eb1e05ae4296dcc3999c1a7364b9b1deb1650c68 Mon Sep 17 00:00:00 2001 From: Fang-Pen Lin Date: Wed, 15 Oct 2025 18:18:04 -0700 Subject: [PATCH 3/6] Update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4f1361b..c5b4c5e 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ Note that this security address should be used only for undisclosed vulnerabilit ## Code style -The Java code in this project should be formatted with [google-java-format](https://github.com/google/google-java-format). +The non-generated Java code in this project should be formatted with [google-java-format](https://github.com/google/google-java-format). To run it for all the Java files in the project, use the following command: ```bash From e325922e03e2d3c72f676fd4af1ad5829cbf860e Mon Sep 17 00:00:00 2001 From: Fang-Pen Lin Date: Wed, 15 Oct 2025 18:27:41 -0700 Subject: [PATCH 4/6] Fix broken ci by bumping ch.qos.logback ver --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 26697e2..a13a913 100644 --- a/pom.xml +++ b/pom.xml @@ -82,7 +82,7 @@ ch.qos.logback logback-core - 1.5.13 + 1.5.19 @@ -95,7 +95,7 @@ ch.qos.logback logback-classic - 1.5.6 + 1.5.19 From b5335df47be3181660a2d4dd4f213881556340cf Mon Sep 17 00:00:00 2001 From: Fang-Pen Lin Date: Wed, 15 Oct 2025 18:40:00 -0700 Subject: [PATCH 5/6] style for compose yaml file --- compose.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compose.yaml b/compose.yaml index 102de74..7884376 100644 --- a/compose.yaml +++ b/compose.yaml @@ -12,4 +12,4 @@ services: bash -c ' curl -sSL https://github.com/google/google-java-format/releases/download/v${GOOGLE_JAVA_FORMAT_VERSION}/google-java-format-${GOOGLE_JAVA_FORMAT_VERSION}-all-deps.jar -o /tmp/google-java-format.jar && java -jar /tmp/google-java-format.jar --replace $(find . -type f -name "*.java") - ' \ No newline at end of file + ' From 44793671353750895276b3ae2d4fcfeb3b48f86e Mon Sep 17 00:00:00 2001 From: Fang-Pen Lin Date: Thu, 16 Oct 2025 09:22:14 -0700 Subject: [PATCH 6/6] Update readme and rename docker compose file --- README.md | 3 ++- compose.yaml => docker-compose.yaml | 0 2 files changed, 2 insertions(+), 1 deletion(-) rename compose.yaml => docker-compose.yaml (100%) diff --git a/README.md b/README.md index c5b4c5e..0f58774 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,8 @@ Infisical takes security issues very seriously. If you have any concerns about I Note that this security address should be used only for undisclosed vulnerabilities. Please report any security problems to us before disclosing it publicly. -## Code style +## Contributing +### Code style The non-generated Java code in this project should be formatted with [google-java-format](https://github.com/google/google-java-format). To run it for all the Java files in the project, use the following command: diff --git a/compose.yaml b/docker-compose.yaml similarity index 100% rename from compose.yaml rename to docker-compose.yaml