Files
vppn/hub/api/db/sanitize-validate.go
2026-06-07 19:42:04 +02:00

107 lines
1.9 KiB
Go

package db
import (
"errors"
"net/netip"
"strings"
)
var (
ErrInvalidIP = errors.New("invalid IP")
ErrNonPrivateIP = errors.New("non-private IP")
ErrInvalidPort = errors.New("invalid port")
ErrInvalidNetName = errors.New("invalid network name")
ErrInvalidPeerName = errors.New("invalid peer name")
)
func Config_Sanitize(c *Config) {
}
func Config_Validate(c *Config) error {
return nil
}
func Network_Sanitize(n *Network) {
n.Name = strings.TrimSpace(n.Name)
if addr, ok := netip.AddrFromSlice(n.Network); ok {
n.Network = addr.AsSlice()
}
}
func Network_Validate(c *Network) error {
// 16 bytes is linux limit for network interface names.
if len(c.Name) == 0 || len(c.Name) > 16 {
return ErrInvalidNetName
}
for _, c := range c.Name {
if c >= 'a' && c <= 'z' {
continue
}
if c >= '0' && c <= '9' {
continue
}
return ErrInvalidNetName
}
addr, ok := netip.AddrFromSlice(c.Network)
if !ok || !addr.Is4() || addr.As4()[3] != 0 || addr.As4()[0] == 0 {
return ErrInvalidIP
}
if !addr.IsPrivate() {
return ErrNonPrivateIP
}
return nil
}
func Peer_Sanitize(p *Peer) {
p.Name = strings.TrimSpace(p.Name)
if len(p.Addr4) != 0 {
if addr, ok := netip.AddrFromSlice(p.Addr4); ok {
p.Addr4 = addr.AsSlice()
}
}
if len(p.Addr6) != 0 {
if addr, ok := netip.AddrFromSlice(p.Addr6); ok {
p.Addr6 = addr.AsSlice()
}
}
if p.Port == 0 {
p.Port = 51820
}
}
func Peer_Validate(p *Peer) error {
if len(p.Addr4) > 0 {
if _, ok := netip.AddrFromSlice(p.Addr4); !ok {
return ErrInvalidIP
}
}
if len(p.Addr6) > 0 {
if _, ok := netip.AddrFromSlice(p.Addr6); !ok {
return ErrInvalidIP
}
}
if p.Port == 0 {
return ErrInvalidPort
}
for _, c := range p.Name {
if c >= 'a' && c <= 'z' {
continue
}
if c >= '0' && c <= '9' {
continue
}
if c == '.' || c == '-' || c == '_' {
continue
}
return ErrInvalidPeerName
}
return nil
}