From e3f44ad101a6e286b442f16ce754d2d126e23776 Mon Sep 17 00:00:00 2001 From: fabiobarkoski Date: Mon, 27 May 2024 00:54:43 -0300 Subject: [PATCH 1/8] Move repository visibility to danger zone in the settings area Moved to danger zone because change the visibility is a non-trivial decision, so that way the repo admin need to go to the danger zone to change. --- options/locale/locale_en-US.ini | 7 ++++ routers/web/repo/setting/setting.go | 20 ++++++++++ templates/repo/settings/options.tmpl | 59 +++++++++++++++++++++------- 3 files changed, 72 insertions(+), 14 deletions(-) diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index cca068a3a28c1..7d37e9843da9f 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -2465,6 +2465,13 @@ settings.thread_id = Thread ID settings.matrix.homeserver_url = Homeserver URL settings.matrix.room_id = Room ID settings.matrix.message_type = Message Type +settings.visibility.private.button = Make Private +settings.visibility.private.text = Making private the repo will do that only allowed members can see. +settings.visibility.public.button = Make Public +settings.visibility.public.text = Making public the repo will do that anyone can see. +settings.visibility.success = Repository visibility changed. +settings.visibility.error = An error occurred while trying to change the repo visibility. +settings.visibility.fork_error = Can't change the visibility of a forked repo. settings.archive.button = Archive Repo settings.archive.header = Archive This Repo settings.archive.text = Archiving the repo will make it entirely read-only. It will be hidden from the dashboard. Nobody (not even you!) will be able to make new commits, or open any issues or pull requests. diff --git a/routers/web/repo/setting/setting.go b/routers/web/repo/setting/setting.go index 1e0349cdeec4a..1c06c227b5c45 100644 --- a/routers/web/repo/setting/setting.go +++ b/routers/web/repo/setting/setting.go @@ -940,6 +940,26 @@ func SettingsPost(ctx *context.Context) { log.Trace("Repository was un-archived: %s/%s", ctx.Repo.Owner.Name, repo.Name) ctx.Redirect(ctx.Repo.RepoLink + "/settings") + case "private", "public": + if repo.IsFork { + ctx.Flash.Error(ctx.Tr("repo.settings.visibility.fork_error")) + ctx.Redirect(ctx.Repo.RepoLink + "/settings") + return + } + + repo.IsPrivate = !repo.IsPrivate + if err := repo_service.UpdateRepository(ctx, repo, true); err != nil { + log.Error("Tried to change the visibility of the repo: %s", err) + ctx.Flash.Error(ctx.Tr("repo.settings.visibility.error")) + ctx.Redirect(ctx.Repo.RepoLink + "/settings") + return + } + + ctx.Flash.Success(ctx.Tr("repo.settings.visibility.success")) + + log.Trace("Repository visibility changed: %s/%s", ctx.Repo.Owner.Name, repo.Name) + ctx.Redirect(ctx.Repo.RepoLink + "/settings") + default: ctx.NotFound("", nil) } diff --git a/templates/repo/settings/options.tmpl b/templates/repo/settings/options.tmpl index 4f98133df3679..b86eb4074e716 100644 --- a/templates/repo/settings/options.tmpl +++ b/templates/repo/settings/options.tmpl @@ -23,20 +23,6 @@ - {{if not .Repository.IsFork}} -
- -
- {{if .IsAdmin}} - - {{else}} - - {{if and .Repository.IsPrivate $.ForcePrivate}}{{end}} - {{end}} - -
-
- {{end}}
@@ -786,6 +772,27 @@
+ {{if not .Repository.IsFork}} +
+
+
{{ctx.Locale.Tr "repo.visibility"}}
+ {{if .Repository.IsPrivate}} +
{{ctx.Locale.Tr "repo.settings.visibility.public.text"}}
+ {{else}} +
{{ctx.Locale.Tr "repo.settings.visibility.private.text"}}
+ {{end}} +
+
+ +
+
+ {{end}} {{if .Repository.IsMirror}}
@@ -1012,6 +1019,30 @@
+ {{if not .Repository.IsFork}} + + {{end}} + {{if .Repository.UnitEnabled $.Context ctx.Consts.RepoUnitTypeWiki}}
-

