mirror of
https://github.com/h44z/wg-portal.git
synced 2025-06-28 09:17:00 +00:00
generate interface and peer configuration filenames in backend only (#395)
This commit is contained in:
parent
a60feb7fc9
commit
6681dfa96f
@ -82,6 +82,14 @@ definitions:
|
|||||||
description: EnabledPeers is the number of enabled peers for this interface. Only enabled peers are able to connect.
|
description: EnabledPeers is the number of enabled peers for this interface. Only enabled peers are able to connect.
|
||||||
readOnly: true
|
readOnly: true
|
||||||
type: integer
|
type: integer
|
||||||
|
Filename:
|
||||||
|
description: |-
|
||||||
|
Filename is the name of the config file for this interface.
|
||||||
|
This value is read only and is not settable by the user.
|
||||||
|
example: wg0.conf
|
||||||
|
maxLength: 21
|
||||||
|
readOnly: true
|
||||||
|
type: string
|
||||||
FirewallMark:
|
FirewallMark:
|
||||||
description: FirewallMark is an optional firewall mark which is used to handle interface traffic.
|
description: FirewallMark is an optional firewall mark which is used to handle interface traffic.
|
||||||
type: integer
|
type: integer
|
||||||
@ -277,6 +285,14 @@ definitions:
|
|||||||
items:
|
items:
|
||||||
type: string
|
type: string
|
||||||
type: array
|
type: array
|
||||||
|
Filename:
|
||||||
|
description: |-
|
||||||
|
Filename is the name of the config file for this peer.
|
||||||
|
This value is read only and is not settable by the user.
|
||||||
|
example: wg_peer_x.conf
|
||||||
|
maxLength: 21
|
||||||
|
readOnly: true
|
||||||
|
type: string
|
||||||
FirewallMark:
|
FirewallMark:
|
||||||
allOf:
|
allOf:
|
||||||
- $ref: '#/definitions/models.ConfigOption-uint32'
|
- $ref: '#/definitions/models.ConfigOption-uint32'
|
||||||
|
@ -89,19 +89,11 @@ watch(() => props.visible, async (newValue, oldValue) => {
|
|||||||
|
|
||||||
function download() {
|
function download() {
|
||||||
// credit: https://www.bitdegree.org/learn/javascript-download
|
// credit: https://www.bitdegree.org/learn/javascript-download
|
||||||
let filename = 'WireGuard-Tunnel.conf'
|
|
||||||
if (selectedPeer.value.DisplayName) {
|
|
||||||
filename = selectedPeer.value.DisplayName
|
|
||||||
.replace(/ /g, "_")
|
|
||||||
.replace(/[^a-zA-Z0-9-_]/g, "")
|
|
||||||
.substring(0, 16)
|
|
||||||
+ ".conf"
|
|
||||||
}
|
|
||||||
let text = configString.value
|
let text = configString.value
|
||||||
|
|
||||||
let element = document.createElement('a')
|
let element = document.createElement('a')
|
||||||
element.setAttribute('href', 'data:application/octet-stream;charset=utf-8,' + encodeURIComponent(text))
|
element.setAttribute('href', 'data:application/octet-stream;charset=utf-8,' + encodeURIComponent(text))
|
||||||
element.setAttribute('download', filename)
|
element.setAttribute('download', selectedPeer.value.Filename)
|
||||||
|
|
||||||
element.style.display = 'none'
|
element.style.display = 'none'
|
||||||
document.body.appendChild(element)
|
document.body.appendChild(element)
|
||||||
|
@ -42,7 +42,8 @@ export function freshInterface() {
|
|||||||
PeerDefPostDown: "",
|
PeerDefPostDown: "",
|
||||||
|
|
||||||
TotalPeers: 0,
|
TotalPeers: 0,
|
||||||
EnabledPeers: 0
|
EnabledPeers: 0,
|
||||||
|
Filename: ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -120,6 +121,8 @@ export function freshPeer() {
|
|||||||
Overridable: true,
|
Overridable: true,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
Filename: "",
|
||||||
|
|
||||||
// Internal values
|
// Internal values
|
||||||
IgnoreGlobalSettings: false,
|
IgnoreGlobalSettings: false,
|
||||||
IsSelected: false
|
IsSelected: false
|
||||||
|
@ -49,12 +49,11 @@ async function download() {
|
|||||||
await interfaces.LoadInterfaceConfig(interfaces.GetSelected.Identifier)
|
await interfaces.LoadInterfaceConfig(interfaces.GetSelected.Identifier)
|
||||||
|
|
||||||
// credit: https://www.bitdegree.org/learn/javascript-download
|
// credit: https://www.bitdegree.org/learn/javascript-download
|
||||||
let filename = interfaces.GetSelected.Identifier + ".conf"
|
|
||||||
let text = interfaces.configuration
|
let text = interfaces.configuration
|
||||||
|
|
||||||
let element = document.createElement('a')
|
let element = document.createElement('a')
|
||||||
element.setAttribute('href', 'data:application/octet-stream;charset=utf-8,' + encodeURIComponent(text))
|
element.setAttribute('href', 'data:application/octet-stream;charset=utf-8,' + encodeURIComponent(text))
|
||||||
element.setAttribute('download', filename)
|
element.setAttribute('download', interfaces.GetSelected.Filename)
|
||||||
|
|
||||||
element.style.display = 'none'
|
element.style.display = 'none'
|
||||||
document.body.appendChild(element)
|
document.body.appendChild(element)
|
||||||
|
@ -1646,6 +1646,10 @@
|
|||||||
"EnabledPeers": {
|
"EnabledPeers": {
|
||||||
"type": "integer"
|
"type": "integer"
|
||||||
},
|
},
|
||||||
|
"Filename": {
|
||||||
|
"description": "the filename of the config file, for example: wg0.conf",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
"FirewallMark": {
|
"FirewallMark": {
|
||||||
"description": "a firewall mark",
|
"description": "a firewall mark",
|
||||||
"type": "integer"
|
"type": "integer"
|
||||||
@ -1887,6 +1891,10 @@
|
|||||||
"type": "string"
|
"type": "string"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"Filename": {
|
||||||
|
"description": "the filename of the config file, for example: wg_peer_x.conf",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
"FirewallMark": {
|
"FirewallMark": {
|
||||||
"description": "a firewall mark",
|
"description": "a firewall mark",
|
||||||
"allOf": [
|
"allOf": [
|
||||||
|
@ -88,6 +88,9 @@ definitions:
|
|||||||
type: array
|
type: array
|
||||||
EnabledPeers:
|
EnabledPeers:
|
||||||
type: integer
|
type: integer
|
||||||
|
Filename:
|
||||||
|
description: 'the filename of the config file, for example: wg0.conf'
|
||||||
|
type: string
|
||||||
FirewallMark:
|
FirewallMark:
|
||||||
description: a firewall mark
|
description: a firewall mark
|
||||||
type: integer
|
type: integer
|
||||||
@ -256,6 +259,9 @@ definitions:
|
|||||||
items:
|
items:
|
||||||
type: string
|
type: string
|
||||||
type: array
|
type: array
|
||||||
|
Filename:
|
||||||
|
description: 'the filename of the config file, for example: wg_peer_x.conf'
|
||||||
|
type: string
|
||||||
FirewallMark:
|
FirewallMark:
|
||||||
allOf:
|
allOf:
|
||||||
- $ref: '#/definitions/model.ConfigOption-uint32'
|
- $ref: '#/definitions/model.ConfigOption-uint32'
|
||||||
|
@ -1531,6 +1531,13 @@
|
|||||||
"type": "integer",
|
"type": "integer",
|
||||||
"readOnly": true
|
"readOnly": true
|
||||||
},
|
},
|
||||||
|
"Filename": {
|
||||||
|
"description": "Filename is the name of the config file for this interface.\nThis value is read only and is not settable by the user.",
|
||||||
|
"type": "string",
|
||||||
|
"maxLength": 21,
|
||||||
|
"readOnly": true,
|
||||||
|
"example": "wg0.conf"
|
||||||
|
},
|
||||||
"FirewallMark": {
|
"FirewallMark": {
|
||||||
"description": "FirewallMark is an optional firewall mark which is used to handle interface traffic.",
|
"description": "FirewallMark is an optional firewall mark which is used to handle interface traffic.",
|
||||||
"type": "integer"
|
"type": "integer"
|
||||||
@ -1799,6 +1806,13 @@
|
|||||||
"type": "string"
|
"type": "string"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"Filename": {
|
||||||
|
"description": "Filename is the name of the config file for this peer.\nThis value is read only and is not settable by the user.",
|
||||||
|
"type": "string",
|
||||||
|
"maxLength": 21,
|
||||||
|
"readOnly": true,
|
||||||
|
"example": "wg_peer_x.conf"
|
||||||
|
},
|
||||||
"FirewallMark": {
|
"FirewallMark": {
|
||||||
"description": "FirewallMark is an optional firewall mark which is used to handle peer traffic.",
|
"description": "FirewallMark is an optional firewall mark which is used to handle peer traffic.",
|
||||||
"allOf": [
|
"allOf": [
|
||||||
|
@ -87,6 +87,14 @@ definitions:
|
|||||||
Only enabled peers are able to connect.
|
Only enabled peers are able to connect.
|
||||||
readOnly: true
|
readOnly: true
|
||||||
type: integer
|
type: integer
|
||||||
|
Filename:
|
||||||
|
description: |-
|
||||||
|
Filename is the name of the config file for this interface.
|
||||||
|
This value is read only and is not settable by the user.
|
||||||
|
example: wg0.conf
|
||||||
|
maxLength: 21
|
||||||
|
readOnly: true
|
||||||
|
type: string
|
||||||
FirewallMark:
|
FirewallMark:
|
||||||
description: FirewallMark is an optional firewall mark which is used to handle
|
description: FirewallMark is an optional firewall mark which is used to handle
|
||||||
interface traffic.
|
interface traffic.
|
||||||
@ -310,6 +318,14 @@ definitions:
|
|||||||
items:
|
items:
|
||||||
type: string
|
type: string
|
||||||
type: array
|
type: array
|
||||||
|
Filename:
|
||||||
|
description: |-
|
||||||
|
Filename is the name of the config file for this peer.
|
||||||
|
This value is read only and is not settable by the user.
|
||||||
|
example: wg_peer_x.conf
|
||||||
|
maxLength: 21
|
||||||
|
readOnly: true
|
||||||
|
type: string
|
||||||
FirewallMark:
|
FirewallMark:
|
||||||
allOf:
|
allOf:
|
||||||
- $ref: '#/definitions/models.ConfigOption-uint32'
|
- $ref: '#/definitions/models.ConfigOption-uint32'
|
||||||
|
@ -47,8 +47,9 @@ type Interface struct {
|
|||||||
|
|
||||||
// Calculated values
|
// Calculated values
|
||||||
|
|
||||||
EnabledPeers int `json:"EnabledPeers"`
|
EnabledPeers int `json:"EnabledPeers"`
|
||||||
TotalPeers int `json:"TotalPeers"`
|
TotalPeers int `json:"TotalPeers"`
|
||||||
|
Filename string `json:"Filename"` // the filename of the config file, for example: wg0.conf
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewInterface(src *domain.Interface, peers []domain.Peer) *Interface {
|
func NewInterface(src *domain.Interface, peers []domain.Peer) *Interface {
|
||||||
@ -88,6 +89,7 @@ func NewInterface(src *domain.Interface, peers []domain.Peer) *Interface {
|
|||||||
|
|
||||||
EnabledPeers: 0,
|
EnabledPeers: 0,
|
||||||
TotalPeers: 0,
|
TotalPeers: 0,
|
||||||
|
Filename: src.GetConfigFileName(),
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(peers) > 0 {
|
if len(peers) > 0 {
|
||||||
|
@ -73,6 +73,10 @@ type Peer struct {
|
|||||||
PostUp ConfigOption[string] `json:"PostUp"` // action that is executed after the device is up
|
PostUp ConfigOption[string] `json:"PostUp"` // action that is executed after the device is up
|
||||||
PreDown ConfigOption[string] `json:"PreDown"` // action that is executed before the device is down
|
PreDown ConfigOption[string] `json:"PreDown"` // action that is executed before the device is down
|
||||||
PostDown ConfigOption[string] `json:"PostDown"` // action that is executed after the device is down
|
PostDown ConfigOption[string] `json:"PostDown"` // action that is executed after the device is down
|
||||||
|
|
||||||
|
// Calculated values
|
||||||
|
|
||||||
|
Filename string `json:"Filename"` // the filename of the config file, for example: wg_peer_x.conf
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewPeer(src *domain.Peer) *Peer {
|
func NewPeer(src *domain.Peer) *Peer {
|
||||||
@ -105,6 +109,7 @@ func NewPeer(src *domain.Peer) *Peer {
|
|||||||
PostUp: ConfigOptionFromDomain(src.Interface.PostUp),
|
PostUp: ConfigOptionFromDomain(src.Interface.PostUp),
|
||||||
PreDown: ConfigOptionFromDomain(src.Interface.PreDown),
|
PreDown: ConfigOptionFromDomain(src.Interface.PreDown),
|
||||||
PostDown: ConfigOptionFromDomain(src.Interface.PostDown),
|
PostDown: ConfigOptionFromDomain(src.Interface.PostDown),
|
||||||
|
Filename: src.GetConfigFileName(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -84,6 +84,9 @@ type Interface struct {
|
|||||||
EnabledPeers int `json:"EnabledPeers" readonly:"true"`
|
EnabledPeers int `json:"EnabledPeers" readonly:"true"`
|
||||||
// TotalPeers is the total number of peers for this interface.
|
// TotalPeers is the total number of peers for this interface.
|
||||||
TotalPeers int `json:"TotalPeers" readonly:"true"`
|
TotalPeers int `json:"TotalPeers" readonly:"true"`
|
||||||
|
// Filename is the name of the config file for this interface.
|
||||||
|
// This value is read only and is not settable by the user.
|
||||||
|
Filename string `json:"Filename" example:"wg0.conf" binding:"omitempty,max=21" readonly:"true"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewInterface(src *domain.Interface, peers []domain.Peer) *Interface {
|
func NewInterface(src *domain.Interface, peers []domain.Peer) *Interface {
|
||||||
@ -123,6 +126,7 @@ func NewInterface(src *domain.Interface, peers []domain.Peer) *Interface {
|
|||||||
|
|
||||||
EnabledPeers: 0,
|
EnabledPeers: 0,
|
||||||
TotalPeers: 0,
|
TotalPeers: 0,
|
||||||
|
Filename: src.GetConfigFileName(),
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(peers) > 0 {
|
if len(peers) > 0 {
|
||||||
|
@ -72,6 +72,10 @@ type Peer struct {
|
|||||||
PreDown ConfigOption[string] `json:"PreDown"`
|
PreDown ConfigOption[string] `json:"PreDown"`
|
||||||
// PostDown is an optional action that is executed after the device is down.
|
// PostDown is an optional action that is executed after the device is down.
|
||||||
PostDown ConfigOption[string] `json:"PostDown"`
|
PostDown ConfigOption[string] `json:"PostDown"`
|
||||||
|
|
||||||
|
// Filename is the name of the config file for this peer.
|
||||||
|
// This value is read only and is not settable by the user.
|
||||||
|
Filename string `json:"Filename" example:"wg_peer_x.conf" binding:"omitempty,max=21" readonly:"true"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewPeer(src *domain.Peer) *Peer {
|
func NewPeer(src *domain.Peer) *Peer {
|
||||||
@ -109,6 +113,7 @@ func NewPeer(src *domain.Peer) *Peer {
|
|||||||
PostUp: ConfigOptionFromDomain(src.Interface.PostUp),
|
PostUp: ConfigOptionFromDomain(src.Interface.PostUp),
|
||||||
PreDown: ConfigOptionFromDomain(src.Interface.PreDown),
|
PreDown: ConfigOptionFromDomain(src.Interface.PreDown),
|
||||||
PostDown: ConfigOptionFromDomain(src.Interface.PostDown),
|
PostDown: ConfigOptionFromDomain(src.Interface.PostDown),
|
||||||
|
Filename: src.GetConfigFileName(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -121,8 +121,8 @@ func (i *Interface) CopyCalculatedAttributes(src *Interface) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (i *Interface) GetConfigFileName() string {
|
func (i *Interface) GetConfigFileName() string {
|
||||||
filename := internal.TruncateString(string(i.Identifier), 8)
|
filename := allowedFileNameRegex.ReplaceAllString(string(i.Identifier), "")
|
||||||
filename = allowedFileNameRegex.ReplaceAllString(filename, "")
|
filename = internal.TruncateString(filename, 16)
|
||||||
filename += ".conf"
|
filename += ".conf"
|
||||||
|
|
||||||
return filename
|
return filename
|
||||||
|
@ -3,7 +3,6 @@ package domain
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"net"
|
"net"
|
||||||
"regexp"
|
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@ -87,17 +86,19 @@ func (p *Peer) CopyCalculatedAttributes(src *Peer) {
|
|||||||
|
|
||||||
func (p *Peer) GetConfigFileName() string {
|
func (p *Peer) GetConfigFileName() string {
|
||||||
filename := ""
|
filename := ""
|
||||||
reg := regexp.MustCompile("[^a-zA-Z0-9-_]+")
|
|
||||||
|
|
||||||
if p.DisplayName != "" {
|
if p.DisplayName != "" {
|
||||||
filename = p.DisplayName
|
filename = p.DisplayName
|
||||||
filename = strings.ReplaceAll(filename, " ", "_")
|
filename = strings.ReplaceAll(filename, " ", "_")
|
||||||
filename = reg.ReplaceAllString(filename, "")
|
// Eliminate the automatically detected peer part,
|
||||||
|
// as it makes the filename indistinguishable among multiple auto-detected peers.
|
||||||
|
filename = strings.ReplaceAll(filename, "Autodetected_", "")
|
||||||
|
filename = allowedFileNameRegex.ReplaceAllString(filename, "")
|
||||||
filename = internal.TruncateString(filename, 16)
|
filename = internal.TruncateString(filename, 16)
|
||||||
filename += ".conf"
|
filename += ".conf"
|
||||||
} else {
|
} else {
|
||||||
filename = fmt.Sprintf("wg_%s", internal.TruncateString(string(p.Identifier), 8))
|
filename = fmt.Sprintf("wg_%s", internal.TruncateString(string(p.Identifier), 8))
|
||||||
filename = reg.ReplaceAllString(filename, "")
|
filename = allowedFileNameRegex.ReplaceAllString(filename, "")
|
||||||
filename += ".conf"
|
filename += ".conf"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user