From 7278ecacd7fdf3c3a35d39a7784dabcc13010c2d Mon Sep 17 00:00:00 2001 From: Matthew R Kasun Date: Fri, 19 Dec 2025 18:31:16 -0500 Subject: [PATCH 01/14] replace gonic-gin with devilcove/mux --- docs/{toc.md => index.md} | 0 go.mod | 28 +--- go.sum | 61 +------- internal/server/broker.go | 2 +- internal/server/config.go | 4 +- internal/server/html/content.html | 32 ++-- internal/server/html/header.html | 18 +-- internal/server/html/keys.html | 7 +- internal/server/html/layout.html | 33 +++-- internal/server/html/login.html | 2 +- internal/server/html/networks.html | 22 ++- internal/server/html/peers.html | 16 +- internal/server/html/relay.html | 4 +- internal/server/html/router.html | 10 +- internal/server/html/server.html | 6 +- internal/server/html/sidebar.html | 6 +- internal/server/html/users.html | 12 +- internal/server/keys.go | 67 +++++---- internal/server/networks.go | 191 ++++++++++++++---------- internal/server/page.go | 95 ++++++------ internal/server/page_test.go | 7 +- internal/server/peers.go | 27 ++-- internal/server/router.go | 228 +++++++++++++++-------------- internal/server/server.go | 78 +++++----- internal/server/sessions.go | 117 +++++++++++++++ internal/server/subnetrouter.go | 53 +++---- internal/server/users.go | 189 +++++++++++++----------- 27 files changed, 731 insertions(+), 584 deletions(-) rename docs/{toc.md => index.md} (100%) create mode 100644 internal/server/sessions.go diff --git a/docs/toc.md b/docs/index.md similarity index 100% rename from docs/toc.md rename to docs/index.md diff --git a/go.mod b/go.mod index c379a7e..9b02b5e 100644 --- a/go.mod +++ b/go.mod @@ -7,12 +7,13 @@ require ( github.com/c-robinson/iplib v1.0.8 github.com/caddyserver/certmagic v0.25.0 github.com/devilcove/boltdb v0.1.7 + github.com/devilcove/mux v0.2.0 github.com/fatih/color v1.18.0 - github.com/gin-contrib/sessions v1.0.4 - github.com/gin-gonic/gin v1.11.0 github.com/google/nftables v0.3.0 + github.com/gorilla/sessions v1.4.0 github.com/kr/pretty v0.3.1 github.com/lmittmann/tint v1.1.2 + github.com/mattkasun/tools v0.2.3 github.com/nats-io/nats-server/v2 v2.12.2 github.com/nats-io/nats.go v1.47.0 github.com/nats-io/nkeys v0.4.12 @@ -27,30 +28,16 @@ require ( require ( github.com/antithesishq/antithesis-sdk-go v0.4.3-default-no-op // indirect - github.com/bytedance/sonic v1.14.0 // indirect - github.com/bytedance/sonic/loader v0.3.0 // indirect github.com/caddyserver/zerossl v0.1.3 // indirect - github.com/cloudwego/base64x v0.1.6 // indirect github.com/fsnotify/fsnotify v1.9.0 // indirect - github.com/gabriel-vasile/mimetype v1.4.8 // indirect - github.com/gin-contrib/sse v1.1.0 // indirect - github.com/go-playground/locales v0.14.1 // indirect - github.com/go-playground/universal-translator v0.18.1 // indirect - github.com/go-playground/validator/v10 v10.27.0 // indirect github.com/go-viper/mapstructure/v2 v2.4.0 // indirect - github.com/goccy/go-json v0.10.5 // indirect - github.com/goccy/go-yaml v1.18.0 // indirect github.com/google/go-cmp v0.7.0 // indirect github.com/google/go-tpm v0.9.6 // indirect - github.com/gorilla/context v1.1.2 // indirect github.com/gorilla/securecookie v1.1.2 // indirect - github.com/gorilla/sessions v1.4.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/compress v1.18.1 // indirect github.com/klauspost/cpuid/v2 v2.3.0 // indirect github.com/kr/text v0.2.0 // indirect - github.com/leodido/go-urn v1.4.0 // indirect github.com/libdns/libdns v1.1.1 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect @@ -60,16 +47,12 @@ require ( github.com/mholt/acmez/v3 v3.1.3 // indirect github.com/miekg/dns v1.1.68 // indirect github.com/minio/highwayhash v1.0.4-0.20251030100505-070ab1a87a76 // indirect - github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.2 // indirect github.com/nats-io/jwt/v2 v2.8.0 // indirect github.com/nats-io/nuid v1.0.1 // indirect github.com/pelletier/go-toml/v2 v2.2.4 // indirect github.com/pion/dtls/v2 v2.2.7 // indirect github.com/pion/logging v0.2.2 // indirect github.com/pion/transport/v2 v2.2.1 // indirect - github.com/quic-go/qpack v0.6.0 // indirect - github.com/quic-go/quic-go v0.57.0 // indirect github.com/rogpeppe/go-internal v1.10.0 // indirect github.com/sagikazarmark/locafero v0.11.0 // indirect github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 // indirect @@ -77,15 +60,12 @@ require ( github.com/spf13/cast v1.10.0 // indirect github.com/spf13/pflag v1.0.10 // indirect github.com/subosito/gotenv v1.6.0 // indirect - github.com/twitchyliquid64/golang-asm v0.15.1 // indirect - github.com/ugorji/go/codec v1.3.0 // indirect github.com/vishvananda/netns v0.0.5 // indirect github.com/zeebo/blake3 v0.2.4 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect go.uber.org/zap/exp v0.3.0 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect - golang.org/x/arch v0.20.0 // indirect golang.org/x/mod v0.30.0 // indirect golang.org/x/net v0.47.0 // indirect golang.org/x/sync v0.19.0 // indirect @@ -94,5 +74,5 @@ require ( golang.org/x/time v0.14.0 // indirect golang.org/x/tools v0.39.0 // indirect golang.zx2c4.com/wireguard v0.0.0-20231211153847-12269c276173 // indirect - google.golang.org/protobuf v1.36.9 // indirect + gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect ) diff --git a/go.sum b/go.sum index debbeb5..03e4e83 100644 --- a/go.sum +++ b/go.sum @@ -2,18 +2,12 @@ github.com/Kairum-Labs/should v0.2.2 h1:bO1kaMGRYRSSpq8MHsmk2MqpA1taLPblPCZy9Jnp github.com/Kairum-Labs/should v0.2.2/go.mod h1:vP/ASEjUAKoWy/M7uIrAXq69p7/IUWOpEe5R+q/+K34= github.com/antithesishq/antithesis-sdk-go v0.4.3-default-no-op h1:+OSa/t11TFhqfrX0EOSqQBDJ0YlpmK0rDSiB19dg9M0= github.com/antithesishq/antithesis-sdk-go v0.4.3-default-no-op/go.mod h1:IUpT2DPAKh6i/YhSbt6Gl3v2yvUZjmKncl7U91fup7E= -github.com/bytedance/sonic v1.14.0 h1:/OfKt8HFw0kh2rj8N0F6C/qPGRESq0BbaNZgcNXXzQQ= -github.com/bytedance/sonic v1.14.0/go.mod h1:WoEbx8WTcFJfzCe0hbmyTGrfjt8PzNEBdxlNUO24NhA= -github.com/bytedance/sonic/loader v0.3.0 h1:dskwH8edlzNMctoruo8FPTJDF3vLtDT0sXZwvZJyqeA= -github.com/bytedance/sonic/loader v0.3.0/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI= github.com/c-robinson/iplib v1.0.8 h1:exDRViDyL9UBLcfmlxxkY5odWX5092nPsQIykHXhIn4= github.com/c-robinson/iplib v1.0.8/go.mod h1:i3LuuFL1hRT5gFpBRnEydzw8R6yhGkF4szNDIbF8pgo= github.com/caddyserver/certmagic v0.25.0 h1:VMleO/XA48gEWes5l+Fh6tRWo9bHkhwAEhx63i+F5ic= github.com/caddyserver/certmagic v0.25.0/go.mod h1:m9yB7Mud24OQbPHOiipAoyKPn9pKHhpSJxXR1jydBxA= github.com/caddyserver/zerossl v0.1.3 h1:onS+pxp3M8HnHpN5MMbOMyNjmTheJyWRaZYwn+YTAyA= github.com/caddyserver/zerossl v0.1.3/go.mod h1:CxA0acn7oEGO6//4rtrRjYgEoa4MFw/XofZnrYwGqG4= -github.com/cloudwego/base64x v0.1.6 h1:t11wG9AECkCDk5fMSoxmufanudBtJ+/HemLstXDLI2M= -github.com/cloudwego/base64x v0.1.6/go.mod h1:OFcloc187FXDaYHvrNIjxSe8ncn0OOM8gEHfghB2IPU= github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -21,67 +15,47 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/devilcove/boltdb v0.1.7 h1:JVj8aZ/bilaGhduq1+E4qlWRrxYeH5sIjWdrdnBcsr0= github.com/devilcove/boltdb v0.1.7/go.mod h1:aXkamUgsGOC3njIPiZ/FzsYqAGGEMQyc5EE1gRHlOuw= +github.com/devilcove/mux v0.2.0 h1:U9bKQs0HhGJqIFUmH84nPt5pz67QJtmVtwT2f3RKgsk= +github.com/devilcove/mux v0.2.0/go.mod h1:Q4ysJcjpLwW7rLNTOYSlYVst5OmwFh1uZxJSCPQ34U4= github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= -github.com/gabriel-vasile/mimetype v1.4.8 h1:FfZ3gj38NjllZIeJAmMhr+qKL8Wu+nOoI3GqacKw1NM= -github.com/gabriel-vasile/mimetype v1.4.8/go.mod h1:ByKUIKGjh1ODkGM1asKUbQZOLGrPjydw3hYPU2YU9t8= -github.com/gin-contrib/sessions v1.0.4 h1:ha6CNdpYiTOK/hTp05miJLbpTSNfOnFg5Jm2kbcqy8U= -github.com/gin-contrib/sessions v1.0.4/go.mod h1:ccmkrb2z6iU2osiAHZG3x3J4suJK+OU27oqzlWOqQgs= -github.com/gin-contrib/sse v1.1.0 h1:n0w2GMuUpWDVp7qSpvze6fAu9iRxJY4Hmj6AmBOU05w= -github.com/gin-contrib/sse v1.1.0/go.mod h1:hxRZ5gVpWMT7Z0B0gSNYqqsSCNIJMjzvm6fqCz9vjwM= -github.com/gin-gonic/gin v1.11.0 h1:OW/6PLjyusp2PPXtyxKHU0RbX6I/l28FTdDlae5ueWk= -github.com/gin-gonic/gin v1.11.0/go.mod h1:+iq/FyxlGzII0KHiBGjuNn4UNENUlKbGlNmc+W50Dls= -github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= -github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= -github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= -github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= -github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-playground/validator/v10 v10.27.0 h1:w8+XrWVMhGkxOaaowyKH35gFydVHOvC0/uWoy2Fzwn4= -github.com/go-playground/validator/v10 v10.27.0/go.mod h1:I5QpIEbmr8On7W0TktmJAumgzX4CA1XNl4ZmDuVHKKo= github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= -github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= -github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= -github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw= -github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/go-tpm v0.9.6 h1:Ku42PT4LmjDu1H5C5ISWLlpI1mj+Zq7sPGKoRw2XROA= github.com/google/go-tpm v0.9.6/go.mod h1:h9jEsEECg7gtLis0upRBQU+GhYVH6jMjrFxI8u6bVUY= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/nftables v0.3.0 h1:bkyZ0cbpVeMHXOrtlFc8ISmfVqq5gPJukoYieyVmITg= github.com/google/nftables v0.3.0/go.mod h1:BCp9FsrbF1Fn/Yu6CLUc9GGZFw/+hsxfluNXXmxBfRM= -github.com/gorilla/context v1.1.2 h1:WRkNAv2uoa03QNIc1A6u4O7DAGMUVoopZhkiXWA2V1o= -github.com/gorilla/context v1.1.2/go.mod h1:KDPwT9i/MeWHiLl90fuTgrt4/wPcv75vFAZLaOOcbxM= github.com/gorilla/securecookie v1.1.2 h1:YCIWL56dvtr73r6715mJs5ZvhtnY73hBvEF8kXD8ePA= github.com/gorilla/securecookie v1.1.2/go.mod h1:NfCASbcHqRSY+3a8tlWJwsQap2VX5pwzwo4h3eOamfo= github.com/gorilla/sessions v1.4.0 h1:kpIYOp/oi6MG/p5PgxApU8srsSw9tuFbt46Lt7auzqQ= github.com/gorilla/sessions v1.4.0/go.mod h1:FLWm50oby91+hl7p/wRxDth9bWSuk0qVL2emc7lT5ik= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/klauspost/compress v1.18.1 h1:bcSGx7UbpBqMChDtsF28Lw6v/G94LPrrbMbdC3JH2co= github.com/klauspost/compress v1.18.1/go.mod h1:ZQFFVG+MdnR0P+l6wpXgIL4NTtwiKIdBnrBd8Nrxr+0= github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y= github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= -github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= github.com/libdns/libdns v1.1.1 h1:wPrHrXILoSHKWJKGd0EiAVmiJbFShguILTg9leS/P/U= github.com/libdns/libdns v1.1.1/go.mod h1:4Bj9+5CQiNMVGf87wjX4CY3HQJypUHRuLvlsfsZqLWQ= github.com/lmittmann/tint v1.1.2 h1:2CQzrL6rslrsyjqLDwD11bZ5OpLBPU+g3G/r5LSfS8w= github.com/lmittmann/tint v1.1.2/go.mod h1:HIS3gSy7qNwGCj+5oRjAutErFBl4BzdQP6cJZ0NfMwE= +github.com/mattkasun/tools v0.2.3 h1:g3ciN2dtA+NpTGqJvcuMaHy4NRkPKWt8TY8ZnJw8kVc= +github.com/mattkasun/tools v0.2.3/go.mod h1:WHhDjcX5n0ZAP0Z6XET1p2pCWqUgZDq8M5XEg+Pus9k= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= @@ -101,11 +75,6 @@ github.com/mikioh/ipaddr v0.0.0-20190404000644-d465c8ab6721 h1:RlZweED6sbSArvlE9 github.com/mikioh/ipaddr v0.0.0-20190404000644-d465c8ab6721/go.mod h1:Ickgr2WtCLZ2MDGd4Gr0geeCH5HybhRJbonOgQpvSxc= github.com/minio/highwayhash v1.0.4-0.20251030100505-070ab1a87a76 h1:KGuD/pM2JpL9FAYvBrnBBeENKZNh6eNtjqytV6TYjnk= github.com/minio/highwayhash v1.0.4-0.20251030100505-070ab1a87a76/go.mod h1:GGYsuwP/fPD6Y9hMiXuapVvlIUEhFhMTh0rxU3ik1LQ= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/nats-io/jwt/v2 v2.8.0 h1:K7uzyz50+yGZDO5o772eRE7atlcSEENpL7P+b74JV1g= github.com/nats-io/jwt/v2 v2.8.0/go.mod h1:me11pOkwObtcBNR8AiMrUbtVOUGkqYjMQZ6jnSdVUIA= github.com/nats-io/nats-server/v2 v2.12.2 h1:4TEQd0Y4zvcW0IsVxjlXnRso1hBkQl3TS0BI+SxgPhE= @@ -129,10 +98,6 @@ github.com/pion/transport/v2 v2.2.1/go.mod h1:cXXWavvCnFF6McHTft3DWS9iic2Mftcz1A github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/quic-go/qpack v0.6.0 h1:g7W+BMYynC1LbYLSqRt8PBg5Tgwxn214ZZR34VIOjz8= -github.com/quic-go/qpack v0.6.0/go.mod h1:lUpLKChi8njB4ty2bFLX2x4gzDqXwUpaO1DP9qMDZII= -github.com/quic-go/quic-go v0.57.0 h1:AsSSrrMs4qI/hLrKlTH/TGQeTMY0ib1pAOX7vA3AdqE= -github.com/quic-go/quic-go v0.57.0/go.mod h1:ly4QBAjHA2VhdnxhojRsCUOeJwKYg+taDlos92xb1+s= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= @@ -155,20 +120,14 @@ github.com/spf13/viper v1.21.0/go.mod h1:P0lhsswPGWD/1lZJ9ny3fYnVqxiegrlNrEmgLjb github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= -github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= -github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= -github.com/ugorji/go/codec v1.3.0 h1:Qd2W2sQawAfG8XSvzwhBeoGq71zXOC/Q1E9y/wUcsUA= -github.com/ugorji/go/codec v1.3.0/go.mod h1:pRBVtBSKl77K30Bv8R2P+cLSGaTtex6fsA2Wjqmfxj4= github.com/vishvananda/netlink v1.3.1 h1:3AEMt62VKqz90r0tmNhog0r/PpWKmrEShJU0wJW6bV0= github.com/vishvananda/netlink v1.3.1/go.mod h1:ARtKouGSTGchR8aMwmkzC0qiNPrrWO5JS/XMVl45+b4= github.com/vishvananda/netns v0.0.5 h1:DfiHV+j8bA32MFM7bfEunvT8IAqQ/NzSJHtcmW5zdEY= @@ -184,8 +143,6 @@ go.etcd.io/bbolt v1.4.3 h1:dEadXpI6G79deX5prL3QRNP6JB8UxVkqo4UPnHaNXJo= go.etcd.io/bbolt v1.4.3/go.mod h1:tKQlpPaYCVFctUIgFKFnAlvbmB3tpy1vkTnDWohtc0E= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= -go.uber.org/mock v0.5.2 h1:LbtPTcP8A5k9WPXj54PPPbjcI4Y6lhyOZXn+VS7wNko= -go.uber.org/mock v0.5.2/go.mod h1:wLlUxC2vVTPTaE3UD51E0BGOAElKrILxhVSDYQLld5o= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= @@ -194,8 +151,6 @@ go.uber.org/zap/exp v0.3.0 h1:6JYzdifzYkGmTdRR59oYH+Ng7k49H9qVpWwNSsGJj3U= go.uber.org/zap/exp v0.3.0/go.mod h1:5I384qq7XGxYyByIhHm6jg5CHkGY0nsTfbDLgDDlgJQ= go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= -golang.org/x/arch v0.20.0 h1:dx1zTU0MAE98U+TQ8BLl7XsJbgze2WnNKF/8tGp/Q6c= -golang.org/x/arch v0.20.0/go.mod h1:bdwinDaKcfZUGpH09BB7ZmOfhalA8lQdzl62l8gGWsk= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= @@ -255,8 +210,6 @@ golang.zx2c4.com/wireguard v0.0.0-20231211153847-12269c276173 h1:/jFs0duh4rdb8uI golang.zx2c4.com/wireguard v0.0.0-20231211153847-12269c276173/go.mod h1:tkCQ4FQXmpAgYVh++1cq16/dH4QJtmvpRv19DWGAHSA= golang.zx2c4.com/wireguard/wgctrl v0.0.0-20241231184526-a9ab2273dd10 h1:3GDAcqdIg1ozBNLgPy4SLT84nfcBjr6rhGtXYtrkWLU= golang.zx2c4.com/wireguard/wgctrl v0.0.0-20241231184526-a9ab2273dd10/go.mod h1:T97yPqesLiNrOYxkwmhMI0ZIlJDm+p0PMR8eRVeR5tQ= -google.golang.org/protobuf v1.36.9 h1:w2gp2mA27hUeUzj9Ex9FBjsBm40zfaDtEWow293U7Iw= -google.golang.org/protobuf v1.36.9/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/internal/server/broker.go b/internal/server/broker.go index 22a3884..2b1f75f 100644 --- a/internal/server/broker.go +++ b/internal/server/broker.go @@ -67,7 +67,7 @@ func broker(ctx context.Context, wg *sync.WaitGroup, tls *tls.Config) { return adminKey.Sign(nonce) } opts := []nats.Option{nats.Nkey(adminPublicKey, SignatureCB)} - natsConn, err = nats.Connect(net.JoinHostPort("nats://"+config.FQDN, "4222"), opts...) + natsConn, err = nats.Connect("nats://"+net.JoinHostPort(config.FQDN, "4222"), opts...) if err != nil { slog.Error("nats connect", "error", err) brokerfail <- 1 diff --git a/internal/server/config.go b/internal/server/config.go index 6aae283..1c1a765 100644 --- a/internal/server/config.go +++ b/internal/server/config.go @@ -46,7 +46,7 @@ var ( ErrSubnetInUse = errors.New("subnet in use") sessionAge = 60 * 60 * 24 version = "v0.2.3" - path = "/var/lib/plexus/" + path = "/tmp/plexus/" ) const ( @@ -95,7 +95,7 @@ func configureServer() (*tls.Config, error) { if err := os.MkdirAll(config.DBPath, os.ModePerm); err != nil { return nil, err } - slog.Info("init db", "path", config.DBFile, "file", config.DBFile, "tables", config.Tables) + slog.Info("init db", "path", config.DBPath, "file", config.DBFile, "tables", config.Tables) if err := boltdb.Initialize(config.DBPath+config.DBFile, config.Tables); err != nil { return nil, fmt.Errorf("init database %w", err) } diff --git a/internal/server/html/content.html b/internal/server/html/content.html index 03c45d6..207eed2 100644 --- a/internal/server/html/content.html +++ b/internal/server/html/content.html @@ -1,25 +1,21 @@ {{define "content"}} {{if (eq .NeedsLogin true)}} {{template "login" .}} -{{ else if (eq .Page "addNetwork")}} -{{template "addNetwork"}} -{{ else if (eq .Page "networks")}} -{{template "networks" . }} -{{ else if (eq .Page "peers")}} -{{template "peers" . }} -{{ else if (eq .Page "keys")}} -{{template "keys" . }} -{{ else if (eq .Page "users")}} -{{template "users" . }} -{{ else if (eq .Page "settings")}} -{{template "settings" . }} + {{ else }} -
-
-
-
-
- {{template "sidebar" .Networks}} +{{template "sidebar" .Networks}} +
+ {{ if (eq .Page "addNetwork")}} + {{template "addNetwork"}} + {{ else if (eq .Page "networks")}} + {{template "networks" . }} + {{ else if (eq .Page "peers")}} + {{template "peers" . }} + {{ else if (eq .Page "keys")}} + {{template "keys" . }} + {{ else if (eq .Page "users")}} + {{template "users" . }} + {{end}}
{{end}} {{end}} \ No newline at end of file diff --git a/internal/server/html/header.html b/internal/server/html/header.html index 0c316e2..4f2d1f4 100644 --- a/internal/server/html/header.html +++ b/internal/server/html/header.html @@ -1,12 +1,12 @@ {{define "header"}}
- - Plexus -
-
- User - Logout -
-
+ + Plexus +
+
+ User + Logout +
+
-{{end}} +{{end}} \ No newline at end of file diff --git a/internal/server/html/keys.html b/internal/server/html/keys.html index 38a7c5e..85b0ec5 100644 --- a/internal/server/html/keys.html +++ b/internal/server/html/keys.html @@ -1,8 +1,8 @@ {{define "keys"}} -
+
+
+ diff --git a/internal/server/html/login.html b/internal/server/html/login.html index c2f0d15..7e25645 100644 --- a/internal/server/html/login.html +++ b/internal/server/html/login.html @@ -1,7 +1,6 @@ {{define "login"}}
-

Login

diff --git a/internal/server/html/networks.html b/internal/server/html/networks.html index c33d0ef..a17d648 100644 --- a/internal/server/html/networks.html +++ b/internal/server/html/networks.html @@ -4,7 +4,7 @@ -
+
+
From 2c4b4da68f75755a8ef789e91a71fddc3c87eefe Mon Sep 17 00:00:00 2001 From: Matthew R Kasun Date: Thu, 25 Dec 2025 17:35:18 -0500 Subject: [PATCH 06/14] update user tweaks --- internal/server/html/users.html | 4 ++-- internal/server/users.go | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/internal/server/html/users.html b/internal/server/html/users.html index a7f6d86..fc105aa 100644 --- a/internal/server/html/users.html +++ b/internal/server/html/users.html @@ -34,7 +34,7 @@

Edit User

{{.Username}}

-
+


@@ -42,7 +42,7 @@

{{.Username}}

diff --git a/internal/server/router.go b/internal/server/router.go index 9bb2751..c9ada87 100644 --- a/internal/server/router.go +++ b/internal/server/router.go @@ -32,8 +32,7 @@ func setupRouter(l *slog.Logger) *mux.Router { templates = template.Must(template.ParseFS(content, "html/*.html")) // static files - router.StaticFS("/images/", content) - router.StaticFS("/assets/", content) + router.StaticFS("/content/", content) router.ServeFileFS("/favicon.ico", "images/icon.svg", content) // unauthorized routes From 611c0e081beaba0abbc695c4d4c643debf3c17b2 Mon Sep 17 00:00:00 2001 From: Matthew R Kasun Date: Mon, 29 Dec 2025 10:00:06 -0500 Subject: [PATCH 11/14] linting --- .golangci.yml | 13 ++++--- app/plexus-agent/cmd/drop.go | 3 +- app/plexus-agent/cmd/register.go | 4 +- app/plexus-agent/cmd/reset.go | 4 +- app/plexus-agent/cmd/set.go | 10 ++++- app/plexus-agent/cmd/status.go | 10 ++++- app/plexus-agent/cmd/version.go | 11 +++++- internal/agent/broker.go | 25 ++++++++---- internal/agent/config.go | 2 +- internal/agent/daemon.go | 11 +++++- internal/agent/handlers.go | 35 ++++++++++++++--- internal/agent/interface.go | 36 ++++++++++++++--- internal/agent/nftables.go | 7 +++- internal/agent/publish.go | 11 ++++-- internal/server/broker.go | 2 +- internal/server/keys.go | 8 +++- internal/server/keys_test.go | 6 ++- internal/server/nathandlers.go | 31 ++++++++++++--- internal/server/network_test.go | 14 +++++-- internal/server/networks.go | 47 ++++++++++++++++------ internal/server/page.go | 8 ---- internal/server/page_test.go | 2 +- internal/server/peers.go | 15 +++++-- internal/server/router.go | 9 +---- internal/server/server.go | 67 +++++++++++++++++++------------- internal/server/sessions.go | 32 ++++++++------- internal/server/subnetrouter.go | 19 +++++++-- wireguard.go | 7 +++- 28 files changed, 321 insertions(+), 128 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index d3f59b4..9e80b7c 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -26,28 +26,33 @@ linters: settings: cyclop: max-complexity: 20 + errcheck: + exclude-functions: + - crypto/rand.Read funlen: statements: 60 - lines: 80 + lines: 82 gosmopolitan: allow-time-local: true ireturn: allow: - nkeys.KeyPair - error + - net/http.Handler varnamelen: max-distance: 15 ignore-names: - i - wg ignore-decls: - - c *gin.Context - c *nftables.Conn - c nftables.Conn - ec *nats.Conn - f embed.FS - id string - ns *server.Server + - r *http.Request + - w http.ResponseWriter exclusions: warn-unused: true generated: lax @@ -73,9 +78,7 @@ linters: - revive formatters: enable: - - gci - - gofmt - gofumpt - - goimports + - golines exclusions: generated: lax diff --git a/app/plexus-agent/cmd/drop.go b/app/plexus-agent/cmd/drop.go index 4161ce3..f605c88 100644 --- a/app/plexus-agent/cmd/drop.go +++ b/app/plexus-agent/cmd/drop.go @@ -46,5 +46,6 @@ var dropCmd = &cobra.Command{ func init() { rootCmd.AddCommand(dropCmd) - statusCmd.Flags().BoolVarP(&force, "force", "f", false, "force deletion even when not connected") + statusCmd.Flags(). + BoolVarP(&force, "force", "f", false, "force deletion even when not connected") } diff --git a/app/plexus-agent/cmd/register.go b/app/plexus-agent/cmd/register.go index e61fa57..5288a03 100644 --- a/app/plexus-agent/cmd/register.go +++ b/app/plexus-agent/cmd/register.go @@ -36,7 +36,9 @@ var registerCmd = &cobra.Command{ ec, err := agent.ConnectToAgentBroker() cobra.CheckErr(err) resp := plexus.MessageResponse{} - cobra.CheckErr(agent.Request(ec, agent.Agent+plexus.Register, request, &resp, agent.NatsTimeout)) + cobra.CheckErr( + agent.Request(ec, agent.Agent+plexus.Register, request, &resp, agent.NatsTimeout), + ) fmt.Println(resp.Message) }, } diff --git a/app/plexus-agent/cmd/reset.go b/app/plexus-agent/cmd/reset.go index 3c1c28a..895aed0 100644 --- a/app/plexus-agent/cmd/reset.go +++ b/app/plexus-agent/cmd/reset.go @@ -38,7 +38,9 @@ var resetCmd = &cobra.Command{ ec, err := agent.ConnectToAgentBroker() cobra.CheckErr(err) resp := plexus.MessageResponse{} - cobra.CheckErr(agent.Request(ec, agent.Agent+plexus.Reset, request, &resp, agent.NatsTimeout)) + cobra.CheckErr( + agent.Request(ec, agent.Agent+plexus.Reset, request, &resp, agent.NatsTimeout), + ) fmt.Println(resp.Message) }, } diff --git a/app/plexus-agent/cmd/set.go b/app/plexus-agent/cmd/set.go index 965bce8..9ca4c79 100644 --- a/app/plexus-agent/cmd/set.go +++ b/app/plexus-agent/cmd/set.go @@ -67,7 +67,15 @@ var setCmd = &cobra.Command{ resp := plexus.MessageResponse{} ec, err := agent.ConnectToAgentBroker() cobra.CheckErr(err) - cobra.CheckErr(agent.Request(ec, agent.Agent+plexus.SetPrivateEndpoint, request, &resp, agent.NatsTimeout)) + cobra.CheckErr( + agent.Request( + ec, + agent.Agent+plexus.SetPrivateEndpoint, + request, + &resp, + agent.NatsTimeout, + ), + ) fmt.Println(resp.Message) }, } diff --git a/app/plexus-agent/cmd/status.go b/app/plexus-agent/cmd/status.go index 71074cc..9cd9be2 100644 --- a/app/plexus-agent/cmd/status.go +++ b/app/plexus-agent/cmd/status.go @@ -44,7 +44,9 @@ var statusCmd = &cobra.Command{ cobra.CheckErr(err) status := agent.StatusResponse{} // networks := []Network{} - cobra.CheckErr(agent.Request(ec, agent.Agent+plexus.Status, nil, &status, agent.NatsTimeout)) + cobra.CheckErr( + agent.Request(ec, agent.Agent+plexus.Status, nil, &status, agent.NatsTimeout), + ) if status.Server == "" { fmt.Println("agent running... not connected to servers") return @@ -105,7 +107,11 @@ var statusCmd = &cobra.Command{ fmt.Println("\trelay: true") showRelayedPeers(peer.RelayedPeers, network) } - fmt.Println("\tprivate-endpoint:", peer.PrivateEndpoint.String()+":", peer.ListenPort) + fmt.Println( + "\tprivate-endpoint:", + peer.PrivateEndpoint.String()+":", + peer.ListenPort, + ) fmt.Println("\tpublic-endpoint:", peer.Endpoint.String()+":", peer.PublicListenPort) fmt.Println("\twg-endpoint:", wgPeer.Endpoint) fmt.Print("\tallowed ips:") diff --git a/app/plexus-agent/cmd/version.go b/app/plexus-agent/cmd/version.go index fa8237d..7317b8d 100644 --- a/app/plexus-agent/cmd/version.go +++ b/app/plexus-agent/cmd/version.go @@ -40,7 +40,13 @@ var versionCmd = &cobra.Command{ cobra.CheckErr(err) response := plexus.VersionResponse{} // need longer timeout is case of server timeout - err = agent.Request(nc, agent.Agent+plexus.Version, long, &response, agent.NatsLongTimeout) + err = agent.Request( + nc, + agent.Agent+plexus.Version, + long, + &response, + agent.NatsLongTimeout, + ) if err != nil { fmt.Println("error", err) } @@ -71,5 +77,6 @@ func init() { // Cobra supports local flags which will only run when this command // is called directly, e.g.: - versionCmd.Flags().BoolVarP(&long, "long", "l", false, "display server(s)/agent version information") + versionCmd.Flags(). + BoolVarP(&long, "long", "l", false, "display server(s)/agent version information") } diff --git a/internal/agent/broker.go b/internal/agent/broker.go index 4fa275b..549bf1b 100644 --- a/internal/agent/broker.go +++ b/internal/agent/broker.go @@ -20,7 +20,9 @@ import ( func startBroker() (*server.Server, *nats.Conn) { defer log.Println("Agent server halting") - ns, err := server.NewServer(&server.Options{Host: "localhost", Port: Config.NatsPort, NoSigs: true}) + ns, err := server.NewServer( + &server.Options{Host: "localhost", Port: Config.NatsPort, NoSigs: true}, + ) if err != nil { slog.Error("start nats", "error", err) panic(err) @@ -129,12 +131,15 @@ func subcribeToServerTopics(self Device) { } subscriptions = append(subscriptions, ping) - leaveServer, err := serverConn.Subscribe(plexus.Update+id+plexus.LeaveServer, func(_ *nats.Msg) { - slog.Info("leave server") - closeServerConnections() - deleteAllInterfaces() - deleteAllNetworks() - }) + leaveServer, err := serverConn.Subscribe( + plexus.Update+id+plexus.LeaveServer, + func(_ *nats.Msg) { + slog.Info("leave server") + closeServerConnections() + deleteAllInterfaces() + deleteAllNetworks() + }, + ) if err != nil { slog.Error("leave server subscription", "error", err) } @@ -271,7 +276,11 @@ func sendVersion(msg *nats.Msg, agentConn *nats.Conn) { slog.Error("version request", "error", err) } if err := json.Unmarshal(resp.Data, &response); err != nil { - slog.Error("invalid version response from server", "error", err, "data", string(resp.Data)) + slog.Error( + "invalid version response from server", + "error", err, + "data", string(resp.Data), + ) } } else { slog.Debug("not connected to server") diff --git a/internal/agent/config.go b/internal/agent/config.go index 942d998..ac8f400 100644 --- a/internal/agent/config.go +++ b/internal/agent/config.go @@ -36,5 +36,5 @@ var ( type Configuration struct { NatsPort int Verbosity string - DataDir string + DataDir string } diff --git a/internal/agent/daemon.go b/internal/agent/daemon.go index f37fdca..37e834c 100644 --- a/internal/agent/daemon.go +++ b/internal/agent/daemon.go @@ -158,8 +158,15 @@ func privateEndpointServer(ctx context.Context, wg *sync.WaitGroup) { if me.PrivateEndpoint == nil { continue } - slog.Info("tcp listener starting on private endpoint", "endpoint", me.PrivateEndpoint, "port", me.ListenPort) - listener, err := net.ListenTCP("tcp", &net.TCPAddr{IP: me.PrivateEndpoint, Port: me.ListenPort}) + slog.Info( + "tcp listener starting on private endpoint", + "endpoint", me.PrivateEndpoint, + "port", me.ListenPort, + ) + listener, err := net.ListenTCP( + "tcp", + &net.TCPAddr{IP: me.PrivateEndpoint, Port: me.ListenPort}, + ) if err != nil { slog.Error("public endpoint server", "error", err) return diff --git a/internal/agent/handlers.go b/internal/agent/handlers.go index bd6a682..6cc8607 100644 --- a/internal/agent/handlers.go +++ b/internal/agent/handlers.go @@ -20,7 +20,12 @@ func networkUpdates(msg *nats.Msg) { slog.Error("invalid network update", "error", err, "data", string(msg.Data)) return } - slog.Info("network update for", "network", networkName, "action", update.Action, "peer", update.Peer) + slog.Info( + "network update for", + "network", networkName, + "action", update.Action, + "peer", update.Peer, + ) network, err := boltdb.Get[Network](networkName, networkTable) if err != nil { if errors.Is(err, boltdb.ErrNoResults) { @@ -215,8 +220,12 @@ func processAddPeer(network Network, update *plexus.NetworkUpdate, wg *plexus.Wi slog.Debug("add peer") for _, peer := range network.Peers { if peer.WGPublicKey == update.Peer.WGPublicKey { - slog.Error("peer already exists", "network", network.Name, "peer", update.Peer.HostName, "id", - update.Peer.WGPublicKey) + slog.Error( + "peer already exists", + "network", network.Name, + "peer", update.Peer.HostName, + "id", update.Peer.WGPublicKey, + ) return } } @@ -241,7 +250,12 @@ func processAddPeer(network Network, update *plexus.NetworkUpdate, wg *plexus.Wi } } -func processDeletePeer(network Network, update *plexus.NetworkUpdate, self Device, wg *plexus.Wireguard) { +func processDeletePeer( + network Network, + update *plexus.NetworkUpdate, + self Device, + wg *plexus.Wireguard, +) { slog.Debug("delete peer") if update.Peer.WGPublicKey == self.WGPublicKey { slog.Info("self delete --> delete network", "network", network.Name) @@ -428,7 +442,11 @@ func sendListenPorts(msg *nats.Msg, serverConn *nats.Conn) { if err := serverConn.Publish(msg.Reply, bytes); err != nil { slog.Error("publish reply to SendListenPorts", "error", err) } - slog.Debug("sent listenports to server", "public", response.PublicListenPort, "private", response.ListenPort) + slog.Debug( + "sent listenports to server", + "public", response.PublicListenPort, + "private", response.ListenPort, + ) } func joinNetwork(msg *nats.Msg, self Device) { @@ -443,7 +461,12 @@ func joinNetwork(msg *nats.Msg, self Device) { return } if err := startInterface(self, network); err != nil { - slog.Error("error starting interface", "interface", network.Interface, "network", network.Name, "error", err) + slog.Error( + "error starting interface", + "interface", network.Interface, + "network", network.Name, + "error", err, + ) return } } diff --git a/internal/agent/interface.go b/internal/agent/interface.go index 0764e60..42ca001 100644 --- a/internal/agent/interface.go +++ b/internal/agent/interface.go @@ -62,7 +62,12 @@ func startAllInterfaces(self Device) { for _, network := range networks { slog.Debug("starting interface", "interface", network.Interface, "network", network.Name) if err := startInterface(self, network); err != nil { - slog.Error("start interface", "network", network.Name, "interface", network.Interface, "error", err) + slog.Error( + "start interface", + "network", network.Name, + "interface", network.Interface, + "error", err, + ) } } } @@ -114,7 +119,10 @@ func startInterface(self Device, network Network) error { network.ListenPort = port } if addressChanged { - slog.Debug("public address changed ... saving and publishing update", "address", self.Endpoint) + slog.Debug( + "public address changed ... saving and publishing update", + "address", self.Endpoint, + ) if err := boltdb.Save(self, "self", deviceTable); err != nil { return err } @@ -232,7 +240,12 @@ func getAllowedIPs(node plexus.NetworkPeer, peers []plexus.NetworkPeer) []net.IP } else { allowed = append(allowed, node.Subnet) } - slog.Debug("new allowed ips", "allowed", allowed, "virt", node.VirtSubnet, "subnet", node.Subnet) + slog.Debug( + "new allowed ips", + "allowed", allowed, + "virt", node.VirtSubnet, + "subnet", node.Subnet, + ) } if node.IsRelay { for _, peer := range peers { @@ -250,7 +263,12 @@ func getWGPeers(self Device, network Network) []wgtypes.PeerConfig { keepalive := defaultKeepalive peers := []wgtypes.PeerConfig{} for _, peer := range network.Peers { - slog.Debug("checking peer", "peer", peer.WGPublicKey, "address", peer.Address, "mask", network.Net.Mask) + slog.Debug( + "checking peer", + "peer", peer.WGPublicKey, + "address", peer.Address, + "mask", network.Net.Mask, + ) if peer.WGPublicKey == self.WGPublicKey { if peer.IsRelayed { slog.Info("I am relayed") @@ -381,7 +399,10 @@ func getNewListenPorts(name string) (plexus.NetworkPeer, error) { }, nil } -func convertPeerToWG(netPeer plexus.NetworkPeer, peers []plexus.NetworkPeer) (wgtypes.PeerConfig, error) { +func convertPeerToWG( + netPeer plexus.NetworkPeer, + peers []plexus.NetworkPeer, +) (wgtypes.PeerConfig, error) { var addr *net.UDPAddr keepalive := defaultKeepalive key, err := wgtypes.ParseKey(netPeer.WGPublicKey) @@ -389,7 +410,10 @@ func convertPeerToWG(netPeer plexus.NetworkPeer, peers []plexus.NetworkPeer) (wg return wgtypes.PeerConfig{}, err } if netPeer.UsePrivateEndpoint { - addr, err = net.ResolveUDPAddr("udp", netPeer.PrivateEndpoint.String()+":"+strconv.Itoa(netPeer.ListenPort)) + addr, err = net.ResolveUDPAddr( + "udp", + netPeer.PrivateEndpoint.String()+":"+strconv.Itoa(netPeer.ListenPort), + ) if err != nil { return wgtypes.PeerConfig{}, err } diff --git a/internal/agent/nftables.go b/internal/agent/nftables.go index ce890b1..7d9dec8 100644 --- a/internal/agent/nftables.go +++ b/internal/agent/nftables.go @@ -74,7 +74,12 @@ func checkForNat(self Device, network Network) error { return addNat() } if peer.UseVirtSubnet { - slog.Debug("adding virtual subnet", "peer", peer.HostName, "virtual subnet", peer.VirtSubnet, "subnet", peer.Subnet) + slog.Debug( + "adding virtual subnet", + "peer", peer.HostName, + "virtual subnet", peer.VirtSubnet, + "subnet", peer.Subnet, + ) return addVirtualSubnet(peer.VirtSubnet, peer.Subnet) } } diff --git a/internal/agent/publish.go b/internal/agent/publish.go index 99591a2..e26d332 100644 --- a/internal/agent/publish.go +++ b/internal/agent/publish.go @@ -104,10 +104,13 @@ func checkin() { continue } if peer.PrivateEndpoint != nil { - checkinData.PrivateEndpoints = append(checkinData.PrivateEndpoints, plexus.PrivateEndpoint{ - IP: peer.PrivateEndpoint.String(), - Network: network.Name, - }) + checkinData.PrivateEndpoints = append( + checkinData.PrivateEndpoints, + plexus.PrivateEndpoint{ + IP: peer.PrivateEndpoint.String(), + Network: network.Name, + }, + ) } } } diff --git a/internal/server/broker.go b/internal/server/broker.go index afdbd9b..6bb5548 100644 --- a/internal/server/broker.go +++ b/internal/server/broker.go @@ -153,7 +153,7 @@ func createNkeyUser(token string) *server.NkeyUser { } func getAdminKey() nkeys.KeyPair { - seed, err := os.ReadFile(cfg.DataHome+ "server.seed") + seed, err := os.ReadFile(cfg.DataHome + "server.seed") if err != nil { return createAdminNKeyPair() } diff --git a/internal/server/keys.go b/internal/server/keys.go index ec0103b..e833691 100644 --- a/internal/server/keys.go +++ b/internal/server/keys.go @@ -81,7 +81,7 @@ func addKey(w http.ResponseWriter, r *http.Request) { displayKeys(w, r) } -func displayKeys(w http.ResponseWriter, r *http.Request) { +func displayKeys(w http.ResponseWriter, _ *http.Request) { keys, err := boltdb.GetAll[plexus.Key](keyTable) if err != nil { processError(w, http.StatusInternalServerError, err.Error()) @@ -160,7 +160,11 @@ func expireKeys() { } for _, key := range keys { if key.Expires.Before(time.Now()) { - slog.Info("key has expired ...deleting", "key", key.Name, "expiry time", key.Expires.Format(time.RFC822)) + slog.Info( + "key has expired ...deleting", + "key", key.Name, + "expiry time", key.Expires.Format(time.RFC822), + ) if err := removeKey(key); err != nil { slog.Error("remove key", "error", err) } diff --git a/internal/server/keys_test.go b/internal/server/keys_test.go index 2135cfb..c9b093f 100644 --- a/internal/server/keys_test.go +++ b/internal/server/keys_test.go @@ -172,7 +172,11 @@ func TestAddKey(t *testing.T) { should.ContainSubstring(t, string(body), "

Plexus Keys

") keys, err := boltdb.GetAll[plexus.Key](keyTable) should.BeNil(t, err) - should.BeEqual(t, keys[0].Expires.Format("2006-01-02 03-04"), time.Now().Add(24*time.Hour).Format("2006-01-02 03-04")) + should.BeEqual( + t, + keys[0].Expires.Format("2006-01-02 03-04"), + time.Now().Add(24*time.Hour).Format("2006-01-02 03-04"), + ) }) t.Run("valid", func(t *testing.T) { key := plexus.Key{ diff --git a/internal/server/nathandlers.go b/internal/server/nathandlers.go index c7eaf5a..09897d4 100644 --- a/internal/server/nathandlers.go +++ b/internal/server/nathandlers.go @@ -61,7 +61,10 @@ func addNKeyUser(peer plexus.Peer) error { return nil } -func addPeerToNetwork(peerID, network string, listenPort, publicListenPort int) (plexus.Network, error) { +func addPeerToNetwork( + peerID, network string, + listenPort, publicListenPort int, +) (plexus.Network, error) { netToUpdate, err := boltdb.Get[plexus.Network](network, networkTable) if err != nil { return netToUpdate, err @@ -85,7 +88,12 @@ func addPeerToNetwork(peerID, network string, listenPort, publicListenPort int) } addr, err := getNextIP(netToUpdate) if err != nil { - return netToUpdate, fmt.Errorf("unable to get ip for peer %s %s %w", peer.WGPublicKey, network, err) + return netToUpdate, fmt.Errorf( + "unable to get ip for peer %s %s %w", + peer.WGPublicKey, + network, + err, + ) } slog.Debug("setting ip to", "ip", addr) netPeer.Address = net.IPNet{ @@ -156,7 +164,12 @@ func processCheckin(data *plexus.CheckinData) plexus.MessageResponse { peer.Version = data.Version } if !peer.Endpoint.Equal(data.Endpoint) { - slog.Debug("endpoint changed", "peer", peer.Name, "old", peer.Endpoint, "new", data.Endpoint) + slog.Debug( + "endpoint changed", + "peer", peer.Name, + "old", peer.Endpoint, + "new", data.Endpoint, + ) peer.Endpoint = data.Endpoint publishUpdate = true } @@ -266,7 +279,11 @@ func processLeave(id string, request *plexus.LeaveRequest) plexus.MessageRespons Action: plexus.DeletePeer, Peer: peer, } - slog.Debug("publishing network update for peer leaving network", "network", request.Network, "peer", id) + slog.Debug( + "publishing network update for peer leaving network", + "network", request.Network, + "peer", id, + ) publish.Message(natsConn, plexus.Networks+request.Network, update) } if !found { @@ -413,7 +430,11 @@ func processPortUpdate(id string, ports *plexus.ListenPortResponse) { Action: plexus.UpdatePeer, Peer: peer, } - slog.Debug("publish network update for port change", "network", network.Name, "peer", peer.HostName) + slog.Debug( + "publish network update for port change", + "network", network.Name, + "peer", peer.HostName, + ) publish.Message(natsConn, plexus.Networks+network.Name, data) } } diff --git a/internal/server/network_test.go b/internal/server/network_test.go index 76d0036..ec67e24 100644 --- a/internal/server/network_test.go +++ b/internal/server/network_test.go @@ -53,7 +53,7 @@ func TestAddNetwork(t *testing.T) { should.BeEqual(t, w.Code, http.StatusBadRequest) body, err := io.ReadAll(w.Body) should.BeNil(t, err) - should.ContainSubstring(t, string(body), "Error Processing Request:") + should.ContainSubstring(t, string(body), "invalid form") }) t.Run("spacesNetworkName", func(t *testing.T) { network := plexus.Network{ @@ -127,7 +127,11 @@ func TestAddNetwork(t *testing.T) { should.BeEqual(t, w.Code, http.StatusBadRequest) body, err := io.ReadAll(w.Body) should.BeNil(t, err) - should.ContainSubstring(t, string(body), "Error Processing Request: invalid address for network") + should.ContainSubstring( + t, + string(body), + "Error Processing Request: invalid address for network", + ) }) t.Run("normalizeCidr", func(t *testing.T) { network := plexus.Network{ @@ -182,7 +186,11 @@ func TestAddNetwork(t *testing.T) { should.BeEqual(t, w.Code, http.StatusBadRequest) body, err := io.ReadAll(w.Body) should.BeNil(t, err) - should.ContainSubstring(t, string(body), "Error Processing Request: network address is not private") + should.ContainSubstring( + t, + string(body), + "Error Processing Request: network address is not private", + ) }) t.Run("valid", func(t *testing.T) { network := plexus.Network{ diff --git a/internal/server/networks.go b/internal/server/networks.go index e35264d..5451e2e 100644 --- a/internal/server/networks.go +++ b/internal/server/networks.go @@ -6,7 +6,6 @@ import ( "log/slog" "net" "net/http" - "os" "regexp" "slices" "time" @@ -99,15 +98,13 @@ func displayNetworks(w http.ResponseWriter, r *http.Request) { page.Data = networks session.Save(w, r) - w.Header().Add("HX-Trigger", "networkChange") + w.Header().Add("Hx-Trigger", "networkChange") if err := templates.ExecuteTemplate(w, "networks", page); err != nil { slog.Error("template", "name", "networks", "page", page, "error", err) } - templates.ExecuteTemplate(os.Stdout, "networks", page) - } -func networksSideBar(w http.ResponseWriter, r *http.Request) { +func networksSideBar(w http.ResponseWriter, _ *http.Request) { networks, err := boltdb.GetAll[plexus.Network](networkTable) if err != nil { processError(w, http.StatusInternalServerError, err.Error()) @@ -174,13 +171,23 @@ func networkDetails(w http.ResponseWriter, r *http.Request) { for _, peer := range network.Peers { p, err := boltdb.Get[plexus.Peer](peer.WGPublicKey, peerTable) if err != nil { - slog.Error("could not obtains peer for network details", "peer", peer.WGPublicKey, "network", network, "error", err) + slog.Error( + "could not obtains peer for network details", + "peer", peer.WGPublicKey, + "network", network, + "error", err, + ) continue } slog.Debug("network details", "peer", peer.HostName, "connected", time.Since(p.Updated) < time.Second*10, "connectivity", peer.Connectivity) details.Peers = append(details.Peers, peer) - slog.Debug("connectivity", "network", network.Name, "peer", peer.HostName, "connectivity", peer.Connectivity) + slog.Debug( + "connectivity", + "network", network.Name, + "peer", peer.HostName, + "connectivity", peer.Connectivity, + ) } details.Name = networkName details.AvailablePeers = getAvailablePeers(network) @@ -205,11 +212,19 @@ func deleteNetwork(w http.ResponseWriter, r *http.Request) { log.Println("deleting network", network) if natsConn == nil { slog.Error("not connected to nats") - processError(w, http.StatusInternalServerError, "nats failure: network update not published") + processError( + w, + http.StatusInternalServerError, + "nats failure: network update not published", + ) return } slog.Debug("publish network update", "network", network, "reason", "delete network") - publish.Message(natsConn, plexus.Networks+network, plexus.NetworkUpdate{Action: plexus.DeleteNetwork}) + publish.Message( + natsConn, + plexus.Networks+network, + plexus.NetworkUpdate{Action: plexus.DeleteNetwork}, + ) displayNetworks(w, r) } @@ -379,7 +394,12 @@ func deleteRelay(w http.ResponseWriter, r *http.Request) { processError(w, http.StatusBadRequest, "failed to save update network peers "+err.Error()) return } - slog.Debug("publish network update", "network", network.Name, "peer", update.Peer.HostName, "reason", "delete relay") + slog.Debug( + "publish network update", + "network", network.Name, + "peer", update.Peer.HostName, + "reason", "delete relay", + ) publish.Message(natsConn, plexus.Networks+network.Name, update) networkDetails(w, r) } @@ -396,7 +416,12 @@ func networkPeerDetails(w http.ResponseWriter, r *http.Request) { if peer.WGPublicKey == peerID { peer.Connectivity *= 100 if err := templates.ExecuteTemplate(w, "displayNetworkPeer", peer); err != nil { - slog.Error("template execute", "template", "displayNetworkPeer", "peer", peer, "error", err) + slog.Error( + "template execute", + "template", "displayNetworkPeer", + "peer", peer, + "error", err, + ) } return } diff --git a/internal/server/page.go b/internal/server/page.go index 02d76ec..fab3ea8 100644 --- a/internal/server/page.go +++ b/internal/server/page.go @@ -42,7 +42,6 @@ func displayMain(w http.ResponseWriter, r *http.Request) { } page.Data = networks page.NeedsLogin = !session.LoggedIn - //page.Page = "networks" } slog.Info("display main page", "session", session, "page", page) @@ -52,7 +51,6 @@ func displayMain(w http.ResponseWriter, r *http.Request) { } func login(w http.ResponseWriter, r *http.Request) { - //session := sessions.Default(c) var user plexus.User if err := r.ParseForm(); err != nil { processError(w, http.StatusBadRequest, "invalid login form") @@ -62,8 +60,6 @@ func login(w http.ResponseWriter, r *http.Request) { user.Password = r.FormValue("password") if !validateUser(&user) { - //session.Clear() - //_ = session.Save() processError(w, http.StatusBadRequest, "invalid user") return } @@ -73,7 +69,6 @@ func login(w http.ResponseWriter, r *http.Request) { page := getPage(user.Username) page.NeedsLogin = false page.Page = "networks" - //displayMain(w, r) if err := templates.ExecuteTemplate(w, "layout", page); err != nil { slog.Error("execute template", "template", "layout", "page", page, "error", err) } @@ -106,9 +101,6 @@ func logout(w http.ResponseWriter, r *http.Request) { page := initialize() page.NeedsLogin = true slog.Warn("logout", "page", page) - //if err := templates.ExecuteTemplate(w, "layout", page); err != nil { - //slog.Error("logout", "error", err) - //} http.Redirect(w, r, "/", http.StatusFound) } diff --git a/internal/server/page_test.go b/internal/server/page_test.go index 8bd02b4..900b24c 100644 --- a/internal/server/page_test.go +++ b/internal/server/page_test.go @@ -172,7 +172,7 @@ func testLogin(data plexus.User) (*http.Cookie, error) { form := url.Values{} form.Add("username", data.Username) form.Add("password", data.Password) - req, err := http.NewRequest(http.MethodPost, "/", strings.NewReader(form.Encode())) + req, err := http.NewRequest(http.MethodPost, "/login/", strings.NewReader(form.Encode())) if err != nil { return nil, err } diff --git a/internal/server/peers.go b/internal/server/peers.go index 418429f..88df05c 100644 --- a/internal/server/peers.go +++ b/internal/server/peers.go @@ -13,7 +13,7 @@ import ( "github.com/nats-io/nats-server/v2/server" ) -func displayPeers(w http.ResponseWriter, r *http.Request) { +func displayPeers(w http.ResponseWriter, _ *http.Request) { displayPeers := []plexus.Peer{} peers, err := boltdb.GetAll[plexus.Peer](peerTable) if err != nil { @@ -74,7 +74,11 @@ func discardPeer(id string) (plexus.Peer, error) { Action: plexus.DeletePeer, Peer: netpeer, } - slog.Info("publishing network update", "type", update.Action, "network", network.Name) + slog.Info( + "publishing network update", + "type", update.Action, + "network", network.Name, + ) publish.Message(natsConn, "networks."+network.Name, update) } } @@ -168,7 +172,12 @@ func savePeer(peer plexus.Peer) { for i, netPeer := range network.Peers { if netPeer.WGPublicKey == peer.WGPublicKey { network.Peers[i].NatsConnected = peer.NatsConnected - slog.Debug("saving network peer", "network", network.Name, "peer", netPeer.HostName, "key", netPeer.WGPublicKey) + slog.Debug( + "saving network peer", + "network", network.Name, + "peer", netPeer.HostName, + "key", netPeer.WGPublicKey, + ) if err := boltdb.Save(network, network.Name, networkTable); err != nil { slog.Error("save network", "network", network.Name, "error", err) } diff --git a/internal/server/router.go b/internal/server/router.go index c9ada87..c7bb62d 100644 --- a/internal/server/router.go +++ b/internal/server/router.go @@ -16,17 +16,12 @@ import ( //go:embed images assets html var content embed.FS - -var ( - logger *slog.Logger - templates *template.Template -) +var templates *template.Template func setupRouter(l *slog.Logger) *mux.Router { InitializeSession() router := mux.NewRouter(l, mux.Logger) - logger = l dir, _ := os.Getwd() slog.Info("here", "pwd", dir) templates = template.Must(template.ParseFS(content, "html/*.html")) @@ -91,7 +86,7 @@ func processError(w http.ResponseWriter, status int, message string) { l := log.New(&buf, "", log.Lshortfile) _ = l.Output(2, message) slog.Error(buf.String()) - w.Header().Set("HX-Trigger", header) + w.Header().Set("Hx-Trigger", header) http.Error(w, message, status) } diff --git a/internal/server/server.go b/internal/server/server.go index 44c1706..286ee23 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -87,50 +87,61 @@ func start(ctx context.Context, wg *sync.WaitGroup, tls *tls.Config) { func web(ctx context.Context, wg *sync.WaitGroup, tls *tls.Config) { defer wg.Done() slog.Info("Starting web server...") - router := setupRouter(logging.TextLogger(logging.TruncateSource(), logging.TimeFormat(time.DateTime)).Logger) + router := setupRouter( + logging.TextLogger(logging.TruncateSource(), logging.TimeFormat(time.DateTime)).Logger, + ) server := http.Server{ - Addr: ":" + cfg.Port, - Handler: router, - } - if cfg.Secure { - if tls == nil { - slog.Error("secure set but tls nil") - webfail <- 1 - } - server.TLSConfig = tls - server.Addr = ":443" - go func() { - if err := server.ListenAndServeTLS("", ""); err != nil && !errors.Is(err, http.ErrServerClosed) { - slog.Error("https server", "error", err) - webfail <- 1 - } - }() - } else { - go func() { - if err := server.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) { - slog.Error("http server", "error", err) - webfail <- 1 - } - }() - } + Addr: ":" + cfg.Port, + Handler: router, + } + if cfg.Secure { + if tls == nil { + slog.Error("secure set but tls nil") + webfail <- 1 + } + server.TLSConfig = tls + server.Addr = ":443" + go func() { + if err := server.ListenAndServeTLS("", ""); err != nil && + !errors.Is(err, http.ErrServerClosed) { + slog.Error("https server", "error", err) + webfail <- 1 + } + }() + } else { + go func() { + if err := server.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) { + slog.Error("http server", "error", err) + webfail <- 1 + } + }() + } slog.Info("web server started") <-ctx.Done() slog.Info("shutting down web server") if err := server.Shutdown(ctx); err != nil { - slog.Error("http server shutdown", "error", err.Error()) + slog.Error("http server shutdown", "error", err.Error()) } slog.Info("http server shutdown") } -func getServer(w http.ResponseWriter, r *http.Request) { +func getServer(w http.ResponseWriter, _ *http.Request) { server := struct { LogLevel string Logs []string }{ LogLevel: cfg.Verbosity, } - cmd := exec.Command("/usr/bin/journalctl", "-eu", "plexus-server", "--no-pager", "-n", "25", "-r") + cmd := exec.Command( + "/usr/bin/journalctl", + "-eu", + "plexus-server", + "--no-pager", + "-n", + "25", + "-r", + ) out, err := cmd.CombinedOutput() if err != nil { slog.Error("journalctl", "error", err) diff --git a/internal/server/sessions.go b/internal/server/sessions.go index c8930ff..c268435 100644 --- a/internal/server/sessions.go +++ b/internal/server/sessions.go @@ -22,7 +22,7 @@ var ( sessionInitialized bool ) -// Session represents a user session +// Session represents a user session. type Session struct { User string LoggedIn bool @@ -50,33 +50,32 @@ func keypairs() ([]byte, []byte) { return buf1, buf2 } -func GetSession(w http.ResponseWriter, r *http.Request) *Session { - s := &Session{} +func GetSession(_ http.ResponseWriter, r *http.Request) *Session { + sess := &Session{} session, err := store.Get(r, sessionName) if err != nil { slog.Error("session err", "error", err) - //NewSession(w, r, plexus.User{}, false, "network") return nil } user := session.Values["user"] if u, ok := user.(string); ok { - s.User = u + sess.User = u } loggedIn := session.Values["loggedIn"] if l, ok := loggedIn.(bool); ok { - s.LoggedIn = l + sess.LoggedIn = l } admin := session.Values["admin"] if a, ok := admin.(bool); ok { - s.Admin = a + sess.Admin = a } page := session.Values["page"] if p, ok := page.(string); ok { - s.Page = p + sess.Page = p } - s.Session = session - return s + sess.Session = session + return sess } func ClearSession(w http.ResponseWriter, r *http.Request) { @@ -84,8 +83,9 @@ func ClearSession(w http.ResponseWriter, r *http.Request) { if session == nil { s := sessions.NewSession(store, sessionName) s.Options.MaxAge = -1 - s.Save(r, w) - //NewSession(w, r, plexus.User{}, false, "network") + if err := s.Save(r, w); err != nil { + slog.Error("save session", "error", err) + } return } session.Session.Options.MaxAge = -1 @@ -94,7 +94,13 @@ func ClearSession(w http.ResponseWriter, r *http.Request) { } } -func NewSession(w http.ResponseWriter, r *http.Request, user plexus.User, loggedIn bool, page string) { +func NewSession( + w http.ResponseWriter, + r *http.Request, + user plexus.User, + loggedIn bool, + page string, +) { session := sessions.NewSession(store, sessionName) session.Values["username"] = user.Username session.Values["admin"] = user.IsAdmin diff --git a/internal/server/subnetrouter.go b/internal/server/subnetrouter.go index a5815f5..abb276e 100644 --- a/internal/server/subnetrouter.go +++ b/internal/server/subnetrouter.go @@ -119,9 +119,17 @@ func deleteRouter(w http.ResponseWriter, r *http.Request) { processError(w, http.StatusInternalServerError, err.Error()) return } - slog.Debug("publish network update - delete router", "network", network.Name, "peer", update.Peer.HostName) + slog.Debug( + "publish network update - delete router", + "network", network.Name, + "peer", update.Peer.HostName, + ) publish.Message(natsConn, "networks."+network.Name, update) - publish.Message(natsConn, plexus.Update+update.Peer.WGPublicKey+plexus.DeleteRouter, update.Peer) + publish.Message( + natsConn, + plexus.Update+update.Peer.WGPublicKey+plexus.DeleteRouter, + update.Peer, + ) networkDetails(w, r) } @@ -133,7 +141,12 @@ func subnetInUse(subnet *net.IPNet) (string, string, error) { } for _, network := range networks { if network.Net.Contains(subnet.IP) || subnet.Contains(network.Net.IP) { - slog.Debug("subnet in use - network", "network", network.Name, "net", network.Net, "subnet", subnet) + slog.Debug( + "subnet in use - network", + "network", network.Name, + "net", network.Net, + "subnet", subnet, + ) return "network", network.Name, ErrSubnetInUse } for _, peer := range network.Peers { diff --git a/wireguard.go b/wireguard.go index 31bcb87..5110dc2 100644 --- a/wireguard.go +++ b/wireguard.go @@ -174,7 +174,12 @@ func convertPeers(input []wgtypes.Peer) []wgtypes.PeerConfig { } func (wg *Wireguard) ReplacePeer(newPeer wgtypes.PeerConfig) { - slog.Debug("replacing wg peer", "key", newPeer.PublicKey, "allowed", newPeer.AllowedIPs, "endpoint", newPeer.Endpoint) + slog.Debug( + "replacing wg peer", + "key", newPeer.PublicKey, + "allowed", newPeer.AllowedIPs, + "endpoint", newPeer.Endpoint, + ) for i, peer := range wg.Config.Peers { if peer.PublicKey != newPeer.PublicKey { continue From 6fadccc00bddc43a2e38e304c599368ae28f32fb Mon Sep 17 00:00:00 2001 From: Matthew R Kasun Date: Tue, 30 Dec 2025 10:54:48 -0500 Subject: [PATCH 12/14] update/add tests --- .github/workflows/integrationtest.yml | 29 +-- .gitignore | 3 +- .golangci.yml | 12 +- app/plexus-agent/cmd/status_test.go | 20 +- go.mod | 1 + go.sum | 2 + internal/agent/interface.go | 2 +- internal/agent/interface_test.go | 36 ++++ internal/agent/join_test.go | 38 ++-- internal/agent/network_test.go | 29 +++ internal/agent/nftables_test.go | 55 ++--- internal/agent/plexus_test.go | 71 +++++++ internal/server/broker.go | 47 ++--- internal/server/config.go | 81 ++++---- internal/server/config_test.go | 43 ++++ internal/server/html/networks.html | 4 +- internal/server/html/sidebar.html | 8 +- internal/server/keys.go | 43 +++- internal/server/keys_test.go | 284 +++++++++++--------------- internal/server/nathandlers_test.go | 4 +- internal/server/network_test.go | 282 ++++++++++--------------- internal/server/networks.go | 123 +---------- internal/server/page.go | 13 +- internal/server/page_test.go | 152 +++----------- internal/server/peers_test.go | 190 +++++++++++++++++ internal/server/plexus_test.go | 234 +++++++++++++++++++++ internal/server/relay.go | 124 +++++++++++ internal/server/relay_test.go | 84 ++++++++ internal/server/router.go | 4 +- internal/server/router_test.go | 27 ++- internal/server/server.go | 34 ++- internal/server/server_test.go | 92 +++++++++ internal/server/sessions.go | 10 +- internal/server/subnetrouter.go | 5 +- internal/server/subnetrouter_test.go | 174 +++++++++++++++- internal/server/users.go | 30 +-- internal/server/users_test.go | 268 ++++++++++++++++++++++++ log_test.go | 35 ++++ models_test.go | 36 ++++ wireguard_test.go | 149 ++++++++++++-- 40 files changed, 2039 insertions(+), 839 deletions(-) create mode 100644 internal/agent/interface_test.go create mode 100644 internal/agent/network_test.go create mode 100644 internal/agent/plexus_test.go create mode 100644 internal/server/peers_test.go create mode 100644 internal/server/plexus_test.go create mode 100644 internal/server/relay.go create mode 100644 internal/server/relay_test.go create mode 100644 internal/server/server_test.go create mode 100644 internal/server/users_test.go create mode 100644 log_test.go create mode 100644 models_test.go diff --git a/.github/workflows/integrationtest.yml b/.github/workflows/integrationtest.yml index 7822cbd..ebb63de 100644 --- a/.github/workflows/integrationtest.yml +++ b/.github/workflows/integrationtest.yml @@ -26,20 +26,21 @@ jobs: cd ../plexus-agent CGO_ENABLED=0 go build -v . - #tests: - # runs-on: ubuntu-latest - # if: ${{ github.actor != 'dependabot[bot]' }} - # steps: - # - name: Checkout - # uses: actions/checkout@v4 - # - name: Setup Go - # uses: actions/setup-go@v6 - # with: - # go-version-file: ./go.mod - # - name: run tests - # run: | - # go vet ./... - # go test ./... -v + tests: + runs-on: ubuntu-latest + if: ${{ github.actor != 'dependabot[bot]' }} + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Setup Go + uses: actions/setup-go@v6 + with: + go-version-file: ./go.mod + - name: run tests + run: | + go vet ./... + sudo go test -v ./... + lint: diff --git a/.gitignore b/.gitignore index 338c063..3088c65 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,5 @@ time.db **/launch.json devops/experiment/* devops/plexus-update/* -devops/deploy/* \ No newline at end of file +devops/deploy/* +internal/agent/agent.seed \ No newline at end of file diff --git a/.golangci.yml b/.golangci.yml index 9e80b7c..ce519d8 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -36,9 +36,10 @@ linters: allow-time-local: true ireturn: allow: - - nkeys.KeyPair - error + - io.Reader - net/http.Handler + - nkeys.KeyPair varnamelen: max-distance: 15 ignore-names: @@ -64,16 +65,13 @@ linters: rules: - path: _test\.go linters: + - dupl + - funlen - gocognit - goconst - - funlen - - nonamedreturns - - revive - predeclared - - path: app/plexus-agent/cmd/ - linters: - revive - - path: wireguard.go + - path: app/plexus-agent/cmd/* linters: - revive formatters: diff --git a/app/plexus-agent/cmd/status_test.go b/app/plexus-agent/cmd/status_test.go index f9ee3b9..2190635 100644 --- a/app/plexus-agent/cmd/status_test.go +++ b/app/plexus-agent/cmd/status_test.go @@ -11,47 +11,47 @@ import ( func TestPrintHandshake(t *testing.T) { bytes := make([]byte, 128) out, err := os.Open(os.Stdout.Name()) - should.BeNil(t, err) + should.NotBeError(t, err) t.Run("one second", func(t *testing.T) { printHandshake(time.Now().Add(time.Second * -1)) _, err := out.Read(bytes) - should.BeNil(t, err) + should.NotBeError(t, err) should.ContainSubstring(t, string(bytes), "1 second ago") should.BeNil(t, out.Close()) }) t.Run("one minute", func(t *testing.T) { out, err := os.Open(os.Stdout.Name()) - should.BeNil(t, err) + should.NotBeError(t, err) printHandshake(time.Now().Add(time.Second * -60)) _, err = out.Read(bytes) - should.BeNil(t, err) + should.NotBeError(t, err) should.ContainSubstring(t, string(bytes), "1 minute 0 seconds ago") should.BeNil(t, out.Close()) }) t.Run("hours", func(t *testing.T) { out, err := os.Open(os.Stdout.Name()) - should.BeNil(t, err) + should.NotBeError(t, err) printHandshake(time.Now().Add(time.Second * -3600)) _, err = out.Read(bytes) - should.BeNil(t, err) + should.NotBeError(t, err) should.ContainSubstring(t, string(bytes), "1 hour 0 minutes 0 seconds ago") should.BeNil(t, out.Close()) }) t.Run("multi", func(t *testing.T) { out, err := os.Open(os.Stdout.Name()) - should.BeNil(t, err) + should.NotBeError(t, err) printHandshake(time.Now().Add(time.Second * -7250)) _, err = out.Read(bytes) - should.BeNil(t, err) + should.NotBeError(t, err) should.ContainSubstring(t, string(bytes), "2 hours 0 minutes 50 seconds ago") should.BeNil(t, out.Close()) }) t.Run("now", func(t *testing.T) { out, err := os.Open(os.Stdout.Name()) - should.BeNil(t, err) + should.NotBeError(t, err) printHandshake(time.Now()) _, err = out.Read(bytes) - should.BeNil(t, err) + should.NotBeError(t, err) should.ContainSubstring(t, string(bytes), "never") should.BeNil(t, out.Close()) }) diff --git a/go.mod b/go.mod index 850d830..9ee27ff 100644 --- a/go.mod +++ b/go.mod @@ -7,6 +7,7 @@ require ( github.com/c-robinson/iplib v1.0.8 github.com/caddyserver/certmagic v0.25.0 github.com/devilcove/boltdb v0.1.7 + github.com/devilcove/configuration v0.1.0 github.com/devilcove/mux v0.2.1 github.com/fatih/color v1.18.0 github.com/google/nftables v0.3.0 diff --git a/go.sum b/go.sum index ad5f4fd..de9baf4 100644 --- a/go.sum +++ b/go.sum @@ -15,6 +15,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/devilcove/boltdb v0.1.7 h1:JVj8aZ/bilaGhduq1+E4qlWRrxYeH5sIjWdrdnBcsr0= github.com/devilcove/boltdb v0.1.7/go.mod h1:aXkamUgsGOC3njIPiZ/FzsYqAGGEMQyc5EE1gRHlOuw= +github.com/devilcove/configuration v0.1.0 h1:Aih99HhJ5lyf8fzjJagQmhjlkjyo3P36Wpr20NnCpI8= +github.com/devilcove/configuration v0.1.0/go.mod h1:T0EvOgFp4QGf5zVcV2kY78ghkRQnFiF/HPXzV5wMcSQ= github.com/devilcove/mux v0.2.1 h1:V9Zu+aXxrmiFqligpgdWSmWYZ8XKYYtOwPrsxyKehI4= github.com/devilcove/mux v0.2.1/go.mod h1:Q4ysJcjpLwW7rLNTOYSlYVst5OmwFh1uZxJSCPQ34U4= github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= diff --git a/internal/agent/interface.go b/internal/agent/interface.go index 42ca001..74298fd 100644 --- a/internal/agent/interface.go +++ b/internal/agent/interface.go @@ -86,7 +86,7 @@ func startInterface(self Device, network Network) error { } } if address.IPNet == nil { - return errors.New("no address for network" + network.Name) + return errors.New("no address for network " + network.Name) } privKey, err := wgtypes.ParseKey(self.WGPrivateKey) if err != nil { diff --git a/internal/agent/interface_test.go b/internal/agent/interface_test.go new file mode 100644 index 0000000..2a0434e --- /dev/null +++ b/internal/agent/interface_test.go @@ -0,0 +1,36 @@ +package agent + +import ( + "os/user" + "testing" + + "github.com/Kairum-Labs/should" + "github.com/vishvananda/netlink" +) + +func TestInterface(t *testing.T) { + user, err := user.Current() + should.NotBeError(t, err) + if user.Uid != "0" { + t.Log("this test must be run as root") + t.Skip() + } + deleteAllNetworks() + deleteAllInterfaces() + nets := createTestSeverNetworks(t) + self, err := newDevice() + should.NotBeError(t, err) + should.NotBeError(t, saveServerNetworks(self, nets)) + + t.Run("startAll", func(t *testing.T) { + self, err := newDevice() + should.NotBeError(t, err) + ifaces, err := netlink.LinkList() + should.NotBeError(t, err) + number := len(ifaces) + startAllInterfaces(self) + ifaces, err = netlink.LinkList() + should.NotBeError(t, err) + should.BeEqual(t, len(ifaces), number+2) + }) +} diff --git a/internal/agent/join_test.go b/internal/agent/join_test.go index e18fd6d..cce89be 100644 --- a/internal/agent/join_test.go +++ b/internal/agent/join_test.go @@ -12,63 +12,61 @@ import ( func TestCheckPort(t *testing.T) { add := net.UDPAddr{ - Port: 51820, + Port: 51830, } conn, err := net.ListenUDP("udp", &add) - should.BeNil(t, err) + should.NotBeError(t, err) should.NotBeNil(t, conn) t.Run("portnotavail", func(t *testing.T) { - newPort := checkPort(51820) - should.BeEqual(t, newPort, 51821) + newPort := checkPort(51830) + should.BeEqual(t, newPort, 51831) }) err = conn.Close() - should.BeNil(t, err) + should.NotBeError(t, err) t.Run("portavail", func(t *testing.T) { - newPort := checkPort(51820) - should.BeEqual(t, newPort, 51820) + newPort := checkPort(51830) + should.BeEqual(t, newPort, 51830) }) t.Run("noports", func(t *testing.T) { add1 := net.UDPAddr{ Port: 65534, } conn1, err := net.ListenUDP("udp", &add1) - should.BeNil(t, err) + should.NotBeError(t, err) add2 := net.UDPAddr{ Port: 65535, } conn2, err := net.ListenUDP("udp", &add2) - should.BeNil(t, err) + should.NotBeError(t, err) newPort := checkPort(65534) should.BeEqual(t, newPort, 0) err = conn1.Close() - should.BeNil(t, err) + should.NotBeError(t, err) err = conn2.Close() - should.BeNil(t, err) + should.NotBeError(t, err) }) } func TestNewDevice(t *testing.T) { - err := boltdb.Initialize("./test.db", []string{deviceTable}) - should.BeNil(t, err) + // err := boltdb.Initialize("./test.db", []string{deviceTable}) + // should.NotBeError(t, err) device := Device{} - err = boltdb.Delete[Device]("self", deviceTable) + err := boltdb.Delete[Device]("self", deviceTable) if err != nil && !errors.Is(err, boltdb.ErrNoResults) { t.Fail() } hostname, err := os.Hostname() - should.BeNil(t, err) + should.NotBeError(t, err) t.Run("newDevice", func(t *testing.T) { device, err = newDevice() - should.BeNil(t, err) + should.NotBeError(t, err) should.BeEqual(t, device.Name, hostname) }) t.Run("existingDevice", func(t *testing.T) { device, err = newDevice() - should.BeNil(t, err) + should.NotBeError(t, err) new, err := newDevice() - should.BeNil(t, err) + should.NotBeError(t, err) should.BeEqual(t, new.Seed, device.Seed) }) - err = boltdb.Close() - should.BeNil(t, err) } diff --git a/internal/agent/network_test.go b/internal/agent/network_test.go new file mode 100644 index 0000000..de6c2c8 --- /dev/null +++ b/internal/agent/network_test.go @@ -0,0 +1,29 @@ +package agent + +import ( + "testing" + + "github.com/Kairum-Labs/should" + "github.com/devilcove/boltdb" +) + +func TestSaveServerNetwork(t *testing.T) { + serverNet := createTestSeverNetworks(t) + net, err := saveServerNetwork(serverNet[0]) + should.BeNil(t, err) + should.BeEqual(t, net.Name, serverNet[0].Name) + dbNet, err := boltdb.Get[Network](net.Name, networkTable) + should.NotBeError(t, err) + should.BeEqual(t, dbNet.Name, serverNet[0].Name) +} + +func TestSaveServerNetworks(t *testing.T) { + deleteAllNetworks() + self, err := newDevice() + should.NotBeError(t, err) + serverNets := createTestSeverNetworks(t) + should.NotBeError(t, saveServerNetworks(self, serverNets)) + networks, err := boltdb.GetAll[Network](networkTable) + should.NotBeError(t, err) + should.BeEqual(t, len(networks), 2) +} diff --git a/internal/agent/nftables_test.go b/internal/agent/nftables_test.go index e4fcaac..a78313a 100644 --- a/internal/agent/nftables_test.go +++ b/internal/agent/nftables_test.go @@ -15,16 +15,16 @@ func TestAddNAT(t *testing.T) { table := &nftables.Table{} chain := &nftables.Chain{} user, err := user.Current() - should.BeNil(t, err) + should.NotBeError(t, err) if user.Uid != "0" { t.Log("this test must be run as root") t.Skip() } c := nftables.Conn{} err = addNat() - should.BeNil(t, err) + should.NotBeError(t, err) tables, err := c.ListTables() - should.BeNil(t, err) + should.NotBeError(t, err) tableFound := false for _, t := range tables { if t.Name == "plexus" { @@ -34,7 +34,7 @@ func TestAddNAT(t *testing.T) { } should.BeTrue(t, tableFound) chains, err := c.ListChains() - should.BeNil(t, err) + should.NotBeError(t, err) chainFound := false for _, c := range chains { if c.Name == "plexus-nat" { @@ -44,7 +44,7 @@ func TestAddNAT(t *testing.T) { } should.BeTrue(t, chainFound) rules, err := c.GetRules(table, chain) - should.BeNil(t, err) + should.NotBeError(t, err) should.BeEqual(t, len(rules), 1) should.BeEqual(t, rules[0].Exprs[0], &expr.Masq{ Random: false, @@ -59,7 +59,7 @@ func TestAddNAT(t *testing.T) { func TestDelNat(t *testing.T) { user, err := user.Current() - should.BeNil(t, err) + should.NotBeError(t, err) if user.Uid != "0" { t.Log("this test must be run as root") t.Skip() @@ -85,11 +85,11 @@ func TestDelNat(t *testing.T) { } c.AddRule(rule) err = c.Flush() - should.BeNil(t, err) + should.NotBeError(t, err) err = delNat() - should.BeNil(t, err) + should.NotBeError(t, err) chains, err := c.ListChains() - should.BeNil(t, err) + should.NotBeError(t, err) found := false for _, chain := range chains { if chain.Name == "plexus-nat" { @@ -103,13 +103,13 @@ func TestDelNat(t *testing.T) { func TestCheckForNat(t *testing.T) { plexus.SetLogging("debug") user, err := user.Current() - should.BeNil(t, err) + should.NotBeError(t, err) if user.Uid != "0" { t.Log("this test must be run as root") t.Skip() } _, public, err := generateKeys() - should.BeNil(t, err) + should.NotBeError(t, err) self := Device{} self.WGPublicKey = public.String() peer := plexus.NetworkPeer{ @@ -125,19 +125,19 @@ func TestCheckForNat(t *testing.T) { network.Peers = append(network.Peers, peer) c := &nftables.Conn{} tables, err := c.ListTables() - should.BeNil(t, err) + should.NotBeError(t, err) for _, table := range tables { if table.Name == "plexus" { c.DelTable(table) err = c.Flush() - should.BeNil(t, err) + should.NotBeError(t, err) } } t.Run("noSubnetRouter", func(t *testing.T) { err := checkForNat(self, network) - should.BeNil(t, err) + should.NotBeError(t, err) tables, err := c.ListTables() - should.BeNil(t, err) + should.NotBeError(t, err) for _, table := range tables { if table.Name == "plexus" { t.FailNow() @@ -152,9 +152,9 @@ func TestCheckForNat(t *testing.T) { } network.Peers = []plexus.NetworkPeer{peer} err = checkForNat(self, network) - should.BeNil(t, err) + should.NotBeError(t, err) tables, err := c.ListTables() - should.BeNil(t, err) + should.NotBeError(t, err) for _, table := range tables { if table.Name == "plexus" { t.FailNow() @@ -167,9 +167,9 @@ func TestCheckForNat(t *testing.T) { peer.UseNat = true network.Peers = []plexus.NetworkPeer{peer} err = checkForNat(self, network) - should.BeNil(t, err) + should.NotBeError(t, err) tables, err := c.ListTables() - should.BeNil(t, err) + should.NotBeError(t, err) tableFound := false for _, t := range tables { if t.Name == "plexus" { @@ -179,7 +179,7 @@ func TestCheckForNat(t *testing.T) { } should.BeTrue(t, tableFound) chains, err := c.ListChains() - should.BeNil(t, err) + should.NotBeError(t, err) chainFound := false for _, c := range chains { if c.Name == "plexus-nat" { @@ -189,7 +189,7 @@ func TestCheckForNat(t *testing.T) { } should.BeTrue(t, chainFound) rules, err := c.GetRules(table, chain) - should.BeNil(t, err) + should.NotBeError(t, err) should.BeEqual(t, len(rules), 1) should.BeEqual(t, rules[0].Exprs[0], &expr.Masq{ Random: false, @@ -212,9 +212,9 @@ func TestCheckForNat(t *testing.T) { network.Peers = []plexus.NetworkPeer{peer} t.Log(self, network) err = checkForNat(self, network) - should.BeNil(t, err) + should.NotBeError(t, err) tables, err := c.ListTables() - should.BeNil(t, err) + should.NotBeError(t, err) tableFound := false for _, t := range tables { if t.Name == "plexus" { @@ -224,7 +224,7 @@ func TestCheckForNat(t *testing.T) { } should.BeTrue(t, tableFound) chains, err := c.ListChains() - should.BeNil(t, err) + should.NotBeError(t, err) chainFound := false for _, c := range chains { if c.Name == "plexus-subnet" { @@ -234,20 +234,21 @@ func TestCheckForNat(t *testing.T) { } should.BeTrue(t, chainFound) rules, err := c.GetRules(table, chain) - should.BeNil(t, err) + should.NotBeError(t, err) should.BeEqual(t, len(rules), 254) }) cleanNat(t, c) } func cleanNat(t *testing.T, c *nftables.Conn) { + t.Helper() tables, err := c.ListTables() - should.BeNil(t, err) + should.NotBeError(t, err) for _, table := range tables { if table.Name == "plexus" { c.DelTable(table) err := c.Flush() - should.BeNil(t, err) + should.NotBeError(t, err) break } } diff --git a/internal/agent/plexus_test.go b/internal/agent/plexus_test.go new file mode 100644 index 0000000..1644f8e --- /dev/null +++ b/internal/agent/plexus_test.go @@ -0,0 +1,71 @@ +package agent + +import ( + "log" + "net" + "os" + "testing" + + "github.com/Kairum-Labs/should" + "github.com/devilcove/boltdb" + "github.com/devilcove/plexus" +) + +func TestMain(m *testing.M) { + if _, err := os.Stat("./test.db"); err == nil { + if err := os.Remove("./test.db"); err != nil { + log.Println("remove db", err) + os.Exit(1) + } + } + if err := boltdb.Initialize("./test.db", + []string{deviceTable, networkTable}, + ); err != nil { + log.Println("init db", err) + os.Exit(2) + } + plexus.SetLogging("debug") + code := m.Run() + // cancel() + // wg.Wait() + boltdb.Close() + os.Exit(code) +} + +func createTestSeverNetworks(t *testing.T) []plexus.Network { + t.Helper() + self, err := newDevice() + should.NotBeError(t, err) + ip1, cidr1, err := net.ParseCIDR("10.100.0.2/24") + should.NotBeError(t, err) + ip2, cidr2, err := net.ParseCIDR("10.200.0.2/24") + should.NotBeError(t, err) + return []plexus.Network{ + { + Name: "one", + Net: *cidr1, + Peers: []plexus.NetworkPeer{ + { + WGPublicKey: self.WGPublicKey, + Address: net.IPNet{ + IP: ip1, + Mask: net.CIDRMask(32, 32), + }, + }, + }, + }, + { + Name: "two", + Net: *cidr2, + Peers: []plexus.NetworkPeer{ + { + WGPublicKey: self.WGPublicKey, + Address: net.IPNet{ + IP: ip2, + Mask: net.CIDRMask(32, 32), + }, + }, + }, + }, + } +} diff --git a/internal/server/broker.go b/internal/server/broker.go index 6bb5548..bbd90d0 100644 --- a/internal/server/broker.go +++ b/internal/server/broker.go @@ -11,6 +11,7 @@ import ( "time" "github.com/devilcove/boltdb" + "github.com/devilcove/configuration" "github.com/devilcove/plexus" "github.com/devilcove/plexus/internal/publish" "github.com/nats-io/nats-server/v2/server" @@ -49,9 +50,14 @@ func broker(ctx context.Context, wg *sync.WaitGroup, tls *tls.Config) { natsOptions.Nkeys = append(natsOptions.Nkeys, tokensUsers...) natsOptions.Nkeys = append(natsOptions.Nkeys, deviceUsers...) natsOptions.NoSigs = true - if cfg.Secure { + config := &Configuration{} + if err := configuration.Get(config); err != nil { + slog.Error("configuration", "error", err) + return + } + if config.Secure { natsOptions.TLSConfig = tls - natsOptions.Host = cfg.FQDN + natsOptions.Host = config.FQDN } natServer, err = server.NewServer(natsOptions) if err != nil { @@ -67,7 +73,7 @@ func broker(ctx context.Context, wg *sync.WaitGroup, tls *tls.Config) { return adminKey.Sign(nonce) } opts := []nats.Option{nats.Nkey(adminPublicKey, SignatureCB)} - natsConn, err = nats.Connect("nats://"+net.JoinHostPort(cfg.FQDN, "4222"), opts...) + natsConn, err = nats.Connect("nats://"+net.JoinHostPort(config.FQDN, "4222"), opts...) if err != nil { slog.Error("nats connect", "error", err) brokerfail <- 1 @@ -90,27 +96,6 @@ func startBroker(ctx context.Context) { _ = sub.Drain() } return - case token := <-newDevice: - slog.Info("new login device", "device", token) - keyValue, err := plexus.DecodeToken(token) - if err != nil { - slog.Error("decode token", "error", err) - } - key, err := nkeys.FromSeed([]byte(keyValue.Seed)) - if err != nil { - slog.Error("seed failure", "error", err) - continue - } - nPubKey, err := key.PublicKey() - if err != nil { - slog.Error("publickey", "error", err) - continue - } - natsOptions.Nkeys = append(natsOptions.Nkeys, &server.NkeyUser{ - Nkey: nPubKey, - Permissions: registerPermissions(), - }) - _ = natServer.ReloadOptions(natsOptions) case <-pingTicker.C: pingPeers() case <-keyTicker.C: @@ -153,7 +138,12 @@ func createNkeyUser(token string) *server.NkeyUser { } func getAdminKey() nkeys.KeyPair { - seed, err := os.ReadFile(cfg.DataHome + "server.seed") + config := Configuration{} + if err := configuration.Get(&config); err != nil { + slog.Error("configuration", "error", err) + return nil + } + seed, err := os.ReadFile(config.DataHome + "server.seed") if err != nil { return createAdminNKeyPair() } @@ -176,7 +166,12 @@ func createAdminNKeyPair() nkeys.KeyPair { slog.Error("admin seed creation", "error", err) return admin } - if err := os.WriteFile(cfg.DataHome+"server.seed", seed, os.ModePerm); err != nil { + config := Configuration{} + if err := configuration.Get(&config); err != nil { + slog.Error("configuration", "error", err) + return nil + } + if err := os.WriteFile(config.DataHome+"/server.seed", seed, os.ModePerm); err != nil { slog.Error("save admin seed", "error", err) } return admin diff --git a/internal/server/config.go b/internal/server/config.go index e60a7c5..781e530 100644 --- a/internal/server/config.go +++ b/internal/server/config.go @@ -14,11 +14,11 @@ import ( "github.com/caddyserver/certmagic" "github.com/devilcove/boltdb" + "github.com/devilcove/configuration" "github.com/devilcove/plexus" - "github.com/mattkasun/tools/config" ) -type configuration struct { +type Configuration struct { AdminName string AdminPass string FQDN string @@ -39,11 +39,14 @@ const ( ) var ( - cfg *configuration - ErrServerURL = errors.New("invalid server URL") - ErrInvalidSubnet = errors.New("invalid subnet") - ErrSubnetInUse = errors.New("subnet in use") - version = "v0.3.0" + ErrServerURL = errors.New("invalid server URL") + ErrInvalidSubnet = errors.New("invalid subnet") + ErrSubnetInUse = errors.New("subnet in use") + ErrDataDir = errors.New("data dir not found") + ErrSecureBlankFQDN = errors.New("secure server requires FQDN") + ErrSecureWithIP = errors.New("cannot use IP address with secure") + ErrInValidEmail = errors.New("valid email address required") + version = "v0.3.0" ) const ( @@ -61,69 +64,69 @@ func configureServer() (*tls.Config, error) { if err != nil { return nil, err } - cfg, err = config.Get[configuration]() - if err != nil { + config := Configuration{} + if err := configuration.Get(&config); err != nil { return nil, err } // set defaults - if cfg.AdminName == "" { - cfg.AdminName = "admin" + if config.AdminName == "" { + config.AdminName = "admin" } - if cfg.AdminPass == "" { - cfg.AdminPass = "password" + if config.AdminPass == "" { + config.AdminPass = "password" } - if cfg.Verbosity == "" { - cfg.Verbosity = "INFO" + if config.Verbosity == "" { + config.Verbosity = "INFO" } - if cfg.Port == "" { - cfg.Port = "8080" + if config.Port == "" { + config.Port = "8080" } - if cfg.DBFile == "" { - cfg.DBFile = "plexus-server.db" + if config.DBFile == "" { + config.DBFile = "plexus-server.db" } - if cfg.DataHome == "" { - cfg.DataHome = home + "/.local/share/" + filepath.Base(os.Args[0]) + "/" + if config.DataHome == "" { + config.DataHome = home + "/.local/share/" + filepath.Base(os.Args[0]) + "/" } - if _, err := os.Stat(cfg.DataHome); err != nil { - return nil, err + if _, err := os.Stat(config.DataHome); err != nil { + return nil, ErrDataDir } - slog.Info("configure Server", "config", cfg) + slog.Info("configure Server", "config", config) var tlsConfig *tls.Config - plexus.SetLogging(cfg.Verbosity) - if cfg.Secure { - if cfg.FQDN == "" { - return nil, errors.New("secure server requires FQDN") + plexus.SetLogging(config.Verbosity) + if config.Secure { + if config.FQDN == "" { + return nil, ErrSecureBlankFQDN } - if net.ParseIP(cfg.FQDN) != nil { - return nil, errors.New("cannot use IP address with secure") + if net.ParseIP(config.FQDN) != nil { + return nil, ErrSecureWithIP } - if !emailValid(cfg.Email) { - return nil, errors.New("valid email address required") + if !emailValid(config.Email) { + return nil, ErrInValidEmail } } // initialize database. - if err := os.MkdirAll(cfg.DataHome, os.ModePerm); err != nil { + if err := os.MkdirAll(config.DataHome, os.ModePerm); err != nil { return nil, err } - slog.Info("init db", "path", cfg.DataHome, "file", cfg.DBFile) + slog.Info("init db", "path", config.DataHome, "file", config.DBFile) if err := boltdb.Initialize( - cfg.DataHome+cfg.DBFile, + filepath.Join(config.DataHome, config.DBFile), []string{"users", "keys", "networks", "peers", "settings"}, ); err != nil { return nil, fmt.Errorf("init database %w", err) } // check default user exists. - if err := checkDefaultUser(cfg.AdminName, cfg.AdminPass); err != nil { + if err := checkDefaultUser(config.AdminName, config.AdminPass); err != nil { return nil, err } // get TLS. - if cfg.Secure { + if config.Secure { var err error certmagic.DefaultACME.Agreed = true - certmagic.DefaultACME.Email = cfg.Email + certmagic.DefaultACME.Email = config.Email certmagic.DefaultACME.CA = certmagic.LetsEncryptProductionCA - tlsConfig, err = certmagic.TLS([]string{cfg.FQDN}) + tlsConfig, err = certmagic.TLS([]string{config.FQDN}) if err != nil { return nil, err } diff --git a/internal/server/config_test.go b/internal/server/config_test.go index 0aa8d97..9030964 100644 --- a/internal/server/config_test.go +++ b/internal/server/config_test.go @@ -4,6 +4,7 @@ import ( "testing" "github.com/Kairum-Labs/should" + "github.com/devilcove/boltdb" ) func Test_emailValid(t *testing.T) { @@ -36,3 +37,45 @@ func Test_emailValid(t *testing.T) { }) } } + +func TestConfigureServer(t *testing.T) { + setup(t) + defer shutdown(t) + err := boltdb.Close() + should.NotBeError(t, err) + defer func() { + err := boltdb.Initialize("./test.db", + []string{userTable, keyTable, networkTable, peerTable, settingTable}) + should.NotBeError(t, err) + }() + + t.Run("secureNoFQDM", func(t *testing.T) { + writeTmpConfg(t, &Configuration{Secure: true, FQDN: ""}) + config, err := configureServer() + should.BeErrorIs(t, err, ErrSecureBlankFQDN) + should.BeNil(t, config) + }) + + t.Run("secureWithIP", func(t *testing.T) { + writeTmpConfg(t, &Configuration{Secure: true, FQDN: "10.10.10.100"}) + config, err := configureServer() + should.BeErrorIs(t, err, ErrSecureWithIP) + should.BeNil(t, config) + }) + + t.Run("secureNoEmail", func(t *testing.T) { + writeTmpConfg(t, &Configuration{Secure: true, FQDN: "example.com"}) + config, err := configureServer() + should.BeErrorIs(t, err, ErrInValidEmail) + should.BeNil(t, config) + }) + + t.Run("insecure", func(t *testing.T) { + writeTmpConfg(t, &Configuration{FQDN: "example.com", Email: "admin@domain.com"}) + config, err := configureServer() + should.NotBeError(t, err) + should.BeNil(t, config) + t.Log(err, config) + should.BeNil(t, boltdb.Close()) + }) +} diff --git a/internal/server/html/networks.html b/internal/server/html/networks.html index a17d648..c1a9824 100644 --- a/internal/server/html/networks.html +++ b/internal/server/html/networks.html @@ -19,7 +19,7 @@

Networks

Delete
{{range .Data}}
- @@ -44,7 +44,7 @@

Add Network


- diff --git a/internal/server/html/sidebar.html b/internal/server/html/sidebar.html index 3b43655..2aef480 100644 --- a/internal/server/html/sidebar.html +++ b/internal/server/html/sidebar.html @@ -9,8 +9,8 @@

Networks {{range .}} - {{end}} @@ -62,8 +62,8 @@ Networks {{range .}} - {{end}} diff --git a/internal/server/keys.go b/internal/server/keys.go index e833691..bf080f5 100644 --- a/internal/server/keys.go +++ b/internal/server/keys.go @@ -12,7 +12,9 @@ import ( "time" "github.com/devilcove/boltdb" + "github.com/devilcove/configuration" "github.com/devilcove/plexus" + "github.com/nats-io/nats-server/v2/server" "github.com/nats-io/nkeys" ) @@ -22,7 +24,7 @@ func displayCreateKey(w http.ResponseWriter, r *http.Request) { displayLogin(w, r) return } - page := getPage(session.User) + page := getPage(session.UserName) page.Page = "addKey" if err := templates.ExecuteTemplate(w, "addKey", page); err != nil { slog.Error("execute template", "template", "addKey", "page", page, "error", err) @@ -30,10 +32,6 @@ func displayCreateKey(w http.ResponseWriter, r *http.Request) { } func addKey(w http.ResponseWriter, r *http.Request) { - if err := r.ParseForm(); err != nil { - processError(w, http.StatusBadRequest, "invalid form") - return - } var err error usage, err := strconv.Atoi(r.FormValue("usage")) if err != nil { @@ -58,7 +56,9 @@ func addKey(w http.ResponseWriter, r *http.Request) { processError(w, http.StatusInternalServerError, "unable to encode key"+err.Error()) return } - newDevice <- key.Value + if err := addDevice(key.Value); err != nil { + processError(w, http.StatusInternalServerError, "unable to add device"+err.Error()) + } if key.Usage == 0 { key.Usage = 1 } @@ -117,6 +117,11 @@ func validateKey(key plexus.Key) error { } func newValue(name string) (string, error) { + config := Configuration{} + if err := configuration.Get(&config); err != nil { + slog.Error("configuration", "error", err) + return "", err + } device, err := nkeys.CreateUser() if err != nil { return "", err @@ -126,7 +131,7 @@ func newValue(name string) (string, error) { return "", err } keyValue := plexus.KeyValue{ - URL: cfg.FQDN, + URL: config.FQDN, Seed: string(seed), KeyName: name, } @@ -197,3 +202,27 @@ func removeKey(key plexus.Key) error { } return errs } + +func addDevice(token string) error { + slog.Info("new login device", "device", token) + keyValue, err := plexus.DecodeToken(token) + if err != nil { + slog.Error("decode token", "error", err) + return err + } + key, err := nkeys.FromSeed([]byte(keyValue.Seed)) + if err != nil { + slog.Error("seed failure", "error", err) + return err + } + nPubKey, err := key.PublicKey() + if err != nil { + slog.Error("publickey", "error", err) + return err + } + natsOptions.Nkeys = append(natsOptions.Nkeys, &server.NkeyUser{ + Nkey: nPubKey, + Permissions: registerPermissions(), + }) + return natServer.ReloadOptions(natsOptions) +} diff --git a/internal/server/keys_test.go b/internal/server/keys_test.go index c9b093f..1fe58ee 100644 --- a/internal/server/keys_test.go +++ b/internal/server/keys_test.go @@ -1,12 +1,11 @@ package server import ( - "bytes" - "encoding/json" "errors" "io" "net/http" "net/http/httptest" + "strings" "testing" "time" @@ -20,19 +19,14 @@ func TestDisplayKeys(t *testing.T) { Username: "hello", Password: "world", } - err := createTestUser(user) - should.BeNil(t, err) - cookie, err := testLogin(user) - should.BeNil(t, err) - should.NotBeNil(t, cookie) - req, err := http.NewRequest(http.MethodGet, "/keys/", nil) - should.BeNil(t, err) - req.AddCookie(cookie) + createTestUser(t, user) + r := httptest.NewRequest(http.MethodGet, "/keys/", nil) + r.AddCookie(testLogin(t, user)) w := httptest.NewRecorder() - router.ServeHTTP(w, req) + router.ServeHTTP(w, r) should.BeEqual(t, w.Code, http.StatusOK) body, err := io.ReadAll(w.Body) - should.BeNil(t, err) + should.NotBeError(t, err) should.ContainSubstring(t, string(body), "

Plexus Keys

") } @@ -41,137 +35,106 @@ func TestDisplayAddKey(t *testing.T) { Username: "hello", Password: "world", } - err := createTestUser(user) - should.BeNil(t, err) - cookie, err := testLogin(user) - should.BeNil(t, err) - req, err := http.NewRequest(http.MethodGet, "/keys/add", nil) - should.BeNil(t, err) + createTestUser(t, user) + cookie := testLogin(t, user) + + req := httptest.NewRequest(http.MethodGet, "/keys/add", nil) req.AddCookie(cookie) w := httptest.NewRecorder() router.ServeHTTP(w, req) should.BeEqual(t, w.Code, http.StatusOK) body, err := io.ReadAll(w.Body) - should.BeNil(t, err) + should.NotBeError(t, err) should.ContainSubstring(t, string(body), "

Create Key

") } func TestAddKey(t *testing.T) { - t.Skip() - err := deleteAllKeys() - should.BeNil(t, err) + deleteAllKeys(t) user := plexus.User{ Username: "hello", Password: "world", } - err = createTestUser(user) - should.BeNil(t, err) - cookie, err := testLogin(user) - should.BeNil(t, err) + createTestUser(t, user) + cookie := testLogin(t, user) + setup(t) + defer shutdown(t) + t.Run("emptydata", func(t *testing.T) { - req, err := http.NewRequest(http.MethodPost, "/keys/add", nil) - should.BeNil(t, err) - req.AddCookie(cookie) + r := httptest.NewRequest(http.MethodPost, "/keys/add", nil) + r.AddCookie(testLogin(t, user)) w := httptest.NewRecorder() - router.ServeHTTP(w, req) + router.ServeHTTP(w, r) should.BeEqual(t, w.Code, http.StatusBadRequest) body, err := io.ReadAll(w.Body) - should.BeNil(t, err) - should.ContainSubstring(t, string(body), "Error Processing Request") + should.NotBeError(t, err) + should.ContainSubstring(t, string(body), "invalid key") }) t.Run("spaceInName", func(t *testing.T) { - key := plexus.Key{ - Name: "this has spaces", - DispExp: time.Now().Format("2006-01-02"), - } - payload, err := json.Marshal(&key) - should.BeNil(t, err) - req, err := http.NewRequest(http.MethodPost, "/keys/add", bytes.NewBuffer(payload)) - should.BeNil(t, err) - req.AddCookie(cookie) - req.Header.Set("Content-Type", "application/json") + payload := bodyParams("name", "this has spaces", "expires", time.Now().Format("2006-01-02")) + r := httptest.NewRequest(http.MethodPost, "/keys/add", payload) + r.AddCookie(cookie) + r.Header.Set("Content-Type", "application/x-www-form-urlencoded") w := httptest.NewRecorder() - router.ServeHTTP(w, req) + router.ServeHTTP(w, r) should.BeEqual(t, w.Code, http.StatusBadRequest) body, err := io.ReadAll(w.Body) - should.BeNil(t, err) + should.NotBeError(t, err) should.ContainSubstring(t, string(body), "invalid chars") }) t.Run("uppercase", func(t *testing.T) { - key := plexus.Key{ - Name: "Uppercase", - DispExp: time.Now().Format("2006-01-02"), - } - payload, err := json.Marshal(&key) - should.BeNil(t, err) - req, err := http.NewRequest(http.MethodPost, "/keys/add", bytes.NewBuffer(payload)) - should.BeNil(t, err) - req.AddCookie(cookie) - req.Header.Set("Content-Type", "application/json") + payload := bodyParams("name", "Uppercase", "expires", time.Now().Format("2006-01-02")) + r := httptest.NewRequest(http.MethodPost, "/keys/add", payload) + r.AddCookie(cookie) + r.Header.Set("Content-Type", "application/x-www-form-urlencoded") w := httptest.NewRecorder() - router.ServeHTTP(w, req) + router.ServeHTTP(w, r) should.BeEqual(t, w.Code, http.StatusBadRequest) body, err := io.ReadAll(w.Body) - should.BeNil(t, err) + should.NotBeError(t, err) should.ContainSubstring(t, string(body), "invalid chars") }) t.Run("nameTooLong", func(t *testing.T) { - key := plexus.Key{ - DispExp: time.Now().Format("2006-01-02"), - } + var tmp strings.Builder for range 256 { - key.Name += "A" + tmp.WriteString("A") } - payload, err := json.Marshal(&key) - should.BeNil(t, err) - req, err := http.NewRequest(http.MethodPost, "/keys/add", bytes.NewBuffer(payload)) - should.BeNil(t, err) - req.AddCookie(cookie) - req.Header.Set("Content-Type", "application/json") + name := tmp.String() + payload := bodyParams("name", name, "expires", time.Now().Format("2006-01-02")) + r := httptest.NewRequest(http.MethodPost, "/keys/add", payload) + r.AddCookie(cookie) + r.Header.Set("Content-Type", "application/x-www-form-urlencoded") w := httptest.NewRecorder() - router.ServeHTTP(w, req) + router.ServeHTTP(w, r) should.BeEqual(t, w.Code, http.StatusBadRequest) body, err := io.ReadAll(w.Body) - should.BeNil(t, err) + should.NotBeError(t, err) should.ContainSubstring(t, string(body), "too long") }) t.Run("invalidDate", func(t *testing.T) { - key := plexus.Key{ - Name: "Uppercase", - DispExp: time.Now().Format("2006-01-02 03-04"), - } - payload, err := json.Marshal(&key) - should.BeNil(t, err) - req, err := http.NewRequest(http.MethodPost, "/keys/add", bytes.NewBuffer(payload)) - should.BeNil(t, err) - req.AddCookie(cookie) - req.Header.Set("Content-Type", "application/json") + payload := bodyParams("name", "key", "expires", time.Now().Format("2006-01-02 03-04")) + r := httptest.NewRequest(http.MethodPost, "/keys/add", payload) + r.AddCookie(cookie) + r.Header.Set("Content-Type", "application/x-www-form-urlencoded") w := httptest.NewRecorder() - router.ServeHTTP(w, req) + router.ServeHTTP(w, r) should.BeEqual(t, w.Code, http.StatusBadRequest) body, err := io.ReadAll(w.Body) - should.BeNil(t, err) + should.NotBeError(t, err) should.ContainSubstring(t, string(body), "parsing time") }) t.Run("zeroDate", func(t *testing.T) { - key := plexus.Key{ - Name: "zerodate", - DispExp: time.Time{}.Format("2006-01-02"), - } - payload, err := json.Marshal(&key) - should.BeNil(t, err) - req, err := http.NewRequest(http.MethodPost, "/keys/add", bytes.NewBuffer(payload)) - should.BeNil(t, err) - req.AddCookie(cookie) - req.Header.Set("Content-Type", "application/json") + payload := bodyParams("name", "key", "expires", time.Time{}.Format("2006-01-02")) + r := httptest.NewRequest(http.MethodPost, "/keys/add", payload) + r.AddCookie(cookie) + r.Header.Set("Content-Type", "application/x-www-form-urlencoded") w := httptest.NewRecorder() - router.ServeHTTP(w, req) + router.ServeHTTP(w, r) should.BeEqual(t, w.Code, http.StatusOK) body, err := io.ReadAll(w.Body) - should.BeNil(t, err) + should.NotBeError(t, err) should.ContainSubstring(t, string(body), "

Plexus Keys

") keys, err := boltdb.GetAll[plexus.Key](keyTable) - should.BeNil(t, err) + should.NotBeError(t, err) should.BeEqual( t, keys[0].Expires.Format("2006-01-02 03-04"), @@ -179,100 +142,84 @@ func TestAddKey(t *testing.T) { ) }) t.Run("valid", func(t *testing.T) { - key := plexus.Key{ - Name: "valid", - DispExp: time.Now().Format("2006-01-02"), - } - payload, err := json.Marshal(&key) - should.BeNil(t, err) - req, err := http.NewRequest(http.MethodPost, "/keys/add", bytes.NewBuffer(payload)) - should.BeNil(t, err) - req.AddCookie(cookie) - req.Header.Set("Content-Type", "application/json") + payload := bodyParams("name", "valid", "expires", + time.Now().Format("2006-01-02"), "usage", "0") + r := httptest.NewRequest(http.MethodPost, "/keys/add", payload) + r.AddCookie(cookie) + r.Header.Set("Content-Type", "application/x-www-form-urlencoded") w := httptest.NewRecorder() - router.ServeHTTP(w, req) + router.ServeHTTP(w, r) should.BeEqual(t, w.Code, http.StatusOK) body, err := io.ReadAll(w.Body) - should.BeNil(t, err) + should.NotBeError(t, err) should.ContainSubstring(t, string(body), "

Plexus Keys

") }) t.Run("duplicate", func(t *testing.T) { - key := plexus.Key{ - Name: "valid", - DispExp: time.Now().Format("2006-01-02"), - } - payload, err := json.Marshal(&key) - should.BeNil(t, err) - req, err := http.NewRequest(http.MethodPost, "/keys/add", bytes.NewBuffer(payload)) - should.BeNil(t, err) - req.AddCookie(cookie) - req.Header.Set("Content-Type", "application/json") + payload := bodyParams("name", "valid", "expires", time.Now().Format("2006-01-02")) + r := httptest.NewRequest(http.MethodPost, "/keys/add", payload) + r.Header.Set("Content-Type", "application/x-www-form-urlencoded") + r.AddCookie(cookie) w := httptest.NewRecorder() - router.ServeHTTP(w, req) + router.ServeHTTP(w, r) should.BeEqual(t, w.Code, http.StatusBadRequest) body, err := io.ReadAll(w.Body) - should.BeNil(t, err) + should.NotBeError(t, err) should.ContainSubstring(t, string(body), "key exists") }) - err = deleteAllKeys() - should.BeNil(t, err) + deleteAllKeys(t) } func TestDeleteKeys(t *testing.T) { - t.Skip() + setup(t) + defer shutdown(t) + user := plexus.User{ Username: "hello", Password: "world", } - err := createTestUser(user) - should.BeNil(t, err) - cookie, err := testLogin(user) - should.BeNil(t, err) + createTestUser(t, user) + cookie := testLogin(t, user) + t.Run("nosuchkey", func(t *testing.T) { - req, err := http.NewRequest(http.MethodDelete, "/keys/network", nil) - should.BeNil(t, err) - req.AddCookie(cookie) + r := httptest.NewRequest(http.MethodDelete, "/keys/network", nil) + r.AddCookie(cookie) w := httptest.NewRecorder() - router.ServeHTTP(w, req) + router.ServeHTTP(w, r) should.BeEqual(t, w.Code, http.StatusBadRequest) body, err := io.ReadAll(w.Body) - should.BeNil(t, err) + should.NotBeError(t, err) should.ContainSubstring(t, string(body), "key does not exist") }) t.Run("existingKey", func(t *testing.T) { - key := plexus.Key{ - Name: "valid", - DispExp: time.Now().Format("2006-01-02"), - } - payload, err := json.Marshal(&key) - should.BeNil(t, err) - req, err := http.NewRequest(http.MethodPost, "/keys/add", bytes.NewBuffer(payload)) - should.BeNil(t, err) - req.AddCookie(cookie) - req.Header.Set("Content-Type", "application/json") + // create key + payload := bodyParams("name", "valid", "expires", + time.Now().Format("2006-01-02"), "usage", "0") + r := httptest.NewRequest(http.MethodPost, "/keys/add", payload) + r.AddCookie(cookie) + r.Header.Set("Content-Type", "application/x-www-form-urlencoded") w := httptest.NewRecorder() - router.ServeHTTP(w, req) + router.ServeHTTP(w, r) should.BeEqual(t, w.Code, http.StatusOK) body, err := io.ReadAll(w.Body) - should.BeNil(t, err) + should.NotBeError(t, err) should.ContainSubstring(t, string(body), "

Plexus Keys

") - req, err = http.NewRequest(http.MethodDelete, "/keys/valid", nil) - should.BeNil(t, err) - req.AddCookie(cookie) - router.ServeHTTP(w, req) + // delete key + r = httptest.NewRequest(http.MethodDelete, "/keys/valid", nil) + r.AddCookie(cookie) + router.ServeHTTP(w, r) should.BeEqual(t, w.Code, http.StatusOK) body, err = io.ReadAll(w.Body) - should.BeNil(t, err) + should.NotBeError(t, err) should.ContainSubstring(t, string(body), "

Plexus Keys

") }) - err = deleteAllKeys() - should.BeNil(t, err) + deleteAllKeys(t) } func TestUpdateKey(t *testing.T) { - t.Skip() + setup(t) + defer shutdown(t) value, err := newValue("one") - should.BeNil(t, err) + should.NotBeError(t, err) key1 := plexus.Key{ Name: "one", Usage: 1, @@ -283,9 +230,9 @@ func TestUpdateKey(t *testing.T) { Usage: 10, } err = boltdb.Save(key1, key1.Name, keyTable) - should.BeNil(t, err) + should.NotBeError(t, err) err = boltdb.Save(key2, key2.Name, keyTable) - should.BeNil(t, err) + should.NotBeError(t, err) t.Run("keyDoesNotExist", func(t *testing.T) { err := decrementKeyUsage("doesnotexist") should.NotBeNil(t, err) @@ -293,29 +240,32 @@ func TestUpdateKey(t *testing.T) { }) t.Run("deleteKey", func(t *testing.T) { err := decrementKeyUsage(key1.Name) - should.BeNil(t, err) + should.NotBeError(t, err) newKey, err := boltdb.Get[plexus.Key](key1.Name, keyTable) should.BeEqual(t, newKey, plexus.Key{}) should.BeTrue(t, errors.Is(err, boltdb.ErrNoResults)) }) t.Run("decrement usage", func(t *testing.T) { err := decrementKeyUsage(key2.Name) - should.BeNil(t, err) + should.NotBeError(t, err) }) - err = deleteAllKeys() - should.BeNil(t, err) + deleteAllKeys(t) } -func deleteAllKeys() error { - var errs error - keys, err := boltdb.GetAll[plexus.Key](keyTable) - if err != nil { - return err - } - for _, key := range keys { - if err := boltdb.Delete[plexus.Key](key.Name, keyTable); err != nil { - errs = errors.Join(errs, err) - } +func TestExpireKeys(t *testing.T) { + setup(t) + defer shutdown(t) + key := plexus.Key{ + Name: "testkey", + Expires: time.Now().Add(-1 * time.Hour), } - return errs + err := boltdb.Save(key, key.Name, keyTable) + should.NotBeError(t, err) + keys, err := boltdb.GetAll[plexus.Key](keyTable) + should.NotBeError(t, err) + should.BeEqual(t, len(keys), 1) + expireKeys() + keys, err = boltdb.GetAll[plexus.Key](keyTable) + should.NotBeError(t, err) + should.BeEqual(t, len(keys), 0) } diff --git a/internal/server/nathandlers_test.go b/internal/server/nathandlers_test.go index 3e21985..8f6cf45 100644 --- a/internal/server/nathandlers_test.go +++ b/internal/server/nathandlers_test.go @@ -11,7 +11,7 @@ import ( func TestGetNextIP(t *testing.T) { _, cidr, err := net.ParseCIDR("192.168.0.10/24") - should.BeNil(t, err) + should.NotBeError(t, err) network := plexus.Network{ Net: *cidr, } @@ -37,7 +37,7 @@ func TestGetNextIP(t *testing.T) { } network.Peers = peers ip, err := getNextIP(network) - should.BeNil(t, err) + should.NotBeError(t, err) should.BeEqual(t, iplib.CompareIPs(ip, net.ParseIP("192.168.0.3")), 0) t.Log(ip) } diff --git a/internal/server/network_test.go b/internal/server/network_test.go index ec67e24..1518d39 100644 --- a/internal/server/network_test.go +++ b/internal/server/network_test.go @@ -1,17 +1,13 @@ package server import ( - "bytes" - "encoding/json" - "errors" - "fmt" "io" "net/http" "net/http/httptest" + "strings" "testing" "github.com/Kairum-Labs/should" - "github.com/devilcove/boltdb" "github.com/devilcove/plexus" ) @@ -20,18 +16,15 @@ func TestDisplayAddNetwork(t *testing.T) { Username: "hello", Password: "world", } - err := createTestUser(user) - should.BeNil(t, err) - cookie, err := testLogin(user) - should.BeNil(t, err) - req, err := http.NewRequest(http.MethodGet, "/networks/add", nil) - should.BeNil(t, err) + createTestUser(t, user) + cookie := testLogin(t, user) + req := httptest.NewRequest(http.MethodGet, "/networks/add", nil) req.AddCookie(cookie) w := httptest.NewRecorder() router.ServeHTTP(w, req) should.BeEqual(t, w.Code, http.StatusOK) body, err := io.ReadAll(w.Body) - should.BeNil(t, err) + should.NotBeError(t, err) should.ContainSubstring(t, string(body), "

Add Network

") } @@ -40,269 +33,200 @@ func TestAddNetwork(t *testing.T) { Username: "hello", Password: "world", } - err := createTestUser(user) - should.BeNil(t, err) - cookie, err := testLogin(user) - should.BeNil(t, err) + createTestUser(t, user) + cookie := testLogin(t, user) t.Run("emptydata", func(t *testing.T) { - req, err := http.NewRequest(http.MethodPost, "/networks/add", nil) - should.BeNil(t, err) + req := httptest.NewRequest(http.MethodPost, "/networks/add", nil) req.AddCookie(cookie) w := httptest.NewRecorder() router.ServeHTTP(w, req) should.BeEqual(t, w.Code, http.StatusBadRequest) body, err := io.ReadAll(w.Body) - should.BeNil(t, err) - should.ContainSubstring(t, string(body), "invalid form") + should.NotBeError(t, err) + should.ContainSubstring(t, string(body), "invalid address") }) t.Run("spacesNetworkName", func(t *testing.T) { - network := plexus.Network{ - Name: "this has spaces", - AddressString: "10.10.10.0/24", - } - payload, err := json.Marshal(&network) - should.BeNil(t, err) - req, err := http.NewRequest(http.MethodPost, "/networks/add", bytes.NewBuffer(payload)) - should.BeNil(t, err) - req.Header.Set("Content-Type", "application/json") + payload := bodyParams("name", "this has spaces", "addressstring", "10.10.10.0/24") + req := httptest.NewRequest(http.MethodPost, "/networks/add", payload) + req.Header.Set("Content-Type", "application/x-www-form-urlencoded") req.AddCookie(cookie) w := httptest.NewRecorder() router.ServeHTTP(w, req) should.BeEqual(t, w.Code, http.StatusBadRequest) body, err := io.ReadAll(w.Body) - should.BeNil(t, err) - should.ContainSubstring(t, string(body), "Error Processing Request: invalid network name") + should.NotBeError(t, err) + should.ContainSubstring(t, string(body), "invalid network name") }) t.Run("upperCase", func(t *testing.T) { - network := plexus.Network{ - Name: "UpperCase", - AddressString: "10.10.10.0/24", - } - payload, err := json.Marshal(&network) - should.BeNil(t, err) - req, err := http.NewRequest(http.MethodPost, "/networks/add", bytes.NewBuffer(payload)) - should.BeNil(t, err) - req.Header.Set("Content-Type", "application/json") + payload := bodyParams("name", "UpperCase", "addressstring", "10.10.10.0/24") + req := httptest.NewRequest(http.MethodPost, "/networks/add", payload) + req.Header.Set("Content-Type", "application/x-www-form-urlencoded") req.AddCookie(cookie) w := httptest.NewRecorder() router.ServeHTTP(w, req) should.BeEqual(t, w.Code, http.StatusBadRequest) body, err := io.ReadAll(w.Body) - should.BeNil(t, err) - should.ContainSubstring(t, string(body), "Error Processing Request: invalid network name") + should.NotBeError(t, err) + should.ContainSubstring(t, string(body), "invalid network name") }) t.Run("nameTooLong", func(t *testing.T) { - network := plexus.Network{ - AddressString: "10.10.10.0/24", - } + var name strings.Builder + name.WriteString("A") for range 300 { - network.Name += "A" + name.WriteString("A") } - payload, err := json.Marshal(&network) - should.BeNil(t, err) - req, err := http.NewRequest(http.MethodPost, "/networks/add", bytes.NewBuffer(payload)) - should.BeNil(t, err) - req.Header.Set("Content-Type", "application/json") + payload := bodyParams("name", name.String(), "addressstring", "10.10.10.0/24") + req := httptest.NewRequest(http.MethodPost, "/networks/add", payload) + req.Header.Set("Content-Type", "application/x-www-form-urlencoded") req.AddCookie(cookie) w := httptest.NewRecorder() router.ServeHTTP(w, req) should.BeEqual(t, w.Code, http.StatusBadRequest) body, err := io.ReadAll(w.Body) - should.BeNil(t, err) - should.ContainSubstring(t, string(body), "Error Processing Request: invalid network name") + should.NotBeError(t, err) + should.ContainSubstring(t, string(body), "invalid network name") }) t.Run("invalidCIDR", func(t *testing.T) { - network := plexus.Network{ - Name: "cidr", - AddressString: "10.10.10.0", - } - payload, err := json.Marshal(&network) - should.BeNil(t, err) - req, err := http.NewRequest(http.MethodPost, "/networks/add", bytes.NewBuffer(payload)) - should.BeNil(t, err) - req.Header.Set("Content-Type", "application/json") + payload := bodyParams("name", "cidr", "addressstring", "10.10.10.0") + req := httptest.NewRequest(http.MethodPost, "/networks/add", payload) + req.Header.Set("Content-Type", "application/x-www-form-urlencoded") req.AddCookie(cookie) w := httptest.NewRecorder() router.ServeHTTP(w, req) should.BeEqual(t, w.Code, http.StatusBadRequest) body, err := io.ReadAll(w.Body) - should.BeNil(t, err) - should.ContainSubstring( - t, - string(body), - "Error Processing Request: invalid address for network", - ) + should.NotBeError(t, err) + should.ContainSubstring(t, string(body), "invalid address for network") }) t.Run("normalizeCidr", func(t *testing.T) { - network := plexus.Network{ - Name: "normalcidr", - AddressString: "10.10.20.100/24", - } - payload, err := json.Marshal(&network) - should.BeNil(t, err) - req, err := http.NewRequest(http.MethodPost, "/networks/add", bytes.NewBuffer(payload)) - should.BeNil(t, err) - req.Header.Set("Content-Type", "application/json") + payload := bodyParams("name", "normalcidr", "addressstring", "10.10.20.100/24") + req := httptest.NewRequest(http.MethodPost, "/networks/add", payload) + req.Header.Set("Content-Type", "application/x-www-form-urlencoded") req.AddCookie(cookie) w := httptest.NewRecorder() router.ServeHTTP(w, req) should.BeEqual(t, w.Code, http.StatusOK) body, err := io.ReadAll(w.Body) - should.BeNil(t, err) - should.ContainSubstring(t, string(body), "
10.10.20.0/24") }) t.Run("duplicateCidr", func(t *testing.T) { - network := plexus.Network{ - Name: "duplicatecidr", - AddressString: "10.10.20.100/24", - } - payload, err := json.Marshal(&network) - should.BeNil(t, err) - req, err := http.NewRequest(http.MethodPost, "/networks/add", bytes.NewBuffer(payload)) - should.BeNil(t, err) - req.Header.Set("Content-Type", "application/json") + payload := bodyParams("name", "duplicatecidr", "addressstring", "10.10.20.100/24") + req := httptest.NewRequest(http.MethodPost, "/networks/add", payload) + req.Header.Set("Content-Type", "application/x-www-form-urlencoded") req.AddCookie(cookie) w := httptest.NewRecorder() router.ServeHTTP(w, req) should.BeEqual(t, w.Code, http.StatusBadRequest) body, err := io.ReadAll(w.Body) - should.BeNil(t, err) + should.NotBeError(t, err) should.ContainSubstring(t, string(body), "network CIDR in use") }) t.Run("addressNotPrivate", func(t *testing.T) { - network := plexus.Network{ - Name: "notprivate", - AddressString: "8.8.8.0/24", - } - payload, err := json.Marshal(&network) - should.BeNil(t, err) - req, err := http.NewRequest(http.MethodPost, "/networks/add", bytes.NewBuffer(payload)) - should.BeNil(t, err) - req.Header.Set("Content-Type", "application/json") + payload := bodyParams("name", "notprivate", "addressstring", "8.8.8.0/24") + req := httptest.NewRequest(http.MethodPost, "/networks/add", payload) + req.Header.Set("Content-Type", "application/x-www-form-urlencoded") req.AddCookie(cookie) w := httptest.NewRecorder() router.ServeHTTP(w, req) should.BeEqual(t, w.Code, http.StatusBadRequest) body, err := io.ReadAll(w.Body) - should.BeNil(t, err) - should.ContainSubstring( - t, - string(body), - "Error Processing Request: network address is not private", - ) + should.NotBeError(t, err) + should.ContainSubstring(t, string(body), "network address is not private") }) t.Run("valid", func(t *testing.T) { - network := plexus.Network{ - Name: "valid", - AddressString: "10.10.10.0/24", - } - payload, err := json.Marshal(&network) - should.BeNil(t, err) - req, err := http.NewRequest(http.MethodPost, "/networks/add", bytes.NewBuffer(payload)) - should.BeNil(t, err) - req.Header.Set("Content-Type", "application/json") + payload := bodyParams("name", "valid", "addressstring", "10.10.10.0/24") + req := httptest.NewRequest(http.MethodPost, "/networks/add", payload) + req.Header.Set("Content-Type", "application/x-www-form-urlencoded") req.AddCookie(cookie) w := httptest.NewRecorder() router.ServeHTTP(w, req) should.BeEqual(t, w.Code, http.StatusOK) body, err := io.ReadAll(w.Body) - should.BeNil(t, err) - should.ContainSubstring(t, string(body), "
10.10.10.0/24") }) t.Run("duplicateName", func(t *testing.T) { - network := plexus.Network{ - Name: "valid", - AddressString: "10.10.10.0/24", - } - payload, err := json.Marshal(&network) - should.BeNil(t, err) - req, err := http.NewRequest(http.MethodPost, "/networks/add", bytes.NewBuffer(payload)) - should.BeNil(t, err) - req.Header.Set("Content-Type", "application/json") + payload := bodyParams("name", "valid", "addressstring", "10.10.10.0/24") + req := httptest.NewRequest(http.MethodPost, "/networks/add", payload) + req.Header.Set("Content-Type", "application/x-www-form-urlencoded") req.AddCookie(cookie) w := httptest.NewRecorder() router.ServeHTTP(w, req) should.BeEqual(t, w.Code, http.StatusBadRequest) body, err := io.ReadAll(w.Body) - should.BeNil(t, err) - should.ContainSubstring(t, string(body), "Error Processing Request: network name exists") + should.NotBeError(t, err) + should.ContainSubstring(t, string(body), "network name exists") }) - err = deleteAllNetworks() - should.BeNil(t, err) + deleteAllNetworks(t) +} + +func TestDisplayNetworkDetails(t *testing.T) { + user := plexus.User{ + Username: "hello", + Password: "world", + } + createTestUser(t, user) + createTestNetwork(t) + createTestNetworkPeer(t) + + r := httptest.NewRequest(http.MethodGet, "/networks/details/valid", nil) + r.AddCookie(testLogin(t, user)) + w := httptest.NewRecorder() + router.ServeHTTP(w, r) + should.BeEqual(t, w.Result().StatusCode, http.StatusOK) + body, err := io.ReadAll(w.Body) + should.NotBeError(t, err) + should.ContainSubstring(t, string(body), "Network: valid") + deleteAllNetworks(t) } func TestDeleteNetwork(t *testing.T) { - t.Skip() + setup(t) + defer shutdown(t) user := plexus.User{ Username: "hello", Password: "world", } - err := createTestUser(user) - should.BeNil(t, err) - cookie, err := testLogin(user) - should.BeNil(t, err) + createTestUser(t, user) + cookie := testLogin(t, user) t.Run("nosuchnetwork", func(t *testing.T) { - req, err := http.NewRequest(http.MethodDelete, "/networks/network", nil) - should.BeNil(t, err) - req.AddCookie(cookie) + r := httptest.NewRequest(http.MethodDelete, "/networks/network", nil) + r.AddCookie(cookie) w := httptest.NewRecorder() - router.ServeHTTP(w, req) + router.ServeHTTP(w, r) should.BeEqual(t, w.Code, http.StatusBadRequest) body, err := io.ReadAll(w.Body) - should.BeNil(t, err) + should.NotBeError(t, err) should.ContainSubstring(t, string(body), "network does not exist") }) t.Run("existingNetwork", func(t *testing.T) { - err := createTestNetwork(cookie) - should.BeNil(t, err) - req, err := http.NewRequest(http.MethodDelete, "/networks/valid", nil) - should.BeNil(t, err) + createTestNetwork(t) + req := httptest.NewRequest(http.MethodDelete, "/networks/valid", nil) req.AddCookie(cookie) w := httptest.NewRecorder() router.ServeHTTP(w, req) should.BeEqual(t, w.Code, http.StatusOK) body, err := io.ReadAll(w.Body) - should.BeNil(t, err) - should.ContainSubstring(t, string(body), "
Plexus") } @@ -67,77 +27,54 @@ func TestGetPage(t *testing.T) { } func TestLogin(t *testing.T) { - err := deleteAllUsers(true) - should.BeNil(t, err) + deleteAllUsers(t) t.Run("nousers", func(t *testing.T) { - form := url.Values{} - form.Add("username", "admin") - form.Add("password", "testing") - should.BeNil(t, err) - req, err := http.NewRequest(http.MethodPost, "/", strings.NewReader(form.Encode())) + payload := bodyParams("username", "admin", "password", "testing") + req := httptest.NewRequest(http.MethodPost, "/login/", payload) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") - should.BeNil(t, err) w := httptest.NewRecorder() router.ServeHTTP(w, req) should.BeEqual(t, w.Code, http.StatusBadRequest) body, err := io.ReadAll(w.Body) - should.BeNil(t, err) + should.NotBeError(t, err) should.ContainSubstring(t, string(body), "invalid user") }) - err = createTestUser(plexus.User{ + createTestUser(t, plexus.User{ Username: "testing", Password: "testing", + IsAdmin: true, }) - should.BeNil(t, err) t.Run("wronguser", func(t *testing.T) { - user := plexus.User{ - Username: "admin", - Password: "testing", - } - payload, err := json.Marshal(&user) - should.BeNil(t, err) - req, err := http.NewRequest(http.MethodPost, "/", bytes.NewBuffer(payload)) - req.Header.Set("Content-Type", "application/json") - should.BeNil(t, err) + payload := bodyParams("username", "admin", "password", "testing") + req := httptest.NewRequest(http.MethodPost, "/login/", payload) + req.Header.Set("Content-Type", "application/x-www-form-urlencoded") w := httptest.NewRecorder() router.ServeHTTP(w, req) should.BeEqual(t, w.Code, http.StatusBadRequest) body, err := io.ReadAll(w.Body) - should.BeNil(t, err) + should.NotBeError(t, err) should.ContainSubstring(t, string(body), "invalid user") }) t.Run("wrongpass", func(t *testing.T) { - user := plexus.User{ - Username: "testing", - Password: "testing2", - } - payload, err := json.Marshal(&user) - should.BeNil(t, err) - req, err := http.NewRequest(http.MethodPost, "/", bytes.NewBuffer(payload)) - req.Header.Set("Content-Type", "application/json") - should.BeNil(t, err) + payload := bodyParams("username", "testing", "password", "testing2") + req := httptest.NewRequest(http.MethodPost, "/login/", payload) + req.Header.Set("Content-Type", "application/x-www-form-urlencoded") w := httptest.NewRecorder() router.ServeHTTP(w, req) should.BeEqual(t, w.Code, http.StatusBadRequest) body, err := io.ReadAll(w.Body) - should.BeNil(t, err) + should.NotBeError(t, err) should.ContainSubstring(t, string(body), "invalid user") }) t.Run("valid", func(t *testing.T) { - user := plexus.User{ - Username: "testing", - Password: "testing", - } - payload, err := json.Marshal(&user) - should.BeNil(t, err) - req, err := http.NewRequest(http.MethodPost, "/", bytes.NewBuffer(payload)) - req.Header.Set("Content-Type", "application/json") - should.BeNil(t, err) + payload := bodyParams("username", "testing", "password", "testing") + req := httptest.NewRequest(http.MethodPost, "/login/", payload) + req.Header.Set("Content-Type", "application/x-www-form-urlencoded") w := httptest.NewRecorder() router.ServeHTTP(w, req) should.BeEqual(t, w.Code, http.StatusOK) body, err := io.ReadAll(w.Body) - should.BeNil(t, err) + should.NotBeError(t, err) should.ContainSubstring(t, string(body), "Plexus") should.NotBeNil(t, w.Result().Cookies()) }) @@ -145,51 +82,8 @@ func TestLogin(t *testing.T) { func TestLogout(t *testing.T) { w := httptest.NewRecorder() - req, err := http.NewRequest(http.MethodGet, "/logout", nil) - should.BeNil(t, err) + req := httptest.NewRequest(http.MethodGet, "/logout/", nil) router.ServeHTTP(w, req) - should.BeEqual(t, w.Code, http.StatusOK) - should.BeEqual(t, w.Result().Cookies(), []*http.Cookie{}) -} - -func deleteAllUsers(deleteAll bool) (errs error) { - users, err := boltdb.GetAll[plexus.User](userTable) - if err != nil { - return err - } - for _, user := range users { - if user.Username != "admin" || deleteAll == true { - if err := boltdb.Delete[plexus.User](user.Username, userTable); err != nil { - errs = errors.Join(errs, err) - } - } - } - return errs -} - -func testLogin(data plexus.User) (*http.Cookie, error) { - w := httptest.NewRecorder() - form := url.Values{} - form.Add("username", data.Username) - form.Add("password", data.Password) - req, err := http.NewRequest(http.MethodPost, "/login/", strings.NewReader(form.Encode())) - if err != nil { - return nil, err - } - req.Header.Set("Content-Type", "application/x-www-form-urlencoded") - router.ServeHTTP(w, req) - for _, cookie := range w.Result().Cookies() { - if cookie.Name == "plexus" { - return cookie, nil - } - } - return nil, errors.New("no cookie") -} - -func createTestUser(user plexus.User) error { - user.Password, _ = hashPassword(user.Password) - if err := boltdb.Save(&user, user.Username, userTable); err != nil { - return err - } - return nil + should.BeEqual(t, w.Code, http.StatusFound) + should.BeEqual(t, w.Result().Cookies()[0].MaxAge, -1) } diff --git a/internal/server/peers_test.go b/internal/server/peers_test.go new file mode 100644 index 0000000..89681fa --- /dev/null +++ b/internal/server/peers_test.go @@ -0,0 +1,190 @@ +package server + +import ( + "io" + "net/http" + "net/http/httptest" + "testing" + + "github.com/Kairum-Labs/should" + "github.com/devilcove/boltdb" + "github.com/devilcove/plexus" +) + +func TestDisplayPeers(t *testing.T) { + user := plexus.User{ + Username: "hello", + Password: "world", + } + createTestUser(t, user) + createTestNetwork(t) + setup(t) + defer shutdown(t) + peerID := createTestNetworkPeer(t) + + t.Run("displayPeers", func(t *testing.T) { + r := httptest.NewRequest(http.MethodGet, "/peers/", nil) + r.AddCookie(testLogin(t, user)) + w := httptest.NewRecorder() + router.ServeHTTP(w, r) + should.BeEqual(t, w.Result().StatusCode, http.StatusOK) + }) + + t.Run("peerDetails", func(t *testing.T) { + r := httptest.NewRequest(http.MethodGet, "/peers/"+peerID, nil) + r.AddCookie(testLogin(t, user)) + w := httptest.NewRecorder() + router.ServeHTTP(w, r) + should.BeEqual(t, w.Result().StatusCode, http.StatusOK) + body, err := io.ReadAll(w.Result().Body) + should.NotBeError(t, err) + should.ContainSubstring(t, string(body), "Peer: testing") + }) + + t.Run("peerDelete", func(t *testing.T) { + r := httptest.NewRequest(http.MethodDelete, "/peers/"+peerID, nil) + r.AddCookie(testLogin(t, user)) + w := httptest.NewRecorder() + router.ServeHTTP(w, r) + should.BeEqual(t, w.Result().StatusCode, http.StatusOK) + _, err := boltdb.Get[plexus.Peer](peerID, peerTable) + should.BeErrorIs(t, err, boltdb.ErrNoResults) + }) +} + +func TestAddPeerToNetwork(t *testing.T) { + deleteAllNetworks(t) + deleteAllPeers(t) + deleteAllUsers(t) + user := plexus.User{ + Username: "hello", + Password: "world", + } + createTestUser(t, user) + createTestNetwork(t) + setup(t) + defer shutdown(t) + peerID := createTestPeer(t) + + t.Run("ok", func(t *testing.T) { + t.Skip() // changes required to addPeer when not connected + r := httptest.NewRequest(http.MethodPost, "/networks/addPeer/valid/"+peerID, nil) + r.AddCookie(testLogin(t, user)) + w := httptest.NewRecorder() + router.ServeHTTP(w, r) + should.BeEqual(t, w.Result().StatusCode, http.StatusOK) + }) + + t.Run("invalidNetwork", func(t *testing.T) { + r := httptest.NewRequest(http.MethodPost, "/networks/addPeer/invalid/"+peerID, nil) + r.AddCookie(testLogin(t, user)) + w := httptest.NewRecorder() + router.ServeHTTP(w, r) + should.BeEqual(t, w.Result().StatusCode, http.StatusInternalServerError) + }) + t.Run("invalidPeer", func(t *testing.T) { + r := httptest.NewRequest(http.MethodPost, "/networks/addPeer/valid/invalid", nil) + r.AddCookie(testLogin(t, user)) + w := httptest.NewRecorder() + router.ServeHTTP(w, r) + should.BeEqual(t, w.Result().StatusCode, http.StatusInternalServerError) + }) +} + +func TestRemovePeerFromNetwork(t *testing.T) { + deleteAllNetworks(t) + deleteAllPeers(t) + deleteAllUsers(t) + user := plexus.User{ + Username: "hello", + Password: "world", + } + createTestUser(t, user) + createTestNetwork(t) + setup(t) + defer shutdown(t) + peer := createTestNetworkPeer(t) + + t.Run("invalidPeer", func(t *testing.T) { + r := httptest.NewRequest(http.MethodDelete, "/networks/peers/valid/something", nil) + r.AddCookie(testLogin(t, user)) + w := httptest.NewRecorder() + router.ServeHTTP(w, r) + should.BeEqual(t, w.Result().StatusCode, http.StatusBadRequest) + }) + + t.Run("valid", func(t *testing.T) { + r := httptest.NewRequest(http.MethodDelete, "/networks/peers/valid/"+peer, nil) + r.AddCookie(testLogin(t, user)) + w := httptest.NewRecorder() + router.ServeHTTP(w, r) + should.BeEqual(t, w.Result().StatusCode, http.StatusOK) + }) +} + +func TestDisplayNetworkPeer(t *testing.T) { + deleteAllNetworks(t) + deleteAllPeers(t) + deleteAllUsers(t) + user := plexus.User{ + Username: "hello", + Password: "world", + } + createTestUser(t, user) + createTestNetwork(t) + setup(t) + defer shutdown(t) + peer := createTestNetworkPeer(t) + + t.Run("invalidNetwork", func(t *testing.T) { + r := httptest.NewRequest(http.MethodGet, "/networks/peers/invalid/peer", nil) + r.AddCookie(testLogin(t, user)) + w := httptest.NewRecorder() + router.ServeHTTP(w, r) + should.BeEqual(t, w.Result().StatusCode, http.StatusBadRequest) + }) + + t.Run("invalidPeer", func(t *testing.T) { + r := httptest.NewRequest(http.MethodGet, "/networks/peers/valid/something", nil) + r.AddCookie(testLogin(t, user)) + w := httptest.NewRecorder() + router.ServeHTTP(w, r) + should.BeEqual(t, w.Result().StatusCode, http.StatusBadRequest) + }) + + t.Run("valid", func(t *testing.T) { + r := httptest.NewRequest(http.MethodGet, "/networks/peers/valid/"+peer, nil) + r.AddCookie(testLogin(t, user)) + w := httptest.NewRecorder() + router.ServeHTTP(w, r) + should.BeEqual(t, w.Result().StatusCode, http.StatusOK) + }) +} + +func TestGetNetworksForPeer(t *testing.T) { + deleteAllNetworks(t) + deleteAllPeers(t) + deleteAllUsers(t) + user := plexus.User{ + Username: "hello", + Password: "world", + } + createTestUser(t, user) + createTestNetwork(t) + setup(t) + defer shutdown(t) + + t.Run("noNetwork", func(t *testing.T) { + networks, err := getNetworksForPeer("wireguardkey") + should.NotBeError(t, err) + should.BeEmpty(t, networks) + }) + + t.Run("good", func(t *testing.T) { + createTestNetwork(t) + peer := createTestNetworkPeer(t) + networks, err := getNetworksForPeer(peer) + should.NotBeError(t, err) + should.BeEqual(t, len(networks), 1) + }) +} diff --git a/internal/server/plexus_test.go b/internal/server/plexus_test.go new file mode 100644 index 0000000..fe28a4c --- /dev/null +++ b/internal/server/plexus_test.go @@ -0,0 +1,234 @@ +package server + +import ( + "io" + "log" + "log/slog" + "net" + "net/http" + "net/http/httptest" + "net/url" + "os" + "path/filepath" + "strings" + "testing" + + "github.com/Kairum-Labs/should" + "github.com/devilcove/boltdb" + "github.com/devilcove/configuration" + "github.com/devilcove/mux" + "github.com/devilcove/plexus" + "github.com/nats-io/nats-server/v2/server" + "github.com/nats-io/nats.go" +) + +var ( + dir string + progName = "plexus-testing" + router *mux.Router +) + +func TestMain(m *testing.M) { + if _, err := os.Stat("./test.db"); err == nil { + if err := os.Remove("./test.db"); err != nil { + log.Println("remove db", err) + os.Exit(1) + } + } + if err := boltdb.Initialize("./test.db", + []string{userTable, keyTable, networkTable, peerTable, settingTable, "keypairs"}, + ); err != nil { + log.Println("init db", err) + os.Exit(2) + } + plexus.SetLogging("debug") + router = setupRouter(slog.Default()) + code := m.Run() + // cancel() + // wg.Wait() + boltdb.Close() + os.Exit(code) +} + +func writeTmpConfg(t *testing.T, content *Configuration) { + t.Helper() + if err := configuration.Save(content); err != nil { + t.Fatal(err) + } +} + +func setup(t *testing.T) { + t.Helper() + dir = t.TempDir() + err := os.MkdirAll(filepath.Join(dir, progName), 0o0750) + if err != nil { + t.Fatal(err) + } + t.Setenv("XDG_CONFIG_HOME", dir) + t.Setenv("HOME", dir) + os.Args = []string{progName} + if err := os.MkdirAll(filepath.Join(dir, ".local/share", progName), 0o0750); err != nil { + t.Fatal(err) + } + writeTmpConfg(t, &Configuration{ + FQDN: "127.0.0.1", + Port: "8080", + DataHome: filepath.Join(dir, ".local/share", progName), + }) + startTestBroker(t) +} + +func deleteAllUsers(t *testing.T) { + t.Helper() + users, err := boltdb.GetAll[plexus.User](userTable) + should.NotBeError(t, err) + for _, user := range users { + err := boltdb.Delete[plexus.User](user.Username, userTable) + should.NotBeError(t, err) + } +} + +func testLogin(t *testing.T, data plexus.User) *http.Cookie { + t.Helper() + w := httptest.NewRecorder() + form := url.Values{} + form.Add("username", data.Username) + form.Add("password", data.Password) + req := httptest.NewRequest(http.MethodPost, "/login/", strings.NewReader(form.Encode())) + req.Header.Set("Content-Type", "application/x-www-form-urlencoded") + router.ServeHTTP(w, req) + should.BeGreaterOrEqualTo(t, len(w.Result().Cookies()), 1) + for _, cookie := range w.Result().Cookies() { + if cookie.Name == "plexus" { + return cookie + } + } + t.Fail() + return nil +} + +func createTestUser(t *testing.T, user plexus.User) { + t.Helper() + user.Password, _ = hashPassword(user.Password) + err := boltdb.Save(&user, user.Username, userTable) + should.NotBeError(t, err) +} + +func deleteAllPeers(t *testing.T) { + t.Helper() + peers, err := boltdb.GetAll[plexus.Peer](peerTable) + should.NotBeError(t, err) + for _, peer := range peers { + err := boltdb.Delete[plexus.Peer](peer.WGPublicKey, peerTable) + should.NotBeError(t, err) + } +} + +func createTestPeer(t *testing.T) string { + t.Helper() + pub, err := generateKeys() + if err != nil { + t.Fatal(err) + } + savePeer(plexus.Peer{ + WGPublicKey: pub.String(), + Name: "testing", + }) + return pub.String() +} + +func createTestNetworkPeer(t *testing.T) string { + t.Helper() + id := createTestPeer(t) + _, err := addPeerToNetwork(id, "valid", 51821, 51821) + should.NotBeError(t, err) + return id +} + +func deleteAllNetworks(t *testing.T) { + t.Helper() + nets, err := boltdb.GetAll[plexus.Network](networkTable) + should.NotBeError(t, err) + for _, net := range nets { + err := boltdb.Delete[plexus.Network](net.Name, networkTable) + should.NotBeError(t, err) + } +} + +func createTestNetwork(t *testing.T) { + t.Helper() + _, cidr, err := net.ParseCIDR("10.200.0.0/24") + should.NotBeError(t, err) + network := plexus.Network{ + Name: "valid", + Net: *cidr, + } + err = boltdb.Save(network, network.Name, networkTable) + should.NotBeError(t, err) +} + +func deleteAllKeys(t *testing.T) { + t.Helper() + keys, err := boltdb.GetAll[plexus.Key](keyTable) + should.NotBeError(t, err) + for _, key := range keys { + err := boltdb.Delete[plexus.Key](key.Name, keyTable) + should.NotBeError(t, err) + } +} + +func startTestBroker(t *testing.T) { + t.Helper() + // create admin user. + adminKey := getAdminKey() + adminPublicKey, err := adminKey.PublicKey() + if err != nil { + t.Fatal("could not create admin public key", "error", err) + } + tokensUsers := getTokenUsers() + deviceUsers := getDeviceUsers() + natsOptions = &server.Options{ + Nkeys: []*server.NkeyUser{ + { + Nkey: adminPublicKey, + Permissions: &server.Permissions{ + Publish: &server.SubjectPermission{ + Allow: []string{">"}, + }, + Subscribe: &server.SubjectPermission{ + Allow: []string{">"}, + }, + }, + }, + }, + } + natsOptions.Nkeys = append(natsOptions.Nkeys, tokensUsers...) + natsOptions.Nkeys = append(natsOptions.Nkeys, deviceUsers...) + natsOptions.NoSigs = true + natsOptions.Host = "127.0.0.1" + natServer, err = server.NewServer(natsOptions) + if err != nil { + t.Fatal(err) + } + natServer.Start() + SignatureCB := func(nonce []byte) ([]byte, error) { + return adminKey.Sign(nonce) + } + opts := []nats.Option{nats.Nkey(adminPublicKey, SignatureCB)} + natsConn, err = nats.Connect("nats://127.0.0.1:4222", opts...) + if err != nil { + t.Fatal(err) + } +} + +func shutdown(_ *testing.T) { + natServer.Shutdown() +} + +func bodyParams(params ...string) io.Reader { + body := url.Values{} + for i := 0; i < len(params)-1; i += 2 { + body.Set(params[i], params[i+1]) + } + return strings.NewReader(body.Encode()) +} diff --git a/internal/server/relay.go b/internal/server/relay.go new file mode 100644 index 0000000..25499a8 --- /dev/null +++ b/internal/server/relay.go @@ -0,0 +1,124 @@ +package server + +import ( + "log/slog" + "net/http" + "slices" + + "github.com/devilcove/boltdb" + "github.com/devilcove/plexus" + "github.com/devilcove/plexus/internal/publish" +) + +func displayAddRelay(w http.ResponseWriter, r *http.Request) { + data := struct { + Network string + Relay plexus.NetworkPeer + AvailablePeers []plexus.NetworkPeer + }{} + data.Network = r.PathValue("id") + relay := r.PathValue("peer") + slog.Debug("add relay", "network", data.Network, "relay", relay) + network, err := boltdb.Get[plexus.Network](data.Network, networkTable) + if err != nil { + processError(w, http.StatusBadGateway, err.Error()) + return + } + for _, peer := range network.Peers { + if peer.WGPublicKey == relay { + data.Relay = peer + continue + } + if peer.IsRelay || peer.IsRelayed || peer.IsSubnetRouter { + continue + } + data.AvailablePeers = append(data.AvailablePeers, peer) + } + if err := templates.ExecuteTemplate(w, "addRelayToNetwork", data); err != nil { + slog.Error("execute template", "template", "addRelayToNetwork", "data", data, "error", err) + } +} + +func addRelay(w http.ResponseWriter, r *http.Request) { + netID := r.PathValue("id") + relayID := r.PathValue("peer") + relayedIDs := r.PostForm["relayed"] + network, err := boltdb.Get[plexus.Network](netID, networkTable) + if err != nil { + processError(w, http.StatusBadRequest, err.Error()) + return + } + update := plexus.NetworkUpdate{ + Action: plexus.AddRelay, + } + peers := []plexus.NetworkPeer{} + for _, peer := range network.Peers { + if peer.WGPublicKey == relayID { + peer.IsRelay = true + peer.RelayedPeers = relayedIDs + update.Peer = peer + } + if slices.Contains(relayedIDs, peer.WGPublicKey) { + peer.IsRelayed = true + } + peers = append(peers, peer) + } + network.Peers = peers + if err := boltdb.Save(network, network.Name, networkTable); err != nil { + processError(w, http.StatusInternalServerError, err.Error()) + return + } + slog.Debug("publish network update - add relay", "network", network.Name, "relay", relayID) + publish.Message(natsConn, "networks."+network.Name, update) + networkDetails(w, r) +} + +func deleteRelay(w http.ResponseWriter, r *http.Request) { + netName := r.PathValue("id") + peerID := r.PathValue("peer") + slog.Info("delete relay", "network", netName, "relay", peerID) + network, err := boltdb.Get[plexus.Network](netName, networkTable) + if err != nil { + processError(w, http.StatusBadRequest, err.Error()) + return + } + update := plexus.NetworkUpdate{ + Action: plexus.DeleteRelay, + } + peersToUnrelay := []string{} + updatedPeers := []plexus.NetworkPeer{} + for _, peer := range network.Peers { + if peer.WGPublicKey == peerID { + // send the original peer to agents which will include the list of peers to unrelay + update.Peer = peer + peer.IsRelay = false + peersToUnrelay = peer.RelayedPeers + peer.RelayedPeers = []string{} + updatedPeers = append(updatedPeers, peer) + break + } + } + for _, peer := range network.Peers { + if peer.WGPublicKey == peerID { + // already added above. + continue + } + if slices.Contains(peersToUnrelay, peer.WGPublicKey) { + peer.IsRelayed = false + } + updatedPeers = append(updatedPeers, peer) + } + network.Peers = updatedPeers + if err := boltdb.Save(network, network.Name, networkTable); err != nil { + processError(w, http.StatusBadRequest, "failed to save update network peers "+err.Error()) + return + } + slog.Debug( + "publish network update", + "network", network.Name, + "peer", update.Peer.HostName, + "reason", "delete relay", + ) + publish.Message(natsConn, plexus.Networks+network.Name, update) + networkDetails(w, r) +} diff --git a/internal/server/relay_test.go b/internal/server/relay_test.go new file mode 100644 index 0000000..9ea92e2 --- /dev/null +++ b/internal/server/relay_test.go @@ -0,0 +1,84 @@ +package server + +import ( + "io" + "net/http" + "net/http/httptest" + "testing" + + "github.com/Kairum-Labs/should" + "github.com/devilcove/plexus" +) + +func TestRelay(t *testing.T) { + setup(t) + defer shutdown(t) + deleteAllNetworks(t) + deleteAllPeers(t) + deleteAllUsers(t) + + user := plexus.User{Username: "admin", Password: "pass"} + createTestUser(t, user) + createTestNetwork(t) + peer := createTestNetworkPeer(t) + peer2 := createTestNetworkPeer(t) + + t.Run("displayAdd", func(t *testing.T) { + r := httptest.NewRequest(http.MethodGet, "/networks/relay/valid/"+peer, nil) + r.AddCookie(testLogin(t, user)) + w := httptest.NewRecorder() + router.ServeHTTP(w, r) + should.BeEqual(t, w.Result().StatusCode, http.StatusOK) + body, err := io.ReadAll(w.Result().Body) + should.NotBeError(t, err) + should.ContainSubstring(t, string(body), "Create Relay") + }) + + t.Run("addInvalidNet", func(t *testing.T) { + payload := bodyParams("relayed", peer2) + r := httptest.NewRequest(http.MethodPost, "/networks/relay/invalid/"+peer, payload) + r.Header.Set("Content-Type", "application/x-www-form-urlencoded") + r.AddCookie(testLogin(t, user)) + w := httptest.NewRecorder() + router.ServeHTTP(w, r) + should.BeEqual(t, w.Result().StatusCode, http.StatusBadRequest) + body, err := io.ReadAll(w.Result().Body) + should.NotBeError(t, err) + should.ContainSubstring(t, string(body), "no results found") + }) + + t.Run("addRelay", func(t *testing.T) { + payload := bodyParams("relayed", peer2) + r := httptest.NewRequest(http.MethodPost, "/networks/relay/valid/"+peer, payload) + r.Header.Set("Content-Type", "application/x-www-form-urlencoded") + r.AddCookie(testLogin(t, user)) + w := httptest.NewRecorder() + router.ServeHTTP(w, r) + should.BeEqual(t, w.Result().StatusCode, http.StatusOK) + body, err := io.ReadAll(w.Result().Body) + should.NotBeError(t, err) + should.ContainSubstring(t, string(body), "Network:") + }) + + t.Run("deleteInvalidNet", func(t *testing.T) { + r := httptest.NewRequest(http.MethodDelete, "/networks/relay/invalid/"+peer2, nil) + r.AddCookie(testLogin(t, user)) + w := httptest.NewRecorder() + router.ServeHTTP(w, r) + should.BeEqual(t, w.Result().StatusCode, http.StatusBadRequest) + body, err := io.ReadAll(w.Result().Body) + should.NotBeError(t, err) + should.ContainSubstring(t, string(body), "no results found") + }) + + t.Run("delete", func(t *testing.T) { + r := httptest.NewRequest(http.MethodDelete, "/networks/relay/valid/"+peer2, nil) + r.AddCookie(testLogin(t, user)) + w := httptest.NewRecorder() + router.ServeHTTP(w, r) + should.BeEqual(t, w.Result().StatusCode, http.StatusOK) + body, err := io.ReadAll(w.Result().Body) + should.NotBeError(t, err) + should.ContainSubstring(t, string(body), "Network: valid") + }) +} diff --git a/internal/server/router.go b/internal/server/router.go index c7bb62d..3c9ccdc 100644 --- a/internal/server/router.go +++ b/internal/server/router.go @@ -41,8 +41,8 @@ func setupRouter(l *slog.Logger) *mux.Router { networks := router.Group("/networks", auth) networks.Get("/add", displayAddNetwork) networks.Post("/add", addNetwork) - networks.Get("/", displayNetworks) - networks.Get("/{id}", networkDetails) + networks.Get("/{$}", displayNetworks) + networks.Get("/details/{id}", networkDetails) networks.Post("/addPeer/{id}/{peer}", networkAddPeer) networks.Delete("/{id}", deleteNetwork) networks.Delete("/peers/{id}/{peer}", removePeerFromNetwork) diff --git a/internal/server/router_test.go b/internal/server/router_test.go index 9b90b9e..1ac2ed1 100644 --- a/internal/server/router_test.go +++ b/internal/server/router_test.go @@ -13,42 +13,39 @@ import ( func TestDefaultUser(t *testing.T) { t.Run("noadmim", func(t *testing.T) { - err := deleteAllUsers(true) - should.BeNil(t, err) - err = checkDefaultUser("admin", "pass") - should.BeNil(t, err) + deleteAllUsers(t) + err := checkDefaultUser("admin", "pass") + should.NotBeError(t, err) user, err := boltdb.Get[plexus.User]("admin", userTable) - should.BeNil(t, err) + should.NotBeError(t, err) should.BeEqual(t, user.Username, "admin") should.BeTrue(t, user.IsAdmin) }) t.Run("env", func(t *testing.T) { - err := deleteAllUsers(true) - should.BeNil(t, err) - err = checkDefaultUser("Administrator", "password") - should.BeNil(t, err) + deleteAllUsers(t) + err := checkDefaultUser("Administrator", "password") + should.NotBeError(t, err) user, err := boltdb.Get[plexus.User]("Administrator", userTable) - should.BeNil(t, err) + should.NotBeError(t, err) should.BeEqual(t, user.Username, "Administrator") should.BeTrue(t, user.IsAdmin) }) t.Run("adminexists", func(t *testing.T) { err := checkDefaultUser("Administator", "password") - should.BeNil(t, err) + should.NotBeError(t, err) user, err := boltdb.Get[plexus.User]("Administrator", userTable) - should.BeNil(t, err) + should.NotBeError(t, err) should.BeEqual(t, user.Username, "Administrator") should.BeTrue(t, user.IsAdmin) }) } func TestAuthFail(t *testing.T) { - req, err := http.NewRequest(http.MethodGet, "/server/", nil) - should.BeNil(t, err) + req := httptest.NewRequest(http.MethodGet, "/server/", nil) w := httptest.NewRecorder() router.ServeHTTP(w, req) should.BeEqual(t, w.Code, http.StatusOK) body, err := io.ReadAll(w.Body) - should.BeNil(t, err) + should.NotBeError(t, err) should.ContainSubstring(t, string(body), "

LoginAuthorized Users

") + }) + + t.Run("user", func(t *testing.T) { + cookie := testLogin(t, user) + r := httptest.NewRequest(http.MethodGet, "/users/", nil) + r.AddCookie(cookie) + w := httptest.NewRecorder() + router.ServeHTTP(w, r) + should.BeEqual(t, w.Result().StatusCode, http.StatusOK) + body, err := io.ReadAll(w.Result().Body) + should.NotBeError(t, err) + should.ContainSubstring(t, string(body), "

Edit User

") + }) +} + +func TestGetUser(t *testing.T) { + deleteAllUsers(t) + admin := plexus.User{Username: "admin", Password: "pass", IsAdmin: true} + user := plexus.User{Username: "test", Password: "pass", IsAdmin: false} + createTestUser(t, admin) + createTestUser(t, user) + + t.Run("nosuchuser", func(t *testing.T) { + r := httptest.NewRequest(http.MethodGet, "/users/user/user", nil) + r.AddCookie(testLogin(t, admin)) + w := httptest.NewRecorder() + router.ServeHTTP(w, r) + should.BeEqual(t, w.Result().StatusCode, http.StatusBadRequest) + body, err := io.ReadAll(w.Result().Body) + should.NotBeError(t, err) + should.ContainSubstring(t, string(body), "no results found") + }) + + t.Run("user", func(t *testing.T) { + r := httptest.NewRequest(http.MethodGet, "/users/user/admin", nil) + r.AddCookie(testLogin(t, user)) + w := httptest.NewRecorder() + router.ServeHTTP(w, r) + should.BeEqual(t, w.Result().StatusCode, http.StatusUnauthorized) + body, err := io.ReadAll(w.Result().Body) + should.NotBeError(t, err) + should.ContainSubstring(t, string(body), "need to be an admin to edit other users") + }) + + t.Run("admin", func(t *testing.T) { + r := httptest.NewRequest(http.MethodGet, "/users/user/test", nil) + r.AddCookie(testLogin(t, admin)) + w := httptest.NewRecorder() + router.ServeHTTP(w, r) + should.BeEqual(t, w.Result().StatusCode, http.StatusOK) + body, err := io.ReadAll(w.Result().Body) + should.NotBeError(t, err) + should.ContainSubstring(t, string(body), "

Edit User

") + }) +} + +func TestAddUser(t *testing.T) { + deleteAllUsers(t) + admin := plexus.User{Username: "admin", Password: "pass", IsAdmin: true} + user := plexus.User{Username: "test", Password: "pass", IsAdmin: false} + createTestUser(t, admin) + createTestUser(t, user) + + t.Run("displayAsUser", func(t *testing.T) { + r := httptest.NewRequest(http.MethodGet, "/users/add", nil) + r.AddCookie(testLogin(t, user)) + w := httptest.NewRecorder() + router.ServeHTTP(w, r) + should.BeEqual(t, w.Result().StatusCode, http.StatusUnauthorized) + body, err := io.ReadAll(w.Result().Body) + should.NotBeError(t, err) + should.ContainSubstring(t, string(body), "admin rights required") + }) + + t.Run("displayAsAdmin", func(t *testing.T) { + r := httptest.NewRequest(http.MethodGet, "/users/add", nil) + r.AddCookie(testLogin(t, admin)) + w := httptest.NewRecorder() + router.ServeHTTP(w, r) + should.BeEqual(t, w.Result().StatusCode, http.StatusOK) + body, err := io.ReadAll(w.Result().Body) + should.NotBeError(t, err) + should.ContainSubstring(t, string(body), "

New User

") + }) + + t.Run("addAsUser", func(t *testing.T) { + payload := bodyParams("username", "test2", "password", "pass") + r := httptest.NewRequest(http.MethodPost, "/users/add", payload) + r.AddCookie(testLogin(t, user)) + r.Header.Set("Content-Type", "application/x-www-form-urlencoded") + w := httptest.NewRecorder() + router.ServeHTTP(w, r) + should.BeEqual(t, w.Result().StatusCode, http.StatusUnauthorized) + body, err := io.ReadAll(w.Result().Body) + should.NotBeError(t, err) + should.ContainSubstring(t, string(body), "admin rights required") + }) + + t.Run("addAsAdmin", func(t *testing.T) { + payload := bodyParams("username", "test2", "password", "pass") + r := httptest.NewRequest(http.MethodPost, "/users/add", payload) + r.Header.Set("Content-Type", "application/x-www-form-urlencoded") + r.AddCookie(testLogin(t, admin)) + w := httptest.NewRecorder() + router.ServeHTTP(w, r) + should.BeEqual(t, w.Result().StatusCode, http.StatusOK) + body, err := io.ReadAll(w.Result().Body) + should.NotBeError(t, err) + should.ContainSubstring(t, string(body), "

Authorized Users

") + }) + + t.Run("userExists", func(t *testing.T) { + payload := bodyParams("username", "test2", "password", "pass", "admin", "on") + r := httptest.NewRequest(http.MethodPost, "/users/add", payload) + r.Header.Set("Content-Type", "application/x-www-form-urlencoded") + r.AddCookie(testLogin(t, admin)) + w := httptest.NewRecorder() + router.ServeHTTP(w, r) + should.BeEqual(t, w.Result().StatusCode, http.StatusBadRequest) + body, err := io.ReadAll(w.Result().Body) + should.NotBeError(t, err) + should.ContainSubstring(t, string(body), "user exists") + }) +} + +func TestDeleteUser(t *testing.T) { + deleteAllUsers(t) + admin := plexus.User{Username: "admin", Password: "pass", IsAdmin: true} + user := plexus.User{Username: "test", Password: "pass", IsAdmin: false} + createTestUser(t, admin) + createTestUser(t, user) + + t.Run("AsUser", func(t *testing.T) { + r := httptest.NewRequest(http.MethodDelete, "/users/admin", nil) + r.AddCookie(testLogin(t, user)) + w := httptest.NewRecorder() + router.ServeHTTP(w, r) + should.BeEqual(t, w.Result().StatusCode, http.StatusUnauthorized) + body, err := io.ReadAll(w.Result().Body) + should.NotBeError(t, err) + should.ContainSubstring(t, string(body), "admin rights required") + }) + + t.Run("NoSuchUser", func(t *testing.T) { + r := httptest.NewRequest(http.MethodDelete, "/users/notexit", nil) + r.AddCookie(testLogin(t, admin)) + w := httptest.NewRecorder() + router.ServeHTTP(w, r) + should.BeEqual(t, w.Result().StatusCode, http.StatusNotFound) + body, err := io.ReadAll(w.Result().Body) + should.NotBeError(t, err) + should.ContainSubstring(t, string(body), "no results found") + }) + + t.Run("valid", func(t *testing.T) { + r := httptest.NewRequest(http.MethodDelete, "/users/test", nil) + r.AddCookie(testLogin(t, admin)) + w := httptest.NewRecorder() + router.ServeHTTP(w, r) + should.BeEqual(t, w.Result().StatusCode, http.StatusOK) + body, err := io.ReadAll(w.Result().Body) + should.NotBeError(t, err) + should.ContainSubstring(t, string(body), "

Authorized Users

") + }) +} + +func TestEditUser(t *testing.T) { + deleteAllUsers(t) + admin := plexus.User{Username: "admin", Password: "pass", IsAdmin: true} + user := plexus.User{Username: "test", Password: "pass", IsAdmin: false} + createTestUser(t, admin) + createTestUser(t, user) + + t.Run("AsUserForOther", func(t *testing.T) { + payload := bodyParams("password", "newpass") + r := httptest.NewRequest(http.MethodPost, "/users/user/admin", payload) + r.Header.Set("Content-Type", "application/x-www-form-urlencoded") + r.AddCookie(testLogin(t, user)) + w := httptest.NewRecorder() + router.ServeHTTP(w, r) + should.BeEqual(t, w.Result().StatusCode, http.StatusUnauthorized) + body, err := io.ReadAll(w.Result().Body) + should.NotBeError(t, err) + should.ContainSubstring(t, string(body), "admin rights required") + }) + + t.Run("AsUser", func(t *testing.T) { + payload := bodyParams("password", "newpass") + r := httptest.NewRequest(http.MethodPost, "/users/user/test", payload) + r.Header.Set("Content-Type", "application/x-www-form-urlencoded") + r.AddCookie(testLogin(t, user)) + w := httptest.NewRecorder() + router.ServeHTTP(w, r) + should.BeEqual(t, w.Result().StatusCode, http.StatusOK) + body, err := io.ReadAll(w.Result().Body) + should.NotBeError(t, err) + should.ContainSubstring(t, string(body), "

Edit User

") + }) + + t.Run("blankPass", func(t *testing.T) { + payload := bodyParams("password", "") + r := httptest.NewRequest(http.MethodPost, "/users/user/test", payload) + r.Header.Set("Content-Type", "application/x-www-form-urlencoded") + r.AddCookie(testLogin(t, admin)) + w := httptest.NewRecorder() + router.ServeHTTP(w, r) + should.BeEqual(t, w.Result().StatusCode, http.StatusBadRequest) + body, err := io.ReadAll(w.Result().Body) + should.NotBeError(t, err) + should.ContainSubstring(t, string(body), "blank password") + }) + + t.Run("AsAdmin", func(t *testing.T) { + payload := bodyParams("password", "newpass") + r := httptest.NewRequest(http.MethodPost, "/users/user/test", payload) + r.Header.Set("Content-Type", "application/x-www-form-urlencoded") + r.AddCookie(testLogin(t, admin)) + w := httptest.NewRecorder() + router.ServeHTTP(w, r) + should.BeEqual(t, w.Result().StatusCode, http.StatusOK) + body, err := io.ReadAll(w.Result().Body) + should.NotBeError(t, err) + should.ContainSubstring(t, string(body), "

Authorized Users

") + }) + + t.Run("NoSuchUser", func(t *testing.T) { + payload := bodyParams("password", "newpass") + r := httptest.NewRequest(http.MethodPost, "/users/user/notexist", payload) + r.Header.Set("Content-Type", "application/x-www-form-urlencoded") + r.AddCookie(testLogin(t, admin)) + w := httptest.NewRecorder() + router.ServeHTTP(w, r) + should.BeEqual(t, w.Result().StatusCode, http.StatusBadRequest) + body, err := io.ReadAll(w.Result().Body) + should.NotBeError(t, err) + should.ContainSubstring(t, string(body), "no results found") + }) +} diff --git a/log_test.go b/log_test.go new file mode 100644 index 0000000..c860559 --- /dev/null +++ b/log_test.go @@ -0,0 +1,35 @@ +package plexus_test + +import ( + "testing" + + "github.com/devilcove/plexus" +) + +func TestSetLogging(t *testing.T) { + tests := []struct { + name string // description of this test case + // Named input parameters for target function. + }{ + { + name: "debug", + }, + { + name: "info", + }, + { + name: "warn", + }, + { + name: "error", + }, + { + name: "junk", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(_ *testing.T) { + plexus.SetLogging(tt.name) + }) + } +} diff --git a/models_test.go b/models_test.go new file mode 100644 index 0000000..00bdf42 --- /dev/null +++ b/models_test.go @@ -0,0 +1,36 @@ +package plexus + +import ( + "encoding/base64" + "encoding/json" + "errors" + "testing" + + "github.com/Kairum-Labs/should" +) + +func TestDecodeToken(t *testing.T) { + t.Run("badEncoding", func(t *testing.T) { + value, err := DecodeToken("bad") + var expectedErr base64.CorruptInputError + should.BeEqual(t, true, errors.As(err, &expectedErr)) + should.BeEqual(t, value, KeyValue{}) + }) + t.Run("bad", func(t *testing.T) { + value, err := DecodeToken(base64.StdEncoding.EncodeToString([]byte("bad"))) + should.ContainSubstring(t, err.Error(), "invalid character") + should.BeEqual(t, value, KeyValue{}) + }) + t.Run("good", func(t *testing.T) { + value := KeyValue{ + URL: "example.com", + Seed: "seed", + KeyName: "testing", + } + payload, err := json.Marshal(&value) + should.NotBeError(t, err) + keyValue, err := DecodeToken(base64.StdEncoding.EncodeToString(payload)) + should.NotBeError(t, err) + should.BeEqual(t, keyValue, value) + }) +} diff --git a/wireguard_test.go b/wireguard_test.go index 355f5eb..f5b9a18 100644 --- a/wireguard_test.go +++ b/wireguard_test.go @@ -13,15 +13,21 @@ import ( func TestNew(t *testing.T) { user, err := user.Current() - should.BeNil(t, err) + should.NotBeError(t, err) if user.Uid != "0" { t.Log("this test must be run as root") t.Skip() } key, err := wgtypes.GeneratePrivateKey() - should.BeNil(t, err) + should.NotBeError(t, err) peerKey, err := wgtypes.ParseKey("uREcerxMksoD3K0dy1ciJDRGzGCJ8jvIzJ5r9jWApXY=") - should.BeNil(t, err) + should.NotBeError(t, err) + key2, err := wgtypes.GeneratePrivateKey() + should.NotBeError(t, err) + peer2Key := key2.PublicKey() + key3, err := wgtypes.GeneratePrivateKey() + should.NotBeError(t, err) + peer3Key := key3.PublicKey() port := 51820 keepalive := time.Second * 25 config := wgtypes.Config{ @@ -44,6 +50,21 @@ func TestNew(t *testing.T) { }, PersistentKeepaliveInterval: &keepalive, }, + { + PublicKey: peer2Key, + ReplaceAllowedIPs: true, + AllowedIPs: []net.IPNet{ + { + IP: net.ParseIP("10.100.10.3"), + Mask: net.CIDRMask(32, 32), + }, + }, + Endpoint: &net.UDPAddr{ + IP: net.ParseIP("8.8.8.9"), + Port: 51820, + }, + PersistentKeepaliveInterval: &keepalive, + }, }, } address := netlink.Addr{ @@ -52,18 +73,112 @@ func TestNew(t *testing.T) { Mask: net.CIDRMask(24, 32), }, } - wg := New("wgtest", 1420, address, config) - should.BeEqual(t, wg.Attrs().Name, "wgtest") - should.BeEqual(t, wg.Attrs().MTU, 1420) - err = wg.Up() - should.BeNil(t, err) - should.BeEqual(t, wg.Type(), "wireguard") - link, err := netlink.LinkByName(wg.Name) - should.BeNil(t, err) - should.BeEqual(t, wg.Attrs().Index, link.Attrs().Index) - routes, err := netlink.RouteGet(net.ParseIP("10.100.10.10")) - should.BeNil(t, err) - should.BeEqual(t, routes[0].LinkIndex, wg.Attrs().Index) - err = wg.Down() - should.BeNil(t, err) + newPeer := wgtypes.PeerConfig{ + PublicKey: peer3Key, + Endpoint: &net.UDPAddr{ + IP: net.ParseIP("8.8.8.10"), + Port: 51820, + }, + ReplaceAllowedIPs: true, + AllowedIPs: []net.IPNet{ + { + IP: net.ParseIP("10.100.10.4"), + Mask: net.CIDRMask(32, 32), + }, + { + IP: net.ParseIP("10.200.10.1"), + Mask: net.CIDRMask(32, 32), + }, + }, + } + t.Run("new", func(t *testing.T) { + wg := New("wgtest", 1420, address, config) + should.BeEqual(t, wg.Attrs().Name, "wgtest") + should.BeEqual(t, wg.Attrs().MTU, 1420) + should.BeEqual(t, len(wg.Config.Peers), 2) + err = wg.Up() + should.NotBeError(t, err) + should.BeEqual(t, wg.Type(), "wireguard") + link, err := netlink.LinkByName(wg.Name) + should.NotBeError(t, err) + should.BeEqual(t, wg.Attrs().Index, link.Attrs().Index) + routes, err := netlink.RouteGet(net.ParseIP("10.100.10.10")) + should.NotBeError(t, err) + should.BeEqual(t, routes[0].LinkIndex, wg.Attrs().Index) + device, err := GetDevice("wgtest") + should.NotBeError(t, err) + should.BeEqual(t, device.Name, "wgtest") + should.BeEqual(t, device.Type, wgtypes.LinuxKernel) + should.BeEqual(t, len(device.Peers), 2) + wg, err = Get("wgtest") + should.NotBeError(t, err) + should.BeEqual(t, wg.Name, "wgtest") + should.BeEqual(t, len(wg.Config.Peers), 2) + }) + // Peers + t.Run("addPeer", func(t *testing.T) { + wg, err := Get("wgtest") + should.NotBeError(t, err) + should.BeEqual(t, len(wg.Config.Peers), 2) + wg.AddPeer(newPeer) + err = wg.Apply() + should.NotBeError(t, err) + device, err := GetDevice("wgtest") + should.NotBeError(t, err) + should.BeEqual(t, len(device.Peers), 3) + }) + t.Run("replacePeer", func(t *testing.T) { + newPeer.Endpoint = &net.UDPAddr{ + IP: net.ParseIP("8.8.8.20"), + Port: 51821, + } + wg, err := Get("wgtest") + should.NotBeError(t, err) + wg.ReplacePeer(newPeer) + err = wg.Apply() + should.NotBeError(t, err) + device, err := GetDevice("wgtest") + should.NotBeError(t, err) + should.BeEqual(t, len(device.Peers), 3) + found := false + for _, peer := range wg.Config.Peers { + if peer.PublicKey == newPeer.PublicKey { + found = true + should.BeEqual(t, peer.Endpoint, newPeer.Endpoint) + } + } + should.BeTrue(t, found) + }) + t.Run("deletePeer", func(t *testing.T) { + wg, err := Get("wgtest") + should.NotBeError(t, err) + t.Log(key2.PublicKey()) + wg.DeletePeer(key2.PublicKey().String()) + err = wg.Apply() + should.NotBeError(t, err) + device, err := GetDevice("wgtest") + should.NotBeError(t, err) + should.BeEqual(t, len(device.Peers), 2) + }) + + // shutdown + t.Run("shutdown", func(t *testing.T) { + wg, err := Get("wgtest") + should.NotBeError(t, err) + err = wg.Down() + should.NotBeError(t, err) + }) +} + +func TestGet(t *testing.T) { + t.Run("noSuchDevice", func(t *testing.T) { + device, err := GetDevice("doesnotexist") + should.BeNil(t, device) + should.BeError(t, err) + }) + t.Run("noSuchInterface", func(t *testing.T) { + wg, err := Get("doesnotexist") + should.BeNil(t, wg) + should.BeError(t, err) + }) } From 9d5a4e5544a1c4d0fb528a2a0fde8af29262596f Mon Sep 17 00:00:00 2001 From: Matthew R Kasun Date: Wed, 7 Jan 2026 09:40:55 -0500 Subject: [PATCH 13/14] documentation updates --- .golangci.yml | 1 - README.md | 2 +- docs/agent.md | 16 ++++++++-------- docs/configuration.md | 27 ++++++++------------------- docs/install.md | 2 +- docs/screenshots/about.png | Bin 335106 -> 16602 bytes 6 files changed, 18 insertions(+), 30 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index ce519d8..c9e097f 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -19,7 +19,6 @@ linters: - noinlineerr - paralleltest - testpackage - - thelper - wrapcheck - wsl - wsl_v5 diff --git a/README.md b/README.md index e7bae57..9a7e2c2 100644 --- a/README.md +++ b/README.md @@ -54,7 +54,7 @@ Agent Tech Stack ========== * Language: [Go](https://go.dev) -* HTTP Framework: [Gin](https://github.com/gin-gonic/gin) +* HTTP Router: [devilcove/mux](https://github.com/devilcove/mux) * FrontEnd Framework: html/[htmx](https://htmx.org) * CSS Library: [w3schools](https://w3schools.com/w3css) * Database(key/value): [bbolt](https://github.com/etcd-io/bbolt) diff --git a/docs/agent.md b/docs/agent.md index e369708..fe5a2fc 100644 --- a/docs/agent.md +++ b/docs/agent.md @@ -25,8 +25,8 @@ Available Commands: version display version information Flags: - --config string config file (default is /etc/plexus/plexus-agent.yaml) -h, --help help for plexus-agent + -p, --natsport int nats port for cli <-> agent comms (default 4223) -v, --verbosity string logging verbosity (default "INFO") Use "plexus-agent [command] --help" for more information about a command. @@ -48,7 +48,7 @@ Flags: -h, --help help for register Global Flags: - --config string config file (default is /etc/plexus/plexus-agent.yaml) + -p, --natsport int nats port for cli <-> agent comms (default 4223) -v, --verbosity string logging verbosity (default "INFO") ``` @@ -65,7 +65,7 @@ Flags: -h, --help help for drop Global Flags: - --config string config file (default is /etc/plexus/plexus-agent.yaml) + -p, --natsport int nats port for cli <-> agent comms (default 4223) -v, --verbosity string logging verbosity (default "INFO") ``` @@ -82,7 +82,7 @@ Flags: -h, --help help for join Global Flags: - --config string config file (default is /etc/plexus/plexus-agent.yaml) + -p, --natsport int nats port for cli <-> agent comms (default 4223) -v, --verbosity string logging verbosity (default "INFO") ``` @@ -97,7 +97,7 @@ Flags: -h, --help help for leave Global Flags: - --config string config file (default is /etc/plexus/plexus-agent.yaml) + -p, --natsport int nats port for cli <-> agent comms (default 4223) -v, --verbosity string logging verbosity (default "INFO") Leave command deletes current network on peer ``` @@ -157,7 +157,7 @@ Flags: -h, --help help for reload Global Flags: - --config string config file (default is /etc/plexus/plexus-agent.yaml) + -p, --natsport int nats port for cli <-> agent comms (default 4223) -v, --verbosity string logging verbosity (default "INFO") ``` @@ -174,7 +174,7 @@ Flags: -h, --help help for reset Global Flags: - --config string config file (default is /etc/plexus/plexus-agent.yaml) + -p, --natsport int nats port for cli <-> agent comms (default 4223) -v, --verbosity string logging verbosity (default "INFO") ``` @@ -215,7 +215,7 @@ Flags: -h, --help help for loglevel Global Flags: - --config string config file (default is /etc/plexus/plexus-agent.yaml) + -p, --natsport int nats port for cli <-> agent comms (default 4223) -v, --verbosity string logging verbosity (default "INFO") ``` diff --git a/docs/configuration.md b/docs/configuration.md index 7ef2ade..2000eb8 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -1,27 +1,16 @@ Configuration ============= -Order of precedence -1. Environment variable with prefix of PLEXUS_ -2. Configuration variables in file /etc/plexus/config.yml -3. Default values Server ------ -| Variable | Env | Default | Usage | -| --- | ---- | ---- | --- | -| adminname | PLEXUS_ADMINNAME | admin | default admin username | -| adminpass | PLEXUS_ADMINPASS | password | password for default admin | -| verbosity | PLEXUS_VERBOSITY | info | level for logs | -| secure | PLEXUS_SECURE | true | use TLS for http and nats | -| port | PLEXUS_PORT | 8080 | web listen port when secure is false | -| email | PLEXUS_EMAIL | | email for use with Let's Encrypt | +| Variable | Default | Usage | +| --- | ---- | --- | +| adminname | admin | default admin username | +| adminpass | password | password for default admin | +| verbosity | info | level for logs | +| secure | true | use TLS for http and nats | +| port | | 8080 | web listen port when secure is false | +| email | | email for use with Let's Encrypt | * adminname/adminpass is only used to create a default user iff an admin user does not exist on server startup - -Agent ------ -| Variable | Env | Default | Usage | -| --- | ---- | ---- | --- | -| verbosity | PLEXUS_VERBOSITY | info | level for logs | -| natsport | PLEXUS_NATSPORT | 4223 | port for cli <-> agent nats comms | \ No newline at end of file diff --git a/docs/install.md b/docs/install.md index 6e80bc6..c8d289d 100644 --- a/docs/install.md +++ b/docs/install.md @@ -50,4 +50,4 @@ If the server is to be installed behind a reverse proxy or in a lan only setting * set secure = false * set port (default 8080) to desired listening port for web traffic * fqdn must be set (can be an IP address) such that all peers can resolve the address of the server -> setting fqdn to an IP address in not valid with secure=true. Let's Encrypt does not support certificates for [IP addresses](https://community.letsencrypt.org/t/ssl-on-a-ip-instead-of-domain/90635) +> setting fqdn to an IP address is not valid with secure=true. Let's Encrypt does not support certificates for [IP addresses](https://community.letsencrypt.org/t/ssl-on-a-ip-instead-of-domain/90635) diff --git a/docs/screenshots/about.png b/docs/screenshots/about.png index 94c75b961a6a6207083c356df7cb3112e190de93..3181560ef908e1db6c32f2e33546af0456c6739c 100644 GIT binary patch literal 16602 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%0Aq?(yd0VTIfB&4b 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�XmnHp?Bb%imU3o3?Pbv-r?GV$1Tgc74OkV{L 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�`cG?Z+cxM#`;14XM|^yI?8gqm@dQ=8 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 From 1b1e3b84b982d5124828ba833f3f40fc965e54bd Mon Sep 17 00:00:00 2001 From: Matthew R Kasun Date: Wed, 7 Jan 2026 09:51:54 -0500 Subject: [PATCH 14/14] update version for release --- app/plexus-agent/cmd/version.go | 2 +- internal/agent/config.go | 2 +- internal/server/config.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/plexus-agent/cmd/version.go b/app/plexus-agent/cmd/version.go index 7317b8d..8197dc8 100644 --- a/app/plexus-agent/cmd/version.go +++ b/app/plexus-agent/cmd/version.go @@ -26,7 +26,7 @@ import ( "github.com/spf13/cobra" ) -const version = "v0.3.0" +const version = "v0.4.0" // versionCmd represents the version command. var versionCmd = &cobra.Command{ diff --git a/internal/agent/config.go b/internal/agent/config.go index ac8f400..f9d7553 100644 --- a/internal/agent/config.go +++ b/internal/agent/config.go @@ -19,7 +19,7 @@ const ( connectivityTimeout = time.Minute * 3 endpointServerTimeout = time.Second * 30 networkNotMapped = "network not mapped to server" - version = "v0.3.0" + version = "v0.4.0" networkTable = "networks" deviceTable = "devices" ) diff --git a/internal/server/config.go b/internal/server/config.go index 781e530..f1997a6 100644 --- a/internal/server/config.go +++ b/internal/server/config.go @@ -46,7 +46,7 @@ var ( ErrSecureBlankFQDN = errors.New("secure server requires FQDN") ErrSecureWithIP = errors.New("cannot use IP address with secure") ErrInValidEmail = errors.New("valid email address required") - version = "v0.3.0" + version = "v0.4.0" ) const (