Samba-LDAP
view release on metacpan or search on metacpan
lib/Samba/LDAP/User.pm view on Meta::CPAN
# $rc is return code. We are looking for '1'
my ( $rc, $dn ) = $self->_get_user_dn2($username);
if ( $rc and defined($dn) ) {
$self->error("User $username already exists, can not add.\n");
croak $self->error();
}
elsif ( !$rc ) {
$self->error("error retrieving details\n");
croak $self->error();
}
# Read options
# we create the user in the specified ou (relative to the users suffix)
my $user_ou = $args{ou};
my $node;
# Connect
my $ldap_start = Samba::LDAP->new();
my $ldap = $ldap_start->connect_ldap_master();
if ( defined $user_ou ) {
if ( !( $user_ou =~ m{^ou=(.*)} ) ) {
$node = $user_ou;
$user_ou = "ou=$user_ou";
}
else {
($node) = ( $user_ou =~ m{ou=(.*)} );
}
# if the ou does not exist, we create it
my $mesg = $ldap->search(
base => $self->{usersdn},
scope => 'one',
filter => "(&(objectClass=organizationalUnit)(ou=$node))"
);
$mesg->code && die $mesg->error;
if ( $mesg->count eq 0 ) {
# add organizational unit
my $add = $ldap->add(
"ou=$node,$self->{usersdn}",
attr => [
'objectclass' => [ 'top', 'organizationalUnit' ],
'ou' => "$node"
]
);
$add->code && die "failed to add entry: ", $add->error;
}
$self->{usersdn} = "$user_ou,$self->{usersdn}";
}
my $userUidNumber = $args{user_uid};
if ( !defined($userUidNumber) ) {
$userUidNumber = $self->_get_next_id( $self->{usersdn}, 'uidNumber' );
}
elsif ( getpwuid($userUidNumber) ) {
carp "Uid already $userUidNumber exists.\n";
}
my $createGroup = 0;
my $userGidNumber = $args{group};
my $group = Samba::LDAP::Group->new();
# gid not specified ?
if ( !defined($userGidNumber) ) {
# windows machine => $self->{defaultComputerGid}
if ( defined( $args{workstation} ) ) {
$userGidNumber = $self->{defaultComputerGid};
}
else {
# user will have gid = $self->{defaultUserGid}
$userGidNumber = $self->{defaultUserGid};
}
}
else {
my $gid;
if ( ( $gid = $group->parse_group($userGidNumber) ) < 0 ) {
$self->error("unknown group $userGidNumber\n");
croak $self->error();
}
$userGidNumber = $gid;
}
my $group_entry;
my $userGroupSID;
my $userRid;
my $user_sid;
if ( defined $args{windows_user} or defined $args{trust_account} ) {
# as grouprid we use the value of the sambaSID attribute for
# group of gidNumber=$userGidNumber
$group_entry = $group->read_group_entry_gid($userGidNumber);
$userGroupSID = $group_entry->get_value('sambaSID');
unless ($userGroupSID) {
$self->error( "Error: SID not set for unix group $userGidNumber\n"
. "check if your unix group is mapped to an NT group\n" );
die $self->error();
}
# as rid we use 2 * uid + 1000
$userRid = 2 * $userUidNumber + 1000;
# let's test if this SID already exist
$user_sid = "$self->{SID}-$userRid";
my $test_exist_sid =
$ldap_start->does_sid_exist( $user_sid, $self->{usersdn} );
if ( $test_exist_sid->count == 1 ) {
$self->{sid_message} = "User SID already owned by\n";
# there should not exist more than one entry, but ...
( run in 1.174 second using v1.01-cache-2.11-cpan-995e09ba956 )