[db] add checkings for boltstore

This commit is contained in:
hexxa 2022-03-26 12:06:22 +08:00 committed by Hexxa
parent 41827f20c0
commit d7f8fac07e
4 changed files with 50 additions and 8 deletions

View file

@ -43,12 +43,20 @@ func (bs *BoltStore) getUserInfo(tx *bolt.Tx, userID uint64) (*db.User, error) {
return nil, fmt.Errorf("user id key(%d) info(%d) does match", userID, userInfo.ID)
}
if err = db.CheckUser(userInfo, true); err != nil {
return nil, err
}
return userInfo, nil
}
func (bs *BoltStore) setUserInfo(tx *bolt.Tx, userID uint64, userInfo *db.User) error {
var err error
if err = db.CheckUser(userInfo, false); err != nil {
return err
}
usersBucket := tx.Bucket([]byte(db.UsersNs))
if usersBucket == nil {
return db.ErrBucketNotFound
@ -131,12 +139,20 @@ func (bs *BoltStore) getFileInfo(tx *bolt.Tx, userID uint64, itemPath string) (*
if err != nil {
return nil, err
}
if err = db.CheckFileInfo(fileInfo, true); err != nil {
return nil, err
}
return fileInfo, nil
}
func (bs *BoltStore) setFileInfo(tx *bolt.Tx, userID uint64, itemPath string, fileInfo *db.FileInfo) error {
var err error
if err = db.CheckFileInfo(fileInfo, false); err != nil {
return err
}
fileInfoBucket := tx.Bucket([]byte(db.FileInfoNs))
if fileInfoBucket == nil {
return db.ErrBucketNotFound

View file

@ -7,8 +7,6 @@ import (
)
const (
SchemaV2 = "v2" // add size to file info
UserSchemaNs = "UserSchemaNs"
FileSchemaNs = "FileSchemaNs"
UserIDsNs = "UserIDsNs"
@ -27,6 +25,7 @@ const (
)
var (
ErrInvalidFileInfo = errors.New("invalid fileInfo")
ErrInvalidUser = errors.New("invalid user")
ErrInvalidQuota = errors.New("invalid quota")
ErrInvalidPreferences = errors.New("invalid preferences")
@ -206,6 +205,7 @@ func CheckSiteCfg(cfg *SiteConfig, fillDefault bool) error {
return nil
}
// TODO: check upper and lower limit
func CheckQuota(quota *Quota) error {
if quota.SpaceLimit < 0 {
return ErrInvalidQuota
@ -241,6 +241,7 @@ func CheckPreferences(prefers *Preferences, fillDefault bool) error {
if prefers.Avatar == "" {
prefers.Avatar = DefaultAvatar
}
// TODO: add strict checking
if prefers.Email == "" {
prefers.Email = DefaultEmail
}
@ -314,3 +315,14 @@ func CheckUser(user *User, fillDefault bool) error {
return nil
}
// TODO: auto trigger hash generating
func CheckFileInfo(info *FileInfo, fillDefault bool) error {
if (info.Shared && info.ShareID == "") || (!info.Shared && info.ShareID != "") {
return fmt.Errorf("shared and ShareID are in conflict: %w", ErrInvalidFileInfo)
}
if !info.IsDir && (info.Shared || info.ShareID != "") {
return fmt.Errorf("dir can not be shared: %w", ErrInvalidFileInfo)
}
return nil
}

View file

@ -85,6 +85,10 @@ func (fi *FileInfoStore) getInfo(itemPath string) (*db.FileInfo, error) {
if err != nil {
return nil, fmt.Errorf("get file info: %w", err)
}
if err = db.CheckFileInfo(info, true); err != nil {
return nil, err
}
return info, nil
}
@ -98,10 +102,14 @@ func (fi *FileInfoStore) GetInfos(itemPaths []string) (map[string]*db.FileInfo,
info, err := fi.getInfo(itemPath)
if err != nil {
if !errors.Is(err, ErrNotFound) {
// TODO: try to make info data consistent with fs
return nil, err
}
continue
}
if err = db.CheckFileInfo(info, true); err != nil {
return nil, err
}
infos[itemPath] = info
}
@ -109,6 +117,10 @@ func (fi *FileInfoStore) GetInfos(itemPaths []string) (map[string]*db.FileInfo,
}
func (fi *FileInfoStore) setInfo(itemPath string, info *db.FileInfo) error {
if err := db.CheckFileInfo(info, false); err != nil {
return err
}
infoStr, err := json.Marshal(info)
if err != nil {
return fmt.Errorf("set file info: %w", err)

View file

@ -99,14 +99,16 @@ func TestUserStores(t *testing.T) {
testInfoMethods := func(t *testing.T, store IFileInfoStore) {
pathInfos := map[string]*db.FileInfo{
"admin/item": &db.FileInfo{
Shared: false,
IsDir: false,
Sha1: "file",
Shared: false,
ShareID: "",
IsDir: false,
Sha1: "file",
},
"admin/dir": &db.FileInfo{
Shared: true,
IsDir: true,
Sha1: "dir",
Shared: true,
ShareID: "mockedShareID",
IsDir: true,
Sha1: "dir",
},
}
var err error