]> Cypherpunks.ru repositories - gocheese.git/blobdiff - list.go
More convenient trusted-host
[gocheese.git] / list.go
diff --git a/list.go b/list.go
index 7ca9b18f08e8bda641173b42d57c4dac3c97d988..779e348353b6e6638799933eaaaca47d092e3d4f 100644 (file)
--- a/list.go
+++ b/list.go
@@ -1,30 +1,28 @@
-/*
-GoCheese -- Python private package repository and caching proxy
-Copyright (C) 2019-2021 Sergey Matveev <stargrave@stargrave.org>
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, version 3 of the License.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
+// GoCheese -- Python private package repository and caching proxy
+// Copyright (C) 2019-2024 Sergey Matveev <stargrave@stargrave.org>
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 package main
 
 import (
        "bytes"
+       _ "embed"
        "encoding/hex"
        "errors"
        "fmt"
        "html/template"
        "io/fs"
-       "io/ioutil"
        "log"
        "net/http"
        "os"
@@ -37,38 +35,19 @@ import (
 
 // https://warehouse.pypa.io/api-reference/legacy.html
 var (
-       HTMLRootTmpl = template.Must(template.New("root").Parse(`<!DOCTYPE html>
-<html>
-  <head>
-    <meta name="pypi:repository-version" content="1.0">
-    <title>Simple index</title>
-  </head>
-  <body>{{$Refresh := .RefreshURLPath}}{{range .Packages}}
-    <a href="{{$Refresh}}{{.}}/">{{.}}</a><br/>
-{{- end}}
-  </body>
-</html>
-`))
-       HTMLReleasesTmpl = template.Must(template.New("list").Parse(`<!DOCTYPE html>
-<html>
-  <head>
-    <meta name="pypi:repository-version" content="1.0">
-    <title>Links for {{.PkgName}}</title>
-  </head>
-  <body>{{$Refresh := .RefreshURLPath}}{{$PkgName := .PkgName}}{{range .Releases}}
-    <a href="{{$Refresh}}{{$PkgName}}/{{.Filename -}}
-        #{{range $a, $d := .Digests}}{{$a}}={{$d}}{{end -}}
-        {{with .HasSig}} data-gpg-sig=true{{end}}">{{.Filename}}</a><br/>
-{{- end}}
-  </body>
-</html>
-`))
-       KnownExts = []string{".tar.bz2", ".tar.gz", ".whl", ".zip", ".egg",
+       //go:embed root.tmpl
+       HTMLRootTmplRaw string
+       HTMLRootTmpl    = template.Must(template.New("root").Parse(HTMLRootTmplRaw))
+
+       //go:embed list.tmpl
+       HTMLReleasesTmplRaw string
+       HTMLReleasesTmpl    = template.Must(template.New("list").Parse(HTMLReleasesTmplRaw))
+       KnownExts           = []string{".tar.bz2", ".tar.gz", ".whl", ".zip", ".egg",
                ".exe", ".dmg", ".msi", ".rpm", ".deb", ".tgz"}
 )
 
 func listRoot(w http.ResponseWriter, r *http.Request) {
-       files, err := ioutil.ReadDir(Root)
+       files, err := os.ReadDir(Root)
        if err != nil {
                log.Println("error", r.RemoteAddr, "root", err)
                http.Error(w, err.Error(), http.StatusInternalServerError)
@@ -115,7 +94,6 @@ func (a PkgReleaseInfoByName) Less(i, j int) bool {
 // Version format is too complicated: https://www.python.org/dev/peps/pep-0386/
 // So here is very simple parser working good enough for most packages
 func filenameToVersion(fn string) string {
-       fn = strings.TrimSuffix(fn, GPGSigExt)
        var trimmed string
        for _, ext := range KnownExts {
                trimmed = strings.TrimSuffix(fn, ext)
@@ -165,7 +143,7 @@ func listDir(pkgName string, doSize bool) (int64, []*PkgReleaseInfo, error) {
                                continue
                        }
                        delete(files, fn)
-                       digest, err := ioutil.ReadFile(filepath.Join(dirPath, fn))
+                       digest, err := os.ReadFile(filepath.Join(dirPath, fn))
                        if err != nil {
                                return 0, nil, err
                        }
@@ -195,10 +173,6 @@ func listDir(pkgName string, doSize bool) (int64, []*PkgReleaseInfo, error) {
                                        }
                                        delete(files, fnClean)
                                }
-                               if _, exists := files[fnClean+GPGSigExt]; exists {
-                                       release.HasSig = true
-                                       delete(files, fnClean+GPGSigExt)
-                               }
                        }
                        release.Digests[algo] = hex.EncodeToString(digest)
                }
@@ -213,7 +187,7 @@ func listDir(pkgName string, doSize bool) (int64, []*PkgReleaseInfo, error) {
                return 0, nil, err
        }
        serial := fi.ModTime().Unix()
-       if fi, err = os.Stat(filepath.Join(dirPath, MetadataFile)); err == nil {
+       if fi, err = os.Stat(filepath.Join(dirPath, MDFile)); err == nil {
                serial += fi.ModTime().Unix()
        }
        return serial, releases, nil
@@ -223,15 +197,15 @@ func serveListDir(
        w http.ResponseWriter,
        r *http.Request,
        pkgName string,
-       autorefresh, gpgUpdate bool,
+       autorefresh bool,
 ) {
        dirPath := filepath.Join(Root, pkgName)
        if autorefresh {
-               if !refreshDir(w, r, pkgName, "", gpgUpdate) {
+               if !refreshDir(w, r, pkgName, "") {
                        return
                }
        } else if _, err := os.Stat(dirPath); os.IsNotExist(err) &&
-               !refreshDir(w, r, pkgName, "", false) {
+               !refreshDir(w, r, pkgName, "") {
                return
        }
        serial, releases, err := listDir(pkgName, false)