...
1
16
17 package localsubjectaccessreview
18
19 import (
20 "context"
21 "fmt"
22
23 apierrors "k8s.io/apimachinery/pkg/api/errors"
24 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
25 "k8s.io/apimachinery/pkg/runtime"
26 "k8s.io/apiserver/pkg/authorization/authorizer"
27 genericapirequest "k8s.io/apiserver/pkg/endpoints/request"
28 "k8s.io/apiserver/pkg/registry/rest"
29 authorizationapi "k8s.io/kubernetes/pkg/apis/authorization"
30 authorizationvalidation "k8s.io/kubernetes/pkg/apis/authorization/validation"
31 authorizationutil "k8s.io/kubernetes/pkg/registry/authorization/util"
32 )
33
34 type REST struct {
35 authorizer authorizer.Authorizer
36 }
37
38 func NewREST(authorizer authorizer.Authorizer) *REST {
39 return &REST{authorizer}
40 }
41
42 func (r *REST) NamespaceScoped() bool {
43 return true
44 }
45
46 func (r *REST) New() runtime.Object {
47 return &authorizationapi.LocalSubjectAccessReview{}
48 }
49
50
51 func (r *REST) Destroy() {
52
53
54 }
55
56 var _ rest.SingularNameProvider = &REST{}
57
58 func (r *REST) GetSingularName() string {
59 return "localsubjectaccessreview"
60 }
61
62 func (r *REST) Create(ctx context.Context, obj runtime.Object, createValidation rest.ValidateObjectFunc, options *metav1.CreateOptions) (runtime.Object, error) {
63 localSubjectAccessReview, ok := obj.(*authorizationapi.LocalSubjectAccessReview)
64 if !ok {
65 return nil, apierrors.NewBadRequest(fmt.Sprintf("not a LocaLocalSubjectAccessReview: %#v", obj))
66 }
67 if errs := authorizationvalidation.ValidateLocalSubjectAccessReview(localSubjectAccessReview); len(errs) > 0 {
68 return nil, apierrors.NewInvalid(authorizationapi.Kind(localSubjectAccessReview.Kind), "", errs)
69 }
70 namespace := genericapirequest.NamespaceValue(ctx)
71 if len(namespace) == 0 {
72 return nil, apierrors.NewBadRequest(fmt.Sprintf("namespace is required on this type: %v", namespace))
73 }
74 if namespace != localSubjectAccessReview.Namespace {
75 return nil, apierrors.NewBadRequest(fmt.Sprintf("spec.resourceAttributes.namespace must match namespace: %v", namespace))
76 }
77
78 if createValidation != nil {
79 if err := createValidation(ctx, obj.DeepCopyObject()); err != nil {
80 return nil, err
81 }
82 }
83
84 authorizationAttributes := authorizationutil.AuthorizationAttributesFrom(localSubjectAccessReview.Spec)
85 decision, reason, evaluationErr := r.authorizer.Authorize(ctx, authorizationAttributes)
86
87 localSubjectAccessReview.Status = authorizationapi.SubjectAccessReviewStatus{
88 Allowed: (decision == authorizer.DecisionAllow),
89 Denied: (decision == authorizer.DecisionDeny),
90 Reason: reason,
91 }
92 if evaluationErr != nil {
93 localSubjectAccessReview.Status.EvaluationError = evaluationErr.Error()
94 }
95
96 return localSubjectAccessReview, nil
97 }
98
View as plain text