diff --git a/src/client.py b/src/client.py
index e752ec8..9d9ef76 100644
--- a/src/client.py
+++ b/src/client.py
@@ -55,9 +55,9 @@ def createClientBlueprint(wireguardConfigurations: dict[WireguardConfiguration],
@client.get(f'{prefix}/api/signout')
def ClientAPI_SignOut():
- session.pop('username')
- session.pop('role')
- session.pop('totpVerified')
+ session['username'] = None
+ session['role'] = None
+ session['totpVerified'] = None
return ResponseObject(True)
@client.get(f'{prefix}/api/signin/totp')
@@ -81,7 +81,7 @@ def createClientBlueprint(wireguardConfigurations: dict[WireguardConfiguration],
if session.get('username') is None:
return ResponseObject(False, "Sign in status is invalid", status_code=401)
session['totpVerified'] = True
- # return ResponseObject(True, data=)
+ return ResponseObject(True)
return ResponseObject(status, msg)
@client.get(prefix)
diff --git a/src/modules/DashboardClients.py b/src/modules/DashboardClients.py
index 5b50dbf..3131e9c 100644
--- a/src/modules/DashboardClients.py
+++ b/src/modules/DashboardClients.py
@@ -6,6 +6,7 @@ import pyotp
import sqlalchemy as db
from .ConnectionString import ConnectionString
+from .DashboardClientsPeerAssignment import DashboardClientsPeerAssignment
from .DashboardClientsTOTP import DashboardClientsTOTP
from .Utilities import ValidatePasswordStrength
from .DashboardLogger import DashboardLogger
@@ -18,7 +19,6 @@ class DashboardClients:
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),
@@ -46,6 +46,7 @@ class DashboardClients:
self.Clients = []
self.__getClients()
self.DashboardClientsTOTP = DashboardClientsTOTP()
+ self.DashboardClientsPeerAssignment = DashboardClientsPeerAssignment()
def __getClients(self):
with self.engine.connect() as conn:
@@ -76,6 +77,7 @@ class DashboardClients:
def SignIn_GetTotp(self, Token: str, UserProvidedTotp: str = None) -> tuple[bool, str] or tuple[bool, None, str]:
status, data = self.DashboardClientsTOTP.GetTotp(Token)
+
if not status:
return False, "TOTP Token is invalid"
if UserProvidedTotp is None:
@@ -83,7 +85,7 @@ class DashboardClients:
return True, pyotp.totp.TOTP(data.get('TotpKey')).provisioning_uri(name=data.get('Email'),
issuer_name="WGDashboard Client")
else:
- totpMatched = pyotp.TOTP(data.get('TotpKey')).verify(UserProvidedTotp)
+ totpMatched = pyotp.totp.TOTP(data.get('TotpKey')).verify(UserProvidedTotp)
if not totpMatched:
return False, "TOTP is does not match"
else:
diff --git a/src/modules/DashboardClientsPeerAssignment.py b/src/modules/DashboardClientsPeerAssignment.py
new file mode 100644
index 0000000..9e1a74f
--- /dev/null
+++ b/src/modules/DashboardClientsPeerAssignment.py
@@ -0,0 +1,46 @@
+from .ConnectionString import ConnectionString
+from .DashboardLogger import DashboardLogger
+import sqlalchemy as db
+
+
+class DashboardClientsPeerAssignment:
+ def __init__(self):
+ self.logger = DashboardLogger()
+ self.engine = db.create_engine(ConnectionString("wgdashboard"))
+ self.metadata = db.MetaData()
+
+ self.dashboardClientsPeerAssignmentTable = db.Table(
+ 'DashboardClientsPeerAssignment', self.metadata,
+ db.Column('AssignmentID', db.String(255), nullable=False, primary_key=True),
+ db.Column('ClientID', db.String(255), nullable=False, index=True),
+ db.Column('ConfigurationName', db.String(255)),
+ db.Column('PeerID', db.String(500)),
+ db.Column('AssignedDate',
+ (db.DATETIME if 'sqlite:///' in ConnectionString("wgdashboard") else db.TIMESTAMP),
+ server_default=db.func.now()),
+ db.Column('UnassignedDate',
+ (db.DATETIME if 'sqlite:///' in ConnectionString("wgdashboard") else db.TIMESTAMP)),
+ extend_existing=True
+ )
+ self.metadata.create_all(self.engine)
+ self.assignments = []
+
+ def __getAssignments(self):
+ with self.engine.connect() as conn:
+ self.assignments = conn.execute(
+ self.dashboardClientsPeerAssignmentTable.select().where(
+ self.dashboardClientsPeerAssignmentTable.c.UnassignedDate is None
+ )
+ ).mappings().fetchall()
+
+ def AssignClient(self, ClientID, ConfigurationName, PeerID):
+ pass
+
+ def UnassignClient(self, AssignmentID):
+ pass
+
+ def GetAssignedClient(self, ConfigurationName, PeerID):
+ pass
+
+ def GetAssignedPeers(self, ClientID):
+ pass
\ No newline at end of file
diff --git a/src/static/client/src/components/SignIn/qrcode.vue b/src/static/client/src/components/SignIn/qrcode.vue
new file mode 100644
index 0000000..b478e41
--- /dev/null
+++ b/src/static/client/src/components/SignIn/qrcode.vue
@@ -0,0 +1,22 @@
+
+
+
+
Please scan the following QR Code to generate TOTP with your choice of authenticator
- +Or you can click the link below: