mirror of
https://github.com/Infisical/infisical.git
synced 2026-01-09 15:38:03 -05:00
add single secret fetch for agent
This commit is contained in:
@@ -434,6 +434,34 @@ func CallGetRawSecretsV3(httpClient *resty.Client, request GetRawSecretsV3Reques
|
|||||||
return getRawSecretsV3Response, nil
|
return getRawSecretsV3Response, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func CallFetchSingleSecretByName(httpClient *resty.Client, request GetRawSecretV3ByNameRequest) (GetRawSecretV3ByNameResponse, error) {
|
||||||
|
var getRawSecretV3ByNameResponse GetRawSecretV3ByNameResponse
|
||||||
|
response, err := httpClient.
|
||||||
|
R().
|
||||||
|
SetHeader("User-Agent", USER_AGENT).
|
||||||
|
SetResult(&getRawSecretV3ByNameResponse).
|
||||||
|
SetBody(request).
|
||||||
|
SetQueryParam("expandSecretReferences", "true").
|
||||||
|
SetQueryParam("include_imports", "true").
|
||||||
|
SetQueryParam("environment", request.Environment).
|
||||||
|
SetQueryParam("secretPath", request.SecretPath).
|
||||||
|
SetQueryParam("workspaceId", request.WorkspaceID).
|
||||||
|
SetQueryParam("type", "shared").
|
||||||
|
Get(fmt.Sprintf("%v/v3/secrets/raw/%s", config.INFISICAL_URL, request.SecretName))
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return GetRawSecretV3ByNameResponse{}, fmt.Errorf("CallFetchSingleSecretByName: Unable to complete api request [err=%w]", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if response.IsError() {
|
||||||
|
return GetRawSecretV3ByNameResponse{}, fmt.Errorf("CallFetchSingleSecretByName: Unsuccessful response [%v %v] [status-code=%v] [response=%v]", response.Request.Method, response.Request.URL, response.StatusCode(), response.String())
|
||||||
|
}
|
||||||
|
|
||||||
|
getRawSecretV3ByNameResponse.ETag = response.Header().Get(("etag"))
|
||||||
|
|
||||||
|
return getRawSecretV3ByNameResponse, nil
|
||||||
|
}
|
||||||
|
|
||||||
func CallCreateDynamicSecretLeaseV1(httpClient *resty.Client, request CreateDynamicSecretLeaseV1Request) (CreateDynamicSecretLeaseV1Response, error) {
|
func CallCreateDynamicSecretLeaseV1(httpClient *resty.Client, request CreateDynamicSecretLeaseV1Request) (CreateDynamicSecretLeaseV1Response, error) {
|
||||||
var createDynamicSecretLeaseResponse CreateDynamicSecretLeaseV1Response
|
var createDynamicSecretLeaseResponse CreateDynamicSecretLeaseV1Response
|
||||||
response, err := httpClient.
|
response, err := httpClient.
|
||||||
|
|||||||
@@ -590,3 +590,25 @@ type GetRawSecretsV3Response struct {
|
|||||||
Imports []ImportedRawSecretV3 `json:"imports"`
|
Imports []ImportedRawSecretV3 `json:"imports"`
|
||||||
ETag string
|
ETag string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type GetRawSecretV3ByNameRequest struct {
|
||||||
|
SecretName string `json:"secretName"`
|
||||||
|
WorkspaceID string `json:"workspaceId"`
|
||||||
|
Type string `json:"type,omitempty"`
|
||||||
|
Environment string `json:"environment"`
|
||||||
|
SecretPath string `json:"secretPath,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type GetRawSecretV3ByNameResponse struct {
|
||||||
|
Secret struct {
|
||||||
|
ID string `json:"_id"`
|
||||||
|
Version int `json:"version"`
|
||||||
|
Workspace string `json:"workspace"`
|
||||||
|
Type string `json:"type"`
|
||||||
|
Environment string `json:"environment"`
|
||||||
|
SecretKey string `json:"secretKey"`
|
||||||
|
SecretValue string `json:"secretValue"`
|
||||||
|
SecretComment string `json:"secretComment"`
|
||||||
|
} `json:"secret"`
|
||||||
|
ETag string
|
||||||
|
}
|
||||||
|
|||||||
@@ -327,6 +327,21 @@ func secretTemplateFunction(accessToken string, existingEtag string, currentEtag
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func getSingleSecretTemplateFunction(accessToken string, existingEtag string, currentEtag *string) func(string, string, string, string) (models.SingleEnvironmentVariable, error) {
|
||||||
|
return func(projectID, envSlug, secretPath, secretName string) (models.SingleEnvironmentVariable, error) {
|
||||||
|
secret, requestEtag, err := util.GetSinglePlainTextSecretByNameV3(accessToken, projectID, envSlug, secretPath, secretName)
|
||||||
|
if err != nil {
|
||||||
|
return models.SingleEnvironmentVariable{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if existingEtag != requestEtag {
|
||||||
|
*currentEtag = requestEtag
|
||||||
|
}
|
||||||
|
|
||||||
|
return secret, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func dynamicSecretTemplateFunction(accessToken string, dynamicSecretManager *DynamicSecretLeaseManager, templateId int) func(...string) (map[string]interface{}, error) {
|
func dynamicSecretTemplateFunction(accessToken string, dynamicSecretManager *DynamicSecretLeaseManager, templateId int) func(...string) (map[string]interface{}, error) {
|
||||||
return func(args ...string) (map[string]interface{}, error) {
|
return func(args ...string) (map[string]interface{}, error) {
|
||||||
argLength := len(args)
|
argLength := len(args)
|
||||||
@@ -358,9 +373,11 @@ func ProcessTemplate(templateId int, templatePath string, data interface{}, acce
|
|||||||
// custom template function to fetch secrets from Infisical
|
// custom template function to fetch secrets from Infisical
|
||||||
secretFunction := secretTemplateFunction(accessToken, existingEtag, currentEtag)
|
secretFunction := secretTemplateFunction(accessToken, existingEtag, currentEtag)
|
||||||
dynamicSecretFunction := dynamicSecretTemplateFunction(accessToken, dynamicSecretManager, templateId)
|
dynamicSecretFunction := dynamicSecretTemplateFunction(accessToken, dynamicSecretManager, templateId)
|
||||||
|
getSingleSecretFunction := getSingleSecretTemplateFunction(accessToken, existingEtag, currentEtag)
|
||||||
funcs := template.FuncMap{
|
funcs := template.FuncMap{
|
||||||
"secret": secretFunction,
|
"secret": secretFunction,
|
||||||
"dynamic_secret": dynamicSecretFunction,
|
"dynamic_secret": dynamicSecretFunction,
|
||||||
|
"getSecretByName": getSingleSecretFunction,
|
||||||
"minus": func(a, b int) int {
|
"minus": func(a, b int) int {
|
||||||
return a - b
|
return a - b
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ type SingleEnvironmentVariable struct {
|
|||||||
Workspace string `json:"workspace"`
|
Workspace string `json:"workspace"`
|
||||||
} `json:"tags"`
|
} `json:"tags"`
|
||||||
Comment string `json:"comment"`
|
Comment string `json:"comment"`
|
||||||
|
Etag string `json:"Etag"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type PlaintextSecretResult struct {
|
type PlaintextSecretResult struct {
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ func ConvertPollingIntervalToTime(pollingInterval string) (time.Duration, error)
|
|||||||
switch unit {
|
switch unit {
|
||||||
case "s":
|
case "s":
|
||||||
if number < 60 {
|
if number < 60 {
|
||||||
return 0, fmt.Errorf("polling interval should be at least 60 seconds")
|
return 0, fmt.Errorf("polling interval must be at least 60 seconds")
|
||||||
}
|
}
|
||||||
return time.Duration(number) * time.Second, nil
|
return time.Duration(number) * time.Second, nil
|
||||||
case "m":
|
case "m":
|
||||||
|
|||||||
@@ -118,6 +118,36 @@ func GetPlainTextSecretsV3(accessToken string, workspaceId string, environmentNa
|
|||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func GetSinglePlainTextSecretByNameV3(accessToken string, workspaceId string, environmentName string, secretsPath string, secretName string) (models.SingleEnvironmentVariable, string, error) {
|
||||||
|
httpClient := resty.New()
|
||||||
|
httpClient.SetAuthToken(accessToken).
|
||||||
|
SetHeader("Accept", "application/json")
|
||||||
|
|
||||||
|
getSecretsRequest := api.GetRawSecretV3ByNameRequest{
|
||||||
|
WorkspaceID: workspaceId,
|
||||||
|
Environment: environmentName,
|
||||||
|
SecretName: secretName,
|
||||||
|
SecretPath: secretsPath,
|
||||||
|
}
|
||||||
|
|
||||||
|
rawSecret, err := api.CallFetchSingleSecretByName(httpClient, getSecretsRequest)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return models.SingleEnvironmentVariable{}, "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
formattedSecrets := models.SingleEnvironmentVariable{
|
||||||
|
Key: rawSecret.Secret.SecretKey,
|
||||||
|
WorkspaceId: rawSecret.Secret.Workspace,
|
||||||
|
Value: rawSecret.Secret.SecretValue,
|
||||||
|
Type: rawSecret.Secret.Type,
|
||||||
|
ID: rawSecret.Secret.ID,
|
||||||
|
Comment: rawSecret.Secret.SecretComment,
|
||||||
|
}
|
||||||
|
|
||||||
|
return formattedSecrets, rawSecret.ETag, nil
|
||||||
|
}
|
||||||
|
|
||||||
func CreateDynamicSecretLease(accessToken string, projectSlug string, environmentName string, secretsPath string, slug string, ttl string) (models.DynamicSecretLease, error) {
|
func CreateDynamicSecretLease(accessToken string, projectSlug string, environmentName string, secretsPath string, slug string, ttl string) (models.DynamicSecretLease, error) {
|
||||||
httpClient := resty.New()
|
httpClient := resty.New()
|
||||||
httpClient.SetAuthToken(accessToken).
|
httpClient.SetAuthToken(accessToken).
|
||||||
|
|||||||
Reference in New Issue
Block a user