aboutsummaryrefslogtreecommitdiffstats
path: root/models/auth/token_scope.go
diff options
context:
space:
mode:
authorzeripath <art27@cantab.net>2023-02-20 21:28:44 +0000
committerGitHub <noreply@github.com>2023-02-20 15:28:44 -0600
commitd2128b44f714fcaacdc88865e62f6f9dd8216577 (patch)
treef6697bf42a61acc7f31b378882124e764281106b /models/auth/token_scope.go
parent330b16642305458339d12222eea2ee9a1bbb3b64 (diff)
downloadgitea-d2128b44f714fcaacdc88865e62f6f9dd8216577.tar.gz
gitea-d2128b44f714fcaacdc88865e62f6f9dd8216577.zip
Add scopes to API to create token and display them (#22989)
The API to create tokens is missing the ability to set the required scopes for tokens, and to show them on the API and on the UI. This PR adds this functionality. Signed-off-by: Andrew Thornton <art27@cantab.net>
Diffstat (limited to 'models/auth/token_scope.go')
-rw-r--r--models/auth/token_scope.go25
1 files changed, 22 insertions, 3 deletions
diff --git a/models/auth/token_scope.go b/models/auth/token_scope.go
index c61c306496..38733a1c8f 100644
--- a/models/auth/token_scope.go
+++ b/models/auth/token_scope.go
@@ -168,10 +168,23 @@ var allAccessTokenScopeBits = map[AccessTokenScope]AccessTokenScopeBitmap{
// Parse parses the scope string into a bitmap, thus removing possible duplicates.
func (s AccessTokenScope) Parse() (AccessTokenScopeBitmap, error) {
- list := strings.Split(string(s), ",")
-
var bitmap AccessTokenScopeBitmap
- for _, v := range list {
+
+ // The following is the more performant equivalent of 'for _, v := range strings.Split(remainingScope, ",")' as this is hot code
+ remainingScopes := string(s)
+ for len(remainingScopes) > 0 {
+ i := strings.IndexByte(remainingScopes, ',')
+ var v string
+ if i < 0 {
+ v = remainingScopes
+ remainingScopes = ""
+ } else if i+1 >= len(remainingScopes) {
+ v = remainingScopes[:i]
+ remainingScopes = ""
+ } else {
+ v = remainingScopes[:i]
+ remainingScopes = remainingScopes[i+1:]
+ }
singleScope := AccessTokenScope(v)
if singleScope == "" {
continue
@@ -187,9 +200,15 @@ func (s AccessTokenScope) Parse() (AccessTokenScopeBitmap, error) {
}
bitmap |= bits
}
+
return bitmap, nil
}
+// StringSlice returns the AccessTokenScope as a []string
+func (s AccessTokenScope) StringSlice() []string {
+ return strings.Split(string(s), ",")
+}
+
// Normalize returns a normalized scope string without any duplicates.
func (s AccessTokenScope) Normalize() (AccessTokenScope, error) {
bitmap, err := s.Parse()