mirror of
https://github.com/ngoduykhanh/wireguard-ui.git
synced 2025-06-07 00:46:58 +03:00
Merge 0035475214
into 2fdafd34ca
This commit is contained in:
commit
6ca24cab77
9 changed files with 46 additions and 22 deletions
|
@ -83,7 +83,9 @@ These environment variables are used to control the default server settings used
|
||||||
|-----------------------------------|-----------------------------------------------------------------------------------------------|-----------------|
|
|-----------------------------------|-----------------------------------------------------------------------------------------------|-----------------|
|
||||||
| `WGUI_SERVER_INTERFACE_ADDRESSES` | The default interface addresses (comma-separated-list) for the WireGuard server configuration | `10.252.1.0/24` |
|
| `WGUI_SERVER_INTERFACE_ADDRESSES` | The default interface addresses (comma-separated-list) for the WireGuard server configuration | `10.252.1.0/24` |
|
||||||
| `WGUI_SERVER_LISTEN_PORT` | The default server listen port | `51820` |
|
| `WGUI_SERVER_LISTEN_PORT` | The default server listen port | `51820` |
|
||||||
|
| `WGUI_SERVER_PRE_UP_SCRIPT` | The default server pre-up script | N/A |
|
||||||
| `WGUI_SERVER_POST_UP_SCRIPT` | The default server post-up script | N/A |
|
| `WGUI_SERVER_POST_UP_SCRIPT` | The default server post-up script | N/A |
|
||||||
|
| `WGUI_SERVER_PRE_DOWN_SCRIPT` | The default server pre-down script | N/A |
|
||||||
| `WGUI_SERVER_POST_DOWN_SCRIPT` | The default server post-down script | N/A |
|
| `WGUI_SERVER_POST_DOWN_SCRIPT` | The default server post-down script | N/A |
|
||||||
|
|
||||||
### Defaults for new clients
|
### Defaults for new clients
|
||||||
|
|
|
@ -1,3 +1,10 @@
|
||||||
|
/*
|
||||||
|
Hack using jQuery's text() method and a temporary element to escape html()
|
||||||
|
utilizing jQuery.
|
||||||
|
*/
|
||||||
|
function escapeHtml(unsafe) {
|
||||||
|
return $('<div/>').text(unsafe).html();
|
||||||
|
}
|
||||||
function renderClientList(data) {
|
function renderClientList(data) {
|
||||||
$.each(data, function(index, obj) {
|
$.each(data, function(index, obj) {
|
||||||
// render telegram button
|
// render telegram button
|
||||||
|
@ -6,13 +13,13 @@ function renderClientList(data) {
|
||||||
telegramButton = `<div class="btn-group">
|
telegramButton = `<div class="btn-group">
|
||||||
<button type="button" class="btn btn-outline-primary btn-sm" data-toggle="modal"
|
<button type="button" class="btn btn-outline-primary btn-sm" data-toggle="modal"
|
||||||
data-target="#modal_telegram_client" data-clientid="${obj.Client.id}"
|
data-target="#modal_telegram_client" data-clientid="${obj.Client.id}"
|
||||||
data-clientname="${obj.Client.name}">Telegram</button>
|
data-clientname="${escapeHtml(obj.Client.name)}">Telegram</button>
|
||||||
</div>`
|
</div>`
|
||||||
}
|
}
|
||||||
|
|
||||||
let telegramHtml = "";
|
let telegramHtml = "";
|
||||||
if (obj.Client.telegram_userid && obj.Client.telegram_userid.length > 0) {
|
if (obj.Client.telegram_userid && obj.Client.telegram_userid.length > 0) {
|
||||||
telegramHtml = `<span class="info-box-text" style="display: none"><i class="fas fa-tguserid"></i>${obj.Client.telegram_userid}</span>`
|
telegramHtml = `<span class="info-box-text" style="display: none"><i class="fas fa-tguserid"></i>${escapeHtml(obj.Client.telegram_userid)}</span>`
|
||||||
}
|
}
|
||||||
|
|
||||||
// render client status css tag style
|
// render client status css tag style
|
||||||
|
@ -24,13 +31,13 @@ function renderClientList(data) {
|
||||||
// render client allocated ip addresses
|
// render client allocated ip addresses
|
||||||
let allocatedIpsHtml = "";
|
let allocatedIpsHtml = "";
|
||||||
$.each(obj.Client.allocated_ips, function(index, obj) {
|
$.each(obj.Client.allocated_ips, function(index, obj) {
|
||||||
allocatedIpsHtml += `<small class="badge badge-secondary">${obj}</small> `;
|
allocatedIpsHtml += `<small class="badge badge-secondary">${escapeHtml(obj)}</small> `;
|
||||||
})
|
})
|
||||||
|
|
||||||
// render client allowed ip addresses
|
// render client allowed ip addresses
|
||||||
let allowedIpsHtml = "";
|
let allowedIpsHtml = "";
|
||||||
$.each(obj.Client.allowed_ips, function(index, obj) {
|
$.each(obj.Client.allowed_ips, function(index, obj) {
|
||||||
allowedIpsHtml += `<small class="badge badge-secondary">${obj}</small> `;
|
allowedIpsHtml += `<small class="badge badge-secondary">${escapeHtml(obj)}</small> `;
|
||||||
})
|
})
|
||||||
|
|
||||||
let subnetRangesString = "";
|
let subnetRangesString = "";
|
||||||
|
@ -40,7 +47,7 @@ function renderClientList(data) {
|
||||||
|
|
||||||
let additionalNotesHtml = "";
|
let additionalNotesHtml = "";
|
||||||
if (obj.Client.additional_notes && obj.Client.additional_notes.length > 0) {
|
if (obj.Client.additional_notes && obj.Client.additional_notes.length > 0) {
|
||||||
additionalNotesHtml = `<span class="info-box-text" style="display: none"><i class="fas fa-additional_notes"></i>${obj.Client.additional_notes.toUpperCase()}</span>`
|
additionalNotesHtml = `<span class="info-box-text" style="display: none"><i class="fas fa-additional_notes"></i>${escapeHtml(obj.Client.additional_notes.toUpperCase())}</span>`
|
||||||
}
|
}
|
||||||
|
|
||||||
// render client html content
|
// render client html content
|
||||||
|
@ -56,12 +63,12 @@ function renderClientList(data) {
|
||||||
<div class="btn-group">
|
<div class="btn-group">
|
||||||
<button type="button" class="btn btn-outline-primary btn-sm" data-toggle="modal"
|
<button type="button" class="btn btn-outline-primary btn-sm" data-toggle="modal"
|
||||||
data-target="#modal_qr_client" data-clientid="${obj.Client.id}"
|
data-target="#modal_qr_client" data-clientid="${obj.Client.id}"
|
||||||
data-clientname="${obj.Client.name}" ${obj.QRCode != "" ? '' : ' disabled'}>QR code</button>
|
data-clientname="${escapeHtml(obj.Client.name)}" ${obj.QRCode != "" ? '' : ' disabled'}>QR code</button>
|
||||||
</div>
|
</div>
|
||||||
<div class="btn-group">
|
<div class="btn-group">
|
||||||
<button type="button" class="btn btn-outline-primary btn-sm" data-toggle="modal"
|
<button type="button" class="btn btn-outline-primary btn-sm" data-toggle="modal"
|
||||||
data-target="#modal_email_client" data-clientid="${obj.Client.id}"
|
data-target="#modal_email_client" data-clientid="${obj.Client.id}"
|
||||||
data-clientname="${obj.Client.name}">Email</button>
|
data-clientname="${escapeHtml(obj.Client.name)}">Email</button>
|
||||||
</div>
|
</div>
|
||||||
${telegramButton}
|
${telegramButton}
|
||||||
<div class="btn-group">
|
<div class="btn-group">
|
||||||
|
@ -72,22 +79,22 @@ function renderClientList(data) {
|
||||||
<div class="dropdown-menu" role="menu">
|
<div class="dropdown-menu" role="menu">
|
||||||
<a class="dropdown-item" href="#" data-toggle="modal"
|
<a class="dropdown-item" href="#" data-toggle="modal"
|
||||||
data-target="#modal_edit_client" data-clientid="${obj.Client.id}"
|
data-target="#modal_edit_client" data-clientid="${obj.Client.id}"
|
||||||
data-clientname="${obj.Client.name}">Edit</a>
|
data-clientname="${escapeHtml(obj.Client.name)}">Edit</a>
|
||||||
<a class="dropdown-item" href="#" data-toggle="modal"
|
<a class="dropdown-item" href="#" data-toggle="modal"
|
||||||
data-target="#modal_pause_client" data-clientid="${obj.Client.id}"
|
data-target="#modal_pause_client" data-clientid="${obj.Client.id}"
|
||||||
data-clientname="${obj.Client.name}">Disable</a>
|
data-clientname="${escapeHtml(obj.Client.name)}">Disable</a>
|
||||||
<a class="dropdown-item" href="#" data-toggle="modal"
|
<a class="dropdown-item" href="#" data-toggle="modal"
|
||||||
data-target="#modal_remove_client" data-clientid="${obj.Client.id}"
|
data-target="#modal_remove_client" data-clientid="${obj.Client.id}"
|
||||||
data-clientname="${obj.Client.name}">Delete</a>
|
data-clientname="${escapeHtml(obj.Client.name)}">Delete</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<hr>
|
<hr>
|
||||||
<span class="info-box-text"><i class="fas fa-user"></i> ${obj.Client.name}</span>
|
<span class="info-box-text"><i class="fas fa-user"></i> ${escapeHtml(obj.Client.name)}</span>
|
||||||
<span class="info-box-text" style="display: none"><i class="fas fa-key"></i> ${obj.Client.public_key}</span>
|
<span class="info-box-text" style="display: none"><i class="fas fa-key"></i> ${escapeHtml(obj.Client.public_key)}</span>
|
||||||
<span class="info-box-text" style="display: none"><i class="fas fa-subnetrange"></i>${subnetRangesString}</span>
|
<span class="info-box-text" style="display: none"><i class="fas fa-subnetrange"></i>${escapeHtml(subnetRangesString)}</span>
|
||||||
${telegramHtml}
|
${telegramHtml}
|
||||||
${additionalNotesHtml}
|
${additionalNotesHtml}
|
||||||
<span class="info-box-text"><i class="fas fa-envelope"></i> ${obj.Client.email}</span>
|
<span class="info-box-text"><i class="fas fa-envelope"></i> ${escapeHtml(obj.Client.email)}</span>
|
||||||
<span class="info-box-text"><i class="fas fa-clock"></i>
|
<span class="info-box-text"><i class="fas fa-clock"></i>
|
||||||
${prettyDateTime(obj.Client.created_at)}</span>
|
${prettyDateTime(obj.Client.created_at)}</span>
|
||||||
<span class="info-box-text"><i class="fas fa-history"></i>
|
<span class="info-box-text"><i class="fas fa-history"></i>
|
||||||
|
@ -95,7 +102,7 @@ function renderClientList(data) {
|
||||||
<span class="info-box-text"><i class="fas fa-server" style="${obj.Client.use_server_dns ? "opacity: 1.0" : "opacity: 0.5"}"></i>
|
<span class="info-box-text"><i class="fas fa-server" style="${obj.Client.use_server_dns ? "opacity: 1.0" : "opacity: 0.5"}"></i>
|
||||||
${obj.Client.use_server_dns ? 'DNS enabled' : 'DNS disabled'}</span>
|
${obj.Client.use_server_dns ? 'DNS enabled' : 'DNS disabled'}</span>
|
||||||
<span class="info-box-text"><i class="fas fa-file"></i>
|
<span class="info-box-text"><i class="fas fa-file"></i>
|
||||||
${obj.Client.additional_notes}</span>
|
${escapeHtml(obj.Client.additional_notes)}</span>
|
||||||
<span class="info-box-text"><strong>IP Allocation</strong></span>`
|
<span class="info-box-text"><strong>IP Allocation</strong></span>`
|
||||||
+ allocatedIpsHtml
|
+ allocatedIpsHtml
|
||||||
+ `<span class="info-box-text"><strong>Allowed IPs</strong></span>`
|
+ `<span class="info-box-text"><strong>Allowed IPs</strong></span>`
|
||||||
|
|
|
@ -22,6 +22,7 @@ type ServerInterface struct {
|
||||||
Addresses []string `json:"addresses"`
|
Addresses []string `json:"addresses"`
|
||||||
ListenPort int `json:"listen_port,string"` // ,string to get listen_port string input as int
|
ListenPort int `json:"listen_port,string"` // ,string to get listen_port string input as int
|
||||||
UpdatedAt time.Time `json:"updated_at"`
|
UpdatedAt time.Time `json:"updated_at"`
|
||||||
|
PreUp string `json:"pre_up"`
|
||||||
PostUp string `json:"post_up"`
|
PostUp string `json:"post_up"`
|
||||||
PreDown string `json:"pre_down"`
|
PreDown string `json:"pre_down"`
|
||||||
PostDown string `json:"post_down"`
|
PostDown string `json:"post_down"`
|
||||||
|
|
|
@ -2,6 +2,7 @@ package router
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
"html"
|
||||||
"io"
|
"io"
|
||||||
"io/fs"
|
"io/fs"
|
||||||
"reflect"
|
"reflect"
|
||||||
|
@ -112,8 +113,10 @@ func New(tmplDir fs.FS, extraData map[string]interface{}, secret [64]byte) *echo
|
||||||
}
|
}
|
||||||
|
|
||||||
// create template list
|
// create template list
|
||||||
|
//"htmlescaper": template.htmlEscaper,
|
||||||
funcs := template.FuncMap{
|
funcs := template.FuncMap{
|
||||||
"StringsJoin": strings.Join,
|
"StringsJoin": strings.Join,
|
||||||
|
"attrescaper": html.EscapeString,
|
||||||
}
|
}
|
||||||
templates := make(map[string]*template.Template)
|
templates := make(map[string]*template.Template)
|
||||||
templates["login.html"] = template.Must(template.New("login").Funcs(funcs).Parse(tmplLoginString))
|
templates["login.html"] = template.Must(template.New("login").Funcs(funcs).Parse(tmplLoginString))
|
||||||
|
|
|
@ -64,7 +64,9 @@ func (o *JsonDB) Init() error {
|
||||||
serverInterface := new(model.ServerInterface)
|
serverInterface := new(model.ServerInterface)
|
||||||
serverInterface.Addresses = util.LookupEnvOrStrings(util.ServerAddressesEnvVar, []string{util.DefaultServerAddress})
|
serverInterface.Addresses = util.LookupEnvOrStrings(util.ServerAddressesEnvVar, []string{util.DefaultServerAddress})
|
||||||
serverInterface.ListenPort = util.LookupEnvOrInt(util.ServerListenPortEnvVar, util.DefaultServerPort)
|
serverInterface.ListenPort = util.LookupEnvOrInt(util.ServerListenPortEnvVar, util.DefaultServerPort)
|
||||||
|
serverInterface.PreUp = util.LookupEnvOrString(util.ServerPreUpScriptEnvVar, "")
|
||||||
serverInterface.PostUp = util.LookupEnvOrString(util.ServerPostUpScriptEnvVar, "")
|
serverInterface.PostUp = util.LookupEnvOrString(util.ServerPostUpScriptEnvVar, "")
|
||||||
|
serverInterface.PreDown = util.LookupEnvOrString(util.ServerPreDownScriptEnvVar, "")
|
||||||
serverInterface.PostDown = util.LookupEnvOrString(util.ServerPostDownScriptEnvVar, "")
|
serverInterface.PostDown = util.LookupEnvOrString(util.ServerPostDownScriptEnvVar, "")
|
||||||
serverInterface.UpdatedAt = time.Now().UTC()
|
serverInterface.UpdatedAt = time.Now().UTC()
|
||||||
o.conn.Write("server", "interfaces", serverInterface)
|
o.conn.Write("server", "interfaces", serverInterface)
|
||||||
|
|
|
@ -37,21 +37,26 @@ Wireguard Server Settings
|
||||||
<input type="text" class="form-control" id="listen_port" name="listen_port"
|
<input type="text" class="form-control" id="listen_port" name="listen_port"
|
||||||
placeholder="Listen Port" value="{{ .serverInterface.ListenPort }}">
|
placeholder="Listen Port" value="{{ .serverInterface.ListenPort }}">
|
||||||
</div>
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="pre_up">Pre Up Script</label>
|
||||||
|
<input type="text" class="form-control" id="pre_up" name="pre_up"
|
||||||
|
placeholder="Pre Up Script" value="{{ .serverInterface.PreUp | attrescaper }}">
|
||||||
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="post_up">Post Up Script</label>
|
<label for="post_up">Post Up Script</label>
|
||||||
<input type="text" class="form-control" id="post_up" name="post_up"
|
<input type="text" class="form-control" id="post_up" name="post_up"
|
||||||
placeholder="Post Up Script" value="{{ .serverInterface.PostUp }}">
|
placeholder="Post Up Script" value="{{ .serverInterface.PostUp | attrescaper }}">
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="pre_down">Pre Down Script</label>
|
<label for="pre_down">Pre Down Script</label>
|
||||||
<input type="text" class="form-control" id="pre_down" name="pre_down"
|
<input type="text" class="form-control" id="pre_down" name="pre_down"
|
||||||
placeholder="Pre Down Script" value="{{ .serverInterface.PreDown }}">
|
placeholder="Pre Down Script" value="{{ .serverInterface.PreDown | attrescaper }}">
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="post_down">Post Down Script</label>
|
<label for="post_down">Post Down Script</label>
|
||||||
<input type="text" class="form-control" id="post_down" name="post_down"
|
<input type="text" class="form-control" id="post_down" name="post_down"
|
||||||
placeholder="Post Down Script" value="{{ .serverInterface.PostDown }}">
|
placeholder="Post Down Script" value="{{ .serverInterface.PostDown | attrescaper }}">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<!-- /.card-body -->
|
<!-- /.card-body -->
|
||||||
|
@ -135,10 +140,11 @@ Wireguard Server Settings
|
||||||
function submitServerInterfaceSetting() {
|
function submitServerInterfaceSetting() {
|
||||||
const addresses = $("#addresses").val().split(",");
|
const addresses = $("#addresses").val().split(",");
|
||||||
const listen_port = $("#listen_port").val();
|
const listen_port = $("#listen_port").val();
|
||||||
|
const pre_up = $("#pre_up").val();
|
||||||
const post_up = $("#post_up").val();
|
const post_up = $("#post_up").val();
|
||||||
const pre_down = $("#pre_down").val();
|
const pre_down = $("#pre_down").val();
|
||||||
const post_down = $("#post_down").val();
|
const post_down = $("#post_down").val();
|
||||||
const data = {"addresses": addresses, "listen_port": listen_port, "post_up": post_up, "pre_down": pre_down, "post_down": post_down};
|
const data = {"addresses": addresses, "listen_port": listen_port, "pre_up": pre_up, "post_up": post_up, "pre_down": pre_down, "post_down": post_down};
|
||||||
|
|
||||||
$.ajax({
|
$.ajax({
|
||||||
cache: false,
|
cache: false,
|
||||||
|
|
|
@ -90,7 +90,7 @@
|
||||||
<button type="button"
|
<button type="button"
|
||||||
class="btn btn-outline-primary btn-sm btn_modify_wake_on_lan_host"
|
class="btn btn-outline-primary btn-sm btn_modify_wake_on_lan_host"
|
||||||
data-toggle="modal" data-target="#modal_wake_on_lan_host"
|
data-toggle="modal" data-target="#modal_wake_on_lan_host"
|
||||||
data-name="{{ .Name }}" data-mac-address="{{ .MacAddress }}">Edit
|
data-name="{{ .Name | attrescaper }}" data-mac-address="{{ .MacAddress }}">Edit
|
||||||
</button>
|
</button>
|
||||||
<button type="button" class="btn btn-outline-danger btn-sm" data-toggle="modal"
|
<button type="button" class="btn btn-outline-danger btn-sm" data-toggle="modal"
|
||||||
data-target="#modal_remove_wake_on_lan_host"
|
data-target="#modal_remove_wake_on_lan_host"
|
||||||
|
@ -98,7 +98,7 @@
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<hr>
|
<hr>
|
||||||
<span class="info-box-text"><i class="fas fa-address-card"></i> <span class="name">{{ .Name }}</span></span>
|
<span class="info-box-text"><i class="fas fa-address-card"></i> <span class="name">{{ .Name | attrescaper }}</span></span>
|
||||||
<span class="info-box-text"><i class="fas fa-ethernet"></i> <span class="mac-address">{{ .MacAddress }}</span></span>
|
<span class="info-box-text"><i class="fas fa-ethernet"></i> <span class="mac-address">{{ .MacAddress }}</span></span>
|
||||||
<span class="info-box-text"><i class="fas fa-clock"></i>
|
<span class="info-box-text"><i class="fas fa-clock"></i>
|
||||||
<span class="latest-used">
|
<span class="latest-used">
|
||||||
|
@ -120,4 +120,4 @@
|
||||||
{{end}}
|
{{end}}
|
||||||
{{define "bottom_js"}}
|
{{define "bottom_js"}}
|
||||||
<script src="{{.basePath}}/static/custom/js/wake_on_lan_hosts.js"></script>
|
<script src="{{.basePath}}/static/custom/js/wake_on_lan_hosts.js"></script>
|
||||||
{{end}}
|
{{end}}
|
||||||
|
|
|
@ -8,6 +8,7 @@ Address = {{$first :=true}}{{range .serverConfig.Interface.Addresses }}{{if $fir
|
||||||
ListenPort = {{ .serverConfig.Interface.ListenPort }}
|
ListenPort = {{ .serverConfig.Interface.ListenPort }}
|
||||||
PrivateKey = {{ .serverConfig.KeyPair.PrivateKey }}
|
PrivateKey = {{ .serverConfig.KeyPair.PrivateKey }}
|
||||||
{{if .globalSettings.MTU}}MTU = {{ .globalSettings.MTU }}{{end}}
|
{{if .globalSettings.MTU}}MTU = {{ .globalSettings.MTU }}{{end}}
|
||||||
|
PreUp = {{ .serverConfig.Interface.PreUp }}
|
||||||
PostUp = {{ .serverConfig.Interface.PostUp }}
|
PostUp = {{ .serverConfig.Interface.PostUp }}
|
||||||
PreDown = {{ .serverConfig.Interface.PreDown }}
|
PreDown = {{ .serverConfig.Interface.PreDown }}
|
||||||
PostDown = {{ .serverConfig.Interface.PostDown }}
|
PostDown = {{ .serverConfig.Interface.PostDown }}
|
||||||
|
|
|
@ -58,7 +58,9 @@ const (
|
||||||
LogLevel = "WGUI_LOG_LEVEL"
|
LogLevel = "WGUI_LOG_LEVEL"
|
||||||
ServerAddressesEnvVar = "WGUI_SERVER_INTERFACE_ADDRESSES"
|
ServerAddressesEnvVar = "WGUI_SERVER_INTERFACE_ADDRESSES"
|
||||||
ServerListenPortEnvVar = "WGUI_SERVER_LISTEN_PORT"
|
ServerListenPortEnvVar = "WGUI_SERVER_LISTEN_PORT"
|
||||||
|
ServerPreUpScriptEnvVar = "WGUI_SERVER_PRE_UP_SCRIPT"
|
||||||
ServerPostUpScriptEnvVar = "WGUI_SERVER_POST_UP_SCRIPT"
|
ServerPostUpScriptEnvVar = "WGUI_SERVER_POST_UP_SCRIPT"
|
||||||
|
ServerPreDownScriptEnvVar = "WGUI_SERVER_PRE_DOWN_SCRIPT"
|
||||||
ServerPostDownScriptEnvVar = "WGUI_SERVER_POST_DOWN_SCRIPT"
|
ServerPostDownScriptEnvVar = "WGUI_SERVER_POST_DOWN_SCRIPT"
|
||||||
DefaultClientAllowedIpsEnvVar = "WGUI_DEFAULT_CLIENT_ALLOWED_IPS"
|
DefaultClientAllowedIpsEnvVar = "WGUI_DEFAULT_CLIENT_ALLOWED_IPS"
|
||||||
DefaultClientExtraAllowedIpsEnvVar = "WGUI_DEFAULT_CLIENT_EXTRA_ALLOWED_IPS"
|
DefaultClientExtraAllowedIpsEnvVar = "WGUI_DEFAULT_CLIENT_EXTRA_ALLOWED_IPS"
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue