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 - QR code + @@ -376,6 +387,37 @@ Wireguard Clients }); }); + // regenerateQRCode function for regenerating QR Code adding/removing some parts of configuration because of compatibility issues with some clients + function regenerateQRCode() { + const client_id = $("#qr_client_id").val(); + const QRCodeImg = $("#qr_code"); + let include_fwmark = false; + if ($("#qr_include_fwmark").is(':checked')){ + include_fwmark = true; + } + QRCodeImg.hide(); + $.ajax({ + cache: false, + method: 'GET', + url: '{{.basePath}}/api/client/' + client_id, + data: { + qrCodeIncludeFwMark: include_fwmark + }, + dataType: 'json', + contentType: "application/json", + success: function (resp) { + const client = resp.Client; + + $(".modal-title").text("Scan QR Code for " + client.name + " profile"); + QRCodeImg.attr('src', resp.QRCode).show(); + }, + error: function (jqXHR, exception) { + const responseJson = jQuery.parseJSON(jqXHR.responseText); + toastr.error(responseJson['message']); + } + }); + } + // submitEmailClient function for sending an email to the client with the configuration function submitEmailClient() { const client_id = $("#e_client_id").val(); @@ -453,7 +495,7 @@ Wireguard Clients const formId = $(form).attr('id'); if (formId === "frm_edit_client") { submitEditClient(); - }else if (formId === "frm_email_client") { + } else if (formId === "frm_email_client") { submitEmailClient(); } } @@ -486,31 +528,14 @@ Wireguard Clients let modal = $(this); const button = $(event.relatedTarget); const client_id = button.data('clientid'); - const QRCodeImg = modal.find("#qr_code"); - QRCodeImg.hide(); - $.ajax({ - cache: false, - method: 'GET', - url: '{{.basePath}}/api/client/' + client_id, - dataType: 'json', - contentType: "application/json", - success: function (resp) { - const client = resp.Client; - modal.find(".modal-title").text("Scan QR Code for " + client.name + " profile"); - QRCodeImg.attr('src', resp.QRCode).show(); - }, - error: function (jqXHR, exception) { - const responseJson = jQuery.parseJSON(jqXHR.responseText); - toastr.error(responseJson['message']); - } - }); + modal.find("#qr_client_id").val(client_id); + regenerateQRCode(); }); $(document).ready(function () { $.validator.setDefaults({ submitHandler: function (form) { - //submitEditClient(); submitHandler(form); } }); @@ -563,6 +588,7 @@ Wireguard Clients $(element).removeClass('is-invalid'); } }); + // }); {{end}} diff --git a/util/util.go b/util/util.go index 6e9e144..56acc3b 100644 --- a/util/util.go +++ b/util/util.go @@ -61,7 +61,7 @@ func BuildClientConfig(client model.Client, server model.Server, setting model.G } forwardMark := "" - if setting.ForwardMark != "" && setting.ForwardMark != DefaultForwardMark { + if setting.ForwardMark != "" { forwardMark = fmt.Sprintf("FwMark = %s\n", setting.ForwardMark) }