99 lines
1.4 KiB
Go
99 lines
1.4 KiB
Go
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)
|
|
}
|