aboutsummaryrefslogtreecommitdiffstats
path: root/models
diff options
context:
space:
mode:
authorKN4CK3R <admin@oldschoolhack.me>2023-09-16 18:03:02 +0200
committerGitHub <noreply@github.com>2023-09-16 16:03:02 +0000
commitc766140dad3408048ad843d0e7b4ab5d9f5777c6 (patch)
tree49cd37606ae0cb252cd16264c111c3cf5b00088d /models
parent5e039b05801a2ceeb29b23c657110af02834b57e (diff)
downloadgitea-c766140dad3408048ad843d0e7b4ab5d9f5777c6.tar.gz
gitea-c766140dad3408048ad843d0e7b4ab5d9f5777c6.zip
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.
Diffstat (limited to 'models')
-rw-r--r--models/migrations/migrations.go2
-rw-r--r--models/migrations/v1_21/v276.go132
-rw-r--r--models/repo/mirror.go2
-rw-r--r--models/repo/pushmirror.go10
-rw-r--r--models/repo/repo.go8
5 files changed, 143 insertions, 11 deletions
diff --git a/models/migrations/migrations.go b/models/migrations/migrations.go
index f0a8b05d53..3524077ea4 100644
--- a/models/migrations/migrations.go
+++ b/models/migrations/migrations.go
@@ -532,6 +532,8 @@ var migrations = []Migration{
NewMigration("Add Actions artifacts expiration date", v1_21.AddExpiredUnixColumnInActionArtifactTable),
// v275 -> v276
NewMigration("Add ScheduleID for ActionRun", v1_21.AddScheduleIDForActionRun),
+ // v276 -> v277
+ NewMigration("Add RemoteAddress to mirrors", v1_21.AddRemoteAddressToMirrors),
}
// GetCurrentDBVersion returns the current db version
diff --git a/models/migrations/v1_21/v276.go b/models/migrations/v1_21/v276.go
new file mode 100644
index 0000000000..8933f186dc
--- /dev/null
+++ b/models/migrations/v1_21/v276.go
@@ -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
+}
diff --git a/models/repo/mirror.go b/models/repo/mirror.go
index 39482037b2..fffc7577c7 100644
--- a/models/repo/mirror.go
+++ b/models/repo/mirror.go
@@ -31,7 +31,7 @@ type Mirror struct {
LFS bool `xorm:"lfs_enabled NOT NULL DEFAULT false"`
LFSEndpoint string `xorm:"lfs_endpoint TEXT"`
- Address string `xorm:"-"`
+ RemoteAddress string `xorm:"VARCHAR(2048)"`
}
func init() {
diff --git a/models/repo/pushmirror.go b/models/repo/pushmirror.go
index 3edbcceb9b..73c1384444 100644
--- a/models/repo/pushmirror.go
+++ b/models/repo/pushmirror.go
@@ -20,10 +20,11 @@ var ErrPushMirrorNotExist = util.NewNotExistErrorf("PushMirror does not exist")
// PushMirror represents mirror information of a repository.
type PushMirror struct {
- ID int64 `xorm:"pk autoincr"`
- RepoID int64 `xorm:"INDEX"`
- Repo *Repository `xorm:"-"`
- RemoteName string
+ ID int64 `xorm:"pk autoincr"`
+ RepoID int64 `xorm:"INDEX"`
+ Repo *Repository `xorm:"-"`
+ RemoteName string
+ RemoteAddress string `xorm:"VARCHAR(2048)"`
SyncOnCommit bool `xorm:"NOT NULL DEFAULT true"`
Interval time.Duration
@@ -31,6 +32,7 @@ type PushMirror struct {
LastUpdateUnix timeutil.TimeStamp `xorm:"INDEX last_update"`
LastError string `xorm:"text"`
}
+
type PushMirrorOptions struct {
ID int64
RepoID int64
diff --git a/models/repo/repo.go b/models/repo/repo.go
index b37948fea7..5ebc7bfc24 100644
--- a/models/repo/repo.go
+++ b/models/repo/repo.go
@@ -191,12 +191,8 @@ func (repo *Repository) SanitizedOriginalURL() string {
if repo.OriginalURL == "" {
return ""
}
- u, err := url.Parse(repo.OriginalURL)
- if err != nil {
- return ""
- }
- u.User = nil
- return u.String()
+ u, _ := util.SanitizeURL(repo.OriginalURL)
+ return u
}
// text representations to be returned in SizeDetail.Name