summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortjpcc <tjp@ctrl-c.club>2023-10-10 18:30:22 -0600
committertjpcc <tjp@ctrl-c.club>2023-10-10 18:30:22 -0600
commit059d44027018f1eaa69d3a0f9779da78eb651ced (patch)
tree102d7c2a3252081e37066057ee06466a6c2be3a6
parent04450c5f1d5fb04e95b614116fa2987ae98a8a12 (diff)
identify and error on conflicting servertls directives on merged gemini servers
fixes #7
-rw-r--r--gemini.go7
-rw-r--r--parse.go14
-rw-r--r--types.go3
3 files changed, 19 insertions, 5 deletions
diff --git a/gemini.go b/gemini.go
index 975b62b..f48f3ac 100644
--- a/gemini.go
+++ b/gemini.go
@@ -59,9 +59,16 @@ func buildGeminiServers(servers []Server, config *Configuration) ([]sr.Server, e
}
var tlsConfig *tls.Config
+ var keyfile, certfile string
for _, config := range configs {
+ if (keyfile != "" && config.tlsKeyFile == keyfile) || (certfile != "" && config.tlsCertFile == certfile) {
+ return nil, errors.New("conflicting 'servertls' directives for gemini server")
+ }
+
if config.TLS != nil {
tlsConfig = config.TLS
+ keyfile = config.tlsKeyFile
+ certfile = config.tlsCertFile
break
}
}
diff --git a/parse.go b/parse.go
index 15c5877..886aa2d 100644
--- a/parse.go
+++ b/parse.go
@@ -241,7 +241,10 @@ func parseServerDirectives(server *Server, buf *bufio.Reader) error {
case "host":
server.Hostnames = append(server.Hostnames, parseHost(rest)...)
case "servertls":
- server.TLS, err = parseServerTLS(rest)
+ if server.TLS != nil {
+ return fmt.Errorf("duplicate servertls directives in %s server", server.Type)
+ }
+ server.tlsCertFile, server.tlsKeyFile, server.TLS, err = parseServerTLS(rest)
if err != nil {
return err
}
@@ -302,20 +305,21 @@ func validateRoute(serverType string, dir *RouteDirective) error {
return nil
}
-func parseServerTLS(text string) (*tls.Config, error) {
+func parseServerTLS(text string) (string, string, *tls.Config, error) {
spl := strings.Split(text, " ")
if len(spl) != 4 {
- return nil, errors.New("invalid 'servertls' directive")
+ return "", "", nil, errors.New("invalid 'servertls' directive")
}
if spl[0] == "cert" {
spl[0], spl[1], spl[2], spl[3] = spl[2], spl[3], spl[0], spl[1]
}
if spl[0] != "key" || spl[2] != "cert" {
- return nil, errors.New("invalid 'servertls' directive")
+ return "", "", nil, errors.New("invalid 'servertls' directive")
}
- return gemini.FileTLS(spl[3], spl[1])
+ conf, err := gemini.FileTLS(spl[3], spl[1])
+ return spl[3], spl[1], conf, err
}
func parseHost(text string) []string {
diff --git a/types.go b/types.go
index 9523d9c..392b955 100644
--- a/types.go
+++ b/types.go
@@ -50,6 +50,9 @@ type Server struct {
TLS *tls.Config
Hostnames []string
Routes []RouteDirective
+
+ tlsKeyFile string
+ tlsCertFile string
}
type Auth struct {