88 *
99 *
1010 * IDENTIFICATION
11- * $PostgreSQL: pgsql/src/backend/libpq/auth.c,v 1.175 2009/01/01 17:23:42 momjian Exp $
11+ * $PostgreSQL: pgsql/src/backend/libpq/auth.c,v 1.176 2009/01/07 12:38:11 mha Exp $
1212 *
1313 *-------------------------------------------------------------------------
1414 */
@@ -611,7 +611,7 @@ recv_and_check_password_packet(Port *port)
611611#ifdef KRB5
612612
613613static int
614- pg_krb5_init (void )
614+ pg_krb5_init (Port * port )
615615{
616616 krb5_error_code retval ;
617617 char * khostname ;
@@ -645,7 +645,10 @@ pg_krb5_init(void)
645645 * If no hostname was specified, pg_krb_server_hostname is already NULL.
646646 * If it's set to blank, force it to NULL.
647647 */
648- khostname = pg_krb_server_hostname ;
648+ if (port -> hba -> krb_server_hostname )
649+ khostname = port -> hba -> krb_server_hostname ;
650+ else
651+ khostname = pg_krb_server_hostname ;
649652 if (khostname && khostname [0 ] == '\0' )
650653 khostname = NULL ;
651654
@@ -691,11 +694,12 @@ pg_krb5_recvauth(Port *port)
691694 krb5_ticket * ticket ;
692695 char * kusername ;
693696 char * cp ;
697+ char * realmmatch ;
694698
695699 if (get_role_line (port -> user_name ) == NULL )
696700 return STATUS_ERROR ;
697701
698- ret = pg_krb5_init ();
702+ ret = pg_krb5_init (port );
699703 if (ret != STATUS_OK )
700704 return ret ;
701705
@@ -736,33 +740,38 @@ pg_krb5_recvauth(Port *port)
736740 return STATUS_ERROR ;
737741 }
738742
743+ if (port -> hba -> krb_realm )
744+ realmmatch = port -> hba -> krb_realm ;
745+ else
746+ realmmatch = pg_krb_realm ;
747+
739748 cp = strchr (kusername , '@' );
740749 if (cp )
741750 {
742751 * cp = '\0' ;
743752 cp ++ ;
744753
745- if (pg_krb_realm != NULL && strlen (pg_krb_realm ))
754+ if (realmmatch != NULL && strlen (realmmatch ))
746755 {
747756 /* Match realm against configured */
748757 if (pg_krb_caseins_users )
749- ret = pg_strcasecmp (pg_krb_realm , cp );
758+ ret = pg_strcasecmp (realmmatch , cp );
750759 else
751- ret = strcmp (pg_krb_realm , cp );
760+ ret = strcmp (realmmatch , cp );
752761
753762 if (ret )
754763 {
755764 elog (DEBUG2 ,
756765 "krb5 realm (%s) and configured realm (%s) don't match" ,
757- cp , pg_krb_realm );
766+ cp , realmmatch );
758767
759768 krb5_free_ticket (pg_krb5_context , ticket );
760769 krb5_auth_con_free (pg_krb5_context , auth_context );
761770 return STATUS_ERROR ;
762771 }
763772 }
764773 }
765- else if (pg_krb_realm && strlen (pg_krb_realm ))
774+ else if (realmmatch && strlen (realmmatch ))
766775 {
767776 elog (DEBUG2 ,
768777 "krb5 did not return realm but realm matching was requested" );
@@ -859,6 +868,7 @@ pg_GSS_recvauth(Port *port)
859868 int ret ;
860869 StringInfoData buf ;
861870 gss_buffer_desc gbuf ;
871+ char * realmmatch ;
862872
863873 /*
864874 * GSS auth is not supported for protocol versions before 3, because it
@@ -1018,6 +1028,11 @@ pg_GSS_recvauth(Port *port)
10181028 gettext_noop ("retrieving GSS user name failed" ),
10191029 maj_stat , min_stat );
10201030
1031+ if (port -> hba -> krb_realm )
1032+ realmmatch = port -> hba -> krb_realm ;
1033+ else
1034+ realmmatch = pg_krb_realm ;
1035+
10211036 /*
10221037 * Split the username at the realm separator
10231038 */
@@ -1028,28 +1043,28 @@ pg_GSS_recvauth(Port *port)
10281043 * cp = '\0' ;
10291044 cp ++ ;
10301045
1031- if (pg_krb_realm != NULL && strlen (pg_krb_realm ))
1046+ if (realmmatch != NULL && strlen (realmmatch ))
10321047 {
10331048 /*
10341049 * Match the realm part of the name first
10351050 */
10361051 if (pg_krb_caseins_users )
1037- ret = pg_strcasecmp (pg_krb_realm , cp );
1052+ ret = pg_strcasecmp (realmmatch , cp );
10381053 else
1039- ret = strcmp (pg_krb_realm , cp );
1054+ ret = strcmp (realmmatch , cp );
10401055
10411056 if (ret )
10421057 {
10431058 /* GSS realm does not match */
10441059 elog (DEBUG2 ,
10451060 "GSSAPI realm (%s) and configured realm (%s) don't match" ,
1046- cp , pg_krb_realm );
1061+ cp , realmmatch );
10471062 gss_release_buffer (& lmin_s , & gbuf );
10481063 return STATUS_ERROR ;
10491064 }
10501065 }
10511066 }
1052- else if (pg_krb_realm && strlen (pg_krb_realm ))
1067+ else if (realmmatch && strlen (realmmatch ))
10531068 {
10541069 elog (DEBUG2 ,
10551070 "GSSAPI did not return realm but realm matching was requested" );
@@ -1113,6 +1128,7 @@ pg_SSPI_recvauth(Port *port)
11131128 SID_NAME_USE accountnameuse ;
11141129 HMODULE secur32 ;
11151130 QUERY_SECURITY_CONTEXT_TOKEN_FN _QuerySecurityContextToken ;
1131+ char * realmmatch ;
11161132
11171133 /*
11181134 * SSPI auth is not supported for protocol versions before 3, because it
@@ -1325,13 +1341,18 @@ pg_SSPI_recvauth(Port *port)
13251341 * Compare realm/domain if requested. In SSPI, always compare case
13261342 * insensitive.
13271343 */
1328- if (pg_krb_realm && strlen (pg_krb_realm ))
1344+ if (port -> hba -> krb_realm )
1345+ realmmatch = port -> hba -> krb_realm ;
1346+ else
1347+ realmmatch = pg_krb_realm ;
1348+
1349+ if (realmmatch && strlen (realmmatch ))
13291350 {
1330- if (pg_strcasecmp (pg_krb_realm , domainname ))
1351+ if (pg_strcasecmp (realmmatch , domainname ))
13311352 {
13321353 elog (DEBUG2 ,
13331354 "SSPI domain (%s) and configured domain (%s) don't match" ,
1334- domainname , pg_krb_realm );
1355+ domainname , realmmatch );
13351356
13361357 return STATUS_ERROR ;
13371358 }
0 commit comments