From d83dbe56ef43979f791b1f715a1a89b41bd34ea2 Mon Sep 17 00:00:00 2001 From: idk Date: Sun, 16 Jan 2022 17:38:57 -0500 Subject: [PATCH] OK so that's basically all the hard parts --- .gitignore | 2 +- get/get.go | 47 ++++++++++++++++++++++++++++++++++++++++++++++- go.mod | 2 ++ go.sum | 4 ++++ main.go | 4 +++- 5 files changed, 56 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 291b1ed..ab76002 100644 --- a/.gitignore +++ b/.gitignore @@ -7,4 +7,4 @@ i2p.plugins.tor-manager* *.zip *.su3 *-zip -plugin \ No newline at end of file +pluginunpack diff --git a/get/get.go b/get/get.go index 54d2b0f..20c015b 100644 --- a/get/get.go +++ b/get/get.go @@ -1,6 +1,7 @@ package tbget import ( + "archive/tar" "encoding/json" "fmt" "io" @@ -12,6 +13,7 @@ import ( "strings" "github.com/cloudfoundry/jibber_jabber" + "github.com/ulikunitz/xz" "github.com/jchavannes/go-pgp/pgp" "golang.org/x/crypto/openpgp" @@ -19,6 +21,7 @@ import ( var wd, _ = os.Getwd() +var UNPACK_URL = filepath.Join(wd, "unpack") var DOWNLOAD_PATH = filepath.Join(wd, "tor-browser") const TOR_UPDATES_URL string = "https://aus1.torproject.org/torbrowser/update_3/release/downloads.json" @@ -170,6 +173,47 @@ func DownloadUpdaterForLang(ietf string) (string, string, error) { return binpath, sigpath, nil } +func UnpackUpdater(binpath string) error { + os.MkdirAll(UNPACK_URL, 0755) + UNPACK_DIRECTORY, err := os.Open(UNPACK_URL) + if err != nil { + return fmt.Errorf("UnpackUpdater: %s", err) + } + defer UNPACK_DIRECTORY.Close() + xzfile, err := os.Open(binpath) + if err != nil { + return fmt.Errorf("UnpackUpdater: %s", err) + } + defer xzfile.Close() + xzReader, err := xz.NewReader(xzfile) + if err != nil { + return fmt.Errorf("UnpackUpdater: %s", err) + } + tarReader := tar.NewReader(xzReader) + for { + header, err := tarReader.Next() + if err == io.EOF { + break + } + if err != nil { + return fmt.Errorf("UnpackUpdater: %s", err) + } + if header.Typeflag == tar.TypeDir { + os.MkdirAll(filepath.Join(UNPACK_DIRECTORY.Name(), header.Name), 0755) + continue + } + filename := filepath.Join(UNPACK_DIRECTORY.Name(), header.Name) + file, err := os.Create(filename) + if err != nil { + return fmt.Errorf("UnpackUpdater: %s", err) + } + defer file.Close() + io.Copy(file, tarReader) + } + return nil + +} + func CheckSignature(binpath, sigpath string) error { var pkBytes []byte var pk *openpgp.Entity @@ -189,7 +233,8 @@ func CheckSignature(binpath, sigpath string) error { return fmt.Errorf("CheckSignature sig: %s", err) } if err = pgp.Verify(pk, sig, bin); err != nil { - return nil + return UnpackUpdater(binpath) + //return nil } err = fmt.Errorf("signature check failed") return fmt.Errorf("CheckSignature: %s", err) diff --git a/go.mod b/go.mod index 8a3532d..9319386 100644 --- a/go.mod +++ b/go.mod @@ -12,6 +12,8 @@ require ( require ( github.com/onsi/ginkgo v1.16.5 // indirect github.com/onsi/gomega v1.17.0 // indirect + github.com/ulikunitz/xz v0.5.10 // indirect + github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 // indirect golang.org/x/sys v0.0.0-20220114195835-da31bd327af9 // indirect golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect ) diff --git a/go.sum b/go.sum index e3683d2..8bb283b 100644 --- a/go.sum +++ b/go.sum @@ -39,6 +39,10 @@ github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAl github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/ulikunitz/xz v0.5.10 h1:t92gobL9l3HE202wg3rlk19F6X+JOxl9BBrCCMYEYd8= +github.com/ulikunitz/xz v0.5.10/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 h1:nIPpBwaJSVYIxUFsDv3M8ofmx9yWTog9BfvIu0q41lo= +github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= diff --git a/main.go b/main.go index f1e595c..e3f23c4 100644 --- a/main.go +++ b/main.go @@ -9,7 +9,9 @@ import ( ) var ( - lang = flag.String("lang", "", "Language to download") + lang = flag.String("lang", "", "Language to download") + mirror = flag.String("mirror", "", "Mirror to use") + bemirror = flag.Bool("bemirror", false, "Act as an in-I2P mirror when you're done downloading") ) func main() {