From 9f6307cbb3e338b6b2fa6d74d23dfa5ca8b5591e Mon Sep 17 00:00:00 2001 From: Jonathan Zernik Date: Sun, 10 Oct 2021 00:30:27 -0700 Subject: [PATCH] Add rpc to get default peer port (#1556) * Added get default peer port rpc command * Use default port in connect peer dialog * Got default port working on create peer dialog * Got default port working in both connect peer and create peer. * Remove default peer usage in create peer backend * Remove default peer handling for connect peer in backend * Reset port back to empty when use custom is checked or unchecked. --- .../ConnectPeerDialog/ConnectPeerDialog.js | 39 +++++++++++++------ .../CreatePeerDialog/CreatePeerDialog.js | 34 ++++++++++------ frontend/src/squeakclient/requests.js | 14 +++++++ itests/tests/test_squeak_node.py | 9 +++++ itests/tests/util.py | 7 ++++ proto/squeak_admin.proto | 12 ++++++ .../admin/squeak_admin_server_handler.py | 7 ++++ .../admin/squeak_admin_server_servicer.py | 3 ++ squeaknode/admin/webapp/app.py | 6 +++ squeaknode/core/peers.py | 4 -- squeaknode/network/network_manager.py | 6 --- squeaknode/node/squeak_controller.py | 4 +- tests/core/test_peers.py | 37 ++---------------- tests/node/test_squeak_controller.py | 21 ---------- 14 files changed, 114 insertions(+), 89 deletions(-) diff --git a/frontend/src/components/ConnectPeerDialog/ConnectPeerDialog.js b/frontend/src/components/ConnectPeerDialog/ConnectPeerDialog.js index 038eb163..d76e03d1 100644 --- a/frontend/src/components/ConnectPeerDialog/ConnectPeerDialog.js +++ b/frontend/src/components/ConnectPeerDialog/ConnectPeerDialog.js @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import React, { useState, useMemo } from 'react'; import { Button, Dialog, @@ -12,13 +12,13 @@ import { } from '@material-ui/core'; import { + getDefaultPeerPortRequest, connectSqueakPeerRequest, } from '../../squeakclient/requests'; // styles import useStyles from './styles'; -const portDefaultValue = '0'; export default function ConnectPeerDialog({ open, @@ -28,28 +28,40 @@ export default function ConnectPeerDialog({ }) { const classes = useStyles(); + const [defaultPeerPort, setDefaultPeerPort] = useState(null); const [peerName, setPeerName] = useState(''); const [host, setHost] = useState(''); const [port, setPort] = useState(''); const [customPortChecked, setCustomPortChecked] = useState(false); const [useTorChecked, setUseTorChecked] = useState(false); const [loading, setLoading] = useState(false); + const portToUse = useMemo(() => customPortChecked ? port : defaultPeerPort, [customPortChecked, port, defaultPeerPort]); + + const getDefaultPeerPort = () => { + getDefaultPeerPortRequest(setDefaultPeerPort); + }; const resetFields = () => { setPeerName(''); setHost(''); - setPort(portDefaultValue); + setPort(''); setCustomPortChecked(false); }; + function load(event) { + getDefaultPeerPort(); + resetFields(); + } + const handleChangeHost = (event) => { setHost(event.target.value); }; const handleChangeCustomPortChecked = (event) => { - setPort( - event.target.checked ? '' : portDefaultValue, - ); + // setPort( + // event.target.checked ? '' : defaultPeerPort, + // ); + setPort(''); setCustomPortChecked(event.target.checked); }; @@ -62,6 +74,9 @@ export default function ConnectPeerDialog({ }; const connectPeer = (peerName, host, port) => { + // const portToUse = customPortChecked ? port : defaultPeerPort; + // console.log('Calling connectSqueakPeerRequest with: ', host, portToUse, useTorChecked); + // console.log('portToUse: ', portToUse); setLoading(true); connectSqueakPeerRequest(host, port, useTorChecked, (response) => { // goToPeerPage(history, response.getPeerId()); @@ -86,16 +101,16 @@ export default function ConnectPeerDialog({ function handleSubmit(event) { event.preventDefault(); console.log('host:', host); - console.log('port:', port); + console.log('portToUse:', portToUse); if (!host) { alert('Host cannot be empty.'); return; } - if (!port) { - alert('Port cannot be empty.'); + if (!portToUse) { + alert('portToUse cannot be empty.'); return; } - connectPeer(peerName, host, port); + connectPeer(peerName, host, portToUse); // handleClose(); } @@ -120,7 +135,7 @@ export default function ConnectPeerDialog({ required={customPortChecked} variant="outlined" label="Port" - value={customPortChecked ? port : ''} + value={portToUse} onChange={handleChangePort} inputProps={{ maxLength: 8 }} disabled={!customPortChecked} @@ -194,7 +209,7 @@ export default function ConnectPeerDialog({ return ( ({ }, })); -const portDefaultValue = '0'; export default function CreatePeerDialog({ open, @@ -53,11 +53,17 @@ export default function CreatePeerDialog({ const classes = useStyles(); const history = useHistory(); + const [defaultPeerPort, setDefaultPeerPort] = useState(null); const [peerName, setPeerName] = useState(''); const [host, setHost] = useState(''); const [port, setPort] = useState(''); const [customPortChecked, setCustomPortChecked] = useState(false); const [useTorChecked, setUseTorChecked] = useState(false); + const portToUse = useMemo(() => customPortChecked ? port : defaultPeerPort, [customPortChecked, port, defaultPeerPort]); + + const getDefaultPeerPort = () => { + getDefaultPeerPortRequest(setDefaultPeerPort); + }; const resetFields = () => { setPeerName(''); @@ -65,7 +71,7 @@ export default function CreatePeerDialog({ if (initialHost) { setHost(initialHost); } - setPort(portDefaultValue); + setPort(''); setCustomPortChecked(false); if (initialPort) { setPort(initialPort); @@ -73,6 +79,11 @@ export default function CreatePeerDialog({ } }; + function load(event) { + getDefaultPeerPort(); + resetFields(); + } + const handleChangePeerName = (event) => { setPeerName(event.target.value); }; @@ -82,9 +93,10 @@ export default function CreatePeerDialog({ }; const handleChangeCustomPortChecked = (event) => { - setPort( - event.target.checked ? '' : portDefaultValue, - ); + // setPort( + // event.target.checked ? '' : portDefaultValue, + // ); + setPort(''); setCustomPortChecked(event.target.checked); }; @@ -111,11 +123,11 @@ export default function CreatePeerDialog({ alert('Host cannot be empty.'); return; } - if (!port) { - alert('Port cannot be empty.'); + if (!portToUse) { + alert('portToUse cannot be empty.'); return; } - createPeer(peerName, host, port); + createPeer(peerName, host, portToUse); handleClose(); } @@ -155,7 +167,7 @@ export default function CreatePeerDialog({ required={customPortChecked} variant="outlined" label="Port" - value={customPortChecked ? port : ''} + value={portToUse} onChange={handleChangePort} inputProps={{ maxLength: 8 }} disabled={!customPortChecked} @@ -226,7 +238,7 @@ export default function CreatePeerDialog({ return ( { + handleResponse(response.getPort()); + }, + ); +} + // export function subscribeConnectedPeersRequest(handleResponse) { // const request = new SubscribeConnectedPeersRequest(); // const stream = client.subscribeConnectedPeers(request); diff --git a/itests/tests/test_squeak_node.py b/itests/tests/test_squeak_node.py index dd6db904..36585375 100644 --- a/itests/tests/test_squeak_node.py +++ b/itests/tests/test_squeak_node.py @@ -42,6 +42,7 @@ from tests.util import download_squeaks from tests.util import download_squeaks_for_address from tests.util import get_connected_peer from tests.util import get_connected_peers +from tests.util import get_default_peer_port from tests.util import get_external_address from tests.util import get_hash from tests.util import get_network @@ -75,6 +76,14 @@ def test_get_external_address(admin_stub): assert external_address.port > 0 +def test_get_default_peer_port(admin_stub): + # Get the default peer port + default_peer_port = get_default_peer_port(admin_stub) + + print(default_peer_port) + assert default_peer_port == 18777 + + def test_reprocess_received_payments(admin_stub): # Reprocess received payments reprocess_received_payments_response = admin_stub.ReprocessReceivedPayments( diff --git a/itests/tests/util.py b/itests/tests/util.py index 6c52d46b..5afec5bb 100644 --- a/itests/tests/util.py +++ b/itests/tests/util.py @@ -306,6 +306,13 @@ def get_external_address(node_stub): return get_external_address_response.peer_address +def get_default_peer_port(node_stub): + get_default_peer_port_response = node_stub.GetDefaultPeerPort( + squeak_admin_pb2.GetDefaultPeerPortRequest() + ) + return get_default_peer_port_response.port + + def make_squeak(node_stub, profile_id, squeak_content, reply_to_hash=None): make_squeak_response = node_stub.MakeSqueak( squeak_admin_pb2.MakeSqueakRequest( diff --git a/proto/squeak_admin.proto b/proto/squeak_admin.proto index 58d845e7..98bfe0fa 100644 --- a/proto/squeak_admin.proto +++ b/proto/squeak_admin.proto @@ -328,6 +328,10 @@ service SqueakAdmin { */ rpc GetExternalAddress (GetExternalAddressRequest) returns (GetExternalAddressReply) {} + /** sqkadmin: `getdefaultpeerport` + */ + rpc GetDefaultPeerPort (GetDefaultPeerPortRequest) returns (GetDefaultPeerPortReply) {} + } message CreateSigningProfileRequest { @@ -1188,3 +1192,11 @@ message GetExternalAddressReply { PeerAddress peer_address = 1; } +message GetDefaultPeerPortRequest { +} + +message GetDefaultPeerPortReply { + /// The port. + int32 port = 1; +} + diff --git a/squeaknode/admin/squeak_admin_server_handler.py b/squeaknode/admin/squeak_admin_server_handler.py index d12b0453..772d05d1 100644 --- a/squeaknode/admin/squeak_admin_server_handler.py +++ b/squeaknode/admin/squeak_admin_server_handler.py @@ -1086,3 +1086,10 @@ class SqueakAdminServerHandler(object): return squeak_admin_pb2.GetExternalAddressReply( peer_address=external_address_msg, ) + + def handle_get_default_peer_port(self, request): + logger.info("Handle get default peer port") + default_peer_port = self.squeak_controller.get_default_peer_port() + return squeak_admin_pb2.GetDefaultPeerPortReply( + port=default_peer_port, + ) diff --git a/squeaknode/admin/squeak_admin_server_servicer.py b/squeaknode/admin/squeak_admin_server_servicer.py index 7e2078fb..ce27be7c 100644 --- a/squeaknode/admin/squeak_admin_server_servicer.py +++ b/squeaknode/admin/squeak_admin_server_servicer.py @@ -379,3 +379,6 @@ class SqueakAdminServerServicer(squeak_admin_pb2_grpc.SqueakAdminServicer): def GetExternalAddress(self, request, context): return self.handler.handle_get_external_address(request) + + def GetDefaultPeerPort(self, request, context): + return self.handler.handle_get_default_peer_port(request) diff --git a/squeaknode/admin/webapp/app.py b/squeaknode/admin/webapp/app.py index 2b61dc5b..e5b0d215 100644 --- a/squeaknode/admin/webapp/app.py +++ b/squeaknode/admin/webapp/app.py @@ -518,6 +518,12 @@ def create_app(handler, username, password): def getexternaladdress(msg): return handler.handle_get_external_address(msg) + @app.route("/getdefaultpeerport", methods=["POST"]) + @login_required + @protobuf_serialized(squeak_admin_pb2.GetDefaultPeerPortRequest()) + def getdefaultpeerport(msg): + return handler.handle_get_default_peer_port(msg) + return app diff --git a/squeaknode/core/peers.py b/squeaknode/core/peers.py index 0e30a93f..2e680359 100644 --- a/squeaknode/core/peers.py +++ b/squeaknode/core/peers.py @@ -26,12 +26,8 @@ from squeaknode.core.squeak_peer import SqueakPeer def create_saved_peer( peer_name: str, peer_address: PeerAddress, - default_port: int, ) -> SqueakPeer: validate_saved_peer_name(peer_name) - port = peer_address.port or default_port - peer_address = peer_address._replace( - port=port) return SqueakPeer( peer_id=None, peer_name=peer_name, diff --git a/squeaknode/network/network_manager.py b/squeaknode/network/network_manager.py index da4126be..318c0d88 100644 --- a/squeaknode/network/network_manager.py +++ b/squeaknode/network/network_manager.py @@ -81,17 +81,11 @@ class NetworkManager(object): self.connection_manager.stop_all_connections() def connect_peer_sync(self, peer_address: PeerAddress) -> None: - port = peer_address.port or squeak.params.params.DEFAULT_PORT - peer_address = peer_address._replace( - port=port) if self.connection_manager.has_connection(peer_address): raise Exception("Already connected to: {}".format(peer_address)) self.peer_client.connect_address(peer_address) def connect_peer_async(self, peer_address: PeerAddress) -> None: - port = peer_address.port or squeak.params.params.DEFAULT_PORT - peer_address = peer_address._replace( - port=port) if self.connection_manager.has_connection(peer_address): return self.peer_client.connect_address_async(peer_address) diff --git a/squeaknode/node/squeak_controller.py b/squeaknode/node/squeak_controller.py index 0d072ceb..57eb1472 100644 --- a/squeaknode/node/squeak_controller.py +++ b/squeaknode/node/squeak_controller.py @@ -332,7 +332,6 @@ class SqueakController: squeak_peer = create_saved_peer( peer_name, peer_address, - squeak.params.params.DEFAULT_PORT, ) return self.squeak_db.insert_peer(squeak_peer) @@ -840,3 +839,6 @@ class SqueakController: def get_external_address(self) -> PeerAddress: return self.network_manager.external_address + + def get_default_peer_port(self) -> int: + return squeak.params.params.DEFAULT_PORT diff --git a/tests/core/test_peers.py b/tests/core/test_peers.py index bf85c480..7182c26b 100644 --- a/tests/core/test_peers.py +++ b/tests/core/test_peers.py @@ -57,58 +57,27 @@ def peer_address_with_no_port(): ) -@pytest.fixture -def default_peer_port(): - yield 55555 - - -def test_create_saved_peer(peer_name, peer_address, default_peer_port): +def test_create_saved_peer(peer_name, peer_address): peer = create_saved_peer( peer_name, peer_address, - default_peer_port, ) assert peer.peer_name == peer_name - # assert peer.address == PeerAddress( - # host=peer_address.host, - # port=peer_address.port, - # ) assert peer.address == peer_address -def test_create_saved_peer_empty_name(peer_address, default_peer_port): +def test_create_saved_peer_empty_name(peer_address): with pytest.raises(Exception) as excinfo: - create_saved_peer("", peer_address, default_peer_port) + create_saved_peer("", peer_address) assert "Peer name cannot be empty." in str(excinfo.value) -def test_create_saved_peer_default_port(peer_name, peer_address_with_no_port, default_peer_port): - peer = create_saved_peer( - peer_name, - peer_address_with_no_port, - default_peer_port, - ) - - assert peer.peer_name == peer_name - assert peer.address == PeerAddress( - host=peer_address_with_no_port.host, - port=default_peer_port, - use_tor=False, - ) - - def test_create_saved_peer_use_tor(peer_name, peer_address_with_tor): peer = create_saved_peer( peer_name, peer_address_with_tor, - default_peer_port, ) assert peer.peer_name == peer_name - # assert peer.address == PeerAddress( - # host=peer_address_with_tor.host, - # port=peer_address_with_tor.port, - # use_tor=peer_address_with_tor.use_tor, - # ) assert peer.address == peer_address_with_tor diff --git a/tests/node/test_squeak_controller.py b/tests/node/test_squeak_controller.py index 481a2149..6af9cb3b 100644 --- a/tests/node/test_squeak_controller.py +++ b/tests/node/test_squeak_controller.py @@ -21,7 +21,6 @@ # SOFTWARE. import mock import pytest -import squeak.params from squeaknode.config.config import SqueaknodeConfig from squeaknode.core.lightning_address import LightningAddressHostPort @@ -164,23 +163,3 @@ def test_create_peer(squeak_db, squeak_controller, peer_address): autoconnect=False, ) ) - - -def test_create_peer_default_port(config, squeak_db, squeak_controller, peer_address_with_zero): - squeak_controller.create_peer( - "fake_peer_name", - peer_address_with_zero, - ) - - squeak_db.insert_peer.assert_called_with( - SqueakPeer( - peer_id=None, - peer_name="fake_peer_name", - address=PeerAddress( - host=peer_address_with_zero.host, - port=squeak.params.params.DEFAULT_PORT, - use_tor=peer_address_with_zero.use_tor, - ), - autoconnect=False, - ) - )