* gpgkeys_ldap.c: Replacement prototypes for setenv and unsetenv.
[gnupg.git] / keyserver / gpgkeys_mailto.in
index c310483..0691e4c 100755 (executable)
@@ -38,21 +38,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 +72,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 +114,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 +129,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 +151,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 +159,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 +170,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 +184,7 @@ if($command=~/send/i)
 
        while(<STDIN>)
        {
-           if(/^KEY \w+ END$/)
+           if(/^KEY \S+ END$/)
            {
                last;
            }
@@ -158,7 +196,7 @@ if($command=~/send/i)
 
        if($verbose)
        {
-           print STDERR "gpgkeys: key $key sent to $host\n";
+           print STDERR "gpgkeys: key $key sent to $address\n";
        }
     }
 }