Skip to content

Commit 18c6023

Browse files
authored
Merge pull request #5 from Infisical/daniel/system-properties
feat(secrets): add secrets to system properties
2 parents 188f1f1 + fa16211 commit 18c6023

File tree

6 files changed

+114
-88
lines changed

6 files changed

+114
-88
lines changed

.DS_Store

-6 KB
Binary file not shown.

.github/workflows/test.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ jobs:
3838

3939
- name: Upload Test Results
4040
if: always()
41-
uses: actions/upload-artifact@v3
41+
uses: actions/upload-artifact@v4
4242
with:
4343
name: test-results
4444
path: target/surefire-reports/

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
/scripts/node_modules
22
/target
3-
.idea
3+
.idea
4+
.DS_Store

README.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,8 @@ public List<Secret> ListSecrets(
114114
String secretPath,
115115
Boolean expandSecretReferences,
116116
Boolean recursive,
117-
Boolean includeImports
117+
Boolean includeImports,
118+
Boolean setSecretsOnSystemProperties
118119
)
119120

120121
throws InfisicalException
@@ -128,6 +129,7 @@ List<Secret> secrets = await sdk.Secrets().ListSecrets(
128129
false, // Should expand secret references
129130
false, // Should get secrets recursively from sub folders
130131
false, // Should include imports
132+
false // Should set the fetched secrets as key/value pairs on the system properties. Makes the secrets accessible as System.getProperty("<secret-key>")
131133
);
132134
```
133135

@@ -138,6 +140,7 @@ List<Secret> secrets = await sdk.Secrets().ListSecrets(
138140
- `expandSecretReferences` (boolean): Whether to expand secret references.
139141
- `recursive` (boolean): Whether to list secrets recursively.
140142
- `includeImports` (boolean): Whether to include imported secrets.
143+
- `setSecretsOnSystemProperties` (boolean): Set the retrieved secrets as key/value pairs on the system properties, making them accessible through `System.getProperty("<secret-key>")`
141144

142145
**Returns:**
143146
- `List<Secret>`: The response containing the list of secrets.
Lines changed: 100 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -1,104 +1,128 @@
11
package com.infisical.sdk.resources;
22

3-
import com.infisical.sdk.api.QueryBuilder;
4-
import com.infisical.sdk.models.*;
5-
6-
import com.infisical.sdk.util.Helper;
3+
import java.util.List;
74

85
import com.infisical.sdk.api.ApiClient;
6+
import com.infisical.sdk.api.QueryBuilder;
7+
import com.infisical.sdk.models.CreateSecretInput;
8+
import com.infisical.sdk.models.DeleteSecretInput;
9+
import com.infisical.sdk.models.ListSecretsResponse;
10+
import com.infisical.sdk.models.Secret;
11+
import com.infisical.sdk.models.SingleSecretResponse;
12+
import com.infisical.sdk.models.UpdateSecretInput;
13+
import com.infisical.sdk.util.Helper;
914
import com.infisical.sdk.util.InfisicalException;
10-
import java.util.List;
1115

1216
public class SecretsClient {
13-
private final ApiClient httpClient;
14-
15-
public SecretsClient(ApiClient apiClient) {
16-
this.httpClient = apiClient;
17-
}
18-
19-
public List<Secret> ListSecrets(String projectId, String environmentSlug, String secretPath, Boolean expandSecretReferences, Boolean recursive, Boolean includeImports) throws InfisicalException {
20-
var url = String.format("%s%s", this.httpClient.GetBaseUrl(), "/api/v3/secrets/raw");
21-
22-
var queryParameters = new QueryBuilder()
23-
.add("workspaceId", projectId)
24-
.add("environment", environmentSlug)
25-
.add("secretPath", secretPath)
26-
.add("expandSecretReferences", Helper.booleanToString(expandSecretReferences))
27-
.add("recursive", Helper.booleanToString(recursive))
28-
.add("includeImports", Helper.booleanToString(includeImports))
29-
.build();
30-
31-
var listSecrets = this.httpClient.get(url, queryParameters, ListSecretsResponse.class);
32-
33-
return listSecrets.getSecrets();
17+
private final ApiClient httpClient;
18+
19+
public SecretsClient(ApiClient apiClient) {
20+
this.httpClient = apiClient;
21+
}
22+
23+
// Overload to avoid breaking changes for new setSecretsOnSystemProperties
24+
// parameter
25+
public List<Secret> ListSecrets(String projectId, String environmentSlug, String secretPath,
26+
Boolean expandSecretReferences, Boolean recursive, Boolean includeImports) throws InfisicalException {
27+
return ListSecrets(projectId, environmentSlug, secretPath, expandSecretReferences, recursive, includeImports,
28+
false);
29+
}
30+
31+
public List<Secret> ListSecrets(String projectId, String environmentSlug, String secretPath,
32+
Boolean expandSecretReferences, Boolean recursive, Boolean includeImports, Boolean setSecretsOnSystemProperties)
33+
throws InfisicalException {
34+
var url = String.format("%s%s", this.httpClient.GetBaseUrl(), "/api/v3/secrets/raw");
35+
36+
var queryParameters = new QueryBuilder()
37+
.add("workspaceId", projectId)
38+
.add("environment", environmentSlug)
39+
.add("secretPath", secretPath)
40+
.add("expandSecretReferences", Helper.booleanToString(expandSecretReferences))
41+
.add("recursive", Helper.booleanToString(recursive))
42+
.add("includeImports", Helper.booleanToString(includeImports))
43+
.build();
44+
45+
var listSecrets = this.httpClient.get(url, queryParameters, ListSecretsResponse.class);
46+
47+
if (setSecretsOnSystemProperties) {
48+
for (Secret secret : listSecrets.getSecrets()) {
49+
System.setProperty(secret.getSecretKey(), secret.getSecretValue());
50+
}
3451
}
3552

36-
public Secret GetSecret(String secretName, String projectId, String environmentSlug, String secretPath, Boolean expandSecretReferences, Boolean includeImports, String secretType) throws InfisicalException {
37-
var url = String.format("%s%s", this.httpClient.GetBaseUrl(), String.format("/api/v3/secrets/raw/%s", secretName));
53+
return listSecrets.getSecrets();
54+
}
3855

39-
var queryParameters = new QueryBuilder()
40-
.add("workspaceId", projectId)
41-
.add("environment", environmentSlug)
42-
.add("secretPath", secretPath)
43-
.add("expandSecretReferences", Helper.booleanToString(expandSecretReferences))
44-
.add("includeImports", Helper.booleanToString(includeImports))
45-
.add("type", secretType)
46-
.build();
56+
public Secret GetSecret(String secretName, String projectId, String environmentSlug, String secretPath,
57+
Boolean expandSecretReferences, Boolean includeImports, String secretType) throws InfisicalException {
58+
var url = String.format("%s%s", this.httpClient.GetBaseUrl(), String.format("/api/v3/secrets/raw/%s", secretName));
4759

48-
var result = this.httpClient.get(url, queryParameters, SingleSecretResponse.class);
60+
var queryParameters = new QueryBuilder()
61+
.add("workspaceId", projectId)
62+
.add("environment", environmentSlug)
63+
.add("secretPath", secretPath)
64+
.add("expandSecretReferences", Helper.booleanToString(expandSecretReferences))
65+
.add("includeImports", Helper.booleanToString(includeImports))
66+
.add("type", secretType)
67+
.build();
4968

50-
return result.getSecret();
51-
}
69+
var result = this.httpClient.get(url, queryParameters, SingleSecretResponse.class);
5270

53-
public Secret UpdateSecret(String secretName, String projectId, String environmentSlug, String secretPath, String newSecretValue, String newSecretName) throws InfisicalException {
54-
var url = String.format("%s%s", this.httpClient.GetBaseUrl(), String.format("/api/v3/secrets/raw/%s", secretName));
71+
return result.getSecret();
72+
}
5573

56-
var inputBuilder = UpdateSecretInput.builder()
57-
.secretPath(secretPath)
58-
.projectId(projectId)
59-
.environmentSlug(environmentSlug)
60-
.newSecretName(newSecretName)
61-
.secretValue(newSecretValue);
74+
public Secret UpdateSecret(String secretName, String projectId, String environmentSlug, String secretPath,
75+
String newSecretValue, String newSecretName) throws InfisicalException {
76+
var url = String.format("%s%s", this.httpClient.GetBaseUrl(), String.format("/api/v3/secrets/raw/%s", secretName));
6277

63-
if (newSecretName != null) inputBuilder.newSecretName(newSecretName);
64-
if (newSecretName != null) inputBuilder.secretValue(newSecretValue);
78+
var inputBuilder = UpdateSecretInput.builder()
79+
.secretPath(secretPath)
80+
.projectId(projectId)
81+
.environmentSlug(environmentSlug)
82+
.newSecretName(newSecretName)
83+
.secretValue(newSecretValue);
6584

66-
var requestInput = inputBuilder.build();
85+
if (newSecretName != null)
86+
inputBuilder.newSecretName(newSecretName);
87+
if (newSecretName != null)
88+
inputBuilder.secretValue(newSecretValue);
6789

90+
var requestInput = inputBuilder.build();
6891

69-
var result = this.httpClient.patch(url, requestInput, SingleSecretResponse.class);
70-
71-
return result.getSecret();
72-
}
92+
var result = this.httpClient.patch(url, requestInput, SingleSecretResponse.class);
7393

94+
return result.getSecret();
95+
}
7496

75-
public Secret CreateSecret(String secretName, String secretValue, String projectId, String environmentSlug, String secretPath) throws InfisicalException {
76-
var url = String.format("%s%s", this.httpClient.GetBaseUrl(), String.format("/api/v3/secrets/raw/%s", secretName));
97+
public Secret CreateSecret(String secretName, String secretValue, String projectId, String environmentSlug,
98+
String secretPath) throws InfisicalException {
99+
var url = String.format("%s%s", this.httpClient.GetBaseUrl(), String.format("/api/v3/secrets/raw/%s", secretName));
77100

78-
var createSecretInput = CreateSecretInput.builder()
79-
.secretPath(secretPath)
80-
.projectId(projectId)
81-
.environmentSlug(environmentSlug)
82-
.secretValue(secretValue)
83-
.build();
101+
var createSecretInput = CreateSecretInput.builder()
102+
.secretPath(secretPath)
103+
.projectId(projectId)
104+
.environmentSlug(environmentSlug)
105+
.secretValue(secretValue)
106+
.build();
84107

85-
createSecretInput.setSecretValue(!secretValue.isEmpty() ? secretValue : "");
108+
createSecretInput.setSecretValue(!secretValue.isEmpty() ? secretValue : "");
86109

87-
var result = this.httpClient.post(url, createSecretInput, SingleSecretResponse.class);
110+
var result = this.httpClient.post(url, createSecretInput, SingleSecretResponse.class);
88111

89-
return result.getSecret();
90-
}
112+
return result.getSecret();
113+
}
91114

92-
public Secret DeleteSecret(String secretName, String projectId, String environmentSlug, String secretPath) throws InfisicalException {
93-
var url = String.format("%s%s", this.httpClient.GetBaseUrl(), String.format("/api/v3/secrets/raw/%s", secretName));
115+
public Secret DeleteSecret(String secretName, String projectId, String environmentSlug, String secretPath)
116+
throws InfisicalException {
117+
var url = String.format("%s%s", this.httpClient.GetBaseUrl(), String.format("/api/v3/secrets/raw/%s", secretName));
94118

95-
var deleteSecretInput = DeleteSecretInput.builder()
96-
.secretPath(secretPath)
97-
.projectId(projectId)
98-
.environmentSlug(environmentSlug)
99-
.build();
119+
var deleteSecretInput = DeleteSecretInput.builder()
120+
.secretPath(secretPath)
121+
.projectId(projectId)
122+
.environmentSlug(environmentSlug)
123+
.build();
100124

101-
var result = this.httpClient.delete(url, deleteSecretInput, SingleSecretResponse.class);
102-
return result.getSecret();
103-
}
125+
var result = this.httpClient.delete(url, deleteSecretInput, SingleSecretResponse.class);
126+
return result.getSecret();
127+
}
104128
}

src/test/java/com/infisical/sdk/InfisicalSdkTest.java

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,15 @@
11
package com.infisical.sdk;
22

3-
import com.infisical.sdk.util.EnvironmentVariables;
4-
import com.infisical.sdk.util.InfisicalException;
5-
6-
import com.infisical.sdk.util.RandomUtil;
7-
import org.junit.jupiter.api.*;
8-
import com.infisical.sdk.config.SdkConfig;
9-
103
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
11-
4+
import org.junit.jupiter.api.Test;
125
import org.slf4j.Logger;
136
import org.slf4j.LoggerFactory;
147

8+
import com.infisical.sdk.config.SdkConfig;
9+
import com.infisical.sdk.util.EnvironmentVariables;
10+
import com.infisical.sdk.util.InfisicalException;
11+
import com.infisical.sdk.util.RandomUtil;
12+
1513

1614
public class InfisicalSdkTest {
1715
private static final Logger logger = LoggerFactory.getLogger(InfisicalSdkTest.class);
@@ -33,7 +31,7 @@ public void TestListSecrets() {
3331
});
3432

3533
try {
36-
var secrets = sdk.Secrets().ListSecrets(envVars.getProjectId(), "dev", "/", false, false, false);
34+
var secrets = sdk.Secrets().ListSecrets(envVars.getProjectId(), "dev", "/", false, false, false, false);
3735
logger.info("Secrets length {}", secrets.size());
3836

3937
} catch (InfisicalException e) {

0 commit comments

Comments
 (0)