summaryrefslogtreecommitdiff
path: root/client
diff options
context:
space:
mode:
Diffstat (limited to 'client')
-rw-r--r--client/client.go28
-rw-r--r--client/client_test.go76
-rw-r--r--client/discovery.go2
-rw-r--r--client/fsm.go2
4 files changed, 105 insertions, 3 deletions
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"
)