Skip to content

Commit 78c28ee

Browse files
committed
Fixes #9494 - Remodel using a single field
1 parent 0226c9c commit 78c28ee

File tree

10 files changed

+60
-32
lines changed

10 files changed

+60
-32
lines changed

app/controllers/api/v2/auth_source_ldaps_controller.rb

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,7 @@ def show
4545
param :usergroup_sync, :bool, :desc => N_("sync external user groups on login")
4646
param :tls, :bool
4747
param :groups_base, String, :desc => N_("groups base DN")
48-
param :use_netgroups, :bool, :desc => N_("use NIS netgroups instead of posix groups, applicable only when server_type is posix or free_ipa")
49-
param :use_rfc4519_group_membership, :bool, :desc => N_("use RFC4519 group membership in addition to posix groups, applicable only when server_type is posix")
48+
param :ldap_group_membership, AuthSourceLdap::GROUP_MEMBERSHIP_TYPES.keys, :desc => N_("type of group membership to use, applicable only when server_type is posix, free_ipa or netiq. Option rfc4519 is only applicable when server_type is posix.")
5049
param :server_type, AuthSourceLdap::SERVER_TYPES.keys, :desc => N_("type of the LDAP server")
5150
param :ldap_filter, String, :desc => N_("LDAP filter")
5251
param_group :taxonomies, ::Api::V2::BaseController

app/controllers/concerns/foreman/controller/parameters/auth_source_ldap.rb

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,7 @@ def auth_source_ldap_params_filter
2222
:server_type,
2323
:tls,
2424
:usergroup_sync,
25-
:use_netgroups,
26-
:use_rfc4519_group_membership
25+
:ldap_group_membership
2726

2827
add_taxonomix_params_filter(filter)
2928
end

app/models/auth_sources/auth_source_ldap.rb

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ class AuthSourceLdap < AuthSource
2222
SERVER_TYPES = { :free_ipa => 'FreeIPA', :active_directory => 'Active Directory',
2323
:posix => 'POSIX', :netiq => "NetIQ"}
2424

25+
GROUP_MEMBERSHIP_TYPES = { :posix => 'POSIX', :rfc4519 => 'POSIX + RFC4519', :nis_netgroups => 'NIS Netgroups' }
26+
2527
extend FriendlyId
2628
friendly_id :name
2729
include Parameterizable::ByIdName
@@ -35,11 +37,13 @@ class AuthSourceLdap < AuthSource
3537
validates :account_password, :length => {:maximum => 69}, :allow_nil => true
3638
validates :port, :presence => true, :numericality => {:only_integer => true}
3739
validates :server_type, :presence => true, :inclusion => { :in => SERVER_TYPES.keys.map(&:to_s) }
40+
validates :ldap_group_membership, :presence => true, :inclusion => { :in => GROUP_MEMBERSHIP_TYPES.keys.map(&:to_s) }, :if => proc { |auth| auth.server_type.to_s == 'posix' }
41+
validates :ldap_group_membership, :presence => true, :inclusion => { :in => ['posix', 'nis_netgroups'] }, :if => proc { |auth| %w[netiq free_ipa].include?(auth.server_type.to_s) }
42+
validates :ldap_group_membership, :absence => true, :if => proc { |auth| auth.server_type.to_s == 'active_directory' }
3843
validate :validate_ldap_filter, :unless => proc { |auth| auth.ldap_filter.blank? }
3944

4045
before_validation :strip_ldap_attributes
41-
before_validation :sanitize_use_netgroups
42-
before_validation :sanitize_use_rfc4519_group_membership
46+
before_validation :sanitize_group_membership
4347
after_initialize :set_defaults, if: :new_record?
4448

