mirror of
https://github.com/basicswap/basicswap.git
synced 2025-01-03 17:29:26 +00:00
Tor working for Bitcoin forks.
This commit is contained in:
parent
d1e015962c
commit
a5b192b931
11 changed files with 220 additions and 92 deletions
|
@ -1,11 +1,14 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
# Copyright (c) 2019-2021 tecnovert
|
# Copyright (c) 2019-2022 tecnovert
|
||||||
# Distributed under the MIT software license, see the accompanying
|
# Distributed under the MIT software license, see the accompanying
|
||||||
# file LICENSE or http://www.opensource.org/licenses/mit-license.php.
|
# file LICENSE or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import shlex
|
import shlex
|
||||||
|
import socks
|
||||||
|
import socket
|
||||||
|
import urllib
|
||||||
import logging
|
import logging
|
||||||
import threading
|
import threading
|
||||||
import subprocess
|
import subprocess
|
||||||
|
@ -25,6 +28,10 @@ from .chainparams import (
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def getaddrinfo_tor(*args):
|
||||||
|
return [(socket.AF_INET, socket.SOCK_STREAM, 6, "", (args[0], args[1]))]
|
||||||
|
|
||||||
|
|
||||||
class BaseApp:
|
class BaseApp:
|
||||||
def __init__(self, fp, data_dir, settings, chain, log_name='BasicSwap'):
|
def __init__(self, fp, data_dir, settings, chain, log_name='BasicSwap'):
|
||||||
self.log_name = log_name
|
self.log_name = log_name
|
||||||
|
@ -44,6 +51,15 @@ class BaseApp:
|
||||||
self.prepareLogging()
|
self.prepareLogging()
|
||||||
self.log.info('Network: {}'.format(self.chain))
|
self.log.info('Network: {}'.format(self.chain))
|
||||||
|
|
||||||
|
self.use_tor_proxy = self.settings.get('use_tor', False)
|
||||||
|
self.tor_proxy_host = self.settings.get('tor_proxy_host', '127.0.0.1')
|
||||||
|
self.tor_proxy_port = self.settings.get('tor_proxy_port', 9050)
|
||||||
|
self.tor_control_password = self.settings.get('tor_control_password', None)
|
||||||
|
self.tor_control_port = self.settings.get('tor_control_port', 9051)
|
||||||
|
self.default_socket = socket.socket
|
||||||
|
self.default_socket_timeout = socket.getdefaulttimeout()
|
||||||
|
self.default_socket_getaddrinfo = socket.getaddrinfo
|
||||||
|
|
||||||
def stopRunning(self, with_code=0):
|
def stopRunning(self, with_code=0):
|
||||||
self.fail_code = with_code
|
self.fail_code = with_code
|
||||||
with self.mxDB:
|
with self.mxDB:
|
||||||
|
@ -139,3 +155,38 @@ class BaseApp:
|
||||||
return True
|
return True
|
||||||
str_error = str(ex).lower()
|
str_error = str(ex).lower()
|
||||||
return 'read timed out' in str_error or 'no connection to daemon' in str_error
|
return 'read timed out' in str_error or 'no connection to daemon' in str_error
|
||||||
|
|
||||||
|
def setConnectionParameters(self, timeout=120):
|
||||||
|
opener = urllib.request.build_opener()
|
||||||
|
opener.addheaders = [('User-agent', 'Mozilla/5.0')]
|
||||||
|
urllib.request.install_opener(opener)
|
||||||
|
|
||||||
|
if self.use_tor_proxy:
|
||||||
|
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, self.tor_proxy_host, self.tor_proxy_port, rdns=True)
|
||||||
|
socket.socket = socks.socksocket
|
||||||
|
socket.getaddrinfo = getaddrinfo_tor # Without this accessing .onion links would fail
|
||||||
|
|
||||||
|
socket.setdefaulttimeout(timeout)
|
||||||
|
|
||||||
|
def popConnectionParameters(self):
|
||||||
|
if self.use_tor_proxy:
|
||||||
|
socket.socket = self.default_socket
|
||||||
|
socket.getaddrinfo = self.default_socket_getaddrinfo
|
||||||
|
socket.setdefaulttimeout(self.default_socket_timeout)
|
||||||
|
|
||||||
|
def torControl(self, query):
|
||||||
|
try:
|
||||||
|
command = 'AUTHENTICATE "{}"\r\n{}\r\nQUIT\r\n'.format(self.tor_control_password, query).encode('utf-8')
|
||||||
|
c = socket.create_connection((self.tor_proxy_host, self.tor_control_port))
|
||||||
|
c.send(command)
|
||||||
|
response = bytearray()
|
||||||
|
while True:
|
||||||
|
rv = c.recv(1024)
|
||||||
|
if not rv:
|
||||||
|
break
|
||||||
|
response += rv
|
||||||
|
c.close()
|
||||||
|
return response
|
||||||
|
except Exception as e:
|
||||||
|
self.log.error(f'torControl {e}')
|
||||||
|
return
|
||||||
|
|
|
@ -5659,74 +5659,78 @@ class BasicSwap(BaseApp):
|
||||||
|
|
||||||
def lookupRates(self, coin_from, coin_to):
|
def lookupRates(self, coin_from, coin_to):
|
||||||
self.log.debug('lookupRates {}, {}'.format(coin_from, coin_to))
|
self.log.debug('lookupRates {}, {}'.format(coin_from, coin_to))
|
||||||
rv = {}
|
try:
|
||||||
ci_from = self.ci(int(coin_from))
|
self.setConnectionParameters()
|
||||||
ci_to = self.ci(int(coin_to))
|
rv = {}
|
||||||
|
ci_from = self.ci(int(coin_from))
|
||||||
|
ci_to = self.ci(int(coin_to))
|
||||||
|
|
||||||
headers = {'Connection': 'close'}
|
headers = {'Connection': 'close'}
|
||||||
name_from = ci_from.chainparams()['name']
|
name_from = ci_from.chainparams()['name']
|
||||||
name_to = ci_to.chainparams()['name']
|
name_to = ci_to.chainparams()['name']
|
||||||
url = 'https://api.coingecko.com/api/v3/simple/price?ids={},{}&vs_currencies=usd'.format(name_from, name_to)
|
url = 'https://api.coingecko.com/api/v3/simple/price?ids={},{}&vs_currencies=usd'.format(name_from, name_to)
|
||||||
start = time.time()
|
|
||||||
req = urllib.request.Request(url, headers=headers)
|
|
||||||
js = json.loads(urllib.request.urlopen(req, timeout=10).read())
|
|
||||||
js['time_taken'] = time.time() - start
|
|
||||||
rate = float(js[name_from]['usd']) / float(js[name_to]['usd'])
|
|
||||||
js['rate_inferred'] = ci_to.format_amount(rate, conv_int=True, r=1)
|
|
||||||
rv['coingecko'] = js
|
|
||||||
|
|
||||||
ticker_from = ci_from.chainparams()['ticker']
|
|
||||||
ticker_to = ci_to.chainparams()['ticker']
|
|
||||||
if ci_from.coin_type() == Coins.BTC:
|
|
||||||
pair = '{}-{}'.format(ticker_from, ticker_to)
|
|
||||||
url = 'https://api.bittrex.com/api/v1.1/public/getticker?market=' + pair
|
|
||||||
start = time.time()
|
start = time.time()
|
||||||
req = urllib.request.Request(url, headers=headers)
|
req = urllib.request.Request(url, headers=headers)
|
||||||
js = json.loads(urllib.request.urlopen(req, timeout=10).read())
|
js = json.loads(urllib.request.urlopen(req, timeout=10).read())
|
||||||
js['time_taken'] = time.time() - start
|
js['time_taken'] = time.time() - start
|
||||||
js['pair'] = pair
|
rate = float(js[name_from]['usd']) / float(js[name_to]['usd'])
|
||||||
|
js['rate_inferred'] = ci_to.format_amount(rate, conv_int=True, r=1)
|
||||||
|
rv['coingecko'] = js
|
||||||
|
|
||||||
try:
|
ticker_from = ci_from.chainparams()['ticker']
|
||||||
rate_inverted = ci_from.make_int(1.0 / float(js['result']['Last']), r=1)
|
ticker_to = ci_to.chainparams()['ticker']
|
||||||
js['rate_inferred'] = ci_to.format_amount(rate_inverted)
|
if ci_from.coin_type() == Coins.BTC:
|
||||||
except Exception as e:
|
pair = '{}-{}'.format(ticker_from, ticker_to)
|
||||||
self.log.warning('lookupRates error: %s', str(e))
|
url = 'https://api.bittrex.com/api/v1.1/public/getticker?market=' + pair
|
||||||
js['rate_inferred'] = 'error'
|
start = time.time()
|
||||||
|
req = urllib.request.Request(url, headers=headers)
|
||||||
|
js = json.loads(urllib.request.urlopen(req, timeout=10).read())
|
||||||
|
js['time_taken'] = time.time() - start
|
||||||
|
js['pair'] = pair
|
||||||
|
|
||||||
rv['bittrex'] = js
|
try:
|
||||||
elif ci_to.coin_type() == Coins.BTC:
|
rate_inverted = ci_from.make_int(1.0 / float(js['result']['Last']), r=1)
|
||||||
pair = '{}-{}'.format(ticker_to, ticker_from)
|
js['rate_inferred'] = ci_to.format_amount(rate_inverted)
|
||||||
url = 'https://api.bittrex.com/api/v1.1/public/getticker?market=' + pair
|
except Exception as e:
|
||||||
start = time.time()
|
self.log.warning('lookupRates error: %s', str(e))
|
||||||
req = urllib.request.Request(url, headers=headers)
|
js['rate_inferred'] = 'error'
|
||||||
js = json.loads(urllib.request.urlopen(req, timeout=10).read())
|
|
||||||
js['time_taken'] = time.time() - start
|
|
||||||
js['pair'] = pair
|
|
||||||
js['rate_last'] = js['result']['Last']
|
|
||||||
rv['bittrex'] = js
|
|
||||||
else:
|
|
||||||
pair = 'BTC-{}'.format(ticker_from)
|
|
||||||
url = 'https://api.bittrex.com/api/v1.1/public/getticker?market=' + pair
|
|
||||||
start = time.time()
|
|
||||||
req = urllib.request.Request(url, headers=headers)
|
|
||||||
js_from = json.loads(urllib.request.urlopen(req, timeout=10).read())
|
|
||||||
js_from['time_taken'] = time.time() - start
|
|
||||||
js_from['pair'] = pair
|
|
||||||
|
|
||||||
pair = 'BTC-{}'.format(ticker_to)
|
rv['bittrex'] = js
|
||||||
url = 'https://api.bittrex.com/api/v1.1/public/getticker?market=' + pair
|
elif ci_to.coin_type() == Coins.BTC:
|
||||||
start = time.time()
|
pair = '{}-{}'.format(ticker_to, ticker_from)
|
||||||
req = urllib.request.Request(url, headers=headers)
|
url = 'https://api.bittrex.com/api/v1.1/public/getticker?market=' + pair
|
||||||
js_to = json.loads(urllib.request.urlopen(req, timeout=10).read())
|
start = time.time()
|
||||||
js_to['time_taken'] = time.time() - start
|
req = urllib.request.Request(url, headers=headers)
|
||||||
js_to['pair'] = pair
|
js = json.loads(urllib.request.urlopen(req, timeout=10).read())
|
||||||
|
js['time_taken'] = time.time() - start
|
||||||
|
js['pair'] = pair
|
||||||
|
js['rate_last'] = js['result']['Last']
|
||||||
|
rv['bittrex'] = js
|
||||||
|
else:
|
||||||
|
pair = 'BTC-{}'.format(ticker_from)
|
||||||
|
url = 'https://api.bittrex.com/api/v1.1/public/getticker?market=' + pair
|
||||||
|
start = time.time()
|
||||||
|
req = urllib.request.Request(url, headers=headers)
|
||||||
|
js_from = json.loads(urllib.request.urlopen(req, timeout=10).read())
|
||||||
|
js_from['time_taken'] = time.time() - start
|
||||||
|
js_from['pair'] = pair
|
||||||
|
|
||||||
try:
|
pair = 'BTC-{}'.format(ticker_to)
|
||||||
rate_inferred = float(js_from['result']['Last']) / float(js_to['result']['Last'])
|
url = 'https://api.bittrex.com/api/v1.1/public/getticker?market=' + pair
|
||||||
rate_inferred = ci_to.format_amount(rate, conv_int=True, r=1)
|
start = time.time()
|
||||||
except Exception as e:
|
req = urllib.request.Request(url, headers=headers)
|
||||||
rate_inferred = 'error'
|
js_to = json.loads(urllib.request.urlopen(req, timeout=10).read())
|
||||||
|
js_to['time_taken'] = time.time() - start
|
||||||
|
js_to['pair'] = pair
|
||||||
|
|
||||||
rv['bittrex'] = {'from': js_from, 'to': js_to, 'rate_inferred': rate_inferred}
|
try:
|
||||||
|
rate_inferred = float(js_from['result']['Last']) / float(js_to['result']['Last'])
|
||||||
|
rate_inferred = ci_to.format_amount(rate, conv_int=True, r=1)
|
||||||
|
except Exception as e:
|
||||||
|
rate_inferred = 'error'
|
||||||
|
|
||||||
return rv
|
rv['bittrex'] = {'from': js_from, 'to': js_to, 'rate_inferred': rate_inferred}
|
||||||
|
|
||||||
|
return rv
|
||||||
|
finally:
|
||||||
|
self.popConnectionParameters()
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
# Copyright (c) 2019-2021 tecnovert
|
# Copyright (c) 2019-2022 tecnovert
|
||||||
# Distributed under the MIT software license, see the accompanying
|
# Distributed under the MIT software license, see the accompanying
|
||||||
# file LICENSE or http://www.opensource.org/licenses/mit-license.php.
|
# file LICENSE or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
|
||||||
|
@ -17,9 +17,12 @@ class Explorer():
|
||||||
|
|
||||||
def readURL(self, url):
|
def readURL(self, url):
|
||||||
self.log.debug('Explorer url: {}'.format(url))
|
self.log.debug('Explorer url: {}'.format(url))
|
||||||
headers = {'User-Agent': 'Mozilla/5.0'}
|
try:
|
||||||
req = urllib.request.Request(url, headers=headers)
|
self.swapclient.setConnectionParameters()
|
||||||
return urllib.request.urlopen(req).read()
|
req = urllib.request.Request(url)
|
||||||
|
return urllib.request.urlopen(req).read()
|
||||||
|
finally:
|
||||||
|
self.swapclient.popConnectionParameters()
|
||||||
|
|
||||||
|
|
||||||
class ExplorerInsight(Explorer):
|
class ExplorerInsight(Explorer):
|
||||||
|
|
|
@ -49,7 +49,7 @@ from .js_server import (
|
||||||
js_rate,
|
js_rate,
|
||||||
js_index,
|
js_index,
|
||||||
)
|
)
|
||||||
from .ui import (
|
from .ui.util import (
|
||||||
PAGE_LIMIT,
|
PAGE_LIMIT,
|
||||||
inputAmount,
|
inputAmount,
|
||||||
describeBid,
|
describeBid,
|
||||||
|
@ -59,6 +59,7 @@ from .ui import (
|
||||||
have_data_entry,
|
have_data_entry,
|
||||||
get_data_entry_or,
|
get_data_entry_or,
|
||||||
)
|
)
|
||||||
|
from .ui.page_tor import page_tor
|
||||||
|
|
||||||
|
|
||||||
env = Environment(loader=PackageLoader('basicswap', 'templates'))
|
env = Environment(loader=PackageLoader('basicswap', 'templates'))
|
||||||
|
@ -1421,6 +1422,7 @@ class HttpHandler(BaseHTTPRequestHandler):
|
||||||
h2=self.server.title,
|
h2=self.server.title,
|
||||||
version=__version__,
|
version=__version__,
|
||||||
summary=summary,
|
summary=summary,
|
||||||
|
use_tor_proxy=swap_client.use_tor_proxy,
|
||||||
shutdown_token=shutdown_token
|
shutdown_token=shutdown_token
|
||||||
), 'UTF-8')
|
), 'UTF-8')
|
||||||
|
|
||||||
|
@ -1519,6 +1521,8 @@ class HttpHandler(BaseHTTPRequestHandler):
|
||||||
return self.page_smsgaddresses(url_split, post_string)
|
return self.page_smsgaddresses(url_split, post_string)
|
||||||
if url_split[1] == 'identity':
|
if url_split[1] == 'identity':
|
||||||
return self.page_identity(url_split, post_string)
|
return self.page_identity(url_split, post_string)
|
||||||
|
if url_split[1] == 'tor':
|
||||||
|
return page_tor(self, url_split, post_string)
|
||||||
if url_split[1] == 'shutdown':
|
if url_split[1] == 'shutdown':
|
||||||
return self.page_shutdown(url_split, post_string)
|
return self.page_shutdown(url_split, post_string)
|
||||||
return self.page_index(url_split)
|
return self.page_index(url_split)
|
||||||
|
@ -1562,6 +1566,7 @@ class HttpThread(threading.Thread, HTTPServer):
|
||||||
self.title = 'BasicSwap, ' + self.swap_client.chain
|
self.title = 'BasicSwap, ' + self.swap_client.chain
|
||||||
self.last_form_id = dict()
|
self.last_form_id = dict()
|
||||||
self.session_tokens = dict()
|
self.session_tokens = dict()
|
||||||
|
self.env = env
|
||||||
|
|
||||||
self.timeout = 60
|
self.timeout = 60
|
||||||
HTTPServer.__init__(self, (self.host_name, self.port_no), HttpHandler)
|
HTTPServer.__init__(self, (self.host_name, self.port_no), HttpHandler)
|
||||||
|
|
|
@ -17,7 +17,7 @@ from .basicswap_util import (
|
||||||
from .chainparams import (
|
from .chainparams import (
|
||||||
Coins,
|
Coins,
|
||||||
)
|
)
|
||||||
from .ui import (
|
from .ui.util import (
|
||||||
PAGE_LIMIT,
|
PAGE_LIMIT,
|
||||||
getCoinType,
|
getCoinType,
|
||||||
inputAmount,
|
inputAmount,
|
||||||
|
|
|
@ -13,12 +13,13 @@ Version: {{ version }}
|
||||||
<a href="/explorers">Explorers</a><br/>
|
<a href="/explorers">Explorers</a><br/>
|
||||||
<a href="/smsgaddresses">SMSG Addresses</a><br/>
|
<a href="/smsgaddresses">SMSG Addresses</a><br/>
|
||||||
<br/>
|
<br/>
|
||||||
<a href="/active">Swaps in progress: {{ summary.num_swapping }}</a><br/>
|
<a href="/active">Swaps in Progress: {{ summary.num_swapping }}</a><br/>
|
||||||
<a href="/offers">Network Offers: {{ summary.num_network_offers }}</a><br/>
|
<a href="/offers">Network Offers: {{ summary.num_network_offers }}</a><br/>
|
||||||
<a href="/sentoffers">Sent Offers: {{ summary.num_sent_offers }}</a><br/>
|
<a href="/sentoffers">Sent Offers: {{ summary.num_sent_offers }}</a><br/>
|
||||||
<a href="/bids">Received Bids: {{ summary.num_recv_bids }}</a><br/>
|
<a href="/bids">Received Bids: {{ summary.num_recv_bids }}</a><br/>
|
||||||
<a href="/sentbids">Sent Bids: {{ summary.num_sent_bids }}</a><br/>
|
<a href="/sentbids">Sent Bids: {{ summary.num_sent_bids }}</a><br/>
|
||||||
<a href="/watched">Watched Outputs: {{ summary.num_watched_outputs }}</a><br/>
|
<a href="/watched">Watched Outputs: {{ summary.num_watched_outputs }}</a><br/>
|
||||||
|
{% if use_tor_proxy %} <a href="/tor">TOR Information</a><br/> {% endif %}
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p><a href="/newoffer">New Offer</a></p>
|
<p><a href="/newoffer">New Offer</a></p>
|
||||||
|
|
15
basicswap/templates/tor.html
Normal file
15
basicswap/templates/tor.html
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
{% include 'header.html' %}
|
||||||
|
|
||||||
|
<h3>TOR Information</h3>
|
||||||
|
{% if refresh %}
|
||||||
|
<p>Page Refresh: {{ refresh }} seconds</p>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tr><td>Circuit Established</td><td>{{ data.circuit_established }}</td></tr>
|
||||||
|
<tr><td>Bytes Written</td><td>{{ data.bytes_written }}</td></tr>
|
||||||
|
<tr><td>Bytes Read</td><td>{{ data.bytes_read }}</td></tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<p><a href="/">home</a></p>
|
||||||
|
</body></html>
|
0
basicswap/ui/__init__.py
Normal file
0
basicswap/ui/__init__.py
Normal file
46
basicswap/ui/page_tor.py
Normal file
46
basicswap/ui/page_tor.py
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
# Copyright (c) 2022 tecnovert
|
||||||
|
# Distributed under the MIT software license, see the accompanying
|
||||||
|
# file LICENSE or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
|
||||||
|
import os
|
||||||
|
|
||||||
|
|
||||||
|
def extract_data(bytes_in):
|
||||||
|
str_in = bytes_in.decode('utf-8')
|
||||||
|
start = str_in.find('=')
|
||||||
|
if start < 0:
|
||||||
|
return None
|
||||||
|
start += 1
|
||||||
|
end = str_in.find('\r', start)
|
||||||
|
if end < 0:
|
||||||
|
return None
|
||||||
|
return str_in[start: end]
|
||||||
|
|
||||||
|
|
||||||
|
def page_tor(self, url_split, post_string):
|
||||||
|
template = self.server.env.get_template('tor.html')
|
||||||
|
|
||||||
|
swap_client = self.server.swap_client
|
||||||
|
|
||||||
|
page_data = {}
|
||||||
|
|
||||||
|
rv = swap_client.torControl('GETINFO status/circuit-established')
|
||||||
|
page_data['circuit_established'] = extract_data(rv)
|
||||||
|
|
||||||
|
rv = swap_client.torControl('GETINFO traffic/read')
|
||||||
|
page_data['bytes_written'] = extract_data(rv)
|
||||||
|
|
||||||
|
rv = swap_client.torControl('GETINFO traffic/written')
|
||||||
|
page_data['bytes_read'] = extract_data(rv)
|
||||||
|
|
||||||
|
messages = []
|
||||||
|
|
||||||
|
return bytes(template.render(
|
||||||
|
title=self.server.title,
|
||||||
|
h2=self.server.title,
|
||||||
|
messages=messages,
|
||||||
|
data=page_data,
|
||||||
|
form_id=os.urandom(8).hex(),
|
||||||
|
), 'UTF-8')
|
|
@ -1,19 +1,19 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
# Copyright (c) 2020-2021 tecnovert
|
# Copyright (c) 2020-2022 tecnovert
|
||||||
# Distributed under the MIT software license, see the accompanying
|
# Distributed under the MIT software license, see the accompanying
|
||||||
# file LICENSE or http://www.opensource.org/licenses/mit-license.php.
|
# file LICENSE or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
|
||||||
import json
|
import json
|
||||||
import traceback
|
import traceback
|
||||||
from .util import (
|
from basicswap.util import (
|
||||||
make_int,
|
make_int,
|
||||||
format_timestamp,
|
format_timestamp,
|
||||||
)
|
)
|
||||||
from .chainparams import (
|
from basicswap.chainparams import (
|
||||||
Coins,
|
Coins,
|
||||||
)
|
)
|
||||||
from .basicswap_util import (
|
from basicswap.basicswap_util import (
|
||||||
TxTypes,
|
TxTypes,
|
||||||
TxStates,
|
TxStates,
|
||||||
BidStates,
|
BidStates,
|
||||||
|
@ -26,7 +26,7 @@ from .basicswap_util import (
|
||||||
getLastBidState,
|
getLastBidState,
|
||||||
)
|
)
|
||||||
|
|
||||||
from .protocols.xmr_swap_1 import getChainBSplitKey
|
from basicswap.protocols.xmr_swap_1 import getChainBSplitKey
|
||||||
|
|
||||||
PAGE_LIMIT = 50
|
PAGE_LIMIT = 50
|
||||||
|
|
|
@ -28,6 +28,7 @@ from basicswap.rpc import (
|
||||||
callrpc_cli,
|
callrpc_cli,
|
||||||
waitForRPC,
|
waitForRPC,
|
||||||
)
|
)
|
||||||
|
from basicswap.base import getaddrinfo_tor
|
||||||
from basicswap.basicswap import BasicSwap
|
from basicswap.basicswap import BasicSwap
|
||||||
from basicswap.chainparams import Coins
|
from basicswap.chainparams import Coins
|
||||||
from basicswap.util import toBool
|
from basicswap.util import toBool
|
||||||
|
@ -84,7 +85,7 @@ BTC_RPC_PORT = int(os.getenv('BTC_RPC_PORT', 19796))
|
||||||
NMC_RPC_PORT = int(os.getenv('NMC_RPC_PORT', 19798))
|
NMC_RPC_PORT = int(os.getenv('NMC_RPC_PORT', 19798))
|
||||||
|
|
||||||
PART_ONION_PORT = int(os.getenv('PART_ONION_PORT', 51734))
|
PART_ONION_PORT = int(os.getenv('PART_ONION_PORT', 51734))
|
||||||
LTC_ONION_PORT = int(os.getenv('LTC_ONION_PORT', 19795)) # Still on 0.18 codebase, same port
|
LTC_ONION_PORT = int(os.getenv('LTC_ONION_PORT', 9333)) # Still on 0.18 codebase, same port
|
||||||
BTC_ONION_PORT = int(os.getenv('BTC_ONION_PORT', 8334))
|
BTC_ONION_PORT = int(os.getenv('BTC_ONION_PORT', 8334))
|
||||||
|
|
||||||
PART_RPC_USER = os.getenv('PART_RPC_USER', '')
|
PART_RPC_USER = os.getenv('PART_RPC_USER', '')
|
||||||
|
@ -129,10 +130,6 @@ def make_reporthook():
|
||||||
return reporthook
|
return reporthook
|
||||||
|
|
||||||
|
|
||||||
def getaddrinfo(*args):
|
|
||||||
return [(socket.AF_INET, socket.SOCK_STREAM, 6, "", (args[0], args[1]))]
|
|
||||||
|
|
||||||
|
|
||||||
def setConnectionParameters():
|
def setConnectionParameters():
|
||||||
opener = urllib.request.build_opener()
|
opener = urllib.request.build_opener()
|
||||||
opener.addheaders = [('User-agent', 'Mozilla/5.0')]
|
opener.addheaders = [('User-agent', 'Mozilla/5.0')]
|
||||||
|
@ -141,7 +138,7 @@ def setConnectionParameters():
|
||||||
if use_tor_proxy:
|
if use_tor_proxy:
|
||||||
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, TOR_PROXY_HOST, TOR_PROXY_PORT, rdns=True)
|
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, TOR_PROXY_HOST, TOR_PROXY_PORT, rdns=True)
|
||||||
socket.socket = socks.socksocket
|
socket.socket = socks.socksocket
|
||||||
socket.getaddrinfo = getaddrinfo # Without this accessing .onion links would fail
|
socket.getaddrinfo = getaddrinfo_tor # Without this accessing .onion links would fail
|
||||||
|
|
||||||
# Set low timeout for urlretrieve connections
|
# Set low timeout for urlretrieve connections
|
||||||
socket.setdefaulttimeout(5)
|
socket.setdefaulttimeout(5)
|
||||||
|
@ -386,6 +383,21 @@ def prepareCore(coin, version_pair, settings, data_dir):
|
||||||
extractCore(coin, version_pair, settings, bin_dir, release_path)
|
extractCore(coin, version_pair, settings, bin_dir, release_path)
|
||||||
|
|
||||||
|
|
||||||
|
def writeTorSettings(fp, coin, coin_settings, tor_control_password):
|
||||||
|
onionport = coin_settings['onionport']
|
||||||
|
fp.write(f'proxy={TOR_PROXY_HOST}:{TOR_PROXY_PORT}\n')
|
||||||
|
if coin == 'particl':
|
||||||
|
# TODO: lookuptorcontrolhost is default behaviour in later BTC versions
|
||||||
|
fp.write(f'torpassword={tor_control_password}\n')
|
||||||
|
fp.write(f'torcontrol={TOR_PROXY_HOST}:{TOR_CONTROL_PORT}\n')
|
||||||
|
fp.write('lookuptorcontrolhost=any\n') # Particl only option
|
||||||
|
|
||||||
|
if coin == 'litecoin':
|
||||||
|
fp.write(f'bind=0.0.0.0:{onionport}\n')
|
||||||
|
else:
|
||||||
|
fp.write(f'bind=0.0.0.0:{onionport}=onion\n')
|
||||||
|
|
||||||
|
|
||||||
def prepareDataDir(coin, settings, chain, particl_mnemonic, use_containers=False, tor_control_password=None):
|
def prepareDataDir(coin, settings, chain, particl_mnemonic, use_containers=False, tor_control_password=None):
|
||||||
core_settings = settings['chainclients'][coin]
|
core_settings = settings['chainclients'][coin]
|
||||||
bin_dir = core_settings['bindir']
|
bin_dir = core_settings['bindir']
|
||||||
|
@ -467,12 +479,7 @@ def prepareDataDir(coin, settings, chain, particl_mnemonic, use_containers=False
|
||||||
fp.write('wallet=wallet.dat\n')
|
fp.write('wallet=wallet.dat\n')
|
||||||
|
|
||||||
if tor_control_password is not None:
|
if tor_control_password is not None:
|
||||||
onionport = core_settings['onionport']
|
writeTorSettings(fp, coin, core_settings, tor_control_password)
|
||||||
fp.write(f'proxy={TOR_PROXY_HOST}:{TOR_PROXY_PORT}\n')
|
|
||||||
fp.write(f'torpassword={tor_control_password}\n')
|
|
||||||
fp.write(f'torcontrol={TOR_PROXY_HOST}:{TOR_CONTROL_PORT}\n')
|
|
||||||
# -listen is automatically set in InitParameterInteraction when bind is set
|
|
||||||
fp.write(f'bind=0.0.0.0:{onionport}=onion\n')
|
|
||||||
|
|
||||||
salt = generate_salt(16)
|
salt = generate_salt(16)
|
||||||
if coin == 'particl':
|
if coin == 'particl':
|
||||||
|
@ -523,10 +530,10 @@ def write_torrc(data_dir, tor_control_password):
|
||||||
|
|
||||||
|
|
||||||
def addTorSettings(settings, tor_control_password):
|
def addTorSettings(settings, tor_control_password):
|
||||||
settings['tor_control_password'] = tor_control_password
|
|
||||||
settings['use_tor'] = True
|
settings['use_tor'] = True
|
||||||
settings['tor_proxy_host'] = TOR_PROXY_HOST
|
settings['tor_proxy_host'] = TOR_PROXY_HOST
|
||||||
settings['tor_proxy_port'] = TOR_PROXY_PORT
|
settings['tor_proxy_port'] = TOR_PROXY_PORT
|
||||||
|
settings['tor_control_password'] = tor_control_password
|
||||||
settings['tor_control_port'] = TOR_CONTROL_PORT
|
settings['tor_control_port'] = TOR_CONTROL_PORT
|
||||||
|
|
||||||
|
|
||||||
|
@ -547,7 +554,7 @@ def modify_tor_config(settings, coin, tor_control_password=None, enable=False):
|
||||||
shutil.copyfile(core_conf_path, core_conf_path + '.last')
|
shutil.copyfile(core_conf_path, core_conf_path + '.last')
|
||||||
shutil.copyfile(wallet_conf_path, wallet_conf_path + '.last')
|
shutil.copyfile(wallet_conf_path, wallet_conf_path + '.last')
|
||||||
|
|
||||||
daemon_tor_settings = ('proxy=', 'proxy-allow-dns-leak=', 'no-igd=')
|
daemon_tor_settings = ('proxy=', 'proxy-allow-dns-leaks=', 'no-igd=')
|
||||||
with open(core_conf_path, 'w') as fp:
|
with open(core_conf_path, 'w') as fp:
|
||||||
with open(core_conf_path + '.last') as fp_in:
|
with open(core_conf_path + '.last') as fp_in:
|
||||||
# Disable tor first
|
# Disable tor first
|
||||||
|
@ -613,11 +620,7 @@ def modify_tor_config(settings, coin, tor_control_password=None, enable=False):
|
||||||
if not skip_line:
|
if not skip_line:
|
||||||
fp.write(line)
|
fp.write(line)
|
||||||
if enable:
|
if enable:
|
||||||
onionport = coin_settings['onionport']
|
writeTorSettings(fp, coin, coin_settings, tor_control_password)
|
||||||
fp.write(f'proxy={TOR_PROXY_HOST}:{TOR_PROXY_PORT}\n')
|
|
||||||
fp.write(f'torpassword={tor_control_password}\n')
|
|
||||||
fp.write(f'torcontrol={TOR_PROXY_HOST}:{TOR_CONTROL_PORT}\n')
|
|
||||||
fp.write(f'bind=0.0.0.0:{onionport}=onion\n')
|
|
||||||
|
|
||||||
|
|
||||||
def make_rpc_func(bin_dir, data_dir, chain):
|
def make_rpc_func(bin_dir, data_dir, chain):
|
||||||
|
|
Loading…
Reference in a new issue