cmd/meta4-check/main.go | 19 ++++++++++++++++--- cmd/meta4-create/main.go | 21 ++++++++++++++++----- common.go | 5 +++-- scheme.go | 2 +- diff --git a/cmd/meta4-check/main.go b/cmd/meta4-check/main.go index 86f20b1c665aeb50ab9bfe8528e7c91982fe3beccb6d525f1b725076dfb95d2a..721d499888d1a79428420a28880e1b6f52f698dda751d3e8d7634034139e88bc 100644 --- a/cmd/meta4-check/main.go +++ b/cmd/meta4-check/main.go @@ -49,10 +49,23 @@ if err != nil { log.Fatalln(err) } for _, f := range meta.Files { - if f.Signature != nil && *extractSig { + for _, sig := range f.Signature { + if !*extractSig { + continue + } + var fn string + switch sig.MediaType { + case meta4ra.SigMediaTypePGP: + fn = f.Name + ".asc" + case meta4ra.SigMediaTypeSSH: + fn = f.Name + ".sig" + } + if fn == "" { + continue + } if err = os.WriteFile( - f.Name+".asc", - []byte(f.Signature.Signature), + fn, + []byte(strings.TrimPrefix(sig.Signature, "\n")), fs.FileMode(0666), ); err != nil { fmt.Println("Error:", f.Name, "can not save signature:", err) diff --git a/cmd/meta4-create/main.go b/cmd/meta4-create/main.go index d2342da227f7157b7bf92b45e1610d9b6a4e3f3a5b970ca9ea91bec2e58822c4..562129731875ddc86b64473d6c752194c1c3f45da177dfc7e62bfd8d9308f5da 100644 --- a/cmd/meta4-create/main.go +++ b/cmd/meta4-create/main.go @@ -36,7 +36,8 @@ func main() { fn := flag.String("fn", "", "Filename") mtime := flag.String("mtime", "", "Take that file's mtime as a Published date") desc := flag.String("desc", "", "Description") - sig := flag.String("sig", "", "Path to signature file") + sigPGP := flag.String("sig-pgp", "", "Path to OpenPGP .asc signature file") + sigSSH := flag.String("sig-ssh", "", "Path to OpenSSH .sig signature file") hashes := flag.String("hashes", strings.Join(meta4ra.HashesDefault, ","), "hash-name:command-s") torrent := flag.String("torrent", "", "Torrent URL") log.SetFlags(log.Lshortfile) @@ -63,15 +64,25 @@ Size: uint64(size), URLs: urls, Hashes: h.Sums(), } - if *sig != "" { - sigData, err := os.ReadFile(*sig) + if *sigPGP != "" { + sigData, err := os.ReadFile(*sigPGP) if err != nil { log.Fatalln(err) } - f.Signature = &meta4ra.Signature{ - MediaType: meta4ra.GPGSigMediaType, + f.Signature = append(f.Signature, meta4ra.Signature{ + MediaType: meta4ra.SigMediaTypePGP, Signature: "\n" + string(sigData), + }) + } + if *sigSSH != "" { + sigData, err := os.ReadFile(*sigSSH) + if err != nil { + log.Fatalln(err) } + f.Signature = append(f.Signature, meta4ra.Signature{ + MediaType: meta4ra.SigMediaTypeSSH, + Signature: "\n" + string(sigData), + }) } if *torrent != "" { f.MetaURLs = []meta4ra.MetaURL{{MediaType: "torrent", URL: *torrent}} diff --git a/common.go b/common.go index 0831bad462d960b1754611c2b659a15a2521b3e05b998cede72a9fd90badc261..f1cf68456bc38f01da5dad9b85d2127992e70e78e59d3eb824f51265efa69e2a 100644 --- a/common.go +++ b/common.go @@ -19,6 +19,7 @@ // Metalink 4.0 utilities package meta4ra const ( - Generator = "meta4ra/0.3.0" - GPGSigMediaType = "application/pgp-signature" + Generator = "meta4ra/0.4.0" + SigMediaTypePGP = "application/pgp-signature" + SigMediaTypeSSH = "application/ssh-signature" ) diff --git a/scheme.go b/scheme.go index 2ab1ffbadf480029624bd128ba55789dab1fee0be50d2d1400b0d37f77989b8d..6d0e6569ee453d824feadd1bd61a3351ddd73ffc0e806b1aeead6df9ea0fc398 100644 --- a/scheme.go +++ b/scheme.go @@ -35,7 +35,7 @@ Name string `xml:"name,attr"` Description string `xml:"description,,omitempty"` Hashes []Hash `xml:"hash,,omitempty"` MetaURLs []MetaURL `xml:"metaurl,,omitempty"` - Signature *Signature `xml:"signature"` + Signature []Signature `xml:"signature"` Size uint64 `xml:"size,,omitempty"` URLs []URL `xml:"url,,omitempty"` }