diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 8d9063c1..819c8328 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -3,7 +3,7 @@ "aaron-bond.better-comments", "dbaeumer.vscode-eslint", "antfu.goto-alias", - "esbenp.prettier-vscode", + "prettier.prettier-vscode", "yoavbls.pretty-ts-errors", "bradlc.vscode-tailwindcss", "vue.volar", diff --git a/.vscode/settings.json b/.vscode/settings.json index f62f2c98..791e9e0a 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,22 +1,22 @@ { "editor.tabSize": 2, "editor.useTabStops": false, - "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.defaultFormatter": "prettier.prettier-vscode", "editor.formatOnSave": true, "editor.codeActionsOnSave": { "source.fixAll.eslint": "always" }, "[vue]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" + "editor.defaultFormatter": "prettier.prettier-vscode" }, "[typescript]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" + "editor.defaultFormatter": "prettier.prettier-vscode" }, "[json]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" + "editor.defaultFormatter": "prettier.prettier-vscode" }, "[markdown]": { - "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.defaultFormatter": "prettier.prettier-vscode", "editor.tabSize": 4, "editor.useTabStops": false }, diff --git a/CHANGELOG.md b/CHANGELOG.md index d9964184..6233f326 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] -## Added +## [15.2.1] - 2026-01-14 + +### Fixed + +- Icon in Searchbar (https://github.com/wg-easy/wg-easy/commit/458f66818a400f181e2c6326ede077c8793d71f2) +- Interface save not working (https://github.com/wg-easy/wg-easy/commit/48f3fbd715a889e2425702a8a46332f2752aef91) +- Error Messages in Setup (https://github.com/wg-easy/wg-easy/commit/32a055093a76342c40858d8dcf563b0700a8bd48) + +## [15.2.0] - 2026-01-12 + +### Added - AmneziaWG integration (https://github.com/wg-easy/wg-easy/pull/2102, https://github.com/wg-easy/wg-easy/pull/2226) - Search / filter box (https://github.com/wg-easy/wg-easy/pull/2170) @@ -15,13 +25,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Show client endpoint (https://github.com/wg-easy/wg-easy/pull/2058) - Add option to view and copy config (https://github.com/wg-easy/wg-easy/pull/2289) -## Fixed +### Fixed - Fix download as conf.txt (https://github.com/wg-easy/wg-easy/pull/2269) - Clean filename for OTL download (https://github.com/wg-easy/wg-easy/pull/2253) - Text color in admin menu in light mode (https://github.com/wg-easy/wg-easy/pull/2307) -## Changed +### Changed - Allow lower MTU (https://github.com/wg-easy/wg-easy/pull/2228) - Use /32 and /128 for client Cidr (https://github.com/wg-easy/wg-easy/pull/2217) @@ -30,13 +40,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Allow empty DNS (https://github.com/wg-easy/wg-easy/pull/2052, https://github.com/wg-easy/wg-easy/pull/2057) - Don't include keys in API responses (https://github.com/wg-easy/wg-easy/pull/2015) - Try all QR ecc levels (https://github.com/wg-easy/wg-easy/pull/2288) -- Update OnetimeLink expiry on reuse (https://github.com/wg-easy/wg-easy/pull/2370) +- Update OneTimeLink expiry on reuse (https://github.com/wg-easy/wg-easy/pull/2370) - Removed ARMv7 support (https://github.com/wg-easy/wg-easy/pull/2369) -## Docs +### Docs - Add AdGuard Home (https://github.com/wg-easy/wg-easy/pull/2175) -- Add Routed (No NAT) docs (https://github.com/wg-easy/wg-easy/pull/2181) +- Add Routed (No NAT) docs (https://github.com/wg-easy/wg-easy/pull/2181, https://github.com/wg-easy/wg-easy/pull/2380) - Add AmneziaWG docs (https://github.com/wg-easy/wg-easy/pull/2108, https://github.com/wg-easy/wg-easy/pull/2292) ## [15.1.0] - 2025-07-01 diff --git a/assets/screenshot.png b/assets/screenshot.png index dd39f3ff..b55deb79 100644 Binary files a/assets/screenshot.png and b/assets/screenshot.png differ diff --git a/docs/content/examples/tutorials/routed.md b/docs/content/examples/tutorials/routed.md index b72eb647..3ed4070d 100644 --- a/docs/content/examples/tutorials/routed.md +++ b/docs/content/examples/tutorials/routed.md @@ -93,3 +93,19 @@ PostDown ```shell iptables -D INPUT -p udp -m udp --dport {{port}} -j ACCEPT; iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; ip6tables -D INPUT -p udp -m udp --dport {{port}} -j ACCEPT; ip6tables -D FORWARD -i wg0 -j ACCEPT; ip6tables -D FORWARD -o wg0 -j ACCEPT ``` + +/// warning | Important: When using nftables use the following hooks instead. + +PostUp + +```shell +nft add chain ip filter WG_EASY; nft add rule ip filter DOCKER-USER jump WG_EASY; nft add rule ip filter WG_EASY iifname {{device}} accept; nft add rule ip filter WG_EASY oifname {{device}} accept; nft add chain ip6 filter WG_EASY; nft add rule ip6 filter DOCKER-USER jump WG_EASY; nft add rule ip6 filter WG_EASY iifname {{device}} accept; nft add rule ip6 filter WG_EASY oifname {{device}} accept; +``` + +PostDown + +```shell +nft delete rule ip filter DOCKER-USER handle $(nft -a list chain ip filter DOCKER-USER | awk '/jump WG_EASY/ {print $NF}'); nft flush chain ip filter WG_EASY; nft delete chain ip filter WG_EASY; nft delete rule ip6 filter DOCKER-USER handle $(nft -a list chain ip6 filter DOCKER-USER | awk '/jump WG_EASY/ {print $NF}'); nft flush chain ip6 filter WG_EASY; nft delete chain ip6 filter WG_EASY +``` + +/// diff --git a/package.json b/package.json index b627497d..bfb10bcd 100644 --- a/package.json +++ b/package.json @@ -13,5 +13,5 @@ "devDependencies": { "prettier": "^3.7.4" }, - "packageManager": "pnpm@10.26.2" + "packageManager": "pnpm@10.28.0" } diff --git a/scripts/version.sh b/scripts/version.sh index ba6ee106..6d38b2e1 100644 --- a/scripts/version.sh +++ b/scripts/version.sh @@ -30,6 +30,7 @@ echo "Updated package.json to version $new_version" echo "----" echo "If you changed the major version, remember to update the docker-compose.yml file and docs (search for: ref: major version)" +echo "Make sure to stage any changes before proceeding (e.g. Changelog updates)." echo "----" echo "If you did everything press 'y' to commit the changes and create a new tag" diff --git a/src/app/components/Clients/Search.vue b/src/app/components/Clients/Search.vue index f55e8084..94ebbe46 100644 --- a/src/app/components/Clients/Search.vue +++ b/src/app/components/Clients/Search.vue @@ -1,14 +1,14 @@ + + diff --git a/src/app/middleware/auth.global.ts b/src/app/middleware/auth.global.ts index 70a37e86..06029fd6 100644 --- a/src/app/middleware/auth.global.ts +++ b/src/app/middleware/auth.global.ts @@ -4,25 +4,27 @@ export default defineNuxtRouteMiddleware(async (to) => { return; } + const event = useRequestEvent(); + const authStore = useAuthStore(); - const userData = await authStore.getSession(); + authStore.userData = await authStore.getSession(event); // skip login if already logged in if (to.path === '/login') { - if (userData?.username) { + if (authStore.userData?.username) { return navigateTo('/', { redirectCode: 302 }); } return; } // Require auth for every page other than Login - if (!userData?.username) { + if (!authStore.userData?.username) { return navigateTo('/login', { redirectCode: 302 }); } // Check for admin access if (to.path.startsWith('/admin')) { - if (!hasPermissions(userData, 'admin', 'any')) { + if (!hasPermissions(authStore.userData, 'admin', 'any')) { return abortNavigation('Not allowed to access Admin Panel'); } } diff --git a/src/app/pages/admin.vue b/src/app/pages/admin.vue index f4e70de7..48f30f21 100644 --- a/src/app/pages/admin.vue +++ b/src/app/pages/admin.vue @@ -38,9 +38,6 @@