X-Git-Url: http://www.git.cypherpunks.ru/?p=gocheese.git;a=blobdiff_plain;f=upload.go;h=a72d779257dcc5333465b3cb00c2524e34c1eb89;hp=cd98df5ba5954db50c2889393c882c3b77be4994;hb=60834a0713d5dcc6a9911511cb8618ce7358c824;hpb=948543909470b983c001f13fb267a64070dd20ae diff --git a/upload.go b/upload.go index cd98df5..a72d779 100644 --- a/upload.go +++ b/upload.go @@ -29,8 +29,15 @@ import ( "net/http" "os" "path/filepath" + "regexp" + "strings" + "time" + + "go.cypherpunks.ru/recfile" ) +var NormalizationRe = regexp.MustCompilePOSIX("[-_.]+") + func serveUpload(w http.ResponseWriter, r *http.Request) { // Authentication username, password, ok := r.BasicAuth() @@ -59,8 +66,8 @@ func serveUpload(w http.ResponseWriter, r *http.Request) { http.Error(w, "single name is expected in request", http.StatusBadRequest) return } - pkgName := normalizationRe.ReplaceAllString(pkgNames[0], "-") - dirPath := filepath.Join(*root, pkgName) + pkgName := strings.ToLower(NormalizationRe.ReplaceAllString(pkgNames[0], "-")) + dirPath := filepath.Join(*Root, pkgName) var digestExpected []byte if digestExpectedHex, exists := r.MultipartForm.Value["sha256_digest"]; exists { digestExpected, err = hex.DecodeString(digestExpectedHex[0]) @@ -70,6 +77,7 @@ func serveUpload(w http.ResponseWriter, r *http.Request) { } } gpgSigsExpected := make(map[string]struct{}) + now := time.Now().UTC() // Checking is it internal package if _, err = os.Stat(filepath.Join(dirPath, InternalFlag)); err != nil { @@ -152,7 +160,7 @@ func serveUpload(w http.ResponseWriter, r *http.Request) { http.Error(w, err.Error(), http.StatusInternalServerError) return } - if err = WriteFileSync(dirPath, path+"."+HashAlgoSHA256, digest); err != nil { + if err = WriteFileSync(dirPath, path+"."+HashAlgoSHA256, digest, now); err != nil { log.Println("error", r.RemoteAddr, path+"."+HashAlgoSHA256, err) http.Error(w, err.Error(), http.StatusInternalServerError) return @@ -186,10 +194,61 @@ func serveUpload(w http.ResponseWriter, r *http.Request) { http.Error(w, err.Error(), http.StatusInternalServerError) return } - if err = WriteFileSync(dirPath, path, sig); err != nil { + if err = WriteFileSync(dirPath, path, sig, now); err != nil { log.Println("error", r.RemoteAddr, path, err) http.Error(w, err.Error(), http.StatusInternalServerError) return } } + + var buf bytes.Buffer + wr := recfile.NewWriter(&buf) + for formField, recField := range map[string]string{ + "name": MetadataFieldName, + "version": MetadataFieldVersion, + "platform": MetadataFieldPlatform, + "supported_platform": MetadataFieldSupportedPlatform, + "summary": MetadataFieldSummary, + "description": MetadataFieldDescription, + "description_content_type": MetadataFieldDescriptionContentType, + "keywords": MetadataFieldKeywords, + "home_page": MetadataFieldHomePage, + "author": MetadataFieldAuthor, + "author_email": MetadataFieldAuthorEmail, + "maintainer": MetadataFieldMaintainer, + "maintainer_email": MetadataFieldMaintainerEmail, + "license": MetadataFieldLicense, + "classifiers": MetadataFieldClassifier, + "requires_dist": MetadataFieldRequiresDist, + "requires_python": MetadataFieldRequiresPython, + "requires_external": MetadataFieldRequiresExternal, + "project_url": MetadataFieldProjectURL, + "provides_extra": MetadataFieldProvidesExtra, + } { + if vs, exists := r.MultipartForm.Value[formField]; exists { + for _, v := range vs { + lines := strings.Split(v, "\n") + if len(lines) > 1 { + _, err = wr.WriteFieldMultiline( + metadataFieldToRecField(recField), + lines, + ) + } else { + _, err = wr.WriteFields(recfile.Field{ + Name: metadataFieldToRecField(recField), + Value: lines[0], + }) + } + if err != nil { + log.Fatalln(err) + } + } + } + } + path := filepath.Join(dirPath, MetadataFile) + if err = WriteFileSync(dirPath, path, buf.Bytes(), now); err != nil { + log.Println("error", r.RemoteAddr, path, err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } }