Robert Shearman : rpcrt4: Support all available security packages in RpcBindingSetAuthInfoExA, instead of just NTLM.

Alexandre Julliard julliard at wine.codeweavers.com
Thu May 18 03:56:58 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: 84e42e0165cbc77f7a5ac6931ad050888a9f9b77
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=84e42e0165cbc77f7a5ac6931ad050888a9f9b77

Author: Robert Shearman <rob at codeweavers.com>
Date:   Thu May 18 03:41:16 2006 +0100

rpcrt4: Support all available security packages in RpcBindingSetAuthInfoExA, instead of just NTLM.

---

 dlls/rpcrt4/rpc_binding.c |   38 +++++++++++++++++++++++++++++---------
 1 files changed, 29 insertions(+), 9 deletions(-)

diff --git a/dlls/rpcrt4/rpc_binding.c b/dlls/rpcrt4/rpc_binding.c
index 0801de7..73bff58 100644
--- a/dlls/rpcrt4/rpc_binding.c
+++ b/dlls/rpcrt4/rpc_binding.c
@@ -1017,9 +1017,12 @@ RpcBindingSetAuthInfoExA( RPC_BINDING_HA
                           RPC_SECURITY_QOS *SecurityQos )
 {
   RpcBinding* bind = (RpcBinding*)Binding;
-  RPC_STATUS r;
+  SECURITY_STATUS r;
   CredHandle cred;
   TimeStamp exp;
+  ULONG package_count;
+  ULONG i;
+  PSecPkgInfoA packages;
 
   TRACE("%p %s %lu %lu %p %lu %p\n", Binding, debugstr_a((const char*)ServerPrincName),
         AuthnLevel, AuthnSvc, AuthIdentity, AuthzSvr, SecurityQos);
@@ -1033,12 +1036,6 @@ RpcBindingSetAuthInfoExA( RPC_BINDING_HA
     return RPC_S_UNKNOWN_AUTHN_LEVEL;
   }
 
-  if (AuthnSvc != RPC_C_AUTHN_WINNT)
-  {
-    FIXME("unsupported AuthnSvc %lu\n", AuthnSvc);
-    return RPC_S_UNKNOWN_AUTHN_SERVICE;
-  }
-
   if (AuthzSvr)
   {
     FIXME("unsupported AuthzSvr %lu\n", AuthzSvr);
@@ -1048,8 +1045,28 @@ RpcBindingSetAuthInfoExA( RPC_BINDING_HA
   if (SecurityQos)
     FIXME("SecurityQos ignored\n");
 
-  r = AcquireCredentialsHandleA(NULL, "NTLM", SECPKG_CRED_OUTBOUND, NULL,
+  r = EnumerateSecurityPackagesA(&package_count, &packages);
+  if (r != SEC_E_OK)
+  {
+    ERR("EnumerateSecurityPackagesA failed with error 0x%08lx\n", r);
+    return RPC_S_SEC_PKG_ERROR;
+  }
+
+  for (i = 0; i < package_count; i++)
+    if (packages[i].wRPCID == AuthnSvc)
+        break;
+
+  if (i == package_count)
+  {
+    FIXME("unsupported AuthnSvc %lu\n", AuthnSvc);
+    FreeContextBuffer(packages);
+    return RPC_S_UNKNOWN_AUTHN_SERVICE;
+  }
+
+  TRACE("found package %s for service %ld\n", packages[i].Name, AuthnSvc);
+  r = AcquireCredentialsHandleA(NULL, packages[i].Name, SECPKG_CRED_OUTBOUND, NULL,
                                 AuthIdentity, NULL, NULL, &cred, &exp);
+  FreeContextBuffer(packages);
   if (r == ERROR_SUCCESS)
   {
     if (bind->AuthInfo) RpcAuthInfo_Release(bind->AuthInfo);
@@ -1057,10 +1074,13 @@ RpcBindingSetAuthInfoExA( RPC_BINDING_HA
     r = RpcAuthInfo_Create(AuthnLevel, AuthnSvc, cred, exp, &bind->AuthInfo);
     if (r != RPC_S_OK)
       FreeCredentialsHandle(&cred);
+    return RPC_S_OK;
   }
   else
+  {
     ERR("AcquireCredentialsHandleA failed with error 0x%08lx\n", r);
-  return r;
+    return RPC_S_SEC_PKG_ERROR;
+  }
 }
 
 /***********************************************************************




More information about the wine-cvs mailing list