Repository settings: check admin rights in mount and in every handler

a6f4469 · Gabriel Morell · 2026-10-18 18:44

48 files +1390 -197
Message
{commit_body(@commit)}

Files changed

modified lib/git_gud/branch_protections.ex
+6 −0
@@ -28,6 +28,12 @@ defmodule GitGud.BranchProtections do
28 28
29 29 def get_rule!(id), do: Repo.get!(BranchProtection, id)
30 30
31 + @doc "Rule `id` if it belongs to `repo`, else `nil`. `id` is an integer or `nil`."
32 + def get_rule(_repo, nil), do: nil
33 +
34 + def get_rule(%Repository{id: rid}, id) when is_integer(id),
35 + do: Repo.get_by(BranchProtection, id: id, repository_id: rid)
36 +
31 37 def create_rule(%Repository{id: rid}, attrs) do
32 38 %BranchProtection{repository_id: rid}
33 39 |> BranchProtection.changeset(attrs)
modified lib/git_gud/deploy_keys.ex
+6 −0
@@ -26,6 +26,12 @@ defmodule GitGud.DeployKeys do
26 26
27 27 def get_key!(id), do: Repo.get!(DeployKey, id)
28 28
29 + @doc "Key `id` if it belongs to `repo`, else `nil`. `id` is an integer or `nil`."
30 + def get_key(_repo, nil), do: nil
31 +
32 + def get_key(%Repository{id: rid}, id) when is_integer(id),
33 + do: Repo.get_by(DeployKey, id: id, repository_id: rid)
34 +
29 35 def create_key(%Repository{id: rid}, attrs) do
30 36 %DeployKey{repository_id: rid}
31 37 |> DeployKey.changeset(attrs)
modified lib/git_gud/packages.ex
+14 −0
@@ -95,6 +95,20 @@ defmodule GitGud.Packages do
95 95
96 96 def get_package!(id), do: Repo.get!(Package, id)
97 97
98 + @doc """
99 + Version `id` if it belongs to one of `repo`'s packages, else `nil` —
100 + never another repository's. `id` is an integer or `nil`.
101 + """
102 + def get_repo_version(_repo, nil), do: nil
103 +
104 + def get_repo_version(%Repository{id: rid}, id) when is_integer(id) do
105 + Repo.one(
106 + from v in PackageVersion,
107 + join: p in assoc(v, :package),
108 + where: v.id == ^id and p.repository_id == ^rid
109 + )
110 + end
111 +
98 112 def get_package_by(repo_id, kind, name) do
99 113 Repo.get_by(Package, repository_id: repo_id, kind: kind, name: name)
100 114 end
modified lib/git_gud/repositories.ex
+7 −0
@@ -1746,6 +1746,13 @@ defmodule GitGud.Repositories do
1746 1746 end
1747 1747 end
1748 1748
1749 + @doc "Sets the federation interaction policy, and only that."
1750 + def update_interaction_policy(%Repository{} = repo, attrs) do
1751 + repo
1752 + |> Repository.interaction_policy_changeset(attrs)
1753 + |> Repo.update()
1754 + end
1755 +
1749 1756 defp maybe_check_org_visibility(%Repository{organization_id: nil}, _), do: :ok
1750 1757 defp maybe_check_org_visibility(_repo, nil), do: :ok
1751 1758
modified lib/git_gud/repositories/repository.ex
+12 −0
@@ -117,6 +117,18 @@ defmodule GitGud.Repositories.Repository do
117 117 )
118 118 end
119 119
120 + @doc """
121 + The interaction-policy page's changeset: that one field and nothing
122 + else, so a crafted submit can't reach visibility, archiving or the
123 + merge rules through it.
124 + """
125 + def interaction_policy_changeset(repo, attrs) do
126 + repo
127 + |> cast(attrs, [:interaction_policy])
128 + |> validate_required([:interaction_policy])
129 + |> validate_inclusion(:interaction_policy, @valid_interaction_policies)
130 + end
131 +
120 132 def valid_interaction_policies, do: @valid_interaction_policies
121 133 def valid_sync_modes, do: @valid_sync_modes
122 134 end
modified lib/git_gud/webhooks.ex
+12 −0

Click to load diff…

modified lib/git_gud_web/live/branch_protection_live/index.ex
+33 −18

Click to load diff…

modified lib/git_gud_web/live/deploy_key_live/index.ex
+33 −17

Click to load diff…

modified lib/git_gud_web/live/interaction_policy_live/edit.ex
+24 −15

Click to load diff…

modified lib/git_gud_web/live/org_live/show.ex
+11 −1

Click to load diff…

added lib/git_gud_web/live/repo_admin.ex
+96 −0

Click to load diff…

modified lib/git_gud_web/live/repo_live/header.ex
+10 −5

Click to load diff…

modified lib/git_gud_web/live/repo_live/packages.ex
+93 −46

Click to load diff…

modified lib/git_gud_web/live/secrets_live/org.ex
+17 −6

Click to load diff…

modified lib/git_gud_web/live/secrets_live/repo.ex
+31 −17

Click to load diff…

modified lib/git_gud_web/live/webhook_live/index.ex
+49 −26

Click to load diff…

modified lib/git_gud_web/live/webhook_live/org.ex
+36 −19

Click to load diff…

modified lib/git_gud_web/live/wiki_live/edit.ex
+30 −12

Click to load diff…

modified lib/git_gud_web/live/wiki_live/index.ex
+5 −0

Click to load diff…

modified lib/git_gud_web/live/wiki_live/show.ex
+28 −15

Click to load diff…

added test/git_gud_web/live/repo_auth/branch_protection_auth_test.exs
+66 −0

Click to load diff…

added test/git_gud_web/live/repo_auth/deploy_keys_auth_test.exs
+74 −0

Click to load diff…

added test/git_gud_web/live/repo_auth/interaction_policy_auth_test.exs
+82 −0

Click to load diff…

added test/git_gud_web/live/repo_auth/org_team_auth_test.exs
+50 −0

Click to load diff…

added test/git_gud_web/live/repo_auth/packages_auth_test.exs
+126 −0

Click to load diff…

added test/git_gud_web/live/repo_auth/repo_admin_test.exs
+71 −0

Click to load diff…

added test/git_gud_web/live/repo_auth/secrets_auth_test.exs
+87 −0

Click to load diff…

added test/git_gud_web/live/repo_auth/webhooks_auth_test.exs
+119 −0

Click to load diff…

added test/git_gud_web/live/repo_auth/wiki_auth_test.exs
+101 −0

Click to load diff…

added test/support/repo_auth_helpers.ex
+61 −0

Click to load diff…

Parents: 5e43417