Skip to content

Commit 2463458

Browse files
committed
Generic recursive settings map dbus variants decoding
1 parent 1efc60b commit 2463458

2 files changed

Lines changed: 205 additions & 23 deletions

File tree

Connection.go

Lines changed: 32 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ func (c *connection) GetSettings() (ConnectionSettings, error) {
101101
return nil, err
102102
}
103103

104-
return variantMapToSettings(settings), nil
104+
return decodeSettings(settings), nil
105105
}
106106

107107
func (c *connection) GetSecrets(settingName string) (ConnectionSettings, error) {
@@ -111,35 +111,44 @@ func (c *connection) GetSecrets(settingName string) (ConnectionSettings, error)
111111
return nil, err
112112
}
113113

114-
return variantMapToSettings(settings), nil
114+
return decodeSettings(settings), nil
115115
}
116116

117-
func variantMapToSettings(variantMap map[string]map[string]dbus.Variant) (settings ConnectionSettings) {
118-
settings = make(ConnectionSettings)
119-
for k1, v1 := range variantMap {
120-
settings[k1] = make(map[string]interface{})
121-
122-
for k2, v2 := range v1 {
123-
v2Value := v2.Value()
124-
if variant, isVariant := v2Value.([]map[string]dbus.Variant); isVariant {
125-
var v2Values []map[string]interface{}
117+
func decodeSettings(input map[string]map[string]dbus.Variant) (settings ConnectionSettings) {
118+
valueMap := ConnectionSettings{}
119+
for key, data := range input {
120+
valueMap[key] = decode(data).(map[string]interface{})
121+
}
122+
return valueMap
123+
}
126124

127-
for _, arrayItem := range variant {
128-
arrayValues := make(map[string]interface{})
129-
for k3, v3 := range arrayItem {
130-
arrayValues[k3] = v3.Value()
131-
}
132-
v2Values = append(v2Values, arrayValues)
133-
}
125+
func decode(input interface{}) (value interface{}) {
126+
if variant, isVariant := input.(dbus.Variant); isVariant {
127+
return decode(variant.Value())
128+
} else {
134129

135-
settings[k1][k2] = v2Values
136-
} else {
137-
settings[k1][k2] = v2Value
130+
if inputMap, isMap := input.(map[string]dbus.Variant); isMap {
131+
valueMap := map[string]interface{}{}
132+
for key, data := range inputMap {
133+
valueMap[key] = decode(data)
138134
}
135+
return valueMap
136+
} else if inputArray, isArray := input.([]interface{}); isArray {
137+
var valueArray []interface{}
138+
for _, data := range inputArray {
139+
valueArray = append(valueArray, decode(data))
140+
}
141+
return valueArray
142+
} else if inputArray, isArray := input.([]map[string]dbus.Variant); isArray {
143+
var valueArray []interface{}
144+
for _, data := range inputArray {
145+
valueArray = append(valueArray, decode(data))
146+
}
147+
return valueArray
148+
} else {
149+
return input
139150
}
140151
}
141-
142-
return
143152
}
144153

145154
func (c *connection) ClearSecrets() error {

Connection_test.go

Lines changed: 173 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,173 @@
1+
package gonetworkmanager
2+
3+
import (
4+
"github.com/godbus/dbus/v5"
5+
"reflect"
6+
"testing"
7+
)
8+
9+
func TestDecodeSettings(t *testing.T) {
10+
settings := map[string]map[string]dbus.Variant{
11+
"ipv4": {
12+
"address-data": dbus.MakeVariant([]map[string]dbus.Variant{
13+
{
14+
"address": dbus.MakeVariant("192.168.1.156"),
15+
"prefix": dbus.MakeVariant(24),
16+
},
17+
}),
18+
"dns-search": dbus.MakeVariant([]string{}),
19+
"method": dbus.MakeVariant("manual"),
20+
"route-data": dbus.MakeVariant([]map[string]dbus.Variant{}),
21+
"routes": dbus.MakeVariant([][]uint32{}),
22+
"addresses": dbus.MakeVariant([][]uint32{
23+
{
24+
2617354432,
25+
24,
26+
16885952,
27+
},
28+
}),
29+
"gateway": dbus.MakeVariant("192.168.1.1"),
30+
"route-metric": dbus.MakeVariant(100),
31+
"dhcp-timeout": dbus.MakeVariant(45),
32+
},
33+
"ipv6": {
34+
"addr-gen-mode": dbus.MakeVariant(3),
35+
"address-data": dbus.MakeVariant([]map[string]dbus.Variant{}),
36+
"routes": dbus.MakeVariant([][]interface{}{}),
37+
"dns-search": dbus.MakeVariant([]string{}),
38+
"method": dbus.MakeVariant("auto"),
39+
"route-data": dbus.MakeVariant([]map[string]dbus.Variant{}),
40+
"dhcp-timeout": dbus.MakeVariant(45),
41+
"route-metric": dbus.MakeVariant(100),
42+
"addresses": dbus.MakeVariant([][]interface{}{}),
43+
},
44+
"proxy": {},
45+
"connection": {
46+
"uuid": dbus.MakeVariant("390e5c2b-7312-415e-80e6-7b94a5c24fc3"),
47+
"autoconnect-priority": dbus.MakeVariant(1),
48+
"autoconnect-retries": dbus.MakeVariant(0),
49+
"id": dbus.MakeVariant("main"),
50+
"interface-name": dbus.MakeVariant("eth0"),
51+
"permissions": dbus.MakeVariant([]string{}),
52+
"timestamp": dbus.MakeVariant(1669049774),
53+
"type": dbus.MakeVariant("802-3-ethernet"),
54+
},
55+
"802-3-ethernet": {
56+
"auto-negotiate": dbus.MakeVariant(false),
57+
"mac-address-blacklist": dbus.MakeVariant([]string{}),
58+
"s390-options": dbus.MakeVariant(map[string]string{}),
59+
},
60+
}
61+
62+
result := decodeSettings(settings)
63+
64+
expected := ConnectionSettings{
65+
"ipv4": {
66+
"address-data": []interface{}{
67+
map[string]interface{}{
68+
"address": "192.168.1.156",
69+
"prefix": 24,
70+
},
71+
},
72+
"dns-search": []string{},
73+
"method": "manual",
74+
"route-data": []interface{}(nil),
75+
"routes": [][]uint32{},
76+
"addresses": [][]uint32{
77+
{
78+
2617354432,
79+
24,
80+
16885952,
81+
},
82+
},
83+
"gateway": "192.168.1.1",
84+
"route-metric": 100,
85+
"dhcp-timeout": 45,
86+
},
87+
"ipv6": {
88+
"addr-gen-mode": 3,
89+
"address-data": []interface{}(nil),
90+
"routes": [][]interface{}{},
91+
"dns-search": []string{},
92+
"method": "auto",
93+
"route-data": []interface{}(nil),
94+
"dhcp-timeout": 45,
95+
"route-metric": 100,
96+
"addresses": [][]interface{}{},
97+
},
98+
"proxy": {},
99+
"connection": {
100+
"uuid": "390e5c2b-7312-415e-80e6-7b94a5c24fc3",
101+
"autoconnect-priority": 1,
102+
"autoconnect-retries": 0,
103+
"id": "main",
104+
"interface-name": "eth0",
105+
"permissions": []string{},
106+
"timestamp": 1669049774,
107+
"type": "802-3-ethernet",
108+
},
109+
"802-3-ethernet": {
110+
"auto-negotiate": false,
111+
"mac-address-blacklist": []string{},
112+
"s390-options": map[string]string{},
113+
},
114+
}
115+
116+
if !reflect.DeepEqual(result, expected) {
117+
t.Fatalf("failed: \nexpected: %#v\nresult : %#v", expected, result)
118+
}
119+
}
120+
121+
func TestDecode(t *testing.T) {
122+
ipSettings := map[string]dbus.Variant{
123+
"address-data": dbus.MakeVariant([]map[string]dbus.Variant{
124+
{
125+
"address": dbus.MakeVariant("192.168.1.156"),
126+
"prefix": dbus.MakeVariant(24),
127+
},
128+
}),
129+
"dns-search": dbus.MakeVariant([]string{}),
130+
"method": dbus.MakeVariant("manual"),
131+
"route-data": dbus.MakeVariant([]map[string]dbus.Variant{}),
132+
"routes": dbus.MakeVariant([][]uint32{}),
133+
"addresses": dbus.MakeVariant([][]uint32{
134+
{
135+
2617354432,
136+
24,
137+
16885952,
138+
},
139+
}),
140+
"gateway": dbus.MakeVariant("192.168.1.1"),
141+
"route-metric": dbus.MakeVariant(100),
142+
"dhcp-timeout": dbus.MakeVariant(45),
143+
}
144+
145+
result := decode(ipSettings)
146+
147+
expected := map[string]interface{}{
148+
"address-data": []interface{}{
149+
map[string]interface{}{
150+
"address": "192.168.1.156",
151+
"prefix": 24,
152+
},
153+
},
154+
"dns-search": []string{},
155+
"method": "manual",
156+
"route-data": []interface{}(nil),
157+
"routes": [][]uint32{},
158+
"addresses": [][]uint32{
159+
{
160+
2617354432,
161+
24,
162+
16885952,
163+
},
164+
},
165+
"gateway": "192.168.1.1",
166+
"route-metric": 100,
167+
"dhcp-timeout": 45,
168+
}
169+
170+
if !reflect.DeepEqual(result, expected) {
171+
t.Fatalf("failed: \nexpected: %#v\nresult : %#v", expected, result)
172+
}
173+
}

0 commit comments

Comments
 (0)