#!/usr/local/bin/ruby # rpk --- retrieve public key class from openpksd.org # Author: Hironobu SUZUKI # License: GPL 2 # $Id: rpk.rb,v 1.10 2004/04/06 05:10:22 hironobu Exp hironobu $ # if (VERSION < "1.8.0") printf "Use Ruby 1.8.0 or later, your Ruby version: %s...bye\n",VERSION exit(1) end require 'open-uri' class RetrievePublicKey def initialize () @keyid_hash = Hash.new @emailaddr="" @output=STDOUT @debug=0 @openpksd_site="openpksd.org" i="$Id: rpk.rb,v 1.10 2004/04/06 05:10:22 hironobu Exp hironobu $".split(' ') @version="Retrieve Public Key (RCSRev:"< 5 ) print uri,"\n" end begin keyserv=open(uri,"User-Agent" => @version) rescue printf "OpenPKSD keyserver site \"%s\" can't open...bye\n",@openpksd_site exit (1) end keyserv.each{|line| if (line =~ /^\/) @keyid_hash[$1]=true elsif (line =~ /^Key was not found:/ ) printf "Specified email address was not found in keyserver: %s\n",@emailaddr exit(0); end } keyserv.close end # # Get Key by key id # def getKeyByKeyid @keyid_hash.each_key{|longkey| uri=sprintf("http://%s/cgi-bin/lookup?search=%s",@openpksd_site,longkey) if (@debug > 5 ) print uri,"\n"; end begin keyserv=open(uri,"User-Agent" => @version) rescue printf "OpenPKSD keyserver site \"%s\" can't open...bye\n",@openpksd_site exit (1) end openblock=false keyserv.each{|line| if ( line =~ /^-----BEGIN PGP PUBLIC KEY BLOCK-----/ ) openblock=true elsif ( line =~/^-----END PGP PUBLIC KEY BLOCK-----/ ) openblock=false @output.print line end if ( openblock == true ) @output.print line end } keyserv.close } begin @output.close rescue end end # # Get Public Key # Email address or key id(s) must pre-set in an instance. # def getPublicKey if @emailaddr != nil self.getKeyidByEmailAddr end self.getKeyByKeyid end end #-*-mode:ruby-*- def usage () print "\n" print "*** Retrieve Public Key From OpenPKSD Type Keyserver ***\n" print "Usage: rpk [options] argument\n" print "Options:\n" print " -o=FILENAME\n" print " --output=FILENAME output FILENAME\n" print " --keyserver=site OpenPKSD keyserver site\n" print " (default openpksd.org)\n" print " --mew Mew mode\n" print "Argument: (alternative)\n" print " email-address retrieve by email address\n" print " KeyID retrieve by KeyID (32bit/64bit)\n" print "Example:\n" print " rpk --output=key.asc foo@example.com\n" print " rpk --output=key.asc 0xFFFFFFFF\n" print "\n" print "More info: http://openpksd.org\n" print "Version: ",RetrievePublicKey.new.version,"\n" end mew_mode=false rpk=RetrievePublicKey::new #rpk.debug(10) ARGV.each {|argv| if (argv =~ /^--help$/) usage exit(0) elsif ( argv =~ /^-o=(.*)$/ or argv =~ /^--output=(.*)$/) rpk.setOutputFileName($1) elsif ( argv =~ /([!-~]+@[!-~]+)/) rpk.setEmailAddress($1) elsif ( argv =~ /^(0x[0-9A-Z]+)$/ ) rpk.setKeyid($1) elsif ( argv =~ /^--keyserver=([-A-Za-z0-9._:]+)/ ) rpk.setOpenPKSDSite($1) elsif ( argv =~ /^--mew/ ) # # run as Mew mode (special mode) # mew_mode=true ARGV.shift # shift away "--mew" mew_arg=ARGV.shift # must be "http://....." if ( mew_arg =~ /^http:\/\// ) if ( mew_arg =~ /^http:\/\/([-A-Za-z0-9._:]+)\// ) # get OpenPKSD site rpk.setOpenPKSDSite($1) end if ( mew_arg =~ /search=([!-~]+@[!-~]+)/) # Email address (if it is there) rpk.setEmailAddress($1) end if ( mew_arg =~ /search=(0x[0-9A-Z]+)/) # KeyID (if it is there) rpk.setKeyid($1) end else print "Mew mode option: uri error\n" exit(1) end end } if ( ! rpk.validParameter ) printf "Invalid option or argument\n" usage() exit(1) end rpk.getPublicKey