filebrowser/backend/settings/config.go

181 lines
4.5 KiB
Go
Raw Permalink Normal View History

2023-09-01 14:00:02 +00:00
package settings
import (
2025-01-05 19:05:33 +00:00
"fmt"
2023-09-01 14:00:02 +00:00
"log"
"os"
2024-09-16 21:01:16 +00:00
"path/filepath"
2024-11-21 00:15:30 +00:00
"strings"
2023-09-01 14:00:02 +00:00
2025-02-16 14:07:38 +00:00
yaml "github.com/goccy/go-yaml"
2025-01-21 14:02:43 +00:00
"github.com/gtsteffaniak/filebrowser/backend/logger"
2024-12-17 00:01:55 +00:00
"github.com/gtsteffaniak/filebrowser/backend/users"
2025-01-05 19:05:33 +00:00
"github.com/gtsteffaniak/filebrowser/backend/version"
2023-09-01 14:00:02 +00:00
)
var Config Settings
2023-09-01 14:00:02 +00:00
2023-09-03 22:03:00 +00:00
func Initialize(configFile string) {
2025-01-21 14:02:43 +00:00
yamlData, err := loadConfigFile(configFile)
2025-01-26 00:31:40 +00:00
if err != nil && configFile != "config.yaml" {
logger.Fatal("Could not load specified config file: " + err.Error())
}
2025-01-21 14:02:43 +00:00
if err != nil {
logger.Warning(fmt.Sprintf("Could not load config file '%v', using default settings: %v", configFile, err))
}
Config = setDefaults()
2025-01-21 14:02:43 +00:00
err = yaml.Unmarshal(yamlData, &Config)
2023-09-01 14:00:02 +00:00
if err != nil {
2025-01-21 14:02:43 +00:00
logger.Fatal(fmt.Sprintf("Error unmarshaling YAML data: %v", err))
2023-09-03 17:28:00 +00:00
}
2025-01-27 00:21:12 +00:00
if len(Config.Server.Logging) == 0 {
Config.Server.Logging = []LogConfig{
{
Output: "stdout",
},
}
}
for _, logConfig := range Config.Server.Logging {
err = logger.SetupLogger(
logConfig.Output,
logConfig.Levels,
logConfig.ApiLevels,
logConfig.NoColors,
)
if err != nil {
log.Println("[ERROR] Failed to set up logger:", err)
}
}
2025-01-31 20:26:21 +00:00
if Config.Auth.Method != "" {
logger.Warning("The `auth.method` setting is deprecated and will be removed in a future version. Please use `auth.methods` instead.")
}
Config.UserDefaults.Perm = Config.UserDefaults.Permissions
2024-09-16 21:01:16 +00:00
// Convert relative path to absolute path
2025-01-05 19:05:33 +00:00
if len(Config.Server.Sources) > 0 {
2025-01-27 00:21:12 +00:00
if Config.Server.Root != "" {
logger.Warning("`server.root` is configured but will be ignored in favor of `server.sources`")
}
// TODO allow multiple sources not named default
2025-01-05 19:05:33 +00:00
for _, source := range Config.Server.Sources {
2025-01-21 14:02:43 +00:00
realPath, err2 := filepath.Abs(source.Path)
if err2 != nil {
logger.Fatal(fmt.Sprintf("Error getting source path: %v", err2))
2025-01-05 19:05:33 +00:00
}
source.Path = realPath
2025-01-26 00:31:40 +00:00
source.Name = "default"
Config.Server.Sources = []Source{source} // temporary set only one source
2025-01-05 19:05:33 +00:00
}
} else {
2025-01-21 14:02:43 +00:00
realPath, err2 := filepath.Abs(Config.Server.Root)
if err2 != nil {
logger.Fatal(fmt.Sprintf("Error getting source path: %v", err2))
2025-01-05 19:05:33 +00:00
}
2025-01-26 00:31:40 +00:00
Config.Server.Sources = []Source{
{
2025-01-05 19:05:33 +00:00
Name: "default",
Path: realPath,
},
}
2024-09-16 21:01:16 +00:00
}
2025-01-26 00:31:40 +00:00
2024-11-21 00:15:30 +00:00
baseurl := strings.Trim(Config.Server.BaseURL, "/")
if baseurl == "" {
Config.Server.BaseURL = "/"
} else {
Config.Server.BaseURL = "/" + baseurl + "/"
}
2025-01-05 19:05:33 +00:00
if !Config.Frontend.DisableDefaultLinks {
Config.Frontend.ExternalLinks = append(Config.Frontend.ExternalLinks, ExternalLink{
Text: fmt.Sprintf("(%v)", version.Version),
Title: version.CommitSHA,
Url: "https://github.com/gtsteffaniak/filebrowser/releases/",
})
Config.Frontend.ExternalLinks = append(Config.Frontend.ExternalLinks, ExternalLink{
Text: "Help",
Url: "https://github.com/gtsteffaniak/filebrowser/wiki",
})
}
2023-09-03 17:28:00 +00:00
}
2023-09-03 00:16:19 +00:00
2025-01-21 14:02:43 +00:00
func loadConfigFile(configFile string) ([]byte, error) {
2023-09-03 17:28:00 +00:00
// Open and read the YAML file
2023-09-03 22:03:00 +00:00
yamlFile, err := os.Open(configFile)
2023-09-03 17:28:00 +00:00
if err != nil {
2025-01-21 14:02:43 +00:00
return nil, err
2023-09-01 14:00:02 +00:00
}
defer yamlFile.Close()
2023-09-02 02:03:45 +00:00
stat, err := yamlFile.Stat()
if err != nil {
2025-01-21 14:02:43 +00:00
return nil, err
2023-09-02 02:03:45 +00:00
}
yamlData := make([]byte, stat.Size())
_, err = yamlFile.Read(yamlData)
2023-09-01 14:00:02 +00:00
if err != nil {
2025-01-21 14:02:43 +00:00
return nil, err
2023-09-01 14:00:02 +00:00
}
2025-01-21 14:02:43 +00:00
return yamlData, nil
2023-09-01 14:00:02 +00:00
}
2023-09-03 17:28:00 +00:00
func setDefaults() Settings {
return Settings{
2023-09-02 00:51:13 +00:00
Server: Server{
2023-09-04 02:21:25 +00:00
EnableThumbnails: true,
ResizePreview: false,
2023-09-03 22:03:00 +00:00
EnableExec: false,
2024-02-10 00:13:02 +00:00
Port: 80,
2023-09-03 17:28:00 +00:00
NumImageProcessors: 4,
2023-09-02 02:03:45 +00:00
BaseURL: "",
2023-09-03 22:03:00 +00:00
Database: "database.db",
2025-01-06 14:43:37 +00:00
Root: ".",
2023-09-02 00:51:13 +00:00
},
2023-09-01 14:00:02 +00:00
Auth: Auth{
2025-01-27 00:21:12 +00:00
AdminUsername: "admin",
AdminPassword: "admin",
2025-01-31 20:26:21 +00:00
TokenExpirationHours: 2,
2025-01-27 00:21:12 +00:00
Signup: false,
2023-09-01 14:00:02 +00:00
Recaptcha: Recaptcha{
Host: "",
},
2025-01-31 20:26:21 +00:00
Methods: LoginMethods{
ProxyAuth: ProxyAuthConfig{
Enabled: false,
CreateUser: false,
Header: "",
},
2025-02-01 13:10:46 +00:00
NoAuth: false,
PasswordAuth: PasswordAuthConfig{
Enabled: true,
MinLength: 5,
},
2025-01-31 20:26:21 +00:00
},
2023-09-01 14:00:02 +00:00
},
2025-01-13 00:50:22 +00:00
Frontend: Frontend{
Name: "FileBrowser Quantum",
},
2023-09-03 17:28:00 +00:00
UserDefaults: UserDefaults{
2025-02-16 14:07:38 +00:00
DisableOnlyOfficeExt: ".txt .csv .html",
StickySidebar: true,
Scope: ".",
LockPassword: false,
ShowHidden: false,
DarkMode: true,
DisableSettings: false,
ViewMode: "normal",
Locale: "en",
GallerySize: 3,
2024-11-21 00:15:30 +00:00
Permissions: users.Permissions{
Create: false,
Rename: false,
Modify: false,
Delete: false,
Share: false,
Download: false,
Admin: false,
2024-11-21 00:15:30 +00:00
Api: false,
2023-09-03 22:03:00 +00:00
},
2023-09-03 17:28:00 +00:00
},
2023-09-02 00:51:13 +00:00
}
}