#!/usr/bin/perl
#
#----------------------------------------------------------------------------
#
# This program was written by Clif Harden.
# It is uses the PERL LDAP, Tk, and Tk::JPEG modules.
# These modules are available from the PERL CPAN
# system.
#
# $Id: jpegDisplay.pl,v 1.2 2003/06/18 18:23:31 gbarr Exp $
#
# Purpose: This program is designed to retrieve jpeg photo data
# from an LDAP directory.
#
#
# Revisions:
# $Log: jpegDisplay.pl,v $
# Revision 1.2 2003/06/18 18:23:31 gbarr
# Remove all references to :all as it is not recomended
#
# Revision 1.1 2001/03/12 14:01:46 gbarr
# New contrib scripts from Clif Harden
#
#
#
#
use Getopt::Std;
use Net::LDAP;
use Net::LDAP::Filter;
use Tk;
use Tk::JPEG;
#
# Initialize opt hash.
# You can change the defaults to match your setup.
# This can eliminate the need for many of the input
# options on the command line.
#
my %opt = (
b => 'dc=harden,dc=org',
h => 'localhost',
d => 0,
D => 'cn=manager',
w => 'password',
V => 3,
a => 'cn',
v => 'commonName'
);
if (@ARGV == 0) {
#
# print usage message.
#
Usage();
}
#
# Get command line options.
#
getopts('b:h:d:D:w:V:a:v:Z',\%opt);
#
# build filter string
#
my $match = "( $opt{a}=$opt{v} )";
my $jpegFile = "./$opt{a}=$opt{v}.jpg";
#
# create filter object
#
my $filter = Net::LDAP::Filter->new($match)
or die "Bad filter '$match'";
#
# make ldap connection to directory.
#
my $ldap = new Net::LDAP($opt{h},
timeout => 10,
debug => $opt{d},
version => $opt{V})
or die $@;
#
# call start_tls
#
if ($opt{Z}) {
$ldap->start_tls();
}
#
# Bind to directory.
#
my $mesg = $ldap->bind($opt{D}, password => "$opt{w}");
die $mesg->error,$mesg->code
if $mesg->code;
#
# Search directory for record that matches filter
#
$mesg = $ldap->search(base => $opt{b},
filter => $filter,
attrs => ['jpegPhoto']);
die $mesg->error,$mesg->code
if $mesg->code;
#
# get record entry object
#
$entry = $mesg->entry();
if ( !defined($entry) ) {
print "\n";
print "No data for filter $match.\n" if ($mesg->count == 0) ;
print "\n";
}
else {
my @attrs = sort $entry->attributes;
my $max = 0;
$dn = $entry->dn();
my @pictures = $entry->get_value('jpegPhoto');
if(@pictures) {
$picture = $pictures[0];
}
else {
print "\n";
print "No jpegPhoto attribute for DN\n";
print "$dn\n";
print "\n";
$ldap->unbind;
exit;
}
}
#
# Store the jpeg data to a temp file.
#
open(TMP, "+>$jpegFile");
binmode(TMP);
$| = 1;
print TMP $picture;
close(TMP);
if ( !-e "$jpegFile" ) {
print "\n";
print "Could not create temporary jpeg file $jpegFile\n";
print "\n";
$ldap->unbind;
exit(1);
}
$ldap->unbind;
#
# Create a TK window to display the jpeg picture.
#
my $mw = MainWindow->new();
my $list = $mw->Listbox(-height => 1, -width => length($dn));
$list->pack(-side => 'top');
$list->insert('end', $dn);
my $image = $mw->Photo(-file => $jpegFile, -format => 'jpeg');
print "\n";
print "Displaying jpegPhoto for\n";
print "$dn\n";
print "\n";
$mw->Label(-image => $image)->pack(-expand => 1, -fill => 'both');
$mw->Button(-text => 'Quit', -command => [destroy => $mw])->pack;
MainLoop;
unlink $jpegFile;
#----------------------------------------#
# Usage() - display simple usage message #
#----------------------------------------#
sub Usage
{
print( "Usage: [-Z] [-b ] [-h ] [-d ] [-D ] [-w ] [-a ] [-v ]\n" );
print( "\t-b Search base.\n" );
print( "\t-d Debug mode. Display debug messages to stdout.\n" );
print( "\t-D Authenication Distingushed Name.\n" );
print( "\t-h LDAP directory host computer.\n" );
print( "\t-w Authenication password.\n" );
print( "\t-a Attribute that will be incorporated into the search filter.\n" );
print( "\t-v Data that will be incorporated into the search filter.\n" );
print( "\t-V LDAP version of the LDAP directory.\n" );
print( "\t-Z start SSL encryption using start_tls.\n" );
print( "\n" );
print( "\t Perldoc pod documentation is included in this script.\n" );
print( "\t To read the pod documentation do the following;\n" );
print( "\t perldoc