From d8f33d43445a40e4f723b1a013d1be54027715d9 Mon Sep 17 00:00:00 2001 From: Dave Page Date: Wed, 19 Aug 2026 12:20:10 +0100 Subject: [PATCH] fix: reject empty or null Username on non-shared server import (#10309) validate_json_data() only checked that the Username key was present on a non-shared server, not that it held anything useful, so an empty or null value imported cleanly and left behind a server that libpq would silently authenticate as the OS account running pgAdmin rather than reject outright. Check the value, matching the truthiness check already used for shared servers and the "Username must be specified" rule enforced by the server dialog. --- web/pgadmin/utils/__init__.py | 8 +++++--- web/pgadmin/utils/tests/test_validate_json_data.py | 14 ++++++++++++++ 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/web/pgadmin/utils/__init__.py b/web/pgadmin/utils/__init__.py index d459e72b99d..0a57d7e6c0f 100644 --- a/web/pgadmin/utils/__init__.py +++ b/web/pgadmin/utils/__init__.py @@ -649,9 +649,11 @@ def check_is_integer(value): "found for server '%s'" % server ) else: - errmsg = check_attrib("Username") - if errmsg: - return errmsg + if not obj.get("Username"): + return gettext( + "'Username' attribute not found for server '%s'" % + server + ) errmsg = check_attrib("MaintenanceDB") if errmsg: diff --git a/web/pgadmin/utils/tests/test_validate_json_data.py b/web/pgadmin/utils/tests/test_validate_json_data.py index b5525d8eed3..4360f9dccb0 100644 --- a/web/pgadmin/utils/tests/test_validate_json_data.py +++ b/web/pgadmin/utils/tests/test_validate_json_data.py @@ -47,6 +47,20 @@ class TestValidateJsonData(BaseTestGenerator): expected_error="'Username' attribute not found", expected_servers=["1"] )), + ('A non-shared server with an empty username is rejected', + dict( + servers={"1": server(Username="")}, + is_admin=True, + expected_error="'Username' attribute not found", + expected_servers=["1"] + )), + ('A non-shared server with a null username is rejected', + dict( + servers={"1": server(Username=None)}, + is_admin=True, + expected_error="'Username' attribute not found", + expected_servers=["1"] + )), ('A shared server with only a shared username is valid', dict( servers={"1": server(Shared=True, SharedUsername="postgres")},