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

Commit 7b54698

Browse files
committed
user: skip validations when creating portus user
This is a fix for a regression introduced by the previous two commits. Signed-off-by: Miquel Sabaté Solà <[email protected]>
1 parent 1bd9670 commit 7b54698

File tree

13 files changed

+73
-47
lines changed

13 files changed

+73
-47
lines changed

app/models/user.rb

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ class User < ActiveRecord::Base
6262
validate :private_namespace_and_team_available, on: :create
6363
validate :portus_user_validation, on: :update
6464
after_create :create_personal_namespace!
65+
after_create :no_skip_validation!
6566

6667
# Actions performed before destroy
6768
before_destroy :update_tags!
@@ -78,6 +79,21 @@ class User < ActiveRecord::Base
7879
scope :enabled, -> { not_portus.where enabled: true }
7980
scope :admins, -> { not_portus.where enabled: true, admin: true }
8081

82+
class <<self
83+
attr_accessor :skip_portus_validation
84+
end
85+
86+
# Creates the Portus hidden user.
87+
def self.create_portus_user!
88+
User.skip_portus_validation = true
89+
User.create!(
90+
username: "portus",
91+
password: Rails.application.secrets.portus_password,
92+
93+
admin: true
94+
)
95+
end
96+
8197
# Special method used by Devise to require an email on signup. This is always
8298
# true except for LDAP.
8399
def email_required?
@@ -87,6 +103,11 @@ def email_required?
87103
# Adds an error if the user to be updated is the portus one. This is a
88104
# validation on update, so it can be skipped when strictly required.
89105
def portus_user_validation
106+
if User.skip_portus_validation
107+
User.skip_portus_validation = nil
108+
return
109+
end
110+
90111
return unless portus? || portus?(username_was)
91112
errors.add(:username, "cannot be updated")
92113
end
@@ -138,7 +159,11 @@ def create_personal_namespace!
138159
description: default_description,
139160
registry: Registry.get # TODO: fix once we handle more registries
140161
)
141-
update_attributes(namespace: namespace)
162+
163+
# Skipping validation on purpose, so after creating the portus hidden user,
164+
# a namespace can be assigned to it even if updates are forbidden
165+
# afterwards.
166+
update_attribute("namespace", namespace)
142167
end
143168

144169
# Find the user that can be guessed from the given push event.
@@ -256,6 +281,11 @@ def suggest_username(data)
256281

257282
protected
258283

284+
# Validations can no longer be skipped after calling this method.
285+
def no_skip_validation!
286+
User.skip_portus_validation = nil
287+
end
288+
259289
# Get username from provider's data.
260290
def extract_username(data)
261291
data["nickname"] || data["username"] || data["email"].match(/^[^@]*/).to_s

db/seeds.rb

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,7 @@
88
end
99

1010
Rails.logger.info "Adding the \"portus\" user"
11-
User.create!(
12-
username: "portus",
13-
password: Rails.application.secrets.portus_password,
14-
15-
admin: true
16-
)
11+
User.create_portus_user!
1712

1813
# Adding a user and a registry for integration tests.
1914
if ENV["INTEGRATION_TESTS"]

spec/api/grape_api/v1/users_spec.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,10 +144,10 @@
144144

145145
context "portus user" do
146146
it "does not allow portus user to be updated" do
147-
create :user, username: "portus", email: "[email protected]"
147+
User.create_portus_user!
148148
portus = User.find_by(username: "portus")
149149
put "/api/v1/users/#{portus.id}", { user: user_data }, @header
150-
expect(response).to have_http_status(:unprocessable_entity)
150+
expect(response).to have_http_status(:bad_request)
151151
end
152152
end
153153
end

spec/api/v2/token_spec.rb

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -302,14 +302,7 @@ def parse_token(body)
302302
}
303303
end
304304

305-
before do
306-
User.create!(
307-
username: "portus",
308-
password: Rails.application.secrets.portus_password,
309-
310-
admin: true
311-
)
312-
end
305+
before { User.create_portus_user! }
313306

314307
it "allows portus to access the Catalog API" do
315308
get v2_token_url, valid_request, valid_portus_auth_header

spec/controllers/admin/namespaces_controller_spec.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@
1313
end
1414

