mirror of
https://github.com/writefreely/writefreely
synced 2025-02-26 03:37:11 +00:00
This adds a "Reader" section of the site for admins who want to enable it for their instance. That means visitors can go to /read and see who has publicly shared their writing. They can also follow all public posts via RSS by going to /read/feed/. Writers on an instance with this `local_timeline` setting enabled can publish to the timeline by going into their blog settings and choosing the "Public" visibility setting. The `local_timeline` feature is disabled by default, as is the Public setting on writer blogs. Enabling it adds a "Reader" navigation item and enables the reader endpoints. This feature will also consume more memory, as public posts are cached in memory for 10 minutes. These changes include code ported over from Read.Write.as, and thus include some experimental features like filtering public posts by tags and authors. These features aren't well-tested or complete. Closes T554
136 lines
2.8 KiB
Go
136 lines
2.8 KiB
Go
package config
|
|
|
|
import (
|
|
"gopkg.in/ini.v1"
|
|
)
|
|
|
|
const (
|
|
FileName = "config.ini"
|
|
)
|
|
|
|
type (
|
|
ServerCfg struct {
|
|
HiddenHost string `ini:"hidden_host"`
|
|
Port int `ini:"port"`
|
|
Bind string `ini:"bind"`
|
|
|
|
TLSCertPath string `ini:"tls_cert_path"`
|
|
TLSKeyPath string `ini:"tls_key_path"`
|
|
|
|
Dev bool `ini:"-"`
|
|
}
|
|
|
|
DatabaseCfg struct {
|
|
Type string `ini:"type"`
|
|
FileName string `ini:"filename"`
|
|
User string `ini:"username"`
|
|
Password string `ini:"password"`
|
|
Database string `ini:"database"`
|
|
Host string `ini:"host"`
|
|
Port int `ini:"port"`
|
|
}
|
|
|
|
AppCfg struct {
|
|
SiteName string `ini:"site_name"`
|
|
SiteDesc string `ini:"site_description"`
|
|
Host string `ini:"host"`
|
|
|
|
// Site appearance
|
|
Theme string `ini:"theme"`
|
|
JSDisabled bool `ini:"disable_js"`
|
|
WebFonts bool `ini:"webfonts"`
|
|
|
|
// Users
|
|
SingleUser bool `ini:"single_user"`
|
|
OpenRegistration bool `ini:"open_registration"`
|
|
MinUsernameLen int `ini:"min_username_len"`
|
|
MaxBlogs int `ini:"max_blogs"`
|
|
|
|
// Federation
|
|
Federation bool `ini:"federation"`
|
|
PublicStats bool `ini:"public_stats"`
|
|
Private bool `ini:"private"`
|
|
|
|
// Additional functions
|
|
LocalTimeline bool `ini:"local_timeline"`
|
|
}
|
|
|
|
Config struct {
|
|
Server ServerCfg `ini:"server"`
|
|
Database DatabaseCfg `ini:"database"`
|
|
App AppCfg `ini:"app"`
|
|
}
|
|
)
|
|
|
|
func New() *Config {
|
|
c := &Config{
|
|
Server: ServerCfg{
|
|
Port: 8080,
|
|
Bind: "localhost", /* IPV6 support when not using localhost? */
|
|
},
|
|
App: AppCfg{
|
|
Host: "http://localhost:8080",
|
|
Theme: "write",
|
|
WebFonts: true,
|
|
SingleUser: true,
|
|
MinUsernameLen: 3,
|
|
MaxBlogs: 1,
|
|
Federation: true,
|
|
PublicStats: true,
|
|
},
|
|
}
|
|
c.UseMySQL(true)
|
|
return c
|
|
}
|
|
|
|
// UseMySQL resets the Config's Database to use default values for a MySQL setup.
|
|
func (cfg *Config) UseMySQL(fresh bool) {
|
|
cfg.Database.Type = "mysql"
|
|
if fresh {
|
|
cfg.Database.Host = "localhost"
|
|
cfg.Database.Port = 3306
|
|
}
|
|
}
|
|
|
|
// UseSQLite resets the Config's Database to use default values for a SQLite setup.
|
|
func (cfg *Config) UseSQLite(fresh bool) {
|
|
cfg.Database.Type = "sqlite3"
|
|
if fresh {
|
|
cfg.Database.FileName = "writefreely.db"
|
|
}
|
|
}
|
|
|
|
func (cfg *Config) IsSecureStandalone() bool {
|
|
return cfg.Server.Port == 443 && cfg.Server.TLSCertPath != "" && cfg.Server.TLSKeyPath != ""
|
|
}
|
|
|
|
func Load(fname string) (*Config, error) {
|
|
if fname == "" {
|
|
fname = FileName
|
|
}
|
|
cfg, err := ini.Load(fname)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// Parse INI file
|
|
uc := &Config{}
|
|
err = cfg.MapTo(uc)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return uc, nil
|
|
}
|
|
|
|
func Save(uc *Config, fname string) error {
|
|
cfg := ini.Empty()
|
|
err := ini.ReflectFrom(cfg, uc)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if fname == "" {
|
|
fname = FileName
|
|
}
|
|
return cfg.SaveTo(fname)
|
|
}
|