From bb28b8f3408e1d77eada485cbf531b33d212e6d6 Mon Sep 17 00:00:00 2001 From: jdl Date: Wed, 10 Jun 2026 06:36:30 +0200 Subject: [PATCH] WIP: DNS --- hub/api/db/generated.go | 20 ++++++++++---------- hub/api/db/sanitize-validate.go | 14 ++++++++++---- hub/api/db/tables.defs | 6 +++--- hub/api/migrations/2024-11-30-init.sql | 2 +- hub/handlers.go | 11 +++++++++-- hub/templates/admin-network-create.html | 4 ++-- hub/templates/admin-network-list.html | 4 ++-- hub/templates/network/base.html | 2 +- m/models.go | 15 ++++++++------- 9 files changed, 46 insertions(+), 32 deletions(-) diff --git a/hub/api/db/generated.go b/hub/api/db/generated.go index 41f331d..e0ac098 100644 --- a/hub/api/db/generated.go +++ b/hub/api/db/generated.go @@ -191,12 +191,12 @@ func Config_List( // ---------------------------------------------------------------------------- type Network struct { - NetworkID int64 - Name string - Network []byte + NetworkID int64 + LocalDomain string + Network []byte } -const Network_SelectQuery = "SELECT NetworkID,Name,Network FROM networks" +const Network_SelectQuery = "SELECT NetworkID,LocalDomain,Network FROM networks" func Network_Insert( tx TX, @@ -207,7 +207,7 @@ func Network_Insert( return err } - _, err = tx.Exec("INSERT INTO networks(NetworkID,Name,Network) VALUES(?,?,?)", row.NetworkID, row.Name, row.Network) + _, err = tx.Exec("INSERT INTO networks(NetworkID,LocalDomain,Network) VALUES(?,?,?)", row.NetworkID, row.LocalDomain, row.Network) return err } @@ -220,7 +220,7 @@ func Network_UpdateFull( return err } - result, err := tx.Exec("UPDATE networks SET Name=?,Network=? WHERE NetworkID=?", row.Name, row.Network, row.NetworkID) + result, err := tx.Exec("UPDATE networks SET LocalDomain=?,Network=? WHERE NetworkID=?", row.LocalDomain, row.Network, row.NetworkID) if err != nil { return err } @@ -270,8 +270,8 @@ func Network_Get( err error, ) { row = &Network{} - r := tx.QueryRow("SELECT NetworkID,Name,Network FROM networks WHERE NetworkID=?", NetworkID) - if err = r.Scan(&row.NetworkID, &row.Name, &row.Network); err != nil { + r := tx.QueryRow("SELECT NetworkID,LocalDomain,Network FROM networks WHERE NetworkID=?", NetworkID) + if err = r.Scan(&row.NetworkID, &row.LocalDomain, &row.Network); err != nil { row = nil } return @@ -287,7 +287,7 @@ func Network_GetWhere( ) { row = &Network{} r := tx.QueryRow(query, args...) - if err = r.Scan(&row.NetworkID, &row.Name, &row.Network); err != nil { + if err = r.Scan(&row.NetworkID, &row.LocalDomain, &row.Network); err != nil { row = nil } return @@ -309,7 +309,7 @@ func Network_Iterate( defer rows.Close() for rows.Next() { row := &Network{} - err := rows.Scan(&row.NetworkID, &row.Name, &row.Network) + err := rows.Scan(&row.NetworkID, &row.LocalDomain, &row.Network) if !yield(row, err) { return } diff --git a/hub/api/db/sanitize-validate.go b/hub/api/db/sanitize-validate.go index c08f316..0c3826f 100644 --- a/hub/api/db/sanitize-validate.go +++ b/hub/api/db/sanitize-validate.go @@ -11,6 +11,7 @@ var ( ErrNonPrivateIP = errors.New("non-private IP") ErrInvalidPort = errors.New("invalid port") ErrInvalidNetName = errors.New("invalid network name") + ErrNetNameNotLocal = errors.New("network name must end with .local") ErrInvalidPeerName = errors.New("invalid peer name") ) @@ -22,7 +23,7 @@ func Config_Validate(c *Config) error { } func Network_Sanitize(n *Network) { - n.Name = strings.TrimSpace(n.Name) + n.LocalDomain = strings.TrimSpace(n.LocalDomain) if addr, ok := netip.AddrFromSlice(n.Network); ok { n.Network = addr.AsSlice() @@ -30,12 +31,17 @@ func Network_Sanitize(n *Network) { } func Network_Validate(c *Network) error { - // 16 bytes is linux limit for network interface names. - if len(c.Name) == 0 || len(c.Name) > 16 { + // 15 bytes is linux limit for network interface names. With ending .local, + // max length is 21. + if len(c.LocalDomain) == 0 || len(c.LocalDomain) > 21 { return ErrInvalidNetName } - for _, c := range c.Name { + if !strings.HasSuffix(c.LocalDomain, ".local") { + return ErrNetNameNotLocal + } + + for _, c := range strings.TrimSuffix(c.LocalDomain, ".local") { if c >= 'a' && c <= 'z' { continue } diff --git a/hub/api/db/tables.defs b/hub/api/db/tables.defs index 3b8c230..e3ca04f 100644 --- a/hub/api/db/tables.defs +++ b/hub/api/db/tables.defs @@ -4,9 +4,9 @@ TABLE config OF Config ( ); TABLE networks OF Network ( - NetworkID int64 PK, - Name string NoUpdate, - Network []byte NoUpdate + NetworkID int64 PK, + LocalDomain string NoUpdate, + Network []byte NoUpdate ); TABLE peers OF Peer ( diff --git a/hub/api/migrations/2024-11-30-init.sql b/hub/api/migrations/2024-11-30-init.sql index 63d9d45..c62b28a 100644 --- a/hub/api/migrations/2024-11-30-init.sql +++ b/hub/api/migrations/2024-11-30-init.sql @@ -5,7 +5,7 @@ CREATE TABLE config ( CREATE TABLE networks ( NetworkID INTEGER NOT NULL PRIMARY KEY, - Name TEXT NOT NULL UNIQUE, -- Network/interface name. + LocalDomain TEXT NOT NULL UNIQUE, -- Network/interface name. Network BLOB NOT NULL UNIQUE -- Network (/24), example 10.51.50.0 ) WITHOUT ROWID; diff --git a/hub/handlers.go b/hub/handlers.go index e90eafe..4f125d8 100644 --- a/hub/handlers.go +++ b/hub/handlers.go @@ -72,7 +72,7 @@ func (a *App) _adminNetworkCreateSubmit(s *api.Session, w http.ResponseWriter, r var netStr string err := webutil.NewFormScanner(r.Form). - Scan("Name", &n.Name). + Scan("LocalDomain", &n.LocalDomain). Scan("Network", &netStr). Error() if err != nil { @@ -345,12 +345,19 @@ func (a *App) _peerInit(peer *api.Peer, w http.ResponseWriter, r *http.Request) } func (a *App) _peerFetchState(peer *api.Peer, w http.ResponseWriter, r *http.Request) error { + net, err := a.api.Network_Get(peer.NetworkID) + if err != nil { + return err + } peers, err := a.peersArray(peer.NetworkID) if err != nil { return err } - return a.sendJSON(w, m.NetworkState{Peers: peers}) + return a.sendJSON(w, m.NetworkState{ + LocalDomain: net.LocalDomain, + Peers: peers, + }) } func (a *App) peersArray(networkID int64) (peers [256]*m.Peer, err error) { diff --git a/hub/templates/admin-network-create.html b/hub/templates/admin-network-create.html index 096acb3..de06e4f 100644 --- a/hub/templates/admin-network-create.html +++ b/hub/templates/admin-network-create.html @@ -3,8 +3,8 @@

-
- +
+


diff --git a/hub/templates/admin-network-list.html b/hub/templates/admin-network-list.html index 3626d6f..43d4036 100644 --- a/hub/templates/admin-network-list.html +++ b/hub/templates/admin-network-list.html @@ -9,7 +9,7 @@ - + @@ -18,7 +18,7 @@ diff --git a/hub/templates/network/base.html b/hub/templates/network/base.html index b773baf..3e848f6 100644 --- a/hub/templates/network/base.html +++ b/hub/templates/network/base.html @@ -17,7 +17,7 @@

Network: - {{.Network.Name}} + {{.Network.LocalDomain}}

{{block "body" .}}There's nothing here.{{end}} diff --git a/m/models.go b/m/models.go index d16986c..a10ebfe 100644 --- a/m/models.go +++ b/m/models.go @@ -13,17 +13,18 @@ type PeerInitResp struct { } type Peer struct { - PeerIP byte - Version int64 - Name string - Addr4 []byte - Addr6 []byte - Port uint16 + PeerIP byte + Version int64 + Name string + Addr4 []byte + Addr6 []byte + Port uint16 Relay bool WGPubKey []byte SignPubKey []byte } type NetworkState struct { - Peers [256]*Peer + LocalDomain string + Peers [256]*Peer }
NameLocal Domain Network
- {{.Name}} + {{.LocalDomain}} {{ipToString .Network}}