source: code/trunk/config/config.go@ 629

Last change on this file since 629 was 612, checked in by contact, 4 years ago

Add max-user-networks config option

File size: 2.7 KB
Line 
1package config
2
3import (
4 "fmt"
5 "net"
6 "os"
7 "strconv"
8
9 "git.sr.ht/~emersion/go-scfg"
10)
11
12type IPSet []*net.IPNet
13
14func (set IPSet) Contains(ip net.IP) bool {
15 for _, n := range set {
16 if n.Contains(ip) {
17 return true
18 }
19 }
20 return false
21}
22
23// loopbackIPs contains the loopback networks 127.0.0.0/8 and ::1/128.
24var loopbackIPs = IPSet{
25 &net.IPNet{
26 IP: net.IP{127, 0, 0, 0},
27 Mask: net.CIDRMask(8, 32),
28 },
29 &net.IPNet{
30 IP: net.IPv6loopback,
31 Mask: net.CIDRMask(128, 128),
32 },
33}
34
35type TLS struct {
36 CertPath, KeyPath string
37}
38
39type Server struct {
40 Listen []string
41 Hostname string
42 TLS *TLS
43
44 SQLDriver string
45 SQLSource string
46 LogPath string
47
48 HTTPOrigins []string
49 AcceptProxyIPs IPSet
50
51 MaxUserNetworks int
52}
53
54func Defaults() *Server {
55 hostname, err := os.Hostname()
56 if err != nil {
57 hostname = "localhost"
58 }
59 return &Server{
60 Hostname: hostname,
61 SQLDriver: "sqlite3",
62 SQLSource: "soju.db",
63 MaxUserNetworks: -1,
64 }
65}
66
67func Load(path string) (*Server, error) {
68 cfg, err := scfg.Load(path)
69 if err != nil {
70 return nil, err
71 }
72 return parse(cfg)
73}
74
75func parse(cfg scfg.Block) (*Server, error) {
76 srv := Defaults()
77 for _, d := range cfg {
78 switch d.Name {
79 case "listen":
80 var uri string
81 if err := d.ParseParams(&uri); err != nil {
82 return nil, err
83 }
84 srv.Listen = append(srv.Listen, uri)
85 case "hostname":
86 if err := d.ParseParams(&srv.Hostname); err != nil {
87 return nil, err
88 }
89 case "tls":
90 tls := &TLS{}
91 if err := d.ParseParams(&tls.CertPath, &tls.KeyPath); err != nil {
92 return nil, err
93 }
94 srv.TLS = tls
95 case "db":
96 if err := d.ParseParams(&srv.SQLDriver, &srv.SQLSource); err != nil {
97 return nil, err
98 }
99 case "log":
100 var driver string
101 if err := d.ParseParams(&driver, &srv.LogPath); err != nil {
102 return nil, err
103 }
104 if driver != "fs" {
105 return nil, fmt.Errorf("directive %q: unknown driver %q", d.Name, driver)
106 }
107 case "http-origin":
108 srv.HTTPOrigins = d.Params
109 case "accept-proxy-ip":
110 srv.AcceptProxyIPs = nil
111 for _, s := range d.Params {
112 if s == "localhost" {
113 srv.AcceptProxyIPs = append(srv.AcceptProxyIPs, loopbackIPs...)
114 continue
115 }
116 _, n, err := net.ParseCIDR(s)
117 if err != nil {
118 return nil, fmt.Errorf("directive %q: failed to parse CIDR: %v", d.Name, err)
119 }
120 srv.AcceptProxyIPs = append(srv.AcceptProxyIPs, n)
121 }
122 case "max-user-networks":
123 var max string
124 if err := d.ParseParams(&max); err != nil {
125 return nil, err
126 }
127 var err error
128 if srv.MaxUserNetworks, err = strconv.Atoi(max); err != nil {
129 return nil, fmt.Errorf("directive %q: %v", d.Name, err)
130 }
131 default:
132 return nil, fmt.Errorf("unknown directive %q", d.Name)
133 }
134 }
135
136 return srv, nil
137}
Note: See TracBrowser for help on using the repository browser.