aboutsummaryrefslogtreecommitdiffstats
path: root/services
diff options
context:
space:
mode:
authorLunny Xiao <xiaolunwen@gmail.com>2024-11-17 19:06:25 -0800
committerGitHub <noreply@github.com>2024-11-18 03:06:25 +0000
commit4f879a00df029e09b40f64bf8de0572704766115 (patch)
treebb6d9b0b70fdc1d4e92e298355f244f52e831930 /services
parentf122aaf9ff627515922a68782339725e2d7c079a (diff)
downloadgitea-4f879a00df029e09b40f64bf8de0572704766115.tar.gz
gitea-4f879a00df029e09b40f64bf8de0572704766115.zip
Refactor find forks and fix possible bugs that weak permissions check (#32528)
- Move models/GetForks to services/FindForks - Add doer as a parameter of FindForks to check permissions - Slight performance optimization for get forks API with batch loading of repository units - Add tests for forking repository to organizations --------- Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
Diffstat (limited to 'services')
-rw-r--r--services/repository/fork.go24
1 files changed, 24 insertions, 0 deletions
diff --git a/services/repository/fork.go b/services/repository/fork.go
index 5b24015a03..bc4fdf8562 100644
--- a/services/repository/fork.go
+++ b/services/repository/fork.go
@@ -12,6 +12,7 @@ import (
"code.gitea.io/gitea/models/db"
git_model "code.gitea.io/gitea/models/git"
repo_model "code.gitea.io/gitea/models/repo"
+ "code.gitea.io/gitea/models/unit"
user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/git"
"code.gitea.io/gitea/modules/gitrepo"
@@ -20,6 +21,8 @@ import (
"code.gitea.io/gitea/modules/structs"
"code.gitea.io/gitea/modules/util"
notify_service "code.gitea.io/gitea/services/notify"
+
+ "xorm.io/builder"
)
// ErrForkAlreadyExist represents a "ForkAlreadyExist" kind of error.
@@ -247,3 +250,24 @@ func ConvertForkToNormalRepository(ctx context.Context, repo *repo_model.Reposit
return err
}
+
+type findForksOptions struct {
+ db.ListOptions
+ RepoID int64
+ Doer *user_model.User
+}
+
+func (opts findForksOptions) ToConds() builder.Cond {
+ return builder.Eq{"fork_id": opts.RepoID}.And(
+ repo_model.AccessibleRepositoryCondition(opts.Doer, unit.TypeInvalid),
+ )
+}
+
+// FindForks returns all the forks of the repository
+func FindForks(ctx context.Context, repo *repo_model.Repository, doer *user_model.User, listOptions db.ListOptions) ([]*repo_model.Repository, int64, error) {
+ return db.FindAndCount[repo_model.Repository](ctx, findForksOptions{
+ ListOptions: listOptions,
+ RepoID: repo.ID,
+ Doer: doer,
+ })
+}