Skip to content
This repository was archived by the owner on Apr 17, 2023. It is now read-only.

Commit 762c966

Browse files
vitoravelinomssola
authored andcommitted
policies: fixed destroy for repositories/tags
Repositories and tags that belonged to a global namespace was not being able to be deleted. The regression was introduced in the 2.4 release. Signed-off-by: Vítor Avelino <[email protected]>
1 parent a55c0ec commit 762c966

File tree

3 files changed

+39
-10
lines changed

3 files changed

+39
-10
lines changed

app/policies/namespace_policy.rb

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,8 @@ def create?
5555
def destroy?
5656
raise Pundit::NotAuthorizedError, "must be logged in" unless user
5757

58-
is_owner = @namespace.team.owners.exists?(user.id)
59-
can_contributor_delete = APP_CONFIG["delete"]["contributors"] &&
60-
@namespace.team.contributors.exists?(user.id)
61-
delete_enabled? && (@user.admin? || is_owner || can_contributor_delete)
58+
can_contributor_delete = APP_CONFIG["delete"]["contributors"] && contributor?
59+
delete_enabled? && (@user.admin? || owner? || can_contributor_delete)
6260
end
6361

6462
def update?

app/policies/repository_policy.rb

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,31 @@
11
# frozen_string_literal: true
22

33
class RepositoryPolicy
4-
attr_reader :user, :repository
4+
attr_reader :user, :repository, :namespace
55

66
def initialize(user, repository)
77
@user = user
88
@repository = repository
9+
@namespace = repository.namespace
910
end
1011

1112
def show?
12-
return @repository.namespace.visibility_public? unless @user
13+
return namespace.visibility_public? unless @user
1314

1415
@user.admin? ||
15-
@repository.namespace.visibility_public? ||
16-
@repository.namespace.visibility_protected? ||
17-
@repository.namespace.team.users.exists?(user.id)
16+
namespace.visibility_public? ||
17+
namespace.visibility_protected? ||
18+
namespace.team.users.exists?(user.id)
1819
end
1920

2021
# Returns true if the repository can be destroyed.
2122
def destroy?
22-
NamespacePolicy.new(@user, @repository.namespace).destroy?
23+
raise Pundit::NotAuthorizedError, "must be logged in" unless user
24+
25+
is_owner = namespace.team.owners.exists?(user.id)
26+
is_contributor = namespace.team.contributors.exists?(user.id)
27+
can_contributor_delete = APP_CONFIG["delete"]["contributors"] && is_contributor
28+
delete_enabled? && (@user.admin? || is_owner || can_contributor_delete)
2329
end
2430

2531
class Scope
@@ -52,4 +58,11 @@ def resolve
5258
end
5359
end
5460
end
61+
62+
protected
63+
64+
# Returns true if delete is enabled
65+
def delete_enabled?
66+
APP_CONFIG.enabled?("delete")
67+
end
5568
end

spec/policies/repository_policy_spec.rb

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,10 @@
7373
permissions :destroy? do
7474
before do
7575
namespace = create(:namespace, team: team2, registry: registry)
76+
global_team = registry.global_namespace.team
77+
global_namespace = create(:namespace, team: global_team, registry: registry)
7678
@repository = create(:repository, namespace: namespace)
79+
@global_repository = create(:repository, namespace: global_namespace)
7780
end
7881

7982
context "delete disabled" do
@@ -84,24 +87,28 @@
8487
it "denies access to admin" do
8588
admin = create(:admin)
8689
expect(subject).not_to permit(admin, @repository)
90+
expect(subject).not_to permit(admin, @global_repository)
8791
end
8892

8993
it "denies access to owner" do
9094
owner = create(:user)
9195
TeamUser.create(team: team2, user: owner, role: TeamUser.roles["owner"])
9296

9397
expect(subject).not_to permit(owner, @repository)
98+
expect(subject).not_to permit(owner, @global_repository)
9499
end
95100

96101
it "denies access to contributor" do
97102
contributor = create(:user)
98103
TeamUser.create(team: team2, user: contributor, role: TeamUser.roles["contributor"])
99104

100105
expect(subject).not_to permit(contributor, @repository)
106+
expect(subject).not_to permit(contributor, @global_repository)
101107
end
102108

103109
it "denies access to non-member" do
104110
expect(subject).not_to permit(user, @repository)
111+
expect(subject).not_to permit(user, @global_repository)
105112
end
106113
end
107114

@@ -113,24 +120,32 @@
113120
it "grants access to admin" do
114121
admin = create(:admin)
115122
expect(subject).to permit(admin, @repository)
123+
expect(subject).to permit(admin, @global_repository)
116124
end
117125

118126
it "grants access to owner" do
119127
owner = create(:user)
128+
global_team = @global_repository.namespace.team
120129
TeamUser.create(team: team2, user: owner, role: TeamUser.roles["owner"])
130+
TeamUser.create(team: global_team, user: owner, role: TeamUser.roles["owner"])
121131

122132
expect(subject).to permit(owner, @repository)
133+
expect(subject).to permit(owner, @global_repository)
123134
end
124135

125136
it "denies access to contributor" do
126137
contributor = create(:user)
138+
global_team = @global_repository.namespace.team
127139
TeamUser.create(team: team2, user: contributor, role: TeamUser.roles["contributor"])
140+
TeamUser.create(team: global_team, user: contributor, role: TeamUser.roles["contributor"])
128141

129142
expect(subject).not_to permit(contributor, @repository)
143+
expect(subject).not_to permit(contributor, @global_repository)
130144
end
131145

132146
it "denies access to non-member" do
133147
expect(subject).not_to permit(user, @repository)
148+
expect(subject).not_to permit(user, @global_repository)
134149
end
135150
end
136151

@@ -144,9 +159,12 @@
144159

145160
it "grants access to contributor" do
146161
contributor = create(:user)
162+
global_team = @global_repository.namespace.team
147163
TeamUser.create(team: team2, user: contributor, role: TeamUser.roles["contributor"])
164+
TeamUser.create(team: global_team, user: contributor, role: TeamUser.roles["contributor"])
148165

149166
expect(subject).to permit(contributor, @repository)
167+
expect(subject).to permit(contributor, @global_repository)
150168
end
151169
end
152170
end

0 commit comments

Comments
 (0)