4549
scoped_search :on => :name, :complete_value => :true
@@ -93,8 +97,8 @@ def to_config(login = nil, password = nil)
9397
:anon_queries => account.blank?, :service_user => service_user(login),
9498
:service_pass => use_user_login_for_service? ? password : account_password,
9599
:instrumentation_service => ActiveSupport::Notifications,
96-
:use_netgroups => use_netgroups,
97-
:use_rfc4519_group_membership => use_rfc4519_group_membership }
100+
:use_netgroups => ldap_group_membership == 'nis_netgroups',
101+
:use_rfc4519_group_membership => ldap_group_membership == 'rfc4519' }
98102
end
99103

100104
def encryption_config
@@ -197,13 +201,8 @@ def strip_ldap_attributes
197201
end
198202
end
199203

200-
def sanitize_use_netgroups
201-
self.use_netgroups = false if server_type.to_s == 'active_directory'
202-
true
203-
end
204-
205-
def sanitize_use_rfc4519_group_membership
206-
self.use_rfc4519_group_membership = false if server_type.to_s != 'posix'
204+
def sanitize_group_membership
205+
self.ldap_group_membership = nil if server_type.to_s == 'active_directory'
207206
true
208207
end
209208

app/views/api/v2/auth_source_ldaps/main.json.rabl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@ extends "api/v2/auth_source_ldaps/base"
44

55
attributes :host, :port, :account, :base_dn, :ldap_filter, :attr_login, :attr_firstname, :attr_lastname,
66
:attr_mail, :attr_photo, :onthefly_register, :usergroup_sync, :tls, :server_type, :groups_base,
7-
:use_netgroups, :use_rfc4519_group_membership, :created_at, :updated_at
7+
:ldap_group_membership, :created_at, :updated_at

