pkg/dataplane/keyvault.go (84 lines of code) (raw):
package dataplane
import (
"encoding/json"
"fmt"
"time"
"github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azsecrets"
)
func ptrTo[o any](s o) *o {
return &s
}
// IdentifierForManagedIdentityCredentials creates a canonical identifier for a KeyVault item, labelling the
// item as storing managed identity credentials.
func IdentifierForManagedIdentityCredentials(identifier string) string {
return ManagedIdentityCredentialsStoragePrefix + identifier
}
// IdentifierForUserAssignedIdentityCredentials creates a canonical identifier for a KeyVault item, labelling the
// item as storing user-assigned managed identity credentials.
func IdentifierForUserAssignedIdentityCredentials(identifier string) string {
return UserAssignedIdentityCredentialsStoragePrefix + identifier
}
// FormatManagedIdentityCredentialsForStorage provides the canonical KeyVault secret parameters for storing
// managed identity credentials, ensuring that appropriate times are recorded for the expiry and notBefore,
// as well as that renewal times are recorded in tags.
func FormatManagedIdentityCredentialsForStorage(identifier string, credentials ManagedIdentityCredentials) (string, azsecrets.SetSecretParameters, error) {
var rawNotAfter, rawNotBefore, rawRenewAfter, rawCannotRenewAfter *string
switch len(credentials.ExplicitIdentities) {
case 0:
rawNotAfter = credentials.NotAfter
rawNotBefore = credentials.NotBefore
rawRenewAfter = credentials.RenewAfter
rawCannotRenewAfter = credentials.CannotRenewAfter
case 1:
rawNotAfter = credentials.ExplicitIdentities[0].NotAfter
rawNotBefore = credentials.ExplicitIdentities[0].NotBefore
rawRenewAfter = credentials.ExplicitIdentities[0].RenewAfter
rawCannotRenewAfter = credentials.ExplicitIdentities[0].CannotRenewAfter
default:
return "", azsecrets.SetSecretParameters{}, fmt.Errorf("assumption violated, found %d explicit identities, expected none, or one", len(credentials.ExplicitIdentities))
}
parameters, err := keyVaultParameters(credentials, rawNotAfter, rawNotBefore, rawRenewAfter, rawCannotRenewAfter)
if err != nil {
return "", azsecrets.SetSecretParameters{}, err
}
return IdentifierForManagedIdentityCredentials(identifier), parameters, nil
}
func keyVaultParameters(credentials any, rawNotAfter, rawNotBefore, rawRenewAfter, rawCannotRenewAfter *string) (azsecrets.SetSecretParameters, error) {
for key, value := range map[string]*string{
"NotAfter": rawNotAfter,
"NotBefore": rawNotBefore,
"RenewAfter": rawRenewAfter,
"CannotRenewAfter": rawCannotRenewAfter,
} {
if value == nil {
return azsecrets.SetSecretParameters{}, fmt.Errorf("assumption violated, %q was nil", key)
}
}
var notAfter, notBefore time.Time
for from, to := range map[*string]*time.Time{
rawNotAfter: ¬After,
rawNotBefore: ¬Before,
} {
value, err := time.Parse(time.RFC3339, *from)
if err != nil {
return azsecrets.SetSecretParameters{}, err
}
*to = value
}
raw, err := json.Marshal(credentials)
if err != nil {
return azsecrets.SetSecretParameters{}, fmt.Errorf("failed to marshal credentials: %v", err)
}
return azsecrets.SetSecretParameters{
Value: ptrTo(string(raw)),
SecretAttributes: &azsecrets.SecretAttributes{
Enabled: ptrTo(true),
Expires: ¬After,
NotBefore: ¬Before,
},
Tags: map[string]*string{
RenewAfterKeyVaultTag: rawRenewAfter,
CannotRenewAfterKeyVaultTag: rawCannotRenewAfter,
},
}, nil
}
// FormatUserAssignedIdentityCredentialsForStorage provides the canonical KeyVault secret parameters for storing
// user-assigned managed identity credentials, ensuring that appropriate times are recorded for the expiry and
// notBefore, as well as that renewal times are recorded in tags.
func FormatUserAssignedIdentityCredentialsForStorage(identifier string, credentials UserAssignedIdentityCredentials) (string, azsecrets.SetSecretParameters, error) {
parameters, err := keyVaultParameters(credentials, credentials.NotAfter, credentials.NotBefore, credentials.RenewAfter, credentials.CannotRenewAfter)
if err != nil {
return "", azsecrets.SetSecretParameters{}, err
}
return IdentifierForUserAssignedIdentityCredentials(identifier), parameters, nil
}