Changeset 861 for LATMOS-Accounts/lib/LATMOS/Accounts/Bases/Sql/User.pm
- Timestamp:
- 12/02/11 11:42:17 (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
LATMOS-Accounts/lib/LATMOS/Accounts/Bases/Sql/User.pm
r840 r861 45 45 sub has_extended_attributes { 1 } 46 46 47 sub _delayed_fields { 48 my ($self)= @_; 49 return qw(memberOf manager directReports department); 50 } 51 52 sub _office_address_fields { qw(telephoneNumber physicalDeliveryOfficeName site) } 53 54 sub _inline_fields { 55 my ($class, $for, $base) = @_; 56 return ( 57 uidNumber => 'uidnumber', 58 gidNumber => 'gidnumber', 59 exported => 'exported', 60 expire => 'expire', 61 ($for !~ /w/) ? ( 62 name => 'name', 63 cn => 'name', 64 create => 'create', 65 date => 'date', 66 ) : (), 67 ); 68 } 69 70 sub _managed_fields { 71 my ($self, $for, $base) = @_; 72 return ( 73 memberOf => 'memberOf', 74 forward => 'forward', 75 aliases => 'aliases', 76 revaliases => 'revaliases', 77 (map { $_ => $_ } $self->_address_fields), 78 (map { $_ => $_ } $self->_office_address_fields), 79 (($for !~ /w/) ? ( 80 uid => 'name', 81 cn => 'name', 82 gecos => 'gecos', 83 displayName => 'displayName', 84 sAMAccountName => 'sAMAccountName', 85 accountExpires => 'accountExpires', 86 shadowExpire => 'shadowExpire', 87 directReports => 'directReports', 88 managedObjects => 'managedObjects', 89 otheraddress => 'otheraddress', 90 mainaddress => 'mainaddress', 91 postalAddress => 'postalAddress', 92 facsimileTelephoneNumber => 'facsimileTelephoneNumber', 93 allsite => 'allsite', 94 managerContact => 'managerContact', 95 expireText => 'expireText', 96 cells => 'cells', 97 departments => 'departments', 98 ) : ()), 47 sub _get_attr_schema { 48 my ($class, $base) = @_; 49 50 $class->SUPER::_get_attr_schema($base, 51 { 52 uidNumber => { inline => 1, iname => 'uidnumber', uniq => 1, 53 mandatory => 1, }, 54 uidnumber => { inline => 1, hide => 1, }, 55 gidNumber => { 56 inline => 1, 57 iname => 'gidnumber', 58 mandatory => 1, 59 can_values => sub { 60 map { $base->get_object('group', 61 $_)->get_attributes('gidNumber') } 62 $base->list_objects('group') 63 }, 64 display => sub { 65 my ($self, $val) = @_; 66 my ($gr) = $self->base->search_objects('group', "gidNumber=$val") 67 or return; 68 return $gr; 69 }, 70 reference => 'group', 71 }, 72 loginShell => { mandatory => 1 }, 73 gidnumber => { inline => 1, hide => 1, 74 can_values => sub { 75 map { $_->get_attributes('gidNumber') } 76 map { $base->get_object('group', $_) } 77 $base->list_objects('group') 78 }, 79 mandatory => 1, 80 reference => 'group', 81 }, 82 exported => { 83 inline => 1, 84 formtype => 'CHECKBOX', 85 }, 86 locked => { 87 formtype => 'CHECKBOX', 88 formopts => { rawvalue => 1, }, 89 }, 90 expire => { inline => 1, formtype => 'DATE', }, 91 name => { inline => 1, ro => 1, }, 92 cn => { inline => 1, ro => 1, iname => 'name' }, 93 create => { inline => 1, ro => 1, }, 94 date => { inline => 1, ro => 1, }, 95 memberOf => { multiple => 1, delayed => 1, }, 96 forward => {}, 97 aliases => { 98 reference => 'aliases', 99 formtype => 'TEXT', 100 multiple => 1, 101 }, 102 revaliases => { 103 reference => 'revaliases', 104 formtype => 'TEXT', 105 }, 106 manager => { 107 delayed => 1, 108 can_values => sub { 109 my %uniq = map { $_ => 1 } grep { $_ } 110 ($_[1] ? $_[1]->get_attributes('manager') : ()), 111 $base->search_objects('user', 'active=*'); 112 sort keys %uniq; 113 }, 114 reference => 'user', 115 }, 116 department => { 117 reference => 'group', 118 can_values => sub { 119 $base->search_objects('group', 'sutype=dpmt') 120 } 121 }, 122 contratType => { 123 reference => 'group', 124 can_values => sub { 125 $base->search_objects('group', 'sutype=contrattype') 126 } 127 }, 128 site => { 129 reference => 'site', 130 can_values => sub { 131 $base->search_objects('site') 132 } 133 }, 134 co => { }, 135 l => { }, 136 postalCode => { }, 137 streetAddress => { formtype => 'TEXTAREA', }, 138 postOfficeBox => { }, 139 st => { }, 140 facsimileTelephoneNumber => { }, 141 o => { }, 142 telephoneNumber => { }, 143 physicalDeliveryOfficeName => { }, 144 uid => { iname => 'name', ro => 1 }, 145 cn => { iname => 'name', ro => 1 }, 146 gecos => { ro => 1, }, 147 displayName => { ro => 1, managed => 1, }, 148 sAMAccountName => { ro => 1, managed => 1 }, 149 accountExpires => { ro => 1, managed => 1 }, 150 shadowExpire => { ro => 1, managed => 1 }, 151 directReports => { 152 reference => 'user', 153 ro => 1, 154 delayed => 1, 155 }, 156 managedObjects => { ro => 1, reference => 'group', }, 157 otheraddress => { ro => 1, reference => 'address', }, 158 mainaddress => { ro => 1, reference => 'address', }, 159 postalAddress => { ro => 1, }, 160 facsimileTelephoneNumber => { ro => 1, }, 161 allsite => { 162 ro => 1, 163 reference => 'site', 164 }, 165 managerContact => { 166 ro => 1, 167 reference => 'user', 168 }, 169 expireText => { ro => 1, }, 170 krb5ValidEnd => { ro => 1, }, 171 cells => { 172 ro => 1, 173 reference => 'group', 174 }, 175 departments => { 176 reference => 'group', 177 delayed => 1, 178 ro => 1, 179 }, 180 arrivalDate => { }, 181 expired => { ro => 1 }, 182 active => { ro => 1 }, 183 pwdAccountLockedTime => { managed => 1, ro => 1 } 184 } 99 185 ) 100 186 } … … 177 263 $res->{expire} =~ /(\d+) days\s*(\w)?/; 178 264 return $1 + ($2 ? 1 : 0); 265 } elsif ($field eq 'krb5ValidEnd') { 266 my $sth = $self->db->prepare_cached( 267 sprintf( 268 q{select date_part('epoch', expire)::int as expire 269 from %s where %s = ?}, 270 $self->db->quote_identifier($self->object_table), 271 $self->db->quote_identifier($self->key_field), 272 ) 273 ); 274 $sth->execute($self->id); 275 my $res = $sth->fetchrow_hashref; 276 $sth->finish; 277 return $res->{expire} 179 278 } elsif ($field eq 'expireText') { 180 279 my $sth = $self->db->prepare_cached( … … 190 289 $sth->finish; 191 290 return $res->{expire} 291 } elsif ($field eq 'pwdAccountLockedTime') { 292 if ($self->_get_c_field('locked')) { 293 return '000001010000Z'; 294 } else { 295 my $sth = $self->db->prepare_cached( 296 sprintf( 297 q{select to_char(expire AT TIME ZONE 'Z', 'YYYYMMDDHH24MISSZ') as expire 298 from %s where %s = ? and expire < now()}, 299 $self->db->quote_identifier($self->object_table), 300 $self->db->quote_identifier($self->key_field), 301 ) 302 ); 303 $sth->execute($self->id); 304 my $res = $sth->fetchrow_hashref; 305 $sth->finish; 306 return $res->{expire} 307 } 192 308 } elsif ($field eq 'otheraddress') { 193 309 my $sth = $self->db->prepare_cached(q{ … … 209 325 $sth->finish; 210 326 return $res->{name}; 211 } elsif (grep { $field eq $_ } __PACKAGE__->_address_fields(), 212 $self->_office_address_fields, 'postalAddress') { 327 } elsif (grep { $field eq $_ } qw(postalAddress 328 co l postalCode streetAddress 329 postOfficeBox st 330 facsimileTelephoneNumber 331 o telephoneNumber 332 physicalDeliveryOfficeName 333 site 334 )) { 213 335 if (my $fmainaddress = $self->_get_c_field('mainaddress')) { 214 336 my $address = $self->base->get_object('address', $fmainaddress); … … 262 384 } 263 385 386 sub _get_state { 387 my ($self, $state) = @_; 388 for ($state) { 389 /^expired$/ and do { 390 my $attribute = $self->attribute('expire'); 391 $attribute->check_acl('r') or return; 392 my $sth = $self->db->prepare_cached( 393 q{ select coalesce(expire < now(), false) as exp from "user" 394 where "user".name = ?} 395 ); 396 $sth->execute($self->id); 397 my $res = $sth->fetchrow_hashref; 398 $sth->finish; 399 return $res->{exp} ? 1 : 0; 400 }; 401 } 402 } 403 264 404 sub set_fields { 265 405 my ($self, %data) = @_; … … 267 407 my $res = 0; 268 408 foreach my $attr (keys %data) { 409 $attr eq 'gidnumber' && $data{$attr} !~ /^\d+$/ and do { 410 my $group = $self->base->get_object('group', $data{$attr}) or do { 411 $self->base->log(LA_ERROR, 412 "Can't set gidNumber to %s: no such group", $data{$attr}); 413 return; 414 }; 415 $data{$attr} = $group->get_attributes('gidNumber'); 416 }; 269 417 $attr =~ /^memberOf$/ and do { 270 418 my %member; … … 287 435 $res++; 288 436 } elsif ($member{$_}{c}) { 437 if (($self->get_c_field('department') || '') eq $group->id) { 438 $self->base->log(LA_WARN, 439 "Don't removing user %s from group %s: is it's department", 440 $self->id, $group->id); 441 next; 442 } 289 443 my $sth = $self->db->prepare_cached( 290 444 q{delete from group_attributes_users where value = ? and attr = ? and okey = ?} … … 421 575 } 422 576 }; 423 grep { $attr eq $_ } (__PACKAGE__->_office_address_fields, __PACKAGE__->_address_fields()) and do { 577 grep { $attr eq $_ } (qw(co l postalCode streetAddress 578 postOfficeBox st facsimileTelephoneNumber 579 o telephoneNumber physicalDeliveryOfficeName site)) and do { 424 580 my $fmainaddress = $self->_get_c_field('mainaddress'); 425 581 # set address attribute => create address object on the fly … … 439 595 if ($fmainaddress && 440 596 (my $address = $self->base->get_object('address', $fmainaddress))) { 441 $res += $address->set_c_fields($attr => $data{$attr}) ||0; 597 if ($address->attribute($attr) && 598 !$address->attribute($attr)->ro) { 599 $res += $address->set_c_fields($attr => $data{$attr}) ||0; 600 } 442 601 } 443 602 next; … … 446 605 } 447 606 if (keys %fdata) { 448 return $self->SUPER::set_fields(%fdata) + $res; 607 if (defined(my $res2 = $self->SUPER::set_fields(%fdata))) { 608 return $res2 + $res; 609 } else { 610 return; 611 } 449 612 } else { return $res; } 450 613 }
Note: See TracChangeset
for help on using the changeset viewer.