#!/usr/bin/perl -w

use Carp;
use Encode;
use encoding 'UTF-8';
use English;
use Net::LDAP;
use Net::LDAP::Entry;
use Net::LDAP::Filter;
use Net::LDAP::Util qw(escape_dn_value);
use strict;
use utf8;

# LDAP bindings
my $admin_binddn   = 'cn=user,ou=system,ou=accounts,dc=pentex,dc=at';
my $admin_password = 'XXXXXXXXXXXXXXX';

# -----------------------------------------------------------------------------
# LDAP
my $base           = 'ou=users,ou=accounts,dc=pentex,dc=at';
my $binddn;
my $dn;
my $entry;
my $filter;
my $filterobj;
my $ldap;

# Things we read from the server
my $ldapentry;

my $lres;
my $mesg;
my $server = 'localhost';
my $port   = 389;

my $suchname = 'rene.pfeiffer';

# ----------------------------------------------------------------------------
# Debug level
my $debug = 5;

my $errorflag = 0;
my $errormsg;

# ---------------------------------------------------------------------
# Subroutines

# Prints search results 
sub html_display {
	my $l = shift(@_);
	my @objects;
	my $ldap_cn;
	my $ldap_description;
	my $ldap_mail;
	my $ldap_mailalternateaddress;
	my $ldap_mailforwardingaddress;
	my $ldap_mailquotasize;
	my $ldap_uid;
	my $ldap_userpassword;
	my $format = "<td align=\"left\">%s</td>"x7;

	# Start table
	print "<table border=\"0\"><tr align=\"center\" valign=\"top\">";
	print "<th align=\"left\">UserID</th>";
	print "<th align=\"left\">Name</th>";
	print "<th align=\"left\">Mail</th>";
	print "<th align=\"left\">Alias</th>";
	print "<th align=\"left\">Weiterleitung</th>";
	print "<th align=\"left\">Mailquote (kB)</th>";
	print "<th align=\"left\">Beschreibung</th>";
	print "</tr>";
	@objects = $l->entries;
	foreach $entry (@objects) {
		print "<tr align=\"center\" valign=\"top\">";
		$ldap_cn                   = $entry->get_value("cn");
		$ldap_description          = $entry->get_value("description");
		$ldap_mail                 = $entry->get_value("mail");
		$ldap_mailalternateaddress = $entry->get_value("mailAlternateAddress");
		$ldap_mailforwardingaddress= $entry->get_value("mailForwardingAddress");
		$ldap_mailquotasize        = $entry->get_value("mailQuotaSize");
		$ldap_uid                  = $entry->get_value("uid");
		printf $format,$ldap_uid,$ldap_cn,$ldap_mail,
		       ( length($ldap_mailalternateaddress)>2 ? $ldap_mailalternateaddress : '-' ),
		       ( length($ldap_mailforwardingaddress)>2 ? $ldap_mailforwardingaddress : '-' ),
		       $ldap_mailquotasize,
		       ( length($ldap_description)>2 ? $ldap_description : '-' );
		print "</tr>";
	}
	print "</table>";
	return 0;
}

# ------
# MAIN

$ldap = Net::LDAP->new( $server, port => $port, version => 3, async => 0 );
$mesg = $ldap->bind( $admin_binddn, password => $admin_password );
if ( (! $mesg->code) ) {
	# Create search filter
	if ( $debug > 20 ) {
		# Enable Net::LDAP's debug mode and redirect STDERR
		open (STDERR, ">&STDOUT");
		$ldap->debug(15);
	}
	#$filter    = Encode::encode( "UTF-8", "(uid=".$suchname.")");
	$filter    = "(uid=*)";
	#$filterobj = Net::LDAP::Filter->new($filter);
	print 'Filter: ',$filterobj->as_string,"\n";
	$lres      = $ldap->search( base => $base,
				    scope => 'sub',
				    sizelimit => 1,
				    timelimit => 60,
				    attrs => ['uid','cn','mail','accountStatus',
					      'mailQuotaSize','mailAlternateAddress',
					      'mailForwardingAddress',
					      'description'],
				    filter => $filter );
	if ( $lres->is_error ) {
		$errormsg = "Der LDAP Server meldete einen Fehler zurück. ";
		$errormsg = $errormsg."Der LDAP Server meldete \"".$lres->error_name."\".\n";
		$errormsg = $errormsg."Die vollständige Fehlerbeschreibung lautet: \"".$lres->error_text."\".\n";
		$errormsg = $errormsg."Der volle Fehlertext lautet: \"".$lres->error_desc."\".\n";
		$errormsg = $errormsg."Der Serverfehler lautet: \"".$lres->server_error."\".\n";
	}
	else {
		# We found our user and prepare the results for display
		#
		if ( $lres->count > 0 ) {
			$errorflag = html_display($lres);
		}
		else {
			$errorflag = 1;
			$errormsg = "Der LDAP Server hat keine Benutzer gefunden, die den Text ";
			$errormsg = $errormsg."\"".$suchname."\" enthalten!";
		}
	}
}

print $errormsg;
$ldap->unbind;

__END__
