Added key fetching code to fingerserv
[mirror/userdir-ldap.git] / ud-fingerserv
1 #!/usr/bin/perl
2 # $Id: ud-fingerserv,v 1.2 1999/10/05 02:54:29 tausq Exp $
3
4 # (c) 1999 Randolph Chung. Licensed under the GPL. <tausq@debian.org>
5
6 use lib 'web';
7 use strict vars;
8 #use Apache::Registry;
9 use IO::Socket;
10 use Util;
11 use Net::LDAP qw(:all);
12
13 # Global settings...
14 my %config = &Util::ReadConfigFile;
15
16 my %attrs = (
17   'cn' => 'First name',
18   'mn' => 'Middle name',
19   'sn' => 'Last name',
20   'keyfingerprint' => 'Fingerprint',
21   'key' => 'Key block',
22   'ircnick' => 'IRC nickname'
23 );
24
25 my @summarykeys = ('cn', 'mn', 'sn', 'ircnick', 'keyfingerprint', 'key');
26
27 my ($ldap, $mesg, $dn, $entries, $data, %output, $key, $hostlist, $hostdetails, $selected, %summary);
28 sub DieHandler {
29   $ldap->unbind if (defined($ldap));
30 }
31
32 $SIG{__DIE__} = \&DieHandler;
33
34 $ldap = Net::LDAP->new($config{ldaphost}) || &Util::HTMLError($!);
35 $mesg;
36 $ldap->bind;
37
38 my $server = IO::Socket::INET->new(Proto => 'tcp', 
39                                    LocalPort => 'finger(79)',
40                                    Listen => SOMAXCONN,
41                                    Reuse => 1);
42
43 die "Cannot listen on finger port" unless $server;
44 print "[Server listening for connections]\n";
45
46 my ($mesg, %entries, $dn, $key);
47
48 my $client;
49 while ($client = $server->accept()) {
50   $client->autoflush(1);
51   my $hostinfo = gethostbyaddr($client->peeraddr, AF_INET);
52   printf "[Connect from %s]\n", $hostinfo || $client->peerhost;
53   my $query = <$client>;
54   $query =~ s/[^\/,0-9a-z]//gi; # be paranoid about input
55   my ($uid, $fields) = split(/\//, $query, 2);
56   
57   print "Looking up $uid at $config{basedn}, uid=$uid\n";
58
59   $mesg = $ldap->search(base  => $config{basedn}, filter => "uid=$uid");
60   $mesg->code && die $mesg->error;
61   $entries = $mesg->as_struct;
62
63   foreach $dn (sort {$entries->{$a}->{sn}->[0] <=> $entries->{$b}->{sn}->[0]} keys(%$entries)) {
64     $data = $entries->{$dn};
65
66     $data->{key} = [];    
67     foreach (@{$data->{keyfingerprint}}) {
68       push (@{$data->{key}}, "\n".&Util::FetchKey($_));
69     }
70
71     print $client "$dn\n";
72     if (!$fields) {
73       foreach $key (@summarykeys) {
74         foreach (@{$data->{$key}}) {
75           print $client "$attrs{$key}: ";
76           print $client "$_\n";
77         }
78       }
79     } else {
80 #      print "$fields\n";
81       foreach $key (split(/,/, $fields)) {
82         foreach (@{$data->{$key}}) {
83           print $client "$attrs{$key}: ";
84           print $client "$_\n";
85         }
86       }
87     }
88   }
89   $client->close;
90 }
91
92 $ldap->unbind;