{{if .Repository.IsPrivate}} - {{ctx.Locale.Tr "repo.settings.visibility.public.text"}} +

{{ctx.Locale.Tr "repo.settings.visibility.public.bullet_title"}}

+
    +
  • {{ctx.Locale.Tr "repo.settings.visibility.public.bullet_one"}}
  • +
{{else}} - {{ctx.Locale.Tr "repo.settings.visibility.private.text"}} - {{if .Repository.NumForks}}{{ctx.Locale.Tr "repo.visibility_fork_helper"}}{{end}} +

{{ctx.Locale.Tr "repo.settings.visibility.private.bullet_title"}}

+
    +
  • {{ctx.Locale.Tr "repo.settings.visibility.private.bullet_one"}}
  • +
  • {{ctx.Locale.Tr "repo.settings.visibility.private.bullet_two"}}{{if .Repository.NumForks}}{{ctx.Locale.Tr "repo.visibility_fork_helper"}}{{end}}
  • +
{{end}} -

{{.CsrfTokenHtml}} From f4cca31d2bb6c385d0a10aa53f2c0005d084b0c4 Mon Sep 17 00:00:00 2001 From: fabiobarkoski Date: Fri, 14 Jun 2024 00:21:50 -0300 Subject: [PATCH 7/8] fix lint --- services/repository/repository.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/repository/repository.go b/services/repository/repository.go index c3d8d37a436f0..5306e7d45cce6 100644 --- a/services/repository/repository.go +++ b/services/repository/repository.go @@ -122,7 +122,7 @@ func UpdateRepository(ctx context.Context, repo *repo_model.Repository, visibili return committer.Commit() } -func UpdateRepositoryVisibility(ctx context.Context, repo *repo_model.Repository, IsPrivate bool) (err error) { +func UpdateRepositoryVisibility(ctx context.Context, repo *repo_model.Repository, isPrivate bool) (err error) { ctx, committer, err := db.TxContext(ctx) if err != nil { return err @@ -130,7 +130,7 @@ func UpdateRepositoryVisibility(ctx context.Context, repo *repo_model.Repository defer committer.Close() - repo.IsPrivate = IsPrivate + repo.IsPrivate = isPrivate if err = repo_module.UpdateRepository(ctx, repo, true); err != nil { return fmt.Errorf("UpdateRepositoryVisibility: %w", err) From dbca558d70b7e3c4add69d626ae73a4b41e21634 Mon Sep 17 00:00:00 2001 From: fabiobarkoski Date: Thu, 8 Aug 2024 23:17:41 -0300 Subject: [PATCH 8/8] remove visibility interaction in update action --- routers/web/repo/setting/setting.go | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/routers/web/repo/setting/setting.go b/routers/web/repo/setting/setting.go index f8f5ec7c8df40..3f9140857ad8a 100644 --- a/routers/web/repo/setting/setting.go +++ b/routers/web/repo/setting/setting.go @@ -170,15 +170,7 @@ func SettingsPost(ctx *context.Context) { form.Private = repo.BaseRepo.IsPrivate || repo.BaseRepo.Owner.Visibility == structs.VisibleTypePrivate } - visibilityChanged := repo.IsPrivate != form.Private - // when ForcePrivate enabled, you could change public repo to private, but only admin users can change private to public - if visibilityChanged && setting.Repository.ForcePrivate && !form.Private && !ctx.Doer.IsAdmin { - ctx.RenderWithErr(ctx.Tr("form.repository_force_private"), tplSettingsOptions, form) - return - } - - repo.IsPrivate = form.Private - if err := repo_service.UpdateRepository(ctx, repo, visibilityChanged); err != nil { + if err := repo_service.UpdateRepository(ctx, repo, false); err != nil { ctx.ServerError("UpdateRepository", err) return } @@ -949,6 +941,12 @@ func SettingsPost(ctx *context.Context) { var err error + // when ForcePrivate enabled, you could change public repo to private, but only admin users can change private to public + if setting.Repository.ForcePrivate && repo.IsPrivate && !ctx.Doer.IsAdmin { + ctx.RenderWithErr(ctx.Tr("form.repository_force_private"), tplSettingsOptions, form) + return + } + if repo.IsPrivate { err = repo_service.MakeRepoPublic(ctx, repo) } else {