summaryrefslogtreecommitdiffstats
path: root/src/lib/ccapi/windows/client.c
diff options
context:
space:
mode:
authorSam Hartman <hartmans@mit.edu>2006-06-22 18:43:20 +0000
committerSam Hartman <hartmans@mit.edu>2006-06-22 18:43:20 +0000
commite1c6f641ea03e411ddfa6af9a66e5e3801554a33 (patch)
tree1dce165b527fbe4cb89dd551ce2d740f0d7b3ffa /src/lib/ccapi/windows/client.c
parentc09f8fec46803bc14c6c3b3560459891ff993bb9 (diff)
parent90c9fe974de343ffec87efbed89ddcfefd431d9e (diff)
downloadkrb5-e1c6f641ea03e411ddfa6af9a66e5e3801554a33.tar.gz
krb5-e1c6f641ea03e411ddfa6af9a66e5e3801554a33.tar.xz
krb5-e1c6f641ea03e411ddfa6af9a66e5e3801554a33.zip
r18022@luminous: jaltman | 2006-05-19 05:18:37 -0400
Updates of portable CCAPI sources. All code compiles. r18025@luminous: jaltman | 2006-05-20 23:48:39 -0400 Construct an outline of a sample platform specific main.c Add ccs_serv_cleanup() routine. Currently does nothing. Correct field names used within the authorization check. r18026@luminous: jaltman | 2006-05-22 02:25:43 -0400 More byte order conversions in the server operations code. r18027@luminous: jaltman | 2006-05-22 13:12:49 -0400 Source files containing common routines used by both the client and the server. r18028@luminous: jaltman | 2006-05-22 13:17:07 -0400 Move msg.c and marshall.c to common library. Add dllmain.c which contains the Windows DllMain() entry point. This must be moved later to a Windows specific directory. Cleanup type usage and function name references. All that is missing now from the client DLL is a definition of cci_perform_rpc() which is the entry point to the IPC routine. r18029@luminous: jaltman | 2006-05-22 13:18:27 -0400 Move generic list functions to common/generic_lists.c so they can be used by both the client dll and the server. Fix type utilization in serv_ops.c r18083@luminous: jaltman | 2006-06-05 13:49:34 -0400 improved error handling r18094@luminous: jaltman | 2006-06-09 10:42:04 -0400 * corrections to windows rpc layer * corrections to network byte order conversions r18095@luminous: lxs | 2006-06-09 17:46:24 -0400 cci_msg_retrieve_blob(): changed argument 4 from void** to char** to suppress the warnings from gcc. r18096@luminous: lxs | 2006-06-09 17:55:32 -0400 moved enum cc_list_type to generic_lists.h to avoid "incomplete enum" warnings when compiling generic_lists.c r18097@luminous: lxs | 2006-06-09 17:56:15 -0400 Removed ancient Metrowerks tests from public headers. r18098@luminous: lxs | 2006-06-09 17:57:20 -0400 Include string.h to get memcpy, strlen, etc on BSD OSes. r18099@luminous: lxs | 2006-06-09 17:59:36 -0400 Added Mac OS X project file and Mach-IPC support code r18106@luminous: jaltman | 2006-06-12 09:56:31 -0400 remove duplicate header file and obsolete source file r18193@luminous: jaltman | 2006-06-22 12:57:14 -0400 This commit updates lib/krb5/ccache/ccapi to support CCAPI Version 3 and above. Specify -DUSE_CCAPI_V3=1 when compiling to use CCAPI Version 3 r18194@luminous: jaltman | 2006-06-22 12:58:37 -0400 Fix parameter name in cc_credentials_iterator_t next() r18195@luminous: jaltman | 2006-06-22 12:59:08 -0400 Add missing header r18196@luminous: jaltman | 2006-06-22 13:11:37 -0400 Use the old exported names for setup and shutdown r18197@luminous: jaltman | 2006-06-22 13:18:14 -0400 krb5_stdccv3_setup is ok === Please enter your commit message above this line === git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@18200 dc483132-0cff-0310-8789-dd5450dbe970
Diffstat (limited to 'src/lib/ccapi/windows/client.c')
-rw-r--r--src/lib/ccapi/windows/client.c141
1 files changed, 141 insertions, 0 deletions
diff --git a/src/lib/ccapi/windows/client.c b/src/lib/ccapi/windows/client.c
new file mode 100644
index 000000000..e30801dab
--- /dev/null
+++ b/src/lib/ccapi/windows/client.c
@@ -0,0 +1,141 @@
+#include <windows.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <tchar.h>
+#include "ntccrpc.h"
+#include <strsafe.h>
+#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) {
+ 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;
+}
+
+
+/* __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)
+{
+ 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())
+ return -1;
+
+ cci_get_thread_session_id(client_name, sizeof(client_name), &luid);
+
+ __luid.HighPart = luid.HighPart;
+ __luid.LowPart = luid.LowPart;
+
+ /* 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;
+
+ cleanup:
+ return code;
+}