summaryrefslogtreecommitdiff
path: root/src/backend/libpq/auth.c
diff options
context:
space:
mode:
authorMagnus Hagander <magnus@hagander.net>2007-07-24 09:00:27 +0000
committerMagnus Hagander <magnus@hagander.net>2007-07-24 09:00:27 +0000
commitd60259249428809cad22e2de152544de60c7ee81 (patch)
tree16a1a33e02743218291cfce6e865327c281f0533 /src/backend/libpq/auth.c
parentad4295728e04f4107f4dcbbee4950e526becb95d (diff)
Make it possible, and default, for MingW to build with SSPI support
by dynamically loading the function that's missing from the MingW headers and library.
Diffstat (limited to 'src/backend/libpq/auth.c')
-rw-r--r--src/backend/libpq/auth.c37
1 files changed, 33 insertions, 4 deletions
diff --git a/src/backend/libpq/auth.c b/src/backend/libpq/auth.c
index c475c6429d6..d3bb35f40ff 100644
--- a/src/backend/libpq/auth.c
+++ b/src/backend/libpq/auth.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/libpq/auth.c,v 1.154 2007/07/23 10:16:53 mha Exp $
+ * $PostgreSQL: pgsql/src/backend/libpq/auth.c,v 1.155 2007/07/24 09:00:27 mha Exp $
*
*-------------------------------------------------------------------------
*/
@@ -560,13 +560,16 @@ pg_SSPI_error(int severity, char *errmsg, SECURITY_STATUS r)
if (FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, r, 0, sysmsg, sizeof(sysmsg), NULL) == 0)
ereport(severity,
(errmsg_internal("%s", errmsg),
- errdetail("sspi error %x", r)));
+ errdetail("sspi error %x", (unsigned int)r)));
else
ereport(severity,
(errmsg_internal("%s", errmsg),
- errdetail("%s (%x)", sysmsg, r)));
+ errdetail("%s (%x)", sysmsg, (unsigned int)r)));
}
+typedef SECURITY_STATUS
+(WINAPI * QUERY_SECURITY_CONTEXT_TOKEN_FN)(
+ PCtxtHandle, void **);
static int
pg_SSPI_recvauth(Port *port)
@@ -591,6 +594,8 @@ pg_SSPI_recvauth(Port *port)
DWORD accountnamesize = sizeof(accountname);
DWORD domainnamesize = sizeof(domainname);
SID_NAME_USE accountnameuse;
+ HMODULE secur32;
+ QUERY_SECURITY_CONTEXT_TOKEN_FN _QuerySecurityContextToken;
/*
@@ -726,12 +731,36 @@ pg_SSPI_recvauth(Port *port)
*
* Get the name of the user that authenticated, and compare it to the
* pg username that was specified for the connection.
+ *
+ * MingW is missing the export for QuerySecurityContextToken in
+ * the secur32 library, so we have to load it dynamically.
*/
- r = QuerySecurityContextToken(sspictx, &token);
+ secur32 = LoadLibrary("SECUR32.DLL");
+ if (secur32 == NULL)
+ ereport(ERROR,
+ (errmsg_internal("could not load secur32.dll: %d",
+ (int)GetLastError())));
+
+ _QuerySecurityContextToken = (QUERY_SECURITY_CONTEXT_TOKEN_FN)
+ GetProcAddress(secur32, "QuerySecurityContextToken");
+ if (_QuerySecurityContextToken == NULL)
+ {
+ FreeLibrary(secur32);
+ ereport(ERROR,
+ (errmsg_internal("could not locate QuerySecurityContextToken in secur32.dll: %d",
+ (int)GetLastError())));
+ }
+
+ r = (_QuerySecurityContextToken)(sspictx, &token);
if (r != SEC_E_OK)
+ {
+ FreeLibrary(secur32);
pg_SSPI_error(ERROR,
gettext_noop("could not get security token from context"), r);
+ }
+
+ FreeLibrary(secur32);
/*
* No longer need the security context, everything from here on uses the