mirror of
https://github.com/bolkedebruin/rdpgw.git
synced 2026-03-29 23:16:37 +00:00
Add untested explicit settings in rdp file
This commit is contained in:
@@ -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() {
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user