From 57264985e9cca0bf85c76121346a23326e12c9be Mon Sep 17 00:00:00 2001 From: tgbv <31542280+tgbv@users.noreply.github.com> Date: Mon, 25 Sep 2023 00:14:11 +0300 Subject: [PATCH] feat: allow parsing of zip archives --- gui/tunnels.go | 48 +++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 45 insertions(+), 3 deletions(-) diff --git a/gui/tunnels.go b/gui/tunnels.go index a57e81e..e3284de 100755 --- a/gui/tunnels.go +++ b/gui/tunnels.go @@ -346,19 +346,21 @@ func (t *Tunnels) Create() error { btnAddTunnel.Connect("clicked", func() { err := func() error { log.Print("btn add tunnel") - dialog, err := gtk.FileChooserNativeDialogNew("Wireguird - Choose tunnel files (*.conf)", window, gtk.FILE_CHOOSER_ACTION_OPEN, "OK", "Cancel") + dialog, err := gtk.FileChooserNativeDialogNew("Wireguird - Choose tunnel files (*.conf, *.zip)", window, gtk.FILE_CHOOSER_ACTION_OPEN, "OK", "Cancel") if err != nil { return err } defer dialog.Destroy() - // filter *.conf files + // filter *.conf and *.zip files filter, err := gtk.FileFilterNew() if err != nil { return err } filter.AddPattern("*.conf") - filter.SetName("*.conf") + filter.AddPattern("*.zip") + filter.SetName("*.conf / *.zip") + dialog.AddFilter(filter) dialog.SetSelectMultiple(true) @@ -369,6 +371,15 @@ func (t *Tunnels) Create() error { return err } for _, fname := range list { + // if file is zip archive + if strings.HasSuffix(fname, ".zip") { + err := parseZipArchive(fname) + if err != nil { + return err + } + continue + } + data, err := ioutil.ReadFile(fname) if err != nil { return err @@ -1148,3 +1159,34 @@ func wlog(t string, text string) error { return nil } + +func parseZipArchive(target string) error { + rc, err := zip.OpenReader(target) + if err != nil { + return err + } + defer rc.Close() + + for _, f := range rc.File { + // parse only .conf files from zip archive + if !f.FileInfo().IsDir() && strings.HasSuffix(f.FileInfo().Name(), ".conf") { + fr, err := f.Open() + if err != nil { + return err + } + defer fr.Close() + + data, err := ioutil.ReadAll(fr) + if err != nil { + return err + } + + err = ioutil.WriteFile(filepath.Join(TunnelsPath, f.FileInfo().Name()), data, 666) + if err != nil { + return err + } + } + } + + return nil +}