@@ -17,7 +17,7 @@ import (
1717)
1818
1919const (
20- FieldOutputSecrets = "secrets"
20+ FieldSecrets = "secrets"
2121)
2222
2323var (
@@ -165,63 +165,63 @@ func replaceSliceRef(arr []any, secrets map[string]string) ([]any, []string) {
165165 return result , keys
166166}
167167
168- type OutputSecret struct {
168+ type Secret struct {
169169 Path []string
170170 ID string
171171}
172172
173- func getSecretIDAndPath (secret smap.Map ) ([]OutputSecret , error ) {
174- outputSecrets := make ([]OutputSecret , 0 )
173+ func getSecretIDAndPath (secret smap.Map ) ([]Secret , error ) {
174+ secrets := make ([]Secret , 0 )
175175
176176 secretID := secret .GetString ("id" )
177177 if secretID != "" {
178- outputSecrets = append (outputSecrets , OutputSecret {
178+ secrets = append (secrets , Secret {
179179 Path : make ([]string , 0 ),
180180 ID : secretID ,
181181 })
182182
183- return outputSecrets , nil
183+ return secrets , nil
184184 }
185185
186186 for secretKey := range secret {
187- newOutputSecrets , err := getSecretIDAndPath (secret .GetMap (secretKey ))
187+ newSecrets , err := getSecretIDAndPath (secret .GetMap (secretKey ))
188188 if err != nil {
189189 return nil , err
190190 }
191191
192- for _ , secret := range newOutputSecrets {
193- path := append ([]string {secretKey }, secret .Path ... )
194- outputSecrets = append (outputSecrets , OutputSecret {
192+ for _ , newSecret := range newSecrets {
193+ path := append ([]string {secretKey }, newSecret .Path ... )
194+ secrets = append (secrets , Secret {
195195 Path : path ,
196- ID : secret .ID ,
196+ ID : newSecret .ID ,
197197 })
198198 }
199199 }
200200
201- return outputSecrets , nil
201+ return secrets , nil
202202}
203203
204- func setSecretPath (output smap.Map , secretValue string , secretPaths []string ) error {
204+ func setSecretPath (section smap.Map , secretValue string , secretPaths []string ) error {
205205 // Break the recursion
206206 if len (secretPaths ) == 1 {
207- output [secretPaths [0 ]] = secretValue
207+ section [secretPaths [0 ]] = secretValue
208208
209209 return nil
210210 }
211211 path , secretPaths := secretPaths [0 ], secretPaths [1 :]
212212
213- if output .GetMap (path ) == nil {
214- output [path ] = make (map [string ]interface {})
213+ if section .GetMap (path ) == nil {
214+ section [path ] = make (map [string ]interface {})
215215 }
216216
217- return setSecretPath (output .GetMap (path ), secretValue , secretPaths )
217+ return setSecretPath (section .GetMap (path ), secretValue , secretPaths )
218218}
219219
220220// Read secret from output and mutate output with secret value
221221func ProcessOutputSecret (ctx context.Context , output smap.Map , bulker bulk.Bulk ) ([]string , error ) {
222- secrets := output .GetMap (FieldOutputSecrets )
222+ secrets := output .GetMap (FieldSecrets )
223223
224- delete (output , FieldOutputSecrets )
224+ delete (output , FieldSecrets )
225225 secretReferences := make ([]model.SecretReferencesItems , 0 )
226226 outputSecrets , err := getSecretIDAndPath (secrets )
227227 keys := make ([]string , 0 , len (outputSecrets ))
@@ -259,6 +259,48 @@ func ProcessOutputSecret(ctx context.Context, output smap.Map, bulker bulk.Bulk)
259259 return keys , nil
260260}
261261
262+ // ProcessAgentDownloadSecrets reads and replaces secrets in the agent.download section of the policy
263+ func ProcessAgentDownloadSecrets (ctx context.Context , agentDownload smap.Map , bulker bulk.Bulk ) ([]string , error ) {
264+ secrets := agentDownload .GetMap (FieldSecrets )
265+ delete (agentDownload , FieldSecrets )
266+
267+ secretReferences := make ([]model.SecretReferencesItems , 0 )
268+ agentDownloadSecrets , err := getSecretIDAndPath (secrets )
269+ keys := make ([]string , 0 , len (agentDownloadSecrets ))
270+ if err != nil {
271+ return nil , err
272+ }
273+
274+ for _ , secret := range agentDownloadSecrets {
275+ secretReferences = append (secretReferences , model.SecretReferencesItems {
276+ ID : secret .ID ,
277+ })
278+ }
279+ if len (secretReferences ) == 0 {
280+ return nil , nil
281+ }
282+ secretValues , err := GetSecretValues (ctx , secretReferences , bulker )
283+ if err != nil {
284+ return nil , err
285+ }
286+ for _ , secret := range agentDownloadSecrets {
287+ var key string
288+ for _ , p := range secret .Path {
289+ if key == "" {
290+ key = p
291+ continue
292+ }
293+ key = key + "." + p
294+ }
295+ keys = append (keys , key )
296+ err = setSecretPath (agentDownload , secretValues [secret .ID ], secret .Path )
297+ if err != nil {
298+ return nil , err
299+ }
300+ }
301+ return keys , nil
302+ }
303+
262304// replaceStringRef replaces values matching a secret ref regex, e.g. $co.elastic.secret{<secret ref>} -> <secret value>
263305// and does this for multiple matches
264306// returns the resulting string value, and if any replacements were made
0 commit comments