From 7e8653e879a0ac7c4957532685c27840ff51ec26 Mon Sep 17 00:00:00 2001 From: Liquid369 Date: Fri, 13 Sep 2024 08:56:23 -0500 Subject: [PATCH 1/4] Use certifi package for SSL Certificates --- src/blockbookClient.py | 3 ++- src/cryptoIDClient.py | 3 ++- src/misc.py | 3 ++- src/rpcClient.py | 5 ++++- 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/blockbookClient.py b/src/blockbookClient.py index 66f96aa..23fb1ce 100644 --- a/src/blockbookClient.py +++ b/src/blockbookClient.py @@ -5,6 +5,7 @@ # file LICENSE.txt or http://www.opensource.org/licenses/mit-license.php. import requests +import certifi from misc import getCallerName, getFunctionName, printException @@ -45,7 +46,7 @@ def checkResponse(self, method, param=""): url = f"{self.url}/api/{method}" if param != "": url += "/{param}" - resp = requests.get(url, data={}, verify=True) + resp = requests.get(url, data={}, verify=certifi.where()) if resp.status_code == 200: data = resp.json() return data diff --git a/src/cryptoIDClient.py b/src/cryptoIDClient.py index 45fb180..f130a0f 100644 --- a/src/cryptoIDClient.py +++ b/src/cryptoIDClient.py @@ -6,6 +6,7 @@ from random import choice import requests +import certifi from misc import getCallerName, getFunctionName, printException @@ -51,7 +52,7 @@ def __init__(self, isTestnet=False): def checkResponse(self, parameters): key = choice(api_keys) parameters['key'] = key - resp = requests.get(self.url, params=parameters) + resp = requests.get(self.url, params=parameters, verify=certifi.where()) if resp.status_code == 200: data = resp.json() return data diff --git a/src/misc.py b/src/misc.py index 36eb0af..e766e67 100644 --- a/src/misc.py +++ b/src/misc.py @@ -191,8 +191,9 @@ def getFunctionName(inDecorator=False): def getRemoteSPMTversion(): import requests + import certifi try: - resp = requests.get("https://raw.githubusercontent.com/PIVX-Project/PIVX-SPMT/master/src/version.txt") + resp = requests.get("https://raw.githubusercontent.com/PIVX-Project/PIVX-SPMT/master/src/version.txt", verify=certifi.where()) if resp.status_code == 200: data = resp.json() return data['number'] diff --git a/src/rpcClient.py b/src/rpcClient.py index f29774d..cba29f7 100644 --- a/src/rpcClient.py +++ b/src/rpcClient.py @@ -9,6 +9,7 @@ import http.client as httplib import ssl import threading +import certifi from constants import DEFAULT_PROTOCOL_VERSION, MINIMUM_FEE from misc import getCallerName, getFunctionName, printException, printDbg, now, timeThis @@ -50,7 +51,9 @@ def __init__(self, rpc_protocol, rpc_host, rpc_user, rpc_password): host, port = rpc_host.split(":") if rpc_protocol == "https": - self.httpConnection = httplib.HTTPSConnection(host, port, timeout=20, context=ssl.create_default_context()) + ssl_context = ssl.create_default_context() + ssl_context.load_verify_locations(cafile=certifi.where()) + self.httpConnection = httplib.HTTPSConnection(host, port, timeout=20, context=ssl_context) else: self.httpConnection = httplib.HTTPConnection(host, port, timeout=20) From 230227f1e9e4a9c326fe7c2d83214fd0b8130ad1 Mon Sep 17 00:00:00 2001 From: Liquid369 Date: Fri, 13 Sep 2024 09:31:00 -0500 Subject: [PATCH 2/4] Update handling HTTP/HTTPS connections --- src/rpcClient.py | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/src/rpcClient.py b/src/rpcClient.py index cba29f7..7cb84d8 100644 --- a/src/rpcClient.py +++ b/src/rpcClient.py @@ -19,7 +19,9 @@ def process_RPC_exceptions(func): def wrapper(*args, **kwargs): try: - args[0].httpConnection.connect() + # If httpConnection exists, connect manually + if hasattr(args[0], 'httpConnection') and args[0].httpConnection: + args[0].httpConnection.connect() return func(*args, **kwargs) except Exception as e: message = "Exception in RPC client" @@ -33,11 +35,13 @@ def wrapper(*args, **kwargs): else: return None finally: - try: - args[0].httpConnection.close() - except Exception as e: - printDbg(e) - pass + # If httpConnection exists, close it + if hasattr(args[0], 'httpConnection') and args[0].httpConnection: + try: + args[0].httpConnection.close() + except Exception as e: + printDbg(e) + pass return wrapper @@ -49,15 +53,8 @@ def __init__(self, rpc_protocol, rpc_host, rpc_user, rpc_password): self.rpc_url = f"{rpc_protocol}://{rpc_user}:{rpc_password}@{rpc_host}" - host, port = rpc_host.split(":") - if rpc_protocol == "https": - ssl_context = ssl.create_default_context() - ssl_context.load_verify_locations(cafile=certifi.where()) - self.httpConnection = httplib.HTTPSConnection(host, port, timeout=20, context=ssl_context) - else: - self.httpConnection = httplib.HTTPConnection(host, port, timeout=20) - self.conn = AuthServiceProxy(self.rpc_url, timeout=1000, connection=self.httpConnection) + self.conn = AuthServiceProxy(self.rpc_url, timeout=1000) @process_RPC_exceptions def getBlockCount(self): From b4ca69e0e4972bc5c26847a31ef0cb2a861298f8 Mon Sep 17 00:00:00 2001 From: Liquid369 Date: Fri, 13 Sep 2024 09:31:22 -0500 Subject: [PATCH 3/4] Fix response time division issue if 'None' --- src/mainWindow.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/mainWindow.py b/src/mainWindow.py index a934da9..f79668f 100644 --- a/src/mainWindow.py +++ b/src/mainWindow.py @@ -522,7 +522,10 @@ def updateRPCstatus(self, ctrl, fDebug=False): return rpcResponseTime = None - if r_time1 is not None and r_time2 != 0: + if r_time1 is None: + r_time1 = 0.0 + if r_time2 is None: + r_time2 = 0.0 rpcResponseTime = round((r_time1 + r_time2) / 2, 3) # Do not update status if the user has selected a different server since the start of updateRPCStatus() From 1f646d7f980db1588c9a2f0ed09d7f366af70e64 Mon Sep 17 00:00:00 2001 From: Liquid369 Date: Wed, 18 Sep 2024 08:06:04 -0500 Subject: [PATCH 4/4] Fix imports --- src/rpcClient.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/rpcClient.py b/src/rpcClient.py index 7cb84d8..a2d91af 100644 --- a/src/rpcClient.py +++ b/src/rpcClient.py @@ -5,11 +5,7 @@ # file LICENSE.txt or http://www.opensource.org/licenses/mit-license.php. from bitcoinrpc.authproxy import AuthServiceProxy - -import http.client as httplib -import ssl import threading -import certifi from constants import DEFAULT_PROTOCOL_VERSION, MINIMUM_FEE from misc import getCallerName, getFunctionName, printException, printDbg, now, timeThis