mirror of
https://github.com/awatertrevi/infisical.git
synced 2026-09-22 13:39:35 +00:00
cli: switch from v2 secrets to v3
This commit is contained in:
@@ -34,7 +34,7 @@ export const getSecretsRaw = async (req: Request, res: Response) => {
|
|||||||
secret,
|
secret,
|
||||||
key
|
key
|
||||||
});
|
});
|
||||||
|
|
||||||
return rep;
|
return rep;
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
@@ -88,7 +88,7 @@ export const createSecretRaw = async (req: Request, res: Response) => {
|
|||||||
secretComment,
|
secretComment,
|
||||||
secretPath = "/"
|
secretPath = "/"
|
||||||
} = req.body;
|
} = req.body;
|
||||||
|
|
||||||
const key = await BotService.getWorkspaceKeyWithBot({
|
const key = await BotService.getWorkspaceKeyWithBot({
|
||||||
workspaceId: new Types.ObjectId(workspaceId)
|
workspaceId: new Types.ObjectId(workspaceId)
|
||||||
});
|
});
|
||||||
@@ -102,12 +102,12 @@ export const createSecretRaw = async (req: Request, res: Response) => {
|
|||||||
plaintext: secretValue,
|
plaintext: secretValue,
|
||||||
key
|
key
|
||||||
});
|
});
|
||||||
|
|
||||||
const secretCommentEncrypted = encryptSymmetric128BitHexKeyUTF8({
|
const secretCommentEncrypted = encryptSymmetric128BitHexKeyUTF8({
|
||||||
plaintext: secretComment,
|
plaintext: secretComment,
|
||||||
key
|
key
|
||||||
});
|
});
|
||||||
|
|
||||||
const secret = await SecretService.createSecret({
|
const secret = await SecretService.createSecret({
|
||||||
secretName,
|
secretName,
|
||||||
workspaceId: new Types.ObjectId(workspaceId),
|
workspaceId: new Types.ObjectId(workspaceId),
|
||||||
@@ -135,7 +135,7 @@ export const createSecretRaw = async (req: Request, res: Response) => {
|
|||||||
|
|
||||||
const secretWithoutBlindIndex = secret.toObject();
|
const secretWithoutBlindIndex = secret.toObject();
|
||||||
delete secretWithoutBlindIndex.secretBlindIndex;
|
delete secretWithoutBlindIndex.secretBlindIndex;
|
||||||
|
|
||||||
return res.status(200).send({
|
return res.status(200).send({
|
||||||
secret: repackageSecretToRaw({
|
secret: repackageSecretToRaw({
|
||||||
secret: secretWithoutBlindIndex,
|
secret: secretWithoutBlindIndex,
|
||||||
@@ -202,11 +202,11 @@ export const updateSecretByNameRaw = async (req: Request, res: Response) => {
|
|||||||
*/
|
*/
|
||||||
export const deleteSecretByNameRaw = async (req: Request, res: Response) => {
|
export const deleteSecretByNameRaw = async (req: Request, res: Response) => {
|
||||||
const { secretName } = req.params;
|
const { secretName } = req.params;
|
||||||
const {
|
const {
|
||||||
workspaceId,
|
workspaceId,
|
||||||
environment,
|
environment,
|
||||||
type,
|
type,
|
||||||
secretPath = "/"
|
secretPath = "/"
|
||||||
} = req.body;
|
} = req.body;
|
||||||
|
|
||||||
const { secret } = await SecretService.deleteSecret({
|
const { secret } = await SecretService.deleteSecret({
|
||||||
@@ -391,11 +391,11 @@ export const updateSecretByName = async (req: Request, res: Response) => {
|
|||||||
*/
|
*/
|
||||||
export const deleteSecretByName = async (req: Request, res: Response) => {
|
export const deleteSecretByName = async (req: Request, res: Response) => {
|
||||||
const { secretName } = req.params;
|
const { secretName } = req.params;
|
||||||
const {
|
const {
|
||||||
workspaceId,
|
workspaceId,
|
||||||
environment,
|
environment,
|
||||||
type,
|
type,
|
||||||
secretPath = "/"
|
secretPath = "/"
|
||||||
} = req.body;
|
} = req.body;
|
||||||
|
|
||||||
const { secret } = await SecretService.deleteSecret({
|
const { secret } = await SecretService.deleteSecret({
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ import { getFolderIdFromServiceToken } from "../services/FolderService";
|
|||||||
export const repackageSecretToRaw = ({
|
export const repackageSecretToRaw = ({
|
||||||
secret,
|
secret,
|
||||||
key
|
key
|
||||||
}:{
|
}: {
|
||||||
secret: ISecret;
|
secret: ISecret;
|
||||||
key: string;
|
key: string;
|
||||||
}) => {
|
}) => {
|
||||||
@@ -76,8 +76,8 @@ export const repackageSecretToRaw = ({
|
|||||||
key
|
key
|
||||||
});
|
});
|
||||||
|
|
||||||
let secretComment: string = '';
|
let secretComment: string = '';
|
||||||
|
|
||||||
if (secret.secretCommentCiphertext && secret.secretCommentIV && secret.secretCommentTag) {
|
if (secret.secretCommentCiphertext && secret.secretCommentIV && secret.secretCommentTag) {
|
||||||
secretComment = decryptSymmetric128BitHexKeyUTF8({
|
secretComment = decryptSymmetric128BitHexKeyUTF8({
|
||||||
ciphertext: secret.secretCommentCiphertext,
|
ciphertext: secret.secretCommentCiphertext,
|
||||||
@@ -86,7 +86,7 @@ export const repackageSecretToRaw = ({
|
|||||||
key
|
key
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
return ({
|
return ({
|
||||||
_id: secret._id,
|
_id: secret._id,
|
||||||
version: secret.version,
|
version: secret.version,
|
||||||
@@ -503,7 +503,7 @@ export const getSecretsHelper = async ({
|
|||||||
folder: folderId,
|
folder: folderId,
|
||||||
type: SECRET_PERSONAL,
|
type: SECRET_PERSONAL,
|
||||||
...getAuthDataPayloadUserObj(authData),
|
...getAuthDataPayloadUserObj(authData),
|
||||||
}).lean();
|
}).populate("tags").lean();
|
||||||
|
|
||||||
// concat with shared secrets
|
// concat with shared secrets
|
||||||
secrets = secrets.concat(
|
secrets = secrets.concat(
|
||||||
@@ -515,7 +515,7 @@ export const getSecretsHelper = async ({
|
|||||||
secretBlindIndex: {
|
secretBlindIndex: {
|
||||||
$nin: secrets.map((secret) => secret.secretBlindIndex),
|
$nin: secrets.map((secret) => secret.secretBlindIndex),
|
||||||
},
|
},
|
||||||
}).lean()
|
}).populate("tags").lean()
|
||||||
);
|
);
|
||||||
|
|
||||||
// (EE) create (audit) log
|
// (EE) create (audit) log
|
||||||
@@ -553,7 +553,7 @@ export const getSecretsHelper = async ({
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
return secrets;
|
return secrets;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -652,7 +652,7 @@ export const getSecretHelper = async ({
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
return secret;
|
return secret;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -843,7 +843,7 @@ export const deleteSecretHelper = async ({
|
|||||||
// if using service token filter towards the folderId by secretpath
|
// if using service token filter towards the folderId by secretpath
|
||||||
if (authData.authPayload instanceof ServiceTokenData) {
|
if (authData.authPayload instanceof ServiceTokenData) {
|
||||||
const { secretPath: serviceTkScopedSecretPath } = authData.authPayload;
|
const { secretPath: serviceTkScopedSecretPath } = authData.authPayload;
|
||||||
|
|
||||||
if (secretPath !== serviceTkScopedSecretPath) {
|
if (secretPath !== serviceTkScopedSecretPath) {
|
||||||
throw UnauthorizedRequestError({ message: "Folder Permission Denied" });
|
throw UnauthorizedRequestError({ message: "Folder Permission Denied" });
|
||||||
}
|
}
|
||||||
@@ -909,12 +909,12 @@ export const deleteSecretHelper = async ({
|
|||||||
});
|
});
|
||||||
|
|
||||||
action && (await EELogService.createLog({
|
action && (await EELogService.createLog({
|
||||||
...getAuthDataPayloadIdObj(authData),
|
...getAuthDataPayloadIdObj(authData),
|
||||||
workspaceId,
|
workspaceId,
|
||||||
actions: [action],
|
actions: [action],
|
||||||
channel: authData.authChannel,
|
channel: authData.authChannel,
|
||||||
ipAddress: authData.authIP,
|
ipAddress: authData.authIP,
|
||||||
}));
|
}));
|
||||||
|
|
||||||
// (EE) take a secret snapshot
|
// (EE) take a secret snapshot
|
||||||
await EESecretService.takeSecretSnapshot({
|
await EESecretService.takeSecretSnapshot({
|
||||||
@@ -941,7 +941,7 @@ export const deleteSecretHelper = async ({
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
return ({
|
return ({
|
||||||
secrets,
|
secrets,
|
||||||
secret
|
secret
|
||||||
|
|||||||
@@ -11,63 +11,6 @@ import (
|
|||||||
|
|
||||||
const USER_AGENT = "cli"
|
const USER_AGENT = "cli"
|
||||||
|
|
||||||
func CallBatchModifySecretsByWorkspaceAndEnv(httpClient *resty.Client, request BatchModifySecretsByWorkspaceAndEnvRequest) error {
|
|
||||||
endpoint := fmt.Sprintf("%v/v2/secrets", config.INFISICAL_URL)
|
|
||||||
response, err := httpClient.
|
|
||||||
R().
|
|
||||||
SetBody(request).
|
|
||||||
SetHeader("User-Agent", USER_AGENT).
|
|
||||||
Patch(endpoint)
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("CallBatchModifySecretsByWorkspaceAndEnv: Unable to complete api request [err=%s]", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if response.IsError() {
|
|
||||||
return fmt.Errorf("CallBatchModifySecretsByWorkspaceAndEnv: Unsuccessful response: [response=%s]", response)
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func CallBatchCreateSecretsByWorkspaceAndEnv(httpClient *resty.Client, request BatchCreateSecretsByWorkspaceAndEnvRequest) error {
|
|
||||||
endpoint := fmt.Sprintf("%v/v2/secrets/", config.INFISICAL_URL)
|
|
||||||
response, err := httpClient.
|
|
||||||
R().
|
|
||||||
SetBody(request).
|
|
||||||
SetHeader("User-Agent", USER_AGENT).
|
|
||||||
Post(endpoint)
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("CallBatchCreateSecretsByWorkspaceAndEnv: Unable to complete api request [err=%s]", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if response.IsError() {
|
|
||||||
return fmt.Errorf("CallBatchCreateSecretsByWorkspaceAndEnv: Unsuccessful response: [response=%s]", response)
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func CallBatchDeleteSecretsByWorkspaceAndEnv(httpClient *resty.Client, request BatchDeleteSecretsBySecretIdsRequest) error {
|
|
||||||
endpoint := fmt.Sprintf("%v/v2/secrets", config.INFISICAL_URL)
|
|
||||||
response, err := httpClient.
|
|
||||||
R().
|
|
||||||
SetBody(request).
|
|
||||||
SetHeader("User-Agent", USER_AGENT).
|
|
||||||
Delete(endpoint)
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("CallBatchDeleteSecretsByWorkspaceAndEnv: Unable to complete api request [err=%s]", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if response.IsError() {
|
|
||||||
return fmt.Errorf("CallBatchDeleteSecretsByWorkspaceAndEnv: Unsuccessful response: [response=%s]", response)
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func CallGetEncryptedWorkspaceKey(httpClient *resty.Client, request GetEncryptedWorkspaceKeyRequest) (GetEncryptedWorkspaceKeyResponse, error) {
|
func CallGetEncryptedWorkspaceKey(httpClient *resty.Client, request GetEncryptedWorkspaceKeyRequest) (GetEncryptedWorkspaceKeyResponse, error) {
|
||||||
endpoint := fmt.Sprintf("%v/v2/workspace/%v/encrypted-key", config.INFISICAL_URL, request.WorkspaceId)
|
endpoint := fmt.Sprintf("%v/v2/workspace/%v/encrypted-key", config.INFISICAL_URL, request.WorkspaceId)
|
||||||
var result GetEncryptedWorkspaceKeyResponse
|
var result GetEncryptedWorkspaceKeyResponse
|
||||||
@@ -107,28 +50,6 @@ func CallGetServiceTokenDetailsV2(httpClient *resty.Client) (GetServiceTokenDeta
|
|||||||
return tokenDetailsResponse, nil
|
return tokenDetailsResponse, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func CallGetSecretsV2(httpClient *resty.Client, request GetEncryptedSecretsV2Request) (GetEncryptedSecretsV2Response, error) {
|
|
||||||
var secretsResponse GetEncryptedSecretsV2Response
|
|
||||||
response, err := httpClient.
|
|
||||||
R().
|
|
||||||
SetResult(&secretsResponse).
|
|
||||||
SetHeader("User-Agent", USER_AGENT).
|
|
||||||
SetQueryParam("environment", request.Environment).
|
|
||||||
SetQueryParam("workspaceId", request.WorkspaceId).
|
|
||||||
SetQueryParam("tagSlugs", request.TagSlugs).
|
|
||||||
Get(fmt.Sprintf("%v/v2/secrets", config.INFISICAL_URL))
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
return GetEncryptedSecretsV2Response{}, fmt.Errorf("CallGetSecretsV2: Unable to complete api request [err=%s]", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if response.IsError() {
|
|
||||||
return GetEncryptedSecretsV2Response{}, fmt.Errorf("CallGetSecretsV2: Unsuccessful response: [response=%s]", response)
|
|
||||||
}
|
|
||||||
|
|
||||||
return secretsResponse, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func CallLogin1V2(httpClient *resty.Client, request GetLoginOneV2Request) (GetLoginOneV2Response, error) {
|
func CallLogin1V2(httpClient *resty.Client, request GetLoginOneV2Request) (GetLoginOneV2Response, error) {
|
||||||
var loginOneV2Response GetLoginOneV2Response
|
var loginOneV2Response GetLoginOneV2Response
|
||||||
response, err := httpClient.
|
response, err := httpClient.
|
||||||
@@ -303,3 +224,110 @@ func CallGetNewAccessTokenWithRefreshToken(httpClient *resty.Client, refreshToke
|
|||||||
|
|
||||||
return newAccessToken, nil
|
return newAccessToken, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func CallGetSecretsV3(httpClient *resty.Client, request GetEncryptedSecretsV3Request) (GetEncryptedSecretsV3Response, error) {
|
||||||
|
var secretsResponse GetEncryptedSecretsV3Response
|
||||||
|
|
||||||
|
httpRequest := httpClient.
|
||||||
|
R().
|
||||||
|
SetResult(&secretsResponse).
|
||||||
|
SetHeader("User-Agent", USER_AGENT).
|
||||||
|
SetQueryParam("environment", request.Environment).
|
||||||
|
SetQueryParam("workspaceId", request.WorkspaceId)
|
||||||
|
|
||||||
|
if request.SecretPath != "" {
|
||||||
|
httpRequest.SetQueryParam("secretPath", request.SecretPath)
|
||||||
|
}
|
||||||
|
|
||||||
|
response, err := httpRequest.Get(fmt.Sprintf("%v/v3/secrets", config.INFISICAL_URL))
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return GetEncryptedSecretsV3Response{}, fmt.Errorf("CallGetSecretsV3: Unable to complete api request [err=%s]", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if response.IsError() {
|
||||||
|
return GetEncryptedSecretsV3Response{}, fmt.Errorf("CallGetSecretsV3: Unsuccessful response. Please make sure your secret path, workspace and environment name are all correct [response=%s]", response)
|
||||||
|
}
|
||||||
|
|
||||||
|
return secretsResponse, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func CallCreateSecretsV3(httpClient *resty.Client, request CreateSecretV3Request) error {
|
||||||
|
var secretsResponse GetEncryptedSecretsV3Response
|
||||||
|
response, err := httpClient.
|
||||||
|
R().
|
||||||
|
SetResult(&secretsResponse).
|
||||||
|
SetHeader("User-Agent", USER_AGENT).
|
||||||
|
SetBody(request).
|
||||||
|
Post(fmt.Sprintf("%v/v3/secrets/%s", config.INFISICAL_URL, request.SecretName))
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("CallCreateSecretsV3: Unable to complete api request [err=%s]", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if response.IsError() {
|
||||||
|
return fmt.Errorf("CallCreateSecretsV3: Unsuccessful response. Please make sure your secret path, workspace and environment name are all correct [response=%s]", response)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func CallDeleteSecretsV3(httpClient *resty.Client, request DeleteSecretV3Request) error {
|
||||||
|
var secretsResponse GetEncryptedSecretsV3Response
|
||||||
|
response, err := httpClient.
|
||||||
|
R().
|
||||||
|
SetResult(&secretsResponse).
|
||||||
|
SetHeader("User-Agent", USER_AGENT).
|
||||||
|
SetBody(request).
|
||||||
|
Delete(fmt.Sprintf("%v/v3/secrets/%s", config.INFISICAL_URL, request.SecretName))
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("CallDeleteSecretsV3: Unable to complete api request [err=%s]", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if response.IsError() {
|
||||||
|
return fmt.Errorf("CallDeleteSecretsV3: Unsuccessful response. Please make sure your secret path, workspace and environment name are all correct [response=%s]", response)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func CallUpdateSecretsV3(httpClient *resty.Client, request UpdateSecretByNameV3Request) error {
|
||||||
|
var secretsResponse GetEncryptedSecretsV3Response
|
||||||
|
response, err := httpClient.
|
||||||
|
R().
|
||||||
|
SetResult(&secretsResponse).
|
||||||
|
SetHeader("User-Agent", USER_AGENT).
|
||||||
|
SetBody(request).
|
||||||
|
Patch(fmt.Sprintf("%v/v3/secrets/%s", config.INFISICAL_URL, request.SecretName))
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("CallUpdateSecretsV3: Unable to complete api request [err=%s]", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if response.IsError() {
|
||||||
|
return fmt.Errorf("CallUpdateSecretsV3: Unsuccessful response. Please make sure your secret path, workspace and environment name are all correct [response=%s]", response)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func CallGetSingleSecretByNameV3(httpClient *resty.Client, request CreateSecretV3Request) error {
|
||||||
|
var secretsResponse GetEncryptedSecretsV3Response
|
||||||
|
response, err := httpClient.
|
||||||
|
R().
|
||||||
|
SetResult(&secretsResponse).
|
||||||
|
SetHeader("User-Agent", USER_AGENT).
|
||||||
|
SetBody(request).
|
||||||
|
Post(fmt.Sprintf("%v/v3/secrets/%s", config.INFISICAL_URL, request.SecretName))
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("CallGetSingleSecretByNameV3: Unable to complete api request [err=%s]", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if response.IsError() {
|
||||||
|
return fmt.Errorf("CallGetSingleSecretByNameV3: Unsuccessful response. Please make sure your secret path, workspace and environment name are all correct [response=%s]", response)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|||||||
@@ -143,24 +143,7 @@ type Secret struct {
|
|||||||
SecretCommentHash string `json:"secretCommentHash,omitempty"`
|
SecretCommentHash string `json:"secretCommentHash,omitempty"`
|
||||||
Type string `json:"type,omitempty"`
|
Type string `json:"type,omitempty"`
|
||||||
ID string `json:"id,omitempty"`
|
ID string `json:"id,omitempty"`
|
||||||
}
|
PlainTextKey string `json:"plainTextKey"`
|
||||||
|
|
||||||
type BatchCreateSecretsByWorkspaceAndEnvRequest struct {
|
|
||||||
Environment string `json:"environment"`
|
|
||||||
WorkspaceId string `json:"workspaceId"`
|
|
||||||
Secrets []Secret `json:"secrets"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type BatchModifySecretsByWorkspaceAndEnvRequest struct {
|
|
||||||
Environment string `json:"environment"`
|
|
||||||
WorkspaceId string `json:"workspaceId"`
|
|
||||||
Secrets []Secret `json:"secrets"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type BatchDeleteSecretsBySecretIdsRequest struct {
|
|
||||||
EnvironmentName string `json:"environmentName"`
|
|
||||||
WorkspaceId string `json:"workspaceId"`
|
|
||||||
SecretIds []string `json:"secretIds"`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type GetEncryptedWorkspaceKeyRequest struct {
|
type GetEncryptedWorkspaceKeyRequest struct {
|
||||||
@@ -194,41 +177,6 @@ type GetSecretsByWorkspaceIdAndEnvironmentRequest struct {
|
|||||||
WorkspaceId string `json:"workspaceId"`
|
WorkspaceId string `json:"workspaceId"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type GetEncryptedSecretsV2Request struct {
|
|
||||||
Environment string `json:"environment"`
|
|
||||||
WorkspaceId string `json:"workspaceId"`
|
|
||||||
TagSlugs string `json:"tagSlugs"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type GetEncryptedSecretsV2Response struct {
|
|
||||||
Secrets []struct {
|
|
||||||
ID string `json:"_id"`
|
|
||||||
Version int `json:"version"`
|
|
||||||
Workspace string `json:"workspace"`
|
|
||||||
Type string `json:"type"`
|
|
||||||
Environment string `json:"environment"`
|
|
||||||
SecretKeyCiphertext string `json:"secretKeyCiphertext"`
|
|
||||||
SecretKeyIV string `json:"secretKeyIV"`
|
|
||||||
SecretKeyTag string `json:"secretKeyTag"`
|
|
||||||
SecretValueCiphertext string `json:"secretValueCiphertext"`
|
|
||||||
SecretValueIV string `json:"secretValueIV"`
|
|
||||||
SecretValueTag string `json:"secretValueTag"`
|
|
||||||
SecretCommentCiphertext string `json:"secretCommentCiphertext"`
|
|
||||||
SecretCommentIV string `json:"secretCommentIV"`
|
|
||||||
SecretCommentTag string `json:"secretCommentTag"`
|
|
||||||
V int `json:"__v"`
|
|
||||||
CreatedAt time.Time `json:"createdAt"`
|
|
||||||
UpdatedAt time.Time `json:"updatedAt"`
|
|
||||||
User string `json:"user,omitempty"`
|
|
||||||
Tags []struct {
|
|
||||||
ID string `json:"_id"`
|
|
||||||
Name string `json:"name"`
|
|
||||||
Slug string `json:"slug"`
|
|
||||||
Workspace string `json:"workspace"`
|
|
||||||
} `json:"tags"`
|
|
||||||
} `json:"secrets"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type GetServiceTokenDetailsResponse struct {
|
type GetServiceTokenDetailsResponse struct {
|
||||||
ID string `json:"_id"`
|
ID string `json:"_id"`
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
@@ -320,3 +268,109 @@ type VerifyMfaTokenErrorResponse struct {
|
|||||||
type GetNewAccessTokenWithRefreshTokenResponse struct {
|
type GetNewAccessTokenWithRefreshTokenResponse struct {
|
||||||
Token string `json:"token"`
|
Token string `json:"token"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type GetEncryptedSecretsV3Request struct {
|
||||||
|
Environment string `json:"environment"`
|
||||||
|
WorkspaceId string `json:"workspaceId"`
|
||||||
|
SecretPath string `json:"secretPath"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type GetEncryptedSecretsV3Response struct {
|
||||||
|
Secrets []struct {
|
||||||
|
ID string `json:"_id"`
|
||||||
|
Version int `json:"version"`
|
||||||
|
Workspace string `json:"workspace"`
|
||||||
|
Type string `json:"type"`
|
||||||
|
Tags []struct {
|
||||||
|
ID string `json:"_id"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
Slug string `json:"slug"`
|
||||||
|
Workspace string `json:"workspace"`
|
||||||
|
} `json:"tags"`
|
||||||
|
Environment string `json:"environment"`
|
||||||
|
SecretKeyCiphertext string `json:"secretKeyCiphertext"`
|
||||||
|
SecretKeyIV string `json:"secretKeyIV"`
|
||||||
|
SecretKeyTag string `json:"secretKeyTag"`
|
||||||
|
SecretValueCiphertext string `json:"secretValueCiphertext"`
|
||||||
|
SecretValueIV string `json:"secretValueIV"`
|
||||||
|
SecretValueTag string `json:"secretValueTag"`
|
||||||
|
SecretCommentCiphertext string `json:"secretCommentCiphertext"`
|
||||||
|
SecretCommentIV string `json:"secretCommentIV"`
|
||||||
|
SecretCommentTag string `json:"secretCommentTag"`
|
||||||
|
Algorithm string `json:"algorithm"`
|
||||||
|
KeyEncoding string `json:"keyEncoding"`
|
||||||
|
Folder string `json:"folder"`
|
||||||
|
V int `json:"__v"`
|
||||||
|
CreatedAt time.Time `json:"createdAt"`
|
||||||
|
UpdatedAt time.Time `json:"updatedAt"`
|
||||||
|
} `json:"secrets"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type CreateSecretV3Request struct {
|
||||||
|
SecretName string `json:"secretName"`
|
||||||
|
WorkspaceID string `json:"workspaceId"`
|
||||||
|
Type string `json:"type"`
|
||||||
|
Environment string `json:"environment"`
|
||||||
|
SecretKeyCiphertext string `json:"secretKeyCiphertext"`
|
||||||
|
SecretKeyIV string `json:"secretKeyIV"`
|
||||||
|
SecretKeyTag string `json:"secretKeyTag"`
|
||||||
|
SecretValueCiphertext string `json:"secretValueCiphertext"`
|
||||||
|
SecretValueIV string `json:"secretValueIV"`
|
||||||
|
SecretValueTag string `json:"secretValueTag"`
|
||||||
|
SecretCommentCiphertext string `json:"secretCommentCiphertext"`
|
||||||
|
SecretCommentIV string `json:"secretCommentIV"`
|
||||||
|
SecretCommentTag string `json:"secretCommentTag"`
|
||||||
|
SecretPath string `json:"secretPath"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type DeleteSecretV3Request struct {
|
||||||
|
SecretName string `json:"secretName"`
|
||||||
|
WorkspaceId string `json:"workspaceId"`
|
||||||
|
Environment string `json:"environment"`
|
||||||
|
Type string `json:"type"`
|
||||||
|
SecretPath string `json:"secretPath"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type UpdateSecretByNameV3Request struct {
|
||||||
|
SecretName string `json:"secretName"`
|
||||||
|
WorkspaceID string `json:"workspaceId"`
|
||||||
|
Environment string `json:"environment"`
|
||||||
|
Type string `json:"type"`
|
||||||
|
SecretPath string `json:"secretPath"`
|
||||||
|
SecretValueCiphertext string `json:"secretValueCiphertext"`
|
||||||
|
SecretValueIV string `json:"secretValueIV"`
|
||||||
|
SecretValueTag string `json:"secretValueTag"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type GetSingleSecretByNameV3Request struct {
|
||||||
|
SecretName string `json:"secretName"`
|
||||||
|
WorkspaceId string `json:"workspaceId"`
|
||||||
|
Environment string `json:"environment"`
|
||||||
|
Type string `json:"type"`
|
||||||
|
SecretPath string `json:"secretPath"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type GetSingleSecretByNameSecretResponse struct {
|
||||||
|
Secrets []struct {
|
||||||
|
ID string `json:"_id"`
|
||||||
|
Version int `json:"version"`
|
||||||
|
Workspace string `json:"workspace"`
|
||||||
|
Type string `json:"type"`
|
||||||
|
Environment string `json:"environment"`
|
||||||
|
SecretKeyCiphertext string `json:"secretKeyCiphertext"`
|
||||||
|
SecretKeyIV string `json:"secretKeyIV"`
|
||||||
|
SecretKeyTag string `json:"secretKeyTag"`
|
||||||
|
SecretValueCiphertext string `json:"secretValueCiphertext"`
|
||||||
|
SecretValueIV string `json:"secretValueIV"`
|
||||||
|
SecretValueTag string `json:"secretValueTag"`
|
||||||
|
SecretCommentCiphertext string `json:"secretCommentCiphertext"`
|
||||||
|
SecretCommentIV string `json:"secretCommentIV"`
|
||||||
|
SecretCommentTag string `json:"secretCommentTag"`
|
||||||
|
Algorithm string `json:"algorithm"`
|
||||||
|
KeyEncoding string `json:"keyEncoding"`
|
||||||
|
Folder string `json:"folder"`
|
||||||
|
V int `json:"__v"`
|
||||||
|
CreatedAt time.Time `json:"createdAt"`
|
||||||
|
UpdatedAt time.Time `json:"updatedAt"`
|
||||||
|
} `json:"secrets"`
|
||||||
|
}
|
||||||
|
|||||||
@@ -82,7 +82,12 @@ var runCmd = &cobra.Command{
|
|||||||
util.HandleError(err, "Unable to parse flag")
|
util.HandleError(err, "Unable to parse flag")
|
||||||
}
|
}
|
||||||
|
|
||||||
secrets, err := util.GetAllEnvironmentVariables(models.GetAllSecretsParameters{Environment: environmentName, InfisicalToken: infisicalToken, TagSlugs: tagSlugs})
|
secretsPath, err := cmd.Flags().GetString("path")
|
||||||
|
if err != nil {
|
||||||
|
util.HandleError(err, "Unable to parse flag")
|
||||||
|
}
|
||||||
|
|
||||||
|
secrets, err := util.GetAllEnvironmentVariables(models.GetAllSecretsParameters{Environment: environmentName, InfisicalToken: infisicalToken, TagSlugs: tagSlugs, SecretsPath: secretsPath})
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
util.HandleError(err, "Could not fetch secrets", "If you are using a service token to fetch secrets, please ensure it is valid")
|
util.HandleError(err, "Could not fetch secrets", "If you are using a service token to fetch secrets, please ensure it is valid")
|
||||||
@@ -184,6 +189,7 @@ func init() {
|
|||||||
runCmd.Flags().Bool("secret-overriding", true, "Prioritizes personal secrets, if any, with the same name over shared secrets")
|
runCmd.Flags().Bool("secret-overriding", true, "Prioritizes personal secrets, if any, with the same name over shared secrets")
|
||||||
runCmd.Flags().StringP("command", "c", "", "chained commands to execute (e.g. \"npm install && npm run dev; echo ...\")")
|
runCmd.Flags().StringP("command", "c", "", "chained commands to execute (e.g. \"npm install && npm run dev; echo ...\")")
|
||||||
runCmd.Flags().StringP("tags", "t", "", "filter secrets by tag slugs ")
|
runCmd.Flags().StringP("tags", "t", "", "filter secrets by tag slugs ")
|
||||||
|
runCmd.Flags().String("path", "/", "get secrets within a folder path")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Will execute a single command and pass in the given secrets into the process
|
// Will execute a single command and pass in the given secrets into the process
|
||||||
|
|||||||
@@ -44,6 +44,11 @@ var secretsCmd = &cobra.Command{
|
|||||||
util.HandleError(err, "Unable to parse flag")
|
util.HandleError(err, "Unable to parse flag")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
secretsPath, err := cmd.Flags().GetString("path")
|
||||||
|
if err != nil {
|
||||||
|
util.HandleError(err, "Unable to parse flag")
|
||||||
|
}
|
||||||
|
|
||||||
shouldExpandSecrets, err := cmd.Flags().GetBool("expand")
|
shouldExpandSecrets, err := cmd.Flags().GetBool("expand")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
util.HandleError(err)
|
util.HandleError(err)
|
||||||
@@ -54,7 +59,7 @@ var secretsCmd = &cobra.Command{
|
|||||||
util.HandleError(err, "Unable to parse flag")
|
util.HandleError(err, "Unable to parse flag")
|
||||||
}
|
}
|
||||||
|
|
||||||
secrets, err := util.GetAllEnvironmentVariables(models.GetAllSecretsParameters{Environment: environmentName, InfisicalToken: infisicalToken, TagSlugs: tagSlugs})
|
secrets, err := util.GetAllEnvironmentVariables(models.GetAllSecretsParameters{Environment: environmentName, InfisicalToken: infisicalToken, TagSlugs: tagSlugs, SecretsPath: secretsPath})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
util.HandleError(err)
|
util.HandleError(err)
|
||||||
}
|
}
|
||||||
@@ -103,6 +108,11 @@ var secretsSetCmd = &cobra.Command{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
secretsPath, err := cmd.Flags().GetString("path")
|
||||||
|
if err != nil {
|
||||||
|
util.HandleError(err, "Unable to parse flag")
|
||||||
|
}
|
||||||
|
|
||||||
workspaceFile, err := util.GetWorkSpaceFromFile()
|
workspaceFile, err := util.GetWorkSpaceFromFile()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
util.HandleError(err, "Unable to get your local config details")
|
util.HandleError(err, "Unable to get your local config details")
|
||||||
@@ -140,7 +150,7 @@ var secretsSetCmd = &cobra.Command{
|
|||||||
plainTextEncryptionKey := crypto.DecryptAsymmetric(encryptedWorkspaceKey, encryptedWorkspaceKeyNonce, encryptedWorkspaceKeySenderPublicKey, currentUsersPrivateKey)
|
plainTextEncryptionKey := crypto.DecryptAsymmetric(encryptedWorkspaceKey, encryptedWorkspaceKeyNonce, encryptedWorkspaceKeySenderPublicKey, currentUsersPrivateKey)
|
||||||
|
|
||||||
// pull current secrets
|
// pull current secrets
|
||||||
secrets, err := util.GetAllEnvironmentVariables(models.GetAllSecretsParameters{Environment: environmentName})
|
secrets, err := util.GetAllEnvironmentVariables(models.GetAllSecretsParameters{Environment: environmentName, SecretsPath: secretsPath})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
util.HandleError(err, "unable to retrieve secrets")
|
util.HandleError(err, "unable to retrieve secrets")
|
||||||
}
|
}
|
||||||
@@ -191,6 +201,8 @@ var secretsSetCmd = &cobra.Command{
|
|||||||
SecretValueIV: base64.StdEncoding.EncodeToString(encryptedValue.Nonce),
|
SecretValueIV: base64.StdEncoding.EncodeToString(encryptedValue.Nonce),
|
||||||
SecretValueTag: base64.StdEncoding.EncodeToString(encryptedValue.AuthTag),
|
SecretValueTag: base64.StdEncoding.EncodeToString(encryptedValue.AuthTag),
|
||||||
SecretValueHash: hashedValue,
|
SecretValueHash: hashedValue,
|
||||||
|
PlainTextKey: key,
|
||||||
|
Type: existingSecret.Type,
|
||||||
}
|
}
|
||||||
|
|
||||||
// Only add to modifications if the value is different
|
// Only add to modifications if the value is different
|
||||||
@@ -222,6 +234,7 @@ var secretsSetCmd = &cobra.Command{
|
|||||||
SecretValueTag: base64.StdEncoding.EncodeToString(encryptedValue.AuthTag),
|
SecretValueTag: base64.StdEncoding.EncodeToString(encryptedValue.AuthTag),
|
||||||
SecretValueHash: hashedValue,
|
SecretValueHash: hashedValue,
|
||||||
Type: util.SECRET_TYPE_SHARED,
|
Type: util.SECRET_TYPE_SHARED,
|
||||||
|
PlainTextKey: key,
|
||||||
}
|
}
|
||||||
secretsToCreate = append(secretsToCreate, encryptedSecretDetails)
|
secretsToCreate = append(secretsToCreate, encryptedSecretDetails)
|
||||||
secretOperations = append(secretOperations, SecretSetOperation{
|
secretOperations = append(secretOperations, SecretSetOperation{
|
||||||
@@ -232,30 +245,43 @@ var secretsSetCmd = &cobra.Command{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(secretsToCreate) > 0 {
|
for _, secret := range secretsToCreate {
|
||||||
batchCreateRequest := api.BatchCreateSecretsByWorkspaceAndEnvRequest{
|
createSecretRequest := api.CreateSecretV3Request{
|
||||||
WorkspaceId: workspaceFile.WorkspaceId,
|
WorkspaceID: workspaceFile.WorkspaceId,
|
||||||
Environment: environmentName,
|
Environment: environmentName,
|
||||||
Secrets: secretsToCreate,
|
SecretName: secret.PlainTextKey,
|
||||||
|
SecretKeyCiphertext: secret.SecretKeyCiphertext,
|
||||||
|
SecretKeyIV: secret.SecretKeyIV,
|
||||||
|
SecretKeyTag: secret.SecretKeyTag,
|
||||||
|
SecretValueCiphertext: secret.SecretValueCiphertext,
|
||||||
|
SecretValueIV: secret.SecretValueIV,
|
||||||
|
SecretValueTag: secret.SecretValueTag,
|
||||||
|
Type: secret.Type,
|
||||||
|
SecretPath: secretsPath,
|
||||||
}
|
}
|
||||||
|
|
||||||
err = api.CallBatchCreateSecretsByWorkspaceAndEnv(httpClient, batchCreateRequest)
|
err = api.CallCreateSecretsV3(httpClient, createSecretRequest)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
util.HandleError(err, "Unable to process new secret creations")
|
util.HandleError(err, "Unable to process new secret creations")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(secretsToModify) > 0 {
|
for _, secret := range secretsToModify {
|
||||||
batchModifyRequest := api.BatchModifySecretsByWorkspaceAndEnvRequest{
|
updateSecretRequest := api.UpdateSecretByNameV3Request{
|
||||||
WorkspaceId: workspaceFile.WorkspaceId,
|
WorkspaceID: workspaceFile.WorkspaceId,
|
||||||
Environment: environmentName,
|
Environment: environmentName,
|
||||||
Secrets: secretsToModify,
|
SecretName: secret.PlainTextKey,
|
||||||
|
SecretValueCiphertext: secret.SecretValueCiphertext,
|
||||||
|
SecretValueIV: secret.SecretValueIV,
|
||||||
|
SecretValueTag: secret.SecretValueTag,
|
||||||
|
Type: secret.Type,
|
||||||
|
SecretPath: secretsPath,
|
||||||
}
|
}
|
||||||
|
|
||||||
err = api.CallBatchModifySecretsByWorkspaceAndEnv(httpClient, batchModifyRequest)
|
err = api.CallUpdateSecretsV3(httpClient, updateSecretRequest)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
util.HandleError(err, "Unable to process the modifications to your secrets")
|
util.HandleError(err, "Unable to process secret update request")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -288,6 +314,16 @@ var secretsDeleteCmd = &cobra.Command{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
secretsPath, err := cmd.Flags().GetString("path")
|
||||||
|
if err != nil {
|
||||||
|
util.HandleError(err, "Unable to parse flag")
|
||||||
|
}
|
||||||
|
|
||||||
|
secretType, err := cmd.Flags().GetString("type")
|
||||||
|
if err != nil {
|
||||||
|
util.HandleError(err, "Unable to parse flag")
|
||||||
|
}
|
||||||
|
|
||||||
loggedInUserDetails, err := util.GetCurrentLoggedInUserDetails()
|
loggedInUserDetails, err := util.GetCurrentLoggedInUserDetails()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
util.HandleError(err, "Unable to authenticate")
|
util.HandleError(err, "Unable to authenticate")
|
||||||
@@ -298,46 +334,28 @@ var secretsDeleteCmd = &cobra.Command{
|
|||||||
util.HandleError(err, "Unable to get local project details")
|
util.HandleError(err, "Unable to get local project details")
|
||||||
}
|
}
|
||||||
|
|
||||||
secrets, err := util.GetAllEnvironmentVariables(models.GetAllSecretsParameters{Environment: environmentName})
|
for _, secretName := range args {
|
||||||
if err != nil {
|
request := api.DeleteSecretV3Request{
|
||||||
util.HandleError(err, "Unable to fetch secrets")
|
WorkspaceId: workspaceFile.WorkspaceId,
|
||||||
}
|
Environment: environmentName,
|
||||||
|
SecretName: secretName,
|
||||||
secretByKey := getSecretsByKeys(secrets)
|
Type: secretType,
|
||||||
validSecretIdsToDelete := []string{}
|
SecretPath: secretsPath,
|
||||||
invalidSecretNamesThatDoNotExist := []string{}
|
|
||||||
|
|
||||||
for _, secretKeyFromArg := range args {
|
|
||||||
if value, ok := secretByKey[strings.ToUpper(secretKeyFromArg)]; ok {
|
|
||||||
validSecretIdsToDelete = append(validSecretIdsToDelete, value.ID)
|
|
||||||
} else {
|
|
||||||
invalidSecretNamesThatDoNotExist = append(invalidSecretNamesThatDoNotExist, secretKeyFromArg)
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if len(invalidSecretNamesThatDoNotExist) != 0 {
|
httpClient := resty.New().
|
||||||
message := fmt.Sprintf("secret name(s) [%v] does not exist in your project. To see which secrets exist run [infisical secrets]", strings.Join(invalidSecretNamesThatDoNotExist, ", "))
|
SetAuthToken(loggedInUserDetails.UserCredentials.JTWToken).
|
||||||
util.PrintErrorMessageAndExit(message)
|
SetHeader("Accept", "application/json")
|
||||||
}
|
|
||||||
|
|
||||||
request := api.BatchDeleteSecretsBySecretIdsRequest{
|
err = api.CallDeleteSecretsV3(httpClient, request)
|
||||||
WorkspaceId: workspaceFile.WorkspaceId,
|
if err != nil {
|
||||||
EnvironmentName: environmentName,
|
util.HandleError(err, "Unable to complete your delete request")
|
||||||
SecretIds: validSecretIdsToDelete,
|
}
|
||||||
}
|
|
||||||
|
|
||||||
httpClient := resty.New().
|
|
||||||
SetAuthToken(loggedInUserDetails.UserCredentials.JTWToken).
|
|
||||||
SetHeader("Accept", "application/json")
|
|
||||||
|
|
||||||
err = api.CallBatchDeleteSecretsByWorkspaceAndEnv(httpClient, request)
|
|
||||||
if err != nil {
|
|
||||||
util.HandleError(err, "Unable to complete your batch delete request")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt.Printf("secret name(s) [%v] have been deleted from your project \n", strings.Join(args, ", "))
|
fmt.Printf("secret name(s) [%v] have been deleted from your project \n", strings.Join(args, ", "))
|
||||||
|
|
||||||
Telemetry.CaptureEvent("cli-command:secrets delete", posthog.NewProperties().Set("secretCount", len(secrets)).Set("version", util.CLI_VERSION))
|
Telemetry.CaptureEvent("cli-command:secrets delete", posthog.NewProperties().Set("secretCount", len(args)).Set("version", util.CLI_VERSION))
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -611,11 +629,15 @@ func init() {
|
|||||||
secretsCmd.AddCommand(secretsGetCmd)
|
secretsCmd.AddCommand(secretsGetCmd)
|
||||||
|
|
||||||
secretsCmd.AddCommand(secretsSetCmd)
|
secretsCmd.AddCommand(secretsSetCmd)
|
||||||
|
secretsSetCmd.Flags().String("path", "/", "get secrets within a folder path")
|
||||||
|
|
||||||
secretsSetCmd.PersistentPreRun = func(cmd *cobra.Command, args []string) {
|
secretsSetCmd.PersistentPreRun = func(cmd *cobra.Command, args []string) {
|
||||||
util.RequireLogin()
|
util.RequireLogin()
|
||||||
util.RequireLocalWorkspaceFile()
|
util.RequireLocalWorkspaceFile()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
secretsDeleteCmd.Flags().String("type", "personal", "the type of secret to delete: personal or shared (default: personal)")
|
||||||
|
secretsDeleteCmd.Flags().String("path", "/", "get secrets within a folder path")
|
||||||
secretsCmd.AddCommand(secretsDeleteCmd)
|
secretsCmd.AddCommand(secretsDeleteCmd)
|
||||||
secretsDeleteCmd.PersistentPreRun = func(cmd *cobra.Command, args []string) {
|
secretsDeleteCmd.PersistentPreRun = func(cmd *cobra.Command, args []string) {
|
||||||
util.RequireLogin()
|
util.RequireLogin()
|
||||||
@@ -626,5 +648,6 @@ func init() {
|
|||||||
secretsCmd.PersistentFlags().String("env", "dev", "Used to select the environment name on which actions should be taken on")
|
secretsCmd.PersistentFlags().String("env", "dev", "Used to select the environment name on which actions should be taken on")
|
||||||
secretsCmd.Flags().Bool("expand", true, "Parse shell parameter expansions in your secrets")
|
secretsCmd.Flags().Bool("expand", true, "Parse shell parameter expansions in your secrets")
|
||||||
secretsCmd.PersistentFlags().StringP("tags", "t", "", "filter secrets by tag slugs")
|
secretsCmd.PersistentFlags().StringP("tags", "t", "", "filter secrets by tag slugs")
|
||||||
|
secretsCmd.Flags().String("path", "/", "get secrets within a folder path")
|
||||||
rootCmd.AddCommand(secretsCmd)
|
rootCmd.AddCommand(secretsCmd)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -64,4 +64,5 @@ type GetAllSecretsParameters struct {
|
|||||||
InfisicalToken string
|
InfisicalToken string
|
||||||
TagSlugs string
|
TagSlugs string
|
||||||
WorkspaceId string
|
WorkspaceId string
|
||||||
|
SecretsPath string
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ func GetPlainTextSecretsViaServiceToken(fullServiceToken string) ([]models.Singl
|
|||||||
return nil, api.GetServiceTokenDetailsResponse{}, fmt.Errorf("unable to get service token details. [err=%v]", err)
|
return nil, api.GetServiceTokenDetailsResponse{}, fmt.Errorf("unable to get service token details. [err=%v]", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
encryptedSecrets, err := api.CallGetSecretsV2(httpClient, api.GetEncryptedSecretsV2Request{
|
encryptedSecrets, err := api.CallGetSecretsV3(httpClient, api.GetEncryptedSecretsV3Request{
|
||||||
WorkspaceId: serviceTokenDetails.Workspace,
|
WorkspaceId: serviceTokenDetails.Workspace,
|
||||||
Environment: serviceTokenDetails.Environment,
|
Environment: serviceTokenDetails.Environment,
|
||||||
})
|
})
|
||||||
@@ -61,7 +61,7 @@ func GetPlainTextSecretsViaServiceToken(fullServiceToken string) ([]models.Singl
|
|||||||
return plainTextSecrets, serviceTokenDetails, nil
|
return plainTextSecrets, serviceTokenDetails, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetPlainTextSecretsViaJTW(JTWToken string, receiversPrivateKey string, workspaceId string, environmentName string, tagSlugs string) ([]models.SingleEnvironmentVariable, error) {
|
func GetPlainTextSecretsViaJTW(JTWToken string, receiversPrivateKey string, workspaceId string, environmentName string, tagSlugs string, secretsPath string) ([]models.SingleEnvironmentVariable, error) {
|
||||||
httpClient := resty.New()
|
httpClient := resty.New()
|
||||||
httpClient.SetAuthToken(JTWToken).
|
httpClient.SetAuthToken(JTWToken).
|
||||||
SetHeader("Accept", "application/json")
|
SetHeader("Accept", "application/json")
|
||||||
@@ -102,11 +102,17 @@ func GetPlainTextSecretsViaJTW(JTWToken string, receiversPrivateKey string, work
|
|||||||
|
|
||||||
plainTextWorkspaceKey := crypto.DecryptAsymmetric(encryptedWorkspaceKey, encryptedWorkspaceKeyNonce, encryptedWorkspaceKeySenderPublicKey, currentUsersPrivateKey)
|
plainTextWorkspaceKey := crypto.DecryptAsymmetric(encryptedWorkspaceKey, encryptedWorkspaceKeyNonce, encryptedWorkspaceKeySenderPublicKey, currentUsersPrivateKey)
|
||||||
|
|
||||||
encryptedSecrets, err := api.CallGetSecretsV2(httpClient, api.GetEncryptedSecretsV2Request{
|
getSecretsRequest := api.GetEncryptedSecretsV3Request{
|
||||||
WorkspaceId: workspaceId,
|
WorkspaceId: workspaceId,
|
||||||
Environment: environmentName,
|
Environment: environmentName,
|
||||||
TagSlugs: tagSlugs,
|
// TagSlugs: tagSlugs,
|
||||||
})
|
}
|
||||||
|
|
||||||
|
if secretsPath != "" {
|
||||||
|
getSecretsRequest.SecretPath = secretsPath
|
||||||
|
}
|
||||||
|
|
||||||
|
encryptedSecrets, err := api.CallGetSecretsV3(httpClient, getSecretsRequest)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@@ -162,7 +168,7 @@ func GetAllEnvironmentVariables(params models.GetAllSecretsParameters) ([]models
|
|||||||
return nil, fmt.Errorf("unable to validate environment name because [err=%s]", err)
|
return nil, fmt.Errorf("unable to validate environment name because [err=%s]", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
secretsToReturn, errorToReturn = GetPlainTextSecretsViaJTW(loggedInUserDetails.UserCredentials.JTWToken, loggedInUserDetails.UserCredentials.PrivateKey, workspaceFile.WorkspaceId, params.Environment, params.TagSlugs)
|
secretsToReturn, errorToReturn = GetPlainTextSecretsViaJTW(loggedInUserDetails.UserCredentials.JTWToken, loggedInUserDetails.UserCredentials.PrivateKey, workspaceFile.WorkspaceId, params.Environment, params.TagSlugs, params.SecretsPath)
|
||||||
log.Debug().Msgf("GetAllEnvironmentVariables: Trying to fetch secrets JTW token [err=%s]", errorToReturn)
|
log.Debug().Msgf("GetAllEnvironmentVariables: Trying to fetch secrets JTW token [err=%s]", errorToReturn)
|
||||||
|
|
||||||
backupSecretsEncryptionKey := []byte(loggedInUserDetails.UserCredentials.PrivateKey)[0:32]
|
backupSecretsEncryptionKey := []byte(loggedInUserDetails.UserCredentials.PrivateKey)[0:32]
|
||||||
@@ -333,7 +339,7 @@ func OverrideSecrets(secrets []models.SingleEnvironmentVariable, secretType stri
|
|||||||
return secretsToReturn
|
return secretsToReturn
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetPlainTextSecrets(key []byte, encryptedSecrets api.GetEncryptedSecretsV2Response) ([]models.SingleEnvironmentVariable, error) {
|
func GetPlainTextSecrets(key []byte, encryptedSecrets api.GetEncryptedSecretsV3Response) ([]models.SingleEnvironmentVariable, error) {
|
||||||
plainTextSecrets := []models.SingleEnvironmentVariable{}
|
plainTextSecrets := []models.SingleEnvironmentVariable{}
|
||||||
for _, secret := range encryptedSecrets.Secrets {
|
for _, secret := range encryptedSecrets.Secrets {
|
||||||
// Decrypt key
|
// Decrypt key
|
||||||
|
|||||||
Reference in New Issue
Block a user