|
|
@@ -1,6 +1,7 @@
|
|
|
package controller
|
|
|
|
|
|
import (
|
|
|
+ "fmt"
|
|
|
"net/http"
|
|
|
"strconv"
|
|
|
|
|
|
@@ -147,11 +148,18 @@ func handleOAuthBind(c *gin.Context, provider oauth.Provider) {
|
|
|
return
|
|
|
}
|
|
|
|
|
|
- // Check if this OAuth account is already bound
|
|
|
+ // Check if this OAuth account is already bound (check both new ID and legacy ID)
|
|
|
if provider.IsUserIDTaken(oauthUser.ProviderUserID) {
|
|
|
common.ApiErrorI18n(c, i18n.MsgOAuthAlreadyBound, providerParams(provider.GetName()))
|
|
|
return
|
|
|
}
|
|
|
+ // Also check legacy ID to prevent duplicate bindings during migration period
|
|
|
+ if legacyID, ok := oauthUser.Extra["legacy_id"].(string); ok && legacyID != "" {
|
|
|
+ if provider.IsUserIDTaken(legacyID) {
|
|
|
+ common.ApiErrorI18n(c, i18n.MsgOAuthAlreadyBound, providerParams(provider.GetName()))
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
// Get current user from session
|
|
|
session := sessions.Default(c)
|
|
|
@@ -178,7 +186,7 @@ func handleOAuthBind(c *gin.Context, provider oauth.Provider) {
|
|
|
func findOrCreateOAuthUser(c *gin.Context, provider oauth.Provider, oauthUser *oauth.OAuthUser, session sessions.Session) (*model.User, error) {
|
|
|
user := &model.User{}
|
|
|
|
|
|
- // Check if user already exists
|
|
|
+ // Check if user already exists with new ID
|
|
|
if provider.IsUserIDTaken(oauthUser.ProviderUserID) {
|
|
|
provider.SetProviderUserID(user, oauthUser.ProviderUserID)
|
|
|
err := provider.FillUserByProviderID(user, oauthUser.ProviderUserID)
|
|
|
@@ -192,6 +200,27 @@ func findOrCreateOAuthUser(c *gin.Context, provider oauth.Provider, oauthUser *o
|
|
|
return user, nil
|
|
|
}
|
|
|
|
|
|
+ // Try to find user with legacy ID (for GitHub migration from login to numeric ID)
|
|
|
+ if legacyID, ok := oauthUser.Extra["legacy_id"].(string); ok && legacyID != "" {
|
|
|
+ if provider.IsUserIDTaken(legacyID) {
|
|
|
+ provider.SetProviderUserID(user, legacyID)
|
|
|
+ err := provider.FillUserByProviderID(user, legacyID)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ if user.Id != 0 {
|
|
|
+ // Found user with legacy ID, migrate to new ID
|
|
|
+ common.SysLog(fmt.Sprintf("[OAuth] Migrating user %d from legacy_id=%s to new_id=%s",
|
|
|
+ user.Id, legacyID, oauthUser.ProviderUserID))
|
|
|
+ if err := user.UpdateGitHubId(oauthUser.ProviderUserID); err != nil {
|
|
|
+ common.SysError(fmt.Sprintf("[OAuth] Failed to migrate user %d: %s", user.Id, err.Error()))
|
|
|
+ // Continue with login even if migration fails
|
|
|
+ }
|
|
|
+ return user, nil
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
// User doesn't exist, create new user if registration is enabled
|
|
|
if !common.RegisterEnabled {
|
|
|
return nil, &OAuthRegistrationDisabledError{}
|