kube CSR: preload UI fields
This commit is contained in:
@@ -2,6 +2,8 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"crypto/x509"
|
||||||
|
"encoding/pem"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
@@ -355,3 +357,39 @@ func parseCertDuration(d string, now time.Time) (t time.Time, err error) {
|
|||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type KubeCSRParseReq struct {
|
||||||
|
CSR string `json:"csr"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type KubeCSRParseResp struct {
|
||||||
|
User string `json:"user,omitempty"`
|
||||||
|
Group string `json:"group,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func wsParseKubeCSR(req *restful.Request, resp *restful.Response) {
|
||||||
|
var r KubeCSRParseReq
|
||||||
|
if err := req.ReadEntity(&r); err != nil {
|
||||||
|
wsError(resp, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
block, _ := pem.Decode([]byte(r.CSR))
|
||||||
|
if block == nil || block.Type != "CERTIFICATE REQUEST" {
|
||||||
|
wsError(resp, fmt.Errorf("invalid CSR PEM"))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
cr, err := x509.ParseCertificateRequest(block.Bytes)
|
||||||
|
if err != nil {
|
||||||
|
wsError(resp, fmt.Errorf("parse CSR: %w", err))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
out := KubeCSRParseResp{User: cr.Subject.CommonName}
|
||||||
|
if len(cr.Subject.Organization) > 0 {
|
||||||
|
out.Group = cr.Subject.Organization[0]
|
||||||
|
}
|
||||||
|
|
||||||
|
resp.WriteAsJson(out)
|
||||||
|
}
|
||||||
|
|||||||
@@ -42,7 +42,11 @@ func registerWS(rest *restful.Container) {
|
|||||||
Param(ws.PathParameter("asset", "the requested asset")).
|
Param(ws.PathParameter("asset", "the requested asset")).
|
||||||
Doc("Fetch an asset via a download token")).
|
Doc("Fetch an asset via a download token")).
|
||||||
Route(ws.GET("/download-set").To(wsDownloadSet)).
|
Route(ws.GET("/download-set").To(wsDownloadSet)).
|
||||||
Route(ws.GET("/download-set/{kind}/{name}/{asset}").To(wsDownloadSetAsset))
|
Route(ws.GET("/download-set/{kind}/{name}/{asset}").To(wsDownloadSetAsset)).
|
||||||
|
Route(ws.POST("/parse-kube-csr").To(wsParseKubeCSR).
|
||||||
|
Reads(KubeCSRParseReq{}).
|
||||||
|
Writes(KubeCSRParseResp{}).
|
||||||
|
Doc("Parse a Kubernetes CSR PEM and return the subject fields"))
|
||||||
|
|
||||||
rest.Add(ws)
|
rest.Add(ws)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,6 +21,22 @@ const ClusterAccess = {
|
|||||||
msg: null,
|
msg: null,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
watch: {
|
||||||
|
'kubeSignReq.CSR'(v) {
|
||||||
|
if (v && v.includes('BEGIN CERTIFICATE REQUEST')) {
|
||||||
|
fetch(`/public/parse-kube-csr`, {
|
||||||
|
method: 'POST',
|
||||||
|
body: JSON.stringify({ csr: v }),
|
||||||
|
headers: { 'Content-Type': 'application/json' },
|
||||||
|
}).then(r => {
|
||||||
|
if (r.ok) r.json().then(d => {
|
||||||
|
if (d.user) this.kubeSignReq.User = d.user;
|
||||||
|
if (d.group) this.kubeSignReq.Group = d.group;
|
||||||
|
});
|
||||||
|
}).catch(() => {});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
computed: {
|
computed: {
|
||||||
availableAssets() {
|
availableAssets() {
|
||||||
return [
|
return [
|
||||||
+1
-1
@@ -13,7 +13,7 @@
|
|||||||
<script src="/ui/app-4f0c6935250753e9.js" defer integrity="sha384-SrAfGs5pnGcgL5E78t2MszNYmdkGME9yPgtPsDg61Rljw+dfiP+rabjPnrMkWDUH" type="module"></script>
|
<script src="/ui/app-4f0c6935250753e9.js" defer integrity="sha384-SrAfGs5pnGcgL5E78t2MszNYmdkGME9yPgtPsDg61Rljw+dfiP+rabjPnrMkWDUH" type="module"></script>
|
||||||
<script src="/ui/Downloads-3c8cba0572aebfae.js" integrity="sha384-Pof/sPwhdqKGp7NUmYkDc0pSSyACabwLjkRRylZKHxRmiHBV3SGomPUMAWG9y7Ix"></script>
|
<script src="/ui/Downloads-3c8cba0572aebfae.js" integrity="sha384-Pof/sPwhdqKGp7NUmYkDc0pSSyACabwLjkRRylZKHxRmiHBV3SGomPUMAWG9y7Ix"></script>
|
||||||
<script src="/ui/GetCopy-2e04b7b63750e25a.js" integrity="sha384-sNvTYXhjog3BkYL20RzrUWIG9VGyHNO8oEiP5oxL5f2WKmLj/03fdR79FgHfzlj+"></script>
|
<script src="/ui/GetCopy-2e04b7b63750e25a.js" integrity="sha384-sNvTYXhjog3BkYL20RzrUWIG9VGyHNO8oEiP5oxL5f2WKmLj/03fdR79FgHfzlj+"></script>
|
||||||
<script src="/ui/ClusterAccess-8b4165435ba4fcac.js" integrity="sha384-C1mVnhsaxmn3Dpp1vtcBuctxxXI1Rlh+qmxicCIpNv7ukyTbB524pg0ZwhvAnfH7"></script>
|
<script src="/ui/ClusterAccess-1090c2ac32649bb9.js" integrity="sha384-xs5yHZycLFkyMIIULJMMeDk04sly74uUtO7qaagZcLLKos9YIOv0sEIJkXRveno3"></script>
|
||||||
<script src="/ui/ClusterCAs-4f0a381bfb0c1b88.js" integrity="sha384-QcSHKzEHNSCqyjFELXfYFAdfmIZZwJHDzPqI2prH47jHrkeomJD60rcEMLkVAO3o"></script>
|
<script src="/ui/ClusterCAs-4f0a381bfb0c1b88.js" integrity="sha384-QcSHKzEHNSCqyjFELXfYFAdfmIZZwJHDzPqI2prH47jHrkeomJD60rcEMLkVAO3o"></script>
|
||||||
<script src="/ui/Cluster-34a012ee0910827c.js" integrity="sha384-Q0sXP0WFJu4gHOI/8NMOGwpJvvFDNBR3T/vDCYxCWL2szAu4+sQuwHm81Jcad/ve"></script>
|
<script src="/ui/Cluster-34a012ee0910827c.js" integrity="sha384-Q0sXP0WFJu4gHOI/8NMOGwpJvvFDNBR3T/vDCYxCWL2szAu4+sQuwHm81Jcad/ve"></script>
|
||||||
<script src="/ui/Host-61916516a854adff.js" integrity="sha384-/wh3KrC0sb4MT7ekO2U84rswxI42WSH/0jB4dbDaaGaGhX60xTEZHFsdQAf7UgTG"></script>
|
<script src="/ui/Host-61916516a854adff.js" integrity="sha384-/wh3KrC0sb4MT7ekO2U84rswxI42WSH/0jB4dbDaaGaGhX60xTEZHFsdQAf7UgTG"></script>
|
||||||
|
|||||||
@@ -21,6 +21,22 @@ const ClusterAccess = {
|
|||||||
msg: null,
|
msg: null,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
watch: {
|
||||||
|
'kubeSignReq.CSR'(v) {
|
||||||
|
if (v && v.includes('BEGIN CERTIFICATE REQUEST')) {
|
||||||
|
fetch(`/public/parse-kube-csr`, {
|
||||||
|
method: 'POST',
|
||||||
|
body: JSON.stringify({ csr: v }),
|
||||||
|
headers: { 'Content-Type': 'application/json' },
|
||||||
|
}).then(r => {
|
||||||
|
if (r.ok) r.json().then(d => {
|
||||||
|
if (d.user) this.kubeSignReq.User = d.user;
|
||||||
|
if (d.group) this.kubeSignReq.Group = d.group;
|
||||||
|
});
|
||||||
|
}).catch(() => {});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
computed: {
|
computed: {
|
||||||
availableAssets() {
|
availableAssets() {
|
||||||
return [
|
return [
|
||||||
|
|||||||
Reference in New Issue
Block a user