package Fripost::Schema::Search; use 5.010_000; use warnings; use strict; use Fripost::Schema::Type; use Fripost::Schema::Utils; use base qw/Net::LDAP::Search/; our $VERSION = '0.01'; # Count the entries got out from the query. sub count { my $self = shift; if (ref $self->{_res} eq 'ARRAY') { my $count; foreach (@{$self->{_res}}) { $count += $_->count; } return $count; } else { return $self->{_res}->count; } } # Create a hash out of the LDAP entry. Keys depend on the context # of the object. # The value can be an array reference (multi-valued attributes) or # a scalar (otherwise). sub entries { my $self = shift; my $dumpEntry; if ( $self->{_type} == MAILBOX ) { $dumpEntry = "_userEntry"; } elsif ( $self->{_type} == DOMAIN ) { $dumpEntry = "_domainEntry"; } elsif ( $self->{_type} == ALIAS ) { $dumpEntry = "_aliasEntry"; } else { die "Something weird happened. Please report."; } my @entries; if (ref $self->{_res} eq 'ARRAY') { foreach (@{$self->{_res}}) { push @entries, $_->entries; } } else { @entries = ($self->{_res}->entries); } no strict "refs"; return (map {&$dumpEntry($_)} @entries); } sub _userEntry { my $entry = shift; my %user; $user{username} = Fripost::Schema::Utils::fromDN ($entry->dn); &_get_values( $entry, \%user, 'uid'); map { &_get_values($entry, \%user, $_) } qw /isActive userPassword/; return \%user; } sub _domainEntry { my $entry = shift; my %domain; &_get_values( $entry, \%domain, 'domain', 'dc'); map { &_get_values($entry, \%domain, $_) } qw /isActive owner/; if (defined $domain{owner}) { $domain{owner} = [ $domain{owner} ] unless (ref $domain{owner}) eq 'ARRAY'; $domain{owner} = [ map { Fripost::Schema::Utils::fromDN($_) } @{$domain{owner}} ]; } return \%domain; } sub _aliasEntry { my $entry = shift; my %alias; my $domain = (split /=/, (split /,/, $entry->dn, 3)[1], 2)[1]; &_get_values( $entry, \%alias, 'address', 'mailLocalAddress'); if (defined $alias{address}) { $alias{address} = [ $alias{address} ] unless (ref $alias{address}) eq 'ARRAY'; $alias{address} = [ map { $_ . '@' . $domain } @{$alias{address}} ]; } &_get_values( $entry, \%alias, 'goto', 'mailTarget'); &_get_values( $entry, \%alias, 'isActive'); return \%alias; } sub _get_values { my ($entry, $h, $attr, $attr2) = @_; $attr2 //= $attr; my $values = $entry->get_value ( $attr2, asref => 1 ); return unless defined $values; if ($#$values == 0) { $h->{$attr} = $values->[0]; } else { $h->{$attr} = $values; } } sub _get_dn { return [split ',', $_[0]->dn()]; } =head1 NAME Fripost::Schema::Search - Class for the result of LDAP queries. =head1 AUTHOR Guilhem Moulin C<< >> =head1 COPYRIGHT Copyright 2012 Guilhem Moulin, all rights reserved. =head1 LICENSE This program is free software; you can redistribute it and/or modify it under the same terms as perl itself. =cut 1; # End of Search.pm __END__