Compare commits

...

62 Commits

Author SHA1 Message Date
Donald Zou b15bbce9bc Merge pull request #1173 from WGDashboard/v4.3.2-security-patch
v4.3.2 security patch
2026-03-29 14:31:34 +08:00
Donald Zou ddaada8e4f Updated version number 2026-03-29 14:30:24 +08:00
Donald Zou 920f832297 Fixed where /api/clients paths are bypassed
Instead of adding `/client` in the white list, we isolate it out to check if the path starts with `APP_PREFIX/client` so then client will bypassed but not `/api/clients`
2026-03-28 23:33:47 +08:00
Donald Zou 22df8a1b1f Removed fileDownload and replaced by using downloadWireguardConfigurationBackup 2026-03-28 23:17:39 +08:00
mahemium 468d1c7642 v4.3.1 bug fix (#1149)
* Fix bugs

* Fixes and improvements

* Update comment

* Reduce comment
2026-03-28 23:13:08 +08:00
dependabot[bot] 2cdc0265b8 build(deps): bump vue-router from 4.6.4 to 5.0.2 in /src/static/app (#1131)
Bumps [vue-router](https://github.com/vuejs/router) from 4.6.4 to 5.0.2.
- [Release notes](https://github.com/vuejs/router/releases)
- [Commits](https://github.com/vuejs/router/compare/v4.6.4...v5.0.2)

---
updated-dependencies:
- dependency-name: vue-router
  dependency-version: 5.0.2
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-12 09:41:14 +01:00
dependabot[bot] df295bf470 build(deps): bump cidr-tools from 11.0.6 to 11.0.8 in /src/static/app (#1132)
Bumps [cidr-tools](https://github.com/silverwind/cidr-tools) from 11.0.6 to 11.0.8.
- [Release notes](https://github.com/silverwind/cidr-tools/releases)
- [Commits](https://github.com/silverwind/cidr-tools/compare/11.0.6...11.0.8)

---
updated-dependencies:
- dependency-name: cidr-tools
  dependency-version: 11.0.8
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-12 09:23:38 +01:00
dependabot[bot] dfb75d77b8 build(deps): bump gunicorn from 25.0.1 to 25.0.3 in /src (#1133)
Bumps [gunicorn](https://github.com/benoitc/gunicorn) from 25.0.1 to 25.0.3.
- [Release notes](https://github.com/benoitc/gunicorn/releases)
- [Commits](https://github.com/benoitc/gunicorn/compare/25.0.1...25.0.3)

---
updated-dependencies:
- dependency-name: gunicorn
  dependency-version: 25.0.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-12 09:23:17 +01:00
dependabot[bot] 18ef023817 build(deps-dev): bump @vitejs/plugin-vue in /src/static/app (#1136)
Bumps [@vitejs/plugin-vue](https://github.com/vitejs/vite-plugin-vue/tree/HEAD/packages/plugin-vue) from 6.0.3 to 6.0.4.
- [Release notes](https://github.com/vitejs/vite-plugin-vue/releases)
- [Changelog](https://github.com/vitejs/vite-plugin-vue/blob/main/packages/plugin-vue/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite-plugin-vue/commits/plugin-vue@6.0.4/packages/plugin-vue)

---
updated-dependencies:
- dependency-name: "@vitejs/plugin-vue"
  dependency-version: 6.0.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-12 09:22:50 +01:00
dependabot[bot] 12da167b8c build(deps): bump is-cidr from 6.0.2 to 6.0.3 in /src/static/app (#1135)
Bumps [is-cidr](https://github.com/silverwind/is-cidr) from 6.0.2 to 6.0.3.
- [Release notes](https://github.com/silverwind/is-cidr/releases)
- [Commits](https://github.com/silverwind/is-cidr/compare/6.0.2...6.0.3)

---
updated-dependencies:
- dependency-name: is-cidr
  dependency-version: 6.0.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-12 09:22:29 +01:00
dependabot[bot] db78f42a04 build(deps): bump vue from 3.5.27 to 3.5.28 in /src/static/app (#1134)
Bumps [vue](https://github.com/vuejs/core) from 3.5.27 to 3.5.28.
- [Release notes](https://github.com/vuejs/core/releases)
- [Changelog](https://github.com/vuejs/core/blob/main/CHANGELOG.md)
- [Commits](https://github.com/vuejs/core/compare/v3.5.27...v3.5.28)

---
updated-dependencies:
- dependency-name: vue
  dependency-version: 3.5.28
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-12 09:22:18 +01:00
daanselen 78a7211680 chore: rename the debug workflow 2026-02-06 20:39:56 +01:00
daanselen 1bcb48a50e chore: make workflow trigger on dev branches 2026-02-06 20:39:54 +01:00
daanselen 2e01ecc455 fix: workflow triggering 2026-02-06 20:24:12 +01:00
daanselen ebd13b4df9 refac: workflow - also trigger on dev commits 2026-02-06 20:19:25 +01:00
Donald Zou e4d441388d Merge pull request #1127 from WGDashboard/change_issue_template
feat: change issue templating
2026-02-06 07:52:47 +08:00
V.Bantserov a8bf35b0c0 feat: Add Bulgarian (bg-BG) translation (#1128) 2026-02-05 23:23:53 +01:00
daanselen 6beda22f39 Merge remote-tracking branch 'origin/dependabot/npm_and_yarn/src/static/app/electron-builder-26.7.0' 2026-02-05 18:35:47 +01:00
daanselen 6b1d2b4b50 Merge remote-tracking branch 'origin/dependabot/npm_and_yarn/src/static/app/vueuse/core-14.2.0' 2026-02-05 18:33:55 +01:00
daanselen 3f23c0f949 Merge remote-tracking branch 'origin/dependabot/npm_and_yarn/src/static/app/volar/language-server-2.4.28' 2026-02-05 18:33:43 +01:00
daanselen abaaff809a Merge remote-tracking branch 'origin/dependabot/npm_and_yarn/src/static/app/cidr-tools-11.0.6' 2026-02-05 18:33:25 +01:00
daanselen eebb2e39cc feat: change issue templating 2026-02-05 18:26:57 +01:00
DaanSelen fd2daa2934 Merge remote-tracking branch 'origin/dependabot/pip/src/psutil-7.2.2' 2026-02-04 11:52:17 +01:00
dependabot[bot] cc253a6a11 build(deps): bump cidr-tools from 11.0.3 to 11.0.6 in /src/static/app
Bumps [cidr-tools](https://github.com/silverwind/cidr-tools) from 11.0.3 to 11.0.6.
- [Release notes](https://github.com/silverwind/cidr-tools/releases)
- [Commits](https://github.com/silverwind/cidr-tools/compare/11.0.3...11.0.6)

---
updated-dependencies:
- dependency-name: cidr-tools
  dependency-version: 11.0.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-03 02:21:56 +00:00
dependabot[bot] 06ce640f56 build(deps): bump @volar/language-server in /src/static/app
Bumps [@volar/language-server](https://github.com/volarjs/volar.js/tree/HEAD/packages/language-server) from 2.4.27 to 2.4.28.
- [Release notes](https://github.com/volarjs/volar.js/releases)
- [Changelog](https://github.com/volarjs/volar.js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/volarjs/volar.js/commits/v2.4.28/packages/language-server)

---
updated-dependencies:
- dependency-name: "@volar/language-server"
  dependency-version: 2.4.28
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-03 02:21:45 +00:00
dependabot[bot] 8c8746cb9b build(deps): bump @vueuse/core from 14.1.0 to 14.2.0 in /src/static/app
Bumps [@vueuse/core](https://github.com/vueuse/vueuse/tree/HEAD/packages/core) from 14.1.0 to 14.2.0.
- [Release notes](https://github.com/vueuse/vueuse/releases)
- [Commits](https://github.com/vueuse/vueuse/commits/v14.2.0/packages/core)

---
updated-dependencies:
- dependency-name: "@vueuse/core"
  dependency-version: 14.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-03 02:21:34 +00:00
dependabot[bot] 97d92d5310 build(deps): bump electron-builder in /src/static/app
Bumps [electron-builder](https://github.com/electron-userland/electron-builder/tree/HEAD/packages/electron-builder) from 26.5.0 to 26.7.0.
- [Release notes](https://github.com/electron-userland/electron-builder/releases)
- [Changelog](https://github.com/electron-userland/electron-builder/blob/master/packages/electron-builder/CHANGELOG.md)
- [Commits](https://github.com/electron-userland/electron-builder/commits/electron-builder@26.7.0/packages/electron-builder)

---
updated-dependencies:
- dependency-name: electron-builder
  dependency-version: 26.7.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-03 02:21:16 +00:00
dependabot[bot] a19ab85ba9 build(deps): bump gunicorn from 24.1.1 to 25.0.1 in /src
Bumps [gunicorn](https://github.com/benoitc/gunicorn) from 24.1.1 to 25.0.1.
- [Release notes](https://github.com/benoitc/gunicorn/releases)
- [Commits](https://github.com/benoitc/gunicorn/compare/24.1.1...25.0.1)

---
updated-dependencies:
- dependency-name: gunicorn
  dependency-version: 25.0.1
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-03 02:21:03 +00:00
dependabot[bot] 6705705e3d build(deps): bump psutil from 7.2.1 to 7.2.2 in /src
Bumps [psutil](https://github.com/giampaolo/psutil) from 7.2.1 to 7.2.2.
- [Changelog](https://github.com/giampaolo/psutil/blob/master/HISTORY.rst)
- [Commits](https://github.com/giampaolo/psutil/compare/release-7.2.1...release-7.2.2)

---
updated-dependencies:
- dependency-name: psutil
  dependency-version: 7.2.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-03 02:20:57 +00:00
dependabot[bot] 8f973021fc build(deps-dev): bump vite from 7.3.0 to 7.3.1 in /src/static/app (#1082)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 7.3.0 to 7.3.1.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v7.3.1/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v7.3.1/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 7.3.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-02 11:44:36 +01:00
dependabot[bot] 23256a873c build(deps): bump vue from 3.5.26 to 3.5.27 in /src/static/app (#1087)
Bumps [vue](https://github.com/vuejs/core) from 3.5.26 to 3.5.27.
- [Release notes](https://github.com/vuejs/core/releases)
- [Changelog](https://github.com/vuejs/core/blob/main/CHANGELOG.md)
- [Commits](https://github.com/vuejs/core/compare/v3.5.26...v3.5.27)

---
updated-dependencies:
- dependency-name: vue
  dependency-version: 3.5.27
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-02 11:44:24 +01:00
dependabot[bot] 20847a0954 build(deps): bump @vue/language-server in /src/static/app (#1100)
Bumps [@vue/language-server](https://github.com/vuejs/language-tools/tree/HEAD/packages/language-server) from 3.2.2 to 3.2.4.
- [Release notes](https://github.com/vuejs/language-tools/releases)
- [Changelog](https://github.com/vuejs/language-tools/blob/master/CHANGELOG.md)
- [Commits](https://github.com/vuejs/language-tools/commits/v3.2.4/packages/language-server)

---
updated-dependencies:
- dependency-name: "@vue/language-server"
  dependency-version: 3.2.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-02 11:44:10 +01:00
zombu4 0f98bb2537 Fix npm audit tar vulnerabilities (#1093)
* Harden npm deps via tar override

* chore: retrigger review

---------

Co-authored-by: Super User <root@vpn.northcaptiva.com>
2026-01-27 16:03:52 +01:00
dependabot[bot] d5026a4081 build(deps): bump sqlalchemy from 2.0.45 to 2.0.46 in /src (#1101)
Bumps [sqlalchemy](https://github.com/sqlalchemy/sqlalchemy) from 2.0.45 to 2.0.46.
- [Release notes](https://github.com/sqlalchemy/sqlalchemy/releases)
- [Changelog](https://github.com/sqlalchemy/sqlalchemy/blob/main/CHANGES.rst)
- [Commits](https://github.com/sqlalchemy/sqlalchemy/commits)

---
updated-dependencies:
- dependency-name: sqlalchemy
  dependency-version: 2.0.46
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-27 16:02:21 +01:00
dependabot[bot] aeed7cf322 build(deps): bump is-cidr from 6.0.1 to 6.0.2 in /src/static/app (#1102)
Bumps [is-cidr](https://github.com/silverwind/is-cidr) from 6.0.1 to 6.0.2.
- [Release notes](https://github.com/silverwind/is-cidr/releases)
- [Commits](https://github.com/silverwind/is-cidr/compare/6.0.1...6.0.2)

---
updated-dependencies:
- dependency-name: is-cidr
  dependency-version: 6.0.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-27 16:02:09 +01:00
dependabot[bot] 29ebe65587 build(deps): bump gunicorn from 23.0.0 to 24.1.1 in /src (#1103)
Bumps [gunicorn](https://github.com/benoitc/gunicorn) from 23.0.0 to 24.1.1.
- [Release notes](https://github.com/benoitc/gunicorn/releases)
- [Commits](https://github.com/benoitc/gunicorn/compare/23.0.0...24.1.1)

---
updated-dependencies:
- dependency-name: gunicorn
  dependency-version: 24.1.1
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-27 16:01:59 +01:00
dependabot[bot] ce553de03b build(deps): bump npm from 11.6.4 to 11.8.0 in /src/static/app (#1104)
Bumps [npm](https://github.com/npm/cli) from 11.6.4 to 11.8.0.
- [Release notes](https://github.com/npm/cli/releases)
- [Changelog](https://github.com/npm/cli/blob/latest/CHANGELOG.md)
- [Commits](https://github.com/npm/cli/compare/v11.6.4...v11.8.0)

---
updated-dependencies:
- dependency-name: npm
  dependency-version: 11.8.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-27 08:32:05 +01:00
DaanSelen 601ccb355d docs: correctly escape pipes 2026-01-09 15:52:20 +01:00
DaanSelen 2347c76812 chore: change docs 2026-01-09 15:48:52 +01:00
dependabot[bot] 9ffba5e33a build(deps): bump @volar/language-server in /src/static/app (#1066)
Bumps [@volar/language-server](https://github.com/volarjs/volar.js/tree/HEAD/packages/language-server) from 2.4.26 to 2.4.27.
- [Release notes](https://github.com/volarjs/volar.js/releases)
- [Changelog](https://github.com/volarjs/volar.js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/volarjs/volar.js/commits/v2.4.27/packages/language-server)

---
updated-dependencies:
- dependency-name: "@volar/language-server"
  dependency-version: 2.4.27
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-08 08:34:58 +01:00
dependabot[bot] 18018d3079 build(deps): bump electron-builder in /src/static/app (#1064)
Bumps [electron-builder](https://github.com/electron-userland/electron-builder/tree/HEAD/packages/electron-builder) from 26.0.12 to 26.4.0.
- [Release notes](https://github.com/electron-userland/electron-builder/releases)
- [Changelog](https://github.com/electron-userland/electron-builder/blob/master/packages/electron-builder/CHANGELOG.md)
- [Commits](https://github.com/electron-userland/electron-builder/commits/electron-builder@26.4.0/packages/electron-builder)

---
updated-dependencies:
- dependency-name: electron-builder
  dependency-version: 26.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-08 08:34:16 +01:00
dependabot[bot] 2b703d6ab8 build(deps-dev): bump @vitejs/plugin-vue in /src/static/app (#1067)
Bumps [@vitejs/plugin-vue](https://github.com/vitejs/vite-plugin-vue/tree/HEAD/packages/plugin-vue) from 6.0.1 to 6.0.3.
- [Release notes](https://github.com/vitejs/vite-plugin-vue/releases)
- [Changelog](https://github.com/vitejs/vite-plugin-vue/blob/main/packages/plugin-vue/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite-plugin-vue/commits/plugin-vue@6.0.3/packages/plugin-vue)

---
updated-dependencies:
- dependency-name: "@vitejs/plugin-vue"
  dependency-version: 6.0.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-07 23:40:40 +01:00
dependabot[bot] d506fdf2c1 build(deps): bump pinia from 3.0.3 to 3.0.4 in /src/static/app (#1065)
Bumps [pinia](https://github.com/vuejs/pinia) from 3.0.3 to 3.0.4.
- [Release notes](https://github.com/vuejs/pinia/releases)
- [Commits](https://github.com/vuejs/pinia/compare/v3.0.3...v3.0.4)

---
updated-dependencies:
- dependency-name: pinia
  dependency-version: 3.0.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-07 23:40:27 +01:00
dependabot[bot] e5dc6086fa build(deps): bump @vue/language-server in /src/static/app (#1063)
Bumps [@vue/language-server](https://github.com/vuejs/language-tools/tree/HEAD/packages/language-server) from 3.1.8 to 3.2.2.
- [Release notes](https://github.com/vuejs/language-tools/releases)
- [Changelog](https://github.com/vuejs/language-tools/blob/master/CHANGELOG.md)
- [Commits](https://github.com/vuejs/language-tools/commits/v3.2.2/packages/language-server)

---
updated-dependencies:
- dependency-name: "@vue/language-server"
  dependency-version: 3.2.2
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-07 23:40:09 +01:00
dependabot[bot] febc8818b0 build(deps): bump vue-chartjs from 5.3.2 to 5.3.3 in /src/static/app (#1041)
Bumps [vue-chartjs](https://github.com/apertureless/vue-chartjs) from 5.3.2 to 5.3.3.
- [Release notes](https://github.com/apertureless/vue-chartjs/releases)
- [Changelog](https://github.com/apertureless/vue-chartjs/blob/main/CHANGELOG.md)
- [Commits](https://github.com/apertureless/vue-chartjs/compare/v5.3.2...v5.3.3)

---
updated-dependencies:
- dependency-name: vue-chartjs
  dependency-version: 5.3.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-02 18:36:15 +01:00
dependabot[bot] 8b7d372dcb build(deps-dev): bump vite from 7.2.2 to 7.3.0 in /src/static/app (#1040)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 7.2.2 to 7.3.0.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v7.3.0/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v7.3.0/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 7.3.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-02 18:32:46 +01:00
dependabot[bot] 66dd5c4f9f build(deps): bump vue from 3.5.24 to 3.5.25 in /src/static/app (#1039)
Bumps [vue](https://github.com/vuejs/core) from 3.5.24 to 3.5.25.
- [Release notes](https://github.com/vuejs/core/releases)
- [Changelog](https://github.com/vuejs/core/blob/main/CHANGELOG.md)
- [Commits](https://github.com/vuejs/core/compare/v3.5.24...v3.5.25)

---
updated-dependencies:
- dependency-name: vue
  dependency-version: 3.5.25
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-02 18:32:26 +01:00
dependabot[bot] 682587183f build(deps): bump sqlalchemy-utils from 0.42.0 to 0.42.1 in /src (#1038)
Bumps [sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) from 0.42.0 to 0.42.1.
- [Release notes](https://github.com/kvesteri/sqlalchemy-utils/releases)
- [Changelog](https://github.com/kvesteri/sqlalchemy-utils/blob/master/CHANGES.rst)
- [Commits](https://github.com/kvesteri/sqlalchemy-utils/compare/0.42.0...0.42.1)

---
updated-dependencies:
- dependency-name: sqlalchemy-utils
  dependency-version: 0.42.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-02 18:32:09 +01:00
dependabot[bot] a3da48be8c build(deps): bump dayjs from 1.11.18 to 1.11.19 in /src/static/app (#1037)
Bumps [dayjs](https://github.com/iamkun/dayjs) from 1.11.18 to 1.11.19.
- [Release notes](https://github.com/iamkun/dayjs/releases)
- [Changelog](https://github.com/iamkun/dayjs/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/iamkun/dayjs/compare/v1.11.18...v1.11.19)

---
updated-dependencies:
- dependency-name: dayjs
  dependency-version: 1.11.19
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-02 18:29:56 +01:00
dependabot[bot] e398a07f32 build(deps): bump vue-router from 4.6.3 to 4.6.4 in /src/static/app (#1042)
Bumps [vue-router](https://github.com/vuejs/router) from 4.6.3 to 4.6.4.
- [Release notes](https://github.com/vuejs/router/releases)
- [Commits](https://github.com/vuejs/router/compare/v4.6.3...v4.6.4)

---
updated-dependencies:
- dependency-name: vue-router
  dependency-version: 4.6.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-02 18:29:25 +01:00
dependabot[bot] 0745d39a50 build(deps): bump psutil from 7.1.3 to 7.2.1 in /src (#1052)
Bumps [psutil](https://github.com/giampaolo/psutil) from 7.1.3 to 7.2.1.
- [Changelog](https://github.com/giampaolo/psutil/blob/master/HISTORY.rst)
- [Commits](https://github.com/giampaolo/psutil/compare/release-7.1.3...release-7.2.1)

---
updated-dependencies:
- dependency-name: psutil
  dependency-version: 7.2.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-02 18:29:11 +01:00
dependabot[bot] 87bdc5dde9 build(deps): bump flask-cors from 6.0.1 to 6.0.2 in /src (#1036)
Bumps [flask-cors](https://github.com/corydolphin/flask-cors) from 6.0.1 to 6.0.2.
- [Release notes](https://github.com/corydolphin/flask-cors/releases)
- [Changelog](https://github.com/corydolphin/flask-cors/blob/main/CHANGELOG.md)
- [Commits](https://github.com/corydolphin/flask-cors/compare/6.0.1...6.0.2)

---
updated-dependencies:
- dependency-name: flask-cors
  dependency-version: 6.0.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-02 18:28:51 +01:00
dependabot[bot] 126c200fa2 build(deps): bump sqlalchemy from 2.0.44 to 2.0.45 in /src (#1035)
Bumps [sqlalchemy](https://github.com/sqlalchemy/sqlalchemy) from 2.0.44 to 2.0.45.
- [Release notes](https://github.com/sqlalchemy/sqlalchemy/releases)
- [Changelog](https://github.com/sqlalchemy/sqlalchemy/blob/main/CHANGES.rst)
- [Commits](https://github.com/sqlalchemy/sqlalchemy/commits)

---
updated-dependencies:
- dependency-name: sqlalchemy
  dependency-version: 2.0.45
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-02 18:28:35 +01:00
Donald Zou 174fd527cc Update README.md 2025-12-28 17:14:45 +08:00
Donald Zou 92651729eb Update funding information in FUNDING.yml 2025-12-18 07:35:06 +08:00
Donald Zou d51c543346 Merge pull request #1045 from WGDashboard/DaanSelen-patch-1
chore: english refac
2025-12-17 07:36:35 +08:00
DaanSelen 3adca64624 Update README.md 2025-12-17 00:06:12 +01:00
daanselen 306e17eb4d refac: some exit logic 2025-12-14 20:56:18 +01:00
DaanSelen d75c7ad418 feat: add better docker stopping response (#1025) 2025-12-14 17:32:46 +01:00
Donald Zou 82e10659b6 Update Wakatime badge link in README.md 2025-12-14 00:28:24 +08:00
Donald Zou b6f25ac817 Include docker directory in workflow paths 2025-12-14 00:25:37 +08:00
Donald Zou 48481ab992 Implement path filter for Docker workflow triggers
Added a path filter to restrict Docker workflow triggers to changes in the 'src' directory.
2025-12-14 00:24:21 +08:00
68 changed files with 2412 additions and 1378 deletions
+2 -2
View File
@@ -1,4 +1,4 @@
# These are supported funding model platforms # These are supported funding model platforms
github: [donaldzou] github: [WGDashboard]
patreon: DonaldDonnyZou open_collective: wgdashboard
+18 -4
View File
@@ -1,6 +1,6 @@
--- ---
name: Bug report name: Bug report
about: Create a report to help us improve about: Create a report to help us improve the project!
title: '' title: ''
labels: bug labels: bug
assignees: '' assignees: ''
@@ -11,6 +11,7 @@ assignees: ''
A clear and concise description of what the bug is. A clear and concise description of what the bug is.
**Expected Error / Traceback** **Expected Error / Traceback**
``` ```
Please provide the error traceback here Please provide the error traceback here
``` ```
@@ -20,9 +21,22 @@ Please provide how you run the dashboard
**OS Information:** **OS Information:**
- OS: [e.g. Ubuntu 18.02] - OS: [e.g. Ubuntu 18.02]
- Python Version: [e.g v3.7] - Docker: [e.g. Yes or No]
- Python Version: [e.g v37]
**Docker Details**
If using docker, provide the following:
- Image used: [e.g. ghcr.io/wgdashboard/wgdashboard:latest]
- Compose: [e.g. Yes or No]
If Docker Compose is used:
```yaml
**Your Docker Compose**
```
**Sample of your `.conf` file** **Sample of your `.conf` file**
```
Please provide a sample of your configuration file that you are having problem with. You can replace your public key and private key to ABCD... ```ini
Please provide a sample of your configuration file that you are having problem with.
You should replace your public key and private key to ABCD...
``` ```
+14
View File
@@ -0,0 +1,14 @@
blank_issues_enabled: false
contact_links:
- name: WGDashboard Community Support (Github)
url: https://github.com/orgs/WGDashboard/discussions
about: Please ask and answer questions here.
- name: WGDashboard Community Support (Discord)
url: https://discord.gg/72TwzjeuWm
about: Discord Server about WGDashboard
- name: WGDashboard Issue reporting (Bugs and Feature Requests (FR))
url: https://github.com/WGDashboard/WGDashboard/issues
about: Please report bugs or feature requests here so they can be tracked
+8 -2
View File
@@ -1,6 +1,6 @@
--- ---
name: Feature request name: Feature Request (FR)
about: Suggest an idea for this project about: Suggest an idea to extend or improve the usage of the project
title: '' title: ''
labels: enhancement labels: enhancement
assignees: '' assignees: ''
@@ -10,5 +10,11 @@ assignees: ''
**Is your feature request related to a problem? Please describe.** **Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Related/Adjacent Issues**
Paste a Github link to possible issues that could be solved if they exist.
**What have you done yourself?**
What have you already tried to do or considered to fix this issue?
**Describe the solution you'd like** **Describe the solution you'd like**
A clear and concise description of what you want to happen. A clear and concise description of what you want to happen.
+4 -4
View File
@@ -1,4 +1,4 @@
name: MANUAL Docker workflow for debugging name: Clone of Docker Build and Push
on: on:
workflow_dispatch: workflow_dispatch:
@@ -9,7 +9,7 @@ env:
DOCKER_IMAGE: WGDashboard DOCKER_IMAGE: WGDashboard
jobs: jobs:
docker_build: docker_build_debug:
runs-on: ubuntu-latest runs-on: ubuntu-latest
permissions: permissions:
contents: read contents: read
@@ -64,10 +64,10 @@ jobs:
labels: ${{ steps.meta.outputs.labels }} labels: ${{ steps.meta.outputs.labels }}
platforms: linux/amd64 platforms: linux/amd64
docker_scan: docker_scan_debug:
if: ${{ github.event_name != 'pull_request' }} if: ${{ github.event_name != 'pull_request' }}
runs-on: ubuntu-latest runs-on: ubuntu-latest
needs: docker_build needs: docker_build_debug
steps: steps:
- name: Log in to Docker Hub - name: Log in to Docker Hub
uses: docker/login-action@v3 uses: docker/login-action@v3
+4
View File
@@ -5,8 +5,12 @@ on:
push: push:
branches: branches:
- 'main' - 'main'
- '**dev'
tags: tags:
- '*' - '*'
paths:
- 'src/**'
- 'docker/**'
release: release:
types: [ published ] types: [ published ]
+5 -5
View File
@@ -20,7 +20,7 @@
<p align="center"> <p align="center">
<a href="https://github.com/WGDashboard/WGDashboard/releases/latest"><img src="https://img.shields.io/github/v/release/donaldzou/wireguard-dashboard?style=for-the-badge"></a> <a href="https://github.com/WGDashboard/WGDashboard/releases/latest"><img src="https://img.shields.io/github/v/release/donaldzou/wireguard-dashboard?style=for-the-badge"></a>
<a href="https://wakatime.com/badge/github/donaldzou/WGDashboard"><img src="https://wakatime.com/badge/github/donaldzou/WGDashboard.svg?style=for-the-badge" alt="wakatime"></a> <a href="https://wakatime.com/badge/github/donaldzou/WGDashboard"><img src="https://wakatime.com/badge/user/45f53c7c-9da9-4cb0-85d6-17bd38cc748b/project/5334ae20-e9a6-4c55-9fea-52d4eb9dfba6.svg?style=for-the-badge" alt="wakatime"></a>
<a href="https://hitscounter.dev"><img src="https://hitscounter.dev/api/hit?url=https%3A%2F%2Fgithub.com%2Fdonaldzou%2FWGDashboard&label=Visitor&icon=github&color=%230a58ca&style=for-the-badge"></a> <a href="https://hitscounter.dev"><img src="https://hitscounter.dev/api/hit?url=https%3A%2F%2Fgithub.com%2Fdonaldzou%2FWGDashboard&label=Visitor&icon=github&color=%230a58ca&style=for-the-badge"></a>
<img src="https://img.shields.io/docker/pulls/donaldzou/wgdashboard?logo=docker&label=Docker%20Image%20Pulls&labelColor=ffffff&style=for-the-badge"> <img src="https://img.shields.io/docker/pulls/donaldzou/wgdashboard?logo=docker&label=Docker%20Image%20Pulls&labelColor=ffffff&style=for-the-badge">
<img src="https://github.com/WGDashboard/WGDashboard/actions/workflows/docker.yml/badge.svg?style=for-the-badge"> <img src="https://github.com/WGDashboard/WGDashboard/actions/workflows/docker.yml/badge.svg?style=for-the-badge">
@@ -32,10 +32,10 @@
<img src="https://opensource.nyc3.cdn.digitaloceanspaces.com/attribution/assets/SVG/DO_Logo_horizontal_blue.svg" width="201px"> <img src="https://opensource.nyc3.cdn.digitaloceanspaces.com/attribution/assets/SVG/DO_Logo_horizontal_blue.svg" width="201px">
</a> </a>
</p> </p>
<p align="center">Monitoring WireGuard is not convenient, in most case, you'll need to login to your server and type <code>wg show</code>. That's why this project is being created, to view and manage all WireGuard configurations in a easy way.</p> <p align="center">Monitoring WireGuard is not convenient, in most case, you'll need to login to your server and type <code>wg show</code>. That's why this project is being created, to view and manage all WireGuard configurations in an easy way.</p>
<p align="center">With all these awesome features, while keeping it <b>easy to install and use</b></p> <p align="center">Though all these awesome features are present, we are still striving to make it <b>easy to install and use</b></p>
<p align="center"><b><i>This project is not affiliate to the official WireGuard Project</i></b></p> <p align="center"><b><i>This project is not affiliated to the official WireGuard Project</i></b></p>
<h3 align="center">Looking for help or want to chat about this project?</h4> <h3 align="center">Looking for help or want to chat about this project?</h4>
<p align="center"> <p align="center">
@@ -51,7 +51,7 @@
You can support via <br> You can support via <br>
</p> </p>
<p align="center"> <p align="center">
<a align="center" href="https://github.com/sponsors/donaldzou" target="_blank"><img src="https://img.shields.io/badge/GitHub%20Sponsor-2e9a40?style=for-the-badge&logo=github"></a> <a align="center" href="https://github.com/sponsors/WGDashboard" target="_blank"><img src="https://img.shields.io/badge/GitHub%20Sponsor-2e9a40?style=for-the-badge&logo=github"></a>
<a align="center" href="https://buymeacoffee.com/donaldzou" target="_blank"><img src="https://img.shields.io/badge/Buy%20me%20a%20coffee-ffdd00?style=for-the-badge&logo=buymeacoffee&logoColor=000000"></a> <a align="center" href="https://buymeacoffee.com/donaldzou" target="_blank"><img src="https://img.shields.io/badge/Buy%20me%20a%20coffee-ffdd00?style=for-the-badge&logo=buymeacoffee&logoColor=000000"></a>
<a align="center" href="https://patreon.com/c/DonaldDonnyZou/membership" target="_blank"><img src="https://img.shields.io/badge/Patreon-000000?style=for-the-badge&logo=patreon&logoColor=ffffff"></a> <a align="center" href="https://patreon.com/c/DonaldDonnyZou/membership" target="_blank"><img src="https://img.shields.io/badge/Patreon-000000?style=for-the-badge&logo=patreon&logoColor=ffffff"></a>
</p> </p>
+3 -4
View File
@@ -55,7 +55,7 @@ docker run -d \
--- ---
### 📦 Docker Compose Alternative ### 📦 Docker Compose Alternative (see the [compose file](./compose.yaml))
You can also use Docker Compose for easier configuration: You can also use Docker Compose for easier configuration:
@@ -65,7 +65,6 @@ services:
image: ghcr.io/wgdashboard/wgdashboard:latest image: ghcr.io/wgdashboard/wgdashboard:latest
restart: unless-stopped restart: unless-stopped
container_name: wgdashboard container_name: wgdashboard
ports: ports:
- 10086:10086/tcp - 10086:10086/tcp
- 51820:51820/udp - 51820:51820/udp
@@ -97,7 +96,7 @@ Updating the WGDashboard container should be through 'The Docker Way' - by pulli
## ⚙️ Environment Variables ## ⚙️ Environment Variables
| Variable | Accepted Values | Default | Example | Description | | Variable | Accepted Values | Default | Example | Description |
| ------------------ | ---------------------------------------- | ----------------------- | --------------------- | ----------------------------------------------------------------------- | | ------------------ | ---------------------------------------- | ----------------------- | ------------------------ | ----------------------------------------------------------------------- |
| `tz` | Timezone | `Europe/Amsterdam` | `America/New_York` | Sets the container's timezone. Useful for accurate logs and scheduling. | | `tz` | Timezone | `Europe/Amsterdam` | `America/New_York` | Sets the container's timezone. Useful for accurate logs and scheduling. |
| `global_dns` | IPv4 and IPv6 addresses | `9.9.9.9` | `8.8.8.8`, `1.1.1.1` | Default DNS for WireGuard clients. | | `global_dns` | IPv4 and IPv6 addresses | `9.9.9.9` | `8.8.8.8`, `1.1.1.1` | Default DNS for WireGuard clients. |
| `public_ip` | Public IP address | Retrieved automatically | `253.162.134.73` | Used to generate accurate client configs. Needed if container is NATd. | | `public_ip` | Public IP address | Retrieved automatically | `253.162.134.73` | Used to generate accurate client configs. Needed if container is NATd. |
@@ -105,7 +104,7 @@ Updating the WGDashboard container should be through 'The Docker Way' - by pulli
| `username` | Any nonempty string | `-` | `admin` | Username for the WGDashboard web interface account. | | `username` | Any nonempty string | `-` | `admin` | Username for the WGDashboard web interface account. |
| `password` | Any nonempty string | `-` | `s3cr3tP@ss` | Password for the WGDashboard web interface account (stored hashed). | | `password` | Any nonempty string | `-` | `s3cr3tP@ss` | Password for the WGDashboard web interface account (stored hashed). |
| `enable_totp` | `true`, `false` | `true` | `false` | Enable TOTPbased twofactor authentication for the account. | | `enable_totp` | `true`, `false` | `true` | `false` | Enable TOTPbased twofactor authentication for the account. |
| `wg_autostart` | Wireguard interface name | `false` | `true` | Autostart the WireGuard client when the container launches. | | `wg_autostart` | Wireguard interface name | `-` | `wg0` or `wg0\|\|wg1\|\|wg2` | Autostart the WireGuard interface when the container launches. |
| `email_server` | SMTP server address | `-` | `smtp.gmail.com` | SMTP server for sending email notifications. | | `email_server` | SMTP server address | `-` | `smtp.gmail.com` | SMTP server for sending email notifications. |
| `email_port` | SMTP port number | `-` | `587` | Port for connecting to the SMTP server. | | `email_port` | SMTP port number | `-` | `587` | Port for connecting to the SMTP server. |
| `email_encryption` | `TLS`, `SSL`, etc. | `-` | `TLS` | Encryption method for email communication. | | `email_encryption` | `TLS`, `SSL`, etc. | `-` | `TLS` | Encryption method for email communication. |
+34 -10
View File
@@ -1,6 +1,7 @@
#!/bin/bash #!/bin/bash
config_file="/data/wg-dashboard.ini" config_file="/data/wg-dashboard.ini"
runtime_pid=""
trap 'stop_service' SIGTERM trap 'stop_service' SIGTERM
@@ -52,7 +53,31 @@ set_ini() {
stop_service() { stop_service() {
echo "[WGDashboard] Stopping WGDashboard..." echo "[WGDashboard] Stopping WGDashboard..."
/bin/bash ./wgd.sh stop
local max_rounds="10"
local round="0"
local runtime_pid=""
while true; do
round=$((round + 1))
if [[ -f ${WGDASH}/src/gunicorn.pid ]]; then
runtime_pid=$(cat ${WGDASH}/src/gunicorn.pid)
echo "Running as PID: ${runtime_pid}"
return 0
fi
if [[ $round -eq $max_rounds ]]; then
echo "Reached breaking point!"
return 1
fi
sleep 0.5s
done
kill $runtime_pid
exit 0 exit 0
} }
@@ -192,9 +217,10 @@ start_and_monitor() {
[[ ! -d ${WGDASH}/src/log ]] && mkdir ${WGDASH}/src/log [[ ! -d ${WGDASH}/src/log ]] && mkdir ${WGDASH}/src/log
[[ ! -d ${WGDASH}/src/download ]] && mkdir ${WGDASH}/src/download [[ ! -d ${WGDASH}/src/download ]] && mkdir ${WGDASH}/src/download
${WGDASH}/src/venv/bin/gunicorn --config ${WGDASH}/src/gunicorn.conf.py ${WGDASH}/src/venv/bin/gunicorn --config ${WGDASH}/src/gunicorn.conf.py
resolvconf -u /usr/sbin/resolvconf -u
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
echo "Loading WGDashboard failed... Look above for details." echo "Loading WGDashboard failed... Look above for details."
@@ -203,13 +229,14 @@ start_and_monitor() {
# Wait a second before continuing, to give the python program some time to get ready. # Wait a second before continuing, to give the python program some time to get ready.
echo -e "\nEnsuring container continuation." echo -e "\nEnsuring container continuation."
max_rounds="10" local max_rounds="10"
round="0" local round="0"
# Hang in there for 10s for Gunicorn to get ready # Hang in there for 10s for Gunicorn to get ready
while true; do while true; do
round=$((round + 1)) round=$((round + 1))
latest_error=$(ls -t ${WGDASH}/src/log/error_*.log 2> /dev/null | head -n 1)
local latest_error=$(ls -t ${WGDASH}/src/log/error_*.log 2> /dev/null | head -n 1)
if [[ $round -eq $max_rounds ]]; then if [[ $round -eq $max_rounds ]]; then
echo "Reached breaking point!" echo "Reached breaking point!"
@@ -235,13 +262,10 @@ start_and_monitor() {
else else
tail -f "$latest_error" & tail -f "$latest_error" &
wait $! tail_pid=$!
wait $tail_pid
fi fi
echo "The blocking command has been broken! Script will exit in 3 minutes... Investigate!"
sleep 180s
exit 1
} }
# Main execution flow # Main execution flow
+27 -25
View File
@@ -246,17 +246,26 @@ def auth_req():
DashboardConfig.APIAccessed = True DashboardConfig.APIAccessed = True
else: else:
DashboardConfig.APIAccessed = False DashboardConfig.APIAccessed = False
appPrefix = APP_PREFIX if len(APP_PREFIX) > 0 else ''
whiteList = [ whiteList = [
'/static/', 'validateAuthentication', 'authenticate', 'getDashboardConfiguration', # f'/static/',
'getDashboardTheme', 'getDashboardVersion', 'sharePeer/get', 'isTotpEnabled', 'locale', f'{appPrefix}/api/validateAuthentication',
'/fileDownload', f'{appPrefix}/api/authenticate',
'/client' # f'{appPrefix}/api/getDashboardConfiguration',
f'{appPrefix}/api/getDashboardTheme',
f'{appPrefix}/api/getDashboardVersion',
f'{appPrefix}/api/sharePeer/get',
f'{appPrefix}/api/isTotpEnabled',
f'{appPrefix}/api/locale',
] ]
if (("username" not in session or session.get("role") != "admin")
and (f"{(APP_PREFIX if len(APP_PREFIX) > 0 else '')}/" != request.path if (
and f"{(APP_PREFIX if len(APP_PREFIX) > 0 else '')}" != request.path) ("username" not in session or session.get("role") != "admin")
and len(list(filter(lambda x : x not in request.path, whiteList))) == len(whiteList) and (f"{appPrefix}/" != request.path and f"{appPrefix}" != request.path)
and not request.path.startswith(f'{appPrefix}/client')
and not request.path.startswith(f'{appPrefix}/static')
and request.path not in whiteList
): ):
response = Flask.make_response(app, { response = Flask.make_response(app, {
"status": False, "status": False,
@@ -601,12 +610,19 @@ def API_deleteWireguardConfigurationBackup():
@app.get(f'{APP_PREFIX}/api/downloadWireguardConfigurationBackup') @app.get(f'{APP_PREFIX}/api/downloadWireguardConfigurationBackup')
def API_downloadWireguardConfigurationBackup(): def API_downloadWireguardConfigurationBackup():
configurationName = request.args.get('configurationName') configurationName = os.path.basename(request.args.get('configurationName'))
backupFileName = request.args.get('backupFileName') backupFileName = os.path.basename(request.args.get('backupFileName'))
if configurationName is None or configurationName not in WireguardConfigurations.keys(): if configurationName is None or configurationName not in WireguardConfigurations.keys():
return ResponseObject(False, "Configuration does not exist", status_code=404) return ResponseObject(False, "Configuration does not exist", status_code=404)
status, zip = WireguardConfigurations[configurationName].downloadBackup(backupFileName) status, zip = WireguardConfigurations[configurationName].downloadBackup(backupFileName)
return ResponseObject(status, data=zip, status_code=(200 if status else 404))
if not status:
current_app.logger.error(f"Failed to download a requested backup.\nConfiguration Name: {configurationName}\nBackup File Name: {backupFileName}")
return ResponseObject(False, "Internal server error", status_code=500)
return send_file(os.path.join('download', zip), as_attachment=True)
@app.post(f'{APP_PREFIX}/api/restoreWireguardConfigurationBackup') @app.post(f'{APP_PREFIX}/api/restoreWireguardConfigurationBackup')
def API_restoreWireguardConfigurationBackup(): def API_restoreWireguardConfigurationBackup():
@@ -1207,20 +1223,6 @@ def API_getPeerScheduleJobLogs(configName):
requestAll = True requestAll = True
return ResponseObject(data=AllPeerJobs.getPeerJobLogs(configName)) return ResponseObject(data=AllPeerJobs.getPeerJobLogs(configName))
'''
File Download
'''
@app.get(f'{APP_PREFIX}/fileDownload')
def API_download():
file = request.args.get('file')
if file is None or len(file) == 0:
return ResponseObject(False, "Please specify a file")
if os.path.exists(os.path.join('download', file)):
return send_file(os.path.join('download', file), as_attachment=True)
else:
return ResponseObject(False, "File does not exist")
''' '''
Tools Tools
''' '''
+1 -1
View File
@@ -16,7 +16,7 @@ from .DashboardAPIKey import DashboardAPIKey
class DashboardConfig: class DashboardConfig:
DashboardVersion = 'v4.3.1' DashboardVersion = 'v4.3.2'
ConfigurationPath = os.getenv('CONFIGURATION_PATH', '.') ConfigurationPath = os.getenv('CONFIGURATION_PATH', '.')
ConfigurationFilePath = os.path.join(ConfigurationPath, 'wg-dashboard.ini') ConfigurationFilePath = os.path.join(ConfigurationPath, 'wg-dashboard.ini')
+5 -5
View File
@@ -1,15 +1,15 @@
bcrypt==5.0.0 bcrypt==5.0.0
ifcfg==0.24 ifcfg==0.24
psutil==7.1.3 psutil==7.2.2
pyotp==2.9.0 pyotp==2.9.0
Flask==3.1.2 Flask==3.1.2
flask-cors==6.0.1 flask-cors==6.0.2
icmplib==3.0.4 icmplib==3.0.4
gunicorn==23.0.0 gunicorn==25.0.3
requests==2.32.5 requests==2.32.5
tcconfig==0.30.1 tcconfig==0.30.1
sqlalchemy==2.0.44 sqlalchemy==2.0.46
sqlalchemy_utils==0.42.0 sqlalchemy_utils==0.42.1
psycopg[binary]==3.3.2 psycopg[binary]==3.3.2
PyMySQL==1.1.2 PyMySQL==1.1.2
tzlocal==5.3.1 tzlocal==5.3.1
+1747 -1219
View File
File diff suppressed because it is too large Load Diff
+18 -15
View File
@@ -1,6 +1,6 @@
{ {
"name": "app", "name": "app",
"version": "4.3.1", "version": "4.3.2",
"private": true, "private": true,
"type": "module", "type": "module",
"module": "es2022", "module": "es2022",
@@ -12,35 +12,38 @@
"preview": "vite preview" "preview": "vite preview"
}, },
"dependencies": { "dependencies": {
"@volar/language-server": "2.4.26", "@volar/language-server": "2.4.28",
"@vue/language-server": "3.1.8", "@vue/language-server": "3.2.4",
"@vuepic/vue-datepicker": "^12.1.0", "@vuepic/vue-datepicker": "^12.1.0",
"@vueuse/core": "^14.0.0", "@vueuse/core": "^14.2.0",
"@vueuse/shared": "^14.1.0", "@vueuse/shared": "^14.1.0",
"animate.css": "^4.1.1", "animate.css": "^4.1.1",
"bootstrap": "^5.3.2", "bootstrap": "^5.3.2",
"bootstrap-icons": "^1.11.3", "bootstrap-icons": "^1.11.3",
"cidr-tools": "^11.0.3", "cidr-tools": "^11.0.8",
"css-color-converter": "^2.0.0", "css-color-converter": "^2.0.0",
"dayjs": "^1.11.12", "dayjs": "^1.11.19",
"electron-builder": "^26.0.12", "electron-builder": "^26.7.0",
"fuse.js": "^7.0.0", "fuse.js": "^7.0.0",
"i": "^0.3.7", "i": "^0.3.7",
"is-cidr": "^6.0.1", "is-cidr": "^6.0.3",
"npm": "^11.6.4", "npm": "^11.8.0",
"ol": "^10.7.0", "ol": "^10.7.0",
"pinia": "^3.0.3", "pinia": "^3.0.4",
"pinia-plugin-persistedstate": "^4.7.1", "pinia-plugin-persistedstate": "^4.7.1",
"qrcode": "^1.5.3", "qrcode": "^1.5.3",
"qrcodejs": "^1.0.0", "qrcodejs": "^1.0.0",
"simple-code-editor": "^2.0.9", "simple-code-editor": "^2.0.9",
"uuid": "^13.0.0", "uuid": "^13.0.0",
"vue": "^3.5.24", "vue": "^3.5.28",
"vue-chartjs": "^5.3.0", "vue-chartjs": "^5.3.3",
"vue-router": "^4.6.3" "vue-router": "^5.0.2"
}, },
"devDependencies": { "devDependencies": {
"@vitejs/plugin-vue": "^6.0.0", "@vitejs/plugin-vue": "^6.0.4",
"vite": "^7.2.2" "vite": "^7.3.1"
},
"overrides": {
"tar": "^7.5.6"
} }
} }
@@ -46,14 +46,7 @@ const restoreBackup = () => {
} }
const downloadBackup = () => { const downloadBackup = () => {
fetchGet("/api/downloadWireguardConfigurationBackup", { window.location.href = getUrl(`/api/downloadWireguardConfigurationBackup?configurationName=${route.params.id}&backupFileName=${props.b.filename}`);
configurationName: route.params.id,
backupFileName: props.b.filename
}, (res) => {
if (res.status){
window.open(getUrl(`/fileDownload?file=${res.data}`), '_blank')
}
})
} }
const delaySeconds = computed(() => { const delaySeconds = computed(() => {
@@ -1 +1 @@
import{a5 as A,r as n,D as S,g as l,z as v}from"./index-DYYtDSji.js";const b=A("DashboardClientAssignmentStore",()=>{const f=n({}),d=n([]),o=n({}),c=n([]),g=n(!1),r=n(""),i=S(),w=async()=>{await l("/api/clients/allClients",{},s=>{o.value=s.data})},y=async()=>{await l("/api/clients/allClientsRaw",{},s=>{c.value=s.data,console.log(c.value)})},m=s=>Object.values(o.value).flat().find(e=>e.ClientID===s),u=async(s,e)=>{await l("/api/clients/assignedClients",{ConfigurationName:s,Peer:e},a=>{d.value=a.data})};return{assignments:d,getAssignedClients:u,getClients:w,getClientsRaw:y,clients:o,unassignClient:async(s,e,a)=>{g.value=!0,await v("/api/clients/unassignClient",{AssignmentID:a},async t=>{t.status?(i.newMessage("Server","Unassign successfully!","success"),s&&e&&await u(s,e)):(i.newMessage("Server","Unassign Failed. Reason: "+t.message,"success"),console.error("Unassign Failed. Reason: "+t.message)),g.value=!1})},assignClient:async(s,e,a,t=!0)=>{r.value=a,await v("/api/clients/assignClient",{ConfigurationName:s,Peer:e,ClientID:a},async C=>{C.status?(i.newMessage("Server","Assign successfully!","success"),t&&await u(s,e)):(i.newMessage("Server","Assign Failed. Reason: "+C.message,"success"),console.error("Assign Failed. Reason: "+C.message)),r.value=""})},getClientById:m,unassigning:g,assigning:r,clientsRaw:c,allConfigurationsPeers:f,getAllConfigurationsPeers:async()=>{await l("/api/clients/allConfigurationsPeers",{},s=>{f.value=s.data})}}});export{b as D}; import{a5 as A,r as n,D as S,g as l,z as v}from"./index-CmClDcBF.js";const b=A("DashboardClientAssignmentStore",()=>{const f=n({}),d=n([]),o=n({}),c=n([]),g=n(!1),r=n(""),i=S(),w=async()=>{await l("/api/clients/allClients",{},s=>{o.value=s.data})},y=async()=>{await l("/api/clients/allClientsRaw",{},s=>{c.value=s.data,console.log(c.value)})},m=s=>Object.values(o.value).flat().find(e=>e.ClientID===s),u=async(s,e)=>{await l("/api/clients/assignedClients",{ConfigurationName:s,Peer:e},a=>{d.value=a.data})};return{assignments:d,getAssignedClients:u,getClients:w,getClientsRaw:y,clients:o,unassignClient:async(s,e,a)=>{g.value=!0,await v("/api/clients/unassignClient",{AssignmentID:a},async t=>{t.status?(i.newMessage("Server","Unassign successfully!","success"),s&&e&&await u(s,e)):(i.newMessage("Server","Unassign Failed. Reason: "+t.message,"success"),console.error("Unassign Failed. Reason: "+t.message)),g.value=!1})},assignClient:async(s,e,a,t=!0)=>{r.value=a,await v("/api/clients/assignClient",{ConfigurationName:s,Peer:e,ClientID:a},async C=>{C.status?(i.newMessage("Server","Assign successfully!","success"),t&&await u(s,e)):(i.newMessage("Server","Assign Failed. Reason: "+C.message,"success"),console.error("Assign Failed. Reason: "+C.message)),r.value=""})},getClientById:m,unassigning:g,assigning:r,clientsRaw:c,allConfigurationsPeers:f,getAllConfigurationsPeers:async()=>{await l("/api/clients/allConfigurationsPeers",{},s=>{f.value=s.data})}}});export{b as D};
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
import{_ as r,c as i,b as o,w as e,k as l,j as a,l as _,S as u,h as d,f as t}from"./index-DYYtDSji.js";const m={name:"configuration"},f={class:"mt-md-5 mt-3 text-body"};function p(h,k,x,w,$,v){const n=d("RouterView");return t(),i("div",f,[o(n,null,{default:e(({Component:s,route:c})=>[o(l,{name:"fade2",mode:"out-in"},{default:e(()=>[(t(),a(u,null,{default:e(()=>[(t(),a(_(s),{key:c.path,class:"z-1"}))]),_:2},1024))]),_:2},1024)]),_:1})])}const B=r(m,[["render",p]]);export{B as default}; import{_ as r,c as i,b as o,w as e,k as l,j as a,l as _,S as u,h as d,f as t}from"./index-CmClDcBF.js";const m={name:"configuration"},f={class:"mt-md-5 mt-3 text-body"};function p(h,k,x,w,$,v){const n=d("RouterView");return t(),i("div",f,[o(n,null,{default:e(({Component:s,route:c})=>[o(l,{name:"fade2",mode:"out-in"},{default:e(()=>[(t(),a(u,null,{default:e(()=>[(t(),a(_(s),{key:c.path,class:"z-1"}))]),_:2},1024))]),_:2},1024)]),_:1})])}const B=r(m,[["render",p]]);export{B as default};
@@ -1 +1 @@
import{_ as f,c as i,a as t,b as u,h as w,d as k,m as x,y,n as p,t as v,z as _,D as m,W as b,A as S,f as n,r as D,q as $,F as W,i as V}from"./index-DYYtDSji.js";import{L as C}from"./localeText-Cd7vLnRM.js";const F={name:"dashboardSettingsInputWireguardConfigurationPath",components:{LocaleText:C},props:{targetData:String,title:String,warning:!1,warningText:""},setup(){const o=m(),s=b(),r=`input_${S()}`;return{store:o,uuid:r,WireguardConfigurationStore:s}},data(){return{value:"",invalidFeedback:"",showInvalidFeedback:!1,isValid:!1,timeout:void 0,changed:!1,updating:!1}},mounted(){this.value=this.store.Configuration.Server[this.targetData]},methods:{async useValidation(){this.changed&&(this.updating=!0,await _("/api/updateDashboardConfigurationItem",{section:"Server",key:this.targetData,value:this.value},o=>{o.status?(this.isValid=!0,this.showInvalidFeedback=!1,this.store.Configuration.Account[this.targetData]=this.value,clearTimeout(this.timeout),this.timeout=setTimeout(()=>this.isValid=!1,5e3),this.WireguardConfigurationStore.getConfigurations(),this.store.newMessage("Server","WireGuard configuration path saved","success")):(this.isValid=!1,this.showInvalidFeedback=!0,this.invalidFeedback=o.message),this.changed=!1,this.updating=!1}))}}},I={class:"card"},T={class:"card-header"},A={class:"my-2"},L={class:"card-body"},M={class:"form-group"},N=["for"],P={class:"d-flex gap-2 align-items-start"},B={class:"flex-grow-1"},G=["id","disabled"],z={class:"invalid-feedback fw-bold"},U=["disabled"],q={key:0,class:"bi bi-save2-fill"},E={key:1,class:"spinner-border spinner-border-sm"},K={key:0,class:"px-2 py-1 text-warning-emphasis bg-warning-subtle border border-warning-subtle rounded-2 d-inline-block mt-1 mb-2"};function j(o,s,r,a,c,g){const d=w("LocaleText");return n(),i("div",I,[t("div",T,[t("h6",A,[u(d,{t:"Path"})])]),t("div",L,[t("div",M,[t("label",{for:this.uuid,class:"text-muted mb-1"},[t("strong",null,[t("small",null,[u(d,{t:this.title},null,8,["t"])])])],8,N),t("div",P,[t("div",B,[x(t("input",{type:"text",class:p(["form-control rounded-3",{"is-invalid":this.showInvalidFeedback,"is-valid":this.isValid}]),id:this.uuid,"onUpdate:modelValue":s[0]||(s[0]=e=>this.value=e),onKeydown:s[1]||(s[1]=e=>this.changed=!0),disabled:this.updating},null,42,G),[[y,this.value]]),t("div",z,v(this.invalidFeedback),1)]),t("button",{onClick:s[2]||(s[2]=e=>this.useValidation()),disabled:!this.changed,class:"ms-auto btn rounded-3 border-success-subtle bg-success-subtle text-success-emphasis"},[this.updating?(n(),i("span",E)):(n(),i("i",q))],8,U)]),r.warning?(n(),i("div",K,[t("small",null,[s[3]||(s[3]=t("i",{class:"bi bi-exclamation-triangle-fill me-2"},null,-1)),u(d,{t:r.warningText},null,8,["t"])])])):k("",!0)])])])}const et=f(F,[["render",j]]),H={class:"card rounded-3"},J={class:"card-header"},O={class:"my-2"},Q={class:"card-body d-flex gap-2"},R={class:"list-group w-100"},X=["onClick"],Y={__name:"dashboardSettingsWireguardConfigurationAutostart",setup(o){const s=m(),r=b(),a=D(s.Configuration.WireGuardConfiguration.autostart),c=$(()=>r.Configurations.map(e=>e.Name)),g=async()=>{await _("/api/updateDashboardConfigurationItem",{section:"WireGuardConfiguration",key:"autostart",value:a.value},async e=>{e.status?(s.newMessage("Server","Start up configurations saved","success"),a.value=e.data):s.newMessage("Server","Start up configurations failed to save","danger")})},d=e=>{a.value.includes(e)?a.value=a.value.filter(h=>h!==e):a.value.push(e),g()};return(e,h)=>(n(),i("div",H,[t("div",J,[t("h6",O,[u(C,{t:"Toggle When Start Up"})])]),t("div",Q,[t("div",R,[(n(!0),i(W,null,V(c.value,l=>(n(),i("button",{type:"button",key:l,onClick:Z=>d(l),class:"list-group-item list-group-item-action py-2 w-100 d-flex align-items-center"},[t("samp",null,v(l),1),t("i",{class:p(["ms-auto",[a.value.includes(l)?"bi-check-circle-fill":"bi-circle"]])},null,2)],8,X))),128))])])]))}},at=f(Y,[["__scopeId","data-v-4aa2aed9"]]);export{et as D,at as a}; import{_ as f,c as i,a as t,b as u,h as w,d as k,m as x,y,n as p,t as v,z as _,D as m,W as b,A as S,f as n,r as D,q as $,F as W,i as V}from"./index-CmClDcBF.js";import{L as C}from"./localeText-TzABauzQ.js";const F={name:"dashboardSettingsInputWireguardConfigurationPath",components:{LocaleText:C},props:{targetData:String,title:String,warning:!1,warningText:""},setup(){const o=m(),s=b(),r=`input_${S()}`;return{store:o,uuid:r,WireguardConfigurationStore:s}},data(){return{value:"",invalidFeedback:"",showInvalidFeedback:!1,isValid:!1,timeout:void 0,changed:!1,updating:!1}},mounted(){this.value=this.store.Configuration.Server[this.targetData]},methods:{async useValidation(){this.changed&&(this.updating=!0,await _("/api/updateDashboardConfigurationItem",{section:"Server",key:this.targetData,value:this.value},o=>{o.status?(this.isValid=!0,this.showInvalidFeedback=!1,this.store.Configuration.Account[this.targetData]=this.value,clearTimeout(this.timeout),this.timeout=setTimeout(()=>this.isValid=!1,5e3),this.WireguardConfigurationStore.getConfigurations(),this.store.newMessage("Server","WireGuard configuration path saved","success")):(this.isValid=!1,this.showInvalidFeedback=!0,this.invalidFeedback=o.message),this.changed=!1,this.updating=!1}))}}},I={class:"card"},T={class:"card-header"},A={class:"my-2"},L={class:"card-body"},M={class:"form-group"},N=["for"],P={class:"d-flex gap-2 align-items-start"},B={class:"flex-grow-1"},G=["id","disabled"],z={class:"invalid-feedback fw-bold"},U=["disabled"],q={key:0,class:"bi bi-save2-fill"},E={key:1,class:"spinner-border spinner-border-sm"},K={key:0,class:"px-2 py-1 text-warning-emphasis bg-warning-subtle border border-warning-subtle rounded-2 d-inline-block mt-1 mb-2"};function j(o,s,r,a,c,g){const d=w("LocaleText");return n(),i("div",I,[t("div",T,[t("h6",A,[u(d,{t:"Path"})])]),t("div",L,[t("div",M,[t("label",{for:this.uuid,class:"text-muted mb-1"},[t("strong",null,[t("small",null,[u(d,{t:this.title},null,8,["t"])])])],8,N),t("div",P,[t("div",B,[x(t("input",{type:"text",class:p(["form-control rounded-3",{"is-invalid":this.showInvalidFeedback,"is-valid":this.isValid}]),id:this.uuid,"onUpdate:modelValue":s[0]||(s[0]=e=>this.value=e),onKeydown:s[1]||(s[1]=e=>this.changed=!0),disabled:this.updating},null,42,G),[[y,this.value]]),t("div",z,v(this.invalidFeedback),1)]),t("button",{onClick:s[2]||(s[2]=e=>this.useValidation()),disabled:!this.changed,class:"ms-auto btn rounded-3 border-success-subtle bg-success-subtle text-success-emphasis"},[this.updating?(n(),i("span",E)):(n(),i("i",q))],8,U)]),r.warning?(n(),i("div",K,[t("small",null,[s[3]||(s[3]=t("i",{class:"bi bi-exclamation-triangle-fill me-2"},null,-1)),u(d,{t:r.warningText},null,8,["t"])])])):k("",!0)])])])}const et=f(F,[["render",j]]),H={class:"card rounded-3"},J={class:"card-header"},O={class:"my-2"},Q={class:"card-body d-flex gap-2"},R={class:"list-group w-100"},X=["onClick"],Y={__name:"dashboardSettingsWireguardConfigurationAutostart",setup(o){const s=m(),r=b(),a=D(s.Configuration.WireGuardConfiguration.autostart),c=$(()=>r.Configurations.map(e=>e.Name)),g=async()=>{await _("/api/updateDashboardConfigurationItem",{section:"WireGuardConfiguration",key:"autostart",value:a.value},async e=>{e.status?(s.newMessage("Server","Start up configurations saved","success"),a.value=e.data):s.newMessage("Server","Start up configurations failed to save","danger")})},d=e=>{a.value.includes(e)?a.value=a.value.filter(h=>h!==e):a.value.push(e),g()};return(e,h)=>(n(),i("div",H,[t("div",J,[t("h6",O,[u(C,{t:"Toggle When Start Up"})])]),t("div",Q,[t("div",R,[(n(!0),i(W,null,V(c.value,l=>(n(),i("button",{type:"button",key:l,onClick:Z=>d(l),class:"list-group-item list-group-item-action py-2 w-100 d-flex align-items-center"},[t("samp",null,v(l),1),t("i",{class:p(["ms-auto",[a.value.includes(l)?"bi-check-circle-fill":"bi-circle"]])},null,2)],8,X))),128))])])]))}},at=f(Y,[["__scopeId","data-v-4aa2aed9"]]);export{et as D,at as a};
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
import{I as j,q as w,P as S,J as k,Q as L,u as R}from"./index-DYYtDSji.js";const W=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const X=Object.prototype.toString,Y=t=>X.call(t)==="[object Object]",$=()=>{};function C(t){return Array.isArray(t)?t:[t]}function q(t,a,r){return j(t,a,{...r,immediate:!0})}const I=W?window:void 0;function P(t){var a;const r=S(t);return(a=r?.$el)!==null&&a!==void 0?a:r}function T(...t){const a=(o,u,s,d)=>(o.addEventListener(u,s,d),()=>o.removeEventListener(u,s,d)),r=w(()=>{const o=C(S(t[0])).filter(u=>u!=null);return o.every(u=>typeof u!="string")?o:void 0});return q(()=>{var o,u;return[(o=(u=r.value)===null||u===void 0?void 0:u.map(s=>P(s)))!==null&&o!==void 0?o:[I].filter(s=>s!=null),C(S(r.value?t[1]:t[0])),C(R(r.value?t[2]:t[1])),S(r.value?t[3]:t[2])]},([o,u,s,d],p,c)=>{if(!o?.length||!u?.length||!s?.length)return;const f=Y(d)?{...d}:d,v=o.flatMap(b=>u.flatMap(h=>s.map(y=>a(b,h,y,f))));c(()=>{v.forEach(b=>b())})},{flush:"post"})}function B(t,a,r={}){const{window:o=I,ignore:u=[],capture:s=!0,detectIframe:d=!1,controls:p=!1}=r;if(!o)return p?{stop:$,cancel:$,trigger:$}:$;let c=!0;const f=e=>S(u).some(n=>{if(typeof n=="string")return Array.from(o.document.querySelectorAll(n)).some(i=>i===e.target||e.composedPath().includes(i));{const i=P(n);return i&&(e.target===i||e.composedPath().includes(i))}});function v(e){const n=S(e);return n&&n.$.subTree.shapeFlag===16}function b(e,n){const i=S(e),m=i.$.subTree&&i.$.subTree.children;return m==null||!Array.isArray(m)?!1:m.some(A=>A.el===n.target||n.composedPath().includes(A.el))}const h=e=>{const n=P(t);if(e.target!=null&&!(!(n instanceof Element)&&v(t)&&b(t,e))&&!(!n||n===e.target||e.composedPath().includes(n))){if("detail"in e&&e.detail===0&&(c=!f(e)),!c){c=!0;return}a(e)}};let y=!1;const E=[T(o,"click",e=>{y||(y=!0,setTimeout(()=>{y=!1},0),h(e))},{passive:!0,capture:s}),T(o,"pointerdown",e=>{const n=P(t);c=!f(e)&&!!(n&&!e.composedPath().includes(n))},{passive:!0}),d&&T(o,"blur",e=>{setTimeout(()=>{var n;const i=P(t);((n=o.document.activeElement)===null||n===void 0?void 0:n.tagName)==="IFRAME"&&!i?.contains(o.document.activeElement)&&a(e)},0)},{passive:!0})].filter(Boolean),x=()=>E.forEach(e=>e());return p?{stop:x,cancel:()=>{c=!1},trigger:e=>{c=!0,h(e),c=!1}}:x}function D(t,a={}){const{threshold:r=50,onSwipe:o,onSwipeEnd:u,onSwipeStart:s,passive:d=!0}=a,p=k({x:0,y:0}),c=k({x:0,y:0}),f=w(()=>p.x-c.x),v=w(()=>p.y-c.y),{max:b,abs:h}=Math,y=w(()=>b(h(f.value),h(v.value))>=r),E=L(!1),x=w(()=>y.value?h(f.value)>h(v.value)?f.value>0?"left":"right":v.value>0?"up":"down":"none"),e=l=>[l.touches[0].clientX,l.touches[0].clientY],n=(l,g)=>{p.x=l,p.y=g},i=(l,g)=>{c.x=l,c.y=g},m={passive:d,capture:!d},A=l=>{E.value&&u?.(l,x.value),E.value=!1},O=[T(t,"touchstart",l=>{if(l.touches.length!==1)return;const[g,M]=e(l);n(g,M),i(g,M),s?.(l)},m),T(t,"touchmove",l=>{if(l.touches.length!==1)return;const[g,M]=e(l);i(g,M),m.capture&&!m.passive&&Math.abs(f.value)>Math.abs(v.value)&&l.preventDefault(),!E.value&&y.value&&(E.value=!0),E.value&&o?.(l)},m),T(t,["touchend","touchcancel"],A,m)];return{isSwiping:E,direction:x,coordsStart:p,coordsEnd:c,lengthX:f,lengthY:v,stop:()=>O.forEach(l=>l())}}export{D as a,B as o,P as u}; import{I as j,q as w,P as S,J as k,Q as L,u as R}from"./index-CmClDcBF.js";const W=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const X=Object.prototype.toString,Y=t=>X.call(t)==="[object Object]",$=()=>{};function C(t){return Array.isArray(t)?t:[t]}function q(t,a,r){return j(t,a,{...r,immediate:!0})}const I=W?window:void 0;function P(t){var a;const r=S(t);return(a=r?.$el)!==null&&a!==void 0?a:r}function T(...t){const a=(o,u,s,d)=>(o.addEventListener(u,s,d),()=>o.removeEventListener(u,s,d)),r=w(()=>{const o=C(S(t[0])).filter(u=>u!=null);return o.every(u=>typeof u!="string")?o:void 0});return q(()=>{var o,u;return[(o=(u=r.value)===null||u===void 0?void 0:u.map(s=>P(s)))!==null&&o!==void 0?o:[I].filter(s=>s!=null),C(S(r.value?t[1]:t[0])),C(R(r.value?t[2]:t[1])),S(r.value?t[3]:t[2])]},([o,u,s,d],p,c)=>{if(!o?.length||!u?.length||!s?.length)return;const f=Y(d)?{...d}:d,v=o.flatMap(b=>u.flatMap(h=>s.map(y=>a(b,h,y,f))));c(()=>{v.forEach(b=>b())})},{flush:"post"})}function B(t,a,r={}){const{window:o=I,ignore:u=[],capture:s=!0,detectIframe:d=!1,controls:p=!1}=r;if(!o)return p?{stop:$,cancel:$,trigger:$}:$;let c=!0;const f=e=>S(u).some(n=>{if(typeof n=="string")return Array.from(o.document.querySelectorAll(n)).some(i=>i===e.target||e.composedPath().includes(i));{const i=P(n);return i&&(e.target===i||e.composedPath().includes(i))}});function v(e){const n=S(e);return n&&n.$.subTree.shapeFlag===16}function b(e,n){const i=S(e),m=i.$.subTree&&i.$.subTree.children;return m==null||!Array.isArray(m)?!1:m.some(A=>A.el===n.target||n.composedPath().includes(A.el))}const h=e=>{const n=P(t);if(e.target!=null&&!(!(n instanceof Element)&&v(t)&&b(t,e))&&!(!n||n===e.target||e.composedPath().includes(n))){if("detail"in e&&e.detail===0&&(c=!f(e)),!c){c=!0;return}a(e)}};let y=!1;const E=[T(o,"click",e=>{y||(y=!0,setTimeout(()=>{y=!1},0),h(e))},{passive:!0,capture:s}),T(o,"pointerdown",e=>{const n=P(t);c=!f(e)&&!!(n&&!e.composedPath().includes(n))},{passive:!0}),d&&T(o,"blur",e=>{setTimeout(()=>{var n;const i=P(t);((n=o.document.activeElement)===null||n===void 0?void 0:n.tagName)==="IFRAME"&&!i?.contains(o.document.activeElement)&&a(e)},0)},{passive:!0})].filter(Boolean),x=()=>E.forEach(e=>e());return p?{stop:x,cancel:()=>{c=!1},trigger:e=>{c=!0,h(e),c=!1}}:x}function D(t,a={}){const{threshold:r=50,onSwipe:o,onSwipeEnd:u,onSwipeStart:s,passive:d=!0}=a,p=k({x:0,y:0}),c=k({x:0,y:0}),f=w(()=>p.x-c.x),v=w(()=>p.y-c.y),{max:b,abs:h}=Math,y=w(()=>b(h(f.value),h(v.value))>=r),E=L(!1),x=w(()=>y.value?h(f.value)>h(v.value)?f.value>0?"left":"right":v.value>0?"up":"down":"none"),e=l=>[l.touches[0].clientX,l.touches[0].clientY],n=(l,g)=>{p.x=l,p.y=g},i=(l,g)=>{c.x=l,c.y=g},m={passive:d,capture:!d},A=l=>{E.value&&u?.(l,x.value),E.value=!1},O=[T(t,"touchstart",l=>{if(l.touches.length!==1)return;const[g,M]=e(l);n(g,M),i(g,M),s?.(l)},m),T(t,"touchmove",l=>{if(l.touches.length!==1)return;const[g,M]=e(l);i(g,M),m.capture&&!m.passive&&Math.abs(f.value)>Math.abs(v.value)&&l.preventDefault(),!E.value&&y.value&&(E.value=!0),E.value&&o?.(l)},m),T(t,["touchend","touchcancel"],A,m)];return{isSwiping:E,direction:x,coordsStart:p,coordsEnd:c,lengthX:f,lengthY:v,stop:()=>O.forEach(l=>l())}}export{D as a,B as o,P as u};
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
import{_ as e,G as t,c as o,t as a,f as c}from"./index-DYYtDSji.js";const s={name:"localeText",props:{t:""},computed:{getLocaleText(){return t(this.t)}}};function n(r,p,l,_,i,x){return c(),o("span",null,a(this.getLocaleText),1)}const m=e(s,[["render",n]]);export{m as L}; import{_ as e,G as t,c as o,t as a,f as c}from"./index-CmClDcBF.js";const s={name:"localeText",props:{t:""},computed:{getLocaleText(){return t(this.t)}}};function n(r,p,l,_,i,x){return c(),o("span",null,a(this.getLocaleText),1)}const m=e(s,[["render",n]]);export{m as L};
@@ -1 +1 @@
import{L as l}from"./localeText-Cd7vLnRM.js";import{d as c}from"./dayjs.min-WRW_FTL4.js";import{_ as h,c as o,a as e,b as a,w as u,e as p,h as g,t as i,k as f,n as _,f as n}from"./index-DYYtDSji.js";const x={name:"message",methods:{dayjs:c,hide(){this.ct(),this.message.show=!1},show(){this.timeout=setTimeout(()=>{this.message.show=!1},5e3)},ct(){clearTimeout(this.timeout)}},components:{LocaleText:l},props:{message:Object},mounted(){this.show()},data(){return{dismiss:!1,timeout:null}}},v=["id"],b={key:0,class:"d-flex"},w={class:"fw-bold d-block",style:{"text-transform":"uppercase"}},y={class:"ms-auto"},k={key:1},T={class:"card-body d-flex align-items-center gap-3"};function M(C,s,L,j,t,m){const d=g("LocaleText");return n(),o("div",{onMouseenter:s[1]||(s[1]=r=>{t.dismiss=!0,this.ct()}),onMouseleave:s[2]||(s[2]=r=>{t.dismiss=!1,this.show()}),class:"card shadow rounded-3 position-relative message ms-auto",id:this.message.id},[e("div",{class:_([{"text-bg-danger":this.message.type==="danger","text-bg-success":this.message.type==="success","text-bg-warning":this.message.type==="warning"},"card-header pos"])},[a(f,{name:"zoom",mode:"out-in"},{default:u(()=>[t.dismiss?(n(),o("div",k,[e("small",{onClick:s[0]||(s[0]=r=>m.hide()),class:"d-block mx-auto w-100 text-center",style:{cursor:"pointer"}},[s[3]||(s[3]=e("i",{class:"bi bi-x-lg me-2"},null,-1)),a(d,{t:"Dismiss"})])])):(n(),o("div",b,[e("small",w,[a(d,{t:"FROM "}),p(" "+i(this.message.from),1)]),e("small",y,i(m.dayjs().format("hh:mm A")),1)]))]),_:1})],2),e("div",T,[e("div",null,i(this.message.content),1)])],40,v)}const z=h(x,[["render",M],["__scopeId","data-v-94c76b54"]]);export{z as M}; import{L as l}from"./localeText-TzABauzQ.js";import{d as c}from"./dayjs.min-DFlK6ZAc.js";import{_ as h,c as o,a as e,b as a,w as u,e as p,h as g,t as i,k as f,n as _,f as n}from"./index-CmClDcBF.js";const x={name:"message",methods:{dayjs:c,hide(){this.ct(),this.message.show=!1},show(){this.timeout=setTimeout(()=>{this.message.show=!1},5e3)},ct(){clearTimeout(this.timeout)}},components:{LocaleText:l},props:{message:Object},mounted(){this.show()},data(){return{dismiss:!1,timeout:null}}},v=["id"],b={key:0,class:"d-flex"},w={class:"fw-bold d-block",style:{"text-transform":"uppercase"}},y={class:"ms-auto"},k={key:1},T={class:"card-body d-flex align-items-center gap-3"};function M(C,s,L,j,t,m){const d=g("LocaleText");return n(),o("div",{onMouseenter:s[1]||(s[1]=r=>{t.dismiss=!0,this.ct()}),onMouseleave:s[2]||(s[2]=r=>{t.dismiss=!1,this.show()}),class:"card shadow rounded-3 position-relative message ms-auto",id:this.message.id},[e("div",{class:_([{"text-bg-danger":this.message.type==="danger","text-bg-success":this.message.type==="success","text-bg-warning":this.message.type==="warning"},"card-header pos"])},[a(f,{name:"zoom",mode:"out-in"},{default:u(()=>[t.dismiss?(n(),o("div",k,[e("small",{onClick:s[0]||(s[0]=r=>m.hide()),class:"d-block mx-auto w-100 text-center",style:{cursor:"pointer"}},[s[3]||(s[3]=e("i",{class:"bi bi-x-lg me-2"},null,-1)),a(d,{t:"Dismiss"})])])):(n(),o("div",b,[e("small",w,[a(d,{t:"FROM "}),p(" "+i(this.message.from),1)]),e("small",y,i(m.dayjs().format("hh:mm A")),1)]))]),_:1})],2),e("div",T,[e("div",null,i(this.message.content),1)])],40,v)}const z=h(x,[["render",M],["__scopeId","data-v-94c76b54"]]);export{z as M};
@@ -1 +1 @@
import{S as C,e as y,c as w,m as _,a as L,f as S,l as v,i as M,b as k,d as x,g as A,h as F,j as R,M as D,V as P,T as b,k as l,O as E,n as O,F as h,P as f,o as T,p as c,C as V,q as u,r as X}from"./Vector-CuSZivra.js";import{_ as Y,D as G,c as $,d as j,f as q}from"./index-DYYtDSji.js";class r extends C{constructor(t,e){super(),this.flatMidpoint_=null,this.flatMidpointRevision_=-1,this.maxDelta_=-1,this.maxDeltaRevision_=-1,e!==void 0&&!Array.isArray(t[0])?this.setFlatCoordinates(e,t):this.setCoordinates(t,e)}appendCoordinate(t){y(this.flatCoordinates,t),this.changed()}clone(){const t=new r(this.flatCoordinates.slice(),this.layout);return t.applyProperties(this),t}closestPointXY(t,e,o,n){return n<w(this.getExtent(),t,e)?n:(this.maxDeltaRevision_!=this.getRevision()&&(this.maxDelta_=Math.sqrt(_(this.flatCoordinates,0,this.flatCoordinates.length,this.stride,0)),this.maxDeltaRevision_=this.getRevision()),L(this.flatCoordinates,0,this.flatCoordinates.length,this.stride,this.maxDelta_,!1,t,e,o,n))}forEachSegment(t){return S(this.flatCoordinates,0,this.flatCoordinates.length,this.stride,t)}getCoordinateAtM(t,e){return this.layout!="XYM"&&this.layout!="XYZM"?null:(e=e!==void 0?e:!1,v(this.flatCoordinates,0,this.flatCoordinates.length,this.stride,t,e))}getCoordinates(){return M(this.flatCoordinates,0,this.flatCoordinates.length,this.stride)}getCoordinateAt(t,e){return k(this.flatCoordinates,0,this.flatCoordinates.length,this.stride,t,e,this.stride)}getLength(){return x(this.flatCoordinates,0,this.flatCoordinates.length,this.stride)}getFlatMidpoint(){return this.flatMidpointRevision_!=this.getRevision()&&(this.flatMidpoint_=this.getCoordinateAt(.5,this.flatMidpoint_??void 0),this.flatMidpointRevision_=this.getRevision()),this.flatMidpoint_}getSimplifiedGeometryInternal(t){const e=[];return e.length=A(this.flatCoordinates,0,this.flatCoordinates.length,this.stride,t,e,0),new r(e,"XY")}getType(){return"LineString"}intersectsExtent(t){return F(this.flatCoordinates,0,this.flatCoordinates.length,this.stride,t,this.getExtent())}setCoordinates(t,e){this.setLayout(e,t,1),this.flatCoordinates||(this.flatCoordinates=[]),this.flatCoordinates.length=R(this.flatCoordinates,0,t,this.stride),this.changed()}}const B={name:"osmap",props:{type:"",d:Object||Array},data(){return{osmAvailable:!0}},setup(){return{store:G()}},methods:{getLastLonLat(){if(this.type==="traceroute"){const i=this.d.findLast(t=>t.geo&&t.geo.lat&&t.geo.lon);return i?[i.geo.lon,i.geo.lat]:[0,0]}return[this.d.geo.lon,this.d.geo.lat]}},async mounted(){await fetch("https://tile.openstreetmap.org/",{signal:AbortSignal.timeout(1500)}).then(i=>{const t=new D({target:"map",layers:[new b({source:new E})],view:new P({center:l(this.getLastLonLat()),zoom:this.type==="traceroute"?3:10})}),e=[],o=new O;if(this.type==="traceroute")this.d.forEach(s=>{if(s.geo&&s.geo.lat&&s.geo.lon){const a=l([s.geo.lon,s.geo.lat]);e.push(a);const g=this.getLastLonLat(),m=new h({geometry:new f(a),last:s.geo.lon===g[0]&&s.geo.lat===g[1]});o.addFeature(m)}});else{const s=l([this.d.geo.lon,this.d.geo.lat]);e.push(s);const a=new h({geometry:new f(s)});o.addFeature(a)}const n=new r(e),d=new h({geometry:n});o.addFeature(d);const p=new T({source:o,style:function(s){if(s.getGeometry().getType()==="Point")return new c({image:new V({radius:10,fill:new X({color:s.get("last")?"#dc3545":"#0d6efd"}),stroke:new u({color:"white",width:5})})});if(s.getGeometry().getType()==="LineString")return new c({stroke:new u({color:"#0d6efd",width:2})})}});t.addLayer(p)}).catch(i=>{this.osmAvailable=!1})}},z={key:0,id:"map",class:"w-100 rounded-3"};function I(i,t,e,o,n,d){return this.osmAvailable?(q(),$("div",z)):j("",!0)}const H=Y(B,[["render",I]]);export{H as O}; import{S as C,e as y,c as w,m as _,a as L,f as S,l as v,i as M,b as k,d as x,g as A,h as F,j as R,M as D,V as P,T as b,k as l,O as E,n as O,F as h,P as f,o as T,p as c,C as V,q as u,r as X}from"./Vector-CuSZivra.js";import{_ as Y,D as G,c as $,d as j,f as q}from"./index-CmClDcBF.js";class r extends C{constructor(t,e){super(),this.flatMidpoint_=null,this.flatMidpointRevision_=-1,this.maxDelta_=-1,this.maxDeltaRevision_=-1,e!==void 0&&!Array.isArray(t[0])?this.setFlatCoordinates(e,t):this.setCoordinates(t,e)}appendCoordinate(t){y(this.flatCoordinates,t),this.changed()}clone(){const t=new r(this.flatCoordinates.slice(),this.layout);return t.applyProperties(this),t}closestPointXY(t,e,o,n){return n<w(this.getExtent(),t,e)?n:(this.maxDeltaRevision_!=this.getRevision()&&(this.maxDelta_=Math.sqrt(_(this.flatCoordinates,0,this.flatCoordinates.length,this.stride,0)),this.maxDeltaRevision_=this.getRevision()),L(this.flatCoordinates,0,this.flatCoordinates.length,this.stride,this.maxDelta_,!1,t,e,o,n))}forEachSegment(t){return S(this.flatCoordinates,0,this.flatCoordinates.length,this.stride,t)}getCoordinateAtM(t,e){return this.layout!="XYM"&&this.layout!="XYZM"?null:(e=e!==void 0?e:!1,v(this.flatCoordinates,0,this.flatCoordinates.length,this.stride,t,e))}getCoordinates(){return M(this.flatCoordinates,0,this.flatCoordinates.length,this.stride)}getCoordinateAt(t,e){return k(this.flatCoordinates,0,this.flatCoordinates.length,this.stride,t,e,this.stride)}getLength(){return x(this.flatCoordinates,0,this.flatCoordinates.length,this.stride)}getFlatMidpoint(){return this.flatMidpointRevision_!=this.getRevision()&&(this.flatMidpoint_=this.getCoordinateAt(.5,this.flatMidpoint_??void 0),this.flatMidpointRevision_=this.getRevision()),this.flatMidpoint_}getSimplifiedGeometryInternal(t){const e=[];return e.length=A(this.flatCoordinates,0,this.flatCoordinates.length,this.stride,t,e,0),new r(e,"XY")}getType(){return"LineString"}intersectsExtent(t){return F(this.flatCoordinates,0,this.flatCoordinates.length,this.stride,t,this.getExtent())}setCoordinates(t,e){this.setLayout(e,t,1),this.flatCoordinates||(this.flatCoordinates=[]),this.flatCoordinates.length=R(this.flatCoordinates,0,t,this.stride),this.changed()}}const B={name:"osmap",props:{type:"",d:Object||Array},data(){return{osmAvailable:!0}},setup(){return{store:G()}},methods:{getLastLonLat(){if(this.type==="traceroute"){const i=this.d.findLast(t=>t.geo&&t.geo.lat&&t.geo.lon);return i?[i.geo.lon,i.geo.lat]:[0,0]}return[this.d.geo.lon,this.d.geo.lat]}},async mounted(){await fetch("https://tile.openstreetmap.org/",{signal:AbortSignal.timeout(1500)}).then(i=>{const t=new D({target:"map",layers:[new b({source:new E})],view:new P({center:l(this.getLastLonLat()),zoom:this.type==="traceroute"?3:10})}),e=[],o=new O;if(this.type==="traceroute")this.d.forEach(s=>{if(s.geo&&s.geo.lat&&s.geo.lon){const a=l([s.geo.lon,s.geo.lat]);e.push(a);const g=this.getLastLonLat(),m=new h({geometry:new f(a),last:s.geo.lon===g[0]&&s.geo.lat===g[1]});o.addFeature(m)}});else{const s=l([this.d.geo.lon,this.d.geo.lat]);e.push(s);const a=new h({geometry:new f(s)});o.addFeature(a)}const n=new r(e),d=new h({geometry:n});o.addFeature(d);const p=new T({source:o,style:function(s){if(s.getGeometry().getType()==="Point")return new c({image:new V({radius:10,fill:new X({color:s.get("last")?"#dc3545":"#0d6efd"}),stroke:new u({color:"white",width:5})})});if(s.getGeometry().getType()==="LineString")return new c({stroke:new u({color:"#0d6efd",width:2})})}});t.addLayer(p)}).catch(i=>{this.osmAvailable=!1})}},z={key:0,id:"map",class:"w-100 rounded-3"};function I(i,t,e,o,n,d){return this.osmAvailable?(q(),$("div",z)):j("",!0)}const H=Y(B,[["render",I]]);export{H as O};
@@ -1 +1 @@
import{_ as v,D as g,r as o,o as h,L as x,g as y,c as i,f as n,a as s,b as c,d as w,n as C,w as k,k as F}from"./index-DYYtDSji.js";import{L as T}from"./localeText-Cd7vLnRM.js";import"./browser-LdOMKRZX.js";import"./galois-field-I2lBzzs-.js";const M={class:"peerSettingContainer w-100 h-100 position-absolute top-0 start-0"},S={class:"container d-flex h-100 w-100"},D={class:"m-auto modal-dialog-centered dashboardModal justify-content-center"},L={class:"card rounded-3 shadow w-100"},P={class:"card-header bg-transparent d-flex align-items-center gap-2 border-0 p-4 pb-0"},B={class:"mb-0"},G={class:"card-body p-4 d-flex flex-column gap-3"},N={style:{height:"300px"},class:"d-flex"},V=["value"],j={key:0,class:"spinner-border m-auto",role:"status"},I={class:"d-flex"},W=["disabled"],$={key:0,class:"d-block"},q={key:1,class:"d-block",id:"check"},z={__name:"peerConfigurationFile",props:{selectedPeer:Object},emits:["close"],setup(u,{emit:p}){const m=p,f=u,r=g(),t=o(!1),l=o(""),a=o(!0);o({error:!1,message:void 0}),h(()=>{const d=x();y("/api/downloadPeer/"+d.params.id,{id:f.selectedPeer.id},e=>{e.status?(l.value=e.data.file,a.value=!1):this.dashboardStore.newMessage("Server",e.message,"danger")})});const b=async()=>{navigator.clipboard&&navigator.clipboard.writeText?navigator.clipboard.writeText(l.value).then(()=>{t.value=!0,setTimeout(()=>{t.value=!1},3e3)}).catch(()=>{r.newMessage("WGDashboard","Failed to copy","danger")}):(document.querySelector("#peerConfigurationFile").select(),document.execCommand("copy")?(t.value=!0,setTimeout(()=>{t.value=!1},3e3)):r.newMessage("WGDashboard","Failed to copy","danger"))};return(d,e)=>(n(),i("div",M,[s("div",S,[s("div",D,[s("div",L,[s("div",P,[s("h4",B,[c(T,{t:"Peer Configuration File"})]),s("button",{type:"button",class:"btn-close ms-auto",onClick:e[0]||(e[0]=_=>m("close"))})]),s("div",G,[s("div",N,[s("textarea",{style:{height:"300px"},class:C(["form-control w-100 rounded-3 animate__fadeIn animate__faster animate__animated",{"d-none":a.value}]),id:"peerConfigurationFile",value:l.value},null,10,V),a.value?(n(),i("div",j,[...e[2]||(e[2]=[s("span",{class:"visually-hidden"},"Loading...",-1)])])):w("",!0)]),s("div",I,[s("button",{onClick:e[1]||(e[1]=_=>b()),disabled:t.value||a.value,class:"ms-auto btn bg-primary-subtle border-primary-subtle text-primary-emphasis rounded-3 position-relative"},[c(F,{name:"slide-up",mode:"out-in"},{default:k(()=>[t.value?(n(),i("span",q,[...e[4]||(e[4]=[s("i",{class:"bi bi-check-circle-fill"},null,-1)])])):(n(),i("span",$,[...e[3]||(e[3]=[s("i",{class:"bi bi-clipboard-fill"},null,-1)])]))]),_:1})],8,W)])])])])])]))}},H=v(z,[["__scopeId","data-v-b0ea2d46"]]);export{H as default}; import{_ as v,D as g,r as o,o as h,L as x,g as y,c as i,f as n,a as s,b as c,d as w,n as C,w as k,k as F}from"./index-CmClDcBF.js";import{L as T}from"./localeText-TzABauzQ.js";import"./browser-Bjk3Qpx-.js";import"./galois-field-I2lBzzs-.js";const M={class:"peerSettingContainer w-100 h-100 position-absolute top-0 start-0"},S={class:"container d-flex h-100 w-100"},D={class:"m-auto modal-dialog-centered dashboardModal justify-content-center"},L={class:"card rounded-3 shadow w-100"},P={class:"card-header bg-transparent d-flex align-items-center gap-2 border-0 p-4 pb-0"},B={class:"mb-0"},G={class:"card-body p-4 d-flex flex-column gap-3"},N={style:{height:"300px"},class:"d-flex"},V=["value"],j={key:0,class:"spinner-border m-auto",role:"status"},I={class:"d-flex"},W=["disabled"],$={key:0,class:"d-block"},q={key:1,class:"d-block",id:"check"},z={__name:"peerConfigurationFile",props:{selectedPeer:Object},emits:["close"],setup(u,{emit:p}){const m=p,f=u,r=g(),t=o(!1),l=o(""),a=o(!0);o({error:!1,message:void 0}),h(()=>{const d=x();y("/api/downloadPeer/"+d.params.id,{id:f.selectedPeer.id},e=>{e.status?(l.value=e.data.file,a.value=!1):this.dashboardStore.newMessage("Server",e.message,"danger")})});const b=async()=>{navigator.clipboard&&navigator.clipboard.writeText?navigator.clipboard.writeText(l.value).then(()=>{t.value=!0,setTimeout(()=>{t.value=!1},3e3)}).catch(()=>{r.newMessage("WGDashboard","Failed to copy","danger")}):(document.querySelector("#peerConfigurationFile").select(),document.execCommand("copy")?(t.value=!0,setTimeout(()=>{t.value=!1},3e3)):r.newMessage("WGDashboard","Failed to copy","danger"))};return(d,e)=>(n(),i("div",M,[s("div",S,[s("div",D,[s("div",L,[s("div",P,[s("h4",B,[c(T,{t:"Peer Configuration File"})]),s("button",{type:"button",class:"btn-close ms-auto",onClick:e[0]||(e[0]=_=>m("close"))})]),s("div",G,[s("div",N,[s("textarea",{style:{height:"300px"},class:C(["form-control w-100 rounded-3 animate__fadeIn animate__faster animate__animated",{"d-none":a.value}]),id:"peerConfigurationFile",value:l.value},null,10,V),a.value?(n(),i("div",j,[...e[2]||(e[2]=[s("span",{class:"visually-hidden"},"Loading...",-1)])])):w("",!0)]),s("div",I,[s("button",{onClick:e[1]||(e[1]=_=>b()),disabled:t.value||a.value,class:"ms-auto btn bg-primary-subtle border-primary-subtle text-primary-emphasis rounded-3 position-relative"},[c(F,{name:"slide-up",mode:"out-in"},{default:k(()=>[t.value?(n(),i("span",q,[...e[4]||(e[4]=[s("i",{class:"bi bi-check-circle-fill"},null,-1)])])):(n(),i("span",$,[...e[3]||(e[3]=[s("i",{class:"bi bi-clipboard-fill"},null,-1)])]))]),_:1})],8,W)])])])])])]))}},H=v(z,[["__scopeId","data-v-b0ea2d46"]]);export{H as default};
@@ -1 +1 @@
import{L as o}from"./localeText-Cd7vLnRM.js";import{P as t}from"./peersDefaultSettingsInput-BuZeDfeq.js";import{B as s,c as l,a,b as e,f as n}from"./index-DYYtDSji.js";const r={class:"d-flex gap-3 flex-column"},i={class:"card rounded-3"},d={class:"card-header"},c={class:"my-2"},_={class:"card-body"},D=s({__name:"peerDefaultSettings",setup(p){return(g,m)=>(n(),l("div",r,[a("div",i,[a("div",d,[a("h6",c,[e(o,{t:"Peer Default Settings"})])]),a("div",_,[a("div",null,[e(t,{targetData:"peer_global_dns",title:"DNS"}),e(t,{targetData:"peer_endpoint_allowed_ip",title:"Endpoint Allowed IPs"}),e(t,{targetData:"peer_mtu",title:"MTU"}),e(t,{targetData:"peer_keep_alive",title:"Persistent Keepalive"}),e(t,{targetData:"remote_endpoint",title:"Peer Remote Endpoint",warning:!0,warningText:"This will be changed globally, and will be apply to all peer's QR code and configuration file."})])])])]))}});export{D as default}; import{L as o}from"./localeText-TzABauzQ.js";import{P as t}from"./peersDefaultSettingsInput-B_ngK8i0.js";import{B as s,c as l,a,b as e,f as n}from"./index-CmClDcBF.js";const r={class:"d-flex gap-3 flex-column"},i={class:"card rounded-3"},d={class:"card-header"},c={class:"my-2"},_={class:"card-body"},D=s({__name:"peerDefaultSettings",setup(p){return(g,m)=>(n(),l("div",r,[a("div",i,[a("div",d,[a("h6",c,[e(o,{t:"Peer Default Settings"})])]),a("div",_,[a("div",null,[e(t,{targetData:"peer_global_dns",title:"DNS"}),e(t,{targetData:"peer_endpoint_allowed_ip",title:"Endpoint Allowed IPs"}),e(t,{targetData:"peer_mtu",title:"MTU"}),e(t,{targetData:"peer_keep_alive",title:"Persistent Keepalive"}),e(t,{targetData:"remote_endpoint",title:"Peer Remote Endpoint",warning:!0,warningText:"This will be changed globally, and will be apply to all peer's QR code and configuration file."})])])])]))}});export{D as default};
@@ -1 +1 @@
import{a as p,S as b}from"./schedulePeerJob-u2PLfoyV.js";import{_ as h,h as i,c as a,f as s,a as e,b as r,w as u,d as m,F as _,i as f,j as v,T as J,A as x,W as g}from"./index-DYYtDSji.js";import{L as w}from"./localeText-Cd7vLnRM.js";import"./vue-datepicker-Cw5Y4tvU.js";import"./index-DPa-4xgI.js";import"./dayjs.min-WRW_FTL4.js";const P={name:"peerJobs",setup(){return{store:g()}},props:{selectedPeer:Object},components:{LocaleText:w,SchedulePeerJob:b,ScheduleDropdown:p},data(){return{}},methods:{deleteJob(d){this.selectedPeer.jobs=this.selectedPeer.jobs.filter(t=>t.JobID!==d.JobID)},addJob(){this.selectedPeer.jobs.unshift(JSON.parse(JSON.stringify({JobID:x().toString(),Configuration:this.selectedPeer.configuration.Name,Peer:this.selectedPeer.id,Field:this.store.PeerScheduleJobs.dropdowns.Field[0].value,Operator:this.store.PeerScheduleJobs.dropdowns.Operator[0].value,Value:"",CreationDate:"",ExpireDate:"",Action:this.store.PeerScheduleJobs.dropdowns.Action[0].value})))}}},S={class:"peerSettingContainer w-100 h-100 position-absolute top-0 start-0 overflow-y-scroll"},y={class:"container d-flex h-100 w-100"},$={class:"m-auto modal-dialog-centered dashboardModal"},C={class:"card rounded-3 shadow",style:{width:"700px"}},D={class:"card-header bg-transparent d-flex align-items-center gap-2 border-0 p-4 pb-2"},j={class:"mb-0 fw-normal"},k={class:"card-body px-4 pb-4 pt-2 position-relative"},T={class:"d-flex align-items-center mb-3"},N={class:"card shadow-sm",key:"none",style:{height:"153px"}},I={class:"card-body text-muted text-center d-flex"},L={class:"m-auto"};function O(d,t,B,F,V,A){const n=i("LocaleText"),l=i("SchedulePeerJob");return s(),a("div",S,[e("div",y,[e("div",$,[e("div",C,[e("div",D,[e("h4",j,[r(n,{t:"Schedule Jobs"})]),e("button",{type:"button",class:"btn-close ms-auto",onClick:t[0]||(t[0]=o=>this.$emit("close"))})]),e("div",k,[e("div",T,[e("button",{class:"btn bg-primary-subtle border-1 border-primary-subtle text-primary-emphasis rounded-3 shadow",onClick:t[1]||(t[1]=o=>this.addJob())},[t[3]||(t[3]=e("i",{class:"bi bi-plus-lg me-2"},null,-1)),r(n,{t:"Job"})])]),r(J,{name:"schedulePeerJobTransition",tag:"div",class:"position-relative"},{default:u(()=>[(s(!0),a(_,null,f(this.selectedPeer.jobs,(o,E)=>(s(),v(l,{onRefresh:t[2]||(t[2]=c=>this.$emit("refresh")),onDelete:c=>this.deleteJob(o),dropdowns:this.store.PeerScheduleJobs.dropdowns,key:o.JobID,pjob:o},null,8,["onDelete","dropdowns","pjob"]))),128)),this.selectedPeer.jobs.length===0?(s(),a("div",N,[e("div",I,[e("h6",L,[r(n,{t:"This peer does not have any job yet."})])])])):m("",!0)]),_:1})])])])])])}const H=h(P,[["render",O],["__scopeId","data-v-5bbdd42b"]]);export{H as default}; import{a as p,S as b}from"./schedulePeerJob-u-FqcbUM.js";import{_ as h,h as i,c as a,f as s,a as e,b as r,w as u,d as m,F as _,i as f,j as v,T as J,A as x,W as g}from"./index-CmClDcBF.js";import{L as w}from"./localeText-TzABauzQ.js";import"./vue-datepicker-BYHO-v3J.js";import"./index-DZpKhbG8.js";import"./dayjs.min-DFlK6ZAc.js";const P={name:"peerJobs",setup(){return{store:g()}},props:{selectedPeer:Object},components:{LocaleText:w,SchedulePeerJob:b,ScheduleDropdown:p},data(){return{}},methods:{deleteJob(d){this.selectedPeer.jobs=this.selectedPeer.jobs.filter(t=>t.JobID!==d.JobID)},addJob(){this.selectedPeer.jobs.unshift(JSON.parse(JSON.stringify({JobID:x().toString(),Configuration:this.selectedPeer.configuration.Name,Peer:this.selectedPeer.id,Field:this.store.PeerScheduleJobs.dropdowns.Field[0].value,Operator:this.store.PeerScheduleJobs.dropdowns.Operator[0].value,Value:"",CreationDate:"",ExpireDate:"",Action:this.store.PeerScheduleJobs.dropdowns.Action[0].value})))}}},S={class:"peerSettingContainer w-100 h-100 position-absolute top-0 start-0 overflow-y-scroll"},y={class:"container d-flex h-100 w-100"},$={class:"m-auto modal-dialog-centered dashboardModal"},C={class:"card rounded-3 shadow",style:{width:"700px"}},D={class:"card-header bg-transparent d-flex align-items-center gap-2 border-0 p-4 pb-2"},j={class:"mb-0 fw-normal"},k={class:"card-body px-4 pb-4 pt-2 position-relative"},T={class:"d-flex align-items-center mb-3"},N={class:"card shadow-sm",key:"none",style:{height:"153px"}},I={class:"card-body text-muted text-center d-flex"},L={class:"m-auto"};function O(d,t,B,F,V,A){const n=i("LocaleText"),l=i("SchedulePeerJob");return s(),a("div",S,[e("div",y,[e("div",$,[e("div",C,[e("div",D,[e("h4",j,[r(n,{t:"Schedule Jobs"})]),e("button",{type:"button",class:"btn-close ms-auto",onClick:t[0]||(t[0]=o=>this.$emit("close"))})]),e("div",k,[e("div",T,[e("button",{class:"btn bg-primary-subtle border-1 border-primary-subtle text-primary-emphasis rounded-3 shadow",onClick:t[1]||(t[1]=o=>this.addJob())},[t[3]||(t[3]=e("i",{class:"bi bi-plus-lg me-2"},null,-1)),r(n,{t:"Job"})])]),r(J,{name:"schedulePeerJobTransition",tag:"div",class:"position-relative"},{default:u(()=>[(s(!0),a(_,null,f(this.selectedPeer.jobs,(o,E)=>(s(),v(l,{onRefresh:t[2]||(t[2]=c=>this.$emit("refresh")),onDelete:c=>this.deleteJob(o),dropdowns:this.store.PeerScheduleJobs.dropdowns,key:o.JobID,pjob:o},null,8,["onDelete","dropdowns","pjob"]))),128)),this.selectedPeer.jobs.length===0?(s(),a("div",N,[e("div",I,[e("h6",L,[r(n,{t:"This peer does not have any job yet."})])])])):m("",!0)]),_:1})])])])])])}const H=h(P,[["render",O],["__scopeId","data-v-5bbdd42b"]]);export{H as default};
@@ -1 +1 @@
import{S as _}from"./schedulePeerJob-u2PLfoyV.js";import{_ as g,h as c,c as r,f as t,a as e,b as l,F as p,i as b,d as f,t as m,j as v,W as y}from"./index-DYYtDSji.js";import{L as x}from"./localeText-Cd7vLnRM.js";import"./vue-datepicker-Cw5Y4tvU.js";import"./index-DPa-4xgI.js";import"./dayjs.min-WRW_FTL4.js";const J={name:"peerJobsAllModal",setup(){return{store:y()}},components:{LocaleText:x,SchedulePeerJob:_},props:{configurationPeers:Array[Object]},computed:{getAllJobs(){return this.configurationPeers.filter(a=>a.jobs.length>0)}}},w={class:"peerSettingContainer w-100 h-100 position-absolute top-0 start-0 overflow-y-scroll"},$={class:"container d-flex h-100 w-100"},k={class:"m-auto modal-dialog-centered dashboardModal"},A={class:"card rounded-3 shadow",style:{width:"900px"}},L={class:"card-header bg-transparent d-flex align-items-center gap-2 border-0 p-4 pb-2"},S={class:"mb-0 fw-normal"},j={class:"card-body px-4 pb-4 pt-2"},C={key:0,class:"accordion",id:"peerJobsLogsModalAccordion"},P={class:"accordion-header"},M=["data-bs-target"],B={key:0},N={class:"text-muted"},D=["id"],T={class:"accordion-body"},V={key:1,class:"card shadow-sm",style:{height:"153px"}},F={class:"card-body text-muted text-center d-flex"},O={class:"m-auto"};function W(a,o,E,I,R,q){const n=c("LocaleText"),u=c("SchedulePeerJob");return t(),r("div",w,[e("div",$,[e("div",k,[e("div",A,[e("div",L,[e("h4",S,[l(n,{t:"All Active Jobs"})]),e("button",{type:"button",class:"btn-close ms-auto",onClick:o[0]||(o[0]=s=>this.$emit("close"))})]),e("div",j,[e("button",{class:"btn bg-primary-subtle border-1 border-primary-subtle text-primary-emphasis rounded-3 shadow mb-2",onClick:o[1]||(o[1]=s=>this.$emit("allLogs"))},[o[4]||(o[4]=e("i",{class:"bi bi-clock me-2"},null,-1)),l(n,{t:"Logs"})]),this.getAllJobs.length>0?(t(),r("div",C,[(t(!0),r(p,null,b(this.getAllJobs,(s,d)=>(t(),r("div",{class:"accordion-item",key:s.id},[e("h2",P,[e("button",{class:"accordion-button collapsed",type:"button","data-bs-toggle":"collapse","data-bs-target":"#collapse_"+d},[e("small",null,[e("strong",null,[s.name?(t(),r("span",B,m(s.name)+" • ",1)):f("",!0),e("samp",N,m(s.id),1)])])],8,M)]),e("div",{id:"collapse_"+d,class:"accordion-collapse collapse","data-bs-parent":"#peerJobsLogsModalAccordion"},[e("div",T,[(t(!0),r(p,null,b(s.jobs,i=>(t(),v(u,{onDelete:o[2]||(o[2]=h=>this.$emit("refresh")),onRefresh:o[3]||(o[3]=h=>this.$emit("refresh")),dropdowns:this.store.PeerScheduleJobs.dropdowns,viewOnly:!0,key:i.JobID,pjob:i},null,8,["dropdowns","pjob"]))),128))])],8,D)]))),128))])):(t(),r("div",V,[e("div",F,[e("span",O,[l(n,{t:"No active job at the moment."})])])]))])])])])])}const X=g(J,[["render",W]]);export{X as default}; import{S as _}from"./schedulePeerJob-u-FqcbUM.js";import{_ as g,h as c,c as r,f as t,a as e,b as l,F as p,i as b,d as f,t as m,j as v,W as y}from"./index-CmClDcBF.js";import{L as x}from"./localeText-TzABauzQ.js";import"./vue-datepicker-BYHO-v3J.js";import"./index-DZpKhbG8.js";import"./dayjs.min-DFlK6ZAc.js";const J={name:"peerJobsAllModal",setup(){return{store:y()}},components:{LocaleText:x,SchedulePeerJob:_},props:{configurationPeers:Array[Object]},computed:{getAllJobs(){return this.configurationPeers.filter(a=>a.jobs.length>0)}}},w={class:"peerSettingContainer w-100 h-100 position-absolute top-0 start-0 overflow-y-scroll"},$={class:"container d-flex h-100 w-100"},k={class:"m-auto modal-dialog-centered dashboardModal"},A={class:"card rounded-3 shadow",style:{width:"900px"}},L={class:"card-header bg-transparent d-flex align-items-center gap-2 border-0 p-4 pb-2"},S={class:"mb-0 fw-normal"},j={class:"card-body px-4 pb-4 pt-2"},C={key:0,class:"accordion",id:"peerJobsLogsModalAccordion"},P={class:"accordion-header"},M=["data-bs-target"],B={key:0},N={class:"text-muted"},D=["id"],T={class:"accordion-body"},V={key:1,class:"card shadow-sm",style:{height:"153px"}},F={class:"card-body text-muted text-center d-flex"},O={class:"m-auto"};function W(a,o,E,I,R,q){const n=c("LocaleText"),u=c("SchedulePeerJob");return t(),r("div",w,[e("div",$,[e("div",k,[e("div",A,[e("div",L,[e("h4",S,[l(n,{t:"All Active Jobs"})]),e("button",{type:"button",class:"btn-close ms-auto",onClick:o[0]||(o[0]=s=>this.$emit("close"))})]),e("div",j,[e("button",{class:"btn bg-primary-subtle border-1 border-primary-subtle text-primary-emphasis rounded-3 shadow mb-2",onClick:o[1]||(o[1]=s=>this.$emit("allLogs"))},[o[4]||(o[4]=e("i",{class:"bi bi-clock me-2"},null,-1)),l(n,{t:"Logs"})]),this.getAllJobs.length>0?(t(),r("div",C,[(t(!0),r(p,null,b(this.getAllJobs,(s,d)=>(t(),r("div",{class:"accordion-item",key:s.id},[e("h2",P,[e("button",{class:"accordion-button collapsed",type:"button","data-bs-toggle":"collapse","data-bs-target":"#collapse_"+d},[e("small",null,[e("strong",null,[s.name?(t(),r("span",B,m(s.name)+" • ",1)):f("",!0),e("samp",N,m(s.id),1)])])],8,M)]),e("div",{id:"collapse_"+d,class:"accordion-collapse collapse","data-bs-parent":"#peerJobsLogsModalAccordion"},[e("div",T,[(t(!0),r(p,null,b(s.jobs,i=>(t(),v(u,{onDelete:o[2]||(o[2]=h=>this.$emit("refresh")),onRefresh:o[3]||(o[3]=h=>this.$emit("refresh")),dropdowns:this.store.PeerScheduleJobs.dropdowns,viewOnly:!0,key:i.JobID,pjob:i},null,8,["dropdowns","pjob"]))),128))])],8,D)]))),128))])):(t(),r("div",V,[e("div",F,[e("span",O,[l(n,{t:"No active job at the moment."})])])]))])])])])])}const X=g(J,[["render",W]]);export{X as default};
@@ -1 +1 @@
import{Q as l}from"./browser-LdOMKRZX.js";import{L as _}from"./localeText-Cd7vLnRM.js";import{_ as h,h as f,c,f as s,a as e,b as p,d as i,j as m,n as u,g,D as v}from"./index-DYYtDSji.js";import"./galois-field-I2lBzzs-.js";const w={name:"peerQRCode",components:{LocaleText:_},props:{selectedPeer:Object},setup(){return{dashboardStore:v()}},data(){return{loading:!0}},mounted(){g("/api/downloadPeer/"+this.$route.params.id,{id:this.selectedPeer.id},o=>{if(this.loading=!1,o.status){let t="";if(this.selectedPeer.configuration.Protocol==="awg"){let a={containers:[{awg:{isThirdPartyConfig:!0,last_config:o.data.file,port:this.selectedPeer.configuration.ListenPort,transport_proto:"udp"},container:"amnezia-awg"}],defaultContainer:"amnezia-awg",description:this.selectedPeer.name,hostName:this.dashboardStore.Configuration.Peers.remote_endpoint};l.toCanvas(document.querySelector("#awg_vpn_qrcode"),btoa(JSON.stringify(a)),d=>{d&&console.error(d)})}t=o.data.file,l.toCanvas(document.querySelector("#qrcode"),t,a=>{a&&console.error(a)})}else this.dashboardStore.newMessage("Server",o.message,"danger")})}},b={class:"peerSettingContainer w-100 h-100 position-absolute top-0 start-0"},x={class:"container d-flex h-100 w-100"},P={class:"m-auto modal-dialog-centered dashboardModal justify-content-center"},C={class:"card rounded-3 shadow"},y={class:"card-header bg-transparent d-flex align-items-center gap-2 border-0 p-4 pb-0"},S={class:"mb-0"},k={class:"card-body p-4"},q={class:"d-flex gap-2 flex-column"},L={class:"d-flex flex-column gap-2 align-items-center"},N={key:0,class:"d-flex flex-column gap-2 align-items-center"},Q={key:1,class:"spinner-border m-auto",role:"status"};function z(o,t,a,d,r,A){const n=f("LocaleText");return s(),c("div",b,[e("div",x,[e("div",P,[e("div",C,[e("div",y,[e("h4",S,[p(n,{t:"QR Code"})]),e("button",{type:"button",class:"btn-close ms-auto",onClick:t[0]||(t[0]=R=>this.$emit("close"))})]),e("div",k,[e("div",q,[e("div",L,[e("canvas",{id:"qrcode",style:{width:"200px !important",height:"200px !important"},class:u(["rounded-3 shadow animate__animated animate__fadeIn animate__faster qrcode",{"d-none":r.loading}])},null,2),this.selectedPeer.configuration.Protocol==="wg"?(s(),m(n,{key:0,t:"Scan with WireGuard App",class:"text-muted"})):i("",!0),this.selectedPeer.configuration.Protocol==="awg"?(s(),m(n,{key:1,t:"Scan with AmneziaWG App",class:"text-muted"})):i("",!0)]),this.selectedPeer.configuration.Protocol==="awg"?(s(),c("div",N,[e("canvas",{id:"awg_vpn_qrcode",class:u(["rounded-3 shadow animate__animated animate__fadeIn animate__faster qrcode",{"d-none":r.loading}])},null,2),p(n,{t:"Scan with AmneziaVPN App",class:"text-muted"})])):i("",!0),r.loading?(s(),c("div",Q,[...t[1]||(t[1]=[e("span",{class:"visually-hidden"},"Loading...",-1)])])):i("",!0)])])])])])])}const $=h(w,[["render",z],["__scopeId","data-v-02f2240d"]]);export{$ as default}; import{Q as l}from"./browser-Bjk3Qpx-.js";import{L as _}from"./localeText-TzABauzQ.js";import{_ as h,h as f,c,f as s,a as e,b as p,d as i,j as m,n as u,g,D as v}from"./index-CmClDcBF.js";import"./galois-field-I2lBzzs-.js";const w={name:"peerQRCode",components:{LocaleText:_},props:{selectedPeer:Object},setup(){return{dashboardStore:v()}},data(){return{loading:!0}},mounted(){g("/api/downloadPeer/"+this.$route.params.id,{id:this.selectedPeer.id},o=>{if(this.loading=!1,o.status){let t="";if(this.selectedPeer.configuration.Protocol==="awg"){let a={containers:[{awg:{isThirdPartyConfig:!0,last_config:o.data.file,port:this.selectedPeer.configuration.ListenPort,transport_proto:"udp"},container:"amnezia-awg"}],defaultContainer:"amnezia-awg",description:this.selectedPeer.name,hostName:this.dashboardStore.Configuration.Peers.remote_endpoint};l.toCanvas(document.querySelector("#awg_vpn_qrcode"),btoa(JSON.stringify(a)),d=>{d&&console.error(d)})}t=o.data.file,l.toCanvas(document.querySelector("#qrcode"),t,a=>{a&&console.error(a)})}else this.dashboardStore.newMessage("Server",o.message,"danger")})}},b={class:"peerSettingContainer w-100 h-100 position-absolute top-0 start-0"},x={class:"container d-flex h-100 w-100"},P={class:"m-auto modal-dialog-centered dashboardModal justify-content-center"},C={class:"card rounded-3 shadow"},y={class:"card-header bg-transparent d-flex align-items-center gap-2 border-0 p-4 pb-0"},S={class:"mb-0"},k={class:"card-body p-4"},q={class:"d-flex gap-2 flex-column"},L={class:"d-flex flex-column gap-2 align-items-center"},N={key:0,class:"d-flex flex-column gap-2 align-items-center"},Q={key:1,class:"spinner-border m-auto",role:"status"};function z(o,t,a,d,r,A){const n=f("LocaleText");return s(),c("div",b,[e("div",x,[e("div",P,[e("div",C,[e("div",y,[e("h4",S,[p(n,{t:"QR Code"})]),e("button",{type:"button",class:"btn-close ms-auto",onClick:t[0]||(t[0]=R=>this.$emit("close"))})]),e("div",k,[e("div",q,[e("div",L,[e("canvas",{id:"qrcode",style:{width:"200px !important",height:"200px !important"},class:u(["rounded-3 shadow animate__animated animate__fadeIn animate__faster qrcode",{"d-none":r.loading}])},null,2),this.selectedPeer.configuration.Protocol==="wg"?(s(),m(n,{key:0,t:"Scan with WireGuard App",class:"text-muted"})):i("",!0),this.selectedPeer.configuration.Protocol==="awg"?(s(),m(n,{key:1,t:"Scan with AmneziaWG App",class:"text-muted"})):i("",!0)]),this.selectedPeer.configuration.Protocol==="awg"?(s(),c("div",N,[e("canvas",{id:"awg_vpn_qrcode",class:u(["rounded-3 shadow animate__animated animate__fadeIn animate__faster qrcode",{"d-none":r.loading}])},null,2),p(n,{t:"Scan with AmneziaVPN App",class:"text-muted"})])):i("",!0),r.loading?(s(),c("div",Q,[...t[1]||(t[1]=[e("span",{class:"visually-hidden"},"Loading...",-1)])])):i("",!0)])])])])])])}const $=h(w,[["render",z],["__scopeId","data-v-02f2240d"]]);export{$ as default};
@@ -1 +1 @@
import{_ as p,q as m,G as f,W as h,r as u,a0 as _,L as v,K as g,o as x,a1 as S,c as y,d as b,f as B,a as s,m as w,y as T}from"./index-DYYtDSji.js";const q={key:0,class:"fixed-bottom w-100 bottom-0 z-2 p-3",style:{"z-index":"1"}},C={class:"d-flex flex-column searchPeersContainer ms-auto p-2 rounded-5",style:{width:"300px"}},P={class:"rounded-5 border border-white p-2 d-flex align-items-center gap-1 w-100"},R=["placeholder"],k={__name:"peerSearchBar",props:["ConfigurationInfo"],emits:["close"],setup(V,{emit:z}){const l=m(()=>f("Search Peers..."));let r;const t=h(),e=u(t.searchString),d=()=>{r?(clearTimeout(r),r=setTimeout(()=>{t.searchString=e.value},300)):r=setTimeout(()=>{t.searchString=e.value},300)};_("searchBar");const a=v(),i=g();a.query.peer&&(e.value=a.query.peer,i.replace({query:null}));const n=u(!0);return x(()=>{document.querySelector("#searchPeers").focus()}),S(()=>{n.value=!1}),(G,o)=>n.value?(B(),y("div",q,[s("div",C,[s("div",P,[w(s("input",{ref:"searchBar",class:"flex-grow-1 form-control form-control-sm rounded-5 bg-transparent border-0 border-secondary-subtle",placeholder:l.value,id:"searchPeers",onKeyup:o[0]||(o[0]=c=>d()),"onUpdate:modelValue":o[1]||(o[1]=c=>e.value=c)},null,40,R),[[T,e.value]])])])])):b("",!0)}},K=p(k,[["__scopeId","data-v-576347d8"]]);export{K as default}; import{_ as p,q as m,G as f,W as h,r as u,a0 as _,L as v,K as g,o as x,a1 as S,c as y,d as b,f as B,a as s,m as w,y as T}from"./index-CmClDcBF.js";const q={key:0,class:"fixed-bottom w-100 bottom-0 z-2 p-3",style:{"z-index":"1"}},C={class:"d-flex flex-column searchPeersContainer ms-auto p-2 rounded-5",style:{width:"300px"}},P={class:"rounded-5 border border-white p-2 d-flex align-items-center gap-1 w-100"},R=["placeholder"],k={__name:"peerSearchBar",props:["ConfigurationInfo"],emits:["close"],setup(V,{emit:z}){const l=m(()=>f("Search Peers..."));let r;const t=h(),e=u(t.searchString),d=()=>{r?(clearTimeout(r),r=setTimeout(()=>{t.searchString=e.value},300)):r=setTimeout(()=>{t.searchString=e.value},300)};_("searchBar");const a=v(),i=g();a.query.peer&&(e.value=a.query.peer,i.replace({query:null}));const n=u(!0);return x(()=>{document.querySelector("#searchPeers").focus()}),S(()=>{n.value=!1}),(G,o)=>n.value?(B(),y("div",q,[s("div",C,[s("div",P,[w(s("input",{ref:"searchBar",class:"flex-grow-1 form-control form-control-sm rounded-5 bg-transparent border-0 border-secondary-subtle",placeholder:l.value,id:"searchPeers",onKeyup:o[0]||(o[0]=c=>d()),"onUpdate:modelValue":o[1]||(o[1]=c=>e.value=c)},null,40,R),[[T,e.value]])])])])):b("",!0)}},K=p(k,[["__scopeId","data-v-576347d8"]]);export{K as default};
@@ -1 +1 @@
import{_ as h,c as o,a as e,m as c,d as m,b as d,h as f,y as g,n as v,t as p,z as b,D as w,A as x,f as r}from"./index-DYYtDSji.js";import{L as _}from"./localeText-Cd7vLnRM.js";const k={components:{LocaleText:_},props:{targetData:String,title:String,warning:!1,warningText:""},setup(){const s=w(),t=`input_${x()}`;return{store:s,uuid:t}},data(){return{value:"",invalidFeedback:"",showInvalidFeedback:!1,isValid:!1,timeout:void 0,changed:!1,updating:!1}},mounted(){this.value=this.store.Configuration.Peers[this.targetData]},methods:{async useValidation(){this.changed&&await b("/api/updateDashboardConfigurationItem",{section:"Peers",key:this.targetData,value:this.value},s=>{s.status?(this.isValid=!0,this.showInvalidFeedback=!1,this.store.Configuration.Peers[this.targetData]=this.value,clearTimeout(this.timeout),this.timeout=setTimeout(()=>this.isValid=!1,5e3)):(this.isValid=!1,this.showInvalidFeedback=!0,this.invalidFeedback=s.message),this.changed=!1,this.updating=!1})}}},V={class:"form-group mb-2"},D=["for"],y=["id","disabled"],T={class:"invalid-feedback"},C={key:0,class:"px-2 py-1 text-warning-emphasis bg-warning-subtle border border-warning-subtle rounded-2 d-inline-block mt-1"};function F(s,t,a,I,n,u){const l=f("LocaleText");return r(),o("div",V,[e("label",{for:this.uuid,class:"text-muted mb-1"},[e("strong",null,[e("small",null,[d(l,{t:this.title},null,8,["t"])])])],8,D),c(e("input",{type:"text",class:v(["form-control",{"is-invalid":n.showInvalidFeedback,"is-valid":n.isValid}]),id:this.uuid,"onUpdate:modelValue":t[0]||(t[0]=i=>this.value=i),onKeydown:t[1]||(t[1]=i=>this.changed=!0),onBlur:t[2]||(t[2]=i=>u.useValidation()),disabled:this.updating},null,42,y),[[g,this.value]]),e("div",T,p(this.invalidFeedback),1),a.warning?(r(),o("div",C,[e("small",null,[t[3]||(t[3]=e("i",{class:"bi bi-exclamation-triangle-fill me-2"},null,-1)),d(l,{t:a.warningText},null,8,["t"])])])):m("",!0)])}const B=h(k,[["render",F]]);export{B as P}; import{_ as h,c as o,a as e,m as c,d as m,b as d,h as f,y as g,n as v,t as p,z as b,D as w,A as x,f as r}from"./index-CmClDcBF.js";import{L as _}from"./localeText-TzABauzQ.js";const k={components:{LocaleText:_},props:{targetData:String,title:String,warning:!1,warningText:""},setup(){const s=w(),t=`input_${x()}`;return{store:s,uuid:t}},data(){return{value:"",invalidFeedback:"",showInvalidFeedback:!1,isValid:!1,timeout:void 0,changed:!1,updating:!1}},mounted(){this.value=this.store.Configuration.Peers[this.targetData]},methods:{async useValidation(){this.changed&&await b("/api/updateDashboardConfigurationItem",{section:"Peers",key:this.targetData,value:this.value},s=>{s.status?(this.isValid=!0,this.showInvalidFeedback=!1,this.store.Configuration.Peers[this.targetData]=this.value,clearTimeout(this.timeout),this.timeout=setTimeout(()=>this.isValid=!1,5e3)):(this.isValid=!1,this.showInvalidFeedback=!0,this.invalidFeedback=s.message),this.changed=!1,this.updating=!1})}}},V={class:"form-group mb-2"},D=["for"],y=["id","disabled"],T={class:"invalid-feedback"},C={key:0,class:"px-2 py-1 text-warning-emphasis bg-warning-subtle border border-warning-subtle rounded-2 d-inline-block mt-1"};function F(s,t,a,I,n,u){const l=f("LocaleText");return r(),o("div",V,[e("label",{for:this.uuid,class:"text-muted mb-1"},[e("strong",null,[e("small",null,[d(l,{t:this.title},null,8,["t"])])])],8,D),c(e("input",{type:"text",class:v(["form-control",{"is-invalid":n.showInvalidFeedback,"is-valid":n.isValid}]),id:this.uuid,"onUpdate:modelValue":t[0]||(t[0]=i=>this.value=i),onKeydown:t[1]||(t[1]=i=>this.changed=!0),onBlur:t[2]||(t[2]=i=>u.useValidation()),disabled:this.updating},null,42,y),[[g,this.value]]),e("div",T,p(this.invalidFeedback),1),a.warning?(r(),o("div",C,[e("small",null,[t[3]||(t[3]=e("i",{class:"bi bi-exclamation-triangle-fill me-2"},null,-1)),d(l,{t:a.warningText},null,8,["t"])])])):m("",!0)])}const B=h(k,[["render",F]]);export{B as P};
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
import{L as n}from"./localeText-Cd7vLnRM.js";import{c as a,d as r,e as s,j as i,f as e}from"./index-DYYtDSji.js";const d={class:"position-relative"},c={key:0,class:"badge wireguardBg rounded-3 shadow z-1"},l={key:1,class:"badge amneziawgBg rounded-3 shadow"},p={__name:"protocolBadge",props:{protocol:String,mini:!1},setup(o){return(m,t)=>(e(),a("div",d,[o.protocol==="wg"?(e(),a("span",c,[t[0]||(t[0]=s(" WireGuard ",-1)),o.mini?r("",!0):(e(),i(n,{key:0,t:"Configuration"}))])):o.protocol==="awg"?(e(),a("span",l,[t[1]||(t[1]=s(" AmneziaWG ",-1)),o.mini?r("",!0):(e(),i(n,{key:0,t:"Configuration"}))])):r("",!0)]))}};export{p as _}; import{L as n}from"./localeText-TzABauzQ.js";import{c as a,d as r,e as s,j as i,f as e}from"./index-CmClDcBF.js";const d={class:"position-relative"},c={key:0,class:"badge wireguardBg rounded-3 shadow z-1"},l={key:1,class:"badge amneziawgBg rounded-3 shadow"},p={__name:"protocolBadge",props:{protocol:String,mini:!1},setup(o){return(m,t)=>(e(),a("div",d,[o.protocol==="wg"?(e(),a("span",c,[t[0]||(t[0]=s(" WireGuard ",-1)),o.mini?r("",!0):(e(),i(n,{key:0,t:"Configuration"}))])):o.protocol==="awg"?(e(),a("span",l,[t[1]||(t[1]=s(" AmneziaWG ",-1)),o.mini?r("",!0):(e(),i(n,{key:0,t:"Configuration"}))])):r("",!0)]))}};export{p as _};
@@ -1 +1 @@
import{_ as c,z as D,D as m,A as x,c as i,a as t,t as S,m as l,y as u,e as p,f as o,b as n,F as $,i as w,h as r,w as I}from"./index-DYYtDSji.js";import{P}from"./peersDefaultSettingsInput-BuZeDfeq.js";import{A as k,a as A,D as y,b as C,c as V,d as F,e as T,_ as L}from"./dashboardEmailSettings-BLi3ez-N.js";import{D as R,a as W}from"./dashboardSettingsWireguardConfigurationAutostart-Cw4a6e53.js";import{L as U}from"./localeText-Cd7vLnRM.js";import"./dayjs.min-WRW_FTL4.js";import"./vue-datepicker-Cw5Y4tvU.js";import"./index-DPa-4xgI.js";const B={name:"dashboardSettingsInputIPAddressAndPort",props:{},setup(){const e=m(),s=`input_${x()}`;return{store:e,uuid:s}},data(){return{app_ip:"",app_port:"",invalidFeedback:"",showInvalidFeedback:!1,isValid:!1,timeout:void 0,changed:!1,updating:!1}},mounted(){this.app_ip=this.store.Configuration.Server.app_ip,this.app_port=this.store.Configuration.Server.app_port},methods:{async useValidation(){this.changed&&await D("/api/updateDashboardConfigurationItem",{section:"Server",key:this.targetData,value:this.value},e=>{e.status?(this.isValid=!0,this.showInvalidFeedback=!1,this.store.Configuration.Account[this.targetData]=this.value,clearTimeout(this.timeout),this.timeout=setTimeout(()=>this.isValid=!1,5e3)):(this.isValid=!1,this.showInvalidFeedback=!0,this.invalidFeedback=e.message)})}}},G={class:"invalid-feedback d-block mt-0"},N={class:"row"},E={class:"form-group mb-2 col-sm"},M=["for"],j=["id"],z={class:"form-group col-sm"},K=["for"],q=["id"];function H(e,s,h,_,b,f){return o(),i("div",null,[t("div",G,S(this.invalidFeedback),1),t("div",N,[t("div",E,[t("label",{for:"app_ip_"+this.uuid,class:"text-muted mb-1"},[...s[2]||(s[2]=[t("strong",null,[t("small",null,"Dashboard IP Address")],-1)])],8,M),l(t("input",{type:"text",class:"form-control mb-2",id:"app_ip_"+this.uuid,"onUpdate:modelValue":s[0]||(s[0]=a=>this.app_ip=a)},null,8,j),[[u,this.app_ip]]),s[3]||(s[3]=t("div",{class:"px-2 py-1 text-warning-emphasis bg-warning-subtle border border-warning-subtle rounded-2 d-inline-block"},[t("small",null,[t("i",{class:"bi bi-exclamation-triangle-fill me-2"}),t("code",null,"0.0.0.0"),p(" means it can be access by anyone with your server IP Address.")])],-1))]),t("div",z,[t("label",{for:"app_port_"+this.uuid,class:"text-muted mb-1"},[...s[4]||(s[4]=[t("strong",null,[t("small",null,"Dashboard Port")],-1)])],8,K),l(t("input",{type:"text",class:"form-control mb-2",id:"app_port_"+this.uuid,"onUpdate:modelValue":s[1]||(s[1]=a=>this.app_port=a)},null,8,q),[[u,this.app_port]])])]),s[5]||(s[5]=t("button",{class:"btn btn-success btn-sm fw-bold rounded-3"},[t("i",{class:"bi bi-floppy-fill me-2"}),p("Update Dashboard Settings & Restart ")],-1))])}const J=c(B,[["render",H]]),O={name:"settings",components:{DashboardEmailSettings:L,DashboardSettingsWireguardConfigurationAutostart:W,DashboardIPPortInput:T,DashboardLanguage:F,LocaleText:U,AccountSettingsMFA:V,DashboardAPIKeys:C,DashboardSettingsInputIPAddressAndPort:J,DashboardTheme:y,DashboardSettingsInputWireguardConfigurationPath:R,AccountSettingsInputPassword:A,AccountSettingsInputUsername:k,PeersDefaultSettingsInput:P},setup(){return{dashboardConfigurationStore:m()}},data(){return{activeTab:"WGDashboard",tabs:[{id:"",title:"WGDashboard Settings"},{id:"peers_settings",title:"Peers Settings"},{id:"wireguard_settings",title:"WireGuard Configuration Settings"}]}}},Q={class:"mt-md-5 mt-3 text-body mb-3"},X={class:"container-md d-flex flex-column gap-3"},Y={class:"border-bottom pb-3"},Z={class:"nav nav-pills nav-justified align-items-center gap-2"},tt={class:"nav-item"},st={class:"my-2"};function et(e,s,h,_,b,f){const a=r("LocaleText"),g=r("RouterLink"),v=r("RouterView");return o(),i("div",Q,[t("div",X,[t("div",Y,[t("ul",Z,[(o(!0),i($,null,w(this.tabs,d=>(o(),i("li",tt,[n(g,{to:{name:d.title},class:"nav-link rounded-3","exact-active-class":"active",role:"button"},{default:I(()=>[t("h6",st,[n(a,{t:d.title},null,8,["t"])])]),_:2},1032,["to"])]))),256))])]),n(v)])])}const pt=c(O,[["render",et]]);export{pt as default}; import{_ as c,z as D,D as m,A as x,c as i,a as t,t as S,m as l,y as u,e as p,f as o,b as n,F as $,i as w,h as r,w as I}from"./index-CmClDcBF.js";import{P}from"./peersDefaultSettingsInput-B_ngK8i0.js";import{A as k,a as A,D as y,b as C,c as V,d as F,e as T,_ as L}from"./dashboardEmailSettings-C4AqU3LX.js";import{D as R,a as W}from"./dashboardSettingsWireguardConfigurationAutostart-CjeUiByL.js";import{L as U}from"./localeText-TzABauzQ.js";import"./dayjs.min-DFlK6ZAc.js";import"./vue-datepicker-BYHO-v3J.js";import"./index-DZpKhbG8.js";const B={name:"dashboardSettingsInputIPAddressAndPort",props:{},setup(){const e=m(),s=`input_${x()}`;return{store:e,uuid:s}},data(){return{app_ip:"",app_port:"",invalidFeedback:"",showInvalidFeedback:!1,isValid:!1,timeout:void 0,changed:!1,updating:!1}},mounted(){this.app_ip=this.store.Configuration.Server.app_ip,this.app_port=this.store.Configuration.Server.app_port},methods:{async useValidation(){this.changed&&await D("/api/updateDashboardConfigurationItem",{section:"Server",key:this.targetData,value:this.value},e=>{e.status?(this.isValid=!0,this.showInvalidFeedback=!1,this.store.Configuration.Account[this.targetData]=this.value,clearTimeout(this.timeout),this.timeout=setTimeout(()=>this.isValid=!1,5e3)):(this.isValid=!1,this.showInvalidFeedback=!0,this.invalidFeedback=e.message)})}}},G={class:"invalid-feedback d-block mt-0"},N={class:"row"},E={class:"form-group mb-2 col-sm"},M=["for"],j=["id"],z={class:"form-group col-sm"},K=["for"],q=["id"];function H(e,s,h,_,b,f){return o(),i("div",null,[t("div",G,S(this.invalidFeedback),1),t("div",N,[t("div",E,[t("label",{for:"app_ip_"+this.uuid,class:"text-muted mb-1"},[...s[2]||(s[2]=[t("strong",null,[t("small",null,"Dashboard IP Address")],-1)])],8,M),l(t("input",{type:"text",class:"form-control mb-2",id:"app_ip_"+this.uuid,"onUpdate:modelValue":s[0]||(s[0]=a=>this.app_ip=a)},null,8,j),[[u,this.app_ip]]),s[3]||(s[3]=t("div",{class:"px-2 py-1 text-warning-emphasis bg-warning-subtle border border-warning-subtle rounded-2 d-inline-block"},[t("small",null,[t("i",{class:"bi bi-exclamation-triangle-fill me-2"}),t("code",null,"0.0.0.0"),p(" means it can be access by anyone with your server IP Address.")])],-1))]),t("div",z,[t("label",{for:"app_port_"+this.uuid,class:"text-muted mb-1"},[...s[4]||(s[4]=[t("strong",null,[t("small",null,"Dashboard Port")],-1)])],8,K),l(t("input",{type:"text",class:"form-control mb-2",id:"app_port_"+this.uuid,"onUpdate:modelValue":s[1]||(s[1]=a=>this.app_port=a)},null,8,q),[[u,this.app_port]])])]),s[5]||(s[5]=t("button",{class:"btn btn-success btn-sm fw-bold rounded-3"},[t("i",{class:"bi bi-floppy-fill me-2"}),p("Update Dashboard Settings & Restart ")],-1))])}const J=c(B,[["render",H]]),O={name:"settings",components:{DashboardEmailSettings:L,DashboardSettingsWireguardConfigurationAutostart:W,DashboardIPPortInput:T,DashboardLanguage:F,LocaleText:U,AccountSettingsMFA:V,DashboardAPIKeys:C,DashboardSettingsInputIPAddressAndPort:J,DashboardTheme:y,DashboardSettingsInputWireguardConfigurationPath:R,AccountSettingsInputPassword:A,AccountSettingsInputUsername:k,PeersDefaultSettingsInput:P},setup(){return{dashboardConfigurationStore:m()}},data(){return{activeTab:"WGDashboard",tabs:[{id:"",title:"WGDashboard Settings"},{id:"peers_settings",title:"Peers Settings"},{id:"wireguard_settings",title:"WireGuard Configuration Settings"}]}}},Q={class:"mt-md-5 mt-3 text-body mb-3"},X={class:"container-md d-flex flex-column gap-3"},Y={class:"border-bottom pb-3"},Z={class:"nav nav-pills nav-justified align-items-center gap-2"},tt={class:"nav-item"},st={class:"my-2"};function et(e,s,h,_,b,f){const a=r("LocaleText"),g=r("RouterLink"),v=r("RouterView");return o(),i("div",Q,[t("div",X,[t("div",Y,[t("ul",Z,[(o(!0),i($,null,w(this.tabs,d=>(o(),i("li",tt,[n(g,{to:{name:d.title},class:"nav-link rounded-3","exact-active-class":"active",role:"button"},{default:I(()=>[t("h6",st,[n(a,{t:d.title},null,8,["t"])])]),_:2},1032,["to"])]))),256))])]),n(v)])])}const pt=c(O,[["render",et]]);export{pt as default};
@@ -1 +1 @@
import{_ as u,c as r,a as e,b as o,h as m,e as p,d as c,t as h,m as l,y as d,z as f,D as w,f as i}from"./index-DYYtDSji.js";import{L as g}from"./localeText-Cd7vLnRM.js";const b={name:"setup",components:{LocaleText:g},setup(){return{store:w()}},data(){return{setup:{username:"",newPassword:"",repeatNewPassword:"",enable_totp:!0},loading:!1,errorMessage:"",done:!1}},computed:{goodToSubmit(){return this.setup.username&&this.setup.newPassword.length>=8&&this.setup.repeatNewPassword.length>=8&&this.setup.newPassword===this.setup.repeatNewPassword}},methods:{submit(){this.loading=!0,f("/api/Welcome_Finish",this.setup,n=>{n.status?(this.done=!0,this.$router.push("/2FASetup")):(document.querySelectorAll("#createAccount input").forEach(s=>s.classList.add("is-invalid")),this.errorMessage=n.message,document.querySelector(".login-container-fluid").scrollTo({top:0,left:0,behavior:"smooth"})),this.loading=!1})}}},_=["data-bs-theme"],x={class:"m-auto text-body",style:{width:"500px"}},v={class:"dashboardLogo display-4"},y={class:"mb-5"},P={key:0,class:"alert alert-danger"},N={class:"d-flex flex-column gap-3"},k={id:"createAccount",class:"d-flex flex-column gap-2"},S={class:"form-group text-body"},T={for:"username",class:"mb-1 text-muted"},C={class:"form-group text-body"},L={for:"password",class:"mb-1 text-muted"},V={class:"form-group text-body"},$={for:"confirmPassword",class:"mb-1 text-muted"},q=["disabled"],A={key:0,class:"d-flex align-items-center w-100"},M={key:1,class:"d-flex align-items-center w-100"};function B(n,s,D,E,U,F){const t=m("LocaleText");return i(),r("div",{class:"container-fluid login-container-fluid d-flex main pt-5 overflow-scroll","data-bs-theme":this.store.Configuration.Server.dashboard_theme},[e("div",x,[e("span",v,[o(t,{t:"Nice to meet you!"})]),e("p",y,[o(t,{t:"Please fill in the following fields to finish setup"}),s[4]||(s[4]=p(" 😊",-1))]),e("div",null,[e("h3",null,[o(t,{t:"Create an account"})]),this.errorMessage?(i(),r("div",P,h(this.errorMessage),1)):c("",!0),e("div",N,[e("form",k,[e("div",S,[e("label",T,[e("small",null,[o(t,{t:"Enter an username you like"})])]),l(e("input",{type:"text",autocomplete:"username","onUpdate:modelValue":s[0]||(s[0]=a=>this.setup.username=a),class:"form-control",id:"username",name:"username",required:""},null,512),[[d,this.setup.username]])]),e("div",C,[e("label",L,[e("small",null,[o(t,{t:"Enter a password"}),e("code",null,[o(t,{t:"(At least 8 characters and make sure is strong enough!)"})])])]),l(e("input",{type:"password",autocomplete:"new-password","onUpdate:modelValue":s[1]||(s[1]=a=>this.setup.newPassword=a),class:"form-control",id:"password",name:"password",required:""},null,512),[[d,this.setup.newPassword]])]),e("div",V,[e("label",$,[e("small",null,[o(t,{t:"Confirm password"})])]),l(e("input",{type:"password",autocomplete:"confirm-new-password","onUpdate:modelValue":s[2]||(s[2]=a=>this.setup.repeatNewPassword=a),class:"form-control",id:"confirmPassword",name:"confirmPassword",required:""},null,512),[[d,this.setup.repeatNewPassword]])])]),e("button",{class:"btn btn-dark btn-lg mb-5 d-flex btn-brand shadow align-items-center",ref:"signInBtn",disabled:!this.goodToSubmit||this.loading||this.done,onClick:s[3]||(s[3]=a=>this.submit())},[!this.loading&&!this.done?(i(),r("span",A,[o(t,{t:"Next"}),s[5]||(s[5]=e("i",{class:"bi bi-chevron-right ms-auto"},null,-1))])):(i(),r("span",M,[o(t,{t:"Saving..."}),s[6]||(s[6]=e("span",{class:"spinner-border ms-auto spinner-border-sm",role:"status"},[e("span",{class:"visually-hidden"},"Loading...")],-1))]))],8,q)])])])],8,_)}const W=u(b,[["render",B]]);export{W as default}; import{_ as u,c as r,a as e,b as o,h as m,e as p,d as c,t as h,m as l,y as d,z as f,D as w,f as i}from"./index-CmClDcBF.js";import{L as g}from"./localeText-TzABauzQ.js";const b={name:"setup",components:{LocaleText:g},setup(){return{store:w()}},data(){return{setup:{username:"",newPassword:"",repeatNewPassword:"",enable_totp:!0},loading:!1,errorMessage:"",done:!1}},computed:{goodToSubmit(){return this.setup.username&&this.setup.newPassword.length>=8&&this.setup.repeatNewPassword.length>=8&&this.setup.newPassword===this.setup.repeatNewPassword}},methods:{submit(){this.loading=!0,f("/api/Welcome_Finish",this.setup,n=>{n.status?(this.done=!0,this.$router.push("/2FASetup")):(document.querySelectorAll("#createAccount input").forEach(s=>s.classList.add("is-invalid")),this.errorMessage=n.message,document.querySelector(".login-container-fluid").scrollTo({top:0,left:0,behavior:"smooth"})),this.loading=!1})}}},_=["data-bs-theme"],x={class:"m-auto text-body",style:{width:"500px"}},v={class:"dashboardLogo display-4"},y={class:"mb-5"},P={key:0,class:"alert alert-danger"},N={class:"d-flex flex-column gap-3"},k={id:"createAccount",class:"d-flex flex-column gap-2"},S={class:"form-group text-body"},T={for:"username",class:"mb-1 text-muted"},C={class:"form-group text-body"},L={for:"password",class:"mb-1 text-muted"},V={class:"form-group text-body"},$={for:"confirmPassword",class:"mb-1 text-muted"},q=["disabled"],A={key:0,class:"d-flex align-items-center w-100"},M={key:1,class:"d-flex align-items-center w-100"};function B(n,s,D,E,U,F){const t=m("LocaleText");return i(),r("div",{class:"container-fluid login-container-fluid d-flex main pt-5 overflow-scroll","data-bs-theme":this.store.Configuration.Server.dashboard_theme},[e("div",x,[e("span",v,[o(t,{t:"Nice to meet you!"})]),e("p",y,[o(t,{t:"Please fill in the following fields to finish setup"}),s[4]||(s[4]=p(" 😊",-1))]),e("div",null,[e("h3",null,[o(t,{t:"Create an account"})]),this.errorMessage?(i(),r("div",P,h(this.errorMessage),1)):c("",!0),e("div",N,[e("form",k,[e("div",S,[e("label",T,[e("small",null,[o(t,{t:"Enter an username you like"})])]),l(e("input",{type:"text",autocomplete:"username","onUpdate:modelValue":s[0]||(s[0]=a=>this.setup.username=a),class:"form-control",id:"username",name:"username",required:""},null,512),[[d,this.setup.username]])]),e("div",C,[e("label",L,[e("small",null,[o(t,{t:"Enter a password"}),e("code",null,[o(t,{t:"(At least 8 characters and make sure is strong enough!)"})])])]),l(e("input",{type:"password",autocomplete:"new-password","onUpdate:modelValue":s[1]||(s[1]=a=>this.setup.newPassword=a),class:"form-control",id:"password",name:"password",required:""},null,512),[[d,this.setup.newPassword]])]),e("div",V,[e("label",$,[e("small",null,[o(t,{t:"Confirm password"})])]),l(e("input",{type:"password",autocomplete:"confirm-new-password","onUpdate:modelValue":s[2]||(s[2]=a=>this.setup.repeatNewPassword=a),class:"form-control",id:"confirmPassword",name:"confirmPassword",required:""},null,512),[[d,this.setup.repeatNewPassword]])])]),e("button",{class:"btn btn-dark btn-lg mb-5 d-flex btn-brand shadow align-items-center",ref:"signInBtn",disabled:!this.goodToSubmit||this.loading||this.done,onClick:s[3]||(s[3]=a=>this.submit())},[!this.loading&&!this.done?(i(),r("span",A,[o(t,{t:"Next"}),s[5]||(s[5]=e("i",{class:"bi bi-chevron-right ms-auto"},null,-1))])):(i(),r("span",M,[o(t,{t:"Saving..."}),s[6]||(s[6]=e("span",{class:"spinner-border ms-auto spinner-border-sm",role:"status"},[e("span",{class:"visually-hidden"},"Loading...")],-1))]))],8,q)])])])],8,_)}const W=u(b,[["render",B]]);export{W as default};
@@ -1 +1 @@
import{_,c as m,a as t,b as r,h as p,r as c,D as h,g as u,L as b,f}from"./index-DYYtDSji.js";import{Q as v}from"./browser-LdOMKRZX.js";import{L as y}from"./localeText-Cd7vLnRM.js";import"./galois-field-I2lBzzs-.js";const g={name:"share",components:{LocaleText:y},async setup(){const o=b(),e=c(!1),s=h(),n=c(""),i=c(void 0),l=c(new Blob);await u("/api/getDashboardTheme",{},d=>{n.value=d.data});const a=o.query.ShareID;return a===void 0||a.length===0?(i.value=void 0,e.value=!0):await u("/api/sharePeer/get",{ShareID:a},d=>{d.status?(i.value=d.data,l.value=new Blob([i.value.file],{type:"text/plain"})):i.value=void 0,e.value=!0}),{store:s,theme:n,peerConfiguration:i,blob:l}},mounted(){this.peerConfiguration&&v.toCanvas(document.querySelector("#qrcode"),this.peerConfiguration.file,o=>{o&&console.error(o)})},methods:{download(){const o=new Blob([this.peerConfiguration.file],{type:"text/plain"}),e=URL.createObjectURL(o),s=`${this.peerConfiguration.fileName}.conf`,n=document.createElement("a");n.href=e,n.download=s,n.click()}},computed:{getBlob(){return URL.createObjectURL(this.blob)}}},x=["data-bs-theme"],w={class:"m-auto text-body",style:{width:"500px"}},C={key:0,class:"text-center position-relative",style:{}},U={class:"position-absolute w-100 h-100 top-0 start-0 d-flex animate__animated animate__fadeInUp",style:{"animation-delay":"0.1s"}},L={class:"m-auto"},I={key:1,class:"d-flex align-items-center flex-column gap-3"},B={class:"h1 dashboardLogo text-center animate__animated animate__fadeInUp"},k={id:"qrcode",class:"rounded-3 shadow animate__animated animate__fadeInUp mb-3",ref:"qrcode"},R={class:"text-muted animate__animated animate__fadeInUp mb-1",style:{"animation-delay":"0.2s"}},D=["download","href"];function q(o,e,s,n,i,l){const a=p("LocaleText");return f(),m("div",{class:"container-fluid login-container-fluid d-flex main pt-5 overflow-scroll","data-bs-theme":this.theme},[t("div",w,[this.peerConfiguration?(f(),m("div",I,[t("div",B,[e[1]||(e[1]=t("h6",null,"WGDashboard",-1)),r(a,{t:"Scan QR Code with the WireGuard App to add peer"})]),t("canvas",k,null,512),t("p",R,[r(a,{t:"or click the button below to download the "}),e[2]||(e[2]=t("samp",null,".conf",-1)),r(a,{t:" file"})]),t("a",{download:this.peerConfiguration.fileName+".conf",href:l.getBlob,class:"btn btn-lg bg-primary-subtle text-primary-emphasis border-1 border-primary-subtle animate__animated animate__fadeInUp shadow-sm",style:{"animation-delay":"0.25s"}},[...e[3]||(e[3]=[t("i",{class:"bi bi-download"},null,-1)])],8,D)])):(f(),m("div",C,[e[0]||(e[0]=t("div",{class:"animate__animated animate__fadeInUp"},[t("h1",{style:{"font-size":"20rem",filter:"blur(1rem)","animation-duration":"7s"},class:"animate__animated animate__flash animate__infinite"},[t("i",{class:"bi bi-file-binary"})])],-1)),t("div",U,[t("h3",L,[r(a,{t:"Oh no... This link is either expired or invalid."})])])]))])],8,x)}const O=_(g,[["render",q],["__scopeId","data-v-1b44aacd"]]);export{O as default}; import{_,c as m,a as t,b as r,h as p,r as c,D as h,g as u,L as b,f}from"./index-CmClDcBF.js";import{Q as v}from"./browser-Bjk3Qpx-.js";import{L as y}from"./localeText-TzABauzQ.js";import"./galois-field-I2lBzzs-.js";const g={name:"share",components:{LocaleText:y},async setup(){const o=b(),e=c(!1),s=h(),n=c(""),i=c(void 0),l=c(new Blob);await u("/api/getDashboardTheme",{},d=>{n.value=d.data});const a=o.query.ShareID;return a===void 0||a.length===0?(i.value=void 0,e.value=!0):await u("/api/sharePeer/get",{ShareID:a},d=>{d.status?(i.value=d.data,l.value=new Blob([i.value.file],{type:"text/plain"})):i.value=void 0,e.value=!0}),{store:s,theme:n,peerConfiguration:i,blob:l}},mounted(){this.peerConfiguration&&v.toCanvas(document.querySelector("#qrcode"),this.peerConfiguration.file,o=>{o&&console.error(o)})},methods:{download(){const o=new Blob([this.peerConfiguration.file],{type:"text/plain"}),e=URL.createObjectURL(o),s=`${this.peerConfiguration.fileName}.conf`,n=document.createElement("a");n.href=e,n.download=s,n.click()}},computed:{getBlob(){return URL.createObjectURL(this.blob)}}},x=["data-bs-theme"],w={class:"m-auto text-body",style:{width:"500px"}},C={key:0,class:"text-center position-relative",style:{}},U={class:"position-absolute w-100 h-100 top-0 start-0 d-flex animate__animated animate__fadeInUp",style:{"animation-delay":"0.1s"}},L={class:"m-auto"},I={key:1,class:"d-flex align-items-center flex-column gap-3"},B={class:"h1 dashboardLogo text-center animate__animated animate__fadeInUp"},k={id:"qrcode",class:"rounded-3 shadow animate__animated animate__fadeInUp mb-3",ref:"qrcode"},R={class:"text-muted animate__animated animate__fadeInUp mb-1",style:{"animation-delay":"0.2s"}},D=["download","href"];function q(o,e,s,n,i,l){const a=p("LocaleText");return f(),m("div",{class:"container-fluid login-container-fluid d-flex main pt-5 overflow-scroll","data-bs-theme":this.theme},[t("div",w,[this.peerConfiguration?(f(),m("div",I,[t("div",B,[e[1]||(e[1]=t("h6",null,"WGDashboard",-1)),r(a,{t:"Scan QR Code with the WireGuard App to add peer"})]),t("canvas",k,null,512),t("p",R,[r(a,{t:"or click the button below to download the "}),e[2]||(e[2]=t("samp",null,".conf",-1)),r(a,{t:" file"})]),t("a",{download:this.peerConfiguration.fileName+".conf",href:l.getBlob,class:"btn btn-lg bg-primary-subtle text-primary-emphasis border-1 border-primary-subtle animate__animated animate__fadeInUp shadow-sm",style:{"animation-delay":"0.25s"}},[...e[3]||(e[3]=[t("i",{class:"bi bi-download"},null,-1)])],8,D)])):(f(),m("div",C,[e[0]||(e[0]=t("div",{class:"animate__animated animate__fadeInUp"},[t("h1",{style:{"font-size":"20rem",filter:"blur(1rem)","animation-duration":"7s"},class:"animate__animated animate__flash animate__infinite"},[t("i",{class:"bi bi-file-binary"})])],-1)),t("div",U,[t("h3",L,[r(a,{t:"Oh no... This link is either expired or invalid."})])])]))])],8,x)}const O=_(g,[["render",q],["__scopeId","data-v-1b44aacd"]]);export{O as default};
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
import{_ as p,r as b,q as f,c as t,f as r,b as n,w as v,d as x,n as g,s as l,a as c,e as C,t as d,k as w,p as y}from"./index-DYYtDSji.js";import{L as _}from"./localeText-Cd7vLnRM.js";const k={class:"text-muted me-2"},N={class:"fw-bold"},q={__name:"cpuCore",props:{core_number:Number,percentage:Number,align:Boolean,square:Boolean},setup(e){y(i=>({v60cb52de:s.value}));const u=e,o=b(!1),s=f(()=>u.square?"40px":"25px");return(i,a)=>(r(),t("div",{class:"flex-grow-1 square rounded-3 border position-relative p-2",onMouseenter:a[0]||(a[0]=m=>o.value=!0),onMouseleave:a[1]||(a[1]=m=>o.value=!1),style:l({"background-color":`rgb(13 110 253 / ${e.percentage*10}%)`})},[n(w,{name:"zoomReversed"},{default:v(()=>[o.value?(r(),t("div",{key:0,style:l([{"white-space":"nowrap"},{top:s.value}]),class:g(["floatingLabel z-3 border position-absolute d-block p-1 px-2 bg-body text-body rounded-3 border shadow d-flex",[e.align?"end-0":"start-0"]])},[c("small",k,[n(_,{t:"Core"}),C(" #"+d(e.core_number+1),1)]),c("small",N,d(e.percentage)+"% ",1)],6)):x("",!0)]),_:1})],36))}},h=p(q,[["__scopeId","data-v-f8963858"]]);export{h as C}; import{_ as p,r as b,q as f,c as t,f as r,b as n,w as v,d as x,n as g,s as l,a as c,e as C,t as d,k as w,p as y}from"./index-CmClDcBF.js";import{L as _}from"./localeText-TzABauzQ.js";const k={class:"text-muted me-2"},N={class:"fw-bold"},q={__name:"cpuCore",props:{core_number:Number,percentage:Number,align:Boolean,square:Boolean},setup(e){y(i=>({v60cb52de:s.value}));const u=e,o=b(!1),s=f(()=>u.square?"40px":"25px");return(i,a)=>(r(),t("div",{class:"flex-grow-1 square rounded-3 border position-relative p-2",onMouseenter:a[0]||(a[0]=m=>o.value=!0),onMouseleave:a[1]||(a[1]=m=>o.value=!1),style:l({"background-color":`rgb(13 110 253 / ${e.percentage*10}%)`})},[n(w,{name:"zoomReversed"},{default:v(()=>[o.value?(r(),t("div",{key:0,style:l([{"white-space":"nowrap"},{top:s.value}]),class:g(["floatingLabel z-3 border position-absolute d-block p-1 px-2 bg-body text-body rounded-3 border shadow d-flex",[e.align?"end-0":"start-0"]])},[c("small",k,[n(_,{t:"Core"}),C(" #"+d(e.core_number+1),1)]),c("small",N,d(e.percentage)+"% ",1)],6)):x("",!0)]),_:1})],36))}},h=p(q,[["__scopeId","data-v-f8963858"]]);export{h as C};
@@ -1 +1 @@
import{_ as h,c as m,a as t,b as i,h as d,t as p,m as f,y as _,j as r,w as c,z as b,D as v,g,f as n}from"./index-DYYtDSji.js";import{Q as x}from"./browser-LdOMKRZX.js";import{L as y}from"./localeText-Cd7vLnRM.js";import"./galois-field-I2lBzzs-.js";const T={name:"totp",components:{LocaleText:y},async setup(){const s=v();let e="";return await g("/api/Welcome_GetTotpLink",{},(a=>{a.status&&(e=a.data)})),{l:e,store:s}},mounted(){this.l&&x.toCanvas(document.getElementById("qrcode"),this.l,function(s){})},data(){return{totp:"",totpInvalidMessage:"",verified:!1}},methods:{validateTotp(){}},watch:{totp(s){const e=document.querySelector("#totp");e.classList.remove("is-invalid","is-valid"),s.length===6&&(console.log(s),/[0-9]{6}/.test(s)?b("/api/Welcome_VerifyTotpLink",{totp:s},a=>{a.status?(this.verified=!0,e.classList.add("is-valid"),this.$emit("verified")):(e.classList.add("is-invalid"),this.totpInvalidMessage="TOTP does not match.")}):(e.classList.add("is-invalid"),this.totpInvalidMessage="TOTP can only contain numbers"))}}},k=["data-bs-theme"],L={class:"m-auto text-body",style:{width:"500px"}},w={class:"d-flex flex-column"},C={class:"dashboardLogo display-4"},M={class:"mb-2"},P={class:"text-muted"},I={class:"p-3 bg-body-secondary rounded-3 border mb-3"},O={class:"text-muted mb-0"},B=["href"],$={style:{"line-break":"anywhere"}},D={for:"totp",class:"mb-2"},R={class:"text-muted"},S={class:"form-group mb-2"},q=["disabled"],A={class:"invalid-feedback"},E={class:"valid-feedback"},F={class:"d-flex gap-3 mt-5 flex-column"};function Q(s,e,a,G,N,W){const o=d("LocaleText"),l=d("RouterLink");return n(),m("div",{class:"container-fluid login-container-fluid d-flex main pt-5 overflow-scroll","data-bs-theme":this.store.Configuration.Server.dashboard_theme},[t("div",L,[t("div",w,[t("div",null,[t("h1",C,[i(o,{t:"Multi-Factor Authentication (MFA)"})]),t("p",M,[t("small",P,[i(o,{t:"1. Please scan the following QR Code to generate TOTP with your choice of authenticator"})])]),e[1]||(e[1]=t("canvas",{id:"qrcode",class:"rounded-3 mb-2"},null,-1)),t("div",I,[t("p",O,[t("small",null,[i(o,{t:"Or you can click the link below:"})])]),t("a",{href:this.l},[t("code",$,p(this.l),1)],8,B)]),t("label",D,[t("small",R,[i(o,{t:"2. Enter the TOTP generated by your authenticator to verify"})])]),t("div",S,[f(t("input",{class:"form-control text-center totp",id:"totp",maxlength:"6",type:"text",inputmode:"numeric",autocomplete:"one-time-code","onUpdate:modelValue":e[0]||(e[0]=u=>this.totp=u),disabled:this.verified},null,8,q),[[_,this.totp]]),t("div",A,[i(o,{t:this.totpInvalidMessage},null,8,["t"])]),t("div",E,[i(o,{t:"TOTP verified!"})])])]),e[4]||(e[4]=t("hr",null,null,-1)),t("div",F,[this.verified?(n(),r(l,{key:1,to:"/",class:"btn btn-dark btn-lg d-flex btn-brand shadow align-items-center flex-grow-1 rounded-3"},{default:c(()=>[i(o,{t:"Complete"}),e[3]||(e[3]=t("i",{class:"bi bi-chevron-right ms-auto"},null,-1))]),_:1})):(n(),r(l,{key:0,to:"/",class:"btn bg-secondary-subtle text-secondary-emphasis rounded-3 flex-grow-1 btn-lg border-1 border-secondary-subtle shadow d-flex"},{default:c(()=>[i(o,{t:"I don't need MFA"}),e[2]||(e[2]=t("i",{class:"bi bi-chevron-right ms-auto"},null,-1))]),_:1}))])])])],8,k)}const H=h(T,[["render",Q]]);export{H as default}; import{_ as h,c as m,a as t,b as i,h as d,t as p,m as f,y as _,j as r,w as c,z as b,D as v,g,f as n}from"./index-CmClDcBF.js";import{Q as x}from"./browser-Bjk3Qpx-.js";import{L as y}from"./localeText-TzABauzQ.js";import"./galois-field-I2lBzzs-.js";const T={name:"totp",components:{LocaleText:y},async setup(){const s=v();let e="";return await g("/api/Welcome_GetTotpLink",{},(a=>{a.status&&(e=a.data)})),{l:e,store:s}},mounted(){this.l&&x.toCanvas(document.getElementById("qrcode"),this.l,function(s){})},data(){return{totp:"",totpInvalidMessage:"",verified:!1}},methods:{validateTotp(){}},watch:{totp(s){const e=document.querySelector("#totp");e.classList.remove("is-invalid","is-valid"),s.length===6&&(console.log(s),/[0-9]{6}/.test(s)?b("/api/Welcome_VerifyTotpLink",{totp:s},a=>{a.status?(this.verified=!0,e.classList.add("is-valid"),this.$emit("verified")):(e.classList.add("is-invalid"),this.totpInvalidMessage="TOTP does not match.")}):(e.classList.add("is-invalid"),this.totpInvalidMessage="TOTP can only contain numbers"))}}},k=["data-bs-theme"],L={class:"m-auto text-body",style:{width:"500px"}},w={class:"d-flex flex-column"},C={class:"dashboardLogo display-4"},M={class:"mb-2"},P={class:"text-muted"},I={class:"p-3 bg-body-secondary rounded-3 border mb-3"},O={class:"text-muted mb-0"},B=["href"],$={style:{"line-break":"anywhere"}},D={for:"totp",class:"mb-2"},R={class:"text-muted"},S={class:"form-group mb-2"},q=["disabled"],A={class:"invalid-feedback"},E={class:"valid-feedback"},F={class:"d-flex gap-3 mt-5 flex-column"};function Q(s,e,a,G,N,W){const o=d("LocaleText"),l=d("RouterLink");return n(),m("div",{class:"container-fluid login-container-fluid d-flex main pt-5 overflow-scroll","data-bs-theme":this.store.Configuration.Server.dashboard_theme},[t("div",L,[t("div",w,[t("div",null,[t("h1",C,[i(o,{t:"Multi-Factor Authentication (MFA)"})]),t("p",M,[t("small",P,[i(o,{t:"1. Please scan the following QR Code to generate TOTP with your choice of authenticator"})])]),e[1]||(e[1]=t("canvas",{id:"qrcode",class:"rounded-3 mb-2"},null,-1)),t("div",I,[t("p",O,[t("small",null,[i(o,{t:"Or you can click the link below:"})])]),t("a",{href:this.l},[t("code",$,p(this.l),1)],8,B)]),t("label",D,[t("small",R,[i(o,{t:"2. Enter the TOTP generated by your authenticator to verify"})])]),t("div",S,[f(t("input",{class:"form-control text-center totp",id:"totp",maxlength:"6",type:"text",inputmode:"numeric",autocomplete:"one-time-code","onUpdate:modelValue":e[0]||(e[0]=u=>this.totp=u),disabled:this.verified},null,8,q),[[_,this.totp]]),t("div",A,[i(o,{t:this.totpInvalidMessage},null,8,["t"])]),t("div",E,[i(o,{t:"TOTP verified!"})])])]),e[4]||(e[4]=t("hr",null,null,-1)),t("div",F,[this.verified?(n(),r(l,{key:1,to:"/",class:"btn btn-dark btn-lg d-flex btn-brand shadow align-items-center flex-grow-1 rounded-3"},{default:c(()=>[i(o,{t:"Complete"}),e[3]||(e[3]=t("i",{class:"bi bi-chevron-right ms-auto"},null,-1))]),_:1})):(n(),r(l,{key:0,to:"/",class:"btn bg-secondary-subtle text-secondary-emphasis rounded-3 flex-grow-1 btn-lg border-1 border-secondary-subtle shadow d-flex"},{default:c(()=>[i(o,{t:"I don't need MFA"}),e[2]||(e[2]=t("i",{class:"bi bi-chevron-right ms-auto"},null,-1))]),_:1}))])])])],8,k)}const H=h(T,[["render",Q]]);export{H as default};
@@ -1 +1 @@
import{_ as h,c as o,a as t,b as n,h as r,m as g,y as b,H as y,w as c,k as u,g as f,W as x,f as l,e as v,F as m,i as _,s as k,n as T,t as i}from"./index-DYYtDSji.js";import{O as A}from"./osmap-BtV_4HvJ.js";import{L as w}from"./localeText-Cd7vLnRM.js";import"./Vector-CuSZivra.js";const R={name:"traceroute",components:{LocaleText:w,OSMap:A},data(){return{tracing:!1,ipAddress:void 0,tracerouteResult:void 0}},setup(){return{store:x()}},methods:{execute(){this.ipAddress&&(this.tracing=!0,this.tracerouteResult=void 0,f("/api/traceroute/execute",{ipAddress:this.ipAddress},d=>{d.status?this.tracerouteResult=d.data:this.store.newMessage("Server",d.message,"danger"),this.tracing=!1}))}}},M={class:"mt-md-5 mt-3 text-body"},S={class:"container-md"},$={class:"mb-3 text-body"},L={class:"d-flex gap-2 mb-3 flex-column"},C={class:"flex-grow-1"},P={class:"mb-1 text-muted",for:"ipAddress"},O=["disabled"],V=["disabled"],B={key:0,class:"d-block"},H={key:1,class:"d-block"},I={class:"position-relative"},N={key:"pingPlaceholder"},z={key:1},D={key:"table",class:"w-100 mt-2"},E={class:"table table-sm rounded-3 w-100"},F={scope:"col"},G={scope:"col"},K={scope:"col"},W={scope:"col"},U={scope:"col"},j={scope:"col"},q={key:0},J={key:1};function Q(d,s,X,Y,Z,tt){const a=r("LocaleText"),p=r("OSMap");return l(),o("div",M,[t("div",S,[t("h3",$,[n(a,{t:"Traceroute"})]),t("div",L,[t("div",C,[t("label",P,[t("small",null,[n(a,{t:"Enter IP Address / Hostname"})])]),g(t("input",{disabled:this.tracing,id:"ipAddress",class:"form-control rounded-3","onUpdate:modelValue":s[0]||(s[0]=e=>this.ipAddress=e),onKeyup:s[1]||(s[1]=y(e=>this.execute(),["enter"])),type:"text"},null,40,O),[[b,this.ipAddress]])]),t("button",{class:"btn btn-primary rounded-3 position-relative flex-grow-1",disabled:this.tracing||!this.ipAddress,onClick:s[2]||(s[2]=e=>this.execute())},[n(u,{name:"slide"},{default:c(()=>[this.tracing?(l(),o("span",H,[...s[4]||(s[4]=[t("span",{class:"spinner-border spinner-border-sm","aria-hidden":"true"},null,-1),t("span",{class:"visually-hidden",role:"status"},"Loading...",-1)])])):(l(),o("span",B,[...s[3]||(s[3]=[t("i",{class:"bi bi-person-walking me-2"},null,-1),v("Trace! ",-1)])]))]),_:1})],8,V)]),t("div",I,[n(u,{name:"ping"},{default:c(()=>[this.tracerouteResult?(l(),o("div",z,[n(p,{d:this.tracerouteResult,type:"traceroute"},null,8,["d"]),t("div",D,[t("table",E,[t("thead",null,[t("tr",null,[t("th",F,[n(a,{t:"Hop"})]),t("th",G,[n(a,{t:"IP Address"})]),t("th",K,[n(a,{t:"Average RTT (ms)"})]),t("th",W,[n(a,{t:"Min RTT (ms)"})]),t("th",U,[n(a,{t:"Max RTT (ms)"})]),t("th",j,[n(a,{t:"Geolocation"})])])]),t("tbody",null,[(l(!0),o(m,null,_(this.tracerouteResult,(e,et)=>(l(),o("tr",null,[t("td",null,[t("small",null,i(e.hop),1)]),t("td",null,[t("small",null,[t("samp",null,i(e.ip),1)])]),t("td",null,[t("small",null,[t("samp",null,i(e.avg_rtt),1)])]),t("td",null,[t("small",null,[t("samp",null,i(e.min_rtt),1)])]),t("td",null,[t("small",null,[t("samp",null,i(e.max_rtt),1)])]),t("td",null,[e.geo&&e.geo.city&&e.geo.country?(l(),o("span",q,[t("small",null,i(e.geo.city)+", "+i(e.geo.country),1)])):(l(),o("span",J," - "))])]))),256))])])])])):(l(),o("div",N,[s[5]||(s[5]=t("div",{class:"pingPlaceholder bg-body-secondary rounded-3 mb-3",style:{height:"300px !important"}},null,-1)),(l(),o(m,null,_(5,e=>t("div",{class:T(["pingPlaceholder bg-body-secondary rounded-3 mb-3",{"animate__animated animate__flash animate__slower animate__infinite":this.tracing}]),style:k({"animation-delay":`${e*.05}s`})},null,6)),64))]))]),_:1})])])])}const at=h(R,[["render",Q],["__scopeId","data-v-125b538b"]]);export{at as default}; import{_ as h,c as o,a as t,b as n,h as r,m as g,y as b,H as y,w as c,k as u,g as f,W as x,f as l,e as v,F as m,i as _,s as k,n as T,t as i}from"./index-CmClDcBF.js";import{O as A}from"./osmap-Bu2QO00-.js";import{L as w}from"./localeText-TzABauzQ.js";import"./Vector-CuSZivra.js";const R={name:"traceroute",components:{LocaleText:w,OSMap:A},data(){return{tracing:!1,ipAddress:void 0,tracerouteResult:void 0}},setup(){return{store:x()}},methods:{execute(){this.ipAddress&&(this.tracing=!0,this.tracerouteResult=void 0,f("/api/traceroute/execute",{ipAddress:this.ipAddress},d=>{d.status?this.tracerouteResult=d.data:this.store.newMessage("Server",d.message,"danger"),this.tracing=!1}))}}},M={class:"mt-md-5 mt-3 text-body"},S={class:"container-md"},$={class:"mb-3 text-body"},L={class:"d-flex gap-2 mb-3 flex-column"},C={class:"flex-grow-1"},P={class:"mb-1 text-muted",for:"ipAddress"},O=["disabled"],V=["disabled"],B={key:0,class:"d-block"},H={key:1,class:"d-block"},I={class:"position-relative"},N={key:"pingPlaceholder"},z={key:1},D={key:"table",class:"w-100 mt-2"},E={class:"table table-sm rounded-3 w-100"},F={scope:"col"},G={scope:"col"},K={scope:"col"},W={scope:"col"},U={scope:"col"},j={scope:"col"},q={key:0},J={key:1};function Q(d,s,X,Y,Z,tt){const a=r("LocaleText"),p=r("OSMap");return l(),o("div",M,[t("div",S,[t("h3",$,[n(a,{t:"Traceroute"})]),t("div",L,[t("div",C,[t("label",P,[t("small",null,[n(a,{t:"Enter IP Address / Hostname"})])]),g(t("input",{disabled:this.tracing,id:"ipAddress",class:"form-control rounded-3","onUpdate:modelValue":s[0]||(s[0]=e=>this.ipAddress=e),onKeyup:s[1]||(s[1]=y(e=>this.execute(),["enter"])),type:"text"},null,40,O),[[b,this.ipAddress]])]),t("button",{class:"btn btn-primary rounded-3 position-relative flex-grow-1",disabled:this.tracing||!this.ipAddress,onClick:s[2]||(s[2]=e=>this.execute())},[n(u,{name:"slide"},{default:c(()=>[this.tracing?(l(),o("span",H,[...s[4]||(s[4]=[t("span",{class:"spinner-border spinner-border-sm","aria-hidden":"true"},null,-1),t("span",{class:"visually-hidden",role:"status"},"Loading...",-1)])])):(l(),o("span",B,[...s[3]||(s[3]=[t("i",{class:"bi bi-person-walking me-2"},null,-1),v("Trace! ",-1)])]))]),_:1})],8,V)]),t("div",I,[n(u,{name:"ping"},{default:c(()=>[this.tracerouteResult?(l(),o("div",z,[n(p,{d:this.tracerouteResult,type:"traceroute"},null,8,["d"]),t("div",D,[t("table",E,[t("thead",null,[t("tr",null,[t("th",F,[n(a,{t:"Hop"})]),t("th",G,[n(a,{t:"IP Address"})]),t("th",K,[n(a,{t:"Average RTT (ms)"})]),t("th",W,[n(a,{t:"Min RTT (ms)"})]),t("th",U,[n(a,{t:"Max RTT (ms)"})]),t("th",j,[n(a,{t:"Geolocation"})])])]),t("tbody",null,[(l(!0),o(m,null,_(this.tracerouteResult,(e,et)=>(l(),o("tr",null,[t("td",null,[t("small",null,i(e.hop),1)]),t("td",null,[t("small",null,[t("samp",null,i(e.ip),1)])]),t("td",null,[t("small",null,[t("samp",null,i(e.avg_rtt),1)])]),t("td",null,[t("small",null,[t("samp",null,i(e.min_rtt),1)])]),t("td",null,[t("small",null,[t("samp",null,i(e.max_rtt),1)])]),t("td",null,[e.geo&&e.geo.city&&e.geo.country?(l(),o("span",q,[t("small",null,i(e.geo.city)+", "+i(e.geo.country),1)])):(l(),o("span",J," - "))])]))),256))])])])])):(l(),o("div",N,[s[5]||(s[5]=t("div",{class:"pingPlaceholder bg-body-secondary rounded-3 mb-3",style:{height:"300px !important"}},null,-1)),(l(),o(m,null,_(5,e=>t("div",{class:T(["pingPlaceholder bg-body-secondary rounded-3 mb-3",{"animate__animated animate__flash animate__slower animate__infinite":this.tracing}]),style:k({"animation-delay":`${e*.05}s`})},null,6)),64))]))]),_:1})])])])}const at=h(R,[["render",Q],["__scopeId","data-v-125b538b"]]);export{at as default};
@@ -1 +1 @@
import{B as n,D as r,c as i,a as s,b as t,j as l,d as c,u,f as e}from"./index-DYYtDSji.js";import{L as a}from"./localeText-Cd7vLnRM.js";import{D as _,d as m,e as h,A as p,a as b,b as v,_ as g,c as f}from"./dashboardEmailSettings-BLi3ez-N.js";import"./dayjs.min-WRW_FTL4.js";import"./vue-datepicker-Cw5Y4tvU.js";import"./index-DPa-4xgI.js";const A={class:"d-flex gap-3 flex-column"},D={class:"card rounded-3"},y={class:"card-header"},S={class:"my-2"},x={class:"card-body"},I={class:"row g-2"},P={class:"col-sm"},B={class:"col-sm"},C={class:"card rounded-3"},k={class:"card-header"},w={class:"my-2"},L={class:"card-body"},F={class:"card rounded-3"},M={class:"card-header"},N={class:"my-2"},V={class:"card-body d-flex flex-column gap-3"},G=n({__name:"wgdashboardSettings",setup(T){const d=r();return(U,o)=>(e(),i("div",A,[s("div",D,[s("div",y,[s("h6",S,[o[0]||(o[0]=s("i",{class:"bi bi-magic me-2"},null,-1)),t(a,{t:"Appearance"})])]),s("div",x,[s("div",I,[s("div",P,[t(_)]),s("div",B,[t(m)])])])]),s("div",C,[s("div",k,[s("h6",w,[o[1]||(o[1]=s("i",{class:"bi bi-ethernet me-2"},null,-1)),t(a,{t:"Dashboard IP Address & Listen Port"})])]),s("div",L,[t(h)])]),s("div",F,[s("div",M,[s("h6",N,[o[2]||(o[2]=s("i",{class:"bi bi-people-fill me-2"},null,-1)),t(a,{t:"Account Settings"})])]),s("div",V,[s("div",null,[t(p,{targetData:"username",title:"Username"})]),o[3]||(o[3]=s("hr",null,null,-1)),s("div",null,[t(b,{targetData:"password"})]),o[4]||(o[4]=s("hr",null,null,-1)),s("div",null,[s("h6",null,[t(a,{t:"Multi-Factor Authentication (MFA)"})]),u(d).getActiveCrossServer()?c("",!0):(e(),l(f,{key:0}))])])]),t(v),t(g)]))}});export{G as default}; import{B as n,D as r,c as i,a as s,b as t,j as l,d as c,u,f as e}from"./index-CmClDcBF.js";import{L as a}from"./localeText-TzABauzQ.js";import{D as _,d as m,e as h,A as p,a as b,b as v,_ as g,c as f}from"./dashboardEmailSettings-C4AqU3LX.js";import"./dayjs.min-DFlK6ZAc.js";import"./vue-datepicker-BYHO-v3J.js";import"./index-DZpKhbG8.js";const A={class:"d-flex gap-3 flex-column"},D={class:"card rounded-3"},y={class:"card-header"},S={class:"my-2"},x={class:"card-body"},I={class:"row g-2"},P={class:"col-sm"},B={class:"col-sm"},C={class:"card rounded-3"},k={class:"card-header"},w={class:"my-2"},L={class:"card-body"},F={class:"card rounded-3"},M={class:"card-header"},N={class:"my-2"},V={class:"card-body d-flex flex-column gap-3"},G=n({__name:"wgdashboardSettings",setup(T){const d=r();return(U,o)=>(e(),i("div",A,[s("div",D,[s("div",y,[s("h6",S,[o[0]||(o[0]=s("i",{class:"bi bi-magic me-2"},null,-1)),t(a,{t:"Appearance"})])]),s("div",x,[s("div",I,[s("div",P,[t(_)]),s("div",B,[t(m)])])])]),s("div",C,[s("div",k,[s("h6",w,[o[1]||(o[1]=s("i",{class:"bi bi-ethernet me-2"},null,-1)),t(a,{t:"Dashboard IP Address & Listen Port"})])]),s("div",L,[t(h)])]),s("div",F,[s("div",M,[s("h6",N,[o[2]||(o[2]=s("i",{class:"bi bi-people-fill me-2"},null,-1)),t(a,{t:"Account Settings"})])]),s("div",V,[s("div",null,[t(p,{targetData:"username",title:"Username"})]),o[3]||(o[3]=s("hr",null,null,-1)),s("div",null,[t(b,{targetData:"password"})]),o[4]||(o[4]=s("hr",null,null,-1)),s("div",null,[s("h6",null,[t(a,{t:"Multi-Factor Authentication (MFA)"})]),u(d).getActiveCrossServer()?c("",!0):(e(),l(f,{key:0}))])])]),t(v),t(g)]))}});export{G as default};
+1 -1
View File
@@ -10,7 +10,7 @@
<link rel="icon" href="/static/dist/WGDashboardAdmin/img/Logo-2-512x512.png"> <link rel="icon" href="/static/dist/WGDashboardAdmin/img/Logo-2-512x512.png">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>WGDashboard</title> <title>WGDashboard</title>
<script type="module" crossorigin src="/static/dist/WGDashboardAdmin/assets/index-DYYtDSji.js"></script> <script type="module" crossorigin src="/static/dist/WGDashboardAdmin/assets/index-CmClDcBF.js"></script>
<link rel="stylesheet" crossorigin href="/static/dist/WGDashboardAdmin/assets/index-Bcu-vmis.css"> <link rel="stylesheet" crossorigin href="/static/dist/WGDashboardAdmin/assets/index-Bcu-vmis.css">
</head> </head>
<body> <body>
+442
View File
@@ -0,0 +1,442 @@
{
" file": " файла",
"(.*) Available IP Address": "$1 налични IP адреса",
"(.*) Minutes": "$1 минути",
"(.*) Seconds": "$1 секунди",
"(.*) Used": "$1 използвани",
"(.*) in group (.*)\\?": "$1 в група $2?",
"(.*) is off": "$1 е изключен",
"(.*) is on": "$1 е включен",
"([0-9].*) Backups?": "$1 архива",
"([0-9].*) Clients*": "$1 клиента",
"([0-9].*) Peers?": "$1 пиъра",
"([0-9]{1,}) Interfaces": "$1 интерфейса",
"([0-9]{1,}) Partitions": "$1 дяла",
"(v[0-9.]{1,}) is now available for update!": "$1 е налична за актуализация!",
"1\\. Please scan the following QR Code to generate TOTP with your choice of authenticator": "1. Моля, сканирайте следния QR код, за да генерирате TOTP с избрания от вас удостоверител",
"2\\. Enter the TOTP generated by your authenticator to verify": "2. Въведете генерирания от удостоверителя TOTP за потвърждение",
"API Key": "API ключ",
"API Key created": "API ключът е създаден",
"API Key deleted": "API ключът е изтрит",
"API Keys": "API ключове",
"API Keys function is failed to disable": "Неуспешно деактивиране на функцията за API ключове",
"API Keys function is failed to enable": "Неуспешно активиране на функцията за API ключове",
"API Keys function is successfully disabled": "Функцията за API ключове е успешно деактивирана",
"API Keys function is successfully enabled": "Функцията за API ключове е успешно активирана",
"Access Remote Server": "Достъп до отдалечен сървър",
"Access Restricted": "Достъпът е ограничен",
"Account Settings": "Настройки на акаунта",
"Active Jobs": "Активни задачи",
"Add": "Добави",
"Add Peers": "Добави пиъри",
"Add Template": "Добави шаблон",
"Add Webhook": "Добави Webhook",
"Adding\\.\\.\\.": "Добавяне...",
"Address": "Адрес",
"Advanced Options": "Разширени настройки",
"All": "Всички",
"All Active Jobs": "Всички активни задачи",
"All connected peers will get disconnected": "Всички свързани пиъри ще бъдат прекъснати",
"Allow Access": "Разреши достъп",
"Allow access successfully": "Достъпът е разрешен успешно",
"Allowed IP already taken by another peer": "Разрешеният IP вече се използва от друг пиър",
"Allowed IPs": "Разрешени IP адреси",
"Allowed IPs Validation": "Валидация на разрешени IP адреси",
"Allowed IPs already taken by another peer": "Разрешените IP адреси вече се използват от друг пиър",
"Allowed IPs is invalid": "Разрешените IP адреси са невалидни",
"Allowing Access\\.\\.\\.": "Разрешаване на достъпа...",
"AmneziaWG Peer Setting": "Настройка на AmneziaWG пиър",
"Appearance": "Външен вид",
"Are you sure to delete": "Сигурни ли сте, че искате да изтриете",
"Are you sure to delete assignment for": "Сигурни ли сте, че искате да изтриете присвояването за",
"Are you sure to delete this API key\\?": "Сигурни ли сте, че искате да изтриете този API ключ?",
"Are you sure to delete this backup\\?": "Сигурни ли сте, че искате да изтриете този архив?",
"Are you sure to delete this client\\?": "Сигурни ли сте, че искате да изтриете този клиент?",
"Are you sure to delete this configuration\\?": "Сигурни ли сте, че искате да изтриете тази конфигурация?",
"Are you sure to delete this peer\\?": "Сигурни ли сте, че искате да изтриете този пиър?",
"Are you sure to restore this backup\\?": "Сигурни ли сте, че искате да възстановите този архив?",
"Assign Peer": "Присвои пиър",
"Assign Peer to Client": "Присвои пиър на клиент",
"Assign successfully!": "Успешно присвояване!",
"Assign to Clients": "Присвои на клиенти",
"Assigned Clients": "Присвоени клиенти",
"Assigned Peers": "Присвоени пиъри",
"Available Peers": "Налични пиъри",
"Average / Min / Max Round Trip Time": "Средно / Мин. / Макс. време за обратен път",
"Average RTT \\(ms\\)": "Средно RTT (мс)",
"Back": "Назад",
"Backup": "Архив",
"Backup & Restore": "Архив и възстановяване",
"Backup Date": "Дата на архива",
"Backup not selected": "Не е избран архив",
"Both configuration file \\(\\.conf\\) and database table related to this configuration will get deleted": "Както конфигурационният файл (.conf), така и таблицата в базата данни, свързана с тази конфигурация, ще бъдат изтрити",
"Bulk Add": "Масово добавяне",
"By adding peers by bulk, each peer's name will be auto generated, and Allowed IP will be assign to the next available IP\\.": "При масово добавяне името на всеки пиър ще бъде генерирано автоматично, а разрешеният IP ще бъде следващият свободен.",
"CPU": "Процесор",
"CPU Usage": "Използване на процесора",
"Cancel": "Отказ",
"Checking backups...": "Проверка на архивите...",
"Checking for update...": "Проверка за актуализация...",
"Clear Selection": "Изчисти избора",
"Click": "Щракнете",
"Click to change a backup": "Щракнете за смяна на архива",
"Client ID": "ID на клиент",
"Client Name": "Име на клиент",
"Client Side App": "Клиентско приложение",
"Clients": "Клиенти",
"Clients Settings": "Настройки на клиенти",
"Close": "Затвори",
"Complete": "Завърши",
"Configuration": "Конфигурация",
"Configuration File": "Конфигурационен файл",
"Configuration Name": "Име на конфигурацията",
"Configuration Settings": "Настройки на конфигурацията",
"Configuration deleted": "Конфигурацията е изтрита",
"Configuration does not exist": "Конфигурацията не съществува",
"Configuration name already exist\\.": "Името на конфигурацията вече съществува.",
"Configuration name can only contain 15 lower/uppercase alphabet, numbers, underscore, equal sign, plus sign, period and hyphen\\.": "Името на конфигурацията може да съдържа само 15 малки/големи букви, цифри, долна черта, знак за равенство, знак плюс, точка и тире.",
"Configuration name is invalid. Possible reasons:": "Името на конфигурацията е невалидно. Възможни причини:",
"Configuration restored": "Конфигурацията е възстановена",
"Configuration saved": "Конфигурацията е запазена",
"Configurations": "Конфигурации",
"Configurations Directory": "Директория с конфигурации",
"Confirm \\& edit restore information": "Потвърдете и редактирайте информацията за възстановяване",
"Confirm password": "Потвърдете паролата",
"Connected": "Свързан",
"Connected Peers": "Свързани пиъри",
"Contain": "Съдържа",
"Content Type": "Тип съдържание",
"Count": "Брой",
"Create": "Създай",
"Create API Key": "Създай API ключ",
"Create Backup": "Създай архив",
"Create an account": "Създай акаунт",
"Create templates to keep track a list of available Subnets \\& Listen Ports\n": "Създайте шаблони за списък с налични подмрежи и портове",
"Creating\\.\\.\\.": "Създаване...",
"Current Password": "Текуща парола",
"Current Version:": "Текуща версия:",
"Currently the peer is not sharing": "В момента пиърът не се споделя",
"Custom Headers": "Персонализирани хедъри",
"DNS": "DNS",
"DNS format is incorrect": "Форматът на DNS е грешен",
"Danger Zone": "Опасна зона",
"Dark": "Тъмна",
"Dashboard IP Address \\& Listen Port": "IP адрес и порт на таблото",
"Dashboard Language": "Език на таблото",
"Dashboard Theme": "Тема на таблото",
"Dashboard language update failed": "Неуспешна промяна на езика на таблото",
"Data": "Данни",
"Database File": "Файл на базата данни",
"Date": "Дата",
"Datetime": "Дата и час",
"Delete": "Изтрий",
"Delete Client": "Изтрий клиент",
"Delete Configuration": "Изтрий конфигурацията",
"Delete Peer": "Изтрий пиъра",
"Delete current configuration's database table and \\.conf file": "Изтриване на таблицата в базата данни и .conf файла на текущата конфигурация",
"Deleted ([0-9]{1,}) peer\\(s\\)": "Изтрити $1 пиъра",
"Deleted ([0-9]{1,}) peer\\(s\\) successfully. Failed to delete ([0-9]{1,}) peer\\(s\\)": "Успешно изтрити $1 пиъра. Неуспешно изтриване на $2 пиъра",
"Deleting...": "Изтриване...",
"Details": "Детайли",
"Disabled": "Деактивирано",
"Disconnected": "Прекъснат",
"Discord Server": "Discord сървър",
"Display": "Изглед",
"Display As": "Покажи като",
"Don't think that's a good idea": "Не мисля, че това е добра идея",
"Done": "Готово",
"Download": "Изтегли",
"Download All": "Изтегли всички",
"Download Finished": "Изтеглянето завърши",
"Download \\& QR Code is not available due to no private key set for this peer": "Изтеглянето и QR кодът не са достъпни, тъй като няма зададен частен ключ за този пиър",
"Downloading": "Изтегляне",
"Duplicate current configuration's database table and \\.conf file with the new name": "Дублиране на таблицата в базата данни и .conf файла на текущата конфигурация с новото име",
"Duration:": "Продължителност:",
"Edit": "Редактирай",
"Edit Raw Configuration File": "Редактирай суров конфигурационен файл",
"Email": "Имейл",
"Email Account": "Имейл акаунт",
"Email Body Template": "Шаблон на тялото на имейла",
"Email sent successfully!": "Имейлът е изпратен успешно!",
"Enable Webhook": "Активирай Webhook",
"Enabled": "Активирано",
"Encryption": "Криптиране",
"Ended At": "Завършена на",
"Endpoint Allowed IPs": "Разрешени IP адреси на крайна точка",
"Endpoint Allowed IPs format is incorrect": "Форматът на разрешените IP адреси на крайна точка е грешен",
"Enter Email or Name to Search": "Въведете имейл или име за търсене",
"Enter IP Address / Hostname": "Въведете IP адрес / Име на хост",
"Enter IP Address/CIDR": "Въведете IP адрес/CIDR",
"Enter a password": "Въведете парола",
"Enter an username you like": "Въведете желаното потребителско име",
"Expire At": "Изтича на",
"FROM ": "ОТ ",
"Failed": "Неуспешни",
"Failed to add peers in bulk": "Неуспешно масово добавяне на пиъри",
"Failed to allow access of peer (.*)": "Неуспешно разрешаване на достъпа на пиър $1",
"Failed to check available update": "Неуспешна проверка за актуализация",
"Failed to save configuration through WireGuard": "Неуспешно запазване на конфигурацията чрез WireGuard",
"File": "Файл",
"Filter": "Филтър",
"Generating key pairs by bulk failed": "Неуспешно масово генериране на двойки ключове",
"Geolocation": "Геолокация",
"Grid": "Мрежа",
"Groups": "Групи",
"Header": "Хедър",
"Help": "Помощ",
"Home": "Начало",
"Hop": "Скок",
"How many peers you want to add\\?": "Колко пиъра искате да добавите?",
"I don't need MFA": "Не ми трябва MFA",
"IP Address": "IP адрес",
"IP Address / Hostname": "IP адрес / Име на хост",
"IP Address/CIDR": "IP адрес/CIDR",
"IP Address/CIDR is invalid": "IP адресът/CIDR е невалиден",
"If you're sure, please type in the configuration name below and click Delete": "Ако сте сигурни, моля въведете името на конфигурацията по-долу и щракнете Изтрий",
"Include configuration file as an attachment": "Включи конфигурационния файл като прикачен",
"Invalid Port": "Невалиден порт",
"Is Alive": "Активен",
"Job": "Задача",
"Job ID": "ID на задача",
"Jobs Logs": "Логове на задачи",
"Key": "Ключ",
"Language": "Език",
"Latest Handshake Time": "Последно ръкостискане",
"Latest Session": "Последна сесия",
"Light": "Светла",
"Link expire date failed to update. Reason: (.*)": "Неуспешно актуализиране на датата на изтичане на връзката. Причина: $1",
"Link expire date updated": "Датата на изтичане на връзката е актуализирана",
"List": "Списък",
"Listen Port": "Порт за слушане",
"Live Preview": "Преглед на живо",
"Local": "Локален",
"Log ID": "ID на лог",
"Logs": "Логове",
"MTU": "MTU",
"MTU format is not correct": "Форматът на MTU е грешен",
"Manage": "Управление",
"Manual restart of WGDashboard is needed to apply changes on IP Address and Listen Port": "Необходим е ръчен рестарт на WGDashboard за прилагане на промените в IP адреса и порта",
"Max RTT \\(ms\\)": "Макс. RTT (мс)",
"Memory": "Памет",
"Memory Usage": "Използване на паметта",
"Message": "Съобщение",
"Min RTT \\(ms\\)": "Мин. RTT (мс)",
"Multi-Factor Authentication \\(MFA\\)": "Многофакторно удостоверяване (MFA)",
"Name": "Име",
"Network": "Мрежа",
"Never Expire": "Без изтичане",
"New Configuration": "Нова конфигурация",
"New Password": "Нова парола",
"Next": "Напред",
"Nice to meet you!": "Приятно ми е да се запознаем!",
"No": "Не",
"No Encryption": "Без криптиране",
"No Templates": "Няма шаблони",
"No WGDashboard API Key": "Няма WGDashboard API ключ",
"No active job at the moment\\.": "В момента няма активни задачи.",
"No available IP containing": "Няма свободен IP съдържащ",
"No backup yet, click the button above to create backup\\.": "Все още няма архив, щракнете бутона по-горе за създаване.",
"No more available IP can assign": "Няма повече свободни IP адреси за задаване",
"No peer assigned to this client": "Няма пиър присвоен на този клиент",
"No result": "Няма резултат",
"Notes": "Бележки",
"OTP from your authenticator": "OTP код от удостоверителя",
"Off": "Изкл.",
"Official Documentation": "Официална документация",
"Oh no\\.\\.\\. This link is either expired or invalid\\.": "О, не... Тази връзка е изтекла или невалидна.",
"On": "Вкл.",
"Once you deleted this configuration\\:": "След като изтриете тази конфигурация:",
"Only apply to peers in this configuration": "Прилага се само за пиъри в тази конфигурация",
"Open File": "Отвори файл",
"Optional Settings": "Допълнителни настройки",
"Or you can click the link below:": "Или можете да щракнете върху връзката по-долу:",
"Other Settings": "Други настройки",
"Override Peer Settings": "Презаписване на настройките за пиър",
"Password": "Парола",
"Path": "Път",
"Payload URL": "URL за данни",
"Peer": "Пиър",
"Peer Configuration File": "Конфигурационен файл на пиър",
"Peer Created": "Пиър създаден",
"Peer Default Settings": "Настройки по подразбиране за пиър",
"Peer Deleted": "Пиър изтрит",
"Peer Details": "Детайли за пиъра",
"Peer Historical Endpoints": "Исторически крайни точки на пиъра",
"Peer Historical Sessions": "Исторически сесии на пиъра",
"Peer Jobs": "Задачи за пиъри",
"Peer Remote Endpoint": "Отдалечена крайна точка на пиъра",
"Peer Settings": "Настройки на пиъра",
"Peer Updated": "Пиър обновен",
"Peer created successfully": "Пиърът е създаден успешно",
"Peer data usage reset successfully": "Използваните данни на пиъра са нулирани успешно",
"Peer does not exist": "Пиърът не съществува",
"Peer download started": "Изтеглянето на пиъра започна",
"Peer job deleted": "Задачата за пиъра е изтрита",
"Peer job saved": "Задачата за пиъра е запазена",
"Peer saved": "Пиърът е запазен",
"Peers": "Пиъри",
"Peers Data Usage": "Използване на данни от пиъри",
"Peers Default Settings": "Настройки по подразбиране за пиъри",
"Peers Settings": "Настройки на пиъри",
"Persistent Keepalive": "Постоянен Keepalive",
"Persistent Keepalive format is not correct": "Форматът на Persistent Keepalive е грешен",
"Pick Available IP": "Избери свободен IP",
"Pinging...": "Пингване...",
"Please fill in all required box": "Моля, попълнете всички задължителни полета",
"Please fill in the following fields to finish setup": "Моля, попълнете следните полета за завършване на настройката",
"Please provide a valid configuration name": "Моля, въведете валидно име на конфигурация",
"Please provide ipAddress": "Моля, въведете IP адрес",
"Please provide ipAddress and count": "Моля, въведете IP адрес и брой",
"Please specify amount of peers you want to add": "Моля, посочете броя на пиърите, които искате да добавите",
"Please specify an IP Address (v4/v6)": "Моля, посочете IP адрес (v4/v6)",
"Please specify job": "Моля, посочете задача",
"Please specify one or more peers": "Моля, посочете един или повече пиъри",
"Please specify peer and configuration": "Моля, посочете пиър и конфигурация",
"Port": "Порт",
"Pre-Shared Key": "Предварително споделен ключ",
"Previous Sessions": "Предишни сесии",
"Private Key": "Частен ключ",
"Private key does not match with the public key": "Частният ключ не съответства на публичния",
"Processes": "Процеси",
"Protocol": "Протокол",
"Public Key": "Публичен ключ",
"QR Code": "QR код",
"Ready": "Готово",
"Real Time Received Data Usage": "Получени данни в реално време",
"Real Time Sent Data Usage": "Изпратени данни в реално време",
"Received": "Получени",
"Refresh": "Обнови",
"Refresh Interval": "Интервал на обновяване",
"Remember to remove / at the end of your path. e.g /etc/wireguard": "Не забравяйте да премахнете / в края на пътя. Пример: /etc/wireguard",
"Remove Icon": "Премахни икона",
"Repeat New Password": "Повторете новата парола",
"Reset": "Нулиране",
"Reset Data Usage": "Нулиране на използваните данни",
"Restore": "Възстанови",
"Restore Configuration": "Възстанови конфигурация",
"Restoring": "Възстановяване",
"Restrict Access": "Ограничи достъпа",
"Restrict Peer": "Ограничи пиъра",
"Restricted": "Ограничен",
"Restricted ([0-9]{1,}) peer\\(s\\)": "Ограничени $1 пиъра",
"Restricted ([0-9]{1,}) peer\\(s\\) successfully. Failed to restrict ([0-9]{1,}) peer\\(s\\)": "Успешно ограничени $1 пиъра. Неуспешно ограничаване на $2 пиъра",
"Restricted Peers?": "Ограничени пиъри",
"Restricting\\.\\.\\.": "Ограничаване...",
"Revert": "Отмени",
"Save": "Запази",
"Save Configuration": "Запази конфигурацията",
"Save Peer": "Запази пиъра",
"Saving\\.\\.\\.": "Запазване...",
"Scan QR Code with the WireGuard App to add peer": "Сканирайте QR кода с приложението WireGuard, за да добавите пиъра",
"Schedule Jobs": "Планирани задачи",
"Search": "Търсене",
"Search Clients\\.\\.\\.": "Търсене на клиенти...",
"Search Icon": "Икона за търсене",
"Search Peers\\.\\.\\.": "Търсене на пиъри...",
"Select All": "Избери всички",
"Select Peers": "Избери пиъри",
"Select a backup you want to restore": "Изберете архив за възстановяване",
"Selected Backup": "Избран архив",
"Send": "Изпрати",
"Send From": "Изпрати от",
"Send Test Email": "Изпрати тестов имейл",
"Sending\\.\\.\\.": "Изпращане...",
"Sent": "Изпратени",
"Sent / Received / Lost Package": "Изпратени / Получени / Загубени пакети",
"Server": "Сървър",
"Server List": "Списък със сървъри",
"Sessions": "Сесии",
"Settings": "Настройки",
"Setup": "Настройка",
"Share Peer": "Сподели пиъра",
"Share link failed to create. Reason: (.*)": "Неуспешно създаване на връзка за споделяне. Причина: $1",
"Share with Email": "Сподели по имейл",
"Sharing\\.\\.\\.": "Споделяне...",
"Show All Peers": "Покажи всички пиъри",
"Sign In": "Вход",
"Sign Out": "Изход",
"Sign in session ended, please sign in again": "Сесията е изтекла, моля влезте отново",
"Signing In\\.\\.\\.": "Влизане...",
"Sorry, your username or password is incorrect.": "За съжаление потребителското име или паролата са грешни.",
"Sort By": "Сортирай по",
"Start Sharing": "Започни споделяне",
"Started At": "Започната на",
"Status": "Статус",
"Step (.*)": "Стъпка $1",
"Stop Sharing": "Спри споделянето",
"Stop Sharing\\.\\.\\.": "Спиране на споделянето...",
"Storage": "Съхранение",
"Subnets \\& Listen Ports Templates": "Шаблони за подмрежи и портове",
"Subscribed Actions": "Абонирани действия",
"Success": "Успех",
"Swap Memory": "Swap памет",
"Swap Memory Usage": "Използване на Swap паметта",
"System Status": "Състояние на системата",
"TOTP verified!": "TOTP е потвърден!",
"Table": "Таблица",
"Tag": "Етикет",
"Tag Peer": "Етикетирай пиър",
"Tags": "Етикети",
"The maximum number of peers can add is (.*)": "Максималният брой пиъри за добавяне е $1",
"Theme": "Тема",
"This IP is not available: (.*)": "Този IP не е наличен: $1",
"This configuration have ([0-9].*) backups": "Тази конфигурация има $1 архива",
"This configuration have no backup": "Тази конфигурация няма архив",
"This peer already exist": "Този пиър вече съществува",
"This peer does not have any job yet\\.": "Този пиър все още няма задачи.",
"This will be changed globally, and will be apply to all peer's QR code and configuration file.": "Това ще бъде променено глобално и ще се приложи към всички QR кодове и конфигурационни файлове на пиърите.",
"To update this configuration's name, WGDashboard will execute the following operations:": "За да промените името на тази конфигурация, WGDashboard ще изпълни следните операции:",
"Toggle When Start Up": "Превключване при стартиране",
"Tools": "Инструменти",
"Total": "Общо",
"Total Received": "Общо получени",
"Total Sent": "Общо изпратени",
"Total Usage": "Общо използване",
"Turning Off\\.\\.\\.": "Изключване...",
"Turning On\\.\\.\\.": "Включване...",
"Unsaved Job": "Незапазена задача",
"Untitled Peer": "Пиър без име",
"Update Name": "Промени името",
"Update Password": "Актуализирай паролата",
"Update peer failed when saving the configuration": "Неуспешно обновяване на пиъра при запазване на конфигурацията",
"Update peer failed when updating Allowed IPs": "Неуспешно обновяване на пиъра при актуализиране на разрешените IP адреси",
"Update peer failed when updating Pre-Shared Key": "Неуспешно обновяване на пиъра при актуализиране на предварително споделения ключ",
"Updated at": "Актуализирано на",
"Use your own Private and Public Key": "Използвайте собствен частен и публичен ключ",
"Username": "Потребител",
"Value": "Стойност",
"Verify SSL": "Верификация на SSL",
"WGDashboard API Keys function is disabled": "Функцията за WGDashboard API ключове е деактивирана",
"WGDashboard Account Settings": "Настройки на WGDashboard акаунта",
"WGDashboard Settings": "Настройки на WGDashboard",
"WGDashboard language update failed": "Неуспешна промяна на езика на WGDashboard",
"WGDashboard will sent a POST Request to the URL below with details of any subscribed events\\.": "WGDashboard ще изпрати POST заявка към URL адреса по-долу с детайли за всички абонирани събития.",
"We highly suggest to enable SSL verification": "Силно препоръчваме да активирате SSL верификацията",
"Webhooks*": "Webhook-ове",
"Welcome to": "Добре дошли в",
"What\\'s the body\\?": "Какво е съдържанието?",
"What\\'s the subject\\?": "Каква е темата?",
"When should this API Key expire\\?": "Кога трябва да изтече този API ключ?",
"Who are you sending to\\?": "До кого изпращате?",
"WireGuard Configuration Settings": "Настройки на WireGuard конфигурация",
"WireGuard Configurations": "WireGuard конфигурации",
"WireGuard Configurations Settings": "Настройки на WireGuard конфигурациите",
"WireGuard configuration path saved": "Пътят до WireGuard конфигурацията е запазен",
"Yes": "Да",
"You can add up to (.*) peers": "Можете да добавите до $1 пиъра",
"You can visit our: ": "Можете да посетите нашите: ",
"You don't have any WireGuard configurations yet. Please check the configuration folder or change it in Settings. By default the folder is /etc/wireguard.": "Все още нямате WireGuard конфигурации. Моля, проверете конфигурационната папка или я променете в Настройки. По подразбиране папката е /etc/wireguard.",
"You don't have any configuration to restore": "Нямате конфигурация за възстановяване",
"You're on the latest version": "Използвате последната версия",
"\\(At least 8 characters and make sure is strong enough!\\)": "(Поне 8 символа и се уверете, че е достатъчно силна!)",
"\\(Required for QR Code and Download\\)": "(Изисква се за QR код и изтегляне)",
"\\(Required\\)": "(Задължително)",
"^([0-9].*) Sessions*$": "$1 сесии",
"if": "ако",
"is": "е",
"larger than": "по-голямо от",
"or": "или",
"or click the button below to download the ": "или щракнете бутона по-долу, за да изтеглите ",
"then": "тогава",
"to add your server": "за да добавите сървъра си"
}
@@ -14,6 +14,11 @@
"lang_name": "Belarusian (Belarus)", "lang_name": "Belarusian (Belarus)",
"lang_name_localized": "Беларуская (Беларусь)" "lang_name_localized": "Беларуская (Беларусь)"
}, },
{
"lang_id": "bg-BG",
"lang_name": "Bulgarian (Bulgaria)",
"lang_name_localized": "Български (България)"
},
{ {
"lang_id": "ca-ES", "lang_id": "ca-ES",
"lang_name": "Catalan (Spain)", "lang_name": "Catalan (Spain)",