package main import ( "archive/tar" "bytes" "io" "io/fs" "net/http" "os" restful "github.com/emicklei/go-restful" ) func wsUnlockStore(req *restful.Request, resp *restful.Response) { var passphrase string err := req.ReadEntity(&passphrase) if err != nil { resp.WriteError(http.StatusBadRequest, err) return } if err := unlockSecretStore([]byte(passphrase)); err.Any() { err.WriteJSON(resp.ResponseWriter) return } resp.WriteEntity(adminToken) } func wsStoreDownload(req *restful.Request, resp *restful.Response) { token := req.QueryParameter("token") if token != wState.Get().Store.DownloadToken { wsError(resp, ErrInvalidToken) return } buf := new(bytes.Buffer) arch := tar.NewWriter(buf) root := os.DirFS(secStoreRoot()) err := fs.WalkDir(root, ".", func(path string, d fs.DirEntry, readErr error) (err error) { if readErr != nil { err = readErr return } if path == "." { return } fi, err := d.Info() if err != nil { return } hdr, err := tar.FileInfoHeader(fi, "") if err != nil { return } hdr.Name = path hdr.Uid = 0 hdr.Gid = 0 err = arch.WriteHeader(hdr) if err != nil { return } if fi.IsDir() { return } f, err := root.Open(path) if err != nil { return } defer f.Close() io.Copy(arch, f) return }) if err != nil { wsError(resp, err) return } err = arch.Close() if err != nil { wsError(resp, err) return } buf.WriteTo(resp) }