| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- #!/usr/bin/env python3
- #
- # MMGen Wallet, a terminal-based cryptocurrency wallet
- # Copyright (C)2013-2025 The MMGen Project <mmgen@tuta.io>
- # Licensed under the GNU General Public License, Version 3:
- # https://www.gnu.org/licenses
- # Public project repositories:
- # https://github.com/mmgen/mmgen-wallet
- # https://gitlab.com/mmgen/mmgen-wallet
- """
- test.cmdtest_d.include.proxy: SSH SOCKS proxy runner for the cmdtest.py test suite
- """
- import sys, atexit
- from subprocess import run, PIPE
- from mmgen.util import msg, die, fmt
- from mmgen.util2 import port_in_use
- from ...include.common import omsg
- class TestProxy:
- port = 49237
- no_ssh_errmsg = """
- The SSH daemon must be running and listening on localhost in order to test
- XMR TX relaying via SOCKS proxy. If sshd is not running, please start it.
- Otherwise, add the line 'ListenAddress 127.0.0.1' to your sshd_config, and
- then restart the daemon.
- """
- bad_perm_errmsg = """
- In order to test XMR TX relaying via SOCKS proxy, it’s desirable to enable
- SSH to localhost without a password, which is not currently supported by
- your configuration. Your possible courses of action:
- 1. Continue by answering 'y' at this prompt, and enter your system password
- at the following prompt;
- 2. Exit the test here, add your user SSH public key to your user
- 'authorized_keys' file, and restart the test; or
- 3. Exit the test here, start the SSH SOCKS proxy manually by entering the
- following command, and restart the test:
- {}
- """
- need_start_errmsg = """
- Please start the SSH SOCKS proxy by entering the following command:
- {}
- Then restart the test.
- """
- def kill_proxy(self, args):
- if sys.platform in ('linux', 'darwin'):
- omsg(f'Killing SSH SOCKS server at localhost:{self.port}')
- cmd = ['pkill', '-f', ' '.join(args)]
- run(cmd)
- def __init__(self, cfg, external_call=False):
- def start_proxy():
- if external_call or not cfg.no_daemon_autostart:
- run(a + b2)
- omsg(f'SSH SOCKS server started, listening at localhost:{self.port}')
- a = ['ssh', '-x', '-o', 'ExitOnForwardFailure=True', '-D', f'localhost:{self.port}']
- b0 = ['-o', 'PasswordAuthentication=False']
- b1 = ['localhost', 'true']
- b2 = ['-fN', '-E', 'txrelay-proxy.debug', 'localhost']
- if port_in_use(self.port):
- omsg(f'Port {self.port} already in use. Assuming SSH SOCKS server is running')
- else:
- cp = run(a + b0 + b1, stdout=PIPE, stderr=PIPE)
- if err := cp.stderr.decode():
- omsg(err)
- if cp.returncode == 0:
- start_proxy()
- elif 'onnection refused' in err:
- die(2, fmt(self.no_ssh_errmsg, indent=' '))
- elif 'ermission denied' in err:
- msg(fmt(self.bad_perm_errmsg.format(' '.join(a + b2)), indent=' ', strip_char='\t'))
- from mmgen.ui import keypress_confirm
- keypress_confirm(cfg, 'Continue?', do_exit=True)
- start_proxy()
- else:
- die(2, fmt(self.need_start_errmsg.format(' '.join(a + b2)), indent=' '))
- if not (external_call or cfg.no_daemon_stop):
- atexit.unregister(self.kill_proxy)
- atexit.register(self.kill_proxy, a + b2)
|