mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 00:20:25 +08:00 
			
		
		
		
	Repository transfer has to be confirmed, if user can not create repo for new owner (#14792)
* make repo as "pending transfer" if on transfer start doer has no right to create repo in new destination * if new pending transfer ocured, create UI & Mail notifications
This commit is contained in:
		@@ -70,3 +70,38 @@ func ChangeRepositoryName(doer *models.User, repo *models.Repository, newRepoNam
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// StartRepositoryTransfer transfer a repo from one owner to a new one.
 | 
			
		||||
// it make repository into pending transfer state, if doer can not create repo for new owner.
 | 
			
		||||
func StartRepositoryTransfer(doer, newOwner *models.User, repo *models.Repository, teams []*models.Team) error {
 | 
			
		||||
	if err := models.TestRepositoryReadyForTransfer(repo.Status); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Admin is always allowed to transfer || user transfer repo back to his account
 | 
			
		||||
	if doer.IsAdmin || doer.ID == newOwner.ID {
 | 
			
		||||
		return TransferOwnership(doer, newOwner, repo, teams)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// If new owner is an org and user can create repos he can transfer directly too
 | 
			
		||||
	if newOwner.IsOrganization() {
 | 
			
		||||
		allowed, err := models.CanCreateOrgRepo(newOwner.ID, doer.ID)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		if allowed {
 | 
			
		||||
			return TransferOwnership(doer, newOwner, repo, teams)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Make repo as pending for transfer
 | 
			
		||||
	repo.Status = models.RepositoryPendingTransfer
 | 
			
		||||
	if err := models.CreatePendingRepositoryTransfer(doer, newOwner, repo.ID, teams); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// notify users who are able to accept / reject transfer
 | 
			
		||||
	notification.NotifyRepoPendingTransfer(doer, newOwner, repo)
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user