From f0f00307f4b2b526e4741490a44037e2802e2b6a Mon Sep 17 00:00:00 2001 From: Magnus Hagander Date: Wed, 7 Jan 2009 13:09:21 +0000 Subject: [PATCH] Add hba parameter include_realm to krb5, gss and sspi authentication, used to pass the full username@realm string to the authentication instead of just the username. This makes it possible to use pg_ident.conf to authenticate users from multiple realms as different database users. --- doc/src/sgml/client-auth.sgml | 24 ++++++++++++++++++++++++ src/backend/libpq/auth.c | 32 +++++++++++++++++++++++++++++--- src/backend/libpq/hba.c | 11 +++++++++++ src/include/libpq/hba.h | 1 + 4 files changed, 65 insertions(+), 3 deletions(-) diff --git a/doc/src/sgml/client-auth.sgml b/doc/src/sgml/client-auth.sgml index e1bb7158bf..68cade19ec 100644 --- a/doc/src/sgml/client-auth.sgml +++ b/doc/src/sgml/client-auth.sgml @@ -785,6 +785,18 @@ omicron bryanh guest1 + + include_realm + + + Include the realm name from the authenticated user principal. This is useful + in combination with Username maps (See + for details), especially with regular expressions, to map users from + multiple realms. + + + + krb_realm @@ -846,6 +858,18 @@ omicron bryanh guest1 + + include_realm + + + Include the realm name from the authenticated user principal. This is useful + in combination with Username maps (See + for details), especially with regular expressions, to map users from + multiple realms. + + + + krb_realm diff --git a/src/backend/libpq/auth.c b/src/backend/libpq/auth.c index a0545e8d85..fc3de097fe 100644 --- a/src/backend/libpq/auth.c +++ b/src/backend/libpq/auth.c @@ -748,7 +748,13 @@ pg_krb5_recvauth(Port *port) cp = strchr(kusername, '@'); if (cp) { - *cp = '\0'; + /* + * If we are not going to include the realm in the username that is passed + * to the ident map, destructively modify it here to remove the realm. Then + * advance past the separator to check the realm. + */ + if (!port->hba->include_realm) + *cp = '\0'; cp++; if (realmmatch != NULL && strlen(realmmatch)) @@ -1040,7 +1046,13 @@ pg_GSS_recvauth(Port *port) { char *cp = strchr(gbuf.value, '@'); - *cp = '\0'; + /* + * If we are not going to include the realm in the username that is passed + * to the ident map, destructively modify it here to remove the realm. Then + * advance past the separator to check the realm. + */ + if (!port->hba->include_realm) + *cp = '\0'; cp++; if (realmmatch != NULL && strlen(realmmatch)) @@ -1361,8 +1373,22 @@ pg_SSPI_recvauth(Port *port) /* * We have the username (without domain/realm) in accountname, compare to * the supplied value. In SSPI, always compare case insensitive. + * + * If set to include realm, append it in @ format. */ - return check_usermap(port->hba->usermap, port->user_name, accountname, true); + if (port->hba->include_realm) + { + char *namebuf; + int retval; + + namebuf = palloc(strlen(accountname) + strlen(domainname) + 2); + sprintf(namebuf, "%s@%s", accountname, domainname); + retval = check_usermap(port->hba->usermap, port->user_name, namebuf, true); + pfree(namebuf); + return retval; + } + else + return check_usermap(port->hba->usermap, port->user_name, accountname, true); } #endif /* ENABLE_SSPI */ diff --git a/src/backend/libpq/hba.c b/src/backend/libpq/hba.c index 0d83cceb89..a134b4565b 100644 --- a/src/backend/libpq/hba.c +++ b/src/backend/libpq/hba.c @@ -1053,6 +1053,17 @@ parse_hba_line(List *line, int line_num, HbaLine *parsedline) INVALID_AUTH_OPTION("krb_realm", "krb5, gssapi and sspi"); parsedline->krb_realm = pstrdup(c); } + else if (strcmp(token, "include_realm") == 0) + { + if (parsedline->auth_method != uaKrb5 && + parsedline->auth_method != uaGSS && + parsedline->auth_method != uaSSPI) + INVALID_AUTH_OPTION("include_realm", "krb5, gssapi and sspi"); + if (strcmp(c, "1") == 0) + parsedline->include_realm = true; + else + parsedline->include_realm = false; + } else { ereport(LOG, diff --git a/src/include/libpq/hba.h b/src/include/libpq/hba.h index 522a3b96df..c766352caa 100644 --- a/src/include/libpq/hba.h +++ b/src/include/libpq/hba.h @@ -58,6 +58,7 @@ typedef struct bool clientcert; char *krb_server_hostname; char *krb_realm; + bool include_realm; } HbaLine; typedef struct Port hbaPort; -- 2.39.5