diff --git a/handler/routes.go b/handler/routes.go
index aa5461b..fb46c9c 100644
--- a/handler/routes.go
+++ b/handler/routes.go
@@ -840,6 +840,22 @@ func GlobalSettings(db store.IStore) echo.HandlerFunc {
}
}
+// ClientDefaultSettings handler
+func ClientDefaultSettings(db store.IStore) echo.HandlerFunc {
+ return func(c echo.Context) error {
+
+ clientDefaultSettings, err := db.GetClientDefaultSettings()
+ if err != nil {
+ log.Error("Cannot get client default settings: ", err)
+ }
+
+ return c.Render(http.StatusOK, "client_default_settings.html", map[string]interface{}{
+ "baseData": model.BaseData{Active: "client-default-settings", CurrentUser: currentUser(c), Admin: isAdmin(c)},
+ "clientDefaultSettings": clientDefaultSettings,
+ })
+ }
+}
+
// Status handler
func Status(db store.IStore) echo.HandlerFunc {
type PeerVM struct {
@@ -964,6 +980,36 @@ func GlobalSettingSubmit(db store.IStore) echo.HandlerFunc {
}
}
+// ClientDefaultSettingsSubmit handler to update the client default settings
+func ClientDefaultSettingsSubmit(db store.IStore) echo.HandlerFunc {
+ return func(c echo.Context) error {
+
+ var clientDefaultSettings model.ClientDefaults
+ c.Bind(&clientDefaultSettings)
+
+ // validate the input allowed ips list
+ if util.ValidateCIDRList(clientDefaultSettings.AllowedIps, true) == false {
+ log.Warnf("Invalid Allowed IPs list input from user: %v", clientDefaultSettings.AllowedIps)
+ return c.JSON(http.StatusBadRequest, jsonHTTPResponse{false, "Allowed IPs must be in CIDR format"})
+ }
+
+ // validate the input extra allowed ips list
+ if util.ValidateCIDRList(clientDefaultSettings.ExtraAllowedIps, true) == false {
+ log.Warnf("Invalid Extra Allowed IPs list input from user: %v", clientDefaultSettings.ExtraAllowedIps)
+ return c.JSON(http.StatusBadRequest, jsonHTTPResponse{false, "Extra Allowed IPs must be in CIDR format"})
+ }
+
+ // write config to the database
+ if err := db.SaveClientDefaultSettings(clientDefaultSettings); err != nil {
+ return c.JSON(http.StatusInternalServerError, jsonHTTPResponse{false, "Error saving client default settings"})
+ }
+
+ log.Infof("Updated client default settings: %v", clientDefaultSettings)
+
+ return c.JSON(http.StatusOK, jsonHTTPResponse{true, "Updated client default settings successfully"})
+ }
+}
+
// MachineIPAddresses handler to get local interface ip addresses
func MachineIPAddresses() echo.HandlerFunc {
return func(c echo.Context) error {
diff --git a/main.go b/main.go
index fd4bc90..cef1133 100644
--- a/main.go
+++ b/main.go
@@ -214,6 +214,9 @@ func main() {
app.POST(util.BasePath+"/wg-server/keypair", handler.WireGuardServerKeyPair(db), handler.ValidSession, handler.ContentTypeJson, handler.NeedsAdmin)
app.GET(util.BasePath+"/global-settings", handler.GlobalSettings(db), handler.ValidSession, handler.NeedsAdmin)
app.POST(util.BasePath+"/global-settings", handler.GlobalSettingSubmit(db), handler.ValidSession, handler.ContentTypeJson, handler.NeedsAdmin)
+ app.POST(util.BasePath+"/client-default-settings", handler.ClientDefaultSettingsSubmit(db), handler.ValidSession, handler.ContentTypeJson, handler.NeedsAdmin)
+ app.GET(util.BasePath+"/client-default-settings", handler.ClientDefaultSettings(db), handler.ValidSession, handler.NeedsAdmin)
+
app.GET(util.BasePath+"/status", handler.Status(db), handler.ValidSession)
app.GET(util.BasePath+"/api/clients", handler.GetClients(db), handler.ValidSession)
app.GET(util.BasePath+"/api/client/:id", handler.GetClient(db), handler.ValidSession)
diff --git a/model/client_defaults.go b/model/client_defaults.go
index 615ebed..b8cfb72 100644
--- a/model/client_defaults.go
+++ b/model/client_defaults.go
@@ -2,8 +2,8 @@ package model
// ClientDefaults Defaults for creation of new clients used in the templates
type ClientDefaults struct {
- AllowedIps []string
- ExtraAllowedIps []string
- UseServerDNS bool
- EnableAfterCreation bool
+ AllowedIps []string `json:"allowed_ips"`
+ ExtraAllowedIps []string `json:"extra_allowed_ips"`
+ UseServerDNS bool `json:"use_server_dns"`
+ EnableAfterCreation bool `json:"enable_after_creation"`
}
diff --git a/router/router.go b/router/router.go
index 569ebaf..c1e293a 100644
--- a/router/router.go
+++ b/router/router.go
@@ -36,7 +36,7 @@ func (t *TemplateRegistry) Render(w io.Writer, name string, data interface{}, c
data.(map[string]interface{})[k] = v
}
- data.(map[string]interface{})["client_defaults"] = util.ClientDefaultsFromEnv()
+ data.(map[string]interface{})["client_defaults"] = util.ClientDefaultsFromDatabase()
}
// login page does not need the base layout
@@ -83,6 +83,11 @@ func New(tmplDir fs.FS, extraData map[string]interface{}, secret []byte) *echo.E
log.Fatal(err)
}
+ tmplClientDefaultSettingsString, err := util.StringFromEmbedFile("client_default_settings.html")
+ if err != nil {
+ log.Fatal(err)
+ }
+
tmplUsersSettingsString, err := util.StringFromEmbedFile(tmplDir, "users_settings.html")
if err != nil {
log.Fatal(err)
@@ -113,6 +118,7 @@ func New(tmplDir fs.FS, extraData map[string]interface{}, secret []byte) *echo.E
templates["clients.html"] = template.Must(template.New("clients").Funcs(funcs).Parse(tmplBaseString + tmplClientsString))
templates["server.html"] = template.Must(template.New("server").Funcs(funcs).Parse(tmplBaseString + tmplServerString))
templates["global_settings.html"] = template.Must(template.New("global_settings").Funcs(funcs).Parse(tmplBaseString + tmplGlobalSettingsString))
+ templates["client_default_settings.html"] = template.Must(template.New("client_default_settings").Funcs(funcs).Parse(tmplBaseString + tmplClientDefaultSettingsString))
templates["users_settings.html"] = template.Must(template.New("users_settings").Funcs(funcs).Parse(tmplBaseString + tmplUsersSettingsString))
templates["status.html"] = template.Must(template.New("status").Funcs(funcs).Parse(tmplBaseString + tmplStatusString))
templates["wake_on_lan_hosts.html"] = template.Must(template.New("wake_on_lan_hosts").Funcs(funcs).Parse(tmplBaseString + tmplWakeOnLanHostsString))
diff --git a/store/jsondb/jsondb.go b/store/jsondb/jsondb.go
index 757ccdc..831a1dc 100644
--- a/store/jsondb/jsondb.go
+++ b/store/jsondb/jsondb.go
@@ -43,6 +43,7 @@ func (o *JsonDB) Init() error {
var serverInterfacePath string = path.Join(serverPath, "interfaces.json")
var serverKeyPairPath string = path.Join(serverPath, "keypair.json")
var globalSettingPath string = path.Join(serverPath, "global_settings.json")
+ var clientDefaultSettingsPath string = path.Join(serverPath, "client_default_settings.json")
var hashesPath string = path.Join(serverPath, "hashes.json")
// create directories if they do not exist
@@ -132,6 +133,12 @@ func (o *JsonDB) Init() error {
}
}
+ // client default settings
+ if _, err := os.Stat(clientDefaultSettingsPath); os.IsNotExist(err) {
+ clientDefaultSetting := util.ClientDefaultsFromEnv()
+ o.conn.Write("server", "client_default_settings", clientDefaultSetting)
+ }
+
// user info
results, err := o.conn.ReadAll("users")
if err != nil || len(results) < 1 {
@@ -216,6 +223,12 @@ func (o *JsonDB) GetGlobalSettings() (model.GlobalSetting, error) {
return settings, o.conn.Read("server", "global_settings", &settings)
}
+// GetClientDefaultSettings func to query client default settings from the database
+func (o *JsonDB) GetClientDefaultSettings() (model.ClientDefaults, error) {
+ settings := model.ClientDefaults{}
+ return settings, o.conn.Read("server", "client_default_settings", &settings)
+}
+
// GetServer func to query Server settings from the database
func (o *JsonDB) GetServer() (model.Server, error) {
server := model.Server{}
@@ -355,6 +368,11 @@ func (o *JsonDB) SaveGlobalSettings(globalSettings model.GlobalSetting) error {
return output
}
+
+func (o *JsonDB) SaveClientDefaultSettings(clientDefaults model.ClientDefaults) error {
+ return o.conn.Write("server", "client_default_settings", clientDefaults)
+}
+
func (o *JsonDB) GetPath() string {
return o.dbPath
}
diff --git a/store/store.go b/store/store.go
index ef6d723..99eaeec 100644
--- a/store/store.go
+++ b/store/store.go
@@ -11,6 +11,7 @@ type IStore interface {
SaveUser(user model.User) error
DeleteUser(username string) error
GetGlobalSettings() (model.GlobalSetting, error)
+ GetClientDefaultSettings() (model.ClientDefaults, error)
GetServer() (model.Server, error)
GetClients(hasQRCode bool) ([]model.ClientData, error)
GetClientByID(clientID string, qrCode model.QRCodeSettings) (model.ClientData, error)
@@ -19,6 +20,7 @@ type IStore interface {
SaveServerInterface(serverInterface model.ServerInterface) error
SaveServerKeyPair(serverKeyPair model.ServerKeypair) error
SaveGlobalSettings(globalSettings model.GlobalSetting) error
+ SaveClientDefaultSettings(clientDefaults model.ClientDefaults) error
GetWakeOnLanHosts() ([]model.WakeOnLanHost, error)
GetWakeOnLanHost(macAddress string) (*model.WakeOnLanHost, error)
DeleteWakeOnHostLanHost(macAddress string) error
diff --git a/templates/base.html b/templates/base.html
index c2fa367..9094037 100644
--- a/templates/base.html
+++ b/templates/base.html
@@ -146,6 +146,14 @@
{{if not .loginDisabled}}
+
+
+
+
+ Client Default Settings
+
+
+
@@ -564,7 +572,7 @@
$("#client_public_key").val("");
$("#client_preshared_key").val("");
$("#client_allocated_ips").importTags('');
- $("#client_extra_allowed_ips").importTags('');
+ //$("#client_extra_allowed_ips").importTags('');
updateIPAllocationSuggestion();
});
});
diff --git a/templates/client_default_settings.html b/templates/client_default_settings.html
new file mode 100644
index 0000000..f9c5f66
--- /dev/null
+++ b/templates/client_default_settings.html
@@ -0,0 +1,161 @@
+{{define "title"}}
+Client Defaults Settings
+{{end}}
+
+{{define "top_css"}}
+{{end}}
+
+{{define "username"}}
+{{ .username }}
+{{end}}
+
+{{define "page_title"}}
+Client Defaults Settings
+{{end}}
+
+{{define "page_content"}}
+
+
+
+
+
+
+
+
+
+
+
+
+ - 1. Allowed IPs
+ - Specify a list of addresses that will get routed to the
server
. These addresses will be included in 'AllowedIPs' of client config.
+ - 2. Extra Allowed IPs
+ - Specify a list of addresses that will get routed to the
client
. These addresses will be included in 'AllowedIPs' of WG server config
+ - 3. Use server DNS
+ - Specify if clients use server DNS by default.
+ - 4. Enable after creation
+ - Specify if clients become enabled after creation.
+
+
+
+
+
+
+
+
+
+
+{{end}}
+
+{{define "bottom_js"}}
+
+
+{{end}}
diff --git a/util/util.go b/util/util.go
index f455fc8..34fa5b4 100644
--- a/util/util.go
+++ b/util/util.go
@@ -95,6 +95,24 @@ func ClientDefaultsFromEnv() model.ClientDefaults {
return clientDefaults
}
+// ClientDefaultsFromDatabase to read the default values for creating a new client from the database
+func ClientDefaultsFromDatabase() model.ClientDefaults {
+ // initialize database directory
+ dir := "./db"
+ db, err := scribble.New(dir, nil)
+ if err != nil {
+ panic(err)
+ }
+
+ // read client default settings
+ clientDefaults := model.ClientDefaults{}
+ if err := db.Read("server", "client_default_settings", &clientDefaults); err != nil {
+ panic(err)
+ }
+
+ return clientDefaults
+}
+
// ValidateCIDR to validate a network CIDR
func ValidateCIDR(cidr string) bool {
_, _, err := net.ParseCIDR(cidr)