store download & add key

This commit is contained in:
Mikaël Cluseau
2023-02-13 13:03:42 +01:00
parent 1672b901d4
commit 1e3ac9a0fb
15 changed files with 259 additions and 43 deletions

View File

@ -1,6 +1,7 @@
package main
import (
"errors"
"fmt"
"log"
"net"
@ -10,6 +11,7 @@ import (
cfsslconfig "github.com/cloudflare/cfssl/config"
"github.com/emicklei/go-restful"
"m.cluseau.fr/go/httperr"
"novit.tech/direktil/pkg/localconfig"
@ -28,6 +30,10 @@ func registerWS(rest *restful.Container) {
Reads("").
Writes("").
Doc("Try to unlock the store")).
Route(ws.GET("/store.tar").To(wsStoreDownload).
Produces(mime.TAR).
Param(ws.QueryParameter("token", "the download token")).
Doc("Fetch the encrypted store")).
Route(ws.GET("/downloads/{token}/{asset}").To(wsDownload).
Param(ws.PathParameter("token", "the download token")).
Param(ws.PathParameter("asset", "the requested asset")).
@ -42,12 +48,21 @@ func registerWS(rest *restful.Container) {
Filter(adminAuth).
HeaderParameter("Authorization", "Admin bearer token")
// - store management
ws.Route(ws.POST("/store/add-key").To(wsStoreAddKey).
Consumes("application/json").Reads("").
Produces("application/json").
Doc("Add an unlock key to the store"))
// - downloads
ws.Route(ws.POST("/authorize-download").To(wsAuthorizeDownload).
Consumes("application/json").Reads(DownloadSpec{}).
Produces("application/json").
Doc("Create a download token for the given download"))
// - configs API
ws.Route(ws.POST("/configs").To(wsUploadConfig).
Consumes(mime.YAML).
Doc("Upload a new current configuration, archiving the previous one"))
// - clusters API
@ -180,11 +195,20 @@ func wsNotFound(req *restful.Request, resp *restful.Response) {
http.NotFound(resp.ResponseWriter, req.Request)
}
func wsBadRequest(resp *restful.Response, err string) {
httperr.New(http.StatusBadRequest, errors.New(err)).WriteJSON(resp.ResponseWriter)
}
func wsError(resp *restful.Response, err error) {
log.Output(2, fmt.Sprint("request failed: ", err))
resp.WriteErrorString(
http.StatusInternalServerError,
http.StatusText(http.StatusInternalServerError))
switch err := err.(type) {
case httperr.Error:
err.WriteJSON(resp.ResponseWriter)
default:
httperr.Internal(err).WriteJSON(resp.ResponseWriter)
}
}
func wsRender(resp *restful.Response, sslCfg *cfsslconfig.Config, tmplStr string, value interface{}) {