X-Git-Url: http://www.git.cypherpunks.ru/?p=gocheese.git;a=blobdiff_plain;f=fileutils.go;h=34e6e748956922fb8d7a79ac234828514d3da960;hp=b37b99ce4c79aa01c2e56534c9a2887767e0e6a8;hb=HEAD;hpb=60834a0713d5dcc6a9911511cb8618ce7358c824 diff --git a/fileutils.go b/fileutils.go index b37b99c..9655d0a 100644 --- a/fileutils.go +++ b/fileutils.go @@ -1,19 +1,17 @@ -/* -GoCheese -- Python private package repository and caching proxy -Copyright (C) 2019-2021 Sergey Matveev - -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 . -*/ +// GoCheese -- Python private package repository and caching proxy +// Copyright (C) 2019-2024 Sergey Matveev +// +// 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 . package main @@ -22,17 +20,25 @@ import ( "net/http" "os" "path/filepath" - "strconv" "time" ) -var NoSync = os.Getenv("GOCHEESE_NO_SYNC") == "1" +var ( + NoSync = os.Getenv("GOCHEESE_NO_SYNC") == "1" + UmaskCur int +) func TempFile(dir string) (*os.File, error) { - // Assume that probability of suffix collision is negligible - suffix := strconv.FormatInt(time.Now().UnixNano()+int64(os.Getpid()), 16) - name := filepath.Join(dir, "nncp"+suffix) - return os.OpenFile(name, os.O_RDWR|os.O_CREATE|os.O_EXCL, os.FileMode(0666)) + tmp, err := os.CreateTemp(dir, "gocheese") + if err != nil { + return nil, err + } + err = os.Chmod(tmp.Name(), os.FileMode(0666&^UmaskCur)) + if err != nil { + tmp.Close() + return nil, err + } + return tmp, nil } func DirSync(dirPath string) error { @@ -79,7 +85,7 @@ func WriteFileSync(dirPath, filePath string, data []byte, mtime time.Time) error } func mkdirForPkg(w http.ResponseWriter, r *http.Request, pkgName string) bool { - path := filepath.Join(*Root, pkgName) + path := filepath.Join(Root, pkgName) if _, err := os.Stat(path); os.IsNotExist(err) { if err = os.Mkdir(path, os.FileMode(0777)); err != nil { log.Println("error", r.RemoteAddr, "mkdir", pkgName, err)