Compare commits

..

1 Commits

Author SHA1 Message Date
dependabot[bot] 27c35bb068 chore(deps): bump sqlalchemy from 2.0.48 to 2.0.51 in /src
Bumps [sqlalchemy](https://github.com/sqlalchemy/sqlalchemy) from 2.0.48 to 2.0.51.
- [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.51
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-16 01:05:29 +00:00
6 changed files with 105 additions and 103 deletions
+2 -2
View File
@@ -14,7 +14,7 @@ from modules.database.database import database
from modules.utilities.utilities import utilities as util from modules.utilities.utilities import utilities as util
from modules.utilities.logger import setup_logger from modules.utilities.logger import setup_logger
from modules.routes.routes_general import routes_general from modules.routes.routes import routes
from modules.routes.routes_welcome import routes_welcome from modules.routes.routes_welcome import routes_welcome
if __name__ == '__main__': if __name__ == '__main__':
@@ -46,7 +46,7 @@ if __name__ == '__main__':
template_folder=os.path.abspath("./static/dist/WGDashboardAdmin"), template_folder=os.path.abspath("./static/dist/WGDashboardAdmin"),
static_folder=os.path.abspath("./static/dist/WGDashboardAdmin") static_folder=os.path.abspath("./static/dist/WGDashboardAdmin")
) )
app.register_blueprint(routes_general, url_prefix=prefix) app.register_blueprint(routes, url_prefix=prefix)
app.register_blueprint(routes_welcome, url_prefix=prefix) app.register_blueprint(routes_welcome, url_prefix=prefix)
app.wgd_config = config_data app.wgd_config = config_data
@@ -20,7 +20,7 @@ from ..config.config import config
from ..utilities.utilities import utilities from ..utilities.utilities import utilities
from ..utilities.statistics import statistics from ..utilities.statistics import statistics
routes_general = flask.Blueprint("routes_general", __name__) routes = flask.Blueprint("routes", __name__)
white_list = [ white_list = [
"/", "/",
@@ -37,7 +37,7 @@ white_list = [
"sharePeer/get", "sharePeer/get",
] ]
@routes_general.before_request @routes.before_request
def authentication_required(): def authentication_required():
if flask.request.method.lower() == "options": if flask.request.method.lower() == "options":
return make_resp_obj(True, "", {"status": True}, 200) return make_resp_obj(True, "", {"status": True}, 200)
@@ -70,7 +70,11 @@ def authentication_required():
return make_resp_obj(False, "Unauthorized access", {}, 401) return make_resp_obj(False, "Unauthorized access", {}, 401)
@routes_general.route('/api/authenticate', methods=["POST"]) @routes.route('/', methods=["GET"])
def index_handler():
return flask.render_template("index.html")
@routes.route('/api/auth', methods=["POST"])
def api_authenticate(): def api_authenticate():
ok, config_server = config.filter(flask.current_app.wgd_config, 'SERVER') ok, config_server = config.filter(flask.current_app.wgd_config, 'SERVER')
if not ok: if not ok:
@@ -173,18 +177,7 @@ def api_authenticate():
else: else:
return make_resp_obj(False, "Sorry, your username or password is incorrect.", {}, 401) return make_resp_obj(False, "Sorry, your username or password is incorrect.", {}, 401)
@routes_general.route('/') @routes.route('/api/auth/validate', methods=["GET"])
def index_handler():
return flask.render_template("index.html")
@routes_general.route('/api/locale')
def api_locale_handler():
locale_manager = localeman()
locale_data = locale_manager.get_language()
return make_resp_obj(True, "", locale_data, 200)
@routes_general.route('/api/validateAuthentication')
def api_validate_auth(): def api_validate_auth():
ok, config_server = config.filter(flask.current_app.wgd_config, 'SERVER') ok, config_server = config.filter(flask.current_app.wgd_config, 'SERVER')
if not ok: if not ok:
@@ -199,8 +192,36 @@ def api_validate_auth():
return make_resp_obj(False, "Invalid authentication", {}, 200) return make_resp_obj(False, "Invalid authentication", {}, 200)
return make_resp_obj() return make_resp_obj()
@routes_general.route('/api/getDashboardVersion') @routes.route('/api/dashboard/locale', methods=["GET"])
def api_retrieve_dashboard_version(): def api_retrieve_locale():
locale_manager = localeman()
locale_data = locale_manager.get_language()
return make_resp_obj(True, "", locale_data, 200)
@routes.route('/api/dashboard/locale', methods=["PATCH"])
def api_locale_update():
req_data = flask.request.get_json()
if "lang_id" not in req_data.keys():
return make_resp_obj(False, "Please specify a language id: lang_id")
language_id = req_data.get("lang_id")
locale_manager = localeman
ok = locale_manager.update_language(language_id)
if not ok:
return make_resp_obj(False, "Failed to update the language id")
locale_data = locale_manager.get_language()
return make_resp_obj(True, "", locale_data)
@routes.route('/api/dashboard/locale/available', methods=["GET"])
def api_retrieve_available_locales():
locale_manager = localeman()
@routes.route('/api/dashboard/version', methods=["GET"])
def api_retrieve_version():
ok, config_server = config.filter(flask.current_app.wgd_config, 'SERVER') ok, config_server = config.filter(flask.current_app.wgd_config, 'SERVER')
if not ok: if not ok:
log.error("failed to filter the config in-memory") log.error("failed to filter the config in-memory")
@@ -208,8 +229,8 @@ def api_retrieve_dashboard_version():
return make_resp_obj(True, "", config_server.get("version")) return make_resp_obj(True, "", config_server.get("version"))
@routes_general.route('/api/getDashboardTheme') @routes.route('/api/dashboard/theme', methods=["GET"])
def api_retrieve_dashboard_theme(): def api_retrieve_theme():
ok, config_server = config.filter(flask.current_app.wgd_config, 'SERVER') ok, config_server = config.filter(flask.current_app.wgd_config, 'SERVER')
if not ok: if not ok:
log.error("failed to filter the config in-memory") log.error("failed to filter the config in-memory")
@@ -217,26 +238,16 @@ def api_retrieve_dashboard_theme():
return make_resp_obj(True, "", config_server.get("wgdashboard_theme"), 200) return make_resp_obj(True, "", config_server.get("wgdashboard_theme"), 200)
@routes_general.route('/api/getDashboardUpdate') @routes.route('/api/dashboard/updatestatus', methods=["GET"])
def api_retrieve_dashboard_update(): def api_retrieve_update_status():
ok, config_server = config.filter(flask.current_app.wgd_config, 'SERVER') utilities.update_available()
if not ok: return make_resp_obj()
log.error("failed to filter the config in-memory")
return make_resp_obj(False, "Internal error", {}, 500)
ok, upgradable, latest_version_link = utilities.update_info(config_server.get("version")) @routes.route('/api/dashboard/configuration', methods=["GET"])
if ok and upgradable: def api_retrieve_config():
return make_resp_obj(True, 'There is an update available for this instance', data=latest_version_link)
elif ok and not upgradable:
return make_resp_obj(True, 'This instance is running the latest version')
else:
return make_resp_obj(False)
@routes_general.route('/api/getDashboardConfiguration')
def api_retrieve_dashboard_config():
return make_resp_obj(data=flask.current_app.wgd_config) return make_resp_obj(data=flask.current_app.wgd_config)
@routes_general.route('/api/isTotpEnabled') @routes.route('/api/dashboard/totp', methods=["GET"])
def api_totp_status(): def api_totp_status():
ok, config_account = config.filter(flask.current_app.wgd_config, 'ACCOUNT') ok, config_account = config.filter(flask.current_app.wgd_config, 'ACCOUNT')
if not ok: if not ok:
@@ -247,7 +258,7 @@ def api_totp_status():
return make_resp_obj(True, "", data, 200) return make_resp_obj(True, "", data, 200)
@routes_general.route('/api/getWireguardConfigurations') @routes.route('/api/dashboard/wireguard/interfaces', methods=["GET"])
def api_retrieve_wireguard_configurations(): def api_retrieve_wireguard_configurations():
ok, config_server = config.filter(flask.current_app.wgd_config, 'SERVER') ok, config_server = config.filter(flask.current_app.wgd_config, 'SERVER')
if not ok: if not ok:
@@ -266,12 +277,12 @@ def api_retrieve_wireguard_configurations():
return make_resp_obj(True, 'Wireguard', {}, 200) return make_resp_obj(True, 'Wireguard', {}, 200)
@routes_general.route('/api/systemStatus') @routes.route('/api/dashboard/statistics', methods=["GET"])
def api_system_status(): def api_system_status():
status = statistics() status = statistics()
return make_resp_obj(True, "", status.to_json(), 200) return make_resp_obj(True, "", status.to_json(), 200)
@routes_general.route('/health', methods=["GET"]) @routes.route('/health', methods=["GET"])
@routes_general.route('/healthz', methods=["GET"]) @routes.route('/healthz', methods=["GET"])
def health_handler(): def health_handler():
return make_resp_obj(True, "Health Endpoint", {"status": "ok"}, 200) return make_resp_obj(True, "Health Endpoint", {"status": "ok"}, 200)
+14 -13
View File
@@ -4,6 +4,7 @@ import psutil
import shutil import shutil
import subprocess import subprocess
import time import time
import flask
import psutil, shutil, subprocess, time import psutil, shutil, subprocess, time
from flask import current_app from flask import current_app
@@ -32,19 +33,19 @@ class statistics:
def retrieve_memory_stats(self): def retrieve_memory_stats(self):
try: try:
virtmem = psutil.virtual_memory() v = psutil.virtual_memory()
swapmem = psutil.swap_memory() s = psutil.swap_memory()
return { return {
"VirtualMemory": { "VirtualMemory": {
"total": virtmem.total, "total": v.total,
"available": virtmem.available, "available": v.available,
"percent": virtmem.percent "percent": v.percent
}, },
"SwapMemory": { "SwapMemory": {
"total": swapmem.total, "total": s.total,
"available": swapmem.free, "available": s.free,
"percent": swapmem.percent "percent": s.percent
} }
} }
except Exception as e: except Exception as e:
@@ -55,14 +56,14 @@ class statistics:
disks = [] disks = []
try: try:
for p in psutil.disk_partitions(): for p in psutil.disk_partitions():
diskuse = psutil.disk_usage(p.mountpoint) d = psutil.disk_usage(p.mountpoint)
disks.append({ disks.append({
"mountPoint": p.mountpoint, "mountPoint": p.mountpoint,
"total": diskuse.total, "total": d.total,
"used": diskuse.used, "used": d.used,
"free": diskuse.free, "free": d.free,
"percent": diskuse.percent "percent": d.percent
}) })
except Exception as e: except Exception as e:
current_app.logger.error("Disk error %s", e) current_app.logger.error("Disk error %s", e)
+3 -16
View File
@@ -2,11 +2,9 @@
import logging as log import logging as log
import json
import os import os
import urllib.request import urllib.request
import json
from packaging import version
class utilities(): class utilities():
@staticmethod @staticmethod
@@ -27,22 +25,11 @@ class utilities():
return False return False
@staticmethod @staticmethod
def update_info(running_version: str) -> tuple[bool, bool, str]: def update_available() -> bool:
request = urllib.request.urlopen("https://api.github.com/repos/WGDashboard/WGDashboard/releases/latest", timeout=5).read() request = urllib.request.urlopen("https://api.github.com/repos/WGDashboard/WGDashboard/releases/latest", timeout=5).read()
data = json.loads(request) data = json.loads(request)
latest_version = data.get('tag_name') log.info(data)
latest_version_link = data.get('html_url')
try:
if version.parse(latest_version) > version.parse(running_version):
log.info('there is an update available for this instance')
return True, True, latest_version_link
else:
log.info('this instance is running the latest version')
return True, False, latest_version_link
except:
return False, False, ''
@staticmethod @staticmethod
def ProtocolsEnabled() -> list[str]: def ProtocolsEnabled() -> list[str]:
+1 -2
View File
@@ -1,9 +1,8 @@
bcrypt==5.0.0 bcrypt==5.0.0
configparser==7.2.0 configparser==7.2.0
gunicorn==25.3.0 gunicorn==25.3.0
sqlalchemy==2.0.48 sqlalchemy==2.0.51
Flask==3.1.3 Flask==3.1.3
Werkzeug==3.1.7 Werkzeug==3.1.7
packaging==26.2
pyotp==2.9.0 pyotp==2.9.0
psutil==7.2.2 psutil==7.2.2
+29 -25
View File
@@ -39,6 +39,7 @@ export default {
password: "", password: "",
totp: "", totp: "",
}, },
loginError: false,
loginErrorMessage: "", loginErrorMessage: "",
loading: false loading: false
} }
@@ -57,38 +58,41 @@ export default {
methods: { methods: {
GetLocale, GetLocale,
async auth(){ async auth(){
if (!this.formValid) { if (this.formValid){
return; this.loading = true
} await fetchPost("/api/auth", this.data, (response) => {
this.loading = true;
try {
await fetchPost("/api/authenticate", this.data, (response) => {
if (response.status){ if (response.status){
this.$refs.signInBtn.classList.add("signedIn"); this.loginError = false;
this.$refs["signInBtn"].classList.add("signedIn")
if (response.message){ if (response.message){
this.$router.push("/welcome"); this.$router.push('/welcome')
} else if (this.store.Redirect) {
this.$router.push(this.store.Redirect);
}else{ }else{
this.$router.push("/"); if (this.store.Redirect !== undefined){
this.$router.push(this.store.Redirect)
}else{
this.$router.push('/')
}
} }
}else{ }else{
this.store.newMessage("Server", "Failed to authenticate", "danger"); this.store.newMessage("Server", response.message, "danger")
document.querySelectorAll("input[required]").forEach(x => {
x.classList.remove("is-valid")
x.classList.add("is-invalid")
});
this.loading = false
}
})
}else{
document.querySelectorAll("input[required]").forEach(x => {
if (x.value.length === 0){
x.classList.remove("is-valid")
x.classList.add("is-invalid")
}else{
x.classList.remove("is-invalid")
x.classList.add("is-valid")
} }
}); });
} catch (err) {
this.store.newMessage(
"Server",
"Unable to contact the server.",
"danger"
);
console.error(err);
} finally {
this.loading = false;
} }
} }
} }