GoBlog/config.go

281 lines
9.7 KiB
Go
Raw Normal View History

2020-07-28 19:17:07 +00:00
package main
import (
2020-10-06 17:07:48 +00:00
"errors"
2020-12-24 10:00:16 +00:00
"net/url"
2020-10-14 19:20:17 +00:00
"strings"
2020-10-06 17:07:48 +00:00
2020-07-28 19:17:07 +00:00
"github.com/spf13/viper"
)
type config struct {
2020-10-15 18:54:43 +00:00
Server *configServer `mapstructure:"server"`
Db *configDb `mapstructure:"database"`
Cache *configCache `mapstructure:"cache"`
DefaultBlog string `mapstructure:"defaultblog"`
Blogs map[string]*configBlog `mapstructure:"blogs"`
User *configUser `mapstructure:"user"`
Hooks *configHooks `mapstructure:"hooks"`
Micropub *configMicropub `mapstructure:"micropub"`
PathRedirects []*configRegexRedirect `mapstructure:"pathRedirects"`
ActivityPub *configActivityPub `mapstructure:"activityPub"`
Notifications *configNotifications `mapstructure:"notifications"`
2021-02-27 07:31:06 +00:00
PrivateMode *configPrivateMode `mapstructure:"privateMode"`
2020-07-28 19:17:07 +00:00
}
type configServer struct {
2021-02-16 20:27:52 +00:00
Logging bool `mapstructure:"logging"`
LogFile string `mapstructure:"logFile"`
Port int `mapstructure:"port"`
PublicAddress string `mapstructure:"publicAddress"`
ShortPublicAddress string `mapstructure:"shortPublicAddress"`
PublicHTTPS bool `mapstructure:"publicHttps"`
2021-03-19 09:10:47 +00:00
Tor bool `mapstructure:"tor"`
2021-02-16 20:27:52 +00:00
SecurityHeaders bool `mapstructure:"securityHeaders"`
CSPDomains []string `mapstructure:"cspDomains"`
LetsEncryptMail string `mapstructure:"letsEncryptMail"`
JWTSecret string `mapstructure:"jwtSecret"`
2020-12-24 10:00:16 +00:00
publicHostname string
shortPublicHostname string
2020-07-28 19:17:07 +00:00
}
type configDb struct {
2020-08-04 17:42:09 +00:00
File string `mapstructure:"file"`
2020-07-28 19:17:07 +00:00
}
2020-07-29 20:45:26 +00:00
type configCache struct {
2020-11-20 14:33:20 +00:00
Enable bool `mapstructure:"enable"`
Expiration int `mapstructure:"expiration"`
2020-07-29 20:45:26 +00:00
}
2020-07-31 13:48:01 +00:00
type configBlog struct {
2020-11-09 18:34:22 +00:00
Path string `mapstructure:"path"`
Lang string `mapstructure:"lang"`
Title string `mapstructure:"title"`
Description string `mapstructure:"description"`
Pagination int `mapstructure:"pagination"`
2020-11-15 10:34:48 +00:00
DefaultSection string `mapstructure:"defaultsection"`
2020-11-09 18:34:22 +00:00
Sections map[string]*section `mapstructure:"sections"`
Taxonomies []*taxonomy `mapstructure:"taxonomies"`
Menus map[string]*menu `mapstructure:"menus"`
Photos *photos `mapstructure:"photos"`
2020-11-15 10:34:48 +00:00
Search *search `mapstructure:"search"`
2021-01-04 19:29:49 +00:00
BlogStats *blogStats `mapstructure:"blogStats"`
2020-11-09 18:34:22 +00:00
CustomPages []*customPage `mapstructure:"custompages"`
2020-11-09 18:54:06 +00:00
Telegram *configTelegram `mapstructure:"telegram"`
2020-12-23 15:53:10 +00:00
PostAsHome bool `mapstructure:"postAsHome"`
RandomPost *randomPost `mapstructure:"randomPost"`
2021-01-23 16:24:47 +00:00
Comments *comments `mapstructure:"comments"`
}
type section struct {
2020-10-06 17:07:48 +00:00
Name string `mapstructure:"name"`
Title string `mapstructure:"title"`
Description string `mapstructure:"description"`
PathTemplate string `mapstructure:"pathtemplate"`
}
type taxonomy struct {
Name string `mapstructure:"name"`
Title string `mapstructure:"title"`
Description string `mapstructure:"description"`
2020-07-31 13:48:01 +00:00
}
2020-09-19 11:37:58 +00:00
type menu struct {
Items []*menuItem `mapstructure:"items"`
}
type menuItem struct {
Title string `mapstructure:"title"`
Link string `mapstructure:"link"`
}
2020-09-21 16:03:05 +00:00
type photos struct {
Enabled bool `mapstructure:"enabled"`
Parameter string `mapstructure:"parameter"`
Path string `mapstructure:"path"`
Title string `mapstructure:"title"`
Description string `mapstructure:"description"`
}
2020-11-15 10:34:48 +00:00
type search struct {
Enabled bool `mapstructure:"enabled"`
Path string `mapstructure:"path"`
Title string `mapstructure:"title"`
Description string `mapstructure:"description"`
Placeholder string `mapstructure:"placeholder"`
}
2021-01-04 19:29:49 +00:00
type blogStats struct {
Enabled bool `mapstructure:"enabled"`
Path string `mapstructure:"path"`
Title string `mapstructure:"title"`
Description string `mapstructure:"description"`
}
2020-10-13 11:40:16 +00:00
type customPage struct {
2020-11-20 14:33:20 +00:00
Path string `mapstructure:"path"`
Template string `mapstructure:"template"`
Cache bool `mapstructure:"cache"`
CacheExpiration int `mapstructure:"cacheExpiration"`
Data *interface{} `mapstructure:"data"`
2020-10-13 11:40:16 +00:00
}
type randomPost struct {
Enabled bool `mapstructure:"enabled"`
Path string `mapstructure:"path"`
}
2021-01-23 16:24:47 +00:00
type comments struct {
Enabled bool `mapstructure:"enabled"`
}
type configUser struct {
2021-02-28 07:57:15 +00:00
Nick string `mapstructure:"nick"`
Name string `mapstructure:"name"`
Password string `mapstructure:"password"`
TOTP string `mapstructure:"totp"`
AppPasswords []*appPassword `mapstructure:"appPasswords"`
Picture string `mapstructure:"picture"`
Email string `mapstructure:"email"`
Link string `mapstructure:"link"`
Identities []string `mapstructure:"identities"`
}
type appPassword struct {
Username string `mapstructure:"username"`
Password string `mapstructure:"password"`
}
type configHooks struct {
Shell string `mapstructure:"shell"`
Hourly []string `mapstructure:"hourly"`
PreStart []string `mapstructure:"prestart"`
2020-10-19 18:25:30 +00:00
// Can use template
PostPost []string `mapstructure:"postpost"`
PostUpdate []string `mapstructure:"postupdate"`
2020-10-19 18:25:30 +00:00
PostDelete []string `mapstructure:"postdelete"`
}
2020-10-06 17:07:48 +00:00
type configMicropub struct {
2020-10-14 19:20:17 +00:00
CategoryParam string `mapstructure:"categoryParam"`
ReplyParam string `mapstructure:"replyParam"`
LikeParam string `mapstructure:"likeParam"`
BookmarkParam string `mapstructure:"bookmarkParam"`
AudioParam string `mapstructure:"audioParam"`
PhotoParam string `mapstructure:"photoParam"`
PhotoDescriptionParam string `mapstructure:"photoDescriptionParam"`
MediaStorage *configMicropubMedia `mapstructure:"mediaStorage"`
}
type configMicropubMedia struct {
MediaURL string `mapstructure:"mediaUrl"`
BunnyStorageKey string `mapstructure:"bunnyStorageKey"`
BunnyStorageName string `mapstructure:"bunnyStorageName"`
TinifyKey string `mapstructure:"tinifyKey"`
ShortPixelKey string `mapstructure:"shortPixelKey"`
2020-10-06 17:07:48 +00:00
}
2020-10-15 18:54:43 +00:00
type configRegexRedirect struct {
From string `mapstructure:"from"`
To string `mapstructure:"to"`
2020-11-10 06:53:08 +00:00
Type int `mapstructure:"type"`
2020-10-15 18:54:43 +00:00
}
type configActivityPub struct {
Enabled bool `mapstructure:"enabled"`
KeyPath string `mapstructure:"keyPath"`
TagsTaxonomies []string `mapstructure:"tagsTaxonomies"`
}
type configNotifications struct {
Telegram *configTelegram `mapstructure:"telegram"`
}
type configTelegram struct {
2021-02-08 19:33:48 +00:00
Enabled bool `mapstructure:"enabled"`
ChatID string `mapstructure:"chatId"`
BotToken string `mapstructure:"botToken"`
InstantViewHash string `mapstructure:"instantViewHash"`
}
2021-02-27 07:31:06 +00:00
type configPrivateMode struct {
Enabled bool `mapstructure:"enabled"`
}
2020-08-04 17:42:09 +00:00
var appConfig = &config{}
2020-07-28 19:17:07 +00:00
func initConfig() error {
viper.SetConfigName("config")
viper.AddConfigPath("./config/")
err := viper.ReadInConfig()
if err != nil {
return err
}
// Defaults
2020-08-04 17:42:09 +00:00
viper.SetDefault("server.logging", false)
2020-11-03 17:58:32 +00:00
viper.SetDefault("server.logFile", "data/access.log")
2020-08-04 17:42:09 +00:00
viper.SetDefault("server.port", 8080)
viper.SetDefault("server.publicAddress", "http://localhost:8080")
2020-08-04 17:42:09 +00:00
viper.SetDefault("server.publicHttps", false)
viper.SetDefault("database.file", "data/db.sqlite")
viper.SetDefault("cache.enable", true)
viper.SetDefault("cache.expiration", 600)
viper.SetDefault("user.nick", "admin")
viper.SetDefault("user.password", "secret")
viper.SetDefault("hooks.shell", "/bin/bash")
2020-10-06 17:07:48 +00:00
viper.SetDefault("micropub.categoryParam", "tags")
viper.SetDefault("micropub.replyParam", "replylink")
viper.SetDefault("micropub.likeParam", "likelink")
viper.SetDefault("micropub.bookmarkParam", "link")
viper.SetDefault("micropub.audioParam", "audio")
viper.SetDefault("micropub.photoParam", "images")
viper.SetDefault("micropub.photoDescriptionParam", "imagealts")
viper.SetDefault("activityPub.keyPath", "data/private.pem")
viper.SetDefault("activityPub.tagsTaxonomies", []string{"tags"})
2020-08-04 17:42:09 +00:00
// Unmarshal config
err = viper.Unmarshal(appConfig)
if err != nil {
return err
}
2020-10-06 17:07:48 +00:00
// Check config
2020-12-24 10:00:16 +00:00
publicURL, err := url.Parse(appConfig.Server.PublicAddress)
if err != nil {
return err
}
appConfig.Server.publicHostname = publicURL.Hostname()
if appConfig.Server.ShortPublicAddress != "" {
shortPublicURL, err := url.Parse(appConfig.Server.ShortPublicAddress)
if err != nil {
return err
}
appConfig.Server.shortPublicHostname = shortPublicURL.Hostname()
}
2020-12-15 16:40:14 +00:00
if appConfig.Server.JWTSecret == "" {
return errors.New("no JWT secret configured")
}
2020-10-06 17:07:48 +00:00
if len(appConfig.Blogs) == 0 {
return errors.New("no blog configured")
}
if len(appConfig.DefaultBlog) == 0 || appConfig.Blogs[appConfig.DefaultBlog] == nil {
return errors.New("no default blog or default blog not present")
}
2020-10-14 19:20:17 +00:00
if appConfig.Micropub.MediaStorage != nil {
if appConfig.Micropub.MediaStorage.MediaURL == "" ||
appConfig.Micropub.MediaStorage.BunnyStorageKey == "" ||
appConfig.Micropub.MediaStorage.BunnyStorageName == "" {
2021-01-10 14:59:43 +00:00
appConfig.Micropub.MediaStorage.BunnyStorageKey = ""
appConfig.Micropub.MediaStorage.BunnyStorageName = ""
2020-10-14 19:20:17 +00:00
}
2021-01-10 14:59:43 +00:00
appConfig.Micropub.MediaStorage.MediaURL = strings.TrimSuffix(appConfig.Micropub.MediaStorage.MediaURL, "/")
2020-10-14 19:20:17 +00:00
}
2021-02-27 07:31:06 +00:00
if pm := appConfig.PrivateMode; pm != nil && pm.Enabled {
appConfig.ActivityPub = &configActivityPub{Enabled: false}
}
2020-07-28 19:17:07 +00:00
return nil
}
2021-02-20 21:45:38 +00:00
func httpsConfigured() bool {
return appConfig.Server.PublicHTTPS || appConfig.Server.SecurityHeaders || strings.HasPrefix(appConfig.Server.PublicAddress, "https")
}