[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) 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 return userInfo, nil
} }
func (bs *BoltStore) setUserInfo(tx *bolt.Tx, userID uint64, userInfo *db.User) error { func (bs *BoltStore) setUserInfo(tx *bolt.Tx, userID uint64, userInfo *db.User) error {
var err error var err error
if err = db.CheckUser(userInfo, false); err != nil {
return err
}
usersBucket := tx.Bucket([]byte(db.UsersNs)) usersBucket := tx.Bucket([]byte(db.UsersNs))
if usersBucket == nil { if usersBucket == nil {
return db.ErrBucketNotFound return db.ErrBucketNotFound
@ -131,12 +139,20 @@ func (bs *BoltStore) getFileInfo(tx *bolt.Tx, userID uint64, itemPath string) (*
if err != nil { if err != nil {
return nil, err return nil, err
} }
if err = db.CheckFileInfo(fileInfo, true); err != nil {
return nil, err
}
return fileInfo, nil return fileInfo, nil
} }
func (bs *BoltStore) setFileInfo(tx *bolt.Tx, userID uint64, itemPath string, fileInfo *db.FileInfo) error { func (bs *BoltStore) setFileInfo(tx *bolt.Tx, userID uint64, itemPath string, fileInfo *db.FileInfo) error {
var err error var err error
if err = db.CheckFileInfo(fileInfo, false); err != nil {
return err
}
fileInfoBucket := tx.Bucket([]byte(db.FileInfoNs)) fileInfoBucket := tx.Bucket([]byte(db.FileInfoNs))
if fileInfoBucket == nil { if fileInfoBucket == nil {
return db.ErrBucketNotFound return db.ErrBucketNotFound

View file

@ -7,8 +7,6 @@ import (
) )
const ( const (
SchemaV2 = "v2" // add size to file info
UserSchemaNs = "UserSchemaNs" UserSchemaNs = "UserSchemaNs"
FileSchemaNs = "FileSchemaNs" FileSchemaNs = "FileSchemaNs"
UserIDsNs = "UserIDsNs" UserIDsNs = "UserIDsNs"
@ -27,6 +25,7 @@ const (
) )
var ( var (
ErrInvalidFileInfo = errors.New("invalid fileInfo")
ErrInvalidUser = errors.New("invalid user") ErrInvalidUser = errors.New("invalid user")
ErrInvalidQuota = errors.New("invalid quota") ErrInvalidQuota = errors.New("invalid quota")
ErrInvalidPreferences = errors.New("invalid preferences") ErrInvalidPreferences = errors.New("invalid preferences")
@ -206,6 +205,7 @@ func CheckSiteCfg(cfg *SiteConfig, fillDefault bool) error {
return nil return nil
} }
// TODO: check upper and lower limit
func CheckQuota(quota *Quota) error { func CheckQuota(quota *Quota) error {
if quota.SpaceLimit < 0 { if quota.SpaceLimit < 0 {
return ErrInvalidQuota return ErrInvalidQuota
@ -241,6 +241,7 @@ func CheckPreferences(prefers *Preferences, fillDefault bool) error {
if prefers.Avatar == "" { if prefers.Avatar == "" {
prefers.Avatar = DefaultAvatar prefers.Avatar = DefaultAvatar
} }
// TODO: add strict checking
if prefers.Email == "" { if prefers.Email == "" {
prefers.Email = DefaultEmail prefers.Email = DefaultEmail
} }
@ -314,3 +315,14 @@ func CheckUser(user *User, fillDefault bool) error {
return nil 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 { if err != nil {
return nil, fmt.Errorf("get file info: %w", err) return nil, fmt.Errorf("get file info: %w", err)
} }
if err = db.CheckFileInfo(info, true); err != nil {
return nil, err
}
return info, nil return info, nil
} }
@ -98,10 +102,14 @@ func (fi *FileInfoStore) GetInfos(itemPaths []string) (map[string]*db.FileInfo,
info, err := fi.getInfo(itemPath) info, err := fi.getInfo(itemPath)
if err != nil { if err != nil {
if !errors.Is(err, ErrNotFound) { if !errors.Is(err, ErrNotFound) {
// TODO: try to make info data consistent with fs
return nil, err return nil, err
} }
continue continue
} }
if err = db.CheckFileInfo(info, true); err != nil {
return nil, err
}
infos[itemPath] = info 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 { 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) infoStr, err := json.Marshal(info)
if err != nil { if err != nil {
return fmt.Errorf("set file info: %w", err) return fmt.Errorf("set file info: %w", err)

View file

@ -100,11 +100,13 @@ func TestUserStores(t *testing.T) {
pathInfos := map[string]*db.FileInfo{ pathInfos := map[string]*db.FileInfo{
"admin/item": &db.FileInfo{ "admin/item": &db.FileInfo{
Shared: false, Shared: false,
ShareID: "",
IsDir: false, IsDir: false,
Sha1: "file", Sha1: "file",
}, },
"admin/dir": &db.FileInfo{ "admin/dir": &db.FileInfo{
Shared: true, Shared: true,
ShareID: "mockedShareID",
IsDir: true, IsDir: true,
Sha1: "dir", Sha1: "dir",
}, },