Changeset 71 for LATMOS-Accounts/lib/LATMOS/Accounts/Bases/Ad.pm
- Timestamp:
- 05/05/09 02:24:50 (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
LATMOS-Accounts/lib/LATMOS/Accounts/Bases/Ad.pm
r63 r71 39 39 Create a new LATMOS::Ad object for windows AD $domain. 40 40 41 domain / server: either the Ad domain or directly the server 42 43 ldap_args is an optionnal list of arguments to pass to L<Net::LDAP>. 41 options: 42 43 =over 4 44 45 =item domain 46 47 The Active directory domain 48 49 =item server (optional) 50 51 If set, try to connect to this server, if not set, a dns query is performed 52 to find AD server, first responding is used. 53 54 =item ssl 55 56 If set, try to connect using ssl 57 58 =item OBJECT_container 59 60 The sub path where to find object type of OBJECT and where they should 61 be created 62 63 =back 44 64 45 65 =cut … … 56 76 _password => $options{password}, 57 77 _ssl => $options{ssl}, 78 _param => { %options }, 58 79 }; 59 80 60 81 bless($self, $class); 82 } 83 84 sub param { 85 my ($self, $var) = @_; 86 return $self->{_param}{$var} 87 } 88 89 sub object_base_dn { 90 my ($self, $otype) = @_; 91 warn $otype; 92 return join(',', 93 ($self->param($otype . '_container') || 'cn=Users'), 94 $self->top_dn, 95 ); 61 96 } 62 97 … … 191 226 } 192 227 193 sub find_username {194 my ($self, $lastname, $firstname) = @_;195 if (!ref $self) { # if call w/o ldap connection196 ($self, $lastname, $firstname) = (undef, $self, $lastname);197 }198 199 my $username = _username_format($lastname);200 if (!$self) { return $username }201 202 if (!$self->get_user($lastname, attrs => [ 'cn' ])) {203 return $username;204 }205 206 foreach $username (map { _username_format($_) } (207 $lastname . substr($firstname, 0, 1),208 $lastname . $firstname,209 )) {210 !$self->get_user($username, attrs => [ 'cn' ]) and return $username;211 }212 213 undef214 }215 216 sub _defaults_user_attrs {217 my ($self, $entry, $attrs) = @_;218 219 foreach my $attr (keys %{ $attrs || {} }) {220 my $val = $attrs->{$attr};221 222 $attr =~ /^homeDirectory$/ and do {223 $entry->replace('unixHomeDirectory', $val);224 };225 226 $attr =~ /^(givenName|sn)$/ and do {227 $entry->replace('displayName',228 join(' ', map { ucfirst($_ || '') } (229 ($attrs->{'givenName'} || $entry->get_value('givenName')), # first name230 ($attrs->{'sn'} || $entry->get_value('sn')), # last name231 ))232 );233 $entry->replace('gecos', # TODO reencode to aovid accents234 join(' ', map { ucfirst($_ || '') } (235 ($attrs->{'givenName'} || $entry->get_value('givenName')), # first name236 ($attrs->{'sn'} || $entry->get_value('sn')), # last name237 ))238 );239 $attr eq 'sn' and do { # TODO generate clean login here / UNIX uid240 $entry->add('sAMAccountName' => $val) unless ($entry->exists('sAMAccountName'));241 };242 };243 244 # nothing special to do245 $entry->replace($attr => $val);246 }247 }248 249 228 sub _defaults_group_attrs { 250 229 my ($self, $entry, $attrs) = @_; … … 253 232 $entry->replace($attr => $val); 254 233 } 255 }256 257 =head2 get_user($username)258 259 Return the entry for user $username260 261 =cut262 263 sub get_user {264 my ($self, $username, @search_args) = @_;265 266 my $mesg = $self->search(267 @search_args,268 filter => "(&(ObjectClass=user) (!(ObjectClass=computer)) (cn=$username))",269 base => $self->top_dn,270 );271 272 $mesg->code and return;273 274 my ($entry, @others) = $mesg->entries;275 276 return if(@others); # we cannot have multiple entries...277 $entry278 }279 280 =head2 modify_user($username, $param)281 282 =cut283 284 sub modify_user {285 my ($self, $username, $param) = @_;286 287 my $mesg = $self->search(288 base => $self->{_top_dn},289 filter => "(&(ObjectClass=user) (!(ObjectClass=computer)) (cn=$username))",290 );291 292 $mesg->code and do {293 warn $mesg->error;294 return;295 };296 297 my ($entry) = $mesg->entries; # TODO hopefully only one...298 299 $self->_defaults_user_attrs(300 $entry,301 $param,302 );303 304 $mesg = $entry->update($self);305 306 if ($mesg->code) {307 warn $mesg->error;308 return;309 } else { return 1 }310 }311 312 =head2 delete_user($username)313 314 =cut315 316 sub delete_user {317 my ($self, $username) = @_;318 319 my $mesg = $self->search(320 base => $self->{_top_dn},321 filter => "(&(ObjectClass=user) (!(ObjectClass=computer)) (cn=$username))",322 );323 324 $mesg->code and do {325 warn $mesg->error;326 return;327 };328 329 my ($entry) = $mesg->entries; # TODO hopefully one330 331 $mesg = $self->delete($entry->dn);332 333 if ($mesg->code) {334 warn $mesg->error;335 return;336 } else { return 1 }337 }338 339 =head2 create_group340 341 =cut342 343 sub create_group {344 my ($self, $param) = @_;345 346 my $entry = Net::LDAP::Entry->new;347 348 my $groupname = $param->{name};349 $entry->dn("cn=$groupname,cn=Users," . $self->top_dn);350 351 $param->{gidNumber} ||= $self->find_next_gid;352 353 $self->_defaults_group_attrs($entry,354 {355 objectClass => [ qw(top group) ],356 %{ $param || {} },357 }358 );359 360 my $mesg = $self->add($entry);361 362 if ($mesg->code) {363 warn $mesg->error;364 return;365 } else { return 1 };366 }367 368 =head2 delete_group369 370 =cut371 372 sub delete_group {373 my ($self, $groupname) = @_;374 375 my $mesg = $self->search(376 base => $self->{_top_dn},377 filter => "(&(ObjectClass=group) (cn=$groupname))",378 );379 380 $mesg->code and do {381 warn $mesg->error;382 return;383 };384 385 my ($entry) = $mesg->entries; # TODO hopefully one386 387 $mesg = $self->delete($entry->dn);388 389 if ($mesg->code) {390 warn $mesg->error;391 return;392 } else { return 1 }393 234 } 394 235
Note: See TracChangeset
for help on using the changeset viewer.