Module config options for additional object classes

This commit is contained in:
Jamie Cameron
2010-09-07 13:22:37 -07:00
parent cc44783116
commit 2f8ada9fdb
12 changed files with 45 additions and 18 deletions

View File

@ -73,3 +73,5 @@ Modifying a user now correctly changes the sn attribute too.
Added a field for editing the description for LDAP groups. Added a field for editing the description for LDAP groups.
---- Changes since 1.510 ---- ---- Changes since 1.510 ----
The list of groups now includes descriptions, if any are set. The list of groups now includes descriptions, if any are set.
---- Changes since 1.520 ----
Added Module Config options for additional LDAP filters to find users and groups, in addition to the posixAccount / posixGroup object class filters.

View File

@ -242,7 +242,7 @@ LINE: foreach $line (split(/[\r\n]+/, $data)) {
$newdn = "uid=$user{'user'},$base"; $newdn = "uid=$user{'user'},$base";
$rv = $ldap->search(base => $newdn, $rv = $ldap->search(base => $newdn,
scope => 'base', scope => 'base',
filter => '(&(objectClass=posixAccount))'); filter => &user_filter());
($uinfo) = $rv->all_entries; ($uinfo) = $rv->all_entries;
%user = &dn_to_hash($uinfo); %user = &dn_to_hash($uinfo);

View File

@ -23,6 +23,8 @@ group_fields=Extra LDAP group properties to allow editing of<br>(In <i>fieldname
multi_fields=Allow multiple values for extra properties?,1,1-Yes,0-No multi_fields=Allow multiple values for extra properties?,1,1-Yes,0-No
noclash=Attributes for which duplicates are disallowed,0 noclash=Attributes for which duplicates are disallowed,0
person=Give all Unix users the <tt>person</tt> object class?,1,1-Yes,0-No person=Give all Unix users the <tt>person</tt> object class?,1,1-Yes,0-No
user_filter=Additional LDAP filter for users,3,None,,,,Attribute=value
group_filter=Additional LDAP filter for groups,3,None,,,,Attribute=value
line5=Home directory options,11 line5=Home directory options,11
homedir_perms=Permissions on new home directories,3,From Users and Groups module homedir_perms=Permissions on new home directories,3,From Users and Groups module

View File

@ -12,7 +12,7 @@ if ($in{'new'}) {
else { else {
$rv = $ldap->search(base => $in{'dn'}, $rv = $ldap->search(base => $in{'dn'},
scope => 'base', scope => 'base',
filter => '(objectClass=posixGroup)'); filter => &group_filter());
($ginfo) = $rv->all_entries; ($ginfo) = $rv->all_entries;
$group = $ginfo->get_value('cn'); $group = $ginfo->get_value('cn');
$gid = $ginfo->get_value('gidNumber'); $gid = $ginfo->get_value('gidNumber');

View File

@ -36,7 +36,7 @@ else {
# Get values from current user # Get values from current user
$rv = $ldap->search(base => $in{'dn'}, $rv = $ldap->search(base => $in{'dn'},
scope => 'base', scope => 'base',
filter => '(objectClass=posixAccount)'); filter => &user_filter());
($uinfo) = $rv->all_entries; ($uinfo) = $rv->all_entries;
@users = $uinfo->get_value('uid'); @users = $uinfo->get_value('uid');
$user = $users[0]; $user = $users[0];
@ -279,7 +279,7 @@ if ($config{'secmode'} != 1) {
@defsecs = &split_quoted_string($mconfig{'default_secs'}); @defsecs = &split_quoted_string($mconfig{'default_secs'});
$base = &get_group_base(); $base = &get_group_base();
$rv = $ldap->search(base => $base, $rv = $ldap->search(base => $base,
filter => '(objectClass=posixGroup)'); filter => &group_filter());
%ingroups = ( ); %ingroups = ( );
foreach $g (sort { lc($a->dn()) cmp lc($b->dn()) } $rv->all_entries) { foreach $g (sort { lc($a->dn()) cmp lc($b->dn()) } $rv->all_entries) {
$group = $g->get_value("cn"); $group = $g->get_value("cn");

View File

@ -101,12 +101,12 @@ elsif ($config{'md5'} == 3 || $config{'md5'} == 4) {
# Count the number of users and groups # Count the number of users and groups
$base = &get_user_base(); $base = &get_user_base();
$rv = $ldap->search(base => $base, $rv = $ldap->search(base => $base,
filter => '(objectClass=posixAccount)', filter => &user_filter(),
sizelimit => $mconfig{'display_max'}+1); sizelimit => $mconfig{'display_max'}+1);
$ucount = $rv->count; $ucount = $rv->count;
$base = &get_group_base(); $base = &get_group_base();
$rv = $ldap->search(base => $base, $rv = $ldap->search(base => $base,
filter => '(objectClass=posixGroup)', filter => &group_filter(),
sizelimit => $mconfig{'display_max'}+1); sizelimit => $mconfig{'display_max'}+1);
$gcount = $rv->count; $gcount = $rv->count;

View File

@ -173,7 +173,7 @@ if (!defined(@list_users_cache)) {
local $ldap = &ldap_connect(); local $ldap = &ldap_connect();
local $base = &get_user_base(); local $base = &get_user_base();
local $rv = $ldap->search(base => $base, local $rv = $ldap->search(base => $base,
filter => '(objectClass=posixAccount)'); filter => &user_filter());
local $u; local $u;
foreach $u ($rv->all_entries) { foreach $u ($rv->all_entries) {
local %uinfo = &dn_to_hash($u); local %uinfo = &dn_to_hash($u);
@ -292,7 +292,7 @@ if (!defined(@list_groups_cache)) {
local $ldap = &ldap_connect(); local $ldap = &ldap_connect();
local $base = &get_group_base(); local $base = &get_group_base();
local $rv = $ldap->search(base => $base, local $rv = $ldap->search(base => $base,
filter => '(objectClass=posixGroup)'); filter => &group_filter());
local $g; local $g;
foreach $g ($rv->all_entries) { foreach $g ($rv->all_entries) {
local %ginfo = &dn_to_hash($g); local %ginfo = &dn_to_hash($g);
@ -1070,7 +1070,8 @@ if ($new) {
# Find existing group with the same GID # Find existing group with the same GID
local $base = &get_group_base(); local $base = &get_group_base();
local $rv = $ldap->search(base => $base, local $rv = $ldap->search(base => $base,
filter => "(&(objectClass=posixGroup)(gidNumber=$user->{'gid'}))"); filter => "(&".&group_filter().
"(gidNumber=$user->{'gid'}))");
local ($ginfo) = $rv->all_entries; local ($ginfo) = $rv->all_entries;
if ($ginfo && $ginfo->get_value("sambaSID")) { if ($ginfo && $ginfo->get_value("sambaSID")) {
# We can get the SID from the actual group # We can get the SID from the actual group
@ -1199,5 +1200,27 @@ for(my $i=0; $i<@$props; $i++) {
return undef; return undef;
} }
# user_filter()
# Returns an LDAP filter expression to find users
sub user_filter
{
my $rv = "(objectClass=posixAccount)";
if ($config{'user_filter'}) {
$rv = "(&".$rv."(".$config{'user_filter'}."))";
}
return $rv;
}
# group_filter()
# Returns an LDAP filter expression to find groups
sub group_filter
{
my $rv = "(objectClass=posixGroup)";
if ($config{'group_filter'}) {
$rv = "(&".$rv."(".$config{'group_filter'}."))";
}
return $rv;
}
1; 1;

View File

@ -8,12 +8,12 @@ $schema = $ldap->schema();
if ($in{'user'}) { if ($in{'user'}) {
$rv = $ldap->search(base => $in{'dn'}, $rv = $ldap->search(base => $in{'dn'},
scope => 'base', scope => 'base',
filter => '(objectClass=posixAccount)'); filter => &user_filter());
} }
else { else {
$rv = $ldap->search(base => $in{'dn'}, $rv = $ldap->search(base => $in{'dn'},
scope => 'base', scope => 'base',
filter => '(objectClass=posixGroup)'); filter => &group_filter());
} }
($what) = $rv->all_entries; ($what) = $rv->all_entries;

View File

@ -13,7 +13,7 @@ if (!$in{'new'}) {
# Get existing group # Get existing group
$rv = $ldap->search(base => $in{'dn'}, $rv = $ldap->search(base => $in{'dn'},
scope => 'base', scope => 'base',
filter => '(&(objectClass=posixGroup))'); filter => &group_filter());
($ginfo) = $rv->all_entries; ($ginfo) = $rv->all_entries;
$ginfo || &error($text{'gsave_egone'}); $ginfo || &error($text{'gsave_egone'});
$olddesc = $ginfo->get_value('description'); $olddesc = $ginfo->get_value('description');

View File

@ -12,7 +12,7 @@ if (!$in{'new'}) {
# Get existing user # Get existing user
$rv = $ldap->search(base => $in{'dn'}, $rv = $ldap->search(base => $in{'dn'},
scope => 'base', scope => 'base',
filter => '(&(objectClass=posixAccount))'); filter => &user_filter());
($uinfo) = $rv->all_entries; ($uinfo) = $rv->all_entries;
$uinfo || &error($text{'usave_egone'}); $uinfo || &error($text{'usave_egone'});
%ouser = &dn_to_hash($uinfo); %ouser = &dn_to_hash($uinfo);
@ -63,7 +63,7 @@ elsif ($in{'delete'}) {
print "$text{'udel_groups'}<br>\n"; print "$text{'udel_groups'}<br>\n";
$base = &get_group_base(); $base = &get_group_base();
$rv = $ldap->search(base => $base, $rv = $ldap->search(base => $base,
filter => '(&(objectClass=posixGroup))'); filter => &group_filter());
foreach $g ($rv->all_entries) { foreach $g ($rv->all_entries) {
local @mems = $g->get_value("memberUid"); local @mems = $g->get_value("memberUid");
local $idx = &indexof($user, @mems); local $idx = &indexof($user, @mems);
@ -617,7 +617,7 @@ else {
} }
$base = &get_group_base(); $base = &get_group_base();
$rv = $ldap->search(base => $base, $rv = $ldap->search(base => $base,
filter => '(&(objectClass=posixGroup))'); filter => &group_filter());
foreach $g ($rv->all_entries) { foreach $g ($rv->all_entries) {
local @mems = $g->get_value("memberUid"); local @mems = $g->get_value("memberUid");
local $gname = $g->get_value("cn"); local $gname = $g->get_value("cn");
@ -663,7 +663,7 @@ else {
# Get the updated user object # Get the updated user object
$rv = $ldap->search(base => $newdn, $rv = $ldap->search(base => $newdn,
scope => 'base', scope => 'base',
filter => '(&(objectClass=posixAccount))'); filter => &user_filter());
($uinfo) = $rv->all_entries; ($uinfo) = $rv->all_entries;
%user = &dn_to_hash($uinfo); %user = &dn_to_hash($uinfo);

View File

@ -22,7 +22,7 @@ elsif ($in{'match'} == 3) {
$search = "(!($in{'field'}=*$in{'what'}*))"; $search = "(!($in{'field'}=*$in{'what'}*))";
} }
$rv = $ldap->search(base => $base, $rv = $ldap->search(base => $base,
filter => "(&(objectClass=posixGroup)$search)"); filter => "(&".&group_filter().$search.")");
if ($rv->code) { if ($rv->code) {
&error(&text('search_err', "<tt>$search</tt>", &error(&text('search_err', "<tt>$search</tt>",
"<tt>$base</tt>", $rv->error)); "<tt>$base</tt>", $rv->error));

View File

@ -22,7 +22,7 @@ elsif ($in{'match'} == 3) {
$search = "(!($in{'field'}=*$in{'what'}*))"; $search = "(!($in{'field'}=*$in{'what'}*))";
} }
$rv = $ldap->search(base => $base, $rv = $ldap->search(base => $base,
filter => "(&(objectClass=posixAccount)$search)"); filter => "(&".&user_filter().$search.")");
if ($rv->code) { if ($rv->code) {
&error(&text('search_err', "<tt>$search</tt>", &error(&text('search_err', "<tt>$search</tt>",
"<tt>$base</tt>", $rv->error)); "<tt>$base</tt>", $rv->error));