2022-07-20 16:24:46 -07:00
// Copyright (c) HashiCorp, Inc.
2022-06-09 15:35:34 -07:00
// SPDX-License-Identifier: BUSL-1.1
2023-02-02 17:15:17 -08:00
2022-06-09 15:35:34 -07:00
package static
import (
"context"
"fmt"
"github.com/hashicorp/boundary/internal/credential"
"github.com/hashicorp/boundary/internal/errors"
"github.com/hashicorp/boundary/internal/kms"
)
// Retrieve retrieves and returns static credentials from Boundary for all the provided
// ids. All the returned static credentials will have their secret fields decrypted.
2022-07-20 16:24:46 -07:00
func ( r * Repository ) Retrieve ( ctx context . Context , projectId string , ids [] string ) ([] credential . Static , error ) {
2022-06-09 15:35:34 -07:00
const op = "static.(Repository).Retrieve"
if len ( ids ) == 0 {
return nil , errors . New ( ctx , errors . InvalidParameter , op , "no ids" )
}
2022-07-19 10:31:53 -07:00
var upCreds [] * UsernamePasswordCredential
2022-10-25 18:29:38 -05:00
err := r . reader . SearchWhere ( ctx , & upCreds , "public_id in (?)" , [] any { ids })
2022-06-09 15:35:34 -07:00
if err != nil {
return nil , errors . Wrap ( ctx , err , op )
}
2025-05-22 20:00:26 +01:00
var updCreds [] * UsernamePasswordDomainCredential
err = r . reader . SearchWhere ( ctx , & updCreds , "public_id in (?)" , [] any { ids })
if err != nil {
return nil , errors . Wrap ( ctx , err , op )
}
2025-10-21 10:21:15 -05:00
var pCreds [] * PasswordCredential
err = r . reader . SearchWhere ( ctx , & pCreds , "public_id in (?)" , [] any { ids })
if err != nil {
return nil , errors . Wrap ( ctx , err , op )
}
2022-07-19 10:31:53 -07:00
var spkCreds [] * SshPrivateKeyCredential
2022-10-25 18:29:38 -05:00
err = r . reader . SearchWhere ( ctx , & spkCreds , "public_id in (?)" , [] any { ids })
2022-07-19 10:31:53 -07:00
if err != nil {
return nil , errors . Wrap ( ctx , err , op )
}
2022-09-16 15:00:04 -07:00
var jsonCreds [] * JsonCredential
2022-10-25 18:29:38 -05:00
err = r . reader . SearchWhere ( ctx , & jsonCreds , "public_id in (?)" , [] any { ids })
2022-09-16 15:00:04 -07:00
if err != nil {
return nil , errors . Wrap ( ctx , err , op )
}
2022-07-19 10:31:53 -07:00
2025-10-21 10:21:15 -05:00
if len ( upCreds ) + len ( updCreds ) + len ( pCreds ) + len ( spkCreds ) + len ( jsonCreds ) != len ( ids ) {
2022-06-09 15:35:34 -07:00
return nil , errors . New ( ctx , errors . NotSpecificIntegrity , op ,
2025-10-21 10:21:15 -05:00
fmt . Sprintf ( "mismatch between creds and number of ids requested, expected %d got %d" , len ( ids ), len ( upCreds ) + len ( updCreds ) + len ( pCreds ) + len ( spkCreds ) + len ( jsonCreds )))
2022-06-09 15:35:34 -07:00
}
out := make ([] credential . Static , 0 , len ( ids ))
2022-07-19 10:31:53 -07:00
for _ , c := range upCreds {
// decrypt credential
2022-07-20 16:24:46 -07:00
databaseWrapper , err := r . kms . GetWrapper ( ctx , projectId , kms . KeyPurposeDatabase )
2022-07-19 10:31:53 -07:00
if err != nil {
2025-05-22 20:00:26 +01:00
return nil , errors . Wrap ( ctx , err , op , errors . WithMsg ( "unable to get database wrapper" ))
}
if err := c . decrypt ( ctx , databaseWrapper ); err != nil {
return nil , errors . Wrap ( ctx , err , op )
}
out = append ( out , c )
}
for _ , c := range updCreds {
// decrypt credential
databaseWrapper , err := r . kms . GetWrapper ( ctx , projectId , kms . KeyPurposeDatabase )
if err != nil {
2025-10-21 10:21:15 -05:00
return nil , errors . Wrap ( ctx , err , op , errors . WithMsg ( "unable to get database wrapper" ))
}
if err := c . decrypt ( ctx , databaseWrapper ); err != nil {
return nil , errors . Wrap ( ctx , err , op )
}
out = append ( out , c )
}
for _ , c := range pCreds {
// decrypt credential
databaseWrapper , err := r . kms . GetWrapper ( ctx , projectId , kms . KeyPurposeDatabase )
if err != nil {
2022-07-19 10:31:53 -07:00
return nil , errors . Wrap ( ctx , err , op , errors . WithMsg ( "unable to get database wrapper" ))
}
if err := c . decrypt ( ctx , databaseWrapper ); err != nil {
return nil , errors . Wrap ( ctx , err , op )
}
out = append ( out , c )
}
for _ , c := range spkCreds {
2022-06-09 15:35:34 -07:00
// decrypt credential
2022-07-20 16:24:46 -07:00
databaseWrapper , err := r . kms . GetWrapper ( ctx , projectId , kms . KeyPurposeDatabase )
2022-06-09 15:35:34 -07:00
if err != nil {
return nil , errors . Wrap ( ctx , err , op , errors . WithMsg ( "unable to get database wrapper" ))
}
if err := c . decrypt ( ctx , databaseWrapper ); err != nil {
return nil , errors . Wrap ( ctx , err , op )
}
out = append ( out , c )
}
2022-09-16 15:00:04 -07:00
for _ , c := range jsonCreds {
// decrypt credential
databaseWrapper , err := r . kms . GetWrapper ( ctx , projectId , kms . KeyPurposeDatabase )
if err != nil {
return nil , errors . Wrap ( ctx , err , op , errors . WithMsg ( "unable to get database wrapper" ))
}
if err := c . decrypt ( ctx , databaseWrapper ); err != nil {
return nil , errors . Wrap ( ctx , err , op )
}
out = append ( out , c )
}
2022-06-09 15:35:34 -07:00
return out , nil
}