Including kerberos realm - Mailing list pgsql-hackers
From | Magnus Hagander |
---|---|
Subject | Including kerberos realm |
Date | |
Msg-id | 495E0735.5040601@hagander.net Whole thread Raw |
Responses |
Re: Including kerberos realm
|
List | pgsql-hackers |
Here's the patch allowing for the parameter include_realm on pg_hba.conf, that makes the authentication system pass the user@realm format username to the identmap, instead of stripping the realm. This was the original reason for having regexp support in the ident maps.. The idea is to make it a lot easier to run with multiple kerberos realms in the same installation. Hello Stephen :-) Comments? //Magnus *** a/doc/src/sgml/client-auth.sgml --- b/doc/src/sgml/client-auth.sgml *************** *** 786,791 **** omicron bryanh guest1 --- 786,803 ---- </varlistentry> <varlistentry> + <term>include_realm</term> + <listitem> + <para> + Include the realm name from the authenticated user principal. This is useful + in combination with Username maps (See <xref linkend="auth-username-maps"> + for details), especially with regular expressions, to map users from + multiple realms. + </para> + </listitem> + </varlistentry> + + <varlistentry> <term>krb_realm</term> <listitem> <para> *************** *** 847,852 **** omicron bryanh guest1 --- 859,876 ---- </varlistentry> <varlistentry> + <term>include_realm</term> + <listitem> + <para> + Include the realm name from the authenticated user principal. This is useful + in combination with Username maps (See <xref linkend="auth-username-maps"> + for details), especially with regular expressions, to map users from + multiple realms. + </para> + </listitem> + </varlistentry> + + <varlistentry> <term>krb_realm</term> <listitem> <para> *** a/src/backend/libpq/auth.c --- b/src/backend/libpq/auth.c *************** *** 748,754 **** pg_krb5_recvauth(Port *port) cp = strchr(kusername, '@'); if (cp) { ! *cp = '\0'; cp++; if (realmmatch != NULL && strlen(realmmatch)) --- 748,760 ---- cp = strchr(kusername, '@'); if (cp) { ! /* ! * 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,1046 **** pg_GSS_recvauth(Port *port) { char *cp = strchr(gbuf.value, '@'); ! *cp = '\0'; cp++; if (realmmatch != NULL && strlen(realmmatch)) --- 1046,1058 ---- { char *cp = strchr(gbuf.value, '@'); ! /* ! * 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,1368 **** 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. */ ! return check_usermap(port->hba->usermap, port->user_name, accountname, true); } #endif /* ENABLE_SSPI */ --- 1373,1394 ---- /* * 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 <username>@<realm> format. */ ! 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 */ *** a/src/backend/libpq/hba.c --- b/src/backend/libpq/hba.c *************** *** 1055,1060 **** parse_hba_line(List *line, int line_num, HbaLine *parsedline) --- 1055,1071 ---- 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, *** a/src/include/libpq/hba.h --- b/src/include/libpq/hba.h *************** *** 58,63 **** typedef struct --- 58,64 ---- bool clientcert; char *krb_server_hostname; char *krb_realm; + bool include_realm; } HbaLine; typedef struct Port hbaPort;
pgsql-hackers by date: