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