app/views/auth_source_ldaps/_form.html.erb

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,16 @@
2929
<%= password_f f, :account_password, :help_inline => _("Use this account to authenticate, <i>optional</i>").html_safe, :unset => action_name == "edit" %>
3030
<%= text_f f, :base_dn, :label => _("Base DN"), :size => "col-md-8", :label_help => base_dn_help_data[@auth_source_ldap.server_type], :data => { :help => base_dn_help_data } %>
3131
<%= text_f f, :groups_base, :label => _("Groups base DN"), :size => "col-md-8", :label_help => groups_base_dn_help_data[@auth_source_ldap.server_type], :data => { :help => groups_base_dn_help_data } %>
32-
<%= checkbox_f f, :use_netgroups, :help_inline => _("Use NIS netgroups instead of posix groups."), :label_help => _('By default we map user groups to standard LDAP Group objects. FreeIPA and POSIX LDAP server types supports alternative way of grouping users through Netgroups. Enable this checkbox if using Netgroups is preferred instead of standard groups.') %>
33-
<%= checkbox_f f, :use_rfc4519_group_membership, :label => _('Use RFC4519 group membership'), :help_inline => _("Use group membership based on the groupOfNames and groupOfUniqueNames attributes as defined in RFC4519 in addition to POSIX groups."), :label_help => _('By default we use the memberuid attribute to map user groups to standard LDAP Group objects. Some POSIX LDAP servers support an alternative way of using the groupOfNames - member and groupOfUniqueNames - uniqueMember attributes to model group membership. Enable this checkbox if your LDAP server uses this instead of plain POSIX groups per RFC2307.') %>
32+
33+
<%= select_f f, :ldap_group_membership, AuthSourceLdap::GROUP_MEMBERSHIP_TYPES, :first, :last,
34+
{ :include_blank => _("Choose a group membership type") },
35+
{ :label => _('Group membership type'),
36+
:help_inline => _("Controls which mechanism will be used for looking up users' group membership in LDAP."),
37+
:label_help => "<ul>
38+
<li><b>#{_("POSIX")}</b> - #{_("Use the memberuid attribute to map user groups to standard LDAP Group objects.")}</li>
39+
<li><b>#{_("POSIX + RFC4519")}</b> - #{_("Use group membership based on the groupOfNames and groupOfUniqueNames attributes as defined in RFC4519 in addition to POSIX groups. Some POSIX LDAP servers support an alternative way of using the groupOfNames - member and groupOfUniqueNames - uniqueMember attributes to model group membership.")}</li>
40+
<li><b>#{_("NIS Netgroups")}</b> - #{_("Use NIS netgroups instead of posix groups. FreeIPA and POSIX LDAP server types supports alternative way of grouping users through Netgroups.")}</li>
41+
</ul>" } %>
3442

3543
<%= textarea_f f, :ldap_filter, :label => _("LDAP filter"), :help_block => _("Custom LDAP search filter, <i>optional</i>").html_safe, :size => "col-md-8" %>
3644
<%= checkbox_f f, :onthefly_register,

db/migrate/20250422171523_add_use_rfc4519_group_membership_to_ldap_auth_source.rb

Lines changed: 0 additions & 5 deletions
This file was deleted.
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
class ExtendLdapGroupMembershipOptions < ActiveRecord::Migration[7.0]
2+
def up
3+
add_column :auth_sources, :ldap_group_membership, :string
4+
AuthSourceLdap.where.not(server_type: 'active_directory').update_all(ldap_group_membership: 'posix')
5+
AuthSourceLdap.where(use_netgroups: true).update_all(use_netgroups: 'nis_netgroups')
6+
remove_column :auth_sources, :use_netgroups
7+
end
8+
9+
def down
10+
add_column :auth_sources, :use_netgroups, :boolean, :default => false
11+
AuthSourceLdap.where(ldap_group_membership: 'nis_netgroups').update_all(use_netgroups: true)
12+
remove_column :auth_sources, :ldap_group_membership
13+
end
14+
end

test/factories/auth_source_ldap.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
attr_lastname { 'daho' }
99
port { '389' }
1010
server_type { 'posix' }
11+
ldap_group_membership { 'posix' }
1112
end
1213

1314
trait :posix

test/models/auth_sources/auth_source_ldap_test.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,11 @@ def setup
5858
end
5959

6060
test "it enforces use_netgroups to false for active directory" do
61-
auth_source_ldap.use_netgroups = true
61+
auth_source_ldap.ldap_group_membership = 'nis_netgroups'
6262
auth_source_ldap.server_type = :active_directory
6363

6464
assert auth_source_ldap.valid?
65-
refute auth_source_ldap.use_netgroups
65+
assert_nil auth_source_ldap.ldap_group_membership
6666
end
6767

6868
test "return nil if login is blank or password is blank" do

webpack/assets/javascripts/foreman_auth_source.js

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -83,17 +83,30 @@ function updateLdapAccountHelp(selectedType) {
8383

8484
export function changeLdapServerType() {
8585
const type = $('#auth_source_ldap_server_type').val();
86-
$('#auth_source_ldap_use_netgroups')
87-
.closest('.form-group')
88-
.toggle(type !== 'active_directory');
89-
$('#auth_source_ldap_use_rfc4519_group_membership')
90-
.closest('.form-group')
91-
.toggle(type === 'posix');
86+
const membershipType = $('#auth_source_ldap_ldap_group_membership');
87+
88+
membershipType.closest('.form-group').toggle(type !== 'active_directory');
89+
90+
if (type !== 'active_directory') {
91+
const rfc4519 = $(
92+
'#auth_source_ldap_ldap_group_membership option[value="rfc4519"]'
93+
);
94+
95+
if (type !== 'posix') {
96+
rfc4519.attr('disabled', 'disabled');
97+
if (membershipType.find(':selected').val() === 'rfc4519') {
98+
membershipType.val(null).trigger('change');
99+
}
100+
} else {
101+
rfc4519.removeAttr('disabled');
102+
}
103+
}
104+
92105
updateLdapAccountHelp(type);
93106
}
94107

95108
$(document).ready(() => {
96-
if (window.location.pathname.match('auth_source_ldaps/i')) {
109+
if (window.location.pathname.match(/auth_source_ldaps/i)) {
97110
changeLdapServerType();
98111
}
99112
});

0 commit comments

Comments
 (0)