diff options
| -rw-r--r-- | gemini.go | 7 | ||||
| -rw-r--r-- | parse.go | 14 | ||||
| -rw-r--r-- | types.go | 3 |
3 files changed, 19 insertions, 5 deletions
@@ -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 } } @@ -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 { @@ -50,6 +50,9 @@ type Server struct { TLS *tls.Config Hostnames []string Routes []RouteDirective + + tlsKeyFile string + tlsCertFile string } type Auth struct { |
