From 8721b0e6c2e5b9defb726b479d5ab9abff802cd1 Mon Sep 17 00:00:00 2001 From: Michael Nahkies Date: Sun, 24 Nov 2024 15:40:21 +0000 Subject: [PATCH] fix: explicitly use the POSTGRES_USER --- ensure_role_and_database_exists.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/ensure_role_and_database_exists.c b/ensure_role_and_database_exists.c index 3628207..d2800ff 100644 --- a/ensure_role_and_database_exists.c +++ b/ensure_role_and_database_exists.c @@ -12,14 +12,19 @@ static ClientAuthentication_hook_type original_client_auth_hook = NULL; static void ensure_role_and_database_exists(Port *port, int status) { char *cmd; + char *postgres_user; char *role_attributes; if (original_client_auth_hook) { original_client_auth_hook(port, status); } - // don't infinitely recurse - if (strcmp(port->database_name, "postgres") == 0 && strcmp(port->user_name, "postgres") == 0) { + postgres_user = getenv("POSTGRES_USER"); + + fprintf(stderr, "handling connection for username '%s' to database '%s'\n", port->user_name, port->database_name); + + // don't infinitely recurse when connecting as superuser + if (strcmp(port->database_name, postgres_user) == 0 && strcmp(port->user_name, postgres_user) == 0) { return; } @@ -27,16 +32,15 @@ static void ensure_role_and_database_exists(Port *port, int status) { fprintf(stderr, "ensuring user_name '%s' exists with attributes '%s'\n", port->user_name, role_attributes); asprintf(&cmd, - "echo \"SELECT 'CREATE ROLE %s WITH %s' WHERE NOT EXISTS (SELECT FROM pg_roles WHERE rolname = '%s')\\gexec\" | psql", - port->user_name, role_attributes, port->user_name); + "echo \"SELECT 'CREATE ROLE %s WITH %s' WHERE NOT EXISTS (SELECT FROM pg_roles WHERE rolname = '%s')\\gexec\" | psql -U %s -d %s", + port->user_name, role_attributes, port->user_name, postgres_user, postgres_user); system(cmd); free(cmd); fprintf(stderr, "ensuring database '%s' exists\n", port->database_name); - asprintf(&cmd, - "echo \"SELECT 'CREATE DATABASE %s WITH OWNER = %s' WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = '%s')\\gexec\" | psql", - port->database_name, port->user_name, port->database_name); + "echo \"SELECT 'CREATE DATABASE %s WITH OWNER = %s' WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = '%s')\\gexec\" | psql -U %s -d %s", + port->database_name, port->user_name, port->database_name, postgres_user, postgres_user); system(cmd); free(cmd); }