mirror of
https://github.com/getsops/sops.git
synced 2026-02-05 12:45:21 +01:00
Merge pull request #1899 from felixfontein/shamir
Fix Shamir threshold encoding for INI and ENV files
This commit is contained in:
@@ -248,7 +248,14 @@ func DecodeNonStrings(m map[string]interface{}) error {
|
||||
case string:
|
||||
vInt, err := strconv.Atoi(val)
|
||||
if err != nil {
|
||||
return fmt.Errorf("shamir_threshold is not an integer: %s", err.Error())
|
||||
// Older versions of SOPS stored shamir_threshold as a floating point representation
|
||||
// of the actual integer. Try to parse a floating point number and see whether it
|
||||
// can be converted without loss to an integer.
|
||||
vFloat, floatErr := strconv.ParseFloat(val, 64)
|
||||
vInt = int(vFloat)
|
||||
if floatErr != nil || float64(vInt) != vFloat {
|
||||
return fmt.Errorf("shamir_threshold is not an integer: %s", err.Error())
|
||||
}
|
||||
}
|
||||
m["shamir_threshold"] = vInt
|
||||
case int:
|
||||
@@ -274,5 +281,11 @@ func EncodeNonStrings(m map[string]interface{}) {
|
||||
if vInt, ok := v.(int); ok {
|
||||
m["shamir_threshold"] = fmt.Sprintf("%d", vInt)
|
||||
}
|
||||
// FlattenMetadata serializes the input as JSON and then deserializes it.
|
||||
// The JSON unserializer treats every number as a float, so the above 'if'
|
||||
// never applies in that situation.
|
||||
if vFloat, ok := v.(float64); ok {
|
||||
m["shamir_threshold"] = fmt.Sprintf("%.0f", vFloat)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user