"crypto/sha512"
"encoding/hex"
"encoding/json"
+ "errors"
"hash"
"io"
"io/ioutil"
http.Error(w, "digest mismatch", http.StatusBadGateway)
return false
}
+ if digestStored, err := ioutil.ReadFile(path + "." + hashAlgo); err == nil &&
+ bytes.Compare(digest, digestStored) != 0 {
+ err = errors.New("stored digest mismatch")
+ log.Println("error", r.RemoteAddr, "pypi", filename, err)
+ os.Remove(dst.Name())
+ dst.Close()
+ http.Error(w, err.Error(), http.StatusInternalServerError)
+ return false
+ }
if !NoSync {
if err = dst.Sync(); err != nil {
os.Remove(dst.Name())
}
path = path + "." + hashAlgo
stat, err := os.Stat(path)
- if err == nil &&
- (mtimeExists && stat.ModTime().Truncate(time.Second).Equal(mtime)) {
+ if err == nil && (!mtimeExists ||
+ (mtimeExists && stat.ModTime().Truncate(time.Second).Equal(mtime))) {
continue
}
if err != nil && !os.IsNotExist(err) {