From: joey <> Date: Sun, 24 Oct 2004 16:35:31 +0000 (+0000) Subject: I noticed that a login lookup on db.debian.org can take up several X-Git-Tag: debian_userdir-ldap_0-3-7~57 X-Git-Url: https://git.adam-barratt.org.uk/?p=mirror%2Fuserdir-ldap.git;a=commitdiff_plain;h=abfbcdfee46877cea5d2b73593f27d3d7a6f7ab1 I noticed that a login lookup on db.debian.org can take up several minutes when the digital key has many signatures on it. The reason is that for each and every login lookup the keyring data is built, which takes a while with large numbers of signatures. Hence, I've changed the semantic. The key is no longer part of the normal output but can only be accessed via the "/field[,field[..]]" feature. A note has been added to the normal output. The program now also works fine from the commandline. --- diff --git a/ud-fingerserv b/ud-fingerserv index 687a62c..26c3dfd 100755 --- a/ud-fingerserv +++ b/ud-fingerserv @@ -1,5 +1,5 @@ #!/usr/bin/perl -# $Id: ud-fingerserv,v 1.16 2004/10/24 18:34:12 joey Exp $ +# $Id: ud-fingerserv,v 1.17 2004/10/24 18:35:31 joey Exp $ # (c) 1999 Randolph Chung. Licensed under the GPL. @@ -76,8 +76,12 @@ if (!$use_inetd) { } else { # inetd &log("inetd mode"); my $sockaddr = getpeername(STDIN); - my ($port, $addr) = unpack_sockaddr_in(getpeername(STDIN)); - &log(sprintf("[Connect from %s (%s)]", gethostbyaddr($addr, AF_INET), inet_ntoa($addr))); + if ($sockaddr) { + my ($port, $addr) = unpack_sockaddr_in(getpeername(STDIN)); + &log(sprintf("[Connect from %s (%s)]", gethostbyaddr($addr, AF_INET), inet_ntoa($addr))); + } else { + &log("[Connect via terminal]"); + } my $query = &readdata(\*STDIN); &ProcessQuery(\*STDOUT, $query) if (defined($query)); exit; @@ -123,23 +127,21 @@ sub ProcessQuery { foreach $dn (sort {$entries->{$a}->{sn}->[0] <=> $entries->{$b}->{sn}->[0]} keys(%$entries)) { $data = $entries->{$dn}; - $data->{key} = []; - foreach (@{$data->{keyfingerprint}}) { - push (@{$data->{key}}, "\n".&Util::FetchKey($_)); - } - $data->{email}->[0] = sprintf("%s %s %s <%s>", $data->{cn}->[0], $data->{mn}->[0], $data->{sn}->[0], $data->{uid}->[0]."\@$config{emailappend}"); $data->{email}->[0] =~ s/\s+/ /g; + my @keyfingerprint = (); for (my $i=0; $i <= $#{$data->{'keyfingerprint'}}; $i++) { + push (@keyfingerprint, $data->{keyfingerprint}->[$i]); $data->{keyfingerprint}->[$i] = &Util::FormatFingerPrint($data->{keyfingerprint}->[$i]); $data->{keyfingerprint}->[$i] =~ s, , ,; } print $client "$dn\n"; if (!$fields) { + push (@{$data->{key}}, sprintf ("finger %s/key\@db.debian.org", $uid)); foreach $key (@summarykeys) { foreach (@{$data->{$key}}) { print $client "$attrs{$key}: "; @@ -149,6 +151,11 @@ sub ProcessQuery { } else { # print "$fields\n"; foreach $key (split(/,/, $fields)) { + if ($key eq 'key') { + foreach (@keyfingerprint) { + push (@{$data->{key}}, "\n".&Util::FetchKey($_)); + } + } foreach (@{$data->{$key}}) { print $client "$attrs{$key}: "; print $client "$_\n";