From 94f60e199bc504c6cfb7b853889e3ceb2a837adc Mon Sep 17 00:00:00 2001 From: Cirno the Strongest <1447794+CirnoT@users.noreply.github.com> Date: Sun, 7 Jun 2020 02:45:12 +0200 Subject: [PATCH] Fix visibility of forked public repos from private orgs (#11717) * Fix visibility of forked public repos from private orgs * update forks visibility when org visibility is changed Co-authored-by: Lunny Xiao Co-authored-by: zeripath Co-authored-by: techknowlogick --- models/repo.go | 2 +- modules/repository/fork.go | 3 ++- routers/org/setting.go | 20 +++++++++++++++++++- routers/repo/pull.go | 12 +++++++----- routers/repo/setting.go | 2 +- 5 files changed, 30 insertions(+), 9 deletions(-) diff --git a/models/repo.go b/models/repo.go index fd2e75a0ea..bf7bf018a1 100644 --- a/models/repo.go +++ b/models/repo.go @@ -1454,7 +1454,7 @@ func updateRepository(e Engine, repo *Repository, visibilityChanged bool) (err e return fmt.Errorf("getRepositoriesByForkID: %v", err) } for i := range forkRepos { - forkRepos[i].IsPrivate = repo.IsPrivate + forkRepos[i].IsPrivate = repo.IsPrivate || repo.Owner.Visibility == api.VisibleTypePrivate if err = updateRepository(e, forkRepos[i], true); err != nil { return fmt.Errorf("updateRepository[%d]: %v", forkRepos[i].ID, err) } diff --git a/modules/repository/fork.go b/modules/repository/fork.go index 2ed2a0eb78..169c391edd 100644 --- a/modules/repository/fork.go +++ b/modules/repository/fork.go @@ -12,6 +12,7 @@ import ( "code.gitea.io/gitea/models" "code.gitea.io/gitea/modules/git" "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/structs" ) // ForkRepository forks a repository @@ -36,7 +37,7 @@ func ForkRepository(doer, owner *models.User, oldRepo *models.Repository, name, LowerName: strings.ToLower(name), Description: desc, DefaultBranch: oldRepo.DefaultBranch, - IsPrivate: oldRepo.IsPrivate, + IsPrivate: oldRepo.IsPrivate || oldRepo.Owner.Visibility == structs.VisibleTypePrivate, IsEmpty: oldRepo.IsEmpty, IsFork: true, ForkID: oldRepo.ID, diff --git a/routers/org/setting.go b/routers/org/setting.go index 348d8cc8d8..79a99295a8 100644 --- a/routers/org/setting.go +++ b/routers/org/setting.go @@ -85,12 +85,30 @@ func SettingsPost(ctx *context.Context, form auth.UpdateOrgSettingForm) { org.Description = form.Description org.Website = form.Website org.Location = form.Location - org.Visibility = form.Visibility org.RepoAdminChangeTeamAccess = form.RepoAdminChangeTeamAccess + + visibilityChanged := form.Visibility != org.Visibility + org.Visibility = form.Visibility + if err := models.UpdateUser(org); err != nil { ctx.ServerError("UpdateUser", err) return } + + // update forks visibility + if visibilityChanged { + if err := org.GetRepositories(models.ListOptions{Page: 1, PageSize: org.NumRepos}); err != nil { + ctx.ServerError("GetRepositories", err) + return + } + for _, repo := range org.Repos { + if err := models.UpdateRepository(repo, true); err != nil { + ctx.ServerError("UpdateRepository", err) + return + } + } + } + log.Trace("Organization setting updated: %s", org.Name) ctx.Flash.Success(ctx.Tr("org.settings.update_setting_success")) ctx.Redirect(ctx.Org.OrgLink + "/settings") diff --git a/routers/repo/pull.go b/routers/repo/pull.go index d4c99e2769..30913e4766 100644 --- a/routers/repo/pull.go +++ b/routers/repo/pull.go @@ -24,6 +24,7 @@ import ( "code.gitea.io/gitea/modules/notification" "code.gitea.io/gitea/modules/repofiles" "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/modules/util" "code.gitea.io/gitea/routers/utils" "code.gitea.io/gitea/services/gitdiff" @@ -95,15 +96,16 @@ func getForkRepository(ctx *context.Context) *models.Repository { return nil } - ctx.Data["repo_name"] = forkRepo.Name - ctx.Data["description"] = forkRepo.Description - ctx.Data["IsPrivate"] = forkRepo.IsPrivate - canForkToUser := forkRepo.OwnerID != ctx.User.ID && !ctx.User.HasForkedRepo(forkRepo.ID) - if err := forkRepo.GetOwner(); err != nil { ctx.ServerError("GetOwner", err) return nil } + + ctx.Data["repo_name"] = forkRepo.Name + ctx.Data["description"] = forkRepo.Description + ctx.Data["IsPrivate"] = forkRepo.IsPrivate || forkRepo.Owner.Visibility == structs.VisibleTypePrivate + canForkToUser := forkRepo.OwnerID != ctx.User.ID && !ctx.User.HasForkedRepo(forkRepo.ID) + ctx.Data["ForkFrom"] = forkRepo.Owner.Name + "/" + forkRepo.Name ctx.Data["ForkFromOwnerID"] = forkRepo.Owner.ID diff --git a/routers/repo/setting.go b/routers/repo/setting.go index dff13ff5b3..1433bedb3b 100644 --- a/routers/repo/setting.go +++ b/routers/repo/setting.go @@ -102,7 +102,7 @@ func SettingsPost(ctx *context.Context, form auth.RepoSettingForm) { // Visibility of forked repository is forced sync with base repository. if repo.IsFork { - form.Private = repo.BaseRepo.IsPrivate + form.Private = repo.BaseRepo.IsPrivate || repo.BaseRepo.Owner.Visibility == structs.VisibleTypePrivate } visibilityChanged := repo.IsPrivate != form.Private