Skip to content

Commit da120c7

Browse files
authored
Merge pull request #2120 from felixfontein/mapstructure
Use mapstructure to (de-)serialize internal metadata; move metadata processing from specific stores to general place
2 parents 54deaac + a2ab197 commit da120c7

11 files changed

Lines changed: 1835 additions & 715 deletions

File tree

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ require (
2020
github.com/blang/semver v3.5.1+incompatible
2121
github.com/fatih/color v1.19.0
2222
github.com/getsops/gopgagent v0.0.0-20241224165529-7044f28e491e
23+
github.com/go-viper/mapstructure/v2 v2.5.0
2324
github.com/google/go-cmp v0.7.0
2425
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510
2526
github.com/goware/prefixer v0.0.0-20160118172347-395022866408
@@ -100,7 +101,6 @@ require (
100101
github.com/go-jose/go-jose/v4 v4.1.4 // indirect
101102
github.com/go-logr/logr v1.4.3 // indirect
102103
github.com/go-logr/stdr v1.2.2 // indirect
103-
github.com/go-viper/mapstructure/v2 v2.5.0 // indirect
104104
github.com/goccy/go-yaml v1.19.2 // indirect
105105
github.com/golang-jwt/jwt/v5 v5.3.1 // indirect
106106
github.com/google/s2a-go v0.1.9 // indirect

stores/dotenv/store.go

Lines changed: 11 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,13 @@ package dotenv //import "github.com/getsops/sops/v3/stores/dotenv"
33
import (
44
"bytes"
55
"fmt"
6-
"sort"
76
"strings"
87

98
"github.com/getsops/sops/v3"
109
"github.com/getsops/sops/v3/config"
1110
"github.com/getsops/sops/v3/stores"
1211
)
1312

14-
// SopsPrefix is the prefix for all metadatada entry keys
15-
const SopsPrefix = stores.SopsMetadataKey + "_"
16-
1713
// Store handles storage of dotenv data
1814
type Store struct {
1915
config config.DotenvStoreConfig
@@ -33,47 +29,15 @@ func (store *Store) LoadEncryptedFile(in []byte) (sops.Tree, error) {
3329
if err != nil {
3430
return sops.Tree{}, err
3531
}
36-
37-
var resultBranch sops.TreeBranch
38-
mdMap := make(map[string]interface{})
39-
for _, item := range branches[0] {
40-
switch key := item.Key.(type) {
41-
case string:
42-
if strings.HasPrefix(key, SopsPrefix) {
43-
key = key[len(SopsPrefix):]
44-
mdMap[key] = item.Value
45-
} else {
46-
resultBranch = append(resultBranch, item)
47-
}
48-
case sops.Comment:
49-
resultBranch = append(resultBranch, item)
50-
default:
51-
panic(fmt.Sprintf("Unexpected type: %T (value %#v)", key, key))
52-
}
53-
}
54-
if len(mdMap) == 0 {
55-
return sops.Tree{}, sops.MetadataNotFound
56-
}
57-
58-
stores.DecodeNewLines(mdMap)
59-
err = stores.DecodeNonStrings(mdMap)
60-
if err != nil {
61-
return sops.Tree{}, err
62-
}
63-
metadata, err := stores.UnflattenMetadata(mdMap)
32+
branches, metadata, err := stores.ExtractMetadata(branches, stores.MetadataOpts{
33+
Flatten: stores.MetadataFlattenFull,
34+
})
6435
if err != nil {
6536
return sops.Tree{}, err
6637
}
67-
internalMetadata, err := metadata.ToInternal()
68-
if err != nil {
69-
return sops.Tree{}, err
70-
}
71-
7238
return sops.Tree{
73-
Branches: sops.TreeBranches{
74-
resultBranch,
75-
},
76-
Metadata: internalMetadata,
39+
Branches: branches,
40+
Metadata: metadata,
7741
}, nil
7842
}
7943

@@ -111,29 +75,13 @@ func (store *Store) LoadPlainFile(in []byte) (sops.TreeBranches, error) {
11175
// EmitEncryptedFile returns the encrypted file's bytes corresponding to a sops
11276
// runtime object
11377
func (store *Store) EmitEncryptedFile(in sops.Tree) ([]byte, error) {
114-
metadata := stores.MetadataFromInternal(in.Metadata)
115-
mdItems, err := stores.FlattenMetadata(metadata)
78+
branches, err := stores.SerializeMetadata(in, stores.MetadataOpts{
79+
Flatten: stores.MetadataFlattenFull,
80+
})
11681
if err != nil {
117-
return nil, err
118-
}
119-
120-
stores.EncodeNonStrings(mdItems)
121-
stores.EncodeNewLines(mdItems)
122-
123-
var keys []string
124-
for k := range mdItems {
125-
keys = append(keys, k)
126-
}
127-
sort.Strings(keys)
128-
129-
for _, key := range keys {
130-
var value = mdItems[key]
131-
if value == nil {
132-
continue
133-
}
134-
in.Branches[0] = append(in.Branches[0], sops.TreeItem{Key: SopsPrefix + key, Value: value})
82+
return nil, fmt.Errorf("Error marshaling metadata: %s", err)
13583
}
136-
return store.EmitPlainFile(in.Branches)
84+
return store.EmitPlainFile(branches)
13785
}
13886

13987
// EmitPlainFile returns the plaintext file's bytes corresponding to a sops
@@ -188,7 +136,7 @@ func IsComplexValue(v interface{}) bool {
188136
func (store *Store) HasSopsTopLevelKey(branch sops.TreeBranch) bool {
189137
for _, b := range branch {
190138
if key, ok := b.Key.(string); ok {
191-
if strings.HasPrefix(key, SopsPrefix) {
139+
if strings.HasPrefix(key, stores.SopsPrefix) {
192140
return true
193141
}
194142
}

0 commit comments

Comments
 (0)