mirror of
https://github.com/donaldzou/WGDashboard.git
synced 2026-02-22 16:46:17 +00:00
refac: some WGDashboard code
This commit is contained in:
@@ -17,8 +17,7 @@ from itertools import islice
|
|||||||
from sqlalchemy import RowMapping
|
from sqlalchemy import RowMapping
|
||||||
|
|
||||||
from modules.Utilities import (
|
from modules.Utilities import (
|
||||||
RegexMatch, StringToBoolean,
|
RegexMatch, StringToBoolean, ValidateDNSAddress,
|
||||||
ValidateIPAddressesWithRange, ValidateDNSAddress,
|
|
||||||
GenerateWireguardPublicKey, GenerateWireguardPrivateKey
|
GenerateWireguardPublicKey, GenerateWireguardPrivateKey
|
||||||
)
|
)
|
||||||
from packaging import version
|
from packaging import version
|
||||||
@@ -30,7 +29,7 @@ from modules.PeerShareLinks import PeerShareLinks
|
|||||||
from modules.PeerJobs import PeerJobs
|
from modules.PeerJobs import PeerJobs
|
||||||
from modules.DashboardConfig import DashboardConfig
|
from modules.DashboardConfig import DashboardConfig
|
||||||
from modules.WireguardConfiguration import WireguardConfiguration
|
from modules.WireguardConfiguration import WireguardConfiguration
|
||||||
from modules.AmneziaWireguardConfiguration import AmneziaWireguardConfiguration
|
from modules.AmneziaConfiguration import AmneziaConfiguration
|
||||||
|
|
||||||
from client import createClientBlueprint
|
from client import createClientBlueprint
|
||||||
|
|
||||||
@@ -167,10 +166,10 @@ def InitWireguardConfigurationsList(startup: bool = False):
|
|||||||
if i in WireguardConfigurations.keys():
|
if i in WireguardConfigurations.keys():
|
||||||
if WireguardConfigurations[i].configurationFileChanged():
|
if WireguardConfigurations[i].configurationFileChanged():
|
||||||
with app.app_context():
|
with app.app_context():
|
||||||
WireguardConfigurations[i] = AmneziaWireguardConfiguration(DashboardConfig, AllPeerJobs, AllPeerShareLinks, DashboardWebHooks, i)
|
WireguardConfigurations[i] = AmneziaConfiguration(DashboardConfig, AllPeerJobs, AllPeerShareLinks, DashboardWebHooks, i)
|
||||||
else:
|
else:
|
||||||
with app.app_context():
|
with app.app_context():
|
||||||
WireguardConfigurations[i] = AmneziaWireguardConfiguration(DashboardConfig, AllPeerJobs, AllPeerShareLinks, DashboardWebHooks, i, startup=startup)
|
WireguardConfigurations[i] = AmneziaConfiguration(DashboardConfig, AllPeerJobs, AllPeerShareLinks, DashboardWebHooks, i, startup=startup)
|
||||||
except WireguardConfiguration.InvalidConfigurationFileException as e:
|
except WireguardConfiguration.InvalidConfigurationFileException as e:
|
||||||
app.logger.error(f"{i} have an invalid configuration file.")
|
app.logger.error(f"{i} have an invalid configuration file.")
|
||||||
|
|
||||||
@@ -421,11 +420,11 @@ def API_addWireguardConfiguration():
|
|||||||
)
|
)
|
||||||
WireguardConfigurations[data['ConfigurationName']] = (
|
WireguardConfigurations[data['ConfigurationName']] = (
|
||||||
WireguardConfiguration(DashboardConfig, AllPeerJobs, AllPeerShareLinks, data=data, name=data['ConfigurationName'])) if protocol == 'wg' else (
|
WireguardConfiguration(DashboardConfig, AllPeerJobs, AllPeerShareLinks, data=data, name=data['ConfigurationName'])) if protocol == 'wg' else (
|
||||||
AmneziaWireguardConfiguration(DashboardConfig, AllPeerJobs, AllPeerShareLinks, DashboardWebHooks, data=data, name=data['ConfigurationName']))
|
AmneziaConfiguration(DashboardConfig, AllPeerJobs, AllPeerShareLinks, DashboardWebHooks, data=data, name=data['ConfigurationName']))
|
||||||
else:
|
else:
|
||||||
WireguardConfigurations[data['ConfigurationName']] = (
|
WireguardConfigurations[data['ConfigurationName']] = (
|
||||||
WireguardConfiguration(DashboardConfig, AllPeerJobs, AllPeerShareLinks, DashboardWebHooks, data=data)) if data.get('Protocol') == 'wg' else (
|
WireguardConfiguration(DashboardConfig, AllPeerJobs, AllPeerShareLinks, DashboardWebHooks, data=data)) if data.get('Protocol') == 'wg' else (
|
||||||
AmneziaWireguardConfiguration(DashboardConfig, AllPeerJobs, AllPeerShareLinks, DashboardWebHooks, data=data))
|
AmneziaConfiguration(DashboardConfig, AllPeerJobs, AllPeerShareLinks, DashboardWebHooks, data=data))
|
||||||
return ResponseObject()
|
return ResponseObject()
|
||||||
|
|
||||||
@app.get(f'{APP_PREFIX}/api/toggleWireguardConfiguration')
|
@app.get(f'{APP_PREFIX}/api/toggleWireguardConfiguration')
|
||||||
@@ -522,7 +521,7 @@ def API_renameWireguardConfiguration():
|
|||||||
|
|
||||||
status, message = rc.renameConfiguration(data.get("NewConfigurationName"))
|
status, message = rc.renameConfiguration(data.get("NewConfigurationName"))
|
||||||
if status:
|
if status:
|
||||||
WireguardConfigurations[data.get("NewConfigurationName")] = (WireguardConfiguration(DashboardConfig, AllPeerJobs, AllPeerShareLinks, DashboardWebHooks, data.get("NewConfigurationName")) if rc.Protocol == 'wg' else AmneziaWireguardConfiguration(DashboardConfig, AllPeerJobs, AllPeerShareLinks, DashboardWebHooks, data.get("NewConfigurationName")))
|
WireguardConfigurations[data.get("NewConfigurationName")] = (WireguardConfiguration(DashboardConfig, AllPeerJobs, AllPeerShareLinks, DashboardWebHooks, data.get("NewConfigurationName")) if rc.Protocol == 'wg' else AmneziaConfiguration(DashboardConfig, AllPeerJobs, AllPeerShareLinks, DashboardWebHooks, data.get("NewConfigurationName")))
|
||||||
else:
|
else:
|
||||||
WireguardConfigurations[data.get("ConfigurationName")] = rc
|
WireguardConfigurations[data.get("ConfigurationName")] = rc
|
||||||
return ResponseObject(status, message)
|
return ResponseObject(status, message)
|
||||||
@@ -698,15 +697,30 @@ def API_updatePeerSettings(configName):
|
|||||||
preshared_key = data['preshared_key']
|
preshared_key = data['preshared_key']
|
||||||
mtu = data['mtu']
|
mtu = data['mtu']
|
||||||
keepalive = data['keepalive']
|
keepalive = data['keepalive']
|
||||||
|
notes = data.get('notes', '')
|
||||||
wireguardConfig = WireguardConfigurations[configName]
|
wireguardConfig = WireguardConfigurations[configName]
|
||||||
foundPeer, peer = wireguardConfig.searchPeer(id)
|
foundPeer, peer = wireguardConfig.searchPeer(id)
|
||||||
if foundPeer:
|
if foundPeer:
|
||||||
if wireguardConfig.Protocol == 'wg':
|
if wireguardConfig.Protocol == 'wg':
|
||||||
status, msg = peer.updatePeer(name, private_key, preshared_key, dns_addresses,
|
status, msg = peer.updatePeer(name,
|
||||||
allowed_ip, endpoint_allowed_ip, mtu, keepalive)
|
private_key,
|
||||||
|
preshared_key,
|
||||||
|
dns_addresses,
|
||||||
|
allowed_ip,
|
||||||
|
endpoint_allowed_ip,
|
||||||
|
mtu,
|
||||||
|
keepalive,
|
||||||
|
notes)
|
||||||
else:
|
else:
|
||||||
status, msg = peer.updatePeer(name, private_key, preshared_key, dns_addresses,
|
status, msg = peer.updatePeer(name,
|
||||||
allowed_ip, endpoint_allowed_ip, mtu, keepalive, "off")
|
private_key,
|
||||||
|
preshared_key,
|
||||||
|
dns_addresses,
|
||||||
|
allowed_ip,
|
||||||
|
endpoint_allowed_ip,
|
||||||
|
mtu,
|
||||||
|
keepalive,
|
||||||
|
notes)
|
||||||
wireguardConfig.getPeers()
|
wireguardConfig.getPeers()
|
||||||
DashboardWebHooks.RunWebHook('peer_updated', {
|
DashboardWebHooks.RunWebHook('peer_updated', {
|
||||||
"configuration": wireguardConfig.Name,
|
"configuration": wireguardConfig.Name,
|
||||||
@@ -856,6 +870,7 @@ def API_addPeers(configName):
|
|||||||
|
|
||||||
mtu: int = data.get('mtu', None)
|
mtu: int = data.get('mtu', None)
|
||||||
keep_alive: int = data.get('keepalive', None)
|
keep_alive: int = data.get('keepalive', None)
|
||||||
|
notes: str = data.get('notes', '')
|
||||||
preshared_key: str = data.get('preshared_key', "")
|
preshared_key: str = data.get('preshared_key', "")
|
||||||
|
|
||||||
if type(mtu) is not int or mtu < 0 or mtu > 1460:
|
if type(mtu) is not int or mtu < 0 or mtu > 1460:
|
||||||
@@ -911,7 +926,7 @@ def API_addPeers(configName):
|
|||||||
"endpoint_allowed_ip": endpoint_allowed_ip,
|
"endpoint_allowed_ip": endpoint_allowed_ip,
|
||||||
"mtu": mtu,
|
"mtu": mtu,
|
||||||
"keepalive": keep_alive,
|
"keepalive": keep_alive,
|
||||||
"advanced_security": "off"
|
"notes": ""
|
||||||
})
|
})
|
||||||
if addedCount == bulkAddAmount:
|
if addedCount == bulkAddAmount:
|
||||||
break
|
break
|
||||||
@@ -973,7 +988,7 @@ def API_addPeers(configName):
|
|||||||
"DNS": dns_addresses,
|
"DNS": dns_addresses,
|
||||||
"mtu": mtu,
|
"mtu": mtu,
|
||||||
"keepalive": keep_alive,
|
"keepalive": keep_alive,
|
||||||
"advanced_security": "off"
|
"notes": notes
|
||||||
}]
|
}]
|
||||||
)
|
)
|
||||||
return ResponseObject(status=status, message=message, data=addedPeers)
|
return ResponseObject(status=status, message=message, data=addedPeers)
|
||||||
|
|||||||
@@ -4,19 +4,23 @@ AmneziaWG Configuration
|
|||||||
import random, sqlalchemy, os, subprocess, re, uuid
|
import random, sqlalchemy, os, subprocess, re, uuid
|
||||||
from flask import current_app
|
from flask import current_app
|
||||||
from .PeerJobs import PeerJobs
|
from .PeerJobs import PeerJobs
|
||||||
from .AmneziaWGPeer import AmneziaWGPeer
|
from .AmneziaPeer import AmneziaPeer
|
||||||
from .PeerShareLinks import PeerShareLinks
|
from .PeerShareLinks import PeerShareLinks
|
||||||
from .Utilities import RegexMatch
|
from .Utilities import RegexMatch
|
||||||
from .WireguardConfiguration import WireguardConfiguration
|
from .WireguardConfiguration import WireguardConfiguration
|
||||||
from .DashboardWebHooks import DashboardWebHooks
|
from .DashboardWebHooks import DashboardWebHooks
|
||||||
|
|
||||||
|
|
||||||
class AmneziaWireguardConfiguration(WireguardConfiguration):
|
class AmneziaConfiguration(WireguardConfiguration):
|
||||||
def __init__(self, DashboardConfig,
|
def __init__(self,
|
||||||
|
DashboardConfig,
|
||||||
AllPeerJobs: PeerJobs,
|
AllPeerJobs: PeerJobs,
|
||||||
AllPeerShareLinks: PeerShareLinks,
|
AllPeerShareLinks: PeerShareLinks,
|
||||||
DashboardWebHooks: DashboardWebHooks,
|
DashboardWebHooks: DashboardWebHooks,
|
||||||
name: str = None, data: dict = None, backup: dict = None, startup: bool = False):
|
name: str = None,
|
||||||
|
data: dict = None,
|
||||||
|
backup: dict = None,
|
||||||
|
startup: bool = False):
|
||||||
self.Jc = 0
|
self.Jc = 0
|
||||||
self.Jmin = 0
|
self.Jmin = 0
|
||||||
self.Jmax = 0
|
self.Jmax = 0
|
||||||
@@ -79,58 +83,50 @@ class AmneziaWireguardConfiguration(WireguardConfiguration):
|
|||||||
}
|
}
|
||||||
|
|
||||||
def createDatabase(self, dbName = None):
|
def createDatabase(self, dbName = None):
|
||||||
|
def generate_column_obj():
|
||||||
|
return [
|
||||||
|
sqlalchemy.Column('id', sqlalchemy.String(255), nullable=False, primary_key=True),
|
||||||
|
sqlalchemy.Column('private_key', sqlalchemy.String(255)),
|
||||||
|
sqlalchemy.Column('DNS', sqlalchemy.Text),
|
||||||
|
sqlalchemy.Column('endpoint_allowed_ip', sqlalchemy.Text),
|
||||||
|
sqlalchemy.Column('name', sqlalchemy.Text),
|
||||||
|
sqlalchemy.Column('total_receive', sqlalchemy.Float),
|
||||||
|
sqlalchemy.Column('total_sent', sqlalchemy.Float),
|
||||||
|
sqlalchemy.Column('total_data', sqlalchemy.Float),
|
||||||
|
sqlalchemy.Column('endpoint', sqlalchemy.String(255)),
|
||||||
|
sqlalchemy.Column('status', sqlalchemy.String(255)),
|
||||||
|
sqlalchemy.Column('latest_handshake', sqlalchemy.String(255)),
|
||||||
|
sqlalchemy.Column('allowed_ip', sqlalchemy.String(255)),
|
||||||
|
sqlalchemy.Column('cumu_receive', sqlalchemy.Float),
|
||||||
|
sqlalchemy.Column('cumu_sent', sqlalchemy.Float),
|
||||||
|
sqlalchemy.Column('cumu_data', sqlalchemy.Float),
|
||||||
|
sqlalchemy.Column('mtu', sqlalchemy.Integer),
|
||||||
|
sqlalchemy.Column('keepalive', sqlalchemy.Integer),
|
||||||
|
sqlalchemy.Column('notes', sqlalchemy.Text),
|
||||||
|
sqlalchemy.Column('remote_endpoint', sqlalchemy.String(255)),
|
||||||
|
sqlalchemy.Column('preshared_key', sqlalchemy.String(255))
|
||||||
|
]
|
||||||
|
|
||||||
if dbName is None:
|
if dbName is None:
|
||||||
dbName = self.Name
|
dbName = self.Name
|
||||||
|
|
||||||
|
|
||||||
self.peersTable = sqlalchemy.Table(
|
self.peersTable = sqlalchemy.Table(
|
||||||
dbName, self.metadata,
|
f'{dbName}', self.metadata, *generate_column_obj(), extend_existing=True
|
||||||
sqlalchemy.Column('id', sqlalchemy.String(255), nullable=False, primary_key=True),
|
|
||||||
sqlalchemy.Column('private_key', sqlalchemy.String(255)),
|
|
||||||
sqlalchemy.Column('DNS', sqlalchemy.Text),
|
|
||||||
sqlalchemy.Column('advanced_security', sqlalchemy.String(255)),
|
|
||||||
sqlalchemy.Column('endpoint_allowed_ip', sqlalchemy.Text),
|
|
||||||
sqlalchemy.Column('name', sqlalchemy.Text),
|
|
||||||
sqlalchemy.Column('total_receive', sqlalchemy.Float),
|
|
||||||
sqlalchemy.Column('total_sent', sqlalchemy.Float),
|
|
||||||
sqlalchemy.Column('total_data', sqlalchemy.Float),
|
|
||||||
sqlalchemy.Column('endpoint', sqlalchemy.String(255)),
|
|
||||||
sqlalchemy.Column('status', sqlalchemy.String(255)),
|
|
||||||
sqlalchemy.Column('latest_handshake', sqlalchemy.String(255)),
|
|
||||||
sqlalchemy.Column('allowed_ip', sqlalchemy.String(255)),
|
|
||||||
sqlalchemy.Column('cumu_receive', sqlalchemy.Float),
|
|
||||||
sqlalchemy.Column('cumu_sent', sqlalchemy.Float),
|
|
||||||
sqlalchemy.Column('cumu_data', sqlalchemy.Float),
|
|
||||||
sqlalchemy.Column('mtu', sqlalchemy.Integer),
|
|
||||||
sqlalchemy.Column('keepalive', sqlalchemy.Integer),
|
|
||||||
sqlalchemy.Column('remote_endpoint', sqlalchemy.String(255)),
|
|
||||||
sqlalchemy.Column('preshared_key', sqlalchemy.String(255)),
|
|
||||||
extend_existing=True
|
|
||||||
)
|
)
|
||||||
|
|
||||||
self.peersRestrictedTable = sqlalchemy.Table(
|
self.peersRestrictedTable = sqlalchemy.Table(
|
||||||
f'{dbName}_restrict_access', self.metadata,
|
f'{dbName}_restrict_access', self.metadata, *generate_column_obj(), extend_existing=True
|
||||||
sqlalchemy.Column('id', sqlalchemy.String(255), nullable=False, primary_key=True),
|
|
||||||
sqlalchemy.Column('private_key', sqlalchemy.String(255)),
|
|
||||||
sqlalchemy.Column('DNS', sqlalchemy.Text),
|
|
||||||
sqlalchemy.Column('advanced_security', sqlalchemy.String(255)),
|
|
||||||
sqlalchemy.Column('endpoint_allowed_ip', sqlalchemy.Text),
|
|
||||||
sqlalchemy.Column('name', sqlalchemy.Text),
|
|
||||||
sqlalchemy.Column('total_receive', sqlalchemy.Float),
|
|
||||||
sqlalchemy.Column('total_sent', sqlalchemy.Float),
|
|
||||||
sqlalchemy.Column('total_data', sqlalchemy.Float),
|
|
||||||
sqlalchemy.Column('endpoint', sqlalchemy.String(255)),
|
|
||||||
sqlalchemy.Column('status', sqlalchemy.String(255)),
|
|
||||||
sqlalchemy.Column('latest_handshake', sqlalchemy.String(255)),
|
|
||||||
sqlalchemy.Column('allowed_ip', sqlalchemy.String(255)),
|
|
||||||
sqlalchemy.Column('cumu_receive', sqlalchemy.Float),
|
|
||||||
sqlalchemy.Column('cumu_sent', sqlalchemy.Float),
|
|
||||||
sqlalchemy.Column('cumu_data', sqlalchemy.Float),
|
|
||||||
sqlalchemy.Column('mtu', sqlalchemy.Integer),
|
|
||||||
sqlalchemy.Column('keepalive', sqlalchemy.Integer),
|
|
||||||
sqlalchemy.Column('remote_endpoint', sqlalchemy.String(255)),
|
|
||||||
sqlalchemy.Column('preshared_key', sqlalchemy.String(255)),
|
|
||||||
extend_existing=True
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
self.peersDeletedTable = sqlalchemy.Table(
|
||||||
|
f'{dbName}_deleted', self.metadata, *generate_column_obj(), extend_existing=True
|
||||||
|
)
|
||||||
|
|
||||||
|
if self.DashboardConfig.GetConfig("Database", "type")[1] == 'sqlite':
|
||||||
|
time_col_type = sqlalchemy.DATETIME
|
||||||
|
else:
|
||||||
|
time_col_type = sqlalchemy.TIMESTAMP
|
||||||
|
|
||||||
self.peersTransferTable = sqlalchemy.Table(
|
self.peersTransferTable = sqlalchemy.Table(
|
||||||
f'{dbName}_transfer', self.metadata,
|
f'{dbName}_transfer', self.metadata,
|
||||||
sqlalchemy.Column('id', sqlalchemy.String(255), nullable=False),
|
sqlalchemy.Column('id', sqlalchemy.String(255), nullable=False),
|
||||||
@@ -140,38 +136,7 @@ class AmneziaWireguardConfiguration(WireguardConfiguration):
|
|||||||
sqlalchemy.Column('cumu_receive', sqlalchemy.Float),
|
sqlalchemy.Column('cumu_receive', sqlalchemy.Float),
|
||||||
sqlalchemy.Column('cumu_sent', sqlalchemy.Float),
|
sqlalchemy.Column('cumu_sent', sqlalchemy.Float),
|
||||||
sqlalchemy.Column('cumu_data', sqlalchemy.Float),
|
sqlalchemy.Column('cumu_data', sqlalchemy.Float),
|
||||||
sqlalchemy.Column('time', (sqlalchemy.DATETIME if self.DashboardConfig.GetConfig("Database", "type")[1] == 'sqlite' else sqlalchemy.TIMESTAMP),
|
sqlalchemy.Column('time', time_col_type, server_default=sqlalchemy.func.now()),
|
||||||
server_default=sqlalchemy.func.now()),
|
|
||||||
extend_existing=True
|
|
||||||
)
|
|
||||||
self.peersDeletedTable = sqlalchemy.Table(
|
|
||||||
f'{dbName}_deleted', self.metadata,
|
|
||||||
sqlalchemy.Column('id', sqlalchemy.String(255), nullable=False),
|
|
||||||
sqlalchemy.Column('private_key', sqlalchemy.String(255)),
|
|
||||||
sqlalchemy.Column('DNS', sqlalchemy.Text),
|
|
||||||
sqlalchemy.Column('advanced_security', sqlalchemy.String(255)),
|
|
||||||
sqlalchemy.Column('endpoint_allowed_ip', sqlalchemy.Text),
|
|
||||||
sqlalchemy.Column('name', sqlalchemy.Text),
|
|
||||||
sqlalchemy.Column('total_receive', sqlalchemy.Float),
|
|
||||||
sqlalchemy.Column('total_sent', sqlalchemy.Float),
|
|
||||||
sqlalchemy.Column('total_data', sqlalchemy.Float),
|
|
||||||
sqlalchemy.Column('endpoint', sqlalchemy.String(255)),
|
|
||||||
sqlalchemy.Column('status', sqlalchemy.String(255)),
|
|
||||||
sqlalchemy.Column('latest_handshake', sqlalchemy.String(255)),
|
|
||||||
sqlalchemy.Column('allowed_ip', sqlalchemy.String(255)),
|
|
||||||
sqlalchemy.Column('cumu_receive', sqlalchemy.Float),
|
|
||||||
sqlalchemy.Column('cumu_sent', sqlalchemy.Float),
|
|
||||||
sqlalchemy.Column('cumu_data', sqlalchemy.Float),
|
|
||||||
sqlalchemy.Column('mtu', sqlalchemy.Integer),
|
|
||||||
sqlalchemy.Column('keepalive', sqlalchemy.Integer),
|
|
||||||
sqlalchemy.Column('remote_endpoint', sqlalchemy.String(255)),
|
|
||||||
sqlalchemy.Column('preshared_key', sqlalchemy.String(255)),
|
|
||||||
extend_existing=True
|
|
||||||
)
|
|
||||||
self.infoTable = sqlalchemy.Table(
|
|
||||||
'ConfigurationsInfo', self.metadata,
|
|
||||||
sqlalchemy.Column('ID', sqlalchemy.String(255), primary_key=True),
|
|
||||||
sqlalchemy.Column('Info', sqlalchemy.Text),
|
|
||||||
extend_existing=True
|
extend_existing=True
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -179,8 +144,13 @@ class AmneziaWireguardConfiguration(WireguardConfiguration):
|
|||||||
f'{dbName}_history_endpoint', self.metadata,
|
f'{dbName}_history_endpoint', self.metadata,
|
||||||
sqlalchemy.Column('id', sqlalchemy.String(255), nullable=False),
|
sqlalchemy.Column('id', sqlalchemy.String(255), nullable=False),
|
||||||
sqlalchemy.Column('endpoint', sqlalchemy.String(255), nullable=False),
|
sqlalchemy.Column('endpoint', sqlalchemy.String(255), nullable=False),
|
||||||
sqlalchemy.Column('time',
|
sqlalchemy.Column('time', time_col_type)
|
||||||
(sqlalchemy.DATETIME if self.DashboardConfig.GetConfig("Database", "type")[1] == 'sqlite' else sqlalchemy.TIMESTAMP)),
|
)
|
||||||
|
|
||||||
|
self.infoTable = sqlalchemy.Table(
|
||||||
|
'ConfigurationsInfo', self.metadata,
|
||||||
|
sqlalchemy.Column('ID', sqlalchemy.String(255), primary_key=True),
|
||||||
|
sqlalchemy.Column('Info', sqlalchemy.Text),
|
||||||
extend_existing=True
|
extend_existing=True
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -225,11 +195,9 @@ class AmneziaWireguardConfiguration(WireguardConfiguration):
|
|||||||
if tempPeer is None:
|
if tempPeer is None:
|
||||||
tempPeer = {
|
tempPeer = {
|
||||||
"id": i['PublicKey'],
|
"id": i['PublicKey'],
|
||||||
"advanced_security": i.get('AdvancedSecurity', 'off'),
|
|
||||||
"private_key": "",
|
"private_key": "",
|
||||||
"DNS": self.DashboardConfig.GetConfig("Peers", "peer_global_DNS")[1],
|
"DNS": self.DashboardConfig.GetConfig("Peers", "peer_global_DNS")[1],
|
||||||
"endpoint_allowed_ip": self.DashboardConfig.GetConfig("Peers", "peer_endpoint_allowed_ip")[
|
"endpoint_allowed_ip": self.DashboardConfig.GetConfig("Peers", "peer_endpoint_allowed_ip")[1],
|
||||||
1],
|
|
||||||
"name": i.get("name"),
|
"name": i.get("name"),
|
||||||
"total_receive": 0,
|
"total_receive": 0,
|
||||||
"total_sent": 0,
|
"total_sent": 0,
|
||||||
@@ -243,6 +211,7 @@ class AmneziaWireguardConfiguration(WireguardConfiguration):
|
|||||||
"cumu_data": 0,
|
"cumu_data": 0,
|
||||||
"mtu": self.DashboardConfig.GetConfig("Peers", "peer_mtu")[1],
|
"mtu": self.DashboardConfig.GetConfig("Peers", "peer_mtu")[1],
|
||||||
"keepalive": self.DashboardConfig.GetConfig("Peers", "peer_keep_alive")[1],
|
"keepalive": self.DashboardConfig.GetConfig("Peers", "peer_keep_alive")[1],
|
||||||
|
"notes": "",
|
||||||
"remote_endpoint": self.DashboardConfig.GetConfig("Peers", "remote_endpoint")[1],
|
"remote_endpoint": self.DashboardConfig.GetConfig("Peers", "remote_endpoint")[1],
|
||||||
"preshared_key": i["PresharedKey"] if "PresharedKey" in i.keys() else ""
|
"preshared_key": i["PresharedKey"] if "PresharedKey" in i.keys() else ""
|
||||||
}
|
}
|
||||||
@@ -257,14 +226,14 @@ class AmneziaWireguardConfiguration(WireguardConfiguration):
|
|||||||
self.peersTable.columns.id == i['PublicKey']
|
self.peersTable.columns.id == i['PublicKey']
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
self.Peers.append(AmneziaWGPeer(tempPeer, self))
|
self.Peers.append(AmneziaPeer(tempPeer, self))
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
current_app.logger.error(f"{self.Name} getPeers() Error", e)
|
current_app.logger.error(f"{self.Name} getPeers() Error", e)
|
||||||
else:
|
else:
|
||||||
with self.engine.connect() as conn:
|
with self.engine.connect() as conn:
|
||||||
existingPeers = conn.execute(self.peersTable.select()).mappings().fetchall()
|
existingPeers = conn.execute(self.peersTable.select()).mappings().fetchall()
|
||||||
for i in existingPeers:
|
for i in existingPeers:
|
||||||
self.Peers.append(AmneziaWGPeer(i, self))
|
self.Peers.append(AmneziaPeer(i, self))
|
||||||
|
|
||||||
def addPeers(self, peers: list) -> tuple[bool, list, str]:
|
def addPeers(self, peers: list) -> tuple[bool, list, str]:
|
||||||
result = {
|
result = {
|
||||||
@@ -292,9 +261,9 @@ class AmneziaWireguardConfiguration(WireguardConfiguration):
|
|||||||
"cumu_data": 0,
|
"cumu_data": 0,
|
||||||
"mtu": i['mtu'],
|
"mtu": i['mtu'],
|
||||||
"keepalive": i['keepalive'],
|
"keepalive": i['keepalive'],
|
||||||
|
"notes": i.get('notes', ''),
|
||||||
"remote_endpoint": self.DashboardConfig.GetConfig("Peers", "remote_endpoint")[1],
|
"remote_endpoint": self.DashboardConfig.GetConfig("Peers", "remote_endpoint")[1],
|
||||||
"preshared_key": i["preshared_key"],
|
"preshared_key": i["preshared_key"]
|
||||||
"advanced_security": i['advanced_security']
|
|
||||||
}
|
}
|
||||||
conn.execute(
|
conn.execute(
|
||||||
self.peersTable.insert().values(newPeer)
|
self.peersTable.insert().values(newPeer)
|
||||||
@@ -333,4 +302,4 @@ class AmneziaWireguardConfiguration(WireguardConfiguration):
|
|||||||
with self.engine.connect() as conn:
|
with self.engine.connect() as conn:
|
||||||
restricted = conn.execute(self.peersRestrictedTable.select()).mappings().fetchall()
|
restricted = conn.execute(self.peersRestrictedTable.select()).mappings().fetchall()
|
||||||
for i in restricted:
|
for i in restricted:
|
||||||
self.RestrictedPeers.append(AmneziaWGPeer(i, self))
|
self.RestrictedPeers.append(AmneziaPeer(i, self))
|
||||||
@@ -4,65 +4,84 @@ import re
|
|||||||
import subprocess
|
import subprocess
|
||||||
import uuid
|
import uuid
|
||||||
|
|
||||||
|
from flask import current_app
|
||||||
from .Peer import Peer
|
from .Peer import Peer
|
||||||
from .Utilities import ValidateIPAddressesWithRange, ValidateDNSAddress, GenerateWireguardPublicKey
|
from .Utilities import CheckAddress, ValidateDNSAddress, GenerateWireguardPublicKey
|
||||||
|
|
||||||
|
|
||||||
class AmneziaWGPeer(Peer):
|
class AmneziaPeer(Peer):
|
||||||
def __init__(self, tableData, configuration):
|
def __init__(self, tableData, configuration):
|
||||||
self.advanced_security = tableData["advanced_security"]
|
|
||||||
super().__init__(tableData, configuration)
|
super().__init__(tableData, configuration)
|
||||||
|
|
||||||
|
|
||||||
def updatePeer(self, name: str, private_key: str,
|
def updatePeer(self, name: str, private_key: str,
|
||||||
preshared_key: str,
|
preshared_key: str,
|
||||||
dns_addresses: str, allowed_ip: str, endpoint_allowed_ip: str, mtu: int,
|
dns_addresses: str,
|
||||||
keepalive: int, advanced_security: str) -> tuple[bool, str] or tuple[bool, None]:
|
allowed_ip: str,
|
||||||
|
endpoint_allowed_ip: str,
|
||||||
|
mtu: int,
|
||||||
|
keepalive: int,
|
||||||
|
notes: str
|
||||||
|
) -> tuple[bool, str | None]:
|
||||||
|
|
||||||
if not self.configuration.getStatus():
|
if not self.configuration.getStatus():
|
||||||
self.configuration.toggleConfiguration()
|
self.configuration.toggleConfiguration()
|
||||||
|
|
||||||
existingAllowedIps = [item for row in list(
|
# Before we do any compute, let us check if the given endpoint allowed ip is valid at all
|
||||||
map(lambda x: [q.strip() for q in x.split(',')],
|
if not CheckAddress(endpoint_allowed_ip):
|
||||||
map(lambda y: y.allowed_ip,
|
|
||||||
list(filter(lambda k: k.id != self.id, self.configuration.getPeersList()))))) for item in row]
|
|
||||||
|
|
||||||
if allowed_ip in existingAllowedIps:
|
|
||||||
return False, "Allowed IP already taken by another peer"
|
|
||||||
if not ValidateIPAddressesWithRange(endpoint_allowed_ip):
|
|
||||||
return False, f"Endpoint Allowed IPs format is incorrect"
|
return False, f"Endpoint Allowed IPs format is incorrect"
|
||||||
if len(dns_addresses) > 0 and not ValidateDNSAddress(dns_addresses):
|
|
||||||
return False, f"DNS format is incorrect"
|
|
||||||
|
|
||||||
if type(mtu) is str:
|
peers = []
|
||||||
|
for peer in self.configuration.getPeersList():
|
||||||
|
# Make sure to exclude your own data when updating since its not really relevant
|
||||||
|
if peer.id != self.id:
|
||||||
|
continue
|
||||||
|
peers.append(peer)
|
||||||
|
|
||||||
|
used_allowed_ips = []
|
||||||
|
for peer in peers:
|
||||||
|
ips = peer.allowed_ip.split(',')
|
||||||
|
ips = [ip.strip() for ip in ips]
|
||||||
|
used_allowed_ips.append(ips)
|
||||||
|
|
||||||
|
if allowed_ip in used_allowed_ips:
|
||||||
|
return False, "Allowed IP already taken by another peer"
|
||||||
|
|
||||||
|
if not ValidateDNSAddress(dns_addresses):
|
||||||
|
return False, f"DNS IP-Address or FQDN is incorrect"
|
||||||
|
|
||||||
|
if isinstance(mtu, str):
|
||||||
mtu = 0
|
mtu = 0
|
||||||
|
|
||||||
if type(keepalive) is str:
|
if isinstance(keepalive, str):
|
||||||
keepalive = 0
|
keepalive = 0
|
||||||
|
|
||||||
if mtu < 0 or mtu > 1460:
|
if mtu not in range(0, 1461):
|
||||||
return False, "MTU format is not correct"
|
return False, "MTU format is not correct"
|
||||||
|
|
||||||
if keepalive < 0:
|
if keepalive < 0:
|
||||||
return False, "Persistent Keepalive format is not correct"
|
return False, "Persistent Keepalive format is not correct"
|
||||||
if advanced_security != "on" and advanced_security != "off":
|
|
||||||
return False, "Advanced Security can only be on or off"
|
|
||||||
if len(private_key) > 0:
|
if len(private_key) > 0:
|
||||||
pubKey = GenerateWireguardPublicKey(private_key)
|
pubKey = GenerateWireguardPublicKey(private_key)
|
||||||
if not pubKey[0] or pubKey[1] != self.id:
|
if not pubKey[0] or pubKey[1] != self.id:
|
||||||
return False, "Private key does not match with the public key"
|
return False, "Private key does not match with the public key"
|
||||||
try:
|
|
||||||
rd = random.Random()
|
|
||||||
uid = str(uuid.UUID(int=rd.getrandbits(128), version=4))
|
|
||||||
pskExist = len(preshared_key) > 0
|
|
||||||
|
|
||||||
if pskExist:
|
try:
|
||||||
|
rand = random.Random()
|
||||||
|
uid = str(uuid.UUID(int=rand.getrandbits(128), version=4))
|
||||||
|
psk_exist = len(preshared_key) > 0
|
||||||
|
|
||||||
|
if psk_exist:
|
||||||
with open(uid, "w+") as f:
|
with open(uid, "w+") as f:
|
||||||
f.write(preshared_key)
|
f.write(preshared_key)
|
||||||
|
|
||||||
newAllowedIPs = allowed_ip.replace(" ", "")
|
newAllowedIPs = allowed_ip.replace(" ", "")
|
||||||
updateAllowedIp = subprocess.check_output(
|
updateAllowedIp = subprocess.check_output(
|
||||||
f"{self.configuration.Protocol} set {self.configuration.Name} peer {self.id} allowed-ips {newAllowedIPs} {f'preshared-key {uid}' if pskExist else 'preshared-key /dev/null'}",
|
f"{self.configuration.Protocol} set {self.configuration.Name} peer {self.id} allowed-ips {newAllowedIPs} {f'preshared-key {uid}' if psk_exist else 'preshared-key /dev/null'}",
|
||||||
shell=True, stderr=subprocess.STDOUT)
|
shell=True, stderr=subprocess.STDOUT)
|
||||||
|
|
||||||
if pskExist: os.remove(uid)
|
if psk_exist: os.remove(uid)
|
||||||
|
|
||||||
if len(updateAllowedIp.decode().strip("\n")) != 0:
|
if len(updateAllowedIp.decode().strip("\n")) != 0:
|
||||||
return False, "Update peer failed when updating Allowed IPs"
|
return False, "Update peer failed when updating Allowed IPs"
|
||||||
@@ -80,8 +99,8 @@ class AmneziaWGPeer(Peer):
|
|||||||
"endpoint_allowed_ip": endpoint_allowed_ip,
|
"endpoint_allowed_ip": endpoint_allowed_ip,
|
||||||
"mtu": mtu,
|
"mtu": mtu,
|
||||||
"keepalive": keepalive,
|
"keepalive": keepalive,
|
||||||
"preshared_key": preshared_key,
|
"notes": notes,
|
||||||
"advanced_security": advanced_security
|
"preshared_key": preshared_key
|
||||||
}).where(
|
}).where(
|
||||||
self.configuration.peersTable.c.id == self.id
|
self.configuration.peersTable.c.id == self.id
|
||||||
)
|
)
|
||||||
@@ -8,7 +8,7 @@ import pyotp
|
|||||||
import sqlalchemy as db
|
import sqlalchemy as db
|
||||||
import requests
|
import requests
|
||||||
|
|
||||||
from .ConnectionString import ConnectionString
|
from .DatabaseConnection import ConnectionString
|
||||||
from .DashboardClientsPeerAssignment import DashboardClientsPeerAssignment
|
from .DashboardClientsPeerAssignment import DashboardClientsPeerAssignment
|
||||||
from .DashboardClientsTOTP import DashboardClientsTOTP
|
from .DashboardClientsTOTP import DashboardClientsTOTP
|
||||||
from .DashboardOIDC import DashboardOIDC
|
from .DashboardOIDC import DashboardOIDC
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import datetime
|
import datetime
|
||||||
import uuid
|
import uuid
|
||||||
|
|
||||||
from .ConnectionString import ConnectionString
|
from .DatabaseConnection import ConnectionString
|
||||||
from .DashboardLogger import DashboardLogger
|
from .DashboardLogger import DashboardLogger
|
||||||
import sqlalchemy as db
|
import sqlalchemy as db
|
||||||
from .WireguardConfiguration import WireguardConfiguration
|
from .WireguardConfiguration import WireguardConfiguration
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import hashlib
|
|||||||
import uuid
|
import uuid
|
||||||
|
|
||||||
import sqlalchemy as db
|
import sqlalchemy as db
|
||||||
from .ConnectionString import ConnectionString
|
from .DatabaseConnection import ConnectionString
|
||||||
|
|
||||||
|
|
||||||
class DashboardClientsTOTP:
|
class DashboardClientsTOTP:
|
||||||
|
|||||||
@@ -7,14 +7,10 @@ import sqlalchemy as db
|
|||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from typing import Any
|
from typing import Any
|
||||||
from flask import current_app
|
from flask import current_app
|
||||||
from .ConnectionString import ConnectionString
|
from .DatabaseConnection import ConnectionString
|
||||||
from .Utilities import (
|
from .Utilities import (GetRemoteEndpoint, ValidateDNSAddress)
|
||||||
GetRemoteEndpoint, ValidateDNSAddress
|
|
||||||
)
|
|
||||||
from .DashboardAPIKey import DashboardAPIKey
|
from .DashboardAPIKey import DashboardAPIKey
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class DashboardConfig:
|
class DashboardConfig:
|
||||||
DashboardVersion = 'v4.3.2'
|
DashboardVersion = 'v4.3.2'
|
||||||
ConfigurationPath = os.getenv('CONFIGURATION_PATH', '.')
|
ConfigurationPath = os.getenv('CONFIGURATION_PATH', '.')
|
||||||
@@ -104,6 +100,52 @@ class DashboardConfig:
|
|||||||
self.APIAccessed = False
|
self.APIAccessed = False
|
||||||
self.SetConfig("Server", "version", DashboardConfig.DashboardVersion)
|
self.SetConfig("Server", "version", DashboardConfig.DashboardVersion)
|
||||||
|
|
||||||
|
def EnsureDatabaseIntegrity(self, wireguardConfigurations):
|
||||||
|
expected_columns = {
|
||||||
|
'id': db.String(255),
|
||||||
|
'private_key': db.String(255),
|
||||||
|
'DNS': db.Text,
|
||||||
|
'endpoint_allowed_ip': db.Text,
|
||||||
|
'name': db.Text,
|
||||||
|
'total_receive': db.Float,
|
||||||
|
'total_sent': db.Float,
|
||||||
|
'total_data': db.Float,
|
||||||
|
'endpoint': db.String(255),
|
||||||
|
'status': db.String(255),
|
||||||
|
'latest_handshake': db.String(255),
|
||||||
|
'allowed_ip': db.String(255),
|
||||||
|
'cumu_receive': db.Float,
|
||||||
|
'cumu_sent': db.Float,
|
||||||
|
'cumu_data': db.Float,
|
||||||
|
'mtu': db.Integer,
|
||||||
|
'keepalive': db.Integer,
|
||||||
|
'notes': db.Text,
|
||||||
|
'remote_endpoint': db.String(255),
|
||||||
|
'preshared_key': db.String(255)
|
||||||
|
}
|
||||||
|
|
||||||
|
inspector = db.inspect(self.engine)
|
||||||
|
|
||||||
|
with self.engine.begin() as conn:
|
||||||
|
for cfg_name, cfg_obj in wireguardConfigurations.items():
|
||||||
|
tables_to_check = [
|
||||||
|
cfg_name,
|
||||||
|
f'{cfg_name}_restrict_access',
|
||||||
|
f'{cfg_name}_deleted'
|
||||||
|
]
|
||||||
|
|
||||||
|
for table_name in tables_to_check:
|
||||||
|
if not inspector.has_table(table_name):
|
||||||
|
continue
|
||||||
|
|
||||||
|
existing_columns = [c['name'] for c in inspector.get_columns(table_name)]
|
||||||
|
|
||||||
|
for col_name, col_type in expected_columns.items():
|
||||||
|
if col_name not in existing_columns:
|
||||||
|
type_str = col_type().compile(dialect=self.engine.dialect)
|
||||||
|
current_app.logger.info(f"Adding missing column '{col_name}' to table '{table_name}'")
|
||||||
|
conn.execute(db.text(f'ALTER TABLE "{table_name}" ADD COLUMN "{col_name}" {type_str}'))
|
||||||
|
|
||||||
def getConnectionString(self, database) -> str or None:
|
def getConnectionString(self, database) -> str or None:
|
||||||
sqlitePath = os.path.join(DashboardConfig.ConfigurationPath, "db")
|
sqlitePath = os.path.join(DashboardConfig.ConfigurationPath, "db")
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ Dashboard Logger Class
|
|||||||
import uuid
|
import uuid
|
||||||
import sqlalchemy as db
|
import sqlalchemy as db
|
||||||
from flask import current_app
|
from flask import current_app
|
||||||
from .ConnectionString import ConnectionString
|
from .DatabaseConnection import ConnectionString
|
||||||
|
|
||||||
|
|
||||||
class DashboardLogger:
|
class DashboardLogger:
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ from datetime import datetime, timedelta
|
|||||||
import requests
|
import requests
|
||||||
from pydantic import BaseModel, field_serializer
|
from pydantic import BaseModel, field_serializer
|
||||||
import sqlalchemy as db
|
import sqlalchemy as db
|
||||||
from .ConnectionString import ConnectionString
|
from .DatabaseConnection import ConnectionString
|
||||||
from flask import current_app
|
from flask import current_app
|
||||||
|
|
||||||
WebHookActions = ['peer_created', 'peer_deleted', 'peer_updated']
|
WebHookActions = ['peer_created', 'peer_deleted', 'peer_updated']
|
||||||
|
|||||||
@@ -6,9 +6,11 @@ from flask import current_app
|
|||||||
def ConnectionString(database) -> str:
|
def ConnectionString(database) -> str:
|
||||||
parser = configparser.ConfigParser(strict=False)
|
parser = configparser.ConfigParser(strict=False)
|
||||||
parser.read_file(open('wg-dashboard.ini', "r+"))
|
parser.read_file(open('wg-dashboard.ini', "r+"))
|
||||||
|
|
||||||
sqlitePath = os.path.join("db")
|
sqlitePath = os.path.join("db")
|
||||||
if not os.path.isdir(sqlitePath):
|
if not os.path.isdir(sqlitePath):
|
||||||
os.mkdir(sqlitePath)
|
os.mkdir(sqlitePath)
|
||||||
|
|
||||||
if parser.get("Database", "type") == "postgresql":
|
if parser.get("Database", "type") == "postgresql":
|
||||||
cn = f'postgresql+psycopg://{parser.get("Database", "username")}:{parser.get("Database", "password")}@{parser.get("Database", "host")}/{database}'
|
cn = f'postgresql+psycopg://{parser.get("Database", "username")}:{parser.get("Database", "password")}@{parser.get("Database", "host")}/{database}'
|
||||||
elif parser.get("Database", "type") == "mysql":
|
elif parser.get("Database", "type") == "mysql":
|
||||||
@@ -18,6 +20,7 @@ def ConnectionString(database) -> str:
|
|||||||
try:
|
try:
|
||||||
if not database_exists(cn):
|
if not database_exists(cn):
|
||||||
create_database(cn)
|
create_database(cn)
|
||||||
|
current_app.logger.info(f"Database {database} created.")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
current_app.logger.error("Database error. Terminating...", e)
|
current_app.logger.error("Database error. Terminating...", e)
|
||||||
exit(1)
|
exit(1)
|
||||||
@@ -2,7 +2,7 @@ import uuid
|
|||||||
|
|
||||||
from pydantic import BaseModel, field_serializer
|
from pydantic import BaseModel, field_serializer
|
||||||
import sqlalchemy as db
|
import sqlalchemy as db
|
||||||
from .ConnectionString import ConnectionString
|
from .DatabaseConnection import ConnectionString
|
||||||
|
|
||||||
|
|
||||||
class NewConfigurationTemplate(BaseModel):
|
class NewConfigurationTemplate(BaseModel):
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import jinja2
|
|||||||
import sqlalchemy as db
|
import sqlalchemy as db
|
||||||
from .PeerJob import PeerJob
|
from .PeerJob import PeerJob
|
||||||
from .PeerShareLink import PeerShareLink
|
from .PeerShareLink import PeerShareLink
|
||||||
from .Utilities import GenerateWireguardPublicKey, ValidateIPAddressesWithRange, ValidateDNSAddress
|
from .Utilities import GenerateWireguardPublicKey, CheckAddress, ValidateDNSAddress
|
||||||
|
|
||||||
|
|
||||||
class Peer:
|
class Peer:
|
||||||
@@ -34,6 +34,7 @@ class Peer:
|
|||||||
self.cumu_data = tableData["cumu_data"]
|
self.cumu_data = tableData["cumu_data"]
|
||||||
self.mtu = tableData["mtu"]
|
self.mtu = tableData["mtu"]
|
||||||
self.keepalive = tableData["keepalive"]
|
self.keepalive = tableData["keepalive"]
|
||||||
|
self.notes = tableData.get("notes", "")
|
||||||
self.remote_endpoint = tableData["remote_endpoint"]
|
self.remote_endpoint = tableData["remote_endpoint"]
|
||||||
self.preshared_key = tableData["preshared_key"]
|
self.preshared_key = tableData["preshared_key"]
|
||||||
self.jobs: list[PeerJob] = []
|
self.jobs: list[PeerJob] = []
|
||||||
@@ -49,56 +50,75 @@ class Peer:
|
|||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return str(self.toJson())
|
return str(self.toJson())
|
||||||
|
|
||||||
def updatePeer(self, name: str, private_key: str,
|
def updatePeer(self, name: str,
|
||||||
|
private_key: str,
|
||||||
preshared_key: str,
|
preshared_key: str,
|
||||||
dns_addresses: str, allowed_ip: str, endpoint_allowed_ip: str, mtu: int,
|
dns_addresses: str,
|
||||||
keepalive: int) -> tuple[bool, str] or tuple[bool, None]:
|
allowed_ip: str,
|
||||||
|
endpoint_allowed_ip: str,
|
||||||
|
mtu: int,
|
||||||
|
keepalive: int,
|
||||||
|
notes: str
|
||||||
|
) -> tuple[bool, str | None]:
|
||||||
|
|
||||||
if not self.configuration.getStatus():
|
if not self.configuration.getStatus():
|
||||||
self.configuration.toggleConfiguration()
|
self.configuration.toggleConfiguration()
|
||||||
|
|
||||||
existingAllowedIps = [item for row in list(
|
# Before we do any compute, let us check if the given endpoint allowed ip is valid at all
|
||||||
map(lambda x: [q.strip() for q in x.split(',')],
|
if not CheckAddress(endpoint_allowed_ip):
|
||||||
map(lambda y: y.allowed_ip,
|
|
||||||
list(filter(lambda k: k.id != self.id, self.configuration.getPeersList()))))) for item in row]
|
|
||||||
|
|
||||||
if allowed_ip in existingAllowedIps:
|
|
||||||
return False, "Allowed IP already taken by another peer"
|
|
||||||
|
|
||||||
if not ValidateIPAddressesWithRange(endpoint_allowed_ip):
|
|
||||||
return False, f"Endpoint Allowed IPs format is incorrect"
|
return False, f"Endpoint Allowed IPs format is incorrect"
|
||||||
|
|
||||||
if len(dns_addresses) > 0 and not ValidateDNSAddress(dns_addresses):
|
peers = []
|
||||||
return False, f"DNS format is incorrect"
|
for peer in self.configuration.getPeersList():
|
||||||
|
# Make sure to exclude your own data when updating since its not really relevant
|
||||||
|
if peer.id != self.id:
|
||||||
|
continue
|
||||||
|
peers.append(peer)
|
||||||
|
|
||||||
if type(mtu) is str or mtu is None:
|
used_allowed_ips = []
|
||||||
|
for peer in peers:
|
||||||
|
ips = peer.allowed_ip.split(',')
|
||||||
|
ips = [ip.strip() for ip in ips]
|
||||||
|
used_allowed_ips.append(ips)
|
||||||
|
|
||||||
|
if allowed_ip in used_allowed_ips:
|
||||||
|
return False, "Allowed IP already taken by another peer"
|
||||||
|
|
||||||
|
if not ValidateDNSAddress(dns_addresses):
|
||||||
|
return False, f"DNS IP-Address or FQDN is incorrect"
|
||||||
|
|
||||||
|
if isinstance(mtu, str):
|
||||||
mtu = 0
|
mtu = 0
|
||||||
|
|
||||||
if mtu < 0 or mtu > 1460:
|
if isinstance(keepalive, str):
|
||||||
return False, "MTU format is not correct"
|
|
||||||
|
|
||||||
if type(keepalive) is str or keepalive is None:
|
|
||||||
keepalive = 0
|
keepalive = 0
|
||||||
|
|
||||||
|
if mtu not in range(0, 1461):
|
||||||
|
return False, "MTU format is not correct"
|
||||||
|
|
||||||
if keepalive < 0:
|
if keepalive < 0:
|
||||||
return False, "Persistent Keepalive format is not correct"
|
return False, "Persistent Keepalive format is not correct"
|
||||||
|
|
||||||
if len(private_key) > 0:
|
if len(private_key) > 0:
|
||||||
pubKey = GenerateWireguardPublicKey(private_key)
|
pubKey = GenerateWireguardPublicKey(private_key)
|
||||||
if not pubKey[0] or pubKey[1] != self.id:
|
if not pubKey[0] or pubKey[1] != self.id:
|
||||||
return False, "Private key does not match with the public key"
|
return False, "Private key does not match with the public key"
|
||||||
try:
|
|
||||||
rd = random.Random()
|
|
||||||
uid = str(uuid.UUID(int=rd.getrandbits(128), version=4))
|
|
||||||
pskExist = len(preshared_key) > 0
|
|
||||||
|
|
||||||
if pskExist:
|
try:
|
||||||
|
rand = random.Random()
|
||||||
|
uid = str(uuid.UUID(int=rand.getrandbits(128), version=4))
|
||||||
|
psk_exist = len(preshared_key) > 0
|
||||||
|
|
||||||
|
if psk_exist:
|
||||||
with open(uid, "w+") as f:
|
with open(uid, "w+") as f:
|
||||||
f.write(preshared_key)
|
f.write(preshared_key)
|
||||||
|
|
||||||
newAllowedIPs = allowed_ip.replace(" ", "")
|
newAllowedIPs = allowed_ip.replace(" ", "")
|
||||||
updateAllowedIp = subprocess.check_output(
|
updateAllowedIp = subprocess.check_output(
|
||||||
f"{self.configuration.Protocol} set {self.configuration.Name} peer {self.id} allowed-ips {newAllowedIPs} {f'preshared-key {uid}' if pskExist else 'preshared-key /dev/null'}",
|
f"{self.configuration.Protocol} set {self.configuration.Name} peer {self.id} allowed-ips {newAllowedIPs} {f'preshared-key {uid}' if psk_exist else 'preshared-key /dev/null'}",
|
||||||
shell=True, stderr=subprocess.STDOUT)
|
shell=True, stderr=subprocess.STDOUT)
|
||||||
|
|
||||||
if pskExist: os.remove(uid)
|
if psk_exist: os.remove(uid)
|
||||||
if len(updateAllowedIp.decode().strip("\n")) != 0:
|
if len(updateAllowedIp.decode().strip("\n")) != 0:
|
||||||
return False, "Update peer failed when updating Allowed IPs"
|
return False, "Update peer failed when updating Allowed IPs"
|
||||||
saveConfig = subprocess.check_output(f"{self.configuration.Protocol}-quick save {self.configuration.Name}",
|
saveConfig = subprocess.check_output(f"{self.configuration.Protocol}-quick save {self.configuration.Name}",
|
||||||
@@ -114,6 +134,7 @@ class Peer:
|
|||||||
"endpoint_allowed_ip": endpoint_allowed_ip,
|
"endpoint_allowed_ip": endpoint_allowed_ip,
|
||||||
"mtu": mtu,
|
"mtu": mtu,
|
||||||
"keepalive": keepalive,
|
"keepalive": keepalive,
|
||||||
|
"notes": notes,
|
||||||
"preshared_key": preshared_key
|
"preshared_key": preshared_key
|
||||||
}).where(
|
}).where(
|
||||||
self.configuration.peersTable.c.id == self.id
|
self.configuration.peersTable.c.id == self.id
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import sqlalchemy as db
|
|||||||
from flask import current_app
|
from flask import current_app
|
||||||
from sqlalchemy import RowMapping
|
from sqlalchemy import RowMapping
|
||||||
|
|
||||||
from .ConnectionString import ConnectionString
|
from .DatabaseConnection import ConnectionString
|
||||||
from .Log import Log
|
from .Log import Log
|
||||||
|
|
||||||
class PeerJobLogger:
|
class PeerJobLogger:
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ Peer Jobs
|
|||||||
"""
|
"""
|
||||||
import sqlalchemy
|
import sqlalchemy
|
||||||
|
|
||||||
from .ConnectionString import ConnectionString
|
from .DatabaseConnection import ConnectionString
|
||||||
from .PeerJob import PeerJob
|
from .PeerJob import PeerJob
|
||||||
from .PeerJobLogger import PeerJobLogger
|
from .PeerJobLogger import PeerJobLogger
|
||||||
import sqlalchemy as db
|
import sqlalchemy as db
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
from .ConnectionString import ConnectionString
|
from .DatabaseConnection import ConnectionString
|
||||||
from .PeerShareLink import PeerShareLink
|
from .PeerShareLink import PeerShareLink
|
||||||
import sqlalchemy as db
|
import sqlalchemy as db
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import re, ipaddress
|
import re, ipaddress
|
||||||
import subprocess
|
import subprocess
|
||||||
|
import sqlalchemy
|
||||||
|
|
||||||
def RegexMatch(regex, text) -> bool:
|
def RegexMatch(regex, text) -> bool:
|
||||||
"""
|
"""
|
||||||
@@ -41,31 +41,32 @@ def StringToBoolean(value: str):
|
|||||||
return (value.strip().replace(" ", "").lower() in
|
return (value.strip().replace(" ", "").lower() in
|
||||||
("yes", "true", "t", "1", 1))
|
("yes", "true", "t", "1", 1))
|
||||||
|
|
||||||
def ValidateIPAddressesWithRange(ips: str) -> bool:
|
def CheckAddress(ips_str: str) -> bool:
|
||||||
s = ips.replace(" ", "").split(",")
|
if len(ips_str) == 0:
|
||||||
for ip in s:
|
return False
|
||||||
|
|
||||||
|
for ip in ips_str.split(','):
|
||||||
|
stripped_ip = ip.strip()
|
||||||
try:
|
try:
|
||||||
ipaddress.ip_network(ip)
|
# Verify the IP-address, with the strict flag as false also allows for /32 and /128
|
||||||
except ValueError as e:
|
ipaddress.ip_network(stripped_ip, strict=False)
|
||||||
|
except ValueError:
|
||||||
return False
|
return False
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def ValidateIPAddresses(ips) -> bool:
|
def ValidateDNSAddress(addresses_str: str) -> tuple[bool, str | None]:
|
||||||
s = ips.replace(" ", "").split(",")
|
if len(addresses_str) == 0:
|
||||||
for ip in s:
|
return False, "Got an empty list/string to check for valid DNS-addresses"
|
||||||
try:
|
|
||||||
ipaddress.ip_address(ip)
|
addresses = addresses_str.split(',')
|
||||||
except ValueError as e:
|
for address in addresses:
|
||||||
return False
|
stripped_address = address.strip()
|
||||||
return True
|
|
||||||
|
if not CheckAddress(stripped_address) and not RegexMatch(r"(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z][a-z]{0,61}[a-z]", stripped_address):
|
||||||
|
return False, f"{stripped_address} does not appear to be a valid IP-address or FQDN"
|
||||||
|
|
||||||
|
return True, None
|
||||||
|
|
||||||
def ValidateDNSAddress(addresses) -> tuple[bool, str]:
|
|
||||||
s = addresses.replace(" ", "").split(",")
|
|
||||||
for address in s:
|
|
||||||
if not ValidateIPAddresses(address) and not RegexMatch(
|
|
||||||
r"(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z][a-z]{0,61}[a-z]", address):
|
|
||||||
return False, f"{address} does not appear to be an valid DNS address"
|
|
||||||
return True, ""
|
|
||||||
|
|
||||||
def ValidateEndpointAllowedIPs(IPs) -> tuple[bool, str] | tuple[bool, None]:
|
def ValidateEndpointAllowedIPs(IPs) -> tuple[bool, str] | tuple[bool, None]:
|
||||||
ips = IPs.replace(" ", "").split(",")
|
ips = IPs.replace(" ", "").split(",")
|
||||||
|
|||||||
@@ -10,12 +10,15 @@ from datetime import datetime, timedelta
|
|||||||
from itertools import islice
|
from itertools import islice
|
||||||
from flask import current_app
|
from flask import current_app
|
||||||
|
|
||||||
from .ConnectionString import ConnectionString
|
from .DatabaseConnection import ConnectionString
|
||||||
from .DashboardConfig import DashboardConfig
|
from .DashboardConfig import DashboardConfig
|
||||||
from .Peer import Peer
|
from .Peer import Peer
|
||||||
from .PeerJobs import PeerJobs
|
from .PeerJobs import PeerJobs
|
||||||
from .PeerShareLinks import PeerShareLinks
|
from .PeerShareLinks import PeerShareLinks
|
||||||
from .Utilities import StringToBoolean, GenerateWireguardPublicKey, RegexMatch, ValidateDNSAddress, \
|
from .Utilities import StringToBoolean, \
|
||||||
|
GenerateWireguardPublicKey, \
|
||||||
|
RegexMatch, \
|
||||||
|
ValidateDNSAddress, \
|
||||||
ValidateEndpointAllowedIPs
|
ValidateEndpointAllowedIPs
|
||||||
from .WireguardConfigurationInfo import WireguardConfigurationInfo, PeerGroupsClass
|
from .WireguardConfigurationInfo import WireguardConfigurationInfo, PeerGroupsClass
|
||||||
from .DashboardWebHooks import DashboardWebHooks
|
from .DashboardWebHooks import DashboardWebHooks
|
||||||
@@ -61,6 +64,7 @@ class WireguardConfiguration:
|
|||||||
self.Protocol = "wg" if wg else "awg"
|
self.Protocol = "wg" if wg else "awg"
|
||||||
self.AllPeerJobs = AllPeerJobs
|
self.AllPeerJobs = AllPeerJobs
|
||||||
self.DashboardConfig = DashboardConfig
|
self.DashboardConfig = DashboardConfig
|
||||||
|
self.DashboardConfig.EnsureDatabaseIntegrity({self.Name: self})
|
||||||
self.AllPeerShareLinks = AllPeerShareLinks
|
self.AllPeerShareLinks = AllPeerShareLinks
|
||||||
self.DashboardWebHooks = DashboardWebHooks
|
self.DashboardWebHooks = DashboardWebHooks
|
||||||
self.configPath = os.path.join(self.__getProtocolPath(), f'{self.Name}.conf')
|
self.configPath = os.path.join(self.__getProtocolPath(), f'{self.Name}.conf')
|
||||||
@@ -151,7 +155,6 @@ class WireguardConfiguration:
|
|||||||
if self.Status:
|
if self.Status:
|
||||||
self.addAutostart()
|
self.addAutostart()
|
||||||
|
|
||||||
|
|
||||||
def __getProtocolPath(self) -> str:
|
def __getProtocolPath(self) -> str:
|
||||||
_, path = self.DashboardConfig.GetConfig("Server", "wg_conf_path") if self.Protocol == "wg" \
|
_, path = self.DashboardConfig.GetConfig("Server", "wg_conf_path") if self.Protocol == "wg" \
|
||||||
else self.DashboardConfig.GetConfig("Server", "awg_conf_path")
|
else self.DashboardConfig.GetConfig("Server", "awg_conf_path")
|
||||||
@@ -242,54 +245,50 @@ class WireguardConfiguration:
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
def createDatabase(self, dbName = None):
|
def createDatabase(self, dbName = None):
|
||||||
|
def generate_column_obj():
|
||||||
|
return [
|
||||||
|
sqlalchemy.Column('id', sqlalchemy.String(255), nullable=False, primary_key=True),
|
||||||
|
sqlalchemy.Column('private_key', sqlalchemy.String(255)),
|
||||||
|
sqlalchemy.Column('DNS', sqlalchemy.Text),
|
||||||
|
sqlalchemy.Column('endpoint_allowed_ip', sqlalchemy.Text),
|
||||||
|
sqlalchemy.Column('name', sqlalchemy.Text),
|
||||||
|
sqlalchemy.Column('total_receive', sqlalchemy.Float),
|
||||||
|
sqlalchemy.Column('total_sent', sqlalchemy.Float),
|
||||||
|
sqlalchemy.Column('total_data', sqlalchemy.Float),
|
||||||
|
sqlalchemy.Column('endpoint', sqlalchemy.String(255)),
|
||||||
|
sqlalchemy.Column('status', sqlalchemy.String(255)),
|
||||||
|
sqlalchemy.Column('latest_handshake', sqlalchemy.String(255)),
|
||||||
|
sqlalchemy.Column('allowed_ip', sqlalchemy.String(255)),
|
||||||
|
sqlalchemy.Column('cumu_receive', sqlalchemy.Float),
|
||||||
|
sqlalchemy.Column('cumu_sent', sqlalchemy.Float),
|
||||||
|
sqlalchemy.Column('cumu_data', sqlalchemy.Float),
|
||||||
|
sqlalchemy.Column('mtu', sqlalchemy.Integer),
|
||||||
|
sqlalchemy.Column('keepalive', sqlalchemy.Integer),
|
||||||
|
sqlalchemy.Column('notes', sqlalchemy.Text),
|
||||||
|
sqlalchemy.Column('remote_endpoint', sqlalchemy.String(255)),
|
||||||
|
sqlalchemy.Column('preshared_key', sqlalchemy.String(255))
|
||||||
|
]
|
||||||
|
|
||||||
if dbName is None:
|
if dbName is None:
|
||||||
dbName = self.Name
|
dbName = self.Name
|
||||||
|
|
||||||
self.peersTable = sqlalchemy.Table(
|
self.peersTable = sqlalchemy.Table(
|
||||||
dbName, self.metadata,
|
f'{dbName}', self.metadata, *generate_column_obj(), extend_existing=True
|
||||||
sqlalchemy.Column('id', sqlalchemy.String(255), nullable=False, primary_key=True),
|
|
||||||
sqlalchemy.Column('private_key', sqlalchemy.String(255)),
|
|
||||||
sqlalchemy.Column('DNS', sqlalchemy.Text),
|
|
||||||
sqlalchemy.Column('endpoint_allowed_ip', sqlalchemy.Text),
|
|
||||||
sqlalchemy.Column('name', sqlalchemy.Text),
|
|
||||||
sqlalchemy.Column('total_receive', sqlalchemy.Float),
|
|
||||||
sqlalchemy.Column('total_sent', sqlalchemy.Float),
|
|
||||||
sqlalchemy.Column('total_data', sqlalchemy.Float),
|
|
||||||
sqlalchemy.Column('endpoint', sqlalchemy.String(255)),
|
|
||||||
sqlalchemy.Column('status', sqlalchemy.String(255)),
|
|
||||||
sqlalchemy.Column('latest_handshake', sqlalchemy.String(255)),
|
|
||||||
sqlalchemy.Column('allowed_ip', sqlalchemy.String(255)),
|
|
||||||
sqlalchemy.Column('cumu_receive', sqlalchemy.Float),
|
|
||||||
sqlalchemy.Column('cumu_sent', sqlalchemy.Float),
|
|
||||||
sqlalchemy.Column('cumu_data', sqlalchemy.Float),
|
|
||||||
sqlalchemy.Column('mtu', sqlalchemy.Integer),
|
|
||||||
sqlalchemy.Column('keepalive', sqlalchemy.Integer),
|
|
||||||
sqlalchemy.Column('remote_endpoint', sqlalchemy.String(255)),
|
|
||||||
sqlalchemy.Column('preshared_key', sqlalchemy.String(255)),
|
|
||||||
extend_existing=True
|
|
||||||
)
|
)
|
||||||
|
|
||||||
self.peersRestrictedTable = sqlalchemy.Table(
|
self.peersRestrictedTable = sqlalchemy.Table(
|
||||||
f'{dbName}_restrict_access', self.metadata,
|
f'{dbName}_restrict_access', self.metadata, *generate_column_obj(), extend_existing=True
|
||||||
sqlalchemy.Column('id', sqlalchemy.String(255), nullable=False, primary_key=True),
|
|
||||||
sqlalchemy.Column('private_key', sqlalchemy.String(255)),
|
|
||||||
sqlalchemy.Column('DNS', sqlalchemy.Text),
|
|
||||||
sqlalchemy.Column('endpoint_allowed_ip', sqlalchemy.Text),
|
|
||||||
sqlalchemy.Column('name', sqlalchemy.Text),
|
|
||||||
sqlalchemy.Column('total_receive', sqlalchemy.Float),
|
|
||||||
sqlalchemy.Column('total_sent', sqlalchemy.Float),
|
|
||||||
sqlalchemy.Column('total_data', sqlalchemy.Float),
|
|
||||||
sqlalchemy.Column('endpoint', sqlalchemy.String(255)),
|
|
||||||
sqlalchemy.Column('status', sqlalchemy.String(255)),
|
|
||||||
sqlalchemy.Column('latest_handshake', sqlalchemy.String(255)),
|
|
||||||
sqlalchemy.Column('allowed_ip', sqlalchemy.String(255)),
|
|
||||||
sqlalchemy.Column('cumu_receive', sqlalchemy.Float),
|
|
||||||
sqlalchemy.Column('cumu_sent', sqlalchemy.Float),
|
|
||||||
sqlalchemy.Column('cumu_data', sqlalchemy.Float),
|
|
||||||
sqlalchemy.Column('mtu', sqlalchemy.Integer),
|
|
||||||
sqlalchemy.Column('keepalive', sqlalchemy.Integer),
|
|
||||||
sqlalchemy.Column('remote_endpoint', sqlalchemy.String(255)),
|
|
||||||
sqlalchemy.Column('preshared_key', sqlalchemy.String(255)),
|
|
||||||
extend_existing=True
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
self.peersDeletedTable = sqlalchemy.Table(
|
||||||
|
f'{dbName}_deleted', self.metadata, *generate_column_obj(), extend_existing=True
|
||||||
|
)
|
||||||
|
|
||||||
|
if self.DashboardConfig.GetConfig("Database", "type")[1] == 'sqlite':
|
||||||
|
time_col_type = sqlalchemy.DATETIME
|
||||||
|
else:
|
||||||
|
time_col_type = sqlalchemy.TIMESTAMP
|
||||||
|
|
||||||
self.peersTransferTable = sqlalchemy.Table(
|
self.peersTransferTable = sqlalchemy.Table(
|
||||||
f'{dbName}_transfer', self.metadata,
|
f'{dbName}_transfer', self.metadata,
|
||||||
sqlalchemy.Column('id', sqlalchemy.String(255), nullable=False),
|
sqlalchemy.Column('id', sqlalchemy.String(255), nullable=False),
|
||||||
@@ -299,8 +298,7 @@ class WireguardConfiguration:
|
|||||||
sqlalchemy.Column('cumu_receive', sqlalchemy.Float),
|
sqlalchemy.Column('cumu_receive', sqlalchemy.Float),
|
||||||
sqlalchemy.Column('cumu_sent', sqlalchemy.Float),
|
sqlalchemy.Column('cumu_sent', sqlalchemy.Float),
|
||||||
sqlalchemy.Column('cumu_data', sqlalchemy.Float),
|
sqlalchemy.Column('cumu_data', sqlalchemy.Float),
|
||||||
sqlalchemy.Column('time', (sqlalchemy.DATETIME if self.DashboardConfig.GetConfig("Database", "type")[1] == 'sqlite' else sqlalchemy.TIMESTAMP),
|
sqlalchemy.Column('time', time_col_type, server_default=sqlalchemy.func.now()),
|
||||||
server_default=sqlalchemy.func.now()),
|
|
||||||
extend_existing=True
|
extend_existing=True
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -308,34 +306,9 @@ class WireguardConfiguration:
|
|||||||
f'{dbName}_history_endpoint', self.metadata,
|
f'{dbName}_history_endpoint', self.metadata,
|
||||||
sqlalchemy.Column('id', sqlalchemy.String(255), nullable=False),
|
sqlalchemy.Column('id', sqlalchemy.String(255), nullable=False),
|
||||||
sqlalchemy.Column('endpoint', sqlalchemy.String(255), nullable=False),
|
sqlalchemy.Column('endpoint', sqlalchemy.String(255), nullable=False),
|
||||||
sqlalchemy.Column('time',
|
sqlalchemy.Column('time', time_col_type)
|
||||||
(sqlalchemy.DATETIME if self.DashboardConfig.GetConfig("Database", "type")[1] == 'sqlite' else sqlalchemy.TIMESTAMP)),
|
|
||||||
extend_existing=True
|
|
||||||
)
|
)
|
||||||
|
|
||||||
self.peersDeletedTable = sqlalchemy.Table(
|
|
||||||
f'{dbName}_deleted', self.metadata,
|
|
||||||
sqlalchemy.Column('id', sqlalchemy.String(255), nullable=False, primary_key=True),
|
|
||||||
sqlalchemy.Column('private_key', sqlalchemy.String(255)),
|
|
||||||
sqlalchemy.Column('DNS', sqlalchemy.Text),
|
|
||||||
sqlalchemy.Column('endpoint_allowed_ip', sqlalchemy.Text),
|
|
||||||
sqlalchemy.Column('name', sqlalchemy.Text),
|
|
||||||
sqlalchemy.Column('total_receive', sqlalchemy.Float),
|
|
||||||
sqlalchemy.Column('total_sent', sqlalchemy.Float),
|
|
||||||
sqlalchemy.Column('total_data', sqlalchemy.Float),
|
|
||||||
sqlalchemy.Column('endpoint', sqlalchemy.String(255)),
|
|
||||||
sqlalchemy.Column('status', sqlalchemy.String(255)),
|
|
||||||
sqlalchemy.Column('latest_handshake', sqlalchemy.String(255)),
|
|
||||||
sqlalchemy.Column('allowed_ip', sqlalchemy.String(255)),
|
|
||||||
sqlalchemy.Column('cumu_receive', sqlalchemy.Float),
|
|
||||||
sqlalchemy.Column('cumu_sent', sqlalchemy.Float),
|
|
||||||
sqlalchemy.Column('cumu_data', sqlalchemy.Float),
|
|
||||||
sqlalchemy.Column('mtu', sqlalchemy.Integer),
|
|
||||||
sqlalchemy.Column('keepalive', sqlalchemy.Integer),
|
|
||||||
sqlalchemy.Column('remote_endpoint', sqlalchemy.String(255)),
|
|
||||||
sqlalchemy.Column('preshared_key', sqlalchemy.String(255)),
|
|
||||||
extend_existing=True
|
|
||||||
)
|
|
||||||
self.infoTable = sqlalchemy.Table(
|
self.infoTable = sqlalchemy.Table(
|
||||||
'ConfigurationsInfo', self.metadata,
|
'ConfigurationsInfo', self.metadata,
|
||||||
sqlalchemy.Column('ID', sqlalchemy.String(255), primary_key=True),
|
sqlalchemy.Column('ID', sqlalchemy.String(255), primary_key=True),
|
||||||
@@ -450,8 +423,7 @@ class WireguardConfiguration:
|
|||||||
"id": i['PublicKey'],
|
"id": i['PublicKey'],
|
||||||
"private_key": "",
|
"private_key": "",
|
||||||
"DNS": self.DashboardConfig.GetConfig("Peers", "peer_global_DNS")[1],
|
"DNS": self.DashboardConfig.GetConfig("Peers", "peer_global_DNS")[1],
|
||||||
"endpoint_allowed_ip": self.DashboardConfig.GetConfig("Peers", "peer_endpoint_allowed_ip")[
|
"endpoint_allowed_ip": self.DashboardConfig.GetConfig("Peers", "peer_endpoint_allowed_ip")[1],
|
||||||
1],
|
|
||||||
"name": i.get("name"),
|
"name": i.get("name"),
|
||||||
"total_receive": 0,
|
"total_receive": 0,
|
||||||
"total_sent": 0,
|
"total_sent": 0,
|
||||||
@@ -465,6 +437,7 @@ class WireguardConfiguration:
|
|||||||
"cumu_data": 0,
|
"cumu_data": 0,
|
||||||
"mtu": self.DashboardConfig.GetConfig("Peers", "peer_mtu")[1] if len(self.DashboardConfig.GetConfig("Peers", "peer_mtu")[1]) > 0 else None,
|
"mtu": self.DashboardConfig.GetConfig("Peers", "peer_mtu")[1] if len(self.DashboardConfig.GetConfig("Peers", "peer_mtu")[1]) > 0 else None,
|
||||||
"keepalive": self.DashboardConfig.GetConfig("Peers", "peer_keep_alive")[1] if len(self.DashboardConfig.GetConfig("Peers", "peer_keep_alive")[1]) > 0 else None,
|
"keepalive": self.DashboardConfig.GetConfig("Peers", "peer_keep_alive")[1] if len(self.DashboardConfig.GetConfig("Peers", "peer_keep_alive")[1]) > 0 else None,
|
||||||
|
"notes": "",
|
||||||
"remote_endpoint": self.DashboardConfig.GetConfig("Peers", "remote_endpoint")[1],
|
"remote_endpoint": self.DashboardConfig.GetConfig("Peers", "remote_endpoint")[1],
|
||||||
"preshared_key": i["PresharedKey"] if "PresharedKey" in i.keys() else ""
|
"preshared_key": i["PresharedKey"] if "PresharedKey" in i.keys() else ""
|
||||||
}
|
}
|
||||||
@@ -557,6 +530,7 @@ class WireguardConfiguration:
|
|||||||
"cumu_data": 0,
|
"cumu_data": 0,
|
||||||
"mtu": i['mtu'],
|
"mtu": i['mtu'],
|
||||||
"keepalive": i['keepalive'],
|
"keepalive": i['keepalive'],
|
||||||
|
"notes": i.get("notes", ""),
|
||||||
"remote_endpoint": self.DashboardConfig.GetConfig("Peers", "remote_endpoint")[1],
|
"remote_endpoint": self.DashboardConfig.GetConfig("Peers", "remote_endpoint")[1],
|
||||||
"preshared_key": i["preshared_key"]
|
"preshared_key": i["preshared_key"]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,31 @@
|
|||||||
|
<script>
|
||||||
|
import LocaleText from "@/components/text/localeText.vue";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: "notesInput",
|
||||||
|
components: {LocaleText},
|
||||||
|
props: {
|
||||||
|
bulk: Boolean,
|
||||||
|
data: Object,
|
||||||
|
saving: Boolean
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div :class="{inactiveField: this.bulk}">
|
||||||
|
<label for="peer_notes_textbox" class="form-label">
|
||||||
|
<small class="text-muted">
|
||||||
|
<LocaleText t="Notes"></LocaleText>
|
||||||
|
</small>
|
||||||
|
</label>
|
||||||
|
<input type="text" class="form-control form-control-sm rounded-3"
|
||||||
|
:disabled="this.saving || this.bulk"
|
||||||
|
v-model="this.data.notes"
|
||||||
|
id="peer_notes_textbox" placeholder="">
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
|
||||||
|
</style>
|
||||||
@@ -15,6 +15,7 @@ import MtuInput from "@/components/configurationComponents/newPeersComponents/mt
|
|||||||
import PersistentKeepAliveInput
|
import PersistentKeepAliveInput
|
||||||
from "@/components/configurationComponents/newPeersComponents/persistentKeepAliveInput.vue";
|
from "@/components/configurationComponents/newPeersComponents/persistentKeepAliveInput.vue";
|
||||||
import {WireguardConfigurationsStore} from "@/stores/WireguardConfigurationsStore.js";
|
import {WireguardConfigurationsStore} from "@/stores/WireguardConfigurationsStore.js";
|
||||||
|
import NotesInput from "./newPeersComponents/notesInput.vue";
|
||||||
|
|
||||||
const dashboardStore = DashboardConfigurationStore()
|
const dashboardStore = DashboardConfigurationStore()
|
||||||
const wireguardStore = WireguardConfigurationsStore()
|
const wireguardStore = WireguardConfigurationsStore()
|
||||||
@@ -27,11 +28,11 @@ const peerData = ref({
|
|||||||
public_key: "",
|
public_key: "",
|
||||||
DNS: dashboardStore.Configuration.Peers.peer_global_dns,
|
DNS: dashboardStore.Configuration.Peers.peer_global_dns,
|
||||||
endpoint_allowed_ip: dashboardStore.Configuration.Peers.peer_endpoint_allowed_ip,
|
endpoint_allowed_ip: dashboardStore.Configuration.Peers.peer_endpoint_allowed_ip,
|
||||||
|
notes: "",
|
||||||
keepalive: parseInt(dashboardStore.Configuration.Peers.peer_keep_alive),
|
keepalive: parseInt(dashboardStore.Configuration.Peers.peer_keep_alive),
|
||||||
mtu: parseInt(dashboardStore.Configuration.Peers.peer_mtu),
|
mtu: parseInt(dashboardStore.Configuration.Peers.peer_mtu),
|
||||||
preshared_key: "",
|
preshared_key: "",
|
||||||
preshared_key_bulkAdd: false,
|
preshared_key_bulkAdd: false,
|
||||||
advanced_security: "off",
|
|
||||||
allowed_ips_validation: true,
|
allowed_ips_validation: true,
|
||||||
})
|
})
|
||||||
const availableIp = ref([])
|
const availableIp = ref([])
|
||||||
@@ -105,6 +106,7 @@ watch(() => {
|
|||||||
<template v-if="!peerData.bulkAdd">
|
<template v-if="!peerData.bulkAdd">
|
||||||
<hr class="mb-0 mt-2">
|
<hr class="mb-0 mt-2">
|
||||||
<NameInput :saving="saving" :data="peerData"></NameInput>
|
<NameInput :saving="saving" :data="peerData"></NameInput>
|
||||||
|
<NotesInput :saving="saving" :data="peerData"></NotesInput>
|
||||||
<PrivatePublicKeyInput :saving="saving" :data="peerData"></PrivatePublicKeyInput>
|
<PrivatePublicKeyInput :saving="saving" :data="peerData"></PrivatePublicKeyInput>
|
||||||
<AllowedIPsInput :availableIp="availableIp" :saving="saving" :data="peerData"></AllowedIPsInput>
|
<AllowedIPsInput :availableIp="availableIp" :saving="saving" :data="peerData"></AllowedIPsInput>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -37,7 +37,6 @@ export default {
|
|||||||
mtu: parseInt(this.dashboardStore.Configuration.Peers.peer_mtu),
|
mtu: parseInt(this.dashboardStore.Configuration.Peers.peer_mtu),
|
||||||
preshared_key: "",
|
preshared_key: "",
|
||||||
preshared_key_bulkAdd: false,
|
preshared_key_bulkAdd: false,
|
||||||
advanced_security: "off",
|
|
||||||
},
|
},
|
||||||
availableIp: undefined,
|
availableIp: undefined,
|
||||||
availableIpSearchString: "",
|
availableIpSearchString: "",
|
||||||
|
|||||||
@@ -49,13 +49,16 @@ defineEmits(['close'])
|
|||||||
<button type="button" class="btn-close ms-auto" @click="$emit('close')"></button>
|
<button type="button" class="btn-close ms-auto" @click="$emit('close')"></button>
|
||||||
</div>
|
</div>
|
||||||
<div class="card-body px-4">
|
<div class="card-body px-4">
|
||||||
<div>
|
<div class="d-flex justify-content-between align-items-start mb-2">
|
||||||
<p class="mb-0 text-muted"><small>
|
<div>
|
||||||
<LocaleText t="Peer"></LocaleText>
|
<p class="mb-0 text-muted"><small><LocaleText t="Peer" /></small></p>
|
||||||
</small></p>
|
<h2 class="mb-0">{{ selectedPeer.name }}</h2>
|
||||||
<h2>
|
</div>
|
||||||
{{ selectedPeer.name }}
|
|
||||||
</h2>
|
<div v-if="selectedPeer.notes" class="text-end">
|
||||||
|
<p class="mb-0 text-muted"><small><LocaleText t="Notes" /></small></p>
|
||||||
|
<p class="mb-0" style="white-space: pre-wrap">{{ selectedPeer.notes }}</p>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row mt-3 gy-2 gx-2 mb-2">
|
<div class="row mt-3 gy-2 gx-2 mb-2">
|
||||||
<div class="col-12 col-lg-3">
|
<div class="col-12 col-lg-3">
|
||||||
|
|||||||
@@ -99,6 +99,17 @@ export default {
|
|||||||
v-model="this.data.name"
|
v-model="this.data.name"
|
||||||
id="peer_name_textbox" placeholder="">
|
id="peer_name_textbox" placeholder="">
|
||||||
</div>
|
</div>
|
||||||
|
<div>
|
||||||
|
<label for="peer_notes_textbox" class="form-label">
|
||||||
|
<small class="text-muted">
|
||||||
|
<LocaleText t="Notes"></LocaleText>
|
||||||
|
</small>
|
||||||
|
</label>
|
||||||
|
<input type="text" class="form-control form-control-sm rounded-3"
|
||||||
|
:disabled="this.saving"
|
||||||
|
v-model="this.data.notes"
|
||||||
|
id="peer_notes_textbox" placeholder="">
|
||||||
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<div class="d-flex position-relative">
|
<div class="d-flex position-relative">
|
||||||
<label for="peer_private_key_textbox" class="form-label">
|
<label for="peer_private_key_textbox" class="form-label">
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
import{a5 as A,D as S,r as n,g as l,z as v}from"./index-BZiAwcQm.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,D as S,r as n,g as l,z as v}from"./index-BCgxBvDt.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
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-BZiAwcQm.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-BCgxBvDt.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};
|
||||||
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 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,F as $,i as W,q as V}from"./index-BZiAwcQm.js";import{L as C}from"./localeText-WpKL5olL.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=V(()=>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($,null,W(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,F as $,i as W,q as V}from"./index-BCgxBvDt.js";import{L as C}from"./localeText-ZTaDi7ZY.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=V(()=>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($,null,W(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
@@ -1,4 +1,4 @@
|
|||||||
import{_ as M,W as Y,o as z,H as q,D as H,K as G,c as h,f as v,a as e,b as s,m as C,y as $,J,n as B,r as y,z as L,t as P,h as Q,a2 as X,d as N,s as D,j as R,F as I,i as K,I as ee,a3 as te,e as V,L as A,E as se,u as T,g as O,p as ne,w as U,k as j,a4 as oe,q as le,T as Z,B as ie,v as ae}from"./index-BZiAwcQm.js";import{L as n}from"./localeText-WpKL5olL.js";import{d as de}from"./dayjs.min-BFXcQxCV.js";const re={class:"card rounded-3 flex-grow-1 bg-danger-subtle border-danger-subtle border shadow"},ue={class:"card-body"},ce={class:"d-flex align-items-center gap-3 inputGroup"},me=["value"],fe={class:"mb-0"},ge={class:"d-flex mt-3"},be=["disabled"],ve={__name:"updateConfigurationName",props:{configurationName:String},emits:["close"],setup(d,{emit:r}){const t=d,f=r,o=J({data:"",valid:!1}),g=Y();z(()=>{q(()=>o.data,b=>{o.valid=/^[a-zA-Z0-9_=+.-]{1,15}$/.test(b)&&b.length>0&&!g.Configurations.find(_=>_.Name===b)})});const u=H(),x=y(!1),c=G(),a=async()=>{o.data&&(x.value=!0,clearInterval(u.Peers.RefreshInterval),await L("/api/renameWireguardConfiguration",{ConfigurationName:t.configurationName,NewConfigurationName:o.data},async b=>{b.status?(await g.getConfigurations(),u.newMessage("Server","Configuration renamed","success"),c.push(`/configuration/${o.data}/peers`)):(u.newMessage("Server",b.message,"danger"),x.value=!1)}))};return(b,_)=>(v(),h("div",re,[e("div",ue,[e("p",null,[s(n,{t:"To update this configuration's name, WGDashboard will execute the following operations:"})]),e("ol",null,[e("li",null,[s(n,{t:"Duplicate current configuration's database table and .conf file with the new name"})]),e("li",null,[s(n,{t:"Delete current configuration's database table and .conf file"})])]),e("div",ce,[e("input",{class:"form-control form-control-sm rounded-3",value:d.configurationName,disabled:""},null,8,me),_[3]||(_[3]=e("h3",{class:"mb-0"},[e("i",{class:"bi bi-arrow-right"})],-1)),C(e("input",{class:B(["form-control form-control-sm rounded-3",[o.data?o.valid?"is-valid":"is-invalid":""]]),id:"newConfigurationName","onUpdate:modelValue":_[0]||(_[0]=w=>o.data=w)},null,2),[[$,o.data]])]),e("div",{class:B(["invalid-feedback",{"d-block":!o.valid&&o.data}])},[s(n,{t:"Configuration name is invalid. Possible reasons:"}),e("ul",fe,[e("li",null,[s(n,{t:"Configuration name already exist"})]),e("li",null,[s(n,{t:"Configuration name can only contain 15 lower/uppercase alphabet, numbers, underscore, equal sign, plus sign, period and hyphen."})])])],2),e("div",ge,[e("button",{onClick:_[1]||(_[1]=w=>f("close")),class:"btn btn-sm bg-secondary-subtle border-secondary-subtle text-secondary-emphasis rounded-3"},[s(n,{t:"Cancel"})]),e("button",{onClick:_[2]||(_[2]=w=>a()),disabled:!o.data||x.value,class:"btn btn-sm btn-danger rounded-3 ms-auto"},[s(n,{t:"Save"})],8,be)])])]))}},pe=M(ve,[["__scopeId","data-v-33ea9576"]]),he={name:"Dropdown",props:{width:{type:String,default:"80px"},height:{type:String,default:"auto"},title:{type:String,default:""},disabled:{type:Boolean,default:!1},defaultDisplay:{type:Boolean,default:!1}}},ye={class:"title"};function xe(d,r,t,f,o,g){return v(),h("div",{class:B(["dropdown",{disabled:t.disabled}]),onClick:r[0]||(r[0]=(...u)=>d.toggleDropdown&&d.toggleDropdown(...u)),onFocusout:r[1]||(r[1]=(...u)=>d.hideDropdown&&d.hideDropdown(...u)),tabindex:"0"},[e("div",ye,[e("div",null,P(t.title),1)])],34)}const _e=M(he,[["render",xe]]),we={components:{Dropdown:_e},name:"CodeEditor",props:{lineNums:{type:Boolean,default:!1},modelValue:{type:String},value:{type:String},theme:{type:String,default:"github-dark"},tabSpaces:{type:Number,default:2},wrap:{type:Boolean,default:!1},readOnly:{type:Boolean,default:!1},autofocus:{type:Boolean,default:!1},header:{type:Boolean,default:!0},width:{type:String,default:"540px"},height:{type:String,default:"auto"},maxWidth:{type:String},minWidth:{type:String},maxHeight:{type:String},minHeight:{type:String},borderRadius:{type:String,default:"12px"},languages:{type:Array,default:function(){return[["javascript","JS"]]}},langListWidth:{type:String,default:"110px"},langListHeight:{type:String,default:"auto"},langListDisplay:{type:Boolean,default:!1},displayLanguage:{type:Boolean,default:!0},zIndex:{type:String,default:"0"},fontSize:{type:String,default:"17px"},padding:{type:String,default:"20px"}},directives:{highlight:{mounted(d,r){d.textContent=r.value},updated(d,r){d.scrolling?d.scrolling=!1:d.textContent=r.value}}},data(){return{scrollBarWidth:0,scrollBarHeight:0,top:0,left:0,languageClass:"hljs language-"+this.languages[0][0],languageTitle:this.languages[0][1]?this.languages[0][1]:this.languages[0][0],content:this.value,cursorPosition:0,insertTab:!1,lineNum:0,lineNumsWidth:0,scrolling:!1,textareaHeight:0,showLineNums:this.wrap?!1:this.lineNums}},computed:{tabWidth(){let d="";for(let r=0;r<this.tabSpaces;r++)d+=" ";return d},contentValue(){return this.modelValue==null?this.content+`
|
import{_ as M,W as Y,o as z,H as q,D as H,K as G,c as h,f as v,a as e,b as s,m as C,y as $,J,n as B,r as y,z as L,t as P,h as Q,a2 as X,d as N,s as D,j as R,F as I,i as K,I as ee,a3 as te,e as V,L as A,E as se,u as T,g as O,p as ne,w as U,k as j,a4 as oe,q as le,T as Z,B as ie,v as ae}from"./index-BCgxBvDt.js";import{L as n}from"./localeText-ZTaDi7ZY.js";import{d as de}from"./dayjs.min-By2W00ek.js";const re={class:"card rounded-3 flex-grow-1 bg-danger-subtle border-danger-subtle border shadow"},ue={class:"card-body"},ce={class:"d-flex align-items-center gap-3 inputGroup"},me=["value"],fe={class:"mb-0"},ge={class:"d-flex mt-3"},be=["disabled"],ve={__name:"updateConfigurationName",props:{configurationName:String},emits:["close"],setup(d,{emit:r}){const t=d,f=r,o=J({data:"",valid:!1}),g=Y();z(()=>{q(()=>o.data,b=>{o.valid=/^[a-zA-Z0-9_=+.-]{1,15}$/.test(b)&&b.length>0&&!g.Configurations.find(_=>_.Name===b)})});const u=H(),x=y(!1),c=G(),a=async()=>{o.data&&(x.value=!0,clearInterval(u.Peers.RefreshInterval),await L("/api/renameWireguardConfiguration",{ConfigurationName:t.configurationName,NewConfigurationName:o.data},async b=>{b.status?(await g.getConfigurations(),u.newMessage("Server","Configuration renamed","success"),c.push(`/configuration/${o.data}/peers`)):(u.newMessage("Server",b.message,"danger"),x.value=!1)}))};return(b,_)=>(v(),h("div",re,[e("div",ue,[e("p",null,[s(n,{t:"To update this configuration's name, WGDashboard will execute the following operations:"})]),e("ol",null,[e("li",null,[s(n,{t:"Duplicate current configuration's database table and .conf file with the new name"})]),e("li",null,[s(n,{t:"Delete current configuration's database table and .conf file"})])]),e("div",ce,[e("input",{class:"form-control form-control-sm rounded-3",value:d.configurationName,disabled:""},null,8,me),_[3]||(_[3]=e("h3",{class:"mb-0"},[e("i",{class:"bi bi-arrow-right"})],-1)),C(e("input",{class:B(["form-control form-control-sm rounded-3",[o.data?o.valid?"is-valid":"is-invalid":""]]),id:"newConfigurationName","onUpdate:modelValue":_[0]||(_[0]=w=>o.data=w)},null,2),[[$,o.data]])]),e("div",{class:B(["invalid-feedback",{"d-block":!o.valid&&o.data}])},[s(n,{t:"Configuration name is invalid. Possible reasons:"}),e("ul",fe,[e("li",null,[s(n,{t:"Configuration name already exist"})]),e("li",null,[s(n,{t:"Configuration name can only contain 15 lower/uppercase alphabet, numbers, underscore, equal sign, plus sign, period and hyphen."})])])],2),e("div",ge,[e("button",{onClick:_[1]||(_[1]=w=>f("close")),class:"btn btn-sm bg-secondary-subtle border-secondary-subtle text-secondary-emphasis rounded-3"},[s(n,{t:"Cancel"})]),e("button",{onClick:_[2]||(_[2]=w=>a()),disabled:!o.data||x.value,class:"btn btn-sm btn-danger rounded-3 ms-auto"},[s(n,{t:"Save"})],8,be)])])]))}},pe=M(ve,[["__scopeId","data-v-33ea9576"]]),he={name:"Dropdown",props:{width:{type:String,default:"80px"},height:{type:String,default:"auto"},title:{type:String,default:""},disabled:{type:Boolean,default:!1},defaultDisplay:{type:Boolean,default:!1}}},ye={class:"title"};function xe(d,r,t,f,o,g){return v(),h("div",{class:B(["dropdown",{disabled:t.disabled}]),onClick:r[0]||(r[0]=(...u)=>d.toggleDropdown&&d.toggleDropdown(...u)),onFocusout:r[1]||(r[1]=(...u)=>d.hideDropdown&&d.hideDropdown(...u)),tabindex:"0"},[e("div",ye,[e("div",null,P(t.title),1)])],34)}const _e=M(he,[["render",xe]]),we={components:{Dropdown:_e},name:"CodeEditor",props:{lineNums:{type:Boolean,default:!1},modelValue:{type:String},value:{type:String},theme:{type:String,default:"github-dark"},tabSpaces:{type:Number,default:2},wrap:{type:Boolean,default:!1},readOnly:{type:Boolean,default:!1},autofocus:{type:Boolean,default:!1},header:{type:Boolean,default:!0},width:{type:String,default:"540px"},height:{type:String,default:"auto"},maxWidth:{type:String},minWidth:{type:String},maxHeight:{type:String},minHeight:{type:String},borderRadius:{type:String,default:"12px"},languages:{type:Array,default:function(){return[["javascript","JS"]]}},langListWidth:{type:String,default:"110px"},langListHeight:{type:String,default:"auto"},langListDisplay:{type:Boolean,default:!1},displayLanguage:{type:Boolean,default:!0},zIndex:{type:String,default:"0"},fontSize:{type:String,default:"17px"},padding:{type:String,default:"20px"}},directives:{highlight:{mounted(d,r){d.textContent=r.value},updated(d,r){d.scrolling?d.scrolling=!1:d.textContent=r.value}}},data(){return{scrollBarWidth:0,scrollBarHeight:0,top:0,left:0,languageClass:"hljs language-"+this.languages[0][0],languageTitle:this.languages[0][1]?this.languages[0][1]:this.languages[0][0],content:this.value,cursorPosition:0,insertTab:!1,lineNum:0,lineNumsWidth:0,scrolling:!1,textareaHeight:0,showLineNums:this.wrap?!1:this.lineNums}},computed:{tabWidth(){let d="";for(let r=0;r<this.tabSpaces;r++)d+=" ";return d},contentValue(){return this.modelValue==null?this.content+`
|
||||||
`:this.modelValue+`
|
`:this.modelValue+`
|
||||||
`},scroll(){return this.height!="auto"}},methods:{updateValue(d){this.modelValue==null?this.content=d.target.value:this.$emit("update:modelValue",d.target.value)},changeLang(d){this.languageTitle=d[1]?d[1]:d[0],this.languageClass="language-"+d[0],this.$emit("lang",d[0])},tab(){if(document.execCommand("insertText"))document.execCommand("insertText",!1,this.tabWidth);else{const d=this.$refs.textarea.selectionStart;this.content=this.content.substring(0,d)+this.tabWidth+this.content.substring(d),this.cursorPosition=d+this.tabWidth.length,this.insertTab=!0}},calcScrollDistance(d){this.$refs.code.scrolling=!0,this.scrolling=!0,this.top=-d.target.scrollTop,this.left=-d.target.scrollLeft},resizer(){new ResizeObserver(t=>{this.scrollBarWidth=t[0].target.offsetWidth-t[0].target.clientWidth,this.scrollBarHeight=t[0].target.offsetHeight-t[0].target.clientHeight,this.textareaHeight=t[0].target.offsetHeight}).observe(this.$refs.textarea);const r=new ResizeObserver(t=>{this.lineNumsWidth=t[0].target.offsetWidth});this.$refs.lineNums&&r.observe(this.$refs.lineNums)},copy(){document.execCommand("copy")?(this.$refs.textarea.select(),document.execCommand("copy"),window.getSelection().removeAllRanges()):navigator.clipboard.writeText(this.$refs.textarea.value)},getLineNum(){const d=this.$refs.textarea.value;let r=0,t=d.indexOf(`
|
`},scroll(){return this.height!="auto"}},methods:{updateValue(d){this.modelValue==null?this.content=d.target.value:this.$emit("update:modelValue",d.target.value)},changeLang(d){this.languageTitle=d[1]?d[1]:d[0],this.languageClass="language-"+d[0],this.$emit("lang",d[0])},tab(){if(document.execCommand("insertText"))document.execCommand("insertText",!1,this.tabWidth);else{const d=this.$refs.textarea.selectionStart;this.content=this.content.substring(0,d)+this.tabWidth+this.content.substring(d),this.cursorPosition=d+this.tabWidth.length,this.insertTab=!0}},calcScrollDistance(d){this.$refs.code.scrolling=!0,this.scrolling=!0,this.top=-d.target.scrollTop,this.left=-d.target.scrollLeft},resizer(){new ResizeObserver(t=>{this.scrollBarWidth=t[0].target.offsetWidth-t[0].target.clientWidth,this.scrollBarHeight=t[0].target.offsetHeight-t[0].target.clientHeight,this.textareaHeight=t[0].target.offsetHeight}).observe(this.$refs.textarea);const r=new ResizeObserver(t=>{this.lineNumsWidth=t[0].target.offsetWidth});this.$refs.lineNums&&r.observe(this.$refs.lineNums)},copy(){document.execCommand("copy")?(this.$refs.textarea.select(),document.execCommand("copy"),window.getSelection().removeAllRanges()):navigator.clipboard.writeText(this.$refs.textarea.value)},getLineNum(){const d=this.$refs.textarea.value;let r=0,t=d.indexOf(`
|
||||||
`);for(;t!==-1;)r++,t=d.indexOf(`
|
`);for(;t!==-1;)r++,t=d.indexOf(`
|
||||||
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
|||||||
import{H as I,P as S,q as w,u as L,Q as R,J as k}from"./index-BZiAwcQm.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 I(t,a,{...r,immediate:!0})}const O=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:[O].filter(s=>s!=null),C(S(r.value?t[1]:t[0])),C(L(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=O,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=R(!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},j=[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:()=>j.forEach(l=>l())}}export{D as a,B as o,P as u};
|
import{H as I,P as S,q as w,u as L,Q as R,J as k}from"./index-BCgxBvDt.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 I(t,a,{...r,immediate:!0})}const O=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:[O].filter(s=>s!=null),C(S(r.value?t[1]:t[0])),C(L(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=O,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=R(!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},j=[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:()=>j.forEach(l=>l())}}export{D as a,B as o,P as u};
|
||||||
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 e,G as t,c as o,t as a,f as c}from"./index-BZiAwcQm.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-BCgxBvDt.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-WpKL5olL.js";import{d as c}from"./dayjs.min-BFXcQxCV.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-BZiAwcQm.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-ZTaDi7ZY.js";import{d as c}from"./dayjs.min-By2W00ek.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-BCgxBvDt.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};
|
||||||
File diff suppressed because one or more lines are too long
@@ -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-5IlHN0Py.js";import{_ as Y,D as G,c as $,d as j,f as q}from"./index-BZiAwcQm.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-5IlHN0Py.js";import{_ as Y,D as G,c as $,d as j,f as q}from"./index-BCgxBvDt.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
src/static/dist/WGDashboardAdmin/assets/peerAddModal-BxInvNyf.js
vendored
Normal file
1
src/static/dist/WGDashboardAdmin/assets/peerAddModal-BxInvNyf.js
vendored
Normal file
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{_ as v,D as g,o as h,L as x,g as y,r as d,c as o,f as i,a as s,b as c,d as w,n as C,w as k,k as F}from"./index-BZiAwcQm.js";import{L as T}from"./localeText-WpKL5olL.js";import"./browser-DsJH88Zo.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=d(!1),n=d(""),a=d(!0);h(()=>{const l=x();y("/api/downloadPeer/"+l.params.id,{id:f.selectedPeer.id},e=>{e.status?(n.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(n.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(l,e)=>(i(),o("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:n.value},null,10,V),a.value?(i(),o("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?(i(),o("span",q,[...e[4]||(e[4]=[s("i",{class:"bi bi-check-circle-fill"},null,-1)])])):(i(),o("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,o as h,L as x,g as y,r as d,c as o,f as i,a as s,b as c,d as w,n as C,w as k,k as F}from"./index-BCgxBvDt.js";import{L as T}from"./localeText-ZTaDi7ZY.js";import"./browser-ZR_b4Y9v.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=d(!1),n=d(""),a=d(!0);h(()=>{const l=x();y("/api/downloadPeer/"+l.params.id,{id:f.selectedPeer.id},e=>{e.status?(n.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(n.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(l,e)=>(i(),o("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:n.value},null,10,V),a.value?(i(),o("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?(i(),o("span",q,[...e[4]||(e[4]=[s("i",{class:"bi bi-check-circle-fill"},null,-1)])])):(i(),o("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-WpKL5olL.js";import{P as t}from"./peersDefaultSettingsInput-BhbKi8vG.js";import{B as s,c as l,a,b as e,f as n}from"./index-BZiAwcQm.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-ZTaDi7ZY.js";import{P as t}from"./peersDefaultSettingsInput-DSctHfye.js";import{B as s,c as l,a,b as e,f as n}from"./index-BCgxBvDt.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-Bx8zZKjV.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-BZiAwcQm.js";import{L as w}from"./localeText-WpKL5olL.js";import"./vue-datepicker-CiWK5bQ1.js";import"./index-Dih9WF2n.js";import"./dayjs.min-BFXcQxCV.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-Bkf8s8xv.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-BCgxBvDt.js";import{L as w}from"./localeText-ZTaDi7ZY.js";import"./vue-datepicker-B-Few8JH.js";import"./index-D9MDCdu-.js";import"./dayjs.min-By2W00ek.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-Bx8zZKjV.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-BZiAwcQm.js";import{L as x}from"./localeText-WpKL5olL.js";import"./vue-datepicker-CiWK5bQ1.js";import"./index-Dih9WF2n.js";import"./dayjs.min-BFXcQxCV.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-Bkf8s8xv.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-BCgxBvDt.js";import{L as x}from"./localeText-ZTaDi7ZY.js";import"./vue-datepicker-B-Few8JH.js";import"./index-D9MDCdu-.js";import"./dayjs.min-By2W00ek.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};
|
||||||
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{Q as l}from"./browser-DsJH88Zo.js";import{L as _}from"./localeText-WpKL5olL.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-BZiAwcQm.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-ZR_b4Y9v.js";import{L as _}from"./localeText-ZTaDi7ZY.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-BCgxBvDt.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,W as m,r as u,a0 as f,L as h,K as _,o as v,a1 as g,c as x,d as S,f as y,a as s,m as b,y as B,q as w,G as T}from"./index-BZiAwcQm.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=w(()=>T("Search Peers..."));let r;const t=m(),e=u(t.searchString),d=()=>{r?(clearTimeout(r),r=setTimeout(()=>{t.searchString=e.value},300)):r=setTimeout(()=>{t.searchString=e.value},300)};f("searchBar");const a=h(),i=_();a.query.peer&&(e.value=a.query.peer,i.replace({query:null}));const n=u(!0);return v(()=>{document.querySelector("#searchPeers").focus()}),g(()=>{n.value=!1}),(G,o)=>n.value?(y(),x("div",q,[s("div",C,[s("div",P,[b(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),[[B,e.value]])])])])):S("",!0)}},K=p(k,[["__scopeId","data-v-576347d8"]]);export{K as default};
|
import{_ as p,W as m,r as u,a0 as f,L as h,K as _,o as v,a1 as g,c as x,d as S,f as y,a as s,m as b,y as B,q as w,G as T}from"./index-BCgxBvDt.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=w(()=>T("Search Peers..."));let r;const t=m(),e=u(t.searchString),d=()=>{r?(clearTimeout(r),r=setTimeout(()=>{t.searchString=e.value},300)):r=setTimeout(()=>{t.searchString=e.value},300)};f("searchBar");const a=h(),i=_();a.query.peer&&(e.value=a.query.peer,i.replace({query:null}));const n=u(!0);return v(()=>{document.querySelector("#searchPeers").focus()}),g(()=>{n.value=!1}),(G,o)=>n.value?(y(),x("div",q,[s("div",C,[s("div",P,[b(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),[[B,e.value]])])])])):S("",!0)}},K=p(k,[["__scopeId","data-v-576347d8"]]);export{K as default};
|
||||||
1
src/static/dist/WGDashboardAdmin/assets/peerSettings-Bhhi6rJl.js
vendored
Normal file
1
src/static/dist/WGDashboardAdmin/assets/peerSettings-Bhhi6rJl.js
vendored
Normal file
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
|||||||
.toggleShowKey[data-v-12b3ae8e]{position:absolute;top:35px;right:12px}
|
|
||||||
1
src/static/dist/WGDashboardAdmin/assets/peerSettings-DxOHL3dW.css
vendored
Normal file
1
src/static/dist/WGDashboardAdmin/assets/peerSettings-DxOHL3dW.css
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
.toggleShowKey[data-v-f702a2b1]{position:absolute;top:35px;right:12px}
|
||||||
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 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-BZiAwcQm.js";import{L as _}from"./localeText-WpKL5olL.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-BCgxBvDt.js";import{L as _}from"./localeText-ZTaDi7ZY.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-WpKL5olL.js";import{c as a,d as r,e as s,j as i,f as e}from"./index-BZiAwcQm.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-ZTaDi7ZY.js";import{c as a,d as r,e as s,j as i,f as e}from"./index-BCgxBvDt.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 _};
|
||||||
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{_ 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-BZiAwcQm.js";import{P}from"./peersDefaultSettingsInput-BhbKi8vG.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-Co9WAhOm.js";import{D as R,a as W}from"./dashboardSettingsWireguardConfigurationAutostart-4zPt4x1F.js";import{L as U}from"./localeText-WpKL5olL.js";import"./dayjs.min-BFXcQxCV.js";import"./vue-datepicker-CiWK5bQ1.js";import"./index-Dih9WF2n.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-BCgxBvDt.js";import{P}from"./peersDefaultSettingsInput-DSctHfye.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-BRi1hIv0.js";import{D as R,a as W}from"./dashboardSettingsWireguardConfigurationAutostart-Ccsp3PDe.js";import{L as U}from"./localeText-ZTaDi7ZY.js";import"./dayjs.min-By2W00ek.js";import"./vue-datepicker-B-Few8JH.js";import"./index-D9MDCdu-.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-BZiAwcQm.js";import{L as g}from"./localeText-WpKL5olL.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-BCgxBvDt.js";import{L as g}from"./localeText-ZTaDi7ZY.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,D as h,r as c,g as u,L as b,f}from"./index-BZiAwcQm.js";import{Q as v}from"./browser-DsJH88Zo.js";import{L as y}from"./localeText-WpKL5olL.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,D as h,r as c,g as u,L as b,f}from"./index-BCgxBvDt.js";import{Q as v}from"./browser-ZR_b4Y9v.js";import{L as y}from"./localeText-ZTaDi7ZY.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,c as t,f as r,b as n,w as b,d as x,r as f,n as v,s as l,q as g,a as c,e as C,t as d,k as w,p as y}from"./index-BZiAwcQm.js";import{L as _}from"./localeText-WpKL5olL.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=>({a680627c:s.value}));const u=e,o=f(!1),s=g(()=>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:b(()=>[o.value?(r(),t("div",{key:0,style:l([{"white-space":"nowrap"},{top:s.value}]),class:v(["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-d4cea788"]]);export{h as C};
|
import{_ as p,c as t,f as r,b as n,w as b,d as x,r as f,n as v,s as l,q as g,a as c,e as C,t as d,k as w,p as y}from"./index-BCgxBvDt.js";import{L as _}from"./localeText-ZTaDi7ZY.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=>({a680627c:s.value}));const u=e,o=f(!1),s=g(()=>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:b(()=>[o.value?(r(),t("div",{key:0,style:l([{"white-space":"nowrap"},{top:s.value}]),class:v(["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-d4cea788"]]);export{h as C};
|
||||||
File diff suppressed because one or more lines are too long
@@ -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-BZiAwcQm.js";import{Q as x}from"./browser-DsJH88Zo.js";import{L as y}from"./localeText-WpKL5olL.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-BCgxBvDt.js";import{Q as x}from"./browser-ZR_b4Y9v.js";import{L as y}from"./localeText-ZTaDi7ZY.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,I 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-BZiAwcQm.js";import{O as A}from"./osmap-DxUOMGKN.js";import{L as w}from"./localeText-WpKL5olL.js";import"./Vector-5IlHN0Py.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"},I=["disabled"],O=["disabled"],V={key:0,class:"d-block"},B={key:1,class:"d-block"},N={class:"position-relative"},z={key:"pingPlaceholder"},D={key:1},E={key:"table",class:"w-100 mt-2"},F={class:"table table-sm rounded-3 w-100"},G={scope:"col"},H={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,I),[[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",B,[...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",V,[...s[3]||(s[3]=[t("i",{class:"bi bi-person-walking me-2"},null,-1),v("Trace! ",-1)])]))]),_:1})],8,O)]),t("div",N,[n(u,{name:"ping"},{default:c(()=>[this.tracerouteResult?(l(),o("div",D,[n(p,{d:this.tracerouteResult,type:"traceroute"},null,8,["d"]),t("div",E,[t("table",F,[t("thead",null,[t("tr",null,[t("th",G,[n(a,{t:"Hop"})]),t("th",H,[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",z,[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,I 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-BCgxBvDt.js";import{O as A}from"./osmap-SRnOrxSF.js";import{L as w}from"./localeText-ZTaDi7ZY.js";import"./Vector-5IlHN0Py.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"},I=["disabled"],O=["disabled"],V={key:0,class:"d-block"},B={key:1,class:"d-block"},N={class:"position-relative"},z={key:"pingPlaceholder"},D={key:1},E={key:"table",class:"w-100 mt-2"},F={class:"table table-sm rounded-3 w-100"},G={scope:"col"},H={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,I),[[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",B,[...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",V,[...s[3]||(s[3]=[t("i",{class:"bi bi-person-walking me-2"},null,-1),v("Trace! ",-1)])]))]),_:1})],8,O)]),t("div",N,[n(u,{name:"ping"},{default:c(()=>[this.tracerouteResult?(l(),o("div",D,[n(p,{d:this.tracerouteResult,type:"traceroute"},null,8,["d"]),t("div",E,[t("table",F,[t("thead",null,[t("tr",null,[t("th",G,[n(a,{t:"Hop"})]),t("th",H,[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",z,[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};
|
||||||
File diff suppressed because one or more lines are too long
@@ -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-BZiAwcQm.js";import{L as a}from"./localeText-WpKL5olL.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-Co9WAhOm.js";import"./dayjs.min-BFXcQxCV.js";import"./vue-datepicker-CiWK5bQ1.js";import"./index-Dih9WF2n.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-BCgxBvDt.js";import{L as a}from"./localeText-ZTaDi7ZY.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-BRi1hIv0.js";import"./dayjs.min-By2W00ek.js";import"./vue-datepicker-B-Few8JH.js";import"./index-D9MDCdu-.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};
|
||||||
File diff suppressed because one or more lines are too long
2
src/static/dist/WGDashboardAdmin/index.html
vendored
2
src/static/dist/WGDashboardAdmin/index.html
vendored
@@ -18,7 +18,7 @@
|
|||||||
base.href = '/';
|
base.href = '/';
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
<script type="module" crossorigin src="./assets/index-BZiAwcQm.js"></script>
|
<script type="module" crossorigin src="./assets/index-BCgxBvDt.js"></script>
|
||||||
<link rel="stylesheet" crossorigin href="./assets/index--rUYk9Qx.css">
|
<link rel="stylesheet" crossorigin href="./assets/index--rUYk9Qx.css">
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|||||||
Reference in New Issue
Block a user