Skip to content

Commit 2873196

Browse files
authored
Revert user update validation changes (#1008)
1 parent 13d392f commit 2873196

File tree

4 files changed

+5
-78
lines changed

4 files changed

+5
-78
lines changed

docs.md

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -524,12 +524,6 @@ When a user is updated or deleted, a check occurs to ensure that the user making
524524

525525
If the user making the request has the verb `manage-users` for the resource `users`, then it is allowed to bypass the check. Note that the wildcard `*` includes the `manage-users` verb.
526526

527-
#### Invalid Fields - Update
528-
529-
Users can update the following fields if they had not been set. But after getting initial values, the fields cannot be changed:
530-
531-
- UserName
532-
533527
## UserAttribute
534528

535529
### Validation Checks

pkg/resources/management.cattle.io/v3/users/User.md

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,3 @@
55
When a user is updated or deleted, a check occurs to ensure that the user making the request has permissions greater than or equal to the user being updated or deleted. To get the user's groups, the user's UserAttributes are checked. This is best effort, because UserAttributes are only updated when a User logs in, so it may not be perfectly up to date.
66

77
If the user making the request has the verb `manage-users` for the resource `users`, then it is allowed to bypass the check. Note that the wildcard `*` includes the `manage-users` verb.
8-
9-
### Invalid Fields - Update
10-
11-
Users can update the following fields if they had not been set. But after getting initial values, the fields cannot be changed:
12-
13-
- UserName

pkg/resources/management.cattle.io/v3/users/validator.go

Lines changed: 5 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ import (
1414
apierrors "k8s.io/apimachinery/pkg/api/errors"
1515
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1616
"k8s.io/apimachinery/pkg/runtime/schema"
17-
"k8s.io/apimachinery/pkg/util/validation/field"
1817
"k8s.io/apiserver/pkg/authentication/user"
1918
authorizationv1 "k8s.io/client-go/kubernetes/typed/authorization/v1"
2019
"k8s.io/kubernetes/pkg/registry/rbac/validation"
@@ -83,26 +82,26 @@ func (a *admitter) Admit(request *admission.Request) (*admissionv1.AdmissionResp
8382
return &admissionv1.AdmissionResponse{Allowed: true}, nil
8483
}
8584

86-
oldUser, newUser, err := objectsv3.UserOldAndNewFromRequest(&request.AdmissionRequest)
85+
userObj, err := objectsv3.UserFromRequest(&request.AdmissionRequest)
8786
if err != nil {
8887
return nil, fmt.Errorf("failed to get current User from request: %w", err)
8988
}
9089

9190
// Need the UserAttribute to find the groups
92-
userAttribute, err := a.userAttributeCache.Get(oldUser.Name)
91+
userAttribute, err := a.userAttributeCache.Get(userObj.Name)
9392
if err != nil && !apierrors.IsNotFound(err) {
94-
return nil, fmt.Errorf("failed to get UserAttribute for %s: %w", oldUser.Name, err)
93+
return nil, fmt.Errorf("failed to get UserAttribute for %s: %w", userObj.Name, err)
9594
}
9695

9796
userInfo := &user.DefaultInfo{
98-
Name: oldUser.Name,
97+
Name: userObj.Name,
9998
Groups: getGroupsFromUserAttribute(userAttribute),
10099
}
101100

102101
// Get all rules for the user being modified
103102
rules, err := a.resolver.RulesFor(context.Background(), userInfo, "")
104103
if err != nil {
105-
return nil, fmt.Errorf("failed to get rules for user %v: %w", oldUser, err)
104+
return nil, fmt.Errorf("failed to get rules for user %v: %w", userObj, err)
106105
}
107106

108107
// Ensure that rules of the user being modified aren't greater than the rules of the user making the request
@@ -118,13 +117,6 @@ func (a *admitter) Admit(request *admission.Request) (*admissionv1.AdmissionResp
118117
}, nil
119118
}
120119

121-
fieldPath := field.NewPath("user")
122-
if request.Operation == admissionv1.Update {
123-
if err := validateUpdateFields(oldUser, newUser, fieldPath); err != nil {
124-
return admission.ResponseBadRequest(err.Error()), nil
125-
}
126-
}
127-
128120
return &admissionv1.AdmissionResponse{Allowed: true}, nil
129121
}
130122

@@ -143,12 +135,3 @@ func getGroupsFromUserAttribute(userAttribute *v3.UserAttribute) []string {
143135
}
144136
return result
145137
}
146-
147-
// validateUpdateFields
148-
func validateUpdateFields(oldUser, newUser *v3.User, fieldPath *field.Path) error {
149-
const reason = "field is immutable"
150-
if oldUser.Username != "" && oldUser.Username != newUser.Username {
151-
return field.Invalid(fieldPath.Child("username"), newUser.Username, reason)
152-
}
153-
return nil
154-
}

pkg/resources/management.cattle.io/v3/users/validator_test.go

Lines changed: 0 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ var (
3535
ObjectMeta: metav1.ObjectMeta{
3636
Name: defaultUserName,
3737
},
38-
Username: defaultUserName,
3938
}
4039
getPods = []rbacv1.PolicyRule{
4140
{
@@ -197,49 +196,6 @@ func Test_Admit(t *testing.T) {
197196
},
198197
allowed: false,
199198
},
200-
{
201-
name: "changing the username not allowed",
202-
oldUser: defaultUser.DeepCopy(),
203-
newUser: &v3.User{
204-
ObjectMeta: metav1.ObjectMeta{
205-
Name: defaultUserName,
206-
},
207-
Username: "new-username",
208-
},
209-
requestUserName: requesterUserName,
210-
resolverRulesFor: func(string) ([]rbacv1.PolicyRule, error) {
211-
return getPods, nil
212-
},
213-
allowed: false,
214-
},
215-
{
216-
name: "adding a new username allowed",
217-
oldUser: &v3.User{
218-
ObjectMeta: metav1.ObjectMeta{
219-
Name: defaultUserName,
220-
},
221-
},
222-
newUser: defaultUser.DeepCopy(),
223-
requestUserName: requesterUserName,
224-
resolverRulesFor: func(string) ([]rbacv1.PolicyRule, error) {
225-
return getPods, nil
226-
},
227-
allowed: true,
228-
},
229-
{
230-
name: "removing username not allowed",
231-
oldUser: defaultUser.DeepCopy(),
232-
newUser: &v3.User{
233-
ObjectMeta: metav1.ObjectMeta{
234-
Name: defaultUserName,
235-
},
236-
},
237-
requestUserName: requesterUserName,
238-
resolverRulesFor: func(string) ([]rbacv1.PolicyRule, error) {
239-
return getPods, nil
240-
},
241-
allowed: false,
242-
},
243199
}
244200
for _, tt := range tests {
245201
t.Run(tt.name, func(t *testing.T) {

0 commit comments

Comments
 (0)