diff --git a/router/upload.go b/router/upload.go index 44a2f077..d0993ad0 100644 --- a/router/upload.go +++ b/router/upload.go @@ -1,17 +1,22 @@ package router import ( + "encoding/hex" "errors" + "fmt" "github.com/ewhal/nyaa/util" "github.com/ewhal/nyaa/util/metainfo" "github.com/zeebo/bencode" "net/http" + "net/url" + "strings" ) // UploadForm serializing HTTP form for torrent upload type UploadForm struct { Name string Magnet string + Infohash string Category string Description string } @@ -85,8 +90,23 @@ func (f *UploadForm) ExtractInfo(r *http.Request) error { } // generate magnet - f.Magnet = util.InfoHashToMagnet(torrent.Infohash(), f.Name) + binInfoHash := torrent.Infohash() + f.Infohash = hex.EncodeToString(binInfoHash[:]) + f.Magnet = util.InfoHashToMagnet(f.Infohash, f.Name) + } else { + magnetUrl, parseErr := url.Parse(f.Magnet) + if parseErr != nil { + return metainfo.ErrInvalidTorrentFile + } + fmt.Println(magnetUrl) + exactTopic := magnetUrl.Query().Get("xt") + if !strings.HasPrefix(exactTopic, "urn:btih:") { + return metainfo.ErrInvalidTorrentFile + } else { + f.Infohash = strings.ToUpper(strings.TrimPrefix(exactTopic, "urn:btih:")) + } } + return nil } diff --git a/util/magnet.go b/util/magnet.go index 32a65b8e..15dacf13 100644 --- a/util/magnet.go +++ b/util/magnet.go @@ -1,15 +1,13 @@ package util import ( - "encoding/hex" "fmt" "net/url" ) // convert a binary infohash to a magnet uri given a display name and tracker urls -func InfoHashToMagnet(ih [20]byte, name string, trackers ...url.URL) (str string) { - str = hex.EncodeToString(ih[:]) - str = fmt.Sprintf("magnet:?xt=urn:btih:%s", str) +func InfoHashToMagnet(ih string, name string, trackers ...url.URL) (str string) { + str = fmt.Sprintf("magnet:?xt=urn:btih:%s", ih) if len(name) > 0 { str += fmt.Sprintf("&dn=%s", name) }