mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2025-10-05 19:30:58 +00:00
**Backport: https://codeberg.org/forgejo/forgejo/pulls/9064** It is no longer possible to specify the user and password when providing a URL for migrating a repository, the fields dedicated to that purpose on the form must be used instead. This is to prevent that those credentials are displayed in the repository settings that are visible by the repository admins, in the case where the migration is a mirror. Co-authored-by: Gergely Nagy <forgejo@gergo.csillger.hu> Co-authored-by: Gusted <postmaster@gusted.xyz> Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/9065 Reviewed-by: Gusted <gusted@noreply.codeberg.org> Reviewed-by: 0ko <0ko@noreply.codeberg.org>
121 lines
3.9 KiB
Go
121 lines
3.9 KiB
Go
// Copyright 2019 The Gitea Authors. All rights reserved.
|
|
// Copyright 2025 The Forgejo Authors. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package integration
|
|
|
|
import (
|
|
"net/http"
|
|
"testing"
|
|
|
|
"forgejo.org/models/db"
|
|
repo_model "forgejo.org/models/repo"
|
|
"forgejo.org/models/unittest"
|
|
user_model "forgejo.org/models/user"
|
|
"forgejo.org/modules/git"
|
|
"forgejo.org/modules/gitrepo"
|
|
"forgejo.org/modules/migration"
|
|
forgejo_context "forgejo.org/services/context"
|
|
mirror_service "forgejo.org/services/mirror"
|
|
release_service "forgejo.org/services/release"
|
|
repo_service "forgejo.org/services/repository"
|
|
"forgejo.org/tests"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestMirrorPull(t *testing.T) {
|
|
defer tests.PrepareTestEnv(t)()
|
|
|
|
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
|
|
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
|
|
repoPath := repo_model.RepoPath(user.Name, repo.Name)
|
|
|
|
opts := migration.MigrateOptions{
|
|
RepoName: "test_mirror",
|
|
Description: "Test mirror",
|
|
Private: false,
|
|
Mirror: true,
|
|
CloneAddr: repoPath,
|
|
Wiki: true,
|
|
Releases: false,
|
|
}
|
|
|
|
mirrorRepo, err := repo_service.CreateRepositoryDirectly(db.DefaultContext, user, user, repo_service.CreateRepoOptions{
|
|
Name: opts.RepoName,
|
|
Description: opts.Description,
|
|
IsPrivate: opts.Private,
|
|
IsMirror: opts.Mirror,
|
|
Status: repo_model.RepositoryBeingMigrated,
|
|
})
|
|
require.NoError(t, err)
|
|
assert.True(t, mirrorRepo.IsMirror, "expected pull-mirror repo to be marked as a mirror immediately after its creation")
|
|
|
|
ctx := t.Context()
|
|
|
|
mirror, err := repo_service.MigrateRepositoryGitData(ctx, user, mirrorRepo, opts, nil)
|
|
require.NoError(t, err)
|
|
|
|
gitRepo, err := gitrepo.OpenRepository(git.DefaultContext, repo)
|
|
require.NoError(t, err)
|
|
defer gitRepo.Close()
|
|
|
|
findOptions := repo_model.FindReleasesOptions{
|
|
IncludeDrafts: true,
|
|
IncludeTags: true,
|
|
RepoID: mirror.ID,
|
|
}
|
|
initCount, err := db.Count[repo_model.Release](db.DefaultContext, findOptions)
|
|
require.NoError(t, err)
|
|
|
|
require.NoError(t, release_service.CreateRelease(gitRepo, &repo_model.Release{
|
|
RepoID: repo.ID,
|
|
Repo: repo,
|
|
PublisherID: user.ID,
|
|
Publisher: user,
|
|
TagName: "v0.2",
|
|
Target: "master",
|
|
Title: "v0.2 is released",
|
|
Note: "v0.2 is released",
|
|
IsDraft: false,
|
|
IsPrerelease: false,
|
|
IsTag: true,
|
|
}, "", []*release_service.AttachmentChange{}))
|
|
|
|
_, err = repo_model.GetMirrorByRepoID(ctx, mirror.ID)
|
|
require.NoError(t, err)
|
|
|
|
ok := mirror_service.SyncPullMirror(ctx, mirror.ID)
|
|
assert.True(t, ok)
|
|
|
|
count, err := db.Count[repo_model.Release](db.DefaultContext, findOptions)
|
|
require.NoError(t, err)
|
|
assert.EqualValues(t, initCount+1, count)
|
|
|
|
release, err := repo_model.GetRelease(db.DefaultContext, repo.ID, "v0.2")
|
|
require.NoError(t, err)
|
|
require.NoError(t, release_service.DeleteReleaseByID(ctx, repo, release, user, true))
|
|
|
|
ok = mirror_service.SyncPullMirror(ctx, mirror.ID)
|
|
assert.True(t, ok)
|
|
|
|
count, err = db.Count[repo_model.Release](db.DefaultContext, findOptions)
|
|
require.NoError(t, err)
|
|
assert.EqualValues(t, initCount, count)
|
|
}
|
|
|
|
func TestPullMirrorRedactCredentials(t *testing.T) {
|
|
defer unittest.OverrideFixtures("tests/integration/fixtures/TestPullMirrorRedactCredentials")()
|
|
defer tests.PrepareTestEnv(t)()
|
|
|
|
session := loginUser(t, "user2")
|
|
session.MakeRequest(t, NewRequestWithValues(t, "POST", "/user2/repo1001/settings", map[string]string{
|
|
"_csrf": GetCSRF(t, session, "/user2/repo1001/settings"),
|
|
"action": "mirror-sync",
|
|
}), http.StatusSeeOther)
|
|
|
|
flashCookie := session.GetCookie(forgejo_context.CookieNameFlash)
|
|
assert.NotNil(t, flashCookie)
|
|
assert.Equal(t, "info%3DPulling%2Bchanges%2Bfrom%2Bthe%2Bremote%2Bhttps%253A%252F%252Fexample.com%252Fexample%252Fexample.git%2Bat%2Bthe%2Bmoment.", flashCookie.Value)
|
|
}
|