configfile: use map[flagIota] for feature flags

This should make things saner and more extensible. It prepares
the infrastructure for "required feature flags" that will be used
to deprecate old gocryptfs version.
This commit is contained in:
Jakob Unterwurzacher 2016-06-05 12:53:10 +02:00
parent b97268c948
commit f2d208c464
3 changed files with 62 additions and 47 deletions

View File

@ -4,7 +4,6 @@ import (
"encoding/json"
"fmt"
"io/ioutil"
"log"
"github.com/rfjakob/gocryptfs/internal/contentenc"
"github.com/rfjakob/gocryptfs/internal/cryptocore"
@ -55,13 +54,13 @@ func CreateConfFile(filename string, password string, plaintextNames bool, logN
cf.EncryptKey(key, password, logN)
// Set feature flags
cf.FeatureFlags = append(cf.FeatureFlags, FlagGCMIV128)
cf.FeatureFlags = append(cf.FeatureFlags, knownFlags[FlagGCMIV128])
if plaintextNames {
cf.FeatureFlags = append(cf.FeatureFlags, FlagPlaintextNames)
cf.FeatureFlags = append(cf.FeatureFlags, knownFlags[FlagPlaintextNames])
} else {
cf.FeatureFlags = append(cf.FeatureFlags, FlagDirIV)
cf.FeatureFlags = append(cf.FeatureFlags, FlagEMENames)
cf.FeatureFlags = append(cf.FeatureFlags, FlagLongNames)
cf.FeatureFlags = append(cf.FeatureFlags, knownFlags[FlagDirIV])
cf.FeatureFlags = append(cf.FeatureFlags, knownFlags[FlagEMENames])
cf.FeatureFlags = append(cf.FeatureFlags, knownFlags[FlagLongNames])
}
// Write file to disk
@ -166,37 +165,3 @@ func (cf *ConfFile) WriteFile() error {
return nil
}
const (
// Understood Feature Flags.
// Also teach isFeatureFlagKnown() about any additions and
// add it to CreateConfFile() if you want to have it enabled by default.
FlagPlaintextNames = "PlaintextNames"
FlagDirIV = "DirIV"
FlagEMENames = "EMENames"
FlagGCMIV128 = "GCMIV128"
FlagLongNames = "LongNames"
)
// Verify that we understand a feature flag
func (cf *ConfFile) isFeatureFlagKnown(flag string) bool {
switch flag {
case FlagPlaintextNames, FlagDirIV, FlagEMENames, FlagGCMIV128, FlagLongNames:
return true
default:
return false
}
}
// isFeatureFlagSet - is the feature flag "flagWant" enabled?
func (cf *ConfFile) IsFeatureFlagSet(flagWant string) bool {
if !cf.isFeatureFlagKnown(flagWant) {
log.Panicf("BUG: Tried to use unsupported feature flag %s", flagWant)
}
for _, flag := range cf.FeatureFlags {
if flag == flagWant {
return true
}
}
return false
}

View File

@ -72,14 +72,23 @@ func TestCreateConfFile(t *testing.T) {
}
func TestIsFeatureFlagKnown(t *testing.T) {
// Test a few hardcoded values
testKnownFlags := []string{"DirIV", "PlaintextNames", "EMENames", "GCMIV128", "LongNames"}
// And also everything in knownFlags (yes, it is likely that we end up with
// some duplicates. Does not matter.)
for _, f := range knownFlags {
testKnownFlags = append(testKnownFlags, f)
}
var cf ConfFile
if !cf.isFeatureFlagKnown(FlagDirIV) {
t.Errorf("This flag should be known")
for _, f := range testKnownFlags {
if !cf.isFeatureFlagKnown(f) {
t.Errorf("flag %q should be known", f)
}
}
if !cf.isFeatureFlagKnown(FlagPlaintextNames) {
t.Errorf("This flag should be known")
}
if cf.isFeatureFlagKnown("StrangeFeatureFlag") {
t.Errorf("This flag should be NOT known")
f := "StrangeFeatureFlag"
if cf.isFeatureFlagKnown(f) {
t.Errorf("flag %q should be NOT known", f)
}
}

View File

@ -0,0 +1,41 @@
package configfile
type flagIota int
const (
FlagPlaintextNames flagIota = iota
FlagDirIV
FlagEMENames
FlagGCMIV128
FlagLongNames
)
// knownFlags stores the known feature flags and their string representation
var knownFlags map[flagIota]string = map[flagIota]string{
FlagPlaintextNames: "PlaintextNames",
FlagDirIV: "DirIV",
FlagEMENames: "EMENames",
FlagGCMIV128: "GCMIV128",
FlagLongNames: "LongNames",
}
// isFeatureFlagKnown verifies that we understand a feature flag
func (cf *ConfFile) isFeatureFlagKnown(flag string) bool {
for _, knownFlag := range knownFlags {
if knownFlag == flag {
return true
}
}
return false
}
// isFeatureFlagSet - is the feature flag "flagWant" enabled?
func (cf *ConfFile) IsFeatureFlagSet(flagWant flagIota) bool {
flagString := knownFlags[flagWant]
for _, flag := range cf.FeatureFlags {
if flag == flagString {
return true
}
}
return false
}