Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
K
k3s
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Jacklull
k3s
Commits
ed4258e5
Unverified
Commit
ed4258e5
authored
Mar 20, 2019
by
Kubernetes Prow Robot
Committed by
GitHub
Mar 20, 2019
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #75264 from smarterclayton/optimize_rbac_visit
Avoid allocating when performing VisitRulesFor on service accounts
parents
7c2b93ce
4c87a14e
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
62 additions
and
2 deletions
+62
-2
rule.go
pkg/registry/rbac/validation/rule.go
+2
-1
util.go
...8s.io/apiserver/pkg/authentication/serviceaccount/util.go
+21
-0
util_test.go
.../apiserver/pkg/authentication/serviceaccount/util_test.go
+39
-1
No files found.
pkg/registry/rbac/validation/rule.go
View file @
ed4258e5
...
@@ -286,7 +286,8 @@ func appliesToUser(user user.Info, subject rbacv1.Subject, namespace string) boo
...
@@ -286,7 +286,8 @@ func appliesToUser(user user.Info, subject rbacv1.Subject, namespace string) boo
if
len
(
saNamespace
)
==
0
{
if
len
(
saNamespace
)
==
0
{
return
false
return
false
}
}
return
serviceaccount
.
MakeUsername
(
saNamespace
,
subject
.
Name
)
==
user
.
GetName
()
// use a more efficient comparison for RBAC checking
return
serviceaccount
.
MatchesUsername
(
saNamespace
,
subject
.
Name
,
user
.
GetName
())
default
:
default
:
return
false
return
false
}
}
...
...
staging/src/k8s.io/apiserver/pkg/authentication/serviceaccount/util.go
View file @
ed4258e5
...
@@ -36,6 +36,27 @@ func MakeUsername(namespace, name string) string {
...
@@ -36,6 +36,27 @@ func MakeUsername(namespace, name string) string {
return
ServiceAccountUsernamePrefix
+
namespace
+
ServiceAccountUsernameSeparator
+
name
return
ServiceAccountUsernamePrefix
+
namespace
+
ServiceAccountUsernameSeparator
+
name
}
}
// MatchesUsername checks whether the provided username matches the namespace and name without
// allocating. Use this when checking a service account namespace and name against a known string.
func
MatchesUsername
(
namespace
,
name
string
,
username
string
)
bool
{
if
!
strings
.
HasPrefix
(
username
,
ServiceAccountUsernamePrefix
)
{
return
false
}
username
=
username
[
len
(
ServiceAccountUsernamePrefix
)
:
]
if
!
strings
.
HasPrefix
(
username
,
namespace
)
{
return
false
}
username
=
username
[
len
(
namespace
)
:
]
if
!
strings
.
HasPrefix
(
username
,
ServiceAccountUsernameSeparator
)
{
return
false
}
username
=
username
[
len
(
ServiceAccountUsernameSeparator
)
:
]
return
username
==
name
}
var
invalidUsernameErr
=
fmt
.
Errorf
(
"Username must be in the form %s"
,
MakeUsername
(
"namespace"
,
"name"
))
var
invalidUsernameErr
=
fmt
.
Errorf
(
"Username must be in the form %s"
,
MakeUsername
(
"namespace"
,
"name"
))
// SplitUsername returns the namespace and ServiceAccount name embedded in the given username,
// SplitUsername returns the namespace and ServiceAccount name embedded in the given username,
...
...
staging/src/k8s.io/apiserver/pkg/authentication/serviceaccount/util_test.go
View file @
ed4258e5
...
@@ -62,7 +62,9 @@ func TestMakeUsername(t *testing.T) {
...
@@ -62,7 +62,9 @@ func TestMakeUsername(t *testing.T) {
for
k
,
tc
:=
range
testCases
{
for
k
,
tc
:=
range
testCases
{
username
:=
MakeUsername
(
tc
.
Namespace
,
tc
.
Name
)
username
:=
MakeUsername
(
tc
.
Namespace
,
tc
.
Name
)
if
!
MatchesUsername
(
tc
.
Namespace
,
tc
.
Name
,
username
)
{
t
.
Errorf
(
"%s: Expected to match username"
,
k
)
}
namespace
,
name
,
err
:=
SplitUsername
(
username
)
namespace
,
name
,
err
:=
SplitUsername
(
username
)
if
(
err
!=
nil
)
!=
tc
.
ExpectedErr
{
if
(
err
!=
nil
)
!=
tc
.
ExpectedErr
{
t
.
Errorf
(
"%s: Expected error=%v, got %v"
,
k
,
tc
.
ExpectedErr
,
err
)
t
.
Errorf
(
"%s: Expected error=%v, got %v"
,
k
,
tc
.
ExpectedErr
,
err
)
...
@@ -80,3 +82,39 @@ func TestMakeUsername(t *testing.T) {
...
@@ -80,3 +82,39 @@ func TestMakeUsername(t *testing.T) {
}
}
}
}
}
}
func
TestMatchUsername
(
t
*
testing
.
T
)
{
testCases
:=
[]
struct
{
TestName
string
Namespace
string
Name
string
Username
string
Expect
bool
}{
{
Namespace
:
"foo"
,
Name
:
"bar"
,
Username
:
"foo"
,
Expect
:
false
},
{
Namespace
:
"foo"
,
Name
:
"bar"
,
Username
:
"system:serviceaccount:"
,
Expect
:
false
},
{
Namespace
:
"foo"
,
Name
:
"bar"
,
Username
:
"system:serviceaccount:foo"
,
Expect
:
false
},
{
Namespace
:
"foo"
,
Name
:
"bar"
,
Username
:
"system:serviceaccount:foo:"
,
Expect
:
false
},
{
Namespace
:
"foo"
,
Name
:
"bar"
,
Username
:
"system:serviceaccount:foo:bar"
,
Expect
:
true
},
{
Namespace
:
"foo"
,
Name
:
"bar"
,
Username
:
"system:serviceaccount::bar"
,
Expect
:
false
},
{
Namespace
:
"foo"
,
Name
:
"bar"
,
Username
:
"system:serviceaccount:bar"
,
Expect
:
false
},
{
Namespace
:
"foo"
,
Name
:
"bar"
,
Username
:
":bar"
,
Expect
:
false
},
{
Namespace
:
"foo"
,
Name
:
"bar"
,
Username
:
"foo:bar"
,
Expect
:
false
},
{
Namespace
:
"foo"
,
Name
:
"bar"
,
Username
:
""
,
Expect
:
false
},
{
Namespace
:
"foo2"
,
Name
:
"bar"
,
Username
:
"system:serviceaccount:foo:bar"
,
Expect
:
false
},
{
Namespace
:
"foo"
,
Name
:
"bar2"
,
Username
:
"system:serviceaccount:foo:bar"
,
Expect
:
false
},
{
Namespace
:
"foo:"
,
Name
:
"bar"
,
Username
:
"system:serviceaccount:foo:bar"
,
Expect
:
false
},
{
Namespace
:
"foo"
,
Name
:
":bar"
,
Username
:
"system:serviceaccount:foo:bar"
,
Expect
:
false
},
}
for
_
,
tc
:=
range
testCases
{
t
.
Run
(
tc
.
TestName
,
func
(
t
*
testing
.
T
)
{
actual
:=
MatchesUsername
(
tc
.
Namespace
,
tc
.
Name
,
tc
.
Username
)
if
actual
!=
tc
.
Expect
{
t
.
Fatalf
(
"unexpected match"
)
}
})
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment