@@ -274,52 +274,52 @@ func replaceInlineSecretRefsInSlice(arr []any, secrets map[string]string) ([]any
274274 return result , keys
275275}
276276
277- type OutputSecret struct {
277+ type Secret struct {
278278 Path []string
279279 ID string
280280}
281281
282- func getSecretIDAndPath (secret smap.Map ) []OutputSecret {
283- outputSecrets := make ([]OutputSecret , 0 )
282+ func getSecretIDAndPath (secret smap.Map ) []Secret {
283+ secrets := make ([]Secret , 0 )
284284
285285 secretID := secret .GetString ("id" )
286286 if secretID != "" {
287- outputSecrets = append (outputSecrets , OutputSecret {
287+ secrets = append (secrets , Secret {
288288 Path : make ([]string , 0 ),
289289 ID : secretID ,
290290 })
291291
292- return outputSecrets
292+ return secrets
293293 }
294294
295295 for secretKey := range secret {
296- newOutputSecrets := getSecretIDAndPath (secret .GetMap (secretKey ))
296+ newSecrets := getSecretIDAndPath (secret .GetMap (secretKey ))
297297
298- for _ , secret := range newOutputSecrets {
299- path := append ([]string {secretKey }, secret .Path ... )
300- outputSecrets = append (outputSecrets , OutputSecret {
298+ for _ , newSecret := range newSecrets {
299+ path := append ([]string {secretKey }, newSecret .Path ... )
300+ secrets = append (secrets , Secret {
301301 Path : path ,
302- ID : secret .ID ,
302+ ID : newSecret .ID ,
303303 })
304304 }
305305 }
306306
307- return outputSecrets
307+ return secrets
308308}
309309
310- func setSecretPath (output smap.Map , secretValue string , secretPaths []string ) {
310+ func setSecretPath (section smap.Map , secretValue string , secretPaths []string ) {
311311 // Break the recursion
312312 if len (secretPaths ) == 1 {
313- output [secretPaths [0 ]] = secretValue
313+ section [secretPaths [0 ]] = secretValue
314314 return
315315 }
316316 path , secretPaths := secretPaths [0 ], secretPaths [1 :]
317317
318- if output .GetMap (path ) == nil {
319- output [path ] = make (map [string ]interface {})
318+ if section .GetMap (path ) == nil {
319+ section [path ] = make (map [string ]interface {})
320320 }
321321
322- setSecretPath (output .GetMap (path ), secretValue , secretPaths )
322+ setSecretPath (section .GetMap (path ), secretValue , secretPaths )
323323}
324324
325325// Read secret from output and mutate output with secret value
@@ -378,6 +378,42 @@ func processOutputWithInlineSecrets(output smap.Map, secretValues map[string]str
378378 return keys
379379}
380380
381+ // ProcessAgentDownloadSecrets reads and replaces secrets in the agent.download section of the policy
382+ func ProcessAgentDownloadSecrets (ctx context.Context , agentDownload smap.Map , bulker bulk.Bulk ) ([]string , error ) {
383+ secrets := agentDownload .GetMap (FieldSecrets )
384+ delete (agentDownload , FieldSecrets )
385+
386+ secretReferences := make ([]model.SecretReferencesItems , 0 )
387+ agentDownloadSecrets := getSecretIDAndPath (secrets )
388+ keys := make ([]string , 0 , len (agentDownloadSecrets ))
389+
390+ for _ , secret := range agentDownloadSecrets {
391+ secretReferences = append (secretReferences , model.SecretReferencesItems {
392+ ID : secret .ID ,
393+ })
394+ }
395+ if len (secretReferences ) == 0 {
396+ return nil , nil
397+ }
398+ secretValues , err := GetSecretValues (ctx , secretReferences , bulker )
399+ if err != nil {
400+ return nil , err
401+ }
402+ for _ , secret := range agentDownloadSecrets {
403+ var key string
404+ for _ , p := range secret .Path {
405+ if key == "" {
406+ key = p
407+ continue
408+ }
409+ key = key + "." + p
410+ }
411+ keys = append (keys , key )
412+ setSecretPath (agentDownload , secretValues [secret .ID ], secret .Path )
413+ }
414+ return keys , nil
415+ }
416+
381417// replaceStringRef replaces values matching a secret ref regex, e.g. $co.elastic.secret{<secret ref>} -> <secret value>
382418// and does this for multiple matches
383419// returns the resulting string value, and if any replacements were made
0 commit comments