diff options
| author | Sam Hartman <hartmans@mit.edu> | 2006-06-22 18:43:20 +0000 |
|---|---|---|
| committer | Sam Hartman <hartmans@mit.edu> | 2006-06-22 18:43:20 +0000 |
| commit | e1c6f641ea03e411ddfa6af9a66e5e3801554a33 (patch) | |
| tree | 1dce165b527fbe4cb89dd551ce2d740f0d7b3ffa /src | |
| parent | c09f8fec46803bc14c6c3b3560459891ff993bb9 (diff) | |
| parent | 90c9fe974de343ffec87efbed89ddcfefd431d9e (diff) | |
| download | krb5-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')
67 files changed, 13028 insertions, 4791 deletions
diff --git a/src/lib/ccapi/NTMakefile b/src/lib/ccapi/NTMakefile new file mode 100644 index 0000000000..57c42e337e --- /dev/null +++ b/src/lib/ccapi/NTMakefile @@ -0,0 +1,25 @@ +CD = cd
+
+all:
+ $(CD) common
+ $(MAKE) -f NTMakefile all
+ $(CD) ../client
+ $(MAKE) -f NTMakefile all
+ $(CD) ../server
+ $(MAKE) -f NTMakefile all
+ $(CD) ../windows
+ $(MAKE) -f NTMakefile all
+ $(CD) ..
+
+clean:
+ $(CD) common
+ $(MAKE) -f NTMakefile clean
+ $(CD) ../client
+ $(MAKE) -f NTMakefile clean
+ $(CD) ../server
+ $(MAKE) -f NTMakefile clean
+ $(CD) ../windows
+ $(MAKE) -f NTMakefile clean
+ $(CD) ..
+
+
diff --git a/src/lib/ccapi/client/NTMakefile b/src/lib/ccapi/client/NTMakefile index 09ef9df38b..2ce87c3507 100644 --- a/src/lib/ccapi/client/NTMakefile +++ b/src/lib/ccapi/client/NTMakefile @@ -1,22 +1,18 @@ !INCLUDE <WIN32.MAK> -CFLAGS = -I../include +CFLAGS = -I../include $(cdebug) $(cflags) $(cvarsmt) -CCAPI_OBJS = cacheapi.obj context.obj ccache.obj credentials.obj ccache_iterator.obj \ - credentials_iterator.obj ccstring.obj marshall.obj msg.obj +CC_CLIENT_OBJS = cacheapi.obj context.obj ccache.obj credentials.obj ccache_iterator.obj \ + credentials_iterator.obj ccstring.obj ccapiv2.obj -CCAPI_LIB = ccapi.lib - -$(CCAPI_LIB): $(CCAPI_OBJS) - $(implib) /NOLOGO /OUT:$@ $** - -CCAPI_DLLFILE = krbcc32.dll +CC_CLIENT_LIB = cc_client.lib +CC_COMMON_LIB = ..\common\cc_common.lib +$(CC_CLIENT_LIB): $(CC_CLIENT_OBJS) + $(implib) /NOLOGO /OUT:$@ $** -$(CCAPI_DLLFILE): $(CCAPI_LIB) - $(DLLGUILINK) -def:windows\krbcc32.def - $(DLLPREP) +all: $(CC_CLIENT_LIB) clean: del *.obj *.lib diff --git a/src/lib/ccapi/client/cacheapi.c b/src/lib/ccapi/client/cacheapi.c index 2c874bec0f..89c5e63d1b 100644 --- a/src/lib/ccapi/client/cacheapi.c +++ b/src/lib/ccapi/client/cacheapi.c @@ -1,6 +1,6 @@ /* $Copyright: * - * Copyright 2004 by the Massachusetts Institute of Technology. + * Copyright 2004-2006 by the Massachusetts Institute of Technology. * * All rights reserved. * @@ -43,33 +43,43 @@ #include <stdlib.h> #include <stdio.h> +#include <string.h> #include <CredentialsCache.h> #include "ccache.h" #include "ccache_iterator.h" #include "context.h" +#include "cc_rpc.h" #include "msg.h" #include "msg_headers.h" -cc_int32 +/*! \fn cc_initialize + * \brief A function that initializes a ccapi context for the caller. + * \param[out] outContext a cc_context_t pointer to which is assigned the newly created context upon success. + * \param[in] inVersion a cc_int32 that specifies the + */ + +CCACHE_API cc_int32 cc_initialize ( cc_context_t* outContext, cc_int32 inVersion, cc_int32* outSupportedVersion, char const** outVendor) { static char vendor[128] = ""; - cc_msg_t *request; + cc_msg_t *request = NULL; ccmsg_init_t *request_header; - cc_msg_t *response; + cc_msg_t *response = NULL; + cc_uint32 type; ccmsg_init_resp_t *response_header; cc_int32 code; if ((inVersion != ccapi_version_2) && (inVersion != ccapi_version_3) && (inVersion != ccapi_version_4) && - (inVersion != ccapi_version_5)) { + (inVersion != ccapi_version_5) && + (inVersion != ccapi_version_6)) { if (outSupportedVersion != NULL) { - *outSupportedVersion = ccapi_version_5; + *outSupportedVersion = ccapi_version_6; } return ccErrBadAPIVersion; } @@ -78,29 +88,43 @@ cc_initialize ( cc_context_t* outContext, if (request_header == NULL) return ccErrNoMem; - request_header->in_version = inVersion; + /* If the version number is 2, the caller will be passing + * the structure into the v2 compatibility functions which + * in turn will call the v6 functions. Set the version to + * ccapi_version_max since that is what the compatibility + * functions will be expecting. + */ + if (inVersion == ccapi_version_2) + inVersion = ccapi_version_max; + + /* Construct the request */ + request_header->in_version = htonl(inVersion); code = cci_msg_new(ccmsg_INIT, &request); - if (code != ccNoError) { - free(request_header); - return code; - } + if (code != ccNoError) + goto cleanup; code = cci_msg_add_header(request, request_header, sizeof(ccmsg_init_t)); + if (code != ccNoError) + goto cleanup; + request_header = NULL; code = cci_perform_rpc(request, &response); + if (code != ccNoError) + goto cleanup; - if (response->type == ccmsg_NACK) { + type = ntohl(response->type); + if (type == ccmsg_NACK) { ccmsg_nack_t * nack_header = (ccmsg_nack_t *)response->header; - code = nack_header->err_code; - } else if (response->type == ccmsg_ACK) { + code = ntohl(nack_header->err_code); + } else if (type == ccmsg_ACK) { response_header = (ccmsg_init_resp_t *)response->header; - *outSupportedVersion = response_header->out_version; - code = cc_context_int_new(outContext, response_header->out_ctx, response_header->out_version); + *outSupportedVersion = ntohl(response_header->out_version); + code = cc_int_context_new(outContext, ntohll(response_header->out_ctx), ntohl(response_header->out_version)); if (!vendor[0]) { char * string; - code = cci_msg_retrieve_blob(response, response_header->vendor_offset, response_header->vendor_length, &string); + code = cci_msg_retrieve_blob(response, ntohl(response_header->vendor_offset), ntohl(response_header->vendor_length), &string); strncpy(vendor, string, sizeof(vendor)-1); vendor[sizeof(vendor)-1] = '\0'; free(string); @@ -111,8 +135,15 @@ cc_initialize ( cc_context_t* outContext, } else { code = ccErrBadInternalMessage; } - cci_msg_destroy(request); - cci_msg_destroy(response); + + cleanup: + if (request_header) + free(request_header); + + if (request) + cci_msg_destroy(request); + if (response) + cci_msg_destroy(response); return code; } diff --git a/src/lib/ccapi/client/ccache.c b/src/lib/ccapi/client/ccache.c index 5de3880e4f..07e9b8e879 100644 --- a/src/lib/ccapi/client/ccache.c +++ b/src/lib/ccapi/client/ccache.c @@ -1,6 +1,6 @@ /* $Copyright: * - * Copyright 2004 by the Massachusetts Institute of Technology. + * Copyright 2004-2006 by the Massachusetts Institute of Technology. * * All rights reserved. * @@ -46,11 +46,21 @@ #include <stdlib.h> #include <stdio.h> +#include <string.h> #include <CredentialsCache.h> #include "credentials.h" +#include "credentials_iterator.h" #include "ccache.h" +#include "cc_rpc.h" #include "msg.h" #include "msg_headers.h" +#include "ccstring.h" + +/* + * cc_int_ccache_new + * + * Input parameters in host order. + */ cc_int32 cc_int_ccache_new( cc_ccache_t * pccache, cc_handle hctx, cc_handle hccache ) @@ -97,11 +107,12 @@ cc_int_ccache_new( cc_ccache_t * pccache, cc_handle hctx, cc_handle hccache ) cc_int32 cc_int_ccache_release( cc_ccache_t ccache ) { - cc_int_ccache_t int_ccache; - cc_msg_t *request; - ccmsg_ccache_release_t *request_header; - cc_msg_t *response; - cc_int32 code; + cc_int_ccache_t int_ccache; + cc_msg_t *request = NULL; + ccmsg_ccache_release_t *request_header = NULL; + cc_msg_t *response = NULL; + cc_uint32 type; + cc_int32 code; if ( ccache == NULL ) return ccErrBadParam; @@ -114,30 +125,41 @@ cc_int_ccache_release( cc_ccache_t ccache ) request_header = (ccmsg_ccache_release_t*)malloc(sizeof(ccmsg_ccache_release_t)); if (request_header == NULL) return ccErrNoMem; - request_header->ctx = int_ccache->ctx; - request_header->ccache = int_ccache->handle; + request_header->ctx = htonll(int_ccache->ctx); + request_header->ccache = htonll(int_ccache->handle); code = cci_msg_new(ccmsg_CCACHE_RELEASE, &request); - if (code != ccNoError) { - free(request_header); - return code; - } + if (code != ccNoError) + goto cleanup; code = cci_msg_add_header(request, request_header, sizeof(ccmsg_ccache_release_t)); + if (code != ccNoError) + goto cleanup; + request_header = NULL; code = cci_perform_rpc(request, &response); + if (code != ccNoError) + goto cleanup; - if (response->type == ccmsg_NACK) { + type = ntohl(response->type); + if (type == ccmsg_NACK) { ccmsg_nack_t * nack_header = (ccmsg_nack_t *)response->header; - code = nack_header->err_code; - } else if (response->type == ccmsg_ACK) { + code = ntohl(nack_header->err_code); + } else if (type == ccmsg_ACK) { code = ccNoError; } else { code = ccErrBadInternalMessage; } - cci_msg_destroy(request); - cci_msg_destroy(response); - free(int_ccache->functions); + + cleanup: + if (request_header) + free(request_header); + if (request) + cci_msg_destroy(request); + if (response) + cci_msg_destroy(response); + if (int_ccache->functions) + free(int_ccache->functions); free(int_ccache); return code; } @@ -146,11 +168,12 @@ cc_int_ccache_release( cc_ccache_t ccache ) cc_int32 cc_int_ccache_destroy( cc_ccache_t ccache ) { - cc_int_ccache_t int_ccache; - cc_msg_t *request; - ccmsg_ccache_destroy_t *request_header; - cc_msg_t *response; - cc_int32 code; + cc_int_ccache_t int_ccache; + cc_msg_t *request = NULL; + ccmsg_ccache_destroy_t *request_header = NULL; + cc_msg_t *response = NULL; + cc_uint32 type; + cc_int32 code; if ( ccache == NULL ) return ccErrBadParam; @@ -163,29 +186,39 @@ cc_int_ccache_destroy( cc_ccache_t ccache ) request_header = (ccmsg_ccache_destroy_t*)malloc(sizeof(ccmsg_ccache_destroy_t)); if (request_header == NULL) return ccErrNoMem; - request_header->ctx = int_ccache->ctx; - request_header->ccache = int_ccache->handle; + request_header->ctx = htonll(int_ccache->ctx); + request_header->ccache = htonll(int_ccache->handle); code = cci_msg_new(ccmsg_CCACHE_DESTROY, &request); - if (code != ccNoError) { - free(request_header); - return code; - } + if (code != ccNoError) + goto cleanup; code = cci_msg_add_header(request, request_header, sizeof(ccmsg_ccache_destroy_t)); + if (code != ccNoError) + goto cleanup; + request_header = NULL; code = cci_perform_rpc(request, &response); + if (code != ccNoError) + goto cleanup; - if (response->type == ccmsg_NACK) { + type = ntohl(response->type); + if (type == ccmsg_NACK) { ccmsg_nack_t * nack_header = (ccmsg_nack_t *)response->header; - code = nack_header->err_code; - } else if (response->type == ccmsg_ACK) { + code = ntohl(nack_header->err_code); + } else if (type == ccmsg_ACK) { code = ccNoError; } else { code = ccErrBadInternalMessage; } - cci_msg_destroy(request); - cci_msg_destroy(response); + + cleanup: + if (request_header) + free(request_header); + if (request) + cci_msg_destroy(request); + if (response) + cci_msg_destroy(response); free(ccache); return code; } @@ -194,11 +227,12 @@ cc_int_ccache_destroy( cc_ccache_t ccache ) cc_int32 cc_int_ccache_set_default( cc_ccache_t ccache ) { - cc_int_ccache_t int_ccache; - cc_msg_t *request; - ccmsg_ccache_set_default_t *request_header; - cc_msg_t *response; - cc_int32 code; + cc_int_ccache_t int_ccache; + cc_msg_t *request = NULL; + ccmsg_ccache_set_default_t *request_header = NULL; + cc_msg_t *response = NULL; + cc_uint32 type; + cc_int32 code; if ( ccache == NULL ) return ccErrBadParam; @@ -211,29 +245,39 @@ cc_int_ccache_set_default( cc_ccache_t ccache ) request_header = (ccmsg_ccache_set_default_t*)malloc(sizeof(ccmsg_ccache_set_default_t)); if (request_header == NULL) return ccErrNoMem; - request_header->ctx = int_ccache->ctx; - request_header->ccache = int_ccache->handle; + request_header->ctx = htonll(int_ccache->ctx); + request_header->ccache = htonll(int_ccache->handle); code = cci_msg_new(ccmsg_CCACHE_SET_DEFAULT, &request); - if (code != ccNoError) { - free(request_header); - return code; - } + if (code != ccNoError) + goto cleanup; code = cci_msg_add_header(request, request_header, sizeof(ccmsg_ccache_set_default_t)); + if (code != ccNoError) + goto cleanup; + request_header = NULL; code = cci_perform_rpc(request, &response); + if (code != ccNoError) + goto cleanup; - if (response->type == ccmsg_NACK) { + type = ntohl(response->type); + if (type == ccmsg_NACK) { ccmsg_nack_t * nack_header = (ccmsg_nack_t *)response->header; - code = nack_header->err_code; - } else if (response->type == ccmsg_ACK) { + code = ntohl(nack_header->err_code); + } else if (type == ccmsg_ACK) { code = ccNoError; } else { code = ccErrBadInternalMessage; } - cci_msg_destroy(request); - cci_msg_destroy(response); + + cleanup: + if (request_header) + free(request_header); + if (request) + cci_msg_destroy(request); + if (response) + cci_msg_destroy(response); return code; } @@ -241,11 +285,12 @@ cc_int32 cc_int_ccache_get_credentials_version( cc_ccache_t ccache, cc_uint32* credentials_version) { - cc_int_ccache_t int_ccache; - cc_msg_t *request; - ccmsg_ccache_get_creds_version_t *request_header; - cc_msg_t *response; - cc_int32 code; + cc_int_ccache_t int_ccache; + cc_msg_t *request = NULL; + ccmsg_ccache_get_creds_version_t *request_header = NULL; + cc_msg_t *response = NULL; + cc_uint32 type; + cc_int32 code; if ( ccache == NULL ) return ccErrBadParam; @@ -258,43 +303,53 @@ cc_int_ccache_get_credentials_version( cc_ccache_t ccache, request_header = (ccmsg_ccache_get_creds_version_t*)malloc(sizeof(ccmsg_ccache_get_creds_version_t)); if (request_header == NULL) return ccErrNoMem; - request_header->ctx = int_ccache->ctx; - request_header->ccache = int_ccache->handle; + request_header->ctx = htonll(int_ccache->ctx); + request_header->ccache = htonll(int_ccache->handle); code = cci_msg_new(ccmsg_CCACHE_GET_CREDS_VERSION, &request); - if (code != ccNoError) { - free(request_header); - return code; - } + if (code != ccNoError) + goto cleanup; code = cci_msg_add_header(request, request_header, sizeof(ccmsg_ccache_get_creds_version_t)); + if (code != ccNoError) + goto cleanup; + request_header = NULL; code = cci_perform_rpc(request, &response); + if (code != ccNoError) + goto cleanup; - if (response->type == ccmsg_NACK) { + type = ntohl(response->type); + if (type == ccmsg_NACK) { ccmsg_nack_t * nack_header = (ccmsg_nack_t *)response->header; - code = nack_header->err_code; - } else if (response->type == ccmsg_ACK) { + code = ntohl(nack_header->err_code); + } else if (type == ccmsg_ACK) { ccmsg_ccache_get_creds_version_resp_t * response_header = (ccmsg_ccache_get_creds_version_resp_t*)response->header; - *credentials_version = response_header->version; + *credentials_version = ntohl(response_header->version); code = ccNoError; } else { code = ccErrBadInternalMessage; } - cci_msg_destroy(request); - cci_msg_destroy(response); + + cleanup: + if (request_header) + free(request_header); + if (request) + cci_msg_destroy(request); + if (response) + cci_msg_destroy(response); return code; } cc_int32 -cc_int_ccache_get_name( cc_ccache_t ccache, - cc_string_t* name ) +cc_int_ccache_get_name( cc_ccache_t ccache, cc_string_t* name ) { - cc_int_ccache_t int_ccache; - cc_msg_t *request; - ccmsg_ccache_get_name_t *request_header; - cc_msg_t *response; - cc_int32 code; + cc_int_ccache_t int_ccache; + cc_msg_t *request = NULL; + ccmsg_ccache_get_name_t *request_header = NULL; + cc_msg_t *response = NULL; + cc_uint32 type; + cc_int32 code; if ( ccache == NULL ) return ccErrBadParam; @@ -307,36 +362,46 @@ cc_int_ccache_get_name( cc_ccache_t ccache, request_header = (ccmsg_ccache_get_name_t*)malloc(sizeof(ccmsg_ccache_get_name_t)); if (request_header == NULL) return ccErrNoMem; - request_header->ctx = int_ccache->ctx; - request_header->ccache = int_ccache->handle; + request_header->ctx = htonll(int_ccache->ctx); + request_header->ccache = htonll(int_ccache->handle); code = cci_msg_new(ccmsg_CCACHE_GET_NAME, &request); - if (code != ccNoError) { - free(request_header); - return code; - } + if (code != ccNoError) + goto cleanup; code = cci_msg_add_header(request, request_header, sizeof(ccmsg_ccache_get_name_t)); + if (code != ccNoError) + goto cleanup; + request_header = NULL; code = cci_perform_rpc(request, &response); + if (code != ccNoError) + goto cleanup; - if (response->type == ccmsg_NACK) { + type = ntohl(response->type); + if (type == ccmsg_NACK) { ccmsg_nack_t * nack_header = (ccmsg_nack_t *)response->header; - code = nack_header->err_code; - } else if (response->type == ccmsg_ACK) { + code = ntohl(nack_header->err_code); + } else if (type == ccmsg_ACK) { char * string; ccmsg_ccache_get_name_resp_t * response_header = (ccmsg_ccache_get_name_resp_t*)response->header; code = cci_msg_retrieve_blob(response, response_header->name_offset, response_header->name_len, &string); if (code == ccNoError) { - code = cc_string_new(&name, string); + code = cci_string_new(name, string); free(string); } } else { code = ccErrBadInternalMessage; } - cci_msg_destroy(request); - cci_msg_destroy(response); + + cleanup: + if (request_header) + free(request_header); + if (request) + cci_msg_destroy(request); + if (response) + cci_msg_destroy(response); return code; } @@ -345,11 +410,12 @@ cc_int_ccache_get_principal( cc_ccache_t ccache, cc_uint32 credentials_version, cc_string_t* principal ) { - cc_int_ccache_t int_ccache; - cc_msg_t *request; - ccmsg_ccache_get_principal_t *request_header; - cc_msg_t *response; - cc_int32 code; + cc_int_ccache_t int_ccache; + cc_msg_t *request = NULL; + ccmsg_ccache_get_principal_t *request_header = NULL; + cc_msg_t *response = NULL; + cc_uint32 type; + cc_int32 code; if ( ccache == NULL ) return ccErrBadParam; @@ -362,37 +428,47 @@ cc_int_ccache_get_principal( cc_ccache_t ccache, request_header = (ccmsg_ccache_get_principal_t*)malloc(sizeof(ccmsg_ccache_get_principal_t)); if (request_header == NULL) return ccErrNoMem; - request_header->ctx = int_ccache->ctx; - request_header->ccache = int_ccache->handle; - request_header->version = credentials_version; + request_header->ctx = htonll(int_ccache->ctx); + request_header->ccache = htonll(int_ccache->handle); + request_header->version = htonl(credentials_version); code = cci_msg_new(ccmsg_CCACHE_GET_PRINCIPAL, &request); - if (code != ccNoError) { - free(request_header); - return code; - } + if (code != ccNoError) + goto cleanup; code = cci_msg_add_header(request, request_header, sizeof(ccmsg_ccache_get_principal_t)); + if (code != ccNoError) + goto cleanup; + request_header = NULL; code = cci_perform_rpc(request, &response); + if (code != ccNoError) + goto cleanup; - if (response->type == ccmsg_NACK) { + type = ntohl(response->type); + if (type == ccmsg_NACK) { ccmsg_nack_t * nack_header = (ccmsg_nack_t *)response->header; - code = nack_header->err_code; - } else if (response->type == ccmsg_ACK) { + code = ntohl(nack_header->err_code); + } else if (type == ccmsg_ACK) { char * string; ccmsg_ccache_get_principal_resp_t * response_header = (ccmsg_ccache_get_principal_resp_t*)response->header; code = cci_msg_retrieve_blob(response, response_header->principal_offset, response_header->principal_len, &string); if (code == ccNoError) { - code = cc_string_new(&principal, string); + code = cci_string_new(principal, string); free(string); } } else { code = ccErrBadInternalMessage; } - cci_msg_destroy(request); - cci_msg_destroy(response); + + cleanup: + if (request_header) + free(request_header); + if (request) + cci_msg_destroy(request); + if (response) + cci_msg_destroy(response); return code; } @@ -401,12 +477,13 @@ cc_int_ccache_set_principal( cc_ccache_t ccache, cc_uint32 credentials_version, const char* principal ) { - cc_uint32 blob_pos; - cc_int_ccache_t int_ccache; - cc_msg_t *request; - ccmsg_ccache_set_principal_t *request_header; - cc_msg_t *response; - cc_int32 code; + cc_uint32 blob_pos; + cc_int_ccache_t int_ccache; + cc_msg_t *request = NULL; + ccmsg_ccache_set_principal_t *request_header = NULL; + cc_msg_t *response = NULL; + cc_uint32 type; + cc_int32 code; if ( ccache == NULL ) return ccErrBadParam; @@ -419,40 +496,47 @@ cc_int_ccache_set_principal( cc_ccache_t ccache, request_header = (ccmsg_ccache_set_principal_t*)malloc(sizeof(ccmsg_ccache_set_principal_t)); if (request_header == NULL) return ccErrNoMem; - request_header->ctx = int_ccache->ctx; - request_header->ccache = int_ccache->handle; - request_header->version = credentials_version; + request_header->ctx = htonll(int_ccache->ctx); + request_header->ccache = htonll(int_ccache->handle); + request_header->version = htonl(credentials_version); code = cci_msg_new(ccmsg_CCACHE_GET_PRINCIPAL, &request); - if (code != ccNoError) { - free(request_header); - return code; - } + if (code != ccNoError) + goto cleanup; code = cci_msg_add_data_blob(request, (void*)principal, strlen(principal) + 1, &blob_pos); - if (code != ccNoError) { - cci_msg_destroy(request); - free(request_header); - return code; - } + if (code != ccNoError) + goto cleanup; - request_header->principal_offset = blob_pos; - request_header->principal_len = strlen(principal) + 1; + request_header->principal_offset = htonl(blob_pos); + request_header->principal_len = htonl(strlen(principal) + 1); code = cci_msg_add_header(request, request_header, sizeof(ccmsg_ccache_set_principal_t)); + if (code != ccNoError) + goto cleanup; + request_header = NULL; code = cci_perform_rpc(request, &response); + if (code != ccNoError) + goto cleanup; - if (response->type == ccmsg_NACK) { + type = ntohl(response->type); + if (type == ccmsg_NACK) { ccmsg_nack_t * nack_header = (ccmsg_nack_t *)response->header; - code = nack_header->err_code; - } else if (response->type == ccmsg_ACK) { + code = ntohl(nack_header->err_code); + } else if (type == ccmsg_ACK) { code = ccNoError; } else { code = ccErrBadInternalMessage; } - cci_msg_destroy(request); - cci_msg_destroy(response); + + cleanup: + if (request_header) + free(request_header); + if (request) + cci_msg_destroy(request); + if (response) + cci_msg_destroy(response); return code; } @@ -460,11 +544,12 @@ cc_int32 cc_int_ccache_new_credentials_iterator( cc_ccache_t ccache, cc_credentials_iterator_t* iterator ) { - cc_int_ccache_t int_ccache; - cc_msg_t *request; - ccmsg_ccache_creds_iterator_t *request_header; - cc_msg_t *response; - cc_int32 code; + cc_int_ccache_t int_ccache; + cc_msg_t *request = NULL; + ccmsg_ccache_creds_iterator_t *request_header = NULL; + cc_msg_t *response = NULL; + cc_uint32 type; + cc_int32 code; if ( ccache == NULL ) return ccErrBadParam; @@ -477,30 +562,41 @@ cc_int_ccache_new_credentials_iterator( cc_ccache_t ccache, request_header = (ccmsg_ccache_creds_iterator_t*)malloc(sizeof(ccmsg_ccache_creds_iterator_t)); if (request_header == NULL) return ccErrNoMem; - request_header->ctx = int_ccache->ctx; - request_header->ccache = int_ccache->handle; + request_header->ctx = htonll(int_ccache->ctx); + request_header->ccache = htonll(int_ccache->handle); - code = cci_msg_new(ccmsg_CCACHE_CREDS_ITERATOR, &request); - if (code != ccNoError) { - free(request_header); - return code; - } + code = cci_msg_new(ccmsg_CCACHE_NEW_CREDS_ITERATOR, &request); + if (code != ccNoError) + goto cleanup; code = cci_msg_add_header(request, request_header, sizeof(ccmsg_ccache_creds_iterator_t)); + if (code != ccNoError) + goto cleanup; + request_header = NULL; code = cci_perform_rpc(request, &response); + if (code != ccNoError) + goto cleanup; - if (response->type == ccmsg_NACK) { + type = ntohl(response->type); + if (type == ccmsg_NACK) { ccmsg_nack_t * nack_header = (ccmsg_nack_t *)response->header; - code = nack_header->err_code; - } else if (response->type == ccmsg_ACK) { + code = ntohl(nack_header->err_code); + } else if (type == ccmsg_ACK) { ccmsg_ccache_creds_iterator_resp_t * response_header = (ccmsg_ccache_creds_iterator_resp_t*)response->header; - code = cc_int_credentials_iterator_new(iterator, response_header->iterator); + code = cc_int_credentials_iterator_new(iterator, int_ccache->ctx, int_ccache->handle, + ntohll(response_header->iterator)); } else { code = ccErrBadInternalMessage; } - cci_msg_destroy(request); - cci_msg_destroy(response); + + cleanup: + if (request_header) + free(request_header); + if (request) + cci_msg_destroy(request); + if (response) + cci_msg_destroy(response); return code; } @@ -508,14 +604,15 @@ cc_int32 cc_int_ccache_store_credentials( cc_ccache_t ccache, const cc_credentials_union* credentials ) { - cc_int_ccache_t int_ccache; - cc_msg_t *request; - ccmsg_ccache_store_creds_t *request_header; - cc_msg_t *response; - char *flat_cred = 0; - cc_uint32 flat_cred_len = 0; - cc_uint32 blob_pos; - cc_int32 code; + cc_int_ccache_t int_ccache; + cc_msg_t *request = NULL; + ccmsg_ccache_store_creds_t *request_header = NULL; + cc_msg_t *response = NULL; + char *flat_cred = 0; + cc_uint32 flat_cred_len = 0; + cc_uint32 blob_pos; + cc_uint32 type; + cc_int32 code; if ( ccache == NULL || credentials == NULL ) return ccErrBadParam; @@ -528,14 +625,12 @@ cc_int_ccache_store_credentials( cc_ccache_t ccache, request_header = (ccmsg_ccache_store_creds_t*)malloc(sizeof(ccmsg_ccache_store_creds_t)); if (request_header == NULL) return ccErrNoMem; - request_header->ctx = int_ccache->ctx; - request_header->ccache = int_ccache->handle; + request_header->ctx = htonll(int_ccache->ctx); + request_header->ccache = htonll(int_ccache->handle); code = cci_msg_new(ccmsg_CCACHE_STORE_CREDS, &request); - if (code != ccNoError) { - free(request_header); - return code; - } + if (code != ccNoError) + goto cleanup; switch ( credentials->version ) { case cc_credentials_v4: @@ -545,42 +640,47 @@ cc_int_ccache_store_credentials( cc_ccache_t ccache, code = cci_creds_v5_marshall(credentials->credentials.credentials_v5, &flat_cred, &flat_cred_len); break; default: - cci_msg_destroy(request); - free(request_header); - return ccErrBadCredentialsVersion; - } - if (code != ccNoError) { - cci_msg_destroy(request); - free(request_header); - return code; + code = ccErrBadCredentialsVersion; } + if (code != ccNoError) + goto cleanup; code = cci_msg_add_data_blob(request, (void*)flat_cred, flat_cred_len, &blob_pos); - if (code != ccNoError) { - cci_msg_destroy(request); - free(request_header); - return code; - } + if (code != ccNoError) + goto cleanup; - request_header->creds_version = credentials->version; - request_header->creds_offset = blob_pos; - request_header->creds_len = flat_cred_len; + request_header->creds_version = htonl(credentials->version); + request_header->creds_offset = htonl(blob_pos); + request_header->creds_len = htonl(flat_cred_len); code = cci_msg_add_header(request, request_header, sizeof(ccmsg_ccache_store_creds_t)); + if (code != ccNoError) + goto cleanup; + request_header = NULL; code = cci_perform_rpc(request, &response); + if (code != ccNoError) + goto cleanup; - if (response->type == ccmsg_NACK) { + type = ntohl(response->type); + if (type == ccmsg_NACK) { ccmsg_nack_t * nack_header = (ccmsg_nack_t *)response->header; - code = nack_header->err_code; - } else if (response->type == ccmsg_ACK) { + code = ntohl(nack_header->err_code); + } else if (type == ccmsg_ACK) { code = ccNoError; } else { code = ccErrBadInternalMessage; } - free(flat_cred); - cci_msg_destroy(request); - cci_msg_destroy(response); + + cleanup: + if (flat_cred) + free(flat_cred); + if (request_header) + free(request_header); + if (request) + cci_msg_destroy(request); + if (response) + cci_msg_destroy(response); return code; } @@ -588,12 +688,13 @@ cc_int32 cc_int_ccache_remove_credentials( cc_ccache_t ccache, cc_credentials_t credentials ) { - cc_int_ccache_t int_ccache; - cc_int_credentials_t int_creds; - cc_msg_t *request; - ccmsg_ccache_rem_creds_t *request_header; - cc_msg_t *response; - cc_int32 code; + cc_int_ccache_t int_ccache; + cc_int_credentials_t int_creds; + cc_msg_t *request = NULL; + ccmsg_ccache_rem_creds_t *request_header = NULL; + cc_msg_t *response = NULL; + cc_uint32 type; + cc_int32 code; if ( ccache == NULL || credentials == NULL ) return ccErrBadParam; @@ -611,30 +712,40 @@ cc_int_ccache_remove_credentials( cc_ccache_t ccache, if (request_header == NULL) return ccErrNoMem; - request_header->ctx = int_ccache->ctx; - request_header->ccache = int_ccache->handle; - request_header->creds = int_creds->handle; + request_header->ctx = htonll(int_ccache->ctx); + request_header->ccache = htonll(int_ccache->handle); + request_header->creds = htonll(int_creds->handle); code = cci_msg_new(ccmsg_CCACHE_REM_CREDS, &request); - if (code != ccNoError) { - free(request_header); - return code; - } + if (code != ccNoError) + goto cleanup; code = cci_msg_add_header(request, request_header, sizeof(ccmsg_ccache_rem_creds_t)); + if (code != ccNoError) + goto cleanup; + request_header = NULL; code = cci_perform_rpc(request, &response); + if (code != ccNoError) + goto cleanup; - if (response->type == ccmsg_NACK) { + type = ntohl(response->type); + if (type == ccmsg_NACK) { ccmsg_nack_t * nack_header = (ccmsg_nack_t *)response->header; - code = nack_header->err_code; - } else if (response->type == ccmsg_ACK) { + code = ntohl(nack_header->err_code); + } else if (type == ccmsg_ACK) { code = ccNoError; } else { code = ccErrBadInternalMessage; } - cci_msg_destroy(request); - cci_msg_destroy(response); + + cleanup: + if (request_header) + free(request_header); + if (request) + cci_msg_destroy(request); + if (response) + cci_msg_destroy(response); return code; } @@ -643,12 +754,13 @@ cc_int32 cc_int_ccache_move( cc_ccache_t source, cc_ccache_t destination ) { - cc_int_ccache_t int_ccache_source; - cc_int_ccache_t int_ccache_dest; - cc_msg_t *request; - ccmsg_ccache_move_t *request_header; - cc_msg_t *response; - cc_int32 code; + cc_int_ccache_t int_ccache_source; + cc_int_ccache_t int_ccache_dest; + cc_msg_t *request = NULL; + ccmsg_ccache_move_t *request_header = NULL; + cc_msg_t *response = NULL; + cc_uint32 type; + cc_int32 code; if ( source == NULL || destination == NULL ) return ccErrBadParam; @@ -668,29 +780,39 @@ cc_int_ccache_move( cc_ccache_t source, return ccErrNoMem; code = cci_msg_new(ccmsg_CCACHE_MOVE, &request); - if (code != ccNoError) { - free(request_header); - return code; - } + if (code != ccNoError) + goto cleanup; - request_header->ctx = int_ccache_source->ctx; - request_header->ccache_source = int_ccache_source->handle; - request_header->ccache_dest = int_ccache_dest->handle; + request_header->ctx = htonll(int_ccache_source->ctx); + request_header->ccache_source = htonll(int_ccache_source->handle); + request_header->ccache_dest = htonll(int_ccache_dest->handle); code = cci_msg_add_header(request, request_header, sizeof(ccmsg_ccache_move_t)); + if (code != ccNoError) + goto cleanup; + request_header = NULL; code = cci_perform_rpc(request, &response); + if (code != ccNoError) + goto cleanup; - if (response->type == ccmsg_NACK) { + type = ntohl(response->type); + if (type == ccmsg_NACK) { ccmsg_nack_t * nack_header = (ccmsg_nack_t *)response->header; - code = nack_header->err_code; - } else if (response->type == ccmsg_ACK) { + code = ntohl(nack_header->err_code); + } else if (type == ccmsg_ACK) { code = ccNoError; } else { code = ccErrBadInternalMessage; } - cci_msg_destroy(request); - cci_msg_destroy(response); + + cleanup: + if (request_header) + free(request_header); + if (request) + cci_msg_destroy(request); + if (response) + cci_msg_destroy(response); return code; } @@ -698,14 +820,16 @@ cc_int_ccache_lock( cc_ccache_t ccache, cc_uint32 lock_type, cc_uint32 block ) { - cc_int_ccache_t int_ccache; - cc_msg_t *request; - ccmsg_ccache_lock_t *request_header; - cc_msg_t *response; - cc_int32 code; + cc_int_ccache_t int_ccache; + cc_msg_t *request = NULL; + ccmsg_ccache_lock_t *request_header = NULL; + cc_msg_t *response = NULL; + cc_uint32 type; + cc_int32 code; if ( ccache == NULL || - (lock_type != cc_lock_read && lock_type != cc_lock_write) || + (lock_type != cc_lock_read && lock_type != cc_lock_write && + lock_type != cc_lock_upgrade && lock_type != cc_lock_downgrade) || (block != cc_lock_block && block != cc_lock_noblock) ) return ccErrBadParam; @@ -719,22 +843,26 @@ cc_int_ccache_lock( cc_ccache_t ccache, return ccErrNoMem; code = cci_msg_new(ccmsg_CCACHE_LOCK, &request); - if (code != ccNoError) { - free(request_header); - return code; - } + if (code != ccNoError) + goto cleanup; - request_header->ctx = int_ccache->ctx; - request_header->ccache = int_ccache->handle; - request_header->lock_type; + request_header->ctx = htonll(int_ccache->ctx); + request_header->ccache = htonll(int_ccache->handle); + request_header->lock_type = htonl(lock_type); code = cci_msg_add_header(request, request_header, sizeof(ccmsg_ccache_lock_t)); + if (code != ccNoError) + goto cleanup; + request_header = NULL; code = cci_perform_rpc(request, &response); + if (code != ccNoError) + goto cleanup; - if (response->type == ccmsg_NACK) { + type = ntohl(response->type); + if (type == ccmsg_NACK) { ccmsg_nack_t * nack_header = (ccmsg_nack_t *)response->header; - code = nack_header->err_code; + code = ntohl(nack_header->err_code); // TODO: if (block == cc_lock_block) ..... } else if (response->type == ccmsg_ACK) { @@ -742,19 +870,26 @@ cc_int_ccache_lock( cc_ccache_t ccache, } else { code = ccErrBadInternalMessage; } - cci_msg_destroy(request); - cci_msg_destroy(response); + + cleanup: + if (request_header) + free(request_header); + if (request) + cci_msg_destroy(request); + if (response) + cci_msg_destroy(response); return code; } cc_int32 cc_int_ccache_unlock( cc_ccache_t ccache ) { - cc_int_ccache_t int_ccache; - cc_msg_t *request; - ccmsg_ccache_unlock_t *request_header; - cc_msg_t *response; - cc_int32 code; + cc_int_ccache_t int_ccache; + cc_msg_t *request = NULL; + ccmsg_ccache_unlock_t *request_header = NULL; + cc_msg_t *response = NULL; + cc_uint32 type; + cc_int32 code; if ( ccache == NULL ) return ccErrBadParam; @@ -769,41 +904,53 @@ cc_int_ccache_unlock( cc_ccache_t ccache ) return ccErrNoMem; code = cci_msg_new(ccmsg_CCACHE_UNLOCK, &request); - if (code != ccNoError) { - free(request_header); - return code; - } + if (code != ccNoError) + goto cleanup; - request_header->ctx = int_ccache->ctx; - request_header->ccache = int_ccache->handle; + request_header->ctx = htonll(int_ccache->ctx); + request_header->ccache = htonll(int_ccache->handle); code = cci_msg_add_header(request, request_header, sizeof(ccmsg_ccache_unlock_t)); + if (code != ccNoError) + goto cleanup; + request_header = NULL; code = cci_perform_rpc(request, &response); + if (code != ccNoError) + goto cleanup; - if (response->type == ccmsg_NACK) { + type = htonl(response->type); + if (type == ccmsg_NACK) { ccmsg_nack_t * nack_header = (ccmsg_nack_t *)response->header; - code = nack_header->err_code; - } else if (response->type == ccmsg_ACK) { + code = htonl(nack_header->err_code); + } else if (type == ccmsg_ACK) { code = ccNoError; } else { code = ccErrBadInternalMessage; } - cci_msg_destroy(request); - cci_msg_destroy(response); + + cleanup: + if (request_header) + free(request_header); + if (request) + cci_msg_destroy(request); + if (response) + cci_msg_destroy(response); return code; } cc_int32 cc_int_ccache_get_last_default_time( cc_ccache_t ccache, - cc_time_t* time_offset ) + cc_time* time_offset ) { - cc_int_ccache_t int_ccache; - cc_msg_t *request; - ccmsg_ccache_get_last_default_time_t *request_header; - cc_msg_t *response; - cc_int32 code; + cc_int_ccache_t int_ccache; + cc_msg_t *request = NULL; + ccmsg_ccache_get_last_default_time_t *request_header = NULL; + cc_msg_t *response = NULL; + cc_uint32 type; + cc_time64 t64; + cc_int32 code; if ( ccache == NULL ) return ccErrBadParam; @@ -816,43 +963,56 @@ cc_int_ccache_get_last_default_time( cc_ccache_t ccache, request_header = (ccmsg_ccache_get_last_default_time_t*)malloc(sizeof(ccmsg_ccache_get_last_default_time_t)); if (request_header == NULL) return ccErrNoMem; - request_header->ctx = int_ccache->ctx; - request_header->ccache = int_ccache->handle; + request_header->ctx = htonll(int_ccache->ctx); + request_header->ccache = htonll(int_ccache->handle); code = cci_msg_new(ccmsg_CCACHE_GET_LAST_DEFAULT_TIME, &request); - if (code != ccNoError) { - free(request_header); - return code; - } + if (code != ccNoError) + goto cleanup; code = cci_msg_add_header(request, request_header, sizeof(ccmsg_ccache_get_last_default_time_t)); + if (code != ccNoError) + goto cleanup; + request_header = NULL; code = cci_perform_rpc(request, &response); + if (code != ccNoError) + goto cleanup; - if (response->type == ccmsg_NACK) { + type = ntohl(response->type); + if (type == ccmsg_NACK) { ccmsg_nack_t * nack_header = (ccmsg_nack_t *)response->header; - code = nack_header->err_code; - } else if (response->type == ccmsg_ACK) { + code = ntohl(nack_header->err_code); + } else if (type == ccmsg_ACK) { ccmsg_ccache_get_last_default_time_resp_t * response_header = (ccmsg_ccache_get_last_default_time_resp_t*)response->header; - *time_offset = response_header->last_default_time; - code = ccNoError; + t64 = ntohll(response_header->last_default_time); + /* TODO: validate that we do not overflow the max value of time_offset */ + *time_offset = t64; + code = ccNoError; } else { code = ccErrBadInternalMessage; } - cci_msg_destroy(request); - cci_msg_destroy(response); + + cleanup: + if (request_header) + free(request_header); + if (request) + cci_msg_destroy(request); + if (response) + cci_msg_destroy(response); return code; } cc_int32 -cc_int_ccache_get_change_time( cc_ccache_t ccache, - cc_time_t* time ) +cc_int_ccache_get_change_time( cc_ccache_t ccache, cc_time* time ) { - cc_int_ccache_t int_ccache; - cc_msg_t *request; - ccmsg_ccache_get_change_time_t *request_header; - cc_msg_t *response; - cc_int32 code; + cc_int_ccache_t int_ccache; + cc_msg_t *request = NULL; + ccmsg_ccache_get_change_time_t *request_header = NULL; + cc_msg_t *response = NULL; + cc_time64 t64; + cc_uint32 type; + cc_int32 code; if ( ccache == NULL ) return ccErrBadParam; @@ -865,31 +1025,43 @@ cc_int_ccache_get_change_time( cc_ccache_t ccache, request_header = (ccmsg_ccache_get_change_time_t*)malloc(sizeof(ccmsg_ccache_get_change_time_t)); if (request_header == NULL) return ccErrNoMem; - request_header->ctx = int_ccache->ctx; - request_header->ccache = int_ccache->handle; + request_header->ctx = htonll(int_ccache->ctx); + request_header->ccache = htonll(int_ccache->handle); code = cci_msg_new(ccmsg_CCACHE_GET_CHANGE_TIME, &request); - if (code != ccNoError) { - free(request_header); - return code; - } + if (code != ccNoError) + goto cleanup; code = cci_msg_add_header(request, request_header, sizeof(ccmsg_ccache_get_change_time_t)); + if (code != ccNoError) + goto cleanup; + request_header = NULL; code = cci_perform_rpc(request, &response); + if (code != ccNoError) + goto cleanup; - if (response->type == ccmsg_NACK) { + type = ntohl(response->type); + if (type == ccmsg_NACK) { ccmsg_nack_t * nack_header = (ccmsg_nack_t *)response->header; - code = nack_header->err_code; - } else if (response->type == ccmsg_ACK) { + code = ntohl(nack_header->err_code); + } else if (type == ccmsg_ACK) { ccmsg_ccache_get_change_time_resp_t * response_header = (ccmsg_ccache_get_change_time_resp_t*)response->header; - *time = response_header->time; + t64 = htonll(response_header->time); + /* TODO: validate that we do not overflow 'time' */ + *time = t64; code = ccNoError; } else { code = ccErrBadInternalMessage; } - cci_msg_destroy(request); - cci_msg_destroy(response); + + cleanup: + if (request_header) + free(request_header); + if (request) + cci_msg_destroy(request); + if (response) + cci_msg_destroy(response); return code; } @@ -898,12 +1070,13 @@ cc_int_ccache_compare( cc_ccache_t ccache, cc_ccache_t compare_to, cc_uint32* equal ) { - cc_int_ccache_t int_ccache; - cc_int_ccache_t int_compare_to; - cc_msg_t *request; - ccmsg_ccache_compare_t *request_header; - cc_msg_t *response; - cc_int32 code; + cc_int_ccache_t int_ccache; + cc_int_ccache_t int_compare_to; + cc_msg_t *request = NULL; + ccmsg_ccache_compare_t *request_header = NULL; + cc_msg_t *response = NULL; + cc_uint32 type; + cc_int32 code; if ( ccache == NULL ) return ccErrBadParam; @@ -918,45 +1091,56 @@ cc_int_ccache_compare( cc_ccache_t ccache, request_header = (ccmsg_ccache_compare_t*)malloc(sizeof(ccmsg_ccache_compare_t)); if (request_header == NULL) return ccErrNoMem; - request_header->ctx = int_ccache->ctx; - request_header->ccache1 = int_ccache->handle; - request_header->ccache2 = int_compare_to->handle; + request_header->ctx = htonll(int_ccache->ctx); + request_header->ccache1 = htonll(int_ccache->handle); + request_header->ccache2 = htonll(int_compare_to->handle); code = cci_msg_new(ccmsg_CCACHE_COMPARE, &request); - if (code != ccNoError) { - free(request_header); - return code; - } + if (code != ccNoError) + goto cleanup; code = cci_msg_add_header(request, request_header, sizeof(ccmsg_ccache_compare_t)); + if (code != ccNoError) + goto cleanup; + request_header = NULL; code = cci_perform_rpc(request, &response); + if (code != ccNoError) + goto cleanup; - if (response->type == ccmsg_NACK) { + type = ntohl(response->type); + if (type == ccmsg_NACK) { ccmsg_nack_t * nack_header = (ccmsg_nack_t *)response->header; - code = nack_header->err_code; - } else if (response->type == ccmsg_ACK) { + code = ntohl(nack_header->err_code); + } else if (type == ccmsg_ACK) { ccmsg_ccache_compare_resp_t * response_header = (ccmsg_ccache_compare_resp_t*)response->header; - *equal = response_header->is_equal; + *equal = ntohl(response_header->is_equal); code = ccNoError; } else { code = ccErrBadInternalMessage; } - cci_msg_destroy(request); - cci_msg_destroy(response); + + cleanup: + if (request_header) + free(request_header); + if (request) + cci_msg_destroy(request); + if (response) + cci_msg_destroy(response); return code; } cc_int32 cc_int_ccache_get_kdc_time_offset( cc_ccache_t ccache, cc_int32 credentials_version, - cc_time_t* time_offset ) + cc_time* time_offset ) { - cc_int_ccache_t int_ccache; - cc_msg_t *request; - ccmsg_ccache_get_kdc_time_offset_t *request_header; - cc_msg_t *response; - cc_int32 code; + cc_int_ccache_t int_ccache; + cc_msg_t *request = NULL; + ccmsg_ccache_get_kdc_time_offset_t *request_header = NULL; + cc_msg_t *response = NULL; + cc_uint32 type; + cc_int32 code; if ( ccache == NULL ) return ccErrBadParam; @@ -969,45 +1153,57 @@ cc_int_ccache_get_kdc_time_offset( cc_ccache_t ccache, request_header = (ccmsg_ccache_get_kdc_time_offset_t*)malloc(sizeof(ccmsg_ccache_get_kdc_time_offset_t)); if (request_header == NULL) return ccErrNoMem; - request_header->ctx = int_ccache->ctx; - request_header->ccache = int_ccache->handle; - request_header->creds_version = credentials_version; + request_header->ctx = htonll(int_ccache->ctx); + request_header->ccache = htonll(int_ccache->handle); + request_header->creds_version = htonl(credentials_version); code = cci_msg_new(ccmsg_CCACHE_GET_KDC_TIME_OFFSET, &request); - if (code != ccNoError) { - free(request_header); - return code; - } + if (code != ccNoError) + goto cleanup; code = cci_msg_add_header(request, request_header, sizeof(ccmsg_ccache_get_kdc_time_offset_t)); + if (code != ccNoError) + goto cleanup; + request_header = NULL; code = cci_perform_rpc(request, &response); + if (code != ccNoError) + goto cleanup; - if (response->type == ccmsg_NACK) { + type = ntohl(response->type); + if (type == ccmsg_NACK) { ccmsg_nack_t * nack_header = (ccmsg_nack_t *)response->header; - code = nack_header->err_code; + code = ntohl(nack_header->err_code); } else if (response->type == ccmsg_ACK) { ccmsg_ccache_get_kdc_time_offset_resp_t * response_header = (ccmsg_ccache_get_kdc_time_offset_resp_t*)response->header; - *time_offset = response_header->offset; + *time_offset = (cc_time64)ntohll(response_header->offset); code = ccNoError; } else { code = ccErrBadInternalMessage; } - cci_msg_destroy(request); - cci_msg_destroy(response); + + cleanup: + if (request_header) + free(request_header); + if (request) + cci_msg_destroy(request); + if (response) + cci_msg_destroy(response); return code; } cc_int32 cc_int_ccache_set_kdc_time_offset( cc_ccache_t ccache, cc_int32 credentials_version, - cc_time_t time_offset ) + cc_time time_offset ) { - cc_int_ccache_t int_ccache; - cc_msg_t *request; - ccmsg_ccache_set_kdc_time_offset_t *request_header; - cc_msg_t *response; - cc_int32 code; + cc_int_ccache_t int_ccache; + cc_msg_t *request = NULL; + ccmsg_ccache_set_kdc_time_offset_t *request_header = NULL; + cc_msg_t *response = NULL; + cc_int64 t64; + cc_uint32 type; + cc_int32 code; if ( ccache == NULL ) return ccErrBadParam; @@ -1020,30 +1216,42 @@ cc_int_ccache_set_kdc_time_offset( cc_ccache_t ccache, request_header = (ccmsg_ccache_set_kdc_time_offset_t*)malloc(sizeof(ccmsg_ccache_set_kdc_time_offset_t)); if (request_header == NULL) return ccErrNoMem; - request_header->ctx = int_ccache->ctx; - request_header->ccache = int_ccache->handle; - request_header->creds_version = credentials_version; + request_header->ctx = htonll(int_ccache->ctx); + request_header->ccache = htonll(int_ccache->handle); + request_header->creds_version = htonl(credentials_version); + t64 = time_offset; + request_header->offset = htonll(t64); code = cci_msg_new(ccmsg_CCACHE_SET_KDC_TIME_OFFSET, &request); - if (code != ccNoError) { - free(request_header); - return code; - } + if (code != ccNoError) + goto cleanup; code = cci_msg_add_header(request, request_header, sizeof(ccmsg_ccache_set_kdc_time_offset_t)); + if (code != ccNoError) + goto cleanup; + request_header = NULL; code = cci_perform_rpc(request, &response); + if (code != ccNoError) + goto cleanup; - if (response->type == ccmsg_NACK) { + type = ntohl(response->type); + if (type == ccmsg_NACK) { ccmsg_nack_t * nack_header = (ccmsg_nack_t *)response->header; - code = nack_header->err_code; - } else if (response->type == ccmsg_ACK) { + code = ntohl(nack_header->err_code); + } else if (type == ccmsg_ACK) { code = ccNoError; } else { code = ccErrBadInternalMessage; } - cci_msg_destroy(request); - cci_msg_destroy(response); + + cleanup: + if (request_header) + free(request_header); + if (request) + cci_msg_destroy(request); + if (response) + cci_msg_destroy(response); return code; } @@ -1051,11 +1259,12 @@ cc_int32 cc_int_ccache_clear_kdc_time_offset( cc_ccache_t ccache, cc_int32 credentials_version ) { - cc_int_ccache_t int_ccache; - cc_msg_t *request; - ccmsg_ccache_clear_kdc_time_offset_t *request_header; - cc_msg_t *response; - cc_int32 code; + cc_int_ccache_t int_ccache; + cc_msg_t *request = NULL; + ccmsg_ccache_clear_kdc_time_offset_t *request_header = NULL; + cc_msg_t *response = NULL; + cc_uint32 type; + cc_int32 code; if ( ccache == NULL ) return ccErrBadParam; @@ -1068,31 +1277,39 @@ cc_int_ccache_clear_kdc_time_offset( cc_ccache_t ccache, request_header = (ccmsg_ccache_clear_kdc_time_offset_t*)malloc(sizeof(ccmsg_ccache_clear_kdc_time_offset_t)); if (request_header == NULL) return ccErrNoMem; - request_header->ctx = int_ccache->ctx; - request_header->ccache = int_ccache->handle; - request_header->creds_version = credentials_version; + request_header->ctx = htonll(int_ccache->ctx); + request_header->ccache = htonll(int_ccache->handle); + request_header->creds_version = htonl(credentials_version); code = cci_msg_new(ccmsg_CCACHE_CLEAR_KDC_TIME_OFFSET, &request); - if (code != ccNoError) { - free(request_header); - return code; - } + if (code != ccNoError) + goto cleanup; code = cci_msg_add_header(request, request_header, sizeof(ccmsg_ccache_clear_kdc_time_offset_t)); + if (code != ccNoError) + goto cleanup; + request_header = NULL; code = cci_perform_rpc(request, &response); + if (code != ccNoError) + goto cleanup; - if (response->type == ccmsg_NACK) { + type = ntohl(response->type); + if (type == ccmsg_NACK) { ccmsg_nack_t * nack_header = (ccmsg_nack_t *)response->header; - code = nack_header->err_code; - } else if (response->type == ccmsg_ACK) { + code = ntohl(nack_header->err_code); + } else if (type == ccmsg_ACK) { code = ccNoError; } else { code = ccErrBadInternalMessage; } - cci_msg_destroy(request); - cci_msg_destroy(response); + + cleanup: + if (request_header) + free(request_header); + if (request) + cci_msg_destroy(request); + if (response) + cci_msg_destroy(response); return code; } - - diff --git a/src/lib/ccapi/client/ccache.h b/src/lib/ccapi/client/ccache.h index e3b3993ee0..0a92ebf63d 100644 --- a/src/lib/ccapi/client/ccache.h +++ b/src/lib/ccapi/client/ccache.h @@ -1,6 +1,6 @@ /* $Copyright: * - * Copyright 2004 by the Massachusetts Institute of Technology. + * Copyright 2004-2006 by the Massachusetts Institute of Technology. * * All rights reserved. * @@ -114,11 +114,11 @@ cc_int_ccache_unlock( cc_ccache_t ccache ); cc_int32 cc_int_ccache_get_last_default_time( cc_ccache_t ccache, - cc_time_t* time ); + cc_time* time ); cc_int32 cc_int_ccache_get_change_time( cc_ccache_t ccache, - cc_time_t* time ); + cc_time* time ); cc_int32 cc_int_ccache_compare( cc_ccache_t ccache, @@ -128,12 +128,12 @@ cc_int_ccache_compare( cc_ccache_t ccache, cc_int32 cc_int_ccache_get_kdc_time_offset( cc_ccache_t ccache, cc_int32 credentials_version, - cc_time_t* time_offset ); + cc_time* time_offset ); cc_int32 cc_int_ccache_set_kdc_time_offset( cc_ccache_t ccache, cc_int32 credentials_version, - cc_time_t time_offset ); + cc_time time_offset ); cc_int32 cc_int_ccache_clear_kdc_time_offset( cc_ccache_t ccache, diff --git a/src/lib/ccapi/client/ccache_iterator.c b/src/lib/ccapi/client/ccache_iterator.c index 03266b1bbe..3da9b35478 100644 --- a/src/lib/ccapi/client/ccache_iterator.c +++ b/src/lib/ccapi/client/ccache_iterator.c @@ -1,6 +1,6 @@ /* $Copyright: * - * Copyright 2004 by the Massachusetts Institute of Technology. + * Copyright 2004-2006 by the Massachusetts Institute of Technology. * * All rights reserved. * @@ -46,7 +46,9 @@ #include <stdlib.h> #include <stdio.h> #include <CredentialsCache.h> +#include "ccache.h" #include "ccache_iterator.h" +#include "cc_rpc.h" #include "msg.h" #include "msg_headers.h" @@ -56,7 +58,7 @@ cc_int_ccache_iterator_new( cc_ccache_iterator_t * piter, cc_handle ctx, cc_handle handle ) { - cc_int_ccache_iterator_t iter; + cc_int_ccache_iterator_t iter = NULL; if ( piter == NULL ) return ccErrBadParam; @@ -66,7 +68,7 @@ cc_int_ccache_iterator_new( cc_ccache_iterator_t * piter, return ccErrNoMem; iter->functions = (cc_ccache_iterator_f*)malloc( sizeof(cc_ccache_iterator_f)); - if ( iter->functions ) { + if ( iter->functions == NULL ) { free(iter); return ccErrNoMem; } @@ -84,11 +86,12 @@ cc_int_ccache_iterator_new( cc_ccache_iterator_t * piter, cc_int32 cc_int_ccache_iterator_release( cc_ccache_iterator_t iter ) { - cc_int_ccache_iterator_t int_iter; - cc_msg_t *request; - ccmsg_ccache_iterator_release_t *request_header; - cc_msg_t *response; - cc_int32 code; + cc_int_ccache_iterator_t int_iter; + cc_msg_t *request = NULL; + ccmsg_ccache_iterator_release_t *request_header = NULL; + cc_msg_t *response = NULL; + cc_uint32 type; + cc_int32 code; if ( iter == NULL ) @@ -102,31 +105,43 @@ cc_int_ccache_iterator_release( cc_ccache_iterator_t iter ) request_header = (ccmsg_ccache_iterator_release_t*)malloc(sizeof(ccmsg_ccache_iterator_release_t)); if (request_header == NULL) return ccErrNoMem; - request_header->ctx = int_iter->ctx; - request_header->iterator = int_iter->handle; + request_header->ctx = htonll(int_iter->ctx); + request_header->iterator = htonll(int_iter->handle); code = cci_msg_new(ccmsg_CCACHE_ITERATOR_RELEASE, &request); - if (code != ccNoError) { - free(request_header); - return code; - } + if (code != ccNoError) + goto cleanup; code = cci_msg_add_header(request, request_header, sizeof(ccmsg_ccache_iterator_release_t)); + if (code != ccNoError) + goto cleanup; + request_header = NULL; code = cci_perform_rpc(request, &response); + if (code != ccNoError) + goto cleanup; - if (response->type == ccmsg_NACK) { + type = ntohl(response->type); + if (type == ccmsg_NACK) { ccmsg_nack_t * nack_header = (ccmsg_nack_t *)response->header; - code = nack_header->err_code; - } else if (response->type == ccmsg_ACK) { + code = ntohl(nack_header->err_code); + } else if (type == ccmsg_ACK) { code = ccNoError; } else { code = ccErrBadInternalMessage; } - cci_msg_destroy(request); - cci_msg_destroy(response); - free(int_iter->functions); - free(int_iter); + cleanup: + if (request_header) + free(request_header); + if (request) + cci_msg_destroy(request); + if (response) + cci_msg_destroy(response); + + if (int_iter->functions) + free(int_iter->functions); + if (iter) + free(int_iter); return ccNoError; } @@ -134,11 +149,12 @@ cc_int32 cc_int_ccache_iterator_next( cc_ccache_iterator_t iter, cc_ccache_t * ccache ) { - cc_int_ccache_iterator_t int_iter; - cc_msg_t *request; - ccmsg_ccache_iterator_next_t *request_header; - cc_msg_t *response; - cc_int32 code; + cc_int_ccache_iterator_t int_iter; + cc_msg_t *request = NULL; + ccmsg_ccache_iterator_next_t *request_header = NULL; + cc_msg_t *response = NULL; + cc_uint32 type; + cc_int32 code; if ( ccache == NULL ) return ccErrBadParam; @@ -151,29 +167,98 @@ cc_int_ccache_iterator_next( cc_ccache_iterator_t iter, request_header = (ccmsg_ccache_iterator_next_t*)malloc(sizeof(ccmsg_ccache_iterator_next_t)); if (request_header == NULL) return ccErrNoMem; - request_header->ctx = int_iter->ctx; - request_header->iterator = int_iter->handle; + request_header->ctx = htonll(int_iter->ctx); + request_header->iterator = htonll(int_iter->handle); code = cci_msg_new(ccmsg_CCACHE_ITERATOR_NEXT, &request); - if (code != ccNoError) { - free(request_header); - return code; - } + if (code != ccNoError) + goto cleanup; code = cci_msg_add_header(request, request_header, sizeof(ccmsg_ccache_iterator_next_t)); + if (code != ccNoError) + goto cleanup; + request_header = NULL; code = cci_perform_rpc(request, &response); + if (code != ccNoError) + goto cleanup; - if (response->type == ccmsg_NACK) { + type = ntohl(response->type); + if (type == ccmsg_NACK) { ccmsg_nack_t * nack_header = (ccmsg_nack_t *)response->header; code = nack_header->err_code; - } else if (response->type == ccmsg_ACK) { + } else if (type == ccmsg_ACK) { ccmsg_ccache_iterator_next_resp_t * response_header = (ccmsg_ccache_iterator_next_resp_t*)response->header; - code = cc_ccache_new(ccache, int_iter->ctx, response_header->ccache); + code = cc_int_ccache_new(ccache, int_iter->ctx, ntohll(response_header->ccache)); } else { code = ccErrBadInternalMessage; } - cci_msg_destroy(request); - cci_msg_destroy(response); + + cleanup: + if (request_header) + free(request_header); + if (request) + cci_msg_destroy(request); + if (response) + cci_msg_destroy(response); + return code; +} + +cc_int32 +cc_int_ccache_iterator_clone( cc_ccache_iterator_t iter, + cc_ccache_iterator_t * new_iter ) +{ + cc_int_ccache_iterator_t int_iter; + cc_msg_t *request = NULL; + ccmsg_ccache_iterator_clone_t *request_header = NULL; + cc_msg_t *response = NULL; + cc_uint32 type; + cc_int32 code; + + if ( iter == NULL || new_iter == NULL ) + return ccErrBadParam; + + int_iter = (cc_int_ccache_iterator_t)iter; + + if ( int_iter->magic != CC_CCACHE_ITER_MAGIC ) + return ccErrInvalidCCacheIterator; + + request_header = (ccmsg_ccache_iterator_clone_t*)malloc(sizeof(ccmsg_ccache_iterator_clone_t)); + if (request_header == NULL) + return ccErrNoMem; + request_header->ctx = htonll(int_iter->ctx); + request_header->iterator = htonll(int_iter->handle); + + code = cci_msg_new(ccmsg_CCACHE_ITERATOR_CLONE, &request); + if (code != ccNoError) + goto cleanup; + + code = cci_msg_add_header(request, request_header, sizeof(ccmsg_ccache_iterator_clone_t)); + if (code != ccNoError) + goto cleanup; + request_header = NULL; + + code = cci_perform_rpc(request, &response); + if (code != ccNoError) + goto cleanup; + + type = ntohl(response->type); + if (type == ccmsg_NACK) { + ccmsg_nack_t * nack_header = (ccmsg_nack_t *)response->header; + code = ntohl(nack_header->err_code); + } else if (type == ccmsg_ACK) { + ccmsg_ccache_iterator_clone_resp_t * response_header = (ccmsg_ccache_iterator_clone_resp_t*)response->header; + code = cc_int_ccache_iterator_new(new_iter, int_iter->ctx, ntohll(response_header->iterator)); + } else { + code = ccErrBadInternalMessage; + } + + cleanup: + if (request_header) + free(request); + if (request) + cci_msg_destroy(request); + if (response) + cci_msg_destroy(response); return code; } diff --git a/src/lib/ccapi/client/ccache_iterator.h b/src/lib/ccapi/client/ccache_iterator.h index c55d72ee67..5a390b82ed 100644 --- a/src/lib/ccapi/client/ccache_iterator.h +++ b/src/lib/ccapi/client/ccache_iterator.h @@ -1,6 +1,6 @@ /* $Copyright: * - * Copyright 2004 by the Massachusetts Institute of Technology. + * Copyright 2004-2006 by the Massachusetts Institute of Technology. * * All rights reserved. * @@ -74,6 +74,10 @@ cc_int_ccache_iterator_next( cc_ccache_iterator_t iter, cc_ccache_t * ccache ); cc_int32 +cc_int_ccache_iterator_clone( cc_ccache_iterator_t iter, + cc_ccache_iterator_t * iter_new ); + +cc_int32 cc_int_ccache_iterator_set_repeat_count( cc_int_ccache_iterator_t iter, cc_uint32 count ); diff --git a/src/lib/ccapi/client/ccapiv2.c b/src/lib/ccapi/client/ccapiv2.c new file mode 100644 index 0000000000..82b04c2c8e --- /dev/null +++ b/src/lib/ccapi/client/ccapiv2.c @@ -0,0 +1,295 @@ +/* $Copyright:
+ *
+ * Copyright 1998-2006 by the Massachusetts Institute of Technology.
+ *
+ * All rights reserved.
+ *
+ * Export of this software from the United States of America may require a
+ * specific license from the United States Government. It is the
+ * responsibility of any person or organization contemplating export to
+ * obtain such a license before exporting.
+ *
+ * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and distribute
+ * this software and its documentation for any purpose and without fee is
+ * hereby granted, provided that the above copyright notice appear in all
+ * copies and that both that copyright notice and this permission notice
+ * appear in supporting documentation, and that the name of M.I.T. not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. Furthermore if you
+ * modify this software you must label your software as modified software
+ * and not distribute it in such a fashion that it might be confused with
+ * the original MIT software. M.I.T. makes no representations about the
+ * suitability of this software for any purpose. It is provided "as is"
+ * without express or implied warranty.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
+ * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * Individual source code files are copyright MIT, Cygnus Support,
+ * OpenVision, Oracle, Sun Soft, FundsXpress, and others.
+ *
+ * Project Athena, Athena, Athena MUSE, Discuss, Hesiod, Kerberos, Moira,
+ * and Zephyr are trademarks of the Massachusetts Institute of Technology
+ * (MIT). No commercial use of these trademarks may be made without prior
+ * written permission of MIT.
+ *
+ * "Commercial use" means use of a name in a product or other for-profit
+ * manner. It does NOT prevent a commercial firm from referring to the MIT
+ * trademarks in order to convey information (although in doing so,
+ * recognition of their trademark status should be given).
+ * $
+ */
+/*
+ * This is backwards compatibility for CCache API v2 clients to be able to run
+ * against the CCache API v3 library
+ */
+
+#include "CredentialsCache2.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+CCACHE_API cc_int32 cc_shutdown (
+ apiCB** ioContext)
+{
+ /* replace this return value when the function is implemented */
+ return CC_NOT_SUPP;
+}
+
+CCACHE_API cc_int32 cc_get_NC_info (
+ apiCB* inContext,
+ infoNC*** outInfo)
+{
+
+ /* replace this return value when the function is implemented */
+ return CC_NOT_SUPP;
+}
+
+CCACHE_API cc_int32 cc_get_change_time (
+ apiCB* inContext,
+ cc_time* outTime)
+{
+
+ /* replace this return value when the function is implemented */
+ return CC_NOT_SUPP;
+}
+
+CCACHE_API cc_int32 cc_open (
+ apiCB* inContext,
+ const char* inName,
+ cc_int32 inVersion,
+ cc_uint32 inFlags,
+ ccache_p** outCCache)
+{
+ if (inVersion != CC_CRED_V4 && inVersion != CC_CRED_V5)
+ return CC_ERR_CRED_VERSION;
+
+ /* replace this return value when the function is implemented */
+ return CC_NOT_SUPP;
+}
+
+CCACHE_API cc_int32 cc_create (
+ apiCB* inContext,
+ const char* inName,
+ const char* inPrincipal,
+ cc_int32 inVersion,
+ cc_uint32 inFlags,
+ ccache_p** outCCache)
+{
+ if (inVersion != CC_CRED_V4 && inVersion != CC_CRED_V5)
+ return CC_ERR_CRED_VERSION;
+
+ /* replace this return value when the function is implemented */
+ return CC_NOT_SUPP;
+}
+
+CCACHE_API cc_int32 cc_close (
+ apiCB* inContext,
+ ccache_p** ioCCache)
+{
+
+ /* replace this return value when the function is implemented */
+ return CC_NOT_SUPP;
+}
+
+CCACHE_API cc_int32 cc_destroy (
+ apiCB* inContext,
+ ccache_p** ioCCache)
+{
+
+ /* replace this return value when the function is implemented */
+ return CC_NOT_SUPP;
+}
+
+CCACHE_API cc_int32 cc_seq_fetch_NCs_begin (
+ apiCB* inContext,
+ ccache_cit** outIterator)
+{
+
+ /* replace this return value when the function is implemented */
+ return CC_NOT_SUPP;
+}
+
+CCACHE_API cc_int32 cc_seq_fetch_NCs_next (
+ apiCB* inContext,
+ ccache_p** outCCache,
+ ccache_cit* inIterator)
+{
+
+ /* replace this return value when the function is implemented */
+ return CC_NOT_SUPP;
+}
+
+CCACHE_API cc_int32 cc_seq_fetch_NCs_end (
+ apiCB* inContext,
+ ccache_cit** ioIterator)
+{
+
+ /* replace this return value when the function is implemented */
+ return CC_NOT_SUPP;
+}
+
+CCACHE_API cc_int32 cc_get_name (
+ apiCB* inContext,
+ ccache_p* inCCache,
+ char** outName)
+{
+
+ /* replace this return value when the function is implemented */
+ return CC_NOT_SUPP;
+}
+
+CCACHE_API cc_int32 cc_get_cred_version (
+ apiCB* inContext,
+ ccache_p* inCCache,
+ cc_int32* outVersion)
+{
+
+ /* replace this return value when the function is implemented */
+ return CC_NOT_SUPP;
+}
+
+CCACHE_API cc_int32 cc_set_principal (
+ apiCB* inContext,
+ ccache_p* inCCache,
+ cc_int32 inVersion,
+ char* inPrincipal)
+{
+ if (inVersion != CC_CRED_V4 && inVersion != CC_CRED_V5)
+ return CC_ERR_CRED_VERSION;
+
+ /* replace this return value when the function is implemented */
+ return CC_NOT_SUPP;
+}
+
+CCACHE_API cc_int32 cc_get_principal (
+ apiCB* inContext,
+ ccache_p* inCCache,
+ char** outPrincipal)
+{
+
+ /* replace this return value when the function is implemented */
+ return CC_NOT_SUPP;
+}
+
+CCACHE_API cc_int32 cc_store (
+ apiCB* inContext,
+ ccache_p* inCCache,
+ cred_union inCredentials)
+{
+
+ /* replace this return value when the function is implemented */
+ return CC_NOT_SUPP;
+}
+
+CCACHE_API cc_int32 cc_remove_cred (
+ apiCB* inContext,
+ ccache_p* inCCache,
+ cred_union inCredentials)
+{
+
+ /* replace this return value when the function is implemented */
+ return CC_NOT_SUPP;
+}
+
+CCACHE_API cc_int32 cc_seq_fetch_creds_begin (
+ apiCB* inContext,
+ const ccache_p* inCCache,
+ ccache_cit** outIterator)
+{
+
+ /* replace this return value when the function is implemented */
+ return CC_NOT_SUPP;
+}
+
+CCACHE_API cc_int32 cc_seq_fetch_creds_next (
+ apiCB* inContext,
+ cred_union** outCreds,
+ ccache_cit* inIterator)
+{
+
+ /* replace this return value when the function is implemented */
+ return CC_NOT_SUPP;
+}
+
+CCACHE_API cc_int32 cc_seq_fetch_creds_end (
+ apiCB* inContext,
+ ccache_cit** ioIterator)
+{
+
+ /* replace this return value when the function is implemented */
+ return CC_NOT_SUPP;
+}
+
+CCACHE_API cc_int32 cc_free_principal (
+ apiCB* inContext,
+ char** ioPrincipal)
+{
+
+ /* replace this return value when the function is implemented */
+ return CC_NOT_SUPP;
+}
+
+CCACHE_API cc_int32 cc_free_name (
+ apiCB* inContext,
+ char** ioName)
+{
+
+ /* replace this return value when the function is implemented */
+ return CC_NOT_SUPP;
+}
+
+CCACHE_API cc_int32 cc_free_creds (
+ apiCB* inContext,
+ cred_union** creds)
+{
+
+ /* replace this return value when the function is implemented */
+ return CC_NOT_SUPP;
+}
+
+CCACHE_API cc_int32 cc_free_NC_info (
+ apiCB* inContext,
+ infoNC*** ioInfo)
+{
+
+ /* replace this return value when the function is implemented */
+ return CC_NOT_SUPP;
+}
+
+CCACHE_API cc_int32 cc_lock_request(
+ apiCB* inContext,
+ const ccache_p* inCCache,
+ const cc_int32 lock_type)
+{
+ /* replace this return value when the function is implemented */
+ return CC_NOT_SUPP;
+}
+
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
diff --git a/src/lib/ccapi/client/ccstring.c b/src/lib/ccapi/client/ccstring.c index 419bfef772..6f3fa2bcbf 100644 --- a/src/lib/ccapi/client/ccstring.c +++ b/src/lib/ccapi/client/ccstring.c @@ -50,9 +50,9 @@ #include "ccstring.h" cc_int32 -cc_int_string_new( cc_string_t * pstring, char * data ) +cci_string_new( cc_string_t * pstring, char * data ) { - cc_int_string_t string = (cc_int_string_t)malloc(sizeof(cc_int_string_d)); + cci_string_t string = (cci_string_t)malloc(sizeof(cci_string_d)); if ( string == NULL ) return ccErrNoMem; @@ -63,7 +63,7 @@ cc_int_string_new( cc_string_t * pstring, char * data ) } string->magic = CC_STRING_MAGIC; - string->functions->release = cc_int_string_release; + string->functions->release = cci_string_release; string->data = strdup(data); if ( string->data == NULL ) { @@ -77,13 +77,13 @@ cc_int_string_new( cc_string_t * pstring, char * data ) } cc_int32 -cc_int_string_release( cc_string_t str ) +cci_string_release( cc_string_t str ) { - cc_int_string_t int_string; + cci_string_t int_string; if ( str == NULL ) return ccErrBadParam; - int_string = (cc_int_string_t)str; + int_string = (cci_string_t)str; if ( int_string->magic != CC_STRING_MAGIC ) return ccErrInvalidString; diff --git a/src/lib/ccapi/client/ccstring.h b/src/lib/ccapi/client/ccstring.h index 9e0ad223f5..2c973afbb5 100644 --- a/src/lib/ccapi/client/ccstring.h +++ b/src/lib/ccapi/client/ccstring.h @@ -45,7 +45,7 @@ #define CC_STRING_MAGIC ('S'<<24 | 'T'<<16 | 'R'<<8 | 'I') -struct cc_int_string_d { +struct cci_string_d { char* data; cc_string_f* functions; #if TARGET_OS_MAC @@ -53,13 +53,13 @@ struct cc_int_string_d { #endif cc_uint32 magic; }; -typedef struct cc_int_string_d cc_int_string_d; -typedef cc_int_string_d* cc_int_string_t; +typedef struct cci_string_d cci_string_d; +typedef cci_string_d* cci_string_t; cc_int32 -cc_int_string_new( cc_string_t * pstring, char * data ); +cci_string_new( cc_string_t * pstring, char * data ); cc_int32 -cc_int_string_release( cc_string_t string ); +cci_string_release( cc_string_t string ); diff --git a/src/lib/ccapi/client/context.c b/src/lib/ccapi/client/context.c index 86c41b8e70..5d88d46868 100644 --- a/src/lib/ccapi/client/context.c +++ b/src/lib/ccapi/client/context.c @@ -1,6 +1,6 @@ /* $Copyright: * - * Copyright 2004 by the Massachusetts Institute of Technology. + * Copyright 2004-2006 by the Massachusetts Institute of Technology. * * All rights reserved. * @@ -45,10 +45,20 @@ #include <stdlib.h> #include <stdio.h> +#include <string.h> #include <CredentialsCache.h> #include "context.h" +#include "ccache.h" +#include "ccache_iterator.h" +#include "cc_rpc.h" #include "msg.h" #include "msg_headers.h" +#include "ccstring.h" + +/* cc_int_context_new + * + * input parameters (handle, version) are in host order + */ cc_int32 cc_int_context_new( cc_context_t * pcontext, cc_handle handle, cc_uint32 version ) @@ -87,11 +97,12 @@ cc_int_context_new( cc_context_t * pcontext, cc_handle handle, cc_uint32 version cc_int32 cc_int_context_release( cc_context_t context ) { - cc_int_context_t int_context; - cc_msg_t *request; - ccmsg_ctx_release_t *request_header; - cc_msg_t *response; - cc_int32 code; + cc_int_context_t int_context; + cc_msg_t *request = NULL; + ccmsg_ctx_release_t *request_header = NULL; + cc_msg_t *response = NULL; + cc_uint32 type; + cc_int32 code; if ( context == NULL ) return ccErrBadParam; @@ -104,28 +115,38 @@ cc_int_context_release( cc_context_t context ) request_header = (ccmsg_ctx_release_t*)malloc(sizeof(ccmsg_ctx_release_t)); if (request_header == NULL) return ccErrNoMem; - request_header->ctx = int_context->handle; + request_header->ctx = htonll(int_context->handle); code = cci_msg_new(ccmsg_CTX_RELEASE, &request); - if (code != ccNoError) { - free(request_header); - return code; - } + if (code != ccNoError) + goto cleanup; code = cci_msg_add_header(request, request_header, sizeof(ccmsg_ctx_release_t)); + if (code != ccNoError) + goto cleanup; + request_header = NULL; code = cci_perform_rpc(request, &response); + if (code != ccNoError) + goto cleanup; - if (response->type == ccmsg_NACK) { + type = ntohl(response->type); + if (type == ccmsg_NACK) { ccmsg_nack_t * nack_header = (ccmsg_nack_t *)response->header; - code = nack_header->err_code; - } else if (response->type == ccmsg_ACK) { + code = ntohl(nack_header->err_code); + } else if (type == ccmsg_ACK) { code = ccNoError; } else { code = ccErrBadInternalMessage; } - cci_msg_destroy(request); - cci_msg_destroy(response); + + cleanup: + if (request_header) + request_header = NULL; + if (request) + cci_msg_destroy(request); + if (response) + cci_msg_destroy(response); free(int_context->functions); free(int_context); return code; @@ -133,14 +154,16 @@ cc_int_context_release( cc_context_t context ) cc_int32 cc_int_context_get_change_time( cc_context_t context, - cc_time_t* time) + cc_time* time) { - cc_int_context_t int_context; - cc_msg_t *request; - ccmsg_ctx_get_change_time_t *request_header; - cc_msg_t *response; + cc_int_context_t int_context; + cc_msg_t *request = NULL; + ccmsg_ctx_get_change_time_t *request_header = NULL; + cc_msg_t *response = NULL; ccmsg_ctx_get_change_time_resp_t *response_header; - cc_int32 code; + cc_time64 t64; + cc_uint32 type; + cc_int32 code; if ( context == NULL || time == NULL ) return ccErrBadParam; @@ -153,30 +176,42 @@ cc_int_context_get_change_time( cc_context_t context, request_header = (ccmsg_ctx_get_change_time_t*)malloc(sizeof(ccmsg_ctx_get_change_time_t)); if (request_header == NULL) return ccErrNoMem; - request_header->ctx = int_context->handle; + request_header->ctx = htonll(int_context->handle); code = cci_msg_new(ccmsg_CTX_GET_CHANGE_TIME, &request); - if (code != ccNoError) { - free(request_header); - return code; - } + if (code != ccNoError) + goto cleanup; code = cci_msg_add_header(request, request_header, sizeof(ccmsg_ctx_get_change_time_t)); + if (code != ccNoError) + goto cleanup; + request_header = NULL; code = cci_perform_rpc(request, &response); + if (code != ccNoError) + goto cleanup; - if (response->type == ccmsg_NACK) { + type = ntohl(response->type); + if (type == ccmsg_NACK) { ccmsg_nack_t * nack_header = (ccmsg_nack_t *)response->header; - code = nack_header->err_code; + code = ntohl(nack_header->err_code); } else if (response->type == ccmsg_ACK) { response_header = (ccmsg_ctx_get_change_time_resp_t*)response->header; - *time = response_header->time; + t64 = ntohll(response_header->time); + /* TODO: validate that value is not greater than can fit in cc_time */ + *time = (cc_time)t64; code = ccNoError; } else { code = ccErrBadInternalMessage; } - cci_msg_destroy(request); - cci_msg_destroy(response); + + cleanup: + if (request_header) + free(request_header); + if (request) + cci_msg_destroy(request); + if (response) + cci_msg_destroy(response); return code; } @@ -184,12 +219,14 @@ cc_int32 cc_int_context_get_default_ccache_name( cc_context_t context, cc_string_t* name ) { - cc_int_context_t int_context; - cc_msg_t *request; - ccmsg_ctx_get_default_ccache_name_t *request_header; - cc_msg_t *response; + cc_int_context_t int_context; + cc_msg_t *request = NULL; + ccmsg_ctx_get_default_ccache_name_t *request_header = NULL; + cc_msg_t *response = NULL; ccmsg_ctx_get_default_ccache_name_resp_t *response_header; - cc_int32 code; + char *string = NULL; + cc_uint32 type; + cc_int32 code; if ( context == NULL || name == NULL ) return ccErrBadParam; @@ -202,35 +239,44 @@ cc_int_context_get_default_ccache_name( cc_context_t context, request_header = (ccmsg_ctx_get_default_ccache_name_t*)malloc(sizeof(ccmsg_ctx_get_default_ccache_name_t)); if (request_header == NULL) return ccErrNoMem; - request_header->ctx = int_context->handle; + request_header->ctx = htonll(int_context->handle); code = cci_msg_new(ccmsg_CTX_GET_DEFAULT_CCACHE_NAME, &request); - if (code != ccNoError) { - free(request_header); - return code; - } + if (code != ccNoError) + goto cleanup; code = cci_msg_add_header(request, request_header, sizeof(ccmsg_ctx_get_default_ccache_name_t)); + if (code != ccNoError) + goto cleanup; + request_header = NULL; code = cci_perform_rpc(request, &response); + if (code != ccNoError) + goto cleanup; - if (response->type == ccmsg_NACK) { + type = ntohl(response->type); + if (type == ccmsg_NACK) { ccmsg_nack_t * nack_header = (ccmsg_nack_t *)response->header; - code = nack_header->err_code; - } else if (response->type == ccmsg_ACK) { - char * string; + code = ntohl(nack_header->err_code); + } else if (type == ccmsg_ACK) { response_header = (ccmsg_ctx_get_default_ccache_name_resp_t*)response->header; code = cci_msg_retrieve_blob(response, response_header->name_offset, response_header->name_len, &string); - if (code == ccNoError) { - code = cc_string_new(&name, string); - free(string); - } + if (code == ccNoError) + code = cci_string_new(name, string); } else { code = ccErrBadInternalMessage; } - cci_msg_destroy(request); - cci_msg_destroy(response); + + cleanup: + if (string) + free(string); + if (request_header) + free(request_header); + if (request) + cci_msg_destroy(request); + if (response) + cci_msg_destroy(response); return code; } @@ -240,11 +286,12 @@ cc_int_context_compare( cc_context_t context, cc_uint32* equal ) { cc_int_context_t int_context, int_compare_to; - cc_msg_t *request; - ccmsg_ctx_compare_t *request_header; - cc_msg_t *response; + cc_msg_t *request = NULL; + ccmsg_ctx_compare_t *request_header = NULL; + cc_msg_t *response = NULL; ccmsg_ctx_compare_resp_t *response_header; - cc_int32 code; + cc_uint32 type; + cc_int32 code; if ( context == NULL || compare_to == NULL || equal == NULL ) @@ -260,31 +307,41 @@ cc_int_context_compare( cc_context_t context, request_header = (ccmsg_ctx_compare_t*)malloc(sizeof(ccmsg_ctx_compare_t)); if (request_header == NULL) return ccErrNoMem; - request_header->ctx1 = int_context->handle; - request_header->ctx2 = int_compare_to->handle; + request_header->ctx1 = htonll(int_context->handle); + request_header->ctx2 = htonll(int_compare_to->handle); code = cci_msg_new(ccmsg_CTX_COMPARE, &request); - if (code != ccNoError) { - free(request_header); - return code; - } + if (code != ccNoError) + goto cleanup; code = cci_msg_add_header(request, request_header, sizeof(ccmsg_ctx_compare_t)); + if (code != ccNoError) + goto cleanup; + request_header = NULL; code = cci_perform_rpc(request, &response); + if (code != ccNoError) + goto cleanup; - if (response->type == ccmsg_NACK) { + type = ntohl(response->type); + if (type == ccmsg_NACK) { ccmsg_nack_t * nack_header = (ccmsg_nack_t *)response->header; - code = nack_header->err_code; - } else if (response->type == ccmsg_ACK) { + code = ntohl(nack_header->err_code); + } else if (type == ccmsg_ACK) { response_header = (ccmsg_ctx_compare_resp_t*)response->header; - *equal = response_header->is_equal; + *equal = ntohl(response_header->is_equal); code = ccNoError; } else { code = ccErrBadInternalMessage; } - cci_msg_destroy(request); - cci_msg_destroy(response); + + cleanup: + if (request_header) + free(request_header); + if (request) + cci_msg_destroy(request); + if (response) + cci_msg_destroy(response); return code; } @@ -293,12 +350,13 @@ cc_int32 cc_int_context_new_ccache_iterator( cc_context_t context, cc_ccache_iterator_t* iterator ) { - cc_int_context_t int_context; - cc_msg_t *request; - ccmsg_ctx_new_ccache_iterator_t *request_header; - cc_msg_t *response; + cc_int_context_t int_context; + cc_msg_t *request = NULL; + ccmsg_ctx_new_ccache_iterator_t *request_header = NULL; + cc_msg_t *response = NULL; ccmsg_ctx_new_ccache_iterator_resp_t *response_header; - cc_int32 code; + cc_uint32 type; + cc_int32 code; if ( context == NULL || iterator == NULL ) return ccErrBadParam; @@ -311,29 +369,40 @@ cc_int_context_new_ccache_iterator( cc_context_t context, request_header = (ccmsg_ctx_new_ccache_iterator_t*)malloc(sizeof(ccmsg_ctx_new_ccache_iterator_t)); if (request_header == NULL) return ccErrNoMem; - request_header->ctx = int_context->handle; + request_header->ctx = htonll(int_context->handle); code = cci_msg_new(ccmsg_CTX_NEW_CCACHE_ITERATOR, &request); - if (code != ccNoError) { - free(request_header); - return code; - } + if (code != ccNoError) + goto cleanup; code = cci_msg_add_header(request, request_header, sizeof(ccmsg_ctx_new_ccache_iterator_t)); + if (code != ccNoError) + goto cleanup; + request_header = NULL; code = cci_perform_rpc(request, &response); + if (code != ccNoError) + goto cleanup; - if (response->type == ccmsg_NACK) { + type = ntohl(response->type); + if (type == ccmsg_NACK) { ccmsg_nack_t * nack_header = (ccmsg_nack_t *)response->header; - code = nack_header->err_code; - } else if (response->type == ccmsg_ACK) { + code = ntohl(nack_header->err_code); + } else if (type == ccmsg_ACK) { response_header = (ccmsg_ctx_new_ccache_iterator_resp_t*)response->header; - code = cc_int_ccache_iterator_new(iterator, int_context->handle, response_header->iterator); + code = cc_int_ccache_iterator_new(iterator, int_context->handle, + ntohll(response_header->iterator)); } else { code = ccErrBadInternalMessage; } - cci_msg_destroy(request); - cci_msg_destroy(response); + + cleanup: + if (request_header) + free(request_header); + if (request) + cci_msg_destroy(request); + if (response) + cci_msg_destroy(response); return code; } @@ -342,13 +411,14 @@ cc_int_context_open_ccache( cc_context_t context, const char* name, cc_ccache_t* ccache ) { - cc_uint32 blob_pos; - cc_int_context_t int_context; - cc_msg_t *request; - ccmsg_ccache_open_t *request_header; - cc_msg_t *response; + cc_uint32 blob_pos; + cc_int_context_t int_context; + cc_msg_t *request = NULL; + ccmsg_ccache_open_t *request_header = NULL; + cc_msg_t *response = NULL; ccmsg_ccache_open_resp_t *response_header; - cc_int32 code; + cc_uint32 type; + cc_int32 code; if ( context == NULL || name == NULL || ccache == NULL ) return ccErrBadParam; @@ -362,38 +432,45 @@ cc_int_context_open_ccache( cc_context_t context, if (request_header == NULL) return ccErrNoMem; - code = cci_msg_new(ccmsg_CCACHE_OPEN, &request); - if (code != ccNoError) { - free(request_header); - return code; - } + code = cci_msg_new(ccmsg_CTX_CCACHE_OPEN, &request); + if (code != ccNoError) + goto cleanup; code = cci_msg_add_data_blob(request, (void *)name, strlen(name) + 1, &blob_pos); - if (code != ccNoError) { - cci_msg_destroy(request); - free(request_header); - return code; - } + if (code != ccNoError) + goto cleanup; - request_header->ctx = int_context->handle; - request_header->name_offset = blob_pos; - request_header->name_len = strlen(name) + 1; + request_header->ctx = htonll(int_context->handle); + request_header->name_offset = htonl(blob_pos); + request_header->name_len = htonl(strlen(name) + 1); code = cci_msg_add_header(request, request_header, sizeof(ccmsg_ccache_open_t)); + if (code != ccNoError) + goto cleanup; + request_header = NULL; code = cci_perform_rpc(request, &response); + if (code != ccNoError) + goto cleanup; - if (response->type == ccmsg_NACK) { + type = ntohl(response->type); + if (type == ccmsg_NACK) { ccmsg_nack_t * nack_header = (ccmsg_nack_t *)response->header; - code = nack_header->err_code; - } else if (response->type == ccmsg_ACK) { + code = ntohl(nack_header->err_code); + } else if (type == ccmsg_ACK) { response_header = (ccmsg_ccache_open_resp_t*)response->header; - code = cc_cache_new(ccache, response_header->ccache); + code = cc_int_ccache_new(ccache, int_context->handle, ntohll(response_header->ccache)); } else { code = ccErrBadInternalMessage; } - cci_msg_destroy(request); - cci_msg_destroy(response); + + cleanup: + if (request_header) + free(request_header); + if (request) + cci_msg_destroy(request); + if (response) + cci_msg_destroy(response); return code; } @@ -401,12 +478,13 @@ cc_int32 cc_int_context_open_default_ccache( cc_context_t context, cc_ccache_t* ccache) { - cc_int_context_t int_context; - cc_msg_t *request; - ccmsg_ccache_open_default_t *request_header; - cc_msg_t *response; + cc_int_context_t int_context; + cc_msg_t *request = NULL; + ccmsg_ccache_open_default_t *request_header = NULL; + cc_msg_t *response = NULL; ccmsg_ccache_open_resp_t *response_header; - cc_int32 code; + cc_uint32 type; + cc_int32 code; if ( context == NULL || ccache == NULL ) return ccErrBadParam; @@ -420,29 +498,39 @@ cc_int_context_open_default_ccache( cc_context_t context, if (request_header == NULL) return ccErrNoMem; - code = cci_msg_new(ccmsg_CCACHE_OPEN_DEFAULT, &request); - if (code != ccNoError) { - free(request_header); - return code; - } + code = cci_msg_new(ccmsg_CTX_CCACHE_OPEN_DEFAULT, &request); + if (code != ccNoError) + goto cleanup; - request_header->ctx = int_context->handle; + request_header->ctx = htonll(int_context->handle); code = cci_msg_add_header(request, request_header, sizeof(ccmsg_ccache_open_default_t)); + if (code != ccNoError) + goto cleanup; + request_header = NULL; code = cci_perform_rpc(request, &response); + if (code != ccNoError) + goto cleanup; - if (response->type == ccmsg_NACK) { + type = ntohl(response->type); + if (type == ccmsg_NACK) { ccmsg_nack_t * nack_header = (ccmsg_nack_t *)response->header; - code = nack_header->err_code; - } else if (response->type == ccmsg_ACK) { + code = ntohl(nack_header->err_code); + } else if (type == ccmsg_ACK) { response_header = (ccmsg_ccache_open_resp_t*)response->header; - code = cc_cache_new(ccache, response_header->ccache); + code = cc_int_ccache_new(ccache, int_context->handle, ntohll(response_header->ccache)); } else { code = ccErrBadInternalMessage; } - cci_msg_destroy(request); - cci_msg_destroy(response); + + cleanup: + if (request_header) + free(request_header); + if (request) + cci_msg_destroy(request); + if (response) + cci_msg_destroy(response); return code; } @@ -453,13 +541,14 @@ cc_int_context_create_ccache( cc_context_t context, const char* principal, cc_ccache_t* ccache ) { - cc_uint32 blob_pos; - cc_int_context_t int_context; - cc_msg_t *request; - ccmsg_ccache_create_t *request_header; - cc_msg_t *response; + cc_uint32 blob_pos; + cc_int_context_t int_context; + cc_msg_t *request = NULL; + ccmsg_ccache_create_t *request_header = NULL; + cc_msg_t *response = NULL; ccmsg_ccache_create_resp_t *response_header; - cc_int32 code; + cc_uint32 type; + cc_int32 code; if ( context == NULL || name == NULL || cred_vers == 0 || cred_vers > cc_credentials_v4_v5 || @@ -475,48 +564,53 @@ cc_int_context_create_ccache( cc_context_t context, if (request_header == NULL) return ccErrNoMem; - code = cci_msg_new(ccmsg_CCACHE_CREATE, &request); - if (code != ccNoError) { - free(request_header); - return code; - } + code = cci_msg_new(ccmsg_CTX_CCACHE_CREATE, &request); + if (code != ccNoError) + goto cleanup; code = cci_msg_add_data_blob(request, (void *)name, strlen(name) + 1, &blob_pos); - if (code != ccNoError) { - cci_msg_destroy(request); - free(request_header); - return code; - } + if (code != ccNoError) + goto cleanup; - request_header->ctx = int_context->handle; - request_header->version = cred_vers; - request_header->name_offset = blob_pos; - request_header->name_len = strlen(name) + 1; + request_header->ctx = htonll(int_context->handle); + request_header->version = htonl(cred_vers); + request_header->name_offset = htonl(blob_pos); + request_header->name_len = htonl(strlen(name) + 1); code = cci_msg_add_data_blob(request, (void *)principal, strlen(principal) + 1, &blob_pos); - if (code != ccNoError) { - cci_msg_destroy(request); - free(request_header); - return code; - } - request_header->principal_offset = blob_pos; - request_header->principal_len = strlen(principal) + 1; + if (code != ccNoError) + goto cleanup; + + request_header->principal_offset = htonl(blob_pos); + request_header->principal_len = htonl(strlen(principal) + 1); code = cci_msg_add_header(request, request_header, sizeof(ccmsg_ccache_create_t)); + if (code != ccNoError) + goto cleanup; + request_header = NULL; code = cci_perform_rpc(request, &response); + if (code != ccNoError) + goto cleanup; - if (response->type == ccmsg_NACK) { + type = ntohl(response->type); + if (type == ccmsg_NACK) { ccmsg_nack_t * nack_header = (ccmsg_nack_t *)response->header; - code = nack_header->err_code; - } else if (response->type == ccmsg_ACK) { + code = ntohl(nack_header->err_code); + } else if (type == ccmsg_ACK) { response_header = (ccmsg_ccache_create_resp_t*)response->header; - code = cc_cache_new(ccache, response_header->ccache); + code = cc_int_ccache_new(ccache, int_context->handle, ntohll(response_header->ccache)); } else { code = ccErrBadInternalMessage; } - cci_msg_destroy(request); - cci_msg_destroy(response); + + cleanup: + if (request_header) + free(request_header); + if (request) + cci_msg_destroy(request); + if (response) + cci_msg_destroy(response); return code; } @@ -526,13 +620,14 @@ cc_int_context_create_default_ccache( cc_context_t context, const char* principal, cc_ccache_t* ccache ) { - cc_uint32 blob_pos; - cc_int_context_t int_context; - cc_msg_t *request; - ccmsg_ccache_create_default_t *request_header; - cc_msg_t *response; + cc_uint32 blob_pos; + cc_int_context_t int_context; + cc_msg_t *request = NULL; + ccmsg_ccache_create_default_t *request_header = NULL; + cc_msg_t *response = NULL; ccmsg_ccache_create_resp_t *response_header; - cc_int32 code; + cc_uint32 type; + cc_int32 code; if ( context == NULL || cred_vers == 0 || cred_vers > cc_credentials_v4_v5 || @@ -548,39 +643,47 @@ cc_int_context_create_default_ccache( cc_context_t context, if (request_header == NULL) return ccErrNoMem; - code = cci_msg_new(ccmsg_CCACHE_CREATE_DEFAULT, &request); - if (code != ccNoError) { - free(request_header); - return code; - } + code = cci_msg_new(ccmsg_CTX_CCACHE_CREATE_DEFAULT, &request); + if (code != ccNoError) + goto cleanup; - request_header->ctx = int_context->handle; - request_header->version = cred_vers; + request_header->ctx = htonll(int_context->handle); + request_header->version = htonl(cred_vers); code = cci_msg_add_data_blob(request, (void *)principal, strlen(principal) + 1, &blob_pos); - if (code != ccNoError) { - cci_msg_destroy(request); - free(request_header); - return code; - } - request_header->principal_offset = blob_pos; - request_header->principal_len = strlen(principal) + 1; + if (code != ccNoError) + goto cleanup; + + request_header->principal_offset = htonl(blob_pos); + request_header->principal_len = htonl(strlen(principal) + 1); code = cci_msg_add_header(request, request_header, sizeof(ccmsg_ccache_create_default_t)); + if (code != ccNoError) + goto cleanup; + request_header = NULL; code = cci_perform_rpc(request, &response); + if (code != ccNoError) + goto cleanup; - if (response->type == ccmsg_NACK) { + type = ntohl(response->type); + if (type == ccmsg_NACK) { ccmsg_nack_t * nack_header = (ccmsg_nack_t *)response->header; - code = nack_header->err_code; - } else if (response->type == ccmsg_ACK) { + code = ntohl(nack_header->err_code); + } else if (type == ccmsg_ACK) { response_header = (ccmsg_ccache_create_resp_t*)response->header; - code = cc_cache_new(ccache, response_header->ccache); + code = cc_int_ccache_new(ccache, int_context->handle, ntohll(response_header->ccache)); } else { code = ccErrBadInternalMessage; } - cci_msg_destroy(request); - cci_msg_destroy(response); + + cleanup: + if (request_header) + free(request_header); + if (request) + cci_msg_destroy(request); + if (response) + cci_msg_destroy(response); return code; } @@ -590,13 +693,14 @@ cc_int_context_create_new_ccache( cc_context_t context, const char* principal, cc_ccache_t* ccache ) { - cc_uint32 blob_pos; - cc_int_context_t int_context; - cc_msg_t *request; - ccmsg_ccache_create_unique_t *request_header; - cc_msg_t *response; + cc_uint32 blob_pos; + cc_int_context_t int_context; + cc_msg_t *request = NULL; + ccmsg_ccache_create_unique_t *request_header = NULL; + cc_msg_t *response = NULL; ccmsg_ccache_create_resp_t *response_header; - cc_int32 code; + cc_uint32 type; + cc_int32 code; if ( context == NULL || cred_vers == 0 || cred_vers > cc_credentials_v4_v5 || @@ -612,39 +716,47 @@ cc_int_context_create_new_ccache( cc_context_t context, if (request_header == NULL) return ccErrNoMem; - code = cci_msg_new(ccmsg_CCACHE_CREATE_UNIQUE, &request); - if (code != ccNoError) { - free(request_header); - return code; - } + code = cci_msg_new(ccmsg_CTX_CCACHE_CREATE_UNIQUE, &request); + if (code != ccNoError) + goto cleanup; - request_header->ctx = int_context->handle; - request_header->version = cred_vers; + request_header->ctx = htonll(int_context->handle); + request_header->version = htonl(cred_vers); code = cci_msg_add_data_blob(request, (void *)principal, strlen(principal) + 1, &blob_pos); - if (code != ccNoError) { - cci_msg_destroy(request); - free(request_header); - return code; - } - request_header->principal_offset = blob_pos; - request_header->principal_len = strlen(principal) + 1; + if (code != ccNoError) + goto cleanup; + + request_header->principal_offset = htonl(blob_pos); + request_header->principal_len = htonl(strlen(principal) + 1); code = cci_msg_add_header(request, request_header, sizeof(ccmsg_ccache_create_unique_t)); + if (code != ccNoError) + goto cleanup; + request_header = NULL; code = cci_perform_rpc(request, &response); + if (code != ccNoError) + goto cleanup; - if (response->type == ccmsg_NACK) { + type = htonl(response->type); + if (type == ccmsg_NACK) { ccmsg_nack_t * nack_header = (ccmsg_nack_t *)response->header; - code = nack_header->err_code; - } else if (response->type == ccmsg_ACK) { + code = ntohl(nack_header->err_code); + } else if (type == ccmsg_ACK) { response_header = (ccmsg_ccache_create_resp_t*)response-> header; - code = cc_cache_new(ccache, response_header->ccache); + code = cc_int_ccache_new(ccache, int_context->handle, ntohll(response_header->ccache)); } else { code = ccErrBadInternalMessage; } - cci_msg_destroy(request); - cci_msg_destroy(response); + + cleanup: + if (request_header) + free(request_header); + if (request) + cci_msg_destroy(request); + if (response) + cci_msg_destroy(response); return code; } @@ -653,14 +765,16 @@ cc_int_context_lock( cc_context_t context, cc_uint32 lock_type, cc_uint32 block ) { - cc_int_context_t int_context; - cc_msg_t *request; - ccmsg_ctx_lock_t *request_header; - cc_msg_t *response; - cc_int32 code; + cc_int_context_t int_context; + cc_msg_t *request = NULL; + ccmsg_ctx_lock_t *request_header = NULL; + cc_msg_t *response = NULL; + cc_uint32 type; + cc_int32 code; if ( context == NULL || - (lock_type != cc_lock_read && lock_type != cc_lock_write) || + (lock_type != cc_lock_read && lock_type != cc_lock_write && + lock_type != cc_lock_upgrade && lock_type != cc_lock_downgrade) || (block != cc_lock_block && block != cc_lock_noblock) ) return ccErrBadParam; @@ -674,41 +788,52 @@ cc_int_context_lock( cc_context_t context, return ccErrNoMem; code = cci_msg_new(ccmsg_CTX_LOCK, &request); - if (code != ccNoError) { - free(request_header); - return code; - } + if (code != ccNoError) + goto cleanup; - request_header->ctx = int_context->handle; - request_header->lock_type; + request_header->ctx = htonll(int_context->handle); + request_header->lock_type = htonl(lock_type); code = cci_msg_add_header(request, request_header, sizeof(ccmsg_ctx_lock_t)); + if (code != ccNoError) + goto cleanup; + request_header = NULL; code = cci_perform_rpc(request, &response); + if (code != ccNoError) + goto cleanup; - if (response->type == ccmsg_NACK) { + type = ntohl(response->type); + if (type == ccmsg_NACK) { ccmsg_nack_t * nack_header = (ccmsg_nack_t *)response->header; - code = nack_header->err_code; + code = ntohl(nack_header->err_code); // TODO: if (block == cc_lock_block) ..... - } else if (response->type == ccmsg_ACK) { + } else if (type == ccmsg_ACK) { code = ccNoError; } else { code = ccErrBadInternalMessage; } - cci_msg_destroy(request); - cci_msg_destroy(response); + + cleanup: + if (request_header) + free(request_header); + if (request) + cci_msg_destroy(request); + if (response) + cci_msg_destroy(response); return code; } cc_int32 cc_int_context_unlock( cc_context_t context ) { - cc_int_context_t int_context; - cc_msg_t *request; - ccmsg_ctx_unlock_t *request_header; - cc_msg_t *response; - cc_int32 code; + cc_int_context_t int_context; + cc_msg_t *request = NULL; + ccmsg_ctx_unlock_t *request_header = NULL; + cc_msg_t *response = NULL; + cc_uint32 type; + cc_int32 code; if ( context == NULL ) return ccErrBadParam; @@ -723,27 +848,37 @@ cc_int_context_unlock( cc_context_t context ) return ccErrNoMem; code = cci_msg_new(ccmsg_CTX_UNLOCK, &request); - if (code != ccNoError) { - free(request_header); - return code; - } + if (code != ccNoError) + goto cleanup; - request_header->ctx = int_context->handle; + request_header->ctx = htonll(int_context->handle); code = cci_msg_add_header(request, request_header, sizeof(ccmsg_ctx_unlock_t)); + if (code != ccNoError) + goto cleanup; + request_header = NULL; code = cci_perform_rpc(request, &response); + if (code != ccNoError) + goto cleanup; - if (response->type == ccmsg_NACK) { + type = ntohl(response->type); + if (type == ccmsg_NACK) { ccmsg_nack_t * nack_header = (ccmsg_nack_t *)response->header; - code = nack_header->err_code; - } else if (response->type == ccmsg_ACK) { + code = ntohl(nack_header->err_code); + } else if (type == ccmsg_ACK) { code = ccNoError; } else { code = ccErrBadInternalMessage; } - cci_msg_destroy(request); - cci_msg_destroy(response); + + cleanup: + if (request_header) + free(request_header); + if (request) + cci_msg_destroy(request); + if (response) + cci_msg_destroy(response); return code; } @@ -754,20 +889,22 @@ cc_int_context_clone( cc_context_t inContext, cc_int32* supportedVersion, char const** vendor ) { - cc_int_context_t int_context, new_context; - static char vendor_st[128] = ""; - cc_msg_t *request; - ccmsg_clone_t *request_header; - cc_msg_t *response; - ccmsg_clone_resp_t *response_header; - cc_int32 code; + cc_int_context_t int_context; + static char vendor_st[128] = ""; + cc_msg_t *request = NULL; + ccmsg_ctx_clone_t *request_header = NULL; + cc_msg_t *response = NULL; + ccmsg_ctx_clone_resp_t *response_header; + char *string = NULL; + cc_uint32 type; + cc_int32 code; if ( inContext == NULL || outContext == NULL || supportedVersion == NULL ) return ccErrBadParam; - int_context = (cc_int_context_t)context; + int_context = (cc_int_context_t)inContext; if ( int_context->magic != CC_CONTEXT_MAGIC ) return ccErrInvalidContext; @@ -775,45 +912,48 @@ cc_int_context_clone( cc_context_t inContext, if ((requestedVersion != ccapi_version_2) && (requestedVersion != ccapi_version_3) && (requestedVersion != ccapi_version_4) && - (requestedVersion != ccapi_version_5)) { + (requestedVersion != ccapi_version_5) && + (requestedVersion != ccapi_version_6)) { if (supportedVersion != NULL) { - *supportedVersion = ccapi_version_5; + *supportedVersion = ccapi_version_max; } return ccErrBadAPIVersion; } - request_header = (ccmsg_clone_t*)malloc(sizeof(ccmsg_clone_t)); + request_header = (ccmsg_ctx_clone_t*)malloc(sizeof(ccmsg_ctx_clone_t)); if (request_header == NULL) return ccErrNoMem; - request_header->ctx = int_context->handle; - request_header->in_version = requestedVersion; + request_header->ctx = htonll(int_context->handle); + request_header->in_version = htonl(requestedVersion); code = cci_msg_new(ccmsg_INIT, &request); - if (code != ccNoError) { - free(request_header); - return code; - } + if (code != ccNoError) + goto cleanup; - code = cci_msg_add_header(request, request_header, sizeof(ccmsg_init_t)); + code = cci_msg_add_header(request, request_header, sizeof(ccmsg_ctx_clone_t)); + if (code != ccNoError) + goto cleanup; + request_header = NULL; code = cci_perform_rpc(request, &response); + if (code != ccNoError) + goto cleanup; - if (response->type == ccmsg_NACK) { + type = ntohl(response->type); + if (type == ccmsg_NACK) { ccmsg_nack_t * nack_header = (ccmsg_nack_t *)response->header; - code = nack_header->err_code; - } else if (response->type == ccmsg_ACK) { - response_header = (ccmsg_clone_resp_t *)response->header; - *supportedVersion = response_header->out_version; - code = cc_int_context_new(outContext, response_header->out_ctx, response_header->out_version); + code = ntohl(nack_header->err_code); + } else if (type == ccmsg_ACK) { + response_header = (ccmsg_ctx_clone_resp_t *)response->header; + *supportedVersion = ntohl(response_header->out_version); + code = cc_int_context_new(outContext, ntohll(response_header->out_ctx), ntohl(response_header->out_version)); if (!vendor_st[0]) { - char * string; - code = cci_msg_retrieve_blob(response, response_header->vendor_offset, response_header->vendor_length, &string); + code = cci_msg_retrieve_blob(response, ntohl(response_header->vendor_offset), ntohl(response_header->vendor_length), &string); strncpy(vendor_st, string, sizeof(vendor_st)-1); vendor_st[sizeof(vendor_st)-1] = '\0'; - free(string); } *vendor = vendor_st; @@ -821,8 +961,16 @@ cc_int_context_clone( cc_context_t inContext, } else { code = ccErrBadInternalMessage; } - cci_msg_destroy(request); - cci_msg_destroy(response); + + cleanup: + if (string) + free(string); + if (request_header) + free(request_header); + if (request) + cci_msg_destroy(request); + if (response) + cci_msg_destroy(response); return code; } @@ -831,7 +979,6 @@ cc_int_context_get_version( cc_context_t context, cc_int32* version ) { cc_int_context_t int_context; - cc_int32 code; if ( context == NULL || version == NULL ) diff --git a/src/lib/ccapi/client/context.h b/src/lib/ccapi/client/context.h index cd5ca678d4..6ff113a269 100644 --- a/src/lib/ccapi/client/context.h +++ b/src/lib/ccapi/client/context.h @@ -66,7 +66,7 @@ cc_int_context_release( cc_context_t context ); cc_int32 cc_int_context_get_change_time( cc_context_t context, - cc_time_t* time); + cc_time* time); cc_int32 cc_int_context_get_default_ccache_name( cc_context_t context, diff --git a/src/lib/ccapi/client/credentials.c b/src/lib/ccapi/client/credentials.c index b0a3df2b75..dbdf6345e8 100644 --- a/src/lib/ccapi/client/credentials.c +++ b/src/lib/ccapi/client/credentials.c @@ -1,6 +1,6 @@ /* $Copyright: * - * Copyright 2004 by the Massachusetts Institute of Technology. + * Copyright 2004-2006 by the Massachusetts Institute of Technology. * * All rights reserved. * @@ -88,10 +88,10 @@ cc_int_credentials_new( cc_credentials_t *pcredentials, cc_uint32 version, switch ( version ) { case cc_credentials_v4: - code = cci_cred_v4_unmarshall(data, len, credentials->data); + code = cci_creds_v4_unmarshall(data, len, credentials->data); break; case cc_credentials_v5: - code = cci_cred_v5_unmarshall(data, len, credentials->data); + code = cci_creds_v5_unmarshall(data, len, credentials->data); break; default: free(credentials); @@ -159,23 +159,23 @@ cc_int_credentials_release( cc_credentials_t creds ) cc_int32 cc_int_credentials_compare( cc_credentials_t credentials, - cc_credentials_t compare_to, - cc_uint32* equal ) + cc_credentials_t compare_to, + cc_uint32* equal ) { cc_int_credentials_t int_credentials; cc_int_credentials_t int_compare_to; if ( credentials == NULL || compare_to == NULL || equal == NULL ) return ccErrBadParam; - + int_credentials = (cc_int_credentials_t)credentials; + int_compare_to = (cc_int_credentials_t)compare_to; + if ( int_credentials->magic != CC_CREDS_MAGIC || int_compare_to->magic != CC_CREDS_MAGIC ) return ccErrInvalidCredentials; - int_credentials = (cc_int_credentials_t)credentials; - int_compare_to = (cc_int_credentials_t)compare_to; - *equal = (int_credentials->handle == int_compare_to->handle); + return ccNoError; } diff --git a/src/lib/ccapi/client/credentials.h b/src/lib/ccapi/client/credentials.h index 320c618257..dfd589f326 100644 --- a/src/lib/ccapi/client/credentials.h +++ b/src/lib/ccapi/client/credentials.h @@ -1,6 +1,6 @@ /* $Copyright: * - * Copyright 2004 by the Massachusetts Institute of Technology. + * Copyright 2004-2006 by the Massachusetts Institute of Technology. * * All rights reserved. * @@ -84,8 +84,8 @@ cci_creds_v5_marshall( cc_credentials_v5_t * creds, cc_int32 cci_creds_v4_unmarshall( char * flat, - cc_uint32 len, - cc_credentials_union * creds); + cc_uint32 len, + cc_credentials_union * creds); cc_int32 cci_creds_v5_unmarshall( char * flat, diff --git a/src/lib/ccapi/client/credentials_iterator.c b/src/lib/ccapi/client/credentials_iterator.c index b7333daf30..3cdab875a3 100644 --- a/src/lib/ccapi/client/credentials_iterator.c +++ b/src/lib/ccapi/client/credentials_iterator.c @@ -1,6 +1,6 @@ /* $Copyright: * - * Copyright 2004 by the Massachusetts Institute of Technology. + * Copyright 2004-2006 by the Massachusetts Institute of Technology. * * All rights reserved. * @@ -46,7 +46,9 @@ #include <stdlib.h> #include <stdio.h> #include <CredentialsCache.h> +#include "credentials.h" #include "credentials_iterator.h" +#include "cc_rpc.h" #include "msg.h" #include "msg_headers.h" @@ -74,6 +76,7 @@ cc_int_credentials_iterator_new( cc_credentials_iterator_t * piter, iter->functions->release = cc_int_credentials_iterator_release; iter->functions->next = cc_int_credentials_iterator_next; + iter->functions->clone = cc_int_credentials_iterator_clone; iter->magic = CC_CREDS_ITER_MAGIC; iter->ctx = ctx; iter->ccache = ccache; @@ -87,10 +90,11 @@ cc_int32 cc_int_credentials_iterator_release( cc_credentials_iterator_t iter ) { cc_int_credentials_iterator_t int_iter; - cc_msg_t *request; - ccmsg_creds_iterator_release_t *request_header; - cc_msg_t *response; - cc_int32 code; + cc_msg_t *request = NULL; + ccmsg_creds_iterator_release_t *request_header = NULL; + cc_msg_t *response = NULL; + cc_uint32 type; + cc_int32 code; if ( iter == NULL ) return ccErrBadParam; @@ -103,29 +107,40 @@ cc_int_credentials_iterator_release( cc_credentials_iterator_t iter ) request_header = (ccmsg_creds_iterator_release_t*)malloc(sizeof(ccmsg_creds_iterator_release_t)); if (request_header == NULL) return ccErrNoMem; - request_header->ctx = int_iter->ctx; - request_header->ccache = int_iter->ccache; - request_header->iterator = int_iter->handle; + request_header->ctx = htonll(int_iter->ctx); + request_header->ccache = htonll(int_iter->ccache); + request_header->iterator = htonll(int_iter->handle); + code = cci_msg_new(ccmsg_CREDS_ITERATOR_RELEASE, &request); - if (code != ccNoError) { - free(request_header); - return code; - } + if (code != ccNoError) + goto cleanup; code = cci_msg_add_header(request, request_header, sizeof(ccmsg_creds_iterator_release_t)); + if (code != ccNoError) + goto cleanup; + request_header = NULL; code = cci_perform_rpc(request, &response); + if (code != ccNoError) + goto cleanup; - if (response->type == ccmsg_NACK) { + type = htonl(response->type); + if (type == ccmsg_NACK) { ccmsg_nack_t * nack_header = (ccmsg_nack_t *)response->header; - code = nack_header->err_code; - } else if (response->type == ccmsg_ACK) { + code = htonl(nack_header->err_code); + } else if (type == ccmsg_ACK) { code = ccNoError; } else { code = ccErrBadInternalMessage; } - cci_msg_destroy(request); - cci_msg_destroy(response); + + cleanup: + if (request_header) + free(request_header); + if (request) + cci_msg_destroy(request); + if (response) + cci_msg_destroy(response); free(int_iter->functions); free(int_iter); @@ -137,10 +152,11 @@ cc_int_credentials_iterator_next( cc_credentials_iterator_t iter, cc_credentials_t * credentials ) { cc_int_credentials_iterator_t int_iter; - cc_msg_t *request; - ccmsg_creds_iterator_next_t *request_header; - cc_msg_t *response; - cc_int32 code; + cc_msg_t *request = NULL; + ccmsg_creds_iterator_next_t *request_header = NULL; + cc_msg_t *response = NULL; + cc_uint32 type; + cc_int32 code; if ( credentials == NULL ) return ccErrBadParam; @@ -153,35 +169,105 @@ cc_int_credentials_iterator_next( cc_credentials_iterator_t iter, request_header = (ccmsg_creds_iterator_next_t*)malloc(sizeof(ccmsg_creds_iterator_next_t)); if (request_header == NULL) return ccErrNoMem; - request_header->ctx = int_iter->ctx; - request_header->ccache = int_iter->ccache; - request_header->iterator = int_iter->handle; + request_header->ctx = htonll(int_iter->ctx); + request_header->ccache = htonll(int_iter->ccache); + request_header->iterator = htonll(int_iter->handle); code = cci_msg_new(ccmsg_CREDS_ITERATOR_NEXT, &request); - if (code != ccNoError) { - free(request_header); - return code; - } + if (code != ccNoError) + goto cleanup; code = cci_msg_add_header(request, request_header, sizeof(ccmsg_creds_iterator_next_t)); + if (code != ccNoError) + goto cleanup; + request_header = NULL; code = cci_perform_rpc(request, &response); + if (code != ccNoError) + goto cleanup; - if (response->type == ccmsg_NACK) { + type = ntohl(response->type); + if (type == ccmsg_NACK) { ccmsg_nack_t * nack_header = (ccmsg_nack_t *)response->header; - code = nack_header->err_code; - } else if (response->type == ccmsg_ACK) { + code = ntohl(nack_header->err_code); + } else if (type == ccmsg_ACK) { char * blob; ccmsg_creds_iterator_next_resp_t * response_header = (ccmsg_creds_iterator_next_resp_t*)response->header; - code = cci_msg_retrieve_blob(response, response_header->creds_offset, response_header->creds_len, &blob); - code = cc_credentials_new(credentials, response_header->version, - int_iter->ctx, int_iter->ccache, response_header->creds_handle, - blob, response_header->creds_len); + code = cci_msg_retrieve_blob(response, ntohl(response_header->creds_offset), ntohl(response_header->creds_len), &blob); + code = cc_int_credentials_new(credentials, ntohl(response_header->version), + int_iter->ctx, int_iter->ccache, ntohll(response_header->creds_handle), + blob, ntohl(response_header->creds_len)); free(blob); } else { code = ccErrBadInternalMessage; } - cci_msg_destroy(request); - cci_msg_destroy(response); + + cleanup: + if (request_header) + free(request_header); + if (request) + cci_msg_destroy(request); + if (response) + cci_msg_destroy(response); + return code; +} + +cc_int32 +cc_int_credentials_iterator_clone( cc_credentials_iterator_t iter, + cc_credentials_iterator_t* new_iter) +{ + cc_int_credentials_iterator_t int_iter; + cc_msg_t *request = NULL; + ccmsg_creds_iterator_clone_t *request_header = NULL; + cc_msg_t *response = NULL; + cc_uint32 type; + cc_int32 code; + + if ( iter == NULL || new_iter == NULL ) + return ccErrBadParam; + + int_iter = (cc_int_credentials_iterator_t)iter; + + if ( int_iter->magic != CC_CREDS_ITER_MAGIC ) + return ccErrInvalidCCacheIterator; + + request_header = (ccmsg_creds_iterator_clone_t*)malloc(sizeof(ccmsg_creds_iterator_clone_t)); + if (request_header == NULL) + return ccErrNoMem; + request_header->ctx = htonll(int_iter->ctx); + request_header->iterator = htonll(int_iter->handle); + + code = cci_msg_new(ccmsg_CREDS_ITERATOR_CLONE, &request); + if (code != ccNoError) + goto cleanup; + + code = cci_msg_add_header(request, request_header, sizeof(ccmsg_creds_iterator_clone_t)); + if (code != ccNoError) + goto cleanup; + request_header = NULL; + + code = cci_perform_rpc(request, &response); + if (code != ccNoError) + goto cleanup; + + type = ntohl(response->type); + if (type == ccmsg_NACK) { + ccmsg_nack_t * nack_header = (ccmsg_nack_t *)response->header; + code = ntohl(nack_header->err_code); + } else if (type == ccmsg_ACK) { + ccmsg_creds_iterator_clone_resp_t * response_header = (ccmsg_creds_iterator_clone_resp_t*)response->header; + code = cc_int_credentials_iterator_new(new_iter, int_iter->ctx, int_iter->ccache, ntohll(response_header->iterator)); + } else { + code = ccErrBadInternalMessage; + } + + cleanup: + if (request_header) + free(request_header); + if (request) + cci_msg_destroy(request); + if (response) + cci_msg_destroy(response); return code; } + diff --git a/src/lib/ccapi/client/credentials_iterator.h b/src/lib/ccapi/client/credentials_iterator.h index 2a6f8edf2d..954d2f1afa 100644 --- a/src/lib/ccapi/client/credentials_iterator.h +++ b/src/lib/ccapi/client/credentials_iterator.h @@ -1,6 +1,6 @@ /* $Copyright: * - * Copyright 2004 by the Massachusetts Institute of Technology. + * Copyright 2004-2006 by the Massachusetts Institute of Technology. * * All rights reserved. * @@ -69,4 +69,8 @@ cc_int32 cc_int_credentials_iterator_next( cc_credentials_iterator_t iter, cc_credentials_t * credentials ); +cc_int32 +cc_int_credentials_iterator_clone( cc_credentials_iterator_t iter, + cc_credentials_iterator_t * new_iter ); + diff --git a/src/lib/ccapi/common/NTMakefile b/src/lib/ccapi/common/NTMakefile new file mode 100644 index 0000000000..a43985af3a --- /dev/null +++ b/src/lib/ccapi/common/NTMakefile @@ -0,0 +1,15 @@ +!INCLUDE <WIN32.MAK>
+
+CFLAGS = -I../include $(cdebug) $(cflags) $(cvarsmt)
+
+CC_COMMON_OBJS = marshall.obj msg.obj generic_lists.obj
+
+CC_COMMON_LIB = cc_common.lib
+
+$(CC_COMMON_LIB): $(CC_COMMON_OBJS)
+ $(implib) /NOLOGO /OUT:$@ $**
+
+all: $(CC_COMMON_LIB)
+
+clean:
+ del *.obj *.lib
diff --git a/src/lib/ccapi/common/generic_lists.c b/src/lib/ccapi/common/generic_lists.c new file mode 100644 index 0000000000..2c7398313d --- /dev/null +++ b/src/lib/ccapi/common/generic_lists.c @@ -0,0 +1,397 @@ +/* $Copyright:
+*
+* Copyright 2004-2006 by the Massachusetts Institute of Technology.
+*
+* All rights reserved.
+*
+* Export of this software from the United States of America may require a
+* specific license from the United States Government. It is the
+* responsibility of any person or organization contemplating export to
+* obtain such a license before exporting.
+*
+* WITHIN THAT CONSTRAINT, permission to use, copy, modify, and distribute
+* this software and its documentation for any purpose and without fee is
+* hereby granted, provided that the above copyright notice appear in all
+* copies and that both that copyright notice and this permission notice
+* appear in supporting documentation, and that the name of M.I.T. not be
+* used in advertising or publicity pertaining to distribution of the
+* software without specific, written prior permission. Furthermore if you
+* modify this software you must label your software as modified software
+* and not distribute it in such a fashion that it might be confused with
+* the original MIT software. M.I.T. makes no representations about the
+* suitability of this software for any purpose. It is provided "as is"
+* without express or implied warranty.
+*
+* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
+* WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
+* MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+*
+* Individual source code files are copyright MIT, Cygnus Support,
+* OpenVision, Oracle, Sun Soft, FundsXpress, and others.
+*
+* Project Athena, Athena, Athena MUSE, Discuss, Hesiod, Kerberos, Moira,
+* and Zephyr are trademarks of the Massachusetts Institute of Technology
+* (MIT). No commercial use of these trademarks may be made without prior
+* written permission of MIT.
+*
+* "Commercial use" means use of a name in a product or other for-profit
+* manner. It does NOT prevent a commercial firm from referring to the MIT
+* trademarks in order to convey information (although in doing so,
+* recognition of their trademark status should be given).
+* $
+*/
+
+
+/*
+ * Lists implementation.
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <memory.h>
+
+#include "CredentialsCache.h"
+#include "generic_lists.h"
+
+/**
+ * cci_generic_iterate_has_next()
+ *
+ * Purpose: Determine if an iterator has a next element
+ *
+ * Return: 1 if another element exists
+ * 0 if no additional elements exist
+ *
+ * Errors: None
+ *
+ */
+cc_int32
+cci_generic_iterate_has_next(cc_generic_iterate_t *iterate)
+{
+ return ((iterate == NULL || iterate->next == NULL) ? 0 : 1);
+}
+
+/**
+ * cci_generic_iterate_next()
+ *
+ * Purpose: Retrieve the next element from an iterator and advance
+ * the iterator
+ *
+ * Return: non-NULL, the next element in the iterator
+ * NULL, the iterator list is empty or iterator is invalid
+ *
+ * Errors: ccErrBadParam
+ *
+ */
+cc_int32
+cci_generic_iterate_next(cc_generic_iterate_t *iterator, cc_generic_list_node_t** nodepp)
+{
+ cc_generic_list_node_t* ret;
+
+ if (iterator == NULL || nodepp == NULL)
+ return ccErrBadParam;
+
+ ret = iterator->next;
+ if (iterator->next != NULL)
+ iterator->next = iterator->next->next;
+
+ *nodepp = ret;
+ return ccNoError;
+}
+
+/**
+ * cci_generic_list_new()
+ *
+ * Purpose: Allocate new generic list
+ *
+ * Return: non-NULL, an empty list
+ * NULL, failure
+ *
+ * Errors: ccErrNoMem
+ *
+ */
+cc_int32
+cci_generic_list_new(cc_generic_list_head_t ** listpp)
+{
+ cc_generic_list_head_t* ret = (cc_generic_list_head_t *)malloc(sizeof(cc_generic_list_head_t));
+ if (ret == NULL)
+ return ccErrNoMem;
+
+ ret->type = generic;
+ ret->head = ret->tail = NULL;
+ *listpp = ret;
+
+ return ccNoError;
+}
+
+/**
+ * cci_generic_list_append()
+ *
+ * Purpose: Appends a new node containing a copy of 'len' bytes of 'data'
+ *
+ * Return: non-NULL, a pointer to the newly allocated node
+ * NULL, failure
+ *
+ * Errors: ccErrNoMem,ccErrBadParam
+ *
+ */
+cc_int32
+cci_generic_list_append(cc_generic_list_head_t *head, void *data, cc_uint32 len, cc_generic_list_node_t** nodepp)
+{
+ cc_generic_list_node_t* new_node;
+
+ if ( data == NULL || len == 0 )
+ return ccErrBadParam;
+
+ new_node = (cc_generic_list_node_t *)malloc(sizeof(cc_generic_list_node_t));
+ if (new_node == NULL)
+ return ccErrNoMem;
+
+ new_node->data = malloc(len);
+ if ( new_node->data == NULL ) {
+ free(new_node);
+ return ccErrNoMem;
+ }
+
+ memcpy(new_node->data,data,len);
+ new_node->len = len;
+
+ if (head->head == NULL) { /*empty list*/
+ head->head = new_node;
+ head->tail = new_node;
+ new_node->next = new_node->prev = NULL;
+ } else {
+ new_node->prev = head->tail;
+ head->tail->next = new_node;
+ head->tail = new_node;
+ new_node->next = NULL;
+ }
+ if (nodepp != NULL)
+ *nodepp = new_node;
+ return ccNoError;
+}
+
+/**
+ * cci_generic_list_prepend()
+ *
+ * Purpose: Prepends a new node containing a copy of 'len' bytes of 'data'
+ *
+ * Return: non-NULL, a pointer to the newly allocated node
+ * NULL, failure
+ *
+ * Errors: ccErrNoMem, ccErrBadParam
+ *
+ */
+cc_int32
+cci_generic_list_prepend(cc_generic_list_head_t *head, void *data, cc_uint32 len, cc_generic_list_node_t** nodepp)
+{
+ cc_generic_list_node_t* new_node;
+
+ if ( data == NULL || len == 0 )
+ return ccErrBadParam;
+
+ new_node = (cc_generic_list_node_t *)malloc(sizeof(cc_generic_list_node_t));
+ if (new_node == NULL)
+ return ccErrNoMem;
+
+ new_node->data = malloc(len);
+ if ( new_node->data == NULL ) {
+ free(new_node);
+ return ccErrNoMem;
+ }
+
+ memcpy(new_node->data,data,len);
+ new_node->len = len;
+
+ if (head->head == NULL) { /*empty list*/
+ head->head = new_node;
+ head->tail = new_node;
+ new_node->prev = new_node->next = NULL;
+ } else {
+ new_node->next = head->head;
+ head->head->prev = new_node;
+ new_node->prev = NULL;
+ head->head = new_node;
+ }
+
+ if (nodepp != NULL)
+ *nodepp = new_node;
+
+ return ccNoError;
+}
+
+/**
+ * cci_generic_list_remove_element()
+ *
+ * Purpose: Remove a node from the list
+ *
+ * Return: 0, success
+ * -1, failure
+ *
+ * Errors: ccErrBadParam
+ *
+ */
+cc_int32
+cci_generic_list_remove_element(cc_generic_list_head_t* head, cc_generic_list_node_t* rem)
+{
+ if (head->head == NULL || rem == NULL)
+ return ccErrBadParam;
+
+ if (head->head == rem && head->tail == rem) { /*removing only element of list*/
+ head->head = head->tail = NULL;
+ } else if (head->head == rem) { /*removing head*/
+ head->head = head->head->next;
+ } else if (head->tail == rem) { /*removing tail*/
+ head->tail = head->tail->prev;
+ head->tail->next = NULL;
+ } else {
+ rem->prev->next = rem->next;
+ rem->next->prev = rem->prev;
+ }
+ free(rem);
+ return ccNoError;
+}
+
+/**
+ * cci_generic_free_element()
+ *
+ * Purpose: Free the memory associated with a node
+ *
+ * Return: 0, success
+ * -1, failure
+ *
+ * Errors: ccErrBadParam
+ *
+ */
+cc_int32
+cci_generic_free_element(cc_generic_list_node_t* node)
+{
+ if ( node == NULL )
+ return ccErrBadParam;
+
+ if ( node->data ) {
+ free(node->data);
+ node->data = NULL;
+ }
+ node->len = 0;
+ node->next = node->prev = NULL;
+ free(node);
+ return ccNoError;
+}
+
+
+/**
+ * cci_generic_list_destroy()
+ *
+ * Purpose: Deallocate a list and all of its contents
+ *
+ * Return: 0, success
+ * -1, failure
+ *
+ * Errors: ccErrBadParam
+ */
+cc_int32
+cci_generic_list_destroy(cc_generic_list_head_t* head)
+{
+ cc_generic_list_node_t *cur, *next;
+ cc_int32 ret = ccNoError;
+
+ if ( head == NULL )
+ return ccErrBadParam;
+
+ for (cur = head->head; ret == ccNoError && cur != NULL; cur = next) {
+ next = cur->next;
+ ret = cci_generic_free_element(cur);
+ }
+ free(head);
+ return(ret);
+}
+
+/**
+ * cci_generic_list_copy()
+ *
+ * Purpose: Copy a list
+ *
+ * Return: non-NULL, a new list
+ * NULL, failure
+ *
+ * Errors: ccErrBadParam, ccErrNoMem
+ *
+ */
+cc_int32
+cci_generic_list_copy(cc_generic_list_head_t* head, cc_generic_list_head_t** headpp)
+{
+ cc_generic_list_head_t* copy;
+ cc_generic_list_node_t *src_node, *dst_node;
+ cc_int32 code;
+
+ if (head == NULL || headpp == NULL)
+ return ccErrBadParam;
+
+ code = cci_generic_list_new(©);
+ if (code != ccNoError)
+ return code;
+
+ for (src_node = head->head; src_node != NULL; src_node = src_node->next) {
+ code = cci_generic_list_append(copy, src_node->data, src_node->len, &dst_node);
+ if (code != ccNoError) {
+ cci_generic_list_destroy(copy);
+ return code;
+ }
+ }
+ *headpp = copy;
+ return ccNoError;
+}
+
+/**
+ * cci_generic_list_iterator()
+ *
+ * Purpose: Allocate an iterator for the specified list
+ *
+ * Return: non-NULL, an iterator
+ * NULL, failure
+ *
+ * Errors: ccErrNoMem
+ *
+ */
+cc_int32
+cci_generic_list_iterator(cc_generic_list_head_t *head, cc_generic_iterate_t** headpp)
+{
+ cc_generic_iterate_t* iterator;
+
+ if ( head == NULL || headpp == NULL )
+ return ccErrBadParam;
+
+ iterator = (cc_generic_iterate_t*)malloc(sizeof(cc_generic_iterate_t));
+ if (iterator == NULL)
+ return ccErrNoMem;
+
+ iterator->next = head->head;
+ *headpp = iterator;
+ return ccNoError;
+}
+
+/**
+ * cci_generic_free_iterator()
+ *
+ * Purpose: Deallocate memory associated with an iterator
+ *
+ * Return: 0, success
+ * -1, failure
+ *
+ * Errors: ccErrBadParam
+ *
+ */
+cc_int32
+cci_generic_free_iterator(cc_generic_iterate_t* iterator)
+{
+ if ( iterator == NULL )
+ return ccErrBadParam;
+
+ iterator->next = NULL;
+ free(iterator);
+ return ccNoError;
+}
+
+
+
diff --git a/src/lib/ccapi/common/mac/mig.defs b/src/lib/ccapi/common/mac/mig.defs new file mode 100755 index 0000000000..dd3ee1b513 --- /dev/null +++ b/src/lib/ccapi/common/mac/mig.defs @@ -0,0 +1,58 @@ +/* $Copyright: + * + * Copyright 2004-2006 by the Massachusetts Institute of Technology. + * + * All rights reserved. + * + * Export of this software from the United States of America may require a + * specific license from the United States Government. It is the + * responsibility of any person or organization contemplating export to + * obtain such a license before exporting. + * + * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and distribute + * this software and its documentation for any purpose and without fee is + * hereby granted, provided that the above copyright notice appear in all + * copies and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of M.I.T. not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Furthermore if you + * modify this software you must label your software as modified software + * and not distribute it in such a fashion that it might be confused with + * the original MIT software. M.I.T. makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF + * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + * + * Individual source code files are copyright MIT, Cygnus Support, + * OpenVision, Oracle, Sun Soft, FundsXpress, and others. + * + * Project Athena, Athena, Athena MUSE, Discuss, Hesiod, Kerberos, Moira, + * and Zephyr are trademarks of the Massachusetts Institute of Technology + * (MIT). No commercial use of these trademarks may be made without prior + * written permission of MIT. + * + * "Commercial use" means use of a name in a product or other for-profit + * manner. It does NOT prevent a commercial firm from referring to the MIT + * trademarks in order to convey information (although in doing so, + * recognition of their trademark status should be given). + * $ + */ + +import "mig_types.h"; + +#include <mach/std_types.defs> +#include <mach/mach_types.defs> + +subsystem ccapi 128; + +type msg_request_t = array [] of char; +type msg_reply_t = array [] of char; +type msg_error_t = int32; + +routine ccapi_msg (in_server_port : mach_port_t; + in_request : msg_request_t; + out out_reply : msg_reply_t; + out out_error : msg_error_t); diff --git a/src/lib/ccapi/common/mac/mig_types.h b/src/lib/ccapi/common/mac/mig_types.h new file mode 100644 index 0000000000..586a01994f --- /dev/null +++ b/src/lib/ccapi/common/mac/mig_types.h @@ -0,0 +1,48 @@ +/* $Copyright: +* +* Copyright 2004-2006 by the Massachusetts Institute of Technology. +* +* All rights reserved. +* +* Export of this software from the United States of America may require a +* specific license from the United States Government. It is the +* responsibility of any person or organization contemplating export to +* obtain such a license before exporting. +* +* WITHIN THAT CONSTRAINT, permission to use, copy, modify, and distribute +* this software and its documentation for any purpose and without fee is +* hereby granted, provided that the above copyright notice appear in all +* copies and that both that copyright notice and this permission notice +* appear in supporting documentation, and that the name of M.I.T. not be +* used in advertising or publicity pertaining to distribution of the +* software without specific, written prior permission. Furthermore if you +* modify this software you must label your software as modified software +* and not distribute it in such a fashion that it might be confused with +* the original MIT software. M.I.T. makes no representations about the +* suitability of this software for any purpose. It is provided "as is" +* without express or implied warranty. +* +* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED +* WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF +* MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. +* +* Individual source code files are copyright MIT, Cygnus Support, +* OpenVision, Oracle, Sun Soft, FundsXpress, and others. +* +* Project Athena, Athena, Athena MUSE, Discuss, Hesiod, Kerberos, Moira, +* and Zephyr are trademarks of the Massachusetts Institute of Technology +* (MIT). No commercial use of these trademarks may be made without prior +* written permission of MIT. +* +* "Commercial use" means use of a name in a product or other for-profit +* manner. It does NOT prevent a commercial firm from referring to the MIT +* trademarks in order to convey information (although in doing so, +* recognition of their trademark status should be given). +* $ +*/ + +#include "CredentialsCache.h" + +typedef const char *msg_request_t; +typedef char *msg_reply_t; +typedef cc_int32 msg_error_t; diff --git a/src/lib/ccapi/common/marshall.c b/src/lib/ccapi/common/marshall.c new file mode 100644 index 0000000000..48abb33702 --- /dev/null +++ b/src/lib/ccapi/common/marshall.c @@ -0,0 +1,441 @@ +/* $Copyright:
+ *
+ * Copyright 2004-2006 by the Massachusetts Institute of Technology.
+ *
+ * All rights reserved.
+ *
+ * Export of this software from the United States of America may require a
+ * specific license from the United States Government. It is the
+ * responsibility of any person or organization contemplating export to
+ * obtain such a license before exporting.
+ *
+ * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and distribute
+ * this software and its documentation for any purpose and without fee is
+ * hereby granted, provided that the above copyright notice appear in all
+ * copies and that both that copyright notice and this permission notice
+ * appear in supporting documentation, and that the name of M.I.T. not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. Furthermore if you
+ * modify this software you must label your software as modified software
+ * and not distribute it in such a fashion that it might be confused with
+ * the original MIT software. M.I.T. makes no representations about the
+ * suitability of this software for any purpose. It is provided "as is"
+ * without express or implied warranty.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
+ * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * Individual source code files are copyright MIT, Cygnus Support,
+ * OpenVision, Oracle, Sun Soft, FundsXpress, and others.
+ *
+ * Project Athena, Athena, Athena MUSE, Discuss, Hesiod, Kerberos, Moira,
+ * and Zephyr are trademarks of the Massachusetts Institute of Technology
+ * (MIT). No commercial use of these trademarks may be made without prior
+ * written permission of MIT.
+ *
+ * "Commercial use" means use of a name in a product or other for-profit
+ * manner. It does NOT prevent a commercial firm from referring to the MIT
+ * trademarks in order to convey information (although in doing so,
+ * recognition of their trademark status should be given).
+ * $
+ */
+
+/* marshall.c */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <CredentialsCache.h>
+#include "msg.h"
+#include "msg_headers.h"
+#include "marshall.h"
+
+cc_int32
+cci_creds_v4_marshall( cc_credentials_v4_t * creds,
+ char ** pflat,
+ cc_uint32 * plen)
+{
+ cc_uint32 len;
+ char * flat;
+ cci_flat_creds_v4_t * header;
+ cc_time64 t64;
+
+ if ( creds == NULL || pflat == NULL || plen == NULL )
+ return ccErrBadParam;
+
+ len = sizeof(cci_flat_creds_v4_t);
+ flat = (char *)malloc(len);
+ if ( flat == NULL )
+ return ccErrNoMem;
+ memset(flat, 0, len);
+
+ header = (cci_flat_creds_v4_t *)flat;
+ header->version = htonl(creds->version);
+ memcpy(header->principal, creds->principal, cc_v4_name_size);
+ memcpy(header->principal_instance, creds->principal_instance, cc_v4_instance_size);
+ memcpy(header->service, creds->service, cc_v4_name_size);
+ memcpy(header->service_instance, creds->service_instance, cc_v4_instance_size);
+ memcpy(header->realm, creds->realm, cc_v4_realm_size);
+ memcpy(header->session_key, creds->session_key, cc_v4_key_size);
+ header->kvno = htonl(creds->kvno);
+ header->string_to_key_type = htonl(creds->string_to_key_type);
+ t64 = creds->issue_date;
+ header->issue_date = htonll(t64);
+ header->lifetime = htonl(creds->lifetime);
+ /* TODO: verify that address is stored in host order */
+ header->address = htonl(creds->address);
+ header->ticket_size = htonl(creds->ticket_size);
+ memcpy(header->ticket, creds->ticket, cc_v4_ticket_size);
+
+ *pflat = flat;
+ *plen = len;
+
+ return ccNoError;
+}
+
+cc_int32
+cci_creds_v4_unmarshall( char * flat,
+ cc_uint32 len,
+ cc_credentials_union * creds_union)
+{
+ struct cci_flat_creds_v4 * header;
+ cc_credentials_v4_t * creds;
+ cc_time64 t64;
+
+ if ( flat == NULL || len == 0 || creds_union == NULL )
+ return ccErrBadParam;
+
+ creds_union->version = cc_credentials_v4;
+
+ header = (cci_flat_creds_v4_t *)flat;
+
+ creds = (cc_credentials_v4_t *)malloc(sizeof(cc_credentials_v4_t));
+ if ( creds == NULL )
+ return ccErrNoMem;
+
+ creds->version = ntohl(header->version);
+ memcpy(creds->principal, header->principal, cc_v4_name_size);
+ memcpy(creds->principal_instance, header->principal_instance, cc_v4_instance_size);
+ memcpy(creds->service, header->service, cc_v4_name_size);
+ memcpy(creds->service_instance, header->service_instance, cc_v4_instance_size);
+ memcpy(creds->realm, header->realm, cc_v4_realm_size);
+ memcpy(creds->session_key, header->session_key, cc_v4_key_size);
+ creds->kvno = htonl(header->kvno);
+ creds->string_to_key_type = htonl(header->string_to_key_type);
+ t64 = header->issue_date;
+ creds->issue_date = (cc_time64)ntohll(t64);
+ creds->lifetime = (cc_int32)ntohl(header->lifetime);
+ /* TODO: verify that address is stored in host order */
+ creds->address = ntohl(header->address);
+ creds->ticket_size = ntohl(header->ticket_size);
+ memcpy(creds->ticket, header->ticket, cc_v4_ticket_size);
+
+ creds_union->credentials.credentials_v4 = creds;
+
+ return ccNoError;
+}
+
+
+cc_int32
+cci_creds_cc_data_array_count_entries( cc_data ** array, cc_uint32 * pcount)
+{
+ cc_uint32 count;
+
+ if (array == NULL) {
+ *pcount = 0;
+ return ccNoError;
+ }
+
+ for ( count=0; array[count] != NULL ; count++) ;
+
+ *pcount = count;
+ return ccNoError;
+}
+
+cc_int32
+cci_creds_v5_compute_flat_size( cc_credentials_v5_t * creds, cc_uint32 * plen)
+{
+ cc_uint32 len;
+ cc_uint32 i, count;
+
+ len = sizeof(struct cci_flat_creds_v5);
+
+ if (creds->client)
+ len += strlen(creds->client) + 1;
+
+ if (creds->server)
+ len += strlen(creds->server) + 1;
+
+ len += creds->keyblock.length;
+
+ cci_creds_cc_data_array_count_entries( creds->addresses, &count );
+ len += count * sizeof(cc_flat_data);
+ for ( i=0; i<count; i++ ) {
+ len += creds->addresses[i]->length;
+ }
+
+ len += creds->ticket.length;
+ len += creds->second_ticket.length;
+
+ cci_creds_cc_data_array_count_entries( creds->authdata, &count );
+ len += count * sizeof(cc_flat_data);
+ for ( i=0; i<count; i++ ) {
+ len += creds->authdata[i]->length;
+ }
+
+ *plen = len;
+ return ccNoError;
+}
+
+cc_int32
+cci_creds_v5_marshall( cc_credentials_v5_t * creds,
+ char ** pflat,
+ cc_uint32 * plen)
+{
+ cc_uint32 len;
+ char * flat;
+ struct cci_flat_creds_v5 * header;
+ cc_uint32 length;
+ cc_uint32 offset;
+ cc_time64 t64;
+ cc_uint32 count;
+ cc_uint32 i;
+
+ if ( creds == NULL || pflat == NULL || plen == NULL )
+ return ccErrBadParam;
+
+ cci_creds_v5_compute_flat_size(creds, &len);
+
+ flat = (char *)malloc(len);
+ if ( flat == NULL )
+ return ccErrNoMem;
+ memset(flat, 0, len);
+
+ offset = sizeof(struct cci_flat_creds_v5);
+ header = (struct cci_flat_creds_v5 *)flat;
+ header->version = htonl(FLAT_CREDS_V5_VERSION);
+ if (creds->client) {
+ length = strlen(creds->client) + 1;
+ header->client.length = htonl(length);
+ header->client.data = htonl(offset);
+ memcpy(flat + offset, creds->client, length);
+ offset += length;
+ }
+
+ if (creds->server) {
+ length = strlen(creds->server) + 1;
+ header->server.length = htonl(length);
+ header->server.data = htonl(offset);
+ memcpy(flat + offset, creds->server, length);
+ offset += length;
+ }
+
+ header->keyblock.type = htonl(creds->keyblock.type);
+ if (creds->keyblock.length) {
+ length = creds->keyblock.length;
+ header->keyblock.length = htonl(length);
+ header->keyblock.data = htonl(offset);
+ memcpy(flat + offset, creds->keyblock.data, length);
+ offset += length;
+ }
+
+ t64 = creds->authtime;
+ header->authtime = htonll(t64);
+ t64 = creds->starttime;
+ header->starttime = htonll(t64);
+ t64 = creds->endtime;
+ header->endtime = htonll(t64);
+ t64 = creds->renew_till;
+ header->renew_till = htonll(t64);
+
+ header->is_skey = htonl(creds->is_skey);
+ header->ticket_flags = htonl(creds->ticket_flags);
+
+ cci_creds_cc_data_array_count_entries( creds->addresses, &count );
+ if ( count ) {
+ cc_flat_data * addresses = (cc_flat_data *)flat + offset;
+ header->address_count = htonl(count);
+ header->addresses = htonl(offset);
+ offset += count * sizeof(cc_flat_data);
+
+ for ( i=0; i < count; i++ ) {
+ addresses[i].type = htonl(creds->addresses[i]->type);
+ if (creds->addresses[i]->length) {
+ length = creds->addresses[i]->length;
+ addresses[i].length = htonl(length);
+ addresses[i].data = htonl(offset);
+ /* TODO: verify that addresses are stored in network order */
+ memcpy(flat + offset, creds->addresses[i]->data, length);
+ offset += length;
+ }
+ }
+ }
+
+ header->ticket.type = htonl(creds->ticket.type);
+ if (creds->ticket.length) {
+ length = creds->ticket.length;
+ header->ticket.length = htonl(length);
+ header->ticket.data = htonl(offset);
+ memcpy(flat + offset, creds->ticket.data, length);
+ offset += length;
+ }
+
+ header->second_ticket.type = htonl(creds->second_ticket.type);
+ if (creds->second_ticket.length) {
+ length = creds->second_ticket.length;
+ header->second_ticket.length = htonl(length);
+ header->second_ticket.data = htonl(offset);
+ memcpy(flat + offset, creds->second_ticket.data, length);
+ offset += length;
+ }
+
+ cci_creds_cc_data_array_count_entries( creds->authdata, &count );
+ if ( count ) {
+ cc_flat_data * authdata = (cc_flat_data *)flat + offset;
+
+ header->authdata_count = htonl(count);
+ header->authdata = (offset);
+ offset += count * sizeof(cc_flat_data);
+
+ for ( i=0; i < count; i++ ) {
+ authdata[i].type = htonl(creds->authdata[i]->type);
+ if (creds->authdata[i]->length) {
+ length = creds->authdata[i]->length;
+ authdata[i].length = htonl(length);
+ authdata[i].data = htonl(offset);
+ memcpy(flat + offset, creds->authdata[i]->data, length);
+ offset += length;
+ }
+ }
+ }
+
+ *pflat = flat;
+ *plen = len;
+ return ccNoError;
+}
+
+
+// TODO: a much better job of checking for out of memory errors
+// and validating that we do not read beyond the flat input
+// data buffer
+
+cc_int32
+cci_creds_v5_unmarshall( char * flat,
+ cc_uint32 len,
+ cc_credentials_union * creds_union)
+{
+ struct cci_flat_creds_v5 * header;
+ cc_credentials_v5_t * creds;
+ cc_flat_data * flat_data;
+ cc_time64 t64;
+ cc_uint32 length;
+ cc_uint32 count;
+ cc_uint32 i;
+
+ if ( flat == NULL || len == 0 || creds_union == NULL )
+ return ccErrBadParam;
+
+ creds_union->version = cc_credentials_v5;
+
+ header = (struct cci_flat_creds_v5 *)flat;
+
+ if ( ntohl(header->version) != FLAT_CREDS_V5_VERSION )
+ return ccErrBadParam;
+
+ creds = (cc_credentials_v5_t *)malloc(sizeof(cc_credentials_v5_t));
+ if ( creds == NULL )
+ return ccErrNoMem;
+ memset(creds, 0, sizeof(cc_credentials_v5_t));
+
+ if ( header->client.length ) {
+ length = ntohl(header->client.length);
+ creds->client = (char *)malloc(length);
+ memcpy(creds->client, flat + header->client.data, length);
+ }
+
+ if ( header->server.length ) {
+ length = ntohl(header->server.length);
+ creds->server = (char *)malloc(length);
+ memcpy(creds->server, flat + header->server.data, length);
+ }
+
+ creds->keyblock.type = ntohl(header->keyblock.type);
+ if ( header->keyblock.length ) {
+ length = ntohl(header->keyblock.length);
+ creds->keyblock.length = length;
+ creds->keyblock.data = malloc(length);
+ memcpy(creds->keyblock.data, flat + header->keyblock.data, length);
+ }
+
+ /* TODO: need to perform overflow validation checks to ensure
+ * that we do not attempt to store too large a value into cc_time_t
+ * when it is a 32-bit field.
+ */
+ t64 = ntohll(header->authtime);
+ creds->authtime = (cc_time)t64;
+ t64 = ntohll(header->starttime);
+ creds->starttime = (cc_time)t64;
+ t64 = ntohll(header->endtime);
+ creds->endtime = (cc_time)t64;
+ t64 = ntohll(header->renew_till);
+ creds->renew_till = (cc_time)t64;
+
+ creds->is_skey = ntohl(header->is_skey);
+ creds->ticket_flags = ntohl(header->ticket_flags);
+
+ count = ntohl(header->address_count);
+ creds->addresses = (cc_data **) malloc((count + 1) * sizeof(cc_data *));
+ flat_data = (cc_flat_data *)flat + header->addresses;
+ for ( i=0 ; i < count ; i++ ) {
+ creds->addresses[i] = (cc_data *)malloc(sizeof(cc_data));
+ creds->addresses[i]->type = ntohl(flat_data[i].type);
+ length = ntohl(flat_data[i].length);
+ creds->addresses[i]->length = length;
+ if ( length ) {
+ creds->addresses[i]->data = malloc(length);
+ /* TODO: verify that addresses are stored in network order */
+ memcpy(creds->addresses[i]->data, flat + flat_data[i].data, length);
+ } else {
+ creds->addresses[i]->data = NULL;
+ }
+ }
+ creds->addresses[i] = NULL;
+
+ creds->ticket.type = ntohl(header->ticket.type);
+ length = ntohl(header->ticket.length);
+ if ( length ) {
+ creds->ticket.length = length;
+ creds->ticket.data = malloc(length);
+ memcpy(creds->ticket.data, flat + header->ticket.data, length);
+ }
+
+ creds->second_ticket.type = header->second_ticket.type;
+ if ( header->second_ticket.length ) {
+ creds->second_ticket.length = header->second_ticket.length;
+ creds->second_ticket.data = malloc(creds->second_ticket.length);
+ memcpy(creds->second_ticket.data, flat + header->second_ticket.data, creds->second_ticket.length);
+ }
+
+ count = ntohl(header->authdata_count);
+ creds->authdata = (cc_data **) malloc((count + 1) * sizeof(cc_data *));
+ flat_data = (cc_flat_data *)flat + header->authdata;
+ for ( i=0 ; i < count ; i++ ) {
+ creds->authdata[i] = (cc_data *)malloc(sizeof(cc_data));
+ creds->authdata[i]->type = ntohl(flat_data[i].type);
+ length = ntohl(flat_data[i].length);
+ creds->authdata[i]->length = length;
+ if ( length ) {
+ creds->authdata[i]->data = malloc(length);
+ memcpy(creds->authdata[i]->data, flat + flat_data[i].data, length);
+ } else {
+ creds->authdata[i]->data = NULL;
+ }
+ }
+ creds->authdata[i] = NULL;
+
+ creds_union->credentials.credentials_v5 = creds;
+
+ return ccNoError;
+}
+
diff --git a/src/lib/ccapi/msg.c b/src/lib/ccapi/common/msg.c index f5f074aa04..789fc87464 100644 --- a/src/lib/ccapi/msg.c +++ b/src/lib/ccapi/common/msg.c @@ -1,582 +1,622 @@ -/* $Copyright: - * - * Copyright 2004 by the Massachusetts Institute of Technology. - * - * All rights reserved. - * - * Export of this software from the United States of America may require a - * specific license from the United States Government. It is the - * responsibility of any person or organization contemplating export to - * obtain such a license before exporting. - * - * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and distribute - * this software and its documentation for any purpose and without fee is - * hereby granted, provided that the above copyright notice appear in all - * copies and that both that copyright notice and this permission notice - * appear in supporting documentation, and that the name of M.I.T. not be - * used in advertising or publicity pertaining to distribution of the - * software without specific, written prior permission. Furthermore if you - * modify this software you must label your software as modified software - * and not distribute it in such a fashion that it might be confused with - * the original MIT software. M.I.T. makes no representations about the - * suitability of this software for any purpose. It is provided "as is" - * without express or implied warranty. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF - * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Individual source code files are copyright MIT, Cygnus Support, - * OpenVision, Oracle, Sun Soft, FundsXpress, and others. - * - * Project Athena, Athena, Athena MUSE, Discuss, Hesiod, Kerberos, Moira, - * and Zephyr are trademarks of the Massachusetts Institute of Technology - * (MIT). No commercial use of these trademarks may be made without prior - * written permission of MIT. - * - * "Commercial use" means use of a name in a product or other for-profit - * manner. It does NOT prevent a commercial firm from referring to the MIT - * trademarks in order to convey information (although in doing so, - * recognition of their trademark status should be given). - * $ - */ - -/* - * Verifiable, extensible message format. - */ - -#include "CredentialsCache.h" -#include "msg.h" -#include "datastore.h" - -#include <stdlib.h> -#include <memory.h> -#include <stdio.h> -#include <string.h> - -/** - * cci_msg_new() - * - * Purpose: Allocate and initialize a new cc_msg_t structure - * - * Return: non-NULL, the msg - * NULL, failure - * - * Errors: ccErrNoMem - * - */ -cc_int32 -cci_msg_new(cc_uint32 type, cc_msg_t** msgpp) -{ - // type should be validated. If invalid set error to ccErrBadParam - cc_msg_t* msg; - - if ( type > CC_MSG_MAX_TYPE || msgpp == NULL ) - return ccErrBadParam; - - msg = (cc_msg_t*)malloc(sizeof(cc_msg_t)); - if (msg == NULL) - return ccErrNoMem; - - msg->type = type; - msg->flat = NULL; - msg->header = NULL; - msg->flat_len = 0; - msg->header_len = 0; - msg->magic = 0; - cci_generic_list_new(&msg->data_blobs); - if (msg->data_blobs == NULL) { - // pass on error from previous call - free(msg); - return ccErrNoMem; - } - - *msgpp = msg; - return ccNoError; -} - -/** - * cci_msg_calc_header_size() - * - * Purpose: Calculates the size of the header - * - * Return: the size in bytes - * - * Errors: ccErrBadParam - * - */ -cc_int32 -cci_msg_calc_header_size(cc_msg_t* msg, cc_uint32 * lenp) -{ - int header_len = 12; /* header size, entire size, type */ - - if ( msg == NULL || lenp == NULL ) - return ccErrBadParam; - - header_len += msg->header_len; - *lenp = header_len; - return ccNoError; -} - -/** - * cci_msg_calc_size() - * - * Purpose: Calculates the size of the message - * (does not include the magic bytes) - * - * Return: the size in bytes - * - * Errors: ccErrBadParam - * - */ -cc_int32 -cci_msg_calc_size(cc_msg_t* msg, cc_uint32 * lenp) -{ - cc_uint32 flat_len; - cc_generic_list_node_t* gen_node; - cc_generic_iterate_t* gen_iterator; - cc_int32 code; - - if ( msg == NULL || lenp == NULL ) - return ccErrBadParam; - - code = cci_msg_calc_header_size(msg, &flat_len); - if (code != ccNoError) - goto bad; - - code = cci_generic_list_iterator(msg->data_blobs, &gen_iterator); - if ( code != ccNoError ) - goto bad; - - while (cci_generic_iterate_has_next(gen_iterator)) { - code = cci_generic_iterate_next(gen_iterator, &gen_node); - if (code != ccNoError) - break; - flat_len += gen_node->len + BLOB_LEN; - } - cci_generic_free_iterator(gen_iterator); - if (code != ccNoError) - goto bad; - - flat_len += MAGIC_HEAD_LEN + MAGIC_DATA_LEN; - *lenp = flat_len; - - bad: - return code; -} - -/** - * cci_msg_add_data_blob() - * - * Purpose: Adds 'len' bytes of data to the msg - * - * Return: - * - * Errors: - * - */ -cc_int32 -cci_msg_add_data_blob(cc_msg_t* msg, void *data, cc_uint32 len, cc_uint32 *lenp) -{ - cc_int32 code; - - if (msg == NULL || data == NULL || len <= 0 || lenp == NULL) - return ccErrBadParam; - - code = cci_generic_list_append(msg->data_blobs, data, len, NULL); - if ( code != ccNoError ) - return code; - return cci_msg_calc_blob_pos(msg, data, len, lenp); -} - -/** - * cc_msg_ - * - * Purpose: - * - * Return: - * - * Errors: - * - */ -cc_int32 -cci_msg_calc_blob_pos(cc_msg_t* msg, void *data, cc_uint32 len, cc_uint32 * posp) -{ - cc_uint32 pos; - cc_generic_list_node_t* gen_node; - cc_generic_iterate_t* gen_iterator; - cc_int32 code; - - code = cci_msg_calc_header_size(msg, &pos); - pos += sizeof(cc_uint32); /*+ sizeof(cc_uint32) for magic*/ - - code = cci_generic_list_iterator(msg->data_blobs, &gen_iterator); - while (cci_generic_iterate_has_next(gen_iterator)) { - code = cci_generic_iterate_next(gen_iterator, &gen_node); - if (gen_node->len != len && gen_node->data != data) { - pos += gen_node->len + sizeof(cc_uint32); - } else { - cci_generic_free_iterator(gen_iterator); - *posp = pos + sizeof(cc_uint32); - return ccNoError; - } - } - - cci_generic_free_iterator(gen_iterator); - return ccIteratorEnd; -} - -/** - * cc_msg_ - * - * Purpose: - * - * Return: - * - * Errors: - * - */ -cc_int32 -cci_msg_add_header(cc_msg_t* msg, void *header, cc_uint32 header_len) -{ - if ( msg == NULL || header == NULL ) - return ccErrBadParam; - - msg->header = header; - msg->header_len = header_len; - return ccNoError; -} - - -/** - * cc_msg_ - * - * Purpose: - * - * Return: - * - * Errors: - * - */ -cc_int32 -cci_msg_flatten(cc_msg_t* msg, void **flatpp) -{ - cc_generic_list_node_t* gen_node; - cc_generic_iterate_t* gen_iterator; - char *cur_pos; - cc_uint32 zero = 0; - cc_uint32 magic = 0; - cc_uint32 msg_len; - cc_int32 code; - - if (msg == NULL || flatpp == NULL) - return ccErrBadParam; - - code = cci_msg_calc_size(msg,&msg->flat_len); - if ( code != ccNoError ) - return code; - - if (msg->flat_len > CC_MSG_MAX_SIZE) - return ccErrBadParam; - - msg->flat = (void *)malloc(msg->flat_len); - if (msg->flat == NULL) - return ccErrNoMem; - - cur_pos = msg->flat; - - memcpy(cur_pos,&msg->header_len,sizeof(cc_uint32)); - cur_pos+=sizeof(cc_uint32); - - memcpy(cur_pos,&msg->flat_len,sizeof(cc_uint32)); - cur_pos+=sizeof(cc_uint32); - - memcpy(cur_pos,&msg->type,sizeof(cc_uint32)); - cur_pos+=sizeof(cc_uint32); - - memcpy(cur_pos, msg->header, msg->header_len); - cur_pos += msg->header_len; - - memcpy(cur_pos, &zero, sizeof(cc_uint32)); /*will be magic number later*/ - cur_pos += sizeof(cc_uint32); - - code = cci_generic_list_iterator(msg->data_blobs,&gen_iterator); - if ( code != ccNoError ) { - free(msg->flat); - return code; - } - - while (cci_generic_iterate_has_next(gen_iterator)) { - code = cci_generic_iterate_next(gen_iterator, &gen_node); - if (code != ccNoError) { - free(gen_iterator); - free(msg->flat); - return code; - } - memcpy(cur_pos, &gen_node->len, sizeof(cc_uint32)); - cur_pos+=sizeof(cc_uint32); - - memcpy(cur_pos, gen_node->data, gen_node->len); - cur_pos += gen_node->len; - } - free(gen_iterator); - - memcpy(cur_pos, &zero, sizeof(cc_uint32)); /*magic number will go here later*/ - cur_pos += sizeof(cc_uint32); - - if (cur_pos - (char *)msg->flat != msg->flat_len) { - printf("ERRORR cur_pos - msg->flat = %d\n",msg->flat_len); - } - - cci_msg_calc_magic(msg->flat, msg->flat_len, &magic); - printf("magic = %d\n",magic); - - cci_msg_calc_header_size(msg, &msg_len); - memcpy((char *)msg->flat + msg_len, &magic, sizeof(cc_uint32)); - memcpy((char *)msg->flat + msg->flat_len - sizeof(cc_uint32), &magic, sizeof(cc_uint32)); - - if ( flatpp != NULL ) - *flatpp = msg->flat; - return ccNoError; -} - -/** - * cc_msg_ - * - * Purpose: - * - * Return: - * - * Errors: - * - */ -cc_int32 -cci_msg_calc_magic(void *flat, int flat_len, cc_uint32 * magicp) -{ - cc_uint32 magic = 0; - int i; - - for (i = 0; i < flat_len; i += sizeof(cc_uint32)) { - magic = magic ^ *(int *)((char *)flat + i); - } - *magicp = magic; - return ccNoError; -} - -/** - * cc_msg_ - * - * Purpose: - * - * Return: - * - * Errors: - * - */ -cc_int32 -cci_msg_verify(void *flat, int flat_len, cc_uint32 * validp) -{ - cc_uint32 *magic1, *magic2; - cc_uint32 *pheader_len; - cc_uint32 *ptotal_len; - cc_uint32 *pblob_len; - cc_uint32 *ptype; - cc_uint32 num_blobs = 0; - cc_uint32 zero = 0; - cc_uint32 msg_magic, msg_magic2; - - if (flat == NULL || flat_len <= 0 || validp == NULL) - return ccErrBadParam; - - pheader_len = flat; - ptotal_len = (cc_uint32 *)((char *)pheader_len + sizeof(cc_uint32)); - ptype = (cc_uint32 *)((char *)ptotal_len + sizeof(cc_uint32)); - - if (*ptotal_len != flat_len) { - *validp = 0; - return ccNoError; - } - - if (*pheader_len > flat_len) { - /*too weak. We could verify header_len against type spec header.*/ - *validp = 0; - return ccNoError; - } - if (*ptype > CC_MSG_MAX_TYPE) { - *validp = 0; - return ccNoError; - } - - magic1 = (cc_uint32 *)((char *)ptype + sizeof(cc_uint32) + *pheader_len); - if ((char *)magic1 - (char *)flat == (flat_len - 8)) { - /*There are no data blobs*/ - magic2 = (cc_uint32 *)((char *)magic1 + sizeof(cc_uint32)); - num_blobs = 0; - } else { - pblob_len = (cc_uint32 *)((char *)magic1 + sizeof(cc_uint32)); - num_blobs = 1; - - while (*pblob_len + sizeof(cc_uint32) + ((char *)pblob_len - (char *)flat) < (flat_len - sizeof(cc_uint32))) { - pblob_len = (cc_uint32 *)((char *)pblob_len + *pblob_len + sizeof(cc_uint32)); - num_blobs++; - } - - if (*pblob_len + sizeof(cc_uint32) + ((char *)pblob_len - (char *)flat) != (flat_len - sizeof(cc_uint32))) { - /*blobs didn't line up*/ - *validp = 0; - return ccNoError; - } - magic2 = (cc_uint32 *)((char *)pblob_len + *pblob_len + sizeof(cc_uint32)); /*2nd magic should be directly after the last blob*/ - } - - if (*magic1 != *magic2) { - *validp = 0; - return ccNoError; - } - msg_magic = *magic1; - - printf("%d %d\n", (char *)magic1 - (char *)flat, (char *)magic2 - (char *)flat); - - memcpy(magic1, &zero, sizeof(cc_uint32)); - memcpy(magic2, &zero, sizeof(cc_uint32)); - cci_msg_calc_magic(flat, flat_len, &msg_magic2); - if (msg_magic != msg_magic2) { - *validp = 0; - return ccNoError; - } - memcpy(magic1, &msg_magic, sizeof(cc_uint32)); - memcpy(magic2, &msg_magic, sizeof(cc_uint32)); - - *validp = 1; - return ccNoError; -} - -/** - * cc_msg_ - * - * Purpose: - * - * Return: - * - * Errors: - * - */ -cc_int32 -cci_msg_unflatten(void *flat, int flat_len, cc_msg_t** msgpp) -{ - cc_msg_t* msg; - char *cur_pos; - cc_uint32 blob_len; - char *blob; - cc_uint32 valid; - cc_int32 code; - - if ( flat == NULL || flat_len <= 0 || msgpp == NULL ) - return ccErrBadParam; - - code = cci_msg_new(0, &msg); - if (code) - return code; - - cci_msg_verify(flat, flat_len, &valid); - if (valid != 1) { - cci_msg_destroy(msg); - return ccErrBadParam; - } - - cur_pos = flat; - msg->flat = flat; - - msg->header_len = *(cc_uint32 *)cur_pos; - cur_pos += sizeof(cc_uint32); - - msg->flat_len = *(cc_uint32 *)cur_pos; - cur_pos += sizeof(cc_uint32); - - msg->type = *(cc_uint32 *)cur_pos; - cur_pos += sizeof(cc_uint32); - - msg->header = (void *)malloc(msg->header_len); - if (msg->header == NULL) { - cci_msg_destroy(msg); - return ccErrNoMem; - } - memcpy(msg->header, cur_pos, msg->header_len); - cur_pos += msg->header_len; - - msg->magic = *(cc_uint32 *)cur_pos; - cur_pos += sizeof(cc_uint32); - - if (cur_pos - (char *)flat != flat_len - 8) { /*at least 1 blob*/ - blob_len = *(cc_uint32 *)cur_pos; - while (blob_len + (cur_pos - (char *)flat) + sizeof(cc_uint32) <= flat_len - sizeof(cc_uint32)) { - blob = (void *)malloc(blob_len); - if (blob == NULL) { - cci_msg_destroy(msg); - return ccErrNoMem; - } - memcpy(blob, cur_pos + sizeof(cc_uint32), blob_len); - cci_generic_list_append(msg->data_blobs, blob, blob_len, NULL); - - cur_pos += sizeof(cc_uint32) + blob_len; - blob_len = *(int *)cur_pos; - } - } - *msgpp = msg; - return ccNoError; -} - -cc_int32 -cci_msg_retrieve_blob(cc_msg_t* msg, cc_uint32 blob_offset, cc_uint32 blob_len, void **blobp) -{ - cc_generic_iterate_t* gen_iterator; - cc_generic_list_node_t* gen_node; - void *ret; - cc_uint32 blob_pos; - cc_int32 code; - - /*Ensure that the message has been unflattened*/ - if ( msg == NULL || msg->flat == NULL || blob_offset > msg->flat_len || - blob_len > msg->flat_len - blob_offset || blobp == NULL) - return ccErrBadParam; - - code = cci_generic_list_iterator(msg->data_blobs, &gen_iterator); - while (cci_generic_iterate_has_next(gen_iterator)) { - code = cci_generic_iterate_next(gen_iterator, &gen_node); - code = cci_msg_calc_blob_pos(msg, gen_node->data, gen_node->len, &blob_pos); - if (blob_pos == blob_offset && gen_node->len == blob_len) { - free(gen_iterator); - ret = (void *)malloc(blob_len); - if (ret == NULL) - return ccErrNoMem; - memcpy(ret,(char *)msg->flat + blob_offset, blob_len); - *blobp = ret; - return ccNoError; - } - } - free(gen_iterator); - return ccIteratorEnd; -} - -/** - * cc_msg_ - * - * Purpose: - * - * Return: - * - * Errors: - * - */ -cc_int32 -cci_msg_destroy(cc_msg_t* msg) -{ - if (msg->flat != NULL) - free(msg->flat); - if (msg->header != NULL) - free(msg->flat); - cci_generic_list_destroy(msg->data_blobs); - free(msg); - return ccNoError; -} - +/* $Copyright:
+ *
+ * Copyright 2004-2006 by the Massachusetts Institute of Technology.
+ *
+ * All rights reserved.
+ *
+ * Export of this software from the United States of America may require a
+ * specific license from the United States Government. It is the
+ * responsibility of any person or organization contemplating export to
+ * obtain such a license before exporting.
+ *
+ * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and distribute
+ * this software and its documentation for any purpose and without fee is
+ * hereby granted, provided that the above copyright notice appear in all
+ * copies and that both that copyright notice and this permission notice
+ * appear in supporting documentation, and that the name of M.I.T. not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. Furthermore if you
+ * modify this software you must label your software as modified software
+ * and not distribute it in such a fashion that it might be confused with
+ * the original MIT software. M.I.T. makes no representations about the
+ * suitability of this software for any purpose. It is provided "as is"
+ * without express or implied warranty.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
+ * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * Individual source code files are copyright MIT, Cygnus Support,
+ * OpenVision, Oracle, Sun Soft, FundsXpress, and others.
+ *
+ * Project Athena, Athena, Athena MUSE, Discuss, Hesiod, Kerberos, Moira,
+ * and Zephyr are trademarks of the Massachusetts Institute of Technology
+ * (MIT). No commercial use of these trademarks may be made without prior
+ * written permission of MIT.
+ *
+ * "Commercial use" means use of a name in a product or other for-profit
+ * manner. It does NOT prevent a commercial firm from referring to the MIT
+ * trademarks in order to convey information (although in doing so,
+ * recognition of their trademark status should be given).
+ * $
+ */
+
+/*
+ * Verifiable, extensible message format.
+ *
+ * Format:
+ * <size of header block (header_len)>
+ * <size of *entire* message, including previous field (flat_len)>
+ * <message type (type)>
+ * <type specific header (header)>
+ * <magic number (magic)>
+ * <data blob 1 length>
+ * <data blob 1>
+ * <data blob 2 length>
+ * <data blob 2>
+ * ...
+ * <magic number (magic)>
+ *
+ * If the header has variable length data it is included in the data blobs.
+ * The header field has the offset from the beginning of the message of the 1st
+ * byte of the data and the length of the data.
+ */
+
+#include "CredentialsCache.h"
+#include "msg.h"
+#include "generic_lists.h"
+
+#include <stdlib.h>
+#include <memory.h>
+#include <stdio.h>
+#include <string.h>
+
+/**
+ * cci_msg_new()
+ *
+ * Purpose: Allocate and initialize a new cc_msg_t structure
+ *
+ * Input parameter (type) in host order
+ *
+ * Return: non-NULL, the msg
+ * NULL, failure
+ *
+ * Errors: ccErrNoMem
+ *
+ */
+cc_int32
+cci_msg_new(cc_uint32 type, cc_msg_t** msgpp)
+{
+ // type should be validated. If invalid set error to ccErrBadParam
+ cc_msg_t* msg;
+
+ if ( type > CC_MSG_MAX_TYPE || msgpp == NULL )
+ return ccErrBadParam;
+
+ msg = (cc_msg_t*)malloc(sizeof(cc_msg_t));
+ if (msg == NULL)
+ return ccErrNoMem;
+
+ msg->type = type;
+ msg->flat = NULL;
+ msg->header = NULL;
+ msg->flat_len = 0;
+ msg->header_len = 0;
+ msg->magic = 0;
+ cci_generic_list_new(&msg->data_blobs);
+ if (msg->data_blobs == NULL) {
+ // pass on error from previous call
+ free(msg);
+ return ccErrNoMem;
+ }
+
+ *msgpp = msg;
+ return ccNoError;
+}
+
+/**
+ * cci_msg_calc_header_size()
+ *
+ * Purpose: Calculates the size of the header
+ *
+ * Return: the size in bytes
+ *
+ * Errors: ccErrBadParam
+ *
+ */
+cc_int32
+cci_msg_calc_header_size(cc_msg_t* msg, cc_uint32 * lenp)
+{
+ int header_len = 12; /* header size, entire size, type */
+
+ if ( msg == NULL || lenp == NULL )
+ return ccErrBadParam;
+
+ header_len += msg->header_len;
+ *lenp = header_len;
+ return ccNoError;
+}
+
+/**
+ * cci_msg_calc_size()
+ *
+ * Purpose: Calculates the size of the message
+ * (does not include the magic bytes)
+ *
+ * Return: the size in bytes
+ *
+ * Errors: ccErrBadParam
+ *
+ */
+cc_int32
+cci_msg_calc_size(cc_msg_t* msg, cc_uint32 * lenp)
+{
+ cc_uint32 flat_len;
+ cc_generic_list_node_t* gen_node;
+ cc_generic_iterate_t* gen_iterator;
+ cc_int32 code;
+
+ if ( msg == NULL || lenp == NULL )
+ return ccErrBadParam;
+
+ code = cci_msg_calc_header_size(msg, &flat_len);
+ if (code != ccNoError)
+ goto bad;
+
+ code = cci_generic_list_iterator(msg->data_blobs, &gen_iterator);
+ if ( code != ccNoError )
+ goto bad;
+
+ while (cci_generic_iterate_has_next(gen_iterator)) {
+ code = cci_generic_iterate_next(gen_iterator, &gen_node);
+ if (code != ccNoError)
+ break;
+ flat_len += gen_node->len + BLOB_LEN;
+ }
+ cci_generic_free_iterator(gen_iterator);
+ if (code != ccNoError)
+ goto bad;
+
+ flat_len += MAGIC_HEAD_LEN + MAGIC_DATA_LEN;
+ *lenp = flat_len;
+
+ bad:
+ return code;
+}
+
+/**
+ * cci_msg_add_data_blob()
+ *
+ * Purpose: Adds 'len' bytes of data to the msg
+ *
+ * Return:
+ *
+ * Errors:
+ *
+ */
+cc_int32
+cci_msg_add_data_blob(cc_msg_t* msg, void *data, cc_uint32 len, cc_uint32 *lenp)
+{
+ cc_int32 code;
+
+ if (msg == NULL || data == NULL || len <= 0 || lenp == NULL)
+ return ccErrBadParam;
+
+ code = cci_generic_list_append(msg->data_blobs, data, len, NULL);
+ if ( code != ccNoError )
+ return code;
+ return cci_msg_calc_blob_pos(msg, data, len, lenp);
+}
+
+/**
+ * cc_msg_
+ *
+ * Purpose:
+ *
+ * Return:
+ *
+ * Errors:
+ *
+ */
+cc_int32
+cci_msg_calc_blob_pos(cc_msg_t* msg, void *data, cc_uint32 len, cc_uint32 * posp)
+{
+ cc_uint32 pos;
+ cc_generic_list_node_t* gen_node;
+ cc_generic_iterate_t* gen_iterator;
+ cc_int32 code;
+
+ code = cci_msg_calc_header_size(msg, &pos);
+ pos += sizeof(cc_uint32); /*+ sizeof(cc_uint32) for magic*/
+
+ code = cci_generic_list_iterator(msg->data_blobs, &gen_iterator);
+ while (cci_generic_iterate_has_next(gen_iterator)) {
+ code = cci_generic_iterate_next(gen_iterator, &gen_node);
+ if (gen_node->len != len && gen_node->data != data) {
+ pos += gen_node->len + sizeof(cc_uint32);
+ } else {
+ cci_generic_free_iterator(gen_iterator);
+ *posp = pos + sizeof(cc_uint32);
+ return ccNoError;
+ }
+ }
+
+ cci_generic_free_iterator(gen_iterator);
+ return ccIteratorEnd;
+}
+
+/**
+ * cc_msg_
+ *
+ * Purpose:
+ *
+ * Return:
+ *
+ * Errors:
+ *
+ */
+cc_int32
+cci_msg_add_header(cc_msg_t* msg, void *header, cc_uint32 header_len)
+{
+ if ( msg == NULL || header == NULL )
+ return ccErrBadParam;
+
+ msg->header = header;
+ msg->header_len = header_len;
+ return ccNoError;
+}
+
+
+/**
+ * cc_msg_
+ *
+ * Purpose:
+ *
+ * Return:
+ *
+ * Errors:
+ *
+ */
+cc_int32
+cci_msg_flatten(cc_msg_t* msg, void **flatpp)
+{
+ cc_generic_list_node_t* gen_node;
+ cc_generic_iterate_t* gen_iterator;
+ char *cur_pos;
+ cc_uint32 zero = 0;
+ cc_uint32 magic = 0;
+ cc_uint32 msg_len;
+ cc_uint32 u32;
+ cc_int32 code;
+
+ if (msg == NULL)
+ return ccErrBadParam;
+
+ code = cci_msg_calc_size(msg,&msg->flat_len);
+ if ( code != ccNoError )
+ return code;
+
+ if (msg->flat_len > CC_MSG_MAX_SIZE)
+ return ccErrBadParam;
+
+ msg->flat = (void *)malloc(msg->flat_len);
+ if (msg->flat == NULL)
+ return ccErrNoMem;
+
+ cur_pos = msg->flat;
+
+ u32 = htonl(msg->header_len);
+ memcpy(cur_pos,&u32,sizeof(cc_uint32));
+ cur_pos+=sizeof(cc_uint32);
+
+ u32 = htonl(msg->flat_len);
+ memcpy(cur_pos,&u32,sizeof(cc_uint32));
+ cur_pos+=sizeof(cc_uint32);
+
+ u32 = htonl(msg->type);
+ memcpy(cur_pos,&u32,sizeof(cc_uint32));
+ cur_pos+=sizeof(cc_uint32);
+
+ /* header data is already in network order */
+ memcpy(cur_pos, msg->header, msg->header_len);
+ cur_pos += msg->header_len;
+
+ u32 = htonl(zero);
+ memcpy(cur_pos, &u32, sizeof(cc_uint32)); /*will be magic number later*/
+ cur_pos += sizeof(cc_uint32);
+
+ code = cci_generic_list_iterator(msg->data_blobs, &gen_iterator);
+ if ( code != ccNoError ) {
+ free(msg->flat);
+ return code;
+ }
+
+ while (cci_generic_iterate_has_next(gen_iterator)) {
+ code = cci_generic_iterate_next(gen_iterator, &gen_node);
+ if (code != ccNoError) {
+ free(gen_iterator);
+ free(msg->flat);
+ return code;
+ }
+ u32 = htonl(gen_node->len);
+ memcpy(cur_pos, &u32, sizeof(cc_uint32));
+ cur_pos+=sizeof(cc_uint32);
+
+ /* data already in network order */
+ memcpy(cur_pos, gen_node->data, gen_node->len);
+ cur_pos += gen_node->len;
+ }
+ free(gen_iterator);
+
+ u32 = htonl(zero);
+ memcpy(cur_pos, &u32, sizeof(cc_uint32)); /*magic number will go here later*/
+ cur_pos += sizeof(cc_uint32);
+
+ if (cur_pos - (char *)msg->flat != msg->flat_len) {
+ fprintf(stderr, "ERROR cur_pos - msg->flat = %d\n",msg->flat_len);
+ }
+
+ cci_msg_calc_magic(msg->flat, msg->flat_len, &magic);
+ printf("magic = %d\n",magic);
+
+ cci_msg_calc_header_size(msg, &msg_len);
+ memcpy((char *)msg->flat + msg_len, &magic, sizeof(cc_uint32));
+ memcpy((char *)msg->flat + msg->flat_len - sizeof(cc_uint32), &magic, sizeof(cc_uint32));
+
+ if ( flatpp != NULL )
+ *flatpp = msg->flat;
+
+ return ccNoError;
+}
+
+/**
+ * cc_msg_
+ *
+ * Purpose:
+ *
+ * Return:
+ *
+ * Errors:
+ *
+ */
+cc_int32
+cci_msg_calc_magic(void *flat, int flat_len, cc_uint32 * magicp)
+{
+ cc_uint32 magic = 0;
+ int i;
+
+ for (i = 0; i < flat_len; i += sizeof(cc_uint32)) {
+ magic = magic ^ *(int *)((char *)flat + i);
+ }
+ *magicp = htonl(magic);
+ return ccNoError;
+}
+
+/**
+ * cc_msg_
+ *
+ * Purpose:
+ *
+ * Return:
+ *
+ * Errors:
+ *
+ */
+cc_int32
+cci_msg_verify(void *flat, int flat_len, cc_uint32 * validp)
+{
+ cc_uint32 *magic1, *magic2;
+ cc_uint32 *pheader_len;
+ cc_uint32 header_len;
+ cc_uint32 *ptotal_len;
+ cc_uint32 total_len;
+ cc_uint32 *pblob_len;
+ cc_uint32 blob_len;
+ cc_uint32 *ptype;
+ cc_uint32 type;
+ cc_uint32 num_blobs = 0;
+ cc_uint32 zero = 0;
+ cc_uint32 msg_magic, msg_magic2;
+
+ if (flat == NULL || flat_len <= 0 || validp == NULL)
+ return ccErrBadParam;
+
+ pheader_len = flat;
+ ptotal_len = (cc_uint32 *)((char *)pheader_len + sizeof(cc_uint32));
+ ptype = (cc_uint32 *)((char *)ptotal_len + sizeof(cc_uint32));
+
+ header_len = ntohl(*pheader_len);
+ total_len = ntohl(*ptotal_len);
+ type = ntohl(*ptype);
+
+ if (total_len != flat_len) {
+ *validp = 0;
+ return ccNoError;
+ }
+
+ if (header_len > flat_len) {
+ /*too weak. We could verify header_len against type spec header.*/
+ *validp = 0;
+ return ccNoError;
+ }
+ if (type > CC_MSG_MAX_TYPE) {
+ *validp = 0;
+ return ccNoError;
+ }
+
+ magic1 = (cc_uint32 *)((char *)ptype + sizeof(cc_uint32) + header_len);
+ if ((char *)magic1 - (char *)flat == (flat_len - 8)) {
+ /*There are no data blobs*/
+ magic2 = (cc_uint32 *)((char *)magic1 + sizeof(cc_uint32));
+ num_blobs = 0;
+ } else {
+ pblob_len = (cc_uint32 *)((char *)magic1 + sizeof(cc_uint32));
+ num_blobs = 1;
+ blob_len = ntohl(*pblob_len);
+
+ while (blob_len + sizeof(cc_uint32) + ((char *)pblob_len - (char *)flat) < (flat_len - sizeof(cc_uint32))) {
+ pblob_len = (cc_uint32 *)((char *)pblob_len + blob_len + sizeof(cc_uint32));
+ num_blobs++;
+ blob_len = ntohl(*pblob_len);
+ }
+
+ if (blob_len + sizeof(cc_uint32) + ((char *)pblob_len - (char *)flat) != (flat_len - sizeof(cc_uint32))) {
+ /*blobs didn't line up*/
+ *validp = 0;
+ return ccNoError;
+ }
+ magic2 = (cc_uint32 *)((char *)pblob_len + blob_len + sizeof(cc_uint32)); /*2nd magic should be directly after the last blob*/
+ }
+
+ if (*magic1 != *magic2) {
+ *validp = 0;
+ return ccNoError;
+ }
+ msg_magic = *magic1;
+
+ printf("%d %d\n", (char *)magic1 - (char *)flat, (char *)magic2 - (char *)flat);
+
+ memcpy(magic1, &zero, sizeof(cc_uint32));
+ memcpy(magic2, &zero, sizeof(cc_uint32));
+ cci_msg_calc_magic(flat, flat_len, &msg_magic2);
+ /* both msg_magic and msg_magic2 are in network order */
+ if (msg_magic != msg_magic2) {
+ *validp = 0;
+ return ccNoError;
+ }
+ memcpy(magic1, &msg_magic, sizeof(cc_uint32));
+ memcpy(magic2, &msg_magic, sizeof(cc_uint32));
+
+ *validp = 1;
+ return ccNoError;
+}
+
+/**
+ * cc_msg_
+ *
+ * Purpose:
+ *
+ * Return:
+ *
+ * Errors:
+ *
+ */
+cc_int32
+cci_msg_unflatten(void *flat, int flat_len, cc_msg_t** msgpp)
+{
+ cc_msg_t* msg;
+ char *cur_pos;
+ cc_uint32 blob_len;
+ char *blob;
+ cc_uint32 valid;
+ cc_int32 code;
+
+ if ( flat == NULL || flat_len <= 0 || msgpp == NULL )
+ return ccErrBadParam;
+
+ code = cci_msg_new(0, &msg);
+ if (code)
+ return code;
+
+ cci_msg_verify(flat, flat_len, &valid);
+ if (valid != 1) {
+ cci_msg_destroy(msg);
+ return ccErrBadParam;
+ }
+
+ cur_pos = flat;
+ msg->flat = flat;
+
+ msg->header_len = ntohl(*(cc_uint32 *)cur_pos);
+ cur_pos += sizeof(cc_uint32);
+
+ msg->flat_len = ntohl(*(cc_uint32 *)cur_pos);
+ cur_pos += sizeof(cc_uint32);
+
+ msg->type = ntohl(*(cc_uint32 *)cur_pos);
+ cur_pos += sizeof(cc_uint32);
+
+ msg->header = (void *)malloc(msg->header_len);
+ if (msg->header == NULL) {
+ cci_msg_destroy(msg);
+ return ccErrNoMem;
+ }
+ memcpy(msg->header, cur_pos, msg->header_len);
+ cur_pos += msg->header_len;
+
+ msg->magic = ntohl(*(cc_uint32 *)cur_pos);
+ cur_pos += sizeof(cc_uint32);
+
+ if (cur_pos - (char *)flat != flat_len - 8) { /*at least 1 blob*/
+ blob_len = ntohl(*(cc_uint32 *)cur_pos);
+ while (blob_len + (cur_pos - (char *)flat) + sizeof(cc_uint32) <= flat_len - sizeof(cc_uint32)) {
+ blob = (void *)malloc(blob_len);
+ if (blob == NULL) {
+ cci_msg_destroy(msg);
+ return ccErrNoMem;
+ }
+ memcpy(blob, cur_pos + sizeof(cc_uint32), blob_len);
+ cci_generic_list_append(msg->data_blobs, blob, blob_len, NULL);
+
+ cur_pos += sizeof(cc_uint32) + blob_len;
+ blob_len = ntohl(*(int *)cur_pos);
+ }
+ }
+ *msgpp = msg;
+ return ccNoError;
+}
+
+cc_int32
+cci_msg_retrieve_blob(cc_msg_t* msg, cc_uint32 blob_offset, cc_uint32 blob_len, char **blobp)
+{
+ cc_generic_iterate_t* gen_iterator;
+ cc_generic_list_node_t* gen_node;
+ void *ret;
+ cc_uint32 blob_pos;
+ cc_int32 code;
+
+ /*Ensure that the message has been unflattened*/
+ if ( msg == NULL || msg->flat == NULL || blob_offset > msg->flat_len ||
+ blob_len > msg->flat_len - blob_offset || blobp == NULL)
+ return ccErrBadParam;
+
+ code = cci_generic_list_iterator(msg->data_blobs, &gen_iterator);
+ while (cci_generic_iterate_has_next(gen_iterator)) {
+ code = cci_generic_iterate_next(gen_iterator, &gen_node);
+ code = cci_msg_calc_blob_pos(msg, gen_node->data, gen_node->len, &blob_pos);
+ if (blob_pos == blob_offset && gen_node->len == blob_len) {
+ free(gen_iterator);
+ ret = (void *)malloc(blob_len);
+ if (ret == NULL)
+ return ccErrNoMem;
+ memcpy(ret,(char *)msg->flat + blob_offset, blob_len);
+ *blobp = ret;
+ return ccNoError;
+ }
+ }
+ free(gen_iterator);
+ return ccIteratorEnd;
+}
+
+/**
+ * cc_msg_
+ *
+ * Purpose:
+ *
+ * Return:
+ *
+ * Errors:
+ *
+ */
+cc_int32
+cci_msg_destroy(cc_msg_t* msg)
+{
+ if (msg->flat != NULL)
+ free(msg->flat);
+ if (msg->header != NULL)
+ free(msg->header);
+ cci_generic_list_destroy(msg->data_blobs);
+ free(msg);
+ return ccNoError;
+}
+
diff --git a/src/lib/ccapi/doc/implementation-notes.txt b/src/lib/ccapi/doc/implementation-notes.txt new file mode 100644 index 0000000000..e6150fb23e --- /dev/null +++ b/src/lib/ccapi/doc/implementation-notes.txt @@ -0,0 +1,156 @@ +The following are notes describing the requirements of the Platform
+Specific code necessary for constructing a Portable CCAPI.
+
+Directory structure:
+
+ lib/ccapi/client - platform independent client library
+ lib/ccapi/common - platform independent common library
+ lib/ccapi/include - platform independent header files
+ lib/ccapi/mac - macosx specific headers, libraries, executables
+ lib/ccapi/server - platform independent server library
+ lib/ccapi/windows - windows specific headers, libraries, executables
+
+
+Platform Independent Design:
+
+The functionality of the Portable CCAPI is implemented in the platform
+independent libraries. The common library encapsulates the functions
+for managing generic lists, iterators, and messages as well as routines
+formarshalling and unmarshalling. The client library provides the
+client side routines for issuing requests to the ccapi server minus the
+platform dependent glue required for shared library initialization,
+cleanup, and interprocess communications. The server library provides
+server side functionality for managing credential cache collections,
+caches, credentials, iterators, and their handles minus the platform
+dependent glue for process initialization, interprocess communication,
+session security, and critical section enforcement.
+
+
+Platform Dependent Design Requirements:
+
+The platform dependent code is responsible for producing a shared
+client library:
+
+ + the shared library is built from cc_client.lib and cc_common.lib plus
+ platform dependent glue
+
+ - [windows] link cc_client.lib and cc_common.lib with platform
+ dependent routines and export list (.def) to produce
+ krbcc32.{lib,dll}
+
+ + initialization and cleanup
+
+ - [windows] provide DllMain entry point providing Process and Thread
+ attachment and detachment routines
+
+ + implement cci_perform_rpc() function used by cc_client.lib
+ cc_int32 cci_perform_rpc(cc_msg_t *request, cc_msg_t **response)
+
+ - cci_perform_rpc() takes an input request cc_msg_t object, flattens
+ it with cci_msg_flatten() and sends the contents of unsigned char
+ buffer request->flat of length request->flat_len to the server
+ utilizing a platform specific interprocess communication method.
+
+ - upon IPC success, cci_perform_rpc() unflattens the response buffer
+ with cci_msg_unflatten() and returns the new cc_msg_t response
+ object to the caller.
+
+ - cci_perform_rpc() is responsible for performing any necessary
+ session security management. For example, on Windows the Logon
+ Provider executes under the local machine's "SYSTEM" account within
+ session 0 and not under the account of the user that is logging in
+ nor within the session the user's desktop and applications will be
+ running within. It is the responsibility of cci_perform_rpc() and
+ the platform dependent IPC mechanism to communicate the user's
+ security identifiers to the server.
+
+ For Windows, this means that the platform specific IPC messaging
+ allows a username and session identifier to be sent separate from
+ the username and session identifier that will be obtained via the
+ use of Local RPC. If the Local RPC authenticates the user as
+ "SYSTEM" and session 0, then the communicated values (if provided)
+ will be used instead.
+
+ + implement client side of IPC routine.
+
+ - [windows] the client side IPC routine is produced by compiling a
+ IDL file. The IDL defines an interface with a single function:
+
+ __int32 ccapi_Message (
+ [in] handle_t h,
+ [in, string] unsigned char * client_name,
+ [in] struct _LUID luid,
+ [in] __int32 in_len,
+ [in, string, size_is(in_len)] unsigned char * in_buf,
+ [in] __int32 out_size,
+ [out] __int32 * out_len,
+ [out, string, size_is(out_size)] unsigned char
+ out_buf[*]);
+
+ The handle is a Local RPC specific handle used to identify the
+ request. The client_name and luid are the override values for the
+ username and session identifier for use during Windows login. The
+ rest of the parameters provide the input and output buffers as well
+ as allow communication of the actual length of the message data
+ that is required by cci_msg_unflatten().
+
+ + if the CCAPI server is per-session, the shared client library is
+ responsible for ensuring that an instance of the server is running in
+ the current session. If not, the library must initiate an instance
+ of the CCAPI server prior to performing any IPC requests.
+
+The platform dependent code is responsible for producing a server
+executable:
+
+ + The server executable is built from cc_server.lib and cc_common.lib
+ plus platform dependent glue.
+
+ - [windows] The Windows CCAPI Server is being built using the
+ per-system model. The platform specific code is responsible for
+ providing NT Service Management routines for installation and
+ removal as well as the NT Service Entry Points used when the
+ process is started as an NT Service.
+
+ link cc_server.lib and cc_common.lib with platform dependent
+ routines to produce krbcc32s.exe.
+
+ + Based upon the platform requirements, the server may be constructed
+ to be per-session or per-system. The selected IPC mechanism must
+ enforce the appropriate scoping.
+
+ + The platform dependent startup routines will perform platform
+ specific initialization including the IPC engine and call the
+ platform independent initialization routine ccs_serv_initialize()
+
+ + The platform dependent shutdown routines will perform platform
+ specific cleanup including the IPC engine and call the platform
+ independent function ccs_serv_cleanup() prior to process termination.
+
+ + For each inbound CCAPI request, the server will unmarshall the
+ request using cci_msg_unflatten() to produce a cc_msg_t object,
+ construct cc_auth_info_t and cc_session_info_t objects to represent
+ the platform dependent authentication and session data, call
+ ccs_serv_process_msg() to process the request, call cci_msg_flatten()
+ to marhall the response, transmit the response to the caller, and
+ then cleanup the request and response cc_msg_t objects with
+ cci_msg_destroy().
+
+ + The cc_auth_info_t and cc_session_info_t objects are structures
+ storing opaque binary (data, length) representations of the
+ authentication and session data. These are stored as part of ccache
+ collection and ccaches. ccs_serv_process_msg() will perform a binary
+ comparison of the stored data with the data provided in the current
+ request. If they do not match, the request will be denied. It is
+ necessary that the data generated data always be the same. If
+ username strings are not case-sensitive, they should be normalized
+ before being passed to ccs_serv_process_msg().
+
+ + The current cc_server.lib routines assume that one request at a time
+ is being processed. If the IPC engine allows for more than one
+ request to be simultaneously received in separate threads, then the
+ call to ccs_serv_process_msg() must be wrapped by a critical section.
+ Future enhancements to cc_server.lib will allow for per-object
+ mutexes. When available the platform specific glue must provide
+ functions to create, obtain, release, and destroy mutex objects.
+
+
diff --git a/src/lib/ccapi/include/CredentialsCache.h b/src/lib/ccapi/include/CredentialsCache.h index dd60fa46d6..95c4fe79ba 100644 --- a/src/lib/ccapi/include/CredentialsCache.h +++ b/src/lib/ccapi/include/CredentialsCache.h @@ -1,6 +1,6 @@ /* $Copyright: * - * Copyright 1998-2004 by the Massachusetts Institute of Technology. + * Copyright 1998-2006 by the Massachusetts Institute of Technology. * * All rights reserved. * @@ -46,12 +46,12 @@ /* * Declarations for Credentials Cache API Library * - * API specification: <http://web.mit.edu/pismere/kerberos/ccache-api-v2.html> + * API specification: <http://web.mit.edu/pismere/kerberos/ccache-api-v3.html> * * Revision 1: Frank Dabek, 6/4/1998 * Revision 2: meeroh, 2/24/1999 * Revision 3: meeroh, 11/12/1999 - * Revision 4: jaltman, 10/27/2004 + * Revision 6: jaltman, 10/27/2004 * */ @@ -59,14 +59,11 @@ #define __CREDENTIALSCACHE__ #if defined(macintosh) || (defined(__MACH__) && defined(__APPLE__)) - #include <TargetConditionals.h> - #if TARGET_RT_MAC_CFM - #error "Use KfM 4.0 SDK headers for CFM compilation." - #endif +#include <TargetConditionals.h> #endif -#if TARGET_OS_MAC - #include <sys/types.h> +#if defined(_WIN32) +#include <winsock.h> #endif #ifdef __cplusplus @@ -74,11 +71,20 @@ extern "C" { #endif /* __cplusplus */ #if TARGET_OS_MAC - #if defined(__MWERKS__) - #pragma import on - #pragma enumsalwaysint on - #endif - #pragma options align=mac68k +#pragma options align=mac68k +#endif + +#if defined(_WIN32) +#define CCACHE_API __declspec(dllexport) + +#if _INTEGRAL_MAX_BITS >= 64 && _MSC_VER >= 1400 && !defined(_WIN64) && !defined(_USE_32BIT_TIME_T) +#if defined(_TIME_T_DEFINED) || defined(_INC_IO) || defined(_INC_TIME) || defined(_INC_WCHAR) +#error time_t has been defined as a 64-bit integer which is incompatible with Kerberos on this platform. +#endif /* _TIME_T_DEFINED */ +#define _USE_32BIT_TIME_T +#endif +#else +#define CCACHE_API #endif #include <time.h> @@ -92,14 +98,16 @@ enum { ccapi_version_2 = 2, ccapi_version_3 = 3, ccapi_version_4 = 4, - ccapi_version_5 = 5 + ccapi_version_5 = 5, + ccapi_version_6 = 6, + ccapi_version_max = ccapi_version_6 }; /* Errors */ enum { - ccNoError = 0, + ccNoError = 0, - ccIteratorEnd = 201, + ccIteratorEnd = 201, ccErrBadParam, ccErrNoMem, ccErrInvalidContext, @@ -111,7 +119,7 @@ enum { ccErrInvalidCredentialsIterator, ccErrInvalidLock, - ccErrBadName, /* 211 */ + ccErrBadName, /* 211 */ ccErrBadCredentialsVersion, ccErrBadAPIVersion, ccErrContextLocked, @@ -123,7 +131,7 @@ enum { ccErrNeverDefault, ccErrCredentialsNotFound, - ccErrCCacheNotFound, /* 221 */ + ccErrCCacheNotFound, /* 221 */ ccErrContextNotFound, ccErrServerUnavailable, ccErrServerInsecure, @@ -135,20 +143,22 @@ enum { }; /* Credentials versions */ -enum { +enum cc_credential_versions { cc_credentials_v4 = 1, cc_credentials_v5 = 2, cc_credentials_v4_v5 = 3 }; /* Lock types */ -enum { - cc_lock_read = 1, - cc_lock_write = 2 +enum cc_lock_types { + cc_lock_read = 0, + cc_lock_write = 1, + cc_lock_upgrade = 2, + cc_lock_downgrade = 3 }; /* Locking Modes */ -enum { +enum cc_lock_modes { cc_lock_noblock = 0, cc_lock_block = 1 }; @@ -157,12 +167,20 @@ enum { * Basic types */ -typedef char cc_int8; -typedef unsigned char cc_uint8; -typedef int cc_int32; -typedef unsigned int cc_uint32; -typedef time_t cc_time_t; -typedef void * cc_handle; +typedef char cc_int8; +typedef unsigned char cc_uint8; +typedef int cc_int32; +typedef unsigned int cc_uint32; +#if defined (WIN32) +typedef __int64 cc_int64; +typedef unsigned __int64 cc_uint64; +#else +typedef long long cc_int64; +typedef unsigned long long cc_uint64; +#endif +typedef time_t cc_time; +typedef cc_int64 cc_time64; +typedef cc_uint64 cc_handle; /* * API types @@ -190,10 +208,11 @@ typedef struct cc_credentials_f cc_credentials_f; /* Credentials types */ enum { /* Make sure all of these are multiples of four (for alignment sanity) */ - cc_v4_name_size = 40, + cc_v4_name_size = 40, cc_v4_instance_size = 40, cc_v4_realm_size = 40, - cc_v4_ticket_size = 1254 + cc_v4_ticket_size = 1254, + cc_v4_key_size = 8 }; enum cc_string_to_key_type { @@ -211,10 +230,10 @@ struct cc_credentials_v4_t { char service [cc_v4_name_size]; char service_instance [cc_v4_instance_size]; char realm [cc_v4_realm_size]; - unsigned char session_key [8]; + unsigned char session_key [cc_v4_key_size]; cc_int32 kvno; cc_int32 string_to_key_type; - cc_time_t issue_date; + cc_time issue_date; cc_int32 lifetime; cc_uint32 address; cc_int32 ticket_size; @@ -233,10 +252,10 @@ struct cc_credentials_v5_t { char* client; char* server; cc_data keyblock; - cc_time_t authtime; - cc_time_t starttime; - cc_time_t endtime; - cc_time_t renew_till; + cc_time authtime; + cc_time starttime; + cc_time endtime; + cc_time renew_till; cc_uint32 is_skey; cc_uint32 ticket_flags; cc_data** addresses; @@ -320,7 +339,7 @@ struct cc_context_f { cc_context_t context); cc_int32 (*get_change_time) ( cc_context_t context, - cc_time_t* time); + cc_time* time); cc_int32 (*get_default_ccache_name) ( cc_context_t context, cc_string_t* name); @@ -397,16 +416,16 @@ struct cc_ccache_f { cc_ccache_t destination); cc_int32 (*lock) ( cc_ccache_t ccache, - cc_uint32 block, - cc_uint32 lock_type); + cc_uint32 lock_type, + cc_uint32 block); cc_int32 (*unlock) ( cc_ccache_t ccache); cc_int32 (*get_last_default_time) ( cc_ccache_t ccache, - cc_time_t* time); + cc_time* time); cc_int32 (*get_change_time) ( cc_ccache_t ccache, - cc_time_t* time); + cc_time* time); cc_int32 (*compare) ( cc_ccache_t ccache, cc_ccache_t compare_to, @@ -414,11 +433,11 @@ struct cc_ccache_f { cc_int32 (*get_kdc_time_offset) ( cc_ccache_t ccache, cc_int32 credentials_version, - cc_time_t* time_offset); + cc_time* time_offset); cc_int32 (*set_kdc_time_offset) ( cc_ccache_t ccache, cc_int32 credentials_version, - cc_time_t time_offset); + cc_time time_offset); cc_int32 (*clear_kdc_time_offset) ( cc_ccache_t ccache, @@ -446,6 +465,9 @@ struct cc_ccache_iterator_f { cc_int32 (*next) ( cc_ccache_iterator_t iter, cc_ccache_t* ccache); + + cc_int32 (*clone) ( cc_ccache_iterator_t iter, + cc_ccache_iterator_t* new_iter); }; struct cc_credentials_iterator_f { @@ -453,17 +475,20 @@ struct cc_credentials_iterator_f { cc_credentials_iterator_t iter); cc_int32 (*next) ( cc_credentials_iterator_t iter, - cc_credentials_t* ccache); + cc_credentials_t* cred); + + cc_int32 (*clone) ( cc_credentials_iterator_t iter, + cc_credentials_iterator_t* new_iter); }; /* * API functions */ -cc_int32 cc_initialize ( +CCACHE_API cc_int32 cc_initialize ( cc_context_t* outContext, - cc_int32 inVersion, - cc_int32* outSupportedVersion, + cc_int32 inVersion, + cc_int32* outSupportedVersion, char const** outVendor); /* @@ -488,8 +513,8 @@ cc_int32 cc_initialize ( ((context) -> functions -> create_new_ccache (context, version, principal, ccache)) #define cc_context_new_ccache_iterator(context, iterator) \ ((context) -> functions -> new_ccache_iterator (context, iterator)) -#define cc_context_lock(context, type, lock) \ - ((context) -> functions -> lock (context, type, lock)) +#define cc_context_lock(context, type, block) \ + ((context) -> functions -> lock (context, type, block)) #define cc_context_unlock(context) \ ((context) -> functions -> unlock (context)) #define cc_context_compare(context, compare_to, equal) \ @@ -515,8 +540,8 @@ cc_int32 cc_initialize ( ((ccache) -> functions -> remove_credentials (ccache, credentials)) #define cc_ccache_new_credentials_iterator(ccache, iterator) \ ((ccache) -> functions -> new_credentials_iterator (ccache, iterator)) -#define cc_ccache_lock(ccache, lock) \ - ((ccache) -> functions -> lock (ccache, lock)) +#define cc_ccache_lock(ccache, type, block) \ + ((ccache) -> functions -> lock (ccache, type, block)) #define cc_ccache_unlock(ccache, unlock) \ ((ccache) -> functions -> unlock (ccache, unlock)) #define cc_ccache_get_last_default_time(ccache, time) \ @@ -528,11 +553,11 @@ cc_int32 cc_initialize ( #define cc_ccache_compare(ccache, compare_to, equal) \ ((ccache) -> functions -> compare (ccache, compare_to, equal)) #define cc_ccache_get_kdc_time_offset(ccache, version, time) \ - ((ccache) -> functions -> get_kdc_time_offset (version, time)) + ((ccache) -> functions -> get_kdc_time_offset (version, time)) #define cc_ccache_set_kdc_time_offset(ccache, version, time) \ - ((ccache) -> functions -> set_kdc_time_offset (version, time)) + ((ccache) -> functions -> set_kdc_time_offset (version, time)) #define cc_ccache_clear_kdc_time_offset(ccache, version) \ - ((ccache) -> functions -> clear_kdc_time_offset (version)) + ((ccache) -> functions -> clear_kdc_time_offset (version)) #define cc_string_release(string) \ ((string) -> functions -> release (string)) @@ -546,18 +571,18 @@ cc_int32 cc_initialize ( ((iterator) -> functions -> release (iterator)) #define cc_ccache_iterator_next(iterator, ccache) \ ((iterator) -> functions -> next (iterator, ccache)) +#define cc_ccache_iterator_clone(iterator, new_iter) \ + ((iterator) -> functions -> clone (iterator, new_iter)) #define cc_credentials_iterator_release(iterator) \ ((iterator) -> functions -> release (iterator)) #define cc_credentials_iterator_next(iterator, credentials) \ ((iterator) -> functions -> next (iterator, credentials)) +#define cc_credentials_iterator_clone(iterator, new_iter) \ + ((iterator) -> functions -> clone (iterator, new_iter)) #if TARGET_OS_MAC - #if defined(__MWERKS__) - #pragma enumsalwaysint reset - #pragma import reset - #endif - #pragma options align=reset +#pragma options align=reset #endif #ifdef __cplusplus diff --git a/src/lib/ccapi/include/CredentialsCache2.h b/src/lib/ccapi/include/CredentialsCache2.h index 401e093f43..5505bf29fe 100644 --- a/src/lib/ccapi/include/CredentialsCache2.h +++ b/src/lib/ccapi/include/CredentialsCache2.h @@ -1,6 +1,6 @@ /* $Copyright: * - * Copyright 1998-2004 by the Massachusetts Institute of Technology. + * Copyright 1998-2006 by the Massachusetts Institute of Technology. * * All rights reserved. * @@ -48,12 +48,10 @@ #ifndef __CREDENTIALSCACHE2__ #define __CREDENTIALSCACHE2__ -#include <Kerberos/CredentialsCache.h> +#include "CredentialsCache.h" + #if defined(macintosh) || (defined(__MACH__) && defined(__APPLE__)) - #include <TargetConditionals.h> - #if TARGET_RT_MAC_CFM - #error "Use KfM 4.0 SDK headers for CFM compilation." - #endif +#include <TargetConditionals.h> #endif #ifdef __cplusplus @@ -61,13 +59,9 @@ extern "C" { #endif /* __cplusplus */ #if TARGET_OS_MAC - #if defined(__MWERKS__) - #pragma import on - #pragma enumsalwaysint on - #endif - #pragma options align=mac68k +#pragma options align=mac68k #endif - + /* Some old types get directly mapped to new types */ typedef cc_context_d apiCB; @@ -87,10 +81,10 @@ typedef struct cc_credentials_v5_compat { char* client; char* server; cc_data_compat keyblock; - cc_time_t authtime; - cc_time_t starttime; - cc_time_t endtime; - cc_time_t renew_till; + cc_time authtime; + cc_time starttime; + cc_time endtime; + cc_time renew_till; cc_uint32 is_skey; cc_uint32 ticket_flags; cc_data_compat** addresses; @@ -185,25 +179,32 @@ enum { CC_CRED_MAX }; -cc_int32 cc_shutdown ( +enum { + CC_LOCK_UNLOCK = 1, + CC_LOCK_READER = 2, + CC_LOCK_WRITER = 3, + CC_LOCK_NOBLOCK = 16 +}; + +CCACHE_API cc_int32 cc_shutdown ( apiCB** ioContext); -cc_int32 cc_get_NC_info ( +CCACHE_API cc_int32 cc_get_NC_info ( apiCB* inContext, infoNC*** outInfo); -cc_int32 cc_get_change_time ( +CCACHE_API cc_int32 cc_get_change_time ( apiCB* inContext, - cc_time_t* outTime); + cc_time* outTime); -cc_int32 cc_open ( +CCACHE_API cc_int32 cc_open ( apiCB* inContext, const char* inName, cc_int32 inVersion, cc_uint32 inFlags, ccache_p** outCCache); -cc_int32 cc_create ( +CCACHE_API cc_int32 cc_create ( apiCB* inContext, const char* inName, const char* inPrincipal, @@ -211,94 +212,95 @@ cc_int32 cc_create ( cc_uint32 inFlags, ccache_p** outCCache); -cc_int32 cc_close ( +CCACHE_API cc_int32 cc_close ( apiCB* inContext, ccache_p** ioCCache); -cc_int32 cc_destroy ( +CCACHE_API cc_int32 cc_destroy ( apiCB* inContext, ccache_p** ioCCache); -cc_int32 cc_seq_fetch_NCs_begin ( +CCACHE_API cc_int32 cc_seq_fetch_NCs_begin ( apiCB* inContext, - ccache_cit** outIterator); + ccache_cit** outIterator); -cc_int32 cc_seq_fetch_NCs_next ( +CCACHE_API cc_int32 cc_seq_fetch_NCs_next ( apiCB* inContext, ccache_p** outCCache, ccache_cit* inIterator); -cc_int32 cc_seq_fetch_NCs_end ( +CCACHE_API cc_int32 cc_seq_fetch_NCs_end ( apiCB* inContext, - ccache_cit** ioIterator); + ccache_cit** ioIterator); -cc_int32 cc_get_name ( +CCACHE_API cc_int32 cc_get_name ( apiCB* inContext, ccache_p* inCCache, char** outName); -cc_int32 cc_get_cred_version ( +CCACHE_API cc_int32 cc_get_cred_version ( apiCB* inContext, ccache_p* inCCache, cc_int32* outVersion); -cc_int32 cc_set_principal ( +CCACHE_API cc_int32 cc_set_principal ( apiCB* inContext, ccache_p* inCCache, cc_int32 inVersion, char* inPrincipal); -cc_int32 cc_get_principal ( +CCACHE_API cc_int32 cc_get_principal ( apiCB* inContext, ccache_p* inCCache, char** outPrincipal); -cc_int32 cc_store ( +CCACHE_API cc_int32 cc_store ( apiCB* inContext, ccache_p* inCCache, cred_union inCredentials); -cc_int32 cc_remove_cred ( +CCACHE_API cc_int32 cc_remove_cred ( apiCB* inContext, ccache_p* inCCache, cred_union inCredentials); -cc_int32 cc_seq_fetch_creds_begin ( +CCACHE_API cc_int32 cc_seq_fetch_creds_begin ( apiCB* inContext, - const ccache_p* inCCache, - ccache_cit** outIterator); + const ccache_p* inCCache, + ccache_cit** outIterator); -cc_int32 cc_seq_fetch_creds_next ( +CCACHE_API cc_int32 cc_seq_fetch_creds_next ( apiCB* inContext, - cred_union** outCreds, + cred_union** outCreds, ccache_cit* inIterator); -cc_int32 cc_seq_fetch_creds_end ( +CCACHE_API cc_int32 cc_seq_fetch_creds_end ( apiCB* inContext, - ccache_cit** ioIterator); + ccache_cit** ioIterator); -cc_int32 cc_free_principal ( +CCACHE_API cc_int32 cc_free_principal ( apiCB* inContext, char** ioPrincipal); -cc_int32 cc_free_name ( +CCACHE_API cc_int32 cc_free_name ( apiCB* inContext, char** ioName); -cc_int32 cc_free_creds ( +CCACHE_API cc_int32 cc_free_creds ( apiCB* inContext, - cred_union** creds); + cred_union** creds); -cc_int32 cc_free_NC_info ( +CCACHE_API cc_int32 cc_free_NC_info ( apiCB* inContext, infoNC*** ioInfo); +CCACHE_API cc_int32 cc_lock_request( + apiCB* inContext, + const ccache_p* inCCache, + const cc_int32 lock_type); + #if TARGET_OS_MAC - #if defined(__MWERKS__) - #pragma enumsalwaysint reset - #pragma import reset - #endif - #pragma options align=reset +#pragma options align=reset #endif #ifdef __cplusplus diff --git a/src/lib/ccapi/include/cc_rpc.h b/src/lib/ccapi/include/cc_rpc.h new file mode 100644 index 0000000000..0f14724b90 --- /dev/null +++ b/src/lib/ccapi/include/cc_rpc.h @@ -0,0 +1,52 @@ +/* $Copyright:
+ *
+ * Copyright 2004-2006 by the Massachusetts Institute of Technology.
+ *
+ * All rights reserved.
+ *
+ * Export of this software from the United States of America may require a
+ * specific license from the United States Government. It is the
+ * responsibility of any person or organization contemplating export to
+ * obtain such a license before exporting.
+ *
+ * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and distribute
+ * this software and its documentation for any purpose and without fee is
+ * hereby granted, provided that the above copyright notice appear in all
+ * copies and that both that copyright notice and this permission notice
+ * appear in supporting documentation, and that the name of M.I.T. not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. Furthermore if you
+ * modify this software you must label your software as modified software
+ * and not distribute it in such a fashion that it might be confused with
+ * the original MIT software. M.I.T. makes no representations about the
+ * suitability of this software for any purpose. It is provided "as is"
+ * without express or implied warranty.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
+ * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * Individual source code files are copyright MIT, Cygnus Support,
+ * OpenVision, Oracle, Sun Soft, FundsXpress, and others.
+ *
+ * Project Athena, Athena, Athena MUSE, Discuss, Hesiod, Kerberos, Moira,
+ * and Zephyr are trademarks of the Massachusetts Institute of Technology
+ * (MIT). No commercial use of these trademarks may be made without prior
+ * written permission of MIT.
+ *
+ * "Commercial use" means use of a name in a product or other for-profit
+ * manner. It does NOT prevent a commercial firm from referring to the MIT
+ * trademarks in order to convey information (although in doing so,
+ * recognition of their trademark status should be given).
+ * $
+ */
+
+
+#ifndef __CC_RPC_H__
+#define __CC_RPC_H__
+
+#include "msg.h"
+
+cc_int32 cci_perform_rpc(cc_msg_t *request, cc_msg_t **response);
+
+#endif /* __CC_RPC_H__ */
diff --git a/src/lib/ccapi/server/datastore.h b/src/lib/ccapi/include/datastore.h index a92c60636b..7bb8b093d8 100644 --- a/src/lib/ccapi/server/datastore.h +++ b/src/lib/ccapi/include/datastore.h @@ -1,6 +1,6 @@ /* $Copyright: * - * Copyright 2004 by the Massachusetts Institute of Technology. + * Copyright 2004-2006 by the Massachusetts Institute of Technology. * * All rights reserved. * @@ -51,43 +51,7 @@ #include "CredentialsCache.h" #include "rpc_auth.h" - -enum cc_list_type { - generic = 0, - context, - cache, - credentials -}; - -struct cc_generic_list_node_t { - cc_uint8* data; - cc_uint32 len; - struct cc_generic_list_node_t* next; - struct cc_generic_list_node_t* prev; -}; -typedef struct cc_generic_list_node_t cc_generic_list_node_t; - -struct cc_generic_list_head_t { - enum cc_list_type type; - cc_generic_list_node_t* head; - cc_generic_list_node_t* tail; -}; -typedef struct cc_generic_list_head_t cc_generic_list_head_t; - - -struct cc_generic_iterate_t { - cc_generic_list_node_t* next; -}; -typedef struct cc_generic_iterate_t cc_generic_iterate_t; - -typedef cc_generic_list_head_t cc_context_list_head_t; -typedef cc_generic_list_node_t cc_context_list_node_t; - -typedef cc_generic_list_head_t cc_ccache_list_head_t; -typedef cc_generic_list_node_t cc_ccache_list_node_t; - -typedef cc_generic_list_head_t cc_credentials_list_head_t; -typedef cc_generic_list_node_t cc_credentials_list_node_t; +#include "generic_lists.h" struct cc_context_iterate_t { cc_context_list_node_t* next; @@ -104,7 +68,7 @@ struct cc_credentials_iterate_t { }; typedef struct cc_credentials_iterate_t cc_credentials_iterate_t; -struct cc_lock_t { +struct cc_lock { cc_uint32 read_locks; /* count of read locks (>= 0) */ cc_uint32 write_locks; /* count of write locks (0 or 1) */ void * platform_data; /* platform specific implementation data */ @@ -118,7 +82,7 @@ struct cc_server_context_t { cc_int32 api_version; /*Version our client passed in on init (ccapi_version_X) */ cc_auth_info_t* auth_info; /*auth info passed in from RPC*/ cc_session_info_t* session_info; /*session info passed in from RPC*/ - cc_time_t changed; /*date of last change to this context*/ + cc_time64 changed; /*date of last change to this context*/ cc_int32 error; /*last error code*/ cc_lock_t locks; /*are we locked?*/ }; @@ -129,10 +93,10 @@ struct cc_server_ccache_t { char* principal_v4; /*v4 principal associated with this cache*/ char* principal_v5; /*v5 principal associated with this cache*/ cc_uint32 versions; /*versions of creds supported (from cc_credentials enum in CredentialsCache.h)*/ - cc_time_t changed; /*date of last change to ccache*/ + cc_time64 changed; /*date of last change to ccache*/ cc_int32 kdc_set; /*is the KDC time offset initialized?*/ - cc_time_t kdc_offset; /*offset of our clock relative kdc*/ - cc_time_t last_default; /*the last date when we were default*/ + cc_time64 kdc_offset; /*offset of our clock relative kdc*/ + cc_time64 last_default; /*the last date when we were default*/ cc_int32 is_default; /*is this the default cred on this ccache?*/ cc_generic_list_head_t* active_iterators; /*iterators which clients have opened on this cache*/ cc_credentials_list_head_t* creds; /*list of creds stored in this ccache*/ @@ -150,82 +114,69 @@ typedef struct cc_server_credentials_t cc_server_credentials_t; /*Note: cci means Credential Cache Internal, to differentiate from exported API macros*/ -cc_int32 cci_generic_iterate_has_next(cc_generic_iterate_t *iterate); -cc_int32 cci_generic_iterate_next(cc_generic_iterate_t *iterate, cc_generic_list_node_t**); - -cc_int32 cci_generic_list_new(cc_generic_list_head_t **); -cc_int32 cci_generic_list_append(cc_generic_list_head_t *head, void *data, cc_uint32 len, cc_generic_list_node_t**); -cc_int32 cci_generic_list_prepend(cc_generic_list_head_t *head, void *data, cc_uint32 len, cc_generic_list_node_t**); -cc_int32 cci_generic_list_remove_element(cc_generic_list_head_t* head, cc_generic_list_node_t* rem); -cc_int32 cci_generic_free_element(cc_generic_list_node_t* node); -cc_int32 cci_generic_list_destroy(cc_generic_list_head_t* head); -cc_int32 cci_generic_list_copy(cc_generic_list_head_t* head, cc_generic_list_head_t**); -cc_int32 cci_generic_list_iterator(cc_generic_list_head_t *head, cc_generic_iterate_t**); -cc_int32 cci_generic_free_iterator(cc_generic_iterate_t* iterator); - -cc_int32 cci_context_iterate_has_next(struct cc_context_iterate_t *iterate); -cc_int32 cci_context_iterate_next(struct cc_context_iterate_t *iterate, cc_context_list_node_t**); - -cc_int32 cci_ccache_iterate_has_next(struct cc_ccache_iterate_t *iterate); -cc_int32 cci_ccache_iterate_next(struct cc_ccache_iterate_t *iterate, cc_ccache_list_node_t**); - -cc_int32 cci_credentials_iterate_has_next(cc_credentials_iterate_t *iterate); -cc_int32 cci_credentials_iterate_next(cc_credentials_iterate_t *iterate, cc_credentials_list_node_t **); - -cc_int32 cci_context_list_new(cc_context_list_head_t**); -cc_int32 cci_context_list_append(cc_context_list_head_t *head, cc_server_context_t *data, cc_context_list_node_t**); -cc_int32 cci_context_list_prepend(cc_context_list_head_t *head, cc_server_context_t *data, cc_context_list_node_t**); -cc_int32 cci_context_list_remove_element(cc_context_list_head_t* head, cc_context_list_node_t* rem); -cc_int32 cci_context_list_iterator(cc_context_list_head_t *head, struct cc_context_iterate_t**); -cc_int32 cci_context_free_iterator(struct cc_context_iterate_t *iterator); -cc_int32 cci_context_list_destroy(cc_context_list_head_t* head) ; -cc_int32 cci_context_list_copy(cc_context_list_head_t* head, cc_context_list_head_t**); - -cc_int32 cci_ccache_list_new(cc_ccache_list_head_t**); -cc_int32 cci_ccache_list_append(cc_ccache_list_head_t *head, cc_server_ccache_t *data, cc_ccache_list_node_t**); -cc_int32 cci_ccache_list_prepend(cc_ccache_list_head_t *head, cc_server_ccache_t *data, cc_ccache_list_node_t**); -cc_int32 cci_ccache_list_remove_element(cc_ccache_list_head_t* head, cc_ccache_list_node_t* rem); -cc_int32 cci_ccache_list_iterator(cc_ccache_list_head_t *head, struct cc_ccache_iterate_t**); -cc_int32 cci_ccache_free_iterator(struct cc_ccache_iterate_t *iterator); -cc_int32 cci_ccache_list_destroy(cc_ccache_list_head_t* head) ; -cc_int32 cci_ccache_list_copy(cc_ccache_list_head_t* head, cc_ccache_list_head_t**); - - -cc_int32 cci_credentials_list_new(cc_credentials_list_head_t**); -cc_int32 cci_credentials_list_append(cc_credentials_list_head_t *head, cc_server_credentials_t *data, cc_credentials_list_node_t**); -cc_int32 cci_credentials_list_prepend(cc_credentials_list_head_t *head, cc_server_credentials_t *data, cc_credentials_list_node_t**); -cc_int32 cci_credentials_list_remove_element(cc_credentials_list_head_t* head, cc_credentials_list_node_t* rem); -cc_int32 cci_credentials_list_iterator(cc_credentials_list_head_t *head, cc_credentials_iterate_t**); -cc_int32 cci_credentials_free_iterator(cc_credentials_iterate_t* iterator); -cc_int32 cci_credentials_list_destroy(cc_credentials_list_head_t* head) ; -cc_int32 cci_credentials_list_copy(cc_credentials_list_head_t* head, cc_credentials_list_head_t**) ; - - -cc_int32 cci_context_new(int api_version, cc_auth_info_t* auth_info, cc_session_info_t* session_info, cc_server_context_t** ) ; -cc_int32 cci_context_get_default_ccache_name(cc_server_context_t* ctx, char **); -cc_int32 cci_context_find_ccache(cc_server_context_t* ctx, char *name, cc_server_ccache_t**); -cc_int32 cci_context_open_ccache(cc_server_context_t* ctx, char *name, cc_server_ccache_t** ); -cc_int32 cci_context_create_ccache(cc_server_context_t* ctx, char *name, int creds_version, char *principal, cc_server_ccache_t**); -cc_int32 cci_context_create_default_ccache(cc_server_context_t* ctx, int creds_version, char *principal, cc_server_ccache_t**); -cc_int32 cci_context_ccache_iterator(cc_server_context_t* ctx, cc_ccache_iterate_t**); -cc_int32 cci_context_compare(cc_server_context_t* a, cc_server_context_t* b); -cc_int32 cci_context_destroy(cc_server_context_t* ctx); -cc_int32 cci_context_rem_ccache(cc_server_context_t* ctx, cc_server_ccache_t* ccache); - -cc_int32 cci_ccache_new(char *name, char *principal, int cred_vers, cc_server_ccache_t**); -cc_int32 cci_ccache_check_version(const cc_server_ccache_t *ccache, const cc_credentials_union* creds, cc_uint32* compat); -cc_int32 cci_ccache_check_principal(const cc_server_ccache_t *ccache, const cc_credentials_union* creds, cc_uint32* compat); -cc_int32 cci_ccache_store_creds(cc_server_ccache_t *ccache, const cc_credentials_union* credentials); -cc_int32 cci_ccache_rem_creds(cc_server_ccache_t *ccache, const cc_credentials_union* credentials); -cc_int32 cci_ccache_move(cc_server_ccache_t *source, cc_server_ccache_t* destination); -cc_int32 cci_ccache_get_kdc_time_offset(cc_server_ccache_t* ccache, cc_time_t* offset); -cc_int32 cci_ccache_set_kdc_time_offset(cc_server_ccache_t* ccache, cc_time_t offset); -cc_int32 cci_ccache_clear_kdc_time_offset(cc_server_ccache_t* ccache); -cc_int32 cci_ccache_new_iterator(cc_server_ccache_t* ccache, cc_credentials_iterate_t** iterator); -cc_int32 cci_ccache_get_principal(cc_server_ccache_t* ccache, cc_int32 version, char ** principal); -cc_int32 cci_ccache_set_principal(cc_server_ccache_t* ccache, cc_int32 version, char * principal); -cc_int32 cci_ccache_free_principal(char * principal); -cc_int32 cci_ccache_destroy(cc_server_ccache_t* ccache); -void cci_ccache_changed(cc_server_ccache_t* ccache); -cc_int32 cci_ccache_compare(cc_server_ccache_t* ccache1, cc_server_ccache_t* ccache2, cc_uint32 *result); +cc_int32 ccs_context_iterate_has_next(struct cc_context_iterate_t *iterate); +cc_int32 ccs_context_iterate_next(struct cc_context_iterate_t *iterate, cc_context_list_node_t**); + +cc_int32 ccs_ccache_iterate_has_next(struct cc_ccache_iterate_t *iterate); +cc_int32 ccs_ccache_iterate_next(struct cc_ccache_iterate_t *iterate, cc_ccache_list_node_t**); + +cc_int32 ccs_credentials_iterate_has_next(cc_credentials_iterate_t *iterate); +cc_int32 ccs_credentials_iterate_next(cc_credentials_iterate_t *iterate, cc_credentials_list_node_t **); + +cc_int32 ccs_context_list_new(cc_context_list_head_t**); +cc_int32 ccs_context_list_append(cc_context_list_head_t *head, cc_server_context_t *data, cc_context_list_node_t**); +cc_int32 ccs_context_list_prepend(cc_context_list_head_t *head, cc_server_context_t *data, cc_context_list_node_t**); +cc_int32 ccs_context_list_remove_element(cc_context_list_head_t* head, cc_context_list_node_t* rem); +cc_int32 ccs_context_list_iterator(cc_context_list_head_t *head, struct cc_context_iterate_t**); +cc_int32 ccs_context_free_iterator(struct cc_context_iterate_t *iterator); +cc_int32 ccs_context_list_destroy(cc_context_list_head_t* head) ; +cc_int32 ccs_context_list_copy(cc_context_list_head_t* head, cc_context_list_head_t**); + +cc_int32 ccs_ccache_list_new(cc_ccache_list_head_t**); +cc_int32 ccs_ccache_list_append(cc_ccache_list_head_t *head, cc_server_ccache_t *data, cc_ccache_list_node_t**); +cc_int32 ccs_ccache_list_prepend(cc_ccache_list_head_t *head, cc_server_ccache_t *data, cc_ccache_list_node_t**); +cc_int32 ccs_ccache_list_remove_element(cc_ccache_list_head_t* head, cc_ccache_list_node_t* rem); +cc_int32 ccs_ccache_list_iterator(cc_ccache_list_head_t *head, struct cc_ccache_iterate_t**); +cc_int32 ccs_ccache_free_iterator(struct cc_ccache_iterate_t *iterator); +cc_int32 ccs_ccache_list_destroy(cc_ccache_list_head_t* head) ; +cc_int32 ccs_ccache_list_copy(cc_ccache_list_head_t* head, cc_ccache_list_head_t**); + + +cc_int32 ccs_credentials_list_new(cc_credentials_list_head_t**); +cc_int32 ccs_credentials_list_append(cc_credentials_list_head_t *head, cc_server_credentials_t *data, cc_credentials_list_node_t**); +cc_int32 ccs_credentials_list_prepend(cc_credentials_list_head_t *head, cc_server_credentials_t *data, cc_credentials_list_node_t**); +cc_int32 ccs_credentials_list_remove_element(cc_credentials_list_head_t* head, cc_credentials_list_node_t* rem); +cc_int32 ccs_credentials_list_iterator(cc_credentials_list_head_t *head, cc_credentials_iterate_t**); +cc_int32 ccs_credentials_free_iterator(cc_credentials_iterate_t* iterator); +cc_int32 ccs_credentials_list_destroy(cc_credentials_list_head_t* head) ; +cc_int32 ccs_credentials_list_copy(cc_credentials_list_head_t* head, cc_credentials_list_head_t**) ; + + +cc_int32 ccs_context_new(int api_version, cc_auth_info_t* auth_info, cc_session_info_t* session_info, cc_server_context_t** ) ; +cc_int32 ccs_context_get_default_ccache_name(cc_server_context_t* ctx, char **); +cc_int32 ccs_context_find_ccache(cc_server_context_t* ctx, char *name, cc_server_ccache_t**); +cc_int32 ccs_context_open_ccache(cc_server_context_t* ctx, char *name, cc_server_ccache_t** ); +cc_int32 ccs_context_create_ccache(cc_server_context_t* ctx, char *name, int creds_version, char *principal, cc_server_ccache_t**); +cc_int32 ccs_context_create_default_ccache(cc_server_context_t* ctx, int creds_version, char *principal, cc_server_ccache_t**); +cc_int32 ccs_context_ccache_iterator(cc_server_context_t* ctx, cc_ccache_iterate_t**); +cc_int32 ccs_context_compare(cc_server_context_t* a, cc_server_context_t* b); +cc_int32 ccs_context_destroy(cc_server_context_t* ctx); +cc_int32 ccs_context_rem_ccache(cc_server_context_t* ctx, cc_server_ccache_t* ccache); + +cc_int32 ccs_ccache_new(char *name, char *principal, int cred_vers, cc_server_ccache_t**); +cc_int32 ccs_ccache_check_version(const cc_server_ccache_t *ccache, const cc_credentials_union* creds, cc_uint32* compat); +cc_int32 ccs_ccache_check_principal(const cc_server_ccache_t *ccache, const cc_credentials_union* creds, cc_uint32* compat); +cc_int32 ccs_ccache_store_creds(cc_server_ccache_t *ccache, const cc_credentials_union* credentials); +cc_int32 ccs_ccache_rem_creds(cc_server_ccache_t *ccache, const cc_credentials_union* credentials); +cc_int32 ccs_ccache_move(cc_server_ccache_t *source, cc_server_ccache_t* destination); +cc_int32 ccs_ccache_get_kdc_time_offset(cc_server_ccache_t* ccache, cc_time64* offset); +cc_int32 ccs_ccache_set_kdc_time_offset(cc_server_ccache_t* ccache, cc_time64 offset); +cc_int32 ccs_ccache_clear_kdc_time_offset(cc_server_ccache_t* ccache); +cc_int32 ccs_ccache_new_iterator(cc_server_ccache_t* ccache, cc_credentials_iterate_t** iterator); +cc_int32 ccs_ccache_get_principal(cc_server_ccache_t* ccache, cc_int32 version, char ** principal); +cc_int32 ccs_ccache_set_principal(cc_server_ccache_t* ccache, cc_int32 version, char * principal); +cc_int32 ccs_ccache_free_principal(char * principal); +cc_int32 ccs_ccache_destroy(cc_server_ccache_t* ccache); +void ccs_ccache_changed(cc_server_ccache_t* ccache); +cc_int32 ccs_ccache_compare(cc_server_ccache_t* ccache1, cc_server_ccache_t* ccache2, cc_uint32 *result); #endif /*__CCDATASTOREH__*/ diff --git a/src/lib/ccapi/include/generic_lists.h b/src/lib/ccapi/include/generic_lists.h new file mode 100644 index 0000000000..14b7ae28c3 --- /dev/null +++ b/src/lib/ccapi/include/generic_lists.h @@ -0,0 +1,102 @@ +/* $Copyright:
+ *
+ * Copyright 2004-2006 by the Massachusetts Institute of Technology.
+ *
+ * All rights reserved.
+ *
+ * Export of this software from the United States of America may require a
+ * specific license from the United States Government. It is the
+ * responsibility of any person or organization contemplating export to
+ * obtain such a license before exporting.
+ *
+ * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and distribute
+ * this software and its documentation for any purpose and without fee is
+ * hereby granted, provided that the above copyright notice appear in all
+ * copies and that both that copyright notice and this permission notice
+ * appear in supporting documentation, and that the name of M.I.T. not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. Furthermore if you
+ * modify this software you must label your software as modified software
+ * and not distribute it in such a fashion that it might be confused with
+ * the original MIT software. M.I.T. makes no representations about the
+ * suitability of this software for any purpose. It is provided "as is"
+ * without express or implied warranty.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
+ * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * Individual source code files are copyright MIT, Cygnus Support,
+ * OpenVision, Oracle, Sun Soft, FundsXpress, and others.
+ *
+ * Project Athena, Athena, Athena MUSE, Discuss, Hesiod, Kerberos, Moira,
+ * and Zephyr are trademarks of the Massachusetts Institute of Technology
+ * (MIT). No commercial use of these trademarks may be made without prior
+ * written permission of MIT.
+ *
+ * "Commercial use" means use of a name in a product or other for-profit
+ * manner. It does NOT prevent a commercial firm from referring to the MIT
+ * trademarks in order to convey information (although in doing so,
+ * recognition of their trademark status should be given).
+ * $
+ */
+/*
+ * Prototypes and data structures for datastore.
+ *
+ */
+
+
+#ifndef __CC_GENERIC_LISTS_H_
+#define __CC_GENERIC_LISTS_H_
+
+enum cc_list_type {
+ generic = 0,
+ context,
+ cache,
+ credentials
+};
+
+struct cc_generic_list_node_t {
+ cc_uint8* data;
+ cc_uint32 len;
+ struct cc_generic_list_node_t* next;
+ struct cc_generic_list_node_t* prev;
+};
+typedef struct cc_generic_list_node_t cc_generic_list_node_t;
+
+struct cc_generic_list_head_t {
+ enum cc_list_type type;
+ cc_generic_list_node_t* head;
+ cc_generic_list_node_t* tail;
+};
+typedef struct cc_generic_list_head_t cc_generic_list_head_t;
+
+
+struct cc_generic_iterate_t {
+ cc_generic_list_node_t* next;
+};
+typedef struct cc_generic_iterate_t cc_generic_iterate_t;
+
+typedef cc_generic_list_head_t cc_context_list_head_t;
+typedef cc_generic_list_node_t cc_context_list_node_t;
+
+typedef cc_generic_list_head_t cc_ccache_list_head_t;
+typedef cc_generic_list_node_t cc_ccache_list_node_t;
+
+typedef cc_generic_list_head_t cc_credentials_list_head_t;
+typedef cc_generic_list_node_t cc_credentials_list_node_t;
+
+cc_int32 cci_generic_iterate_has_next(cc_generic_iterate_t *iterate);
+cc_int32 cci_generic_iterate_next(cc_generic_iterate_t *iterate, cc_generic_list_node_t**);
+
+cc_int32 cci_generic_list_new(cc_generic_list_head_t **);
+cc_int32 cci_generic_list_append(cc_generic_list_head_t *head, void *data, cc_uint32 len, cc_generic_list_node_t**);
+cc_int32 cci_generic_list_prepend(cc_generic_list_head_t *head, void *data, cc_uint32 len, cc_generic_list_node_t**);
+cc_int32 cci_generic_list_remove_element(cc_generic_list_head_t* head, cc_generic_list_node_t* rem);
+cc_int32 cci_generic_free_element(cc_generic_list_node_t* node);
+cc_int32 cci_generic_list_destroy(cc_generic_list_head_t* head);
+cc_int32 cci_generic_list_copy(cc_generic_list_head_t* head, cc_generic_list_head_t**);
+cc_int32 cci_generic_list_iterator(cc_generic_list_head_t *head, cc_generic_iterate_t**);
+cc_int32 cci_generic_free_iterator(cc_generic_iterate_t* iterator);
+
+#endif /* __CC_GENERIC_LISTS_H_ */
diff --git a/src/lib/ccapi/include/marshall.h b/src/lib/ccapi/include/marshall.h index 19b9463b08..ca6b12e968 100644 --- a/src/lib/ccapi/include/marshall.h +++ b/src/lib/ccapi/include/marshall.h @@ -1,6 +1,6 @@ /* $Copyright: * - * Copyright 2004 by the Massachusetts Institute of Technology. + * Copyright 2004-2006 by the Massachusetts Institute of Technology. * * All rights reserved. * @@ -41,7 +41,6 @@ * $ */ -#define FLAT_CREDS_V5_VERSION 1 struct cc_flat_data { cc_uint32 type; cc_uint32 length; @@ -49,15 +48,16 @@ struct cc_flat_data { }; typedef struct cc_flat_data cc_flat_data; +#define FLAT_CREDS_V5_VERSION 1 struct cci_flat_creds_v5 { cc_uint32 version; /* version of this structure */ cc_flat_data client; cc_flat_data server; cc_flat_data keyblock; - cc_time_t authtime; - cc_time_t starttime; - cc_time_t endtime; - cc_time_t renew_till; + cc_time64 authtime; + cc_time64 starttime; + cc_time64 endtime; + cc_time64 renew_till; cc_uint32 is_skey; cc_uint32 ticket_flags; cc_uint32 address_count; @@ -67,6 +67,25 @@ struct cci_flat_creds_v5 { cc_uint32 authdata_count; cc_uint32 authdata; /* offset to array */ }; +typedef struct cci_flat_creds_v5 cci_flat_creds_v5_t; + +struct cci_flat_creds_v4 { + cc_uint32 version; + char principal [cc_v4_name_size]; + char principal_instance [cc_v4_instance_size]; + char service [cc_v4_name_size]; + char service_instance [cc_v4_instance_size]; + char realm [cc_v4_realm_size]; + unsigned char session_key [cc_v4_key_size]; + cc_int32 kvno; + cc_int32 string_to_key_type; + cc_time64 issue_date; + cc_int32 lifetime; + cc_uint32 address; + cc_int32 ticket_size; + unsigned char ticket [cc_v4_ticket_size]; +}; +typedef struct cci_flat_creds_v4 cci_flat_creds_v4_t; cc_int32 cci_creds_v4_marshall( cc_credentials_v4_t * creds, diff --git a/src/lib/ccapi/include/msg.h b/src/lib/ccapi/include/msg.h index 0d712d6664..79b9a7f72e 100644 --- a/src/lib/ccapi/include/msg.h +++ b/src/lib/ccapi/include/msg.h @@ -1,6 +1,6 @@ /* $Copyright: * - * Copyright 2004 by the Massachusetts Institute of Technology. + * Copyright 2004-2006 by the Massachusetts Institute of Technology. * * All rights reserved. * @@ -43,7 +43,7 @@ /* * Verifiable, extensible message format. - * + * * Format: * <size of header block (header_len)> * <size of *entire* message, including previous field (flat_len)> @@ -60,13 +60,13 @@ * If the header has variable length data it is included in the data blobs. * The header field has the offset from the beginning of the message of the 1st * byte of the data and the length of the data. - * */ #ifndef __CC_MSG_H__ #define __CC_MSG_H__ #include "CredentialsCache.h" +#include "generic_lists.h" struct cc_msg_t { cc_uint32 type; /*type of message*/ @@ -87,16 +87,15 @@ enum { ccmsg_CTX_RELEASE, ccmsg_CTX_GET_CHANGE_TIME, ccmsg_CTX_GET_DEFAULT_CCACHE_NAME, - ccmsg_CTX_COMPARE, + ccmsg_CTX_CCACHE_OPEN, + ccmsg_CTX_CCACHE_OPEN_DEFAULT, + ccmsg_CTX_CCACHE_CREATE, + ccmsg_CTX_CCACHE_CREATE_DEFAULT, + ccmsg_CTX_CCACHE_CREATE_UNIQUE, ccmsg_CTX_NEW_CCACHE_ITERATOR, ccmsg_CTX_LOCK, ccmsg_CTX_UNLOCK, - ccmsg_CTX_CLONE, - ccmsg_CCACHE_OPEN, - ccmsg_CCACHE_OPEN_DEFAULT, - ccmsg_CCACHE_CREATE, - ccmsg_CCACHE_CREATE_DEFAULT, - ccmsg_CCACHE_CREATE_UNIQUE, + ccmsg_CTX_COMPARE, ccmsg_CCACHE_RELEASE, ccmsg_CCACHE_DESTROY, ccmsg_CCACHE_SET_DEFAULT, @@ -104,29 +103,28 @@ enum { ccmsg_CCACHE_GET_NAME, ccmsg_CCACHE_GET_PRINCIPAL, ccmsg_CCACHE_SET_PRINCIPAL, - ccmsg_CCACHE_CREDS_ITERATOR, + ccmsg_CCACHE_NEW_CREDS_ITERATOR, ccmsg_CCACHE_STORE_CREDS, ccmsg_CCACHE_REM_CREDS, + ccmsg_CCACHE_MOVE, + ccmsg_CCACHE_LOCK, + ccmsg_CCACHE_UNLOCK, ccmsg_CCACHE_GET_LAST_DEFAULT_TIME, ccmsg_CCACHE_GET_CHANGE_TIME, - ccmsg_CCACHE_MOVE, ccmsg_CCACHE_COMPARE, ccmsg_CCACHE_GET_KDC_TIME_OFFSET, ccmsg_CCACHE_SET_KDC_TIME_OFFSET, ccmsg_CCACHE_CLEAR_KDC_TIME_OFFSET, ccmsg_CCACHE_ITERATOR_RELEASE, ccmsg_CCACHE_ITERATOR_NEXT, - ccmsg_CCACHE_LOCK, - ccmsg_CCACHE_UNLOCK, + ccmsg_CCACHE_ITERATOR_CLONE, ccmsg_CREDS_ITERATOR_RELEASE, ccmsg_CREDS_ITERATOR_NEXT, - ccmsg_CREDS_RELEASE, - ccmsg_CREDS_V4, - ccmsg_CREDS_V5 + ccmsg_CREDS_ITERATOR_CLONE }; #define CC_MSG_MAX_SIZE 1073741824 /*2^30*/ -#define CC_MSG_MAX_TYPE ccmsg_CREDS_V5 +#define CC_MSG_MAX_TYPE ccmsg_CREDS_ITERATOR_CLONE #define BLOB_LEN (sizeof(cc_uint32)) #define MAGIC_DATA_LEN (sizeof(cc_uint32)) #define MAGIC_HEAD_LEN (sizeof(cc_uint32)) @@ -141,6 +139,23 @@ cc_int32 cci_msg_flatten(cc_msg_t* msg, void **); cc_int32 cci_msg_calc_magic(void *flat, int flat_len, cc_uint32 * sizep); cc_int32 cci_msg_verify(void* flat, int flat_len, cc_uint32 * sizep); cc_int32 cci_msg_unflatten(void *flat, int flat_len, cc_msg_t** msgpp); -cc_int32 cci_msg_retrieve_blob(cc_msg_t* msg, cc_uint32 blob_offset, cc_uint32 blob_len, void **); +cc_int32 cci_msg_retrieve_blob(cc_msg_t* msg, cc_uint32 blob_offset, cc_uint32 blob_len, char **); cc_int32 cci_msg_destroy(cc_msg_t* msg); + +/* Add missing byte swapping macros for 64-bit values */ +#ifdef MAC +#define htonll(x) OSSwapHostToBigInt64(x) +#define ntohll(x) OSSwapBigToHostInt64(x) +#else +#ifdef _WIN32 +#ifdef _M_IX86 +#define htonll(x) _byteswap_uint64(x) +#define ntohll(x) _byteswap_uint64(x) +#else +#define htonll(x) (x) +#define ntohll(x) (x) +#endif +#endif +#endif + #endif /*__CC_MSG_H__*/ diff --git a/src/lib/ccapi/include/msg_headers.h b/src/lib/ccapi/include/msg_headers.h index a27c2d2f12..b5a9acd6d5 100644 --- a/src/lib/ccapi/include/msg_headers.h +++ b/src/lib/ccapi/include/msg_headers.h @@ -1,6 +1,6 @@ /* $Copyright: * - * Copyright 2004 by the Massachusetts Institute of Technology. + * Copyright 2004-2006 by the Massachusetts Institute of Technology. * * All rights reserved. * @@ -57,6 +57,8 @@ * size divisible by 4. This is to ensure correct alignment * and stop different compilers from inserting padding bytes in * different places. + * + * All values are stored in network byte order. */ struct ccmsg_ctx_only_t { @@ -81,18 +83,18 @@ struct ccmsg_init_resp_t { typedef struct ccmsg_init_t ccmsg_init_t; typedef struct ccmsg_init_resp_t ccmsg_init_resp_t; -struct ccmsg_clone_t { +struct ccmsg_ctx_clone_t { cc_handle ctx; cc_uint32 in_version; /*client API version*/ }; -struct ccmsg_clone_resp_t { +struct ccmsg_ctx_clone_resp_t { cc_handle out_ctx; /*handle on this ctx*/ cc_uint32 out_version; /*server API version*/ cc_uint32 vendor_offset; /*offset of vendor blob*/ cc_uint32 vendor_length; /*length of vendor blob*/ }; -typedef struct ccmsg_clone_t ccmsg_clone_t; -typedef struct ccmsg_clone_resp_t ccmsg_clone_resp_t; +typedef struct ccmsg_ctx_clone_t ccmsg_ctx_clone_t; +typedef struct ccmsg_ctx_clone_resp_t ccmsg_ctx_clone_resp_t; struct ccmsg_ctx_release_t { cc_handle ctx; /*# of ctx to release*/ @@ -103,7 +105,7 @@ struct ccmsg_ctx_get_change_time_t { cc_handle ctx; }; struct ccmsg_ctx_get_change_time_resp_t { - cc_time_t time; + cc_time64 time; }; typedef struct ccmsg_ctx_get_change_time_t ccmsg_ctx_get_change_time_t; typedef struct ccmsg_ctx_get_change_time_resp_t ccmsg_ctx_get_change_time_resp_t; @@ -304,7 +306,7 @@ struct ccmsg_ccache_get_last_default_time_t { cc_handle ccache; }; struct ccmsg_ccache_get_last_default_time_resp_t { - cc_time_t last_default_time; + cc_time64 last_default_time; }; typedef struct ccmsg_ccache_get_last_default_time_t ccmsg_ccache_get_last_default_time_t; typedef struct ccmsg_ccache_get_last_default_time_resp_t ccmsg_ccache_get_last_default_time_resp_t; @@ -314,7 +316,7 @@ struct ccmsg_ccache_get_change_time_t { cc_handle ccache; }; struct ccmsg_ccache_get_change_time_resp_t { - cc_time_t time; + cc_time64 time; }; typedef struct ccmsg_ccache_get_change_time_t ccmsg_ccache_get_change_time_t; typedef struct ccmsg_ccache_get_change_time_resp_t ccmsg_ccache_get_change_time_resp_t; @@ -336,7 +338,7 @@ struct ccmsg_ccache_get_kdc_time_offset_t { cc_int32 creds_version; }; struct ccmsg_ccache_get_kdc_time_offset_resp_t { - cc_time_t offset; + cc_time64 offset; }; typedef struct ccmsg_ccache_get_kdc_time_offset_t ccmsg_ccache_get_kdc_time_offset_t; typedef struct ccmsg_ccache_get_kdc_time_offset_resp_t ccmsg_ccache_get_kdc_time_offset_resp_t; @@ -344,7 +346,7 @@ typedef struct ccmsg_ccache_get_kdc_time_offset_resp_t ccmsg_ccache_get_kdc_time struct ccmsg_ccache_set_kdc_time_offset_t { cc_handle ctx; cc_handle ccache; - cc_time_t offset; + cc_time64 offset; cc_int32 creds_version; }; typedef struct ccmsg_ccache_set_kdc_time_offset_t ccmsg_ccache_set_kdc_time_offset_t; @@ -372,6 +374,16 @@ struct ccmsg_ccache_iterator_next_resp_t { typedef struct ccmsg_ccache_iterator_next_t ccmsg_ccache_iterator_next_t; typedef struct ccmsg_ccache_iterator_next_resp_t ccmsg_ccache_iterator_next_resp_t; +struct ccmsg_ccache_iterator_clone_t { + cc_handle ctx; + cc_handle iterator; +}; +struct ccmsg_ccache_iterator_clone_resp_t { + cc_handle iterator; +}; +typedef struct ccmsg_ccache_iterator_clone_t ccmsg_ccache_iterator_clone_t; +typedef struct ccmsg_ccache_iterator_clone_resp_t ccmsg_ccache_iterator_clone_resp_t; + struct ccmsg_creds_iterator_release_t { cc_handle ctx; cc_handle ccache; @@ -393,37 +405,14 @@ struct ccmsg_creds_iterator_next_resp_t { typedef struct ccmsg_creds_iterator_next_t ccmsg_creds_iterator_next_t; typedef struct ccmsg_creds_iterator_next_resp_t ccmsg_creds_iterator_next_resp_t; -struct ccmsg_creds_v4_t { - cc_uint32 offset; - cc_uint32 len; -}; -typedef struct ccmsg_creds_v4_t ccmsg_creds_v4_t; - -struct ccmsg_creds_v5_t { - cc_uint32 client_offset; - cc_uint32 client_len; - cc_uint32 server_offset; - cc_uint32 server_len; - cc_uint32 keyblock_offset; - cc_uint32 keyblock_len; - cc_time_t authtime; - cc_time_t starttime; - cc_time_t endtime; - cc_time_t renewtime; - cc_uint32 is_skey; - cc_uint32 ticket_flags; - cc_uint32 address_count; - cc_uint32 address_offset; - cc_uint32 address_len; - cc_uint32 ticket_offset; - cc_uint32 ticket_len; - cc_uint32 ticket2_offset; - cc_uint32 ticket2_len; - cc_uint32 authdata_count; - cc_uint32 authdata_offset; - cc_uint32 authdata_len; -}; -typedef struct ccmsg_creds_v5_t ccmsg_creds_v5_t; - +struct ccmsg_creds_iterator_clone_t { + cc_handle ctx; + cc_handle iterator; +}; +struct ccmsg_creds_iterator_clone_resp_t { + cc_handle iterator; +}; +typedef struct ccmsg_creds_iterator_clone_t ccmsg_creds_iterator_clone_t; +typedef struct ccmsg_creds_iterator_clone_resp_t ccmsg_creds_iterator_clone_resp_t; #endif /*__MSG_HEADERS_H__*/ diff --git a/src/lib/ccapi/server/rpc_auth.h b/src/lib/ccapi/include/rpc_auth.h index 21d7db501c..010a1e2a51 100644 --- a/src/lib/ccapi/server/rpc_auth.h +++ b/src/lib/ccapi/include/rpc_auth.h @@ -1,6 +1,6 @@ /* $Copyright: * - * Copyright 2004 by the Massachusetts Institute of Technology. + * Copyright 2004-2006 by the Massachusetts Institute of Technology. * * All rights reserved. * @@ -66,6 +66,6 @@ struct cc_session_info_t { }; typedef struct cc_session_info_t cc_session_info_t; -cc_int32 cci_rpc_is_authorized(cc_auth_info_t* msg_auth, cc_session_info_t* msg_session, cc_auth_info_t* stored_auth, cc_session_info_t* stored_session, cc_uint32 *authorizedp); +cc_int32 ccs_rpc_is_authorized(cc_auth_info_t* msg_auth, cc_session_info_t* msg_session, cc_auth_info_t* stored_auth, cc_session_info_t* stored_session, cc_uint32 *authorizedp); #endif /*__RPC_AUTH_H__*/ diff --git a/src/lib/ccapi/mac/CCAPI.xcodeproj/lxs.pbxuser b/src/lib/ccapi/mac/CCAPI.xcodeproj/lxs.pbxuser new file mode 100644 index 0000000000..ea15e540b0 --- /dev/null +++ b/src/lib/ccapi/mac/CCAPI.xcodeproj/lxs.pbxuser @@ -0,0 +1,2005 @@ +// !$*UTF8*$! +{ + 08FB7793FE84155DC02AAC07 /* Project object */ = { + activeBuildConfigurationName = Debug; + activeExecutable = A1E70D5E0A38B796007BE3E3 /* CCacheServer */; + activeTarget = A1E70D5C0A38B796007BE3E3 /* CCacheServer */; + addToTargets = ( + ); + breakpoints = ( + ); + breakpointsGroup = A1E70D500A38B5F3007BE3E3 /* XCBreakpointsBucket */; + codeSenseManager = A1E70CFE0A38B536007BE3E3 /* Code sense */; + executables = ( + A1E70D5E0A38B796007BE3E3 /* CCacheServer */, + ); + perUserDictionary = { + PBXConfiguration.PBXFileTableDataSource3.PBXFileTableDataSource = { + PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; + PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID; + PBXFileTableDataSourceColumnWidthsKey = ( + 20, + 811, + 20, + 48, + 43, + 43, + 20, + ); + PBXFileTableDataSourceColumnsKey = ( + PBXFileDataSource_FiletypeID, + PBXFileDataSource_Filename_ColumnID, + PBXFileDataSource_Built_ColumnID, + PBXFileDataSource_ObjectSize_ColumnID, + PBXFileDataSource_Errors_ColumnID, + PBXFileDataSource_Warnings_ColumnID, + PBXFileDataSource_Target_ColumnID, + ); + }; + PBXConfiguration.PBXTargetDataSource.PBXTargetDataSource = { + PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; + PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID; + PBXFileTableDataSourceColumnWidthsKey = ( + 20, + 200, + 608, + 20, + 48, + 43, + 43, + ); + PBXFileTableDataSourceColumnsKey = ( + PBXFileDataSource_FiletypeID, + PBXFileDataSource_Filename_ColumnID, + PBXTargetDataSource_PrimaryAttribute, + PBXFileDataSource_Built_ColumnID, + PBXFileDataSource_ObjectSize_ColumnID, + PBXFileDataSource_Errors_ColumnID, + PBXFileDataSource_Warnings_ColumnID, + ); + }; + PBXPerProjectTemplateStateSaveDate = 171582174; + PBXWorkspaceStateSaveDate = 171582174; + }; + perUserProjectItems = { + A1E70DF70A38C765007BE3E3 /* PBXTextBookmark */ = A1E70DF70A38C765007BE3E3 /* PBXTextBookmark */; + A1E70DF80A38C765007BE3E3 /* PBXTextBookmark */ = A1E70DF80A38C765007BE3E3 /* PBXTextBookmark */; + A1E70DF90A38C765007BE3E3 /* PBXTextBookmark */ = A1E70DF90A38C765007BE3E3 /* PBXTextBookmark */; + A1E70DFA0A38C765007BE3E3 /* PBXTextBookmark */ = A1E70DFA0A38C765007BE3E3 /* PBXTextBookmark */; + A1E70DFB0A38C765007BE3E3 /* PBXTextBookmark */ = A1E70DFB0A38C765007BE3E3 /* PBXTextBookmark */; + A1E70DFD0A38C765007BE3E3 /* PBXTextBookmark */ = A1E70DFD0A38C765007BE3E3 /* PBXTextBookmark */; + A1E70E010A38C765007BE3E3 /* PBXTextBookmark */ = A1E70E010A38C765007BE3E3 /* PBXTextBookmark */; + A1E70E020A38C765007BE3E3 /* PBXTextBookmark */ = A1E70E020A38C765007BE3E3 /* PBXTextBookmark */; + A1E70E060A38C765007BE3E3 /* PBXTextBookmark */ = A1E70E060A38C765007BE3E3 /* PBXTextBookmark */; + A1E70E090A38C765007BE3E3 /* PBXTextBookmark */ = A1E70E090A38C765007BE3E3 /* PBXTextBookmark */; + A1E70E0A0A38C765007BE3E3 /* PBXTextBookmark */ = A1E70E0A0A38C765007BE3E3 /* PBXTextBookmark */; + A1E70E0B0A38C765007BE3E3 /* PBXTextBookmark */ = A1E70E0B0A38C765007BE3E3 /* PBXTextBookmark */; + A1E70E0C0A38C765007BE3E3 /* PBXTextBookmark */ = A1E70E0C0A38C765007BE3E3 /* PBXTextBookmark */; + A1E70E100A38C765007BE3E3 /* PBXTextBookmark */ = A1E70E100A38C765007BE3E3 /* PBXTextBookmark */; + A1E70E110A38C765007BE3E3 /* PBXTextBookmark */ = A1E70E110A38C765007BE3E3 /* PBXTextBookmark */; + A1E70E120A38C765007BE3E3 /* PBXTextBookmark */ = A1E70E120A38C765007BE3E3 /* PBXTextBookmark */; + A1E70E130A38C765007BE3E3 /* PBXTextBookmark */ = A1E70E130A38C765007BE3E3 /* PBXTextBookmark */; + A1E70E140A38C765007BE3E3 /* PBXTextBookmark */ = A1E70E140A38C765007BE3E3 /* PBXTextBookmark */; + A1E70E150A38C765007BE3E3 /* PBXTextBookmark */ = A1E70E150A38C765007BE3E3 /* PBXTextBookmark */; + A1E70E160A38C765007BE3E3 /* PBXTextBookmark */ = A1E70E160A38C765007BE3E3 /* PBXTextBookmark */; + A1E70E170A38C765007BE3E3 /* PBXTextBookmark */ = A1E70E170A38C765007BE3E3 /* PBXTextBookmark */; + A1E70E180A38C765007BE3E3 /* PBXTextBookmark */ = A1E70E180A38C765007BE3E3 /* PBXTextBookmark */; + A1E70E1B0A38C765007BE3E3 /* PBXTextBookmark */ = A1E70E1B0A38C765007BE3E3 /* PBXTextBookmark */; + A1E70E1E0A38C765007BE3E3 /* PBXTextBookmark */ = A1E70E1E0A38C765007BE3E3 /* PBXTextBookmark */; + A1E70E1F0A38C765007BE3E3 /* PBXTextBookmark */ = A1E70E1F0A38C765007BE3E3 /* PBXTextBookmark */; + A1E70E200A38C765007BE3E3 /* PBXTextBookmark */ = A1E70E200A38C765007BE3E3 /* PBXTextBookmark */; + A1E70E250A38C765007BE3E3 /* PBXTextBookmark */ = A1E70E250A38C765007BE3E3 /* PBXTextBookmark */; + A1E70E260A38C765007BE3E3 /* PBXTextBookmark */ = A1E70E260A38C765007BE3E3 /* PBXTextBookmark */; + A1E70E290A38C765007BE3E3 /* PBXTextBookmark */ = A1E70E290A38C765007BE3E3 /* PBXTextBookmark */; + A1E70E2A0A38C765007BE3E3 /* PBXTextBookmark */ = A1E70E2A0A38C765007BE3E3 /* PBXTextBookmark */; + A1E70E2B0A38C765007BE3E3 /* PBXTextBookmark */ = A1E70E2B0A38C765007BE3E3 /* PBXTextBookmark */; + A1E70E2D0A38C765007BE3E3 /* PBXTextBookmark */ = A1E70E2D0A38C765007BE3E3 /* PBXTextBookmark */; + A1E70E2E0A38C765007BE3E3 /* PBXTextBookmark */ = A1E70E2E0A38C765007BE3E3 /* PBXTextBookmark */; + A1E70E380A38C778007BE3E3 /* PBXTextBookmark */ = A1E70E380A38C778007BE3E3 /* PBXTextBookmark */; + A1E70E3D0A38C78C007BE3E3 /* PBXTextBookmark */ = A1E70E3D0A38C78C007BE3E3 /* PBXTextBookmark */; + A1E70E410A38C78C007BE3E3 /* PBXTextBookmark */ = A1E70E410A38C78C007BE3E3 /* PBXTextBookmark */; + A1E70E430A38C791007BE3E3 /* PBXTextBookmark */ = A1E70E430A38C791007BE3E3 /* PBXTextBookmark */; + A1E70E450A38C791007BE3E3 /* PBXTextBookmark */ = A1E70E450A38C791007BE3E3 /* PBXTextBookmark */; + A1E70E4A0A38C7BE007BE3E3 /* PBXTextBookmark */ = A1E70E4A0A38C7BE007BE3E3 /* PBXTextBookmark */; + A1E70E520A38C9FD007BE3E3 /* PBXTextBookmark */ = A1E70E520A38C9FD007BE3E3 /* PBXTextBookmark */; + A1E70E530A38C9FD007BE3E3 /* PBXTextBookmark */ = A1E70E530A38C9FD007BE3E3 /* PBXTextBookmark */; + A1E70E560A38C9FD007BE3E3 /* PBXTextBookmark */ = A1E70E560A38C9FD007BE3E3 /* PBXTextBookmark */; + A1E70E580A38C9FD007BE3E3 /* PBXTextBookmark */ = A1E70E580A38C9FD007BE3E3 /* PBXTextBookmark */; + A1E70E6F0A38CA08007BE3E3 /* PBXTextBookmark */ = A1E70E6F0A38CA08007BE3E3 /* PBXTextBookmark */; + A1E70E770A38CA55007BE3E3 /* PBXTextBookmark */ = A1E70E770A38CA55007BE3E3 /* PBXTextBookmark */; + A1E70E7D0A38CA55007BE3E3 /* PBXTextBookmark */ = A1E70E7D0A38CA55007BE3E3 /* PBXTextBookmark */; + A1E70E9C0A38CAF1007BE3E3 /* PBXTextBookmark */ = A1E70E9C0A38CAF1007BE3E3 /* PBXTextBookmark */; + A1E70EA80A38CB24007BE3E3 /* PBXTextBookmark */ = A1E70EA80A38CB24007BE3E3 /* PBXTextBookmark */; + A1E70EAB0A38CB24007BE3E3 /* PBXTextBookmark */ = A1E70EAB0A38CB24007BE3E3 /* PBXTextBookmark */; + A1E70EB50A38CB4D007BE3E3 /* PBXTextBookmark */ = A1E70EB50A38CB4D007BE3E3 /* PBXTextBookmark */; + A1E70EC30A38CC14007BE3E3 /* PBXTextBookmark */ = A1E70EC30A38CC14007BE3E3 /* PBXTextBookmark */; + A1E70ECB0A38CC4C007BE3E3 /* PBXTextBookmark */ = A1E70ECB0A38CC4C007BE3E3 /* PBXTextBookmark */; + A1E70ED70A38CCB6007BE3E3 /* PBXTextBookmark */ = A1E70ED70A38CCB6007BE3E3 /* PBXTextBookmark */; + A1E70EE20A38CCD6007BE3E3 /* PBXTextBookmark */ = A1E70EE20A38CCD6007BE3E3 /* PBXTextBookmark */; + A1E70EFE0A38CD66007BE3E3 /* PBXTextBookmark */ = A1E70EFE0A38CD66007BE3E3 /* PBXTextBookmark */; + A1E70F0F0A38CE21007BE3E3 /* PBXTextBookmark */ = A1E70F0F0A38CE21007BE3E3 /* PBXTextBookmark */; + A1E70F440A38D252007BE3E3 /* PBXTextBookmark */ = A1E70F440A38D252007BE3E3 /* PBXTextBookmark */; + A1E70F450A38D252007BE3E3 /* PBXTextBookmark */ = A1E70F450A38D252007BE3E3 /* PBXTextBookmark */; + A1E70F8B0A38D3B4007BE3E3 /* PBXTextBookmark */ = A1E70F8B0A38D3B4007BE3E3 /* PBXTextBookmark */; + A1E70F9C0A38D41E007BE3E3 /* PBXTextBookmark */ = A1E70F9C0A38D41E007BE3E3 /* PBXTextBookmark */; + A1E70F9D0A38D41E007BE3E3 /* PBXTextBookmark */ = A1E70F9D0A38D41E007BE3E3 /* PBXTextBookmark */; + A1E70FC60A38D560007BE3E3 /* PBXTextBookmark */ = A1E70FC60A38D560007BE3E3 /* PBXTextBookmark */; + A1E70FC80A38D560007BE3E3 /* PBXTextBookmark */ = A1E70FC80A38D560007BE3E3 /* PBXTextBookmark */; + A1E70FC90A38D560007BE3E3 /* PBXTextBookmark */ = A1E70FC90A38D560007BE3E3 /* PBXTextBookmark */; + A1E70FCA0A38D560007BE3E3 /* PBXTextBookmark */ = A1E70FCA0A38D560007BE3E3 /* PBXTextBookmark */; + A1E70FCD0A38D560007BE3E3 /* PBXTextBookmark */ = A1E70FCD0A38D560007BE3E3 /* PBXTextBookmark */; + A1E70FD80A38D573007BE3E3 /* PBXTextBookmark */ = A1E70FD80A38D573007BE3E3 /* PBXTextBookmark */; + A1E70FEE0A38D7C0007BE3E3 /* PBXTextBookmark */ = A1E70FEE0A38D7C0007BE3E3 /* PBXTextBookmark */; + A1E70FEF0A38D7C0007BE3E3 /* PBXTextBookmark */ = A1E70FEF0A38D7C0007BE3E3 /* PBXTextBookmark */; + A1E70FF00A38D7C0007BE3E3 /* PBXTextBookmark */ = A1E70FF00A38D7C0007BE3E3 /* PBXTextBookmark */; + A1E70FFA0A38D806007BE3E3 /* PBXTextBookmark */ = A1E70FFA0A38D806007BE3E3 /* PBXTextBookmark */; + A1E70FFC0A38D806007BE3E3 /* PBXTextBookmark */ = A1E70FFC0A38D806007BE3E3 /* PBXTextBookmark */; + A1E70FFF0A38D806007BE3E3 /* PBXTextBookmark */ = A1E70FFF0A38D806007BE3E3 /* PBXTextBookmark */; + A1E710010A38D814007BE3E3 /* PBXTextBookmark */ = A1E710010A38D814007BE3E3 /* PBXTextBookmark */; + A1E7100A0A38D888007BE3E3 /* PBXTextBookmark */ = A1E7100A0A38D888007BE3E3 /* PBXTextBookmark */; + A1E7100C0A38D888007BE3E3 /* PBXTextBookmark */ = A1E7100C0A38D888007BE3E3 /* PBXTextBookmark */; + A1E7100D0A38D888007BE3E3 /* PBXTextBookmark */ = A1E7100D0A38D888007BE3E3 /* PBXTextBookmark */; + A1E710110A38D888007BE3E3 /* PBXTextBookmark */ = A1E710110A38D888007BE3E3 /* PBXTextBookmark */; + A1E710140A38D888007BE3E3 /* PBXTextBookmark */ = A1E710140A38D888007BE3E3 /* PBXTextBookmark */; + A1E7103C0A38DE0B007BE3E3 /* PBXTextBookmark */ = A1E7103C0A38DE0B007BE3E3 /* PBXTextBookmark */; + A1E710400A38DE0B007BE3E3 /* PBXTextBookmark */ = A1E710400A38DE0B007BE3E3 /* PBXTextBookmark */; + A1E710530A39EC0B007BE3E3 /* PBXTextBookmark */ = A1E710530A39EC0B007BE3E3 /* PBXTextBookmark */; + A1E7105A0A39ED89007BE3E3 /* PBXTextBookmark */ = A1E7105A0A39ED89007BE3E3 /* PBXTextBookmark */; + A1E7105D0A39ED89007BE3E3 /* PBXTextBookmark */ = A1E7105D0A39ED89007BE3E3 /* PBXTextBookmark */; + A1E7105E0A39ED89007BE3E3 /* PBXTextBookmark */ = A1E7105E0A39ED89007BE3E3 /* PBXTextBookmark */; + A1E710680A39F102007BE3E3 /* PBXTextBookmark */ = A1E710680A39F102007BE3E3 /* PBXTextBookmark */; + A1E710840A3A1CFB007BE3E3 /* PBXTextBookmark */ = A1E710840A3A1CFB007BE3E3 /* PBXTextBookmark */; + A1E710860A3A1CFB007BE3E3 /* PBXTextBookmark */ = A1E710860A3A1CFB007BE3E3 /* PBXTextBookmark */; + A1E710870A3A1CFB007BE3E3 /* PBXTextBookmark */ = A1E710870A3A1CFB007BE3E3 /* PBXTextBookmark */; + A1E710890A3A1D04007BE3E3 /* PBXTextBookmark */ = A1E710890A3A1D04007BE3E3 /* PBXTextBookmark */; + A1E7108B0A3A1D04007BE3E3 /* PBXTextBookmark */ = A1E7108B0A3A1D04007BE3E3 /* PBXTextBookmark */; + A1E7108D0A3A1D06007BE3E3 /* PBXTextBookmark */ = A1E7108D0A3A1D06007BE3E3 /* PBXTextBookmark */; + A1E710930A3A1D22007BE3E3 /* PBXTextBookmark */ = A1E710930A3A1D22007BE3E3 /* PBXTextBookmark */; + A1E710940A3A1D22007BE3E3 /* PBXTextBookmark */ = A1E710940A3A1D22007BE3E3 /* PBXTextBookmark */; + A1E710950A3A1D22007BE3E3 /* PBXTextBookmark */ = A1E710950A3A1D22007BE3E3 /* PBXTextBookmark */; + A1E710960A3A1D22007BE3E3 /* PBXTextBookmark */ = A1E710960A3A1D22007BE3E3 /* PBXTextBookmark */; + A1E710970A3A1D22007BE3E3 /* PBXTextBookmark */ = A1E710970A3A1D22007BE3E3 /* PBXTextBookmark */; + A1E7109C0A3A1D2B007BE3E3 /* PBXTextBookmark */ = A1E7109C0A3A1D2B007BE3E3 /* PBXTextBookmark */; + A1E7109D0A3A1D2B007BE3E3 /* PBXTextBookmark */ = A1E7109D0A3A1D2B007BE3E3 /* PBXTextBookmark */; + A1E7109F0A3A1DD0007BE3E3 /* PBXTextBookmark */ = A1E7109F0A3A1DD0007BE3E3 /* PBXTextBookmark */; + A1E710A00A3A1DD0007BE3E3 /* PBXTextBookmark */ = A1E710A00A3A1DD0007BE3E3 /* PBXTextBookmark */; + A1E710A50A3A22E1007BE3E3 /* PBXTextBookmark */ = A1E710A50A3A22E1007BE3E3 /* PBXTextBookmark */; + A1E710AB0A3A22F5007BE3E3 /* PBXTextBookmark */ = A1E710AB0A3A22F5007BE3E3 /* PBXTextBookmark */; + A1E710AC0A3A22F5007BE3E3 /* PBXTextBookmark */ = A1E710AC0A3A22F5007BE3E3 /* PBXTextBookmark */; + A1E710AD0A3A22F5007BE3E3 /* PBXTextBookmark */ = A1E710AD0A3A22F5007BE3E3 /* PBXTextBookmark */; + A1E710AF0A3A22FE007BE3E3 /* PBXTextBookmark */ = A1E710AF0A3A22FE007BE3E3 /* PBXTextBookmark */; + A1E710B30A3A22FF007BE3E3 /* PBXTextBookmark */ = A1E710B30A3A22FF007BE3E3 /* PBXTextBookmark */; + A1E710B90A3A23FB007BE3E3 /* PBXTextBookmark */ = A1E710B90A3A23FB007BE3E3 /* PBXTextBookmark */; + A1E710BC0A3A2415007BE3E3 /* PBXTextBookmark */ = A1E710BC0A3A2415007BE3E3 /* PBXTextBookmark */; + A1E710BD0A3A2415007BE3E3 /* PBXTextBookmark */ = A1E710BD0A3A2415007BE3E3 /* PBXTextBookmark */; + A1E710BE0A3A2415007BE3E3 /* PBXTextBookmark */ = A1E710BE0A3A2415007BE3E3 /* PBXTextBookmark */; + A1E710BF0A3A2415007BE3E3 /* PBXTextBookmark */ = A1E710BF0A3A2415007BE3E3 /* PBXTextBookmark */; + A1E710C00A3A2415007BE3E3 /* PBXTextBookmark */ = A1E710C00A3A2415007BE3E3 /* PBXTextBookmark */; + A1E710C60A3A2441007BE3E3 /* PBXTextBookmark */ = A1E710C60A3A2441007BE3E3 /* PBXTextBookmark */; + A1E710C70A3A2441007BE3E3 /* PBXTextBookmark */ = A1E710C70A3A2441007BE3E3 /* PBXTextBookmark */; + A1E710C80A3A2441007BE3E3 /* PBXTextBookmark */ = A1E710C80A3A2441007BE3E3 /* PBXTextBookmark */; + A1E710C90A3A2441007BE3E3 /* PBXTextBookmark */ = A1E710C90A3A2441007BE3E3 /* PBXTextBookmark */; + A1E710CA0A3A244D007BE3E3 /* PBXTextBookmark */ = A1E710CA0A3A244D007BE3E3 /* PBXTextBookmark */; + A1E710CB0A3A244D007BE3E3 /* PBXTextBookmark */ = A1E710CB0A3A244D007BE3E3 /* PBXTextBookmark */; + A1E710CC0A3A244D007BE3E3 /* PBXTextBookmark */ = A1E710CC0A3A244D007BE3E3 /* PBXTextBookmark */; + A1E710CD0A3A244D007BE3E3 /* PBXTextBookmark */ = A1E710CD0A3A244D007BE3E3 /* PBXTextBookmark */; + A1E710CE0A3A244D007BE3E3 /* PBXTextBookmark */ = A1E710CE0A3A244D007BE3E3 /* PBXTextBookmark */; + A1E710D00A3A2456007BE3E3 /* PBXTextBookmark */ = A1E710D00A3A2456007BE3E3 /* PBXTextBookmark */; + A1E710D10A3A2456007BE3E3 /* PBXTextBookmark */ = A1E710D10A3A2456007BE3E3 /* PBXTextBookmark */; + A1E710D20A3A2456007BE3E3 /* PBXTextBookmark */ = A1E710D20A3A2456007BE3E3 /* PBXTextBookmark */; + A1E710D30A3A2456007BE3E3 /* PBXTextBookmark */ = A1E710D30A3A2456007BE3E3 /* PBXTextBookmark */; + A1E710D40A3A2456007BE3E3 /* PBXTextBookmark */ = A1E710D40A3A2456007BE3E3 /* PBXTextBookmark */; + A1E710D70A3A2465007BE3E3 /* PBXTextBookmark */ = A1E710D70A3A2465007BE3E3 /* PBXTextBookmark */; + A1E710D80A3A2465007BE3E3 /* PBXTextBookmark */ = A1E710D80A3A2465007BE3E3 /* PBXTextBookmark */; + A1E710D90A3A2465007BE3E3 /* PBXTextBookmark */ = A1E710D90A3A2465007BE3E3 /* PBXTextBookmark */; + A1E710DB0A3A246E007BE3E3 /* PBXTextBookmark */ = A1E710DB0A3A246E007BE3E3 /* PBXTextBookmark */; + A1E710DF0A3A247D007BE3E3 /* PBXTextBookmark */ = A1E710DF0A3A247D007BE3E3 /* PBXTextBookmark */; + A1E710E00A3A247D007BE3E3 /* PBXTextBookmark */ = A1E710E00A3A247D007BE3E3 /* PBXTextBookmark */; + A1E710E10A3A247D007BE3E3 /* PBXTextBookmark */ = A1E710E10A3A247D007BE3E3 /* PBXTextBookmark */; + A1E710E20A3A247D007BE3E3 /* PBXTextBookmark */ = A1E710E20A3A247D007BE3E3 /* PBXTextBookmark */; + A1E710E30A3A247D007BE3E3 /* PBXTextBookmark */ = A1E710E30A3A247D007BE3E3 /* PBXTextBookmark */; + A1E710E50A3A248A007BE3E3 /* PBXTextBookmark */ = A1E710E50A3A248A007BE3E3 /* PBXTextBookmark */; + A1E710E60A3A248A007BE3E3 /* PBXTextBookmark */ = A1E710E60A3A248A007BE3E3 /* PBXTextBookmark */; + A1E710E70A3A24A4007BE3E3 /* PBXTextBookmark */ = A1E710E70A3A24A4007BE3E3 /* PBXTextBookmark */; + A1E710E80A3A24A5007BE3E3 /* PBXTextBookmark */ = A1E710E80A3A24A5007BE3E3 /* PBXTextBookmark */; + A1E710E90A3A24A5007BE3E3 /* PBXTextBookmark */ = A1E710E90A3A24A5007BE3E3 /* PBXTextBookmark */; + A1E710EA0A3A2521007BE3E3 /* PBXTextBookmark */ = A1E710EA0A3A2521007BE3E3 /* PBXTextBookmark */; + A1E710EB0A3A2521007BE3E3 /* PBXTextBookmark */ = A1E710EB0A3A2521007BE3E3 /* PBXTextBookmark */; + A1E710EC0A3A2521007BE3E3 /* PBXTextBookmark */ = A1E710EC0A3A2521007BE3E3 /* PBXTextBookmark */; + A1E710ED0A3A2521007BE3E3 /* PBXTextBookmark */ = A1E710ED0A3A2521007BE3E3 /* PBXTextBookmark */; + A1E710EE0A3A2521007BE3E3 /* PBXTextBookmark */ = A1E710EE0A3A2521007BE3E3 /* PBXTextBookmark */; + A1E710EF0A3A2521007BE3E3 /* PBXTextBookmark */ = A1E710EF0A3A2521007BE3E3 /* PBXTextBookmark */; + A1E710F00A3A2521007BE3E3 /* PBXTextBookmark */ = A1E710F00A3A2521007BE3E3 /* PBXTextBookmark */; + A1E710F10A3A2521007BE3E3 /* PBXTextBookmark */ = A1E710F10A3A2521007BE3E3 /* PBXTextBookmark */; + A1E710F40A3A253F007BE3E3 /* PBXTextBookmark */ = A1E710F40A3A253F007BE3E3 /* PBXTextBookmark */; + A1E710F50A3A253F007BE3E3 /* PBXTextBookmark */ = A1E710F50A3A253F007BE3E3 /* PBXTextBookmark */; + }; + sourceControlManager = A1E70CFD0A38B536007BE3E3 /* Source Control */; + userBuildSettings = { + }; + }; + A1E70CFD0A38B536007BE3E3 /* Source Control */ = { + isa = PBXSourceControlManager; + fallbackIsa = XCSourceControlManager; + isSCMEnabled = 0; + scmConfiguration = { + }; + scmType = ""; + }; + A1E70CFE0A38B536007BE3E3 /* Code sense */ = { + isa = PBXCodeSenseManager; + indexTemplatePath = ""; + }; + A1E70D000A38B5BB007BE3E3 /* cacheapi.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1087, 2100}}"; + sepNavSelRange = "{4787, 139}"; + sepNavVisRect = "{{0, 1547}, {1087, 448}}"; + }; + }; + A1E70D010A38B5BB007BE3E3 /* ccache.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1003, 18424}}"; + sepNavSelRange = "{11919, 0}"; + sepNavVisRect = "{{0, 5185}, {1003, 481}}"; + }; + }; + A1E70D020A38B5BB007BE3E3 /* ccache.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {980, 2058}}"; + sepNavSelRange = "{2339, 9}"; + sepNavVisRect = "{{0, 556}, {980, 387}}"; + }; + }; + A1E70D080A38B5BB007BE3E3 /* context.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {980, 13958}}"; + sepNavSelRange = "{29891, 21}"; + sepNavVisRect = "{{0, 13156}, {980, 387}}"; + }; + }; + A1E70D0B0A38B5BB007BE3E3 /* credentials.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {621, 1330}}"; + sepNavSelRange = "{0, 2110}"; + sepNavVisRect = "{{0, 235}, {621, 499}}"; + }; + }; + A1E70D0C0A38B5BB007BE3E3 /* credentials_iterator.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {980, 3836}}"; + sepNavSelRange = "{6723, 21}"; + sepNavVisRect = "{{0, 2544}, {980, 387}}"; + }; + }; + A1E70D0F0A38B5BB007BE3E3 /* NTMakefile */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {734, 998}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRect = "{{0, 0}, {734, 998}}"; + sepNavWindowFrame = "{{15, 46}, {779, 1127}}"; + }; + }; + A1E70D120A38B5BB007BE3E3 /* generic_lists.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1003, 5572}}"; + sepNavSelRange = "{2282, 0}"; + sepNavVisRect = "{{0, 489}, {1003, 521}}"; + }; + }; + A1E70D130A38B5BB007BE3E3 /* marshall.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {980, 6188}}"; + sepNavSelRange = "{11995, 68}"; + sepNavVisRect = "{{0, 4756}, {980, 387}}"; + }; + }; + A1E70D140A38B5BB007BE3E3 /* msg.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1087, 8722}}"; + sepNavSelRange = "{15262, 21}"; + sepNavVisRect = "{{0, 7868}, {1087, 448}}"; + }; + }; + A1E70D150A38B5BB007BE3E3 /* NTMakefile */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {621, 499}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRect = "{{0, 0}, {621, 499}}"; + }; + }; + A1E70D190A38B5BB007BE3E3 /* cc_rpc.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {888, 742}}"; + sepNavSelRange = "{2202, 18}"; + sepNavVisRect = "{{0, 453}, {888, 289}}"; + }; + }; + A1E70D1A0A38B5BB007BE3E3 /* CredentialsCache.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1003, 8302}}"; + sepNavSelRange = "{2631, 0}"; + sepNavVisRect = "{{0, 958}, {1003, 521}}"; + }; + }; + A1E70D1B0A38B5BB007BE3E3 /* CredentialsCache2.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1003, 4340}}"; + sepNavSelRange = "{7813, 0}"; + sepNavVisRect = "{{0, 422}, {1003, 521}}"; + }; + }; + A1E70D1C0A38B5BB007BE3E3 /* datastore.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {888, 2562}}"; + sepNavSelRange = "{2301, 0}"; + sepNavVisRect = "{{0, 573}, {888, 436}}"; + }; + }; + A1E70D1D0A38B5BB007BE3E3 /* generic_lists.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1003, 1442}}"; + sepNavSelRange = "{2369, 0}"; + sepNavVisRect = "{{0, 545}, {1003, 521}}"; + }; + }; + A1E70D1F0A38B5BB007BE3E3 /* msg.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1003, 2268}}"; + sepNavSelRange = "{5529, 0}"; + sepNavVisRect = "{{0, 1721}, {1003, 521}}"; + }; + }; + A1E70D260A38B5BB007BE3E3 /* NTMakefile */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {621, 499}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRect = "{{0, 0}, {621, 499}}"; + }; + }; + A1E70D280A38B5BB007BE3E3 /* ccs_ccache.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1003, 9856}}"; + sepNavSelRange = "{9783, 0}"; + sepNavVisRect = "{{0, 3674}, {1003, 730}}"; + }; + }; + A1E70D2C0A38B5BB007BE3E3 /* main.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {621, 910}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRect = "{{0, 134}, {621, 727}}"; + }; + }; + A1E70D2F0A38B5BB007BE3E3 /* serv_ops.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1087, 22204}}"; + sepNavSelRange = "{36879, 21}"; + sepNavVisRect = "{{0, 14168}, {1087, 448}}"; + }; + }; + A1E70D3B0A38B5BB007BE3E3 /* client.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {804, 1988}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRect = "{{0, 0}, {804, 503}}"; + }; + }; + A1E70D460A38B5BC007BE3E3 /* server.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {621, 9520}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRect = "{{0, 0}, {621, 499}}"; + }; + }; + A1E70D500A38B5F3007BE3E3 /* XCBreakpointsBucket */ = { + isa = XCBreakpointsBucket; + name = CCAPI; + objects = ( + ); + }; + A1E70D5C0A38B796007BE3E3 /* CCacheServer */ = { + activeExec = 0; + executables = ( + A1E70D5E0A38B796007BE3E3 /* CCacheServer */, + ); + }; + A1E70D5E0A38B796007BE3E3 /* CCacheServer */ = { + isa = PBXExecutable; + activeArgIndex = 2147483647; + activeArgIndices = ( + ); + argumentStrings = ( + ); + autoAttachOnCrash = 1; + configStateDict = { + }; + customDataFormattersEnabled = 1; + debuggerPlugin = GDBDebugging; + disassemblyDisplayState = 0; + enableDebugStr = 1; + environmentEntries = ( + ); + executableSystemSymbolLevel = 0; + executableUserSymbolLevel = 0; + libgmallocEnabled = 0; + name = CCacheServer; + sourceDirectories = ( + ); + }; + A1E70D930A38BB67007BE3E3 /* main.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {980, 476}}"; + sepNavSelRange = "{316, 42}"; + sepNavVisRect = "{{0, 24}, {980, 387}}"; + }; + }; + A1E70D9E0A38BCAD007BE3E3 /* mig.defs */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {804, 826}}"; + sepNavSelRange = "{2123, 0}"; + sepNavVisRect = "{{0, 400}, {804, 391}}"; + }; + }; + A1E70DB10A38C01E007BE3E3 /* mig_types.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {804, 686}}"; + sepNavSelRange = "{2188, 0}"; + sepNavVisRect = "{{0, 281}, {804, 391}}"; + }; + }; + A1E70DE10A38C6FD007BE3E3 /* kipc_common.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {888, 1078}}"; + sepNavSelRange = "{1293, 0}"; + sepNavVisRect = "{{0, 206}, {888, 470}}"; + }; + }; + A1E70DE40A38C6FD007BE3E3 /* kipc_client.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {804, 1218}}"; + sepNavSelRange = "{1240, 34}"; + sepNavVisRect = "{{0, 235}, {804, 329}}"; + }; + }; + A1E70DE50A38C6FD007BE3E3 /* kipc_common.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {632, 1316}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRect = "{{0, 0}, {621, 499}}"; + }; + }; + A1E70DE60A38C6FD007BE3E3 /* kipc_server.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {728, 4396}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRect = "{{0, 0}, {621, 499}}"; + }; + }; + A1E70DE70A38C6FD007BE3E3 /* kipc_session.c */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {698, 1988}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRect = "{{0, 0}, {621, 499}}"; + }; + }; + A1E70DE80A38C6FD007BE3E3 /* notify.defs */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {621, 518}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRect = "{{0, 0}, {621, 499}}"; + }; + }; + A1E70DF70A38C765007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D150A38B5BB007BE3E3 /* NTMakefile */; + name = "NTMakefile: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 308; + vrLoc = 0; + }; + A1E70DF80A38C765007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D3B0A38B5BB007BE3E3 /* client.c */; + name = "client.c: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 903; + vrLoc = 0; + }; + A1E70DF90A38C765007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D3C0A38B5BB007BE3E3 /* dllmain.c */; + name = "dllmain.c: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 298; + vrLoc = 0; + }; + A1E70DFA0A38C765007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D3A0A38B5BB007BE3E3 /* cacheapi.def */; + name = "cacheapi.def: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 847; + vrLoc = 0; + }; + A1E70DFB0A38C765007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D460A38B5BC007BE3E3 /* server.c */; + name = "server.c: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 756; + vrLoc = 0; + }; + A1E70DFD0A38C765007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D120A38B5BB007BE3E3 /* generic_lists.c */; + name = "generic_lists.c: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 1826; + vrLoc = 0; + }; + A1E70E010A38C765007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D0B0A38B5BB007BE3E3 /* credentials.h */; + name = "credentials.h: 1"; + rLen = 2110; + rLoc = 0; + rType = 0; + vrLen = 1604; + vrLoc = 749; + }; + A1E70E020A38C765007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D2C0A38B5BB007BE3E3 /* main.c */; + name = "main.c: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 1306; + vrLoc = 202; + }; + A1E70E060A38C765007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D1B0A38B5BB007BE3E3 /* CredentialsCache2.h */; + name = "CredentialsCache2.h: 303"; + rLen = 0; + rLoc = 7813; + rType = 0; + vrLen = 1128; + vrLoc = 6802; + }; + A1E70E090A38C765007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70DE80A38C6FD007BE3E3 /* notify.defs */; + name = "notify.defs: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 1437; + vrLoc = 0; + }; + A1E70E0A0A38C765007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70DE60A38C6FD007BE3E3 /* kipc_server.c */; + name = "kipc_server.c: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 1538; + vrLoc = 0; + }; + A1E70E0B0A38C765007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70DE70A38C6FD007BE3E3 /* kipc_session.c */; + name = "kipc_session.c: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 1461; + vrLoc = 0; + }; + A1E70E0C0A38C765007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70DE50A38C6FD007BE3E3 /* kipc_common.c */; + name = "kipc_common.c: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 1496; + vrLoc = 0; + }; + A1E70E100A38C765007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D150A38B5BB007BE3E3 /* NTMakefile */; + name = "NTMakefile: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 308; + vrLoc = 0; + }; + A1E70E110A38C765007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D120A38B5BB007BE3E3 /* generic_lists.c */; + name = "generic_lists.c: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 1826; + vrLoc = 0; + }; + A1E70E120A38C765007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D3B0A38B5BB007BE3E3 /* client.c */; + name = "client.c: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 903; + vrLoc = 0; + }; + A1E70E130A38C765007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D3C0A38B5BB007BE3E3 /* dllmain.c */; + name = "dllmain.c: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 298; + vrLoc = 0; + }; + A1E70E140A38C765007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D3A0A38B5BB007BE3E3 /* cacheapi.def */; + name = "cacheapi.def: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 847; + vrLoc = 0; + }; + A1E70E150A38C765007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D460A38B5BC007BE3E3 /* server.c */; + name = "server.c: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 756; + vrLoc = 0; + }; + A1E70E160A38C765007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D2C0A38B5BB007BE3E3 /* main.c */; + name = "main.c: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 954; + vrLoc = 0; + }; + A1E70E170A38C765007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D2F0A38B5BB007BE3E3 /* serv_ops.c */; + name = "serv_ops.c: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 1825; + vrLoc = 0; + }; + A1E70E180A38C765007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D280A38B5BB007BE3E3 /* ccs_ccache.c */; + name = "ccs_ccache.c: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 1861; + vrLoc = 0; + }; + A1E70E1B0A38C765007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D930A38BB67007BE3E3 /* main.c */; + name = "main.c: 22"; + rLen = 0; + rLoc = 509; + rType = 0; + vrLen = 954; + vrLoc = 0; + }; + A1E70E1E0A38C765007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D0B0A38B5BB007BE3E3 /* credentials.h */; + name = "credentials.h: 1"; + rLen = 2110; + rLoc = 0; + rType = 0; + vrLen = 1604; + vrLoc = 749; + }; + A1E70E1F0A38C765007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D130A38B5BB007BE3E3 /* marshall.c */; + name = cci_creds_v5_marshall; + rLen = 21; + rLoc = 6670; + rType = 0; + vrLen = 1513; + vrLoc = 6116; + }; + A1E70E200A38C765007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D140A38B5BB007BE3E3 /* msg.c */; + name = cci_msg_flatten; + rLen = 15; + rLoc = 7396; + rType = 0; + vrLen = 1003; + vrLoc = 7034; + }; + A1E70E250A38C765007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D1A0A38B5BB007BE3E3 /* CredentialsCache.h */; + name = "CredentialsCache.h: 583"; + rLen = 0; + rLoc = 20525; + rType = 0; + vrLen = 2454; + vrLoc = 18163; + }; + A1E70E260A38C765007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D9E0A38BCAD007BE3E3 /* mig.defs */; + name = "ccapi_ipc.defs: 55"; + rLen = 0; + rLoc = 2520; + rType = 0; + vrLen = 1955; + vrLoc = 87; + }; + A1E70E290A38C765007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70DE40A38C6FD007BE3E3 /* kipc_client.c */; + name = "kipc_client.c: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 1544; + vrLoc = 0; + }; + A1E70E2A0A38C765007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70DE50A38C6FD007BE3E3 /* kipc_common.c */; + name = "kipc_common.c: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 1496; + vrLoc = 0; + }; + A1E70E2B0A38C765007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70DE80A38C6FD007BE3E3 /* notify.defs */; + name = "notify.defs: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 1437; + vrLoc = 0; + }; + A1E70E2D0A38C765007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70DE60A38C6FD007BE3E3 /* kipc_server.c */; + name = "kipc_server.c: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 1538; + vrLoc = 0; + }; + A1E70E2E0A38C765007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70DE70A38C6FD007BE3E3 /* kipc_session.c */; + name = "kipc_session.c: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 1461; + vrLoc = 0; + }; + A1E70E380A38C778007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D000A38B5BB007BE3E3 /* cacheapi.c */; + name = "#include <CredentialsCache.h>"; + rLen = 30; + rLoc = 2170; + rType = 0; + vrLen = 696; + vrLoc = 1821; + }; + A1E70E3D0A38C78C007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D260A38B5BB007BE3E3 /* NTMakefile */; + name = "NTMakefile: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 437; + vrLoc = 0; + }; + A1E70E410A38C78C007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D260A38B5BB007BE3E3 /* NTMakefile */; + name = "NTMakefile: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 437; + vrLoc = 0; + }; + A1E70E430A38C791007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D0F0A38B5BB007BE3E3 /* NTMakefile */; + name = "NTMakefile: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 432; + vrLoc = 0; + }; + A1E70E450A38C791007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D0F0A38B5BB007BE3E3 /* NTMakefile */; + name = "NTMakefile: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 432; + vrLoc = 0; + }; + A1E70E4A0A38C7BE007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D0F0A38B5BB007BE3E3 /* NTMakefile */; + name = "NTMakefile: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 432; + vrLoc = 0; + }; + A1E70E520A38C9FD007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D150A38B5BB007BE3E3 /* NTMakefile */; + name = "NTMakefile: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 308; + vrLoc = 0; + }; + A1E70E530A38C9FD007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D1C0A38B5BB007BE3E3 /* datastore.h */; + name = cc_list_type; + rLen = 0; + rLoc = 2301; + rType = 0; + vrLen = 425; + vrLoc = 2113; + }; + A1E70E560A38C9FD007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D1D0A38B5BB007BE3E3 /* generic_lists.h */; + name = cc_list_type; + rLen = 12; + rLoc = 2736; + rType = 0; + vrLen = 728; + vrLoc = 2219; + }; + A1E70E580A38C9FD007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D1C0A38B5BB007BE3E3 /* datastore.h */; + name = cc_list_type; + rLen = 0; + rLoc = 2301; + rType = 0; + vrLen = 425; + vrLoc = 2113; + }; + A1E70E6F0A38CA08007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D1F0A38B5BB007BE3E3 /* msg.h */; + name = "#include \"generic_lists.h\""; + rLen = 27; + rLoc = 2765; + rType = 0; + vrLen = 755; + vrLoc = 2478; + }; + A1E70E770A38CA55007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D190A38B5BB007BE3E3 /* cc_rpc.h */; + name = "#include \"msg.h\""; + rLen = 18; + rLoc = 2202; + rType = 0; + vrLen = 644; + vrLoc = 1674; + }; + A1E70E7D0A38CA55007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D190A38B5BB007BE3E3 /* cc_rpc.h */; + name = "#include \"msg.h\""; + rLen = 18; + rLoc = 2202; + rType = 0; + vrLen = 644; + vrLoc = 1674; + }; + A1E70E9C0A38CAF1007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D120A38B5BB007BE3E3 /* generic_lists.c */; + name = "generic_lists.c: 56"; + rLen = 0; + rLoc = 2280; + rType = 0; + vrLen = 463; + vrLoc = 2119; + }; + A1E70EA80A38CB24007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D1D0A38B5BB007BE3E3 /* generic_lists.h */; + name = "generic_lists.h: cc_generic_list_node_t"; + rLen = 0; + rLoc = 2452; + rType = 0; + vrLen = 598; + vrLoc = 2206; + }; + A1E70EAB0A38CB24007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D080A38B5BB007BE3E3 /* context.c */; + name = "code = cci_msg_add_data_blob(request, (void *)name, strlen(name) + 1, &blob_pos);"; + rLen = 86; + rLoc = 14073; + rType = 0; + vrLen = 704; + vrLoc = 13925; + }; + A1E70EB50A38CB4D007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D000A38B5BB007BE3E3 /* cacheapi.c */; + name = "strncpy(vendor, string, sizeof(vendor)-1);"; + rLen = 55; + rLoc = 4926; + rType = 0; + vrLen = 780; + vrLoc = 1821; + }; + A1E70EC30A38CC14007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D010A38B5BB007BE3E3 /* ccache.c */; + name = "ccache.c: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 1115; + vrLoc = 0; + }; + A1E70ECB0A38CC4C007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70DE40A38C6FD007BE3E3 /* kipc_client.c */; + name = "#include <Kerberos/kipc_client.h>"; + rLen = 34; + rLoc = 1240; + rType = 0; + vrLen = 891; + vrLoc = 724; + }; + A1E70ED70A38CCB6007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70DE40A38C6FD007BE3E3 /* kipc_client.c */; + name = "#include <Kerberos/kipc_client.h>"; + rLen = 34; + rLoc = 1240; + rType = 0; + vrLen = 1069; + vrLoc = 582; + }; + A1E70EE20A38CCD6007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70DB10A38C01E007BE3E3 /* mig_types.h */; + name = "ccapi_ipc.h: 39"; + rLen = 0; + rLoc = 1957; + rType = 0; + vrLen = 892; + vrLoc = 1209; + }; + A1E70EFE0A38CD66007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70DE10A38C6FD007BE3E3 /* kipc_common.h */; + name = "#include <Kerberos/KerberosDebug.h>"; + rLen = 36; + rLoc = 1293; + rType = 0; + vrLen = 609; + vrLoc = 1011; + }; + A1E70F0F0A38CE21007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D3B0A38B5BB007BE3E3 /* client.c */; + name = "client.c: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 903; + vrLoc = 0; + }; + A1E70F440A38D252007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70DB10A38C01E007BE3E3 /* mig_types.h */; + name = "msg_ipc.h: 48"; + rLen = 0; + rLoc = 2188; + rType = 0; + vrLen = 793; + vrLoc = 1409; + }; + A1E70F450A38D252007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70DE10A38C6FD007BE3E3 /* kipc_common.h */; + name = "kipc_common.h: 32"; + rLen = 0; + rLoc = 1293; + rType = 0; + vrLen = 1252; + vrLoc = 450; + }; + A1E70F8B0A38D3B4007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D9E0A38BCAD007BE3E3 /* mig.defs */; + name = "msg_ipc.defs: 43"; + rLen = 0; + rLoc = 2111; + rType = 0; + vrLen = 1149; + vrLoc = 1378; + }; + A1E70F9C0A38D41E007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70DB10A38C01E007BE3E3 /* mig_types.h */; + name = "mig_types.h: 48"; + rLen = 0; + rLoc = 2188; + rType = 0; + vrLen = 1178; + vrLoc = 1024; + }; + A1E70F9D0A38D41E007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D9E0A38BCAD007BE3E3 /* mig.defs */; + name = "mig.defs: 44"; + rLen = 0; + rLoc = 2123; + rType = 0; + vrLen = 1034; + vrLoc = 1439; + }; + A1E70FC60A38D560007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70FC70A38D560007BE3E3 /* migServer.h */; + name = ccapi_server; + rLen = 12; + rLoc = 1268; + rType = 0; + vrLen = 879; + vrLoc = 942; + }; + A1E70FC70A38D560007BE3E3 /* migServer.h */ = { + isa = PBXFileReference; + name = migServer.h; + path = "/Volumes/Ra-Tilt/Users/lxs/Builds/CCAPI.build/Debug/CCacheServer.build/DerivedSources/migServer.h"; + sourceTree = "<absolute>"; + }; + A1E70FC80A38D560007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D930A38BB67007BE3E3 /* main.c */; + name = "main.c: 23"; + rLen = 0; + rLoc = 495; + rType = 0; + vrLen = 691; + vrLoc = 0; + }; + A1E70FC90A38D560007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D1C0A38B5BB007BE3E3 /* datastore.h */; + name = "datastore.h: 55"; + rLen = 0; + rLoc = 2301; + rType = 0; + vrLen = 805; + vrLoc = 2101; + }; + A1E70FCA0A38D560007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D1D0A38B5BB007BE3E3 /* generic_lists.h */; + name = "generic_lists.h: 52"; + rLen = 0; + rLoc = 2371; + rType = 0; + vrLen = 757; + vrLoc = 2012; + }; + A1E70FCD0A38D560007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D930A38BB67007BE3E3 /* main.c */; + name = "main.c: 23"; + rLen = 0; + rLoc = 495; + rType = 0; + vrLen = 691; + vrLoc = 0; + }; + A1E70FD80A38D573007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D930A38BB67007BE3E3 /* main.c */; + name = "syslog (LOG_INFO, \"Starting up.\");"; + rLen = 42; + rLoc = 316; + rType = 0; + vrLen = 628; + vrLoc = 21; + }; + A1E70FEE0A38D7C0007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D130A38B5BB007BE3E3 /* marshall.c */; + name = "marshall.c: 48"; + rLen = 0; + rLoc = 2234; + rType = 0; + vrLen = 831; + vrLoc = 1674; + }; + A1E70FEF0A38D7C0007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D010A38B5BB007BE3E3 /* ccache.c */; + name = "ccache.c: 49"; + rLen = 0; + rLoc = 2186; + rType = 0; + vrLen = 432; + vrLoc = 2106; + }; + A1E70FF00A38D7C0007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D080A38B5BB007BE3E3 /* context.c */; + name = "code = cci_msg_retrieve_blob(response, ntohl(response_header->vendor_offset), ntohl(response_header->vendor_length), &string);"; + rLen = 139; + rLoc = 29872; + rType = 0; + vrLen = 757; + vrLoc = 27442; + }; + A1E70FFA0A38D806007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D130A38B5BB007BE3E3 /* marshall.c */; + name = "memcpy(creds->client, flat + header->client.data, length);"; + rLen = 68; + rLoc = 11995; + rType = 0; + vrLen = 1038; + vrLoc = 11543; + }; + A1E70FFC0A38D806007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D020A38B5BB007BE3E3 /* ccache.h */; + name = cc_handle; + rLen = 9; + rLoc = 2339; + rType = 0; + vrLen = 663; + vrLoc = 2042; + }; + A1E70FFF0A38D806007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D020A38B5BB007BE3E3 /* ccache.h */; + name = cc_handle; + rLen = 9; + rLoc = 2339; + rType = 0; + vrLen = 663; + vrLoc = 2042; + }; + A1E710010A38D814007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D1A0A38B5BB007BE3E3 /* CredentialsCache.h */; + name = cc_handle; + rLen = 9; + rLoc = 5095; + rType = 0; + vrLen = 617; + vrLoc = 4722; + }; + A1E7100A0A38D888007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D1A0A38B5BB007BE3E3 /* CredentialsCache.h */; + name = cc_handle; + rLen = 9; + rLoc = 5095; + rType = 0; + vrLen = 619; + vrLoc = 4720; + }; + A1E7100C0A38D888007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D080A38B5BB007BE3E3 /* context.c */; + name = cci_msg_retrieve_blob; + rLen = 21; + rLoc = 29891; + rType = 0; + vrLen = 1038; + vrLoc = 29282; + }; + A1E7100D0A38D888007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D0C0A38B5BB007BE3E3 /* credentials_iterator.c */; + name = cci_msg_retrieve_blob; + rLen = 21; + rLoc = 6723; + rType = 0; + vrLen = 1080; + vrLoc = 6223; + }; + A1E710110A38D888007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D2F0A38B5BB007BE3E3 /* serv_ops.c */; + name = cci_msg_retrieve_blob; + rLen = 21; + rLoc = 22827; + rType = 0; + vrLen = 921; + vrLoc = 22183; + }; + A1E710140A38D888007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D0C0A38B5BB007BE3E3 /* credentials_iterator.c */; + name = cci_msg_retrieve_blob; + rLen = 21; + rLoc = 6723; + rType = 0; + vrLen = 1080; + vrLoc = 6223; + }; + A1E7103C0A38DE0B007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D1F0A38B5BB007BE3E3 /* msg.h */; + name = "msg.h: 142"; + rLen = 0; + rLoc = 5529; + rType = 0; + vrLen = 1239; + vrLoc = 4630; + }; + A1E710400A38DE0B007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D140A38B5BB007BE3E3 /* msg.c */; + name = "msg.c: cci_msg_retrieve_blob"; + rLen = 0; + rLoc = 15353; + rType = 0; + vrLen = 962; + vrLoc = 14947; + }; + A1E710530A39EC0B007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D2F0A38B5BB007BE3E3 /* serv_ops.c */; + name = "serv_ops.c: 322"; + rLen = 0; + rLoc = 12676; + rType = 0; + vrLen = 1049; + vrLoc = 12199; + }; + A1E7105A0A39ED89007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D000A38B5BB007BE3E3 /* cacheapi.c */; + name = "code = cci_msg_retrieve_blob(response, ntohl(response_header->vendor_offset), ntohl(response_header->vendor_length), &string);"; + rLen = 139; + rLoc = 4787; + rType = 0; + vrLen = 1079; + vrLoc = 4176; + }; + A1E7105D0A39ED89007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D000A38B5BB007BE3E3 /* cacheapi.c */; + name = "code = cci_msg_retrieve_blob(response, ntohl(response_header->vendor_offset), ntohl(response_header->vendor_length), &string);"; + rLen = 139; + rLoc = 4787; + rType = 0; + vrLen = 1079; + vrLoc = 4176; + }; + A1E7105E0A39ED89007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D140A38B5BB007BE3E3 /* msg.c */; + name = "cur_pos = msg->flat;"; + rLen = 25; + rLoc = 7704; + rType = 0; + vrLen = 835; + vrLoc = 7353; + }; + A1E710680A39F102007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D2F0A38B5BB007BE3E3 /* serv_ops.c */; + name = "resp_header->ccache = htonll((cc_handle) ccache);"; + rLen = 54; + rLoc = 23249; + rType = 0; + vrLen = 1200; + vrLoc = 22714; + }; + A1E710840A3A1CFB007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D010A38B5BB007BE3E3 /* ccache.c */; + name = "ccache.c: 378"; + rLen = 0; + rLoc = 11919; + rType = 0; + vrLen = 1092; + vrLoc = 11685; + }; + A1E710860A3A1CFB007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D140A38B5BB007BE3E3 /* msg.c */; + name = "msg.c: 585"; + rLen = 0; + rLoc = 15353; + rType = 0; + vrLen = 1129; + vrLoc = 14797; + }; + A1E710870A3A1CFB007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D010A38B5BB007BE3E3 /* ccache.c */; + name = "ccache.c: 378"; + rLen = 0; + rLoc = 11919; + rType = 0; + vrLen = 1092; + vrLoc = 11685; + }; + A1E710890A3A1D04007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D280A38B5BB007BE3E3 /* ccs_ccache.c */; + name = "ccs_ccache.c: 289"; + rLen = 0; + rLoc = 9783; + rType = 0; + vrLen = 919; + vrLoc = 9327; + }; + A1E7108B0A3A1D04007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D280A38B5BB007BE3E3 /* ccs_ccache.c */; + name = "ccs_ccache.c: 289"; + rLen = 0; + rLoc = 9783; + rType = 0; + vrLen = 919; + vrLoc = 9327; + }; + A1E7108D0A3A1D06007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D280A38B5BB007BE3E3 /* ccs_ccache.c */; + name = "ccs_ccache.c: 289"; + rLen = 0; + rLoc = 9783; + rType = 0; + vrLen = 1441; + vrLoc = 9196; + }; + A1E710930A3A1D22007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D2F0A38B5BB007BE3E3 /* serv_ops.c */; + name = cci_msg_retrieve_blob; + rLen = 21; + rLoc = 36879; + rType = 0; + vrLen = 1393; + vrLoc = 35980; + }; + A1E710940A3A1D22007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D1F0A38B5BB007BE3E3 /* msg.h */; + name = "msg.h: 142"; + rLen = 0; + rLoc = 5529; + rType = 0; + vrLen = 1480; + vrLoc = 4457; + }; + A1E710950A3A1D22007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D140A38B5BB007BE3E3 /* msg.c */; + rLen = 21; + rLoc = 14700; + rType = 0; + }; + A1E710960A3A1D22007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D2F0A38B5BB007BE3E3 /* serv_ops.c */; + name = cci_msg_retrieve_blob; + rLen = 21; + rLoc = 36879; + rType = 0; + vrLen = 1393; + vrLoc = 35980; + }; + A1E710970A3A1D22007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D1F0A38B5BB007BE3E3 /* msg.h */; + name = "msg.h: 142"; + rLen = 0; + rLoc = 5529; + rType = 0; + vrLen = 1480; + vrLoc = 4457; + }; + A1E7109C0A3A1D2B007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D2F0A38B5BB007BE3E3 /* serv_ops.c */; + name = cci_msg_retrieve_blob; + rLen = 21; + rLoc = 36879; + rType = 0; + vrLen = 1196; + vrLoc = 36344; + }; + A1E7109D0A3A1D2B007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + comments = "error: conflicting types for 'cci_msg_retrieve_blob'"; + fRef = A1E70D140A38B5BB007BE3E3 /* msg.c */; + rLen = 1; + rLoc = 570; + rType = 1; + }; + A1E7109F0A3A1DD0007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D140A38B5BB007BE3E3 /* msg.c */; + name = "msg.c: 1248"; + rLen = 0; + rLoc = 16800; + rType = 0; + vrLen = 1576; + vrLoc = 14015; + }; + A1E710A00A3A1DD0007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D140A38B5BB007BE3E3 /* msg.c */; + name = "msg.c: 1248"; + rLen = 0; + rLoc = 16800; + rType = 0; + vrLen = 1582; + vrLoc = 0; + }; + A1E710A50A3A22E1007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D140A38B5BB007BE3E3 /* msg.c */; + name = "msg.c: 623"; + rLen = 0; + rLoc = 16800; + rType = 0; + vrLen = 1674; + vrLoc = 0; + }; + A1E710AB0A3A22F5007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D140A38B5BB007BE3E3 /* msg.c */; + name = "msg.c: 623"; + rLen = 0; + rLoc = 16800; + rType = 0; + vrLen = 2012; + vrLoc = 0; + }; + A1E710AC0A3A22F5007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D140A38B5BB007BE3E3 /* msg.c */; + name = "msg.c: cci_msg_retrieve_blob"; + rLen = 0; + rLoc = 15346; + rType = 0; + vrLen = 1284; + vrLoc = 15187; + }; + A1E710AD0A3A22F5007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D140A38B5BB007BE3E3 /* msg.c */; + name = "msg.c: cci_msg_retrieve_blob"; + rLen = 0; + rLoc = 15346; + rType = 0; + vrLen = 1209; + vrLoc = 15187; + }; + A1E710AF0A3A22FE007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D140A38B5BB007BE3E3 /* msg.c */; + name = "msg.c: cci_msg_retrieve_blob"; + rLen = 0; + rLoc = 15346; + rType = 0; + vrLen = 1589; + vrLoc = 14614; + }; + A1E710B30A3A22FF007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D140A38B5BB007BE3E3 /* msg.c */; + name = "msg.c: cci_msg_retrieve_blob"; + rLen = 0; + rLoc = 15346; + rType = 0; + vrLen = 1209; + vrLoc = 15187; + }; + A1E710B90A3A23FB007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D140A38B5BB007BE3E3 /* msg.c */; + name = cci_msg_retrieve_blob; + rLen = 21; + rLoc = 15262; + rType = 0; + vrLen = 1209; + vrLoc = 15187; + }; + A1E710BC0A3A2415007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D140A38B5BB007BE3E3 /* msg.c */; + name = cci_msg_retrieve_blob; + rLen = 21; + rLoc = 15262; + rType = 0; + vrLen = 1356; + vrLoc = 15083; + }; + A1E710BD0A3A2415007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D120A38B5BB007BE3E3 /* generic_lists.c */; + name = "generic_lists.c: 56"; + rLen = 0; + rLoc = 2280; + rType = 0; + vrLen = 873; + vrLoc = 1826; + }; + A1E710BE0A3A2415007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D140A38B5BB007BE3E3 /* msg.c */; + name = cci_msg_retrieve_blob; + rLen = 21; + rLoc = 15262; + rType = 0; + vrLen = 1356; + vrLoc = 15083; + }; + A1E710BF0A3A2415007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D120A38B5BB007BE3E3 /* generic_lists.c */; + name = "generic_lists.c: 56"; + rLen = 0; + rLoc = 2280; + rType = 0; + vrLen = 863; + vrLoc = 1826; + }; + A1E710C00A3A2415007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D140A38B5BB007BE3E3 /* msg.c */; + name = cci_msg_retrieve_blob; + rLen = 21; + rLoc = 15262; + rType = 0; + vrLen = 1209; + vrLoc = 15187; + }; + A1E710C60A3A2441007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D120A38B5BB007BE3E3 /* generic_lists.c */; + name = "generic_lists.c: 56"; + rLen = 0; + rLoc = 2280; + rType = 0; + vrLen = 863; + vrLoc = 1826; + }; + A1E710C70A3A2441007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D1D0A38B5BB007BE3E3 /* generic_lists.h */; + name = "generic_lists.h: 54"; + rLen = 0; + rLoc = 2452; + rType = 0; + vrLen = 1215; + vrLoc = 1674; + }; + A1E710C80A3A2441007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D120A38B5BB007BE3E3 /* generic_lists.c */; + name = "generic_lists.c: 56"; + rLen = 0; + rLoc = 2280; + rType = 0; + vrLen = 863; + vrLoc = 1826; + }; + A1E710C90A3A2441007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D1D0A38B5BB007BE3E3 /* generic_lists.h */; + name = "generic_lists.h: 58"; + rLen = 0; + rLoc = 2369; + rType = 0; + vrLen = 939; + vrLoc = 1935; + }; + A1E710CA0A3A244D007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D140A38B5BB007BE3E3 /* msg.c */; + name = cci_msg_retrieve_blob; + rLen = 21; + rLoc = 15262; + rType = 0; + vrLen = 1209; + vrLoc = 15187; + }; + A1E710CB0A3A244D007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D1D0A38B5BB007BE3E3 /* generic_lists.h */; + name = "generic_lists.h: 58"; + rLen = 0; + rLoc = 2369; + rType = 0; + vrLen = 696; + vrLoc = 2147; + }; + A1E710CC0A3A244D007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + comments = "error: CredentialsCache.h: No such file or directory"; + fRef = A1E70D120A38B5BB007BE3E3 /* generic_lists.c */; + rLen = 1; + rLoc = 53; + rType = 1; + }; + A1E710CD0A3A244D007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D1D0A38B5BB007BE3E3 /* generic_lists.h */; + name = "generic_lists.h: 58"; + rLen = 0; + rLoc = 2369; + rType = 0; + vrLen = 696; + vrLoc = 2147; + }; + A1E710CE0A3A244D007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D120A38B5BB007BE3E3 /* generic_lists.c */; + name = "#include \"CredentialsCache.h\""; + rLen = 31; + rLoc = 2221; + rType = 0; + vrLen = 608; + vrLoc = 2043; + }; + A1E710D00A3A2456007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D1D0A38B5BB007BE3E3 /* generic_lists.h */; + name = "generic_lists.h: 58"; + rLen = 0; + rLoc = 2369; + rType = 0; + vrLen = 906; + vrLoc = 2012; + }; + A1E710D10A3A2456007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D120A38B5BB007BE3E3 /* generic_lists.c */; + name = "#include \"CredentialsCache.h\""; + rLen = 31; + rLoc = 2221; + rType = 0; + vrLen = 861; + vrLoc = 1792; + }; + A1E710D20A3A2456007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D1A0A38B5BB007BE3E3 /* CredentialsCache.h */; + name = cc_handle; + rLen = 9; + rLoc = 5095; + rType = 0; + vrLen = 822; + vrLoc = 4694; + }; + A1E710D30A3A2456007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D120A38B5BB007BE3E3 /* generic_lists.c */; + name = "#include \"CredentialsCache.h\""; + rLen = 31; + rLoc = 2221; + rType = 0; + vrLen = 861; + vrLoc = 1792; + }; + A1E710D40A3A2456007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D1A0A38B5BB007BE3E3 /* CredentialsCache.h */; + name = cc_handle; + rLen = 9; + rLoc = 5095; + rType = 0; + vrLen = 822; + vrLoc = 4694; + }; + A1E710D70A3A2465007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D1A0A38B5BB007BE3E3 /* CredentialsCache.h */; + name = cc_handle; + rLen = 9; + rLoc = 5095; + rType = 0; + vrLen = 802; + vrLoc = 4694; + }; + A1E710D80A3A2465007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D120A38B5BB007BE3E3 /* generic_lists.c */; + name = "#include \"CredentialsCache.h\""; + rLen = 31; + rLoc = 2221; + rType = 0; + vrLen = 683; + vrLoc = 1899; + }; + A1E710D90A3A2465007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D1A0A38B5BB007BE3E3 /* CredentialsCache.h */; + name = cc_handle; + rLen = 9; + rLoc = 5095; + rType = 0; + vrLen = 726; + vrLoc = 4701; + }; + A1E710DB0A3A246E007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D1A0A38B5BB007BE3E3 /* CredentialsCache.h */; + name = cc_handle; + rLen = 9; + rLoc = 5095; + rType = 0; + vrLen = 726; + vrLoc = 4701; + }; + A1E710DF0A3A247D007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D1B0A38B5BB007BE3E3 /* CredentialsCache2.h */; + name = "CredentialsCache2.h: 303"; + rLen = 0; + rLoc = 7813; + rType = 0; + vrLen = 786; + vrLoc = 7144; + }; + A1E710E00A3A247D007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D1A0A38B5BB007BE3E3 /* CredentialsCache.h */; + name = cc_handle; + rLen = 9; + rLoc = 5095; + rType = 0; + vrLen = 802; + vrLoc = 4694; + }; + A1E710E10A3A247D007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D1A0A38B5BB007BE3E3 /* CredentialsCache.h */; + name = cc_handle; + rLen = 9; + rLoc = 5095; + rType = 0; + vrLen = 802; + vrLoc = 4694; + }; + A1E710E20A3A247D007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D1B0A38B5BB007BE3E3 /* CredentialsCache2.h */; + name = "CredentialsCache2.h: 303"; + rLen = 0; + rLoc = 7813; + rType = 0; + vrLen = 786; + vrLoc = 7144; + }; + A1E710E30A3A247D007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D1A0A38B5BB007BE3E3 /* CredentialsCache.h */; + name = "CredentialsCache.h: 67"; + rLen = 0; + rLoc = 2631; + rType = 0; + vrLen = 836; + vrLoc = 2610; + }; + A1E710E50A3A248A007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D1A0A38B5BB007BE3E3 /* CredentialsCache.h */; + name = "CredentialsCache.h: 67"; + rLen = 0; + rLoc = 2631; + rType = 0; + vrLen = 1007; + vrLoc = 2180; + }; + A1E710E60A3A248A007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D1A0A38B5BB007BE3E3 /* CredentialsCache.h */; + name = "CredentialsCache.h: 67"; + rLen = 0; + rLoc = 2631; + rType = 0; + vrLen = 750; + vrLoc = 2696; + }; + A1E710E70A3A24A4007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D1A0A38B5BB007BE3E3 /* CredentialsCache.h */; + name = "CredentialsCache.h: 67"; + rLen = 0; + rLoc = 2631; + rType = 0; + vrLen = 750; + vrLoc = 2696; + }; + A1E710E80A3A24A5007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D1A0A38B5BB007BE3E3 /* CredentialsCache.h */; + name = "CredentialsCache.h: 67"; + rLen = 0; + rLoc = 2631; + rType = 0; + vrLen = 825; + vrLoc = 2639; + }; + A1E710E90A3A24A5007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D1A0A38B5BB007BE3E3 /* CredentialsCache.h */; + name = "CredentialsCache.h: 67"; + rLen = 0; + rLoc = 2631; + rType = 0; + vrLen = 750; + vrLoc = 2696; + }; + A1E710EA0A3A2521007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D1A0A38B5BB007BE3E3 /* CredentialsCache.h */; + name = "CredentialsCache.h: 67"; + rLen = 0; + rLoc = 2631; + rType = 0; + vrLen = 825; + vrLoc = 2639; + }; + A1E710EB0A3A2521007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D1B0A38B5BB007BE3E3 /* CredentialsCache2.h */; + name = "CredentialsCache2.h: 303"; + rLen = 0; + rLoc = 7813; + rType = 0; + vrLen = 1103; + vrLoc = 1564; + }; + A1E710EC0A3A2521007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D1D0A38B5BB007BE3E3 /* generic_lists.h */; + name = "generic_lists.h: 58"; + rLen = 0; + rLoc = 2369; + rType = 0; + vrLen = 906; + vrLoc = 2012; + }; + A1E710ED0A3A2521007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D1A0A38B5BB007BE3E3 /* CredentialsCache.h */; + name = "CredentialsCache.h: 67"; + rLen = 0; + rLoc = 2631; + rType = 0; + vrLen = 825; + vrLoc = 2639; + }; + A1E710EE0A3A2521007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D1B0A38B5BB007BE3E3 /* CredentialsCache2.h */; + name = "CredentialsCache2.h: 303"; + rLen = 0; + rLoc = 7813; + rType = 0; + vrLen = 1103; + vrLoc = 1564; + }; + A1E710EF0A3A2521007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D1D0A38B5BB007BE3E3 /* generic_lists.h */; + name = "generic_lists.h: 58"; + rLen = 0; + rLoc = 2369; + rType = 0; + vrLen = 906; + vrLoc = 2012; + }; + A1E710F00A3A2521007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D120A38B5BB007BE3E3 /* generic_lists.c */; + name = "generic_lists.c: 56"; + rLen = 0; + rLoc = 2280; + rType = 0; + vrLen = 842; + vrLoc = 1792; + }; + A1E710F10A3A2521007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D1A0A38B5BB007BE3E3 /* CredentialsCache.h */; + name = "CredentialsCache.h: 67"; + rLen = 0; + rLoc = 2631; + rType = 0; + vrLen = 750; + vrLoc = 2696; + }; + A1E710F40A3A253F007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D120A38B5BB007BE3E3 /* generic_lists.c */; + name = "generic_lists.c: 57"; + rLen = 0; + rLoc = 2282; + rType = 0; + vrLen = 861; + vrLoc = 1792; + }; + A1E710F50A3A253F007BE3E3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A1E70D1A0A38B5BB007BE3E3 /* CredentialsCache.h */; + name = "CredentialsCache.h: 67"; + rLen = 0; + rLoc = 2631; + rType = 0; + vrLen = 750; + vrLoc = 2696; + }; + D2AAC045055464E500DB518D /* CCAPI */ = { + activeExec = 0; + }; +} diff --git a/src/lib/ccapi/mac/CCAPI.xcodeproj/lxs.perspective b/src/lib/ccapi/mac/CCAPI.xcodeproj/lxs.perspective new file mode 100644 index 0000000000..198370765b --- /dev/null +++ b/src/lib/ccapi/mac/CCAPI.xcodeproj/lxs.perspective @@ -0,0 +1,1567 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>ActivePerspectiveName</key> + <string>Project</string> + <key>AllowedModules</key> + <array> + <dict> + <key>BundleLoadPath</key> + <string></string> + <key>MaxInstances</key> + <string>n</string> + <key>Module</key> + <string>PBXSmartGroupTreeModule</string> + <key>Name</key> + <string>Groups and Files Outline View</string> + </dict> + <dict> + <key>BundleLoadPath</key> + <string></string> + <key>MaxInstances</key> + <string>n</string> + <key>Module</key> + <string>PBXNavigatorGroup</string> + <key>Name</key> + <string>Editor</string> + </dict> + <dict> + <key>BundleLoadPath</key> + <string></string> + <key>MaxInstances</key> + <string>n</string> + <key>Module</key> + <string>XCTaskListModule</string> + <key>Name</key> + <string>Task List</string> + </dict> + <dict> + <key>BundleLoadPath</key> + <string></string> + <key>MaxInstances</key> + <string>n</string> + <key>Module</key> + <string>XCDetailModule</string> + <key>Name</key> + <string>File and Smart Group Detail Viewer</string> + </dict> + <dict> + <key>BundleLoadPath</key> + <string></string> + <key>MaxInstances</key> + <string>1</string> + <key>Module</key> + <string>PBXBuildResultsModule</string> + <key>Name</key> + <string>Detailed Build Results Viewer</string> + </dict> + <dict> + <key>BundleLoadPath</key> + <string></string> + <key>MaxInstances</key> + <string>1</string> + <key>Module</key> + <string>PBXProjectFindModule</string> + <key>Name</key> + <string>Project Batch Find Tool</string> + </dict> + <dict> + <key>BundleLoadPath</key> + <string></string> + <key>MaxInstances</key> + <string>n</string> + <key>Module</key> + <string>PBXRunSessionModule</string> + <key>Name</key> + <string>Run Log</string> + </dict> + <dict> + <key>BundleLoadPath</key> + <string></string> + <key>MaxInstances</key> + <string>n</string> + <key>Module</key> + <string>PBXBookmarksModule</string> + <key>Name</key> + <string>Bookmarks Tool</string> + </dict> + <dict> + <key>BundleLoadPath</key> + <string></string> + <key>MaxInstances</key> + <string>n</string> + <key>Module</key> + <string>PBXClassBrowserModule</string> + <key>Name</key> + <string>Class Browser</string> + </dict> + <dict> + <key>BundleLoadPath</key> + <string></string> + <key>MaxInstances</key> + <string>n</string> + <key>Module</key> + <string>PBXCVSModule</string> + <key>Name</key> + <string>Source Code Control Tool</string> + </dict> + <dict> + <key>BundleLoadPath</key> + <string></string> + <key>MaxInstances</key> + <string>n</string> + <key>Module</key> + <string>PBXDebugBreakpointsModule</string> + <key>Name</key> + <string>Debug Breakpoints Tool</string> + </dict> + <dict> + <key>BundleLoadPath</key> + <string></string> + <key>MaxInstances</key> + <string>n</string> + <key>Module</key> + <string>XCDockableInspector</string> + <key>Name</key> + <string>Inspector</string> + </dict> + <dict> + <key>BundleLoadPath</key> + <string></string> + <key>MaxInstances</key> + <string>n</string> + <key>Module</key> + <string>PBXOpenQuicklyModule</string> + <key>Name</key> + <string>Open Quickly Tool</string> + </dict> + <dict> + <key>BundleLoadPath</key> + <string></string> + <key>MaxInstances</key> + <string>1</string> + <key>Module</key> + <string>PBXDebugSessionModule</string> + <key>Name</key> + <string>Debugger</string> + </dict> + <dict> + <key>BundleLoadPath</key> + <string></string> + <key>MaxInstances</key> + <string>1</string> + <key>Module</key> + <string>PBXDebugCLIModule</string> + <key>Name</key> + <string>Debug Console</string> + </dict> + </array> + <key>Description</key> + <string>AIODescriptionKey</string> + <key>DockingSystemVisible</key> + <false/> + <key>Extension</key> + <string>perspective</string> + <key>FavBarConfig</key> + <dict> + <key>PBXProjectModuleGUID</key> + <string>A1E70E750A38CA08007BE3E3</string> + <key>XCBarModuleItemNames</key> + <dict/> + <key>XCBarModuleItems</key> + <array/> + </dict> + <key>FirstTimeWindowDisplayed</key> + <false/> + <key>Identifier</key> + <string>com.apple.perspectives.project.default</string> + <key>MajorVersion</key> + <integer>33</integer> + <key>MinorVersion</key> + <integer>0</integer> + <key>Name</key> + <string>All-In-One</string> + <key>Notifications</key> + <array> + <dict> + <key>XCObserverAutoDisconnectKey</key> + <true/> + <key>XCObserverDefintionKey</key> + <dict/> + <key>XCObserverFactoryKey</key> + <string>XCPerspectivesSpecificationIdentifier</string> + <key>XCObserverGUIDKey</key> + <string>XCObserverProjectIdentifier</string> + <key>XCObserverNotificationKey</key> + <string>PBXStatusBuildStateMessageNotification</string> + <key>XCObserverTargetKey</key> + <string>XCMainBuildResultsModuleGUID</string> + <key>XCObserverTriggerKey</key> + <string>awakenModuleWithObserver:</string> + <key>XCObserverValidationKey</key> + <dict/> + </dict> + </array> + <key>OpenEditors</key> + <array/> + <key>PerspectiveWidths</key> + <array> + <integer>1340</integer> + <integer>1340</integer> + <integer>1340</integer> + </array> + <key>Perspectives</key> + <array> + <dict> + <key>ChosenToolbarItems</key> + <array> + <string>XCToolbarPerspectiveControl</string> + <string>NSToolbarSeparatorItem</string> + <string>active-target-popup</string> + <string>action</string> + <string>NSToolbarFlexibleSpaceItem</string> + <string>buildOrClean</string> + <string>build-and-runOrDebug</string> + <string>com.apple.ide.PBXToolbarStopButton</string> + <string>get-info</string> + <string>toggle-editor</string> + <string>NSToolbarFlexibleSpaceItem</string> + <string>com.apple.pbx.toolbar.searchfield</string> + </array> + <key>ControllerClassBaseName</key> + <string></string> + <key>IconName</key> + <string>WindowOfProject</string> + <key>Identifier</key> + <string>perspective.project</string> + <key>IsVertical</key> + <false/> + <key>Layout</key> + <array> + <dict> + <key>ContentConfiguration</key> + <dict> + <key>PBXBottomSmartGroupGIDs</key> + <array> + <string>1C37FBAC04509CD000000102</string> + <string>1C37FAAC04509CD000000102</string> + <string>1C08E77C0454961000C914BD</string> + <string>1C37FABC05509CD000000102</string> + <string>1C37FABC05539CD112110102</string> + <string>E2644B35053B69B200211256</string> + <string>1C37FABC04509CD000100104</string> + <string>1CC0EA4004350EF90044410B</string> + <string>1CC0EA4004350EF90041110B</string> + <string>1C77FABC04509CD000000102</string> + </array> + <key>PBXProjectModuleGUID</key> + <string>1CA23ED40692098700951B8B</string> + <key>PBXProjectModuleLabel</key> + <string>Files</string> + <key>PBXProjectStructureProvided</key> + <string>yes</string> + <key>PBXSmartGroupTreeModuleColumnData</key> + <dict> + <key>PBXSmartGroupTreeModuleColumnWidthsKey</key> + <array> + <real>268</real> + </array> + <key>PBXSmartGroupTreeModuleColumnsKey_v4</key> + <array> + <string>MainColumn</string> + </array> + </dict> + <key>PBXSmartGroupTreeModuleOutlineStateKey_v7</key> + <dict> + <key>PBXSmartGroupTreeModuleOutlineStateExpansionKey</key> + <array> + <string>08FB7794FE84155DC02AAC07</string> + <string>A1E70CFF0A38B5BB007BE3E3</string> + <string>A1E70D110A38B5BB007BE3E3</string> + <string>A1E70D7E0A38BAC5007BE3E3</string> + <string>A1E70D180A38B5BB007BE3E3</string> + <string>A1E70D270A38B5BB007BE3E3</string> + <string>A1E70D2B0A38B5BB007BE3E3</string> + <string>A1E70D390A38B5BB007BE3E3</string> + <string>1C37FBAC04509CD000000102</string> + </array> + <key>PBXSmartGroupTreeModuleOutlineStateSelectionKey</key> + <array> + <array> + <integer>24</integer> + <integer>19</integer> + <integer>0</integer> + </array> + </array> + <key>PBXSmartGroupTreeModuleOutlineStateVisibleRectKey</key> + <string>{{0, 0}, {268, 841}}</string> + </dict> + <key>PBXTopSmartGroupGIDs</key> + <array/> + <key>XCIncludePerspectivesSwitch</key> + <false/> + </dict> + <key>GeometryConfiguration</key> + <dict> + <key>Frame</key> + <string>{{0, 0}, {285, 859}}</string> + <key>GroupTreeTableConfiguration</key> + <array> + <string>MainColumn</string> + <real>268</real> + </array> + <key>RubberWindowFrame</key> + <string>170 278 1340 900 0 0 1920 1178 </string> + </dict> + <key>Module</key> + <string>PBXSmartGroupTreeModule</string> + <key>Proportion</key> + <string>285pt</string> + </dict> + <dict> + <key>Dock</key> + <array> + <dict> + <key>BecomeActive</key> + <true/> + <key>ContentConfiguration</key> + <dict> + <key>PBXProjectModuleGUID</key> + <string>A1E70DF50A38C765007BE3E3</string> + <key>PBXProjectModuleLabel</key> + <string>generic_lists.c</string> + <key>PBXSplitModuleInNavigatorKey</key> + <dict> + <key>Split0</key> + <dict> + <key>PBXProjectModuleGUID</key> + <string>A1E70DF60A38C765007BE3E3</string> + <key>PBXProjectModuleLabel</key> + <string>generic_lists.c</string> + <key>_historyCapacity</key> + <integer>0</integer> + <key>bookmark</key> + <string>A1E710F40A3A253F007BE3E3</string> + <key>history</key> + <array> + <string>A1E70DF90A38C765007BE3E3</string> + <string>A1E70DFA0A38C765007BE3E3</string> + <string>A1E70DFB0A38C765007BE3E3</string> + <string>A1E70E010A38C765007BE3E3</string> + <string>A1E70E020A38C765007BE3E3</string> + <string>A1E70E090A38C765007BE3E3</string> + <string>A1E70E0A0A38C765007BE3E3</string> + <string>A1E70E0B0A38C765007BE3E3</string> + <string>A1E70E0C0A38C765007BE3E3</string> + <string>A1E70E3D0A38C78C007BE3E3</string> + <string>A1E70E4A0A38C7BE007BE3E3</string> + <string>A1E70E520A38C9FD007BE3E3</string> + <string>A1E70E530A38C9FD007BE3E3</string> + <string>A1E70E770A38CA55007BE3E3</string> + <string>A1E70EB50A38CB4D007BE3E3</string> + <string>A1E70ED70A38CCB6007BE3E3</string> + <string>A1E70EFE0A38CD66007BE3E3</string> + <string>A1E70F0F0A38CE21007BE3E3</string> + <string>A1E70F9C0A38D41E007BE3E3</string> + <string>A1E70F9D0A38D41E007BE3E3</string> + <string>A1E70FC60A38D560007BE3E3</string> + <string>A1E70FD80A38D573007BE3E3</string> + <string>A1E70FFA0A38D806007BE3E3</string> + <string>A1E70FFC0A38D806007BE3E3</string> + <string>A1E7100C0A38D888007BE3E3</string> + <string>A1E7100D0A38D888007BE3E3</string> + <string>A1E710840A3A1CFB007BE3E3</string> + <string>A1E7108D0A3A1D06007BE3E3</string> + <string>A1E710930A3A1D22007BE3E3</string> + <string>A1E710940A3A1D22007BE3E3</string> + <string>A1E710BC0A3A2415007BE3E3</string> + <string>A1E710EA0A3A2521007BE3E3</string> + <string>A1E710EB0A3A2521007BE3E3</string> + <string>A1E710EC0A3A2521007BE3E3</string> + <string>A1E710D10A3A2456007BE3E3</string> + </array> + <key>prevStack</key> + <array> + <string>A1E70E100A38C765007BE3E3</string> + <string>A1E70E110A38C765007BE3E3</string> + <string>A1E70E120A38C765007BE3E3</string> + <string>A1E70E130A38C765007BE3E3</string> + <string>A1E70E140A38C765007BE3E3</string> + <string>A1E70E150A38C765007BE3E3</string> + <string>A1E70E160A38C765007BE3E3</string> + <string>A1E70E180A38C765007BE3E3</string> + <string>A1E70E1B0A38C765007BE3E3</string> + <string>A1E70E1E0A38C765007BE3E3</string> + <string>A1E70E1F0A38C765007BE3E3</string> + <string>A1E70E200A38C765007BE3E3</string> + <string>A1E70E250A38C765007BE3E3</string> + <string>A1E70E260A38C765007BE3E3</string> + <string>A1E70E290A38C765007BE3E3</string> + <string>A1E70E2A0A38C765007BE3E3</string> + <string>A1E70E2B0A38C765007BE3E3</string> + <string>A1E70E2D0A38C765007BE3E3</string> + <string>A1E70E2E0A38C765007BE3E3</string> + <string>A1E70E380A38C778007BE3E3</string> + <string>A1E70E410A38C78C007BE3E3</string> + <string>A1E70E450A38C791007BE3E3</string> + <string>A1E70E560A38C9FD007BE3E3</string> + <string>A1E70E580A38C9FD007BE3E3</string> + <string>A1E70E6F0A38CA08007BE3E3</string> + <string>A1E70E7D0A38CA55007BE3E3</string> + <string>A1E70EAB0A38CB24007BE3E3</string> + <string>A1E70EC30A38CC14007BE3E3</string> + <string>A1E70EE20A38CCD6007BE3E3</string> + <string>A1E70FFF0A38D806007BE3E3</string> + <string>A1E710110A38D888007BE3E3</string> + <string>A1E710140A38D888007BE3E3</string> + <string>A1E710BE0A3A2415007BE3E3</string> + <string>A1E710C80A3A2441007BE3E3</string> + <string>A1E710D30A3A2456007BE3E3</string> + <string>A1E710E10A3A247D007BE3E3</string> + <string>A1E710E20A3A247D007BE3E3</string> + <string>A1E710ED0A3A2521007BE3E3</string> + <string>A1E710EE0A3A2521007BE3E3</string> + <string>A1E710EF0A3A2521007BE3E3</string> + </array> + </dict> + <key>SplitCount</key> + <string>1</string> + </dict> + <key>StatusBarVisibility</key> + <true/> + <key>XCSharingToken</key> + <string>com.apple.Xcode.CommonNavigatorGroupSharingToken</string> + </dict> + <key>GeometryConfiguration</key> + <dict> + <key>Frame</key> + <string>{{0, 0}, {1050, 553}}</string> + <key>RubberWindowFrame</key> + <string>170 278 1340 900 0 0 1920 1178 </string> + </dict> + <key>Module</key> + <string>PBXNavigatorGroup</string> + <key>Proportion</key> + <string>553pt</string> + </dict> + <dict> + <key>Proportion</key> + <string>301pt</string> + <key>Tabs</key> + <array> + <dict> + <key>ContentConfiguration</key> + <dict> + <key>PBXProjectModuleGUID</key> + <string>1CA23EDF0692099D00951B8B</string> + <key>PBXProjectModuleLabel</key> + <string>Detail</string> + </dict> + <key>GeometryConfiguration</key> + <dict> + <key>Frame</key> + <string>{{10, 27}, {1050, 274}}</string> + <key>RubberWindowFrame</key> + <string>170 278 1340 900 0 0 1920 1178 </string> + </dict> + <key>Module</key> + <string>XCDetailModule</string> + </dict> + <dict> + <key>ContentConfiguration</key> + <dict> + <key>PBXProjectModuleGUID</key> + <string>1CA23EE00692099D00951B8B</string> + <key>PBXProjectModuleLabel</key> + <string>Project Find</string> + </dict> + <key>GeometryConfiguration</key> + <dict> + <key>Frame</key> + <string>{{10, 27}, {1050, 274}}</string> + </dict> + <key>Module</key> + <string>PBXProjectFindModule</string> + </dict> + <dict> + <key>ContentConfiguration</key> + <dict> + <key>PBXProjectModuleGUID</key> + <string>1CA23EE10692099D00951B8B</string> + <key>PBXProjectModuleLabel</key> + <string>SCM Results</string> + </dict> + <key>GeometryConfiguration</key> + <dict> + <key>Frame</key> + <string>{{10, 31}, {603, 297}}</string> + </dict> + <key>Module</key> + <string>PBXCVSModule</string> + </dict> + </array> + </dict> + </array> + <key>Proportion</key> + <string>1050pt</string> + </dict> + </array> + <key>Name</key> + <string>Project</string> + <key>ServiceClasses</key> + <array> + <string>XCModuleDock</string> + <string>PBXSmartGroupTreeModule</string> + <string>XCModuleDock</string> + <string>PBXNavigatorGroup</string> + <string>XCDockableTabModule</string> + <string>XCDetailModule</string> + <string>PBXProjectFindModule</string> + <string>PBXCVSModule</string> + </array> + <key>TableOfContents</key> + <array> + <string>A1E710B00A3A22FE007BE3E3</string> + <string>1CA23ED40692098700951B8B</string> + <string>A1E710B10A3A22FE007BE3E3</string> + <string>A1E70DF50A38C765007BE3E3</string> + <string>A1E710B20A3A22FE007BE3E3</string> + <string>1CA23EDF0692099D00951B8B</string> + <string>1CA23EE00692099D00951B8B</string> + <string>1CA23EE10692099D00951B8B</string> + </array> + <key>ToolbarConfiguration</key> + <string>xcode.toolbar.config.default</string> + </dict> + <dict> + <key>ChosenToolbarItems</key> + <array> + <string>XCToolbarPerspectiveControl</string> + <string>NSToolbarSeparatorItem</string> + <string>active-target-popup</string> + <string>active-executable-popup</string> + <string>active-buildstyle-popup</string> + <string>NSToolbarFlexibleSpaceItem</string> + <string>build</string> + <string>clean</string> + <string>NSToolbarSeparatorItem</string> + <string>run</string> + <string>debug</string> + </array> + <key>ControllerClassBaseName</key> + <string></string> + <key>IconName</key> + <string>BuildTabIcon</string> + <key>Identifier</key> + <string>perspective.build</string> + <key>IsVertical</key> + <false/> + <key>Layout</key> + <array> + <dict> + <key>ContentConfiguration</key> + <dict> + <key>PBXBottomSmartGroupGIDs</key> + <array/> + <key>PBXProjectModuleGUID</key> + <string>1CA23EE50692099D00951B8B</string> + <key>PBXProjectModuleLabel</key> + <string>Files</string> + <key>PBXProjectStructureProvided</key> + <string>yes</string> + <key>PBXSmartGroupTreeModuleColumnData</key> + <dict> + <key>PBXSmartGroupTreeModuleColumnWidthsKey</key> + <array> + <real>184</real> + </array> + <key>PBXSmartGroupTreeModuleColumnsKey_v4</key> + <array> + <string>MainColumn</string> + </array> + </dict> + <key>PBXSmartGroupTreeModuleOutlineStateKey_v7</key> + <dict> + <key>PBXSmartGroupTreeModuleOutlineStateExpansionKey</key> + <array/> + <key>PBXSmartGroupTreeModuleOutlineStateSelectionKey</key> + <array> + <array> + <integer>0</integer> + </array> + </array> + <key>PBXSmartGroupTreeModuleOutlineStateVisibleRectKey</key> + <string>{{0, 0}, {184, 841}}</string> + </dict> + <key>PBXTopSmartGroupGIDs</key> + <array/> + <key>XCIncludePerspectivesSwitch</key> + <false/> + </dict> + <key>GeometryConfiguration</key> + <dict> + <key>Frame</key> + <string>{{0, 0}, {201, 859}}</string> + <key>GroupTreeTableConfiguration</key> + <array> + <string>MainColumn</string> + <real>184</real> + </array> + </dict> + <key>Module</key> + <string>PBXSmartGroupTreeModule</string> + <key>Proportion</key> + <string>201pt</string> + </dict> + <dict> + <key>Dock</key> + <array> + <dict> + <key>ContentConfiguration</key> + <dict> + <key>PBXProjectModuleGUID</key> + <string>A1E70DF50A38C765007BE3E3</string> + <key>PBXProjectModuleLabel</key> + <string>CredentialsCache.h</string> + <key>PBXSplitModuleInNavigatorKey</key> + <dict> + <key>Split0</key> + <dict> + <key>PBXProjectModuleGUID</key> + <string>A1E70DF60A38C765007BE3E3</string> + <key>PBXProjectModuleLabel</key> + <string>CredentialsCache.h</string> + <key>_historyCapacity</key> + <integer>0</integer> + <key>bookmark</key> + <string>A1E710F50A3A253F007BE3E3</string> + <key>history</key> + <array> + <string>A1E70DF70A38C765007BE3E3</string> + <string>A1E70DF80A38C765007BE3E3</string> + <string>A1E70DF90A38C765007BE3E3</string> + <string>A1E70DFA0A38C765007BE3E3</string> + <string>A1E70DFB0A38C765007BE3E3</string> + <string>A1E70E010A38C765007BE3E3</string> + <string>A1E70E020A38C765007BE3E3</string> + <string>A1E70E060A38C765007BE3E3</string> + <string>A1E70E090A38C765007BE3E3</string> + <string>A1E70E0A0A38C765007BE3E3</string> + <string>A1E70E0B0A38C765007BE3E3</string> + <string>A1E70E0C0A38C765007BE3E3</string> + <string>A1E70E3D0A38C78C007BE3E3</string> + <string>A1E70E430A38C791007BE3E3</string> + <string>A1E70E770A38CA55007BE3E3</string> + <string>A1E70ECB0A38CC4C007BE3E3</string> + <string>A1E70F440A38D252007BE3E3</string> + <string>A1E70F450A38D252007BE3E3</string> + <string>A1E70F8B0A38D3B4007BE3E3</string> + <string>A1E70FC60A38D560007BE3E3</string> + <string>A1E70FC80A38D560007BE3E3</string> + <string>A1E70FC90A38D560007BE3E3</string> + <string>A1E70FEE0A38D7C0007BE3E3</string> + <string>A1E70FEF0A38D7C0007BE3E3</string> + <string>A1E70FF00A38D7C0007BE3E3</string> + <string>A1E70FFC0A38D806007BE3E3</string> + <string>A1E7100D0A38D888007BE3E3</string> + <string>A1E7103C0A38DE0B007BE3E3</string> + <string>A1E7105A0A39ED89007BE3E3</string> + <string>A1E710890A3A1D04007BE3E3</string> + <string>A1E7109C0A3A1D2B007BE3E3</string> + <string>A1E710CA0A3A244D007BE3E3</string> + <string>A1E710CB0A3A244D007BE3E3</string> + <string>A1E710D80A3A2465007BE3E3</string> + <string>A1E710E30A3A247D007BE3E3</string> + </array> + <key>prevStack</key> + <array> + <string>A1E70E100A38C765007BE3E3</string> + <string>A1E70E110A38C765007BE3E3</string> + <string>A1E70E120A38C765007BE3E3</string> + <string>A1E70E130A38C765007BE3E3</string> + <string>A1E70E140A38C765007BE3E3</string> + <string>A1E70E150A38C765007BE3E3</string> + <string>A1E70E160A38C765007BE3E3</string> + <string>A1E70E170A38C765007BE3E3</string> + <string>A1E70E180A38C765007BE3E3</string> + <string>A1E70E1E0A38C765007BE3E3</string> + <string>A1E70E1F0A38C765007BE3E3</string> + <string>A1E70E250A38C765007BE3E3</string> + <string>A1E70E260A38C765007BE3E3</string> + <string>A1E70E290A38C765007BE3E3</string> + <string>A1E70E2A0A38C765007BE3E3</string> + <string>A1E70E2B0A38C765007BE3E3</string> + <string>A1E70E2D0A38C765007BE3E3</string> + <string>A1E70E2E0A38C765007BE3E3</string> + <string>A1E70E380A38C778007BE3E3</string> + <string>A1E70E410A38C78C007BE3E3</string> + <string>A1E70E450A38C791007BE3E3</string> + <string>A1E70E560A38C9FD007BE3E3</string> + <string>A1E70E580A38C9FD007BE3E3</string> + <string>A1E70E7D0A38CA55007BE3E3</string> + <string>A1E70EAB0A38CB24007BE3E3</string> + <string>A1E70EC30A38CC14007BE3E3</string> + <string>A1E70EE20A38CCD6007BE3E3</string> + <string>A1E70FCD0A38D560007BE3E3</string> + <string>A1E70FFF0A38D806007BE3E3</string> + <string>A1E710140A38D888007BE3E3</string> + <string>A1E710400A38DE0B007BE3E3</string> + <string>A1E70E6F0A38CA08007BE3E3</string> + <string>A1E710CD0A3A244D007BE3E3</string> + <string>A1E710E20A3A247D007BE3E3</string> + </array> + </dict> + <key>SplitCount</key> + <string>1</string> + </dict> + <key>StatusBarVisibility</key> + <true/> + <key>XCSharingToken</key> + <string>com.apple.Xcode.CommonNavigatorGroupSharingToken</string> + </dict> + <key>GeometryConfiguration</key> + <dict> + <key>Frame</key> + <string>{{0, 0}, {1134, 480}}</string> + </dict> + <key>Module</key> + <string>PBXNavigatorGroup</string> + <key>Proportion</key> + <string>480pt</string> + </dict> + <dict> + <key>Proportion</key> + <string>374pt</string> + <key>Tabs</key> + <array> + <dict> + <key>ContentConfiguration</key> + <dict> + <key>PBXProjectModuleGUID</key> + <string>XCMainBuildResultsModuleGUID</string> + <key>PBXProjectModuleLabel</key> + <string>Build</string> + <key>XCBuildResultsTrigger_Collapse</key> + <integer>1021</integer> + <key>XCBuildResultsTrigger_Open</key> + <integer>1010</integer> + </dict> + <key>GeometryConfiguration</key> + <dict> + <key>Frame</key> + <string>{{10, 27}, {1134, 347}}</string> + </dict> + <key>Module</key> + <string>PBXBuildResultsModule</string> + </dict> + <dict> + <key>ContentConfiguration</key> + <dict> + <key>LauncherConfigVersion</key> + <string>3</string> + <key>PBXProjectModuleGUID</key> + <string>1CA23EE80692099D00951B8B</string> + <key>PBXProjectModuleLabel</key> + <string>Run</string> + <key>Runner</key> + <dict> + <key>HorizontalSplitView</key> + <dict> + <key>_collapsingFrameDimension</key> + <real>0.0</real> + <key>_indexOfCollapsedView</key> + <integer>0</integer> + <key>_percentageOfCollapsedView</key> + <real>0.0</real> + <key>isCollapsed</key> + <string>yes</string> + <key>sizes</key> + <array> + <string>{{0, 0}, {365, 167}}</string> + <string>{{0, 176}, {365, 267}}</string> + </array> + </dict> + <key>VerticalSplitView</key> + <dict> + <key>_collapsingFrameDimension</key> + <real>0.0</real> + <key>_indexOfCollapsedView</key> + <integer>0</integer> + <key>_percentageOfCollapsedView</key> + <real>0.0</real> + <key>isCollapsed</key> + <string>yes</string> + <key>sizes</key> + <array> + <string>{{0, 0}, {405, 443}}</string> + <string>{{414, 0}, {514, 443}}</string> + </array> + </dict> + </dict> + </dict> + <key>GeometryConfiguration</key> + <dict> + <key>Frame</key> + <string>{{0, 0}, {0, 0}}</string> + </dict> + <key>Module</key> + <string>PBXRunSessionModule</string> + </dict> + </array> + </dict> + </array> + <key>Proportion</key> + <string>1134pt</string> + </dict> + </array> + <key>Name</key> + <string>Build</string> + <key>ServiceClasses</key> + <array> + <string>XCModuleDock</string> + <string>PBXSmartGroupTreeModule</string> + <string>XCModuleDock</string> + <string>PBXNavigatorGroup</string> + <string>XCDockableTabModule</string> + <string>PBXBuildResultsModule</string> + <string>PBXRunSessionModule</string> + <string>XCConsole</string> + </array> + <key>TableOfContents</key> + <array> + <string>A1E710B40A3A22FF007BE3E3</string> + <string>1CA23EE50692099D00951B8B</string> + <string>A1E710B50A3A22FF007BE3E3</string> + <string>A1E70DF50A38C765007BE3E3</string> + <string>A1E710B60A3A22FF007BE3E3</string> + <string>XCMainBuildResultsModuleGUID</string> + <string>1CA23EE80692099D00951B8B</string> + <string>A1E710B70A3A22FF007BE3E3</string> + </array> + <key>ToolbarConfiguration</key> + <string>xcode.toolbar.config.buildAndRun</string> + </dict> + <dict> + <key>ChosenToolbarItems</key> + <array> + <string>XCToolbarPerspectiveControl</string> + <string>NSToolbarSeparatorItem</string> + <string>build-and-debug</string> + <string>debug</string> + <string>NSToolbarFlexibleSpaceItem</string> + <string>debugger-fix-and-continue</string> + <string>debugger-restart-executable</string> + <string>debugger-pause</string> + <string>debugger-continue</string> + <string>debugger-step-over</string> + <string>debugger-step-into</string> + <string>debugger-step-out</string> + <string>debugger-step-instruction</string> + <string>NSToolbarFlexibleSpaceItem</string> + </array> + <key>ControllerClassBaseName</key> + <string>PBXDebugSessionModule</string> + <key>IconName</key> + <string>DebugTabIcon</string> + <key>Identifier</key> + <string>perspective.debug</string> + <key>IsVertical</key> + <integer>1</integer> + <key>Layout</key> + <array> + <dict> + <key>ContentConfiguration</key> + <dict> + <key>PBXProjectModuleGUID</key> + <string>1CCC7628064C1048000F2A68</string> + <key>PBXProjectModuleLabel</key> + <string>Debugger Console</string> + </dict> + <key>GeometryConfiguration</key> + <dict> + <key>Frame</key> + <string>{{0, 0}, {810, 0}}</string> + </dict> + <key>Module</key> + <string>PBXDebugCLIModule</string> + <key>Proportion</key> + <string>0%</string> + </dict> + <dict> + <key>ContentConfiguration</key> + <dict> + <key>Debugger</key> + <dict> + <key>HorizontalSplitView</key> + <dict> + <key>_collapsingFrameDimension</key> + <real>0.0</real> + <key>_indexOfCollapsedView</key> + <integer>0</integer> + <key>_percentageOfCollapsedView</key> + <real>0.0</real> + <key>isCollapsed</key> + <string>yes</string> + <key>sizes</key> + <array> + <string>{{0, 0}, {395, 213}}</string> + <string>{{395, 0}, {415, 213}}</string> + </array> + </dict> + <key>VerticalSplitView</key> + <dict> + <key>_collapsingFrameDimension</key> + <real>0.0</real> + <key>_indexOfCollapsedView</key> + <integer>0</integer> + <key>_percentageOfCollapsedView</key> + <real>0.0</real> + <key>isCollapsed</key> + <string>yes</string> + <key>sizes</key> + <array> + <string>{{0, 0}, {810, 213}}</string> + <string>{{0, 213}, {810, 225}}</string> + </array> + </dict> + </dict> + <key>LauncherConfigVersion</key> + <string>8</string> + <key>PBXProjectModuleGUID</key> + <string>1CCC7629064C1048000F2A68</string> + <key>PBXProjectModuleLabel</key> + <string>Debug</string> + </dict> + <key>GeometryConfiguration</key> + <dict> + <key>DebugConsoleDrawerSize</key> + <string>{100, 120}</string> + <key>DebugConsoleVisible</key> + <string>None</string> + <key>DebugConsoleWindowFrame</key> + <string>{{200, 200}, {500, 300}}</string> + <key>DebugSTDIOWindowFrame</key> + <string>{{200, 200}, {500, 300}}</string> + <key>Frame</key> + <string>{{0, 7}, {810, 438}}</string> + </dict> + <key>Module</key> + <string>PBXDebugSessionModule</string> + <key>Proportion</key> + <string>443pt</string> + </dict> + </array> + <key>Name</key> + <string>Debug</string> + <key>ServiceClasses</key> + <array> + <string>XCModuleDock</string> + <string>XCModuleDock</string> + <string>PBXDebugCLIModule</string> + <string>PBXDebugSessionModule</string> + <string>XCConsole</string> + </array> + <key>TableOfContents</key> + <array> + <string>1CC8E6A5069209BD00BB180A</string> + <string>1CC8E6A6069209BD00BB180A</string> + <string>1CCC7628064C1048000F2A68</string> + <string>1CCC7629064C1048000F2A68</string> + <string>1CC8E6A7069209BD00BB180A</string> + </array> + <key>ToolbarConfiguration</key> + <string>xcode.toolbar.config.debug</string> + </dict> + </array> + <key>PerspectivesBarVisible</key> + <true/> + <key>ShelfIsVisible</key> + <false/> + <key>SourceDescription</key> + <string>file at '/System/Library/PrivateFrameworks/DevToolsInterface.framework/Versions/A/Resources/XCPerspectivesSpecification.xcperspec'</string> + <key>StatusbarIsVisible</key> + <true/> + <key>TimeStamp</key> + <real>171582783.00723499</real> + <key>ToolbarDisplayMode</key> + <integer>1</integer> + <key>ToolbarIsVisible</key> + <true/> + <key>ToolbarSizeMode</key> + <integer>1</integer> + <key>Type</key> + <string>Perspectives</string> + <key>UpdateMessage</key> + <string></string> + <key>WindowJustification</key> + <integer>5</integer> + <key>WindowOrderList</key> + <array> + <string>/Volumes/Ra-Tilt/Users/lxs/KfM/CCAPI/src/lib/ccapi/mac/CCAPI.xcodeproj</string> + </array> + <key>WindowString</key> + <string>170 278 1340 900 0 0 1920 1178 </string> + <key>WindowTools</key> + <array> + <dict> + <key>Identifier</key> + <string>windowTool.find</string> + <key>Layout</key> + <array> + <dict> + <key>Dock</key> + <array> + <dict> + <key>Dock</key> + <array> + <dict> + <key>ContentConfiguration</key> + <dict> + <key>PBXProjectModuleGUID</key> + <string>1CDD528C0622207200134675</string> + <key>PBXProjectModuleLabel</key> + <string><No Editor></string> + <key>PBXSplitModuleInNavigatorKey</key> + <dict> + <key>Split0</key> + <dict> + <key>PBXProjectModuleGUID</key> + <string>1CD0528D0623707200166675</string> + </dict> + <key>SplitCount</key> + <string>1</string> + </dict> + <key>StatusBarVisibility</key> + <integer>1</integer> + </dict> + <key>GeometryConfiguration</key> + <dict> + <key>Frame</key> + <string>{{0, 0}, {781, 167}}</string> + <key>RubberWindowFrame</key> + <string>62 385 781 470 0 0 1440 878 </string> + </dict> + <key>Module</key> + <string>PBXNavigatorGroup</string> + <key>Proportion</key> + <string>781pt</string> + </dict> + </array> + <key>Proportion</key> + <string>50%</string> + </dict> + <dict> + <key>BecomeActive</key> + <integer>1</integer> + <key>ContentConfiguration</key> + <dict> + <key>PBXProjectModuleGUID</key> + <string>1CD0528E0623707200166675</string> + <key>PBXProjectModuleLabel</key> + <string>Project Find</string> + </dict> + <key>GeometryConfiguration</key> + <dict> + <key>Frame</key> + <string>{{8, 0}, {773, 254}}</string> + <key>RubberWindowFrame</key> + <string>62 385 781 470 0 0 1440 878 </string> + </dict> + <key>Module</key> + <string>PBXProjectFindModule</string> + <key>Proportion</key> + <string>50%</string> + </dict> + </array> + <key>Proportion</key> + <string>428pt</string> + </dict> + </array> + <key>Name</key> + <string>Project Find</string> + <key>ServiceClasses</key> + <array> + <string>PBXProjectFindModule</string> + </array> + <key>StatusbarIsVisible</key> + <integer>1</integer> + <key>TableOfContents</key> + <array> + <string>1C530D57069F1CE1000CFCEE</string> + <string>1C530D58069F1CE1000CFCEE</string> + <string>1C530D59069F1CE1000CFCEE</string> + <string>1CDD528C0622207200134675</string> + <string>1C530D5A069F1CE1000CFCEE</string> + <string>1CE0B1FE06471DED0097A5F4</string> + <string>1CD0528E0623707200166675</string> + </array> + <key>WindowString</key> + <string>62 385 781 470 0 0 1440 878 </string> + <key>WindowToolGUID</key> + <string>1C530D57069F1CE1000CFCEE</string> + <key>WindowToolIsVisible</key> + <integer>0</integer> + </dict> + <dict> + <key>Identifier</key> + <string>windowTool.run</string> + <key>Layout</key> + <array> + <dict> + <key>Dock</key> + <array> + <dict> + <key>ContentConfiguration</key> + <dict> + <key>LauncherConfigVersion</key> + <string>3</string> + <key>PBXProjectModuleGUID</key> + <string>1CD0528B0623707200166675</string> + <key>PBXProjectModuleLabel</key> + <string>Run - cocoapp112 - cocoapp112</string> + <key>Runner</key> + <dict> + <key>HorizontalSplitView</key> + <dict> + <key>_collapsingFrameDimension</key> + <real>0.0</real> + <key>_indexOfCollapsedView</key> + <integer>0</integer> + <key>_percentageOfCollapsedView</key> + <real>0.0</real> + <key>isCollapsed</key> + <string>yes</string> + <key>sizes</key> + <array> + <string>{{0, 0}, {365, 167}}</string> + <string>{{0, 176}, {365, 267}}</string> + </array> + </dict> + <key>VerticalSplitView</key> + <dict> + <key>_collapsingFrameDimension</key> + <real>0.0</real> + <key>_indexOfCollapsedView</key> + <integer>0</integer> + <key>_percentageOfCollapsedView</key> + <real>0.0</real> + <key>isCollapsed</key> + <string>yes</string> + <key>sizes</key> + <array> + <string>{{0, 0}, {405, 443}}</string> + <string>{{414, 0}, {514, 443}}</string> + </array> + </dict> + </dict> + </dict> + <key>GeometryConfiguration</key> + <dict> + <key>Frame</key> + <string>{{0, 0}, {456, 192}}</string> + <key>RubberWindowFrame</key> + <string>741 130 456 234 0 0 1280 1002 </string> + </dict> + <key>Module</key> + <string>PBXRunSessionModule</string> + <key>Proportion</key> + <string>192pt</string> + </dict> + </array> + <key>Proportion</key> + <string>192pt</string> + </dict> + </array> + <key>Name</key> + <string>Run Log</string> + <key>ServiceClasses</key> + <array> + <string>PBXRunSessionModule</string> + </array> + <key>StatusbarIsVisible</key> + <integer>1</integer> + <key>TableOfContents</key> + <array> + <string>1C78EAAF065D492600B07095</string> + <string>1C78EAB0065D492600B07095</string> + <string>1CD0528B0623707200166675</string> + <string>1C78EAB1065D492600B07095</string> + </array> + <key>ToolbarConfiguration</key> + <string>xcode.toolbar.config.run</string> + <key>WindowString</key> + <string>741 130 456 234 0 0 1280 1002 </string> + </dict> + <dict> + <key>Identifier</key> + <string>windowTool.scm</string> + <key>Layout</key> + <array> + <dict> + <key>Dock</key> + <array> + <dict> + <key>ContentConfiguration</key> + <dict> + <key>PBXProjectModuleGUID</key> + <string>1C78EAB2065D492600B07095</string> + <key>PBXProjectModuleLabel</key> + <string><No Editor></string> + <key>PBXSplitModuleInNavigatorKey</key> + <dict> + <key>Split0</key> + <dict> + <key>PBXProjectModuleGUID</key> + <string>1C78EAB3065D492600B07095</string> + </dict> + <key>SplitCount</key> + <string>1</string> + </dict> + <key>StatusBarVisibility</key> + <integer>1</integer> + </dict> + <key>GeometryConfiguration</key> + <dict> + <key>Frame</key> + <string>{{0, 0}, {452, 0}}</string> + <key>RubberWindowFrame</key> + <string>743 379 452 308 0 0 1280 1002 </string> + </dict> + <key>Module</key> + <string>PBXNavigatorGroup</string> + <key>Proportion</key> + <string>0pt</string> + </dict> + <dict> + <key>BecomeActive</key> + <integer>1</integer> + <key>ContentConfiguration</key> + <dict> + <key>PBXProjectModuleGUID</key> + <string>1CD052920623707200166675</string> + <key>PBXProjectModuleLabel</key> + <string>SCM</string> + </dict> + <key>GeometryConfiguration</key> + <dict> + <key>ConsoleFrame</key> + <string>{{0, 259}, {452, 0}}</string> + <key>Frame</key> + <string>{{0, 7}, {452, 259}}</string> + <key>RubberWindowFrame</key> + <string>743 379 452 308 0 0 1280 1002 </string> + <key>TableConfiguration</key> + <array> + <string>Status</string> + <real>30</real> + <string>FileName</string> + <real>199</real> + <string>Path</string> + <real>197.09500122070312</real> + </array> + <key>TableFrame</key> + <string>{{0, 0}, {452, 250}}</string> + </dict> + <key>Module</key> + <string>PBXCVSModule</string> + <key>Proportion</key> + <string>262pt</string> + </dict> + </array> + <key>Proportion</key> + <string>266pt</string> + </dict> + </array> + <key>Name</key> + <string>SCM</string> + <key>ServiceClasses</key> + <array> + <string>PBXCVSModule</string> + </array> + <key>StatusbarIsVisible</key> + <integer>1</integer> + <key>TableOfContents</key> + <array> + <string>1C78EAB4065D492600B07095</string> + <string>1C78EAB5065D492600B07095</string> + <string>1C78EAB2065D492600B07095</string> + <string>1CD052920623707200166675</string> + </array> + <key>ToolbarConfiguration</key> + <string>xcode.toolbar.config.scm</string> + <key>WindowString</key> + <string>743 379 452 308 0 0 1280 1002 </string> + </dict> + <dict> + <key>Identifier</key> + <string>windowTool.breakpoints</string> + <key>IsVertical</key> + <integer>0</integer> + <key>Layout</key> + <array> + <dict> + <key>Dock</key> + <array> + <dict> + <key>BecomeActive</key> + <integer>1</integer> + <key>ContentConfiguration</key> + <dict> + <key>PBXBottomSmartGroupGIDs</key> + <array> + <string>1C77FABC04509CD000000102</string> + </array> + <key>PBXProjectModuleGUID</key> + <string>1CE0B1FE06471DED0097A5F4</string> + <key>PBXProjectModuleLabel</key> + <string>Files</string> + <key>PBXProjectStructureProvided</key> + <string>no</string> + <key>PBXSmartGroupTreeModuleColumnData</key> + <dict> + <key>PBXSmartGroupTreeModuleColumnWidthsKey</key> + <array> + <real>168</real> + </array> + <key>PBXSmartGroupTreeModuleColumnsKey_v4</key> + <array> + <string>MainColumn</string> + </array> + </dict> + <key>PBXSmartGroupTreeModuleOutlineStateKey_v7</key> + <dict> + <key>PBXSmartGroupTreeModuleOutlineStateExpansionKey</key> + <array> + <string>1C77FABC04509CD000000102</string> + </array> + <key>PBXSmartGroupTreeModuleOutlineStateSelectionKey</key> + <array> + <array> + <integer>0</integer> + </array> + </array> + <key>PBXSmartGroupTreeModuleOutlineStateVisibleRectKey</key> + <string>{{0, 0}, {168, 350}}</string> + </dict> + <key>PBXTopSmartGroupGIDs</key> + <array/> + <key>XCIncludePerspectivesSwitch</key> + <integer>0</integer> + </dict> + <key>GeometryConfiguration</key> + <dict> + <key>Frame</key> + <string>{{0, 0}, {185, 368}}</string> + <key>GroupTreeTableConfiguration</key> + <array> + <string>MainColumn</string> + <real>168</real> + </array> + <key>RubberWindowFrame</key> + <string>315 424 744 409 0 0 1440 878 </string> + </dict> + <key>Module</key> + <string>PBXSmartGroupTreeModule</string> + <key>Proportion</key> + <string>185pt</string> + </dict> + <dict> + <key>ContentConfiguration</key> + <dict> + <key>PBXProjectModuleGUID</key> + <string>1CA1AED706398EBD00589147</string> + <key>PBXProjectModuleLabel</key> + <string>Detail</string> + </dict> + <key>GeometryConfiguration</key> + <dict> + <key>Frame</key> + <string>{{190, 0}, {554, 368}}</string> + <key>RubberWindowFrame</key> + <string>315 424 744 409 0 0 1440 878 </string> + </dict> + <key>Module</key> + <string>XCDetailModule</string> + <key>Proportion</key> + <string>554pt</string> + </dict> + </array> + <key>Proportion</key> + <string>368pt</string> + </dict> + </array> + <key>MajorVersion</key> + <integer>2</integer> + <key>MinorVersion</key> + <integer>0</integer> + <key>Name</key> + <string>Breakpoints</string> + <key>ServiceClasses</key> + <array> + <string>PBXSmartGroupTreeModule</string> + <string>XCDetailModule</string> + </array> + <key>StatusbarIsVisible</key> + <integer>1</integer> + <key>TableOfContents</key> + <array> + <string>1CDDB66807F98D9800BB5817</string> + <string>1CDDB66907F98D9800BB5817</string> + <string>1CE0B1FE06471DED0097A5F4</string> + <string>1CA1AED706398EBD00589147</string> + </array> + <key>ToolbarConfiguration</key> + <string>xcode.toolbar.config.breakpoints</string> + <key>WindowString</key> + <string>315 424 744 409 0 0 1440 878 </string> + <key>WindowToolGUID</key> + <string>1CDDB66807F98D9800BB5817</string> + <key>WindowToolIsVisible</key> + <integer>1</integer> + </dict> + <dict> + <key>Identifier</key> + <string>windowTool.debugAnimator</string> + <key>Layout</key> + <array> + <dict> + <key>Dock</key> + <array> + <dict> + <key>Module</key> + <string>PBXNavigatorGroup</string> + <key>Proportion</key> + <string>100%</string> + </dict> + </array> + <key>Proportion</key> + <string>100%</string> + </dict> + </array> + <key>Name</key> + <string>Debug Visualizer</string> + <key>ServiceClasses</key> + <array> + <string>PBXNavigatorGroup</string> + </array> + <key>StatusbarIsVisible</key> + <integer>1</integer> + <key>ToolbarConfiguration</key> + <string>xcode.toolbar.config.debugAnimator</string> + <key>WindowString</key> + <string>100 100 700 500 0 0 1280 1002 </string> + </dict> + <dict> + <key>Identifier</key> + <string>windowTool.bookmarks</string> + <key>Layout</key> + <array> + <dict> + <key>Dock</key> + <array> + <dict> + <key>Module</key> + <string>PBXBookmarksModule</string> + <key>Proportion</key> + <string>166pt</string> + </dict> + </array> + <key>Proportion</key> + <string>166pt</string> + </dict> + </array> + <key>Name</key> + <string>Bookmarks</string> + <key>ServiceClasses</key> + <array> + <string>PBXBookmarksModule</string> + </array> + <key>StatusbarIsVisible</key> + <integer>0</integer> + <key>WindowString</key> + <string>538 42 401 187 0 0 1280 1002 </string> + </dict> + <dict> + <key>Identifier</key> + <string>windowTool.classBrowser</string> + <key>Layout</key> + <array> + <dict> + <key>Dock</key> + <array> + <dict> + <key>BecomeActive</key> + <integer>1</integer> + <key>ContentConfiguration</key> + <dict> + <key>OptionsSetName</key> + <string>Hierarchy, all classes</string> + <key>PBXProjectModuleGUID</key> + <string>1CA6456E063B45B4001379D8</string> + <key>PBXProjectModuleLabel</key> + <string>Class Browser - NSObject</string> + </dict> + <key>GeometryConfiguration</key> + <dict> + <key>ClassesFrame</key> + <string>{{0, 0}, {369, 96}}</string> + <key>ClassesTreeTableConfiguration</key> + <array> + <string>PBXClassNameColumnIdentifier</string> + <real>208</real> + <string>PBXClassBookColumnIdentifier</string> + <real>22</real> + </array> + <key>Frame</key> + <string>{{0, 0}, {616, 353}}</string> + <key>MembersFrame</key> + <string>{{0, 105}, {369, 395}}</string> + <key>MembersTreeTableConfiguration</key> + <array> + <string>PBXMemberTypeIconColumnIdentifier</string> + <real>22</real> + <string>PBXMemberNameColumnIdentifier</string> + <real>216</real> + <string>PBXMemberTypeColumnIdentifier</string> + <real>94</real> + <string>PBXMemberBookColumnIdentifier</string> + <real>22</real> + </array> + <key>PBXModuleWindowStatusBarHidden2</key> + <integer>1</integer> + <key>RubberWindowFrame</key> + <string>597 125 616 374 0 0 1280 1002 </string> + </dict> + <key>Module</key> + <string>PBXClassBrowserModule</string> + <key>Proportion</key> + <string>354pt</string> + </dict> + </array> + <key>Proportion</key> + <string>354pt</string> + </dict> + </array> + <key>Name</key> + <string>Class Browser</string> + <key>ServiceClasses</key> + <array> + <string>PBXClassBrowserModule</string> + </array> + <key>StatusbarIsVisible</key> + <integer>0</integer> + <key>TableOfContents</key> + <array> + <string>1C78EABA065D492600B07095</string> + <string>1C78EABB065D492600B07095</string> + <string>1CA6456E063B45B4001379D8</string> + </array> + <key>ToolbarConfiguration</key> + <string>xcode.toolbar.config.classbrowser</string> + <key>WindowString</key> + <string>597 125 616 374 0 0 1280 1002 </string> + </dict> + </array> +</dict> +</plist> diff --git a/src/lib/ccapi/mac/CCAPI.xcodeproj/project.pbxproj b/src/lib/ccapi/mac/CCAPI.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..38a73b4c96 --- /dev/null +++ b/src/lib/ccapi/mac/CCAPI.xcodeproj/project.pbxproj @@ -0,0 +1,599 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 42; + objects = { + +/* Begin PBXBuildFile section */ + A1E70D480A38B5D5007BE3E3 /* cacheapi.c in Sources */ = {isa = PBXBuildFile; fileRef = A1E70D000A38B5BB007BE3E3 /* cacheapi.c */; }; + A1E70D490A38B5D5007BE3E3 /* ccache.c in Sources */ = {isa = PBXBuildFile; fileRef = A1E70D010A38B5BB007BE3E3 /* ccache.c */; }; + A1E70D4A0A38B5D5007BE3E3 /* ccache_iterator.c in Sources */ = {isa = PBXBuildFile; fileRef = A1E70D030A38B5BB007BE3E3 /* ccache_iterator.c */; }; + A1E70D4B0A38B5D5007BE3E3 /* ccapiv2.c in Sources */ = {isa = PBXBuildFile; fileRef = A1E70D050A38B5BB007BE3E3 /* ccapiv2.c */; }; + A1E70D4C0A38B5D5007BE3E3 /* ccstring.c in Sources */ = {isa = PBXBuildFile; fileRef = A1E70D060A38B5BB007BE3E3 /* ccstring.c */; }; + A1E70D4D0A38B5D5007BE3E3 /* context.c in Sources */ = {isa = PBXBuildFile; fileRef = A1E70D080A38B5BB007BE3E3 /* context.c */; }; + A1E70D4E0A38B5D5007BE3E3 /* credentials.c in Sources */ = {isa = PBXBuildFile; fileRef = A1E70D0A0A38B5BB007BE3E3 /* credentials.c */; }; + A1E70D4F0A38B5D5007BE3E3 /* credentials_iterator.c in Sources */ = {isa = PBXBuildFile; fileRef = A1E70D0C0A38B5BB007BE3E3 /* credentials_iterator.c */; }; + A1E70D510A38B60C007BE3E3 /* generic_lists.c in Sources */ = {isa = PBXBuildFile; fileRef = A1E70D120A38B5BB007BE3E3 /* generic_lists.c */; }; + A1E70D520A38B60C007BE3E3 /* marshall.c in Sources */ = {isa = PBXBuildFile; fileRef = A1E70D130A38B5BB007BE3E3 /* marshall.c */; }; + A1E70D530A38B60C007BE3E3 /* msg.c in Sources */ = {isa = PBXBuildFile; fileRef = A1E70D140A38B5BB007BE3E3 /* msg.c */; }; + A1E70D890A38BB47007BE3E3 /* ccs_ccache.c in Sources */ = {isa = PBXBuildFile; fileRef = A1E70D280A38B5BB007BE3E3 /* ccs_ccache.c */; }; + A1E70D8A0A38BB47007BE3E3 /* ccs_context.c in Sources */ = {isa = PBXBuildFile; fileRef = A1E70D290A38B5BB007BE3E3 /* ccs_context.c */; }; + A1E70D8B0A38BB47007BE3E3 /* ccs_lists.c in Sources */ = {isa = PBXBuildFile; fileRef = A1E70D2A0A38B5BB007BE3E3 /* ccs_lists.c */; }; + A1E70D8C0A38BB47007BE3E3 /* rpc_auth.c in Sources */ = {isa = PBXBuildFile; fileRef = A1E70D2E0A38B5BB007BE3E3 /* rpc_auth.c */; }; + A1E70D8D0A38BB47007BE3E3 /* serv_ops.c in Sources */ = {isa = PBXBuildFile; fileRef = A1E70D2F0A38B5BB007BE3E3 /* serv_ops.c */; }; + A1E70D8E0A38BB4F007BE3E3 /* generic_lists.c in Sources */ = {isa = PBXBuildFile; fileRef = A1E70D120A38B5BB007BE3E3 /* generic_lists.c */; }; + A1E70D8F0A38BB4F007BE3E3 /* marshall.c in Sources */ = {isa = PBXBuildFile; fileRef = A1E70D130A38B5BB007BE3E3 /* marshall.c */; }; + A1E70D900A38BB4F007BE3E3 /* msg.c in Sources */ = {isa = PBXBuildFile; fileRef = A1E70D140A38B5BB007BE3E3 /* msg.c */; }; + A1E70D9B0A38BBE2007BE3E3 /* main.c in Sources */ = {isa = PBXBuildFile; fileRef = A1E70D930A38BB67007BE3E3 /* main.c */; }; + A1E70D9F0A38BCAD007BE3E3 /* mig.defs in Sources */ = {isa = PBXBuildFile; fileRef = A1E70D9E0A38BCAD007BE3E3 /* mig.defs */; }; + A1E70DA00A38BCAD007BE3E3 /* mig.defs in Sources */ = {isa = PBXBuildFile; fileRef = A1E70D9E0A38BCAD007BE3E3 /* mig.defs */; settings = {ATTRIBUTES = (Server, ); }; }; + A1E70DEA0A38C710007BE3E3 /* kipc_client.c in Sources */ = {isa = PBXBuildFile; fileRef = A1E70DE40A38C6FD007BE3E3 /* kipc_client.c */; }; + A1E70DEB0A38C710007BE3E3 /* kipc_common.c in Sources */ = {isa = PBXBuildFile; fileRef = A1E70DE50A38C6FD007BE3E3 /* kipc_common.c */; }; + A1E70DEC0A38C710007BE3E3 /* kipc_session.c in Sources */ = {isa = PBXBuildFile; fileRef = A1E70DE70A38C6FD007BE3E3 /* kipc_session.c */; }; + A1E70DED0A38C71D007BE3E3 /* kipc_common.c in Sources */ = {isa = PBXBuildFile; fileRef = A1E70DE50A38C6FD007BE3E3 /* kipc_common.c */; }; + A1E70DEE0A38C71D007BE3E3 /* kipc_server.c in Sources */ = {isa = PBXBuildFile; fileRef = A1E70DE60A38C6FD007BE3E3 /* kipc_server.c */; }; + A1E70DEF0A38C71D007BE3E3 /* kipc_session.c in Sources */ = {isa = PBXBuildFile; fileRef = A1E70DE70A38C6FD007BE3E3 /* kipc_session.c */; }; + A1E70DF00A38C71D007BE3E3 /* notify.defs in Sources */ = {isa = PBXBuildFile; fileRef = A1E70DE80A38C6FD007BE3E3 /* notify.defs */; settings = {ATTRIBUTES = (Server, ); }; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + A1E70D000A38B5BB007BE3E3 /* cacheapi.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = cacheapi.c; sourceTree = "<group>"; }; + A1E70D010A38B5BB007BE3E3 /* ccache.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ccache.c; sourceTree = "<group>"; }; + A1E70D020A38B5BB007BE3E3 /* ccache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ccache.h; sourceTree = "<group>"; }; + A1E70D030A38B5BB007BE3E3 /* ccache_iterator.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ccache_iterator.c; sourceTree = "<group>"; }; + A1E70D040A38B5BB007BE3E3 /* ccache_iterator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ccache_iterator.h; sourceTree = "<group>"; }; + A1E70D050A38B5BB007BE3E3 /* ccapiv2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ccapiv2.c; sourceTree = "<group>"; }; + A1E70D060A38B5BB007BE3E3 /* ccstring.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ccstring.c; sourceTree = "<group>"; }; + A1E70D070A38B5BB007BE3E3 /* ccstring.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ccstring.h; sourceTree = "<group>"; }; + A1E70D080A38B5BB007BE3E3 /* context.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = context.c; sourceTree = "<group>"; }; + A1E70D090A38B5BB007BE3E3 /* context.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = context.h; sourceTree = "<group>"; }; + A1E70D0A0A38B5BB007BE3E3 /* credentials.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = credentials.c; sourceTree = "<group>"; }; + A1E70D0B0A38B5BB007BE3E3 /* credentials.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = credentials.h; sourceTree = "<group>"; }; + A1E70D0C0A38B5BB007BE3E3 /* credentials_iterator.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = credentials_iterator.c; sourceTree = "<group>"; }; + A1E70D0D0A38B5BB007BE3E3 /* credentials_iterator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = credentials_iterator.h; sourceTree = "<group>"; }; + A1E70D0F0A38B5BB007BE3E3 /* NTMakefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = NTMakefile; sourceTree = "<group>"; }; + A1E70D120A38B5BB007BE3E3 /* generic_lists.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = generic_lists.c; sourceTree = "<group>"; }; + A1E70D130A38B5BB007BE3E3 /* marshall.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = marshall.c; sourceTree = "<group>"; }; + A1E70D140A38B5BB007BE3E3 /* msg.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = msg.c; sourceTree = "<group>"; }; + A1E70D150A38B5BB007BE3E3 /* NTMakefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = NTMakefile; sourceTree = "<group>"; }; + A1E70D170A38B5BB007BE3E3 /* implementation-notes.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "implementation-notes.txt"; sourceTree = "<group>"; }; + A1E70D190A38B5BB007BE3E3 /* cc_rpc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cc_rpc.h; sourceTree = "<group>"; }; + A1E70D1A0A38B5BB007BE3E3 /* CredentialsCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CredentialsCache.h; sourceTree = "<group>"; }; + A1E70D1B0A38B5BB007BE3E3 /* CredentialsCache2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CredentialsCache2.h; sourceTree = "<group>"; }; + A1E70D1C0A38B5BB007BE3E3 /* datastore.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = datastore.h; sourceTree = "<group>"; }; + A1E70D1D0A38B5BB007BE3E3 /* generic_lists.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = generic_lists.h; sourceTree = "<group>"; }; + A1E70D1E0A38B5BB007BE3E3 /* marshall.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = marshall.h; sourceTree = "<group>"; }; + A1E70D1F0A38B5BB007BE3E3 /* msg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = msg.h; sourceTree = "<group>"; }; + A1E70D200A38B5BB007BE3E3 /* msg_headers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = msg_headers.h; sourceTree = "<group>"; }; + A1E70D210A38B5BB007BE3E3 /* rpc_auth.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rpc_auth.h; sourceTree = "<group>"; }; + A1E70D260A38B5BB007BE3E3 /* NTMakefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = NTMakefile; path = ../NTMakefile; sourceTree = SOURCE_ROOT; }; + A1E70D280A38B5BB007BE3E3 /* ccs_ccache.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ccs_ccache.c; sourceTree = "<group>"; }; + A1E70D290A38B5BB007BE3E3 /* ccs_context.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ccs_context.c; sourceTree = "<group>"; }; + A1E70D2A0A38B5BB007BE3E3 /* ccs_lists.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ccs_lists.c; sourceTree = "<group>"; }; + A1E70D2C0A38B5BB007BE3E3 /* main.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = main.c; sourceTree = "<group>"; }; + A1E70D2D0A38B5BB007BE3E3 /* NTMakefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = NTMakefile; sourceTree = "<group>"; }; + A1E70D2E0A38B5BB007BE3E3 /* rpc_auth.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = rpc_auth.c; sourceTree = "<group>"; }; + A1E70D2F0A38B5BB007BE3E3 /* serv_ops.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = serv_ops.c; sourceTree = "<group>"; }; + A1E70D300A38B5BB007BE3E3 /* serv_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = serv_ops.h; sourceTree = "<group>"; }; + A1E70D330A38B5BB007BE3E3 /* NTMakefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = NTMakefile; sourceTree = "<group>"; }; + A1E70D340A38B5BB007BE3E3 /* t_ccache.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = t_ccache.c; sourceTree = "<group>"; }; + A1E70D350A38B5BB007BE3E3 /* t_context.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = t_context.c; sourceTree = "<group>"; }; + A1E70D360A38B5BB007BE3E3 /* t_lists.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = t_lists.c; sourceTree = "<group>"; }; + A1E70D370A38B5BB007BE3E3 /* t_msg.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = t_msg.c; sourceTree = "<group>"; }; + A1E70D380A38B5BB007BE3E3 /* t_server.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = t_server.c; sourceTree = "<group>"; }; + A1E70D3A0A38B5BB007BE3E3 /* cacheapi.def */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = cacheapi.def; sourceTree = "<group>"; }; + A1E70D3B0A38B5BB007BE3E3 /* client.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = client.c; sourceTree = "<group>"; }; + A1E70D3C0A38B5BB007BE3E3 /* dllmain.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = dllmain.c; sourceTree = "<group>"; }; + A1E70D3D0A38B5BC007BE3E3 /* ntccrpc.acf */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = ntccrpc.acf; sourceTree = "<group>"; }; + A1E70D3E0A38B5BC007BE3E3 /* ntccrpc.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = ntccrpc.idl; sourceTree = "<group>"; }; + A1E70D3F0A38B5BC007BE3E3 /* NTMakefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = NTMakefile; sourceTree = "<group>"; }; + A1E70D410A38B5BC007BE3E3 /* client.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = client.c; sourceTree = "<group>"; }; + A1E70D420A38B5BC007BE3E3 /* cstest.acf */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = cstest.acf; sourceTree = "<group>"; }; + A1E70D430A38B5BC007BE3E3 /* cstest.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = cstest.idl; sourceTree = "<group>"; }; + A1E70D440A38B5BC007BE3E3 /* NTMakefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = NTMakefile; sourceTree = "<group>"; }; + A1E70D450A38B5BC007BE3E3 /* server.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = server.c; sourceTree = "<group>"; }; + A1E70D460A38B5BC007BE3E3 /* server.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = server.c; sourceTree = "<group>"; }; + A1E70D5D0A38B796007BE3E3 /* CCacheServer.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = CCacheServer.app; sourceTree = BUILT_PRODUCTS_DIR; }; + A1E70D910A38BB67007BE3E3 /* CCacheServer.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = CCacheServer.plist; sourceTree = "<group>"; }; + A1E70D920A38BB67007BE3E3 /* CCacheServerInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = CCacheServerInfo.plist; sourceTree = "<group>"; }; + A1E70D930A38BB67007BE3E3 /* main.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = main.c; sourceTree = "<group>"; }; + A1E70D9E0A38BCAD007BE3E3 /* mig.defs */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.mig; path = mig.defs; sourceTree = "<group>"; }; + A1E70DB10A38C01E007BE3E3 /* mig_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mig_types.h; sourceTree = "<group>"; }; + A1E70DE00A38C6FD007BE3E3 /* kipc_client.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = kipc_client.h; sourceTree = "<group>"; }; + A1E70DE10A38C6FD007BE3E3 /* kipc_common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = kipc_common.h; sourceTree = "<group>"; }; + A1E70DE20A38C6FD007BE3E3 /* kipc_server.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = kipc_server.h; sourceTree = "<group>"; }; + A1E70DE30A38C6FD007BE3E3 /* kipc_session.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = kipc_session.h; sourceTree = "<group>"; }; + A1E70DE40A38C6FD007BE3E3 /* kipc_client.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = kipc_client.c; sourceTree = "<group>"; }; + A1E70DE50A38C6FD007BE3E3 /* kipc_common.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = kipc_common.c; sourceTree = "<group>"; }; + A1E70DE60A38C6FD007BE3E3 /* kipc_server.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = kipc_server.c; sourceTree = "<group>"; }; + A1E70DE70A38C6FD007BE3E3 /* kipc_session.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = kipc_session.c; sourceTree = "<group>"; }; + A1E70DE80A38C6FD007BE3E3 /* notify.defs */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.mig; path = notify.defs; sourceTree = "<group>"; }; + A1E70DE90A38C6FD007BE3E3 /* README */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = README; sourceTree = "<group>"; }; + D2AAC046055464E500DB518D /* libCCAPI.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libCCAPI.a; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + A1E70D5B0A38B796007BE3E3 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + D289987405E68DCB004EDB86 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 08FB7794FE84155DC02AAC07 /* CCAPI */ = { + isa = PBXGroup; + children = ( + A1E70CFF0A38B5BB007BE3E3 /* client */, + A1E70D110A38B5BB007BE3E3 /* common */, + A1E70D160A38B5BB007BE3E3 /* doc */, + A1E70D180A38B5BB007BE3E3 /* include */, + A1E70D260A38B5BB007BE3E3 /* NTMakefile */, + A1E70D270A38B5BB007BE3E3 /* server */, + A1E70D320A38B5BB007BE3E3 /* unit-test */, + A1E70D390A38B5BB007BE3E3 /* windows */, + 1AB674ADFE9D54B511CA2CBB /* Products */, + ); + name = CCAPI; + sourceTree = "<group>"; + }; + 1AB674ADFE9D54B511CA2CBB /* Products */ = { + isa = PBXGroup; + children = ( + D2AAC046055464E500DB518D /* libCCAPI.a */, + A1E70D5D0A38B796007BE3E3 /* CCacheServer.app */, + ); + name = Products; + sourceTree = "<group>"; + }; + A1E70CFF0A38B5BB007BE3E3 /* client */ = { + isa = PBXGroup; + children = ( + A1E70D000A38B5BB007BE3E3 /* cacheapi.c */, + A1E70D010A38B5BB007BE3E3 /* ccache.c */, + A1E70D020A38B5BB007BE3E3 /* ccache.h */, + A1E70D030A38B5BB007BE3E3 /* ccache_iterator.c */, + A1E70D040A38B5BB007BE3E3 /* ccache_iterator.h */, + A1E70D050A38B5BB007BE3E3 /* ccapiv2.c */, + A1E70D060A38B5BB007BE3E3 /* ccstring.c */, + A1E70D070A38B5BB007BE3E3 /* ccstring.h */, + A1E70D080A38B5BB007BE3E3 /* context.c */, + A1E70D090A38B5BB007BE3E3 /* context.h */, + A1E70D0A0A38B5BB007BE3E3 /* credentials.c */, + A1E70D0B0A38B5BB007BE3E3 /* credentials.h */, + A1E70D0C0A38B5BB007BE3E3 /* credentials_iterator.c */, + A1E70D0D0A38B5BB007BE3E3 /* credentials_iterator.h */, + A1E70D0E0A38B5BB007BE3E3 /* mac */, + A1E70D0F0A38B5BB007BE3E3 /* NTMakefile */, + A1E70D100A38B5BB007BE3E3 /* windows */, + ); + name = client; + path = ../client; + sourceTree = SOURCE_ROOT; + }; + A1E70D0E0A38B5BB007BE3E3 /* mac */ = { + isa = PBXGroup; + children = ( + ); + path = mac; + sourceTree = "<group>"; + }; + A1E70D100A38B5BB007BE3E3 /* windows */ = { + isa = PBXGroup; + children = ( + ); + path = windows; + sourceTree = "<group>"; + }; + A1E70D110A38B5BB007BE3E3 /* common */ = { + isa = PBXGroup; + children = ( + A1E70D7E0A38BAC5007BE3E3 /* mac */, + A1E70D120A38B5BB007BE3E3 /* generic_lists.c */, + A1E70D130A38B5BB007BE3E3 /* marshall.c */, + A1E70D140A38B5BB007BE3E3 /* msg.c */, + A1E70D150A38B5BB007BE3E3 /* NTMakefile */, + ); + name = common; + path = ../common; + sourceTree = SOURCE_ROOT; + }; + A1E70D160A38B5BB007BE3E3 /* doc */ = { + isa = PBXGroup; + children = ( + A1E70D170A38B5BB007BE3E3 /* implementation-notes.txt */, + ); + name = doc; + path = ../doc; + sourceTree = SOURCE_ROOT; + }; + A1E70D180A38B5BB007BE3E3 /* include */ = { + isa = PBXGroup; + children = ( + A1E70D190A38B5BB007BE3E3 /* cc_rpc.h */, + A1E70D1A0A38B5BB007BE3E3 /* CredentialsCache.h */, + A1E70D1B0A38B5BB007BE3E3 /* CredentialsCache2.h */, + A1E70D1C0A38B5BB007BE3E3 /* datastore.h */, + A1E70D1D0A38B5BB007BE3E3 /* generic_lists.h */, + A1E70D1E0A38B5BB007BE3E3 /* marshall.h */, + A1E70D1F0A38B5BB007BE3E3 /* msg.h */, + A1E70D200A38B5BB007BE3E3 /* msg_headers.h */, + A1E70D210A38B5BB007BE3E3 /* rpc_auth.h */, + ); + name = include; + path = ../include; + sourceTree = SOURCE_ROOT; + }; + A1E70D270A38B5BB007BE3E3 /* server */ = { + isa = PBXGroup; + children = ( + A1E70D280A38B5BB007BE3E3 /* ccs_ccache.c */, + A1E70D290A38B5BB007BE3E3 /* ccs_context.c */, + A1E70D2A0A38B5BB007BE3E3 /* ccs_lists.c */, + A1E70D2B0A38B5BB007BE3E3 /* mac */, + A1E70D2C0A38B5BB007BE3E3 /* main.c */, + A1E70D2D0A38B5BB007BE3E3 /* NTMakefile */, + A1E70D2E0A38B5BB007BE3E3 /* rpc_auth.c */, + A1E70D2F0A38B5BB007BE3E3 /* serv_ops.c */, + A1E70D300A38B5BB007BE3E3 /* serv_ops.h */, + A1E70D310A38B5BB007BE3E3 /* windows */, + ); + name = server; + path = ../server; + sourceTree = SOURCE_ROOT; + }; + A1E70D2B0A38B5BB007BE3E3 /* mac */ = { + isa = PBXGroup; + children = ( + A1E70D910A38BB67007BE3E3 /* CCacheServer.plist */, + A1E70D920A38BB67007BE3E3 /* CCacheServerInfo.plist */, + A1E70D930A38BB67007BE3E3 /* main.c */, + ); + path = mac; + sourceTree = "<group>"; + }; + A1E70D310A38B5BB007BE3E3 /* windows */ = { + isa = PBXGroup; + children = ( + ); + path = windows; + sourceTree = "<group>"; + }; + A1E70D320A38B5BB007BE3E3 /* unit-test */ = { + isa = PBXGroup; + children = ( + A1E70D330A38B5BB007BE3E3 /* NTMakefile */, + A1E70D340A38B5BB007BE3E3 /* t_ccache.c */, + A1E70D350A38B5BB007BE3E3 /* t_context.c */, + A1E70D360A38B5BB007BE3E3 /* t_lists.c */, + A1E70D370A38B5BB007BE3E3 /* t_msg.c */, + A1E70D380A38B5BB007BE3E3 /* t_server.c */, + ); + name = "unit-test"; + path = "../unit-test"; + sourceTree = SOURCE_ROOT; + }; + A1E70D390A38B5BB007BE3E3 /* windows */ = { + isa = PBXGroup; + children = ( + A1E70D3A0A38B5BB007BE3E3 /* cacheapi.def */, + A1E70D3B0A38B5BB007BE3E3 /* client.c */, + A1E70D3C0A38B5BB007BE3E3 /* dllmain.c */, + A1E70D3D0A38B5BC007BE3E3 /* ntccrpc.acf */, + A1E70D3E0A38B5BC007BE3E3 /* ntccrpc.idl */, + A1E70D3F0A38B5BC007BE3E3 /* NTMakefile */, + A1E70D400A38B5BC007BE3E3 /* rpcsstest */, + A1E70D460A38B5BC007BE3E3 /* server.c */, + ); + name = windows; + path = ../windows; + sourceTree = SOURCE_ROOT; + }; + A1E70D400A38B5BC007BE3E3 /* rpcsstest */ = { + isa = PBXGroup; + children = ( + A1E70D410A38B5BC007BE3E3 /* client.c */, + A1E70D420A38B5BC007BE3E3 /* cstest.acf */, + A1E70D430A38B5BC007BE3E3 /* cstest.idl */, + A1E70D440A38B5BC007BE3E3 /* NTMakefile */, + A1E70D450A38B5BC007BE3E3 /* server.c */, + ); + path = rpcsstest; + sourceTree = "<group>"; + }; + A1E70D7E0A38BAC5007BE3E3 /* mac */ = { + isa = PBXGroup; + children = ( + A1E70DDE0A38C6FD007BE3E3 /* KerberosIPC */, + A1E70D9E0A38BCAD007BE3E3 /* mig.defs */, + A1E70DB10A38C01E007BE3E3 /* mig_types.h */, + ); + path = mac; + sourceTree = "<group>"; + }; + A1E70DDE0A38C6FD007BE3E3 /* KerberosIPC */ = { + isa = PBXGroup; + children = ( + A1E70DDF0A38C6FD007BE3E3 /* Kerberos */, + A1E70DE40A38C6FD007BE3E3 /* kipc_client.c */, + A1E70DE50A38C6FD007BE3E3 /* kipc_common.c */, + A1E70DE60A38C6FD007BE3E3 /* kipc_server.c */, + A1E70DE70A38C6FD007BE3E3 /* kipc_session.c */, + A1E70DE80A38C6FD007BE3E3 /* notify.defs */, + A1E70DE90A38C6FD007BE3E3 /* README */, + ); + path = KerberosIPC; + sourceTree = "<group>"; + }; + A1E70DDF0A38C6FD007BE3E3 /* Kerberos */ = { + isa = PBXGroup; + children = ( + A1E70DE00A38C6FD007BE3E3 /* kipc_client.h */, + A1E70DE10A38C6FD007BE3E3 /* kipc_common.h */, + A1E70DE20A38C6FD007BE3E3 /* kipc_server.h */, + A1E70DE30A38C6FD007BE3E3 /* kipc_session.h */, + ); + path = Kerberos; + sourceTree = "<group>"; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + D2AAC043055464E500DB518D /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + A1E70D5C0A38B796007BE3E3 /* CCacheServer */ = { + isa = PBXNativeTarget; + buildConfigurationList = A1E70D600A38B797007BE3E3 /* Build configuration list for PBXNativeTarget "CCacheServer" */; + buildPhases = ( + A1E70D590A38B796007BE3E3 /* Resources */, + A1E70D5A0A38B796007BE3E3 /* Sources */, + A1E70D5B0A38B796007BE3E3 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = CCacheServer; + productName = CCacheServer; + productReference = A1E70D5D0A38B796007BE3E3 /* CCacheServer.app */; + productType = "com.apple.product-type.application"; + }; + D2AAC045055464E500DB518D /* CCAPI */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1DEB91EB08733DB70010E9CD /* Build configuration list for PBXNativeTarget "CCAPI" */; + buildPhases = ( + D2AAC043055464E500DB518D /* Headers */, + D2AAC044055464E500DB518D /* Sources */, + D289987405E68DCB004EDB86 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = CCAPI; + productName = CCAPI; + productReference = D2AAC046055464E500DB518D /* libCCAPI.a */; + productType = "com.apple.product-type.library.static"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 08FB7793FE84155DC02AAC07 /* Project object */ = { + isa = PBXProject; + buildConfigurationList = 1DEB91EF08733DB70010E9CD /* Build configuration list for PBXProject "CCAPI" */; + hasScannedForEncodings = 1; + mainGroup = 08FB7794FE84155DC02AAC07 /* CCAPI */; + projectDirPath = ""; + targets = ( + D2AAC045055464E500DB518D /* CCAPI */, + A1E70D5C0A38B796007BE3E3 /* CCacheServer */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + A1E70D590A38B796007BE3E3 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + A1E70D5A0A38B796007BE3E3 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + A1E70DA00A38BCAD007BE3E3 /* mig.defs in Sources */, + A1E70DF00A38C71D007BE3E3 /* notify.defs in Sources */, + A1E70D9B0A38BBE2007BE3E3 /* main.c in Sources */, + A1E70D890A38BB47007BE3E3 /* ccs_ccache.c in Sources */, + A1E70D8A0A38BB47007BE3E3 /* ccs_context.c in Sources */, + A1E70D8B0A38BB47007BE3E3 /* ccs_lists.c in Sources */, + A1E70D8C0A38BB47007BE3E3 /* rpc_auth.c in Sources */, + A1E70D8D0A38BB47007BE3E3 /* serv_ops.c in Sources */, + A1E70D8E0A38BB4F007BE3E3 /* generic_lists.c in Sources */, + A1E70D8F0A38BB4F007BE3E3 /* marshall.c in Sources */, + A1E70D900A38BB4F007BE3E3 /* msg.c in Sources */, + A1E70DED0A38C71D007BE3E3 /* kipc_common.c in Sources */, + A1E70DEE0A38C71D007BE3E3 /* kipc_server.c in Sources */, + A1E70DEF0A38C71D007BE3E3 /* kipc_session.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + D2AAC044055464E500DB518D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + A1E70D9F0A38BCAD007BE3E3 /* mig.defs in Sources */, + A1E70D480A38B5D5007BE3E3 /* cacheapi.c in Sources */, + A1E70D490A38B5D5007BE3E3 /* ccache.c in Sources */, + A1E70D4A0A38B5D5007BE3E3 /* ccache_iterator.c in Sources */, + A1E70D4B0A38B5D5007BE3E3 /* ccapiv2.c in Sources */, + A1E70D4C0A38B5D5007BE3E3 /* ccstring.c in Sources */, + A1E70D4D0A38B5D5007BE3E3 /* context.c in Sources */, + A1E70D4E0A38B5D5007BE3E3 /* credentials.c in Sources */, + A1E70D4F0A38B5D5007BE3E3 /* credentials_iterator.c in Sources */, + A1E70D510A38B60C007BE3E3 /* generic_lists.c in Sources */, + A1E70D520A38B60C007BE3E3 /* marshall.c in Sources */, + A1E70D530A38B60C007BE3E3 /* msg.c in Sources */, + A1E70DEA0A38C710007BE3E3 /* kipc_client.c in Sources */, + A1E70DEB0A38C710007BE3E3 /* kipc_common.c in Sources */, + A1E70DEC0A38C710007BE3E3 /* kipc_session.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 1DEB91EC08733DB70010E9CD /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_DYNAMIC_NO_PIC = NO; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + ../client, + ../client/mac, + ../common, + ../common/mac, + ../common/mac/KerberosIPC, + ); + PRODUCT_NAME = CCAPI; + }; + name = Debug; + }; + 1DEB91ED08733DB70010E9CD /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + HEADER_SEARCH_PATHS = ( + "$(inherited)", + ../client, + ../client/mac, + ../common, + ../common/mac, + ../common/mac/KerberosIPC, + ); + PRODUCT_NAME = CCAPI; + }; + name = Release; + }; + 1DEB91F008733DB70010E9CD /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = ( + i386, + ppc, + ); + COPY_PHASE_STRIP = NO; + GCC_ENABLE_FIX_AND_CONTINUE = YES; + GCC_GENERATE_DEBUGGING_SYMBOLS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + PREBINDING = NO; + ZERO_LINK = YES; + }; + name = Debug; + }; + 1DEB91F108733DB70010E9CD /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = "$(NATIVE_ARCH)"; + COPY_PHASE_STRIP = YES; + GCC_ENABLE_FIX_AND_CONTINUE = NO; + GCC_GENERATE_DEBUGGING_SYMBOLS = YES; + GCC_OPTIMIZATION_LEVEL = 3; + PREBINDING = NO; + ZERO_LINK = NO; + }; + name = Release; + }; + A1E70D610A38B797007BE3E3 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + HEADER_SEARCH_PATHS = ( + "$(inherited)", + ../server, + ../server/mac, + ../common, + ../common/mac, + ../common/mac/KerberosIPC, + ); + INFOPLIST_FILE = ../server/mac/CCacheServerInfo.plist; + INSTALL_PATH = /System/Library/CoreServices; + PRODUCT_NAME = CCacheServer; + WRAPPER_EXTENSION = app; + }; + name = Debug; + }; + A1E70D620A38B797007BE3E3 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + HEADER_SEARCH_PATHS = ( + "$(inherited)", + ../server, + ../server/mac, + ../common, + ../common/mac, + ../common/mac/KerberosIPC, + ); + INFOPLIST_FILE = ../server/mac/CCacheServerInfo.plist; + INSTALL_PATH = /System/Library/CoreServices; + PRODUCT_NAME = CCacheServer; + WRAPPER_EXTENSION = app; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 1DEB91EB08733DB70010E9CD /* Build configuration list for PBXNativeTarget "CCAPI" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1DEB91EC08733DB70010E9CD /* Debug */, + 1DEB91ED08733DB70010E9CD /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 1DEB91EF08733DB70010E9CD /* Build configuration list for PBXProject "CCAPI" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1DEB91F008733DB70010E9CD /* Debug */, + 1DEB91F108733DB70010E9CD /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + A1E70D600A38B797007BE3E3 /* Build configuration list for PBXNativeTarget "CCacheServer" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A1E70D610A38B797007BE3E3 /* Debug */, + A1E70D620A38B797007BE3E3 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 08FB7793FE84155DC02AAC07 /* Project object */; +} diff --git a/src/lib/ccapi/marshall.c b/src/lib/ccapi/marshall.c deleted file mode 100644 index 7027d65612..0000000000 --- a/src/lib/ccapi/marshall.c +++ /dev/null @@ -1,378 +0,0 @@ -/* $Copyright: - * - * Copyright 2004 by the Massachusetts Institute of Technology. - * - * All rights reserved. - * - * Export of this software from the United States of America may require a - * specific license from the United States Government. It is the - * responsibility of any person or organization contemplating export to - * obtain such a license before exporting. - * - * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and distribute - * this software and its documentation for any purpose and without fee is - * hereby granted, provided that the above copyright notice appear in all - * copies and that both that copyright notice and this permission notice - * appear in supporting documentation, and that the name of M.I.T. not be - * used in advertising or publicity pertaining to distribution of the - * software without specific, written prior permission. Furthermore if you - * modify this software you must label your software as modified software - * and not distribute it in such a fashion that it might be confused with - * the original MIT software. M.I.T. makes no representations about the - * suitability of this software for any purpose. It is provided "as is" - * without express or implied warranty. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF - * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Individual source code files are copyright MIT, Cygnus Support, - * OpenVision, Oracle, Sun Soft, FundsXpress, and others. - * - * Project Athena, Athena, Athena MUSE, Discuss, Hesiod, Kerberos, Moira, - * and Zephyr are trademarks of the Massachusetts Institute of Technology - * (MIT). No commercial use of these trademarks may be made without prior - * written permission of MIT. - * - * "Commercial use" means use of a name in a product or other for-profit - * manner. It does NOT prevent a commercial firm from referring to the MIT - * trademarks in order to convey information (although in doing so, - * recognition of their trademark status should be given). - * $ - */ - -/* marshall.c */ - -#include <stdlib.h> -#include <stdio.h> -#include <CredentialsCache.h> -#include "msg.h" -#include "msg_headers.h" -#include "marshall.h" - -cc_int32 -cci_creds_v4_marshall( cc_credentials_v4_t * creds, - char ** flat, - cc_uint32 * len) -{ - cc_msg_t * msg; - ccmsg_creds_v4_t * header; - cc_uint32 blob_pos; - cc_int32 code; - - if ( creds == NULL || flat == NULL || len == NULL ) - return ccErrBadParam; - - header = (ccmsg_creds_v4_t *)malloc(sizeof(ccmsg_creds_v4_t)); - if ( header == NULL ) - return ccErrNoMem; - - code = cci_msg_new(ccmsg_CREDS_V4, &msg); - - code = cci_msg_add_header(msg, header, sizeof(ccmsg_creds_v4_t)); - - code = cci_msg_add_data_blob(msg, creds, sizeof(cc_credentials_v4_t), &blob_pos); - - header->offset = blob_pos; - header->len = sizeof(cc_credentials_v4_t); - - code = cci_msg_flatten( msg, NULL ); - - *flat = msg->flat; - *len = msg->flat_len; - msg->flat = NULL; - msg->flat_len = 0; - - cci_msg_destroy(msg); - - return ccNoError; -} - -cc_int32 -cci_creds_v4_unmarshall( char * flat, - cc_uint32 len, - cc_credentials_union * creds) -{ - cc_msg_t * msg; - ccmsg_creds_v4_t * header; - cc_int32 code; - - if ( flat == NULL || len == 0 || creds == NULL ) - return ccErrBadParam; - - code = cci_msg_unflatten( flat, len, &msg ); - - header = (ccmsg_creds_v4_t *)msg->header; - - creds->version = cc_credentials_v4; - code = cci_msg_retrieve_blob(msg, header->offset, header->len, &creds->credentials.credentials_v4); - - cci_msg_destroy(msg); - - return ccNoError; -} - - -cc_int32 -cci_creds_cc_data_array_count_entries( cc_data ** array, cc_uint32 * pcount) -{ - cc_uint32 count; - - if (array == NULL) { - *pcount = 0; - return ccNoError; - } - - for ( count=0; array[count] != NULL ; count++) ; - - *pcount = count; - return ccNoError; -} - -cc_int32 -cci_creds_v5_compute_flat_size( cc_credentials_v5_t * creds, cc_uint32 * plen) -{ - cc_uint32 len; - cc_uint32 i, count; - - len = sizeof(struct cci_flat_creds_v5); - - if (creds->client) - len += strlen(creds->client) + 1; - - if (creds->server) - len += strlen(creds->server) + 1; - - len += creds->keyblock.length; - - cci_creds_cc_data_array_count_entries( creds->addresses, &count ); - len += count * sizeof(cc_flat_data); - for ( i=0; i<count; i++ ) { - len += creds->addresses[i]->length; - } - - len += creds->ticket.length; - len += creds->second_ticket.length; - - cci_creds_cc_data_array_count_entries( creds->authdata, &count ); - len += count * sizeof(cc_flat_data); - for ( i=0; i<count; i++ ) { - len += creds->authdata[i]->length; - } - - *plen = len; - return ccNoError; -} - -cc_int32 -cci_creds_v5_marshall( cc_credentials_v5_t * creds, - char ** pflat, - cc_uint32 * plen) -{ - cc_uint32 len; - char * flat; - struct cci_flat_creds_v5 * header; - cc_uint32 offset; - cc_uint32 i; - - if ( creds == NULL || pflat == NULL || plen == NULL ) - return ccErrBadParam; - - cci_creds_v5_compute_flat_size(creds, &len); - - flat = (char *)malloc(len); - if ( flat == NULL ) - return ccErrNoMem; - memset(flat, 0, len); - - offset = sizeof(struct cci_flat_creds_v5); - header = (struct cci_flat_creds_v5 *)flat; - header->version = FLAT_CREDS_V5_VERSION; - if (creds->client) { - header->client.length = strlen(creds->client) + 1; - header->client.data = offset; - memcpy(flat + offset, creds->client, header->client.length); - offset += header->client.length; - } - - if (creds->server) { - header->server.length = strlen(creds->server) + 1; - header->server.data = offset; - memcpy(flat + offset, creds->server, header->server.length); - offset += header->server.length; - } - - header->keyblock.type = creds->keyblock.type; - if (creds->keyblock.length) { - header->keyblock.length = creds->keyblock.length; - header->keyblock.data = offset; - memcpy(flat + offset, creds->keyblock.data, header->keyblock.length); - offset += header->keyblock.length; - } - - header->authtime = creds->authtime; - header->starttime = creds->starttime; - header->endtime = creds->endtime; - header->renew_till = creds->renew_till; - header->is_skey = creds->is_skey; - header->ticket_flags = creds->ticket_flags; - - cci_creds_cc_data_array_count_entries( creds->addresses, &header->address_count ); - if ( header->address_count ) { - cc_flat_data * addresses = (cc_flat_data *)flat + offset; - header->addresses = offset; - offset += header->address_count * sizeof(cc_flat_data); - - for ( i=0; i<header->address_count; i++ ) { - addresses[i].type = creds->addresses[i]->type; - if (creds->addresses[i]->length) { - addresses[i].length = creds->addresses[i]->length; - addresses[i].data = offset; - memcpy(flat + offset, creds->addresses[i]->data, addresses[i].length); - offset += addresses[i].length; - } - } - } - - header->ticket.type = creds->ticket.type; - if (creds->ticket.length) { - header->ticket.length = creds->ticket.length; - header->ticket.data = offset; - memcpy(flat + offset, creds->ticket.data, header->ticket.length); - offset += header->ticket.length; - } - - header->second_ticket.type = creds->second_ticket.type; - if (creds->second_ticket.length) { - header->second_ticket.length = creds->second_ticket.length; - header->second_ticket.data = offset; - memcpy(flat + offset, creds->second_ticket.data, header->second_ticket.length); - offset += header->second_ticket.length; - } - - cci_creds_cc_data_array_count_entries( creds->authdata, &header->authdata_count ); - if ( header->authdata_count ) { - cc_flat_data * authdata = (cc_flat_data *)flat + offset; - header->authdata = offset; - offset += header->authdata_count * sizeof(cc_flat_data); - - for ( i=0; i<header->authdata_count; i++ ) { - authdata[i].type = creds->authdata[i]->type; - if (creds->authdata[i]->length) { - authdata[i].length = creds->authdata[i]->length; - authdata[i].data = offset; - memcpy(flat + offset, creds->authdata[i]->data, authdata[i].length); - offset += authdata[i].length; - } - } - } - - *pflat = flat; - *plen = len; - return ccNoError; -} - - -// TODO: a much better job of checking for out of memory errors -// and validating that we do not read beyond the flat input -// data buffer - -cc_int32 -cci_creds_v5_unmarshall( char * flat, - cc_uint32 len, - cc_credentials_union * creds_union) -{ - struct cci_flat_creds_v5 * header; - cc_credentials_v5_t * creds; - cc_flat_data * flat_data; - cc_uint32 i; - cc_int32 code; - - if ( flat == NULL || len == 0 || creds_union == NULL ) - return ccErrBadParam; - - creds_union->version = cc_credentials_v5; - - header = (struct cci_flat_creds_v5 *)flat; - - if ( header->version != FLAT_CREDS_V5_VERSION ) - return ccErrBadParam; - - creds = (cc_credentials_v5_t *)malloc(sizeof(cc_credentials_v5_t)); - if ( creds == NULL ) - return ccErrNoMem; - memset(creds, 0, sizeof(ccmsg_creds_v5_t)); - - if ( header->client.length ) { - creds->client = (char *)malloc(header->client.length); - memcpy(creds->client, flat + header->client.data, header->client.length); - } - - if ( header->server.length ) { - creds->server = (char *)malloc(header->server.length); - memcpy(creds->server, flat + header->server.data, header->server.length); - } - - creds->keyblock.type = header->keyblock.type; - if ( header->keyblock.length ) { - creds->keyblock.length = header->keyblock.length; - creds->keyblock.data = malloc(creds->keyblock.length); - memcpy(creds->keyblock.data, flat + header->keyblock.data, creds->keyblock.length); - } - - creds->authtime = header->authtime; - creds->starttime = header->starttime; - creds->endtime = header->endtime; - creds->renew_till = header->renew_till; - creds->is_skey = header->is_skey; - creds->ticket_flags = header->ticket_flags; - - creds->addresses = (cc_data **) malloc((header->address_count + 1) * sizeof(cc_data *)); - flat_data = (cc_flat_data *)flat + header->addresses; - for ( i=0 ; i < header->address_count ; i++ ) { - creds->addresses[i] = (cc_data *)malloc(sizeof(cc_data)); - creds->addresses[i]->type = flat_data[i].type; - creds->addresses[i]->length = flat_data[i].length; - if ( flat_data[i].length ) { - creds->addresses[i]->data = malloc(flat_data[i].length); - memcpy(creds->addresses[i]->data, flat + flat_data[i].data, flat_data[i].length); - } else { - creds->addresses[i]->data = NULL; - } - } - creds->addresses[i] = NULL; - - creds->ticket.type = header->ticket.type; - if ( header->ticket.length ) { - creds->ticket.length = header->ticket.length; - creds->ticket.data = malloc(creds->ticket.length); - memcpy(creds->ticket.data, flat + header->ticket.data, creds->ticket.length); - } - - creds->second_ticket.type = header->second_ticket.type; - if ( header->second_ticket.length ) { - creds->second_ticket.length = header->second_ticket.length; - creds->second_ticket.data = malloc(creds->second_ticket.length); - memcpy(creds->second_ticket.data, flat + header->second_ticket.data, creds->second_ticket.length); - } - - creds->authdata = (cc_data **) malloc((header->authdata_count + 1) * sizeof(cc_data *)); - flat_data = (cc_flat_data *)flat + header->authdata; - for ( i=0 ; i < header->authdata_count ; i++ ) { - creds->authdata[i] = (cc_data *)malloc(sizeof(cc_data)); - creds->authdata[i]->type = flat_data[i].type; - creds->authdata[i]->length = flat_data[i].length; - if ( flat_data[i].length ) { - creds->authdata[i]->data = malloc(flat_data[i].length); - memcpy(creds->authdata[i]->data, flat + flat_data[i].data, flat_data[i].length); - } else { - creds->authdata[i]->data = NULL; - } - } - creds->authdata[i] = NULL; - - creds_union->credentials.credentials_v5 = creds; - - return ccNoError; -} - diff --git a/src/lib/ccapi/server/NTMakefile b/src/lib/ccapi/server/NTMakefile index 671b6905f2..564097c534 100644 --- a/src/lib/ccapi/server/NTMakefile +++ b/src/lib/ccapi/server/NTMakefile @@ -1,30 +1,21 @@ -# Makefile for the CCAPI Generic Server +# Makefile for the CCAPI Server Library !INCLUDE <WIN32.MAK> -CFLAGS = -I../include +CFLAGS = -I../include $(cdebug) $(cflags) $(cvarsmt) -CCAPI_LIB = ../lib/ccapi.lib -WINLIBS = user32.lib advapi32.lib -CCSOBJS = context.obj ccache.obj lists.obj rpc_auth.obj serv_ops.obj +CC_SERVER_OBJS = ccs_context.obj ccs_ccache.obj ccs_lists.obj rpc_auth.obj serv_ops.obj -all: t_lists.exe t_msg.exe t_ccache.exe t_context.exe ccapi_server.exe +CC_SERVER_LIB = cc_server.lib -t_lists.exe: t_lists.obj $(CCSOBJS) $(CCAPI_LIB) - link -out:$@ t_lists.obj $(CCSOBJS) $(CCAPI_LIB) $(WINLIBS) +CC_COMMON_LIB = ../common/cc_common.lib -t_msg.exe: t_msg.obj $(CCSOBJS) $(CCAPI_LIB) - link -out:$@ t_msg.obj $(CCSOBJS) $(CCAPI_LIB) $(WINLIBS) +$(CC_SERVER_LIB): $(CC_SERVER_OBJS) + $(implib) /NOLOGO /OUT:$@ $** -t_ccache.exe: t_ccache.obj $(CCSOBJS) $(CCAPI_LIB) - link -out:$@ t_ccache.obj $(CCSOBJS) $(CCAPI_LIB) $(WINLIBS) - -t_context.exe: t_context.obj $(CCSOBJS) $(CCAPI_LIB) - link -out:$@ t_context.obj $(CCSOBJS) $(CCAPI_LIB) $(WINLIBS) - -ccapi_server.exe: main.obj $(CCSOBJS) $(CCAPI_LIB) - link -out:$@ main.obj $(CCSOBJS) $(CCAPI_LIB) $(WINLIBS) +all: $(CC_SERVER_LIB) clean: - del *.obj *.exe + del *.obj *.lib +
\ No newline at end of file diff --git a/src/lib/ccapi/server/ccache.c b/src/lib/ccapi/server/ccs_ccache.c index 2c3a745afe..d632ee3494 100644 --- a/src/lib/ccapi/server/ccache.c +++ b/src/lib/ccapi/server/ccs_ccache.c @@ -1,703 +1,703 @@ -/* $Copyright: - * - * Copyright 2004 by the Massachusetts Institute of Technology. - * - * All rights reserved. - * - * Export of this software from the United States of America may require a - * specific license from the United States Government. It is the - * responsibility of any person or organization contemplating export to - * obtain such a license before exporting. - * - * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and distribute - * this software and its documentation for any purpose and without fee is - * hereby granted, provided that the above copyright notice appear in all - * copies and that both that copyright notice and this permission notice - * appear in supporting documentation, and that the name of M.I.T. not be - * used in advertising or publicity pertaining to distribution of the - * software without specific, written prior permission. Furthermore if you - * modify this software you must label your software as modified software - * and not distribute it in such a fashion that it might be confused with - * the original MIT software. M.I.T. makes no representations about the - * suitability of this software for any purpose. It is provided "as is" - * without express or implied warranty. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF - * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Individual source code files are copyright MIT, Cygnus Support, - * OpenVision, Oracle, Sun Soft, FundsXpress, and others. - * - * Project Athena, Athena, Athena MUSE, Discuss, Hesiod, Kerberos, Moira, - * and Zephyr are trademarks of the Massachusetts Institute of Technology - * (MIT). No commercial use of these trademarks may be made without prior - * written permission of MIT. - * - * "Commercial use" means use of a name in a product or other for-profit - * manner. It does NOT prevent a commercial firm from referring to the MIT - * trademarks in order to convey information (although in doing so, - * recognition of their trademark status should be given). - * $ - */ - -/* - * Manages ccache objects. - * - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <time.h> -#include "CredentialsCache.h" -#include "datastore.h" - -/** - * ccache_new() - * - * Purpose: Allocate and initialize new credentials cache for the specified principal - * and version - * - * Return: ccNoError - success - * ccErrInvalidString - name or principal is NULL - * ccErrBadCredentialsVersion - unsupported creds type - * ccErrBadParam - outCcachepp is NULL - * ccErrNoMem - malloc failed - */ -cc_int32 -cci_ccache_new( char *name, char *principal, int cred_vers, - cc_server_ccache_t** outCCachepp) -{ - cc_server_ccache_t* ccache; - - if (name == NULL || principal == NULL) - return ccErrInvalidString; - - if (cred_vers != cc_credentials_v4 && cred_vers != cc_credentials_v5 && - cred_vers != cc_credentials_v4_v5) - return ccErrBadCredentialsVersion; - - if (outCCachepp == NULL) - return ccErrBadParam; - - ccache = (cc_server_ccache_t*)malloc(sizeof(cc_server_ccache_t)); - if (ccache == NULL) - return ccErrNoMem; - - ccache->name = name; - ccache->principal_v4 = NULL; - ccache->principal_v5 = NULL; - ccache->changed = time(NULL); - ccache->kdc_offset = 0; - ccache->last_default = 0; - cci_generic_list_new(&ccache->active_iterators); - cci_credentials_list_new(&ccache->creds); - ccache->is_default = 0; - ccache->kdc_set = 0; - ccache->versions = cred_vers; - ccache->mycontext = NULL; - - cci_ccache_set_principal(ccache, cred_vers, principal); - *outCCachepp = ccache; - return ccNoError; -} - -/** - * cci_ccache_check_version() - * - * Purpose: Check to see if the ccache and the creds have compatible versions. - * - * Return: ccNoError and compat = 1 if they are compatible - * ccNoError and compat = 0 if they are not compatible - * - * Errors: ccErrInvalidCCache - ccache is NULL - * ccErrBadParam - either creds or compat are NULL - */ -cc_int32 -cci_ccache_check_version( const cc_server_ccache_t *ccache, - const cc_credentials_union* creds, - cc_uint32* compat) -{ - if (ccache == NULL) - return ccErrInvalidCCache; - - if (creds == NULL || compat == NULL) - return ccErrBadParam; - - if (ccache->versions == cc_credentials_v4_v5) - *compat = 1; - else if (ccache->versions == creds->version) - *compat = 1; - else - *compat = 0; - - return ccNoError; -} - -/** -cci_ccache_check_principal() - -Check to see if the client principal from the credentials matches -the principal associated with the cache. - -* Return: ccNoError and compat = 1 if they are compatible -* ccNoError and compat = 0 if they are not compatible -* -* Errors: ccErrInvalidCCache - ccache is NULL -* ccErrBadParam - either creds or compat are NULL -* ccErrBadCredentialVersion - unsupported credential type -*/ -cc_int32 -cci_ccache_check_principal( const cc_server_ccache_t *ccache, - const cc_credentials_union* creds, - cc_uint32* compat) -{ - if (ccache == NULL) - return ccErrInvalidCCache; - - if (creds == NULL || compat == NULL) - return ccErrBadParam; - - if (creds->version == cc_credentials_v4) { - if (strcmp(creds->credentials.credentials_v4->principal, ccache->principal_v4) == 0) - *compat = 1; - else - *compat = 0; - } else if (creds->version == cc_credentials_v5) { - if (strcmp(creds->credentials.credentials_v5->client, ccache->principal_v5) == 0) - *compat = 1; - else - *compat = 0; - } else { - return ccErrBadCredentialsVersion; - } - return ccNoError; -} - - -/** - * cci_ccache_store_creds() - * - * Purpose: Stores the provided credentials into the provided cache. Validates the - * ability of the cache to store credentials of the given version and client - * principal. - * - * Return: 0 on success - * -1 on error - * - * Errors: ccErrNoMem - * ccErrBadCredentialsVersion - * ccErrBadInvalidCredentials - * ccErrInvalidCache - * ccErrBadParam - */ -cc_int32 -cci_ccache_store_creds(cc_server_ccache_t *ccache, const cc_credentials_union* credentials) -{ - cc_server_credentials_t* stored_cred=NULL; - cc_uint32 valid_version, valid_principal; - cc_int32 code; - - if (ccache == NULL) - return ccErrInvalidCCache; - - if (credentials == NULL) - return ccErrBadParam; - - code = cci_ccache_check_version(ccache, credentials, &valid_version); - if (code != ccNoError) { - /* pass error on to caller */ - goto bad; - } - code = cci_ccache_check_principal(ccache, credentials, &valid_principal); - if (code != ccNoError) { - /* pass error on to caller */ - goto bad; - } - if (valid_version && valid_principal) { - stored_cred = (cc_server_credentials_t*)malloc(sizeof(cc_server_credentials_t)); - if (stored_cred == NULL) { - code = ccErrNoMem; - goto bad; - } - memcpy(&stored_cred->creds, credentials, sizeof(cc_credentials_union)); - - if (credentials->version == cc_credentials_v4) { - stored_cred->creds.credentials.credentials_v4 = (cc_credentials_v4_t*)malloc(sizeof(cc_credentials_v4_t)); - if (stored_cred->creds.credentials.credentials_v4 == NULL) { - code = ccErrNoMem; - goto bad; - } - - memcpy(stored_cred->creds.credentials.credentials_v4, credentials->credentials.credentials_v4, sizeof(cc_credentials_v4_t)); - } else if (credentials->version == cc_credentials_v5) { - stored_cred->creds.credentials.credentials_v5 = (cc_credentials_v5_t*)malloc(sizeof(cc_credentials_v5_t)); - if (stored_cred->creds.credentials.credentials_v5 == NULL) { - code = ccErrNoMem; - goto bad; - } - - memcpy(stored_cred->creds.credentials.credentials_v5, credentials->credentials.credentials_v5, sizeof(cc_credentials_v5_t)); - } else { - code = ccErrBadCredentialsVersion; - goto bad; - } - - code = cci_credentials_list_append(ccache->creds, stored_cred, NULL); - if ( code != ccNoError ) { - /* pass error on to caller */ - goto bad; - } - if (ccache->creds->head->data == (cc_uint8 *)stored_cred) - stored_cred->is_default = 1; /*we're first on the list, so we're default*/ - - cci_ccache_changed(ccache); - return ccNoError; - } else { -#ifdef DEBUG - printf("vers: %d\tprincipal: %d\n", - valid_version, valid_principal); -#endif /* DEBUG */ - code = ccErrInvalidCredentials; - goto bad; - } - - bad: - if (stored_cred) - free(stored_cred); - return code; /* error */ -} - -/** - * cci_ccache_changed() - * - * Purpose: Updates the last update time for the ccache and its associated context. - * Provides a location from which interested parties should be notified - * of cache updates. - * - * Return: none - * - * Errors: none - */ -void -cci_ccache_changed(cc_server_ccache_t* ccache) -{ - ccache->changed = time(NULL); - if (ccache->mycontext != NULL) - ccache->mycontext->changed = time(NULL); - - /* XXX - notify registered listeners when implemented */ -} - -/** - * cci_ccache_rem_creds() - * - * Purpose: Removes the specified credential object from the specified cache if - * it exists - * - * Return: 0 on success (credential is not in the cache) - * -1 on error - * - * Errors: ccErrBadParam, ccErrNoMem (from cc_credentials_list_iterator) - * - * Verify: does the memory associated with stored_cred->creds need to be freed? - * - */ -cc_int32 -cci_ccache_rem_creds(cc_server_ccache_t *ccache, const cc_credentials_union* credentials) -{ - cc_credentials_iterate_t* credentials_iterator=NULL, *active; - cc_generic_iterate_t* generic_iterator=NULL; - cc_credentials_list_node_t* credentials_node; - cc_generic_list_node_t* generic_node; - cc_server_credentials_t* stored_cred; - cc_int8 changed = 0; - cc_int32 code = 0; - - if (ccache == NULL) - return ccErrInvalidCCache; - - if (credentials == NULL) - return ccErrBadParam; - - code = cci_credentials_list_iterator(ccache->creds, &credentials_iterator); - if (code != ccNoError) { - /* pass error to caller */ - goto cleanup; - } - - while (cci_credentials_iterate_has_next(credentials_iterator)) { - code = cci_credentials_iterate_next(credentials_iterator, &credentials_node); - stored_cred = (cc_server_credentials_t*)credentials_node->data; - if (memcmp(&stored_cred->creds,credentials,sizeof(cc_credentials_union)) == 0) { - /* XXX - do we need to free(stored_cred->creds) ? */ - free(credentials_node->data); - changed = 1; - - /*If any iterator's next points to the deleted node, make it point to the next node*/ - code = cci_generic_list_iterator(ccache->active_iterators, &generic_iterator); - while (cci_generic_iterate_has_next(generic_iterator)) { - code = cci_generic_iterate_next(generic_iterator, &generic_node); - active = (cc_credentials_iterate_t*)generic_node->data; - if (active->next == credentials_node) - active->next = active->next->next; - } - code = cci_generic_free_iterator(generic_iterator); - generic_iterator = NULL; - - if (credentials_node == ccache->creds->head) { /*removing the default, must make next cred default*/ - code = cci_credentials_list_remove_element(ccache->creds, credentials_node); - - if (ccache->creds->head != NULL) - ((cc_server_credentials_t*)ccache->creds->head->data)->is_default = 1; - } else { - code = cci_credentials_list_remove_element(ccache->creds, credentials_node); - } - break; - } - } - - cleanup: - if (changed) - cci_ccache_changed(ccache); - if (credentials_iterator) - cci_credentials_free_iterator(credentials_iterator); - if (generic_iterator) - cci_generic_free_iterator(generic_iterator); - return code; -} - -/** - * cci_ccache_move() - * - * Purpose: Destroys the existing contents of the destination and copies - * all credentials from the source to the destination - * - * Return: 0 on success - * -1 on error - * - * Errors: ccBadNoMem - * - */ - -cc_int32 -cci_ccache_move(cc_server_ccache_t *source, cc_server_ccache_t* destination) -{ - cc_generic_list_node_t* node; - cc_generic_iterate_t* iterator; - cc_credentials_iterate_t* cur; - cc_int32 code; - - if (source == NULL || destination == NULL) - return ccErrBadParam; - - code = cci_credentials_list_destroy(destination->creds); - if ( code != ccNoError ) - return code; - - code = cci_credentials_list_copy(source->creds, &destination->creds); - if ( code != ccNoError ) - return code; - - destination->versions = source->versions; - destination->kdc_offset = source->kdc_offset; - destination->last_default = 0; - - /*reset all active iterators to point to the head of the new creds list*/ - if (destination->active_iterators->head != NULL) { - code = cci_generic_list_iterator(destination->active_iterators, &iterator); - while (cci_generic_iterate_has_next(iterator)) { - code = cci_generic_iterate_next(iterator, &node); - cur = (cc_credentials_iterate_t*)node->data; - cur->next = destination->creds->head; - } - code = cci_generic_free_iterator(iterator); - } - - cci_ccache_changed(destination); - return code; -} - -/** - * cci_ccache_get_kdc_time_offset() - * - * Purpose: Retrieves the kdc_time_offset from the ccache if set - * - * Return: 0 on success - * -1 on error - * - * Errors: ccErrBadParam, ccErrTimeOffsetNotSet - * - */ -cc_int32 -cci_ccache_get_kdc_time_offset(cc_server_ccache_t* ccache, cc_time_t* offset) -{ - if (ccache == NULL) - return ccErrInvalidCCache; - - if (offset == NULL) - return ccErrBadParam; - - if (!ccache->kdc_set) - return ccErrTimeOffsetNotSet; - - *offset = ccache->kdc_offset; - return ccNoError; -} - -/** - * cci_ccache_set_kdc_time_offset() - * - * Purpose: Sets the kdc time offset in the designated ccache - * - * Return: 0 on success - * -1 on error - * - * Errors: ccErrBadParam - * - */ -cc_int32 -cci_ccache_set_kdc_time_offset(cc_server_ccache_t* ccache, cc_time_t offset) -{ - if (ccache == NULL) - return ccErrInvalidCCache; - - ccache->kdc_offset = offset; - ccache->kdc_set = 1; - cci_ccache_changed(ccache); - - return ccNoError; -} - -/** - * cci_ccache_clear_kdc_time_offset() - * - * Purpose: Clear the kdc time offset in the designated ccache - * - * Return: 0 on success - * -1 on error - * - * Errors: ccErrBadParam - */ -cc_int32 -cci_ccache_clear_kdc_time_offset(cc_server_ccache_t* ccache) -{ - if (ccache == NULL) - return ccErrInvalidCCache; - - ccache->kdc_offset = 0; - ccache->kdc_set = 0; - cci_ccache_changed(ccache); - - return ccNoError; -} - -/** - * cci_ccache_new_iterator() - * - * Purpose: Retrieve an iterator for the designated cache - * - * Return: 0 on success - * -1 on error - * - * Errors: ccErrBadParam, ccBadNoMem - */ -cc_int32 -cci_ccache_new_iterator(cc_server_ccache_t* ccache, cc_credentials_iterate_t** iterator) -{ - cc_int32 code; - - if (ccache == NULL) - return ccErrInvalidCCache; - - if (iterator == NULL) - return ccErrBadParam; - - code = cci_credentials_list_iterator(ccache->creds, iterator); - if (code != ccNoError) - return code; - - code = cci_generic_list_prepend(ccache->active_iterators, *iterator, sizeof(cc_credentials_iterate_t), NULL); - if (code != ccNoError) - return code; - - return ccNoError; -} - -/** - * cci_ccache_get_principal() - * - * Purpose: Retrieves the client principal associated with the designated cache. - * The value is returned - * Return: - * - * Errors: - */ -cc_int32 -cci_ccache_get_principal(cc_server_ccache_t* ccache, cc_int32 version, char ** principal) -{ - char *p = NULL; - - switch ( version ) { - case cc_credentials_v4: - p = ccache->principal_v4; - break; - case cc_credentials_v5: - p = ccache->principal_v5; - break; - default: - return ccErrBadCredentialsVersion; - } - - *principal = (char *)malloc(strlen(p)+1); - if ( *principal == NULL ) - return ccErrNoMem; - - strcpy(*principal, p); - return ccNoError; -} - -/** - * Purpose: Releases the memory associated with a ccache principal - * - * Return: - * - * Errors: - * - */ -cc_int32 -cci_ccache_free_principal(char * principal) -{ - if ( principal == NULL ) - return ccErrBadParam; - - free(principal); - return ccNoError; -} - -/** - * ccache_set_principal() - * - * Purpose: Assigns a principal to the designated ccache and credential version. - * If the api version is 2, the cache is cleared of all existing - * credentials. - * - * Return: 0 on success - * -1 on error - * - * Errors: ccErrNoMem, ccErrBadCredentialsVersion - */ -cc_int32 -cci_ccache_set_principal( cc_server_ccache_t* ccache, cc_int32 cred_version, - char* principal) -{ - cc_generic_iterate_t* generic_iterator; - cc_generic_list_node_t* generic_node; - cc_ccache_iterate_t* ccache_iterator; - cc_int32 code = ccNoError; - - if (ccache == NULL) - return ccErrInvalidCCache; - - if (principal == NULL) - return ccErrInvalidString; - - switch (cred_version) { - case cc_credentials_v4: - case cc_credentials_v4_v5: - ccache->principal_v4 = (char *)malloc(strlen(principal) + 1); - if (ccache->principal_v4 == NULL) - return ccErrNoMem; - strcpy(ccache->principal_v4, principal); - if (cred_version != cc_credentials_v4_v5) - break; - /* fall-through if we are v4_v5 */ - case cc_credentials_v5: - ccache->principal_v5 = (char *)malloc(strlen(principal) + 1); - if (ccache->principal_v5 == NULL) { - if (cred_version == cc_credentials_v4_v5) { - free(ccache->principal_v4); - ccache->principal_v4 = NULL; - } - return ccErrNoMem; - } - strcpy(ccache->principal_v5, principal); - break; - default: - return ccErrBadCredentialsVersion; - } - - /*For API version 2 clients set_principal implies a flush of all creds*/ - if (ccache->mycontext != NULL && ccache->mycontext->api_version == ccapi_version_2) { - cci_credentials_list_destroy(ccache->creds); - cci_credentials_list_new(&ccache->creds); - - /*clean up active_iterators*/ - code = cci_generic_list_iterator(ccache->active_iterators, &generic_iterator); - if (code == ccNoError) { - while (cci_generic_iterate_has_next(generic_iterator)) { - code = cci_generic_iterate_next(generic_iterator, &generic_node); - ccache_iterator = (cc_ccache_iterate_t*)generic_node->data; - ccache_iterator->next = NULL; - } - } - } - - cci_ccache_changed(ccache); - - return code; -} - -/** - * cci_ccache_destroy() - * - * Purpose: Destroys an existing ccache - * - * Return: 0 on success - * -1 on errors - * - * Errors: ccErrBadParam - */ -cc_int32 -cci_ccache_destroy(cc_server_ccache_t* ccache) -{ - cc_int32 code; - - if ( ccache == NULL ) - return ccErrInvalidCCache; - - code = cci_generic_list_destroy(ccache->active_iterators); - code = cci_credentials_list_destroy(ccache->creds); - - if (ccache->mycontext != NULL) - code = cci_context_rem_ccache(ccache->mycontext, ccache); - - return code; -} - -/** - * cci_ccache_compare() - * - * Purpose: Returns a boolean value indicating if two caches are identical - * Implemented as pointer equivalence. - * - * Return: 1 if TRUE - * 0 if FALSE - * - * Errors: No errors - */ -cc_int32 -cci_ccache_compare(cc_server_ccache_t* ccache1, cc_server_ccache_t* ccache2, cc_uint32 *result) -{ - if ( ccache1 == NULL || ccache2 == NULL ) - return ccErrInvalidCCache; - - if (ccache1 == ccache2) - *result = 1; - else - *result = 0; - - return ccNoError; -} - +/* $Copyright:
+ *
+ * Copyright 2004-2006 by the Massachusetts Institute of Technology.
+ *
+ * All rights reserved.
+ *
+ * Export of this software from the United States of America may require a
+ * specific license from the United States Government. It is the
+ * responsibility of any person or organization contemplating export to
+ * obtain such a license before exporting.
+ *
+ * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and distribute
+ * this software and its documentation for any purpose and without fee is
+ * hereby granted, provided that the above copyright notice appear in all
+ * copies and that both that copyright notice and this permission notice
+ * appear in supporting documentation, and that the name of M.I.T. not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. Furthermore if you
+ * modify this software you must label your software as modified software
+ * and not distribute it in such a fashion that it might be confused with
+ * the original MIT software. M.I.T. makes no representations about the
+ * suitability of this software for any purpose. It is provided "as is"
+ * without express or implied warranty.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
+ * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * Individual source code files are copyright MIT, Cygnus Support,
+ * OpenVision, Oracle, Sun Soft, FundsXpress, and others.
+ *
+ * Project Athena, Athena, Athena MUSE, Discuss, Hesiod, Kerberos, Moira,
+ * and Zephyr are trademarks of the Massachusetts Institute of Technology
+ * (MIT). No commercial use of these trademarks may be made without prior
+ * written permission of MIT.
+ *
+ * "Commercial use" means use of a name in a product or other for-profit
+ * manner. It does NOT prevent a commercial firm from referring to the MIT
+ * trademarks in order to convey information (although in doing so,
+ * recognition of their trademark status should be given).
+ * $
+ */
+
+/*
+ * Manages ccache objects.
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include "CredentialsCache.h"
+#include "datastore.h"
+
+/**
+ * ccache_new()
+ *
+ * Purpose: Allocate and initialize new credentials cache for the specified principal
+ * and version
+ *
+ * Return: ccNoError - success
+ * ccErrInvalidString - name or principal is NULL
+ * ccErrBadCredentialsVersion - unsupported creds type
+ * ccErrBadParam - outCcachepp is NULL
+ * ccErrNoMem - malloc failed
+ */
+cc_int32
+ccs_ccache_new( char *name, char *principal, int cred_vers,
+ cc_server_ccache_t** outCCachepp)
+{
+ cc_server_ccache_t* ccache;
+
+ if (name == NULL || principal == NULL)
+ return ccErrInvalidString;
+
+ if (cred_vers != cc_credentials_v4 && cred_vers != cc_credentials_v5 &&
+ cred_vers != cc_credentials_v4_v5)
+ return ccErrBadCredentialsVersion;
+
+ if (outCCachepp == NULL)
+ return ccErrBadParam;
+
+ ccache = (cc_server_ccache_t*)malloc(sizeof(cc_server_ccache_t));
+ if (ccache == NULL)
+ return ccErrNoMem;
+
+ ccache->name = name;
+ ccache->principal_v4 = NULL;
+ ccache->principal_v5 = NULL;
+ ccache->changed = time(NULL);
+ ccache->kdc_offset = 0;
+ ccache->last_default = 0;
+ cci_generic_list_new(&ccache->active_iterators);
+ ccs_credentials_list_new(&ccache->creds);
+ ccache->is_default = 0;
+ ccache->kdc_set = 0;
+ ccache->versions = cred_vers;
+ ccache->mycontext = NULL;
+
+ ccs_ccache_set_principal(ccache, cred_vers, principal);
+ *outCCachepp = ccache;
+ return ccNoError;
+}
+
+/**
+ * ccs_ccache_check_version()
+ *
+ * Purpose: Check to see if the ccache and the creds have compatible versions.
+ *
+ * Return: ccNoError and compat = 1 if they are compatible
+ * ccNoError and compat = 0 if they are not compatible
+ *
+ * Errors: ccErrInvalidCCache - ccache is NULL
+ * ccErrBadParam - either creds or compat are NULL
+ */
+cc_int32
+ccs_ccache_check_version( const cc_server_ccache_t *ccache,
+ const cc_credentials_union* creds,
+ cc_uint32* compat)
+{
+ if (ccache == NULL)
+ return ccErrInvalidCCache;
+
+ if (creds == NULL || compat == NULL)
+ return ccErrBadParam;
+
+ if (ccache->versions == cc_credentials_v4_v5)
+ *compat = 1;
+ else if (ccache->versions == creds->version)
+ *compat = 1;
+ else
+ *compat = 0;
+
+ return ccNoError;
+}
+
+/**
+ccs_ccache_check_principal()
+
+Check to see if the client principal from the credentials matches
+the principal associated with the cache.
+
+* Return: ccNoError and compat = 1 if they are compatible
+* ccNoError and compat = 0 if they are not compatible
+*
+* Errors: ccErrInvalidCCache - ccache is NULL
+* ccErrBadParam - either creds or compat are NULL
+* ccErrBadCredentialVersion - unsupported credential type
+*/
+cc_int32
+ccs_ccache_check_principal( const cc_server_ccache_t *ccache,
+ const cc_credentials_union* creds,
+ cc_uint32* compat)
+{
+ if (ccache == NULL)
+ return ccErrInvalidCCache;
+
+ if (creds == NULL || compat == NULL)
+ return ccErrBadParam;
+
+ if (creds->version == cc_credentials_v4) {
+ if (strcmp(creds->credentials.credentials_v4->principal, ccache->principal_v4) == 0)
+ *compat = 1;
+ else
+ *compat = 0;
+ } else if (creds->version == cc_credentials_v5) {
+ if (strcmp(creds->credentials.credentials_v5->client, ccache->principal_v5) == 0)
+ *compat = 1;
+ else
+ *compat = 0;
+ } else {
+ return ccErrBadCredentialsVersion;
+ }
+ return ccNoError;
+}
+
+
+/**
+ * ccs_ccache_store_creds()
+ *
+ * Purpose: Stores the provided credentials into the provided cache. Validates the
+ * ability of the cache to store credentials of the given version and client
+ * principal.
+ *
+ * Return: 0 on success
+ * -1 on error
+ *
+ * Errors: ccErrNoMem
+ * ccErrBadCredentialsVersion
+ * ccErrBadInvalidCredentials
+ * ccErrInvalidCache
+ * ccErrBadParam
+ */
+cc_int32
+ccs_ccache_store_creds(cc_server_ccache_t *ccache, const cc_credentials_union* credentials)
+{
+ cc_server_credentials_t* stored_cred=NULL;
+ cc_uint32 valid_version, valid_principal;
+ cc_int32 code;
+
+ if (ccache == NULL)
+ return ccErrInvalidCCache;
+
+ if (credentials == NULL)
+ return ccErrBadParam;
+
+ code = ccs_ccache_check_version(ccache, credentials, &valid_version);
+ if (code != ccNoError) {
+ /* pass error on to caller */
+ goto bad;
+ }
+ code = ccs_ccache_check_principal(ccache, credentials, &valid_principal);
+ if (code != ccNoError) {
+ /* pass error on to caller */
+ goto bad;
+ }
+ if (valid_version && valid_principal) {
+ stored_cred = (cc_server_credentials_t*)malloc(sizeof(cc_server_credentials_t));
+ if (stored_cred == NULL) {
+ code = ccErrNoMem;
+ goto bad;
+ }
+ memcpy(&stored_cred->creds, credentials, sizeof(cc_credentials_union));
+
+ if (credentials->version == cc_credentials_v4) {
+ stored_cred->creds.credentials.credentials_v4 = (cc_credentials_v4_t*)malloc(sizeof(cc_credentials_v4_t));
+ if (stored_cred->creds.credentials.credentials_v4 == NULL) {
+ code = ccErrNoMem;
+ goto bad;
+ }
+
+ memcpy(stored_cred->creds.credentials.credentials_v4, credentials->credentials.credentials_v4, sizeof(cc_credentials_v4_t));
+ } else if (credentials->version == cc_credentials_v5) {
+ stored_cred->creds.credentials.credentials_v5 = (cc_credentials_v5_t*)malloc(sizeof(cc_credentials_v5_t));
+ if (stored_cred->creds.credentials.credentials_v5 == NULL) {
+ code = ccErrNoMem;
+ goto bad;
+ }
+
+ memcpy(stored_cred->creds.credentials.credentials_v5, credentials->credentials.credentials_v5, sizeof(cc_credentials_v5_t));
+ } else {
+ code = ccErrBadCredentialsVersion;
+ goto bad;
+ }
+
+ code = ccs_credentials_list_append(ccache->creds, stored_cred, NULL);
+ if ( code != ccNoError ) {
+ /* pass error on to caller */
+ goto bad;
+ }
+ if (ccache->creds->head->data == (cc_uint8 *)stored_cred)
+ stored_cred->is_default = 1; /*we're first on the list, so we're default*/
+
+ ccs_ccache_changed(ccache);
+ return ccNoError;
+ } else {
+#ifdef DEBUG
+ printf("vers: %d\tprincipal: %d\n",
+ valid_version, valid_principal);
+#endif /* DEBUG */
+ code = ccErrInvalidCredentials;
+ goto bad;
+ }
+
+ bad:
+ if (stored_cred)
+ free(stored_cred);
+ return code; /* error */
+}
+
+/**
+ * ccs_ccache_changed()
+ *
+ * Purpose: Updates the last update time for the ccache and its associated context.
+ * Provides a location from which interested parties should be notified
+ * of cache updates.
+ *
+ * Return: none
+ *
+ * Errors: none
+ */
+void
+ccs_ccache_changed(cc_server_ccache_t* ccache)
+{
+ ccache->changed = time(NULL);
+ if (ccache->mycontext != NULL)
+ ccache->mycontext->changed = time(NULL);
+
+ /* XXX - notify registered listeners when implemented */
+}
+
+/**
+ * ccs_ccache_rem_creds()
+ *
+ * Purpose: Removes the specified credential object from the specified cache if
+ * it exists
+ *
+ * Return: 0 on success (credential is not in the cache)
+ * -1 on error
+ *
+ * Errors: ccErrBadParam, ccErrNoMem (from cc_credentials_list_iterator)
+ *
+ * Verify: does the memory associated with stored_cred->creds need to be freed?
+ *
+ */
+cc_int32
+ccs_ccache_rem_creds(cc_server_ccache_t *ccache, const cc_credentials_union* credentials)
+{
+ cc_credentials_iterate_t* credentials_iterator=NULL, *active;
+ cc_generic_iterate_t* generic_iterator=NULL;
+ cc_credentials_list_node_t* credentials_node;
+ cc_generic_list_node_t* generic_node;
+ cc_server_credentials_t* stored_cred;
+ cc_int8 changed = 0;
+ cc_int32 code = 0;
+
+ if (ccache == NULL)
+ return ccErrInvalidCCache;
+
+ if (credentials == NULL)
+ return ccErrBadParam;
+
+ code = ccs_credentials_list_iterator(ccache->creds, &credentials_iterator);
+ if (code != ccNoError) {
+ /* pass error to caller */
+ goto cleanup;
+ }
+
+ while (ccs_credentials_iterate_has_next(credentials_iterator)) {
+ code = ccs_credentials_iterate_next(credentials_iterator, &credentials_node);
+ stored_cred = (cc_server_credentials_t*)credentials_node->data;
+ if (memcmp(&stored_cred->creds,credentials,sizeof(cc_credentials_union)) == 0) {
+ /* XXX - do we need to free(stored_cred->creds) ? */
+ free(credentials_node->data);
+ changed = 1;
+
+ /*If any iterator's next points to the deleted node, make it point to the next node*/
+ code = cci_generic_list_iterator(ccache->active_iterators, &generic_iterator);
+ while (cci_generic_iterate_has_next(generic_iterator)) {
+ code = cci_generic_iterate_next(generic_iterator, &generic_node);
+ active = (cc_credentials_iterate_t*)generic_node->data;
+ if (active->next == credentials_node)
+ active->next = active->next->next;
+ }
+ code = cci_generic_free_iterator(generic_iterator);
+ generic_iterator = NULL;
+
+ if (credentials_node == ccache->creds->head) { /*removing the default, must make next cred default*/
+ code = ccs_credentials_list_remove_element(ccache->creds, credentials_node);
+
+ if (ccache->creds->head != NULL)
+ ((cc_server_credentials_t*)ccache->creds->head->data)->is_default = 1;
+ } else {
+ code = ccs_credentials_list_remove_element(ccache->creds, credentials_node);
+ }
+ break;
+ }
+ }
+
+ cleanup:
+ if (changed)
+ ccs_ccache_changed(ccache);
+ if (credentials_iterator)
+ ccs_credentials_free_iterator(credentials_iterator);
+ if (generic_iterator)
+ cci_generic_free_iterator(generic_iterator);
+ return code;
+}
+
+/**
+ * ccs_ccache_move()
+ *
+ * Purpose: Destroys the existing contents of the destination and copies
+ * all credentials from the source to the destination
+ *
+ * Return: 0 on success
+ * -1 on error
+ *
+ * Errors: ccBadNoMem
+ *
+ */
+
+cc_int32
+ccs_ccache_move(cc_server_ccache_t *source, cc_server_ccache_t* destination)
+{
+ cc_generic_list_node_t* node;
+ cc_generic_iterate_t* iterator;
+ cc_credentials_iterate_t* cur;
+ cc_int32 code;
+
+ if (source == NULL || destination == NULL)
+ return ccErrBadParam;
+
+ code = ccs_credentials_list_destroy(destination->creds);
+ if ( code != ccNoError )
+ return code;
+
+ code = ccs_credentials_list_copy(source->creds, &destination->creds);
+ if ( code != ccNoError )
+ return code;
+
+ destination->versions = source->versions;
+ destination->kdc_offset = source->kdc_offset;
+ destination->last_default = 0;
+
+ /*reset all active iterators to point to the head of the new creds list*/
+ if (destination->active_iterators->head != NULL) {
+ code = cci_generic_list_iterator(destination->active_iterators, &iterator);
+ while (cci_generic_iterate_has_next(iterator)) {
+ code = cci_generic_iterate_next(iterator, &node);
+ cur = (cc_credentials_iterate_t*)node->data;
+ cur->next = destination->creds->head;
+ }
+ code = cci_generic_free_iterator(iterator);
+ }
+
+ ccs_ccache_changed(destination);
+ return code;
+}
+
+/**
+ * ccs_ccache_get_kdc_time_offset()
+ *
+ * Purpose: Retrieves the kdc_time_offset from the ccache if set
+ *
+ * Return: 0 on success
+ * -1 on error
+ *
+ * Errors: ccErrBadParam, ccErrTimeOffsetNotSet
+ *
+ */
+cc_int32
+ccs_ccache_get_kdc_time_offset(cc_server_ccache_t* ccache, cc_time64* offset)
+{
+ if (ccache == NULL)
+ return ccErrInvalidCCache;
+
+ if (offset == NULL)
+ return ccErrBadParam;
+
+ if (!ccache->kdc_set)
+ return ccErrTimeOffsetNotSet;
+
+ *offset = ccache->kdc_offset;
+ return ccNoError;
+}
+
+/**
+ * ccs_ccache_set_kdc_time_offset()
+ *
+ * Purpose: Sets the kdc time offset in the designated ccache
+ *
+ * Return: 0 on success
+ * -1 on error
+ *
+ * Errors: ccErrBadParam
+ *
+ */
+cc_int32
+ccs_ccache_set_kdc_time_offset(cc_server_ccache_t* ccache, cc_time64 offset)
+{
+ if (ccache == NULL)
+ return ccErrInvalidCCache;
+
+ ccache->kdc_offset = offset;
+ ccache->kdc_set = 1;
+ ccs_ccache_changed(ccache);
+
+ return ccNoError;
+}
+
+/**
+ * ccs_ccache_clear_kdc_time_offset()
+ *
+ * Purpose: Clear the kdc time offset in the designated ccache
+ *
+ * Return: 0 on success
+ * -1 on error
+ *
+ * Errors: ccErrBadParam
+ */
+cc_int32
+ccs_ccache_clear_kdc_time_offset(cc_server_ccache_t* ccache)
+{
+ if (ccache == NULL)
+ return ccErrInvalidCCache;
+
+ ccache->kdc_offset = 0;
+ ccache->kdc_set = 0;
+ ccs_ccache_changed(ccache);
+
+ return ccNoError;
+}
+
+/**
+ * ccs_ccache_new_iterator()
+ *
+ * Purpose: Retrieve an iterator for the designated cache
+ *
+ * Return: 0 on success
+ * -1 on error
+ *
+ * Errors: ccErrBadParam, ccBadNoMem
+ */
+cc_int32
+ccs_ccache_new_iterator(cc_server_ccache_t* ccache, cc_credentials_iterate_t** iterator)
+{
+ cc_int32 code;
+
+ if (ccache == NULL)
+ return ccErrInvalidCCache;
+
+ if (iterator == NULL)
+ return ccErrBadParam;
+
+ code = ccs_credentials_list_iterator(ccache->creds, iterator);
+ if (code != ccNoError)
+ return code;
+
+ code = cci_generic_list_prepend(ccache->active_iterators, *iterator, sizeof(cc_credentials_iterate_t), NULL);
+ if (code != ccNoError)
+ return code;
+
+ return ccNoError;
+}
+
+/**
+ * ccs_ccache_get_principal()
+ *
+ * Purpose: Retrieves the client principal associated with the designated cache.
+ * The value is returned
+ * Return:
+ *
+ * Errors:
+ */
+cc_int32
+ccs_ccache_get_principal(cc_server_ccache_t* ccache, cc_int32 version, char ** principal)
+{
+ char *p = NULL;
+
+ switch ( version ) {
+ case cc_credentials_v4:
+ p = ccache->principal_v4;
+ break;
+ case cc_credentials_v5:
+ p = ccache->principal_v5;
+ break;
+ default:
+ return ccErrBadCredentialsVersion;
+ }
+
+ *principal = (char *)malloc(strlen(p)+1);
+ if ( *principal == NULL )
+ return ccErrNoMem;
+
+ strcpy(*principal, p);
+ return ccNoError;
+}
+
+/**
+ * Purpose: Releases the memory associated with a ccache principal
+ *
+ * Return:
+ *
+ * Errors:
+ *
+ */
+cc_int32
+ccs_ccache_free_principal(char * principal)
+{
+ if ( principal == NULL )
+ return ccErrBadParam;
+
+ free(principal);
+ return ccNoError;
+}
+
+/**
+ * ccache_set_principal()
+ *
+ * Purpose: Assigns a principal to the designated ccache and credential version.
+ * If the api version is 2, the cache is cleared of all existing
+ * credentials.
+ *
+ * Return: 0 on success
+ * -1 on error
+ *
+ * Errors: ccErrNoMem, ccErrBadCredentialsVersion
+ */
+cc_int32
+ccs_ccache_set_principal( cc_server_ccache_t* ccache, cc_int32 cred_version,
+ char* principal)
+{
+ cc_generic_iterate_t* generic_iterator;
+ cc_generic_list_node_t* generic_node;
+ cc_ccache_iterate_t* ccache_iterator;
+ cc_int32 code = ccNoError;
+
+ if (ccache == NULL)
+ return ccErrInvalidCCache;
+
+ if (principal == NULL)
+ return ccErrInvalidString;
+
+ switch (cred_version) {
+ case cc_credentials_v4:
+ case cc_credentials_v4_v5:
+ ccache->principal_v4 = (char *)malloc(strlen(principal) + 1);
+ if (ccache->principal_v4 == NULL)
+ return ccErrNoMem;
+ strcpy(ccache->principal_v4, principal);
+ if (cred_version != cc_credentials_v4_v5)
+ break;
+ /* fall-through if we are v4_v5 */
+ case cc_credentials_v5:
+ ccache->principal_v5 = (char *)malloc(strlen(principal) + 1);
+ if (ccache->principal_v5 == NULL) {
+ if (cred_version == cc_credentials_v4_v5) {
+ free(ccache->principal_v4);
+ ccache->principal_v4 = NULL;
+ }
+ return ccErrNoMem;
+ }
+ strcpy(ccache->principal_v5, principal);
+ break;
+ default:
+ return ccErrBadCredentialsVersion;
+ }
+
+ /*For API version 2 clients set_principal implies a flush of all creds*/
+ if (ccache->mycontext != NULL && ccache->mycontext->api_version == ccapi_version_2) {
+ ccs_credentials_list_destroy(ccache->creds);
+ ccs_credentials_list_new(&ccache->creds);
+
+ /*clean up active_iterators*/
+ code = cci_generic_list_iterator(ccache->active_iterators, &generic_iterator);
+ if (code == ccNoError) {
+ while (cci_generic_iterate_has_next(generic_iterator)) {
+ code = cci_generic_iterate_next(generic_iterator, &generic_node);
+ ccache_iterator = (cc_ccache_iterate_t*)generic_node->data;
+ ccache_iterator->next = NULL;
+ }
+ }
+ }
+
+ ccs_ccache_changed(ccache);
+
+ return code;
+}
+
+/**
+ * ccs_ccache_destroy()
+ *
+ * Purpose: Destroys an existing ccache
+ *
+ * Return: 0 on success
+ * -1 on errors
+ *
+ * Errors: ccErrBadParam
+ */
+cc_int32
+ccs_ccache_destroy(cc_server_ccache_t* ccache)
+{
+ cc_int32 code;
+
+ if ( ccache == NULL )
+ return ccErrInvalidCCache;
+
+ code = cci_generic_list_destroy(ccache->active_iterators);
+ code = ccs_credentials_list_destroy(ccache->creds);
+
+ if (ccache->mycontext != NULL)
+ code = ccs_context_rem_ccache(ccache->mycontext, ccache);
+
+ return code;
+}
+
+/**
+ * ccs_ccache_compare()
+ *
+ * Purpose: Returns a boolean value indicating if two caches are identical
+ * Implemented as pointer equivalence.
+ *
+ * Return: 1 if TRUE
+ * 0 if FALSE
+ *
+ * Errors: No errors
+ */
+cc_int32
+ccs_ccache_compare(cc_server_ccache_t* ccache1, cc_server_ccache_t* ccache2, cc_uint32 *result)
+{
+ if ( ccache1 == NULL || ccache2 == NULL )
+ return ccErrInvalidCCache;
+
+ if (ccache1 == ccache2)
+ *result = 1;
+ else
+ *result = 0;
+
+ return ccNoError;
+}
+
diff --git a/src/lib/ccapi/server/context.c b/src/lib/ccapi/server/ccs_context.c index f405a4defb..a168147940 100644 --- a/src/lib/ccapi/server/context.c +++ b/src/lib/ccapi/server/ccs_context.c @@ -1,325 +1,325 @@ -/* $Copyright: - * - * Copyright 2004 by the Massachusetts Institute of Technology. - * - * All rights reserved. - * - * Export of this software from the United States of America may require a - * specific license from the United States Government. It is the - * responsibility of any person or organization contemplating export to - * obtain such a license before exporting. - * - * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and distribute - * this software and its documentation for any purpose and without fee is - * hereby granted, provided that the above copyright notice appear in all - * copies and that both that copyright notice and this permission notice - * appear in supporting documentation, and that the name of M.I.T. not be - * used in advertising or publicity pertaining to distribution of the - * software without specific, written prior permission. Furthermore if you - * modify this software you must label your software as modified software - * and not distribute it in such a fashion that it might be confused with - * the original MIT software. M.I.T. makes no representations about the - * suitability of this software for any purpose. It is provided "as is" - * without express or implied warranty. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF - * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Individual source code files are copyright MIT, Cygnus Support, - * OpenVision, Oracle, Sun Soft, FundsXpress, and others. - * - * Project Athena, Athena, Athena MUSE, Discuss, Hesiod, Kerberos, Moira, - * and Zephyr are trademarks of the Massachusetts Institute of Technology - * (MIT). No commercial use of these trademarks may be made without prior - * written permission of MIT. - * - * "Commercial use" means use of a name in a product or other for-profit - * manner. It does NOT prevent a commercial firm from referring to the MIT - * trademarks in order to convey information (although in doing so, - * recognition of their trademark status should be given). - * $ - */ - -/* - * Functions to manipulate datastore layer contexts. - * - */ - -#include <stdio.h> -#include <stdlib.h> -#include <time.h> -#include <string.h> - -#include "CredentialsCache.h" -#include "datastore.h" - -int cc_myversion = 5; -char cc_vendor[] = "MIT C lang CCache V5"; -char cc_default_ccache_name[] = "krb5cc"; - - -cc_int32 -cci_context_new( int api_version, cc_auth_info_t* auth_info, - cc_session_info_t* session_info, cc_server_context_t** outContextpp ) -{ - cc_server_context_t* ctx; - - if ( outContextpp == NULL ) - return ccErrBadParam; - - ctx = (cc_server_context_t*)malloc(sizeof(cc_server_context_t)); - if (ctx == NULL) - return ccErrNoMem; - - cci_ccache_list_new(&ctx->ccaches); - cci_generic_list_new(&ctx->active_iterators); - ctx->api_version = api_version; - ctx->auth_info = auth_info; - ctx->session_info = session_info; - ctx->changed = time(NULL); - - *outContextpp = ctx; - return ccNoError; -} - -cc_int32 -cci_context_get_default_ccache_name(cc_server_context_t* ctx, char ** outNamepp) -{ - cc_server_ccache_t* default_ccache; - - if (outNamepp == NULL) - return ccErrBadParam; - - if (ctx == NULL) - return ccErrInvalidContext; - - if (ctx->ccaches->head != NULL) { - default_ccache = (cc_server_ccache_t*)ctx->ccaches->head->data; - *outNamepp = default_ccache->name; - } else { - *outNamepp = cc_default_ccache_name; - } - return ccNoError; -} - - -cc_int32 -cci_context_find_ccache( cc_server_context_t* ctx, char *name, - cc_server_ccache_t** outCcachepp ) -{ - cc_ccache_iterate_t* ccache_iterator; - cc_ccache_list_node_t* ccache_node; - cc_server_ccache_t* ccache; - cc_int32 code; - - if (ctx == NULL) - return ccErrInvalidContext; - - if (name == NULL) - return ccErrInvalidString; - - if (outCcachepp == NULL) - return ccErrBadParam; - - code = cci_ccache_list_iterator(ctx->ccaches, &ccache_iterator); - while (cci_ccache_iterate_has_next(ccache_iterator)) { - code = cci_ccache_iterate_next(ccache_iterator, &ccache_node); - ccache = (cc_server_ccache_t *)ccache_node->data; - if (strcmp(ccache->name, name) == 0) { - free(ccache_iterator); - *outCcachepp = ccache; - return ccNoError; - } - } - free(ccache_iterator); - return ccErrCCacheNotFound; -} - -cc_int32 -cci_context_open_ccache( cc_server_context_t* ctx, char *name, - cc_server_ccache_t** outCcachepp ) -{ - return cci_context_find_ccache(ctx, name, outCcachepp); -} - - -cc_int32 -cci_context_create_ccache( cc_server_context_t* ctx, char *name, int creds_version, - char *principal, cc_server_ccache_t** outCcachepp ) -{ - cc_server_ccache_t* ccache; - cc_int32 code; - - if (ctx == NULL) - return ccErrInvalidContext; - - if (outCcachepp == NULL) - return ccErrBadParam; - - if (name == NULL || principal == NULL) - return ccErrInvalidString; - - if (creds_version != cc_credentials_v4 && creds_version != cc_credentials_v5 && - creds_version != cc_credentials_v4_v5) - return ccErrBadCredentialsVersion; - - code = cci_context_find_ccache(ctx, name, &ccache); - if (code == ccNoError) { - code = cci_ccache_set_principal(ccache, creds_version, principal); - } else { - code = cci_ccache_new(name, principal, creds_version, &ccache); - if (code != ccNoError) - return code; /*let caller deal with error*/ - - ccache->mycontext = ctx; - ctx->changed = time(NULL); - cci_ccache_list_append(ctx->ccaches, ccache, NULL); - - if (ctx->ccaches->head->data == (cc_uint8 *)ccache) { - ccache->is_default = 1; - } - } - *outCcachepp = ccache; - return ccNoError; -} - -cc_int32 -cci_context_create_default_ccache( cc_server_context_t* ctx, int creds_version, - char *principal, cc_server_ccache_t** outCcachepp ) -{ - cc_server_ccache_t* ccache, *old_default; - cc_int32 code; - - if (ctx == NULL) - return ccErrInvalidContext; - - if (outCcachepp == NULL) - return ccErrBadParam; - - if (principal == NULL) - return ccErrInvalidString; - - if (creds_version != cc_credentials_v4 && creds_version != cc_credentials_v5 && - creds_version != cc_credentials_v4_v5) - return ccErrBadCredentialsVersion; - - code = cci_context_find_ccache(ctx, cc_default_ccache_name, &ccache); - if (code == ccNoError) { - cci_ccache_set_principal(ccache, creds_version, principal); - } else { - code = cci_ccache_new(cc_default_ccache_name, principal, creds_version, &ccache); - if (code != ccNoError) - return code; /*let caller deal with error*/ - - ccache->mycontext = ctx; - ccache->is_default = 1; - ctx->changed = time(NULL); - - if (ctx->ccaches->head != NULL) { - old_default = (cc_server_ccache_t *)ctx->ccaches->head->data; - old_default->is_default = 0; - old_default->last_default = time(NULL); - } - - cci_ccache_list_prepend(ctx->ccaches, ccache, NULL); - } - *outCcachepp = ccache; - return ccNoError; -} - -cc_int32 -cci_context_ccache_iterator(cc_server_context_t* ctx, cc_ccache_iterate_t** iterpp) -{ - cc_ccache_iterate_t* ccache_iterator; - cc_int32 code; - - if (ctx == NULL) - return ccErrInvalidContext; - - if (iterpp == NULL) - return ccErrBadParam; - - code = cci_ccache_list_iterator(ctx->ccaches, &ccache_iterator); - if (code != ccNoError) - return code; - cci_generic_list_prepend(ctx->active_iterators, ccache_iterator, sizeof(cc_ccache_iterate_t), NULL); - - *iterpp = ccache_iterator; - return ccNoError; -} - -cc_int32 -cci_context_compare(cc_server_context_t* a, cc_server_context_t* b) -{ - if (a == b) - return 1; - else - return 0; -} - -cc_int32 -cci_context_destroy(cc_server_context_t* ctx) -{ - cc_ccache_iterate_t* ccache_iterator; - cc_ccache_list_node_t* ccache_node; - cc_server_ccache_t* ccache; - cc_int32 code; - - if (ctx == NULL) - return ccErrInvalidContext; - - cci_generic_list_destroy(ctx->active_iterators); - - code = cci_ccache_list_iterator(ctx->ccaches, &ccache_iterator); - while (cci_ccache_iterate_has_next(ccache_iterator)) { - code = cci_ccache_iterate_next(ccache_iterator, &ccache_node); - ccache = (cc_server_ccache_t *)ccache_node->data; - ccache_node->data = NULL; - cci_ccache_destroy(ccache); - } - cci_ccache_list_destroy(ctx->ccaches); - - return ccNoError; -} - -cc_int32 -cci_context_rem_ccache(cc_server_context_t* ctx, cc_server_ccache_t* ccache) -{ - cc_ccache_iterate_t* ccache_iterator; - cc_ccache_iterate_t* active_ccache_iterator; - cc_ccache_list_node_t* ccache_node; - cc_server_ccache_t* list_ccache; - cc_generic_list_node_t* gen_node; - cc_generic_iterate_t* gen_iterator; - cc_int32 code; - - if (ctx == NULL) - return ccErrInvalidContext; - - if (ccache == NULL) - return ccErrInvalidCCache; - - code = cci_ccache_list_iterator(ctx->ccaches, &ccache_iterator); - while (cci_ccache_iterate_has_next(ccache_iterator)) { - code = cci_ccache_iterate_next(ccache_iterator, &ccache_node); - list_ccache = (cc_server_ccache_t *)ccache_node->data; - - if (list_ccache == ccache) { - code = cci_generic_list_iterator(ctx->active_iterators, &gen_iterator); - while (cci_generic_iterate_has_next(gen_iterator)) { - code = cci_generic_iterate_next(gen_iterator, &gen_node); - active_ccache_iterator = (cc_server_ccache_t *)gen_node->data; - if (active_ccache_iterator->next == ccache_node) { - active_ccache_iterator->next = active_ccache_iterator->next->next; - } - } - free(gen_iterator); - code = cci_ccache_list_remove_element(ctx->ccaches, ccache_node); - break; - } - } - free(ccache_iterator); - return ccNoError; -} - +/* $Copyright:
+ *
+ * Copyright 2004-2006 by the Massachusetts Institute of Technology.
+ *
+ * All rights reserved.
+ *
+ * Export of this software from the United States of America may require a
+ * specific license from the United States Government. It is the
+ * responsibility of any person or organization contemplating export to
+ * obtain such a license before exporting.
+ *
+ * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and distribute
+ * this software and its documentation for any purpose and without fee is
+ * hereby granted, provided that the above copyright notice appear in all
+ * copies and that both that copyright notice and this permission notice
+ * appear in supporting documentation, and that the name of M.I.T. not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. Furthermore if you
+ * modify this software you must label your software as modified software
+ * and not distribute it in such a fashion that it might be confused with
+ * the original MIT software. M.I.T. makes no representations about the
+ * suitability of this software for any purpose. It is provided "as is"
+ * without express or implied warranty.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
+ * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * Individual source code files are copyright MIT, Cygnus Support,
+ * OpenVision, Oracle, Sun Soft, FundsXpress, and others.
+ *
+ * Project Athena, Athena, Athena MUSE, Discuss, Hesiod, Kerberos, Moira,
+ * and Zephyr are trademarks of the Massachusetts Institute of Technology
+ * (MIT). No commercial use of these trademarks may be made without prior
+ * written permission of MIT.
+ *
+ * "Commercial use" means use of a name in a product or other for-profit
+ * manner. It does NOT prevent a commercial firm from referring to the MIT
+ * trademarks in order to convey information (although in doing so,
+ * recognition of their trademark status should be given).
+ * $
+ */
+
+/*
+ * Functions to manipulate datastore layer contexts.
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include <string.h>
+
+#include "CredentialsCache.h"
+#include "datastore.h"
+
+int cc_myversion = 5;
+char cc_vendor[] = "MIT C lang CCache V5";
+char cc_default_ccache_name[] = "krb5cc";
+
+
+cc_int32
+ccs_context_new( int api_version, cc_auth_info_t* auth_info,
+ cc_session_info_t* session_info, cc_server_context_t** outContextpp )
+{
+ cc_server_context_t* ctx;
+
+ if ( outContextpp == NULL )
+ return ccErrBadParam;
+
+ ctx = (cc_server_context_t*)malloc(sizeof(cc_server_context_t));
+ if (ctx == NULL)
+ return ccErrNoMem;
+
+ ccs_ccache_list_new(&ctx->ccaches);
+ cci_generic_list_new(&ctx->active_iterators);
+ ctx->api_version = api_version;
+ ctx->auth_info = auth_info;
+ ctx->session_info = session_info;
+ ctx->changed = time(NULL);
+
+ *outContextpp = ctx;
+ return ccNoError;
+}
+
+cc_int32
+ccs_context_get_default_ccache_name(cc_server_context_t* ctx, char ** outNamepp)
+{
+ cc_server_ccache_t* default_ccache;
+
+ if (outNamepp == NULL)
+ return ccErrBadParam;
+
+ if (ctx == NULL)
+ return ccErrInvalidContext;
+
+ if (ctx->ccaches->head != NULL) {
+ default_ccache = (cc_server_ccache_t*)ctx->ccaches->head->data;
+ *outNamepp = default_ccache->name;
+ } else {
+ *outNamepp = cc_default_ccache_name;
+ }
+ return ccNoError;
+}
+
+
+cc_int32
+ccs_context_find_ccache( cc_server_context_t* ctx, char *name,
+ cc_server_ccache_t** outCcachepp )
+{
+ cc_ccache_iterate_t* ccache_iterator;
+ cc_ccache_list_node_t* ccache_node;
+ cc_server_ccache_t* ccache;
+ cc_int32 code;
+
+ if (ctx == NULL)
+ return ccErrInvalidContext;
+
+ if (name == NULL)
+ return ccErrInvalidString;
+
+ if (outCcachepp == NULL)
+ return ccErrBadParam;
+
+ code = ccs_ccache_list_iterator(ctx->ccaches, &ccache_iterator);
+ while (ccs_ccache_iterate_has_next(ccache_iterator)) {
+ code = ccs_ccache_iterate_next(ccache_iterator, &ccache_node);
+ ccache = (cc_server_ccache_t *)ccache_node->data;
+ if (strcmp(ccache->name, name) == 0) {
+ free(ccache_iterator);
+ *outCcachepp = ccache;
+ return ccNoError;
+ }
+ }
+ free(ccache_iterator);
+ return ccErrCCacheNotFound;
+}
+
+cc_int32
+ccs_context_open_ccache( cc_server_context_t* ctx, char *name,
+ cc_server_ccache_t** outCcachepp )
+{
+ return ccs_context_find_ccache(ctx, name, outCcachepp);
+}
+
+
+cc_int32
+ccs_context_create_ccache( cc_server_context_t* ctx, char *name, int creds_version,
+ char *principal, cc_server_ccache_t** outCcachepp )
+{
+ cc_server_ccache_t* ccache;
+ cc_int32 code;
+
+ if (ctx == NULL)
+ return ccErrInvalidContext;
+
+ if (outCcachepp == NULL)
+ return ccErrBadParam;
+
+ if (name == NULL || principal == NULL)
+ return ccErrInvalidString;
+
+ if (creds_version != cc_credentials_v4 && creds_version != cc_credentials_v5 &&
+ creds_version != cc_credentials_v4_v5)
+ return ccErrBadCredentialsVersion;
+
+ code = ccs_context_find_ccache(ctx, name, &ccache);
+ if (code == ccNoError) {
+ code = ccs_ccache_set_principal(ccache, creds_version, principal);
+ } else {
+ code = ccs_ccache_new(name, principal, creds_version, &ccache);
+ if (code != ccNoError)
+ return code; /*let caller deal with error*/
+
+ ccache->mycontext = ctx;
+ ctx->changed = time(NULL);
+ ccs_ccache_list_append(ctx->ccaches, ccache, NULL);
+
+ if (ctx->ccaches->head->data == (cc_uint8 *)ccache) {
+ ccache->is_default = 1;
+ }
+ }
+ *outCcachepp = ccache;
+ return ccNoError;
+}
+
+cc_int32
+ccs_context_create_default_ccache( cc_server_context_t* ctx, int creds_version,
+ char *principal, cc_server_ccache_t** outCcachepp )
+{
+ cc_server_ccache_t* ccache, *old_default;
+ cc_int32 code;
+
+ if (ctx == NULL)
+ return ccErrInvalidContext;
+
+ if (outCcachepp == NULL)
+ return ccErrBadParam;
+
+ if (principal == NULL)
+ return ccErrInvalidString;
+
+ if (creds_version != cc_credentials_v4 && creds_version != cc_credentials_v5 &&
+ creds_version != cc_credentials_v4_v5)
+ return ccErrBadCredentialsVersion;
+
+ code = ccs_context_find_ccache(ctx, cc_default_ccache_name, &ccache);
+ if (code == ccNoError) {
+ ccs_ccache_set_principal(ccache, creds_version, principal);
+ } else {
+ code = ccs_ccache_new(cc_default_ccache_name, principal, creds_version, &ccache);
+ if (code != ccNoError)
+ return code; /*let caller deal with error*/
+
+ ccache->mycontext = ctx;
+ ccache->is_default = 1;
+ ctx->changed = time(NULL);
+
+ if (ctx->ccaches->head != NULL) {
+ old_default = (cc_server_ccache_t *)ctx->ccaches->head->data;
+ old_default->is_default = 0;
+ old_default->last_default = time(NULL);
+ }
+
+ ccs_ccache_list_prepend(ctx->ccaches, ccache, NULL);
+ }
+ *outCcachepp = ccache;
+ return ccNoError;
+}
+
+cc_int32
+ccs_context_ccache_iterator(cc_server_context_t* ctx, cc_ccache_iterate_t** iterpp)
+{
+ cc_ccache_iterate_t* ccache_iterator;
+ cc_int32 code;
+
+ if (ctx == NULL)
+ return ccErrInvalidContext;
+
+ if (iterpp == NULL)
+ return ccErrBadParam;
+
+ code = ccs_ccache_list_iterator(ctx->ccaches, &ccache_iterator);
+ if (code != ccNoError)
+ return code;
+ cci_generic_list_prepend(ctx->active_iterators, ccache_iterator, sizeof(cc_ccache_iterate_t), NULL);
+
+ *iterpp = ccache_iterator;
+ return ccNoError;
+}
+
+cc_int32
+ccs_context_compare(cc_server_context_t* a, cc_server_context_t* b)
+{
+ if (a == b)
+ return 1;
+ else
+ return 0;
+}
+
+cc_int32
+ccs_context_destroy(cc_server_context_t* ctx)
+{
+ cc_ccache_iterate_t* ccache_iterator;
+ cc_ccache_list_node_t* ccache_node;
+ cc_server_ccache_t* ccache;
+ cc_int32 code;
+
+ if (ctx == NULL)
+ return ccErrInvalidContext;
+
+ cci_generic_list_destroy(ctx->active_iterators);
+
+ code = ccs_ccache_list_iterator(ctx->ccaches, &ccache_iterator);
+ while (ccs_ccache_iterate_has_next(ccache_iterator)) {
+ code = ccs_ccache_iterate_next(ccache_iterator, &ccache_node);
+ ccache = (cc_server_ccache_t *)ccache_node->data;
+ ccache_node->data = NULL;
+ ccs_ccache_destroy(ccache);
+ }
+ ccs_ccache_list_destroy(ctx->ccaches);
+
+ return ccNoError;
+}
+
+cc_int32
+ccs_context_rem_ccache(cc_server_context_t* ctx, cc_server_ccache_t* ccache)
+{
+ cc_ccache_iterate_t* ccache_iterator;
+ cc_ccache_iterate_t* active_ccache_iterator;
+ cc_ccache_list_node_t* ccache_node;
+ cc_server_ccache_t* list_ccache;
+ cc_generic_list_node_t* gen_node;
+ cc_generic_iterate_t* gen_iterator;
+ cc_int32 code;
+
+ if (ctx == NULL)
+ return ccErrInvalidContext;
+
+ if (ccache == NULL)
+ return ccErrInvalidCCache;
+
+ code = ccs_ccache_list_iterator(ctx->ccaches, &ccache_iterator);
+ while (ccs_ccache_iterate_has_next(ccache_iterator)) {
+ code = ccs_ccache_iterate_next(ccache_iterator, &ccache_node);
+ list_ccache = (cc_server_ccache_t *)ccache_node->data;
+
+ if (list_ccache == ccache) {
+ code = cci_generic_list_iterator(ctx->active_iterators, &gen_iterator);
+ while (cci_generic_iterate_has_next(gen_iterator)) {
+ code = cci_generic_iterate_next(gen_iterator, &gen_node);
+ active_ccache_iterator = (cc_ccache_iterate_t *)gen_node->data;
+ if (active_ccache_iterator->next == ccache_node) {
+ active_ccache_iterator->next = active_ccache_iterator->next->next;
+ }
+ }
+ free(gen_iterator);
+ code = ccs_ccache_list_remove_element(ctx->ccaches, ccache_node);
+ break;
+ }
+ }
+ free(ccache_iterator);
+ return ccNoError;
+}
+
diff --git a/src/lib/ccapi/server/lists.c b/src/lib/ccapi/server/ccs_lists.c index 882ecb7a06..779c17b7a0 100644 --- a/src/lib/ccapi/server/lists.c +++ b/src/lib/ccapi/server/ccs_lists.c @@ -1,996 +1,657 @@ -/* $Copyright: - * - * Copyright 2004 by the Massachusetts Institute of Technology. - * - * All rights reserved. - * - * Export of this software from the United States of America may require a - * specific license from the United States Government. It is the - * responsibility of any person or organization contemplating export to - * obtain such a license before exporting. - * - * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and distribute - * this software and its documentation for any purpose and without fee is - * hereby granted, provided that the above copyright notice appear in all - * copies and that both that copyright notice and this permission notice - * appear in supporting documentation, and that the name of M.I.T. not be - * used in advertising or publicity pertaining to distribution of the - * software without specific, written prior permission. Furthermore if you - * modify this software you must label your software as modified software - * and not distribute it in such a fashion that it might be confused with - * the original MIT software. M.I.T. makes no representations about the - * suitability of this software for any purpose. It is provided "as is" - * without express or implied warranty. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF - * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Individual source code files are copyright MIT, Cygnus Support, - * OpenVision, Oracle, Sun Soft, FundsXpress, and others. - * - * Project Athena, Athena, Athena MUSE, Discuss, Hesiod, Kerberos, Moira, - * and Zephyr are trademarks of the Massachusetts Institute of Technology - * (MIT). No commercial use of these trademarks may be made without prior - * written permission of MIT. - * - * "Commercial use" means use of a name in a product or other for-profit - * manner. It does NOT prevent a commercial firm from referring to the MIT - * trademarks in order to convey information (although in doing so, - * recognition of their trademark status should be given). - * $ - */ - - -/* - * Lists implementation. - * - */ - -#include <stdio.h> -#include <stdlib.h> -#include <memory.h> - -#include "CredentialsCache.h" -#include "datastore.h" - -/** - * cci_generic_iterate_has_next() - * - * Purpose: Determine if an iterator has a next element - * - * Return: 1 if another element exists - * 0 if no additional elements exist - * - * Errors: None - * - */ -cc_int32 -cci_generic_iterate_has_next(cc_generic_iterate_t *iterate) -{ - return ((iterate == NULL || iterate->next == NULL) ? 0 : 1); -} - -/** - * cci_generic_iterate_next() - * - * Purpose: Retrieve the next element from an iterator and advance - * the iterator - * - * Return: non-NULL, the next element in the iterator - * NULL, the iterator list is empty or iterator is invalid - * - * Errors: ccErrBadParam - * - */ -cc_int32 -cci_generic_iterate_next(cc_generic_iterate_t *iterator, cc_generic_list_node_t** nodepp) -{ - cc_generic_list_node_t* ret; - - if (iterator == NULL || nodepp == NULL) - return ccErrBadParam; - - ret = iterator->next; - if (iterator->next != NULL) - iterator->next = iterator->next->next; - - *nodepp = ret; - return ccNoError; -} - -/** - * cci_context_iterate_has_next() - * - * Purpose: Determine if a context iterator has a next element - * - * Return: 1 if another element exists - * 0 if no additional elements exist - */ -cc_int32 -cci_context_iterate_has_next(cc_context_iterate_t *iterate) -{ - if ( iterate == NULL ) - return 0; - - return cci_generic_iterate_has_next((cc_generic_iterate_t*)iterate); -} - -/** - * cci_context_iterate_next() - * - * Purpose: Retrieve the next element from a context iterator and advance - * the iterator - * - * Return: non-NULL, the next element in the iterator - * NULL, the iterator list is empty or iterator is invalid - * - * Errors: ccErrBadParam - * - */ -cc_int32 -cci_context_iterate_next(cc_context_iterate_t *iterate, cc_context_list_node_t ** nodepp) -{ - if ( iterate == NULL || nodepp == NULL) - return ccErrBadParam; - - return cci_generic_iterate_next((cc_generic_iterate_t*)iterate,(cc_context_list_node_t**)nodepp); -} - -/** - * cci_ccache_iterate_has_next() - * - * Purpose: Determine if a cache iterator has a next element - * - * Return: 1 if another element exists - * 0 if no additional elements exist - * -1 if error - * - * Errors: ccErrBadParam - * - */ -cc_int32 -cci_ccache_iterate_has_next(cc_ccache_iterate_t *iterate) -{ - if ( iterate == NULL ) - return 0; - return cci_generic_iterate_has_next((cc_generic_iterate_t*)iterate); -} - -/** - * cci_ccache_iterate_next() - * - * Purpose: Retrieve the next element from a ccache iterator and advance - * the iterator - * - * Return: non-NULL, the next element in the iterator - * NULL, the iterator list is empty or iterator is invalid - * - * Errors: ccErrBadParam - * - */ -cc_int32 -cci_ccache_iterate_next(cc_ccache_iterate_t *iterate, cc_ccache_list_node_t ** nodepp) -{ - if ( iterate == NULL || nodepp == NULL) - return ccErrBadParam; - - return cci_generic_iterate_next((cc_generic_iterate_t*)iterate, (cc_ccache_list_node_t**)nodepp); -} - -/** - * cci_credentials_iterate_has_next() - * - * Purpose: Determine if a credentials iterator has a next element - * - * Return: 1 if another element exists - * 0 if no additional elements exist - * -1 if error - * - * Errors: ccErrBadParam - * - */ -cc_int32 -cci_credentials_iterate_has_next(cc_credentials_iterate_t *iterate) -{ - if ( iterate == NULL ) - return 0; - - return cci_generic_iterate_has_next((cc_generic_iterate_t*)iterate); -} - -/** - * cci_credentials_iterate_next() - * - * Purpose: Retrieve the next element from a credentials iterator and advance - * the iterator - * - * Return: non-NULL, the next element in the iterator - * NULL, the iterator list is empty or iterator is invalid - * - * Errors: ccErrBadParam - * - */ -cc_int32 -cci_credentials_iterate_next(cc_credentials_iterate_t *iterate, cc_credentials_list_node_t** nodepp) -{ - if ( iterate == NULL || nodepp == NULL ) - return ccErrBadParam; - return cci_generic_iterate_next((cc_generic_iterate_t*)iterate, (cc_credentials_list_node_t**)nodepp); -} - -/** - * cci_generic_list_new() - * - * Purpose: Allocate new generic list - * - * Return: non-NULL, an empty list - * NULL, failure - * - * Errors: ccErrNoMem - * - */ -cc_int32 -cci_generic_list_new(cc_generic_list_head_t ** listpp) -{ - cc_generic_list_head_t* ret = (cc_generic_list_head_t *)malloc(sizeof(cc_generic_list_head_t)); - if (ret == NULL) - return ccErrNoMem; - - ret->type = generic; - ret->head = ret->tail = NULL; - *listpp = ret; - - return ccNoError; -} - -/** - * cci_generic_list_append() - * - * Purpose: Appends a new node containing a copy of 'len' bytes of 'data' - * - * Return: non-NULL, a pointer to the newly allocated node - * NULL, failure - * - * Errors: ccErrNoMem,ccErrBadParam - * - */ -cc_int32 -cci_generic_list_append(cc_generic_list_head_t *head, void *data, cc_uint32 len, cc_generic_list_node_t** nodepp) -{ - cc_generic_list_node_t* new_node; - - if ( data == NULL || len == 0 ) - return ccErrBadParam; - - new_node = (cc_generic_list_node_t *)malloc(sizeof(cc_generic_list_node_t)); - if (new_node == NULL) - return ccErrNoMem; - - new_node->data = malloc(len); - if ( new_node->data == NULL ) { - free(new_node); - return ccErrNoMem; - } - - memcpy(new_node->data,data,len); - new_node->len = len; - - if (head->head == NULL) { /*empty list*/ - head->head = new_node; - head->tail = new_node; - new_node->next = new_node->prev = NULL; - } else { - new_node->prev = head->tail; - head->tail->next = new_node; - head->tail = new_node; - new_node->next = NULL; - } - if (nodepp != NULL) - *nodepp = new_node; - return ccNoError; -} - -/** - * cci_generic_list_prepend() - * - * Purpose: Prepends a new node containing a copy of 'len' bytes of 'data' - * - * Return: non-NULL, a pointer to the newly allocated node - * NULL, failure - * - * Errors: ccErrNoMem, ccErrBadParam - * - */ -cc_int32 -cci_generic_list_prepend(cc_generic_list_head_t *head, void *data, cc_uint32 len, cc_generic_list_node_t** nodepp) -{ - cc_generic_list_node_t* new_node; - - if ( data == NULL || len == 0 ) - return ccErrBadParam; - - new_node = (cc_generic_list_node_t *)malloc(sizeof(cc_generic_list_node_t)); - if (new_node == NULL) - return ccErrNoMem; - - new_node->data = malloc(len); - if ( new_node->data == NULL ) { - free(new_node); - return ccErrNoMem; - } - - memcpy(new_node->data,data,len); - new_node->len = len; - - if (head->head == NULL) { /*empty list*/ - head->head = new_node; - head->tail = new_node; - new_node->prev = new_node->next = NULL; - } else { - new_node->next = head->head; - head->head->prev = new_node; - new_node->prev = NULL; - head->head = new_node; - } - - if (nodepp != NULL) - *nodepp = new_node; - - return ccNoError; -} - -/** - * cci_generic_list_remove_element() - * - * Purpose: Remove a node from the list - * - * Return: 0, success - * -1, failure - * - * Errors: ccErrBadParam - * - */ -cc_int32 -cci_generic_list_remove_element(cc_generic_list_head_t* head, cc_generic_list_node_t* rem) -{ - if (head->head == NULL || rem == NULL) - return ccErrBadParam; - - if (head->head == rem && head->tail == rem) { /*removing only element of list*/ - head->head = head->tail = NULL; - } else if (head->head == rem) { /*removing head*/ - head->head = head->head->next; - } else if (head->tail == rem) { /*removing tail*/ - head->tail = head->tail->prev; - head->tail->next = NULL; - } else { - rem->prev->next = rem->next; - rem->next->prev = rem->prev; - } - free(rem); - return ccNoError; -} - -/** - * cci_generic_free_element() - * - * Purpose: Free the memory associated with a node - * - * Return: 0, success - * -1, failure - * - * Errors: ccErrBadParam - * - */ -cc_int32 -cci_generic_free_element(cc_generic_list_node_t* node) -{ - if ( node == NULL ) - return ccErrBadParam; - - if ( node->data ) { - free(node->data); - node->data = NULL; - } - node->len = 0; - node->next = node->prev = NULL; - free(node); - return ccNoError; -} - - -/** - * cci_generic_list_destroy() - * - * Purpose: Deallocate a list and all of its contents - * - * Return: 0, success - * -1, failure - * - * Errors: ccErrBadParam - */ -cc_int32 -cci_generic_list_destroy(cc_generic_list_head_t* head) -{ - cc_generic_list_node_t *cur, *next; - cc_int32 ret = ccNoError; - - if ( head == NULL ) - return ccErrBadParam; - - for (cur = head->head; ret == ccNoError && cur != NULL; cur = next) { - next = cur->next; - ret = cci_generic_free_element(cur); - } - free(head); - return(ret); -} - -/** - * cci_context_list_destroy() - * - * Purpose: Deallocate a list and all of its contents - * - * Return: 0, success - * -1, failure - * - * Errors: ccErrBadParam - */ -cc_int32 -cci_context_list_destroy(cc_context_list_head_t* head) -{ - return cci_generic_list_destroy((cc_generic_list_head_t*)head); -} - -/** - * cci_ccache_list_destroy() - * - * Purpose: Deallocate a list and all of its contents - * - * Return: 0, success - * -1, failure - * - * Errors: ccErrBadParam - */ -cc_int32 -cci_ccache_list_destroy(cc_ccache_list_head_t* head) -{ - return cci_generic_list_destroy((cc_generic_list_head_t*)head); -} - -/** - * cci_credentials_list_destroy() - * - * Purpose: Deallocate a list and all of its contents - * - * Return: 0, success - * -1, failure - * - * Errors: ccErrBadParam - */ -cc_int32 -cci_credentials_list_destroy(cc_credentials_list_head_t* head) -{ - return cci_generic_list_destroy((cc_generic_list_head_t*)head); -} - -/** - * cci_generic_list_copy() - * - * Purpose: Copy a list - * - * Return: non-NULL, a new list - * NULL, failure - * - * Errors: ccErrBadParam, ccErrNoMem - * - */ -cc_int32 -cci_generic_list_copy(cc_generic_list_head_t* head, cc_generic_list_head_t** headpp) -{ - cc_generic_list_head_t* copy; - cc_generic_list_node_t *src_node, *dst_node; - cc_int32 code; - - if (head == NULL || headpp == NULL) - return ccErrBadParam; - - code = cci_generic_list_new(©); - if (code != ccNoError) - return code; - - for (src_node = head->head; src_node != NULL; src_node = src_node->next) { - code = cci_generic_list_append(copy, src_node->data, src_node->len, &dst_node); - if (code != ccNoError) { - cci_generic_list_destroy(copy); - return code; - } - } - *headpp = copy; - return ccNoError; -} - -/** - * cci_context_list_copy() - * - * Purpose: Copy a list - * - * Return: non-NULL, a new list - * NULL, failure - * - * Errors: ccErrBadParam, ccErrNoMem - * - */ -cc_int32 -cci_context_list_copy(cc_context_list_head_t* head, cc_context_list_head_t** headpp ) -{ - return cci_generic_list_copy((cc_generic_list_head_t*)head, (cc_context_list_head_t **)headpp); -} - -/** - * cci_ccache_list_copy() - * - * Purpose: Copy a list - * - * Return: non-NULL, a new list - * NULL, failure - * - * Errors: ccErrBadParam, ccErrNoMem - */ -cc_int32 -cci_ccache_list_copy(cc_ccache_list_head_t* head, cc_ccache_list_head_t** headpp) -{ - return cci_generic_list_copy((cc_generic_list_head_t*)head, (cc_ccache_list_head_t **)headpp); -} - -/** - * cci_credentials_list_copy() - * - * Purpose: Copy a list - * - * Return: non-NULL, a new list - * NULL, failure - * - * Errors: ccErrBadParam, ccErrNoMem - * - */ -cc_int32 -cci_credentials_list_copy(cc_credentials_list_head_t* head, cc_credentials_list_head_t** headpp) -{ - return cci_generic_list_copy((cc_generic_list_head_t*)head, (cc_credentials_list_head_t **)headpp); -} - - -/** - * cci_generic_list_iterator() - * - * Purpose: Allocate an iterator for the specified list - * - * Return: non-NULL, an iterator - * NULL, failure - * - * Errors: ccErrNoMem - * - */ -cc_int32 -cci_generic_list_iterator(cc_generic_list_head_t *head, cc_generic_iterate_t** headpp) -{ - cc_generic_iterate_t* iterator; - - if ( head == NULL || headpp == NULL ) - return ccErrBadParam; - - iterator = (cc_generic_iterate_t*)malloc(sizeof(cc_generic_iterate_t)); - if (iterator == NULL) - return ccErrNoMem; - - iterator->next = head->head; - *headpp = iterator; - return ccNoError; -} - -/** - * cci_generic_free_iterator() - * - * Purpose: Deallocate memory associated with an iterator - * - * Return: 0, success - * -1, failure - * - * Errors: ccErrBadParam - * - */ -cc_int32 -cci_generic_free_iterator(cc_generic_iterate_t* iterator) -{ - if ( iterator == NULL ) - return ccErrBadParam; - - iterator->next = NULL; - free(iterator); - return ccNoError; -} - - -/** - * cci_context_list_new() - * - * Purpose: Allocate a new context list - * - * Return: non-NULL, a new list - * NULL, failure - * - * Errors: ccErrNoMem - * - */ -cc_int32 -cci_context_list_new(cc_context_list_head_t ** headpp) -{ - cc_context_list_head_t *ret; - - if ( headpp == NULL ) - return ccErrBadParam; - - ret = (cc_context_list_head_t *)malloc(sizeof(cc_context_list_head_t)); - if (ret == NULL) - return ccErrNoMem; - ret->head = ret->tail = NULL; - *headpp = ret; - return ccNoError; -} - -/** - * cci_context_list_append() - * - * Purpose: Appends a new node containing a copy of 'len' bytes of 'data' - * - * Return: non-NULL, a pointer to the newly allocated node - * NULL, failure - * - * Errors: ccErrNoMem,ccErrBadParam - * - */ -cc_int32 -cci_context_list_append(cc_context_list_head_t *head, cc_server_context_t *data, cc_context_list_node_t** nodepp) -{ - return cci_generic_list_append((cc_generic_list_head_t *)head, (void *)data, sizeof(cc_server_context_t), (cc_context_list_node_t**)nodepp); -} - -/** - * cci_context_list_prepend() - * - * Purpose: Prepends a new node containing a copy of 'len' bytes of 'data' - * - * Return: non-NULL, a pointer to the newly allocated node - * NULL, failure - * - * Errors: ccErrNoMem,ccErrBadParam - * - */ -cc_int32 -cci_context_list_prepend(cc_context_list_head_t *head, cc_server_context_t *data, cc_context_list_node_t** nodepp ) -{ - return cci_generic_list_prepend((cc_generic_list_head_t *)head, (void *)data, sizeof(cc_server_context_t), (cc_context_list_node_t**)nodepp); -} - -/** - * cci_context_list_remove_element - * - * Purpose: Remove a node from the list - * - * Return: 0, success - * -1, failure - * - * Errors: ccErrBadParam - */ -cc_int32 -cci_context_list_remove_element(cc_context_list_head_t* head, cc_context_list_node_t* rem) -{ - return cci_generic_list_remove_element((cc_generic_list_head_t*)head, (cc_generic_list_node_t*)rem); -} - -/** - * cci_context_list_iterator() - * - * Purpose: Allocate an iterator for the specified list - * - * Return: non-NULL, an iterator - * NULL, failure - * - * Errors: ccErrNoMem - * - */ -cc_int32 -cci_context_list_iterator(cc_context_list_head_t *head, cc_context_iterate_t** iterpp) -{ - cc_context_iterate_t* iterator; - - if ( head == NULL || iterpp == NULL ) - return ccErrBadParam; - - iterator = (cc_context_iterate_t*)malloc(sizeof(cc_context_iterate_t)); - if (iterator == NULL) - return ccErrNoMem; - - iterator->next = head->head; - *iterpp = iterator; - return ccNoError; -} - -/** - * cci_context_free_iterator() - * - * Purpose: Deallocate memory associated with an iterator - * - * Return: 0, success - * -1, failure - * - * Errors: ccErrBadParam - * - */ -cc_int32 -cci_context_free_iterator(cc_context_iterate_t* iterator) -{ - if ( iterator == NULL ) - return ccErrBadParam; - - iterator->next = NULL; - free(iterator); - return ccNoError; -} - -/** - * cci_ccache_list_new() - * - * Purpose: Allocate a new ccache list - * - * Return: non-NULL, a new list - * NULL, failure - * - * Errors: ccErrNoMem - */ -cc_int32 -cci_ccache_list_new(cc_ccache_list_head_t ** listpp) -{ - cc_ccache_list_head_t *ret; - - if ( listpp == NULL ) - return ccErrBadParam; - - ret = (cc_ccache_list_head_t *)malloc(sizeof(cc_ccache_list_head_t)); - if (ret == NULL) - return ccErrNoMem; - - ret->head = ret->tail = NULL; - *listpp = ret; - return ccNoError; -} - -/** - * cci_ccache_list_append() - * - * Purpose: Appends a new node containing a copy of 'len' bytes of 'data' - * - * Return: non-NULL, a pointer to the newly allocated node - * NULL, failure - * - * Errors: ccErrNoMem,ccErrBadParam - * - */ -cc_int32 -cci_ccache_list_append(cc_ccache_list_head_t *head, cc_server_ccache_t *data, cc_ccache_list_node_t** nodepp) -{ - return cci_generic_list_append((cc_generic_list_head_t *)head, (void *)data, sizeof(cc_server_ccache_t), (cc_ccache_list_node_t**)nodepp); -} - -/** - * cci_ccache_list_prepend() - * - * Purpose: Prepends a new node containing a copy of 'len' bytes of 'data' - * - * Return: non-NULL, a pointer to the newly allocated node - * NULL, failure - * - * Errors: ccErrNoMem,ccErrBadParam - * - */ -cc_int32 -cci_ccache_list_prepend(cc_ccache_list_head_t *head, cc_server_ccache_t *data, cc_ccache_list_node_t** nodepp) -{ - return cci_generic_list_prepend((cc_generic_list_head_t *)head, (void *)data, sizeof(cc_server_ccache_t), (cc_ccache_list_node_t**)nodepp); -} - -/** - * cci_ccache_list_remove_element() - * - * Purpose: Remove a node from the list - * - * Return: 0, success - * -1, failure - * - * Errors: ccErrBadParam - * - */ -cc_int32 -cci_ccache_list_remove_element(cc_ccache_list_head_t* head, cc_ccache_list_node_t* rem) -{ - return cci_generic_list_remove_element((cc_generic_list_head_t*)head, (cc_generic_list_node_t*)rem); -} - -/** - * cci_ccache_list_iterator() - * - * Purpose: Allocate an iterator for the specified list - * - * Return: non-NULL, an iterator - * NULL, failure - * - * Errors: ccErrNoMem - * - */ -cc_int32 -cci_ccache_list_iterator(cc_ccache_list_head_t *head, cc_ccache_iterate_t** iterpp) -{ - cc_ccache_iterate_t* iterator; - - if ( head == NULL || iterpp == NULL ) - return ccErrBadParam; - - iterator = (cc_ccache_iterate_t*)malloc(sizeof(cc_ccache_iterate_t)); - if (iterator == NULL) - return ccErrNoMem; - - iterator->next = head->head; - *iterpp = iterator; - return ccNoError; -} - -/** - * cci_ccache_free_iterator() - * - * Purpose: Deallocate memory associated with an iterator - * - * Return: 0, success - * -1, failure - * - * Errors: ccErrBadParam - * - */ -cc_int32 -cci_ccache_free_iterator(cc_ccache_iterate_t* iterator) -{ - if ( iterator == NULL ) - return ccErrBadParam; - - iterator->next = NULL; - free(iterator); - return ccNoError; -} - -/** - * cci_credentials_list_new() - * - * Purpose: Allocate a new ccache list - * - * Return: non-NULL, a new list - * NULL, failure - * - * Errors: ccErrNoMem - * - */ -cc_int32 -cci_credentials_list_new(cc_credentials_list_head_t ** list) -{ - if ( list == NULL ) - return ccErrBadParam; - - *list = (cc_credentials_list_head_t *)malloc(sizeof(cc_credentials_list_head_t)); - if (*list == NULL) - return ccErrNoMem; - - (*list)->head = (*list)->tail = NULL; - return ccNoError; -} - -/** - * cci_credentials_list_append() - * - * Purpose: Appends a new node containing a copy of 'len' bytes of 'data' - * - * Return: non-NULL, a pointer to the newly allocated node - * NULL, failure - * - * Errors: ccErrNoMem,ccErrBadParam - * - */ -cc_int32 -cci_credentials_list_append(cc_credentials_list_head_t *head, cc_server_credentials_t *data, cc_credentials_list_node_t** nodepp ) -{ - return cci_generic_list_append((cc_generic_list_head_t *)head, (void *)data, sizeof(cc_server_credentials_t), (cc_credentials_list_node_t**)nodepp); -} - -/** - * cci_credentials_list_prepend() - * - * Purpose: Prepends a new node containing a copy of 'len' bytes of 'data' - * - * Return: non-NULL, a pointer to the newly allocated node - * NULL, failure - * - * Errors: ccErrNoMem,ccErrBadParam - * - */ -cc_int32 -cci_credentials_list_prepend(cc_credentials_list_head_t *head, cc_server_credentials_t *data, cc_credentials_list_node_t** nodepp) -{ - return cci_generic_list_prepend((cc_generic_list_head_t *)head, (void *)data, sizeof(cc_server_credentials_t), (cc_credentials_list_node_t**)nodepp); -} - -/** - * cci_credentials_list_remove_element() - * - * Purpose: Remove a node from the list - * - * Return: 0, success - * -1, failure - * - * Errors: ccErrBadParam - * - */ -cc_int32 -cci_credentials_list_remove_element(cc_credentials_list_head_t* head, cc_credentials_list_node_t* rem) -{ - return cci_generic_list_remove_element((cc_generic_list_head_t*)head, (cc_generic_list_node_t*)rem); -} - -/** - * cci_credentials_list_iterator() - * - * Purpose: Allocate an iterator for the specified list - * - * Return: non-NULL, an iterator - * NULL, failure - * - * Errors: ccErrNoMem - * - */ -cc_int32 -cci_credentials_list_iterator(cc_credentials_list_head_t *head, cc_credentials_iterate_t** iterpp) -{ - cc_credentials_iterate_t* iterator; - - if ( head == NULL || iterpp == NULL ) - return ccErrBadParam; - - iterator = (cc_credentials_iterate_t*)malloc(sizeof(cc_credentials_iterate_t)); - if (iterator == NULL) - return ccErrNoMem; - - iterator->next = head->head; - *iterpp = iterator; - return ccNoError; -} - -/** - * cci_credentials_free_iterator() - * - * Purpose: Deallocate memory associated with an iterator - * - * Return: 0, success - * -1, failure - * - * Errors: ccErrBadParam - * - */ -cc_int32 -cci_credentials_free_iterator(cc_credentials_iterate_t* iterator) -{ - if ( iterator == NULL ) - return ccErrBadParam; - - iterator->next = NULL; - free(iterator); - return ccNoError; -} - +/* $Copyright:
+ *
+ * Copyright 2004-2006 by the Massachusetts Institute of Technology.
+ *
+ * All rights reserved.
+ *
+ * Export of this software from the United States of America may require a
+ * specific license from the United States Government. It is the
+ * responsibility of any person or organization contemplating export to
+ * obtain such a license before exporting.
+ *
+ * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and distribute
+ * this software and its documentation for any purpose and without fee is
+ * hereby granted, provided that the above copyright notice appear in all
+ * copies and that both that copyright notice and this permission notice
+ * appear in supporting documentation, and that the name of M.I.T. not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. Furthermore if you
+ * modify this software you must label your software as modified software
+ * and not distribute it in such a fashion that it might be confused with
+ * the original MIT software. M.I.T. makes no representations about the
+ * suitability of this software for any purpose. It is provided "as is"
+ * without express or implied warranty.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
+ * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * Individual source code files are copyright MIT, Cygnus Support,
+ * OpenVision, Oracle, Sun Soft, FundsXpress, and others.
+ *
+ * Project Athena, Athena, Athena MUSE, Discuss, Hesiod, Kerberos, Moira,
+ * and Zephyr are trademarks of the Massachusetts Institute of Technology
+ * (MIT). No commercial use of these trademarks may be made without prior
+ * written permission of MIT.
+ *
+ * "Commercial use" means use of a name in a product or other for-profit
+ * manner. It does NOT prevent a commercial firm from referring to the MIT
+ * trademarks in order to convey information (although in doing so,
+ * recognition of their trademark status should be given).
+ * $
+ */
+
+
+/*
+ * Lists implementation.
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <memory.h>
+
+#include "CredentialsCache.h"
+#include "datastore.h"
+
+/**
+ * ccs_context_iterate_has_next()
+ *
+ * Purpose: Determine if a context iterator has a next element
+ *
+ * Return: 1 if another element exists
+ * 0 if no additional elements exist
+ */
+cc_int32
+ccs_context_iterate_has_next(cc_context_iterate_t *iterate)
+{
+ if ( iterate == NULL )
+ return 0;
+
+ return cci_generic_iterate_has_next((cc_generic_iterate_t*)iterate);
+}
+
+/**
+ * ccs_context_iterate_next()
+ *
+ * Purpose: Retrieve the next element from a context iterator and advance
+ * the iterator
+ *
+ * Return: non-NULL, the next element in the iterator
+ * NULL, the iterator list is empty or iterator is invalid
+ *
+ * Errors: ccErrBadParam
+ *
+ */
+cc_int32
+ccs_context_iterate_next(cc_context_iterate_t *iterate, cc_context_list_node_t ** nodepp)
+{
+ if ( iterate == NULL || nodepp == NULL)
+ return ccErrBadParam;
+
+ return cci_generic_iterate_next((cc_generic_iterate_t*)iterate,(cc_context_list_node_t**)nodepp);
+}
+
+/**
+ * ccs_ccache_iterate_has_next()
+ *
+ * Purpose: Determine if a cache iterator has a next element
+ *
+ * Return: 1 if another element exists
+ * 0 if no additional elements exist
+ * -1 if error
+ *
+ * Errors: ccErrBadParam
+ *
+ */
+cc_int32
+ccs_ccache_iterate_has_next(cc_ccache_iterate_t *iterate)
+{
+ if ( iterate == NULL )
+ return 0;
+ return cci_generic_iterate_has_next((cc_generic_iterate_t*)iterate);
+}
+
+/**
+ * ccs_ccache_iterate_next()
+ *
+ * Purpose: Retrieve the next element from a ccache iterator and advance
+ * the iterator
+ *
+ * Return: non-NULL, the next element in the iterator
+ * NULL, the iterator list is empty or iterator is invalid
+ *
+ * Errors: ccErrBadParam
+ *
+ */
+cc_int32
+ccs_ccache_iterate_next(cc_ccache_iterate_t *iterate, cc_ccache_list_node_t ** nodepp)
+{
+ if ( iterate == NULL || nodepp == NULL)
+ return ccErrBadParam;
+
+ return cci_generic_iterate_next((cc_generic_iterate_t*)iterate, (cc_ccache_list_node_t**)nodepp);
+}
+
+/**
+ * ccs_credentials_iterate_has_next()
+ *
+ * Purpose: Determine if a credentials iterator has a next element
+ *
+ * Return: 1 if another element exists
+ * 0 if no additional elements exist
+ * -1 if error
+ *
+ * Errors: ccErrBadParam
+ *
+ */
+cc_int32
+ccs_credentials_iterate_has_next(cc_credentials_iterate_t *iterate)
+{
+ if ( iterate == NULL )
+ return 0;
+
+ return cci_generic_iterate_has_next((cc_generic_iterate_t*)iterate);
+}
+
+/**
+ * ccs_credentials_iterate_next()
+ *
+ * Purpose: Retrieve the next element from a credentials iterator and advance
+ * the iterator
+ *
+ * Return: non-NULL, the next element in the iterator
+ * NULL, the iterator list is empty or iterator is invalid
+ *
+ * Errors: ccErrBadParam
+ *
+ */
+cc_int32
+ccs_credentials_iterate_next(cc_credentials_iterate_t *iterate, cc_credentials_list_node_t** nodepp)
+{
+ if ( iterate == NULL || nodepp == NULL )
+ return ccErrBadParam;
+ return cci_generic_iterate_next((cc_generic_iterate_t*)iterate, (cc_credentials_list_node_t**)nodepp);
+}
+
+/**
+ * ccs_context_list_destroy()
+ *
+ * Purpose: Deallocate a list and all of its contents
+ *
+ * Return: 0, success
+ * -1, failure
+ *
+ * Errors: ccErrBadParam
+ */
+cc_int32
+ccs_context_list_destroy(cc_context_list_head_t* head)
+{
+ return cci_generic_list_destroy((cc_generic_list_head_t*)head);
+}
+
+/**
+ * ccs_ccache_list_destroy()
+ *
+ * Purpose: Deallocate a list and all of its contents
+ *
+ * Return: 0, success
+ * -1, failure
+ *
+ * Errors: ccErrBadParam
+ */
+cc_int32
+ccs_ccache_list_destroy(cc_ccache_list_head_t* head)
+{
+ return cci_generic_list_destroy((cc_generic_list_head_t*)head);
+}
+
+/**
+ * ccs_credentials_list_destroy()
+ *
+ * Purpose: Deallocate a list and all of its contents
+ *
+ * Return: 0, success
+ * -1, failure
+ *
+ * Errors: ccErrBadParam
+ */
+cc_int32
+ccs_credentials_list_destroy(cc_credentials_list_head_t* head)
+{
+ return cci_generic_list_destroy((cc_generic_list_head_t*)head);
+}
+
+/**
+ * ccs_context_list_copy()
+ *
+ * Purpose: Copy a list
+ *
+ * Return: non-NULL, a new list
+ * NULL, failure
+ *
+ * Errors: ccErrBadParam, ccErrNoMem
+ *
+ */
+cc_int32
+ccs_context_list_copy(cc_context_list_head_t* head, cc_context_list_head_t** headpp )
+{
+ return cci_generic_list_copy((cc_generic_list_head_t*)head, (cc_context_list_head_t **)headpp);
+}
+
+/**
+ * ccs_ccache_list_copy()
+ *
+ * Purpose: Copy a list
+ *
+ * Return: non-NULL, a new list
+ * NULL, failure
+ *
+ * Errors: ccErrBadParam, ccErrNoMem
+ */
+cc_int32
+ccs_ccache_list_copy(cc_ccache_list_head_t* head, cc_ccache_list_head_t** headpp)
+{
+ return cci_generic_list_copy((cc_generic_list_head_t*)head, (cc_ccache_list_head_t **)headpp);
+}
+
+/**
+ * ccs_credentials_list_copy()
+ *
+ * Purpose: Copy a list
+ *
+ * Return: non-NULL, a new list
+ * NULL, failure
+ *
+ * Errors: ccErrBadParam, ccErrNoMem
+ *
+ */
+cc_int32
+ccs_credentials_list_copy(cc_credentials_list_head_t* head, cc_credentials_list_head_t** headpp)
+{
+ return cci_generic_list_copy((cc_generic_list_head_t*)head, (cc_credentials_list_head_t **)headpp);
+}
+
+
+/**
+ * ccs_context_list_new()
+ *
+ * Purpose: Allocate a new context list
+ *
+ * Return: non-NULL, a new list
+ * NULL, failure
+ *
+ * Errors: ccErrNoMem
+ *
+ */
+cc_int32
+ccs_context_list_new(cc_context_list_head_t ** headpp)
+{
+ cc_context_list_head_t *ret;
+
+ if ( headpp == NULL )
+ return ccErrBadParam;
+
+ ret = (cc_context_list_head_t *)malloc(sizeof(cc_context_list_head_t));
+ if (ret == NULL)
+ return ccErrNoMem;
+ ret->head = ret->tail = NULL;
+ ret->type = context;
+ *headpp = ret;
+ return ccNoError;
+}
+
+/**
+ * ccs_context_list_append()
+ *
+ * Purpose: Appends a new node containing a copy of 'len' bytes of 'data'
+ *
+ * Return: non-NULL, a pointer to the newly allocated node
+ * NULL, failure
+ *
+ * Errors: ccErrNoMem,ccErrBadParam
+ *
+ */
+cc_int32
+ccs_context_list_append(cc_context_list_head_t *head, cc_server_context_t *data, cc_context_list_node_t** nodepp)
+{
+ return cci_generic_list_append((cc_generic_list_head_t *)head, (void *)data, sizeof(cc_server_context_t), (cc_context_list_node_t**)nodepp);
+}
+
+/**
+ * ccs_context_list_prepend()
+ *
+ * Purpose: Prepends a new node containing a copy of 'len' bytes of 'data'
+ *
+ * Return: non-NULL, a pointer to the newly allocated node
+ * NULL, failure
+ *
+ * Errors: ccErrNoMem,ccErrBadParam
+ *
+ */
+cc_int32
+ccs_context_list_prepend(cc_context_list_head_t *head, cc_server_context_t *data, cc_context_list_node_t** nodepp )
+{
+ return cci_generic_list_prepend((cc_generic_list_head_t *)head, (void *)data, sizeof(cc_server_context_t), (cc_context_list_node_t**)nodepp);
+}
+
+/**
+ * ccs_context_list_remove_element
+ *
+ * Purpose: Remove a node from the list
+ *
+ * Return: 0, success
+ * -1, failure
+ *
+ * Errors: ccErrBadParam
+ */
+cc_int32
+ccs_context_list_remove_element(cc_context_list_head_t* head, cc_context_list_node_t* rem)
+{
+ return cci_generic_list_remove_element((cc_generic_list_head_t*)head, (cc_generic_list_node_t*)rem);
+}
+
+/**
+ * ccs_context_list_iterator()
+ *
+ * Purpose: Allocate an iterator for the specified list
+ *
+ * Return: non-NULL, an iterator
+ * NULL, failure
+ *
+ * Errors: ccErrNoMem
+ *
+ */
+cc_int32
+ccs_context_list_iterator(cc_context_list_head_t *head, cc_context_iterate_t** iterpp)
+{
+ cc_context_iterate_t* iterator;
+
+ if ( head == NULL || iterpp == NULL )
+ return ccErrBadParam;
+
+ iterator = (cc_context_iterate_t*)malloc(sizeof(cc_context_iterate_t));
+ if (iterator == NULL)
+ return ccErrNoMem;
+
+ iterator->next = head->head;
+ *iterpp = iterator;
+ return ccNoError;
+}
+
+/**
+ * ccs_context_free_iterator()
+ *
+ * Purpose: Deallocate memory associated with an iterator
+ *
+ * Return: 0, success
+ * -1, failure
+ *
+ * Errors: ccErrBadParam
+ *
+ */
+cc_int32
+ccs_context_free_iterator(cc_context_iterate_t* iterator)
+{
+ if ( iterator == NULL )
+ return ccErrBadParam;
+
+ iterator->next = NULL;
+ free(iterator);
+ return ccNoError;
+}
+
+/**
+ * ccs_ccache_list_new()
+ *
+ * Purpose: Allocate a new ccache list
+ *
+ * Return: non-NULL, a new list
+ * NULL, failure
+ *
+ * Errors: ccErrNoMem
+ */
+cc_int32
+ccs_ccache_list_new(cc_ccache_list_head_t ** listpp)
+{
+ cc_ccache_list_head_t *ret;
+
+ if ( listpp == NULL )
+ return ccErrBadParam;
+
+ ret = (cc_ccache_list_head_t *)malloc(sizeof(cc_ccache_list_head_t));
+ if (ret == NULL)
+ return ccErrNoMem;
+
+ ret->head = ret->tail = NULL;
+ *listpp = ret;
+ return ccNoError;
+}
+
+/**
+ * ccs_ccache_list_append()
+ *
+ * Purpose: Appends a new node containing a copy of 'len' bytes of 'data'
+ *
+ * Return: non-NULL, a pointer to the newly allocated node
+ * NULL, failure
+ *
+ * Errors: ccErrNoMem,ccErrBadParam
+ *
+ */
+cc_int32
+ccs_ccache_list_append(cc_ccache_list_head_t *head, cc_server_ccache_t *data, cc_ccache_list_node_t** nodepp)
+{
+ return cci_generic_list_append((cc_generic_list_head_t *)head, (void *)data, sizeof(cc_server_ccache_t), (cc_ccache_list_node_t**)nodepp);
+}
+
+/**
+ * ccs_ccache_list_prepend()
+ *
+ * Purpose: Prepends a new node containing a copy of 'len' bytes of 'data'
+ *
+ * Return: non-NULL, a pointer to the newly allocated node
+ * NULL, failure
+ *
+ * Errors: ccErrNoMem,ccErrBadParam
+ *
+ */
+cc_int32
+ccs_ccache_list_prepend(cc_ccache_list_head_t *head, cc_server_ccache_t *data, cc_ccache_list_node_t** nodepp)
+{
+ return cci_generic_list_prepend((cc_generic_list_head_t *)head, (void *)data, sizeof(cc_server_ccache_t), (cc_ccache_list_node_t**)nodepp);
+}
+
+/**
+ * ccs_ccache_list_remove_element()
+ *
+ * Purpose: Remove a node from the list
+ *
+ * Return: 0, success
+ * -1, failure
+ *
+ * Errors: ccErrBadParam
+ *
+ */
+cc_int32
+ccs_ccache_list_remove_element(cc_ccache_list_head_t* head, cc_ccache_list_node_t* rem)
+{
+ return cci_generic_list_remove_element((cc_generic_list_head_t*)head, (cc_generic_list_node_t*)rem);
+}
+
+/**
+ * ccs_ccache_list_iterator()
+ *
+ * Purpose: Allocate an iterator for the specified list
+ *
+ * Return: non-NULL, an iterator
+ * NULL, failure
+ *
+ * Errors: ccErrNoMem
+ *
+ */
+cc_int32
+ccs_ccache_list_iterator(cc_ccache_list_head_t *head, cc_ccache_iterate_t** iterpp)
+{
+ cc_ccache_iterate_t* iterator;
+
+ if ( head == NULL || iterpp == NULL )
+ return ccErrBadParam;
+
+ iterator = (cc_ccache_iterate_t*)malloc(sizeof(cc_ccache_iterate_t));
+ if (iterator == NULL)
+ return ccErrNoMem;
+
+ iterator->next = head->head;
+ *iterpp = iterator;
+ return ccNoError;
+}
+
+/**
+ * ccs_ccache_free_iterator()
+ *
+ * Purpose: Deallocate memory associated with an iterator
+ *
+ * Return: 0, success
+ * -1, failure
+ *
+ * Errors: ccErrBadParam
+ *
+ */
+cc_int32
+ccs_ccache_free_iterator(cc_ccache_iterate_t* iterator)
+{
+ if ( iterator == NULL )
+ return ccErrBadParam;
+
+ iterator->next = NULL;
+ free(iterator);
+ return ccNoError;
+}
+
+/**
+ * ccs_credentials_list_new()
+ *
+ * Purpose: Allocate a new ccache list
+ *
+ * Return: non-NULL, a new list
+ * NULL, failure
+ *
+ * Errors: ccErrNoMem
+ *
+ */
+cc_int32
+ccs_credentials_list_new(cc_credentials_list_head_t ** list)
+{
+ if ( list == NULL )
+ return ccErrBadParam;
+
+ *list = (cc_credentials_list_head_t *)malloc(sizeof(cc_credentials_list_head_t));
+ if (*list == NULL)
+ return ccErrNoMem;
+
+ (*list)->head = (*list)->tail = NULL;
+ return ccNoError;
+}
+
+/**
+ * ccs_credentials_list_append()
+ *
+ * Purpose: Appends a new node containing a copy of 'len' bytes of 'data'
+ *
+ * Return: non-NULL, a pointer to the newly allocated node
+ * NULL, failure
+ *
+ * Errors: ccErrNoMem,ccErrBadParam
+ *
+ */
+cc_int32
+ccs_credentials_list_append(cc_credentials_list_head_t *head, cc_server_credentials_t *data, cc_credentials_list_node_t** nodepp )
+{
+ return cci_generic_list_append((cc_generic_list_head_t *)head, (void *)data, sizeof(cc_server_credentials_t), (cc_credentials_list_node_t**)nodepp);
+}
+
+/**
+ * ccs_credentials_list_prepend()
+ *
+ * Purpose: Prepends a new node containing a copy of 'len' bytes of 'data'
+ *
+ * Return: non-NULL, a pointer to the newly allocated node
+ * NULL, failure
+ *
+ * Errors: ccErrNoMem,ccErrBadParam
+ *
+ */
+cc_int32
+ccs_credentials_list_prepend(cc_credentials_list_head_t *head, cc_server_credentials_t *data, cc_credentials_list_node_t** nodepp)
+{
+ return cci_generic_list_prepend((cc_generic_list_head_t *)head, (void *)data, sizeof(cc_server_credentials_t), (cc_credentials_list_node_t**)nodepp);
+}
+
+/**
+ * ccs_credentials_list_remove_element()
+ *
+ * Purpose: Remove a node from the list
+ *
+ * Return: 0, success
+ * -1, failure
+ *
+ * Errors: ccErrBadParam
+ *
+ */
+cc_int32
+ccs_credentials_list_remove_element(cc_credentials_list_head_t* head, cc_credentials_list_node_t* rem)
+{
+ return cci_generic_list_remove_element((cc_generic_list_head_t*)head, (cc_generic_list_node_t*)rem);
+}
+
+/**
+ * ccs_credentials_list_iterator()
+ *
+ * Purpose: Allocate an iterator for the specified list
+ *
+ * Return: non-NULL, an iterator
+ * NULL, failure
+ *
+ * Errors: ccErrNoMem
+ *
+ */
+cc_int32
+ccs_credentials_list_iterator(cc_credentials_list_head_t *head, cc_credentials_iterate_t** iterpp)
+{
+ cc_credentials_iterate_t* iterator;
+
+ if ( head == NULL || iterpp == NULL )
+ return ccErrBadParam;
+
+ iterator = (cc_credentials_iterate_t*)malloc(sizeof(cc_credentials_iterate_t));
+ if (iterator == NULL)
+ return ccErrNoMem;
+
+ iterator->next = head->head;
+ *iterpp = iterator;
+ return ccNoError;
+}
+
+/**
+ * ccs_credentials_free_iterator()
+ *
+ * Purpose: Deallocate memory associated with an iterator
+ *
+ * Return: 0, success
+ * -1, failure
+ *
+ * Errors: ccErrBadParam
+ *
+ */
+cc_int32
+ccs_credentials_free_iterator(cc_credentials_iterate_t* iterator)
+{
+ if ( iterator == NULL )
+ return ccErrBadParam;
+
+ iterator->next = NULL;
+ free(iterator);
+ return ccNoError;
+}
+
diff --git a/src/lib/ccapi/server/mac/CCacheServer.plist b/src/lib/ccapi/server/mac/CCacheServer.plist new file mode 100644 index 0000000000..987cf71102 --- /dev/null +++ b/src/lib/ccapi/server/mac/CCacheServer.plist @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>ServiceName</key> + <string>edu.mit.Kerberos.CCacheServer.ipcService</string> + <key>Command</key> + <string>/System/Library/CoreServices/CCacheServer.app/Contents/MacOS/CCacheServer</string> + <key>OnDemand</key> + <true/> +</dict> +</plist> diff --git a/src/lib/ccapi/server/mac/CCacheServerInfo.plist b/src/lib/ccapi/server/mac/CCacheServerInfo.plist new file mode 100644 index 0000000000..e03d5f3ffa --- /dev/null +++ b/src/lib/ccapi/server/mac/CCacheServerInfo.plist @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>CFBundleDevelopmentRegion</key> + <string>English</string> + <key>CFBundleExecutable</key> + <string>CCacheServer</string> + <key>CFBundleGetInfoString</key> + <string>4.1</string> + <key>CFBundleIconFile</key> + <string></string> + <key>CFBundleIdentifier</key> + <string>edu.mit.Kerberos.CCacheServer</string> + <key>CFBundleInfoDictionaryVersion</key> + <string>6.0</string> + <key>CFBundleName</key> + <string>Kerberos Credentials Cache Server</string> + <key>CFBundlePackageType</key> + <string>APPL</string> + <key>CFBundleSignature</key> + <string>CCSa</string> + <key>CFBundleVersion</key> + <string>0.0.1d1</string> + <key>CFBundleShortVersionString</key> + <string>5.5</string> + <key>CFBundleGetInfoString</key> + <string>5.5 Copyright MIT</string> + <key>KfMDisplayVersion</key> + <string>5.5 Copyright MIT</string> + <key>KfMDisplayCopyright</key> + <string>Copyright MIT</string> + <key>NSHumanReadableCopyright</key> + <string>5.5 Copyright MIT</string> + <key>LSBackgroundOnly</key> + <string>1</string> +</dict> +</plist> diff --git a/src/lib/ccapi/server/mac/main.c b/src/lib/ccapi/server/mac/main.c new file mode 100644 index 0000000000..a9da8da6c8 --- /dev/null +++ b/src/lib/ccapi/server/mac/main.c @@ -0,0 +1,33 @@ +#include <stdarg.h> +#include <stdio.h> +#include <syslog.h> +#include "CredentialsCache.h" +#include "msg.h" +#include "migServer.h" + +#include <Kerberos/kipc_server.h> + +int main (int argc, const char *argv[]) +{ + cc_int32 code = 0; + int running = 1; + + openlog (argv[0], LOG_CONS | LOG_PID, LOG_AUTH); + syslog (LOG_INFO, "Starting up."); + + if (!code) { + code = ccs_serv_initialize(); + } + + if (!code) { + code = kipc_server_run_server (ccapi_server); + } + + /* cleanup ccs resources */ + ccs_serv_cleanup(); + + syslog (LOG_NOTICE, "Exiting: %s (%d)", kipc_error_string (code), code); + + /* exit */ + return code ? 1 : 0; +} diff --git a/src/lib/ccapi/server/rpc_auth.c b/src/lib/ccapi/server/rpc_auth.c index dd338e010c..66bc6aee9c 100644 --- a/src/lib/ccapi/server/rpc_auth.c +++ b/src/lib/ccapi/server/rpc_auth.c @@ -49,10 +49,13 @@ #include "rpc_auth.h" cc_int32 -cci_rpc_is_authorized( cc_auth_info_t* msg_auth, cc_session_info_t* msg_session, cc_auth_info_t* stored_auth, +ccs_rpc_is_authorized( cc_auth_info_t* msg_auth, cc_session_info_t* msg_session, cc_auth_info_t* stored_auth, cc_session_info_t* stored_session, cc_uint32 * authorizedp) { - if (msg_auth == stored_auth && msg_session == stored_session) + if (msg_auth->len == stored_auth->len && + !memcmp(msg_auth->info, stored_auth->info, msg_auth->len) && + msg_session->len == stored_session->len && + !memcmp(msg_session->info, stored_session->info, msg_session->len)) *authorizedp = 1; else *authorizedp = 0; diff --git a/src/lib/ccapi/server/serv_ops.c b/src/lib/ccapi/server/serv_ops.c index 30a108a344..52c62f45cc 100644 --- a/src/lib/ccapi/server/serv_ops.c +++ b/src/lib/ccapi/server/serv_ops.c @@ -1,6 +1,6 @@ /* $Copyright: * - * Copyright 2004 by the Massachusetts Institute of Technology. + * Copyright 2004-2006 by the Massachusetts Institute of Technology. * * All rights reserved. * @@ -50,6 +50,7 @@ #include "datastore.h" #include "rpc_auth.h" #include "msg_headers.h" +#include "marshall.h" #include <stdlib.h> #include <string.h> @@ -62,33 +63,39 @@ extern int cc_myversion; extern char cc_vendor[]; cc_int32 -cci_serv_initialize(void) +ccs_serv_initialize(void) { cc_int32 code; - code = cci_context_list_new(&AllContexts); + code = ccs_context_list_new(&AllContexts); if ( code != ccNoError ) return code; TypeToOpMapping = (type_to_op_mapping_t*)malloc(sizeof(type_to_op_mapping_t)); if (TypeToOpMapping == NULL) { - cci_context_list_destroy(AllContexts); + ccs_context_list_destroy(AllContexts); return ccErrNoMem; } +#if 0 + /* These message types are only generated by the server in response + * to a request. They are never received. + */ + TypeToOpMapping->operations[ccmsg_ACK] = ccop_ACK; + TypeToOpMapping->operations[ccmsg_NACK] = ccop_NACK; +#endif TypeToOpMapping->operations[ccmsg_INIT] = ccop_INIT; TypeToOpMapping->operations[ccmsg_CTX_RELEASE] = ccop_CTX_RELEASE; TypeToOpMapping->operations[ccmsg_CTX_GET_CHANGE_TIME] = ccop_CTX_GET_CHANGE_TIME; TypeToOpMapping->operations[ccmsg_CTX_GET_DEFAULT_CCACHE_NAME] = ccop_CTX_GET_DEFAULT_CCACHE_NAME; - TypeToOpMapping->operations[ccmsg_CTX_COMPARE] = ccop_CTX_COMPARE; + TypeToOpMapping->operations[ccmsg_CTX_CCACHE_OPEN] = ccop_CTX_CCACHE_OPEN; + TypeToOpMapping->operations[ccmsg_CTX_CCACHE_OPEN_DEFAULT] = ccop_CTX_CCACHE_OPEN_DEFAULT; + TypeToOpMapping->operations[ccmsg_CTX_CCACHE_CREATE] = ccop_CTX_CCACHE_CREATE; + TypeToOpMapping->operations[ccmsg_CTX_CCACHE_CREATE_DEFAULT] = ccop_CTX_CCACHE_CREATE_DEFAULT; + TypeToOpMapping->operations[ccmsg_CTX_CCACHE_CREATE_UNIQUE] = ccop_CTX_CCACHE_CREATE_UNIQUE; TypeToOpMapping->operations[ccmsg_CTX_NEW_CCACHE_ITERATOR] = ccop_CTX_NEW_CCACHE_ITERATOR; TypeToOpMapping->operations[ccmsg_CTX_LOCK] = ccop_CTX_LOCK; TypeToOpMapping->operations[ccmsg_CTX_UNLOCK] = ccop_CTX_UNLOCK; - TypeToOpMapping->operations[ccmsg_CTX_CLONE] = ccop_CTX_CLONE; - TypeToOpMapping->operations[ccmsg_CCACHE_OPEN] = ccop_CCACHE_OPEN; - TypeToOpMapping->operations[ccmsg_CCACHE_OPEN_DEFAULT] = ccop_CCACHE_OPEN_DEFAULT; - TypeToOpMapping->operations[ccmsg_CCACHE_CREATE] = ccop_CCACHE_CREATE; - TypeToOpMapping->operations[ccmsg_CCACHE_CREATE_DEFAULT] = ccop_CCACHE_CREATE_DEFAULT; - TypeToOpMapping->operations[ccmsg_CCACHE_CREATE_UNIQUE] = ccop_CCACHE_CREATE_UNIQUE; + TypeToOpMapping->operations[ccmsg_CTX_COMPARE] = ccop_CTX_COMPARE; TypeToOpMapping->operations[ccmsg_CCACHE_RELEASE] = ccop_CCACHE_RELEASE; TypeToOpMapping->operations[ccmsg_CCACHE_DESTROY] = ccop_CCACHE_DESTROY; TypeToOpMapping->operations[ccmsg_CCACHE_SET_DEFAULT] = ccop_CCACHE_SET_DEFAULT; @@ -96,9 +103,12 @@ cci_serv_initialize(void) TypeToOpMapping->operations[ccmsg_CCACHE_GET_NAME] = ccop_CCACHE_GET_NAME; TypeToOpMapping->operations[ccmsg_CCACHE_GET_PRINCIPAL] = ccop_CCACHE_GET_PRINCIPAL; TypeToOpMapping->operations[ccmsg_CCACHE_SET_PRINCIPAL] = ccop_CCACHE_SET_PRINCIPAL; - TypeToOpMapping->operations[ccmsg_CCACHE_CREDS_ITERATOR] = ccop_CCACHE_CREDS_ITERATOR; + TypeToOpMapping->operations[ccmsg_CCACHE_NEW_CREDS_ITERATOR] = ccop_CCACHE_NEW_CREDS_ITERATOR; TypeToOpMapping->operations[ccmsg_CCACHE_STORE_CREDS] = ccop_CCACHE_STORE_CREDS; TypeToOpMapping->operations[ccmsg_CCACHE_REM_CREDS] = ccop_CCACHE_REM_CREDS; + TypeToOpMapping->operations[ccmsg_CCACHE_MOVE] = ccop_CCACHE_MOVE; + TypeToOpMapping->operations[ccmsg_CCACHE_LOCK] = ccop_CCACHE_LOCK; + TypeToOpMapping->operations[ccmsg_CCACHE_UNLOCK] = ccop_CCACHE_UNLOCK; TypeToOpMapping->operations[ccmsg_CCACHE_GET_LAST_DEFAULT_TIME] = ccop_CCACHE_GET_LAST_DEFAULT_TIME; TypeToOpMapping->operations[ccmsg_CCACHE_GET_CHANGE_TIME] = ccop_CCACHE_GET_CHANGE_TIME; TypeToOpMapping->operations[ccmsg_CCACHE_COMPARE] = ccop_CCACHE_COMPARE; @@ -107,48 +117,61 @@ cci_serv_initialize(void) TypeToOpMapping->operations[ccmsg_CCACHE_CLEAR_KDC_TIME_OFFSET] = ccop_CCACHE_CLEAR_KDC_TIME_OFFSET; TypeToOpMapping->operations[ccmsg_CCACHE_ITERATOR_RELEASE] = ccop_CCACHE_ITERATOR_RELEASE; TypeToOpMapping->operations[ccmsg_CCACHE_ITERATOR_NEXT] = ccop_CCACHE_ITERATOR_NEXT; + TypeToOpMapping->operations[ccmsg_CCACHE_ITERATOR_CLONE] = ccop_CCACHE_ITERATOR_CLONE; TypeToOpMapping->operations[ccmsg_CREDS_ITERATOR_RELEASE] = ccop_CREDS_ITERATOR_RELEASE; TypeToOpMapping->operations[ccmsg_CREDS_ITERATOR_NEXT] = ccop_CREDS_ITERATOR_NEXT; - TypeToOpMapping->operations[ccmsg_CREDS_RELEASE] = ccop_CREDS_RELEASE; + TypeToOpMapping->operations[ccmsg_CREDS_ITERATOR_CLONE] = ccop_CREDS_ITERATOR_CLONE; return ccNoError; }; cc_int32 -cci_serv_process_msg(cc_msg_t * msg, cc_auth_info_t* auth_info, cc_session_info_t* session_info, cc_msg_t** resp_msg) +ccs_serv_cleanup(void) +{ + return ccNoError; +} + +cc_int32 +ccs_serv_process_msg(cc_msg_t * msg, cc_auth_info_t* auth_info, cc_session_info_t* session_info, cc_msg_t** resp_msg) { cc_server_context_t* ctx; ccmsg_ctx_only_t* header = (ccmsg_ctx_only_t *)msg->header; + cc_uint32 type; + cc_uint32 header_len; + cc_handle handle; cc_int32 code; if (msg == NULL || msg->header == NULL || auth_info == NULL || session_info == NULL) return ccErrBadParam; if (AllContexts == NULL) { - code = cci_serv_initialize(); + code = ccs_serv_initialize(); if ( code != ccNoError ) return code; } - if (msg->type == ccmsg_INIT) { - return TypeToOpMapping->operations[msg->type] (NULL, auth_info, session_info, msg, resp_msg); + type = msg->type; + if (type == ccmsg_INIT) { + return TypeToOpMapping->operations[type] (NULL, auth_info, session_info, msg, resp_msg); } else { - if (msg->header_len < sizeof(ccmsg_ctx_only_t)) { + header_len = msg->header_len; + if (header_len < sizeof(ccmsg_ctx_only_t)) { return ccErrBadParam; } - code = cci_serv_find_ctx_by_handle(header->ctx, auth_info, session_info, &ctx); + handle = ntohll(header->ctx); + code = ccs_serv_find_ctx_by_handle(handle, auth_info, session_info, &ctx); if (code != ccNoError) { - cci_serv_make_nack(ccErrContextNotFound, auth_info, session_info, resp_msg); + ccs_serv_make_nack(ccErrContextNotFound, auth_info, session_info, resp_msg); return code; } - return TypeToOpMapping->operations[msg->type] (ctx, auth_info, session_info, msg, resp_msg); + return TypeToOpMapping->operations[type] (ctx, auth_info, session_info, msg, resp_msg); } } /*deprecated*/ cc_int32 -cci_serv_find_ctx(cc_auth_info_t* auth_info, cc_session_info_t* session_info, +ccs_serv_find_ctx(cc_auth_info_t* auth_info, cc_session_info_t* session_info, cc_server_context_t** ctxpp) { cc_context_iterate_t* ctx_iterator; @@ -157,35 +180,35 @@ cci_serv_find_ctx(cc_auth_info_t* auth_info, cc_session_info_t* session_info, cc_int32 code; cc_uint32 authorized; - code = cci_context_list_iterator(AllContexts, &ctx_iterator); + code = ccs_context_list_iterator(AllContexts, &ctx_iterator); if (code != ccNoError) return code; - while (cci_context_iterate_has_next(ctx_iterator)) { - code = cci_context_iterate_next(ctx_iterator, &ctx_node); + while (ccs_context_iterate_has_next(ctx_iterator)) { + code = ccs_context_iterate_next(ctx_iterator, &ctx_node); if (code != ccNoError) { - cci_context_free_iterator(ctx_iterator); + ccs_context_free_iterator(ctx_iterator); return code; } ctx = (cc_server_context_t *)ctx_node->data; - code = cci_rpc_is_authorized(auth_info, session_info, ctx->auth_info, ctx->session_info, &authorized); + code = ccs_rpc_is_authorized(auth_info, session_info, ctx->auth_info, ctx->session_info, &authorized); if (code != ccNoError) { - cci_context_free_iterator(ctx_iterator); + ccs_context_free_iterator(ctx_iterator); return code; } if (authorized) { - cci_context_free_iterator(ctx_iterator); + ccs_context_free_iterator(ctx_iterator); *ctxpp = ctx; return ccNoError; } } - cci_context_free_iterator(ctx_iterator); + ccs_context_free_iterator(ctx_iterator); return ccIteratorEnd; } cc_int32 -cci_serv_find_ctx_by_handle(cc_handle ctx_num, cc_auth_info_t* auth, cc_session_info_t* session, cc_server_context_t** ctxpp) +ccs_serv_find_ctx_by_handle(cc_handle ctx_num, cc_auth_info_t* auth, cc_session_info_t* session, cc_server_context_t** ctxpp) { cc_server_context_t* input_ctx = (cc_server_context_t*)ctx_num; cc_context_iterate_t* ctx_iterator; @@ -194,36 +217,36 @@ cci_serv_find_ctx_by_handle(cc_handle ctx_num, cc_auth_info_t* auth, cc_session_ cc_uint32 authorized; cc_int32 code; - code = cci_context_list_iterator(AllContexts, &ctx_iterator); + code = ccs_context_list_iterator(AllContexts, &ctx_iterator); if (code != ccNoError) return code; - while (cci_context_iterate_has_next(ctx_iterator)) { - code = cci_context_iterate_next(ctx_iterator, &ctx_node); + while (ccs_context_iterate_has_next(ctx_iterator)) { + code = ccs_context_iterate_next(ctx_iterator, &ctx_node); ctx = (cc_server_context_t *)ctx_node->data; if (code != ccNoError) { - cci_context_free_iterator(ctx_iterator); + ccs_context_free_iterator(ctx_iterator); return code; } - code = cci_rpc_is_authorized(auth, session, ctx->auth_info, ctx->session_info, &authorized); + code = ccs_rpc_is_authorized(auth, session, ctx->auth_info, ctx->session_info, &authorized); if (code != ccNoError) { - cci_context_free_iterator(ctx_iterator); + ccs_context_free_iterator(ctx_iterator); return code; } if (ctx == input_ctx && authorized) { - cci_context_free_iterator(ctx_iterator); + ccs_context_free_iterator(ctx_iterator); *ctxpp = ctx; return ccNoError; } } - cci_context_free_iterator(ctx_iterator); + ccs_context_free_iterator(ctx_iterator); return ccIteratorEnd; } cc_int32 -cci_serv_find_ccache_by_handle(cc_server_context_t* ctx, cc_handle ccache, cc_server_ccache_t** ccachepp ) +ccs_serv_find_ccache_by_handle(cc_server_context_t* ctx, cc_handle ccache, cc_server_ccache_t** ccachepp ) { cc_ccache_iterate_t* ccache_iterator; cc_ccache_list_node_t* ccache_node; @@ -231,31 +254,31 @@ cci_serv_find_ccache_by_handle(cc_server_context_t* ctx, cc_handle ccache, cc_se cc_server_ccache_t* target_ccache = (cc_server_ccache_t*)ccache; cc_int32 code; - code = cci_ccache_list_iterator(ctx->ccaches, &ccache_iterator); + code = ccs_ccache_list_iterator(ctx->ccaches, &ccache_iterator); if (code != ccNoError) return code; - while (cci_ccache_iterate_has_next(ccache_iterator)) { - code = cci_ccache_iterate_next(ccache_iterator, &ccache_node); + while (ccs_ccache_iterate_has_next(ccache_iterator)) { + code = ccs_ccache_iterate_next(ccache_iterator, &ccache_node); if (code != ccNoError) { - cci_ccache_free_iterator(ccache_iterator); + ccs_ccache_free_iterator(ccache_iterator); return code; } stored_ccache = (cc_server_ccache_t *)ccache_node->data; if (stored_ccache == target_ccache) { - cci_ccache_free_iterator(ccache_iterator); + ccs_ccache_free_iterator(ccache_iterator); *ccachepp = stored_ccache; return ccNoError; } } - cci_ccache_free_iterator(ccache_iterator); + ccs_ccache_free_iterator(ccache_iterator); return ccIteratorEnd; } cc_int32 -cci_serv_find_ccache_iterator_by_handle(cc_server_context_t* ctx, cc_handle iterator, cc_generic_list_node_t** nodepp ) +ccs_serv_find_ccache_iterator_by_handle(cc_server_context_t* ctx, cc_handle iterator, cc_generic_list_node_t** nodepp ) { cc_generic_iterate_t* gen_iterator; cc_generic_list_node_t* gen_node; @@ -286,7 +309,7 @@ cci_serv_find_ccache_iterator_by_handle(cc_server_context_t* ctx, cc_handle iter } cc_int32 -cci_serv_find_creds_iterator_by_handle(cc_server_ccache_t* ccache, cc_handle iterator, cc_generic_list_node_t** nodepp) +ccs_serv_find_creds_iterator_by_handle(cc_server_ccache_t* ccache, cc_handle iterator, cc_generic_list_node_t** nodepp) { cc_generic_iterate_t* gen_iterator; cc_generic_list_node_t* gen_node; @@ -317,7 +340,7 @@ cci_serv_find_creds_iterator_by_handle(cc_server_ccache_t* ccache, cc_handle ite } cc_int32 -cci_serv_make_nack(cc_int32 err_code, cc_auth_info_t* auth_info, cc_session_info_t* session_info, cc_msg_t** resp_msg) +ccs_serv_make_nack(cc_int32 err_code, cc_auth_info_t* auth_info, cc_session_info_t* session_info, cc_msg_t** resp_msg) { ccmsg_nack_t* nack_header; cc_int32 code; @@ -333,7 +356,7 @@ cci_serv_make_nack(cc_int32 err_code, cc_auth_info_t* auth_info, cc_session_info return ccErrNoMem; } - nack_header->err_code = err_code;; + nack_header->err_code = htonl(err_code); code = cci_msg_add_header(*resp_msg, nack_header, sizeof(ccmsg_nack_t)); if (code != ccNoError) { cci_msg_destroy(*resp_msg); @@ -345,7 +368,7 @@ cci_serv_make_nack(cc_int32 err_code, cc_auth_info_t* auth_info, cc_session_info } cc_int32 -cci_serv_make_ack(void * header, cc_int32 header_len, cc_auth_info_t* auth_info, cc_session_info_t* session_info, cc_msg_t** resp_msg) +ccs_serv_make_ack(void * header, cc_int32 header_len, cc_auth_info_t* auth_info, cc_session_info_t* session_info, cc_msg_t** resp_msg) { cc_int32 code; @@ -375,54 +398,58 @@ ccop_INIT( cc_server_context_t* ctx, /* not used */ ccmsg_init_resp_t *resp_header; ccmsg_init_t *header = (ccmsg_init_t *)msg->header; cc_context_list_node_t* ctx_node; + cc_uint32 header_len, in_version; + cc_int32 code; *resp_msg = 0; - if (msg->header_len != sizeof(ccmsg_init_t)) { + header_len = msg->header_len; + if (ctx != NULL || header_len != sizeof(ccmsg_init_t)) { return ccErrBadParam; } - code = cci_context_new(header->in_version, auth_info, session_info, &new_ctx); + in_version = ntohl(header->in_version); + code = ccs_context_new(in_version, auth_info, session_info, &new_ctx); if (code != ccNoError) { return code; } - code = cci_context_list_append(AllContexts, ctx, &ctx_node); + code = ccs_context_list_append(AllContexts, new_ctx, &ctx_node); if (code != ccNoError) { - cci_context_destroy(new_ctx); + ccs_context_destroy(new_ctx); return code; } resp_header = (ccmsg_init_resp_t*)malloc(sizeof(ccmsg_init_resp_t)); if (resp_header == NULL) { - cci_context_destroy(new_ctx); + ccs_context_destroy(new_ctx); return ccErrNoMem; } code = cci_msg_new(ccmsg_ACK, resp_msg); if (code != ccNoError) { free(resp_header); - cci_context_destroy(new_ctx); + ccs_context_destroy(new_ctx); return code; } code = cci_msg_add_data_blob(*resp_msg, cc_vendor, strlen(cc_vendor) + 1, &blob_pos); if (code != ccNoError) { free(resp_header); - cci_context_destroy(new_ctx); + ccs_context_destroy(new_ctx); cci_msg_destroy(*resp_msg); *resp_msg = 0; return code; } - resp_header->out_ctx = new_ctx; - resp_header->out_version = cc_myversion; - resp_header->vendor_offset = blob_pos; - resp_header->vendor_length = strlen(cc_vendor) + 1; + resp_header->out_ctx = htonll((cc_handle) new_ctx); + resp_header->out_version = htonl(cc_myversion); + resp_header->vendor_offset = htonl(blob_pos); + resp_header->vendor_length = htonl(strlen(cc_vendor) + 1); code = cci_msg_add_header(*resp_msg, resp_header, sizeof(ccmsg_init_resp_t)); if (code != ccNoError) { free(resp_header); - cci_context_destroy(new_ctx); + ccs_context_destroy(new_ctx); cci_msg_destroy(*resp_msg); *resp_msg = 0; return code; @@ -438,16 +465,18 @@ ccop_CTX_RELEASE( cc_server_context_t* ctx, cc_msg_t *msg, cc_msg_t **resp_msg) { ccmsg_ctx_release_t* header = (ccmsg_ctx_release_t *)msg->header; + cc_uint32 header_len = msg->header_len; + cc_handle handle = ntohll(header->ctx); cc_int32 code; *resp_msg = 0; - if (msg->header_len != sizeof(ccmsg_ctx_release_t)) { + if (header_len != sizeof(ccmsg_ctx_release_t)) { return ccErrBadParam; } - code = cci_context_destroy(header->ctx); - return cci_serv_make_ack(NULL, 0, auth_info, session_info, resp_msg); + code = ccs_context_destroy((cc_server_context_t *)handle); + return ccs_serv_make_ack(NULL, 0, auth_info, session_info, resp_msg); } cc_int32 @@ -458,10 +487,11 @@ ccop_CTX_GET_CHANGE_TIME( cc_server_context_t* ctx, { ccmsg_ctx_get_change_time_resp_t* resp_header; ccmsg_ctx_get_change_time_t *header = (ccmsg_ctx_get_change_time_t *)msg->header; + cc_uint32 header_len = msg->header_len; *resp_msg = 0; - if (msg->header_len != sizeof(ccmsg_ctx_get_change_time_t)) { + if (header_len != sizeof(ccmsg_ctx_get_change_time_t)) { return ccErrBadParam; } @@ -470,8 +500,8 @@ ccop_CTX_GET_CHANGE_TIME( cc_server_context_t* ctx, return ccErrNoMem; } - resp_header->time = ctx->changed; - return cci_serv_make_ack(resp_header, sizeof(ccmsg_ctx_get_change_time_resp_t), auth_info, session_info, resp_msg); + resp_header->time = htonll(ctx->changed); + return ccs_serv_make_ack(resp_header, sizeof(ccmsg_ctx_get_change_time_resp_t), auth_info, session_info, resp_msg); } cc_int32 @@ -483,15 +513,16 @@ ccop_CTX_GET_DEFAULT_CCACHE_NAME( cc_server_context_t* ctx, char * name; ccmsg_ctx_get_default_ccache_name_resp_t* resp_header; ccmsg_ctx_get_default_ccache_name_t* header = (ccmsg_ctx_get_default_ccache_name_t *)msg->header; + cc_uint32 header_len = htonl(msg->header_len); cc_int32 code; *resp_msg = 0; - if (msg->header_len != sizeof(ccmsg_ctx_get_default_ccache_name_t)) { + if (header_len != sizeof(ccmsg_ctx_get_default_ccache_name_t)) { return ccErrBadParam; } - code = cci_context_get_default_ccache_name(ctx, &name); + code = ccs_context_get_default_ccache_name(ctx, &name); if (code != ccNoError) return code; @@ -507,7 +538,7 @@ ccop_CTX_GET_DEFAULT_CCACHE_NAME( cc_server_context_t* ctx, } code = cci_msg_add_data_blob(*resp_msg, name, strlen(name) + 1, &resp_header->name_offset); - resp_header->name_len = strlen(name) + 1; + resp_header->name_len = htonl(strlen(name) + 1); return ccNoError; } @@ -520,21 +551,22 @@ ccop_CTX_COMPARE(cc_server_context_t* ctx, cc_server_context_t *ctx2; ccmsg_ctx_compare_resp_t* resp_header; ccmsg_ctx_compare_t* header = (ccmsg_ctx_compare_t *)msg->header; + cc_uint32 header_len = msg->header_len; cc_int32 code; *resp_msg = 0; - if (msg->header_len != sizeof(ccmsg_ctx_compare_t)) + if (header_len != sizeof(ccmsg_ctx_compare_t)) return ccErrBadParam; - code = cci_serv_find_ctx_by_handle(header->ctx2, auth_info, session_info, &ctx2); + code = ccs_serv_find_ctx_by_handle(header->ctx2, auth_info, session_info, &ctx2); resp_header = (ccmsg_ctx_compare_resp_t*)malloc(sizeof(ccmsg_ctx_compare_resp_t)); if (resp_header == NULL) return ccErrNoMem; - resp_header->is_equal = cci_context_compare(ctx, ctx2); - return cci_serv_make_ack(resp_header, sizeof(ccmsg_ctx_compare_resp_t), auth_info, session_info, resp_msg); + resp_header->is_equal = htonl(ccs_context_compare(ctx, ctx2)); + return ccs_serv_make_ack(resp_header, sizeof(ccmsg_ctx_compare_resp_t), auth_info, session_info, resp_msg); } cc_int32 @@ -546,22 +578,23 @@ ccop_CTX_NEW_CCACHE_ITERATOR(cc_server_context_t* ctx, cc_ccache_iterate_t* ccache_iterator; ccmsg_ctx_new_ccache_iterator_resp_t* resp_header; ccmsg_ctx_new_ccache_iterator_t* header = (ccmsg_ctx_new_ccache_iterator_t*)msg->header; + cc_uint32 header_len = msg->header_len; cc_int32 code; *resp_msg = 0; - if (msg->header_len != sizeof(ccmsg_ctx_new_ccache_iterator_t)) + if (header_len != sizeof(ccmsg_ctx_new_ccache_iterator_t)) return ccErrBadParam; - code = cci_context_ccache_iterator(ctx,&ccache_iterator); + code = ccs_context_ccache_iterator(ctx, &ccache_iterator); resp_header = (ccmsg_ctx_new_ccache_iterator_resp_t*)malloc(sizeof(ccmsg_ctx_new_ccache_iterator_resp_t)); if (resp_header == NULL) return ccErrNoMem; - resp_header->iterator = ccache_iterator; + resp_header->iterator = htonll((cc_handle) ccache_iterator); - return cci_serv_make_ack(resp_header, sizeof(ccmsg_ctx_new_ccache_iterator_resp_t), auth_info, session_info, resp_msg); + return ccs_serv_make_ack(resp_header, sizeof(ccmsg_ctx_new_ccache_iterator_resp_t), auth_info, session_info, resp_msg); } cc_int32 @@ -571,7 +604,7 @@ ccop_CTX_LOCK( cc_server_context_t* ctx, cc_msg_t *msg, cc_msg_t **resp_msg) { // TODO - return cci_serv_make_nack(ccErrNotImplemented, auth_info, session_info, resp_msg); + return ccs_serv_make_nack(ccErrNotImplemented, auth_info, session_info, resp_msg); } cc_int32 @@ -581,7 +614,7 @@ ccop_CTX_UNLOCK( cc_server_context_t* ctx, cc_msg_t *msg, cc_msg_t **resp_msg) { // TODO - return cci_serv_make_nack(ccErrNotImplemented, auth_info, session_info, resp_msg); + return ccs_serv_make_nack(ccErrNotImplemented, auth_info, session_info, resp_msg); } cc_int32 @@ -591,11 +624,11 @@ ccop_CTX_CLONE( cc_server_context_t* ctx, cc_msg_t *msg, cc_msg_t **resp_msg) { // TODO - return cci_serv_make_nack(ccErrNotImplemented, auth_info, session_info, resp_msg); + return ccs_serv_make_nack(ccErrNotImplemented, auth_info, session_info, resp_msg); } cc_int32 -ccop_CCACHE_OPEN(cc_server_context_t* ctx, +ccop_CTX_CCACHE_OPEN(cc_server_context_t* ctx, cc_auth_info_t* auth_info, cc_session_info_t* session_info, cc_msg_t *msg, cc_msg_t **resp_msg) @@ -604,32 +637,33 @@ ccop_CCACHE_OPEN(cc_server_context_t* ctx, cc_server_ccache_t* ccache; ccmsg_ccache_open_resp_t* resp_header; ccmsg_ccache_open_t* header = (ccmsg_ccache_open_t*)msg->header; + cc_uint32 header_len = msg->header_len; cc_int32 code; *resp_msg = 0; - if (msg->header_len != sizeof(ccmsg_ccache_open_t)) + if (header_len != sizeof(ccmsg_ccache_open_t)) return ccErrBadParam; - code = cci_msg_retrieve_blob(msg, header->name_offset, header->name_len, &name); - code = cci_context_find_ccache(ctx, name, &ccache); + code = cci_msg_retrieve_blob(msg, ntohl(header->name_offset), ntohl(header->name_len), &name); + code = ccs_context_find_ccache(ctx, name, &ccache); free(name); if (ccache == NULL) - return cci_serv_make_nack(ccErrCCacheNotFound, auth_info, session_info, resp_msg); + return ccs_serv_make_nack(ccErrCCacheNotFound, auth_info, session_info, resp_msg); resp_header = (ccmsg_ccache_open_resp_t*)malloc(sizeof(ccmsg_ccache_open_resp_t)); if (resp_header == NULL) return ccErrNoMem; - resp_header->ccache = ccache; - cci_serv_make_ack(resp_header, sizeof(ccmsg_ccache_open_resp_t), auth_info, session_info, resp_msg); + resp_header->ccache = htonll((cc_handle) ccache); + ccs_serv_make_ack(resp_header, sizeof(ccmsg_ccache_open_resp_t), auth_info, session_info, resp_msg); return ccNoError; } cc_int32 -ccop_CCACHE_OPEN_DEFAULT(cc_server_context_t* ctx, +ccop_CTX_CCACHE_OPEN_DEFAULT(cc_server_context_t* ctx, cc_auth_info_t* auth_info, cc_session_info_t* session_info, cc_msg_t *msg, cc_msg_t **resp_msg) @@ -637,14 +671,15 @@ ccop_CCACHE_OPEN_DEFAULT(cc_server_context_t* ctx, ccmsg_ccache_open_default_t* header = (ccmsg_ccache_open_default_t*)msg->header; ccmsg_ccache_open_resp_t* resp_header; cc_server_ccache_t* ccache; + cc_uint32 header_len = msg->header_len; *resp_msg = 0; - if (msg->header_len != sizeof(ccmsg_ccache_open_default_t)) + if (header_len != sizeof(ccmsg_ccache_open_default_t)) return ccErrBadParam; if (ctx->ccaches->head->data == NULL) - return cci_serv_make_nack(ccErrCCacheNotFound, auth_info, session_info, resp_msg); + return ccs_serv_make_nack(ccErrCCacheNotFound, auth_info, session_info, resp_msg); ccache = (cc_server_ccache_t*) ctx->ccaches->head->data; @@ -652,12 +687,12 @@ ccop_CCACHE_OPEN_DEFAULT(cc_server_context_t* ctx, if (resp_header == NULL) return ccErrNoMem; - resp_header->ccache = ccache; - return cci_serv_make_ack(resp_header, sizeof(ccmsg_ccache_open_resp_t), auth_info, session_info, resp_msg); + resp_header->ccache = htonll((cc_handle) ccache); + return ccs_serv_make_ack(resp_header, sizeof(ccmsg_ccache_open_resp_t), auth_info, session_info, resp_msg); } cc_int32 -ccop_CCACHE_CREATE(cc_server_context_t* ctx, +ccop_CTX_CCACHE_CREATE(cc_server_context_t* ctx, cc_auth_info_t* auth_info, cc_session_info_t* session_info, cc_msg_t *msg, cc_msg_t **resp_msg) @@ -667,24 +702,25 @@ ccop_CCACHE_CREATE(cc_server_context_t* ctx, cc_server_ccache_t* ccache; char* principal; char* name; + cc_uint32 header_len = msg->header_len; cc_int32 code; *resp_msg = 0; - if (msg->header_len != sizeof(ccmsg_ccache_create_t)) + if (header_len != sizeof(ccmsg_ccache_create_t)) return ccErrBadParam; - code = cci_msg_retrieve_blob(msg, header->principal_offset, header->principal_len, &principal); + code = cci_msg_retrieve_blob(msg, ntohl(header->principal_offset), ntohl(header->principal_len), &principal); if (code != ccNoError) return code; - principal[header->principal_len] = '\0'; /*Ensure null termination*/ + principal[ntohl(header->principal_len)] = '\0'; /*Ensure null termination*/ - code = cci_msg_retrieve_blob(msg, header->name_offset, header->name_len, &name); + code = cci_msg_retrieve_blob(msg, ntohl(header->name_offset), ntohl(header->name_len), &name); if (code != ccNoError) return code; - name[header->name_len] = '\0'; /*Ensure null termination*/ + name[ntohl(header->name_len)] = '\0'; /*Ensure null termination*/ - code = cci_context_create_ccache(ctx, name, header->version, principal, &ccache); + code = ccs_context_create_ccache(ctx, name, ntohl(header->version), principal, &ccache); if (code != ccNoError) return code; @@ -692,12 +728,12 @@ ccop_CCACHE_CREATE(cc_server_context_t* ctx, if (resp_header == NULL) return ccErrNoMem; - resp_header->ccache = ccache; - return cci_serv_make_ack(resp_header, sizeof(ccmsg_ccache_create_resp_t), auth_info, session_info, resp_msg); + resp_header->ccache = htonll((cc_handle) ccache); + return ccs_serv_make_ack(resp_header, sizeof(ccmsg_ccache_create_resp_t), auth_info, session_info, resp_msg); } cc_int32 -ccop_CCACHE_CREATE_DEFAULT( cc_server_context_t* ctx, +ccop_CTX_CCACHE_CREATE_DEFAULT( cc_server_context_t* ctx, cc_auth_info_t* auth_info, cc_session_info_t* session_info, cc_msg_t *msg, cc_msg_t **resp_msg) @@ -707,23 +743,24 @@ ccop_CCACHE_CREATE_DEFAULT( cc_server_context_t* ctx, cc_server_ccache_t* ccache; char* principal; char* name; + cc_uint32 header_len = msg->header_len; cc_int32 code; *resp_msg = 0; - if (msg->header_len != sizeof(ccmsg_ccache_create_t)) + if (header_len != sizeof(ccmsg_ccache_create_t)) return ccErrBadParam; - code = cci_msg_retrieve_blob(msg, header->principal_offset, header->principal_len, &principal); + code = cci_msg_retrieve_blob(msg, ntohl(header->principal_offset), ntohl(header->principal_len), &principal); if (code != ccNoError) return code; - principal[header->principal_len] = '\0'; /*Ensure null termination*/ + principal[ntohl(header->principal_len)] = '\0'; /*Ensure null termination*/ - code = cci_context_get_default_ccache_name(ctx, &name); + code = ccs_context_get_default_ccache_name(ctx, &name); if (code != ccNoError) return code; - code = cci_context_create_ccache(ctx, name, header->version, principal, &ccache); + code = ccs_context_create_ccache(ctx, name, ntohl(header->version), principal, &ccache); if (code != ccNoError) return code; @@ -731,12 +768,12 @@ ccop_CCACHE_CREATE_DEFAULT( cc_server_context_t* ctx, if (resp_header == NULL) return ccErrNoMem; - resp_header->ccache = ccache; - return cci_serv_make_ack(resp_header, sizeof(ccmsg_ccache_create_resp_t), auth_info, session_info, resp_msg); + resp_header->ccache = htonll((cc_handle) ccache); + return ccs_serv_make_ack(resp_header, sizeof(ccmsg_ccache_create_resp_t), auth_info, session_info, resp_msg); } cc_int32 -ccop_CCACHE_CREATE_UNIQUE( cc_server_context_t* ctx, +ccop_CTX_CCACHE_CREATE_UNIQUE( cc_server_context_t* ctx, cc_auth_info_t* auth_info, cc_session_info_t* session_info, cc_msg_t *msg, cc_msg_t **resp_msg) @@ -746,21 +783,23 @@ ccop_CCACHE_CREATE_UNIQUE( cc_server_context_t* ctx, cc_server_ccache_t* ccache; char* principal; char* name; + cc_uint32 header_len = msg->header_len; cc_int32 code; *resp_msg = 0; - if (msg->header_len != sizeof(ccmsg_ccache_create_t)) + if (header_len != sizeof(ccmsg_ccache_create_t)) return ccErrBadParam; - code = cci_msg_retrieve_blob(msg, header->principal_offset, header->principal_len, &principal); + code = cci_msg_retrieve_blob(msg, ntohl(header->principal_offset), htonl(header->principal_len), &principal); if (code != ccNoError) return code; - principal[header->principal_len] = '\0'; /*Ensure null termination*/ + principal[ntohl(header->principal_len)] = '\0'; /*Ensure null termination*/ - // TODO: Generate a unique ccache name + // TODO: Generate a unique ccache name + name = "unique"; - code = cci_context_create_ccache(ctx, name, header->version, principal, &ccache); + code = ccs_context_create_ccache(ctx, name, ntohl(header->version), principal, &ccache); if (code != ccNoError) return code; @@ -768,8 +807,8 @@ ccop_CCACHE_CREATE_UNIQUE( cc_server_context_t* ctx, if (resp_header == NULL) return ccErrNoMem; - resp_header->ccache = ccache; - return cci_serv_make_ack(resp_header, sizeof(ccmsg_ccache_create_resp_t), auth_info, session_info, resp_msg); + resp_header->ccache = htonll((cc_handle) ccache); + return ccs_serv_make_ack(resp_header, sizeof(ccmsg_ccache_create_resp_t), auth_info, session_info, resp_msg); } cc_int32 @@ -790,20 +829,21 @@ ccop_CCACHE_DESTROY( cc_server_context_t* ctx, { ccmsg_ccache_release_t* header = (ccmsg_ccache_release_t*)msg->header; cc_server_ccache_t* ccache; + cc_uint32 header_len = msg->header_len; cc_int32 code; *resp_msg = 0; - if (msg->header_len != sizeof(ccmsg_ccache_release_t)) + if (header_len != sizeof(ccmsg_ccache_release_t)) return ccErrBadParam; - code = cci_serv_find_ccache_by_handle(ctx, header->ccache, &ccache); + code = ccs_serv_find_ccache_by_handle(ctx, ntohll(header->ccache), &ccache); if (code != ccNoError) - return cci_serv_make_nack(ccErrCCacheNotFound, auth_info, session_info, resp_msg); + return ccs_serv_make_nack(ccErrCCacheNotFound, auth_info, session_info, resp_msg); - cci_ccache_destroy(ccache); + ccs_ccache_destroy(ccache); - return cci_serv_make_ack(NULL, 0, auth_info, session_info, resp_msg); + return ccs_serv_make_ack(NULL, 0, auth_info, session_info, resp_msg); } cc_int32 @@ -816,39 +856,40 @@ ccop_CCACHE_SET_DEFAULT(cc_server_context_t* ctx, ccmsg_ccache_set_default_t* header = (ccmsg_ccache_set_default_t*)msg->header; cc_ccache_iterate_t* ccache_iterator; cc_ccache_list_node_t* ccache_node; + cc_uint32 header_len = msg->header_len; cc_int32 code; *resp_msg = 0; - if (msg->header_len != sizeof(ccmsg_ccache_set_default_t)) + if (header_len != sizeof(ccmsg_ccache_set_default_t)) return ccErrBadParam; - code = cci_serv_find_ccache_by_handle(ctx, header->ccache, &ccache); + code = ccs_serv_find_ccache_by_handle(ctx, ntohll(header->ccache), &ccache); if (code != ccNoError) - return cci_serv_make_nack(ccErrCCacheNotFound, auth_info, session_info, resp_msg); + return ccs_serv_make_nack(ccErrCCacheNotFound, auth_info, session_info, resp_msg); if (ccache == (cc_server_ccache_t*)ctx->ccaches->head->data) /*already default*/ - return cci_serv_make_ack(NULL, 0, auth_info, session_info, resp_msg); + return ccs_serv_make_ack(NULL, 0, auth_info, session_info, resp_msg); old_default = (cc_server_ccache_t*)ctx->ccaches->head->data; old_default->last_default = time(NULL); - code = cci_ccache_list_iterator(ctx->ccaches, &ccache_iterator); + code = ccs_ccache_list_iterator(ctx->ccaches, &ccache_iterator); if (code != ccNoError) - return cci_serv_make_nack(ccErrCCacheNotFound, auth_info, session_info, resp_msg); + return ccs_serv_make_nack(ccErrCCacheNotFound, auth_info, session_info, resp_msg); - while (cci_ccache_iterate_has_next(ccache_iterator)) { - code = cci_ccache_iterate_next(ccache_iterator,&ccache_node); + while (ccs_ccache_iterate_has_next(ccache_iterator)) { + code = ccs_ccache_iterate_next(ccache_iterator,&ccache_node); stored_ccache = (cc_server_ccache_t*)ccache_node->data; if (stored_ccache == ccache) { ccache_node->data = NULL; /*don't want list removal code free()ing ccache*/ - cci_ccache_list_remove_element(ctx->ccaches, ccache_node); - cci_ccache_list_prepend(ctx->ccaches, ccache, NULL); + ccs_ccache_list_remove_element(ctx->ccaches, ccache_node); + ccs_ccache_list_prepend(ctx->ccaches, ccache, NULL); break; } } - return cci_serv_make_ack(NULL, 0, auth_info, session_info, resp_msg); + return ccs_serv_make_ack(NULL, 0, auth_info, session_info, resp_msg); } cc_int32 @@ -860,23 +901,24 @@ ccop_CCACHE_GET_CREDS_VERSION(cc_server_context_t* ctx, ccmsg_ccache_get_creds_version_t* header = (ccmsg_ccache_get_creds_version_t*)msg->header; ccmsg_ccache_get_creds_version_resp_t* resp_header; cc_server_ccache_t* ccache; + cc_uint32 header_len = msg->header_len; cc_int32 code; *resp_msg = 0; - if (msg->header_len != sizeof(ccmsg_ccache_get_creds_version_t)) + if (header_len != sizeof(ccmsg_ccache_get_creds_version_t)) return ccErrBadParam; - code = cci_serv_find_ccache_by_handle(ctx, header->ccache, &ccache); + code = ccs_serv_find_ccache_by_handle(ctx, ntohll(header->ccache), &ccache); if (code != ccNoError) - return cci_serv_make_nack(ccErrCCacheNotFound, auth_info, session_info, resp_msg); + return ccs_serv_make_nack(ccErrCCacheNotFound, auth_info, session_info, resp_msg); resp_header = (ccmsg_ccache_get_creds_version_resp_t*)malloc(sizeof(ccmsg_ccache_get_creds_version_resp_t)); if (resp_header == NULL) return ccErrNoMem; - resp_header->version = ccache->versions; - return cci_serv_make_ack(resp_header, sizeof(ccmsg_ccache_get_creds_version_resp_t), auth_info, session_info, resp_msg); + resp_header->version = htonl(ccache->versions); + return ccs_serv_make_ack(resp_header, sizeof(ccmsg_ccache_get_creds_version_resp_t), auth_info, session_info, resp_msg); } cc_int32 @@ -888,16 +930,18 @@ ccop_CCACHE_GET_NAME(cc_server_context_t* ctx, ccmsg_ccache_get_name_t* header = (ccmsg_ccache_get_name_t*)msg->header; ccmsg_ccache_get_name_resp_t* resp_header; cc_server_ccache_t* ccache; + cc_uint32 header_len = msg->header_len; + cc_uint32 name_offset; cc_int32 code; *resp_msg = 0; - if (msg->header_len != sizeof(ccmsg_ccache_get_name_resp_t)) + if (header_len != sizeof(ccmsg_ccache_get_name_resp_t)) return ccErrBadParam; - code = cci_serv_find_ccache_by_handle(ctx, header->ccache, &ccache); + code = ccs_serv_find_ccache_by_handle(ctx, ntohll(header->ccache), &ccache); if (ccache == NULL) - return cci_serv_make_nack(ccErrCCacheNotFound, auth_info, session_info, resp_msg); + return ccs_serv_make_nack(ccErrCCacheNotFound, auth_info, session_info, resp_msg); resp_header = (ccmsg_ccache_get_name_resp_t*)malloc(sizeof(ccmsg_ccache_get_name_resp_t)); if (resp_header == NULL) @@ -907,8 +951,11 @@ ccop_CCACHE_GET_NAME(cc_server_context_t* ctx, if (code != ccNoError) return code; - code = cci_msg_add_data_blob(*resp_msg, ccache->name, strlen(ccache->name) + 1, &resp_header->name_offset); - resp_header->name_len = strlen(ccache->name) + 1; + code = cci_msg_add_data_blob(*resp_msg, ccache->name, strlen(ccache->name) + 1, &name_offset); + if (code == 0) { + resp_header->name_len = htonl(strlen(ccache->name) + 1); + resp_header->name_offset = htonl(name_offset); + } cci_msg_add_header(*resp_msg, resp_header, sizeof(ccmsg_ccache_get_name_resp_t)); return ccNoError; @@ -924,20 +971,22 @@ ccop_CCACHE_GET_PRINCIPAL(cc_server_context_t* ctx, ccmsg_ccache_get_principal_resp_t* resp_header; cc_server_ccache_t* ccache; char * principal; + cc_uint32 header_len = msg->header_len; + cc_uint32 principal_offset; cc_int32 code; *resp_msg = 0; - if (msg->header_len != sizeof(ccmsg_ccache_get_principal_t)) + if (header_len != sizeof(ccmsg_ccache_get_principal_t)) return ccErrBadParam; - code = cci_serv_find_ccache_by_handle(ctx, header->ccache, &ccache); + code = ccs_serv_find_ccache_by_handle(ctx, ntohll(header->ccache), &ccache); if (code != ccNoError) - return cci_serv_make_nack(ccErrCCacheNotFound, auth_info, session_info, resp_msg); + return ccs_serv_make_nack(ccErrCCacheNotFound, auth_info, session_info, resp_msg); - code = cci_ccache_get_principal(ccache, header->version, &principal); + code = ccs_ccache_get_principal(ccache, ntohl(header->version), &principal); if (code != ccNoError) - return cci_serv_make_nack(code, auth_info, session_info, resp_msg); + return ccs_serv_make_nack(code, auth_info, session_info, resp_msg); code = cci_msg_new(ccmsg_ACK, resp_msg); if (code != ccNoError) @@ -947,7 +996,11 @@ ccop_CCACHE_GET_PRINCIPAL(cc_server_context_t* ctx, if (resp_header == NULL) return ccErrNoMem; - code = cci_msg_add_data_blob(*resp_msg, principal, strlen(principal) + 1, &resp_header->principal_offset); + code = cci_msg_add_data_blob(*resp_msg, principal, strlen(principal) + 1, &principal_offset); + if (code == 0) { + resp_header->principal_len = htonl(strlen(principal) + 1); + resp_header->principal_offset = htonl(principal_offset); + } cci_msg_add_header(*resp_msg, resp_header, sizeof(ccmsg_ccache_get_principal_resp_t)); return ccNoError; @@ -962,50 +1015,52 @@ ccop_CCACHE_SET_PRINCIPAL(cc_server_context_t* ctx, ccmsg_ccache_set_principal_t* header = (ccmsg_ccache_set_principal_t*)msg->header; cc_server_ccache_t* ccache; char *principal; + cc_uint32 header_len = msg->header_len; cc_int32 code; *resp_msg = 0; - if (msg->header_len != sizeof(ccmsg_ccache_set_principal_t)) + if (header_len != sizeof(ccmsg_ccache_set_principal_t)) return ccErrBadParam; - code = cci_serv_find_ccache_by_handle(ctx, header->ccache, &ccache); + code = ccs_serv_find_ccache_by_handle(ctx, ntohll(header->ccache), &ccache); if (code != ccNoError) - return cci_serv_make_nack(ccErrCCacheNotFound, auth_info, session_info, resp_msg); + return ccs_serv_make_nack(ccErrCCacheNotFound, auth_info, session_info, resp_msg); - code = cci_msg_retrieve_blob(msg, header->principal_offset, header->principal_len, &principal); + code = cci_msg_retrieve_blob(msg, ntohl(header->principal_offset), ntohl(header->principal_len), &principal); if (code != ccNoError) - return cci_serv_make_nack(ccErrBadParam, auth_info, session_info, resp_msg); + return ccs_serv_make_nack(ccErrBadParam, auth_info, session_info, resp_msg); - code = cci_ccache_set_principal(ccache, header->version, principal); + code = ccs_ccache_set_principal(ccache, ntohl(header->version), principal); if (code != ccNoError) - return cci_serv_make_nack(code, auth_info, session_info, resp_msg); + return ccs_serv_make_nack(code, auth_info, session_info, resp_msg); - return cci_serv_make_ack(NULL, 0, auth_info, session_info, resp_msg); + return ccs_serv_make_ack(NULL, 0, auth_info, session_info, resp_msg); } cc_int32 -ccop_CCACHE_CREDS_ITERATOR(cc_server_context_t* ctx, - cc_auth_info_t* auth_info, - cc_session_info_t* session_info, - cc_msg_t *msg, cc_msg_t **resp_msg) +ccop_CCACHE_NEW_CREDS_ITERATOR( cc_server_context_t* ctx, + cc_auth_info_t* auth_info, + cc_session_info_t* session_info, + cc_msg_t *msg, cc_msg_t **resp_msg) { cc_server_ccache_t* ccache; cc_credentials_iterate_t* creds_iterator; ccmsg_ccache_creds_iterator_t* header = (ccmsg_ccache_creds_iterator_t*)msg->header; ccmsg_ccache_creds_iterator_resp_t* resp_header; + cc_uint32 header_len = msg->header_len; cc_int32 code; *resp_msg = 0; - if (msg->header_len != sizeof(ccmsg_ccache_creds_iterator_t)) + if (header_len != sizeof(ccmsg_ccache_creds_iterator_t)) return ccErrBadParam; - code = cci_serv_find_ccache_by_handle(ctx, header->ccache, &ccache); + code = ccs_serv_find_ccache_by_handle(ctx, ntohll(header->ccache), &ccache); if (code != ccNoError) - return cci_serv_make_nack(ccErrCCacheNotFound, auth_info, session_info, resp_msg); + return ccs_serv_make_nack(ccErrCCacheNotFound, auth_info, session_info, resp_msg); - code = cci_ccache_new_iterator(ccache, &creds_iterator); + code = ccs_ccache_new_iterator(ccache, &creds_iterator); if (code != ccNoError) return code; @@ -1013,13 +1068,13 @@ ccop_CCACHE_CREDS_ITERATOR(cc_server_context_t* ctx, if (resp_header == NULL) return ccErrNoMem; - resp_header->iterator = creds_iterator; - return cci_serv_make_ack(resp_header, sizeof(ccmsg_ccache_creds_iterator_resp_t), auth_info, session_info, resp_msg); + resp_header->iterator = htonll((cc_handle) creds_iterator); + return ccs_serv_make_ack(resp_header, sizeof(ccmsg_ccache_creds_iterator_resp_t), auth_info, session_info, resp_msg); } static cc_int32 -cci_credentials_union_release( cc_credentials_union * creds ) +ccs_credentials_union_release( cc_credentials_union * creds ) { int i; @@ -1069,24 +1124,21 @@ ccop_CCACHE_STORE_CREDS(cc_server_context_t* ctx, cc_server_ccache_t* ccache; char *flat_creds; cc_credentials_union *creds; + cc_uint32 header_len = msg->header_len; cc_int32 code; *resp_msg = 0; - if (msg->header_len != sizeof(ccmsg_ccache_store_creds_t)) + if (header_len != sizeof(ccmsg_ccache_store_creds_t)) return ccErrBadParam; - code = cci_serv_find_ccache_by_handle(ctx, header->ccache, &ccache); + code = ccs_serv_find_ccache_by_handle(ctx, ntohll(header->ccache), &ccache); if (code != ccNoError) - return cci_serv_make_nack(ccErrCCacheNotFound, auth_info, session_info, resp_msg); + return ccs_serv_make_nack(ccErrCCacheNotFound, auth_info, session_info, resp_msg); - // TODO: This code is too simplistic. cc_credential_unions are not flat - // structures and must be flattened. That means that although we can - // store a flat blob in the message we will need to decode the blob - // into the actual object. - code = cci_msg_retrieve_blob(msg, header->creds_offset, header->creds_len, &flat_creds); + code = cci_msg_retrieve_blob(msg, ntohl(header->creds_offset), ntohl(header->creds_len), &flat_creds); if (code != ccNoError) - return cci_serv_make_nack(code, auth_info, session_info, resp_msg); + return ccs_serv_make_nack(code, auth_info, session_info, resp_msg); creds = (cc_credentials_union *)malloc(sizeof(cc_credentials_union)); if ( creds == NULL ) @@ -1094,24 +1146,24 @@ ccop_CCACHE_STORE_CREDS(cc_server_context_t* ctx, switch ( creds->version ) { case cc_credentials_v4: - code = cci_creds_v4_unmarshall(flat_creds, header->creds_len, creds); + code = cci_creds_v4_unmarshall(flat_creds, ntohl(header->creds_len), creds); break; case cc_credentials_v5: - code = cci_creds_v5_unmarshall(flat_creds, header->creds_len, creds); + code = cci_creds_v5_unmarshall(flat_creds, ntohl(header->creds_len), creds); break; default: - return cci_serv_make_nack(ccErrBadCredentialsVersion, auth_info, session_info, resp_msg); + return ccs_serv_make_nack(ccErrBadCredentialsVersion, auth_info, session_info, resp_msg); } if (code != ccNoError) - return cci_serv_make_nack(code, auth_info, session_info, resp_msg); + return ccs_serv_make_nack(code, auth_info, session_info, resp_msg); - code = cci_ccache_store_creds(ccache, creds); - cci_credentials_union_release(creds); + code = ccs_ccache_store_creds(ccache, creds); + ccs_credentials_union_release(creds); if (code != ccNoError) { - return cci_serv_make_nack(code, auth_info, session_info, resp_msg); + return ccs_serv_make_nack(code, auth_info, session_info, resp_msg); } - return cci_serv_make_ack(NULL, 0, auth_info, session_info, resp_msg); + return ccs_serv_make_ack(NULL, 0, auth_info, session_info, resp_msg); } cc_int32 @@ -1123,21 +1175,22 @@ ccop_CCACHE_REM_CREDS(cc_server_context_t* ctx, ccmsg_ccache_rem_creds_t* header = (ccmsg_ccache_rem_creds_t*)msg->header; cc_server_ccache_t* ccache; cc_credentials_union *creds; + cc_uint32 header_len = msg->header_len; cc_int32 code; *resp_msg = 0; - if (msg->header_len != sizeof(ccmsg_ccache_rem_creds_t)) + if (header_len != sizeof(ccmsg_ccache_rem_creds_t)) return ccErrBadParam; - code = cci_serv_find_ccache_by_handle(ctx, header->ccache, &ccache); + code = ccs_serv_find_ccache_by_handle(ctx, ntohll(header->ccache), &ccache); if (code != ccNoError) - return cci_serv_make_nack(ccErrCCacheNotFound, auth_info, session_info, resp_msg); + return ccs_serv_make_nack(ccErrCCacheNotFound, auth_info, session_info, resp_msg); - code = cci_ccache_rem_creds(ccache, header->creds); + code = ccs_ccache_rem_creds(ccache, (const cc_credentials_union *)(ntohll(header->creds))); if (code != ccNoError) - return cci_serv_make_nack(code, auth_info, session_info, resp_msg); + return ccs_serv_make_nack(code, auth_info, session_info, resp_msg); - return cci_serv_make_ack(NULL, 0, auth_info, session_info, resp_msg); + return ccs_serv_make_ack(NULL, 0, auth_info, session_info, resp_msg); } cc_int32 @@ -1147,7 +1200,7 @@ ccop_CCACHE_LOCK( cc_server_context_t* ctx, cc_msg_t *msg, cc_msg_t **resp_msg) { // TODO - return cci_serv_make_nack(ccErrNotImplemented, auth_info, session_info, resp_msg); + return ccs_serv_make_nack(ccErrNotImplemented, auth_info, session_info, resp_msg); } cc_int32 @@ -1157,7 +1210,7 @@ ccop_CCACHE_UNLOCK( cc_server_context_t* ctx, cc_msg_t *msg, cc_msg_t **resp_msg) { // TODO - return cci_serv_make_nack(ccErrNotImplemented, auth_info, session_info, resp_msg); + return ccs_serv_make_nack(ccErrNotImplemented, auth_info, session_info, resp_msg); } cc_int32 @@ -1167,7 +1220,7 @@ ccop_CCACHE_MOVE( cc_server_context_t* ctx, cc_msg_t *msg, cc_msg_t **resp_msg) { // TODO - return cci_serv_make_nack(ccErrNotImplemented, auth_info, session_info, resp_msg); + return ccs_serv_make_nack(ccErrNotImplemented, auth_info, session_info, resp_msg); } @@ -1180,23 +1233,24 @@ ccop_CCACHE_GET_LAST_DEFAULT_TIME(cc_server_context_t* ctx, ccmsg_ccache_get_last_default_time_t* header = (ccmsg_ccache_get_last_default_time_t*)msg->header; ccmsg_ccache_get_last_default_time_resp_t* resp_header; cc_server_ccache_t* ccache; + cc_uint32 header_len = msg->header_len; cc_int32 code; *resp_msg = 0; - if (msg->header_len != sizeof(ccmsg_ccache_get_last_default_time_t)) + if (header_len != sizeof(ccmsg_ccache_get_last_default_time_t)) return ccErrBadParam; - code = cci_serv_find_ccache_by_handle(ctx, header->ccache, &ccache); + code = ccs_serv_find_ccache_by_handle(ctx, ntohll(header->ccache), &ccache); if (code != ccNoError) - return cci_serv_make_nack(ccErrCCacheNotFound, auth_info, session_info, resp_msg); + return ccs_serv_make_nack(ccErrCCacheNotFound, auth_info, session_info, resp_msg); resp_header = (ccmsg_ccache_get_last_default_time_resp_t*)malloc(sizeof(ccmsg_ccache_get_last_default_time_resp_t)); if (resp_header == NULL) return ccErrNoMem; - resp_header->last_default_time = ccache->last_default; - return cci_serv_make_ack(resp_header, sizeof(ccmsg_ccache_get_last_default_time_resp_t), auth_info, session_info, resp_msg); + resp_header->last_default_time = htonll(ccache->last_default); + return ccs_serv_make_ack(resp_header, sizeof(ccmsg_ccache_get_last_default_time_resp_t), auth_info, session_info, resp_msg); } cc_int32 @@ -1208,10 +1262,11 @@ ccop_CCACHE_GET_CHANGE_TIME( cc_server_context_t* ctx, ccmsg_ccache_get_change_time_resp_t* resp_header; ccmsg_ccache_get_change_time_t *header = (ccmsg_ccache_get_change_time_t *)msg->header; cc_server_ccache_t* ccache = (cc_server_ccache_t *)header->ccache; + cc_uint32 header_len = msg->header_len; *resp_msg = 0; - if (msg->header_len != sizeof(ccmsg_ccache_get_change_time_t)) { + if (header_len != sizeof(ccmsg_ccache_get_change_time_t)) { return ccErrBadParam; } @@ -1220,8 +1275,8 @@ ccop_CCACHE_GET_CHANGE_TIME( cc_server_context_t* ctx, return ccErrNoMem; } - resp_header->time = ccache->changed; - return cci_serv_make_ack(resp_header, sizeof(ccmsg_ccache_get_change_time_resp_t), auth_info, session_info, resp_msg); + resp_header->time = htonll(ccache->changed); + return ccs_serv_make_ack(resp_header, sizeof(ccmsg_ccache_get_change_time_resp_t), auth_info, session_info, resp_msg); } cc_int32 @@ -1233,27 +1288,30 @@ ccop_CCACHE_COMPARE(cc_server_context_t* ctx, ccmsg_ccache_compare_t* header = (ccmsg_ccache_compare_t*)msg->header; ccmsg_ccache_compare_resp_t* resp_header; cc_server_ccache_t* ccache1, *ccache2; + cc_uint32 header_len = msg->header_len; + cc_uint32 is_equal; cc_int32 code; *resp_msg = 0; - if (msg->header_len != sizeof(ccmsg_ccache_compare_t)) + if (header_len != sizeof(ccmsg_ccache_compare_t)) return ccErrBadParam; - code = cci_serv_find_ccache_by_handle(ctx, header->ccache1, &ccache1); + code = ccs_serv_find_ccache_by_handle(ctx, ntohll(header->ccache1), &ccache1); if (code != ccNoError) - return cci_serv_make_nack(ccErrCCacheNotFound, auth_info, session_info, resp_msg); + return ccs_serv_make_nack(ccErrCCacheNotFound, auth_info, session_info, resp_msg); - code = cci_serv_find_ccache_by_handle(ctx, header->ccache2, &ccache2); + code = ccs_serv_find_ccache_by_handle(ctx, ntohll(header->ccache2), &ccache2); if (code != ccNoError) - return cci_serv_make_nack(ccErrCCacheNotFound, auth_info, session_info, resp_msg); + return ccs_serv_make_nack(ccErrCCacheNotFound, auth_info, session_info, resp_msg); resp_header = (ccmsg_ccache_compare_resp_t*)malloc(sizeof(ccmsg_ccache_compare_resp_t)); if (resp_header == NULL) return ccErrNoMem; - cci_ccache_compare(ccache1, ccache2, &resp_header->is_equal); - return cci_serv_make_ack(resp_header, sizeof(ccmsg_ccache_compare_resp_t), auth_info, session_info, resp_msg); + ccs_ccache_compare(ccache1, ccache2, &is_equal); + resp_header->is_equal = htonl(is_equal); + return ccs_serv_make_ack(resp_header, sizeof(ccmsg_ccache_compare_resp_t), auth_info, session_info, resp_msg); } cc_int32 @@ -1265,30 +1323,31 @@ ccop_CCACHE_GET_KDC_TIME_OFFSET(cc_server_context_t* ctx, ccmsg_ccache_get_kdc_time_offset_t* header = (ccmsg_ccache_get_kdc_time_offset_t*)msg->header; ccmsg_ccache_get_kdc_time_offset_resp_t* resp_header; cc_server_ccache_t* ccache; - cc_time_t offset; + cc_time64 offset; + cc_uint32 header_len = msg->header_len; cc_int32 code; *resp_msg = 0; - if (msg->header_len != sizeof(ccmsg_ccache_get_kdc_time_offset_t)) + if (header_len != sizeof(ccmsg_ccache_get_kdc_time_offset_t)) return ccErrBadParam; - code = cci_serv_find_ccache_by_handle(ctx, header->ccache, &ccache); + code = ccs_serv_find_ccache_by_handle(ctx, ntohll(header->ccache), &ccache); if (code != ccNoError) - return cci_serv_make_nack(ccErrCCacheNotFound, auth_info, session_info, resp_msg); + return ccs_serv_make_nack(ccErrCCacheNotFound, auth_info, session_info, resp_msg); // TODO How is the header->creds_version supposed to be used? - code = cci_ccache_get_kdc_time_offset(ccache, &offset); + code = ccs_ccache_get_kdc_time_offset(ccache, &offset); if (code != ccNoError) - return cci_serv_make_nack(code, auth_info, session_info, resp_msg); + return ccs_serv_make_nack(code, auth_info, session_info, resp_msg); resp_header = (ccmsg_ccache_get_kdc_time_offset_resp_t*)malloc(sizeof(ccmsg_ccache_get_kdc_time_offset_resp_t)); if (resp_header == NULL) return ccErrNoMem; - resp_header->offset = offset; - return cci_serv_make_ack(resp_header, sizeof(ccmsg_ccache_get_kdc_time_offset_resp_t), auth_info, session_info, resp_msg); + resp_header->offset = htonll(offset); + return ccs_serv_make_ack(resp_header, sizeof(ccmsg_ccache_get_kdc_time_offset_resp_t), auth_info, session_info, resp_msg); } cc_int32 @@ -1299,21 +1358,22 @@ ccop_CCACHE_SET_KDC_TIME_OFFSET(cc_server_context_t* ctx, { ccmsg_ccache_set_kdc_time_offset_t* header = (ccmsg_ccache_set_kdc_time_offset_t*)msg->header; cc_server_ccache_t* ccache; + cc_uint32 header_len = msg->header_len; cc_int32 code; *resp_msg = 0; - if (msg->header_len != sizeof(ccmsg_ccache_set_kdc_time_offset_t)) + if (header_len != sizeof(ccmsg_ccache_set_kdc_time_offset_t)) return ccErrBadParam; - code = cci_serv_find_ccache_by_handle(ctx, header->ccache, &ccache); + code = ccs_serv_find_ccache_by_handle(ctx, ntohll(header->ccache), &ccache); if (code != ccNoError) - return cci_serv_make_nack(ccErrCCacheNotFound, auth_info, session_info, resp_msg); + return ccs_serv_make_nack(ccErrCCacheNotFound, auth_info, session_info, resp_msg); // TODO How is the header->creds_version supposed to be used? - cci_ccache_set_kdc_time_offset(ccache, header->offset); - return cci_serv_make_ack(NULL, 0, auth_info, session_info, resp_msg); + ccs_ccache_set_kdc_time_offset(ccache, htonll(header->offset)); + return ccs_serv_make_ack(NULL, 0, auth_info, session_info, resp_msg); } cc_int32 @@ -1324,21 +1384,22 @@ ccop_CCACHE_CLEAR_KDC_TIME_OFFSET(cc_server_context_t* ctx, { ccmsg_ccache_clear_kdc_time_offset_t* header = (ccmsg_ccache_clear_kdc_time_offset_t*)msg->header; cc_server_ccache_t* ccache; + cc_uint32 header_len = msg->header_len; cc_int32 code; *resp_msg = 0; - if (msg->header_len != sizeof(ccmsg_ccache_clear_kdc_time_offset_t)) + if (header_len != sizeof(ccmsg_ccache_clear_kdc_time_offset_t)) return ccErrBadParam; - code = cci_serv_find_ccache_by_handle(ctx, header->ccache, &ccache); + code = ccs_serv_find_ccache_by_handle(ctx, ntohll(header->ccache), &ccache); if (code != ccNoError) - return cci_serv_make_nack(ccErrCCacheNotFound, auth_info, session_info, resp_msg); + return ccs_serv_make_nack(ccErrCCacheNotFound, auth_info, session_info, resp_msg); // TODO How is the header->creds_version supposed to be used? - cci_ccache_clear_kdc_time_offset(ccache); - return cci_serv_make_ack(NULL, 0, auth_info, session_info, resp_msg); + ccs_ccache_clear_kdc_time_offset(ccache); + return ccs_serv_make_ack(NULL, 0, auth_info, session_info, resp_msg); } cc_int32 @@ -1349,24 +1410,35 @@ ccop_CCACHE_ITERATOR_RELEASE(cc_server_context_t* ctx, { cc_generic_list_node_t* gen_node; ccmsg_ccache_iterator_release_t* header = (ccmsg_ccache_iterator_release_t*)msg->header; + cc_uint32 header_len = msg->header_len; cc_int32 code; *resp_msg = 0; - if (msg->header_len != sizeof(ccmsg_ccache_iterator_release_t)) + if (header_len != sizeof(ccmsg_ccache_iterator_release_t)) return ccErrBadParam; - code = cci_serv_find_ccache_iterator_by_handle(ctx, header->iterator, &gen_node); + code = ccs_serv_find_ccache_iterator_by_handle(ctx, ntohll(header->iterator), &gen_node); if (code != ccNoError) - return cci_serv_make_nack(ccErrBadParam, auth_info, session_info, resp_msg); + return ccs_serv_make_nack(ccErrBadParam, auth_info, session_info, resp_msg); code = cci_generic_list_remove_element(ctx->active_iterators, gen_node); if (code != ccNoError) - return cci_serv_make_nack(code, auth_info, session_info, resp_msg); + return ccs_serv_make_nack(code, auth_info, session_info, resp_msg); - return cci_serv_make_ack(NULL, 0, auth_info, session_info, resp_msg); + return ccs_serv_make_ack(NULL, 0, auth_info, session_info, resp_msg); } +cc_int32 +ccop_CCACHE_ITERATOR_CLONE( cc_server_context_t* ctx, + cc_auth_info_t* auth_info, + cc_session_info_t* session_info, + cc_msg_t *msg, cc_msg_t **resp_msg) +{ + // TODO + return ccs_serv_make_nack(ccErrNotImplemented, auth_info, session_info, resp_msg); +} + cc_int32 ccop_CCACHE_ITERATOR_NEXT(cc_server_context_t* ctx, cc_auth_info_t* auth_info, @@ -1377,32 +1449,33 @@ ccop_CCACHE_ITERATOR_NEXT(cc_server_context_t* ctx, ccmsg_ccache_iterator_next_resp_t* resp_header; cc_generic_list_node_t* gen_node; cc_ccache_iterate_t* ccache_iterator; - cc_ccache_list_node_t *ccache_node; + cc_ccache_list_node_t *ccache_node; + cc_uint32 header_len = msg->header_len; cc_int32 code; *resp_msg = 0; - if (msg->header_len != sizeof(ccmsg_ccache_iterator_next_t)) + if (header_len != sizeof(ccmsg_ccache_iterator_next_t)) return ccErrBadParam; - code = cci_serv_find_ccache_iterator_by_handle(ctx, header->iterator, &gen_node); + code = ccs_serv_find_ccache_iterator_by_handle(ctx, ntohll(header->iterator), &gen_node); if (code != ccNoError) - return cci_serv_make_nack(ccErrBadParam, auth_info, session_info, resp_msg); + return ccs_serv_make_nack(ccErrBadParam, auth_info, session_info, resp_msg); ccache_iterator = (cc_ccache_iterate_t*)gen_node->data; - if (cci_ccache_iterate_has_next(ccache_iterator)) { + if (ccs_ccache_iterate_has_next(ccache_iterator)) { resp_header = (ccmsg_ccache_iterator_next_resp_t*)malloc(sizeof(ccmsg_ccache_iterator_next_resp_t)); if (resp_header == NULL) return ccErrNoMem; - code = cci_ccache_iterate_next(ccache_iterator, &ccache_node); + code = ccs_ccache_iterate_next(ccache_iterator, &ccache_node); if (code != ccNoError) - return cci_serv_make_nack(code, auth_info, session_info, resp_msg); + return ccs_serv_make_nack(code, auth_info, session_info, resp_msg); - resp_header->ccache = ccache_node; - return cci_serv_make_ack(resp_header, sizeof(ccmsg_ccache_iterator_next_resp_t), auth_info, session_info, resp_msg); + resp_header->ccache = htonll((cc_handle) ccache_node); + return ccs_serv_make_ack(resp_header, sizeof(ccmsg_ccache_iterator_next_resp_t), auth_info, session_info, resp_msg); } else { - return cci_serv_make_nack(ccIteratorEnd, auth_info, session_info, resp_msg); + return ccs_serv_make_nack(ccIteratorEnd, auth_info, session_info, resp_msg); } } @@ -1415,28 +1488,40 @@ ccop_CREDS_ITERATOR_RELEASE(cc_server_context_t* ctx, cc_generic_list_node_t* gen_node; cc_server_ccache_t* ccache; ccmsg_creds_iterator_release_t* header = (ccmsg_creds_iterator_release_t*)msg->header; + cc_uint32 header_len = msg->header_len; cc_int32 code; *resp_msg = 0; - if (msg->header_len != sizeof(ccmsg_creds_iterator_release_t)) + if (header_len != sizeof(ccmsg_creds_iterator_release_t)) return ccErrBadParam; - code = cci_serv_find_ccache_by_handle(ctx, header->ccache, &ccache); + code = ccs_serv_find_ccache_by_handle(ctx, ntohll(header->ccache), &ccache); if (code != ccNoError) - return cci_serv_make_nack(ccErrCCacheNotFound, auth_info, session_info, resp_msg); + return ccs_serv_make_nack(ccErrCCacheNotFound, auth_info, session_info, resp_msg); - code = cci_serv_find_creds_iterator_by_handle(ccache, header->iterator, &gen_node); + code = ccs_serv_find_creds_iterator_by_handle(ccache, ntohll(header->iterator), &gen_node); if (code != ccNoError) - return cci_serv_make_nack(ccErrBadParam, auth_info, session_info, resp_msg); + return ccs_serv_make_nack(ccErrBadParam, auth_info, session_info, resp_msg); code = cci_generic_list_remove_element(ccache->active_iterators, gen_node); if (code != ccNoError) - return cci_serv_make_nack(ccErrBadParam, auth_info, session_info, resp_msg); + return ccs_serv_make_nack(ccErrBadParam, auth_info, session_info, resp_msg); - return cci_serv_make_ack(NULL, 0, auth_info, session_info, resp_msg); + return ccs_serv_make_ack(NULL, 0, auth_info, session_info, resp_msg); } +cc_int32 +ccop_CREDS_ITERATOR_CLONE( cc_server_context_t* ctx, + cc_auth_info_t* auth_info, + cc_session_info_t* session_info, + cc_msg_t *msg, cc_msg_t **resp_msg) +{ + // TODO + return ccs_serv_make_nack(ccErrNotImplemented, auth_info, session_info, resp_msg); +} + + cc_int32 ccop_CREDS_ITERATOR_NEXT(cc_server_context_t* ctx, cc_auth_info_t* auth_info, @@ -1451,23 +1536,24 @@ ccop_CREDS_ITERATOR_NEXT(cc_server_context_t* ctx, cc_server_ccache_t* ccache; cc_server_credentials_t* stored_creds; cc_credentials_union *creds_union; + cc_uint32 header_len = msg->header_len; cc_int32 code; *resp_msg = 0; - if (msg->header_len != sizeof(ccmsg_creds_iterator_next_t)) + if (header_len != sizeof(ccmsg_creds_iterator_next_t)) return ccErrBadParam; - code = cci_serv_find_ccache_by_handle(ctx, header->ccache, &ccache); + code = ccs_serv_find_ccache_by_handle(ctx, ntohll(header->ccache), &ccache); if (code != ccNoError) - return cci_serv_make_nack(ccErrCCacheNotFound, auth_info, session_info, resp_msg); + return ccs_serv_make_nack(ccErrCCacheNotFound, auth_info, session_info, resp_msg); - code = cci_serv_find_creds_iterator_by_handle(ccache, header->iterator, &gen_node); + code = ccs_serv_find_creds_iterator_by_handle(ccache, ntohll(header->iterator), &gen_node); if (code != ccNoError) - return cci_serv_make_nack(ccErrBadParam, auth_info, session_info, resp_msg); + return ccs_serv_make_nack(ccErrBadParam, auth_info, session_info, resp_msg); creds_iterator = (cc_credentials_iterate_t*)gen_node->data; - if (cci_credentials_iterate_has_next(creds_iterator)) { + if (ccs_credentials_iterate_has_next(creds_iterator)) { code = cci_msg_new(ccmsg_ACK, resp_msg); if (code != ccNoError) return code; @@ -1476,14 +1562,14 @@ ccop_CREDS_ITERATOR_NEXT(cc_server_context_t* ctx, if (resp_header == NULL) return ccErrNoMem; - code = cci_credentials_iterate_next(creds_iterator, &creds_node); + code = ccs_credentials_iterate_next(creds_iterator, &creds_node); stored_creds = (cc_server_credentials_t*)creds_node->data; creds_union = &stored_creds->creds; code = cci_msg_add_data_blob(*resp_msg, creds_union, sizeof(cc_credentials_union), &resp_header->creds_offset); code = cci_msg_add_header(*resp_msg, resp_header, sizeof(ccmsg_creds_iterator_next_resp_t)); } else { - cci_serv_make_nack(ccIteratorEnd, auth_info, session_info, resp_msg); + ccs_serv_make_nack(ccIteratorEnd, auth_info, session_info, resp_msg); } return ccNoError; } @@ -1495,6 +1581,6 @@ ccop_CREDS_RELEASE( cc_server_context_t* ctx, cc_msg_t *msg, cc_msg_t **resp_msg) { - cci_serv_make_nack(ccErrNotImplemented, auth_info, session_info, resp_msg); + ccs_serv_make_nack(ccErrNotImplemented, auth_info, session_info, resp_msg); return ccNoError; } diff --git a/src/lib/ccapi/server/serv_ops.h b/src/lib/ccapi/server/serv_ops.h deleted file mode 100644 index f439566855..0000000000 --- a/src/lib/ccapi/server/serv_ops.h +++ /dev/null @@ -1,321 +0,0 @@ -/* $Copyright: - * - * Copyright 2004 by the Massachusetts Institute of Technology. - * - * All rights reserved. - * - * Export of this software from the United States of America may require a - * specific license from the United States Government. It is the - * responsibility of any person or organization contemplating export to - * obtain such a license before exporting. - * - * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and distribute - * this software and its documentation for any purpose and without fee is - * hereby granted, provided that the above copyright notice appear in all - * copies and that both that copyright notice and this permission notice - * appear in supporting documentation, and that the name of M.I.T. not be - * used in advertising or publicity pertaining to distribution of the - * software without specific, written prior permission. Furthermore if you - * modify this software you must label your software as modified software - * and not distribute it in such a fashion that it might be confused with - * the original MIT software. M.I.T. makes no representations about the - * suitability of this software for any purpose. It is provided "as is" - * without express or implied warranty. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF - * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Individual source code files are copyright MIT, Cygnus Support, - * OpenVision, Oracle, Sun Soft, FundsXpress, and others. - * - * Project Athena, Athena, Athena MUSE, Discuss, Hesiod, Kerberos, Moira, - * and Zephyr are trademarks of the Massachusetts Institute of Technology - * (MIT). No commercial use of these trademarks may be made without prior - * written permission of MIT. - * - * "Commercial use" means use of a name in a product or other for-profit - * manner. It does NOT prevent a commercial firm from referring to the MIT - * trademarks in order to convey information (although in doing so, - * recognition of their trademark status should be given). - * $ - */ - -/* - * Prototypes for serv_ops.c - */ - -#ifndef __SERV_OPS_H__ -#define __SERV_OPS_H__ - -#include "CredentialsCache.h" -#include "rpc_auth.h" -#include "msg.h" -#include "datastore.h" - -struct type_to_op_mapping_t { - cc_int32 (*operations[CC_MSG_MAX_TYPE]) ( - cc_server_context_t* ctx, - cc_auth_info_t* auth_info, - cc_session_info_t* session_info, - cc_msg_t *msg, - cc_msg_t **resp_msg); -}; -typedef struct type_to_op_mapping_t type_to_op_mapping_t; - -cc_int32 cci_serv_initialize(void); -cc_int32 cci_serv_process_msg(cc_msg_t * msg, cc_auth_info_t* auth_info, cc_session_info_t* session_info, cc_msg_t** resp_msg); -cc_int32 cci_serv_find_ctx(cc_auth_info_t* auth_info, cc_session_info_t* session_info, cc_server_context_t** contextp); -cc_int32 cci_serv_find_ctx_by_handle(cc_handle ctx_handle, cc_auth_info_t *auth, cc_session_info_t* session, cc_server_context_t** contextp); -cc_int32 cci_serv_find_ccache_by_handle(cc_server_context_t* ctx, cc_handle ccache_handle, cc_server_ccache_t** ccachep) ; -cc_int32 cci_serv_find_ccache_iterator_by_handle(cc_server_context_t* ctx, cc_handle iterator, cc_generic_list_node_t** nodep); -cc_int32 cci_serv_find_creds_iterator_by_handle(cc_server_ccache_t* ccache, cc_handle iterator, cc_generic_list_node_t** nodep); -cc_int32 cci_serv_make_nack(cc_int32 err_code, cc_auth_info_t* auth_info, cc_session_info_t* session_info, cc_msg_t** msgp); -cc_int32 cci_serv_make_ack(void * header, cc_int32 header_len, cc_auth_info_t* auth_info, cc_session_info_t* session_info, cc_msg_t** msgp); - -cc_int32 ccop_INIT( - cc_server_context_t* ctx, - cc_auth_info_t* auth_info, - cc_session_info_t* session_info, - cc_msg_t *msg, - cc_msg_t **resp_msg); - -cc_int32 ccop_CTX_RELEASE( - cc_server_context_t* ctx, - cc_auth_info_t* auth_info, - cc_session_info_t* session_info, - cc_msg_t *msg, - cc_msg_t **resp_msg); - -cc_int32 ccop_CTX_GET_CHANGE_TIME( - cc_server_context_t* ctx, - cc_auth_info_t* auth_info, - cc_session_info_t* session_info, - cc_msg_t *msg, - cc_msg_t **resp_msg); - -cc_int32 ccop_CTX_GET_DEFAULT_CCACHE_NAME( - cc_server_context_t* ctx, - cc_auth_info_t* auth_info, - cc_session_info_t* session_info, - cc_msg_t *msg, - cc_msg_t **resp_msg); - -cc_int32 ccop_CTX_COMPARE( - cc_server_context_t* ctx, - cc_auth_info_t* auth_info, - cc_session_info_t* session_info, - cc_msg_t *msg, - cc_msg_t **resp_msg); - -cc_int32 ccop_CTX_NEW_CCACHE_ITERATOR( - cc_server_context_t* ctx, - cc_auth_info_t* auth_info, - cc_session_info_t* session_info, - cc_msg_t *msg, - cc_msg_t **resp_msg); - -cc_int32 -ccop_CTX_LOCK( cc_server_context_t* ctx, - cc_auth_info_t* auth_info, - cc_session_info_t* session_info, - cc_msg_t *msg, - cc_msg_t **resp_msg); - -cc_int32 -ccop_CTX_UNLOCK( cc_server_context_t* ctx, - cc_auth_info_t* auth_info, - cc_session_info_t* session_info, - cc_msg_t *msg, - cc_msg_t **resp_msg); - -cc_int32 -ccop_CTX_CLONE( cc_server_context_t* ctx, - cc_auth_info_t* auth_info, - cc_session_info_t* session_info, - cc_msg_t *msg, - cc_msg_t **resp_msg); - -cc_int32 ccop_CCACHE_OPEN( - cc_server_context_t* ctx, - cc_auth_info_t* auth_info, - cc_session_info_t* session_info, - cc_msg_t *msg, - cc_msg_t **resp_msg); - -cc_int32 ccop_CCACHE_OPEN_DEFAULT( - cc_server_context_t* ctx, - cc_auth_info_t* auth_info, - cc_session_info_t* session_info, - cc_msg_t *msg, - cc_msg_t **resp_msg); - -cc_int32 ccop_CCACHE_CREATE( - cc_server_context_t* ctx, - cc_auth_info_t* auth_info, - cc_session_info_t* session_info, - cc_msg_t *msg, - cc_msg_t **resp_msg); - -cc_int32 -ccop_CCACHE_CREATE_DEFAULT( cc_server_context_t* ctx, - cc_auth_info_t* auth_info, - cc_session_info_t* session_info, - cc_msg_t *msg, - cc_msg_t **resp_msg); - -cc_int32 -ccop_CCACHE_CREATE_UNIQUE( cc_server_context_t* ctx, - cc_auth_info_t* auth_info, - cc_session_info_t* session_info, - cc_msg_t *msg, - cc_msg_t **resp_msg); - -cc_int32 ccop_CCACHE_RELEASE( - cc_server_context_t* ctx, - cc_auth_info_t* auth_info, - cc_session_info_t* session_info, - cc_msg_t *msg, - cc_msg_t **resp_msg); - -cc_int32 ccop_CCACHE_DESTROY( - cc_server_context_t* ctx, - cc_auth_info_t* auth_info, - cc_session_info_t* session_info, - cc_msg_t *msg, - cc_msg_t **resp_msg); - -cc_int32 ccop_CCACHE_SET_DEFAULT( - cc_server_context_t* ctx, - cc_auth_info_t* auth_info, - cc_session_info_t* session_info, - cc_msg_t *msg, - cc_msg_t **resp_msg); - -cc_int32 ccop_CCACHE_GET_CREDS_VERSION( - cc_server_context_t* ctx, - cc_auth_info_t* auth_info, - cc_session_info_t* session_info, - cc_msg_t *msg, - cc_msg_t **resp_msg); - -cc_int32 ccop_CCACHE_GET_NAME( - cc_server_context_t* ctx, - cc_auth_info_t* auth_info, - cc_session_info_t* session_info, - cc_msg_t *msg, - cc_msg_t **resp_msg); - -cc_int32 ccop_CCACHE_GET_PRINCIPAL( - cc_server_context_t* ctx, - cc_auth_info_t* auth_info, - cc_session_info_t* session_info, - cc_msg_t *msg, - cc_msg_t **resp_msg); - -cc_int32 ccop_CCACHE_SET_PRINCIPAL( - cc_server_context_t* ctx, - cc_auth_info_t* auth_info, - cc_session_info_t* session_info, - cc_msg_t *msg, - cc_msg_t **resp_msg); - -cc_int32 ccop_CCACHE_CREDS_ITERATOR( - cc_server_context_t* ctx, - cc_auth_info_t* auth_info, - cc_session_info_t* session_info, - cc_msg_t *msg, - cc_msg_t **resp_msg); - -cc_int32 ccop_CCACHE_STORE_CREDS( - cc_server_context_t* ctx, - cc_auth_info_t* auth_info, - cc_session_info_t* session_info, - cc_msg_t *msg, - cc_msg_t **resp_msg); - -cc_int32 ccop_CCACHE_REM_CREDS( - cc_server_context_t* ctx, - cc_auth_info_t* auth_info, - cc_session_info_t* session_info, - cc_msg_t *msg, - cc_msg_t **resp_msg); - -cc_int32 ccop_CCACHE_GET_LAST_DEFAULT_TIME( - cc_server_context_t* ctx, - cc_auth_info_t* auth_info, - cc_session_info_t* session_info, - cc_msg_t *msg, - cc_msg_t **resp_msg); - -cc_int32 -ccop_CCACHE_GET_CHANGE_TIME( - cc_server_context_t* ctx, - cc_auth_info_t* auth_info, - cc_session_info_t* session_info, - cc_msg_t *msg, - cc_msg_t **resp_msg) ; - -cc_int32 ccop_CCACHE_COMPARE( - cc_server_context_t* ctx, - cc_auth_info_t* auth_info, - cc_session_info_t* session_info, - cc_msg_t *msg, - cc_msg_t **resp_msg); - -cc_int32 ccop_CCACHE_GET_KDC_TIME_OFFSET( - cc_server_context_t* ctx, - cc_auth_info_t* auth_info, - cc_session_info_t* session_info, - cc_msg_t *msg, - cc_msg_t **resp_msg); - -cc_int32 ccop_CCACHE_SET_KDC_TIME_OFFSET( - cc_server_context_t* ctx, - cc_auth_info_t* auth_info, - cc_session_info_t* session_info, - cc_msg_t *msg, - cc_msg_t **resp_msg); - -cc_int32 ccop_CCACHE_CLEAR_KDC_TIME_OFFSET( - cc_server_context_t* ctx, - cc_auth_info_t* auth_info, - cc_session_info_t* session_info, - cc_msg_t *msg, - cc_msg_t **resp_msg); - -cc_int32 ccop_CCACHE_ITERATOR_RELEASE( - cc_server_context_t* ctx, - cc_auth_info_t* auth_info, - cc_session_info_t* session_info, - cc_msg_t *msg, - cc_msg_t **resp_msg); - -cc_int32 ccop_CCACHE_ITERATOR_NEXT( - cc_server_context_t* ctx, - cc_auth_info_t* auth_info, - cc_session_info_t* session_info, - cc_msg_t *msg, - cc_msg_t **resp_msg); - -cc_int32 ccop_CREDS_ITERATOR_RELEASE( - cc_server_context_t* ctx, - cc_auth_info_t* auth_info, - cc_session_info_t* session_info, - cc_msg_t *msg, - cc_msg_t **resp_msg); - -cc_int32 ccop_CREDS_ITERATOR_NEXT( - cc_server_context_t* ctx, - cc_auth_info_t* auth_info, - cc_session_info_t* session_info, - cc_msg_t *msg, - cc_msg_t **resp_msg); - -cc_int32 ccop_CREDS_RELEASE( - cc_server_context_t* ctx, - cc_auth_info_t* auth_info, - cc_session_info_t* session_info, - cc_msg_t *msg, - cc_msg_t **resp_msg); -#endif /*__SERV_OPS_H__*/ diff --git a/src/lib/ccapi/unit-test/NTMakefile b/src/lib/ccapi/unit-test/NTMakefile new file mode 100644 index 0000000000..73f53f2e4e --- /dev/null +++ b/src/lib/ccapi/unit-test/NTMakefile @@ -0,0 +1,53 @@ +!include <win32.mak>
+
+CFLAGS = -I../include $(cdebug) $(cflags) $(cvarsmt)
+
+WINLIBS = ws2_32.lib rpcrt4.lib $(guilibsdll)
+
+T_CCACHE = t_ccache.exe
+
+T_CONTEXT = t_context.exe
+
+T_LISTS = t_lists.exe
+
+T_MSG = t_msg.exe
+
+T_SERVER = t_server.exe
+
+T_CCAPI = t_ccapi.exe
+
+all: $(T_CCAPI) $(T_CCACHE) $(T_CONTEXT) $(T_LISTS) $(T_MSG) $(T_SERVER)
+
+ntccrpc_c.c ntccrpc_s.c ntccrpc.h: ntccrpc.idl ntccrpc.acf
+ midl ntccrpc.idl /acf ntccrpc.acf
+
+CC_CLIENT_LIB = ..\client\cc_client.lib
+
+CC_COMMON_LIB = ..\common\cc_common.lib
+
+CC_SERVER_LIB = ..\server\cc_server.lib
+
+CC_API_LIB = ..\windows\krbcc32.lib
+
+$(T_CCACHE): t_ccache.obj $(CC_SERVER_LIB) $(CC_COMMON_LIB)
+ $(link) /NOLOGO $(conlibsmt) $(ldebug) $(conlflags) /OUT:$@ $** $(WINLIBS)
+
+$(T_CONTEXT): t_context.obj $(CC_SERVER_LIB) $(CC_COMMON_LIB)
+ $(link) /NOLOGO $(conlibsmt) $(ldebug) $(conlflags) /OUT:$@ $** $(WINLIBS)
+
+$(T_LISTS): t_lists.obj $(CC_SERVER_LIB) $(CC_COMMON_LIB)
+ $(link) /NOLOGO $(conlibsmt) $(ldebug) $(conlflags) /OUT:$@ $** $(WINLIBS)
+
+$(T_MSG): t_msg.obj $(CC_SERVER_LIB) $(CC_COMMON_LIB)
+ $(link) /NOLOGO $(conlibsmt) $(ldebug) $(conlflags) /OUT:$@ $** $(WINLIBS)
+
+$(T_SERVER): t_server.obj $(CC_SERVER_LIB) $(CC_COMMON_LIB)
+ $(link) /NOLOGO $(conlibsmt) $(ldebug) $(conlflags) /OUT:$@ $** $(WINLIBS)
+
+$(T_CCAPI): t_ccapi.obj $(CC_API_LIB)
+ $(link) /NOLOGO $(conlibsmt) $(ldebug) $(conlflags) /OUT:$@ $** $(WINLIBS)
+
+clean:
+ del *.exe *.dll *.lib *.exp *.obj ntccrpc_c.c ntccrpc_s.c ntccrpc.h
+
+
diff --git a/src/lib/ccapi/unit-test/t_ccache.c b/src/lib/ccapi/unit-test/t_ccache.c index 6ef33ea23d..175764e798 100644 --- a/src/lib/ccapi/unit-test/t_ccache.c +++ b/src/lib/ccapi/unit-test/t_ccache.c @@ -59,8 +59,8 @@ int main() { int i; cc_int32 code; - code = cci_ccache_new("The first", p1, cc_credentials_v4_v5, &c1); - code = cci_ccache_new("The 2nd", p2, cc_credentials_v4_v5, &c2); + code = ccs_ccache_new("The first", p1, cc_credentials_v4_v5, &c1); + code = ccs_ccache_new("The 2nd", p2, cc_credentials_v4_v5, &c2); cred1 = (cc_server_credentials_t*)malloc(sizeof(cc_server_credentials_t)); memset(cred1,0,sizeof(cc_server_credentials_t)); @@ -83,30 +83,30 @@ int main() { strncpy(cred2->creds.credentials.credentials_v4->principal, p1, strlen(p1)); cred3->creds.credentials.credentials_v5->client = p1; - code = cci_ccache_store_creds(c1, &cred1->creds); + code = ccs_ccache_store_creds(c1, &cred1->creds); printf("(c1, cred1) -> %d\n",code); - code = cci_ccache_store_creds(c1, &cred2->creds); + code = ccs_ccache_store_creds(c1, &cred2->creds); printf("(c1, cred2) -> %d\n",code); - code = cci_ccache_store_creds(c2, &cred3->creds); + code = ccs_ccache_store_creds(c2, &cred3->creds); printf("(c2, cred3) -> %d\n",code); - code = cci_ccache_store_creds(c1, &cred3->creds); + code = ccs_ccache_store_creds(c1, &cred3->creds); printf("(c1, cred3) -> %d\n",code); i = 0; - code = cci_ccache_move(c1, c2); - code = cci_ccache_destroy(c1); - code = cci_ccache_new_iterator(c2, &iterator); - while (cci_credentials_iterate_has_next(iterator)) { + code = ccs_ccache_move(c1, c2); + code = ccs_ccache_destroy(c1); + code = ccs_ccache_new_iterator(c2, &iterator); + while (ccs_credentials_iterate_has_next(iterator)) { i++; - code = cci_credentials_iterate_next(iterator, &node); + code = ccs_credentials_iterate_next(iterator, &node); stored_cred = (cc_server_credentials_t *)node->data; printf("%d %d %s\n", stored_cred->is_default, stored_cred->creds.version, stored_cred->creds.credentials.credentials_v4->principal); if (i == 1) { - code = cci_ccache_rem_creds(c2,&cred2->creds); + code = ccs_ccache_rem_creds(c2,&cred2->creds); printf("(c2 rem cred2) -> %d\n",code); } } diff --git a/src/lib/ccapi/unit-test/t_context.c b/src/lib/ccapi/unit-test/t_context.c index 9e35d9abf3..d76ff78d9a 100644 --- a/src/lib/ccapi/unit-test/t_context.c +++ b/src/lib/ccapi/unit-test/t_context.c @@ -68,10 +68,10 @@ int main() { int i; cc_int32 code; - code = cci_context_new(5, auth_info, session_info, &ctx); - code = cci_context_create_default_ccache(ctx, cc_credentials_v4, "Spike", &ccache); - code = cci_context_get_default_ccache_name(ctx, &name); - code = cci_context_open_ccache(ctx, name, &ccache); + code = ccs_context_new(5, auth_info, session_info, &ctx); + code = ccs_context_create_default_ccache(ctx, cc_credentials_v4, "Spike", &ccache); + code = ccs_context_get_default_ccache_name(ctx, &name); + code = ccs_context_open_ccache(ctx, name, &ccache); for (i = 0; i < 5; i++) { creds = (cc_credentials_union*)malloc(sizeof(cc_credentials_union)); @@ -79,32 +79,32 @@ int main() { creds->credentials.credentials_v4 = (cc_credentials_v4_t*)malloc(sizeof(cc_credentials_v4_t)); strcpy(creds->credentials.credentials_v4->principal, "Spike"); - code = cci_ccache_store_creds(ccache, creds); + code = ccs_ccache_store_creds(ccache, creds); } - code = cci_context_create_ccache(ctx, "ccache 2", cc_credentials_v4, "Jeff", &ccache); - code = cci_context_open_ccache(ctx, "ccache 2", &ccache); + code = ccs_context_create_ccache(ctx, "ccache 2", cc_credentials_v4_v5, "Jeff", &ccache); + code = ccs_context_open_ccache(ctx, "ccache 2", &ccache); for (i = 0; i < 5; i++) { creds = (cc_credentials_union*)malloc(sizeof(cc_credentials_union)); - creds->version = cc_credentials_v4; - creds->credentials.credentials_v4 = (cc_credentials_v4_t*)malloc(sizeof(cc_credentials_v4_t)); - strcpy(creds->credentials.credentials_v4->principal, "Jeff"); + creds->version = cc_credentials_v5; + creds->credentials.credentials_v5 = (cc_credentials_v5_t*)malloc(sizeof(cc_credentials_v5_t)); + strcpy(creds->credentials.credentials_v5->principal, "Jeff"); - cci_ccache_store_creds(ccache, creds); + ccs_ccache_store_creds(ccache, creds); } - code = cci_context_ccache_iterator(ctx, &ccache_iterator); - while (cci_ccache_iterate_has_next(ccache_iterator)) { - code = cci_ccache_iterate_next(ccache_iterator, &ccache_node); + code = ccs_context_ccache_iterator(ctx, &ccache_iterator); + while (ccs_ccache_iterate_has_next(ccache_iterator)) { + code = ccs_ccache_iterate_next(ccache_iterator, &ccache_node); ccache = (cc_server_ccache_t *)ccache_node->data; printf("%x for %s %s default = %d v %d\n", ccache, ccache->principal_v4, ccache->principal_v5, ccache->is_default, ccache->versions); - code = cci_ccache_new_iterator(ccache, &creds_iterator); - while (cci_credentials_iterate_has_next(creds_iterator)) { - code = cci_credentials_iterate_next(creds_iterator, &creds_node); + code = ccs_ccache_new_iterator(ccache, &creds_iterator); + while (ccs_credentials_iterate_has_next(creds_iterator)) { + code = ccs_credentials_iterate_next(creds_iterator, &creds_node); server_creds = (cc_server_credentials_t *)creds_node->data; printf("\t%s %d\n", server_creds->creds.credentials.credentials_v4->principal, diff --git a/src/lib/ccapi/unit-test/t_server.c b/src/lib/ccapi/unit-test/t_server.c index d4d9984661..d6093941ef 100644 --- a/src/lib/ccapi/unit-test/t_server.c +++ b/src/lib/ccapi/unit-test/t_server.c @@ -143,7 +143,7 @@ main(void) cc_session_info_t * session_info; cc_int32 code; - if ( cci_serv_initialize() != ccNoError ) + if ( ccs_serv_initialize() != ccNoError ) return 1; while ( 1 ) { @@ -163,7 +163,7 @@ main(void) code = obtain_session_info(&session_info); /* process message */ - code = cci_serv_process_msg(msg, auth_info, session_info, &resp); + code = ccs_serv_process_msg(msg, auth_info, session_info, &resp); /* flatten response */ code = cci_msg_flatten(resp, NULL); diff --git a/src/lib/ccapi/windows/NTMakefile b/src/lib/ccapi/windows/NTMakefile new file mode 100644 index 0000000000..f6fee6f687 --- /dev/null +++ b/src/lib/ccapi/windows/NTMakefile @@ -0,0 +1,35 @@ +!include <win32.mak>
+
+CFLAGS = -I../include $(cdebug) $(cflags) $(cvarsmt)
+
+CCAPI_SERVER = ccapi_server.exe
+
+CCAPI_DLLFILE = krbcc32.dll
+
+WINLIBS = ws2_32.lib rpcrt4.lib $(guilibsdll)
+
+all: $(CCAPI_DLLFILE) $(CCAPI_SERVER)
+
+ntccrpc_c.c ntccrpc_s.c ntccrpc.h: ntccrpc.idl ntccrpc.acf
+ midl ntccrpc.idl /acf ntccrpc.acf
+
+CLIENT_OBJS = ntccrpc_c.obj client.obj dllmain.obj
+
+SERVER_OBJS = ntccrpc_s.obj server.obj
+
+CC_CLIENT_LIB = ..\client\cc_client.lib
+
+CC_COMMON_LIB = ..\common\cc_common.lib
+
+CC_SERVER_LIB = ..\server\cc_server.lib
+
+$(CCAPI_DLLFILE): $(CLIENT_OBJS) $(CC_CLIENT_LIB) $(CC_COMMON_LIB)
+ $(link) /NOLOGO /OUT:$@ $(ldebug) $(dlllflags) $(guilibsmt) -def:cacheapi.def $** $(WINLIBS)
+
+$(CCAPI_SERVER): $(SERVER_OBJS) $(CC_SERVER_LIB) $(CC_COMMON_LIB)
+ $(link) /NOLOGO $(conlibsmt) $(ldebug) $(conlflags) /OUT:$@ $** $(WINLIBS)
+
+clean:
+ del *.exe *.dll *.lib *.exp *.obj ntccrpc_c.c ntccrpc_s.c ntccrpc.h
+
+
diff --git a/src/lib/ccapi/windows/cacheapi.def b/src/lib/ccapi/windows/cacheapi.def new file mode 100644 index 0000000000..c54cc11068 --- /dev/null +++ b/src/lib/ccapi/windows/cacheapi.def @@ -0,0 +1,29 @@ +EXPORTS
+ ; ccapi v3 only exports one function
+ cc_initialize @14
+
+ ; ccapi v2 compatibility functions
+ cc_close @2
+ cc_create @3
+ cc_destroy @4
+ cc_free_NC_info @5
+ cc_free_creds @6
+ cc_free_name @7
+ cc_free_principal @8
+ cc_get_NC_info @9
+ cc_get_change_time @10
+ cc_get_cred_version @11
+ cc_get_name @12
+ cc_get_principal @13
+ cc_lock_request @15
+ cc_open @16
+ cc_remove_cred @17
+ cc_seq_fetch_NCs_begin @18
+ cc_seq_fetch_NCs_end @19
+ cc_seq_fetch_NCs_next @20
+ cc_seq_fetch_creds_begin @21
+ cc_seq_fetch_creds_end @22
+ cc_seq_fetch_creds_next @23
+ cc_set_principal @24
+ cc_shutdown @25
+ cc_store @26
diff --git a/src/lib/ccapi/windows/client.c b/src/lib/ccapi/windows/client.c new file mode 100644 index 0000000000..e30801dab6 --- /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;
+}
diff --git a/src/lib/ccapi/windows/dllmain.c b/src/lib/ccapi/windows/dllmain.c new file mode 100644 index 0000000000..6b4d6bfdd8 --- /dev/null +++ b/src/lib/ccapi/windows/dllmain.c @@ -0,0 +1,15 @@ +#include <windows.h>
+
+BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason,
+ LPVOID lpvReserved)
+{
+ switch (fdwReason) {
+ case DLL_PROCESS_ATTACH:
+ case DLL_THREAD_ATTACH:
+ case DLL_THREAD_DETACH:
+ case DLL_PROCESS_DETACH:
+ default:
+ return TRUE;
+ }
+}
+
diff --git a/src/lib/ccapi/windows/ntccrpc.acf b/src/lib/ccapi/windows/ntccrpc.acf new file mode 100644 index 0000000000..77216a9eab --- /dev/null +++ b/src/lib/ccapi/windows/ntccrpc.acf @@ -0,0 +1,8 @@ +[
+ explicit_handle
+]
+
+interface portable_ccapi
+{
+
+}
\ No newline at end of file diff --git a/src/lib/ccapi/windows/ntccrpc.idl b/src/lib/ccapi/windows/ntccrpc.idl new file mode 100644 index 0000000000..51ff898d9b --- /dev/null +++ b/src/lib/ccapi/windows/ntccrpc.idl @@ -0,0 +1,30 @@ +[
+ uuid(0012a1de-f7ad-44b0-b597-8ba53159c6fa),
+ version(1.0),
+ pointer_default(unique)
+]
+
+interface portable_ccapi
+{
+ const short MAXMSGLEN = 65536;
+
+ // Locally Unique Identifier
+ //
+
+ struct __LUID {
+ __int32 LowPart;
+ long HighPart;
+ };
+
+
+ // The Generic CCAPI Message RPC
+
+ __int32 ccapi_Message (
+ [in] handle_t h,
+ [in, string] unsigned char * client_name,
+ [in] struct __LUID luid,
+ [in, length_is(in_len), size_is(MAXMSGLEN)] unsigned char in_buf[],
+ [in] __int32 in_len,
+ [out, length_is(*out_len), size_is(MAXMSGLEN)] unsigned char out_buf[],
+ [out] __int32 * out_len);
+}
diff --git a/src/lib/ccapi/windows/rpcsstest/NTMakefile b/src/lib/ccapi/windows/rpcsstest/NTMakefile new file mode 100644 index 0000000000..0e23307072 --- /dev/null +++ b/src/lib/ccapi/windows/rpcsstest/NTMakefile @@ -0,0 +1,24 @@ +
+!include <win32.mak>
+
+{}.c{}.obj:
+ $(CC) $(cdebug) $(cflags) /Fo"$@" /c $**
+
+EXECONLINK=link /NOLOGO $(conlibsmt) $(ldebug) $(conlflags) /OUT:$@ $**
+
+CLIENTEXE=csclient.exe
+
+SERVEREXE=csserver.exe
+
+SDKLIBS=rpcrt4.lib
+
+cstest_c.c cstest_s.c cstest.h: cstest.idl cstest.acf
+ midl cstest.idl /acf cstest.acf
+
+$(CLIENTEXE): client.obj cstest_c.obj
+ $(EXECONLINK) $(SDKLIBS)
+
+$(SERVEREXE): server.obj cstest_s.obj
+ $(EXECONLINK) $(SDKLIBS)
+
+all: $(SERVEREXE) $(CLIENTEXE)
diff --git a/src/lib/ccapi/windows/rpcsstest/client.c b/src/lib/ccapi/windows/rpcsstest/client.c new file mode 100644 index 0000000000..a25e8d1ade --- /dev/null +++ b/src/lib/ccapi/windows/rpcsstest/client.c @@ -0,0 +1,87 @@ +#include<windows.h>
+#include<stdio.h>
+#include<stdlib.h>
+#include<tchar.h>
+#include"cstest.h"
+#include<strsafe.h>
+
+void * __RPC_USER MIDL_user_allocate(size_t s) {
+ return malloc(s);
+}
+
+void __RPC_USER MIDL_user_free(void * p) {
+ free(p);
+}
+
+int main(int argc, char ** argv) {
+ RPC_STATUS status;
+ RPC_BINDING_HANDLE h;
+ TCHAR * bindstring = NULL;
+ RPC_SECURITY_QOS sqos;
+ char inbuf[256];
+ char outbuf[256];
+ long cb_out;
+
+ 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,
+ &h);
+
+ if (status != RPC_S_OK) {
+ fprintf(stderr, "RpcBindingFromStringBinding failed: %d\n",
+ status);
+ return 1;
+ }
+
+ 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(h,
+ 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;
+ }
+
+ StringCbCopyA(inbuf, sizeof(inbuf), "Echo Test 1");
+ StringCbCopyA(outbuf, sizeof(outbuf), "Blank blank blank");
+
+ printf("Before call: in[%s], out[%s]\n", inbuf, outbuf);
+ cb_out = 0;
+
+ status = EchoString(h, inbuf, sizeof(outbuf), &cb_out, outbuf);
+
+ if (status) {
+ printf("Call failed: status = %d\n", status);
+ } else {
+ printf("After call: out[%s], outlen[%d]\n", outbuf, cb_out);
+ }
+
+ status = RpcBindingFree(&h);
+
+ status = RpcStringFree(&bindstring);
+
+ return 0;
+}
diff --git a/src/lib/ccapi/windows/rpcsstest/cstest.acf b/src/lib/ccapi/windows/rpcsstest/cstest.acf new file mode 100644 index 0000000000..3c2ae73aba --- /dev/null +++ b/src/lib/ccapi/windows/rpcsstest/cstest.acf @@ -0,0 +1,8 @@ +[
+ explicit_handle
+]
+
+interface ccapi_cstest
+{
+
+}
\ No newline at end of file diff --git a/src/lib/ccapi/windows/rpcsstest/cstest.idl b/src/lib/ccapi/windows/rpcsstest/cstest.idl new file mode 100644 index 0000000000..c51b8ee829 --- /dev/null +++ b/src/lib/ccapi/windows/rpcsstest/cstest.idl @@ -0,0 +1,14 @@ +[
+uuid(c8b4a635-e9e4-4650-a073-b25610324950),
+ version(1.0),
+ pointer_default(unique)
+]
+
+interface ccapi_cstest
+{
+ long EchoString([in] handle_t h,
+ [in, string] unsigned char * in_str,
+ [in] long cb_buffer,
+ [out] long * cb_len,
+ [out, string, size_is(cb_buffer)] unsigned char buffer[*]);
+}
diff --git a/src/lib/ccapi/windows/rpcsstest/server.c b/src/lib/ccapi/windows/rpcsstest/server.c new file mode 100644 index 0000000000..f127434b58 --- /dev/null +++ b/src/lib/ccapi/windows/rpcsstest/server.c @@ -0,0 +1,537 @@ +#include<windows.h>
+#include<stdio.h>
+#include<process.h>
+#include<tchar.h>
+#include<rpc.h>
+#include"cstest.h"
+#include<strsafe.h>
+
+#define SVCNAME "CCAPICSTest"
+
+SERVICE_STATUS_HANDLE h_service_status = NULL;
+SERVICE_STATUS service_status;
+FILE * logfile = NULL;
+
+void begin_log(void) {
+ char temppath[512];
+
+ temppath[0] = L'\0';
+
+ GetTempPathA(sizeof(temppath), temppath);
+ StringCbCatA(temppath, sizeof(temppath), "csserverconn.log");
+ logfile = fopen(temppath, "w");
+}
+
+void end_log(void) {
+ if (logfile) {
+ fclose(logfile);
+ logfile = NULL;
+ }
+}
+
+BOOL report_status(DWORD state,
+ DWORD exit_code,
+ DWORD wait_hint) {
+ static DWORD checkpoint = 1;
+ BOOL rv = TRUE;
+
+ if (state == SERVICE_START_PENDING)
+ service_status.dwControlsAccepted = 0;
+ else
+ service_status.dwControlsAccepted = SERVICE_ACCEPT_STOP;
+
+ service_status.dwCurrentState = state;
+ service_status.dwWin32ExitCode = exit_code;
+ service_status.dwWaitHint = wait_hint;
+
+ if (state == SERVICE_RUNNING ||
+ state == SERVICE_STOPPED)
+ service_status.dwCheckPoint = 0;
+ else
+ service_status.dwCheckPoint = checkpoint++;
+
+ rv = SetServiceStatus(h_service_status, &service_status);
+
+ return rv;
+}
+
+void service_start(DWORD argc, LPTSTR * argv) {
+ RPC_STATUS status;
+ RPC_BINDING_VECTOR * bv;
+
+ status = RpcServerUseProtseq("ncalrpc",
+ RPC_C_PROTSEQ_MAX_REQS_DEFAULT,
+ NULL);
+
+ if (status != RPC_S_OK) {
+ return;
+ }
+
+ report_status(SERVICE_START_PENDING, NO_ERROR, 3000);
+
+ status = RpcServerRegisterIf(ccapi_cstest_v1_0_s_ifspec,
+ 0, 0);
+
+ if (status != RPC_S_OK)
+ return;
+
+ report_status(SERVICE_START_PENDING, NO_ERROR, 3000);
+
+ status = RpcServerInqBindings(&bv);
+
+ if (status != RPC_S_OK)
+ return;
+
+ status = RpcEpRegister(ccapi_cstest_v1_0_s_ifspec,
+ bv, 0, 0);
+
+ if (status != RPC_S_OK)
+ return;
+
+ report_status(SERVICE_START_PENDING, NO_ERROR, 3000);
+
+ status = RpcServerRegisterAuthInfo(NULL,
+ RPC_C_AUTHN_WINNT,
+ 0, 0);
+
+ if (status != RPC_S_OK)
+ return;
+
+ report_status(SERVICE_START_PENDING, NO_ERROR, 3000);
+
+ status = RpcServerListen(1,
+ RPC_C_LISTEN_MAX_CALLS_DEFAULT,
+ TRUE);
+
+ if (status != RPC_S_OK)
+ return;
+
+ report_status(SERVICE_RUNNING, NO_ERROR, 0);
+
+ begin_log();
+
+ status = RpcMgmtWaitServerListen();
+
+ end_log();
+
+ RpcEpUnregister(ccapi_cstest_v1_0_s_ifspec, bv, 0);
+
+ RpcBindingVectorFree(&bv);
+}
+
+void service_stop(void) {
+ RpcMgmtStopServerListening(0);
+}
+
+void * __RPC_USER MIDL_user_allocate(size_t s) {
+ return malloc(s);
+}
+
+void __RPC_USER MIDL_user_free(void * p) {
+ free(p);
+}
+
+typedef struct tag_client_info {
+ char client_name[512];
+ LUID luid;
+} client_info_t;
+
+RPC_STATUS check_auth(handle_t h, client_info_t * client_info) {
+ RPC_BINDING_HANDLE bh = (RPC_BINDING_HANDLE) h;
+ RPC_STATUS status;
+ HANDLE htoken = NULL;
+ char name[256];
+ char domain[256];
+ DWORD name_len;
+ DWORD domain_len;
+ SID_NAME_USE snu = 0;
+
+ struct {
+ TOKEN_ORIGIN origin;
+ char pad[512];
+ } torigin;
+
+ struct {
+ TOKEN_OWNER owner;
+ char pad[4096];
+ } towner;
+
+ DWORD len;
+
+ status = RpcImpersonateClient(bh);
+
+ if (status != RPC_S_OK)
+ return status;
+
+ if (!OpenThreadToken(GetCurrentThread(),
+ TOKEN_READ | TOKEN_QUERY_SOURCE,
+ FALSE,
+ &htoken)) {
+ status = GetLastError();
+ goto _cleanup;
+ }
+
+ len = 0;
+
+ if (!GetTokenInformation(htoken,
+ TokenOrigin,
+ &torigin.origin,
+ sizeof(torigin),
+ &len)) {
+ status = GetLastError();
+ goto _cleanup;
+ }
+
+ if (!GetTokenInformation(htoken,
+ TokenOwner,
+ &towner.owner,
+ sizeof(towner),
+ &len)) {
+ status = GetLastError();
+ goto _cleanup;
+ }
+
+
+ name_len = sizeof(name)/sizeof(name[0]);
+ domain_len = sizeof(domain)/sizeof(domain[0]);
+
+ if (!LookupAccountSidA(NULL,
+ towner.owner.Owner,
+ name,
+ &name_len,
+ domain,
+ &domain_len,
+ &snu)) {
+ status = GetLastError();
+ goto _cleanup;
+ }
+
+ client_info->luid = torigin.origin.OriginatingLogonSession;
+ StringCbPrintfA(client_info->client_name,
+ sizeof(client_info->client_name),
+ "%s\\%s", domain, name);
+
+ status = 0;
+
+ _cleanup:
+
+ RpcRevertToSelf();
+
+ return status;
+}
+
+long EchoString(
+ /* [in] */ handle_t h,
+ /* [string][in] */ unsigned char *in_str,
+ /* [in] */ long cb_buffer,
+ /* [out] */ long *cb_len,
+ /* [size_is][string][out] */ unsigned char buffer[ ]) {
+
+ size_t cb;
+ long rv = 0;
+ client_info_t client_info;
+
+ rv = check_auth(h, &client_info);
+
+ if (rv == 0 && logfile) {
+ fprintf(logfile,
+ "Client name [%s], LUID [%x:%x]\n",
+ client_info.client_name,
+ (client_info.luid.HighPart),
+ (client_info.luid.LowPart));
+ fflush(logfile);
+ }
+
+ if (!in_str) {
+ rv = 1;
+ if (cb_len)
+ *cb_len = 0;
+ if (buffer)
+ buffer[0] = '\0';
+ } else {
+ if (FAILED(StringCbLengthA(in_str, 256, &cb))) {
+ rv = 2;
+ goto _exit_f;
+ }
+
+ cb += sizeof(char);
+
+ if (((long)cb) > cb_buffer) {
+ rv = 3;
+ goto _exit_f;
+ }
+
+ *cb_len = cb;
+
+ if (buffer)
+ StringCbCopyA(buffer, cb_buffer, in_str);
+
+ rv = 0;
+ }
+
+ _exit_f:
+
+ return rv;
+}
+
+void WINAPI service_control(DWORD ctrl_code) {
+ switch(ctrl_code) {
+ case SERVICE_CONTROL_STOP:
+ report_status(SERVICE_STOP_PENDING, NO_ERROR, 0);
+ service_stop();
+ return;
+
+ /* everything else falls through */
+ }
+
+ report_status(service_status.dwCurrentState, NO_ERROR, 0);
+}
+
+void WINAPI service_main(DWORD argc, LPTSTR * argv) {
+
+ h_service_status = RegisterServiceCtrlHandler( _T(SVCNAME), service_control);
+
+ if (!h_service_status)
+ goto cleanup;
+
+ ZeroMemory(&service_status, sizeof(service_status));
+
+ service_status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
+ service_status.dwServiceSpecificExitCode = 0;
+
+ if (!report_status(SERVICE_START_PENDING,
+ NO_ERROR,
+ 3000))
+ goto cleanup;
+
+ service_start(argc, argv);
+
+ cleanup:
+
+ if (h_service_status) {
+ report_status(SERVICE_STOPPED, NO_ERROR, 0);
+ }
+}
+
+
+BOOL
+IsInstalled()
+{
+ BOOL bResult = FALSE;
+ SC_HANDLE hSCM;
+ SC_HANDLE hService;
+
+ // Open the Service Control Manager
+ hSCM = OpenSCManager( NULL, // local machine
+ NULL, // ServicesActive database
+ SC_MANAGER_ALL_ACCESS); // full access
+ if (hSCM) {
+
+ // Try to open the service
+ hService = OpenService( hSCM,
+ SVCNAME,
+ SERVICE_QUERY_CONFIG);
+ if (hService) {
+ bResult = TRUE;
+ CloseServiceHandle(hService);
+ }
+
+ CloseServiceHandle(hSCM);
+ }
+
+ return bResult;
+}
+
+BOOL
+Install()
+{
+ char szFilePath[_MAX_PATH];
+ SC_HANDLE hSCM;
+ SC_HANDLE hService;
+ TCHAR szKey[256];
+ HKEY hKey = NULL;
+ DWORD dwData;
+
+ // Open the Service Control Manager
+ hSCM = OpenSCManager( NULL, // local machine
+ NULL, // ServicesActive database
+ SC_MANAGER_ALL_ACCESS); // full access
+ if (!hSCM)
+ return FALSE;
+
+ // Get the executable file path
+ GetModuleFileName(NULL, szFilePath, sizeof(szFilePath));
+
+ // Create the service
+ hService = CreateService( hSCM,
+ SVCNAME,
+ SVCNAME,
+ SERVICE_ALL_ACCESS,
+ SERVICE_WIN32_OWN_PROCESS,
+ SERVICE_AUTO_START, // start condition
+ SERVICE_ERROR_NORMAL,
+ szFilePath,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL);
+ if (!hService) {
+ CloseServiceHandle(hSCM);
+ return FALSE;
+ }
+
+ // make registry entries to support logging messages
+ // Add the source name as a subkey under the Application
+ // key in the EventLog service portion of the registry.
+ StringCbCopyA(szKey, 256, "SYSTEM\\CurrentControlSet\\Services\\EventLog\\Application\\IKSD");
+ if (RegCreateKey(HKEY_LOCAL_MACHINE, szKey, &hKey) != ERROR_SUCCESS) {
+ CloseServiceHandle(hService);
+ CloseServiceHandle(hSCM);
+ return FALSE;
+ }
+
+ // Add the Event ID message-file name to the 'EventMessageFile' subkey.
+ RegSetValueEx( hKey,
+ "EventMessageFile",
+ 0,
+ REG_EXPAND_SZ,
+ (CONST BYTE*)szFilePath,
+ strlen(szFilePath) + 1);
+
+ // Set the supported types flags.
+ dwData = EVENTLOG_ERROR_TYPE | EVENTLOG_WARNING_TYPE | EVENTLOG_INFORMATION_TYPE;
+ RegSetValueEx( hKey,
+ "TypesSupported",
+ 0,
+ REG_DWORD,
+ (CONST BYTE*)&dwData,
+ sizeof(DWORD));
+ RegCloseKey(hKey);
+
+ // LogEvent(EVENTLOG_INFORMATION_TYPE, EVMSG_INSTALLED, SVCNAME);
+
+ // tidy up
+ CloseServiceHandle(hService);
+ CloseServiceHandle(hSCM);
+ return TRUE;
+}
+
+BOOL
+Uninstall()
+{
+ BOOL bResult = FALSE;
+ SC_HANDLE hService;
+ SC_HANDLE hSCM;
+
+ // Open the Service Control Manager
+ hSCM = OpenSCManager( NULL, // local machine
+ NULL, // ServicesActive database
+ SC_MANAGER_ALL_ACCESS); // full access
+ if (!hSCM)
+ return FALSE;
+
+ hService = OpenService( hSCM,
+ SVCNAME,
+ DELETE);
+ if (hService) {
+ if (DeleteService(hService)) {
+ // LogEvent(EVENTLOG_INFORMATION_TYPE, EVMSG_REMOVED, SVCNAME);
+ bResult = TRUE;
+ } else {
+ // LogEvent(EVENTLOG_ERROR_TYPE, EVMSG_NOTREMOVED, SVCNAME);
+ }
+ CloseServiceHandle(hService);
+ }
+
+ CloseServiceHandle(hSCM);
+ return bResult;
+}
+
+
+// Returns TRUE if it found an arg it recognised, FALSE if not
+// Note: processing some arguments causes output to stdout to be generated.
+BOOL
+ParseStandardArgs(int argc, char* argv[])
+{
+ char szFilePath[_MAX_PATH];
+
+ // See if we have any command line args we recognize
+ if (argc <= 1)
+ return FALSE;
+
+ if ( _stricmp(argv[1], "-h") == 0 ||
+ _stricmp(argv[1], "-?") == 0 ||
+ _stricmp(argv[1], "/h") == 0 ||
+ _stricmp(argv[1], "/?") == 0) {
+
+ //
+ GetModuleFileName(NULL, szFilePath, sizeof(szFilePath));
+ fprintf(stderr, "usage: %s [-v | -i | -u | -h]\r\n",szFilePath);
+ return TRUE;
+ } else if (_stricmp(argv[1], "-v") == 0 ||
+ _stricmp(argv[1], "/v") == 0 ) {
+
+ // Spit out version info
+ fprintf(stderr, "%s Version 0.1\n",_T(SVCNAME));
+ fprintf(stderr, "The service is %s installed\n",
+ IsInstalled() ? "currently" : "not");
+ return TRUE; // say we processed the argument
+
+ } else if (_stricmp(argv[1], "-i") == 0 ||
+ _stricmp(argv[1], "/i") == 0) {
+
+ // Request to install.
+ if (IsInstalled()) {
+ fprintf(stderr, "%s is already installed\n", _T(SVCNAME));
+ } else {
+ // Try and install the copy that's running
+ if (Install()) {
+ fprintf(stderr, "%s installed\n", _T(SVCNAME));
+ } else {
+ fprintf(stderr, "%s failed to install. Error %d\n", _T(SVCNAME), GetLastError());
+ }
+ }
+ return TRUE; // say we processed the argument
+
+ } else if (_stricmp(argv[1], "-u") == 0 ||
+ _stricmp(argv[1], "/u") == 0) {
+
+ // Request to uninstall.
+ if (!IsInstalled()) {
+ fprintf(stderr, "%s is not installed\n", _T(SVCNAME));
+ } else {
+ // Try and remove the copy that's installed
+ if (Uninstall()) {
+ // Get the executable file path
+ GetModuleFileName(NULL, szFilePath, sizeof(szFilePath));
+ fprintf(stderr, "%s removed. (You must delete the file (%s) yourself.)\n"
+ _T(SVCNAME), szFilePath);
+ } else {
+ fprintf(stderr, "Could not remove %s. Error %d\n", _T(SVCNAME), GetLastError());
+ }
+ }
+ return TRUE; // say we processed the argument
+
+ }
+
+ // Don't recognise the args
+ return FALSE;
+}
+
+int main(int argc, char ** argv) {
+
+ SERVICE_TABLE_ENTRY dispatch_table[] = {
+ { _T(SVCNAME), (LPSERVICE_MAIN_FUNCTION) service_main },
+ { NULL, NULL }
+ };
+
+ if ( ParseStandardArgs(argc, argv) )
+ return 0;
+
+ if (!StartServiceCtrlDispatcher(dispatch_table)) {
+ fprintf(stderr, "Can't start service control dispatcher\n");
+ }
+
+ return 0;
+}
diff --git a/src/lib/ccapi/windows/server.c b/src/lib/ccapi/windows/server.c new file mode 100644 index 0000000000..ac4ab70abd --- /dev/null +++ b/src/lib/ccapi/windows/server.c @@ -0,0 +1,679 @@ +
+#include <windows.h>
+#include "msg.h"
+#include "marshall.h"
+#include "serv_ops.h"
+#include "datastore.h"
+#include <stdio.h>
+#include <process.h>
+#include <tchar.h>
+#include <rpc.h>
+#include <rpcndr.h>
+#include "ntccrpc.h"
+#include <strsafe.h>
+
+#define SVCNAME "MIT_CCAPI_NT_Service"
+
+HANDLE hMainThread = 0;
+HANDLE WaitToTerminate = 0;
+
+SERVICE_STATUS_HANDLE h_service_status = NULL;
+SERVICE_STATUS service_status;
+FILE * logfile = NULL;
+
+/* Log File */
+void begin_log(void) {
+ char temppath[512];
+
+ temppath[0] = L'\0';
+
+ GetTempPathA(sizeof(temppath), temppath);
+ StringCbCatA(temppath, sizeof(temppath), "mit_nt_ccapi.log");
+ logfile = fopen(temppath, "w");
+}
+
+void end_log(void) {
+ if (logfile) {
+ fclose(logfile);
+ logfile = NULL;
+ }
+}
+
+BOOL report_status(DWORD state,
+ DWORD exit_code,
+ DWORD wait_hint) {
+ static DWORD checkpoint = 1;
+ BOOL rv = TRUE;
+
+ if (state == SERVICE_START_PENDING)
+ service_status.dwControlsAccepted = 0;
+ else
+ service_status.dwControlsAccepted = SERVICE_ACCEPT_STOP;
+
+ service_status.dwCurrentState = state;
+ service_status.dwWin32ExitCode = exit_code;
+ service_status.dwWaitHint = wait_hint;
+
+ if (state == SERVICE_RUNNING ||
+ state == SERVICE_STOPPED)
+ service_status.dwCheckPoint = 0;
+ else
+ service_status.dwCheckPoint = checkpoint++;
+
+ rv = SetServiceStatus(h_service_status, &service_status);
+
+ return rv;
+}
+
+void service_start(DWORD argc, LPTSTR * argv) {
+ RPC_STATUS status;
+ RPC_BINDING_VECTOR * bv;
+
+ status = RpcServerUseProtseq("ncalrpc",
+ RPC_C_PROTSEQ_MAX_REQS_DEFAULT,
+ NULL);
+
+ if (status != RPC_S_OK) {
+ if (logfile) fprintf(logfile, "service_start RpcServerUseProtseq = 0x%x\n", status);
+ goto cleanup;
+ }
+
+ report_status(SERVICE_START_PENDING, NO_ERROR, 3000);
+
+ status = RpcServerRegisterIf(portable_ccapi_v1_0_s_ifspec,
+ 0, 0);
+
+ if (status != RPC_S_OK) {
+ if (logfile) fprintf(logfile, "service_start RpcServerRegisterIf = 0x%x\n", status);
+ goto cleanup;
+ }
+
+ report_status(SERVICE_START_PENDING, NO_ERROR, 3000);
+
+ status = RpcServerInqBindings(&bv);
+
+ if (status != RPC_S_OK) {
+ if (logfile) fprintf(logfile, "service_start RpcServerInqBindings = 0x%x\n", status);
+ goto cleanup;
+ }
+
+ status = RpcEpRegister(portable_ccapi_v1_0_s_ifspec,
+ bv, 0, 0);
+
+ if (status != RPC_S_OK) {
+ if (logfile) fprintf(logfile, "service_start RpcEpRegister = 0x%x\n", status);
+ goto cleanup;
+ }
+
+ report_status(SERVICE_START_PENDING, NO_ERROR, 3000);
+
+ status = RpcServerRegisterAuthInfo(NULL,
+ RPC_C_AUTHN_WINNT,
+ 0, 0);
+
+ if (status != RPC_S_OK) {
+ if (logfile) fprintf(logfile, "service_start RpcServerRegisterAuthInfo = 0x%x\n", status);
+ goto cleanup;
+ }
+
+ report_status(SERVICE_START_PENDING, NO_ERROR, 3000);
+
+ status = RpcServerListen(2,
+ RPC_C_LISTEN_MAX_CALLS_DEFAULT,
+ TRUE);
+
+ if (status != RPC_S_OK) {
+ if (logfile) fprintf(logfile, "service_start RpcServerListen = 0x%x\n", status);
+ goto cleanup;
+ }
+
+ report_status(SERVICE_RUNNING, NO_ERROR, 0);
+
+
+ if (logfile) fprintf(logfile, "service_start calling RpcMgmtWaitServerListen\n");
+ status = RpcMgmtWaitServerListen();
+ if (logfile) fprintf(logfile, "service_start RpcMgmtWaitServerListen = 0x%x\n", status);
+
+ cleanup:
+ RpcEpUnregister(portable_ccapi_v1_0_s_ifspec, bv, 0);
+
+ RpcBindingVectorFree(&bv);
+}
+
+void service_stop(void) {
+ if (logfile) fprintf(logfile, "service_stop\n");
+ RpcMgmtStopServerListening(0);
+}
+
+void * __RPC_USER MIDL_user_allocate(size_t s) {
+ return malloc(s);
+}
+
+void __RPC_USER MIDL_user_free(void * p) {
+ free(p);
+}
+
+typedef struct tag_client_info {
+ char client_name[512];
+ LUID luid;
+} client_info_t;
+
+int obtain_auth_info(client_info_t * client_info, cc_auth_info_t ** pauth_info)
+{
+ *pauth_info = (cc_auth_info_t *)malloc(sizeof(cc_auth_info_t));
+ if ( !*pauth_info )
+ return ccErrNoMem;
+
+ (*pauth_info)->len = strlen(client_info->client_name) + 1;
+ (*pauth_info)->info = malloc((*pauth_info)->len);
+ if ( !(*pauth_info)->info ) {
+ free(*pauth_info);
+ return ccErrNoMem;
+ }
+
+ memcpy((*pauth_info)->info, client_info->client_name, (*pauth_info)->len);
+
+ return 0;
+}
+
+void destroy_auth_info(cc_auth_info_t *auth_info)
+{
+ free(auth_info->info);
+ free(auth_info);
+}
+
+int obtain_session_info(client_info_t * client_info, cc_session_info_t ** psession_info)
+{
+ *psession_info = (cc_session_info_t *)malloc(sizeof(cc_session_info_t));
+ if ( !*psession_info )
+ return ccErrNoMem;
+
+ (*psession_info)->len = sizeof(LUID);
+ (*psession_info)->info = malloc((*psession_info)->len);
+ if ( !(*psession_info)->info ) {
+ free(*psession_info);
+ return ccErrNoMem;
+ }
+
+ memcpy((*psession_info)->info, &client_info->luid, (*psession_info)->len);
+
+ return 0;
+}
+
+void destroy_session_info(cc_session_info_t *session_info)
+{
+ free(session_info->info);
+ free(session_info);
+}
+
+RPC_STATUS check_auth(handle_t h, client_info_t * client_info) {
+ RPC_BINDING_HANDLE bh = (RPC_BINDING_HANDLE) h;
+ RPC_STATUS status;
+ HANDLE htoken = NULL;
+ char name[256];
+ char domain[256];
+ DWORD name_len;
+ DWORD domain_len;
+ SID_NAME_USE snu = 0;
+
+ struct {
+ TOKEN_ORIGIN origin;
+ char pad[512];
+ } torigin;
+
+ struct {
+ TOKEN_OWNER owner;
+ char pad[4096];
+ } towner;
+
+ DWORD len;
+
+ status = RpcImpersonateClient(bh);
+
+ if (status != RPC_S_OK)
+ return status;
+
+ if (!OpenThreadToken(GetCurrentThread(),
+ TOKEN_READ | TOKEN_QUERY_SOURCE,
+ FALSE,
+ &htoken)) {
+ status = GetLastError();
+ goto _cleanup;
+ }
+
+ len = 0;
+
+ if (!GetTokenInformation(htoken,
+ TokenOrigin,
+ &torigin.origin,
+ sizeof(torigin),
+ &len)) {
+ status = GetLastError();
+ goto _cleanup;
+ }
+
+ if (!GetTokenInformation(htoken,
+ TokenOwner,
+ &towner.owner,
+ sizeof(towner),
+ &len)) {
+ status = GetLastError();
+ goto _cleanup;
+ }
+
+
+ name_len = sizeof(name)/sizeof(name[0]);
+ domain_len = sizeof(domain)/sizeof(domain[0]);
+
+ if (!LookupAccountSidA(NULL,
+ towner.owner.Owner,
+ name,
+ &name_len,
+ domain,
+ &domain_len,
+ &snu)) {
+ status = GetLastError();
+ goto _cleanup;
+ }
+
+ client_info->luid = torigin.origin.OriginatingLogonSession;
+ StringCbPrintfA(client_info->client_name,
+ sizeof(client_info->client_name),
+ "%s\\%s", domain, name);
+
+ status = 0;
+
+ _cleanup:
+
+ RpcRevertToSelf();
+
+ return status;
+}
+
+__int32 ccapi_Message(
+ /* [in] */ handle_t h,
+ /* [string][in] */ unsigned char *client_name,
+ /* [in] */ struct __LUID luid,
+ /* [size_is][length_is][in] */ unsigned char in_buf[],
+ /* [in] */ __int32 in_len,
+ /* [size_is][length_is][out] */ unsigned char out_buf[],
+ /* [out] */ __int32 *out_len)
+{
+ client_info_t client_info;
+ cc_msg_t * msg = NULL;
+ cc_msg_t * resp = NULL;
+ cc_auth_info_t * auth_info = NULL;
+ cc_session_info_t * session_info = NULL;
+ cc_int32 code;
+
+ if (logfile) fprintf(logfile, "ccapi_Message\n");
+
+ if ( ccs_serv_initialize() != ccNoError ) {
+ code = ccErrServerUnavailable;
+ goto done;
+ }
+
+ code = check_auth(h, &client_info);
+ if (code == 0) {
+ if (!strcmp("SYSTEM",client_info.client_name) &&
+ client_info.luid.HighPart == 0 &&
+ client_info.luid.LowPart == 0 &&
+ client_name != NULL &&
+ client_name[0] != '\0') {
+ StringCbPrintfA(client_info.client_name,
+ sizeof(client_info.client_name),
+ "%s", client_name);
+ client_info.luid.HighPart = luid.HighPart;
+ client_info.luid.LowPart = luid.LowPart;
+ }
+ } else {
+ code = ccErrServerCantBecomeUID;
+ goto done;
+ }
+
+ /* allocate message */
+ msg = (cc_msg_t *)malloc(sizeof(cc_msg_t));
+ if (!msg) {
+ code = ccErrNoMem;
+ goto done;
+ }
+
+ /* unflatten message */
+ code = cci_msg_unflatten(in_buf, in_len, &msg);
+ if (code)
+ goto cleanup;
+
+ /* obtain auth info */
+ code = obtain_auth_info(&client_info, &auth_info);
+ if (code)
+ goto cleanup;
+
+ /* obtain session info */
+ code = obtain_session_info(&client_info, &session_info);
+ if (code)
+ goto cleanup;
+
+ /* process message */
+ code = ccs_serv_process_msg(msg, auth_info, session_info, &resp);
+ if (code)
+ goto cleanup;
+
+ /* flatten response */
+ code = cci_msg_flatten(resp, NULL);
+ if (code)
+ goto cleanup;
+
+ /* send response */
+ if (resp->flat_len > MAXMSGLEN) {
+ code = ccErrBadInternalMessage;
+ goto cleanup;
+ }
+ memcpy(out_buf, resp->flat, resp->flat_len);
+ *out_len = resp->flat_len;
+ code = ccNoError;
+
+ cleanup:
+ if (auth_info)
+ destroy_auth_info(auth_info);
+
+ if (session_info)
+ destroy_session_info(session_info);
+
+ /* free message */
+ if (msg)
+ cci_msg_destroy(msg);
+
+ /* free response */
+ if (resp)
+ cci_msg_destroy(resp);
+
+ done:
+ return code ? -1 : 0;
+}
+
+void WINAPI service_control(DWORD ctrl_code) {
+ switch(ctrl_code) {
+ case SERVICE_CONTROL_STOP:
+ report_status(SERVICE_STOP_PENDING, NO_ERROR, 0);
+ service_stop();
+ return;
+
+ /* everything else falls through */
+ }
+
+ report_status(service_status.dwCurrentState, NO_ERROR, 0);
+}
+
+void WINAPI service_main(DWORD argc, LPTSTR * argv) {
+
+ begin_log();
+
+ h_service_status = RegisterServiceCtrlHandler( _T(SVCNAME), service_control);
+
+ if (!h_service_status)
+ goto cleanup;
+
+ ZeroMemory(&service_status, sizeof(service_status));
+
+ service_status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
+ service_status.dwServiceSpecificExitCode = 0;
+
+ if (!report_status(SERVICE_START_PENDING,
+ NO_ERROR,
+ 3000))
+ goto cleanup;
+
+ service_start(argc, argv);
+
+ cleanup:
+
+ if (h_service_status) {
+ report_status(SERVICE_STOPPED, NO_ERROR, 0);
+ }
+
+ end_log();
+}
+
+
+BOOL
+IsInstalled()
+{
+ BOOL bResult = FALSE;
+ SC_HANDLE hSCM;
+ SC_HANDLE hService;
+
+ // Open the Service Control Manager
+ hSCM = OpenSCManager( NULL, // local machine
+ NULL, // ServicesActive database
+ SC_MANAGER_ALL_ACCESS); // full access
+ if (hSCM) {
+
+ // Try to open the service
+ hService = OpenService( hSCM,
+ SVCNAME,
+ SERVICE_QUERY_CONFIG);
+ if (hService) {
+ bResult = TRUE;
+ CloseServiceHandle(hService);
+ }
+
+ CloseServiceHandle(hSCM);
+ }
+
+ return bResult;
+}
+
+BOOL
+Install()
+{
+ char szFilePath[_MAX_PATH];
+ SC_HANDLE hSCM;
+ SC_HANDLE hService;
+ TCHAR szKey[256];
+ HKEY hKey = NULL;
+ DWORD dwData;
+
+ // Open the Service Control Manager
+ hSCM = OpenSCManager( NULL, // local machine
+ NULL, // ServicesActive database
+ SC_MANAGER_ALL_ACCESS); // full access
+ if (!hSCM)
+ return FALSE;
+
+ // Get the executable file path
+ GetModuleFileName(NULL, szFilePath, sizeof(szFilePath));
+
+ // Create the service
+ hService = CreateService( hSCM,
+ SVCNAME,
+ SVCNAME,
+ SERVICE_ALL_ACCESS,
+ SERVICE_WIN32_OWN_PROCESS,
+ SERVICE_AUTO_START, // start condition
+ SERVICE_ERROR_NORMAL,
+ szFilePath,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL);
+ if (!hService) {
+ CloseServiceHandle(hSCM);
+ return FALSE;
+ }
+
+ // make registry entries to support logging messages
+ // Add the source name as a subkey under the Application
+ // key in the EventLog service portion of the registry.
+ StringCbCopyA(szKey, 256, "SYSTEM\\CurrentControlSet\\Services\\EventLog\\Application\\IKSD");
+ if (RegCreateKey(HKEY_LOCAL_MACHINE, szKey, &hKey) != ERROR_SUCCESS) {
+ CloseServiceHandle(hService);
+ CloseServiceHandle(hSCM);
+ return FALSE;
+ }
+
+ // Add the Event ID message-file name to the 'EventMessageFile' subkey.
+ RegSetValueEx( hKey,
+ "EventMessageFile",
+ 0,
+ REG_EXPAND_SZ,
+ (CONST BYTE*)szFilePath,
+ strlen(szFilePath) + 1);
+
+ // Set the supported types flags.
+ dwData = EVENTLOG_ERROR_TYPE | EVENTLOG_WARNING_TYPE | EVENTLOG_INFORMATION_TYPE;
+ RegSetValueEx( hKey,
+ "TypesSupported",
+ 0,
+ REG_DWORD,
+ (CONST BYTE*)&dwData,
+ sizeof(DWORD));
+ RegCloseKey(hKey);
+
+ // LogEvent(EVENTLOG_INFORMATION_TYPE, EVMSG_INSTALLED, SVCNAME);
+
+ // tidy up
+ CloseServiceHandle(hService);
+ CloseServiceHandle(hSCM);
+ return TRUE;
+}
+
+BOOL
+Uninstall()
+{
+ BOOL bResult = FALSE;
+ SC_HANDLE hService;
+ SC_HANDLE hSCM;
+
+ // Open the Service Control Manager
+ hSCM = OpenSCManager( NULL, // local machine
+ NULL, // ServicesActive database
+ SC_MANAGER_ALL_ACCESS); // full access
+ if (!hSCM)
+ return FALSE;
+
+ hService = OpenService( hSCM,
+ _T(SVCNAME),
+ DELETE);
+ if (hService) {
+ if (DeleteService(hService)) {
+ // LogEvent(EVENTLOG_INFORMATION_TYPE, EVMSG_REMOVED, SVCNAME);
+ bResult = TRUE;
+ } else {
+ // LogEvent(EVENTLOG_ERROR_TYPE, EVMSG_NOTREMOVED, SVCNAME);
+ }
+ CloseServiceHandle(hService);
+ }
+
+ CloseServiceHandle(hSCM);
+ return bResult;
+}
+
+
+// Returns TRUE if it found an arg it recognised, FALSE if not
+// Note: processing some arguments causes output to stdout to be generated.
+BOOL
+ParseStandardArgs(int argc, char* argv[])
+{
+ char szFilePath[_MAX_PATH]="not a file name";
+
+ // See if we have any command line args we recognize
+ if (argc <= 1)
+ return FALSE;
+
+ if ( _stricmp(argv[1], "-h") == 0 ||
+ _stricmp(argv[1], "-?") == 0 ||
+ _stricmp(argv[1], "/h") == 0 ||
+ _stricmp(argv[1], "/?") == 0) {
+
+ //
+ GetModuleFileNameA(NULL, szFilePath, sizeof(szFilePath));
+ fprintf(stderr, "usage: %s [-v | -i | -u | -h]\r\n",szFilePath);
+ return TRUE;
+ } else if (_stricmp(argv[1], "-v") == 0 ||
+ _stricmp(argv[1], "/v") == 0 ) {
+
+ // Spit out version info
+ fprintf(stderr, "%s Version 0.1\n",_T(SVCNAME));
+ fprintf(stderr, "The service is %s installed\n",
+ IsInstalled() ? "currently" : "not");
+ return TRUE; // say we processed the argument
+
+ } else if (_stricmp(argv[1], "-i") == 0 ||
+ _stricmp(argv[1], "/i") == 0) {
+
+ // Request to install.
+ if (IsInstalled()) {
+ fprintf(stderr, "%s is already installed\n", _T(SVCNAME));
+ } else {
+ // Try and install the copy that's running
+ if (Install()) {
+ fprintf(stderr, "%s installed\n", _T(SVCNAME));
+ } else {
+ fprintf(stderr, "%s failed to install. Error %d\n", _T(SVCNAME), GetLastError());
+ }
+ }
+ return TRUE; // say we processed the argument
+
+ } else if (_stricmp(argv[1], "-u") == 0 ||
+ _stricmp(argv[1], "/u") == 0) {
+
+ // Request to uninstall.
+ if (!IsInstalled()) {
+ fprintf(stderr, "%s is not installed\n", _T(SVCNAME));
+ } else {
+ // Try and remove the copy that's installed
+ if (Uninstall()) {
+ // Get the executable file path
+ GetModuleFileNameA(NULL, szFilePath, sizeof(szFilePath));
+ fprintf(stderr, "%s removed. (You must delete the file (%s) yourself.)\n",
+ _T(SVCNAME), szFilePath);
+ } else {
+ fprintf(stderr, "Could not remove %s. Error %d\n", _T(SVCNAME), GetLastError());
+ }
+ }
+ return TRUE; // say we processed the argument
+
+ }
+
+ // Don't recognise the args
+ return FALSE;
+}
+
+DWORD __stdcall Main_thread(void* notUsed)
+{
+ char * argv[2] = {SVCNAME, NULL};
+ begin_log();
+ service_start(1, (LPTSTR*)argv);
+ end_log();
+ return(0);
+}
+
+int main(int argc, char ** argv) {
+ SERVICE_TABLE_ENTRY dispatch_table[] = {
+ { _T(SVCNAME), (LPSERVICE_MAIN_FUNCTION) service_main },
+ { NULL, NULL }
+ };
+
+ if ( ParseStandardArgs(argc, argv) )
+ return 0;
+
+ if (!StartServiceCtrlDispatcher(dispatch_table)) {
+ LONG status = GetLastError();
+ if (status == ERROR_FAILED_SERVICE_CONTROLLER_CONNECT)
+ {
+ DWORD tid;
+ hMainThread = CreateThread(NULL, 0, Main_thread, 0, 0, &tid);
+
+ printf("Hit <Enter> to terminate MIT CCAPI Server\n");
+ getchar();
+ service_stop();
+ }
+ }
+
+ if ( hMainThread ) {
+ WaitForSingleObject( hMainThread, INFINITE );
+ CloseHandle( hMainThread );
+ }
+ return 0;
+}
diff --git a/src/lib/krb5/ccache/ccapi/stdcc.c b/src/lib/krb5/ccache/ccapi/stdcc.c index 885abf5bb7..cd4a1f3d7d 100644 --- a/src/lib/krb5/ccache/ccapi/stdcc.c +++ b/src/lib/krb5/ccache/ccapi/stdcc.c @@ -3,8 +3,9 @@ * credentical cache API * * Written by Frank Dabek July 1998 + * Updated by Jeffrey Altman June 2006 * - * Copyright 1998, 1999 by the Massachusetts Institute of Technology. + * Copyright 1998, 1999, 2006 by the Massachusetts Institute of Technology. * All Rights Reserved. * * Export of this software from the United States of America may @@ -28,15 +29,12 @@ * */ -#define NEED_WINDOWS #include "k5-int.h" #include "stdcc.h" #include "stdcc_util.h" #include "string.h" #include <stdio.h> -apiCB *gCntrlBlock = NULL; - #if defined(_WIN32) #include "winccld.h" #endif @@ -56,14 +54,37 @@ apiCB *gCntrlBlock = NULL; #define SHOW_DEBUG(buf) #endif +#ifdef USE_CCAPI_V3 +cc_context_t gCntrlBlock = NULL; +#else +apiCB *gCntrlBlock = NULL; +#endif + /* * declare our global object wanna-be * must be installed in ccdefops.c */ krb5_cc_ops krb5_cc_stdcc_ops = { - 0, - "API", + 0, + "API", +#ifdef USE_CCAPI_V3 + krb5_stdccv3_get_name, + krb5_stdccv3_resolve, + krb5_stdccv3_generate_new, + krb5_stdccv3_initialize, + krb5_stdccv3_destroy, + krb5_stdccv3_close, + krb5_stdccv3_store, + krb5_stdccv3_retrieve, + krb5_stdccv3_get_principal, + krb5_stdccv3_start_seq_get, + krb5_stdccv3_next_cred, + krb5_stdccv3_end_seq_get, + krb5_stdccv3_remove, + krb5_stdccv3_set_flags, + krb5_stdccv3_get_flags +#else krb5_stdcc_get_name, krb5_stdcc_resolve, krb5_stdcc_generate_new, @@ -78,7 +99,8 @@ krb5_cc_ops krb5_cc_stdcc_ops = { krb5_stdcc_end_seq_get, krb5_stdcc_remove, krb5_stdcc_set_flags, - krb5_stdcc_get_flags, + krb5_stdcc_get_flags +#endif }; #if defined(_WIN32) @@ -114,6 +136,36 @@ struct err_xlate static const struct err_xlate err_xlate_table[] = { +#ifdef USE_CCAPI_V3 + { ccIteratorEnd, KRB5_CC_END }, + { ccErrBadParam, KRB5_FCC_INTERNAL }, + { ccErrNoMem, KRB5_CC_NOMEM }, + { ccErrInvalidContext, KRB5_FCC_INTERNAL }, + { ccErrInvalidCCache, KRB5_FCC_INTERNAL }, + { ccErrInvalidString, KRB5_FCC_INTERNAL }, + { ccErrInvalidCredentials, KRB5_FCC_INTERNAL }, + { ccErrInvalidCCacheIterator, KRB5_FCC_INTERNAL }, + { ccErrInvalidCredentialsIterator, KRB5_FCC_INTERNAL }, + { ccErrInvalidLock, KRB5_FCC_INTERNAL }, + { ccErrBadName, KRB5_CC_BADNAME }, + { ccErrBadCredentialsVersion, KRB5_FCC_INTERNAL }, + { ccErrBadAPIVersion, KRB5_FCC_INTERNAL }, + { ccErrContextLocked, KRB5_FCC_INTERNAL }, + { ccErrContextUnlocked, KRB5_FCC_INTERNAL }, + { ccErrCCacheLocked, KRB5_FCC_INTERNAL }, + { ccErrCCacheUnlocked, KRB5_FCC_INTERNAL }, + { ccErrBadLockType, KRB5_FCC_INTERNAL }, + { ccErrNeverDefault, KRB5_FCC_INTERNAL }, + { ccErrCredentialsNotFound, KRB5_CC_NOTFOUND }, + { ccErrCCacheNotFound, KRB5_FCC_NOFILE }, + { ccErrContextNotFound, KRB5_FCC_INTERNAL }, + { ccErrServerUnavailable, KRB5_FCC_NOFILE }, + { ccErrServerInsecure, KRB5_FCC_INTERNAL }, + { ccErrServerCantBecomeUID, KRB5_FCC_INTERNAL }, + { ccErrTimeOffsetNotSet, KRB5_FCC_INTERNAL }, + { ccErrBadInternalMessage, KRB5_FCC_INTERNAL }, + { ccErrNotImplemented, KRB5_FCC_INTERNAL }, +#else { CC_BADNAME, KRB5_CC_BADNAME }, { CC_NOTFOUND, KRB5_CC_NOTFOUND }, { CC_END, KRB5_CC_END }, @@ -131,6 +183,7 @@ static const struct err_xlate err_xlate_table[] = { CC_ERR_CACHE_RELEASE, KRB5_FCC_INTERNAL /* XXX */ }, { CC_ERR_CACHE_FULL, KRB5_FCC_INTERNAL /* XXX */ }, { CC_ERR_CRED_VERSION, KRB5_FCC_INTERNAL /* XXX */ }, +#endif { 0, 0 } }; @@ -138,7 +191,7 @@ static krb5_error_code cc_err_xlate(int err) { const struct err_xlate *p; - if (err == CC_NOERROR) + if (err == ccNoError) return 0; for (p = err_xlate_table; p->cc_err; p++) { @@ -148,6 +201,537 @@ static krb5_error_code cc_err_xlate(int err) return KRB5_FCC_INTERNAL; /* XXX we need a miscellaneous return */ } + +#ifdef USE_CCAPI_V3 +static krb5_error_code stdccv3_setup(krb5_context context, + stdccCacheDataPtr ccapi_data) +{ + cc_int32 err; + + /* make sure the API has been intialized */ + if (gCntrlBlock == NULL) { + err = cc_initialize(&gCntrlBlock, ccapi_version_max, NULL, NULL); + if (err != ccNoError) + return cc_err_xlate(err); + } + + /* + * No ccapi_data structure, so we don't need to make sure the + * ccache exists. + */ + if (!ccapi_data) + return 0; + + /* + * The ccache already exists + */ + if (ccapi_data->NamedCache) + return 0; + + err = cc_context_open_ccache(gCntrlBlock, ccapi_data->cache_name, + &ccapi_data->NamedCache); + if (err == ccNoError) + return 0; + + ccapi_data->NamedCache = NULL; + return cc_err_xlate(err); +} + +/* krb5_stdcc_shutdown is exported; use the old name */ +void krb5_stdcc_shutdown() +{ + if (gCntrlBlock) + cc_context_release(gCntrlBlock); + gCntrlBlock = NULL; +} + +/* + * -- generate_new -------------------------------- + * + * create a new cache with a unique name, corresponds to creating a + * named cache initialize the API here if we have to. + */ +krb5_error_code KRB5_CALLCONV krb5_stdccv3_generate_new + (krb5_context context, krb5_ccache *id ) +{ + krb5_ccache newCache = NULL; + krb5_error_code retval; + stdccCacheDataPtr ccapi_data = NULL; + char *name = NULL; + cc_time time; + int err; + + if ((retval = stdccv3_setup(context, NULL))) + return retval; + + retval = KRB5_CC_NOMEM; + if (!(newCache = (krb5_ccache) malloc(sizeof(struct _krb5_ccache)))) + goto errout; + if (!(ccapi_data = (stdccCacheDataPtr)malloc(sizeof(stdccCacheData)))) + goto errout; + if (!(name = malloc(256))) + goto errout; + + /* create a unique name */ + if (retval = cc_context_get_change_time(gCntrlBlock, &time)) + goto errout; + sprintf(name, "gen_new_cache%d", time); + + /* create the new cache */ + err = cc_context_create_ccache(gCntrlBlock, name, cc_credentials_v5, 0L, + &ccapi_data->NamedCache); + if (err != ccNoError) { + retval = cc_err_xlate(err); + goto errout; + } + + /* setup some fields */ + newCache->ops = &krb5_cc_stdcc_ops; + newCache->data = ccapi_data; + ccapi_data->cache_name = name; + + /* return a pointer to the new cache */ + *id = newCache; + + return 0; + +errout: + if (newCache) + free(newCache); + if (ccapi_data) + free(ccapi_data); + if (name) + free(name); + return retval; +} + +/* + * resolve + * + * create a new cache with the name stored in residual + */ +krb5_error_code KRB5_CALLCONV krb5_stdccv3_resolve + (krb5_context context, krb5_ccache *id , const char *residual ) +{ + krb5_ccache newCache = NULL; + stdccCacheDataPtr ccapi_data = NULL; + int err; + krb5_error_code retval; + char *cName = NULL; + + if ((retval = stdccv3_setup(context, NULL))) + return retval; + + retval = KRB5_CC_NOMEM; + if (!(newCache = (krb5_ccache) malloc(sizeof(struct _krb5_ccache)))) + goto errout; + + if (!(ccapi_data = (stdccCacheDataPtr)malloc(sizeof(stdccCacheData)))) + goto errout; + + if (!(cName = malloc(strlen(residual)+1))) + goto errout; + + newCache->ops = &krb5_cc_stdcc_ops; + newCache->data = ccapi_data; + ccapi_data->cache_name = cName; + + strcpy(cName, residual); + + err = cc_context_open_ccache(gCntrlBlock, cName, + &ccapi_data->NamedCache); + if (err != ccNoError) { + ccapi_data->NamedCache = NULL; + goto errout; + } + + /* return new cache structure */ + *id = newCache; + + return 0; + +errout: + if (newCache) + free(newCache); + if (ccapi_data) + free(ccapi_data); + if (cName) + free(cName); + return retval; +} + +/* + * initialize + * + * initialize the cache, check to see if one already exists for this + * principal if not set our principal to this principal. This + * searching enables ticket sharing + */ +krb5_error_code KRB5_CALLCONV krb5_stdccv3_initialize + (krb5_context context, krb5_ccache id, krb5_principal princ) +{ + stdccCacheDataPtr ccapi_data = NULL; + int err; + char *cName = NULL; + krb5_error_code retval; + + if ((retval = stdccv3_setup(context, NULL))) + return retval; + + /* test id for null */ + if (id == NULL) return KRB5_CC_NOMEM; + + if ((retval = krb5_unparse_name(context, princ, &cName))) + return retval; + + ccapi_data = id->data; + + + if (ccapi_data->NamedCache) { + err = cc_ccache_release(ccapi_data->NamedCache); + ccapi_data->NamedCache = NULL; + } + + err = cc_context_create_ccache(gCntrlBlock, ccapi_data->cache_name, + cc_credentials_v5, cName, + &ccapi_data->NamedCache); + if (err != ccNoError) { + krb5_free_unparsed_name(context, cName); + return cc_err_xlate(err); + } + + krb5_free_unparsed_name(context, cName); + cache_changed(); + + return cc_err_xlate(err); +} + +/* + * store + * + * store some credentials in our cache + */ +krb5_error_code KRB5_CALLCONV krb5_stdccv3_store + (krb5_context context, krb5_ccache id, krb5_creds *creds ) +{ + krb5_error_code retval; + stdccCacheDataPtr ccapi_data = id->data; + cc_credentials_t c = NULL; + int err; + + if ((retval = stdccv3_setup(context, ccapi_data))) + return retval; + + /* copy the fields from the almost identical structures */ + dupK5toCC3(context, creds, &c); + + /* + * finally store the credential + * store will copy (that is duplicate) everything + */ + err = cc_ccache_store_credentials(((stdccCacheDataPtr)(id->data))->NamedCache, c->data); + if (err != ccNoError) + return cc_err_xlate(err); + + err = cc_credentials_release(c); + + cache_changed(); + return err; +} + +/* + * start_seq_get + * + * begin an iterator call to get all of the credentials in the cache + */ +krb5_error_code KRB5_CALLCONV krb5_stdccv3_start_seq_get +(krb5_context context, krb5_ccache id , krb5_cc_cursor *cursor ) +{ + stdccCacheDataPtr ccapi_data = id->data; + krb5_error_code retval; + int err; + cc_credentials_iterator_t iterator; + + if ((retval = stdccv3_setup(context, ccapi_data))) + return retval; + + err = cc_ccache_new_credentials_iterator(ccapi_data->NamedCache, + &iterator); + if (err != ccNoError) + return cc_err_xlate(err); + *cursor = iterator; + return 0; +} + +/* + * next cred + * + * - get the next credential in the cache as part of an iterator call + * - this maps to call to cc_seq_fetch_creds + */ +krb5_error_code KRB5_CALLCONV krb5_stdccv3_next_cred + (krb5_context context, krb5_ccache id, krb5_cc_cursor *cursor, + krb5_creds *creds) +{ + krb5_error_code retval; + stdccCacheDataPtr ccapi_data = id->data; + int err; + cc_credentials_t cu; + cc_credentials_iterator_t iterator; + + if ((retval = stdccv3_setup(context, ccapi_data))) + return retval; + + iterator = *cursor; + if (iterator == 0) + return KRB5_CC_END; + err = cc_credentials_iterator_next(iterator, &cu); + + if (err == ccIteratorEnd) { + cc_credentials_iterator_release(iterator); + *cursor = 0; + } + if (err != ccNoError) + return cc_err_xlate(err); + + /* copy data (with translation) */ + dupCC3toK5(context, cu, creds); + + cc_credentials_release(cu); + + return 0; +} + + +/* + * retrieve + * + * - try to find a matching credential in the cache + */ +krb5_error_code KRB5_CALLCONV +krb5_stdccv3_retrieve(context, id, whichfields, mcreds, creds) + krb5_context context; + krb5_ccache id; + krb5_flags whichfields; + krb5_creds *mcreds; + krb5_creds *creds; +{ + return krb5_cc_retrieve_cred_default (context, id, whichfields, + mcreds, creds); +} + +/* + * end seq + * + * just free up the storage assoicated with the cursor (if we can) + */ +krb5_error_code KRB5_CALLCONV krb5_stdccv3_end_seq_get + (krb5_context context, krb5_ccache id, krb5_cc_cursor *cursor) +{ + krb5_error_code retval; + stdccCacheDataPtr ccapi_data = NULL; + int err; + cc_credentials_iterator_t iterator; + + ccapi_data = id->data; + + if ((retval = stdccv3_setup(context, ccapi_data))) + return retval; + + if (*cursor == NULL) + return 0; + + iterator = *cursor; + + err = cc_credentials_iterator_release(iterator); + if (err != ccNoError) + return cc_err_xlate(err); + return(0); +} + +/* + * close + * + * - free our pointers to the NC + */ +krb5_error_code KRB5_CALLCONV +krb5_stdccv3_close(krb5_context context, krb5_ccache id) +{ + krb5_error_code retval; + stdccCacheDataPtr ccapi_data = id->data; + + if ((retval = stdccv3_setup(context, NULL))) + return retval; + + /* free it */ + if (ccapi_data) { + if (ccapi_data->cache_name) + free(ccapi_data->cache_name); + if (ccapi_data->NamedCache) + cc_ccache_release(ccapi_data->NamedCache); + free(ccapi_data); + id->data = NULL; + } + free(id); + + return 0; +} + +/* + * destroy + * + * - free our storage and the cache + */ +krb5_error_code KRB5_CALLCONV +krb5_stdccv3_destroy (krb5_context context, krb5_ccache id) +{ + int err; + krb5_error_code retval; + stdccCacheDataPtr ccapi_data = id->data; + + if ((retval = stdccv3_setup(context, ccapi_data))) { + return retval; + } + + /* free memory associated with the krb5_ccache */ + if (ccapi_data) { + if (ccapi_data->cache_name) + free(ccapi_data->cache_name); + if (ccapi_data->NamedCache) { + /* destroy the named cache */ + err = cc_ccache_destroy(ccapi_data->NamedCache); + retval = cc_err_xlate(err); + cache_changed(); + } + free(ccapi_data); + id->data = NULL; + } + free(id); + + /* If the cache does not exist when we tried to destroy it, + that's fine. That means someone else destroyed it since + we resolved it. */ + if (retval == ccErrCCacheNotFound) + return 0; + return retval; +} + +/* + * getname + * + * - return the name of the named cache + */ +const char * KRB5_CALLCONV krb5_stdccv3_get_name + (krb5_context context, krb5_ccache id ) +{ + stdccCacheDataPtr ccapi_data = id->data; + + if (!ccapi_data) + return 0; + + return (ccapi_data->cache_name); +} + + +/* get_principal + * + * - return the principal associated with the named cache + */ +krb5_error_code KRB5_CALLCONV krb5_stdccv3_get_principal + (krb5_context context, krb5_ccache id , krb5_principal *princ) +{ + int err; + cc_string_t name = NULL; + stdccCacheDataPtr ccapi_data = id->data; + krb5_error_code retval; + + if ((retval = stdccv3_setup(context, ccapi_data))) + return retval; + + /* another wrapper */ + err = cc_ccache_get_principal(ccapi_data->NamedCache, cc_credentials_v5, &name); + + if (err != ccNoError) + return cc_err_xlate(err); + + /* turn it into a krb principal */ + err = krb5_parse_name(context, name->data, princ); + + cc_string_release(name); + + return err; +} + +/* + * set_flags + * + * - currently a NOP since we don't store any flags in the NC + */ +krb5_error_code KRB5_CALLCONV krb5_stdccv3_set_flags + (krb5_context context, krb5_ccache id , krb5_flags flags) +{ + stdccCacheDataPtr ccapi_data = id->data; + krb5_error_code retval; + + if ((retval = stdccv3_setup(context, ccapi_data))) + return retval; + + return 0; +} + +/* + * get_flags + * + * - currently a NOP since we don't store any flags in the NC + */ +krb5_error_code KRB5_CALLCONV krb5_stdccv3_get_flags + (krb5_context context, krb5_ccache id , krb5_flags *flags) +{ + stdccCacheDataPtr ccapi_data = id->data; + krb5_error_code retval; + + if ((retval = stdccv3_setup(context, ccapi_data))) + return retval; + + return 0; +} + +/* + * remove + * + * - remove the specified credentials from the NC + */ +krb5_error_code KRB5_CALLCONV krb5_stdccv3_remove + (krb5_context context, krb5_ccache id, + krb5_flags flags, krb5_creds *creds) +{ + cc_credentials_t c = NULL; + int err; + stdccCacheDataPtr ccapi_data = id->data; + krb5_error_code retval; + + if ((retval = stdccv3_setup(context, ccapi_data))) { + if (retval == KRB5_FCC_NOFILE) + return 0; + return retval; + } + + /* convert to a cred union */ + dupK5toCC3(context, creds, &c); + + /* remove it */ + err = cc_ccache_remove_credentials(ccapi_data->NamedCache, c); + if (err != ccNoError) + return cc_err_xlate(err); + + err = cc_credentials_release(c); + cache_changed(); + if (err != ccNoError) + return cc_err_xlate(err); + + return 0; +} +#else /* !USE_CCAPI_V3 */ static krb5_error_code stdcc_setup(krb5_context context, stdccCacheDataPtr ccapi_data) { @@ -192,7 +776,7 @@ void krb5_stdcc_shutdown() { if (gCntrlBlock) cc_shutdown(&gCntrlBlock); - gCntrlBlock = 0; + gCntrlBlock = NULL; } /* @@ -289,9 +873,10 @@ krb5_error_code KRB5_CALLCONV krb5_stdcc_resolve err = cc_open(gCntrlBlock, cName, CC_CRED_V5, 0L, &ccapi_data->NamedCache); - if (err != CC_NOERROR) - ccapi_data->NamedCache = NULL; - + if (err != CC_NOERROR) { + ccapi_data->NamedCache = NULL; + goto errout; + } /* return new cache structure */ *id = newCache; @@ -388,7 +973,7 @@ krb5_error_code KRB5_CALLCONV krb5_stdcc_store /* free the cred union using our local version of cc_free_creds() since we allocated it locally */ - err = krb5_free_cc_cred_union(&cu); + err = krb5int_free_cc_cred_union(&cu); cache_changed(); return err; @@ -523,7 +1108,6 @@ krb5_error_code KRB5_CALLCONV krb5_stdcc_retrieve return KRB5_CC_NOTFOUND; } #else -#include "k5-int.h" krb5_error_code KRB5_CALLCONV krb5_stdcc_retrieve(context, id, whichfields, mcreds, creds) @@ -763,10 +1347,11 @@ krb5_error_code KRB5_CALLCONV krb5_stdcc_remove /* free the cred union using our local version of cc_free_creds() since we allocated it locally */ - err = krb5_free_cc_cred_union(&cu); + err = krb5int_free_cc_cred_union(&cu); cache_changed(); if (err != CC_NOERROR) return cc_err_xlate(err); return 0; } +#endif /* !USE_CCAPI_V3 */
\ No newline at end of file diff --git a/src/lib/krb5/ccache/ccapi/stdcc.h b/src/lib/krb5/ccache/ccapi/stdcc.h index 81ce883cb6..c0ce13b420 100644 --- a/src/lib/krb5/ccache/ccapi/stdcc.h +++ b/src/lib/krb5/ccache/ccapi/stdcc.h @@ -1,13 +1,17 @@ -#include "krb5.h" -#include "k5-int.h" +#include "k5-int.h" /* loads krb5.h */ +#ifdef USE_CCAPI_V3 +#include <CredentialsCache.h> +#else #ifdef USE_CCAPI #include <CredentialsCache2.h> -#endif - +#else #if defined(_WIN32) #include "cacheapi.h" #endif +#endif +#endif + #define kStringLiteralLen 255 @@ -19,12 +23,71 @@ extern krb5_cc_ops krb5_cc_stdcc_ops; */ typedef struct _stdccCacheData { char *cache_name; +#ifdef USE_CCAPI_V3 + cc_ccache_t NamedCache; +#else ccache_p *NamedCache; +#endif } stdccCacheData, *stdccCacheDataPtr; /* function protoypes */ +#ifdef USE_CCAPI_V3 +void krb5_stdccv3_shutdown(void); + +krb5_error_code KRB5_CALLCONV krb5_stdccv3_close + (krb5_context, krb5_ccache id ); + +krb5_error_code KRB5_CALLCONV krb5_stdccv3_destroy + (krb5_context, krb5_ccache id ); + +krb5_error_code KRB5_CALLCONV krb5_stdccv3_end_seq_get + (krb5_context, krb5_ccache id , krb5_cc_cursor *cursor ); + +krb5_error_code KRB5_CALLCONV krb5_stdccv3_generate_new + (krb5_context, krb5_ccache *id ); + +const char * KRB5_CALLCONV krb5_stdccv3_get_name + (krb5_context, krb5_ccache id ); + +krb5_error_code KRB5_CALLCONV krb5_stdccv3_get_principal + (krb5_context, krb5_ccache id , krb5_principal *princ ); + +krb5_error_code KRB5_CALLCONV krb5_stdccv3_initialize + (krb5_context, krb5_ccache id , krb5_principal princ ); + +krb5_error_code KRB5_CALLCONV krb5_stdccv3_next_cred + (krb5_context, + krb5_ccache id , + krb5_cc_cursor *cursor , + krb5_creds *creds ); + +krb5_error_code KRB5_CALLCONV krb5_stdccv3_resolve + (krb5_context, krb5_ccache *id , const char *residual ); + +krb5_error_code KRB5_CALLCONV krb5_stdccv3_retrieve + (krb5_context, + krb5_ccache id , + krb5_flags whichfields , + krb5_creds *mcreds , + krb5_creds *creds ); + +krb5_error_code KRB5_CALLCONV krb5_stdccv3_start_seq_get + (krb5_context, krb5_ccache id , krb5_cc_cursor *cursor ); + +krb5_error_code KRB5_CALLCONV krb5_stdccv3_store + (krb5_context, krb5_ccache id , krb5_creds *creds ); + +krb5_error_code KRB5_CALLCONV krb5_stdccv3_set_flags + (krb5_context, krb5_ccache id , krb5_flags flags ); + +krb5_error_code KRB5_CALLCONV krb5_stdccv3_get_flags + (krb5_context, krb5_ccache id , krb5_flags *flags ); + +krb5_error_code KRB5_CALLCONV krb5_stdccv3_remove + (krb5_context, krb5_ccache id , krb5_flags flags, krb5_creds *creds); +#else void krb5_stdcc_shutdown(void); krb5_error_code KRB5_CALLCONV krb5_stdcc_close @@ -78,3 +141,4 @@ krb5_error_code KRB5_CALLCONV krb5_stdcc_get_flags krb5_error_code KRB5_CALLCONV krb5_stdcc_remove (krb5_context, krb5_ccache id , krb5_flags flags, krb5_creds *creds); +#endif
\ No newline at end of file diff --git a/src/lib/krb5/ccache/ccapi/stdcc_util.c b/src/lib/krb5/ccache/ccapi/stdcc_util.c index 7f9358dca5..1969b6e718 100644 --- a/src/lib/krb5/ccache/ccapi/stdcc_util.c +++ b/src/lib/krb5/ccache/ccapi/stdcc_util.c @@ -19,6 +19,401 @@ #define fieldSize 255 +#ifdef USE_CCAPI_V3 +/* krb5int_cc_credentials_release(cc_credentials_t creds) + * - function used to release internally generated cc_credentials_t objects + */ +static cc_int32 +krb5int_cc_credentials_release(cc_credentials_t creds) { + free(creds); + return ccNoError; +} + +static cc_int32 +krb5int_cc_credentials_compare(cc_credentials_t creds, + cc_credentials_t compare_to, + cc_uint32* equal) { + return ccErrNotImplemented; +} + +/* + * CopyCC3DataArrayToK5 + * - copy and translate the null terminated arrays of data records + * used in k5 tickets + */ +int +copyCC3DataArrayToK5(cc_credentials_v5_t *ccCreds, krb5_creds *v5Creds, char whichArray) { + + switch (whichArray) { + case kAddressArray: + if (ccCreds->addresses == NULL) { + v5Creds->addresses = NULL; + } else { + + krb5_address **addrPtr, *addr; + cc_data **dataPtr, *data; + unsigned int numRecords = 0; + + /* Allocate the array of pointers: */ + for (dataPtr = ccCreds->addresses; *dataPtr != NULL; numRecords++, dataPtr++) {} + + v5Creds->addresses = (krb5_address **) malloc (sizeof(krb5_address *) * (numRecords + 1)); + if (v5Creds->addresses == NULL) + return ENOMEM; + + /* Fill in the array, allocating the address structures: */ + for (dataPtr = ccCreds->addresses, addrPtr = v5Creds->addresses; *dataPtr != NULL; addrPtr++, dataPtr++) { + + *addrPtr = (krb5_address *) malloc (sizeof(krb5_address)); + if (*addrPtr == NULL) + return ENOMEM; + data = *dataPtr; + addr = *addrPtr; + + addr->addrtype = data->type; + addr->magic = KV5M_ADDRESS; + addr->length = data->length; + addr->contents = (krb5_octet *) malloc (sizeof(krb5_octet) * addr->length); + if (addr->contents == NULL) + return ENOMEM; + memmove(addr->contents, data->data, addr->length); /* copy contents */ + } + + /* Write terminator: */ + *addrPtr = NULL; + } + break; + case kAuthDataArray: + if (ccCreds->authdata == NULL) { + v5Creds->authdata = NULL; + } else { + krb5_authdata **authPtr, *auth; + cc_data **dataPtr, *data; + unsigned int numRecords = 0; + + /* Allocate the array of pointers: */ + for (dataPtr = ccCreds->authdata; *dataPtr != NULL; numRecords++, dataPtr++) {} + + v5Creds->authdata = (krb5_authdata **) malloc (sizeof(krb5_authdata *) * (numRecords + 1)); + if (v5Creds->authdata == NULL) + return ENOMEM; + + /* Fill in the array, allocating the address structures: */ + for (dataPtr = ccCreds->authdata, authPtr = v5Creds->authdata; *dataPtr != NULL; authPtr++, dataPtr++) { + + *authPtr = (krb5_authdata *) malloc (sizeof(krb5_authdata)); + if (*authPtr == NULL) + return ENOMEM; + data = *dataPtr; + auth = *authPtr; + + auth->ad_type = data->type; + auth->magic = KV5M_AUTHDATA; + auth->length = data->length; + auth->contents = (krb5_octet *) malloc (sizeof(krb5_octet) * auth->length); + if (auth->contents == NULL) + return ENOMEM; + memmove(auth->contents, data->data, auth->length); /* copy contents */ + } + + /* Write terminator: */ + *authPtr = NULL; + } + break; + } + + return 0; +} + +/* + * copyK5DataArrayToCC + * - analagous to above, but in the other direction + */ +int +copyK5DataArrayToCC3(krb5_creds *v5Creds, cc_credentials_v5_t * ccCreds, char whichArray) +{ + switch (whichArray) { + case kAddressArray: + if (v5Creds->addresses == NULL) { + ccCreds->addresses = NULL; + } else { + + krb5_address **addrPtr, *addr; + cc_data **dataPtr, *data; + unsigned int numRecords = 0; + + /* Allocate the array of pointers: */ + for (addrPtr = v5Creds->addresses; *addrPtr != NULL; numRecords++, addrPtr++) {} + + ccCreds->addresses = (cc_data **) malloc (sizeof(cc_data *) * (numRecords + 1)); + if (ccCreds->addresses == NULL) + return ENOMEM; + + /* Fill in the array, allocating the address structures: */ + for (dataPtr = ccCreds->addresses, addrPtr = v5Creds->addresses; *addrPtr != NULL; addrPtr++, dataPtr++) { + + *dataPtr = (cc_data *) malloc (sizeof(cc_data)); + if (*dataPtr == NULL) + return ENOMEM; + data = *dataPtr; + addr = *addrPtr; + + data->type = addr->addrtype; + data->length = addr->length; + data->data = malloc (sizeof(char) * data->length); + if (data->data == NULL) + return ENOMEM; + memmove(data->data, addr->contents, data->length); /* copy contents */ + } + + /* Write terminator: */ + *dataPtr = NULL; + } + break; + case kAuthDataArray: + if (v5Creds->authdata == NULL) { + ccCreds->authdata = NULL; + } else { + krb5_authdata **authPtr, *auth; + cc_data **dataPtr, *data; + unsigned int numRecords = 0; + + /* Allocate the array of pointers: */ + for (authPtr = v5Creds->authdata; *authPtr != NULL; numRecords++, authPtr++) {} + + ccCreds->authdata = (cc_data **) malloc (sizeof(cc_data *) * (numRecords + 1)); + if (ccCreds->authdata == NULL) + return ENOMEM; + + /* Fill in the array, allocating the address structures: */ + for (dataPtr = ccCreds->authdata, authPtr = v5Creds->authdata; *authPtr != NULL; authPtr++, dataPtr++) { + + *dataPtr = (cc_data *) malloc (sizeof(cc_data)); + if (*dataPtr == NULL) + return ENOMEM; + data = *dataPtr; + auth = *authPtr; + + data->type = auth->ad_type; + data->length = auth->length; + data->data = malloc (sizeof(char) * data->length); + if (data->data == NULL) + return ENOMEM; + memmove(data->data, auth->contents, data->length); /* copy contents */ + } + + /* Write terminator: */ + *dataPtr = NULL; + } + break; + } + + return 0; + +} + +/* + * dupCC3toK5 + * - allocate an empty k5 style ticket and copy info from the cc_creds ticket + */ + +krb5_error_code +dupCC3toK5(krb5_context context, cc_credentials_t src, krb5_creds *dest) +{ + const cc_credentials_union *cu = src->data; + cc_credentials_v5_t *cv5; + krb5_int32 offset_seconds = 0, offset_microseconds = 0; + krb5_error_code err; + + if (cu->version != cc_credentials_v5) + return KRB5_CC_NOT_KTYPE; + + cv5 = cu->credentials.credentials_v5; + + /* + * allocate and copy + * copy all of those damn fields back + */ + err = krb5_parse_name(context, cv5->client, &(dest->client)); + err = krb5_parse_name(context, cv5->server, &(dest->server)); + if (err) + return err; /* parsename fails w/o krb5.ini for example */ + + /* copy keyblock */ + dest->keyblock.enctype = cv5->keyblock.type; + dest->keyblock.length = cv5->keyblock.length; + dest->keyblock.contents = (krb5_octet *)malloc(dest->keyblock.length); + memcpy(dest->keyblock.contents, cv5->keyblock.data, dest->keyblock.length); + + /* copy times */ +#if TARGET_OS_MAC + err = krb5_get_time_offsets(context, &offset_seconds, &offset_microseconds); + if (err) + return err; +#endif + dest->times.authtime = cv5->authtime + offset_seconds; + dest->times.starttime = cv5->starttime + offset_seconds; + dest->times.endtime = cv5->endtime + offset_seconds; + dest->times.renew_till = cv5->renew_till + offset_seconds; + dest->is_skey = cv5->is_skey; + dest->ticket_flags = cv5->ticket_flags; + + /* more branching fields */ + err = copyCC3DataArrayToK5(cv5, dest, kAddressArray); + if (err) + return err; + + /* first ticket */ + dest->ticket.length = cv5->ticket.length; + dest->ticket.data = (char *)malloc(cv5->ticket.length); + memcpy(dest->ticket.data, cv5->ticket.data, cv5->ticket.length); + + /* second ticket */ + dest->second_ticket.length = cv5->second_ticket.length; + (dest->second_ticket).data = ( char *)malloc(cv5->second_ticket.length); + memcpy(dest->second_ticket.data, cv5->second_ticket.data, cv5->second_ticket.length); + + /* zero out magic number */ + dest->magic = 0; + + /* authdata */ + err = copyCC3DataArrayToK5(cv5, dest, kAuthDataArray); + if (err) + return err; + + return 0; +} + +/* + * dupK5toCC3 + * - analagous to above but in the reverse direction + */ +krb5_error_code +dupK5toCC3(krb5_context context, krb5_creds *src, cc_credentials_t *dest) +{ + cc_credentials_v5_t *c; + cc_credentials_union *cu; + cc_credentials_f *f; + int err; + krb5_int32 offset_seconds = 0, offset_microseconds = 0; + cc_credentials_t creds = NULL; + + if (dest == NULL) + return KRB5_CC_NOMEM; + + /* allocate the cc_credentials_t */ + creds = (cc_credentials_t)malloc(sizeof(cc_credentials_d)); + if (!creds) { + err = KRB5_CC_NOMEM; + goto cleanup; + } + + /* allocate the cred_union */ + creds->data = NULL; + creds->functions = NULL; +#ifdef TARGET_OS_MAC + creds->otherFunctions = NULL; +#endif + f = (cc_credentials_f *)malloc(sizeof(cc_credentials_f)); + if (!f) { + err = KRB5_CC_NOMEM; + goto cleanup; + } + creds->functions = f; + + cu = (cc_credentials_union *)malloc(sizeof(cc_credentials_union)); + if (!creds->data) { + err = KRB5_CC_NOMEM; + goto cleanup; + } + creds->data = cu; + + f->release = krb5int_cc_credentials_release; + f->compare = krb5int_cc_credentials_compare; + + cu->version = cc_credentials_v5; + + c = (cc_credentials_v5_t*)malloc(sizeof(cc_credentials_v5_t)); + if (!c) { + err = KRB5_CC_NOMEM; + goto cleanup; + } + cu->credentials.credentials_v5 = c; + + /* convert krb5 principals to flat principals */ + err = krb5_unparse_name(context, src->client, &(c->client)); + if (err) + goto cleanup; + + err = krb5_unparse_name(context, src->server, &(c->server)); + if (err) + goto cleanup; + + /* copy more fields */ + c->keyblock.type = src->keyblock.enctype; + c->keyblock.length = src->keyblock.length; + + if (src->keyblock.contents != NULL) { + c->keyblock.data = (unsigned char *)malloc(src->keyblock.length); + memcpy(c->keyblock.data, src->keyblock.contents, src->keyblock.length); + } else { + c->keyblock.data = NULL; + } + +#if TARGET_OS_MAC + err = krb5_get_time_offsets(context, &offset_seconds, &offset_microseconds); + if (err) + goto cleanup; +#endif + c->authtime = src->times.authtime - offset_seconds; + c->starttime = src->times.starttime - offset_seconds; + c->endtime = src->times.endtime - offset_seconds; + c->renew_till = src->times.renew_till - offset_seconds; + c->is_skey = src->is_skey; + c->ticket_flags = src->ticket_flags; + + err = copyK5DataArrayToCC3(src, c, kAddressArray); + if (err) + goto cleanup; + + c->ticket.length = src->ticket.length; + if (src->ticket.data != NULL) { + c->ticket.data = (unsigned char *)malloc(src->ticket.length); + memcpy(c->ticket.data, src->ticket.data, src->ticket.length); + } else { + c->ticket.data = NULL; + } + + c->second_ticket.length = src->second_ticket.length; + if (src->second_ticket.data != NULL) { + c->second_ticket.data = (unsigned char *)malloc(src->second_ticket.length); + memcpy(c->second_ticket.data, src->second_ticket.data, src->second_ticket.length); + } else { + c->second_ticket.data = NULL; + } + + err = copyK5DataArrayToCC3(src, c, kAuthDataArray); + if (err) + goto cleanup; + + *dest = creds; + return 0; + + cleanup: + if (creds) { + if (creds->functions) + free((void *)creds->functions); + if (creds->data) { + if (creds->data->credentials.credentials_v5) + free(creds->data->credentials.credentials_v5); + free((void *)creds->data); + } + free(creds); + } + + return err; +} +#else /* !USE_CCAPI_V3 */ /* * CopyCCDataArrayToK5 * - copy and translate the null terminated arrays of data records @@ -323,6 +718,86 @@ void dupK5toCC(krb5_context context, krb5_creds *creds, cred_union **cu) return; } +/* ----- free_cc_cred_union, etc -------------- */ +/* + Since the Kerberos5 library allocates a credentials cache structure + (in dupK5toCC() above) with its own memory allocation routines - which + may be different than how the CCache allocates memory - the Kerb5 library + must have its own version of cc_free_creds() to deallocate it. These + functions do that. The top-level function to substitue for cc_free_creds() + is krb5_free_cc_cred_union(). + + If the CCache library wants to use a cred_union structure created by + the Kerb5 library, it should make a deep copy of it to "translate" to its + own memory allocation space. +*/ +static void deep_free_cc_data (cc_data data) +{ + if (data.data != NULL) + free (data.data); +} + +static void deep_free_cc_data_array (cc_data** data) { + + unsigned int index; + + if (data == NULL) + return; + + for (index = 0; data [index] != NULL; index++) { + deep_free_cc_data (*(data [index])); + free (data [index]); + } + + free (data); +} + +static void deep_free_cc_v5_creds (cc_creds* creds) +{ + if (creds == NULL) + return; + + if (creds -> client != NULL) + free (creds -> client); + if (creds -> server != NULL) + free (creds -> server); + + deep_free_cc_data (creds -> keyblock); + deep_free_cc_data (creds -> ticket); + deep_free_cc_data (creds -> second_ticket); + + deep_free_cc_data_array (creds -> addresses); + deep_free_cc_data_array (creds -> authdata); + + free(creds); +} + +static void deep_free_cc_creds (cred_union creds) +{ + if (creds.cred_type == CC_CRED_V4) { + /* we shouldn't get this, of course */ + free (creds.cred.pV4Cred); + } else if (creds.cred_type == CC_CRED_V5) { + deep_free_cc_v5_creds (creds.cred.pV5Cred); + } +} + +/* top-level exported function */ +cc_int32 krb5int_free_cc_cred_union (cred_union** creds) +{ + if (creds == NULL) + return CC_BAD_PARM; + + if (*creds != NULL) { + deep_free_cc_creds (**creds); + free (*creds); + *creds = NULL; + } + + return CC_NOERROR; +} +#endif + /* * Utility functions... */ @@ -475,81 +950,4 @@ int stdccCredsMatch(krb5_context context, krb5_creds *base, return FALSE; } -/* ----- free_cc_cred_union, etc -------------- */ -/* - Since the Kerberos5 library allocates a credentials cache structure - (in dupK5toCC() above) with its own memory allocation routines - which - may be different than how the CCache allocates memory - the Kerb5 library - must have its own version of cc_free_creds() to deallocate it. These - functions do that. The top-level function to substitue for cc_free_creds() - is krb5_free_cc_cred_union(). - - If the CCache library wants to use a cred_union structure created by - the Kerb5 library, it should make a deep copy of it to "translate" to its - own memory allocation space. -*/ -static void deep_free_cc_data (cc_data data) -{ - if (data.data != NULL) - free (data.data); -} - -static void deep_free_cc_data_array (cc_data** data) { - - unsigned int index; - - if (data == NULL) - return; - for (index = 0; data [index] != NULL; index++) { - deep_free_cc_data (*(data [index])); - free (data [index]); - } - - free (data); -} - -static void deep_free_cc_v5_creds (cc_creds* creds) -{ - if (creds == NULL) - return; - - if (creds -> client != NULL) - free (creds -> client); - if (creds -> server != NULL) - free (creds -> server); - - deep_free_cc_data (creds -> keyblock); - deep_free_cc_data (creds -> ticket); - deep_free_cc_data (creds -> second_ticket); - - deep_free_cc_data_array (creds -> addresses); - deep_free_cc_data_array (creds -> authdata); - - free(creds); -} - -static void deep_free_cc_creds (cred_union creds) -{ - if (creds.cred_type == CC_CRED_V4) { - /* we shouldn't get this, of course */ - free (creds.cred.pV4Cred); - } else if (creds.cred_type == CC_CRED_V5) { - deep_free_cc_v5_creds (creds.cred.pV5Cred); - } -} - -/* top-level exported function */ -cc_int32 krb5_free_cc_cred_union (cred_union** creds) -{ - if (creds == NULL) - return CC_BAD_PARM; - - if (*creds != NULL) { - deep_free_cc_creds (**creds); - free (*creds); - *creds = NULL; - } - - return CC_NOERROR; -} diff --git a/src/lib/krb5/ccache/ccapi/stdcc_util.h b/src/lib/krb5/ccache/ccapi/stdcc_util.h index 92bafc8fa6..7476313dfa 100644 --- a/src/lib/krb5/ccache/ccapi/stdcc_util.h +++ b/src/lib/krb5/ccache/ccapi/stdcc_util.h @@ -5,6 +5,9 @@ #include "autoconf.h" +#if USE_CCAPI_V3 +#include <CredentialsCache.h> +#else #if USE_CCAPI #include <CredentialsCache2.h> #endif @@ -12,17 +15,29 @@ #if defined(_WIN32) #include "cacheapi.h" #endif +#endif #include "krb5.h" /* protoypes for private functions declared in stdcc_util.c */ +#ifdef USE_CCAPI_V3 +krb5_error_code dupCC3toK5(krb5_context context, cc_credentials_t src, krb5_creds *dest); +krb5_error_code dupK5toCC3(krb5_context context, krb5_creds *src, cc_credentials_t *dest); +cc_int32 krb5int_cc_credentials_release(cc_credentials_t creds); +cc_int32 krb5int_cc_credentials_compare(cc_credentials_t creds, + cc_credentials_t compare_to, + cc_uint32* equal); +int copyCC3DataArrayToK5(cc_credentials_v5_t *ccCreds, krb5_creds *v5Creds, char whichArray); +int copyK5DataArrayToCC3(krb5_creds *v5Creds, cc_credentials_v5_t * ccCreds, char whichArray); +#else int copyCCDataArrayToK5(cc_creds *cc, krb5_creds *kc, char whichArray); int copyK5DataArrayToCC(krb5_creds *kc, cc_creds *cc, char whichArray); void dupCCtoK5(krb5_context context, cc_creds *src, krb5_creds *dest); void dupK5toCC(krb5_context context, krb5_creds *creds, cred_union **cu); +cc_int32 krb5int_free_cc_cred_union (cred_union** creds); +#endif int stdccCredsMatch(krb5_context context, krb5_creds *base, krb5_creds *match, int whichfields); int bitTst(int var, int mask); -cc_int32 krb5_free_cc_cred_union (cred_union** creds); #define kAddressArray 4 #define kAuthDataArray 5 diff --git a/src/lib/krb5/ccache/ccapi/winccld.h b/src/lib/krb5/ccache/ccapi/winccld.h index e285d1faf6..245ae245e2 100644 --- a/src/lib/krb5/ccache/ccapi/winccld.h +++ b/src/lib/krb5/ccache/ccapi/winccld.h @@ -6,12 +6,24 @@ #ifndef KRB5_WINCCLD_H_ #define KRB5_WINCCLD_H_ +#ifdef USE_CCAPI_V3 +#include <CredentialsCache.h> +#else + #ifndef CC_API_VER2 #define CC_API_VER2 #endif #include "cacheapi.h" +#endif +#ifdef USE_CCAPI_V3 +typedef CCACHE_API cc_int32 (*FP_cc_initialize) ( + cc_context_t* outContext, + cc_int32 inVersion, + cc_int32* outSupportedVersion, + char const** outVendor); +#else typedef cc_int32 (*FP_cc_initialize)(apiCB**, const cc_int32, cc_int32*, const char**); typedef cc_int32 (*FP_cc_shutdown)(apiCB**); @@ -49,6 +61,7 @@ typedef cc_int32 (*FP_cc_seq_fetch_creds_end)(apiCB*, ccache_cit**); typedef cc_int32 (*FP_cc_free_principal)(apiCB*, char**); typedef cc_int32 (*FP_cc_free_name)(apiCB*, char** name); typedef cc_int32 (*FP_cc_free_creds)(apiCB*, cred_union** pCred); +#endif #ifdef KRB5_WINCCLD_C_ typedef struct _FUNC_INFO { @@ -64,6 +77,7 @@ typedef struct _FUNC_INFO { #endif DECL_FUNC_PTR(cc_initialize); +#ifndef USE_CCAPI_V3 DECL_FUNC_PTR(cc_shutdown); DECL_FUNC_PTR(cc_get_change_time); DECL_FUNC_PTR(cc_create); @@ -100,10 +114,12 @@ DECL_FUNC_PTR(cc_seq_fetch_creds); DECL_FUNC_PTR(cc_free_principal); DECL_FUNC_PTR(cc_free_name); DECL_FUNC_PTR(cc_free_creds); +#endif #ifdef KRB5_WINCCLD_C_ FUNC_INFO krbcc_fi[] = { MAKE_FUNC_INFO(cc_initialize), +#ifndef USE_CCAPI_V3 MAKE_FUNC_INFO(cc_shutdown), MAKE_FUNC_INFO(cc_get_change_time), MAKE_FUNC_INFO(cc_create), @@ -134,6 +150,7 @@ FUNC_INFO krbcc_fi[] = { MAKE_FUNC_INFO(cc_free_principal), MAKE_FUNC_INFO(cc_free_name), MAKE_FUNC_INFO(cc_free_creds), +#endif END_FUNC_INFO }; #undef MAKE_FUNC_INFO @@ -141,6 +158,7 @@ FUNC_INFO krbcc_fi[] = { #else #define cc_initialize pcc_initialize +#ifndef USE_CCAPI_V3 #define cc_shutdown pcc_shutdown #define cc_get_change_time pcc_get_change_time #define cc_create pcc_create @@ -178,6 +196,7 @@ FUNC_INFO krbcc_fi[] = { #define cc_free_name pcc_free_name #define cc_free_creds pcc_free_creds #endif +#endif #undef DECL_FUNC_PTR |
