Skip to content

Commit 80006b7

Browse files
authored
Merge pull request #45 from runlevel5/perf/avoid-double-file-read
Avoid reading EJSON file twice during decrypt operations
2 parents 50b536b + 22a4b43 commit 80006b7

2 files changed

Lines changed: 44 additions & 25 deletions

File tree

actions.go

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package ejsonkms
22

33
import (
4+
"bytes"
45
"encoding/json"
56
"fmt"
67
"os"
@@ -93,7 +94,14 @@ func EnvAction(ejsonFilePath, awsRegion string, quiet bool) error {
9394
if quiet {
9495
exportFunc = ejson2env.ExportQuiet
9596
}
96-
privateKeyEnc, err := findPrivateKeyEnc(ejsonFilePath)
97+
98+
// Read file once
99+
data, err := os.ReadFile(ejsonFilePath)
100+
if err != nil {
101+
return err
102+
}
103+
104+
privateKeyEnc, err := extractPrivateKeyEnc(data)
97105
if err != nil {
98106
return err
99107
}
@@ -103,9 +111,20 @@ func EnvAction(ejsonFilePath, awsRegion string, quiet bool) error {
103111
return err
104112
}
105113

106-
envValues, err := ejson2env.ReadAndExtractEnv(ejsonFilePath, "", kmsDecryptedPrivateKey)
114+
// Decrypt using the already-read data
115+
var decrypted bytes.Buffer
116+
if err := ejson.Decrypt(bytes.NewReader(data), &decrypted, "", kmsDecryptedPrivateKey); err != nil {
117+
return err
118+
}
119+
120+
// Parse decrypted JSON and extract env values
121+
var secrets map[string]interface{}
122+
if err := json.Unmarshal(decrypted.Bytes(), &secrets); err != nil {
123+
return fmt.Errorf("could not parse decrypted JSON: %s", err)
124+
}
107125

108-
if nil != err && !ejson2env.IsEnvError(err) {
126+
envValues, err := ejson2env.ExtractEnv(secrets)
127+
if err != nil && !ejson2env.IsEnvError(err) {
109128
return fmt.Errorf("could not load environment from file: %s", err)
110129
}
111130

ejsonkms.go

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package ejsonkms
22

33
import (
4+
"bytes"
45
"encoding/json"
56
"errors"
6-
"io/ioutil"
77
"os"
88

99
"github.com/Shopify/ejson"
@@ -40,42 +40,33 @@ func Keygen(kmsKeyID, awsRegion string) (EjsonKmsKeys, error) {
4040

4141
// Decrypt decrypts an EJSON file
4242
func Decrypt(ejsonFilePath, awsRegion string) ([]byte, error) {
43-
privateKeyEnc, err := findPrivateKeyEnc(ejsonFilePath)
43+
data, err := os.ReadFile(ejsonFilePath)
4444
if err != nil {
4545
return nil, err
4646
}
4747

48-
kmsDecryptedPrivateKey, err := decryptPrivateKeyWithKMS(privateKeyEnc, awsRegion)
48+
privateKeyEnc, err := extractPrivateKeyEnc(data)
4949
if err != nil {
5050
return nil, err
5151
}
5252

53-
decrypted, err := ejson.DecryptFile(ejsonFilePath, "", kmsDecryptedPrivateKey)
53+
kmsDecryptedPrivateKey, err := decryptPrivateKeyWithKMS(privateKeyEnc, awsRegion)
5454
if err != nil {
5555
return nil, err
5656
}
5757

58-
return decrypted, nil
59-
}
60-
61-
func findPrivateKeyEnc(ejsonFilePath string) (key string, err error) {
62-
var (
63-
ejsonKmsKeys EjsonKmsKeys
64-
)
65-
66-
file, err := os.Open(ejsonFilePath)
67-
if err != nil {
68-
return "", err
58+
var output bytes.Buffer
59+
if err := ejson.Decrypt(bytes.NewReader(data), &output, "", kmsDecryptedPrivateKey); err != nil {
60+
return nil, err
6961
}
70-
defer file.Close()
7162

72-
data, err := ioutil.ReadAll(file)
73-
if err != nil {
74-
return "", err
75-
}
63+
return output.Bytes(), nil
64+
}
7665

77-
err = json.Unmarshal(data, &ejsonKmsKeys)
78-
if err != nil {
66+
func extractPrivateKeyEnc(data []byte) (string, error) {
67+
var ejsonKmsKeys EjsonKmsKeys
68+
69+
if err := json.Unmarshal(data, &ejsonKmsKeys); err != nil {
7970
return "", err
8071
}
8172

@@ -85,3 +76,12 @@ func findPrivateKeyEnc(ejsonFilePath string) (key string, err error) {
8576

8677
return ejsonKmsKeys.PrivateKeyEnc, nil
8778
}
79+
80+
// findPrivateKeyEnc reads a file and extracts the private key
81+
func findPrivateKeyEnc(ejsonFilePath string) (string, error) {
82+
data, err := os.ReadFile(ejsonFilePath)
83+
if err != nil {
84+
return "", err
85+
}
86+
return extractPrivateKeyEnc(data)
87+
}

0 commit comments

Comments
 (0)