1515
describe "GET #index" do
16-
let!(:portus) { create(:admin, username: "portus") }
16+
before { User.create_portus_user! }
17+
18+
let(:portus) { User.find_by(username: "portus") }
1719

1820
context "pagination" do
1921
it "paginates namespaces" do

spec/controllers/namespaces_controller_spec.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,9 @@
6262
end
6363

6464
describe "GET #show" do
65-
let!(:portus) { create(:admin, username: "portus") }
65+
before { User.create_portus_user! }
66+
67+
let(:portus) { User.find_by(username: "portus") }
6668

6769
it "paginates repositories" do
6870
sign_in owner

spec/features/admin/dashboard_spec.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
end
1515

1616
it "The dashboard does not count the Portus user" do
17-
create_portus_user!
17+
User.create_portus_user!
1818
visit admin_dashboard_index_path
1919

2020
# 3 users: admin, user and the one created by the registry.
@@ -24,7 +24,7 @@
2424
it "Warn the admin that the portus user does not exist" do
2525
expect(page).to have_content("The Portus user does not exist!")
2626

27-
create_portus_user!
27+
User.create_portus_user!
2828
visit admin_dashboard_index_path
2929

3030
expect(page).not_to have_content("The Portus user does not exist!")

spec/features/auth/signup_feature_spec.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838

3939
it "The portus user does not interfere with regular admin creation" do
4040
User.delete_all
41-
create_portus_user!
41+
User.create_portus_user!
4242

4343
visit new_user_registration_url
4444

@@ -102,7 +102,7 @@
102102

103103
it "I am redirected to the signup page if only the portus user exists" do
104104
User.delete_all
105-
create(:admin, username: "portus")
105+
User.create_portus_user!
106106

107107
visit new_user_session_url
108108
expect(current_url).to eq new_user_registration_url

spec/lib/portus/registry_client_spec.rb

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,7 @@ def fetch_link_test(header)
242242
context "fetching Catalog from registry" do
243243
it "returns the available catalog" do
244244
create(:registry)
245-
create(:admin, username: "portus")
245+
User.create_portus_user!
246246

247247
VCR.use_cassette("registry/get_registry_catalog", record: :none) do
248248
registry = described_class.new(
@@ -261,7 +261,7 @@ def fetch_link_test(header)
261261

262262
it "returns the available catalog even if it has more than 100 repos" do
263263
create(:registry)
264-
create(:admin, username: "portus")
264+
User.create_portus_user!
265265

266266
VCR.use_cassette("registry/catalog_lots_of_repos", record: :none) do
267267
WebMock.disable_net_connect!
@@ -286,7 +286,7 @@ def fetch_link_test(header)
286286

287287
it "does not remove all repos just because one of them is failing" do
288288
create(:registry)
289-
create(:admin, username: "portus")
289+
User.create_portus_user!
290290

291291
VCR.use_cassette("registry/get_registry_one_fails", record: :none) do
292292
registry = described_class.new(
@@ -355,7 +355,7 @@ def fetch_link_test(header)
355355

356356
it "returns nil for tags when an exception happened" do
357357
create(:registry)
358-
create(:admin, username: "portus")
358+
User.create_portus_user!
359359

360360
allow_any_instance_of(::Portus::RegistryClient).to receive(:tags) do
361361
raise ::Portus::Errors::NotFoundError, "I AM ERROR"
@@ -380,7 +380,7 @@ def fetch_link_test(header)
380380
context "fetching lists from the catalog" do
381381
it "returns the available tags even if there are more than 100 of them" do
382382
create(:registry)
383-
create(:admin, username: "portus")
383+
User.create_portus_user!
384384

385385
VCR.use_cassette("registry/catalog_lots_of_tags", record: :none) do
386386
registry = described_class.new(

spec/models/namespace_spec.rb

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,11 @@
6767
end
6868

6969
context "is portus" do
70-
let!(:registry) { create(:registry) }
71-
let!(:owner) { create(:user) }
72-
let!(:portus) { create(:admin, username: "portus") }
70+
let!(:registry) { create(:registry) }
71+
let!(:owner) { create(:user) }
72+
let(:portus) { User.find_by(username: "portus") }
73+
74+
before { User.create_portus_user! }
7375

7476
it "returns true when the given namespace belongs to portus" do
7577
expect(described_class.find_by(name: portus.username)).to be_portus

0 commit comments

Comments
 (0)