Skip to content

Commit c766140

Browse files
authored
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.
1 parent 5e039b0 commit c766140

File tree

13 files changed

+194
-53
lines changed

13 files changed

+194
-53
lines changed

models/migrations/migrations.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -532,6 +532,8 @@ var migrations = []Migration{
532532
NewMigration("Add Actions artifacts expiration date", v1_21.AddExpiredUnixColumnInActionArtifactTable),
533533
// v275 -> v276
534534
NewMigration("Add ScheduleID for ActionRun", v1_21.AddScheduleIDForActionRun),
535+
// v276 -> v277
536+
NewMigration("Add RemoteAddress to mirrors", v1_21.AddRemoteAddressToMirrors),
535537
}
536538

537539
// GetCurrentDBVersion returns the current db version

models/migrations/v1_21/v276.go

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
// Copyright 2023 The Gitea Authors. All rights reserved.
2+
// SPDX-License-Identifier: MIT
3+
4+
package v1_21 //nolint
5+
6+
import (
7+
"context"
8+
"fmt"
9+
"path/filepath"
10+
"strings"
11+
12+
"code.gitea.io/gitea/modules/git"
13+
giturl "code.gitea.io/gitea/modules/git/url"
14+
"code.gitea.io/gitea/modules/setting"
15+
16+
"xorm.io/xorm"
17+
)
18+
19+
func AddRemoteAddressToMirrors(x *xorm.Engine) error {
20+
type Mirror struct {
21+
RemoteAddress string `xorm:"VARCHAR(2048)"`
22+
}
23+
24+
type PushMirror struct {
25+
RemoteAddress string `xorm:"VARCHAR(2048)"`
26+
}
27+
28+
if err := x.Sync(new(Mirror), new(PushMirror)); err != nil {
29+
return err
30+
}
31+
32+
if err := migratePullMirrors(x); err != nil {
33+
return err
34+
}
35+
36+
return migratePushMirrors(x)
37+
}
38+
39+
func migratePullMirrors(x *xorm.Engine) error {
40+
type Mirror struct {
41+
ID int64 `xorm:"pk autoincr"`
42+
RepoID int64 `xorm:"INDEX"`
43+
RemoteAddress string `xorm:"VARCHAR(2048)"`
44+
}
45+
46+
sess := x.NewSession()
47+
defer sess.Close()
48+
49+
if err := sess.Begin(); err != nil {
50+
return err
51+
}
52+
53+
if err := sess.Iterate(new(Mirror), func(_ int, bean any) error {
54+
m := bean.(*Mirror)
55+
remoteAddress, err := getRemoteAddress(sess, m.RepoID, "origin")
56+
if err != nil {
57+
return err
58+
}
59+
60+
m.RemoteAddress = remoteAddress
61+
62+
_, err = sess.ID(m.ID).Cols("remote_address").Update(m)
63+
return err
64+
}); err != nil {
65+
return err
66+
}
67+
68+
return sess.Commit()
69+
}
70+
71+
func migratePushMirrors(x *xorm.Engine) error {
72+
type PushMirror struct {
73+
ID int64 `xorm:"pk autoincr"`
74+
RepoID int64 `xorm:"INDEX"`
75+
RemoteName string
76+
RemoteAddress string `xorm:"VARCHAR(2048)"`
77+
}
78+
79+
sess := x.NewSession()
80+
defer sess.Close()
81+
82+
if err := sess.Begin(); err != nil {
83+
return err
84+
}
85+
86+
if err := sess.Iterate(new(PushMirror), func(_ int, bean any) error {
87+
m := bean.(*PushMirror)
88+
remoteAddress, err := getRemoteAddress(sess, m.RepoID, m.RemoteName)
89+
if err != nil {
90+
return err
91+
}
92+
93+
m.RemoteAddress = remoteAddress
94+
95+
_, err = sess.ID(m.ID).Cols("remote_address").Update(m)
96+
return err
97+
}); err != nil {
98+
return err
99+
}
100+
101+
return sess.Commit()
102+
}
103+
104+
func getRemoteAddress(sess *xorm.Session, repoID int64, remoteName string) (string, error) {
105+
var ownerName string
106+
var repoName string
107+
has, err := sess.
108+
Table("repository").
109+
Cols("owner_name", "lower_name").
110+
Where("id=?", repoID).
111+
Get(&ownerName, &repoName)
112+
if err != nil {
113+
return "", err
114+
} else if !has {
115+
return "", fmt.Errorf("repository [%v] not found", repoID)
116+
}
117+
118+
repoPath := filepath.Join(setting.RepoRootPath, strings.ToLower(ownerName), strings.ToLower(repoName)+".git")
119+
120+
remoteURL, err := git.GetRemoteAddress(context.Background(), repoPath, remoteName)
121+
if err != nil {
122+
return "", err
123+
}
124+
125+
u, err := giturl.Parse(remoteURL)
126+
if err != nil {
127+
return "", err
128+
}
129+
u.User = nil
130+
131+
return u.String(), nil
132+
}

