|
|
@ -14,15 +14,15 @@ except: |
|
|
|
print "protoc --proto_path=lib/ --python_out=lib/ lib/paymentrequest.proto" |
|
|
|
raise Exception() |
|
|
|
|
|
|
|
import urlparse |
|
|
|
import requests |
|
|
|
from M2Crypto import X509 |
|
|
|
try: |
|
|
|
import requests |
|
|
|
except ImportError: |
|
|
|
sys.exit("Error: requests does not seem to be installed. Try 'sudo pip install requests'") |
|
|
|
|
|
|
|
import bitcoin |
|
|
|
from bitcoin import is_valid |
|
|
|
import urlparse |
|
|
|
|
|
|
|
|
|
|
|
import bitcoin |
|
|
|
import util |
|
|
|
import transaction |
|
|
|
|
|
|
@ -39,10 +39,24 @@ PR_PAID = 3 # send and propagated |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ca_path = os.path.expanduser("~/.electrum/ca/ca-bundle.crt") |
|
|
|
ca_list = {} |
|
|
|
try: |
|
|
|
with open(ca_path, 'r') as ca_f: |
|
|
|
|
|
|
|
def load_certificates(): |
|
|
|
try: |
|
|
|
from M2Crypto import X509 |
|
|
|
except: |
|
|
|
print_error("ERROR: Could not import M2Crypto") |
|
|
|
return False |
|
|
|
|
|
|
|
ca_path = os.path.expanduser("~/.electrum/ca/ca-bundle.crt") |
|
|
|
try: |
|
|
|
ca_f = open(ca_path, 'r') |
|
|
|
except Exception: |
|
|
|
print "ERROR: Could not open %s"%ca_path |
|
|
|
print "ca-bundle.crt file should be placed in ~/.electrum/ca/ca-bundle.crt" |
|
|
|
print "Documentation on how to download or create the file here: http://curl.haxx.se/docs/caextract.html" |
|
|
|
print "Payment will continue with manual verification." |
|
|
|
return False |
|
|
|
c = "" |
|
|
|
for line in ca_f: |
|
|
|
if line == "-----BEGIN CERTIFICATE-----\n": |
|
|
@ -52,16 +66,13 @@ try: |
|
|
|
if line == "-----END CERTIFICATE-----\n": |
|
|
|
x = X509.load_cert_string(c) |
|
|
|
ca_list[x.get_fingerprint()] = x |
|
|
|
except Exception: |
|
|
|
print "ERROR: Could not open %s"%ca_path |
|
|
|
print "ca-bundle.crt file should be placed in ~/.electrum/ca/ca-bundle.crt" |
|
|
|
print "Documentation on how to download or create the file here: http://curl.haxx.se/docs/caextract.html" |
|
|
|
print "Payment will continue with manual verification." |
|
|
|
raise Exception() |
|
|
|
ca_f.close() |
|
|
|
return True |
|
|
|
|
|
|
|
load_certificates() |
|
|
|
|
|
|
|
class PaymentRequest: |
|
|
|
|
|
|
|
class PaymentRequest: |
|
|
|
def __init__(self, config): |
|
|
|
self.config = config |
|
|
|
self.outputs = [] |
|
|
@ -72,7 +83,6 @@ class PaymentRequest: |
|
|
|
|
|
|
|
u = urlparse.urlparse(url) |
|
|
|
self.domain = u.netloc |
|
|
|
|
|
|
|
try: |
|
|
|
connection = httplib.HTTPConnection(u.netloc) if u.scheme == 'http' else httplib.HTTPSConnection(u.netloc) |
|
|
|
connection.request("GET",u.geturl(), headers=REQUEST_HEADERS) |
|
|
@ -107,6 +117,16 @@ class PaymentRequest: |
|
|
|
|
|
|
|
|
|
|
|
def verify(self): |
|
|
|
try: |
|
|
|
from M2Crypto import X509 |
|
|
|
except: |
|
|
|
self.error = "cannot import M2Crypto" |
|
|
|
return False |
|
|
|
|
|
|
|
if not ca_list: |
|
|
|
self.error = "Trusted certificate authorities list not found" |
|
|
|
return False |
|
|
|
|
|
|
|
paymntreq = self.data |
|
|
|
sig = paymntreq.signature |
|
|
|
if not sig: |
|
|
|