Skip to content

Commit 8db4f00

Browse files
committed
🐛 Fix env force bug
1 parent 2719cb4 commit 8db4f00

File tree

7 files changed

+159
-43
lines changed

7 files changed

+159
-43
lines changed

cmd/info/version.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
package info
22

3-
var Version = "0.0.41"
3+
var Version = "0.0.42"

cmd/secrets/secrets_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ func TestSecretsCommand(t *testing.T) {
5757
assert.NilError(t, err)
5858

5959
output := strings.TrimSpace(buffer.String())
60-
assert.Assert(t, strings.Count(output, "$") == 2)
60+
assert.Assert(t, strings.Count(output, "$") == 1)
6161
assert.Assert(t, !strings.Contains(output, "Encrypted"))
6262
})
6363

@@ -112,9 +112,9 @@ func TestSecretsCommand(t *testing.T) {
112112

113113
encrypted := strings.TrimSpace(encryptBuffer.String())
114114
parts := strings.Split(encrypted, "$")
115-
assert.Equal(t, 3, len(parts))
115+
assert.Equal(t, 2, len(parts))
116116

117-
multilineEncrypted := parts[0] + "\n \t$" + parts[1] + "\n \t$" + parts[2] + "\n"
117+
multilineEncrypted := parts[0] + "\n \t$" + parts[1] + "\n"
118118

119119
resetCommandFlags(SecretsCmd)
120120

cmd/secrets/vault.go

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package secrets
22

33
import (
44
"fmt"
5+
"slices"
56
"strings"
67

78
internalSecrets "github.com/kloudkit/ws-cli/internals/secrets"
@@ -71,16 +72,27 @@ func init() {
7172
vaultCmd.Flags().Bool("stdout", false, "Output decrypted values to stdout")
7273
}
7374

75+
func sortedKeys(m map[string]string) []string {
76+
keys := make([]string, 0, len(m))
77+
for k := range m {
78+
keys = append(keys, k)
79+
}
80+
slices.Sort(keys)
81+
return keys
82+
}
83+
7484
func printStdoutResults(cmd *cobra.Command, results map[string]string, raw bool) {
75-
for key, value := range results {
85+
for _, key := range sortedKeys(results) {
86+
value := results[key]
7687
output := internalSecrets.FormatSecretForStdout(key, value, raw)
7788
fmt.Fprint(cmd.OutOrStdout(), output)
7889
}
7990
}
8091

8192
func printVaultSuccess(cmd *cobra.Command, results map[string]string) {
8293
fmt.Fprintln(cmd.OutOrStdout(), styles.Success().Render("✓ Vault processed successfully"))
83-
for key, dest := range results {
94+
for _, key := range sortedKeys(results) {
95+
dest := results[key]
8496
displayDest := dest
8597
if after, ok := strings.CutPrefix(dest, "env:"); ok {
8698
displayDest = fmt.Sprintf("env:%s", after)

internals/secrets/crypto.go

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,7 @@ func Encrypt(plainText []byte, masterKey []byte) (string, error) {
3939

4040
cipherText := aesGCM.Seal(nonce, nonce, plainText, nil)
4141

42-
return fmt.Sprintf("%d$%s$%s",
43-
argon2.Version,
42+
return fmt.Sprintf("%s$%s",
4443
base64.RawStdEncoding.EncodeToString(salt),
4544
base64.RawStdEncoding.EncodeToString(cipherText)), nil
4645
}
@@ -56,21 +55,16 @@ func NormalizeEncrypted(encrypted string) string {
5655

5756
func Decrypt(encodedValue string, masterKey []byte) ([]byte, error) {
5857
parts := strings.Split(encodedValue, "$")
59-
if len(parts) != 3 {
58+
if len(parts) != 2 {
6059
return nil, fmt.Errorf("invalid encrypted format")
6160
}
6261

63-
expectedVersion := fmt.Sprintf("%d", argon2.Version)
64-
if parts[0] != expectedVersion {
65-
return nil, fmt.Errorf("unsupported algorithm version: %s (expected %s)", parts[0], expectedVersion)
66-
}
67-
68-
salt, err := base64.RawStdEncoding.DecodeString(parts[1])
62+
salt, err := base64.RawStdEncoding.DecodeString(parts[0])
6963
if err != nil {
7064
return nil, fmt.Errorf("failed to decode salt: %w", err)
7165
}
7266

73-
cipherTextWithNonce, err := base64.RawStdEncoding.DecodeString(parts[2])
67+
cipherTextWithNonce, err := base64.RawStdEncoding.DecodeString(parts[1])
7468
if err != nil {
7569
return nil, fmt.Errorf("failed to decode ciphertext: %w", err)
7670
}

internals/secrets/crypto_test.go

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ func TestEncryptDecrypt(t *testing.T) {
1313

1414
encrypted, err := Encrypt([]byte(plainText), masterKey)
1515
assert.NilError(t, err)
16-
assert.Assert(t, strings.Count(encrypted, "$") == 2)
16+
assert.Assert(t, strings.Count(encrypted, "$") == 1)
1717

1818
decrypted, err := Decrypt(encrypted, masterKey)
1919
assert.NilError(t, err)
@@ -53,15 +53,6 @@ func TestDecryptErrors(t *testing.T) {
5353
}
5454
}
5555

56-
func TestDecryptUnsupportedVersion(t *testing.T) {
57-
masterKey := make([]byte, 32)
58-
59-
encryptedValue := "999$dGVzdA$dGVzdA"
60-
61-
_, err := Decrypt(encryptedValue, masterKey)
62-
assert.ErrorContains(t, err, "unsupported algorithm version")
63-
}
64-
6556
func TestHashPasswordForWorkspace(t *testing.T) {
6657
hash, err := HashPasswordForWorkspace("testpassword123")
6758
assert.NilError(t, err)

internals/secrets/vault.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,7 @@ func GetSecretKeys(vault *Vault, requestedKeys []string) []string {
183183
for key := range vault.Secrets {
184184
keys = append(keys, key)
185185
}
186+
slices.Sort(keys)
186187

187188
return keys
188189
}
@@ -210,6 +211,8 @@ func ProcessVault(vault *Vault, opts ProcessOptions) (map[string]string, error)
210211
return nil, err
211212
}
212213

214+
effectiveForce := opts.Force || secret.Force
215+
213216
encryptedValue := NormalizeEncrypted(secret.Encrypted)
214217

215218
decrypted, err := Decrypt(encryptedValue, opts.MasterKey)
@@ -228,12 +231,12 @@ func ProcessVault(vault *Vault, opts ProcessOptions) (map[string]string, error)
228231
}
229232

230233
if secret.Type == TypeEnv {
231-
if err := ProcessEnvSecret(secret.Destination, decrypted, opts.Force); err != nil {
234+
if err := ProcessEnvSecret(secret.Destination, decrypted, effectiveForce); err != nil {
232235
return nil, fmt.Errorf("failed to process env secret %q: %w", key, err)
233236
}
234237
results[key] = fmt.Sprintf("env:%s", secret.Destination)
235238
} else {
236-
if err := internalIO.WriteSecureFile(secret.Destination, decrypted, mode, opts.Force); err != nil {
239+
if err := internalIO.WriteSecureFile(secret.Destination, decrypted, mode, effectiveForce); err != nil {
237240
return nil, fmt.Errorf("failed to write secret %q: %w", key, err)
238241
}
239242
results[key] = secret.Destination

0 commit comments

Comments
 (0)