group_fields=Extra LDAP group properties to allow editing of<br>(In <i>fieldname</i> <i>description</i> format),9,40,3,\t
multi_fields=Allow multiple values for extra properties?,1,1-Yes,0-No
noclash=Attributes for which duplicates are disallowed,0
+person=Give all Unix users the <tt>person</tt> object class?,1,1-Yes,0-No
line5=Home directory options,11
homedir_perms=Permissions on new home directories,3,From Users and Groups module
local @classes = ( "posixAccount", "shadowAccount",
split(/\s+/, $config{'other_class'}),
@{$_[0]->{'ldap_class'}} );
+if ($schema->objectclass("person") && $config{'person'}) {
+ push(@classes, "person");
+ }
@classes = &unique(@classes);
local @attrs = &user_to_dn($_[0]);
push(@attrs, &split_props($config{'props'}, $_[0]));
push(@attrs, @{$_[0]->{'ldap_attrs'}});
push(@attrs, "objectClass" => \@classes);
+if (&indexoflc("person", @classes) >= 0 && !&in_props(\@attrs, "sn")) {
+ # Person needs 'sn'
+ push(@attrs, "sn", &in_props(\@attrs, "cn"));
+ }
local $rv = $ldap->add($_[0]->{'dn'}, attr => \@attrs);
if ($rv->code) {
&error(&text('usave_eadd', $rv->error));
return $string;
}
+# in_props(&props, name)
+# Looks up the value of a named property in a list
+sub in_props
+{
+local ($props, $name) = @_;
+for(my $i=0; $i<@$props; $i++) {
+ if (lc($props->[$i]) eq lc($name)) {
+ return $props->[$i+1];
+ }
+ }
+return undef;
+}
+
1;
# Add to the ldap database
@classes = ( "posixAccount", "shadowAccount" );
+ if ($schema->objectclass("person") && $config{'person'}) {
+ push(@classes, "person");
+ }
push(@classes, split(/\s+/, $config{'other_class'}));
push(@classes, $samba_class) if ($in{'samba'});
@classes = &unique(@classes);
$base = &get_user_base();
$newdn = "uid=$user,$base";
- $rv = $ldap->add($newdn, attr =>
- [ "cn" => $real,
- "uid" => \@users,
- "uidNumber" => $uid,
- "loginShell" => $shell,
- "homeDirectory" => $home,
- "gidNumber" => $gid,
- "userPassword" => $pass,
- "objectClass" => \@classes,
- @props ]);
+ @allprops = ( "cn" => $real,
+ "uid" => \@users,
+ "uidNumber" => $uid,
+ "loginShell" => $shell,
+ "homeDirectory" => $home,
+ "gidNumber" => $gid,
+ "userPassword" => $pass,
+ "objectClass" => \@classes,
+ @props );
+ if (&indexoflc("person", @classes) >= 0 &&
+ !&in_props(\@allprops, "sn")) {
+ # Person needs an 'sn' too
+ push(@allprops, "sn", $real);
+ }
+ $rv = $ldap->add($newdn, attr => \@allprops);
if ($rv->code) {
&error(&text('usave_eadd', $rv->error));
}
else {
@cyrus_class_4 = split(' ',$cyrus_class);
foreach $one_cyrus_class (@cyrus_class_4) {
- @classes = grep { $_ ne $one_cyrus_class } @classes;
- }
-
+ @classes = grep { $_ ne $one_cyrus_class }
+ @classes;
+ }
}
push(@classes, "shadowAccount") if ($shadow);
&name_fields();
@classes = &unique(@classes);
@rprops = grep { defined($uinfo->get_value($_)) } @rprops;
$newdn = $in{'dn'};
- $rv = $ldap->modify($in{'dn'}, replace =>
- { "cn" => $real,
- "uid" => \@users,
- "uidNumber" => $uid,
- "loginShell" => $shell,
- "homeDirectory" => $home,
- "gidNumber" => $gid,
- "userPassword" => $pass,
- "objectClass" => [ &unique(@classes) ],
- @props },
- 'delete' => \@rprops);
+ %allprops = ( "cn" => $real,
+ "uid" => \@users,
+ "uidNumber" => $uid,
+ "loginShell" => $shell,
+ "homeDirectory" => $home,
+ "gidNumber" => $gid,
+ "userPassword" => $pass,
+ "objectClass" => \@classes,
+ @props );
+ if (&indexoflc("person", @classes) >= 0 &&
+ !$allprops{'sn'}) {
+ # Person needs 'sn'
+ $allprops{'sn'} = $real;
+ }
+ $rv = $ldap->modify($in{'dn'}, 'replace' => \%allprops,
+ 'delete' => \@rprops);
if ($rv->code) {
&error(&text('usave_emod', $rv->error));
}