From 804314cc18716e1d548c7e8fa4ecafd824ca238e Mon Sep 17 00:00:00 2001 From: Daniel Hougaard <62331820+DanielHougaard@users.noreply.github.com> Date: Fri, 31 May 2024 16:22:32 +0200 Subject: [PATCH] Feat: Include imports for MI Auth --- k8-operator/packages/api/api.go | 1 + k8-operator/packages/api/models.go | 14 ++++++++--- k8-operator/packages/util/secrets.go | 37 +++++++++++++++++++++++++++- 3 files changed, 48 insertions(+), 4 deletions(-) diff --git a/k8-operator/packages/api/api.go b/k8-operator/packages/api/api.go index ffc55fb92..5ca3bdba3 100644 --- a/k8-operator/packages/api/api.go +++ b/k8-operator/packages/api/api.go @@ -156,6 +156,7 @@ func CallGetDecryptedSecretsV3(httpClient *resty.Client, request GetDecryptedSec 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) diff --git a/k8-operator/packages/api/models.go b/k8-operator/packages/api/models.go index e2f1c6e93..8439e4918 100644 --- a/k8-operator/packages/api/models.go +++ b/k8-operator/packages/api/models.go @@ -84,6 +84,13 @@ type ImportedSecretV3 struct { Secrets []EncryptedSecretV3 `json:"secrets"` } +type ImportedRawSecretV3 struct { + Environment string `json:"environment"` + FolderId string `json:"folderId"` + SecretPath string `json:"secretPath"` + Secrets []DecryptedSecretV3 `json:"secrets"` +} + type GetEncryptedSecretsV3Response struct { Secrets []EncryptedSecretV3 `json:"secrets"` ImportedSecrets []ImportedSecretV3 `json:"imports,omitempty"` @@ -92,9 +99,10 @@ type GetEncryptedSecretsV3Response struct { } type GetDecryptedSecretsV3Response struct { - Secrets []DecryptedSecretV3 `json:"secrets"` - ETag string `json:"ETag,omitempty"` - Modified bool `json:"modified,omitempty"` + Secrets []DecryptedSecretV3 `json:"secrets"` + ETag string `json:"ETag,omitempty"` + Modified bool `json:"modified,omitempty"` + Imports []ImportedRawSecretV3 `json:"imports,omitempty"` } type GetDecryptedSecretsV3Request struct { diff --git a/k8-operator/packages/util/secrets.go b/k8-operator/packages/util/secrets.go index bb72cde5c..ee0666ea8 100644 --- a/k8-operator/packages/util/secrets.go +++ b/k8-operator/packages/util/secrets.go @@ -81,7 +81,13 @@ func GetPlainTextSecretsViaUniversalAuth(accessToken string, etag string, secret }) } - return secrets, model.RequestUpdateUpdateDetails{ + // No need to do expansion for Machine Identity auth as this is handled on server-side. + mergedSecrets := MergeRawImportedSecrets(secrets, secretsResponse.Imports) + if err != nil { + return nil, model.RequestUpdateUpdateDetails{}, err + } + + return mergedSecrets, model.RequestUpdateUpdateDetails{ Modified: secretsResponse.Modified, ETag: secretsResponse.ETag, }, nil @@ -436,3 +442,32 @@ func InjectImportedSecret(plainTextWorkspaceKey []byte, secrets []model.SingleEn return secrets, nil } + +func MergeRawImportedSecrets(secrets []model.SingleEnvironmentVariable, importedSecrets []api.ImportedRawSecretV3) []model.SingleEnvironmentVariable { + if importedSecrets == nil { + return secrets + } + + hasOverriden := make(map[string]bool) + for _, sec := range secrets { + hasOverriden[sec.Key] = true + } + + for i := len(importedSecrets) - 1; i >= 0; i-- { + importSec := importedSecrets[i] + + for _, sec := range importSec.Secrets { + if _, ok := hasOverriden[sec.SecretKey]; !ok { + secrets = append(secrets, model.SingleEnvironmentVariable{ + Key: sec.SecretKey, + Value: sec.SecretValue, + Type: sec.Type, + ID: sec.ID, + }) + hasOverriden[sec.SecretKey] = true + } + } + } + + return secrets +}