Skip to content

Commit aa34d8d

Browse files
authored
MultiUsers: require username when logging in (#1019)
1 parent e8c51ab commit aa34d8d

File tree

9 files changed

+42
-16
lines changed

9 files changed

+42
-16
lines changed

.rubocop.yml

+3-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@ AllCops:
1515

1616
Layout/LineLength: { Max: 80 }
1717
Layout/RedundantLineBreak: { InspectBlocks: true }
18-
Metrics/AbcSize: { Exclude: [db/migrate/20230305010750_create_good_jobs.rb] }
18+
Metrics/AbcSize:
19+
Exclude: [db/migrate/20230305010750_create_good_jobs.rb]
20+
CountRepeatedAttributes: false
1921
Metrics/BlockLength: { Exclude: [config/**/*.rb, spec/**/*.rb, db/seeds/**/*.rb] }
2022
Metrics/MethodLength: { Exclude: [db/migrate/*.rb] }
2123
Rails/SkipsModelValidations: { AllowedMethods: [update_all] }

app/commands/user/sign_in_user.rb

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
# frozen_string_literal: true
22

33
module SignInUser
4-
def self.call(submitted_password)
5-
user = User.first
4+
def self.call(username, submitted_password)
5+
user = User.find_by(username:)
6+
return unless user
7+
68
user_password = BCrypt::Password.new(user.password_digest)
79

810
user if user_password == submitted_password

app/controllers/sessions_controller.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ def new
99

1010
def create
1111
authorization.skip
12-
user = SignInUser.call(params[:password])
12+
user = SignInUser.call(params[:username], params[:password])
1313
if user
1414
session[:user_id] = user.id
1515

app/views/sessions/new.erb

+8-3
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,15 @@
44

55
<hr />
66

7-
<%= form_with(url: "/login") do %>
8-
<input class="hidden" value="username" />
7+
<%= form_with(url: "/login") do |form| %>
8+
<p><%= t('sessions.new.fields.unknown_username_html') %></p>
99
<div class="control-group">
10-
<input name="password" id="password" type="password" autofocus />
10+
<%= form.text_field :username, class: "form-control", required: true %>
11+
<%= form.label :username, t('sessions.new.fields.username'), class: "field-label" %>
12+
</div>
13+
14+
<div class="control-group">
15+
<input name="password" class="form-control" id="password" type="password" required />
1116
<i class="icon-lock field-icon"></i>
1217
<label id="password-label" class="field-label" for="password"><%= t('sessions.new.fields.password') %></label>
1318
</div>

config/locales/en.yml

+5
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,11 @@ en:
137137
logged_out_successfully: You have been signed out!
138138
new:
139139
fields:
140+
unknown_username_html:
141+
<strong>Note:</strong> if you didn't set a username when you set up
142+
your stringer instance, then your username will be "stringer". You
143+
can change this on your profile page after logging in.
144+
username: Username
140145
password: Password
141146
submit: Login
142147
flash:

spec/commands/user/sign_in_user_spec.rb

+8-2
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,21 @@
22

33
RSpec.describe SignInUser do
44
it "returns the user if the password is valid" do
5-
result = described_class.call(default_user.password)
5+
result = described_class.call(default_user.username, default_user.password)
66

77
expect(result).to eq(default_user)
88
end
99

1010
it "returns nil if password is invalid" do
1111
create(:user)
1212

13-
result = described_class.call("not-the-pw")
13+
result = described_class.call(default_user.username, "not-the-pw")
14+
15+
expect(result).to be_nil
16+
end
17+
18+
it "returns nil if the user does not exist" do
19+
result = described_class.call("not-the-username", "not-the-pw")
1420

1521
expect(result).to be_nil
1622
end

spec/requests/sessions_controller_spec.rb

+11-6
Original file line numberDiff line numberDiff line change
@@ -13,33 +13,38 @@
1313

1414
describe "#create" do
1515
it "denies access when password is incorrect" do
16-
create(:user)
17-
post "/login", params: { password: "not-the-password" }
16+
user = create(:user)
17+
params = { username: user.username, password: "not-the-password" }
18+
19+
post("/login", params:)
1820

1921
expect(rendered).to have_selector(".error")
2022
end
2123

2224
it "allows access when password is correct" do
2325
user = default_user
26+
params = { username: user.username, password: user.password }
2427

25-
post "/login", params: { password: user.password }
28+
post("/login", params:)
2629

2730
expect(session[:user_id]).to eq(user.id)
2831
end
2932

3033
it "redirects to the root page" do
3134
user = default_user
35+
params = { username: user.username, password: user.password }
3236

33-
post "/login", params: { password: user.password }
37+
post("/login", params:)
3438

3539
expect(URI.parse(response.location).path).to eq("/")
3640
end
3741

3842
it "redirects to the previous path when present" do
3943
user = default_user
40-
44+
params = { username: user.username, password: user.password }
4145
get("/archive")
42-
post("/login", params: { password: user.password })
46+
47+
post("/login", params:)
4348

4449
expect(URI.parse(response.location).path).to eq("/archive")
4550
end

spec/support/request_helpers.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
module RequestHelpers
44
def login_as(user)
5-
post("/login", params: { password: user.password })
5+
post("/login", params: { username: user.username, password: user.password })
66
end
77

88
def rendered

spec/support/system_helpers.rb

+1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
module SystemHelpers
44
def login_as(user)
55
visit(login_path)
6+
fill_in("Username", with: user.username)
67
fill_in("Password", with: user.password)
78
click_button("Login")
89
end

0 commit comments

Comments
 (0)