From 27b95b4911da055fe9b5fb37b5fb4a33eda6b989 Mon Sep 17 00:00:00 2001 From: Jeroen Wijenbergh Date: Mon, 25 Aug 2025 10:59:37 +0200 Subject: All: Remove util packages Was giving linting errors and it's not a good idea anyways --- client/client.go | 28 ++++++++++++++++++- client/client_test.go | 76 +++++++++++++++++++++++++++++++++++++++++++++++++++ client/discovery.go | 2 +- client/fsm.go | 2 +- 4 files changed, 105 insertions(+), 3 deletions(-) (limited to 'client') diff --git a/client/client.go b/client/client.go index d668eb0..59b425d 100644 --- a/client/client.go +++ b/client/client.go @@ -7,11 +7,12 @@ import ( "context" "errors" "log/slog" + "net" "os" "sync" "time" - "codeberg.org/eduVPN/eduvpn-common/i18nerr" + "codeberg.org/eduVPN/eduvpn-common/i18n/err" "codeberg.org/eduVPN/eduvpn-common/internal/api" "codeberg.org/eduVPN/eduvpn-common/internal/config" "codeberg.org/eduVPN/eduvpn-common/internal/discovery" @@ -25,6 +26,31 @@ import ( "github.com/jwijenbergh/eduoauth-go" ) +// CalculateGateway takes a CIDR encoded subnet `cidr` and returns the gateway and an error +// TODO: move this somewhere else? +func CalculateGateway(cidr string) (string, error) { + _, ipn, err := net.ParseCIDR(cidr) + if err != nil { + return "", i18nerr.WrapInternalf(err, "failed to parse CIDR for calculating gateway: %v", cidr) + } + + ret := make(net.IP, len(ipn.IP)) + copy(ret, ipn.IP) + + for i := len(ret) - 1; i >= 0; i-- { + ret[i]++ + if ret[i] > 0 { + break + } + } + + if !ipn.Contains(ret) { + return "", i18nerr.Newf("IP network does not contain incremented IP: %v", ret) + } + + return ret.String(), nil +} + // Client is the main struct for the VPN client. type Client struct { // The name of the client diff --git a/client/client_test.go b/client/client_test.go index 9f302c4..d623037 100644 --- a/client/client_test.go +++ b/client/client_test.go @@ -11,12 +11,88 @@ import ( "time" httpw "codeberg.org/eduVPN/eduvpn-common/internal/http" + "codeberg.org/eduVPN/eduvpn-common/internal/test" "codeberg.org/eduVPN/eduvpn-common/types/cookie" "codeberg.org/eduVPN/eduvpn-common/types/protocol" srvtypes "codeberg.org/eduVPN/eduvpn-common/types/server" "github.com/jwijenbergh/eduoauth-go" ) +func TestCalculateGateway(t *testing.T) { + cases := []struct { + in string + want string + err string + }{ + // normal cases + { + in: "10.10.10.5/24", + want: "10.10.10.1", + err: "", + }, + { + in: "10.10.10.130/25", + want: "10.10.10.129", + err: "", + }, + { + in: "fd42::5/112", + want: "fd42::1", + err: "", + }, + { + in: "5502:df9::/64", + want: "5502:df9::1", + err: "", + }, + // unrealistic scenario but we have to handle these! + { + in: "5502:df9::0/128", + want: "", + err: "IP network does not contain incremented IP: 5502:df9::1", + }, + { + in: "5502:df9::ffff/128", + want: "", + err: "IP network does not contain incremented IP: 5502:df9::1:0", + }, + { + in: "10.0.0.0/32", + want: "", + err: "IP network does not contain incremented IP: 10.0.0.1", + }, + { + in: "10.0.0.255/32", + want: "", + err: "IP network does not contain incremented IP: 10.0.1.0", + }, + // parsing errors + { + in: "10.0.0.1", + want: "", + err: "An internal error occurred. The cause of the error is: invalid CIDR address: 10.0.0.1.", + }, + { + in: "bla", + want: "", + err: "An internal error occurred. The cause of the error is: invalid CIDR address: bla.", + }, + { + in: "5502:df9::ffff", + want: "", + err: "An internal error occurred. The cause of the error is: invalid CIDR address: 5502:df9::ffff.", + }, + } + + for _, c := range cases { + got, err := CalculateGateway(c.in) + test.AssertError(t, err, c.err) + if got != c.want { + t.Fatalf("got: %v not equal to want: %v", got, c.want) + } + } +} + func getServerURI(t *testing.T) string { serverURI := os.Getenv("SERVER_URI") if serverURI == "" { diff --git a/client/discovery.go b/client/discovery.go index b1cae32..b434025 100644 --- a/client/discovery.go +++ b/client/discovery.go @@ -5,7 +5,7 @@ import ( "sort" "strings" - "codeberg.org/eduVPN/eduvpn-common/i18nerr" + "codeberg.org/eduVPN/eduvpn-common/i18n/err" "codeberg.org/eduVPN/eduvpn-common/types/cookie" discotypes "codeberg.org/eduVPN/eduvpn-common/types/discovery" ) diff --git a/client/fsm.go b/client/fsm.go index 6fffc8a..673f3fb 100644 --- a/client/fsm.go +++ b/client/fsm.go @@ -4,7 +4,7 @@ import ( "fmt" "log/slog" - "codeberg.org/eduVPN/eduvpn-common/i18nerr" + "codeberg.org/eduVPN/eduvpn-common/i18n/err" "codeberg.org/eduVPN/eduvpn-common/internal/fsm" ) -- cgit v1.2.3