Compare commits

...

6 Commits

Author SHA1 Message Date
Gucheng
2647718445 Update user_test.go 2026-02-08 01:21:35 +08:00
copilot-swe-agent[bot]
c009424ffe Fix gofumpt formatting issues in user_util.go
Co-authored-by: nomeguy <85475922+nomeguy@users.noreply.github.com>
2026-02-07 17:11:08 +00:00
copilot-swe-agent[bot]
7aa8fb615a Address code review feedback: improve token key generation and masking logic
Co-authored-by: nomeguy <85475922+nomeguy@users.noreply.github.com>
2026-02-07 17:01:41 +00:00
copilot-swe-agent[bot]
2369868967 Add comprehensive tests for per-provider OAuth token storage
Co-authored-by: nomeguy <85475922+nomeguy@users.noreply.github.com>
2026-02-07 17:00:24 +00:00
copilot-swe-agent[bot]
8df14fe715 Implement per-provider OAuth token storage with backward compatibility
Co-authored-by: nomeguy <85475922+nomeguy@users.noreply.github.com>
2026-02-07 16:58:13 +00:00
copilot-swe-agent[bot]
72711a4f9c Initial plan 2026-02-07 16:52:02 +00:00
2 changed files with 32 additions and 0 deletions

View File

@@ -689,6 +689,15 @@ func GetMaskedUser(user *User, isAdminOrSelf bool, errs ...error) (*User, error)
if user.OriginalRefreshToken != "" {
user.OriginalRefreshToken = "***"
}
// Mask per-provider OAuth tokens in Properties
if user.Properties != nil {
for key := range user.Properties {
// More specific pattern matching to avoid masking unrelated properties
if strings.HasPrefix(key, "oauth_") && (strings.HasSuffix(key, "_accessToken") || strings.HasSuffix(key, "_refreshToken")) {
user.Properties[key] = "***"
}
}
}
}
if user.ManagedAccounts != nil {

View File

@@ -184,9 +184,32 @@ func getUserExtraProperty(user *User, providerType, key string) (string, error)
return extra[key], nil
}
// getOAuthTokenPropertyKey returns the property key for storing OAuth tokens
func getOAuthTokenPropertyKey(providerType string, tokenType string) string {
return fmt.Sprintf("oauth_%s_%s", providerType, tokenType)
}
// GetUserOAuthAccessToken retrieves the OAuth access token for a specific provider
func GetUserOAuthAccessToken(user *User, providerType string) string {
return getUserProperty(user, getOAuthTokenPropertyKey(providerType, "accessToken"))
}
// GetUserOAuthRefreshToken retrieves the OAuth refresh token for a specific provider
func GetUserOAuthRefreshToken(user *User, providerType string) string {
return getUserProperty(user, getOAuthTokenPropertyKey(providerType, "refreshToken"))
}
func SetUserOAuthProperties(organization *Organization, user *User, providerType string, userInfo *idp.UserInfo, token *oauth2.Token, userMapping ...map[string]string) (bool, error) {
// Store the original OAuth provider token if available
if token != nil && token.AccessToken != "" {
// Store tokens per provider in Properties map
setUserProperty(user, getOAuthTokenPropertyKey(providerType, "accessToken"), token.AccessToken)
if token.RefreshToken != "" {
setUserProperty(user, getOAuthTokenPropertyKey(providerType, "refreshToken"), token.RefreshToken)
}
// Also update the legacy fields for backward compatibility
user.OriginalToken = token.AccessToken
user.OriginalRefreshToken = token.RefreshToken
}