From a80741e7483e08af399cf3419d1556a628ab67f2 Mon Sep 17 00:00:00 2001
From: itsvit-vlasov-y <71259997+itsvit-vlasov-y@users.noreply.github.com>
Date: Sat, 3 Dec 2022 00:40:29 +0200
Subject: [PATCH] Added checkbox FwMark in QRCode generation (#260)
---
handler/routes.go | 24 +++++++++++----
model/client.go | 7 +++++
store/jsondb/jsondb.go | 12 ++++++--
store/store.go | 2 +-
templates/clients.html | 68 +++++++++++++++++++++++++++++-------------
util/util.go | 2 +-
6 files changed, 85 insertions(+), 30 deletions(-)
diff --git a/handler/routes.go b/handler/routes.go
index 5b66f16..ea34b8a 100644
--- a/handler/routes.go
+++ b/handler/routes.go
@@ -138,7 +138,15 @@ func GetClient(db store.IStore) echo.HandlerFunc {
return func(c echo.Context) error {
clientID := c.Param("id")
- clientData, err := db.GetClientByID(clientID, true)
+ qrCodeIncludeFwMark := c.QueryParam("qrCodeIncludeFwMark")
+ qrCodeSettings := model.QRCodeSettings{
+ Enabled: true,
+ IncludeDNS: true,
+ IncludeFwMark: qrCodeIncludeFwMark == "true",
+ IncludeMTU: true,
+ }
+
+ clientData, err := db.GetClientByID(clientID, qrCodeSettings)
if err != nil {
return c.JSON(http.StatusNotFound, jsonHTTPResponse{false, "Client not found"})
}
@@ -257,7 +265,13 @@ func EmailClient(db store.IStore, mailer emailer.Emailer, emailSubject, emailCon
c.Bind(&payload)
// TODO validate email
- clientData, err := db.GetClientByID(payload.ID, true)
+ qrCodeSettings := model.QRCodeSettings{
+ Enabled: true,
+ IncludeDNS: true,
+ IncludeFwMark: true,
+ IncludeMTU: true,
+ }
+ clientData, err := db.GetClientByID(payload.ID, qrCodeSettings)
if err != nil {
log.Errorf("Cannot generate client id %s config file for downloading: %v", payload.ID, err)
return c.JSON(http.StatusNotFound, jsonHTTPResponse{false, "Client not found"})
@@ -304,7 +318,7 @@ func UpdateClient(db store.IStore) echo.HandlerFunc {
c.Bind(&_client)
// validate client existence
- clientData, err := db.GetClientByID(_client.ID, false)
+ clientData, err := db.GetClientByID(_client.ID, model.QRCodeSettings{Enabled: false})
if err != nil {
return c.JSON(http.StatusNotFound, jsonHTTPResponse{false, "Client not found"})
}
@@ -368,7 +382,7 @@ func SetClientStatus(db store.IStore) echo.HandlerFunc {
clientID := data["id"].(string)
status := data["status"].(bool)
- clientdata, err := db.GetClientByID(clientID, false)
+ clientdata, err := db.GetClientByID(clientID, model.QRCodeSettings{Enabled: false})
if err != nil {
return c.JSON(http.StatusNotFound, jsonHTTPResponse{false, err.Error()})
}
@@ -393,7 +407,7 @@ func DownloadClient(db store.IStore) echo.HandlerFunc {
return c.JSON(http.StatusNotFound, jsonHTTPResponse{false, "Missing clientid parameter"})
}
- clientData, err := db.GetClientByID(clientID, false)
+ clientData, err := db.GetClientByID(clientID, model.QRCodeSettings{Enabled: false})
if err != nil {
log.Errorf("Cannot generate client id %s config file for downloading: %v", clientID, err)
return c.JSON(http.StatusNotFound, jsonHTTPResponse{false, "Client not found"})
diff --git a/model/client.go b/model/client.go
index c1c7487..7a4cb41 100644
--- a/model/client.go
+++ b/model/client.go
@@ -26,3 +26,10 @@ type ClientData struct {
Client *Client
QRCode string
}
+
+type QRCodeSettings struct {
+ Enabled bool
+ IncludeDNS bool
+ IncludeFwMark bool
+ IncludeMTU bool
+}
diff --git a/store/jsondb/jsondb.go b/store/jsondb/jsondb.go
index 9227ad8..b0d39f5 100644
--- a/store/jsondb/jsondb.go
+++ b/store/jsondb/jsondb.go
@@ -194,7 +194,7 @@ func (o *JsonDB) GetClients(hasQRCode bool) ([]model.ClientData, error) {
return clients, nil
}
-func (o *JsonDB) GetClientByID(clientID string, hasQRCode bool) (model.ClientData, error) {
+func (o *JsonDB) GetClientByID(clientID string, qrCodeSettings model.QRCodeSettings) (model.ClientData, error) {
client := model.Client{}
clientData := model.ClientData{}
@@ -204,9 +204,17 @@ func (o *JsonDB) GetClientByID(clientID string, hasQRCode bool) (model.ClientDat
}
// generate client qrcode image in base64
- if hasQRCode && client.PrivateKey != "" {
+ if qrCodeSettings.Enabled && client.PrivateKey != "" {
server, _ := o.GetServer()
globalSettings, _ := o.GetGlobalSettings()
+ client := client
+ client.UseServerDNS = qrCodeSettings.IncludeDNS
+ if !qrCodeSettings.IncludeMTU {
+ globalSettings.MTU = 0
+ }
+ if !qrCodeSettings.IncludeFwMark {
+ globalSettings.ForwardMark = ""
+ }
png, err := qrcode.Encode(util.BuildClientConfig(client, server, globalSettings), qrcode.Medium, 256)
if err == nil {
diff --git a/store/store.go b/store/store.go
index 98795b2..2dca8a7 100644
--- a/store/store.go
+++ b/store/store.go
@@ -10,7 +10,7 @@ type IStore interface {
GetGlobalSettings() (model.GlobalSetting, error)
GetServer() (model.Server, error)
GetClients(hasQRCode bool) ([]model.ClientData, error)
- GetClientByID(clientID string, hasQRCode bool) (model.ClientData, error)
+ GetClientByID(clientID string, qrCode model.QRCodeSettings) (model.ClientData, error)
SaveClient(client model.Client) error
DeleteClient(clientID string) error
SaveServerInterface(serverInterface model.ServerInterface) error
diff --git a/templates/clients.html b/templates/clients.html
index f7f3a1a..db6ddad 100644
--- a/templates/clients.html
+++ b/templates/clients.html
@@ -68,7 +68,18 @@ Wireguard Clients
+