Module: wine Branch: refs/heads/master Commit: 63b66b95f97e68487973e38fe4c647869a878c5d URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=63b66b95f97e68487973e38f...
Author: Robert Shearman rob@codeweavers.com Date: Thu May 18 03:41:34 2006 +0100
rpcrt4: Implement RpcBindingSetAuthInfoExW based on the implementation for RpcBindingSetAuthInfoExA.
---
dlls/rpcrt4/rpc_binding.c | 63 ++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 61 insertions(+), 2 deletions(-)
diff --git a/dlls/rpcrt4/rpc_binding.c b/dlls/rpcrt4/rpc_binding.c index 6bc3182..631d46e 100644 --- a/dlls/rpcrt4/rpc_binding.c +++ b/dlls/rpcrt4/rpc_binding.c @@ -1088,9 +1088,68 @@ RpcBindingSetAuthInfoExW( RPC_BINDING_HA unsigned long AuthnSvc, RPC_AUTH_IDENTITY_HANDLE AuthIdentity, unsigned long AuthzSvr, RPC_SECURITY_QOS *SecurityQos ) { - FIXME("%p %s %lu %lu %p %lu %p\n", Binding, debugstr_w((const WCHAR*)ServerPrincName), - AuthnLevel, AuthnSvc, AuthIdentity, AuthzSvr, SecurityQos); + RpcBinding* bind = (RpcBinding*)Binding; + SECURITY_STATUS r; + CredHandle cred; + TimeStamp exp; + ULONG package_count; + ULONG i; + PSecPkgInfoW packages; + + TRACE("%p %s %lu %lu %p %lu %p\n", Binding, debugstr_w((const WCHAR*)ServerPrincName), + AuthnLevel, AuthnSvc, AuthIdentity, AuthzSvr, SecurityQos); + + if (AuthnLevel != RPC_C_AUTHN_LEVEL_CONNECT) + { + FIXME("unsupported AuthnLevel %lu\n", AuthnLevel); + return RPC_S_UNKNOWN_AUTHN_LEVEL; + } + + if (AuthzSvr) + { + FIXME("unsupported AuthzSvr %lu\n", AuthzSvr); + return RPC_S_UNKNOWN_AUTHZ_SERVICE; + } + + if (SecurityQos) + FIXME("SecurityQos ignored\n"); + + r = EnumerateSecurityPackagesW(&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", debugstr_w(packages[i].Name), AuthnSvc); + r = AcquireCredentialsHandleW((SEC_WCHAR *)ServerPrincName, 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); + bind->AuthInfo = NULL; + 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 RPC_S_SEC_PKG_ERROR; + } }
/***********************************************************************