fix: sql.settings db

This commit is contained in:
face.wsl 2022-11-25 00:18:05 +08:00
parent d473569e94
commit f7910d47f9
6 changed files with 101 additions and 27 deletions

View File

@ -109,7 +109,7 @@ func openBoltDB(path string, cfg pythonConfig) (pythonData, Closeable) {
func openDB(path string, cfg pythonConfig) (pythonData, Closeable) { func openDB(path string, cfg pythonConfig) (pythonData, Closeable) {
if sql.IsDBPath(path) { if sql.IsDBPath(path) {
data := pythonData{hadDB: true} data := pythonData{hadDB: false}
db, err := sql.OpenDB(path) db, err := sql.OpenDB(path)
if err != nil { if err != nil {
log.Fatal("Fail to open database " + path) log.Fatal("Fail to open database " + path)
@ -118,6 +118,7 @@ func openDB(path string, cfg pythonConfig) (pythonData, Closeable) {
if err != nil { if err != nil {
log.Fatal("Fail to create database storage for " + path) log.Fatal("Fail to create database storage for " + path)
} }
data.hadDB = sql.HadSetting(db)
return data, db return data, db
} }
return openBoltDB(path, cfg) return openBoltDB(path, cfg)

View File

@ -4,6 +4,7 @@ import (
"github.com/asdine/storm/v3" "github.com/asdine/storm/v3"
"github.com/filebrowser/filebrowser/v2/settings" "github.com/filebrowser/filebrowser/v2/settings"
"github.com/filebrowser/filebrowser/v2/storage/sql"
) )
type settingsBackend struct { type settingsBackend struct {
@ -16,6 +17,7 @@ func (s settingsBackend) Get() (*settings.Settings, error) {
} }
func (s settingsBackend) Save(set *settings.Settings) error { func (s settingsBackend) Save(set *settings.Settings) error {
sql.LogBacktrace()
return save(s.db, "settings", set) return save(s.db, "settings", set)
} }
@ -25,5 +27,6 @@ func (s settingsBackend) GetServer() (*settings.Server, error) {
} }
func (s settingsBackend) SaveServer(server *settings.Server) error { func (s settingsBackend) SaveServer(server *settings.Server) error {
sql.LogBacktrace()
return save(s.db, "server", server) return save(s.db, "server", server)
} }

View File

@ -3,8 +3,6 @@ package sql
import ( import (
"database/sql" "database/sql"
"encoding/json" "encoding/json"
"fmt"
"strings"
"github.com/filebrowser/filebrowser/v2/auth" "github.com/filebrowser/filebrowser/v2/auth"
"github.com/filebrowser/filebrowser/v2/files" "github.com/filebrowser/filebrowser/v2/files"
@ -128,6 +126,7 @@ func boolToString(b bool) string {
} }
func (s settingsBackend) Get() (*settings.Settings, error) { func (s settingsBackend) Get() (*settings.Settings, error) {
logBacktrace()
sql := "select key, value from settings" sql := "select key, value from settings"
rows, err := s.db.Query(sql) rows, err := s.db.Query(sql)
if checkError(err, "Fail to Query settings.Settings") { if checkError(err, "Fail to Query settings.Settings") {
@ -159,28 +158,50 @@ func (s settingsBackend) Get() (*settings.Settings, error) {
settings1.Rules = rulesFromString(value) settings1.Rules = rulesFromString(value)
} }
} }
if len(settings1.Key) == 0 {
return nil, nil
}
return &settings1, nil return &settings1, nil
} }
func (s settingsBackend) Save(ss *settings.Settings) error { func (s settingsBackend) Save(ss *settings.Settings) error {
columns := []string{"Key", "Signup", "CreateUserDir", "UserHomeBasePath", "Defaults", "AuthMethod", "Branding", "Commands", "Shell", "Rules"} logBacktrace()
fields := []string{"Key", "Signup", "CreateUserDir", "UserHomeBasePath", "Defaults", "AuthMethod", "Branding", "Commands", "Shell", "Rules"}
values := []string{ values := []string{
"'" + string(ss.Key) + "'", string(ss.Key),
boolToString(ss.Signup), boolToString(ss.Signup),
boolToString(ss.CreateUserDir), boolToString(ss.CreateUserDir),
"'" + string(ss.UserHomeBasePath) + "'", string(ss.UserHomeBasePath),
userDefaultsToString(ss.Defaults), userDefaultsToString(ss.Defaults),
string(ss.AuthMethod), string(ss.AuthMethod),
brandingToString(ss.Branding), brandingToString(ss.Branding),
commandsToString(ss.Commands), commandsToString(ss.Commands),
stringsToString(ss.Shell), stringsToString(ss.Shell),
RulesToString(ss.Rules)} RulesToString(ss.Rules),
sql := fmt.Sprintf("INSERT INTO settings (%s) VALUES(%s)", strings.Join(columns, ","), strings.Join(values, ",")) }
_, err := s.db.Exec(sql) tx, err := s.db.Begin()
if checkError(err, "Fail to insert settings.Settings") { if checkError(err, "Fail to begin db transaction") {
return err return err
} }
return nil for i, field := range fields {
stmt, err := s.db.Prepare("INSERT INTO settings (key, value) VALUES(?,?)")
defer stmt.Close()
if checkError(err, "Fail to prepare statement") {
tx.Rollback()
break
}
_, err = stmt.Exec(field, values[i])
if checkError(err, "Fail to insert field "+field+" of settings") {
tx.Rollback()
break
}
}
err = tx.Commit()
if checkError(err, "Fail to commit") {
tx.Rollback()
return err
}
return err
} }
var defaultServer = settings.Server{ var defaultServer = settings.Server{
@ -255,6 +276,7 @@ func cloneSettings(s settings.Settings) settings.Settings {
} }
func (s settingsBackend) GetServer() (*settings.Server, error) { func (s settingsBackend) GetServer() (*settings.Server, error) {
logBacktrace()
sql := "select key, value from settings" sql := "select key, value from settings"
rows, err := s.db.Query(sql) rows, err := s.db.Query(sql)
if checkError(err, "Fail to Query for GetServer") { if checkError(err, "Fail to Query for GetServer") {
@ -301,27 +323,45 @@ func (s settingsBackend) GetServer() (*settings.Server, error) {
} }
func (s settingsBackend) SaveServer(ss *settings.Server) error { func (s settingsBackend) SaveServer(ss *settings.Server) error {
columns := []string{"Root", "BaseURL", "Socket", "TLSKey", "TLSCert", "Port", "Address", "Log", "EnableThumbnails", "ResizePreview", "EnableExec", "TypeDetectionByHeader", "AuthHook"} logBacktrace()
fields := []string{"Root", "BaseURL", "Socket", "TLSKey", "TLSCert", "Port", "Address", "Log", "EnableThumbnails", "ResizePreview", "EnableExec", "TypeDetectionByHeader", "AuthHook"}
values := []string{ values := []string{
"'" + ss.Root + "'", ss.Root,
"'" + ss.BaseURL + "'", ss.BaseURL,
"'" + ss.Socket + "'", ss.Socket,
"'" + ss.TLSKey + "'", ss.TLSKey,
"'" + ss.TLSCert + "'", ss.TLSCert,
"'" + ss.Port + "'", ss.Port,
"'" + ss.Address + "'", ss.Address,
"'" + ss.Log + "'", ss.Log,
boolToString(ss.EnableThumbnails), boolToString(ss.EnableThumbnails),
boolToString(ss.ResizePreview), boolToString(ss.ResizePreview),
boolToString(ss.EnableExec), boolToString(ss.EnableExec),
boolToString(ss.TypeDetectionByHeader), boolToString(ss.TypeDetectionByHeader),
"'" + ss.AuthHook + "'"} ss.AuthHook}
sql := fmt.Sprintf("INSERT INTO settings (%s) VALUES(%s)", strings.Join(columns, ","), strings.Join(values, ",")) tx, err := s.db.Begin()
_, err := s.db.Exec(sql) if checkError(err, "Fail to begin db transaction") {
if checkError(err, "Fail to insert for settings.Settings") {
return err return err
} }
return nil for i, field := range fields {
stmt, err := s.db.Prepare("INSERT INTO settings (key, value) VALUES(?,?)")
defer stmt.Close()
if checkError(err, "Fail to prepare statement") {
tx.Rollback()
break
}
_, err = stmt.Exec(field, values[i])
if checkError(err, "Fail to insert field "+field+" of settings") {
tx.Rollback()
break
}
}
err = tx.Commit()
if checkError(err, "Fail to commit") {
tx.Rollback()
return err
}
return err
} }
func SetSetting(db *sql.DB, key string, value string) error { func SetSetting(db *sql.DB, key string, value string) error {
@ -350,11 +390,21 @@ func GetSetting(db *sql.DB, key string) string {
func addSetting(db *sql.DB, key string, value string) error { func addSetting(db *sql.DB, key string, value string) error {
sql := "insert into settings(key, value) values('" + key + "', '" + value + "')" sql := "insert into settings(key, value) values('" + key + "', '" + value + "')"
_, err := db.Exec(sql) _, err := db.Exec(sql)
checkError(err, "Fail to addSetting")
return err return err
} }
func updateSetting(db *sql.DB, key string, value string) error { func updateSetting(db *sql.DB, key string, value string) error {
sql := "update settings set value = '" + value + "' where key = '" + key + "'" sql := "update settings set value = '" + value + "' where key = '" + key + "'"
_, err := db.Exec(sql) _, err := db.Exec(sql)
checkError(err, "Fail to updateSetting")
return err return err
} }
func HadSetting(db *sql.DB) bool {
key := GetSetting(db, "Key")
if key == "" {
return false
}
return true
}

View File

@ -16,8 +16,9 @@ type linkRecord interface {
} }
func InitShareTable(db *sql.DB) error { func InitShareTable(db *sql.DB) error {
sql := "create table if not exists share_links (path string, userid integer, expire integer, passwordhash string, token string)" sql := "create table if not exists share_links (hash string, path string, userid integer, expire integer, passwordhash string, token string)"
_, err := db.Exec(sql) _, err := db.Exec(sql)
checkError(err, "Fail to InitShareTable")
return err return err
} }
@ -88,10 +89,12 @@ func (s shareBackend) Gets(path string, id uint) ([]*share.Link, error) {
func (s shareBackend) Save(l *share.Link) error { func (s shareBackend) Save(l *share.Link) error {
sql := fmt.Sprintf("insert into share_links (hash, path, userid, expire, passwordhash, token) values('%s', '%s', %d, %d, '%s', '%s')", l.Hash, l.Path, l.UserID, l.Expire, l.PasswordHash, l.Token) sql := fmt.Sprintf("insert into share_links (hash, path, userid, expire, passwordhash, token) values('%s', '%s', %d, %d, '%s', '%s')", l.Hash, l.Path, l.UserID, l.Expire, l.PasswordHash, l.Token)
_, err := s.db.Exec(sql) _, err := s.db.Exec(sql)
checkError(err, "Fail to Save share")
return err return err
} }
func (s shareBackend) Delete(hash string) error { func (s shareBackend) Delete(hash string) error {
sql := fmt.Sprintf("DELETE FROM share_links WHERE hash='%s'", hash) sql := fmt.Sprintf("DELETE FROM share_links WHERE hash='%s'", hash)
_, err := s.db.Exec(sql) _, err := s.db.Exec(sql)
checkError(err, "Fail to Delete share")
return err return err
} }

View File

@ -124,6 +124,7 @@ func InitUserTable(db *sql.DB) error {
return err return err
} }
user, err := usersBackend{db}.Get("admin") user, err := usersBackend{db}.Get("admin")
checkError(err, "Fail to query admin user")
if user == nil { if user == nil {
log.Println("No admin exists") log.Println("No admin exists")
err := usersBackend{db}.Save(&adminUser) err := usersBackend{db}.Save(&adminUser)
@ -318,6 +319,7 @@ func (s usersBackend) DeleteByID(id uint) error {
logBacktrace() logBacktrace()
sql := "delete from users where id=" + strconv.Itoa(int(id)) sql := "delete from users where id=" + strconv.Itoa(int(id))
_, err := s.db.Exec(sql) _, err := s.db.Exec(sql)
checkError(err, "Fail to delete User by id")
return err return err
} }
@ -325,6 +327,7 @@ func (s usersBackend) DeleteByUsername(username string) error {
logBacktrace() logBacktrace()
sql := "delete from users where username='" + username + "'" sql := "delete from users where username='" + username + "'"
_, err := s.db.Exec(sql) _, err := s.db.Exec(sql)
checkError(err, "Fail to delete user by username")
return err return err
} }

View File

@ -55,3 +55,17 @@ func logBacktrace() {
funcs = reverse(funcs) funcs = reverse(funcs)
log.Printf("%s\n", strings.Join(funcs, " -> ")) log.Printf("%s\n", strings.Join(funcs, " -> "))
} }
func LogBacktrace() {
funcs := make([]string, 0)
for _, i := range []int{1, 2, 3} {
p := filepath.Base(getRuntimeFunctionName(uint(i)))
if len(p) > 0 {
funcs = append(funcs, p)
} else {
break
}
}
funcs = reverse(funcs)
log.Printf("%s\n", strings.Join(funcs, " -> "))
}