diff --git a/web/pgadmin/browser/server_groups/servers/__init__.py b/web/pgadmin/browser/server_groups/servers/__init__.py index 9e900444a..369e3e248 100644 --- a/web/pgadmin/browser/server_groups/servers/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/__init__.py @@ -1432,8 +1432,9 @@ class ServerNode(PGChildNodeView): """ prompt_tunnel_password = True # In case of identity file check the value of tunnel_prompt_password. - if server.tunnel_identity_file is not None and \ - server.tunnel_prompt_password != 1: + if server.tunnel_password is not None or \ + (server.tunnel_identity_file is not None and + server.tunnel_prompt_password != 1): prompt_tunnel_password = False return prompt_tunnel_password @@ -1595,7 +1596,7 @@ class ServerNode(PGChildNodeView): ) except Exception as e: return self.get_response_for_password( - server, 401, True, prompt_tunnel_password, + server, 401, not server.save_password, prompt_tunnel_password, getattr(e, 'message', str(e))) if not status: @@ -1607,7 +1608,8 @@ class ServerNode(PGChildNodeView): return internal_server_error(errmsg) return self.get_response_for_password( - server, 401, True, prompt_tunnel_password, errmsg) + server, 401, not server.save_password, + prompt_tunnel_password, errmsg) else: if save_password and config.ALLOW_SAVE_PASSWORD: try: diff --git a/web/pgadmin/static/js/Dialogs/ConnectServerContent.jsx b/web/pgadmin/static/js/Dialogs/ConnectServerContent.jsx index 9696959cf..cb17144eb 100644 --- a/web/pgadmin/static/js/Dialogs/ConnectServerContent.jsx +++ b/web/pgadmin/static/js/Dialogs/ConnectServerContent.jsx @@ -109,21 +109,23 @@ export default function ConnectServerContent({closeModal, data, onOK, setHeight, } onClick={()=>{ closeModal(); }} >{gettext('Cancel')} - } onClick={()=>{ - let postFormData = new FormData(); - if(data.prompt_tunnel_password) { - postFormData.append('tunnel_password', formData.tunnel_password); - formData.save_tunnel_password && - postFormData.append('save_tunnel_password', formData.save_tunnel_password); - } - if(data.prompt_password) { - postFormData.append('password', formData.password); - formData.save_password && - postFormData.append('save_password', formData.save_password); - } - onOK?.(postFormData); - closeModal(); - }} >{gettext('OK')} + {(data.prompt_password || data.prompt_tunnel_password) && <> + } onClick={()=>{ + let postFormData = new FormData(); + if(data.prompt_tunnel_password) { + postFormData.append('tunnel_password', formData.tunnel_password); + formData.save_tunnel_password && + postFormData.append('save_tunnel_password', formData.save_tunnel_password); + } + if(data.prompt_password) { + postFormData.append('password', formData.password); + formData.save_password && + postFormData.append('save_password', formData.save_password); + } + onOK?.(postFormData); + closeModal(); + }} >{gettext('OK')} + } ); diff --git a/web/pgadmin/utils/driver/psycopg3/server_manager.py b/web/pgadmin/utils/driver/psycopg3/server_manager.py index 983f04973..561141b5d 100644 --- a/web/pgadmin/utils/driver/psycopg3/server_manager.py +++ b/web/pgadmin/utils/driver/psycopg3/server_manager.py @@ -612,8 +612,12 @@ WHERE db.oid = {0}""".format(did)) self.tunnel_created = True except BaseSSHTunnelForwarderError as e: current_app.logger.exception(e) - return False, gettext("Failed to create the SSH tunnel.\n" - "Error: {0}").format(str(e)) + return False, gettext( + "Failed to create the SSH tunnel. Possible causes:\n" + "1. Enter the correct tunnel password (Clear saved password " + "if it has changed).\n 2. If using an identity file that " + "requires a password, enable “Prompt for Password?” in the " + "server dialog. \n 3. Verify the host address.") # Update the port to communicate locally self.local_bind_port = self.tunnel_object.local_bind_port