Skip to content

Commit 4f450f4

Browse files
authored
Merge pull request ManageIQ#23727 from jrafanie/freeipa-userid-email-cleanup
Freeipa userid email cleanup
2 parents 7e3b200 + 9242f0a commit 4f450f4

File tree

2 files changed

+60
-15
lines changed

2 files changed

+60
-15
lines changed

app/models/authenticator/httpd.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ def username_to_upn_name(user_attrs)
135135

136136
def user_details_from_external_directory(username)
137137
ext_user_attrs = user_attrs_from_external_directory(username)
138-
principal_username = ext_user_attrs["krbPrincipalName"] && normalize_username(ext_user_attrs["krbPrincipalName"])
138+
principal_username = ext_user_attrs["krbPrincipalName"].presence && normalize_username(ext_user_attrs["krbPrincipalName"])
139139
user_attrs = {:username => principal_username || username,
140140
:fullname => ext_user_attrs["displayname"],
141141
:firstname => ext_user_attrs["givenname"],
@@ -156,7 +156,7 @@ def user_details_from_headers(username, request)
156156

157157
delimiter = self.class.group_delimiter || user_headers['X-REMOTE-USER-GROUP-DELIMITER'].presence || /[;:,]/
158158
groups = CGI.unescape(user_headers['X-REMOTE-USER-GROUPS'] || '').split(delimiter)
159-
principal_username = user_headers['X-REMOTE-USER-PRINCIPAL'] && normalize_username(user_headers['X-REMOTE-USER-PRINCIPAL'])
159+
principal_username = user_headers['X-REMOTE-USER-PRINCIPAL'].presence && normalize_username(user_headers['X-REMOTE-USER-PRINCIPAL'])
160160
user_attrs = {:username => principal_username || username,
161161
:fullname => user_headers['X-REMOTE-USER-FULLNAME'],
162162
:firstname => user_headers['X-REMOTE-USER-FIRSTNAME'],

spec/models/authenticator/httpd_spec.rb

Lines changed: 58 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,25 +12,13 @@
1212
let(:username) { request.headers["X-Remote-User"] }
1313

1414
before do
15-
# If anything goes looking for the currently configured
16-
# Authenticator during any of these tests, we'd really rather they
17-
# found the one we're working on.
18-
#
19-
# This specifically comes up when we auto-create a new user from an
20-
# external auth system: they get saved without a password, so User's
21-
# dummy_password_for_external_auth hook runs, and it needs to ask
22-
# Authenticator#uses_stored_password? whether it's allowed to do anything.
23-
15+
# Stub authenticator to prevent User.dummy_password_for_external_auth from calling wrong authenticator
2416
stub_settings_merge(:authentication => config)
2517
allow(User).to receive(:authenticator).and_return(subject)
26-
2718
EvmSpecHelper.local_miq_server
28-
end
2919

30-
before do
3120
FactoryBot.create(:miq_group, :description => 'wibble')
3221
FactoryBot.create(:miq_group, :description => 'wobble')
33-
3422
allow(MiqLdap).to receive(:using_ldap?) { false }
3523
end
3624

@@ -106,6 +94,16 @@
10694
expect(subject.lookup_by_identity('baduser', request)).to eq(cheshire)
10795
end
10896

97+
it "falls back to X-Remote-User when X-Remote-User-Principal is empty string" do
98+
headers['X-Remote-User-Principal'] = ''
99+
expect(subject.lookup_by_identity('cheshire', request)).to eq(cheshire)
100+
end
101+
102+
it "falls back to X-Remote-User when X-Remote-User-Principal is whitespace" do
103+
headers['X-Remote-User-Principal'] = ' '
104+
expect(subject.lookup_by_identity('cheshire', request)).to eq(cheshire)
105+
end
106+
109107
it "Handles missing request parameter" do
110108
expect(subject.lookup_by_identity('alice')).to eq(alice)
111109
end
@@ -731,6 +729,53 @@ def authenticate
731729
user_attrs, _groups = subject.send(:user_details_from_external_directory, 'jdoe')
732730
expect(user_attrs[:username]).to eq("jdoe@ipa.test")
733731
end
732+
733+
it "should fall back to provided username when krbPrincipalName is empty string" do
734+
requested_attrs = %w[mail givenname sn displayname domainname krbPrincipalName]
735+
736+
jdoe_attrs = [{"mail" => ["jdoe@example.com"],
737+
"givenname" => ["John"],
738+
"sn" => ["Doe"],
739+
"displayname" => ["John Doe"],
740+
"domainname" => ["ipa.test"],
741+
"krbPrincipalName" => [""]}]
742+
743+
allow(ifp_interface).to receive(:GetUserAttr).with('jdoe', requested_attrs).and_return(jdoe_attrs)
744+
allow(MiqGroup).to receive(:get_httpd_groups_by_user).with('jdoe').and_return([])
745+
746+
user_attrs, _groups = subject.send(:user_details_from_external_directory, 'jdoe')
747+
expect(user_attrs[:username]).to eq("jdoe")
748+
end
749+
750+
context "integration test: multiple login formats produce same normalized username" do
751+
let(:expected_normalized_username) { "flast@ipa.test" }
752+
let(:requested_attrs) { %w[mail givenname sn displayname domainname krbPrincipalName] }
753+
let(:user_attrs_response) do
754+
[{"mail" => ["first.last@example.com"],
755+
"givenname" => ["First"],
756+
"sn" => ["Last"],
757+
"displayname" => ["First Last"],
758+
"domainname" => ["ipa.test"],
759+
"krbPrincipalName" => ["flast@IPA.TEST"]}]
760+
end
761+
762+
before do
763+
allow(MiqGroup).to receive(:get_httpd_groups_by_user).and_return([])
764+
end
765+
766+
shared_examples "normalizes to principal name" do |login_format|
767+
it "normalizes #{login_format}" do
768+
allow(ifp_interface).to receive(:GetUserAttr).with(login_format, requested_attrs).and_return(user_attrs_response)
769+
user_attrs, _groups = subject.send(:user_details_from_external_directory, login_format)
770+
expect(user_attrs[:username]).to eq(expected_normalized_username)
771+
end
772+
end
773+
774+
include_examples "normalizes to principal name", "first.last@example.com"
775+
include_examples "normalizes to principal name", "flast@IPA.TEST"
776+
include_examples "normalizes to principal name", "flast@ipa.test"
777+
include_examples "normalizes to principal name", "flast"
778+
end
734779
end
735780
end
736781
end

0 commit comments

Comments
 (0)