#!/usr/bin/env python

import sys
import sha
import optparse
from xmlrpclib import *
from pyme import core, callbacks

p = optparse.OptionParser(usage="usage: %prog [options] <key>")
p.add_option("-g", "--gateway", dest="gateway", metavar="GW",
                          default="http://opendht.nyuld.net:5851/",
                          help="gateway URI, list at http://opendht.org/servers.txt")
p.add_option("-k", "--keyid", dest="keyID", default="", metavar="KEYID",
                          help="your OpenPGP key ID")
p.add_option("-m", "--maxvals", dest="max", default="10", metavar="CNT",
                          type="int", help="how many values to return")
(opts, args) = p.parse_args()
if (len(args) < 1):
    p.print_help()
    sys.exit(1)
if not opts.keyID:
        print "Key ID is mandatory"
        p.print_help()
        sys.exit(1)
attribute = args[0]

key_data = core.Data()
context = core.Context()
context.set_armor(False)
context.op_export(opts.keyID, False, key_data)
key_data.seek(0, 0)
pgp_key = key_data.read()
proxy = ServerProxy(opts.gateway); maxvals = int(opts.max)
pm = Binary("")
key = Binary(sha.new(pgp_key + attribute).digest())
key_for_sig = Binary(sha.new(pgp_key + attribute + ".SIGNATURE").digest())
signatures, pm = proxy.get(key_for_sig, maxvals, pm, "get.py")
vals, pm = proxy.get(key, maxvals, pm, "get.py")
if len(vals) == 0:
    print "No results"
else:
    for val in vals:
        for signature in signatures:
            signed = core.Data(signature.data)
            plain = core.Data(val.data)
            context.op_verify(signed, plain, None)
            result = context.op_verify_result()
            sign = result.signatures
            while sign:
                if sign.status != 0:
                    print "BAD signature from:"
                else:
                    print "Good signature from:"
                print "  uid:        ", context.get_key(sign.fpr, 0).uids.uid
                if sign.timestamp:
                    print "  timestamp:  ", sign.timestamp
                print "  fingerprint:", sign.fpr
                print "Value is \"%s\"" % val
                sign = sign.next


