move make_payment_request to lib

This commit is contained in:
ThomasV 2015-04-05 18:57:00 +02:00
parent 1a76842730
commit be5731d463
2 changed files with 32 additions and 30 deletions

View File

@ -30,7 +30,7 @@ import urlparse
import requests import requests
try: try:
import paymentrequest_pb2 import paymentrequest_pb2 as pb2
except ImportError: except ImportError:
sys.exit("Error: could not find paymentrequest_pb2.py. Create it with 'protoc --proto_path=lib/ --python_out=lib/ lib/paymentrequest.proto'") sys.exit("Error: could not find paymentrequest_pb2.py. Create it with 'protoc --proto_path=lib/ --python_out=lib/ lib/paymentrequest.proto'")
@ -101,7 +101,7 @@ class PaymentRequest:
def parse(self, r): def parse(self, r):
try: try:
self.data = paymentrequest_pb2.PaymentRequest() self.data = pb2.PaymentRequest()
self.data.ParseFromString(r) self.data.ParseFromString(r)
except: except:
self.error = "cannot parse payment request" self.error = "cannot parse payment request"
@ -119,7 +119,7 @@ class PaymentRequest:
self.error = "No signature" self.error = "No signature"
return return
cert = paymentrequest_pb2.X509Certificates() cert = pb2.X509Certificates()
cert.ParseFromString(paymntreq.pki_data) cert.ParseFromString(paymntreq.pki_data)
cert_num = len(cert.certificate) cert_num = len(cert.certificate)
@ -209,7 +209,7 @@ class PaymentRequest:
return False return False
### SIG Verified ### SIG Verified
self.details = pay_det = paymentrequest_pb2.PaymentDetails() self.details = pay_det = pb2.PaymentDetails()
self.details.ParseFromString(paymntreq.serialized_payment_details) self.details.ParseFromString(paymntreq.serialized_payment_details)
for o in pay_det.outputs: for o in pay_det.outputs:
@ -278,7 +278,7 @@ class PaymentRequest:
return False, r.reason return False, r.reason
try: try:
paymntack = paymentrequest_pb2.PaymentACK() paymntack = pb2.PaymentACK()
paymntack.ParseFromString(r.content) paymntack.ParseFromString(r.content)
except Exception: except Exception:
return False, "PaymentACK could not be processed. Payment was sent; please manually verify that payment was received." return False, "PaymentACK could not be processed. Payment was sent; please manually verify that payment was received."
@ -288,6 +288,29 @@ class PaymentRequest:
def make_payment_request(amount, script, memo, rsakey=None):
"""Generates a http PaymentRequest object"""
pd = pb2.PaymentDetails()
pd.outputs.add(amount=amount, script=script)
now = int(time.time())
pd.time = now
pd.expires = now + 15*60
pd.memo = memo
#pd.payment_url = 'http://payment_ack.url'
pr = pb2.PaymentRequest()
pr.serialized_payment_details = pd.SerializeToString()
pr.signature = ''
if rsakey:
pr.pki_type = 'x509+sha256'
pr.pki_data = certificates.SerializeToString()
msgBytes = bytearray(pr.SerializeToString())
hashBytes = bytearray(hashlib.sha256(msgBytes).digest())
sig = rsakey.sign(x509.PREFIX_RSA_SHA256 + hashBytes)
pr.signature = bytes(sig)
return pr.SerializeToString()
if __name__ == "__main__": if __name__ == "__main__":
util.set_verbosity(True) util.set_verbosity(True)

View File

@ -4,11 +4,11 @@ import tlslite
import time import time
import hashlib import hashlib
from electrum import paymentrequest_pb2 as pb2
from electrum.transaction import Transaction from electrum.transaction import Transaction
from electrum import bitcoin from electrum import bitcoin
from electrum import x509 from electrum import x509
from electrum import paymentrequest
from electrum import paymentrequest_pb2 as pb2
chain_file = 'mychain.pem' chain_file = 'mychain.pem'
cert_file = 'mycert.pem' cert_file = 'mycert.pem'
@ -28,31 +28,10 @@ certificates.certificate.extend(map(lambda x: str(x.bytes), chain.x509List))
with open(cert_file, 'r') as f: with open(cert_file, 'r') as f:
rsakey = tlslite.utils.python_rsakey.Python_RSAKey.parsePEM(f.read()) rsakey = tlslite.utils.python_rsakey.Python_RSAKey.parsePEM(f.read())
def make_payment_request(amount, script, memo):
"""Generates a http PaymentRequest object"""
pd = pb2.PaymentDetails()
pd.outputs.add(amount=amount, script=script)
now = int(time.time())
pd.time = now
pd.expires = now + 15*60
pd.memo = memo
pd.payment_url = 'http://payment_ack.url'
pr = pb2.PaymentRequest()
pr.serialized_payment_details = pd.SerializeToString()
pr.pki_type = 'x509+sha256'
pr.pki_data = certificates.SerializeToString()
pr.signature = ''
msgBytes = bytearray(pr.SerializeToString())
hashBytes = bytearray(hashlib.sha256(msgBytes).digest())
sig = rsakey.sign(x509.PREFIX_RSA_SHA256 + hashBytes)
pr.signature = bytes(sig)
return pr.SerializeToString()
script = Transaction.pay_script('address', address).decode('hex') script = Transaction.pay_script('address', address).decode('hex')
pr_string = make_payment_request(amount, script, memo) pr_string = paymentrequest.make_payment_request(amount, script, memo, rsakey)
with open(out_file,'wb') as f: with open(out_file,'wb') as f:
f.write(pr_string) f.write(pr_string)