From 80f4f2f292363bf9d2696417a6f464b1549c3523 Mon Sep 17 00:00:00 2001 From: "face.wsl" Date: Fri, 25 Nov 2022 13:16:41 +0800 Subject: [PATCH] fix: settings and users saving --- storage/bolt/config.go | 3 --- storage/sql/auth.go | 1 - storage/sql/settings.go | 47 +++++++++++++++++++++++++++++++++-------- storage/sql/users.go | 37 ++++++++------------------------ 4 files changed, 47 insertions(+), 41 deletions(-) diff --git a/storage/bolt/config.go b/storage/bolt/config.go index 25e0e1a5..a4d40064 100644 --- a/storage/bolt/config.go +++ b/storage/bolt/config.go @@ -4,7 +4,6 @@ import ( "github.com/asdine/storm/v3" "github.com/filebrowser/filebrowser/v2/settings" - "github.com/filebrowser/filebrowser/v2/storage/sql" ) type settingsBackend struct { @@ -17,7 +16,6 @@ func (s settingsBackend) Get() (*settings.Settings, error) { } func (s settingsBackend) Save(set *settings.Settings) error { - sql.LogBacktrace() return save(s.db, "settings", set) } @@ -27,6 +25,5 @@ func (s settingsBackend) GetServer() (*settings.Server, error) { } func (s settingsBackend) SaveServer(server *settings.Server) error { - sql.LogBacktrace() return save(s.db, "server", server) } diff --git a/storage/sql/auth.go b/storage/sql/auth.go index 14ddcac8..1eb7e5b2 100644 --- a/storage/sql/auth.go +++ b/storage/sql/auth.go @@ -15,7 +15,6 @@ type authBackend struct { } func (s authBackend) Get(t settings.AuthMethod) (auth.Auther, error) { - logBacktrace() var auther auth.Auther switch t { diff --git a/storage/sql/settings.go b/storage/sql/settings.go index 076ada86..d24e6e87 100644 --- a/storage/sql/settings.go +++ b/storage/sql/settings.go @@ -2,6 +2,7 @@ package sql import ( "database/sql" + "encoding/base64" "encoding/json" "github.com/filebrowser/filebrowser/v2/auth" @@ -25,6 +26,14 @@ func InitSettingsTable(db *sql.DB) error { return err } +func bytesToString(data []byte) string { + return base64.RawStdEncoding.EncodeToString(data) +} + +func bytesFromString(s string) ([]byte, error) { + return base64.RawStdEncoding.DecodeString(s) +} + func userDefaultsFromString(s string) settings.UserDefaults { if s == "" { return settings.UserDefaults{} @@ -126,7 +135,6 @@ func boolToString(b bool) string { } func (s settingsBackend) Get() (*settings.Settings, error) { - logBacktrace() sql := "select key, value from settings" rows, err := s.db.Query(sql) if checkError(err, "Fail to Query settings.Settings") { @@ -139,11 +147,16 @@ func (s settingsBackend) Get() (*settings.Settings, error) { err = rows.Scan(&key, &value) checkError(err, "Fail to query settings.Settings") if key == "Key" { - settings1.Key = []byte(value) + val, err := bytesFromString(value) + if !checkError(err, "Fail to parse []byte from string") { + settings1.Key = val + } } else if key == "Signup" { settings1.Signup = boolFromString(value) } else if key == "CreateUserDir" { settings1.CreateUserDir = boolFromString(value) + } else if key == "UserHomeBasePath" { + settings1.UserHomeBasePath = value } else if key == "Defaults" { settings1.Defaults = userDefaultsFromString(value) } else if key == "AuthMethod" { @@ -165,13 +178,12 @@ func (s settingsBackend) Get() (*settings.Settings, error) { } func (s settingsBackend) Save(ss *settings.Settings) error { - logBacktrace() fields := []string{"Key", "Signup", "CreateUserDir", "UserHomeBasePath", "Defaults", "AuthMethod", "Branding", "Commands", "Shell", "Rules"} values := []string{ - string(ss.Key), + bytesToString(ss.Key), boolToString(ss.Signup), boolToString(ss.CreateUserDir), - string(ss.UserHomeBasePath), + ss.UserHomeBasePath, userDefaultsToString(ss.Defaults), string(ss.AuthMethod), brandingToString(ss.Branding), @@ -184,13 +196,18 @@ func (s settingsBackend) Save(ss *settings.Settings) error { return err } for i, field := range fields { - stmt, err := s.db.Prepare("INSERT INTO settings (key, value) VALUES(?,?)") + exists := ContainKey(s.db, field) + sql := "INSERT INTO settings (value, key) VALUES(?,?)" + if exists { + sql = "UPDATE settings set value = ? where key = ?" + } + stmt, err := s.db.Prepare(sql) defer stmt.Close() if checkError(err, "Fail to prepare statement") { tx.Rollback() break } - _, err = stmt.Exec(field, values[i]) + _, err = stmt.Exec(values[i], field) if checkError(err, "Fail to insert field "+field+" of settings") { tx.Rollback() break @@ -276,7 +293,6 @@ func cloneSettings(s settings.Settings) settings.Settings { } func (s settingsBackend) GetServer() (*settings.Server, error) { - logBacktrace() sql := "select key, value from settings" rows, err := s.db.Query(sql) if checkError(err, "Fail to Query for GetServer") { @@ -323,7 +339,6 @@ func (s settingsBackend) GetServer() (*settings.Server, error) { } func (s settingsBackend) SaveServer(ss *settings.Server) error { - logBacktrace() fields := []string{"Root", "BaseURL", "Socket", "TLSKey", "TLSCert", "Port", "Address", "Log", "EnableThumbnails", "ResizePreview", "EnableExec", "TypeDetectionByHeader", "AuthHook"} values := []string{ ss.Root, @@ -408,3 +423,17 @@ func HadSetting(db *sql.DB) bool { } return true } + +func ContainKey(db *sql.DB, key string) bool { + sql := "select value from settings where key = '" + key + "';" + value := "" + err := db.QueryRow(sql).Scan(&value) + if checkError(err, "Fail to QueryRow for key "+key) { + return false + } + return true +} + +func HadSettingOfKey(db *sql.DB, key string) bool { + return GetSetting(db, "Key") == key +} diff --git a/storage/sql/users.go b/storage/sql/users.go index b7827069..d24a2e83 100644 --- a/storage/sql/users.go +++ b/storage/sql/users.go @@ -4,7 +4,6 @@ import ( "database/sql" "encoding/json" "fmt" - "log" "reflect" "strconv" "strings" @@ -117,24 +116,13 @@ func createAdminUser() users.User { } func InitUserTable(db *sql.DB) error { - logBacktrace() sql := "create table if not exists users (id integer primary key, username string, password string, scope string, locale string, lockpassword bool, viewmode string, perm string, commands string, sorting string, rules string, hidedotfiles bool, dateformat bool, singleclick bool);" _, err := db.Exec(sql) - if checkError(err, "Fail to create users table") { - return err - } - user, err := usersBackend{db}.Get("admin") - checkError(err, "Fail to query admin user") - if user == nil { - log.Println("No admin exists") - err := usersBackend{db}.Save(&adminUser) - checkError(err, "Fail to init admin user") - } + checkError(err, "Fail to create users table") return err } -func (s usersBackend) Get(i interface{}) (*users.User, error) { - logBacktrace() +func (s usersBackend) GetBy(i interface{}) (*users.User, error) { columns := []string{"id", "username", "password", "scope", "locale", "lockpassword", "viewmode", "perm", "commands", "sorting", "rules", "hidedotfiles", "dateformat", "singleclick"} columnsStr := strings.Join(columns, ",") var conditionStr string @@ -186,7 +174,6 @@ func (s usersBackend) Get(i interface{}) (*users.User, error) { } func (s usersBackend) Gets() ([]*users.User, error) { - logBacktrace() sql := "select id, username, password, scope, lockpassword, viewmode, perm,commands,sorting,rules from users" rows, err := s.db.Query(sql) if checkError(err, "Fail to Query []*users.User") { @@ -225,13 +212,7 @@ func (s usersBackend) Gets() ([]*users.User, error) { return users2, nil } -func (s usersBackend) GetBy(id interface{}) (*users.User, error) { - logBacktrace() - return s.Get(id) -} - func (s usersBackend) updateUser(id uint, user *users.User) error { - logBacktrace() lockpassword := 0 if user.LockPassword { lockpassword = 1 @@ -255,7 +236,6 @@ func (s usersBackend) updateUser(id uint, user *users.User) error { } func (s usersBackend) insertUser(user *users.User) error { - logBacktrace() password, err := users.HashPwd(user.Password) if checkError(err, "Fail to hash password") { return err @@ -300,13 +280,17 @@ func (s usersBackend) insertUser(user *users.User) error { boolToString(user.DateFormat), boolToString(user.SingleClick), ) - _, err = s.db.Exec(sql) - checkError(err, "Fail to insert user") + res, err := s.db.Exec(sql) + if !checkError(err, "Fail to insert user") { + id, err2 := res.LastInsertId() + if !checkError(err2, "Fail to fetch last insert id") { + user.ID = uint(id) + } + } return err } func (s usersBackend) Save(user *users.User) error { - logBacktrace() userOriginal, err := s.GetBy(user.Username) checkError(err, "") if userOriginal != nil { @@ -316,7 +300,6 @@ func (s usersBackend) Save(user *users.User) error { } func (s usersBackend) DeleteByID(id uint) error { - logBacktrace() sql := "delete from users where id=" + strconv.Itoa(int(id)) _, err := s.db.Exec(sql) checkError(err, "Fail to delete User by id") @@ -324,7 +307,6 @@ func (s usersBackend) DeleteByID(id uint) error { } func (s usersBackend) DeleteByUsername(username string) error { - logBacktrace() sql := "delete from users where username='" + username + "'" _, err := s.db.Exec(sql) checkError(err, "Fail to delete user by username") @@ -332,7 +314,6 @@ func (s usersBackend) DeleteByUsername(username string) error { } func (s usersBackend) Update(u *users.User, fields ...string) error { - logBacktrace() var setItems = []string{} for _, field := range fields { userField := reflect.ValueOf(u).Elem().FieldByName(field)