Add untested explicit settings in rdp file

This commit is contained in:
Bolke de Bruin
2024-03-21 16:22:14 +01:00
parent 95a8623cb6
commit 5d30deb48c
2 changed files with 25 additions and 5 deletions

View File

@@ -5,6 +5,7 @@ import (
"fmt" "fmt"
"github.com/bolkedebruin/rdpgw/cmd/rdpgw/rdp/koanf/parsers/rdp" "github.com/bolkedebruin/rdpgw/cmd/rdpgw/rdp/koanf/parsers/rdp"
"github.com/fatih/structs" "github.com/fatih/structs"
"github.com/go-viper/mapstructure/v2"
"github.com/knadh/koanf/providers/file" "github.com/knadh/koanf/providers/file"
"github.com/knadh/koanf/v2" "github.com/knadh/koanf/v2"
"log" "log"
@@ -93,6 +94,7 @@ type RdpSettings struct {
type Builder struct { type Builder struct {
Settings RdpSettings Settings RdpSettings
Metadata mapstructure.Metadata
} }
func NewBuilder() *Builder { func NewBuilder() *Builder {
@@ -102,39 +104,47 @@ func NewBuilder() *Builder {
return &Builder{ return &Builder{
Settings: c, Settings: c,
Metadata: mapstructure.Metadata{},
} }
} }
func NewBuilderFromFile(filename string) (*Builder, error) { func NewBuilderFromFile(filename string) (*Builder, error) {
c := RdpSettings{} c := RdpSettings{}
initStruct(&c) initStruct(&c)
metadata := mapstructure.Metadata{}
decoderConfig := &mapstructure.DecoderConfig{
Result: &c,
Metadata: &metadata,
}
var k = koanf.New(".") var k = koanf.New(".")
if err := k.Load(file.Provider(filename), rdp.Parser()); err != nil { if err := k.Load(file.Provider(filename), rdp.Parser()); err != nil {
return nil, err return nil, err
} }
t := koanf.UnmarshalConf{Tag: "rdp"} t := koanf.UnmarshalConf{Tag: "rdp", DecoderConfig: decoderConfig}
if err := k.UnmarshalWithConf("", &c, t); err != nil { if err := k.UnmarshalWithConf("", &c, t); err != nil {
return nil, err return nil, err
} }
return &Builder{ return &Builder{
Settings: c, Settings: c,
Metadata: metadata,
}, nil }, nil
} }
func (rb *Builder) String() string { func (rb *Builder) String() string {
var sb strings.Builder var sb strings.Builder
addStructToString(rb.Settings, &sb) addStructToString(rb.Settings, rb.Metadata, &sb)
return sb.String() return sb.String()
} }
func addStructToString(st interface{}, sb *strings.Builder) { func addStructToString(st interface{}, metadata mapstructure.Metadata, sb *strings.Builder) {
s := structs.New(st) s := structs.New(st)
for _, f := range s.Fields() { for _, f := range s.Fields() {
if isZero(f) { if isZero(f) && !isSet(f, metadata) {
continue continue
} }
sb.WriteString(f.Tag("rdp")) sb.WriteString(f.Tag("rdp"))
@@ -195,6 +205,16 @@ func isZero(f *structs.Field) bool {
return f.IsZero() return f.IsZero()
} }
func isSet(f *structs.Field, metadata mapstructure.Metadata) bool {
for _, v := range metadata.Unset {
if v == f.Name() {
log.Printf("field %s is unset", f.Name())
return true
}
}
return false
}
func initStruct(st interface{}) { func initStruct(st interface{}) {
s := structs.New(st) s := structs.New(st)
for _, f := range s.Fields() { for _, f := range s.Fields() {

View File

@@ -21,7 +21,7 @@ func TestRdpBuilder(t *testing.T) {
t.Fatalf("%s does not contain `gatewayhostname:s:%s", s, GatewayHostName) t.Fatalf("%s does not contain `gatewayhostname:s:%s", s, GatewayHostName)
} }
if strings.Contains(s, "autoreconnectionenabled") { if strings.Contains(s, "autoreconnectionenabled") {
t.Fatalf("autoreconnectionenabled is in %s, but is default value", s) t.Fatalf("autoreconnectionenabled is in %s, but it's default value", s)
} }
if !strings.Contains(s, "smart sizing:i:1"+CRLF) { if !strings.Contains(s, "smart sizing:i:1"+CRLF) {
t.Fatalf("%s does not contain smart sizing:i:1", s) t.Fatalf("%s does not contain smart sizing:i:1", s)