Just commit

This commit is contained in:
Donald Zou 2025-06-02 12:04:01 +08:00
parent 58f944c72e
commit c95937d08b
7 changed files with 111 additions and 27 deletions

View File

@ -1,6 +1,10 @@
from flask import Blueprint, render_template, abort, request, Flask, current_app
from functools import wraps
from flask import Blueprint, render_template, abort, request, Flask, current_app, session
import os
client = Blueprint('client', __name__, template_folder=os.path.abspath("./static/client/dist"))
from modules.WireguardConfiguration import WireguardConfiguration
from modules.DashboardConfig import DashboardConfig
def ResponseObject(status=True, message=None, data=None, status_code = 200) -> Flask.response_class:
response = Flask.make_response(current_app, {
@ -12,16 +16,39 @@ def ResponseObject(status=True, message=None, data=None, status_code = 200) -> F
response.content_type = "application/json"
return response
def login_required(f):
@wraps(f)
def func(*args, **kwargs):
if session.get("username") is None or session.get("role") != "client":
return ResponseObject(False, "Unauthorized access.", data=None, status_code=401)
return f(*args, **kwargs)
return func
prefix = '/client'
@client.before_request
def clientBeforeRequest():
if request.method.lower() == 'options':
return ResponseObject(True)
@client.get(prefix)
def clientIndex():
return render_template('client.html')
def createClientBlueprint(wireguardConfigurations: dict[WireguardConfiguration], dashboardConfig: DashboardConfig):
from modules.DashboardClients import DashboardClients
DashboardClients = DashboardClients()
client = Blueprint('client', __name__, template_folder=os.path.abspath("./static/client/dist"))
prefix = f'{dashboardConfig.GetConfig("Server", "app_prefix")[1]}/client'
@client.before_request
def clientBeforeRequest():
if request.method.lower() == 'options':
return ResponseObject(True)
@client.get(prefix)
def ClientIndex():
print(wireguardConfigurations.keys())
return render_template('client.html')
@client.post(f'{prefix}/api/signup')
def ClientAPI_SignUp():
data = request.json
status, msg = DashboardClients.SignUp(**data)
return ResponseObject(status, msg)
return client

View File

@ -28,13 +28,12 @@ from modules.DashboardConfig import DashboardConfig
from modules.WireguardConfiguration import WireguardConfiguration
from modules.AmneziaWireguardConfiguration import AmneziaWireguardConfiguration
from client import client
from client import createClientBlueprint
SystemStatus = SystemStatus()
CONFIGURATION_PATH = os.getenv('CONFIGURATION_PATH', '.')
app = Flask("WGDashboard", template_folder=os.path.abspath("./static/app/dist"))
app.register_blueprint(client)
app.config['SEND_FILE_MAX_AGE_DEFAULT'] = 5206928
app.secret_key = secrets.token_urlsafe(32)
@ -115,7 +114,7 @@ def auth_req():
'/client'
]
if ("username" not in session
if (("username" not in session or session.get("role") != "admin")
and (f"{(APP_PREFIX if len(APP_PREFIX) > 0 else '')}/" != request.path
and f"{(APP_PREFIX if len(APP_PREFIX) > 0 else '')}" != request.path)
and len(list(filter(lambda x : x not in request.path, whiteList))) == len(whiteList)
@ -1269,6 +1268,8 @@ DashboardLogger: DashboardLogger = DashboardLogger(DashboardConfig)
InitWireguardConfigurationsList(startup=True)
app.register_blueprint(createClientBlueprint(WireguardConfigurations, DashboardConfig))
def startThreads():
bgThread = threading.Thread(target=peerInformationBackgroundThread, daemon=True)
bgThread.start()

View File

@ -12,9 +12,9 @@ def ConnectionString(database) -> str or None:
if not os.path.isdir(sqlitePath):
os.mkdir(sqlitePath)
if parser.get("Database", "type") == "postgresql":
cn = f'postgresql+psycopg2://{parser.get("Database", "username")}:{parser.get("Database", "password")[1]}@{parser.get("Database", "host")[1]}/{database}'
elif parser.get("Database", "type")[1] == "mysql":
cn = f'mysql+mysqldb://{parser.get("Database", "username")[1]}:{parser.get("Database", "password")[1]}@{parser.get("Database", "host")[1]}/{database}'
cn = f'postgresql+psycopg2://{parser.get("Database", "username")}:{parser.get("Database", "password")}@{parser.get("Database", "host")}/{database}'
elif parser.get("Database", "type") == "mysql":
cn = f'mysql+mysqldb://{parser.get("Database", "username")}:{parser.get("Database", "password")}@{parser.get("Database", "host")}/{database}'
else:
cn = f'sqlite:///{os.path.join(sqlitePath, f"{database}.db")}'
if not database_exists(cn):

View File

@ -1,3 +0,0 @@
class DashboardClient:
def __init__(self):
pass

View File

@ -0,0 +1,58 @@
import sqlalchemy as db
from sqlalchemy.orm import DeclarativeBase, Mapped
from sqlalchemy.testing.schema import mapped_column
from .ConnectionString import ConnectionString
class DashboardClients:
def __init__(self):
self.engine = db.create_engine(ConnectionString("wgdashboard"))
self.metadata = db.MetaData()
self.dashboardClientsTable = db.Table(
'DashboardClients', self.metadata,
db.Column('ClientID', db.String(255), nullable=False, primary_key=True),
db.Column('Email', db.String(255), nullable=False, index=True),
db.Column('Password', db.String(500)),
db.Column('TotpKey', db.String(500)),
db.Column('TotpKeyVerified', db.Integer),
db.Column('CreatedDate',
(db.DATETIME if 'sqlite:///' in ConnectionString("wgdashboard") else db.TIMESTAMP),
server_default=db.func.now()),
db.Column('DeletedDate',
(db.DATETIME if 'sqlite:///' in ConnectionString("wgdashboard") else db.TIMESTAMP)),
extend_existing=True,
)
self.dashboardClientsInfoTable = db.Table(
'DashboardClientsInfo', self.metadata,
db.Column('ClientID', db.String(255), nullable=False, primary_key=True),
db.Column('Firstname', db.String(500)),
db.Column('Lastname', db.String(500)),
extend_existing=True,
)
self.metadata.create_all(self.engine)
self.Clients = []
self.__getClients()
print('hi')
print(self.Clients)
def __getClients(self):
with self.engine.connect() as conn:
self.Clients = conn.execute(
db.select(
self.dashboardClientsTable.c.ClientID,
self.dashboardClientsTable.c.Email,
self.dashboardClientsTable.c.CreatedDate
).where(
self.dashboardClientsTable.c.DeletedDate is None)
).mappings().fetchall()
def SignUp(self, Email, Password, ConfirmPassword) -> tuple[bool, str]:
pass

View File

@ -12,6 +12,7 @@ class DashboardLogger:
self.engine = db.create_engine(ConnectionString("wgdashboard_log"))
self.metadata = db.MetaData()
self.dashboardLoggerTable = db.Table('DashboardLog', self.metadata,
db.Column('LogID', db.String(255), nullable=False, primary_key=True),
db.Column('LogDate', (db.DATETIME if DashboardConfig.GetConfig("Database", "type")[1] == 'sqlite' else db.TIMESTAMP),
server_default=db.func.now()),
@ -19,7 +20,7 @@ class DashboardLogger:
db.Column('IP', db.String(255)),
db.Column('Status', db.String(255), nullable=False),
db.Column('Message', db.Text)
db.Column('Message', db.Text), extend_existing=True,
)
self.metadata.create_all(self.engine)
self.log(Message="WGDashboard started")

View File

@ -2,9 +2,9 @@
import {reactive} from "vue";
const formData = reactive({
email: "",
password: "",
confirmPassword: ""
Email: "",
Password: "",
ConfirmPassword: ""
})
</script>