summaryrefslogtreecommitdiffstats
path: root/models/migrations
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/migrations
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/migrations')
-rw-r--r--models/migrations/migrations.go2
-rw-r--r--models/migrations/v1_21/v276.go132
2 files changed, 134 insertions, 0 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
+}