From 14ef3be6fe38ea697c2f09be545d0fbb73c1d832 Mon Sep 17 00:00:00 2001 From: Adnan Maolood Date: Sat, 31 Oct 2020 16:33:56 -0400 Subject: server: Automatically write new certificates to disk --- server.go | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) (limited to 'server.go') diff --git a/server.go b/server.go index 1834bfa..41ddd75 100644 --- a/server.go +++ b/server.go @@ -39,7 +39,7 @@ type responderKey struct { // // Patterns must be in the form of hostname or scheme://hostname // (e.g. gemini://example.com). -// If no scheme is specified, a default scheme of gemini:// is assumed. +// If no scheme is specified, a default scheme of gemini:// is implied. // // Wildcard patterns are supported (e.g. *.example.com). // To register a certificate for a wildcard hostname, call Certificates.Add: @@ -132,27 +132,29 @@ func (s *Server) Serve(l net.Listener) error { } func (s *Server) getCertificate(h *tls.ClientHelloInfo) (*tls.Certificate, error) { - hostname := h.ServerName - cert, err := s.Certificates.Lookup(hostname) - if err == ErrCertificateUnknown { + cert, err := s.getCertificateFor(h.ServerName) + if err != nil { + // Try wildcard wildcard := strings.SplitN(h.ServerName, ".", 2) if len(wildcard) == 2 { - cert, err = s.Certificates.Lookup("*." + wildcard[1]) + cert, err = s.getCertificateFor("*." + wildcard[1]) } } + return cert, err +} - switch err { - case ErrCertificateUnknown: - if _, ok := s.hosts[hostname]; !ok { - break - } - fallthrough +func (s *Server) getCertificateFor(hostname string) (*tls.Certificate, error) { + if _, ok := s.hosts[hostname]; !ok { + return nil, ErrCertificateUnknown + } + cert, err := s.Certificates.Lookup(hostname) - case ErrCertificateExpired: + switch err { + case ErrCertificateUnknown, ErrCertificateExpired: if s.CreateCertificate != nil { - cert, err := s.CreateCertificate(h.ServerName) + cert, err := s.CreateCertificate(hostname) if err == nil { - s.Certificates.Add(h.ServerName, cert) + s.Certificates.Add(hostname, cert) } return &cert, err } -- cgit v1.2.3