|
|
@@ -121,6 +121,8 @@ const (
|
|
|
errInvalidStoreSpec = "invalid store spec"
|
|
|
errInvalidStoreProv = "invalid store provider"
|
|
|
errInvalidVaultProv = "invalid vault provider"
|
|
|
+ errInvalidAppRoleID = "invalid Auth.AppRole: neither `roleId` nor `roleRef` was supplied"
|
|
|
+ errInvalidAppRoleRef = "invalid Auth.AppRole.RoleRef: %w"
|
|
|
errInvalidAppRoleSec = "invalid Auth.AppRole.SecretRef: %w"
|
|
|
errInvalidClientCert = "invalid Auth.Cert.ClientCert: %w"
|
|
|
errInvalidCertSec = "invalid Auth.Cert.SecretRef: %w"
|
|
|
@@ -318,9 +320,21 @@ func (c *Connector) ValidateStore(store esv1beta1.GenericStore) error {
|
|
|
return fmt.Errorf(errInvalidVaultProv)
|
|
|
}
|
|
|
if p.Auth.AppRole != nil {
|
|
|
+ // check SecretRef for valid configuration
|
|
|
if err := utils.ValidateReferentSecretSelector(store, p.Auth.AppRole.SecretRef); err != nil {
|
|
|
return fmt.Errorf(errInvalidAppRoleSec, err)
|
|
|
}
|
|
|
+
|
|
|
+ // prefer .auth.appRole.roleId, fallback to .auth.appRole.roleRef, give up after that.
|
|
|
+ if p.Auth.AppRole.RoleID == "" { // prevents further RoleID tests if .auth.appRole.roleId is given
|
|
|
+ if p.Auth.AppRole.RoleRef != nil { // check RoleRef for valid configuration
|
|
|
+ if err := utils.ValidateReferentSecretSelector(store, *p.Auth.AppRole.RoleRef); err != nil {
|
|
|
+ return fmt.Errorf(errInvalidAppRoleRef, err)
|
|
|
+ }
|
|
|
+ } else { // we ran out of ways to get RoleID. return an appropriate error
|
|
|
+ return fmt.Errorf(errInvalidAppRoleID)
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
if p.Auth.Cert != nil {
|
|
|
if err := utils.ValidateReferentSecretSelector(store, p.Auth.Cert.ClientCert); err != nil {
|
|
|
@@ -1293,7 +1307,20 @@ func revokeTokenIfValid(ctx context.Context, client util.Client) error {
|
|
|
}
|
|
|
|
|
|
func (v *client) requestTokenWithAppRoleRef(ctx context.Context, appRole *esv1beta1.VaultAppRole) error {
|
|
|
- roleID := strings.TrimSpace(appRole.RoleID)
|
|
|
+ var err error
|
|
|
+ var roleID string // becomes the RoleID used to authenticate with HashiCorp Vault
|
|
|
+
|
|
|
+ // prefer .auth.appRole.roleId, fallback to .auth.appRole.roleRef, give up after that.
|
|
|
+ if appRole.RoleID != "" { // use roleId from CRD, if configured
|
|
|
+ roleID = strings.TrimSpace(appRole.RoleID)
|
|
|
+ } else if appRole.RoleRef != nil { // use RoleID from Secret, if configured
|
|
|
+ roleID, err = v.secretKeyRef(ctx, appRole.RoleRef)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ } else { // we ran out of ways to get RoleID. return an appropriate error
|
|
|
+ return fmt.Errorf(errInvalidAppRoleID)
|
|
|
+ }
|
|
|
|
|
|
secretID, err := v.secretKeyRef(ctx, &appRole.SecretRef)
|
|
|
if err != nil {
|