diff --git a/cmd/fdroidcl/main.go b/cmd/fdroidcl/main.go index a4d0611..db74de1 100644 --- a/cmd/fdroidcl/main.go +++ b/cmd/fdroidcl/main.go @@ -4,6 +4,7 @@ package main import ( + "encoding/hex" "flag" "fmt" "log" @@ -147,11 +148,9 @@ func printAppDetailed(app fdroidcl.App) { } } -var repoURL = flag.String("r", "https://f-droid.org/repo", "repository address") - func init() { flag.Usage = func() { - fmt.Fprintln(os.Stderr, "Usage: fdroidcl [-h] [-r ] []") + fmt.Fprintln(os.Stderr, "Usage: fdroidcl [-h] []") fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "Available commands:") fmt.Fprintln(os.Stderr, " update Update the index") @@ -171,7 +170,7 @@ func appSubdir(appdir string) string { return p } -func indexPath(repoName string) string { +func indexPath(name string) string { cache, err := appdir.Cache() if err != nil { log.Fatalf("Could not determine cache dir: %v", err) @@ -179,7 +178,7 @@ func indexPath(repoName string) string { return filepath.Join(appSubdir(cache), repoName+".jar") } -func updateIndex(repoName, repoURL string) error { +func updateIndex() error { p := indexPath(repoName) url := fmt.Sprintf("%s/%s", repoURL, "index.jar") if err := downloadEtag(url, p); err != nil { @@ -188,7 +187,7 @@ func updateIndex(repoName, repoURL string) error { return nil } -func mustLoadIndex(repoName string) *fdroidcl.Index { +func mustLoadIndex() *fdroidcl.Index { p := indexPath(repoName) f, err := os.Open(p) if err != nil { @@ -198,7 +197,11 @@ func mustLoadIndex(repoName string) *fdroidcl.Index { if err != nil { log.Fatalf("Could not stat index file: %v", err) } - index, err := fdroidcl.LoadIndexJar(f, stat.Size()) + pubkey, err := hex.DecodeString(repoPubkey) + if err != nil { + log.Fatalf("Could not decode public key: %v", err) + } + index, err := fdroidcl.LoadIndexJar(f, stat.Size(), pubkey) if err != nil { log.Fatalf("Could not load index: %v", err) } @@ -247,25 +250,23 @@ func main() { cmd := flag.Args()[0] args := flag.Args()[1:] - repoName := "index" - switch cmd { case "update": - err := updateIndex(repoName, *repoURL) + err := updateIndex() if err == errNotModified { log.Print("Index up to date") } else if err != nil { log.Fatalf("Could not update index: %v", err) } case "list": - index := mustLoadIndex(repoName) + index := mustLoadIndex() printApps(index.Apps) case "search": - index := mustLoadIndex(repoName) + index := mustLoadIndex() apps := filterAppsSearch(index.Apps, args) printApps(apps) case "show": - index := mustLoadIndex(repoName) + index := mustLoadIndex() found := make(map[string]*fdroidcl.App, len(args)) for _, appID := range args { found[appID] = nil @@ -298,7 +299,7 @@ func main() { fmt.Printf("%s - %s (%s)\n", device.Id, device.Model, device.Product) } case "installed": - index := mustLoadIndex(repoName) + index := mustLoadIndex() startAdbIfNeeded() device := oneDevice() installed := mustInstalled(device) diff --git a/cmd/fdroidcl/repo.go b/cmd/fdroidcl/repo.go new file mode 100644 index 0000000..7da065d --- /dev/null +++ b/cmd/fdroidcl/repo.go @@ -0,0 +1,10 @@ +/* Copyright (c) 2015, Daniel Martí */ +/* See LICENSE for licensing information */ + +package main + +const ( + repoName = "repo" + repoURL = "https://f-droid.org/repo" + repoPubkey = "3082035e30820246a00302010202044c49cd00300d06092a864886f70d01010505003071310b300906035504061302554b3110300e06035504081307556e6b6e6f776e3111300f0603550407130857657468657262793110300e060355040a1307556e6b6e6f776e3110300e060355040b1307556e6b6e6f776e311930170603550403131043696172616e2047756c746e69656b73301e170d3130303732333137313032345a170d3337313230383137313032345a3071310b300906035504061302554b3110300e06035504081307556e6b6e6f776e3111300f0603550407130857657468657262793110300e060355040a1307556e6b6e6f776e3110300e060355040b1307556e6b6e6f776e311930170603550403131043696172616e2047756c746e69656b7330820122300d06092a864886f70d01010105000382010f003082010a028201010096d075e47c014e7822c89fd67f795d23203e2a8843f53ba4e6b1bf5f2fd0e225938267cfcae7fbf4fe596346afbaf4070fdb91f66fbcdf2348a3d92430502824f80517b156fab00809bdc8e631bfa9afd42d9045ab5fd6d28d9e140afc1300917b19b7c6c4df4a494cf1f7cb4a63c80d734265d735af9e4f09455f427aa65a53563f87b336ca2c19d244fcbba617ba0b19e56ed34afe0b253ab91e2fdb1271f1b9e3c3232027ed8862a112f0706e234cf236914b939bcf959821ecb2a6c18057e070de3428046d94b175e1d89bd795e535499a091f5bc65a79d539a8d43891ec504058acb28c08393b5718b57600a211e803f4a634e5c57f25b9b8c4422c6fd90203010001300d06092a864886f70d0101050500038201010008e4ef699e9807677ff56753da73efb2390d5ae2c17e4db691d5df7a7b60fc071ae509c5414be7d5da74df2811e83d3668c4a0b1abc84b9fa7d96b4cdf30bba68517ad2a93e233b042972ac0553a4801c9ebe07bf57ebe9a3b3d6d663965260e50f3b8f46db0531761e60340a2bddc3426098397fda54044a17e5244549f9869b460ca5e6e216b6f6a2db0580b480ca2afe6ec6b46eedacfa4aa45038809ece0c5978653d6c85f678e7f5a2156d1bedd8117751e64a4b0dcd140f3040b021821a8d93aed8d01ba36db6c82372211fed714d9a32607038cdfd565bd529ffc637212aaa2c224ef22b603eccefb5bf1e085c191d4b24fe742b17ab3f55d4e6f05ef" +) diff --git a/jar.go b/jar.go index b22cde9..4722578 100644 --- a/jar.go +++ b/jar.go @@ -5,8 +5,10 @@ package fdroidcl import ( "archive/zip" + //"crypto/x509" "errors" "io" + //"io/ioutil" "regexp" ) @@ -20,11 +22,22 @@ var ( ErrTooManySigs = errors.New("multiple jar signatures found") ) -func verifySignature(sig io.Reader) error { - return nil +func verifySignature(pubkey []byte, sig io.Reader) error { + /* + sigBytes, err := ioutil.ReadAll(sig) + if err != nil { + return err + } + cert, err := x509.ParseCertificate(pubkey) + if err != nil { + return err + } + return cert.CheckSignature(x509.MD5WithRSA, ...) + */ + return nil // MD5WithRSA is currently unimplemented } -func LoadIndexJar(r io.ReaderAt, size int64) (*Index, error) { +func LoadIndexJar(r io.ReaderAt, size int64, pubkey []byte) (*Index, error) { reader, err := zip.NewReader(r, size) if err != nil { return nil, err @@ -55,7 +68,7 @@ func LoadIndexJar(r io.ReaderAt, size int64) (*Index, error) { return nil, ErrNoSigs } defer sig.Close() - if err := verifySignature(sig); err != nil { + if err := verifySignature(pubkey, sig); err != nil { return nil, err } return LoadIndexXml(index)