From 3d6591dd63c23bcc0ae68e94a960c85fd53daad0 Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Mon, 5 Jun 2006 04:30:35 +0000 Subject: more updates git-svn-id: svn://anonsvn.mit.edu/krb5/branches/ccapi@18082 dc483132-0cff-0310-8789-dd5450dbe970 --- src/lib/ccapi/windows/client.c | 120 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 src/lib/ccapi/windows/client.c (limited to 'src/lib/ccapi/windows/client.c') diff --git a/src/lib/ccapi/windows/client.c b/src/lib/ccapi/windows/client.c new file mode 100644 index 000000000..db0b63aec --- /dev/null +++ b/src/lib/ccapi/windows/client.c @@ -0,0 +1,120 @@ +#include +#include +#include +#include +#include "ntccrpc.h" +#include +#include "CredentialsCache.h" +#include "msg.h" + +static RPC_BINDING_HANDLE hRpcBinding; + +void * __RPC_USER MIDL_user_allocate(size_t s) { + return malloc(s); +} + +void __RPC_USER MIDL_user_free(void * p) { + free(p); +} + +int cc_rpc_init(void) { + RPC_STATUS status; + TCHAR * bindstring = NULL; + RPC_SECURITY_QOS sqos; + + status = RpcStringBindingCompose(NULL, + _T("ncalrpc"), + NULL, + NULL, + NULL, + &bindstring); + + if (status != RPC_S_OK) { + fprintf(stderr, "RpcStringBindingCompose failed: %d\n", + status); + return 1; + } + + status = RpcBindingFromStringBinding(bindstring, + &hRpcBinding); + + if (status != RPC_S_OK) { + fprintf(stderr, "RpcBindingFromStringBinding failed: %d\n", + status); + return 1; + } + + status = RpcStringFree(&bindstring); + + ZeroMemory(&sqos, sizeof(sqos)); + + sqos.Version = 1; + sqos.Capabilities = RPC_C_QOS_CAPABILITIES_DEFAULT; + sqos.IdentityTracking = RPC_C_QOS_IDENTITY_STATIC; + sqos.ImpersonationType = RPC_C_IMP_LEVEL_IMPERSONATE; + + status = RpcBindingSetAuthInfoEx(hRpcBinding, + NULL, + RPC_C_AUTHN_LEVEL_CALL, + RPC_C_AUTHN_WINNT, + NULL, + 0, + &sqos); + if (status != RPC_S_OK) { + fprintf(stderr, "RpcBindingSetAuthInfoEx failed: %d\n", + status); + return 1; + } + + return 0; +} + +int cc_rpc_cleanup(void) { + RPC_STATUS status; + + status = RpcBindingFree(&hRpcBinding); + + return 0; +} + +cc_int32 cci_set_thread_session_id(unsigned char * client_name, LUID luid) { + +} + +void cci_get_thread_session_id(unsigned char * client_name, int len, LUID *pluid) { + +} + + +/* __int32 ccapi_Message( + * [in] handle_t h, + * [string][in] unsigned char *client_name, + * [in] struct _LUID luid, + * [in] __int32 cb_buffer, + * [out] __int32 *cb_len, + * [size_is][string][out] unsigned char buffer[ ]); + */ + +cc_int32 cci_perform_rpc(cc_msg_t *request, cc_msg_t **response) +{ + __int32 rpc_code; + unsigned char client_name[256]; + LUID luid; + struct __LUID __luid; + unsigned char out_buf[MAXMSGLEN]; + __int32 out_len = MAXMSGLEN; + + if (!cc_rpc_init()) + return -1; + + cci_get_thread_session_id(client_name, sizeof(client_name), &luid); + + __luid.HighPart = luid.HighPart; + __luid.LowPart = luid.LowPart; + + rpc_code = ccapi_Message(hRpcBinding, client_name, __luid, + request->flat, request->flat_len, + out_buf, &out_len); + + return rpc_code; +} -- cgit From f42fa33b985c230736ad5d9080055916de33be8c Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Mon, 5 Jun 2006 17:49:34 +0000 Subject: improved error handling git-svn-id: svn://anonsvn.mit.edu/krb5/branches/ccapi@18083 dc483132-0cff-0310-8789-dd5450dbe970 --- src/lib/ccapi/windows/client.c | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) (limited to 'src/lib/ccapi/windows/client.c') diff --git a/src/lib/ccapi/windows/client.c b/src/lib/ccapi/windows/client.c index db0b63aec..e30801dab 100644 --- a/src/lib/ccapi/windows/client.c +++ b/src/lib/ccapi/windows/client.c @@ -78,11 +78,13 @@ int cc_rpc_cleanup(void) { } cc_int32 cci_set_thread_session_id(unsigned char * client_name, LUID luid) { - + return 0; } void cci_get_thread_session_id(unsigned char * client_name, int len, LUID *pluid) { - + client_name[0] = '\0'; + pluid->HighPart = 0; + pluid->LowPart = 0; } @@ -97,14 +99,14 @@ void cci_get_thread_session_id(unsigned char * client_name, int len, LUID *pluid cc_int32 cci_perform_rpc(cc_msg_t *request, cc_msg_t **response) { - __int32 rpc_code; + cc_int32 code; unsigned char client_name[256]; LUID luid; struct __LUID __luid; unsigned char out_buf[MAXMSGLEN]; __int32 out_len = MAXMSGLEN; - if (!cc_rpc_init()) + if (cc_rpc_init()) return -1; cci_get_thread_session_id(client_name, sizeof(client_name), &luid); @@ -112,9 +114,28 @@ cc_int32 cci_perform_rpc(cc_msg_t *request, cc_msg_t **response) __luid.HighPart = luid.HighPart; __luid.LowPart = luid.LowPart; - rpc_code = ccapi_Message(hRpcBinding, client_name, __luid, + /* flatten response */ + code = cci_msg_flatten(request, NULL); + if (code) + goto cleanup; + + RpcTryExcept { + code = ccapi_Message(hRpcBinding, client_name, __luid, request->flat, request->flat_len, out_buf, &out_len); + } + RpcExcept(1) { + code = RpcExceptionCode(); + } + RpcEndExcept; + if (code) + goto cleanup; + + /* unflatten message */ + code = cci_msg_unflatten(out_buf, out_len, response); + if (code) + goto cleanup; - return rpc_code; + cleanup: + return code; } -- cgit