From e73947de0defce7ac769544da1cc2055eb4125b9 Mon Sep 17 00:00:00 2001 From: hexxa Date: Sat, 7 Aug 2021 17:18:10 +0800 Subject: [PATCH] feat(users): enable quota in handlers --- src/handlers/multiusers/handlers.go | 8 +++++ src/server/config.go | 50 ++++++++++++++++------------- src/userstore/user_store.go | 21 ++++++------ src/userstore/user_store_test.go | 15 +++++++-- 4 files changed, 60 insertions(+), 34 deletions(-) diff --git a/src/handlers/multiusers/handlers.go b/src/handlers/multiusers/handlers.go index 9d63ba2..382b4f0 100644 --- a/src/handlers/multiusers/handlers.go +++ b/src/handlers/multiusers/handlers.go @@ -354,11 +354,19 @@ func (h *MultiUsersSvc) AddUser(c *gin.Context) { return } + spaceLimit := h.cfg.IntOr("Users.SpaceLimit", 1024) + uploadSpeedLimit := h.cfg.IntOr("Users.UploadSpeedLimit", 100*1024) + downloadSpeedLimit := h.cfg.IntOr("Users.DownloadSpeedLimit", 100*1024) err = h.deps.Users().AddUser(&userstore.User{ ID: uid, Name: req.Name, Pwd: string(pwdHash), Role: req.Role, + Quota: &userstore.Quota{ + SpaceLimit: spaceLimit, + UploadSpeedLimit: uploadSpeedLimit, + DownloadSpeedLimit: downloadSpeedLimit, + }, }) if err != nil { c.JSON(q.ErrResp(c, 500, err)) diff --git a/src/server/config.go b/src/server/config.go index 7383260..f112605 100644 --- a/src/server/config.go +++ b/src/server/config.go @@ -9,17 +9,20 @@ type FSConfig struct { } type UsersCfg struct { - EnableAuth bool `json:"enableAuth" yaml:"enableAuth"` - DefaultAdmin string `json:"defaultAdmin" yaml:"defaultAdmin" cfg:"env"` - DefaultAdminPwd string `json:"defaultAdminPwd" yaml:"defaultAdminPwd" cfg:"env"` - CookieTTL int `json:"cookieTTL" yaml:"cookieTTL"` - CookieSecure bool `json:"cookieSecure" yaml:"cookieSecure"` - CookieHttpOnly bool `json:"cookieHttpOnly" yaml:"cookieHttpOnly"` - MinUserNameLen int `json:"minUserNameLen" yaml:"minUserNameLen"` - MinPwdLen int `json:"minPwdLen" yaml:"minPwdLen"` - CaptchaWidth int `json:"captchaWidth" yaml:"captchaWidth"` - CaptchaHeight int `json:"captchaHeight" yaml:"captchaHeight"` - CaptchaEnabled bool `json:"captchaEnabled" yaml:"captchaEnabled"` + EnableAuth bool `json:"enableAuth" yaml:"enableAuth"` + DefaultAdmin string `json:"defaultAdmin" yaml:"defaultAdmin" cfg:"env"` + DefaultAdminPwd string `json:"defaultAdminPwd" yaml:"defaultAdminPwd" cfg:"env"` + CookieTTL int `json:"cookieTTL" yaml:"cookieTTL"` + CookieSecure bool `json:"cookieSecure" yaml:"cookieSecure"` + CookieHttpOnly bool `json:"cookieHttpOnly" yaml:"cookieHttpOnly"` + MinUserNameLen int `json:"minUserNameLen" yaml:"minUserNameLen"` + MinPwdLen int `json:"minPwdLen" yaml:"minPwdLen"` + CaptchaWidth int `json:"captchaWidth" yaml:"captchaWidth"` + CaptchaHeight int `json:"captchaHeight" yaml:"captchaHeight"` + CaptchaEnabled bool `json:"captchaEnabled" yaml:"captchaEnabled"` + UploadSpeedLimit int `json:"uploadSpeedLimit" yaml:"uploadSpeedLimit"` + DownloadSpeedLimit int `json:"downloadSpeedLimit" yaml:"downloadSpeedLimit"` + SpaceLimit int `json:"spaceLimit" yaml:"spaceLimit"` } type Secrets struct { @@ -55,17 +58,20 @@ func DefaultConfig() (string, error) { OpenTTL: 60, // 1 min }, Users: &UsersCfg{ - EnableAuth: true, - DefaultAdmin: "", - DefaultAdminPwd: "", - CookieTTL: 3600 * 24 * 7, // 1 week - CookieSecure: false, - CookieHttpOnly: true, - MinUserNameLen: 4, - MinPwdLen: 6, - CaptchaWidth: 256, - CaptchaHeight: 60, - CaptchaEnabled: true, + EnableAuth: true, + DefaultAdmin: "", + DefaultAdminPwd: "", + CookieTTL: 3600 * 24 * 7, // 1 week + CookieSecure: false, + CookieHttpOnly: true, + MinUserNameLen: 4, + MinPwdLen: 6, + CaptchaWidth: 256, + CaptchaHeight: 60, + CaptchaEnabled: true, + UploadSpeedLimit: 100 * 1024, // B + DownloadSpeedLimit: 100 * 1024, // B + SpaceLimit: 1024, // GB }, Secrets: &Secrets{ TokenSecret: "", diff --git a/src/userstore/user_store.go b/src/userstore/user_store.go index ee05673..2f84588 100644 --- a/src/userstore/user_store.go +++ b/src/userstore/user_store.go @@ -17,16 +17,18 @@ const ( InitNs = "usersInit" IDsNs = "ids" UsersNs = "users" - PwdsNs = "pwds" - RolesNs = "roles" RoleListNs = "roleList" InitTimeKey = "initTime" + + defaultSpaceLimit = 1024 // 1GB + defaultUploadSpeedLimit = 100 * 1024 // 100KB + defaultDownloadSpeedLimit = 100 * 1024 // 100KB ) type Quota struct { - SpaceLimit int64 `json:"spaceLimit,string"` - UploadSpeedLimit int `json:"uploadSpeedLimit"` - DownloadSpeedLimit int `json:"downloadSpeedLimit"` + SpaceLimit int `json:"spaceLimit"` + UploadSpeedLimit int `json:"uploadSpeedLimit"` + DownloadSpeedLimit int `json:"downloadSpeedLimit"` } type User struct { @@ -44,8 +46,6 @@ type IUserStore interface { DelUser(id uint64) error GetUser(id uint64) (*User, error) GetUserByName(name string) (*User, error) - // SetName(id uint64, name string) error - // SetRole(id uint64, role string) error SetInfo(id uint64, user *User) error SetPwd(id uint64, pwd string) error ListUsers() ([]*User, error) @@ -66,8 +66,6 @@ func NewKVUserStore(store kvstore.IKVStore) (*KVUserStore, error) { for _, nsName := range []string{ IDsNs, UsersNs, - PwdsNs, - RolesNs, InitNs, RoleListNs, } { @@ -90,6 +88,11 @@ func (us *KVUserStore) Init(rootName, rootPwd string) error { Name: rootName, Pwd: rootPwd, Role: AdminRole, + Quota: &Quota{ + SpaceLimit: defaultSpaceLimit, + UploadSpeedLimit: defaultUploadSpeedLimit, + DownloadSpeedLimit: defaultDownloadSpeedLimit, + }, }) if err != nil { return err diff --git a/src/userstore/user_store_test.go b/src/userstore/user_store_test.go index bd15970..0ea333f 100644 --- a/src/userstore/user_store_test.go +++ b/src/userstore/user_store_test.go @@ -23,14 +23,23 @@ func TestUserStores(t *testing.T) { t.Fatalf("passwords not match %s", err) } if root.Role != AdminRole { - t.Fatalf("incorrect root fole") + t.Fatalf("incorrect root role") + } + if root.Quota.SpaceLimit != defaultSpaceLimit { + t.Fatalf("incorrect root SpaceLimit") + } + if root.Quota.UploadSpeedLimit != defaultUploadSpeedLimit { + t.Fatalf("incorrect root UploadSpeedLimit") + } + if root.Quota.DownloadSpeedLimit != defaultDownloadSpeedLimit { + t.Fatalf("incorrect root DownloadSpeedLimit") } id, name1 := uint64(1), "test_user1" pwd1, pwd2 := "666", "888" role1, role2 := UserRole, AdminRole - spaceLimit1, upLimit1, downLimit1 := int64(3), 5, 7 - spaceLimit2, upLimit2, downLimit2 := int64(11), 13, 17 + spaceLimit1, upLimit1, downLimit1 := 3, 5, 7 + spaceLimit2, upLimit2, downLimit2 := 11, 13, 17 err = store.AddUser(&User{ ID: id,