diff options
Diffstat (limited to 'src/lib/ccapi/client/ccache.c')
-rw-r--r-- | src/lib/ccapi/client/ccache.c | 1316 |
1 files changed, 0 insertions, 1316 deletions
diff --git a/src/lib/ccapi/client/ccache.c b/src/lib/ccapi/client/ccache.c deleted file mode 100644 index c442a8827..000000000 --- a/src/lib/ccapi/client/ccache.c +++ /dev/null @@ -1,1316 +0,0 @@ -/* $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). - * $ - */ - - -/* ccache.c */ - -#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 ) -{ - cc_int_ccache_t ccache = (cc_int_ccache_t)malloc(sizeof(cc_int_ccache_d)); - if ( ccache == NULL ) - return ccErrNoMem; - - ccache->functions = (cc_ccache_f*)malloc(sizeof(cc_ccache_f)); - if ( ccache->functions == NULL ) { - free(ccache); - return ccErrNoMem; - } - - ccache->functions->release = cc_int_ccache_release; - ccache->functions->destroy = cc_int_ccache_destroy; - ccache->functions->set_default = cc_int_ccache_set_default; - ccache->functions->get_credentials_version = cc_int_ccache_get_credentials_version; - ccache->functions->get_name = cc_int_ccache_get_name; - ccache->functions->get_principal = cc_int_ccache_get_principal; - ccache->functions->set_principal = cc_int_ccache_set_principal; - ccache->functions->store_credentials = cc_int_ccache_store_credentials; - ccache->functions->remove_credentials = cc_int_ccache_remove_credentials; - ccache->functions->new_credentials_iterator = cc_int_ccache_new_credentials_iterator; - ccache->functions->move = cc_int_ccache_move; - ccache->functions->lock = cc_int_ccache_lock; - ccache->functions->unlock = cc_int_ccache_unlock; - ccache->functions->get_last_default_time = cc_int_ccache_get_last_default_time; - ccache->functions->get_change_time = cc_int_ccache_get_change_time; - ccache->functions->compare = cc_int_ccache_compare; - ccache->functions->get_kdc_time_offset = cc_int_ccache_get_kdc_time_offset; - ccache->functions->set_kdc_time_offset = cc_int_ccache_set_kdc_time_offset; - ccache->functions->clear_kdc_time_offset = cc_int_ccache_clear_kdc_time_offset; - - ccache->magic = CC_CCACHE_MAGIC; - ccache->ctx = hctx; - ccache->handle = hccache; - - *pccache = (cc_ccache_t)ccache; - - return ccNoError; -} - -cc_int32 -cc_int_ccache_release( cc_ccache_t ccache ) -{ - 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; - - int_ccache = (cc_int_ccache_t)ccache; - - if ( int_ccache->magic != CC_CCACHE_MAGIC ) - return ccErrInvalidCCache; - - request_header = (ccmsg_ccache_release_t*)malloc(sizeof(ccmsg_ccache_release_t)); - if (request_header == NULL) - return ccErrNoMem; - 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) - 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; - - 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) { - code = ccNoError; - } else { - code = ccErrBadInternalMessage; - } - - 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; -} - - -cc_int32 -cc_int_ccache_destroy( cc_ccache_t ccache ) -{ - 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; - - int_ccache = (cc_int_ccache_t)ccache; - - if ( int_ccache->magic != CC_CCACHE_MAGIC ) - return ccErrInvalidCCache; - - request_header = (ccmsg_ccache_destroy_t*)malloc(sizeof(ccmsg_ccache_destroy_t)); - if (request_header == NULL) - return ccErrNoMem; - 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) - 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; - - 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) { - code = ccNoError; - } else { - code = ccErrBadInternalMessage; - } - - cleanup: - if (request_header) - free(request_header); - if (request) - cci_msg_destroy(request); - if (response) - cci_msg_destroy(response); - free(ccache); - return code; -} - - -cc_int32 -cc_int_ccache_set_default( cc_ccache_t ccache ) -{ - 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; - - int_ccache = (cc_int_ccache_t)ccache; - - if ( int_ccache->magic != CC_CCACHE_MAGIC ) - return ccErrInvalidCCache; - - request_header = (ccmsg_ccache_set_default_t*)malloc(sizeof(ccmsg_ccache_set_default_t)); - if (request_header == NULL) - return ccErrNoMem; - 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) - 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; - - 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) { - code = ccNoError; - } else { - code = ccErrBadInternalMessage; - } - - 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_credentials_version( cc_ccache_t ccache, - cc_uint32* credentials_version) -{ - 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; - - int_ccache = (cc_int_ccache_t)ccache; - - if ( int_ccache->magic != CC_CCACHE_MAGIC ) - return ccErrInvalidCCache; - - 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 = htonll(int_ccache->ctx); - request_header->ccache = htonll(int_ccache->handle); - - code = cci_msg_new(ccmsg_CCACHE_GET_CREDS_VERSION, &request); - 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; - - 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_get_creds_version_resp_t * response_header = (ccmsg_ccache_get_creds_version_resp_t*)response->header; - *credentials_version = ntohl(response_header->version); - code = ccNoError; - } else { - code = ccErrBadInternalMessage; - } - - 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_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; - - int_ccache = (cc_int_ccache_t)ccache; - - if ( int_ccache->magic != CC_CCACHE_MAGIC ) - return ccErrInvalidCCache; - - request_header = (ccmsg_ccache_get_name_t*)malloc(sizeof(ccmsg_ccache_get_name_t)); - if (request_header == NULL) - return ccErrNoMem; - 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) - 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; - - 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) { - 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 = cci_string_new(name, string); - free(string); - } - } else { - code = ccErrBadInternalMessage; - } - - 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_principal( cc_ccache_t ccache, - cc_uint32 credentials_version, - cc_string_t* principal ) -{ - 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; - - int_ccache = (cc_int_ccache_t)ccache; - - if ( int_ccache->magic != CC_CCACHE_MAGIC ) - return ccErrInvalidCCache; - - request_header = (ccmsg_ccache_get_principal_t*)malloc(sizeof(ccmsg_ccache_get_principal_t)); - if (request_header == NULL) - return ccErrNoMem; - 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) - 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; - - 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) { - 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 = cci_string_new(principal, string); - free(string); - } - } else { - code = ccErrBadInternalMessage; - } - - 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_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 = 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; - - int_ccache = (cc_int_ccache_t)ccache; - - if ( int_ccache->magic != CC_CCACHE_MAGIC ) - return ccErrInvalidCCache; - - request_header = (ccmsg_ccache_set_principal_t*)malloc(sizeof(ccmsg_ccache_set_principal_t)); - if (request_header == NULL) - return ccErrNoMem; - 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) - goto cleanup; - - code = cci_msg_add_data_blob(request, (void*)principal, strlen(principal) + 1, &blob_pos); - 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_set_principal_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) { - code = ccNoError; - } else { - code = ccErrBadInternalMessage; - } - - 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_new_credentials_iterator( cc_ccache_t ccache, - cc_credentials_iterator_t* iterator ) -{ - 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; - - int_ccache = (cc_int_ccache_t)ccache; - - if ( int_ccache->magic != CC_CCACHE_MAGIC ) - return ccErrInvalidCCache; - - request_header = (ccmsg_ccache_creds_iterator_t*)malloc(sizeof(ccmsg_ccache_creds_iterator_t)); - if (request_header == NULL) - return ccErrNoMem; - request_header->ctx = htonll(int_ccache->ctx); - request_header->ccache = htonll(int_ccache->handle); - - 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; - - 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_creds_iterator_resp_t * response_header = (ccmsg_ccache_creds_iterator_resp_t*)response->header; - code = cc_int_credentials_iterator_new(iterator, int_ccache->ctx, int_ccache->handle, - 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; -} - -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 = 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; - - int_ccache = (cc_int_ccache_t)ccache; - - if ( int_ccache->magic != CC_CCACHE_MAGIC ) - return ccErrInvalidCCache; - - request_header = (ccmsg_ccache_store_creds_t*)malloc(sizeof(ccmsg_ccache_store_creds_t)); - if (request_header == NULL) - return ccErrNoMem; - 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) - goto cleanup; - - switch ( credentials->version ) { - case cc_credentials_v4: - code = cci_creds_v4_marshall(credentials->credentials.credentials_v4, &flat_cred, &flat_cred_len); - break; - case cc_credentials_v5: - code = cci_creds_v5_marshall(credentials->credentials.credentials_v5, &flat_cred, &flat_cred_len); - break; - default: - 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) - goto cleanup; - - 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; - - 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) { - code = ccNoError; - } else { - code = ccErrBadInternalMessage; - } - - 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; -} - -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 = 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; - - int_ccache = (cc_int_ccache_t)ccache; - int_creds = (cc_int_credentials_t)credentials; - - if ( int_ccache->magic != CC_CCACHE_MAGIC ) - return ccErrInvalidCCache; - - if ( int_creds->magic != CC_CREDS_MAGIC ) - return ccErrInvalidCredentials; - - request_header = (ccmsg_ccache_rem_creds_t*)malloc(sizeof(ccmsg_ccache_rem_creds_t)); - if (request_header == NULL) - return ccErrNoMem; - - 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) - 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; - - 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) { - code = ccNoError; - } else { - code = ccErrBadInternalMessage; - } - - 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_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 = 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; - - int_ccache_source = (cc_int_ccache_t)source; - int_ccache_dest = (cc_int_ccache_t)destination; - - if ( int_ccache_source->magic != CC_CCACHE_MAGIC || - int_ccache_dest->magic != CC_CCACHE_MAGIC ) - return ccErrInvalidCCache; - - if ( int_ccache_source->ctx != int_ccache_dest->ctx ) - return ccErrInvalidContext; - - request_header = (ccmsg_ccache_move_t*)malloc(sizeof(ccmsg_ccache_move_t)); - if (request_header == NULL) - return ccErrNoMem; - - code = cci_msg_new(ccmsg_CCACHE_MOVE, &request); - if (code != ccNoError) - goto cleanup; - - 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; - - 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) { - code = ccNoError; - } else { - code = ccErrBadInternalMessage; - } - - 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_lock( cc_ccache_t ccache, - cc_uint32 lock_type, - cc_uint32 block ) -{ - 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_upgrade && lock_type != cc_lock_downgrade) || - (block != cc_lock_block && block != cc_lock_noblock) ) - return ccErrBadParam; - - int_ccache = (cc_int_ccache_t)ccache; - - if ( int_ccache->magic != CC_CCACHE_MAGIC ) - return ccErrInvalidCCache; - - request_header = (ccmsg_ccache_lock_t*)malloc(sizeof(ccmsg_ccache_lock_t)); - if (request_header == NULL) - return ccErrNoMem; - - code = cci_msg_new(ccmsg_CCACHE_LOCK, &request); - if (code != ccNoError) - goto cleanup; - - 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; - - type = ntohl(response->type); - if (type == ccmsg_NACK) { - ccmsg_nack_t * nack_header = (ccmsg_nack_t *)response->header; - code = ntohl(nack_header->err_code); - - // TODO: if (block == cc_lock_block) ..... - } else if (response->type == ccmsg_ACK) { - code = ccNoError; - } else { - code = ccErrBadInternalMessage; - } - - 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 = NULL; - ccmsg_ccache_unlock_t *request_header = NULL; - cc_msg_t *response = NULL; - cc_uint32 type; - cc_int32 code; - - if ( ccache == NULL ) - return ccErrBadParam; - - int_ccache = (cc_int_ccache_t)ccache; - - if ( int_ccache->magic != CC_CCACHE_MAGIC ) - return ccErrInvalidCCache; - - request_header = (ccmsg_ccache_unlock_t*)malloc(sizeof(ccmsg_ccache_unlock_t)); - if (request_header == NULL) - return ccErrNoMem; - - code = cci_msg_new(ccmsg_CCACHE_UNLOCK, &request); - if (code != ccNoError) - goto cleanup; - - 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; - - type = htonl(response->type); - if (type == ccmsg_NACK) { - ccmsg_nack_t * nack_header = (ccmsg_nack_t *)response->header; - code = htonl(nack_header->err_code); - } else if (type == ccmsg_ACK) { - code = ccNoError; - } else { - code = ccErrBadInternalMessage; - } - - 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* time_offset ) -{ - 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; - - int_ccache = (cc_int_ccache_t)ccache; - - if ( int_ccache->magic != CC_CCACHE_MAGIC ) - return ccErrInvalidCCache; - - 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 = 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) - 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; - - 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_get_last_default_time_resp_t * response_header = (ccmsg_ccache_get_last_default_time_resp_t*)response->header; - 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; - } - - 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* change_time ) -{ - 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; - - int_ccache = (cc_int_ccache_t)ccache; - - if ( int_ccache->magic != CC_CCACHE_MAGIC ) - return ccErrInvalidCCache; - - 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 = htonll(int_ccache->ctx); - request_header->ccache = htonll(int_ccache->handle); - - code = cci_msg_new(ccmsg_CCACHE_GET_CHANGE_TIME, &request); - 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; - - 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_get_change_time_resp_t * response_header = (ccmsg_ccache_get_change_time_resp_t*)response->header; - t64 = htonll(response_header->time); - /* TODO: validate that we do not overflow 'time' */ - *change_time = t64; - code = ccNoError; - } else { - code = ccErrBadInternalMessage; - } - - 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_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 = NULL; - ccmsg_ccache_compare_t *request_header = NULL; - cc_msg_t *response = NULL; - cc_uint32 type; - cc_int32 code; - - if ( ccache == NULL ) - return ccErrBadParam; - - int_ccache = (cc_int_ccache_t)ccache; - int_compare_to = (cc_int_ccache_t)ccache; - - if ( int_ccache->magic != CC_CCACHE_MAGIC || - int_compare_to->magic != CC_CCACHE_MAGIC ) - return ccErrInvalidCCache; - - request_header = (ccmsg_ccache_compare_t*)malloc(sizeof(ccmsg_ccache_compare_t)); - if (request_header == NULL) - return ccErrNoMem; - 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) - 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; - - 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_compare_resp_t * response_header = (ccmsg_ccache_compare_resp_t*)response->header; - *equal = ntohl(response_header->is_equal); - code = ccNoError; - } else { - code = ccErrBadInternalMessage; - } - - 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* time_offset ) -{ - 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; - - int_ccache = (cc_int_ccache_t)ccache; - - if ( int_ccache->magic != CC_CCACHE_MAGIC ) - return ccErrInvalidCCache; - - 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 = 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) - 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; - - 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 (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 = (cc_time64)ntohll(response_header->offset); - code = ccNoError; - } else { - code = ccErrBadInternalMessage; - } - - 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 time_offset ) -{ - 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; - - int_ccache = (cc_int_ccache_t)ccache; - - if ( int_ccache->magic != CC_CCACHE_MAGIC ) - return ccErrInvalidCCache; - - 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 = 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) - 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; - - 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) { - code = ccNoError; - } else { - code = ccErrBadInternalMessage; - } - - 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_clear_kdc_time_offset( cc_ccache_t ccache, - cc_int32 credentials_version ) -{ - 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; - - int_ccache = (cc_int_ccache_t)ccache; - - if ( int_ccache->magic != CC_CCACHE_MAGIC ) - return ccErrInvalidCCache; - - 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 = 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) - 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; - - 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) { - code = ccNoError; - } else { - code = ccErrBadInternalMessage; - } - - cleanup: - if (request_header) - free(request_header); - if (request) - cci_msg_destroy(request); - if (response) - cci_msg_destroy(response); - return code; -} |