models/repo/mirror.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ type Mirror struct {
3131
LFS bool `xorm:"lfs_enabled NOT NULL DEFAULT false"`
3232
LFSEndpoint string `xorm:"lfs_endpoint TEXT"`
3333

34-
Address string `xorm:"-"`
34+
RemoteAddress string `xorm:"VARCHAR(2048)"`
3535
}
3636

3737
func init() {

models/repo/pushmirror.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,19 @@ var ErrPushMirrorNotExist = util.NewNotExistErrorf("PushMirror does not exist")
2020

2121
// PushMirror represents mirror information of a repository.
2222
type PushMirror struct {
23-
ID int64 `xorm:"pk autoincr"`
24-
RepoID int64 `xorm:"INDEX"`
25-
Repo *Repository `xorm:"-"`
26-
RemoteName string
23+
ID int64 `xorm:"pk autoincr"`
24+
RepoID int64 `xorm:"INDEX"`
25+
Repo *Repository `xorm:"-"`
26+
RemoteName string
27+
RemoteAddress string `xorm:"VARCHAR(2048)"`
2728

2829
SyncOnCommit bool `xorm:"NOT NULL DEFAULT true"`
2930
Interval time.Duration
3031
CreatedUnix timeutil.TimeStamp `xorm:"created"`
3132
LastUpdateUnix timeutil.TimeStamp `xorm:"INDEX last_update"`
3233
LastError string `xorm:"text"`
3334
}
35+
3436
type PushMirrorOptions struct {
3537
ID int64
3638
RepoID int64

models/repo/repo.go

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -191,12 +191,8 @@ func (repo *Repository) SanitizedOriginalURL() string {
191191
if repo.OriginalURL == "" {
192192
return ""
193193
}
194-
u, err := url.Parse(repo.OriginalURL)
195-
if err != nil {
196-
return ""
197-
}
198-
u.User = nil
199-
return u.String()
194+
u, _ := util.SanitizeURL(repo.OriginalURL)
195+
return u
200196
}
201197

202198
// text representations to be returned in SizeDetail.Name

modules/repository/repo.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,12 +180,17 @@ func MigrateRepositoryGitData(ctx context.Context, u *user_model.User,
180180
defer committer.Close()
181181

182182
if opts.Mirror {
183+
remoteAddress, err := util.SanitizeURL(opts.CloneAddr)
184+
if err != nil {
185+
return repo, err
186+
}
183187
mirrorModel := repo_model.Mirror{
184188
RepoID: repo.ID,
185189
Interval: setting.Mirror.DefaultInterval,
186190
EnablePrune: true,
187191
NextUpdateUnix: timeutil.TimeStampNow().AddDuration(setting.Mirror.DefaultInterval),
188192
LFS: opts.LFS,
193+
RemoteAddress: remoteAddress,
189194
}
190195
if opts.LFS {
191196
mirrorModel.LFSEndpoint = opts.LFSEndpoint

modules/util/url.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,12 @@ func URLJoin(base string, elems ...string) string {
3939
}
4040
return joinedURL
4141
}
42+
43+
func SanitizeURL(s string) (string, error) {
44+
u, err := url.Parse(s)
45+
if err != nil {
46+
return "", err
47+
}
48+
u.User = nil
49+
return u.String(), nil
50+
}

routers/api/v1/repo/mirror.go

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -353,12 +353,19 @@ func CreatePushMirror(ctx *context.APIContext, mirrorOption *api.CreatePushMirro
353353
return
354354
}
355355

356+
remoteAddress, err := util.SanitizeURL(mirrorOption.RemoteAddress)
357+
if err != nil {
358+
ctx.ServerError("SanitizeURL", err)
359+
return
360+
}
361+
356362
pushMirror := &repo_model.PushMirror{
357-
RepoID: repo.ID,
358-
Repo: repo,
359-
RemoteName: fmt.Sprintf("remote_mirror_%s", remoteSuffix),
360-
Interval: interval,
361-
SyncOnCommit: mirrorOption.SyncOnCommit,
363+
RepoID: repo.ID,
364+
Repo: repo,
365+
RemoteName: fmt.Sprintf("remote_mirror_%s", remoteSuffix),
366+
Interval: interval,
367+
SyncOnCommit: mirrorOption.SyncOnCommit,
368+
RemoteAddress: remoteAddress,
362369
}
363370

364371
if err = repo_model.InsertPushMirror(ctx, pushMirror); err != nil {

routers/web/repo/setting/setting.go

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,13 @@ func SettingsPost(ctx *context.Context) {
243243
return
244244
}
245245

246+
remoteAddress, err := util.SanitizeURL(form.MirrorAddress)
247+
if err != nil {
248+
ctx.ServerError("SanitizeURL", err)
249+
return
250+
}
251+
pullMirror.RemoteAddress = remoteAddress
252+
246253
form.LFS = form.LFS && setting.LFS.StartServer
247254

248255
if len(form.LFSEndpoint) > 0 {
@@ -397,12 +404,19 @@ func SettingsPost(ctx *context.Context) {
397404
return
398405
}
399406

407+
remoteAddress, err := util.SanitizeURL(form.PushMirrorAddress)
408+
if err != nil {
409+
ctx.ServerError("SanitizeURL", err)
410+
return
411+
}
412+
400413
m := &repo_model.PushMirror{
401-
RepoID: repo.ID,
402-
Repo: repo,
403-
RemoteName: fmt.Sprintf("remote_mirror_%s", remoteSuffix),
404-
SyncOnCommit: form.PushMirrorSyncOnCommit,
405-
Interval: interval,
414+
RepoID: repo.ID,
415+
Repo: repo,
416+
RemoteName: fmt.Sprintf("remote_mirror_%s", remoteSuffix),
417+
SyncOnCommit: form.PushMirrorSyncOnCommit,
418+
Interval: interval,
419+
RemoteAddress: remoteAddress,
406420
}
407421
if err := repo_model.InsertPushMirror(ctx, m); err != nil {
408422
ctx.ServerError("InsertPushMirror", err)

routers/web/repo/view.go

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -628,15 +628,6 @@ func markupRender(ctx *context.Context, renderCtx *markup.RenderContext, input i
628628
return escaped, output, err
629629
}
630630

631-
func safeURL(address string) string {
632-
u, err := url.Parse(address)
633-
if err != nil {
634-
return address
635-
}
636-
u.User = nil
637-
return u.String()
638-
}
639-
640631
func checkHomeCodeViewable(ctx *context.Context) {
641632
if len(ctx.Repo.Units) > 0 {
642633
if ctx.Repo.Repository.IsBeingCreated() {
@@ -660,7 +651,7 @@ func checkHomeCodeViewable(ctx *context.Context) {
660651

661652
ctx.Data["Repo"] = ctx.Repo
662653
ctx.Data["MigrateTask"] = task
663-
ctx.Data["CloneAddr"] = safeURL(cfg.CloneAddr)
654+
ctx.Data["CloneAddr"], _ = util.SanitizeURL(cfg.CloneAddr)
664655
ctx.Data["Failed"] = task.Status == structs.TaskStatusFailed
665656
ctx.HTML(http.StatusOK, tplMigrating)
666657
return

services/convert/mirror.go

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,35 +5,20 @@ package convert
55

66
import (
77
repo_model "code.gitea.io/gitea/models/repo"
8-
"code.gitea.io/gitea/modules/git"
98
api "code.gitea.io/gitea/modules/structs"
109
)
1110

1211
// ToPushMirror convert from repo_model.PushMirror and remoteAddress to api.TopicResponse
1312
func ToPushMirror(pm *repo_model.PushMirror) (*api.PushMirror, error) {
1413
repo := pm.GetRepository()
15-
remoteAddress, err := getRemoteAddress(repo, pm.RemoteName)
16-
if err != nil {
17-
return nil, err
18-
}
1914
return &api.PushMirror{
2015
RepoName: repo.Name,
2116
RemoteName: pm.RemoteName,
22-
RemoteAddress: remoteAddress,
17+
RemoteAddress: pm.RemoteAddress,
2318
CreatedUnix: pm.CreatedUnix.FormatLong(),
2419
LastUpdateUnix: pm.LastUpdateUnix.FormatLong(),
2520
LastError: pm.LastError,
2621
Interval: pm.Interval.String(),
2722
SyncOnCommit: pm.SyncOnCommit,
2823
}, nil
2924
}
30-
31-
func getRemoteAddress(repo *repo_model.Repository, remoteName string) (string, error) {
32-
url, err := git.GetRemoteURL(git.DefaultContext, repo.RepoPath(), remoteName)
33-
if err != nil {
34-
return "", err
35-
}
36-
// remove confidential information
37-
url.User = nil
38-
return url.String(), nil
39-
}

templates/repo/header.tmpl

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,7 @@
3737
{{end}}
3838
</div>
3939
{{if $.PullMirror}}
40-
{{$address := MirrorRemoteAddress $.Context . $.PullMirror.GetRemoteName false}}
41-
<div class="fork-flag">{{$.locale.Tr "repo.mirror_from"}} <a target="_blank" rel="noopener noreferrer" href="{{$address.Address}}">{{$address.Address}}</a></div>
40+
<div class="fork-flag">{{$.locale.Tr "repo.mirror_from"}} <a target="_blank" rel="noopener noreferrer" href="{{$.PullMirror.RemoteAddress}}">{{$.PullMirror.RemoteAddress}}</a></div>
4241
{{end}}
4342
{{if .IsFork}}<div class="fork-flag">{{$.locale.Tr "repo.forked_from"}} <a href="{{.BaseRepo.Link}}">{{.BaseRepo.FullName}}</a></div>{{end}}
4443
{{if .IsGenerated}}<div class="fork-flag">{{$.locale.Tr "repo.generated_from"}} <a href="{{.TemplateRepo.Link}}">{{.TemplateRepo.FullName}}</a></div>{{end}}

templates/repo/settings/options.tmpl

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@
123123
{{else if $isWorkingPullMirror}}
124124
<tbody>
125125
<tr>
126-
<td>{{(MirrorRemoteAddress $.Context .Repository .PullMirror.GetRemoteName false).Address}}</td>
126+
<td>{{.PullMirror.RemoteAddress}}</td>
127127
<td>{{$.locale.Tr "repo.settings.mirror_settings.direction.pull"}}</td>
128128
<td>{{DateTime "full" .PullMirror.UpdatedUnix}}</td>
129129
<td class="right aligned">
@@ -200,8 +200,7 @@
200200
<tbody>
201201
{{range .PushMirrors}}
202202
<tr>
203-
{{$address := MirrorRemoteAddress $.Context $.Repository .GetRemoteName true}}
204-
<td class="gt-word-break">{{$address.Address}}</td>
203+
<td class="gt-word-break">{{.RemoteAddress}}</td>
205204
<td>{{$.locale.Tr "repo.settings.mirror_settings.direction.push"}}</td>
206205
<td>{{if .LastUpdateUnix}}{{DateTime "full" .LastUpdateUnix}}{{else}}{{$.locale.Tr "never"}}{{end}} {{if .LastError}}<div class="ui red label" data-tooltip-content="{{.LastError}}">{{$.locale.Tr "error"}}</div>{{end}}</td>
207206
<td class="right aligned">
@@ -211,7 +210,7 @@
211210
data-tooltip-content="{{$.locale.Tr "repo.settings.mirror_settings.push_mirror.edit_sync_time"}}"
212211
data-modal-push-mirror-edit-id="{{.ID}}"
213212
data-modal-push-mirror-edit-interval="{{.Interval}}"
214-
data-modal-push-mirror-edit-address="{{$address.Address}}"
213+
data-modal-push-mirror-edit-address="{{.RemoteAddress}}"
215214
>
216215
{{svg "octicon-pencil" 14}}
217216
</button>

0 commit comments

Comments
 (0)