diff --git a/src/db/sitestore/site_store.go b/src/db/sitestore/site_store.go index a5084a7..2654146 100644 --- a/src/db/sitestore/site_store.go +++ b/src/db/sitestore/site_store.go @@ -63,6 +63,7 @@ func (st *SiteStore) getCfg() (*db.SiteConfig, error) { if err = db.CheckSiteCfg(cfg, true); err != nil { return nil, err } + return cfg, nil } diff --git a/src/handlers/multiusers/handlers.go b/src/handlers/multiusers/handlers.go index 3b4c6cf..0c9059c 100644 --- a/src/handlers/multiusers/handlers.go +++ b/src/handlers/multiusers/handlers.go @@ -654,6 +654,11 @@ func (h *MultiUsersSvc) Self(c *gin.Context) { return } + allowSetBg := h.cfg.BoolOr("Site.ClientCfg.AllowSetBg", false) + if !allowSetBg { + user.Preferences.Bg = db.DefaultBgConfig + } + c.JSON(200, &SelfResp{ ID: claims[q.UserIDParam], Name: claims[q.UserParam], @@ -708,7 +713,11 @@ func (h *MultiUsersSvc) SetPreferences(c *gin.Context) { return } - // TODO: validate + allowSetBg := h.cfg.BoolOr("Site.ClientCfg.AllowSetBg", false) + if !allowSetBg { + req.Preferences.Bg = db.DefaultBgConfig + } + err = h.deps.Users().SetPreferences(uid, req.Preferences) if err != nil { c.JSON(q.ErrResp(c, 500, err)) diff --git a/src/handlers/settings/handlers.go b/src/handlers/settings/handlers.go index 1885025..02c4669 100644 --- a/src/handlers/settings/handlers.go +++ b/src/handlers/settings/handlers.go @@ -29,10 +29,8 @@ func (h *SettingsSvc) Health(c *gin.Context) { } type ClientCfgMsg struct { - SiteName string `json:"siteName"` - SiteDesc string `json:"siteDesc"` - Bg *db.BgConfig `json:"bg"` - CaptchaEnabled bool `json:"captchaEnabled"` + ClientCfg *db.ClientConfig `json:"cfg"` + CaptchaEnabled bool `json:"captchaEnabled"` } func (h *SettingsSvc) GetClientCfg(c *gin.Context) { @@ -44,9 +42,7 @@ func (h *SettingsSvc) GetClientCfg(c *gin.Context) { } c.JSON(200, &ClientCfgMsg{ - SiteName: siteCfg.ClientCfg.SiteName, - SiteDesc: siteCfg.ClientCfg.SiteDesc, - Bg: siteCfg.ClientCfg.Bg, + ClientCfg: siteCfg.ClientCfg, CaptchaEnabled: h.cfg.BoolOr("Users.CaptchaEnabled", true), }) } @@ -59,17 +55,25 @@ func (h *SettingsSvc) SetClientCfg(c *gin.Context) { return } - clientCfg := &db.ClientConfig{ - SiteName: req.SiteName, - SiteDesc: req.SiteDesc, - Bg: req.Bg, - // TODO: captchaEnabled is not persisted in db - } + // TODO: captchaEnabled is not persisted in db + clientCfg := req.ClientCfg if err = validateClientCfg(clientCfg); err != nil { c.JSON(q.ErrResp(c, 400, err)) return } + // update config + // TODO: refine the model + h.cfg.SetString("Site.ClientCfg.SiteName", req.ClientCfg.SiteName) + h.cfg.SetString("Site.ClientCfg.SiteDesc", req.ClientCfg.SiteDesc) + h.cfg.SetString("Site.ClientCfg.Bg.Url", req.ClientCfg.Bg.Url) + h.cfg.SetString("Site.ClientCfg.Bg.Repeat", req.ClientCfg.Bg.Repeat) + h.cfg.SetString("Site.ClientCfg.Bg.Position", req.ClientCfg.Bg.Position) + h.cfg.SetString("Site.ClientCfg.Bg.Align", req.ClientCfg.Bg.Align) + h.cfg.SetString("Site.ClientCfg.Bg.BgColor", req.ClientCfg.Bg.BgColor) + h.cfg.SetBool("Site.ClientCfg.AllowSetBg", req.ClientCfg.AllowSetBg) + h.cfg.SetBool("Site.ClientCfg.AutoTheme", req.ClientCfg.AutoTheme) + err = h.deps.SiteStore().SetClientCfg(clientCfg) if err != nil { c.JSON(q.ErrResp(c, 500, err)) diff --git a/src/server/config.go b/src/server/config.go index bbf8275..1db094c 100644 --- a/src/server/config.go +++ b/src/server/config.go @@ -129,6 +129,8 @@ func DefaultConfigStruct() *Config { Align: "fixed", BgColor: "#ccc", }, + AllowSetBg: false, + AutoTheme: true, }, }, Db: &DbConfig{ diff --git a/src/server/server_permission_test.go b/src/server/server_permission_test.go index 747aac3..1fb1b1d 100644 --- a/src/server/server_permission_test.go +++ b/src/server/server_permission_test.go @@ -751,7 +751,7 @@ func TestPermissions(t *testing.T) { assertResp(t, resp, errs, expectedCodes["GetClientCfg"], fmt.Sprintf("%s-%s", desc, "GetClientCfg")) clientCfg := gccResp - clientCfg.SiteName = "new site name" + clientCfg.ClientCfg.SiteName = "new site name" resp, _, errs = settingsCl.SetClientCfg(clientCfg, token) assertResp(t, resp, errs, expectedCodes["SetClientCfg"], fmt.Sprintf("%s-%s", desc, "SetClientCfg")) diff --git a/src/server/server_settings_test.go b/src/server/server_settings_test.go index ac0ee24..590b84a 100644 --- a/src/server/server_settings_test.go +++ b/src/server/server_settings_test.go @@ -90,9 +90,8 @@ func TestSettingsHandlers(t *testing.T) { for _, cfg := range cfgs { clientCfgMsg := &settings.ClientCfgMsg{ - SiteName: cfg.SiteName, - SiteDesc: cfg.SiteDesc, - Bg: cfg.Bg, + ClientCfg: cfg, + CaptchaEnabled: false, } resp, _, errs := settingsCl.SetClientCfg(clientCfgMsg, adminToken) if len(errs) > 0 { @@ -108,13 +107,7 @@ func TestSettingsHandlers(t *testing.T) { t.Fatal(resp.StatusCode) } - cfgEqual := func(cfg1, cfg2 *settings.ClientCfgMsg) bool { - return cfg1.SiteName == cfg2.SiteName && - cfg1.SiteDesc == cfg2.SiteDesc && - reflect.DeepEqual(cfg1.Bg, cfg2.Bg) - } - - if !cfgEqual(clientCfgMsg, clientCfgMsgGot) { + if !reflect.DeepEqual(clientCfgMsg, clientCfgMsgGot) { t.Fatalf("client cfgs are not equal: got(%v) expected(%v)", clientCfgMsg, clientCfgMsgGot) } @@ -134,7 +127,7 @@ func TestSettingsHandlers(t *testing.T) { t.Fatal(resp.StatusCode) } - if !cfgEqual(clientCfgMsg, clientCfgMsgGot) { + if !reflect.DeepEqual(clientCfgMsg, clientCfgMsgGot) { t.Fatalf("client cfgs are not equal: got(%v) expected(%v)", clientCfgMsg, clientCfgMsgGot) } } diff --git a/src/server/server_users_test.go b/src/server/server_users_test.go index 638fafd..ab9ae1a 100644 --- a/src/server/server_users_test.go +++ b/src/server/server_users_test.go @@ -10,6 +10,7 @@ import ( "github.com/ihexxa/quickshare/src/client" "github.com/ihexxa/quickshare/src/db" q "github.com/ihexxa/quickshare/src/handlers" + "github.com/ihexxa/quickshare/src/handlers/settings" su "github.com/ihexxa/quickshare/src/handlers/singleuserhdr" ) @@ -44,6 +45,21 @@ func TestUsersHandlers(t *testing.T) { }, "db": { "dbPath": "tmpTestData/quickshare" + }, + "site": { + "clientCfg": { + "siteName": "Quickshare", + "siteDesc": "Quick and simple file sharing", + "bg": { + "url": "/static/img/textured_paper.png", + "repeat": "repeat", + "position": "center", + "align": "fixed", + "bgColor": "#ccc" + }, + "allowSetBg": true, + "autoTheme": true + } } }` adminName := "qs" @@ -57,6 +73,7 @@ func TestUsersHandlers(t *testing.T) { fs := srv.depsFS() usersCl := client.NewSingleUserClient(addr) + settingsCl := client.NewSettingsClient(addr) if !isServerReady(addr) { t.Fatal("fail to start server") @@ -433,7 +450,7 @@ func TestUsersHandlers(t *testing.T) { } }) - t.Run("Login,SetPreferences, Self, Logout", func(t *testing.T) { + t.Run("Login, SetPreferences, Self, Logout", func(t *testing.T) { usersCl := client.NewSingleUserClient(addr) resp, _, errs := usersCl.Login(adminName, adminNewPwd) if len(errs) > 0 { @@ -445,7 +462,7 @@ func TestUsersHandlers(t *testing.T) { token := client.GetCookie(resp.Cookies(), su.TokenCookie) prefers := []*db.Preferences{ - &db.Preferences{ + { Bg: &db.BgConfig{ Url: "/bgurl", Repeat: "no-repeat", @@ -460,7 +477,7 @@ func TestUsersHandlers(t *testing.T) { Lan: "en_US", Theme: "light", }, - &db.Preferences{ + { Bg: &db.BgConfig{ Url: "/bgurl2", Repeat: "repeat", @@ -490,6 +507,50 @@ func TestUsersHandlers(t *testing.T) { } else if resp.StatusCode != 200 { t.Fatal(resp.StatusCode) } else if !reflect.DeepEqual(selfResp.Preferences, prefer) { + fmt.Printf("\n%+v\n%+v\n", selfResp.Preferences, selfResp.Preferences.Bg) + fmt.Printf("\n%+v\n%+v\n", prefer, prefer.Bg) + t.Fatal("preference not equal") + } + } + + // disable setting bg in preferences + resp, _, errs = settingsCl.SetClientCfg(&settings.ClientCfgMsg{ + ClientCfg: &db.ClientConfig{ + SiteName: "Quickshare", + SiteDesc: "Quick and simple file sharing", + Bg: db.DefaultBgConfig, + AllowSetBg: false, + AutoTheme: true, + }, + CaptchaEnabled: false, + }, + token, + ) + if len(errs) > 0 { + t.Fatal(errs) + } else if resp.StatusCode != 200 { + t.Fatal(resp.StatusCode) + } + + for _, prefer := range prefers { + resp, _, errs := usersCl.SetPreferences(prefer, token) + if len(errs) > 0 { + t.Fatal(errs) + } else if resp.StatusCode != 200 { + t.Fatal(resp.StatusCode) + } + + resp, selfResp, errs := usersCl.Self(token) + if len(errs) > 0 { + t.Fatal(errs) + } else if resp.StatusCode != 200 { + t.Fatal(resp.StatusCode) + } + + prefer.Bg = db.DefaultPreferences.Bg + if !reflect.DeepEqual(selfResp.Preferences, prefer) { + fmt.Printf("\n%+v\n%+v\n", selfResp.Preferences, selfResp.Preferences.Bg) + fmt.Printf("\n%+v\n%+v\n", prefer, prefer.Bg) t.Fatal("preference not equal") } } diff --git a/src/server/testdata/test_quickshare.db b/src/server/testdata/test_quickshare.db index 513b8c0..1193e49 100644 Binary files a/src/server/testdata/test_quickshare.db and b/src/server/testdata/test_quickshare.db differ