From 5921dcaa519d0cff0c3f8721ad260d1155cdf2c4 Mon Sep 17 00:00:00 2001 From: = Date: Mon, 15 Jul 2024 01:23:03 +0530 Subject: [PATCH] feat: switched operator to raw endpoints for secret management --- .../controllers/infisicalsecret_helper.go | 17 +- k8-operator/packages/api/api.go | 93 ----- k8-operator/packages/api/models.go | 1 + k8-operator/packages/util/secrets.go | 317 +++--------------- 4 files changed, 53 insertions(+), 375 deletions(-) diff --git a/k8-operator/controllers/infisicalsecret_helper.go b/k8-operator/controllers/infisicalsecret_helper.go index f92275af4..acb8b9e76 100644 --- a/k8-operator/controllers/infisicalsecret_helper.go +++ b/k8-operator/controllers/infisicalsecret_helper.go @@ -40,6 +40,10 @@ func (r *InfisicalSecretReconciler) HandleAuthentication(ctx context.Context, in if err != nil { return AuthenticationDetails{}, fmt.Errorf("ReconcileInfisicalSecret: unable to get service token from kube secret [err=%s]", err) } + if infisicalToken != "" { + infisicalClient.Auth().SetAccessToken(infisicalToken) + return AuthenticationDetails{authStrategy: AuthStrategy.SERVICE_TOKEN}, nil + } // ? Legacy support, service account auth serviceAccountCreds, err := r.GetInfisicalServiceAccountCredentialsFromKubeSecret(ctx, infisicalSecret) @@ -48,9 +52,8 @@ func (r *InfisicalSecretReconciler) HandleAuthentication(ctx context.Context, in } if serviceAccountCreds.AccessKey != "" || serviceAccountCreds.PrivateKey != "" || serviceAccountCreds.PublicKey != "" { + infisicalClient.Auth().SetAccessToken(serviceAccountCreds.AccessKey) return AuthenticationDetails{authStrategy: AuthStrategy.SERVICE_ACCOUNT}, nil - } else if infisicalToken != "" { - return AuthenticationDetails{authStrategy: AuthStrategy.SERVICE_TOKEN}, nil } authStrategies := map[AuthStrategyType]func(ctx context.Context, infisicalSecret v1alpha1.InfisicalSecret, infisicalClient infisicalSdk.InfisicalClientInterface) (AuthenticationDetails, error){ @@ -69,7 +72,7 @@ func (r *InfisicalSecretReconciler) HandleAuthentication(ctx context.Context, in return authDetails, nil } - if err != nil && !errors.Is(err, ErrAuthNotApplicable) { + if !errors.Is(err, ErrAuthNotApplicable) { return AuthenticationDetails{}, fmt.Errorf("authentication failed for strategy [%s] [err=%w]", authStrategy, err) } } @@ -360,11 +363,7 @@ func (r *InfisicalSecretReconciler) ReconcileInfisicalSecret(ctx context.Context return fmt.Errorf("ReconcileInfisicalSecret: unable to get service account creds from kube secret [err=%s]", err) } - if err != nil { - return fmt.Errorf("unable to load Infisical Token from the specified Kubernetes secret with error [%w]", err) - } - - plainTextSecretsFromApi, updateDetails, err = util.GetPlainTextSecretsViaServiceAccount(serviceAccountCreds, infisicalSecret.Spec.Authentication.ServiceAccount.ProjectId, infisicalSecret.Spec.Authentication.ServiceAccount.EnvironmentName, secretVersionBasedOnETag) + plainTextSecretsFromApi, updateDetails, err = util.GetPlainTextSecretsViaServiceAccount(infisicalClient, serviceAccountCreds, infisicalSecret.Spec.Authentication.ServiceAccount.ProjectId, infisicalSecret.Spec.Authentication.ServiceAccount.EnvironmentName, secretVersionBasedOnETag) if err != nil { return fmt.Errorf("\nfailed to get secrets because [err=%v]", err) } @@ -381,7 +380,7 @@ func (r *InfisicalSecretReconciler) ReconcileInfisicalSecret(ctx context.Context secretsPath := infisicalSecret.Spec.Authentication.ServiceToken.SecretsScope.SecretsPath recursive := infisicalSecret.Spec.Authentication.ServiceToken.SecretsScope.Recursive - plainTextSecretsFromApi, updateDetails, err = util.GetPlainTextSecretsViaServiceToken(infisicalToken, secretVersionBasedOnETag, envSlug, secretsPath, recursive) + plainTextSecretsFromApi, updateDetails, err = util.GetPlainTextSecretsViaServiceToken(infisicalClient, infisicalToken, secretVersionBasedOnETag, envSlug, secretsPath, recursive) if err != nil { return fmt.Errorf("\nfailed to get secrets because [err=%v]", err) } diff --git a/k8-operator/packages/api/api.go b/k8-operator/packages/api/api.go index 5ca3bdba3..dd2af3353 100644 --- a/k8-operator/packages/api/api.go +++ b/k8-operator/packages/api/api.go @@ -8,26 +8,6 @@ import ( const USER_AGENT_NAME = "k8-operator" -func CallGetEncryptedWorkspaceKey(httpClient *resty.Client, request GetEncryptedWorkspaceKeyRequest) (GetEncryptedWorkspaceKeyResponse, error) { - endpoint := fmt.Sprintf("%v/v2/workspace/%v/encrypted-key", API_HOST_URL, request.WorkspaceId) - var result GetEncryptedWorkspaceKeyResponse - response, err := httpClient. - R(). - SetResult(&result). - SetHeader("User-Agent", USER_AGENT_NAME). - Get(endpoint) - - if err != nil { - return GetEncryptedWorkspaceKeyResponse{}, fmt.Errorf("CallGetEncryptedWorkspaceKey: Unable to complete api request [err=%s]", err) - } - - if response.IsError() { - return GetEncryptedWorkspaceKeyResponse{}, fmt.Errorf("CallGetEncryptedWorkspaceKey: Unsuccessful response: [response=%s]", response) - } - - return result, nil -} - func CallGetServiceTokenDetailsV2(httpClient *resty.Client) (GetServiceTokenDetailsResponse, error) { var tokenDetailsResponse GetServiceTokenDetailsResponse response, err := httpClient. @@ -51,43 +31,6 @@ func CallGetServiceTokenDetailsV2(httpClient *resty.Client) (GetServiceTokenDeta return tokenDetailsResponse, nil } -func CallGetSecretsV3(httpClient *resty.Client, request GetEncryptedSecretsV3Request) (GetEncryptedSecretsV3Response, error) { - var secretsResponse GetEncryptedSecretsV3Response - - httpRequest := httpClient. - R(). - SetResult(&secretsResponse). - SetHeader("User-Agent", USER_AGENT_NAME). - SetQueryParam("environment", request.Environment). - SetQueryParam("include_imports", "true"). // TODO needs to be set as a option - SetQueryParam("workspaceId", request.WorkspaceId) - - if request.SecretPath != "" { - httpRequest.SetQueryParam("secretPath", request.SecretPath) - } - - if request.Recursive { - httpRequest.SetQueryParam("recursive", "true") - } - - response, err := httpRequest.Get(fmt.Sprintf("%v/v3/secrets", API_HOST_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) - } - - responseETag := response.Header().Get("etag") - - secretsResponse.Modified = request.ETag != responseETag - secretsResponse.ETag = responseETag - - return secretsResponse, nil -} - func CallGetServiceTokenAccountDetailsV2(httpClient *resty.Client) (ServiceAccountDetailsResponse, error) { var serviceAccountDetailsResponse ServiceAccountDetailsResponse response, err := httpClient. @@ -149,42 +92,6 @@ func CallUniversalMachineIdentityRefreshAccessToken(request MachineIdentityUnive return universalAuthRefreshResponse, nil } -func CallGetDecryptedSecretsV3(httpClient *resty.Client, request GetDecryptedSecretsV3Request) (GetDecryptedSecretsV3Response, error) { - var decryptedSecretsResponse GetDecryptedSecretsV3Response - - req := httpClient. - R(). - SetResult(&decryptedSecretsResponse). - SetHeader("User-Agent", USER_AGENT_NAME). - SetQueryParam("include_imports", "true"). - SetQueryParam("secretPath", request.SecretPath). - SetQueryParam("workspaceSlug", request.ProjectSlug). - SetQueryParam("environment", request.Environment) - - if request.Recursive { - req.SetQueryParam("recursive", "true") - } - if request.ExpandSecretReferences { - req.SetQueryParam("expandSecretReferences", "true") - } - - response, err := req.Get(fmt.Sprintf("%v/v3/secrets/raw", API_HOST_URL)) - - if err != nil { - return GetDecryptedSecretsV3Response{}, fmt.Errorf("CallGetDecryptedSecretsV3: Unable to complete api request [err=%s]", err) - } - if response.IsError() { - return GetDecryptedSecretsV3Response{}, fmt.Errorf("CallGetDecryptedSecretsV3: Unsuccessful response: [response=%s]", response) - } - - responseETag := response.Header().Get("etag") - - decryptedSecretsResponse.Modified = request.ETag != responseETag - decryptedSecretsResponse.ETag = responseETag - - return decryptedSecretsResponse, nil -} - func CallGetServiceAccountWorkspacePermissionsV2(httpClient *resty.Client) (ServiceAccountWorkspacePermissions, error) { var serviceAccountWorkspacePermissionsResponse ServiceAccountWorkspacePermissions response, err := httpClient. diff --git a/k8-operator/packages/api/models.go b/k8-operator/packages/api/models.go index 8439e4918..b2316117b 100644 --- a/k8-operator/packages/api/models.go +++ b/k8-operator/packages/api/models.go @@ -106,6 +106,7 @@ type GetDecryptedSecretsV3Response struct { } type GetDecryptedSecretsV3Request struct { + ProjectID string `json:"workspaceId"` ProjectSlug string `json:"workspaceSlug"` Environment string `json:"environment"` SecretPath string `json:"secretPath"` diff --git a/k8-operator/packages/util/secrets.go b/k8-operator/packages/util/secrets.go index c46617a23..9fb79c1de 100644 --- a/k8-operator/packages/util/secrets.go +++ b/k8-operator/packages/util/secrets.go @@ -1,10 +1,7 @@ package util import ( - "encoding/base64" "fmt" - "path" - "regexp" "strings" "github.com/Infisical/infisical/k8-operator/api/v1alpha1" @@ -87,7 +84,7 @@ func GetPlainTextSecretsViaMachineIdentity(infisicalClient infisical.InfisicalCl }, nil } -func GetPlainTextSecretsViaServiceToken(fullServiceToken string, etag string, envSlug string, secretPath string, recursive bool) ([]model.SingleEnvironmentVariable, model.RequestUpdateUpdateDetails, error) { +func GetPlainTextSecretsViaServiceToken(infisicalClient infisical.InfisicalClientInterface, fullServiceToken string, etag string, envSlug string, secretPath string, recursive bool) ([]model.SingleEnvironmentVariable, model.RequestUpdateUpdateDetails, error) { serviceTokenParts := strings.SplitN(fullServiceToken, ".", 4) if len(serviceTokenParts) < 4 { return nil, model.RequestUpdateUpdateDetails{}, fmt.Errorf("invalid service token entered. Please double check your service token and try again") @@ -105,51 +102,44 @@ func GetPlainTextSecretsViaServiceToken(fullServiceToken string, etag string, en return nil, model.RequestUpdateUpdateDetails{}, fmt.Errorf("unable to get service token details. [err=%v]", err) } - encryptedSecretsResponse, err := api.CallGetSecretsV3(httpClient, api.GetEncryptedSecretsV3Request{ - WorkspaceId: serviceTokenDetails.Workspace, - Environment: envSlug, - Recursive: recursive, - ETag: etag, - SecretPath: secretPath, + secrets, err := infisicalClient.Secrets().List(infisical.ListSecretsOptions{ + ProjectID: serviceTokenDetails.Workspace, + Environment: envSlug, + Recursive: recursive, + SecretPath: secretPath, + IncludeImports: true, + ExpandSecretReferences: true, }) if err != nil { return nil, model.RequestUpdateUpdateDetails{}, err } - decodedSymmetricEncryptionDetails, err := GetBase64DecodedSymmetricEncryptionDetails(serviceTokenParts[3], serviceTokenDetails.EncryptedKey, serviceTokenDetails.Iv, serviceTokenDetails.Tag) - if err != nil { - return nil, model.RequestUpdateUpdateDetails{}, fmt.Errorf("unable to decode symmetric encryption details [err=%v]", err) + var environmentVariables []model.SingleEnvironmentVariable + + for _, secret := range secrets { + + environmentVariables = append(environmentVariables, model.SingleEnvironmentVariable{ + Key: secret.SecretKey, + Value: secret.SecretValue, + Type: secret.Type, + ID: secret.ID, + }) } - plainTextWorkspaceKey, err := crypto.DecryptSymmetric([]byte(serviceTokenParts[3]), decodedSymmetricEncryptionDetails.Cipher, decodedSymmetricEncryptionDetails.Tag, decodedSymmetricEncryptionDetails.IV) - if err != nil { - return nil, model.RequestUpdateUpdateDetails{}, fmt.Errorf("unable to decrypt the required workspace key") - } + newEtag := crypto.ComputeEtag([]byte(fmt.Sprintf("%v", environmentVariables))) - plainTextSecrets, err := GetPlainTextSecrets(plainTextWorkspaceKey, encryptedSecretsResponse.Secrets) - if err != nil { - return nil, model.RequestUpdateUpdateDetails{}, fmt.Errorf("unable to decrypt your secrets [err=%v]", err) - } - - plainTextSecretsMergedWithImports, err := InjectImportedSecret(plainTextWorkspaceKey, plainTextSecrets, encryptedSecretsResponse.ImportedSecrets) - if err != nil { - return nil, model.RequestUpdateUpdateDetails{}, err - } - - // expand secrets that are referenced - expandedSecrets := ExpandSecrets(plainTextSecretsMergedWithImports, fullServiceToken) - - return expandedSecrets, model.RequestUpdateUpdateDetails{ - Modified: encryptedSecretsResponse.Modified, - ETag: encryptedSecretsResponse.ETag, + return environmentVariables, model.RequestUpdateUpdateDetails{ + Modified: etag != newEtag, + ETag: newEtag, }, nil + } // Fetches plaintext secrets from an API endpoint using a service account. // The function fetches the service account details and keys, decrypts the workspace key, fetches the encrypted secrets for the specified project and environment, and decrypts the secrets using the decrypted workspace key. // Returns the plaintext secrets, encrypted secrets response, and any errors that occurred during the process. -func GetPlainTextSecretsViaServiceAccount(serviceAccountCreds model.ServiceAccountDetails, projectId string, environmentName string, etag string) ([]model.SingleEnvironmentVariable, model.RequestUpdateUpdateDetails, error) { +func GetPlainTextSecretsViaServiceAccount(infisicalClient infisical.InfisicalClientInterface, serviceAccountCreds model.ServiceAccountDetails, projectId string, environmentName string, etag string) ([]model.SingleEnvironmentVariable, model.RequestUpdateUpdateDetails, error) { httpClient := resty.New() httpClient.SetAuthToken(serviceAccountCreds.AccessKey). SetHeader("Accept", "application/json") @@ -176,226 +166,36 @@ func GetPlainTextSecretsViaServiceAccount(serviceAccountCreds model.ServiceAccou return nil, model.RequestUpdateUpdateDetails{}, fmt.Errorf("unable to find key for [projectId=%s] [err=%v]. Ensure that the given service account has access to given projectId", projectId, err) } - cipherText, err := base64.StdEncoding.DecodeString(workspaceServiceAccountKey.EncryptedKey) - if err != nil { - return nil, model.RequestUpdateUpdateDetails{}, fmt.Errorf("GetPlainTextSecretsViaServiceAccount: unable to decode EncryptedKey secrets because [err=%v]", err) - } - - nonce, err := base64.StdEncoding.DecodeString(workspaceServiceAccountKey.Nonce) - if err != nil { - return nil, model.RequestUpdateUpdateDetails{}, fmt.Errorf("GetPlainTextSecretsViaServiceAccount: unable to decode nonce secrets because [err=%v]", err) - } - - publickey, err := base64.StdEncoding.DecodeString(serviceAccountCreds.PublicKey) - if err != nil { - return nil, model.RequestUpdateUpdateDetails{}, fmt.Errorf("GetPlainTextSecretsViaServiceAccount: unable to decode PublicKey secrets because [err=%v]", err) - } - - privateKey, err := base64.StdEncoding.DecodeString(serviceAccountCreds.PrivateKey) - - if err != nil { - return nil, model.RequestUpdateUpdateDetails{}, fmt.Errorf("GetPlainTextSecretsViaServiceAccount: unable to decode PrivateKey secrets because [err=%v]", err) - } - - plainTextWorkspaceKey := crypto.DecryptAsymmetric(cipherText, nonce, publickey, privateKey) - - encryptedSecretsResponse, err := api.CallGetSecretsV3(httpClient, api.GetEncryptedSecretsV3Request{ - WorkspaceId: projectId, - Environment: environmentName, - ETag: etag, + secrets, err := infisicalClient.Secrets().List(infisical.ListSecretsOptions{ + ProjectID: projectId, + Environment: environmentName, + Recursive: false, + SecretPath: "/", + IncludeImports: true, + ExpandSecretReferences: true, }) if err != nil { - return nil, model.RequestUpdateUpdateDetails{}, fmt.Errorf("unable to fetch secrets because [err=%v]", err) + return nil, model.RequestUpdateUpdateDetails{}, err } - plainTextSecrets, err := GetPlainTextSecrets(plainTextWorkspaceKey, encryptedSecretsResponse.Secrets) - if err != nil { - return nil, model.RequestUpdateUpdateDetails{}, fmt.Errorf("GetPlainTextSecretsViaServiceAccount: unable to get plain text secrets because [err=%v]", err) - } + var environmentVariables []model.SingleEnvironmentVariable - return plainTextSecrets, model.RequestUpdateUpdateDetails{ - Modified: encryptedSecretsResponse.Modified, - ETag: encryptedSecretsResponse.ETag, - }, nil -} - -func GetBase64DecodedSymmetricEncryptionDetails(key string, cipher string, IV string, tag string) (DecodedSymmetricEncryptionDetails, error) { - cipherx, err := base64.StdEncoding.DecodeString(cipher) - if err != nil { - return DecodedSymmetricEncryptionDetails{}, fmt.Errorf("Base64DecodeSymmetricEncryptionDetails: Unable to decode cipher text [err=%v]", err) - } - - keyx, err := base64.StdEncoding.DecodeString(key) - if err != nil { - return DecodedSymmetricEncryptionDetails{}, fmt.Errorf("Base64DecodeSymmetricEncryptionDetails: Unable to decode key [err=%v]", err) - } - - IVx, err := base64.StdEncoding.DecodeString(IV) - if err != nil { - return DecodedSymmetricEncryptionDetails{}, fmt.Errorf("Base64DecodeSymmetricEncryptionDetails: Unable to decode IV [err=%v]", err) - } - - tagx, err := base64.StdEncoding.DecodeString(tag) - if err != nil { - return DecodedSymmetricEncryptionDetails{}, fmt.Errorf("Base64DecodeSymmetricEncryptionDetails: Unable to decode tag [err=%v]", err) - } - - return DecodedSymmetricEncryptionDetails{ - Key: keyx, - Cipher: cipherx, - IV: IVx, - Tag: tagx, - }, nil -} - -func GetPlainTextSecrets(key []byte, encryptedSecrets []api.EncryptedSecretV3) ([]model.SingleEnvironmentVariable, error) { - plainTextSecrets := []model.SingleEnvironmentVariable{} - for _, secret := range encryptedSecrets { - // Decrypt key - key_iv, err := base64.StdEncoding.DecodeString(secret.SecretKeyIV) - if err != nil { - return nil, fmt.Errorf("unable to decode secret IV for secret key") - } - - key_tag, err := base64.StdEncoding.DecodeString(secret.SecretKeyTag) - if err != nil { - return nil, fmt.Errorf("unable to decode secret authentication tag for secret key") - } - - key_ciphertext, err := base64.StdEncoding.DecodeString(secret.SecretKeyCiphertext) - if err != nil { - return nil, fmt.Errorf("unable to decode secret cipher text for secret key") - } - - plainTextKey, err := crypto.DecryptSymmetric(key, key_ciphertext, key_tag, key_iv) - if err != nil { - return nil, fmt.Errorf("unable to symmetrically decrypt secret key") - } - - // Decrypt value - value_iv, err := base64.StdEncoding.DecodeString(secret.SecretValueIV) - if err != nil { - return nil, fmt.Errorf("unable to decode secret IV for secret value") - } - - value_tag, err := base64.StdEncoding.DecodeString(secret.SecretValueTag) - if err != nil { - return nil, fmt.Errorf("unable to decode secret authentication tag for secret value") - } - - value_ciphertext, _ := base64.StdEncoding.DecodeString(secret.SecretValueCiphertext) - if err != nil { - return nil, fmt.Errorf("unable to decode secret cipher text for secret key") - } - - plainTextValue, err := crypto.DecryptSymmetric(key, value_ciphertext, value_tag, value_iv) - if err != nil { - return nil, fmt.Errorf("unable to symmetrically decrypt secret value") - } - - plainTextSecret := model.SingleEnvironmentVariable{ - Key: string(plainTextKey), - Value: string(plainTextValue), - Type: string(secret.Type), + for _, secret := range secrets { + environmentVariables = append(environmentVariables, model.SingleEnvironmentVariable{ + Key: secret.SecretKey, + Value: secret.SecretValue, + Type: secret.Type, ID: secret.ID, - } - - plainTextSecrets = append(plainTextSecrets, plainTextSecret) + }) } - return plainTextSecrets, nil -} + newEtag := crypto.ComputeEtag([]byte(fmt.Sprintf("%v", environmentVariables))) -var secRefRegex = regexp.MustCompile(`\${([^\}]*)}`) - -func recursivelyExpandSecret(expandedSecs map[string]string, interpolatedSecs map[string]string, crossSecRefFetch func(env string, path []string, key string) string, key string) string { - if v, ok := expandedSecs[key]; ok { - return v - } - - interpolatedVal, ok := interpolatedSecs[key] - if !ok { - return "" - // panic(fmt.Errorf("Could not find referred secret with key name %s", key), "Please check it refers a") - } - - refs := secRefRegex.FindAllStringSubmatch(interpolatedVal, -1) - for _, val := range refs { - // key: "${something}" val: [${something},something] - interpolatedExp, interpolationKey := val[0], val[1] - ref := strings.Split(interpolationKey, ".") - - // ${KEY1} => [key1] - if len(ref) == 1 { - val := recursivelyExpandSecret(expandedSecs, interpolatedSecs, crossSecRefFetch, interpolationKey) - interpolatedVal = strings.ReplaceAll(interpolatedVal, interpolatedExp, val) - continue - } - - // cross board reference ${env.folder.key1} => [env folder key1] - if len(ref) > 1 { - secEnv, tmpSecPath, secKey := ref[0], ref[1:len(ref)-1], ref[len(ref)-1] - interpolatedSecs[interpolationKey] = crossSecRefFetch(secEnv, tmpSecPath, secKey) // get the reference value - val := recursivelyExpandSecret(expandedSecs, interpolatedSecs, crossSecRefFetch, interpolationKey) - interpolatedVal = strings.ReplaceAll(interpolatedVal, interpolatedExp, val) - } - - } - expandedSecs[key] = interpolatedVal - return interpolatedVal -} - -func ExpandSecrets(secrets []model.SingleEnvironmentVariable, infisicalToken string) []model.SingleEnvironmentVariable { - expandedSecs := make(map[string]string) - interpolatedSecs := make(map[string]string) - // map[env.secret-path][keyname]Secret - crossEnvRefSecs := make(map[string]map[string]model.SingleEnvironmentVariable) // a cache to hold all cross board reference secrets - - for _, sec := range secrets { - // get all references in a secret - refs := secRefRegex.FindAllStringSubmatch(sec.Value, -1) - // nil means its a secret without reference - if refs == nil { - expandedSecs[sec.Key] = sec.Value // atomic secrets without any interpolation - } else { - interpolatedSecs[sec.Key] = sec.Value - } - } - - for i, sec := range secrets { - // already present pick that up - if expandedVal, ok := expandedSecs[sec.Key]; ok { - secrets[i].Value = expandedVal - continue - } - - expandedVal := recursivelyExpandSecret(expandedSecs, interpolatedSecs, func(env string, secPaths []string, secKey string) string { - secPaths = append([]string{"/"}, secPaths...) - secPath := path.Join(secPaths...) - - secPathDot := strings.Join(secPaths, ".") - uniqKey := fmt.Sprintf("%s.%s", env, secPathDot) - - if crossRefSec, ok := crossEnvRefSecs[uniqKey]; !ok { - // if not in cross reference cache, fetch it from server - refSecs, _, err := GetPlainTextSecretsViaServiceToken(infisicalToken, "", env, secPath, false) - if err != nil { - fmt.Printf("Could not fetch secrets in environment: %s secret-path: %s", env, secPath) - // HandleError(err, fmt.Sprintf("Could not fetch secrets in environment: %s secret-path: %s", env, secPath), "If you are using a service token to fetch secrets, please ensure it is valid") - } - refSecsByKey := getSecretsByKeys(refSecs) - // save it to avoid calling api again for same environment and folder path - crossEnvRefSecs[uniqKey] = refSecsByKey - return refSecsByKey[secKey].Value - } else { - return crossRefSec[secKey].Value - } - }, sec.Key) - - secrets[i].Value = expandedVal - } - return secrets + return environmentVariables, model.RequestUpdateUpdateDetails{ + Modified: etag != newEtag, + ETag: newEtag, + }, nil } func getSecretsByKeys(secrets []model.SingleEnvironmentVariable) map[string]model.SingleEnvironmentVariable { @@ -408,35 +208,6 @@ func getSecretsByKeys(secrets []model.SingleEnvironmentVariable) map[string]mode return secretMapByName } -func InjectImportedSecret(plainTextWorkspaceKey []byte, secrets []model.SingleEnvironmentVariable, importedSecrets []api.ImportedSecretV3) ([]model.SingleEnvironmentVariable, error) { - if importedSecrets == nil { - return secrets, nil - } - - hasOverriden := make(map[string]bool) - for _, sec := range secrets { - hasOverriden[sec.Key] = true - } - - for i := len(importedSecrets) - 1; i >= 0; i-- { - importSec := importedSecrets[i] - plainTextImportedSecrets, err := GetPlainTextSecrets(plainTextWorkspaceKey, importSec.Secrets) - - if err != nil { - return nil, fmt.Errorf("unable to decrypt your imported secrets [err=%v]", err) - } - - for _, sec := range plainTextImportedSecrets { - if _, ok := hasOverriden[sec.Key]; !ok { - secrets = append(secrets, sec) - hasOverriden[sec.Key] = true - } - } - } - - return secrets, nil -} - func MergeRawImportedSecrets(secrets []model.SingleEnvironmentVariable, importedSecrets []api.ImportedRawSecretV3) []model.SingleEnvironmentVariable { if importedSecrets == nil { return secrets