package EmContracten::User;
# $Id: User.pm 70 2005-01-12 21:59:23Z insaniac $
use Net::LDAP;
use Data::Dumper;

my $ldap = Net::LDAP->new('localhost')  or EmContracten->error("$@");

sub retrieve {
	my ($self,$uid) = @_;

	return $self->user if $self->id eq $uid;
	my $mesg = $ldap->bind() or $self->error("$@");
	my $mesg = $ldap->search(base => "dc=amano,dc=moretrix,dc=com", filter => "(&(uid=".$uid.") (objectclass=person))") or $self->error("$@");
	#warn 'mesg: '.Dumper($mesg);

	return undef if ! $mesg->entries;
	my @results = $mesg->entries;
	return $self if $results[0]->get_entry('uid') eq $self->id;
};

sub search {
	my $self = shift;
	my %h = @_;
	
	my $mesg = $ldap->bind() or $self->error("$@");
	my $mesg = $ldap->search(
		base => "dc=amano,dc=moretrix,dc=com",
		filter => "(&(uid=".$h{user}.") (objectclass=person)) ", # zoek op
	) or $self->error("$@");

	#warn Dumper(%h);
	#warn "search string: "."(&(uid=".$h{user}.") (objectclass=person)) ";
	#warn "ldap mesg: $mesg";
	#warn Dumper(%$mesg);
	return undef if ! $mesg->entries;

	foreach my $entry ($mesg->entries) {
		#warn "dn: ".$entry->dn." | uidnumber: ".$entry->get_value('uidnumber');
		if( $self->check_pw($entry->dn,$h{password}) ){
			$self->{id} = $entry->get_value('uid');
			$self->{user} = $self;
			return ($self) ;
			last;
		}	
	}
	return undef;
};

sub id {
	my $self = shift;
	return $self->{id};
}

sub user {
	my $self = shift;
	return $self;
}

sub require {
	my $invocant = shift;
	my $class = ref ($invocant) || $invocant;
	my $self = {} ;
	bless $self, $class;
	return $self;
};

sub check_pw {
	my($self,$r,$dn,$password) = @_;
	my $mesg = $ldap->bind($dn, password => $password) or $self->error ("$@");
	my $u_mesg = $ldap->unbind;
	return undef if not defined $mesg;
	return 1;
}


1;

