Skip to content

Commit 14af777

Browse files
Cali0707manusa
authored andcommitted
feat: add accesscontrol rest client
Signed-off-by: Calum Murray <[email protected]>
1 parent 27e0e81 commit 14af777

File tree

1 file changed

+61
-0
lines changed

1 file changed

+61
-0
lines changed
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package kubernetes
2+
3+
import (
4+
"fmt"
5+
"net/http"
6+
"strings"
7+
8+
"k8s.io/apimachinery/pkg/runtime/schema"
9+
)
10+
11+
type AccessControlRoundTripper struct {
12+
delegate http.RoundTripper
13+
accessControlRESTMapper *AccessControlRESTMapper
14+
}
15+
16+
func (rt *AccessControlRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) {
17+
gvr, err := parseURLToGVR(req.URL.Path)
18+
if err != nil {
19+
return nil, fmt.Errorf("failed to make request: AccessControlRoundTripper failed to parse url: %w", err)
20+
}
21+
22+
_, err = rt.accessControlRESTMapper.KindFor(gvr)
23+
if err != nil {
24+
return nil, fmt.Errorf("not allowed to access resource: %v", gvr)
25+
}
26+
27+
return rt.delegate.RoundTrip(req)
28+
}
29+
30+
func parseURLToGVR(path string) (schema.GroupVersionResource, error) {
31+
parts := strings.Split(strings.Trim(path, "/"), "/")
32+
33+
if len(parts) < 3 {
34+
return schema.GroupVersionResource{}, fmt.Errorf("not an api path: %s", path)
35+
}
36+
37+
gvr := schema.GroupVersionResource{}
38+
39+
switch parts[0] {
40+
case "api":
41+
gvr.Group = ""
42+
gvr.Version = parts[1]
43+
if parts[2] == "namespaces" && len(parts) > 4 {
44+
gvr.Resource = parts[4]
45+
} else {
46+
gvr.Resource = parts[2]
47+
}
48+
case "apis":
49+
gvr.Group = parts[1]
50+
gvr.Version = parts[2]
51+
if parts[3] == "namespaces" && len(parts) > 5 {
52+
gvr.Resource = parts[5]
53+
} else {
54+
gvr.Resource = parts[3]
55+
}
56+
default:
57+
return schema.GroupVersionResource{}, fmt.Errorf("unknown prefix: %s", parts[0])
58+
}
59+
60+
return gvr, nil
61+
}

0 commit comments

Comments
 (0)