1
0
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:
Felix Fontein
2025-08-01 15:58:51 +02:00
committed by GitHub

View File

@@ -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)
}
}
}