Changeset 1315 for trunk/LATMOS-Accounts/lib/LATMOS/Accounts
- Timestamp:
- 04/07/15 16:42:39 (9 years ago)
- Location:
- trunk/LATMOS-Accounts/lib/LATMOS/Accounts/Bases
- Files:
-
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LATMOS-Accounts/lib/LATMOS/Accounts/Bases/Attributes.pm
r1297 r1315 192 192 } 193 193 194 =head2 checkinput ($value) 195 196 Check input value, return false on error 197 198 =cut 199 200 sub checkinput { 201 my ($self, $values) = @_; 202 203 if ($self->mandatory && 204 (!(defined($values)) || $values eq '')) { 205 $self->base->log(LA_ERR, 206 "%s attribute cannot be empty for object %s/%s", 207 $self->name, 208 $self->object->type, 209 $self->object->id, 210 ); 211 return; 212 } 213 214 if ($self->has_values_list && $values) { 215 my @possible = $self->can_values; 216 foreach my $value (ref $values ? @{ $values } : $values) { 217 if (! grep { $value eq $_ } @possible) { 218 $self->base->log(LA_ERR, 219 "%s attribute cannot have `%s' as value for object %s/%s", 220 $self->name, 221 $value, 222 $self->object->type, 223 $self->object->id, 224 ); 225 return; 226 } 227 } 228 } 229 230 if (ref $values eq 'ARRAY' && ! $self->multiple) { 231 $self->base->log(LA_WARN, 'Attribute %s is not multi valuesd', $self->name); 232 # TODO: really return an error 233 # return; 234 } 235 236 if ($self->{checkinput}) { 237 if (!$self->{checkinput}->($values)) { 238 return; 239 } 240 } 241 242 return 1; 243 } 244 194 245 =head2 readable 195 246 … … 370 421 my ($self, $values) = @_; 371 422 372 if (ref $self->{set} eq 'CODE') { 373 return $self->{set}->($self, 374 ref $values 375 ? [ map { $self->input($_) } @$values ] 376 : $values ? $self->input($values) : undef); 377 } else { 378 return $self->object->set_fields( 379 $self->iname, 380 ref $values 381 ? [ map { $self->input($_) } @$values ] 382 : $values ? $self->input($values) : undef); 383 } 423 my $inputv = ref $values 424 ? [ map { $self->input($_) } @$values ] 425 : $values ? $self->input($values) : undef; 426 427 my $res = ref $self->{set} eq 'CODE' 428 ? $self->{set}->($self, $inputv) 429 : $self->object->set_fields($self->iname, $inputv); 430 431 # If the attribute has a post code, call it 432 if ($res && $self->{post}) { 433 $self->{post}->($self, $inputv); 434 } 435 436 $res 384 437 } 385 438 -
trunk/LATMOS-Accounts/lib/LATMOS/Accounts/Bases/Objects.pm
r1306 r1315 370 370 return; 371 371 }; 372 $attribute->mandatory && 373 (!(defined($cdata{$cfield})) || $cdata{$cfield} eq '') and do{372 373 if (!$attribute->checkinput($cdata{$cfield})) { 374 374 $self->base->log(LA_ERR, 375 "%s attribute cannot be empty, ignoring for object %s/%s", 376 $cfield, 377 $self->type, 378 $self->id, 375 "Value for attribute %s to %s (%s) does not match requirements", 376 $cfield, $self->id, $self->type 379 377 ); 380 return 0;378 return; 381 379 }; 382 380 } -
trunk/LATMOS-Accounts/lib/LATMOS/Accounts/Bases/Sql/Accreq.pm
r1099 r1315 92 92 }, 93 93 }, 94 comment => { }, 95 description => { }, 96 notifyMail => { }, 94 97 } 95 98 ) -
trunk/LATMOS-Accounts/lib/LATMOS/Accounts/Bases/Sql/Address.pm
r1286 r1315 40 40 reference => 'site', 41 41 }, 42 sn => { ro => 1, }, 43 mail => { ro => 1, }, 44 givenName => { ro => 1, }, 45 postalAddress => { ro => 1, }, 46 displayName => { ro => 1, }, 47 co => { 48 ro => sub { $_[0] && $_[0]->get_attributes('site') ? 1 : 0 }, 49 }, 50 l => { 51 ro => sub { $_[0] && $_[0]->get_attributes('site') ? 1 : 0 }, 42 sn => { 43 managed => 1, 44 ro => 1, 45 get => sub { 46 my ($attr) = @_; 47 my $self = $attr->object; 48 my $user = $self->base->get_object('user', $self->_get_c_field('user')) 49 or return; 50 return $user->_get_c_field($attr->name); 51 }, 52 }, 53 mail => { 54 managed => 1, 55 ro => 1, 56 get => sub { 57 my ($attr) = @_; 58 my $self = $attr->object; 59 my $user = $self->base->get_object('user', $self->_get_c_field('user')) 60 or return; 61 return $user->_get_c_field($attr->name); 62 }, 63 }, 64 givenName => { 65 managed => 1, 66 ro => 1, 67 get => sub { 68 my ($attr) = @_; 69 my $self = $attr->object; 70 my $user = $self->base->get_object('user', $self->_get_c_field('user')) 71 or return; 72 return $user->_get_c_field($attr->name); 73 }, 74 }, 75 postalAddress => { 76 managed => 1, 77 ro => 1, 78 get => sub { 79 my ($attr) = @_; 80 my $self = $attr->object; 81 my $bp = $self->_get_c_field('postOfficeBox'); 82 return join("\n", grep { $_ } ( 83 $self->_get_c_field('o'), 84 $self->_get_c_field('streetAddress'), 85 ($bp ? 'BP ' . $bp : ''), 86 join(' ', grep { $_ } ( 87 $self->_get_c_field('postalCode'), 88 $self->_get_c_field('l'),)), 89 join(' ', grep { $_ } ( 90 $self->_get_c_field('st'), 91 $self->_get_c_field('co'),), 92 ) 93 ) 94 ); 95 }, 96 }, 97 displayName => { 98 managed => 1, 99 ro => 1, 100 get => sub { 101 my $self = $_[0]->object; 102 return join(' ', grep { $_ } ( 103 $self->_get_c_field('givenName'), 104 $self->_get_c_field('sn'), 105 ) 106 ); 107 }, 108 }, 109 co => { 110 managed => 1, 111 ro => sub { $_[0] && $_[0]->get_attributes('site') ? 1 : 0 }, 112 get => sub { 113 my ($self) = @_; 114 if (my $site = $self->object->get_attributes('site')) { 115 if (my $osite = $self->base->get_object('site', $site)) { 116 return $osite->get_attributes($self->name); 117 } 118 } 119 return $self->object->get_field($self->name); 120 }, 121 set => sub { 122 my ($self, $data) = @_; 123 if (my $site = $self->object->get_attributes('site')) { 124 return 1; 125 } else { 126 return $self->object->set_fields($self->name, $data) 127 } 128 }, 129 }, 130 l => { 131 managed => 1, 132 ro => sub { $_[0] && $_[0]->get_attributes('site') ? 1 : 0 }, 133 get => sub { 134 my ($self) = @_; 135 if (my $site = $self->object->get_attributes('site')) { 136 if (my $osite = $self->base->get_object('site', $site)) { 137 return $osite->get_attributes($self->name); 138 } 139 } 140 return $self->object->get_field($self->name); 141 }, 142 set => sub { 143 my ($self, $data) = @_; 144 if (my $site = $self->object->get_attributes('site')) { 145 return 1; 146 } else { 147 return $self->object->set_fields($self->name, $data) 148 } 149 }, 52 150 }, 53 151 postalCode => { 54 ro => sub { $_[0] && $_[0]->get_attributes('site') ? 1 : 0 }, 152 managed => 1, 153 ro => sub { $_[0] && $_[0]->get_attributes('site') ? 1 : 0 }, 154 get => sub { 155 my ($self) = @_; 156 if (my $site = $self->object->get_attributes('site')) { 157 if (my $osite = $self->base->get_object('site', $site)) { 158 return $osite->get_attributes($self->name); 159 } 160 } 161 return $self->object->get_field($self->name); 162 }, 163 set => sub { 164 my ($self, $data) = @_; 165 if (my $site = $self->object->get_attributes('site')) { 166 return 1; 167 } else { 168 return $self->object->set_fields($self->name, $data) 169 } 170 }, 55 171 }, 56 172 streetAddress => { 173 managed => 1, 57 174 formtype => 'TEXTAREA', 58 175 ro => sub { $_[0] && $_[0]->get_attributes('site') ? 1 : 0 }, 176 get => sub { 177 my ($self) = @_; 178 if (my $site = $self->object->get_attributes('site')) { 179 if (my $osite = $self->base->get_object('site', $site)) { 180 return $osite->get_attributes($self->name); 181 } 182 } 183 return $self->object->get_field($self->name); 184 }, 185 set => sub { 186 my ($self, $data) = @_; 187 if (my $site = $self->object->get_attributes('site')) { 188 return 1; 189 } else { 190 return $self->object->set_fields($self->name, $data) 191 } 192 }, 59 193 }, 60 194 postOfficeBox => { 61 ro => sub { $_[0] && $_[0]->get_attributes('site') ? 1 : 0 }, 62 }, 63 st => { 64 ro => sub { $_[0] && $_[0]->get_attributes('site') ? 1 : 0 }, 195 managed => 1, 196 ro => sub { $_[0] && $_[0]->get_attributes('site') ? 1 : 0 }, 197 get => sub { 198 my ($self) = @_; 199 if (my $site = $self->object->get_attributes('site')) { 200 if (my $osite = $self->base->get_object('site', $site)) { 201 return $osite->get_attributes($self->name); 202 } 203 } 204 return $self->object->get_field($self->name); 205 }, 206 set => sub { 207 my ($self, $data) = @_; 208 if (my $site = $self->object->get_attributes('site')) { 209 return 1; 210 } else { 211 return $self->object->set_fields($self->name, $data) 212 } 213 }, 214 }, 215 st => { 216 managed => 1, 217 ro => sub { $_[0] && $_[0]->get_attributes('site') ? 1 : 0 }, 218 get => sub { 219 my ($self) = @_; 220 if (my $site = $self->object->get_attributes('site')) { 221 if (my $osite = $self->base->get_object('site', $site)) { 222 return $osite->get_attributes($self->name); 223 } 224 } 225 return $self->object->get_field($self->name); 226 }, 227 set => sub { 228 my ($self, $data) = @_; 229 if (my $site = $self->object->get_attributes('site')) { 230 return 1; 231 } else { 232 return $self->object->set_fields($self->name, $data) 233 } 234 }, 65 235 }, 66 236 facsimileTelephoneNumber => { 67 ro => sub { $_[0] && $_[0]->get_attributes('site') ? 1 : 0 }, 237 managed => 1, 238 ro => sub { $_[0] && $_[0]->get_attributes('site') ? 1 : 0 }, 239 get => sub { 240 my ($self) = @_; 241 if (my $site = $self->object->get_attributes('site')) { 242 if (my $osite = $self->base->get_object('site', $site)) { 243 return $osite->get_attributes($self->name); 244 } 245 } 246 return $self->object->get_field($self->name); 247 }, 248 set => sub { 249 my ($self, $data) = @_; 250 if (my $site = $self->object->get_attributes('site')) { 251 return 1; 252 } else { 253 return $self->object->set_fields($self->name, $data) 254 } 255 }, 68 256 }, 69 257 o => { 70 ro => sub { $_[0] && $_[0]->get_attributes('site') ? 1 : 0 }, 258 managed => 1, 259 ro => sub { $_[0] && $_[0]->get_attributes('site') ? 1 : 0 }, 260 get => sub { 261 my ($self) = @_; 262 if (my $site = $self->object->get_attributes('site')) { 263 if (my $osite = $self->base->get_object('site', $site)) { 264 return $osite->get_attributes($self->name); 265 } 266 } 267 return $self->object->get_field($self->name); 268 }, 269 set => sub { 270 my ($self, $data) = @_; 271 if (my $site = $self->object->get_attributes('site')) { 272 return 1; 273 } else { 274 return $self->object->set_fields($self->name, $data) 275 } 276 }, 71 277 }, 72 278 isMainAddress => { formtype => 'CHECKBOX', }, 73 279 active => { ro => 1 }, 280 telephoneNumber => { }, 281 physicalDeliveryOfficeName => { }, 282 otherTelephone => { }, 283 ipPhone => { }, 284 homePhone => { }, 285 description => { }, 74 286 } 75 287 ); … … 87 299 } 88 300 89 sub get_field {90 my ($self, $field) = @_;91 if ((grep { $field eq $_ } (qw(92 co l93 postalCode streetAddress94 postOfficeBox st95 facsimileTelephoneNumber o96 ))) && (my $fsite = $self->get_c_field('site'))) {97 my $site = $self->base->get_object('site', $fsite);98 if ($site) {99 return $site->get_field($field);100 }101 } elsif ($field =~ /^(sn|givenName|mail)$/) {102 my $user = $self->base->get_object('user', $self->_get_c_field('user'))103 or return;104 return $user->_get_c_field($field);105 } elsif ($field eq 'postalAddress' ) {106 my $bp = $self->_get_c_field('postOfficeBox');107 return join("\n", grep { $_ } (108 $self->_get_c_field('o'),109 $self->_get_c_field('streetAddress'),110 ($bp ? 'BP ' . $bp : ''),111 join(' ', grep { $_ } (112 $self->_get_c_field('postalCode'),113 $self->_get_c_field('l'),)),114 join(' ', grep { $_ } (115 $self->_get_c_field('st'),116 $self->_get_c_field('co'),),117 )118 ));119 } elsif ($field eq 'displayName') {120 return join(' ', grep { $_ } (121 $self->_get_c_field('givenName'),122 $self->_get_c_field('sn'),123 ));124 } else {125 return $self->SUPER::get_field($field);126 }127 }128 129 sub _set_c_fields {130 my ($self, %cdata) = @_;131 if ($cdata{site} &&132 $self->base->get_object('site', $cdata{site})) {133 foreach (qw(co l postalCode streetAddress postOfficeBox st134 facsimileTelephoneNumber o)) {135 delete($cdata{$_});136 }137 }138 139 $self->SUPER::_set_c_fields(%cdata);140 }141 142 sub set_fields {143 my ($self, %data) = @_;144 my %fdata;145 my $res = 0;146 foreach my $attr (keys %data) {147 $attr =~ /^site$/ and do {148 my $site =149 $self->base->get_object('site',150 $data{$attr});151 if ($site) {152 foreach (qw(co l postalCode streetAddress postOfficeBox st153 facsimileTelephoneNumber o)) {154 $fdata{$_} = undef;155 $data{$_} = undef;156 }157 }158 $fdata{$attr} = $data{$attr} || undef;159 next;160 };161 $fdata{$attr} = $data{$attr} || undef;162 }163 if (keys %fdata) {164 $res += $self->SUPER::set_fields(%fdata);165 }166 167 $res;168 }169 170 301 1; 171 302 -
trunk/LATMOS-Accounts/lib/LATMOS/Accounts/Bases/Sql/Aliases.pm
r1297 r1315 25 25 my ($class, $base) = @_; 26 26 27 28 my $recurs = sub { 29 my ($attr) = @_; 30 my ($self) = $attr->object; 31 my $field = $attr->name; 32 33 my $sth = $self->db->prepare_cached(q{ 34 select name from aliases where array[lower($1)] <@ 35 string_to_array(lower(array_to_string("forward", ',')), ',') 36 }); 37 my @tocheck = ($field =~ /^sameforward$/ 38 ? $self->get_field('forward') 39 : ($field =~ /^samedestination$/ 40 ? $self->get_field('finalpoint') 41 : $self->id)); 42 my @results; 43 my @already; 44 while (my $next = shift(@tocheck)) { 45 # endless loop detection 46 grep { $next eq $_ } @already and do { 47 push(@results, 'LOOP'); 48 next; 49 }; 50 push(@already, $next); 51 $sth->execute($next); 52 while (my $res = $sth->fetchrow_hashref) { 53 push(@tocheck, $res->{name}); 54 $res->{name} eq $self->id and next; 55 push(@results, $res->{name}); 56 } 57 $field =~ /^(parents|sameforward)$/ and last; # No recursive search 58 } 59 return scalar(@results) <= 1 ? $results[0] : \@results; 60 }; 61 27 62 $class->SUPER::_get_attr_schema($base, 28 63 { … … 34 69 multiple => 1, 35 70 monitored => 1, 71 set => sub { 72 my ($self, $data) = @_; 73 return $self->object->set_fields($self->iname, 74 $data 75 ? ref $data ? $data : [ $data ] 76 : undef 77 ); 78 }, 36 79 }, 37 finalpoint => { ro => 1, multiple => 1 }, 38 parents => { ro => 1, }, 39 anyparents => { ro => 1, }, 40 sameforward => { ro => 1, multiple => 1 }, 41 samedestination => { ro => 1, multiple => 1 }, 80 finalpoint => { 81 ro => 1, 82 multiple => 1, 83 get => sub { 84 my ($self) = @_; 85 my $sth = $self->base->db->prepare_cached(q{ 86 select forward from aliases where lower(name) = lower(?) 87 limit 1 88 }); 89 my @res = (); 90 my @next = @{ $self->object->get_field('forward') || [] }; 91 while (my $next = shift(@next)) { 92 $sth->execute($next); 93 if (my $res = $sth->fetchrow_hashref) { 94 push(@next, @{ $res->{forward} }); 95 } else { 96 push(@res, $next); 97 } 98 } 99 $sth->finish; 100 return @res ? \@res : undef; 101 }, 102 }, 103 parents => { 104 ro => 1, 105 get => $recurs, 106 }, 107 anyparents => { 108 ro => 1, 109 get => $recurs, 110 }, 111 sameforward => { 112 ro => 1, 113 multiple => 1, 114 get => $recurs, 115 }, 116 samedestination => { 117 ro => 1, 118 multiple => 1, 119 get => $recurs, 120 }, 42 121 user => { 43 122 ro => 1, … … 48 127 formtype => 'DATE', 49 128 }, 129 comment => { }, 50 130 } 51 131 ) … … 86 166 } 87 167 88 sub get_field {89 my ($self, $field) = @_;90 if ($field eq 'finalpoint') {91 my $sth = $self->db->prepare_cached(q{92 select forward from aliases where lower(name) = lower(?)93 limit 194 });95 my @res = ();96 my @next = @{ $self->get_field('forward') || [] };97 while (my $next = shift(@next)) {98 $sth->execute($next);99 if (my $res = $sth->fetchrow_hashref) {100 push(@next, @{ $res->{forward} });101 } else {102 push(@res, $next);103 }104 }105 $sth->finish;106 return @res ? \@res : undef;107 }108 if ($field =~ /^(parents|anyparents|sameforward|samedestination)$/) {109 my $sth = $self->db->prepare_cached(q{110 select name from aliases where array[lower($1)] <@111 string_to_array(lower(array_to_string("forward", ',')), ',')112 });113 my @tocheck = ($field =~ /^sameforward$/114 ? $self->get_field('forward')115 : ($field =~ /^samedestination$/116 ? $self->get_field('finalpoint')117 : $self->id));118 my @results;119 my @already;120 while (my $next = shift(@tocheck)) {121 # endless loop detection122 grep { $next eq $_ } @already and do {123 push(@results, 'LOOP');124 next;125 };126 push(@already, $next);127 $sth->execute($next);128 while (my $res = $sth->fetchrow_hashref) {129 push(@tocheck, $res->{name});130 $res->{name} eq $self->id and next;131 push(@results, $res->{name});132 }133 $field =~ /^(parents|sameforward)$/ and last; # No recursive search134 }135 return scalar(@results) <= 1 ? $results[0] : \@results;136 }137 $self->SUPER::get_field($field);138 }139 140 sub set_fields {141 my ($self, %attrs) = @_;142 foreach (keys %attrs) {143 /^forward$/ and do {144 $attrs{$_} = [ $attrs{$_} ] unless(ref $attrs{$_});145 };146 }147 $self->SUPER::set_fields(%attrs);148 }149 168 150 169 1; -
trunk/LATMOS-Accounts/lib/LATMOS/Accounts/Bases/Sql/Group.pm
r1297 r1315 27 27 $class->SUPER::_get_attr_schema($base, 28 28 { 29 gidNumber => { inline => 1, uniq => 1, iname => 'gidnumber', 30 mandatory => 1, }, 29 gidNumber => { 30 inline => 1, 31 uniq => 1, 32 iname => 'gidnumber', 33 mandatory => 1, 34 }, 31 35 gidnumber => { inline => 1, uniq => 1, hide => 1, }, 32 exported => { inline => 1, },33 name => { inline => 1, ro => 1 },34 36 cn => { inline => 1, ro => 1, iname => 'name', }, 35 create => { inline => 1, ro => 1 },36 date => { inline => 1, ro => 1 },37 37 memberUID => { 38 38 monitored => 1, … … 46 46 || $_[0]->_get_c_field('autoMemberFilter')) 47 47 ? 1 : 0 48 }, 49 get => sub { 50 my ($self) = @_; 51 my $sth = $self->base->db->prepare_cached( 52 q{ 53 select value from group_attributes 54 join "group" on "group".ikey = group_attributes.okey 55 join "user" on "user".name = group_attributes.value 56 where "group".name = ? and attr = ? 57 } . 58 ($self->base->{wexported} ? '' : 'and "user".exported = true') 59 ); 60 $sth->execute($self->object->id, 'memberUID'); 61 my @res; 62 while (my $res = $sth->fetchrow_hashref) { 63 push(@res, $res->{value}); 64 } 65 return \@res; 66 }, 67 set => sub { 68 my ($self, $data) = @_; 69 $self->object->_set_group_members($data); 48 70 }, 49 71 }, … … 60 82 ? 1 : 0 61 83 }, 84 get => sub { 85 my ($self) = @_; 86 $self->object->_get_c_field('memberUID'); 87 }, 88 set => sub { 89 my ($self, $data) = @_; 90 $self->object->_set_group_members($data); 91 }, 62 92 }, 63 93 sAMAccountName => { iname => 'name', ro => 1 }, … … 91 121 autoMemberFilter => { 92 122 multiple => 1, 93 } 123 set => sub { 124 my ($self, $data) = @_; 125 $self->object->set_fields($self->name, $data) or return; 126 $self->object->populate_dyn_group; 127 return 1; 128 } 129 }, 130 label => { }, 131 expire => { }, 132 description => { }, 133 comment => { }, 94 134 } 95 135 ) 96 }97 98 sub get_field {99 my ($self, $field) = @_;100 for ($field) {101 /^(member|memberUID)$/ and do {102 my $sth = $self->db->prepare_cached(103 q{104 select value from group_attributes105 join "group" on "group".ikey = group_attributes.okey106 join "user" on "user".name = group_attributes.value107 where "group".name = ? and attr = ?108 } .109 ($self->base->{wexported} ? '' : 'and "user".exported = true')110 );111 $sth->execute($self->id, 'memberUID');112 my @res;113 while (my $res = $sth->fetchrow_hashref) {114 push(@res, $res->{value});115 }116 return \@res;117 };118 }119 $self->SUPER::get_field($field);120 136 } 121 137 … … 124 140 my %member; 125 141 my $res = 0; 126 foreach (@{ $self-> get_field('memberUID') }) {142 foreach (@{ $self->_get_c_field('memberUID') }) { 127 143 $member{$_}{c} = 1; 128 144 } … … 158 174 } 159 175 160 sub set_fields {161 my ($self, %data) = @_;162 my %fdata;163 my $res = 0;164 foreach my $attr (keys %data) {165 $attr =~ /^memberUID|member$/ and do {166 if (($self->_get_c_field('sutype') ||'') =~ /^(jobtype|contrattype)$/ ||167 $self->get_field('autoMemberFilter')) {168 $self->base->log(LA_WARN,169 "Group %s is managed, ignoring member set request",170 $self->id);171 next;172 }173 $res += $self->_set_group_members($data{$attr});174 next;175 };176 $fdata{$attr} = $data{$attr};177 }178 179 if (keys %fdata) {180 my $setres = $self->SUPER::set_fields(%fdata);181 if (exists($fdata{autoMemberFilter})) {182 $res += $self->populate_dyn_group;183 }184 return unless(defined($setres));185 $res += ($setres || 0);186 }187 188 $res189 }190 191 176 =head2 populate_dyn_group 192 177 -
trunk/LATMOS-Accounts/lib/LATMOS/Accounts/Bases/Sql/Nethost.pm
r1302 r1315 47 47 $base->search_objects('netzone', 'type=dhcp') 48 48 }, 49 set => sub { 50 my ($self, $data) = @_; 51 foreach (ref $data ? @{$data} : $data) { 52 my $zone = $self->base->get_object('netzone', $_) 53 or next; 54 my @freeips = $zone->get_attributes('freeIP') or next; 55 my $idx = rand(scalar(@freeips)); 56 $self->object->_addAttributeValue('ip', $freeips[$idx]); 57 $self->base->log(LA_NOTICE, "Assigning ip %s to host %s", 58 $freeips[$idx], $self->object->id); 59 } 60 }, 49 61 }, 50 62 macaddr => { … … 78 90 multiple => 1, ro => 1, managed => 1, 79 91 reference => 'netzone', 92 get => sub { 93 my ($self) = @_; 94 my $find = $self->base->db->prepare_cached(q{ 95 select name from netzone where ikey in 96 ( 97 select netzone_attributes.okey from netzone_attributes join 98 nethost_attributes_ips on netzone_attributes.attr='net' 99 and 100 nethost_attributes_ips.value::inet <<= 101 netzone_attributes.value::inet 102 where nethost_attributes_ips.okey = $1 103 except 104 select netzone_attributes.okey from netzone_attributes join 105 nethost_attributes_ips on netzone_attributes.attr='netExclude' 106 and nethost_attributes_ips.value::inet <<= netzone_attributes.value::inet 107 where nethost_attributes_ips.okey = $1 108 ) 109 order by name 110 }); 111 $find->execute($self->object->get_attributes('ikey')); 112 my @zones; 113 while (my $res = $find->fetchrow_hashref) { 114 push(@zones, $res->{name}); 115 } 116 return @zones ? [ @zones ] : undef; 117 }, 80 118 }, 81 119 puppetClass => { multiple => 1, }, … … 83 121 multiple => 1, ro => 1, managed => 1, 84 122 reference => 'netzone', 123 get => sub { 124 my ($self) = @_; 125 my $find = $self->base->db->prepare_cached(q{ 126 select name from netzone where ikey in 127 ( 128 select netzone_attributes.okey from netzone_attributes join 129 nethost_attributes_ips on netzone_attributes.attr='netExclude' 130 and 131 nethost_attributes_ips.value::inet <<= 132 netzone_attributes.value::inet 133 where nethost_attributes_ips.okey = $1 134 ) 135 order by name 136 }); 137 $find->execute($self->object->get_attributes('ikey')); 138 my @zones; 139 while (my $res = $find->fetchrow_hashref) { 140 push(@zones, $res->{name}); 141 } 142 return @zones ? [ @zones ] : undef; 143 }, 85 144 }, 86 145 noDynamic => { … … 96 155 sshfpUpdate => { 97 156 managed => 1, 98 }, 157 iname => 'sshfp', 158 input => sub { 159 my ($self, $data) = @_; 160 open(my $h, '<', $data) or return; 161 my @sshfps; 162 while (my $line = <$h>) { 163 my ($type, $mode, $key) = $line =~ /^\S+\s+IN\s+SSHFP\s+(\d)\s+(\d)\s+(\S+)/i 164 or do { 165 la_log(LA_ERR, "Seems to not be a ssh-keygen line: %s", $line); 166 return; 167 }; 168 la_log(LA_DEBUG, "found sshfp %s %s %s", $type, $mode, $key); 169 push(@sshfps, "$type $mode $key"); 170 } 171 close($h); 172 \@sshfps; 173 } 174 }, 175 comment => { }, 176 description => { }, 177 encryptKey => { }, 178 ip6 => { }, 179 reverse => { }, 180 serialNumber => { }, 99 181 } 100 182 ) 101 183 } 102 184 103 sub get_field {104 my ($self, $field) = @_;105 106 if ($field eq 'netZone') {107 my $find = $self->base->db->prepare_cached(q{108 select name from netzone where ikey in109 (110 select netzone_attributes.okey from netzone_attributes join111 nethost_attributes_ips on netzone_attributes.attr='net'112 and113 nethost_attributes_ips.value::inet <<=114 netzone_attributes.value::inet115 where nethost_attributes_ips.okey = $1116 except117 select netzone_attributes.okey from netzone_attributes join118 nethost_attributes_ips on netzone_attributes.attr='netExclude'119 and nethost_attributes_ips.value::inet <<= netzone_attributes.value::inet120 where nethost_attributes_ips.okey = $1121 )122 order by name123 });124 $find->execute($self->get_attributes('ikey'));125 my @zones;126 while (my $res = $find->fetchrow_hashref) {127 push(@zones, $res->{name});128 }129 return @zones ? [ @zones ] : undef;130 } elsif ($field eq 'netZoneExclude') {131 my $find = $self->base->db->prepare_cached(q{132 select name from netzone where ikey in133 (134 select netzone_attributes.okey from netzone_attributes join135 nethost_attributes_ips on netzone_attributes.attr='netExclude'136 and137 nethost_attributes_ips.value::inet <<=138 netzone_attributes.value::inet139 where nethost_attributes_ips.okey = $1140 )141 order by name142 });143 $find->execute($self->get_attributes('ikey'));144 my @zones;145 while (my $res = $find->fetchrow_hashref) {146 push(@zones, $res->{name});147 }148 return @zones ? [ @zones ] : undef;149 } else {150 return $self->SUPER::get_field($field);151 }152 }153 154 185 sub set_fields { 155 186 my ($self, %data) = @_; 156 if ($data{ipFrom}) {157 my @currentips = grep { $_ } $self->get_attributes('ip');158 foreach (ref $data{ipFrom} ? @{$data{ipFrom}} : $data{ipFrom}) {159 my $zone = $self->base->get_object('netzone', $_)160 or next;161 my @freeips = $zone->get_attributes('freeIP') or next;162 my $idx = rand(scalar(@freeips));163 push(@currentips, $freeips[$idx]);164 $self->base->log(LA_NOTICE, "Assigning ip %s to host %s",165 $freeips[$idx], $self->id);166 }167 push(@currentips, ref $data{ip} ? @{$data{ip}} : $data{ip})168 if ($data{ip});169 $data{ip} = \@currentips;170 delete($data{ipFrom});171 }172 if ($data{sshfpUpdate}) {173 open my $h, '<', \$data{sshfpUpdate};174 my @sshfps;175 while (my $line = <$h>) {176 my ($type, $mode, $key) = $line =~ /^\S+\s+IN\s+SSHFP\s+(\d)\s+(\d)\s+(\S+)/i177 or do {178 la_log(LA_ERR, "Seems to not be a ssh-keygen line: %s", $line);179 return;180 };181 la_log(LA_DEBUG, "found sshfp %s %s %s", $type, $mode, $key);182 push(@sshfps, "$type $mode $key");183 }184 close($h);185 delete($data{sshfpUpdate});186 $data{sshfp} = \@sshfps;187 }188 187 189 188 my $res = $self->SUPER::set_fields(%data); 190 189 190 # Post update related 191 191 if (exists $data{related}) { 192 192 my %exists; -
trunk/LATMOS-Accounts/lib/LATMOS/Accounts/Bases/Sql/Netzone.pm
r1297 r1315 44 44 }, 45 45 output => {}, 46 outputD => { hide => 1, ro => 1, managed => 1, }, 46 outputD => { 47 hide => 1, 48 ro => 1, 49 managed => 1, 50 get => sub { 51 $_[0]->object->_get_c_field('output') || 52 $_[0]->object->id 53 }, 54 }, 47 55 template => {}, 48 templateD => { hide => 1, ro => 1, managed => 1, }, 56 templateD => { 57 hide => 1, 58 ro => 1, 59 managed => 1, 60 get => sub { 61 $_[0]->object->_get_c_field('template') || 62 $_[0]->object->id 63 }, 64 }, 49 65 type => { 50 66 mandatory => 1, … … 63 79 }, 64 80 }, 65 freeIP => { managed => 1, ro => 1, multiple => 1, }, 66 freeIPCount => { managed => 1, ro => 1, }, 67 ipCount => { managed => 1, ro => 1, }, 68 hosts => { ro => 1, multiple => 1, reference => 'nethost', }, 69 hostsExclude => { ro => 1, multiple => 1, reference => 'nethost' }, 81 freeIP => { 82 managed => 1, 83 ro => 1, 84 multiple => 1, 85 get => sub { 86 my $self = $_[0]->object; 87 my @ips; 88 my $findip = $self->base->db->prepare(q{ 89 select * from ( 90 select host(network(value::inet)+ (generate_series(1, broadcast(value::inet) - network(value::inet) -1))) from netzone_attributes where 91 attr='net' and okey = $1 and family(value::inet) = 4 92 except 93 ( 94 select host(network(value::inet)+ (generate_series(0, broadcast(value::inet) - network(value::inet)))) from 95 netzone_attributes where attr='netExclude' and okey = $1 96 union 97 select nethost_attributes_ips.value from nethost_attributes_ips join netzone_attributes on 98 netzone_attributes.attr='net' and nethost_attributes_ips.value::inet <<= netzone_attributes.value::inet 99 where netzone_attributes.okey = $1 100 ) 101 ) as s 102 order by host::inet 103 }); 104 $findip->execute($self->get_attributes('ikey')); 105 while (my $res = $findip->fetchrow_hashref) { 106 push(@ips, $res->{host}); 107 } 108 return scalar(@ips) ? \@ips : undef; 109 }, 110 }, 111 freeIPCount => { 112 managed => 1, 113 ro => 1, 114 get => sub { 115 return scalar(grep { $_ } $_[0]->object->get_attributes('freeIP')); 116 }, 117 }, 118 ipCount => { 119 managed => 1, 120 ro => 1, 121 get => sub { 122 my ($self) = $_[0]->object; 123 my $findip = $self->base->db->prepare(q{ 124 select count(*) from ( 125 select host(network(value::inet)+ (generate_series(1, broadcast(value::inet) - network(value::inet) -1))) from netzone_attributes where 126 attr='net' and okey = $1 and family(value::inet) = 4 127 except 128 ( 129 select host(network(value::inet)+ (generate_series(0, broadcast(value::inet) - network(value::inet)))) from 130 netzone_attributes where attr='netExclude' and okey = $1 131 ) 132 ) as s 133 }); 134 $findip->execute($self->get_attributes('ikey')); 135 my $res = $findip->fetchrow_hashref; 136 $findip->finish; 137 return $res->{count} 138 }, 139 }, 140 hosts => { 141 ro => 1, 142 multiple => 1, 143 reference => 'nethost', 144 get => sub { 145 my ($self) = $_[0]->object; 146 my $findhost = $self->base->db->prepare_cached(q{ 147 select name from nethost join nethost_attributes_ips on 148 nethost.ikey = nethost_attributes_ips.okey 149 where value::inet <<= any(?) 150 } . ($self->base->{wexported} ? '' : 'and exported = true') . 151 q{ except 152 select name from nethost join nethost_attributes_ips on 153 nethost.ikey = nethost_attributes_ips.okey 154 where value::inet <<= any(?) 155 order by name 156 } 157 ); 158 $findhost->execute( 159 [ $self->get_attributes('net') ], 160 [ $self->get_attributes('netExclude') ], 161 ); 162 my @hosts; 163 while (my $res = $findhost->fetchrow_hashref) { 164 push(@hosts, $res->{name}); 165 } 166 return scalar(@hosts) ? \@hosts : undef; 167 }, 168 }, 169 hostsExclude => { 170 ro => 1, 171 multiple => 1, 172 reference => 'nethost', 173 get => sub { 174 my $self = $_[0]->object; 175 my $findhost = $self->base->db->prepare_cached(q{ 176 select name from nethost join nethost_attributes_ips on 177 nethost.ikey = nethost_attributes_ips.okey 178 where value::inet <<= any(?) 179 } . ($self->base->{wexported} ? '' : 'and exported = true') . 180 q{ 181 order by name 182 } 183 ); 184 $findhost->execute( 185 [ $self->get_attributes('netExclude') ], 186 ); 187 my @hosts; 188 while (my $res = $findhost->fetchrow_hashref) { 189 push(@hosts, $res->{name}); 190 } 191 return scalar(@hosts) ? \@hosts : undef; 192 }, 193 }, 70 194 lastBuild => { hide => 1, }, 71 195 lastUpdate => { ro => 1, iname => 'lastBuild' }, … … 74 198 exported => { formtype => 'CHECKBOX', }, 75 199 puppetClass => { multiple => 1, }, 200 domain => { }, 201 description => { }, 76 202 } 77 203 ) 78 204 } 79 205 80 sub get_field {81 my ($self, $field) = @_;82 if ($field eq 'ipCount') {83 my $findip = $self->base->db->prepare(q{84 select count(*) from (85 select host(network(value::inet)+ (generate_series(1, broadcast(value::inet) - network(value::inet) -1))) from netzone_attributes where86 attr='net' and okey = $1 and family(value::inet) = 487 except88 (89 select host(network(value::inet)+ (generate_series(0, broadcast(value::inet) - network(value::inet)))) from90 netzone_attributes where attr='netExclude' and okey = $191 )92 ) as s93 });94 $findip->execute($self->get_attributes('ikey'));95 my $res = $findip->fetchrow_hashref;96 $findip->finish;97 return $res->{count}98 } elsif ($field eq 'freeIP') {99 my @ips;100 my $findip = $self->base->db->prepare(q{101 select * from (102 select host(network(value::inet)+ (generate_series(1, broadcast(value::inet) - network(value::inet) -1))) from netzone_attributes where103 attr='net' and okey = $1 and family(value::inet) = 4104 except105 (106 select host(network(value::inet)+ (generate_series(0, broadcast(value::inet) - network(value::inet)))) from107 netzone_attributes where attr='netExclude' and okey = $1108 union109 select nethost_attributes_ips.value from nethost_attributes_ips join netzone_attributes on110 netzone_attributes.attr='net' and nethost_attributes_ips.value::inet <<= netzone_attributes.value::inet111 where netzone_attributes.okey = $1112 )113 ) as s114 order by host::inet115 });116 $findip->execute($self->get_attributes('ikey'));117 while (my $res = $findip->fetchrow_hashref) {118 push(@ips, $res->{host});119 }120 return scalar(@ips) ? \@ips : undef;121 } elsif ($field eq 'freeIPCount') {122 return scalar(grep { $_ } $self->get_attributes('freeIP'));123 } elsif ($field eq 'hosts') {124 my $findhost = $self->base->db->prepare_cached(q{125 select name from nethost join nethost_attributes_ips on126 nethost.ikey = nethost_attributes_ips.okey127 where value::inet <<= any(?)128 } . ($self->base->{wexported} ? '' : 'and exported = true') .129 q{ except130 select name from nethost join nethost_attributes_ips on131 nethost.ikey = nethost_attributes_ips.okey132 where value::inet <<= any(?)133 order by name134 }135 );136 $findhost->execute(137 [ $self->get_attributes('net') ],138 [ $self->get_attributes('netExclude') ],139 );140 my @hosts;141 while (my $res = $findhost->fetchrow_hashref) {142 push(@hosts, $res->{name});143 }144 return scalar(@hosts) ? \@hosts : undef;145 } elsif ($field eq 'hostsExclude') {146 my $findhost = $self->base->db->prepare_cached(q{147 select name from nethost join nethost_attributes_ips on148 nethost.ikey = nethost_attributes_ips.okey149 where value::inet <<= any(?)150 } . ($self->base->{wexported} ? '' : 'and exported = true') .151 q{152 order by name153 }154 );155 $findhost->execute(156 [ $self->get_attributes('netExclude') ],157 );158 my @hosts;159 while (my $res = $findhost->fetchrow_hashref) {160 push(@hosts, $res->{name});161 }162 return scalar(@hosts) ? \@hosts : undef;163 } elsif ($field eq 'templateD') {164 return $self->get_attributes('template') || ($self->id . '.in');165 } elsif ($field eq 'outputD') {166 return $self->get_attributes('output') || $self->id;167 } else {168 return $self->SUPER::get_field($field);169 }170 }171 172 206 1; 173 207 -
trunk/LATMOS-Accounts/lib/LATMOS/Accounts/Bases/Sql/Service.pm
r1303 r1315 54 54 reference => 'user', 55 55 }, 56 comment => { }, 57 description => { }, 56 58 } 57 59 ) -
trunk/LATMOS-Accounts/lib/LATMOS/Accounts/Bases/Sql/Site.pm
r1023 r1315 35 35 create => { ro => 1, inline => 1, }, 36 36 streetAddress => { formtype => 'TEXTAREA' }, 37 postalAddress => { ro => 1, }, 37 postalAddress => { 38 ro => 1, 39 get => sub { 40 my $self = $_[0]->object; 41 my $bp = $self->_get_c_field('postOfficeBox'); 42 return join("\n", grep { $_ } ( 43 $self->_get_c_field('o'), 44 $self->_get_c_field('streetAddress'), 45 ($bp ? 'BP ' . $bp : ''), 46 join(' ', grep { $_ } ( 47 $self->_get_c_field('postalCode'), 48 $self->_get_c_field('l'),)), 49 join(' ', grep { $_ } ( 50 $self->_get_c_field('st'), 51 $self->_get_c_field('co'),), 52 ) 53 ) 54 ); 55 }, 56 }, 38 57 siteNick => { uniq => 1 }, 58 st => { }, 59 postalCode => { }, 60 postOfficeBox => { }, 61 o => { }, 62 l => { }, 63 facsimileTelephoneNumber => { }, 64 description => { }, 65 co => { }, 39 66 } 40 67 ) 41 }42 43 sub get_field {44 my ($self, $field) = @_;45 if ($field eq 'postalAddress' ) {46 my $bp = $self->_get_c_field('postOfficeBox');47 return join("\n", grep { $_ } (48 $self->_get_c_field('o'),49 $self->_get_c_field('streetAddress'),50 ($bp ? 'BP ' . $bp : ''),51 join(' ', grep { $_ } (52 $self->_get_c_field('postalCode'),53 $self->_get_c_field('l'),)),54 join(' ', grep { $_ } (55 $self->_get_c_field('st'),56 $self->_get_c_field('co'),),57 )58 ));59 } else {60 return $self->SUPER::get_field($field);61 }62 68 } 63 69 -
trunk/LATMOS-Accounts/lib/LATMOS/Accounts/Bases/Sql/User.pm
r1297 r1315 43 43 my ($class, $base) = @_; 44 44 45 my $subsetaddress = sub { 46 my ($self, $data) = @_; 47 my $fmainaddress = $self->object->_get_c_field('mainaddress'); 48 49 # set address attribute => create address object on the fly 50 # except if attr is empty ! 51 if (!$fmainaddress && $data) { 52 $fmainaddress = $self->object->id . '-' . join('', map { ('a'..'z')[rand(26)] } 53 (0..4)); 54 $self->base->_create_c_object( 55 'address', $fmainaddress, 56 user => $self->object->id, 57 isMainAddress => 1, ) or do { 58 $self->base->log(LA_ERR, 59 "Cannot create main address for user %s", $self->object->id); 60 return; 61 }; 62 } 63 if ($fmainaddress && 64 (my $address = $self->base->get_object('address', $fmainaddress))) { 65 if ($address->attribute($self->name) && 66 !$address->attribute($self->name)->ro) { 67 return $address->set_c_fields($self->name => $data) ||0; 68 } 69 } 70 }; 71 45 72 $class->SUPER::_get_attr_schema($base, 46 73 { 74 exported => { 75 post => sub { 76 my ($self, $value) = @_; 77 my $attr = $self->name; 78 79 if (my $obj = $self->base-> 80 get_object('revaliases', $self->object->id)) { 81 my $ares = $obj->set_c_fields( 82 ($attr eq 'exported' ? 'exported' : 'unexported') => $value 83 ); 84 if (!defined($ares)) { 85 $self->base->log(LA_ERR, 86 'Cannot set revaliases exported attribute for user %s', 87 $self->object->id); 88 } 89 } 90 my $must_expire = $self->name eq 'exported' 91 ? ($value ? 0 : 1 ) 92 : ($value ? 1 : 0 ); 93 94 foreach my $al ($self->object->get_attributes('aliases')) { 95 my $obj = $self->base->get_object('aliases', $al) or next; 96 $obj->_set_c_fields( 97 expire => $must_expire 98 ? strftime( 99 "%Y-%m-%d %H:%M:%S", 100 localtime(time + 3600 * 24 * 365) 101 ) 102 : undef, 103 ); 104 } 105 }, 106 }, 47 107 uidNumber => { 48 108 inline => 1, … … 58 118 mandatory => 1, 59 119 can_values => sub { 60 map { $base->get_object('group', 61 $_)->get_attributes('gidNumber') } 62 $base->list_objects('group') 120 my $sth = $base->db->prepare_cached( 121 q{ 122 select gidnumber from "group" where exported = true 123 } 124 ); 125 $sth->execute(); 126 my @res; 127 while (my $res = $sth->fetchrow_hashref) { 128 push(@res, $res->{gidnumber}); 129 } 130 return @res; 63 131 }, 64 132 display => sub { … … 81 149 monitored => 1, 82 150 }, 83 exported => {84 inline => 1,85 formtype => 'CHECKBOX',86 monitored => 1,87 },88 151 locked => { 89 152 formtype => 'CHECKBOX', … … 92 155 }, 93 156 expire => { inline => 1, formtype => 'DATE', monitored => 1, }, 94 name => { inline => 1, ro => 1, },95 157 cn => { 96 158 inline => 1, ro => 1, … … 107 169 }, 108 170 }, 109 create => { inline => 1, ro => 1, },110 date => { inline => 1, ro => 1, },111 171 memberOf => { 112 172 multiple => 1, delayed => 1, … … 127 187 } 128 188 return \@res; 129 } 130 }, 131 forward => {}, 189 }, 190 set => sub { 191 my ($self, $values) = @_; 192 my %old = map { $_ => 'o' } @{ $self->get }; 193 foreach my $group (grep { $_ } ref $values ? @{ $values } : $values) { 194 if ($old{$group}) { 195 $old{$group} = undef; # no change 196 } else { 197 $old{$group} = 'n'; 198 } 199 } 200 201 my $res = 0; 202 foreach my $group (keys %old) { 203 $old{$group} or next; # no change 204 205 my $ogroup = $self->base->get_object('group', $group) or next; 206 ($ogroup->_get_c_field('sutype') || '') =~ /^(jobtype|contrattype)$/ and next; 207 208 if ($old{$group} eq 'n') { 209 $res += $ogroup->_addAttributeValue('memberUID', $self->object->id); 210 } else { 211 if (($self->object->_get_c_field('department') || '') eq $ogroup->id) { 212 $self->base->log(LA_WARN, 213 "Don't removing user %s from group %s: is its department", 214 $self->object->id, $ogroup->id); 215 next; 216 } 217 $res += $ogroup->_delAttributeValue('memberUID', $self->object->id); 218 } 219 } 220 return $res; 221 }, 222 }, 223 forward => { 224 managed => 1, 225 get => sub { 226 my ($self) = @_; 227 my $sth = $self->base->db->prepare(q{ 228 select forward from aliases where name = ? 229 } . ($self->base->{wexported} ? '' : ' and exported = true')); 230 $sth->execute($self->object->id); 231 my $res = $sth->fetchrow_hashref; 232 $sth->finish; 233 return $res->{forward} 234 }, 235 set => sub { 236 my ($self, $data) = @_; 237 if ($data) { 238 if (my $f = $self->base->get_object('aliases', $self->object->id)) { 239 return $f->_set_c_fields(forward => $data); 240 } else { 241 if ($self->base->_create_c_object( 242 'aliases', $self->object->id, 243 forward => $data, 244 description => 'automatically created for ' . $self->object->id, 245 )) { 246 return 1; 247 } else { 248 $self->base->log(LA_ERR, "Cannot add forward for %s", 249 $self->id); 250 } 251 } 252 } else { 253 if (my $res = $self->base->_delete_object('aliases', $self->id)) { 254 return $res; 255 } else { 256 $self->base->log(LA_ERR, "Cannot remove forward for %s", 257 $self->id); 258 } 259 } 260 return; 261 }, 262 }, 132 263 aliases => { 133 264 reference => 'aliases', 134 265 formtype => 'TEXT', 135 266 multiple => 1, 267 get => sub { 268 my ($self) = @_; 269 my $sth = $self->base->db->prepare(q{ 270 select name from aliases where array[lower($1)] = 271 string_to_array(lower(array_to_string("forward", ',')), ',') 272 } . ($self->base->{wexported} ? '' : 'and exported = true')); 273 $sth->execute($self->object->id); 274 my @values; 275 while (my $res = $sth->fetchrow_hashref) { 276 push(@values, $res->{name}); 277 } 278 return \@values; 279 }, 280 set => sub { 281 my ($self, $data) = @_; 282 my $res = 0; 283 my %aliases = map { $_ => 1 } grep { $_ } (ref $data ? @{$data} : $data); 284 foreach ($self->object->_get_attributes('aliases')) { 285 $aliases{$_} ||= 0; 286 $aliases{$_} +=2; 287 } 288 foreach (keys %aliases) { 289 if ($aliases{$_} == 2) { 290 if ($self->base->_delete_object('aliases', $_)) { 291 $res++ 292 } else { 293 $self->base->log(LA_ERR, 294 "Cannot remove aliases %s from user %s", $_, 295 $self->object->id); 296 } 297 } elsif ($aliases{$_} == 1) { 298 if ($self->base->_create_c_object( 299 'aliases', $_, 300 forward => [ $self->object->id ], 301 description => 'automatically created for ' . $self->object->id, 302 )) { 303 $res++ 304 } else { 305 $self->base->log(LA_ERR, 'Cannot set forward %s to user %s', 306 $_, $self->object->id); 307 return; 308 } 309 } # 3 no change 310 } 311 $res 312 }, 136 313 }, 137 314 revaliases => { 138 315 formtype => 'TEXT', 316 set => sub { 317 my ($self, $data) = @_; 318 319 my $res = 0; 320 if ($data) { 321 if (my $obj = $self->base-> 322 get_object('revaliases', $self->object->id)) { 323 my $ares = $obj->set_c_fields( 324 'as' => $data, 325 'exported' => ($self->get_attributes('exported') || 0), 326 ); 327 if (defined($ares)) { 328 $res+=$ares; 329 } else { 330 $self->base->log(LA_ERR, 'Cannot set revaliases for user %s', 331 $self->object->id); 332 } 333 } else { 334 if ($self->base->_create_c_object( 335 'revaliases', 336 $self->object->id, as => $data, 337 'exported' => ($self->get_attributes('exported') || 0), 338 description => 'automatically created for ' . $self->object->id, 339 )) { 340 $res++; 341 } else { 342 $self->base->log(LA_ERR, 'Cannot set revaliases for user %s', 343 $self->object->id); 344 } 345 } 346 } else { 347 $self->base->_delete_object('revaliases', $self->object->id); 348 $res++; 349 } 350 351 $res 352 }, 139 353 }, 140 354 manager => { … … 167 381 can_values => sub { 168 382 $base->search_objects('site') 169 } 170 }, 171 co => { }, 172 l => { }, 173 postalCode => { }, 174 streetAddress => { formtype => 'TEXTAREA', }, 175 postOfficeBox => { }, 176 st => { }, 177 facsimileTelephoneNumber => { }, 178 o => { iname => 'company', ro => 1 }, 383 }, 384 get => sub { 385 my ($self) = @_; 386 if (my $fmainaddress = $self->object->_get_c_field('mainaddress')) { 387 $self->base->get_object('address', $fmainaddress) 388 ->_get_c_field($self->name); 389 } else { 390 return; 391 } 392 }, 393 set => $subsetaddress, 394 }, 395 co => { 396 get => sub { 397 my ($self) = @_; 398 if (my $fmainaddress = $self->object->_get_c_field('mainaddress')) { 399 $self->base->get_object('address', $fmainaddress) 400 ->_get_c_field($self->name); 401 } else { 402 return; 403 } 404 }, 405 set => $subsetaddress, 406 }, 407 l => { 408 get => sub { 409 my ($self) = @_; 410 if (my $fmainaddress = $self->object->_get_c_field('mainaddress')) { 411 $self->base->get_object('address', $fmainaddress) 412 ->_get_c_field($self->name); 413 } else { 414 return; 415 } 416 }, 417 set => $subsetaddress, 418 }, 419 postalCode => { 420 get => sub { 421 my ($self) = @_; 422 if (my $fmainaddress = $self->object->_get_c_field('mainaddress')) { 423 $self->base->get_object('address', $fmainaddress) 424 ->_get_c_field($self->name); 425 } else { 426 return; 427 } 428 }, 429 set => $subsetaddress, 430 }, 431 streetAddress => { 432 formtype => 'TEXTAREA', 433 get => sub { 434 my ($self) = @_; 435 if (my $fmainaddress = $self->object->_get_c_field('mainaddress')) { 436 $self->base->get_object('address', $fmainaddress) 437 ->_get_c_field($self->name); 438 } else { 439 return; 440 } 441 }, 442 set => $subsetaddress, 443 }, 444 postOfficeBox => { 445 get => sub { 446 my ($self) = @_; 447 if (my $fmainaddress = $self->object->_get_c_field('mainaddress')) { 448 $self->base->get_object('address', $fmainaddress) 449 ->_get_c_field($self->name); 450 } else { 451 return; 452 } 453 }, 454 set => $subsetaddress, 455 }, 456 st => { 457 get => sub { 458 my ($self) = @_; 459 if (my $fmainaddress = $self->object->_get_c_field('mainaddress')) { 460 $self->base->get_object('address', $fmainaddress) 461 ->_get_c_field($self->name); 462 } else { 463 return; 464 } 465 }, 466 set => $subsetaddress, 467 }, 468 facsimileTelephoneNumber => { 469 get => sub { 470 my ($self) = @_; 471 if (my $fmainaddress = $self->object->_get_c_field('mainaddress')) { 472 $self->base->get_object('address', $fmainaddress) 473 ->_get_c_field($self->name); 474 } else { 475 return; 476 } 477 }, 478 set => $subsetaddress, 479 }, 480 o => { 481 ro => 1, 482 iname => 'company', 483 }, 179 484 ou => { iname => 'department', ro => 1 }, 180 telephoneNumber => { }, 181 physicalDeliveryOfficeName => { }, 485 telephoneNumber => { 486 get => sub { 487 my ($self) = @_; 488 if (my $fmainaddress = $self->object->_get_c_field('mainaddress')) { 489 $self->base->get_object('address', $fmainaddress) 490 ->_get_c_field($self->name); 491 } else { 492 return; 493 } 494 }, 495 set => $subsetaddress, 496 }, 497 physicalDeliveryOfficeName => { 498 get => sub { 499 my ($self) = @_; 500 if (my $fmainaddress = $self->object->_get_c_field('mainaddress')) { 501 $self->base->get_object('address', $fmainaddress) 502 ->_get_c_field($self->name); 503 } else { 504 return; 505 } 506 }, 507 set => $subsetaddress, 508 }, 182 509 uid => { iname => 'name', ro => 1 }, 183 510 cn => { iname => 'name', ro => 1 }, … … 216 543 }, 217 544 }, 218 sAMAccountName => { ro => 1, managed => 1 }, 545 sAMAccountName => { 546 ro => 1, 547 managed => 1, 548 iname => 'name', 549 }, 219 550 accountExpires => { 220 551 ro => 1, … … 282 613 }, 283 614 managedObjects => { ro => 1, reference => 'group', }, 284 otheraddress => { ro => 1, reference => 'address', }, 285 mainaddress => { ro => 1, reference => 'address', }, 286 postalAddress => { ro => 1, }, 615 otheraddress => { 616 ro => 1, 617 reference => 'address', 618 get => sub { 619 my ($self) = @_; 620 my $sth = $self->base->db->prepare_cached(q{ 621 select name from address left join address_attributes 622 on address.ikey = address_attributes.okey and 623 address_attributes.attr = 'isMainAddress' 624 where "user" = ? 625 order by address_attributes.attr 626 }); 627 $sth->execute($self->object->id); 628 my @values; 629 while (my $res = $sth->fetchrow_hashref) { 630 push(@values, $res->{name}); 631 } 632 return \@values; 633 }, 634 }, 635 mainaddress => { 636 ro => 1, 637 reference => 'address', 638 get => sub { 639 my ($self) = @_; 640 my $sth = $self->base->db->prepare_cached(q{ 641 select name from address join address_attributes on ikey = okey 642 where "user" = ? and attr = 'isMainAddress' 643 }); 644 $sth->execute($self->object->id); 645 my $res = $sth->fetchrow_hashref; 646 $sth->finish; 647 return $res->{name}; 648 }, 649 }, 650 postalAddress => { 651 ro => 1, 652 get => sub { 653 my ($self) = @_; 654 if (my $fmainaddress = $self->object->_get_c_field('mainaddress')) { 655 $self->base->get_object('address', $fmainaddress) 656 ->_get_c_field($self->name); 657 } else { 658 return; 659 } 660 }, 661 }, 287 662 facsimileTelephoneNumber => { ro => 1, }, 288 663 allsite => { … … 324 699 }, 325 700 }, 326 krb5ValidEnd => { ro => 1, }, 701 krb5ValidEnd => { 702 ro => 1, 703 managed => 1, 704 get => sub { 705 my ($self) = @_; 706 my $sth = $self->object->db->prepare_cached( 707 sprintf( 708 q{select date_part('epoch', expire)::int as expire 709 from %s where %s = ?}, 710 $self->object->db->quote_identifier($self->object->_object_table), 711 $self->object->db->quote_identifier($self->object->_key_field), 712 ) 713 ); 714 $sth->execute($self->object->id); 715 my $res = $sth->fetchrow_hashref; 716 $sth->finish; 717 return $res->{expire} 718 }, 719 }, 327 720 cells => { 328 721 ro => 1, … … 362 755 }, 363 756 userPassword => { readable => 0, }, 757 wWWHomePage => { }, 758 title => { }, 759 snNative => { }, 760 givenNameNative => { }, 761 sn => { }, 762 shadowWarning => { }, 763 shadowMin => { }, 764 shadowMax => { }, 765 shadowLastChange => { }, 766 shadowInactive => { }, 767 shadowFlag => { }, 768 otherTelephone => { }, 769 nickname => { }, 770 mobile => { }, 771 mail => { }, 772 labeledURI => { }, 773 jobType => { }, 774 ipPhone => { }, 775 initials => { }, 776 homePhone => { }, 777 homeDirectory => { }, 778 halReference => { }, 779 grade => { }, 780 givenName => { }, 781 encryptedPassword => { }, 782 description => { }, 783 company => { }, 784 comment => { }, 785 college => { }, 364 786 } 365 787 ) 366 }367 368 sub get_field {369 my ($self, $field) = @_;370 if ($field eq 'sAMAccountName') {371 return $self->id;372 } elsif ($field eq 'krb5ValidEnd') {373 my $sth = $self->db->prepare_cached(374 sprintf(375 q{select date_part('epoch', expire)::int as expire376 from %s where %s = ?},377 $self->db->quote_identifier($self->_object_table),378 $self->db->quote_identifier($self->_key_field),379 )380 );381 $sth->execute($self->id);382 my $res = $sth->fetchrow_hashref;383 $sth->finish;384 return $res->{expire}385 } elsif ($field eq 'pwdAccountLockedTime') {386 } elsif ($field eq 'otheraddress') {387 my $sth = $self->db->prepare_cached(q{388 select name from address left join address_attributes389 on address.ikey = address_attributes.okey and390 address_attributes.attr = 'isMainAddress'391 where "user" = ?392 order by address_attributes.attr393 });394 $sth->execute($self->id);395 my @values;396 while (my $res = $sth->fetchrow_hashref) {397 push(@values, $res->{name});398 }399 return \@values;400 } elsif ($field eq 'mainaddress') {401 my $sth = $self->db->prepare_cached(q{402 select name from address join address_attributes on ikey = okey403 where "user" = ? and attr = 'isMainAddress'404 });405 $sth->execute($self->id);406 my $res = $sth->fetchrow_hashref;407 $sth->finish;408 return $res->{name};409 } elsif (grep { $field eq $_ } qw(postalAddress410 co l postalCode streetAddress411 postOfficeBox st412 facsimileTelephoneNumber413 o telephoneNumber414 physicalDeliveryOfficeName415 site416 )) {417 if (my $fmainaddress = $self->_get_c_field('mainaddress')) {418 my $address = $self->base->get_object('address', $fmainaddress);419 if ($address) {420 return $address->_get_c_field($field);421 } else { # can't happend422 return;423 }424 } else {425 return $self->SUPER::get_field($field);426 }427 } elsif ($field eq 'aliases') {428 my $sth = $self->db->prepare(q{429 select name from aliases where array[lower($1)] =430 string_to_array(lower(array_to_string("forward", ',')), ',')431 } . ($self->base->{wexported} ? '' : 'and exported = true'));432 $sth->execute($self->id);433 my @values;434 while (my $res = $sth->fetchrow_hashref) {435 push(@values, $res->{name});436 }437 return \@values;438 } elsif ($field eq 'forward') {439 my $sth = $self->db->prepare(q{440 select forward from aliases where name = ?441 } . ($self->base->{wexported} ? '' : ' and exported = true'));442 $sth->execute($self->id);443 my $res = $sth->fetchrow_hashref;444 $sth->finish;445 return $res->{forward}446 } elsif ($field eq 'revaliases') {447 my $sth = $self->db->prepare(q{448 select "as" from revaliases where name = ?449 } . ($self->base->{wexported} ? '' : ' and exported = true'));450 $sth->execute($self->id);451 my $res = $sth->fetchrow_hashref;452 $sth->finish;453 return $res->{as}454 } elsif ($field eq 'managerContact') {455 } else {456 return $self->SUPER::get_field($field);457 }458 788 } 459 789 … … 476 806 } 477 807 478 sub set_fields {479 my ($self, %data) = @_;480 my %fdata;481 my $res = 0;482 foreach my $attr (keys %data) {483 $attr =~ /^(un)?exported$/ and do {484 if (my $obj = $self->base->485 get_object('revaliases', $self->id)) {486 my $ares = $obj->set_c_fields(487 ($attr eq 'exported' ? 'exported' : 'unexported') => $data{$attr}488 );489 if (defined($ares)) {490 $res+=$ares;491 } else {492 $self->base->log(LA_ERR,493 'Cannot set revaliases exported attribute for user %s',494 $self->id);495 }496 }497 my $must_expire = $attr eq 'exported'498 ? ($data{$attr} ? 0 : 1 )499 : ($data{$attr} ? 1 : 0 );500 501 foreach my $al ($self->get_attributes('aliases')) {502 my $obj = $self->base->get_object('aliases', $al) or next;503 $obj->_set_c_fields(504 expire => $must_expire505 ? strftime(506 "%Y-%m-%d %H:%M:%S",507 localtime(time + 3600 * 24 * 365)508 )509 : undef,510 );511 }512 };513 $attr eq 'gidnumber' && $data{$attr} !~ /^\d+$/ and do {514 my $group = $self->base->get_object('group', $data{$attr}) or do {515 $self->base->log(LA_ERROR,516 "Can't set gidNumber to %s: no such group", $data{$attr});517 return;518 };519 $data{$attr} = $group->get_attributes('gidNumber');520 };521 $attr =~ /^memberOf$/ and do {522 my %members;523 my $memberof = $self->get_field('memberOf');524 foreach (ref $memberof525 ? @{ $memberof }526 : $memberof || ()) {527 $members{$_}{c} = 1;528 }529 foreach (grep { $_ } ref $data{$attr} ? @{ $data{$attr} || []} : $data{$attr}) {530 $members{$_}{n} = 1;531 }532 533 foreach my $member (keys %members) {534 $members{$member}{c} && $members{$member}{n} and next; # no change !535 my $group = $self->base->get_object('group', $member) or do {536 la_log(LA_WARN, "Cannot get group %s to set members", $member);537 next;538 };539 ($group->_get_c_field('sutype') || '') =~ /^(jobtype|contrattype)$/ and next;540 if ($members{$member}{n}) {541 my @newmembers = $group->get_attributes('memberUID');542 $res += $group->_set_c_fields('memberUID', [ $self->id, @newmembers ]);543 } elsif ($members{$member}{c}) {544 if (($self->_get_c_field('department') || '') eq $group->id) {545 $self->base->log(LA_WARN,546 "Don't removing user %s from group %s: is it's department",547 $self->id, $group->id);548 next;549 }550 my @newmembers = grep { $_ ne $self->id } $group->get_attributes('memberUID');551 $res += $group->_set_c_fields('memberUID', [ @newmembers ]);552 } # else {} # can't happend553 }554 next;555 };556 $attr =~ /^forward$/ and do {557 if ($data{$attr}) {558 if (my $f = $self->base->get_object('aliases', $self->id)) {559 $res += $f->_set_c_fields(forward => $data{$attr});560 } else {561 if ($self->base->_create_c_object(562 'aliases', $self->id,563 forward => $data{$attr},564 description => 'automatically created for ' . $self->id,565 )) {566 $res++;567 } else {568 $self->base->log(LA_ERR, "Cannot add forward for %s",569 $self->id);570 }571 }572 } else {573 if ($self->base->_delete_object('aliases', $self->id)) {574 $res++;575 } else {576 $self->base->log(LA_ERR, "Cannot remove forward for %s",577 $self->id);578 }579 }580 next;581 };582 $attr =~ /^aliases$/ and do {583 my %aliases = map { $_ => 1 } grep { $_ } (ref $data{$attr} ? @{$data{$attr}} :584 $data{$attr});585 foreach ($self->_get_attributes('aliases')) {586 $aliases{$_} ||= 0;587 $aliases{$_} +=2;588 }589 foreach (keys %aliases) {590 if ($aliases{$_} == 2) {591 if ($self->base->_delete_object('aliases', $_)) {592 $res++593 } else {594 $self->base->log(LA_ERR,595 "Cannot remove aliases %s from user %s", $_,596 $self->id);597 }598 } elsif ($aliases{$_} == 1) {599 if ($self->base->_create_c_object(600 'aliases', $_,601 forward => [ $self->id ],602 description => 'automatically created for ' . $self->id,603 )) {604 $res++605 } else {606 $self->base->log(LA_ERR, 'Cannot set forward %s to user %s',607 $_, $self->id);608 return609 }610 } # 3 no change611 }612 next;613 };614 $attr =~ /^revaliases$/ and do {615 if ($data{$attr}) {616 if (my $obj = $self->base->617 get_object('revaliases', $self->id)) {618 my $ares = $obj->set_c_fields(619 'as' => $data{$attr},620 'exported' => ($self->get_attributes('exported') || 0),621 );622 if (defined($ares)) {623 $res+=$ares;624 } else {625 $self->base->log(LA_ERR, 'Cannot set revaliases for user %s',626 $self->id);627 }628 } else {629 if ($self->base->_create_c_object(630 'revaliases',631 $self->id, as => $data{$attr},632 'exported' => ($self->get_attributes('exported') || 0),633 description => 'automatically created for ' . $self->id,634 )) {635 $res++;636 } else {637 $self->base->log(LA_ERR, 'Cannot set revaliases for user %s',638 $self->id);639 }640 }641 } else {642 $self->base->_delete_object('revaliases', $self->id);643 $res++;644 }645 next;646 };647 $attr =~ /^department$/ and do {648 if ($data{$attr}) {649 my $dpmt = $self->base->get_object('group', $data{$attr}) or do {650 $self->base->log(LA_ERR,651 "Group %s does not exists",652 $data{$attr});653 return;654 };655 if ((($dpmt->_get_c_field('sutype') || '') ne 'dpmt')) {656 $self->base->log(LA_ERR, "Group %s is not a department",657 $data{$attr});658 return;659 }660 }661 };662 $attr =~ /^jobType$/ and do {663 if ($data{$attr}) {664 my $dpmt = $self->base->get_object('group', $data{$attr}) or do {665 $self->base->log(LA_ERR,666 "Group %s does not exists",667 $data{$attr});668 return;669 };670 if ((($dpmt->_get_c_field('sutype') || '') ne 'jobtype')) {671 $self->base->log(LA_ERR, "Group %s is not a jobtype",672 $data{$attr});673 return;674 }675 }676 };677 $attr =~ /^contratType$/ and do {678 if ($data{$attr}) {679 my $dpmt = $self->base->get_object('group', $data{$attr}) or do {680 $self->base->log(LA_ERR,681 "Group %s does not exists",682 $data{$attr});683 return;684 };685 if ((($dpmt->_get_c_field('sutype') || '') ne 'contrattype')) {686 $self->base->log(LA_ERR, "Group %s is not a contrattype",687 $data{$attr});688 return;689 }690 }691 };692 grep { $attr eq $_ } (qw(co l postalCode streetAddress693 postOfficeBox st facsimileTelephoneNumber694 o telephoneNumber physicalDeliveryOfficeName site)) and do {695 my $fmainaddress = $self->_get_c_field('mainaddress');696 # set address attribute => create address object on the fly697 # except if attr is empty !698 if (!$fmainaddress && $data{$attr}) {699 $fmainaddress = $self->id . '-' . join('', map { ('a'..'z')[rand(26)] }700 (0..4));701 $self->base->_create_c_object(702 'address', $fmainaddress,703 user => $self->id,704 isMainAddress => 1, ) or do {705 $self->base->log(LA_ERR,706 "Cannot create main address for user %s", $self->id);707 return;708 };709 }710 if ($fmainaddress &&711 (my $address = $self->base->get_object('address', $fmainaddress))) {712 if ($address->attribute($attr) &&713 !$address->attribute($attr)->ro) {714 $res += $address->set_c_fields($attr => $data{$attr}) ||0;715 }716 }717 next;718 };719 $fdata{$attr} = $data{$attr} || undef;720 }721 if (keys %fdata) {722 if (defined(my $res2 = $self->SUPER::set_fields(%fdata))) {723 return $res2 + $res;724 } else {725 return;726 }727 } else { return $res; }728 }729 730 731 808 1; 732 809 -
trunk/LATMOS-Accounts/lib/LATMOS/Accounts/Bases/Sql/objects.pm
r1314 r1315 82 82 } 83 83 } 84 85 # Common to all object attribute: 86 my %commons = ( 87 name => { inline => 1, ro => 1, }, 88 create => { inline => 1, ro => 1, }, 89 date => { inline => 1, ro => 1, }, 90 exported => { inline => 1, formtype => 'CHECKBOX', hide => 1, monitored => 1 }, 91 unexported => { 92 inline => 1, 93 managed => 1, 94 formtype => 'CHECKBOX', 95 get => sub { 96 my ($self) = @_; 97 return $self->object->get_field('exported') ? undef : 1; 98 }, 99 set => sub { 100 my ($self, $data) = @_; 101 $self->object->_set_c_fields('exported', $data ? 'false' : 'true'); 102 }, 103 }, 104 services => { inline => 1, multiple => 1, reference => 'service' }, 105 ); 106 107 # Merging / overriding with common to all object attributes properties 108 foreach my $attr (keys %commons) { 109 foreach my $var (keys %{ $commons{$attr} }) { 110 $info->{$attr}{$var} = $commons{$attr}{$var}; 111 } 112 } 113 114 # TODO kill this code: useless since everything is declared in perl code 84 115 if ($class->_has_extended_attributes) { 85 116 if (!$base->{__cache}{$class->_object_table}{extend}) { … … 98 129 } 99 130 foreach (@{$base->{__cache}{$class->_object_table}{extend}}) { 131 $base->log(LA_ERR, 'Attribute %s for %s not declared in code', $_, $class->type) if(!exists($info->{$_})); 100 132 $info->{$_} ||= {}; 101 133 } 102 134 } 103 $info->{exported} = { inline => 1, formtype => 'CHECKBOX', hide => 1, monitored => 1 };104 $info->{unexported} = { inline => 1, formtype => 'CHECKBOX', };105 $info->{services} = { inline => 1, multiple => 1, reference => 'service' };106 135 107 136 $info … … 249 278 sub get_field { 250 279 my ($self, $field) = @_; 251 if ($field eq 'unexported') {252 return $self->get_field('exported') ? undef : 1;253 }254 280 if ($field eq 'services') { 255 281 my @services; … … 315 341 my @vals; 316 342 my %ext; 317 if (exists($data{unexported})) {318 $data{exported} = $data{unexported} ? 0 : 1;319 }320 if (exists($data{exported})) {321 $data{exported} ||= 0;322 }323 343 if (exists($data{services})) { 324 344 my %old = map { $_ => 0 } $self->get_attributes('services'); … … 338 358 delete($data{services}); 339 359 } 360 if (exists($data{services})) { 361 my %old = map { $_ => 0 } $self->get_attributes('services'); 362 foreach my $serv (grep { $_ } ref $data{services} ? @{ $data{services} } : $data{services}) { 363 if (!exists($old{$serv})) { 364 my $oserv = $self->base->get_object('service', $serv) or next; 365 $oserv->addAttributeValue('dependOn', $self->type . '.' . $self->id); 366 } 367 $old{$serv} = 1; 368 } 369 foreach my $serv (keys %old) { 370 if (!$old{$serv}) { 371 my $oserv = $self->base->get_object('service', $serv) or next; 372 $oserv->delAttributeValue('dependOn', $self->type . '.' . $self->id); 373 } 374 } 375 delete($data{services}); 376 } 340 377 foreach my $field (keys %data) { 341 378 my $attr = $self->attribute($field); 342 next if ($field eq 'unexported');343 379 my $oldval = $self->get_field($field); 344 380 next if (($data{$field} || '') eq ($oldval || ''));
Note: See TracChangeset
for help on using the changeset viewer.