* curl-shim.c (curl_easy_perform): Fix compile warning.
[gnupg.git] / keyserver / gpgkeys_mailto.in
index c310483..7167c3a 100755 (executable)
@@ -1,6 +1,6 @@
 #!@PERL@ -w
 
-# gpgkeys_mailto - talk to a email keyserver
+# gpgkeys_mailto - talk to a email keyserver 
 # Copyright (C) 2001, 2002 Free Software Foundation, Inc.
 #
 # This file is part of GnuPG.
 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
 
 use Getopt::Std;
+$Getopt::Std::STANDARD_HELP_VERSION=1;
 $sendmail="@SENDMAIL@ -t";
 
 ###
 
+sub VERSION_MESSAGE ()
+{
+    print STDOUT "gpgkeys_mailto (GnuPG) 1.3.91-cvs\n";
+}
+
+sub HELP_MESSAGE ()
+{
+    print STDOUT <<EOT
+
+--help     Print this help
+--version  Print the version
+-o FILE    Write output to FILE
+EOT
+}
+
+
+
 getopts('o:');
 
 if(defined($opt_o))
@@ -38,21 +56,28 @@ if(@ARGV)
 
 ($login,$name)=(getpwuid($<))[0,6];
 
+$from="$name <$login>";
+
 while(<STDIN>)
 {
     last if($_ eq "\n");
 
-    if(/^COMMAND (\w+)/)
+    if(/^COMMAND (\S+)/)
     {
        $command=$1;
     }
 
-    if(/^HOST (\S+)/)
+    if(/^OPAQUE (\S+)/)
     {
-       $host=$1;
+       $address=$1;
     }
 
-    if(/^OPTION (\w+)/)
+    if(/^PROGRAM (\S+)/)
+    {
+       $program=$1;
+    }
+
+    if(/^OPTION (\S+)/)
     {
        if($1=~/^verbose$/i)
        {
@@ -65,6 +90,37 @@ while(<STDIN>)
     }
 }
 
+$program="(unknown)" if(!defined($program));
+
+if(!defined($address))
+{
+    print STDERR "gpgkeys: no address provided\n";
+    exit(1);
+}
+
+# decode $address
+
+($address,$args)=split(/\?/,$address);
+
+if(defined($args))
+{
+    @pairs = split(/&/, $args);
+    foreach $pair (@pairs)
+    {
+       ($hdr, $val) = split(/=/, $pair);
+       $hdr =~ tr/+/ /;
+       $hdr =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
+       $val =~ tr/+/ /;
+       $val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
+# we only handle "from" right now
+       if($hdr=~/^from$/i)
+       {
+           $from=$val;
+           last;
+       }
+    }
+}
+
 while(<STDIN>)
 {
     last if($_ eq "\n");
@@ -76,7 +132,7 @@ while(<STDIN>)
 
 # Send response
 
-print "VERSION 0\n";
+print "VERSION 1\n";
 print "OPTION OUTOFBAND\n\n";
 
 # Email keyservers get and search the same way
@@ -91,8 +147,8 @@ if($command=~/get/i || $command=~/search/i)
     foreach $key (@keys)
     {
        open(MAIL,"|$sendmail") || die "ERROR: Can't open $sendmail\n";
-       print MAIL "From: $name <$login>\n";
-       print MAIL "To: $host\n";
+       print MAIL "From: $from\n";
+       print MAIL "To: $address\n";
        if($command=~/get/i)
        {
            # mail keyservers don't like long-form keyids
@@ -113,7 +169,7 @@ if($command=~/get/i || $command=~/search/i)
        {
            print MAIL "Subject: GET $key\n\n";
        }
-       print MAIL "GnuPG keyserver request\n";
+       print MAIL "GnuPG $program email keyserver request\n";
        close(MAIL);
 
        # Tell GnuPG not to expect a key
@@ -121,7 +177,7 @@ if($command=~/get/i || $command=~/search/i)
 
        if($verbose)
        {
-           print STDERR "gpgkeys: key $key requested from $host\n";
+           print STDERR "gpgkeys: key $key requested from $address\n";
        }
     }
 }
@@ -132,12 +188,12 @@ if($command=~/send/i)
     {
        open(MAIL,"|$sendmail") || die "ERROR: Can't open $sendmail\n";
        print MAIL "From: $name <$login>\n";
-       print MAIL "To: $host\n";
+       print MAIL "To: $address\n";
        print MAIL "Subject: ADD\n\n";
 
        while(<STDIN>)
        {
-           if(/^KEY (\w+) BEGIN$/)
+           if(/^KEY (\S+) BEGIN$/)
            {
                $key=$1;
                last;
@@ -146,7 +202,7 @@ if($command=~/send/i)
 
        while(<STDIN>)
        {
-           if(/^KEY \w+ END$/)
+           if(/^KEY \S+ END$/)
            {
                last;
            }
@@ -158,7 +214,12 @@ if($command=~/send/i)
 
        if($verbose)
        {
-           print STDERR "gpgkeys: key $key sent to $host\n";
+           print STDERR "gpgkeys: key $key sent to $address\n";
        }
     }
 }
+
+
+# Local Variables: 
+# mode:perl
+# End: