]> Cypherpunks.ru repositories - gocheese.git/blobdiff - gocheese.go
Fix digest mismatch error
[gocheese.git] / gocheese.go
index 8a4a6e59da74fe6f35a0e5c2b648992096991a5e..c2a4d0b8028bd99367d8153a4a3f47d716c0a2ee 100644 (file)
@@ -151,12 +151,21 @@ func refreshDir(
                        http.Error(w, err.Error(), http.StatusInternalServerError)
                        return false
                }
+               if !strings.HasPrefix(pkgURL.Fragment, SHA256Prefix) {
+                       log.Println(r.RemoteAddr, "pypi", filename, "no SHA256 digest provided")
+                       http.Error(w, "no SHA256 digest provided", http.StatusBadGateway)
+                       return false
+               }
                digest, err = hex.DecodeString(strings.TrimPrefix(pkgURL.Fragment, SHA256Prefix))
                if err != nil {
                        http.Error(w, err.Error(), http.StatusBadGateway)
                        return false
                }
                pkgURL.Fragment = ""
+               uri = pkgURL.String()
+               if pkgURL.Host == "" {
+                       uri = *pypiURL + strings.TrimPrefix(uri, "/")
+               }
                path = filepath.Join(dirPath, filename)
                if filename == filenameGet {
                        if killed {
@@ -165,8 +174,9 @@ func refreshDir(
                                return false
                        }
                        log.Println(r.RemoteAddr, "pypi download", filename)
-                       resp, err = http.Get(pkgURL.String())
+                       resp, err = http.Get(uri)
                        if err != nil {
+                               log.Println(r.RemoteAddr, "pypi download error:", err.Error())
                                http.Error(w, err.Error(), http.StatusBadGateway)
                                return false
                        }
@@ -188,7 +198,7 @@ func refreshDir(
                                log.Println(r.RemoteAddr, "pypi", filename, "digest mismatch")
                                os.Remove(dst.Name())
                                dst.Close()
-                               http.Error(w, err.Error(), http.StatusBadGateway)
+                               http.Error(w, "digest mismatch", http.StatusBadGateway)
                                return false
                        }
                        if err = dst.Sync(); err != nil {
@@ -202,22 +212,35 @@ func refreshDir(
                                http.Error(w, err.Error(), http.StatusInternalServerError)
                                return false
                        }
+                       if err = DirSync(dirPath); err != nil {
+                               http.Error(w, err.Error(), http.StatusInternalServerError)
+                               return false
+                       }
                }
                if filename == filenameGet || gpgUpdate {
-                       if _, err = os.Stat(path); err == nil {
-                               if resp, err := http.Get(pkgURL.String() + GPGSigExt); err == nil {
-                                       sig, err := ioutil.ReadAll(resp.Body)
-                                       resp.Body.Close()
-                                       if err == nil {
-                                               if err = WriteFileSync(dirPath, path+GPGSigExt, sig); err != nil {
-                                                       http.Error(w, err.Error(), http.StatusInternalServerError)
-                                                       return false
-                                               }
-                                               log.Println(r.RemoteAddr, "pypi downloaded signature", filename)
-                                       }
-                               }
+                       if _, err = os.Stat(path); err != nil {
+                               goto GPGSigSkip
+                       }
+                       resp, err := http.Get(uri + GPGSigExt)
+                       if err != nil {
+                               goto GPGSigSkip
                        }
+                       if resp.StatusCode != http.StatusOK {
+                               resp.Body.Close()
+                               goto GPGSigSkip
+                       }
+                       sig, err := ioutil.ReadAll(resp.Body)
+                       resp.Body.Close()
+                       if err != nil {
+                               goto GPGSigSkip
+                       }
+                       if err = WriteFileSync(dirPath, path+GPGSigExt, sig); err != nil {
+                               http.Error(w, err.Error(), http.StatusInternalServerError)
+                               return false
+                       }
+                       log.Println(r.RemoteAddr, "pypi downloaded signature", filename)
                }
+       GPGSigSkip:
                path = path + SHA256Ext
                _, err = os.Stat(path)
                if err == nil {
@@ -426,6 +449,10 @@ func serveUpload(w http.ResponseWriter, r *http.Request) {
                        http.Error(w, err.Error(), http.StatusInternalServerError)
                        return
                }
+               if err = DirSync(dirPath); err != nil {
+                       http.Error(w, err.Error(), http.StatusInternalServerError)
+                       return
+               }
                if err = WriteFileSync(dirPath, path+SHA256Ext, digest); err != nil {
                        http.Error(w, err.Error(), http.StatusInternalServerError)
                        return
@@ -536,10 +563,10 @@ func goodIntegrity() bool {
                                log.Fatal(err)
                        }
                        if bytes.Compare(hasher.Sum(digest[:0]), data) == 0 {
-                               log.Println(pkgName, "GOOD")
+                               fmt.Println(pkgName, "GOOD")
                        } else {
                                isGood = false
-                               log.Println(pkgName, "BAD")
+                               fmt.Println(pkgName, "BAD")
                        }
                        hasher.Reset()
                }