# -*- coding: utf-8 -*- # Copyright (c) 2022-2024 tecnovert # Distributed under the MIT software license, see the accompanying # file LICENSE or http://www.opensource.org/licenses/mit-license.php. import html from .util import ( getCoinName, get_data_entry, have_data_entry, get_data_entry_or, ) from basicswap.util import ( toBool, InactiveCoin, ) from basicswap.chainparams import ( Coins, ) def page_settings(self, url_split, post_string): server = self.server swap_client = server.swap_client swap_client.checkSystemStatus() messages = [] err_messages = [] active_tab = 'default' form_data = self.checkForm(post_string, 'settings', err_messages) if form_data: try: if have_data_entry(form_data, 'apply_general'): active_tab = 'general' data = { 'debug': toBool(get_data_entry(form_data, 'debugmode')), 'debug_ui': toBool(get_data_entry(form_data, 'debugui')), 'expire_db_records': toBool(get_data_entry(form_data, 'expire_db_records')), } swap_client.editGeneralSettings(data) elif have_data_entry(form_data, 'apply_chart'): active_tab = 'general' data = { 'show_chart': toBool(get_data_entry(form_data, 'showchart')), 'chart_api_key': html.unescape(get_data_entry_or(form_data, 'chartapikey', '')), 'coingecko_api_key': html.unescape(get_data_entry_or(form_data, 'coingeckoapikey', '')), 'enabled_chart_coins': get_data_entry_or(form_data, 'enabledchartcoins', ''), } swap_client.editGeneralSettings(data) elif have_data_entry(form_data, 'apply_tor'): active_tab = 'tor' # TODO: Detect if running in docker raise ValueError('TODO: If running in docker see doc/tor.md to enable/disable tor.') for name, c in swap_client.settings['chainclients'].items(): if have_data_entry(form_data, 'apply_' + name): data = {'lookups': get_data_entry(form_data, 'lookups_' + name)} if name == 'monero': data['fee_priority'] = int(get_data_entry(form_data, 'fee_priority_' + name)) data['manage_daemon'] = True if get_data_entry(form_data, 'managedaemon_' + name) == 'true' else False data['rpchost'] = get_data_entry(form_data, 'rpchost_' + name) data['rpcport'] = int(get_data_entry(form_data, 'rpcport_' + name)) data['remotedaemonurls'] = get_data_entry_or(form_data, 'remotedaemonurls_' + name, '') data['automatically_select_daemon'] = True if get_data_entry(form_data, 'autosetdaemon_' + name) == 'true' else False else: data['conf_target'] = int(get_data_entry(form_data, 'conf_target_' + name)) if name == 'particl': data['anon_tx_ring_size'] = int(get_data_entry(form_data, 'rct_ring_size_' + name)) settings_changed, suggest_reboot = swap_client.editSettings(name, data) if settings_changed is True: messages.append('Settings applied.') if suggest_reboot is True: messages.append('Please restart BasicSwap.') elif have_data_entry(form_data, 'enable_' + name): swap_client.enableCoin(name) display_name = getCoinName(swap_client.getCoinIdFromName(name)) messages.append(display_name + ' enabled, shutting down.') swap_client.stopRunning() elif have_data_entry(form_data, 'disable_' + name): swap_client.disableCoin(name) display_name = getCoinName(swap_client.getCoinIdFromName(name)) messages.append(display_name + ' disabled, shutting down.') swap_client.stopRunning() except InactiveCoin as ex: err_messages.append('InactiveCoin {}'.format(Coins(ex.coinid).name)) except Exception as e: err_messages.append(str(e)) chains_formatted = [] sorted_names = sorted(swap_client.settings['chainclients'].keys()) for name in sorted_names: c = swap_client.settings['chainclients'][name] try: display_name = getCoinName(swap_client.getCoinIdFromName(name)) except Exception: display_name = name chains_formatted.append({ 'name': name, 'display_name': display_name, 'lookups': c.get('chain_lookups', 'local'), 'manage_daemon': c.get('manage_daemon', 'Unknown'), 'connection_type': c.get('connection_type', 'Unknown'), }) if name == 'monero': chains_formatted[-1]['fee_priority'] = c.get('fee_priority', 0) chains_formatted[-1]['manage_wallet_daemon'] = c.get('manage_wallet_daemon', 'Unknown') chains_formatted[-1]['rpchost'] = c.get('rpchost', 'localhost') chains_formatted[-1]['rpcport'] = int(c.get('rpcport', 18081)) chains_formatted[-1]['remotedaemonurls'] = '\n'.join(c.get('remote_daemon_urls', [])) chains_formatted[-1]['autosetdaemon'] = c.get('automatically_select_daemon', False) else: chains_formatted[-1]['conf_target'] = c.get('conf_target', 2) if name == 'particl': chains_formatted[-1]['anon_tx_ring_size'] = c.get('anon_tx_ring_size', 12) else: if c.get('connection_type', 'Unknown') == 'none': if 'connection_type_prev' in c: chains_formatted[-1]['can_reenable'] = True else: chains_formatted[-1]['can_disable'] = True general_settings = { 'debug': swap_client.debug, 'debug_ui': swap_client.debug_ui, 'expire_db_records': swap_client._expire_db_records, } if 'chart_api_key_enc' in swap_client.settings: chart_api_key = html.escape(bytes.fromhex(swap_client.settings.get('chart_api_key_enc', '')).decode('utf-8')) else: chart_api_key = swap_client.settings.get('chart_api_key', '') if 'coingecko_api_key_enc' in swap_client.settings: coingecko_api_key = html.escape(bytes.fromhex(swap_client.settings.get('coingecko_api_key_enc', '')).decode('utf-8')) else: coingecko_api_key = swap_client.settings.get('coingecko_api_key', '') chart_settings = { 'show_chart': swap_client.settings.get('show_chart', True), 'chart_api_key': chart_api_key, 'coingecko_api_key': coingecko_api_key, 'enabled_chart_coins': swap_client.settings.get('enabled_chart_coins', ''), } tor_control_password = '' if swap_client.tor_control_password is None else swap_client.tor_control_password tor_settings = { 'use_tor': swap_client.use_tor_proxy, 'proxy_host': swap_client.tor_proxy_host, 'proxy_port': swap_client.tor_proxy_port, 'control_password': html.escape(tor_control_password), 'control_port': swap_client.tor_control_port, } template = server.env.get_template('settings.html') return self.render_template(template, { 'messages': messages, 'err_messages': err_messages, 'summary': swap_client.getSummary(), 'chains': chains_formatted, 'general_settings': general_settings, 'chart_settings': chart_settings, 'tor_settings': tor_settings, 'active_tab': active_tab, })