mirror of
				https://github.com/go-gitea/gitea
				synced 2025-10-31 19:38:23 +00:00 
			
		
		
		
	Add RemoteAddress to mirrors (#26952)
				
					
				
			This PR adds a new field `RemoteAddress` to both mirror types which contains the sanitized remote address for easier (database) access to that information. Will be used in the audit PR if merged.
This commit is contained in:
		
							
								
								
									
										132
									
								
								models/migrations/v1_21/v276.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										132
									
								
								models/migrations/v1_21/v276.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,132 @@ | ||||
| // Copyright 2023 The Gitea Authors. All rights reserved. | ||||
| // SPDX-License-Identifier: MIT | ||||
|  | ||||
| package v1_21 //nolint | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"fmt" | ||||
| 	"path/filepath" | ||||
| 	"strings" | ||||
|  | ||||
| 	"code.gitea.io/gitea/modules/git" | ||||
| 	giturl "code.gitea.io/gitea/modules/git/url" | ||||
| 	"code.gitea.io/gitea/modules/setting" | ||||
|  | ||||
| 	"xorm.io/xorm" | ||||
| ) | ||||
|  | ||||
| func AddRemoteAddressToMirrors(x *xorm.Engine) error { | ||||
| 	type Mirror struct { | ||||
| 		RemoteAddress string `xorm:"VARCHAR(2048)"` | ||||
| 	} | ||||
|  | ||||
| 	type PushMirror struct { | ||||
| 		RemoteAddress string `xorm:"VARCHAR(2048)"` | ||||
| 	} | ||||
|  | ||||
| 	if err := x.Sync(new(Mirror), new(PushMirror)); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	if err := migratePullMirrors(x); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	return migratePushMirrors(x) | ||||
| } | ||||
|  | ||||
| func migratePullMirrors(x *xorm.Engine) error { | ||||
| 	type Mirror struct { | ||||
| 		ID            int64  `xorm:"pk autoincr"` | ||||
| 		RepoID        int64  `xorm:"INDEX"` | ||||
| 		RemoteAddress string `xorm:"VARCHAR(2048)"` | ||||
| 	} | ||||
|  | ||||
| 	sess := x.NewSession() | ||||
| 	defer sess.Close() | ||||
|  | ||||
| 	if err := sess.Begin(); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	if err := sess.Iterate(new(Mirror), func(_ int, bean any) error { | ||||
| 		m := bean.(*Mirror) | ||||
| 		remoteAddress, err := getRemoteAddress(sess, m.RepoID, "origin") | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
|  | ||||
| 		m.RemoteAddress = remoteAddress | ||||
|  | ||||
| 		_, err = sess.ID(m.ID).Cols("remote_address").Update(m) | ||||
| 		return err | ||||
| 	}); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	return sess.Commit() | ||||
| } | ||||
|  | ||||
| func migratePushMirrors(x *xorm.Engine) error { | ||||
| 	type PushMirror struct { | ||||
| 		ID            int64 `xorm:"pk autoincr"` | ||||
| 		RepoID        int64 `xorm:"INDEX"` | ||||
| 		RemoteName    string | ||||
| 		RemoteAddress string `xorm:"VARCHAR(2048)"` | ||||
| 	} | ||||
|  | ||||
| 	sess := x.NewSession() | ||||
| 	defer sess.Close() | ||||
|  | ||||
| 	if err := sess.Begin(); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	if err := sess.Iterate(new(PushMirror), func(_ int, bean any) error { | ||||
| 		m := bean.(*PushMirror) | ||||
| 		remoteAddress, err := getRemoteAddress(sess, m.RepoID, m.RemoteName) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
|  | ||||
| 		m.RemoteAddress = remoteAddress | ||||
|  | ||||
| 		_, err = sess.ID(m.ID).Cols("remote_address").Update(m) | ||||
| 		return err | ||||
| 	}); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	return sess.Commit() | ||||
| } | ||||
|  | ||||
| func getRemoteAddress(sess *xorm.Session, repoID int64, remoteName string) (string, error) { | ||||
| 	var ownerName string | ||||
| 	var repoName string | ||||
| 	has, err := sess. | ||||
| 		Table("repository"). | ||||
| 		Cols("owner_name", "lower_name"). | ||||
| 		Where("id=?", repoID). | ||||
| 		Get(&ownerName, &repoName) | ||||
| 	if err != nil { | ||||
| 		return "", err | ||||
| 	} else if !has { | ||||
| 		return "", fmt.Errorf("repository [%v] not found", repoID) | ||||
| 	} | ||||
|  | ||||
| 	repoPath := filepath.Join(setting.RepoRootPath, strings.ToLower(ownerName), strings.ToLower(repoName)+".git") | ||||
|  | ||||
| 	remoteURL, err := git.GetRemoteAddress(context.Background(), repoPath, remoteName) | ||||
| 	if err != nil { | ||||
| 		return "", err | ||||
| 	} | ||||
|  | ||||
| 	u, err := giturl.Parse(remoteURL) | ||||
| 	if err != nil { | ||||
| 		return "", err | ||||
| 	} | ||||
| 	u.User = nil | ||||
|  | ||||
| 	return u.String(), nil | ||||
| } | ||||
		Reference in New Issue
	
	Block a user