mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 00:20:25 +08:00 
			
		
		
		
	Update migrated repositories' issues/comments/prs poster id if user has a github external user saved (#7751)
* update migrated issues/comments when login as github * add get userid when migrating or login with github oauth2 * fix lint * add migrations for repository service type * fix build * remove unnecessary dependencies on migrations * add cron task to update migrations poster ids and fix posterid when migrating * fix lint * fix lint * improve code * fix lint * improve code * replace releases publish id to actual author id * fix import * fix bug * fix lint * fix rawdata definition * fix some bugs * fix error message
This commit is contained in:
		@@ -8,6 +8,7 @@ package repo
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"net/url"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"code.gitea.io/gitea/models"
 | 
			
		||||
@@ -17,6 +18,7 @@ import (
 | 
			
		||||
	"code.gitea.io/gitea/modules/migrations"
 | 
			
		||||
	"code.gitea.io/gitea/modules/notification"
 | 
			
		||||
	"code.gitea.io/gitea/modules/setting"
 | 
			
		||||
	"code.gitea.io/gitea/modules/structs"
 | 
			
		||||
	api "code.gitea.io/gitea/modules/structs"
 | 
			
		||||
	"code.gitea.io/gitea/modules/util"
 | 
			
		||||
	"code.gitea.io/gitea/modules/validation"
 | 
			
		||||
@@ -397,21 +399,28 @@ func Migrate(ctx *context.APIContext, form auth.MigrateRepoForm) {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var gitServiceType = structs.PlainGitService
 | 
			
		||||
	u, err := url.Parse(remoteAddr)
 | 
			
		||||
	if err == nil && strings.EqualFold(u.Host, "github.com") {
 | 
			
		||||
		gitServiceType = structs.GithubService
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var opts = migrations.MigrateOptions{
 | 
			
		||||
		CloneAddr:    remoteAddr,
 | 
			
		||||
		RepoName:     form.RepoName,
 | 
			
		||||
		Description:  form.Description,
 | 
			
		||||
		Private:      form.Private || setting.Repository.ForcePrivate,
 | 
			
		||||
		Mirror:       form.Mirror,
 | 
			
		||||
		AuthUsername: form.AuthUsername,
 | 
			
		||||
		AuthPassword: form.AuthPassword,
 | 
			
		||||
		Wiki:         form.Wiki,
 | 
			
		||||
		Issues:       form.Issues,
 | 
			
		||||
		Milestones:   form.Milestones,
 | 
			
		||||
		Labels:       form.Labels,
 | 
			
		||||
		Comments:     true,
 | 
			
		||||
		PullRequests: form.PullRequests,
 | 
			
		||||
		Releases:     form.Releases,
 | 
			
		||||
		CloneAddr:      remoteAddr,
 | 
			
		||||
		RepoName:       form.RepoName,
 | 
			
		||||
		Description:    form.Description,
 | 
			
		||||
		Private:        form.Private || setting.Repository.ForcePrivate,
 | 
			
		||||
		Mirror:         form.Mirror,
 | 
			
		||||
		AuthUsername:   form.AuthUsername,
 | 
			
		||||
		AuthPassword:   form.AuthPassword,
 | 
			
		||||
		Wiki:           form.Wiki,
 | 
			
		||||
		Issues:         form.Issues,
 | 
			
		||||
		Milestones:     form.Milestones,
 | 
			
		||||
		Labels:         form.Labels,
 | 
			
		||||
		Comments:       true,
 | 
			
		||||
		PullRequests:   form.PullRequests,
 | 
			
		||||
		Releases:       form.Releases,
 | 
			
		||||
		GitServiceType: gitServiceType,
 | 
			
		||||
	}
 | 
			
		||||
	if opts.Mirror {
 | 
			
		||||
		opts.Issues = false
 | 
			
		||||
 
 | 
			
		||||
@@ -21,6 +21,7 @@ import (
 | 
			
		||||
	"code.gitea.io/gitea/modules/setting"
 | 
			
		||||
	"code.gitea.io/gitea/modules/timeutil"
 | 
			
		||||
	"code.gitea.io/gitea/modules/util"
 | 
			
		||||
	"code.gitea.io/gitea/services/externalaccount"
 | 
			
		||||
	"code.gitea.io/gitea/services/mailer"
 | 
			
		||||
 | 
			
		||||
	"gitea.com/macaron/captcha"
 | 
			
		||||
@@ -277,7 +278,7 @@ func TwoFactorPost(ctx *context.Context, form auth.TwoFactorAuthForm) {
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			err = models.LinkAccountToUser(u, gothUser.(goth.User))
 | 
			
		||||
			err = externalaccount.LinkAccountToUser(u, gothUser.(goth.User))
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				ctx.ServerError("UserSignIn", err)
 | 
			
		||||
				return
 | 
			
		||||
@@ -452,7 +453,7 @@ func U2FSign(ctx *context.Context, signResp u2f.SignResponse) {
 | 
			
		||||
					return
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				err = models.LinkAccountToUser(user, gothUser.(goth.User))
 | 
			
		||||
				err = externalaccount.LinkAccountToUser(user, gothUser.(goth.User))
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					ctx.ServerError("UserSignIn", err)
 | 
			
		||||
					return
 | 
			
		||||
@@ -601,36 +602,42 @@ func handleOAuth2SignIn(u *models.User, gothUser goth.User, ctx *context.Context
 | 
			
		||||
	// Instead, redirect them to the 2FA authentication page.
 | 
			
		||||
	_, err = models.GetTwoFactorByUID(u.ID)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		if models.IsErrTwoFactorNotEnrolled(err) {
 | 
			
		||||
			err = ctx.Session.Set("uid", u.ID)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				log.Error(fmt.Sprintf("Error setting session: %v", err))
 | 
			
		||||
			}
 | 
			
		||||
			err = ctx.Session.Set("uname", u.Name)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				log.Error(fmt.Sprintf("Error setting session: %v", err))
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			// Clear whatever CSRF has right now, force to generate a new one
 | 
			
		||||
			ctx.SetCookie(setting.CSRFCookieName, "", -1, setting.AppSubURL, setting.SessionConfig.Domain, setting.SessionConfig.Secure, true)
 | 
			
		||||
 | 
			
		||||
			// Register last login
 | 
			
		||||
			u.SetLastLogin()
 | 
			
		||||
			if err := models.UpdateUserCols(u, "last_login_unix"); err != nil {
 | 
			
		||||
				ctx.ServerError("UpdateUserCols", err)
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if redirectTo := ctx.GetCookie("redirect_to"); len(redirectTo) > 0 {
 | 
			
		||||
				ctx.SetCookie("redirect_to", "", -1, setting.AppSubURL, "", setting.SessionConfig.Secure, true)
 | 
			
		||||
				ctx.RedirectToFirst(redirectTo)
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			ctx.Redirect(setting.AppSubURL + "/")
 | 
			
		||||
		} else {
 | 
			
		||||
		if !models.IsErrTwoFactorNotEnrolled(err) {
 | 
			
		||||
			ctx.ServerError("UserSignIn", err)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		err = ctx.Session.Set("uid", u.ID)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			log.Error(fmt.Sprintf("Error setting session: %v", err))
 | 
			
		||||
		}
 | 
			
		||||
		err = ctx.Session.Set("uname", u.Name)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			log.Error(fmt.Sprintf("Error setting session: %v", err))
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// Clear whatever CSRF has right now, force to generate a new one
 | 
			
		||||
		ctx.SetCookie(setting.CSRFCookieName, "", -1, setting.AppSubURL, setting.SessionConfig.Domain, setting.SessionConfig.Secure, true)
 | 
			
		||||
 | 
			
		||||
		// Register last login
 | 
			
		||||
		u.SetLastLogin()
 | 
			
		||||
		if err := models.UpdateUserCols(u, "last_login_unix"); err != nil {
 | 
			
		||||
			ctx.ServerError("UpdateUserCols", err)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// update external user information
 | 
			
		||||
		if err := models.UpdateExternalUser(u, gothUser); err != nil {
 | 
			
		||||
			log.Error("UpdateExternalUser failed: %v", err)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if redirectTo := ctx.GetCookie("redirect_to"); len(redirectTo) > 0 {
 | 
			
		||||
			ctx.SetCookie("redirect_to", "", -1, setting.AppSubURL, "", setting.SessionConfig.Secure, true)
 | 
			
		||||
			ctx.RedirectToFirst(redirectTo)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		ctx.Redirect(setting.AppSubURL + "/")
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -675,7 +682,7 @@ func oAuth2UserLoginCallback(loginSource *models.LoginSource, request *http.Requ
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if hasUser {
 | 
			
		||||
		return user, goth.User{}, nil
 | 
			
		||||
		return user, gothUser, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// search in external linked users
 | 
			
		||||
@@ -689,7 +696,7 @@ func oAuth2UserLoginCallback(loginSource *models.LoginSource, request *http.Requ
 | 
			
		||||
	}
 | 
			
		||||
	if hasUser {
 | 
			
		||||
		user, err = models.GetUserByID(externalLoginUser.UserID)
 | 
			
		||||
		return user, goth.User{}, err
 | 
			
		||||
		return user, gothUser, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// no user found to login
 | 
			
		||||
@@ -789,16 +796,18 @@ func LinkAccountPostSignIn(ctx *context.Context, signInForm auth.SignInForm) {
 | 
			
		||||
	// Instead, redirect them to the 2FA authentication page.
 | 
			
		||||
	_, err = models.GetTwoFactorByUID(u.ID)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		if models.IsErrTwoFactorNotEnrolled(err) {
 | 
			
		||||
			err = models.LinkAccountToUser(u, gothUser.(goth.User))
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				ctx.ServerError("UserLinkAccount", err)
 | 
			
		||||
			} else {
 | 
			
		||||
				handleSignIn(ctx, u, signInForm.Remember)
 | 
			
		||||
			}
 | 
			
		||||
		} else {
 | 
			
		||||
		if !models.IsErrTwoFactorNotEnrolled(err) {
 | 
			
		||||
			ctx.ServerError("UserLinkAccount", err)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		err = externalaccount.LinkAccountToUser(u, gothUser.(goth.User))
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			ctx.ServerError("UserLinkAccount", err)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		handleSignIn(ctx, u, signInForm.Remember)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -947,6 +956,11 @@ func LinkAccountPostRegister(ctx *context.Context, cpt *captcha.Captcha, form au
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// update external user information
 | 
			
		||||
	if err := models.UpdateExternalUser(u, gothUser.(goth.User)); err != nil {
 | 
			
		||||
		log.Error("UpdateExternalUser failed: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Send confirmation email
 | 
			
		||||
	if setting.Service.RegisterEmailConfirm && u.ID > 1 {
 | 
			
		||||
		mailer.SendActivateAccountMail(ctx.Locale, u)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user