8
8
*
9
9
*
10
10
* 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 $
12
12
*
13
13
*-------------------------------------------------------------------------
14
14
*/
@@ -611,7 +611,7 @@ recv_and_check_password_packet(Port *port)
611
611
#ifdef KRB5
612
612
613
613
static int
614
- pg_krb5_init (void )
614
+ pg_krb5_init (Port * port )
615
615
{
616
616
krb5_error_code retval ;
617
617
char * khostname ;
@@ -645,7 +645,10 @@ pg_krb5_init(void)
645
645
* If no hostname was specified, pg_krb_server_hostname is already NULL.
646
646
* If it's set to blank, force it to NULL.
647
647
*/
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 ;
649
652
if (khostname && khostname [0 ] == '\0' )
650
653
khostname = NULL ;
651
654
@@ -691,11 +694,12 @@ pg_krb5_recvauth(Port *port)
691
694
krb5_ticket * ticket ;
692
695
char * kusername ;
693
696
char * cp ;
697
+ char * realmmatch ;
694
698
695
699
if (get_role_line (port -> user_name ) == NULL )
696
700
return STATUS_ERROR ;
697
701
698
- ret = pg_krb5_init ();
702
+ ret = pg_krb5_init (port );
699
703
if (ret != STATUS_OK )
700
704
return ret ;
701
705
@@ -736,33 +740,38 @@ pg_krb5_recvauth(Port *port)
736
740
return STATUS_ERROR ;
737
741
}
738
742
743
+ if (port -> hba -> krb_realm )
744
+ realmmatch = port -> hba -> krb_realm ;
745
+ else
746
+ realmmatch = pg_krb_realm ;
747
+
739
748
cp = strchr (kusername , '@' );
740
749
if (cp )
741
750
{
742
751
* cp = '\0' ;
743
752
cp ++ ;
744
753
745
- if (pg_krb_realm != NULL && strlen (pg_krb_realm ))
754
+ if (realmmatch != NULL && strlen (realmmatch ))
746
755
{
747
756
/* Match realm against configured */
748
757
if (pg_krb_caseins_users )
749
- ret = pg_strcasecmp (pg_krb_realm , cp );
758
+ ret = pg_strcasecmp (realmmatch , cp );
750
759
else
751
- ret = strcmp (pg_krb_realm , cp );
760
+ ret = strcmp (realmmatch , cp );
752
761
753
762
if (ret )
754
763
{
755
764
elog (DEBUG2 ,
756
765
"krb5 realm (%s) and configured realm (%s) don't match" ,
757
- cp , pg_krb_realm );
766
+ cp , realmmatch );
758
767
759
768
krb5_free_ticket (pg_krb5_context , ticket );
760
769
krb5_auth_con_free (pg_krb5_context , auth_context );
761
770
return STATUS_ERROR ;
762
771
}
763
772
}
764
773
}
765
- else if (pg_krb_realm && strlen (pg_krb_realm ))
774
+ else if (realmmatch && strlen (realmmatch ))
766
775
{
767
776
elog (DEBUG2 ,
768
777
"krb5 did not return realm but realm matching was requested" );
@@ -859,6 +868,7 @@ pg_GSS_recvauth(Port *port)
859
868
int ret ;
860
869
StringInfoData buf ;
861
870
gss_buffer_desc gbuf ;
871
+ char * realmmatch ;
862
872
863
873
/*
864
874
* GSS auth is not supported for protocol versions before 3, because it
@@ -1018,6 +1028,11 @@ pg_GSS_recvauth(Port *port)
1018
1028
gettext_noop ("retrieving GSS user name failed" ),
1019
1029
maj_stat , min_stat );
1020
1030
1031
+ if (port -> hba -> krb_realm )
1032
+ realmmatch = port -> hba -> krb_realm ;
1033
+ else
1034
+ realmmatch = pg_krb_realm ;
1035
+
1021
1036
/*
1022
1037
* Split the username at the realm separator
1023
1038
*/
@@ -1028,28 +1043,28 @@ pg_GSS_recvauth(Port *port)
1028
1043
* cp = '\0' ;
1029
1044
cp ++ ;
1030
1045
1031
- if (pg_krb_realm != NULL && strlen (pg_krb_realm ))
1046
+ if (realmmatch != NULL && strlen (realmmatch ))
1032
1047
{
1033
1048
/*
1034
1049
* Match the realm part of the name first
1035
1050
*/
1036
1051
if (pg_krb_caseins_users )
1037
- ret = pg_strcasecmp (pg_krb_realm , cp );
1052
+ ret = pg_strcasecmp (realmmatch , cp );
1038
1053
else
1039
- ret = strcmp (pg_krb_realm , cp );
1054
+ ret = strcmp (realmmatch , cp );
1040
1055
1041
1056
if (ret )
1042
1057
{
1043
1058
/* GSS realm does not match */
1044
1059
elog (DEBUG2 ,
1045
1060
"GSSAPI realm (%s) and configured realm (%s) don't match" ,
1046
- cp , pg_krb_realm );
1061
+ cp , realmmatch );
1047
1062
gss_release_buffer (& lmin_s , & gbuf );
1048
1063
return STATUS_ERROR ;
1049
1064
}
1050
1065
}
1051
1066
}
1052
- else if (pg_krb_realm && strlen (pg_krb_realm ))
1067
+ else if (realmmatch && strlen (realmmatch ))
1053
1068
{
1054
1069
elog (DEBUG2 ,
1055
1070
"GSSAPI did not return realm but realm matching was requested" );
@@ -1113,6 +1128,7 @@ pg_SSPI_recvauth(Port *port)
1113
1128
SID_NAME_USE accountnameuse ;
1114
1129
HMODULE secur32 ;
1115
1130
QUERY_SECURITY_CONTEXT_TOKEN_FN _QuerySecurityContextToken ;
1131
+ char * realmmatch ;
1116
1132
1117
1133
/*
1118
1134
* SSPI auth is not supported for protocol versions before 3, because it
@@ -1325,13 +1341,18 @@ pg_SSPI_recvauth(Port *port)
1325
1341
* Compare realm/domain if requested. In SSPI, always compare case
1326
1342
* insensitive.
1327
1343
*/
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 ))
1329
1350
{
1330
- if (pg_strcasecmp (pg_krb_realm , domainname ))
1351
+ if (pg_strcasecmp (realmmatch , domainname ))
1331
1352
{
1332
1353
elog (DEBUG2 ,
1333
1354
"SSPI domain (%s) and configured domain (%s) don't match" ,
1334
- domainname , pg_krb_realm );
1355
+ domainname , realmmatch );
1335
1356
1336
1357
return STATUS_ERROR ;
1337
1358
}
0 commit comments