nyx/config/config.go

100 lines
2.5 KiB
Go

package config
import (
"flag"
"gopkg.in/yaml.v2"
"io/ioutil"
"os"
)
var configFileName = "./config.yml"
func init() {
flag.StringVar(&configFileName, "config", "./config.yml", "Config File Location")
}
type Config struct {
Site SiteConfig `yaml:"site"` // Site/HTML Configuration
DB DBConfig `yaml:"db"` // Database Configuration
HostnameWhiteList []string `yaml:"hosts"` // List of valid hostnames, ignored if empty
ListenOn string `yaml:"listen_on"` // Address & Port to use
MasterSecret string `yaml:"secret"` // Master Secret for keychain
DisableSecurity bool `yaml:"disable_security"` // Disables various flags to ensure non-HTTPS requests work
Captcha CaptchaConfig `yaml:"captcha"`
}
const (
CaptchaRecaptcha = "recaptcha"
CaptchaInternal = "internal"
CaptchaHybrid = "hybrid"
CaptchaDisabled = "disabled"
)
type CaptchaConfig struct {
Mode string `yaml:"mode"` // Captcha Mode
Settings map[string]string `yaml:"settings,inline"`
}
type SiteConfig struct {
Title string `yaml:"title"` // Site Title
Description string `yaml:"description"` // Site Description
PrimaryColor string `yaml:"color"` // Primary Color for Size
}
type DBConfig struct {
File string `yaml:"file"`
ReadOnly bool `yaml:"read_only"`
AdminSocketEnable bool `yaml:"enable_admin_socket"`
AdminSocketPath string `yaml:"admin_socket"`
}
func Load() (*Config, error) {
var config = &Config{
Site: SiteConfig{
Title: "NyxChan",
PrimaryColor: "#78909c",
Description: "NyxChan Default Configuration",
},
DB: DBConfig{
File: ":memory:",
ReadOnly: false,
AdminSocketEnable: false,
AdminSocketPath: "./nyx.sock",
},
HostnameWhiteList: []string{},
ListenOn: ":8080",
MasterSecret: "changeme",
DisableSecurity: true,
Captcha: CaptchaConfig{
Mode: CaptchaDisabled,
},
}
if _, err := os.Stat(configFileName); os.IsNotExist(err) {
return config, nil
}
dat, err := ioutil.ReadFile(configFileName)
if err != nil {
return nil, err
}
err = yaml.Unmarshal(dat, config)
if err != nil {
return nil, err
}
return config, nil
}
func (c Config) IsHostNameValid(hostname string) bool {
if c.HostnameWhiteList == nil {
return true
}
if len(c.HostnameWhiteList) == 0 {
return true
}
for _, v := range c.HostnameWhiteList {
if v == hostname {
return true
}
}
return false
}