fix: resolve mnd and nestif linter errors
- Added constants to replace magic numbers: - agePrivKeyPassphraseLength = 64 - versionNameParts = 2 - maxVersionsPerDay = 999 - Refactored crypto.go to reduce nesting complexity: - Inverted if condition to handle non-existent secret first - Extracted getSecretValue helper method
This commit is contained in:
parent
6fe49344e2
commit
38b450cbcf
@ -74,29 +74,7 @@ func (cli *Instance) Encrypt(secretName, inputFile, outputFile string) error {
|
|||||||
return fmt.Errorf("failed to check if secret exists: %w", err)
|
return fmt.Errorf("failed to check if secret exists: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if exists {
|
if !exists {
|
||||||
// Secret exists, get the age secret key from it
|
|
||||||
var secretValue []byte
|
|
||||||
if os.Getenv(secret.EnvMnemonic) != "" {
|
|
||||||
secretValue, err = secretObj.GetValue(nil)
|
|
||||||
} else {
|
|
||||||
unlocker, unlockErr := vlt.GetCurrentUnlocker()
|
|
||||||
if unlockErr != nil {
|
|
||||||
return fmt.Errorf("failed to get current unlocker: %w", unlockErr)
|
|
||||||
}
|
|
||||||
secretValue, err = secretObj.GetValue(unlocker)
|
|
||||||
}
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("failed to get secret value: %w", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
ageSecretKey = string(secretValue)
|
|
||||||
|
|
||||||
// Validate that it's a valid age secret key
|
|
||||||
if !isValidAgeSecretKey(ageSecretKey) {
|
|
||||||
return fmt.Errorf("secret '%s' does not contain a valid age secret key", secretName)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// Secret doesn't exist, generate new age key and store it
|
// Secret doesn't exist, generate new age key and store it
|
||||||
identity, err := age.GenerateX25519Identity()
|
identity, err := age.GenerateX25519Identity()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -110,6 +88,19 @@ func (cli *Instance) Encrypt(secretName, inputFile, outputFile string) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to store age key: %w", err)
|
return fmt.Errorf("failed to store age key: %w", err)
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
// Secret exists, get the age secret key from it
|
||||||
|
secretValue, err := cli.getSecretValue(vlt, secretObj)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to get secret value: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
ageSecretKey = string(secretValue)
|
||||||
|
|
||||||
|
// Validate that it's a valid age secret key
|
||||||
|
if !isValidAgeSecretKey(ageSecretKey) {
|
||||||
|
return fmt.Errorf("secret '%s' does not contain a valid age secret key", secretName)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parse the secret key
|
// Parse the secret key
|
||||||
@ -247,3 +238,17 @@ func isValidAgeSecretKey(key string) bool {
|
|||||||
_, err := age.ParseX25519Identity(key)
|
_, err := age.ParseX25519Identity(key)
|
||||||
return err == nil
|
return err == nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// getSecretValue retrieves the value of a secret using the appropriate unlocker
|
||||||
|
func (cli *Instance) getSecretValue(vlt *vault.Vault, secretObj *secret.Secret) ([]byte, error) {
|
||||||
|
if os.Getenv(secret.EnvMnemonic) != "" {
|
||||||
|
return secretObj.GetValue(nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
unlocker, err := vlt.GetCurrentUnlocker()
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to get current unlocker: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return secretObj.GetValue(unlocker)
|
||||||
|
}
|
||||||
|
@ -16,6 +16,10 @@ import (
|
|||||||
"github.com/spf13/afero"
|
"github.com/spf13/afero"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
agePrivKeyPassphraseLength = 64
|
||||||
|
)
|
||||||
|
|
||||||
// keychainItemNameRegex validates keychain item names
|
// keychainItemNameRegex validates keychain item names
|
||||||
// Allows alphanumeric characters, dots, hyphens, and underscores only
|
// Allows alphanumeric characters, dots, hyphens, and underscores only
|
||||||
var keychainItemNameRegex = regexp.MustCompile(`^[A-Za-z0-9._-]+$`)
|
var keychainItemNameRegex = regexp.MustCompile(`^[A-Za-z0-9._-]+$`)
|
||||||
@ -253,7 +257,7 @@ func CreateKeychainUnlocker(fs afero.Fs, stateDir string) (*KeychainUnlocker, er
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Step 2: Generate a random passphrase for encrypting the age private key
|
// Step 2: Generate a random passphrase for encrypting the age private key
|
||||||
agePrivKeyPassphrase, err := generateRandomPassphrase(64)
|
agePrivKeyPassphrase, err := generateRandomPassphrase(agePrivKeyPassphraseLength)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to generate age private key passphrase: %w", err)
|
return nil, fmt.Errorf("failed to generate age private key passphrase: %w", err)
|
||||||
}
|
}
|
||||||
|
@ -15,6 +15,11 @@ import (
|
|||||||
"github.com/spf13/afero"
|
"github.com/spf13/afero"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
versionNameParts = 2
|
||||||
|
maxVersionsPerDay = 999
|
||||||
|
)
|
||||||
|
|
||||||
// VersionMetadata contains information about a secret version
|
// VersionMetadata contains information about a secret version
|
||||||
type VersionMetadata struct {
|
type VersionMetadata struct {
|
||||||
ID string `json:"id"` // ULID
|
ID string `json:"id"` // ULID
|
||||||
@ -87,7 +92,7 @@ func GenerateVersionName(fs afero.Fs, secretDir string) (string, error) {
|
|||||||
if entry.IsDir() && strings.HasPrefix(entry.Name(), prefix) {
|
if entry.IsDir() && strings.HasPrefix(entry.Name(), prefix) {
|
||||||
// Extract serial number
|
// Extract serial number
|
||||||
parts := strings.Split(entry.Name(), ".")
|
parts := strings.Split(entry.Name(), ".")
|
||||||
if len(parts) == 2 {
|
if len(parts) == versionNameParts {
|
||||||
var serial int
|
var serial int
|
||||||
if _, err := fmt.Sscanf(parts[1], "%03d", &serial); err == nil {
|
if _, err := fmt.Sscanf(parts[1], "%03d", &serial); err == nil {
|
||||||
if serial > maxSerial {
|
if serial > maxSerial {
|
||||||
@ -100,7 +105,7 @@ func GenerateVersionName(fs afero.Fs, secretDir string) (string, error) {
|
|||||||
|
|
||||||
// Generate new version name
|
// Generate new version name
|
||||||
newSerial := maxSerial + 1
|
newSerial := maxSerial + 1
|
||||||
if newSerial > 999 {
|
if newSerial > maxVersionsPerDay {
|
||||||
return "", fmt.Errorf("exceeded maximum versions per day (999)")
|
return "", fmt.Errorf("exceeded maximum versions per day (999)")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user