From 1b8cdc3417998dd80fb099fe75d7ff662d0d5d14 Mon Sep 17 00:00:00 2001 From: Christoph Haas Date: Sun, 26 Jan 2025 09:52:09 +0100 Subject: [PATCH] automatically append listening port to endpoint address (#352) --- frontend/src/lang/translations/de.json | 2 +- frontend/src/lang/translations/en.json | 2 +- .../app/wireguard/wireguard_interfaces.go | 4 ++++ internal/domain/interface.go | 21 +++++++++++++++++-- 4 files changed, 25 insertions(+), 4 deletions(-) diff --git a/frontend/src/lang/translations/de.json b/frontend/src/lang/translations/de.json index 9f0cab3..53be17e 100644 --- a/frontend/src/lang/translations/de.json +++ b/frontend/src/lang/translations/de.json @@ -354,7 +354,7 @@ "endpoint": { "label": "Endpoint Address", "placeholder": "Endpoint Address", - "description": "The endpoint address that peers will connect to." + "description": "The endpoint address that peers will connect to. (e.g. wg.example.com or wg.example.com:51820)" }, "networks": { "label": "IP Networks", diff --git a/frontend/src/lang/translations/en.json b/frontend/src/lang/translations/en.json index 19842e8..2ecde6d 100644 --- a/frontend/src/lang/translations/en.json +++ b/frontend/src/lang/translations/en.json @@ -355,7 +355,7 @@ "endpoint": { "label": "Endpoint Address", "placeholder": "Endpoint Address", - "description": "The endpoint address that peers will connect to." + "description": "The endpoint address that peers will connect to. (e.g. wg.example.com or wg.example.com:51820)" }, "networks": { "label": "IP Networks", diff --git a/internal/app/wireguard/wireguard_interfaces.go b/internal/app/wireguard/wireguard_interfaces.go index 0d1da82..e0bbcff 100644 --- a/internal/app/wireguard/wireguard_interfaces.go +++ b/internal/app/wireguard/wireguard_interfaces.go @@ -456,6 +456,10 @@ func (m Manager) saveInterface(ctx context.Context, iface *domain.Interface) ( *domain.Interface, error, ) { + if err := iface.Validate(); err != nil { + return nil, fmt.Errorf("interface validation failed: %w", err) + } + stateChanged := m.hasInterfaceStateChanged(ctx, iface) if err := m.handleInterfacePreSaveHooks(stateChanged, iface); err != nil { diff --git a/internal/domain/interface.go b/internal/domain/interface.go index 0547db7..8d618ac 100644 --- a/internal/domain/interface.go +++ b/internal/domain/interface.go @@ -3,6 +3,7 @@ package domain import ( "fmt" "math" + "net" "regexp" "strconv" "strings" @@ -71,8 +72,24 @@ type Interface struct { PeerDefPostDown string // default action that is executed after the device is down } -func (i *Interface) IsValid() bool { - return true // TODO: implement check +// Validate performs checks to ensure that the interface is valid. +func (i *Interface) Validate() error { + // validate peer default endpoint, add port if needed + if i.PeerDefEndpoint != "" { + host, port, err := net.SplitHostPort(i.PeerDefEndpoint) + switch { + case err != nil && !strings.Contains(err.Error(), "missing port in address"): + return fmt.Errorf("invalid default endpoint: %w", err) + case err != nil && strings.Contains(err.Error(), "missing port in address"): + // In this case, the entire string is the host, and there's no port. + host = i.PeerDefEndpoint + port = strconv.Itoa(i.ListenPort) + } + + i.PeerDefEndpoint = net.JoinHostPort(host, port) + } + + return nil } func (i *Interface) IsDisabled() bool {