From f1d01ae465c42b023b8712b18aa54a08ed799807 Mon Sep 17 00:00:00 2001 From: Steve Date: Tue, 9 Jun 2020 12:16:12 -0400 Subject: [PATCH] directory listings are now properly URL encoded --- src/gemini.go | 2 +- src/server.go | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/gemini.go b/src/gemini.go index e223934..6e11156 100644 --- a/src/gemini.go +++ b/src/gemini.go @@ -107,7 +107,7 @@ func generateDirectory(path string) Response { //Found an index file, return that instead return generateFile(path + file.Name()) } else { - dirpage += fmt.Sprintf("=> %s %s\r\n", file.Name(), file.Name()) + dirpage += fmt.Sprintf("=> %s %s\r\n", url.PathEscape(file.Name()), file.Name()) } } return Response{STATUS_SUCCESS, "text/gemini", dirpage} diff --git a/src/server.go b/src/server.go index db1957d..793d537 100644 --- a/src/server.go +++ b/src/server.go @@ -189,7 +189,11 @@ func (s *Server) ParseRequest(req string, c *conn) Response { //now check cert stuff capsule := s.HostnameToConfig[u.Hostname()] - selector := capsule.RootDir + u.Path + unescaped_path, err := url.PathUnescape(u.Path) + if err != nil { + return Response{STATUS_BAD_REQUEST, "URL invalid", ""} + } + selector := capsule.RootDir + unescaped_path for _, idpath := range capsule.AccessControl.Identified { if strings.Contains(selector, capsule.RootDir+idpath) && c.Cert == nil { return Response{STATUS_CLIENT_CERTIFICATE_REQUIRED, "Please provide a client certificate", ""}