fix: sql.settings db
This commit is contained in:
parent
d473569e94
commit
f7910d47f9
@ -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)
|
||||||
|
|||||||
@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
||||||
|
}
|
||||||
|
|||||||
@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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)
|
||||||
@ -276,7 +277,7 @@ func (s usersBackend) insertUser(user *users.User) error {
|
|||||||
}
|
}
|
||||||
columns := []string{}
|
columns := []string{}
|
||||||
specs := []string{}
|
specs := []string{}
|
||||||
for _,c := range columnSpec {
|
for _, c := range columnSpec {
|
||||||
columns = append(columns, c[0])
|
columns = append(columns, c[0])
|
||||||
specs = append(specs, c[1])
|
specs = append(specs, c[1])
|
||||||
}
|
}
|
||||||
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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, " -> "))
|
||||||
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user