switch to loop parsing

So the stop on error pattern can be used
This commit is contained in:
Julien Viard de Galbert 2021-07-06 10:50:42 +02:00
parent f8f7d0b0c7
commit 32b0b94f6c

View File

@ -47,6 +47,30 @@ const (
publicKeyKey key = "PublicKey"
)
type dumpInterfaceIndex int
const (
dumpInterfacePrivateKeyIndex = iota
dumpInterfacePublicKeyIndex
dumpInterfaceListenPortIndex
dumpInterfaceFWMarkIndex
dumpInterfaceLen
)
type dumpPeerIndex int
const (
dumpPeerPublicKeyIndex = iota
dumpPeerPresharedKeyIndex
dumpPeerEndpointIndex
dumpPeerAllowedIPsIndex
dumpPeerLatestHandshakeIndex
dumpPeerTransferRXIndex
dumpPeerTransferTXIndex
dumpPeerPersistentKeepaliveIndex
dumpPeerLen
)
// Conf represents a WireGuard configuration file.
type Conf struct {
Interface *Interface
@ -500,10 +524,10 @@ func ParseDump(buf []byte) *Conf {
c Conf
err error
iface *Interface
i int
peer *Peer
port uint64
sec int64
pka int
)
// First line is Interface
active = interfaceSection
@ -513,47 +537,70 @@ func ParseDump(buf []byte) *Conf {
switch active {
case interfaceSection:
if len(values) < 4 {
if len(values) < dumpInterfaceLen {
break
}
iface = new(Interface)
iface.PrivateKey = []byte(values[0])
port, err = strconv.ParseUint(values[2], 10, 32)
if err == nil {
iface.ListenPort = uint32(port)
for i := range values {
switch i {
case dumpInterfacePrivateKeyIndex:
iface.PrivateKey = []byte(values[i])
case dumpInterfaceListenPortIndex:
port, err = strconv.ParseUint(values[i], 10, 32)
if err != nil {
continue
}
iface.ListenPort = uint32(port)
}
}
c.Interface = iface
// Next lines are Peers
active = peerSection
case peerSection:
if len(values) < 8 {
if len(values) < dumpPeerLen {
break
}
peer = new(Peer)
peer.PublicKey = []byte(values[0])
if values[1] != dumpNone {
peer.PresharedKey = []byte(values[1])
}
if values[2] != dumpNone {
peer.parseEndpoint(values[2])
}
if values[3] != dumpNone {
peer.parseAllowedIPs(values[3])
}
if values[4] != "0" {
sec, err = strconv.ParseInt(values[4], 10, 64)
if err == nil {
for i := range values {
switch i {
case dumpPeerPublicKeyIndex:
peer.PublicKey = []byte(values[i])
case dumpPeerPresharedKeyIndex:
if values[i] == dumpNone {
continue
}
peer.PresharedKey = []byte(values[i])
case dumpPeerEndpointIndex:
if values[i] == dumpNone {
continue
}
peer.parseEndpoint(values[i])
case dumpPeerAllowedIPsIndex:
if values[i] == dumpNone {
continue
}
peer.parseAllowedIPs(values[i])
case dumpPeerLatestHandshakeIndex:
if values[i] == "0" {
// Use go zero value, not unix 0 timestamp.
peer.LatestHandshake = time.Time{}
continue
}
sec, err = strconv.ParseInt(values[i], 10, 64)
if err != nil {
continue
}
peer.LatestHandshake = time.Unix(sec, 0)
}
}
if values[7] != dumpOff {
i, err = strconv.Atoi(values[7])
if err == nil {
peer.PersistentKeepalive = i
case dumpPeerPersistentKeepaliveIndex:
if values[i] == dumpOff {
continue
}
pka, err = strconv.Atoi(values[i])
if err != nil {
continue
}
peer.PersistentKeepalive = pka
}
}
c.Peers = append(c.Peers, peer)