505d05c73a6e56769f263d4803b22eddd168ee24gtb/*
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
505d05c73a6e56769f263d4803b22eddd168ee24gtb * Use is subject to license terms.
505d05c73a6e56769f263d4803b22eddd168ee24gtb */
505d05c73a6e56769f263d4803b22eddd168ee24gtb
505d05c73a6e56769f263d4803b22eddd168ee24gtb
505d05c73a6e56769f263d4803b22eddd168ee24gtb/*
505d05c73a6e56769f263d4803b22eddd168ee24gtb * lib/krb5/ccache/cc_memory.c
505d05c73a6e56769f263d4803b22eddd168ee24gtb *
505d05c73a6e56769f263d4803b22eddd168ee24gtb * Copyright 1990,1991,2000,2004 by the Massachusetts Institute of Technology.
505d05c73a6e56769f263d4803b22eddd168ee24gtb * All Rights Reserved.
505d05c73a6e56769f263d4803b22eddd168ee24gtb *
505d05c73a6e56769f263d4803b22eddd168ee24gtb * Export of this software from the United States of America may
505d05c73a6e56769f263d4803b22eddd168ee24gtb * require a specific license from the United States Government.
505d05c73a6e56769f263d4803b22eddd168ee24gtb * It is the responsibility of any person or organization contemplating
505d05c73a6e56769f263d4803b22eddd168ee24gtb * export to obtain such a license before exporting.
505d05c73a6e56769f263d4803b22eddd168ee24gtb *
505d05c73a6e56769f263d4803b22eddd168ee24gtb * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
505d05c73a6e56769f263d4803b22eddd168ee24gtb * distribute this software and its documentation for any purpose and
505d05c73a6e56769f263d4803b22eddd168ee24gtb * without fee is hereby granted, provided that the above copyright
505d05c73a6e56769f263d4803b22eddd168ee24gtb * notice appear in all copies and that both that copyright notice and
505d05c73a6e56769f263d4803b22eddd168ee24gtb * this permission notice appear in supporting documentation, and that
505d05c73a6e56769f263d4803b22eddd168ee24gtb * the name of M.I.T. not be used in advertising or publicity pertaining
505d05c73a6e56769f263d4803b22eddd168ee24gtb * to distribution of the software without specific, written prior
505d05c73a6e56769f263d4803b22eddd168ee24gtb * permission. Furthermore if you modify this software you must label
505d05c73a6e56769f263d4803b22eddd168ee24gtb * your software as modified software and not distribute it in such a
505d05c73a6e56769f263d4803b22eddd168ee24gtb * fashion that it might be confused with the original M.I.T. software.
505d05c73a6e56769f263d4803b22eddd168ee24gtb * M.I.T. makes no representations about the suitability of
505d05c73a6e56769f263d4803b22eddd168ee24gtb * this software for any purpose. It is provided "as is" without express
505d05c73a6e56769f263d4803b22eddd168ee24gtb * or implied warranty.
505d05c73a6e56769f263d4803b22eddd168ee24gtb *
505d05c73a6e56769f263d4803b22eddd168ee24gtb *
505d05c73a6e56769f263d4803b22eddd168ee24gtb * implementation of memory-based credentials cache
505d05c73a6e56769f263d4803b22eddd168ee24gtb */
505d05c73a6e56769f263d4803b22eddd168ee24gtb#include "k5-int.h"
505d05c73a6e56769f263d4803b22eddd168ee24gtb#include <errno.h>
505d05c73a6e56769f263d4803b22eddd168ee24gtb
505d05c73a6e56769f263d4803b22eddd168ee24gtbstatic krb5_error_code KRB5_CALLCONV krb5_mcc_close
505d05c73a6e56769f263d4803b22eddd168ee24gtb (krb5_context, krb5_ccache id );
505d05c73a6e56769f263d4803b22eddd168ee24gtb
505d05c73a6e56769f263d4803b22eddd168ee24gtbstatic krb5_error_code KRB5_CALLCONV krb5_mcc_destroy
505d05c73a6e56769f263d4803b22eddd168ee24gtb (krb5_context, krb5_ccache id );
505d05c73a6e56769f263d4803b22eddd168ee24gtb
505d05c73a6e56769f263d4803b22eddd168ee24gtbstatic krb5_error_code KRB5_CALLCONV krb5_mcc_end_seq_get
505d05c73a6e56769f263d4803b22eddd168ee24gtb (krb5_context, krb5_ccache id , krb5_cc_cursor *cursor );
505d05c73a6e56769f263d4803b22eddd168ee24gtb
505d05c73a6e56769f263d4803b22eddd168ee24gtbstatic krb5_error_code KRB5_CALLCONV krb5_mcc_generate_new
505d05c73a6e56769f263d4803b22eddd168ee24gtb (krb5_context, krb5_ccache *id );
505d05c73a6e56769f263d4803b22eddd168ee24gtb
505d05c73a6e56769f263d4803b22eddd168ee24gtbstatic const char * KRB5_CALLCONV krb5_mcc_get_name
505d05c73a6e56769f263d4803b22eddd168ee24gtb (krb5_context, krb5_ccache id );
505d05c73a6e56769f263d4803b22eddd168ee24gtb
505d05c73a6e56769f263d4803b22eddd168ee24gtbstatic krb5_error_code KRB5_CALLCONV krb5_mcc_get_principal
505d05c73a6e56769f263d4803b22eddd168ee24gtb (krb5_context, krb5_ccache id , krb5_principal *princ );
505d05c73a6e56769f263d4803b22eddd168ee24gtb
505d05c73a6e56769f263d4803b22eddd168ee24gtbstatic krb5_error_code KRB5_CALLCONV krb5_mcc_initialize
505d05c73a6e56769f263d4803b22eddd168ee24gtb (krb5_context, krb5_ccache id , krb5_principal princ );
505d05c73a6e56769f263d4803b22eddd168ee24gtb
505d05c73a6e56769f263d4803b22eddd168ee24gtbstatic krb5_error_code KRB5_CALLCONV krb5_mcc_next_cred
505d05c73a6e56769f263d4803b22eddd168ee24gtb (krb5_context,
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_ccache id ,
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_cc_cursor *cursor ,
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_creds *creds );
505d05c73a6e56769f263d4803b22eddd168ee24gtb
505d05c73a6e56769f263d4803b22eddd168ee24gtbstatic krb5_error_code KRB5_CALLCONV krb5_mcc_resolve
505d05c73a6e56769f263d4803b22eddd168ee24gtb (krb5_context, krb5_ccache *id , const char *residual );
505d05c73a6e56769f263d4803b22eddd168ee24gtb
505d05c73a6e56769f263d4803b22eddd168ee24gtbstatic krb5_error_code KRB5_CALLCONV krb5_mcc_retrieve
505d05c73a6e56769f263d4803b22eddd168ee24gtb (krb5_context,
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_ccache id ,
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_flags whichfields ,
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_creds *mcreds ,
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_creds *creds );
505d05c73a6e56769f263d4803b22eddd168ee24gtb
505d05c73a6e56769f263d4803b22eddd168ee24gtbstatic krb5_error_code KRB5_CALLCONV krb5_mcc_start_seq_get
505d05c73a6e56769f263d4803b22eddd168ee24gtb (krb5_context, krb5_ccache id , krb5_cc_cursor *cursor );
505d05c73a6e56769f263d4803b22eddd168ee24gtb
505d05c73a6e56769f263d4803b22eddd168ee24gtbstatic krb5_error_code KRB5_CALLCONV krb5_mcc_store
505d05c73a6e56769f263d4803b22eddd168ee24gtb (krb5_context, krb5_ccache id , krb5_creds *creds );
505d05c73a6e56769f263d4803b22eddd168ee24gtb
505d05c73a6e56769f263d4803b22eddd168ee24gtbstatic krb5_error_code KRB5_CALLCONV krb5_mcc_set_flags
505d05c73a6e56769f263d4803b22eddd168ee24gtb (krb5_context, krb5_ccache id , krb5_flags flags );
505d05c73a6e56769f263d4803b22eddd168ee24gtb
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalanstatic krb5_error_code KRB5_CALLCONV krb5_mcc_ptcursor_new(
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan krb5_context,
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan krb5_cc_ptcursor *);
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalanstatic krb5_error_code KRB5_CALLCONV krb5_mcc_ptcursor_next(
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan krb5_context,
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan krb5_cc_ptcursor,
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan krb5_ccache *);
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalanstatic krb5_error_code KRB5_CALLCONV krb5_mcc_ptcursor_free(
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan krb5_context,
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan krb5_cc_ptcursor *);
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
505d05c73a6e56769f263d4803b22eddd168ee24gtbextern const krb5_cc_ops krb5_mcc_ops;
505d05c73a6e56769f263d4803b22eddd168ee24gtbextern krb5_error_code krb5_change_cache (void);
505d05c73a6e56769f263d4803b22eddd168ee24gtb
505d05c73a6e56769f263d4803b22eddd168ee24gtb#define KRB5_OK 0
505d05c73a6e56769f263d4803b22eddd168ee24gtb
505d05c73a6e56769f263d4803b22eddd168ee24gtbtypedef struct _krb5_mcc_link {
505d05c73a6e56769f263d4803b22eddd168ee24gtb struct _krb5_mcc_link *next;
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_creds *creds;
505d05c73a6e56769f263d4803b22eddd168ee24gtb} krb5_mcc_link, *krb5_mcc_cursor;
505d05c73a6e56769f263d4803b22eddd168ee24gtb
505d05c73a6e56769f263d4803b22eddd168ee24gtbtypedef struct _krb5_mcc_data {
505d05c73a6e56769f263d4803b22eddd168ee24gtb char *name;
505d05c73a6e56769f263d4803b22eddd168ee24gtb k5_mutex_t lock;
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_principal prin;
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_mcc_cursor link;
505d05c73a6e56769f263d4803b22eddd168ee24gtb} krb5_mcc_data;
505d05c73a6e56769f263d4803b22eddd168ee24gtb
505d05c73a6e56769f263d4803b22eddd168ee24gtbtypedef struct krb5_mcc_list_node {
505d05c73a6e56769f263d4803b22eddd168ee24gtb struct krb5_mcc_list_node *next;
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_mcc_data *cache;
505d05c73a6e56769f263d4803b22eddd168ee24gtb} krb5_mcc_list_node;
505d05c73a6e56769f263d4803b22eddd168ee24gtb
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalanstruct krb5_mcc_ptcursor_data {
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan struct krb5_mcc_list_node *cur;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan};
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
505d05c73a6e56769f263d4803b22eddd168ee24gtbk5_mutex_t krb5int_mcc_mutex = K5_MUTEX_PARTIAL_INITIALIZER;
505d05c73a6e56769f263d4803b22eddd168ee24gtbstatic krb5_mcc_list_node *mcc_head = 0;
505d05c73a6e56769f263d4803b22eddd168ee24gtb
505d05c73a6e56769f263d4803b22eddd168ee24gtb/*
505d05c73a6e56769f263d4803b22eddd168ee24gtb * Modifies:
505d05c73a6e56769f263d4803b22eddd168ee24gtb * id
505d05c73a6e56769f263d4803b22eddd168ee24gtb *
505d05c73a6e56769f263d4803b22eddd168ee24gtb * Effects:
505d05c73a6e56769f263d4803b22eddd168ee24gtb * Creates/refreshes the file cred cache id. If the cache exists, its
505d05c73a6e56769f263d4803b22eddd168ee24gtb * contents are destroyed.
505d05c73a6e56769f263d4803b22eddd168ee24gtb *
505d05c73a6e56769f263d4803b22eddd168ee24gtb * Errors:
505d05c73a6e56769f263d4803b22eddd168ee24gtb * system errors
505d05c73a6e56769f263d4803b22eddd168ee24gtb * permission errors
505d05c73a6e56769f263d4803b22eddd168ee24gtb */
505d05c73a6e56769f263d4803b22eddd168ee24gtbstatic void krb5_mcc_free (krb5_context context, krb5_ccache id);
505d05c73a6e56769f263d4803b22eddd168ee24gtb
505d05c73a6e56769f263d4803b22eddd168ee24gtbkrb5_error_code KRB5_CALLCONV
505d05c73a6e56769f263d4803b22eddd168ee24gtbkrb5_mcc_initialize(krb5_context context, krb5_ccache id, krb5_principal princ)
505d05c73a6e56769f263d4803b22eddd168ee24gtb{
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_error_code ret;
505d05c73a6e56769f263d4803b22eddd168ee24gtb
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_mcc_free(context, id);
505d05c73a6e56769f263d4803b22eddd168ee24gtb ret = krb5_copy_principal(context, princ,
505d05c73a6e56769f263d4803b22eddd168ee24gtb &((krb5_mcc_data *)id->data)->prin);
505d05c73a6e56769f263d4803b22eddd168ee24gtb if (ret == KRB5_OK)
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_change_cache();
505d05c73a6e56769f263d4803b22eddd168ee24gtb return ret;
505d05c73a6e56769f263d4803b22eddd168ee24gtb}
505d05c73a6e56769f263d4803b22eddd168ee24gtb
505d05c73a6e56769f263d4803b22eddd168ee24gtb/*
505d05c73a6e56769f263d4803b22eddd168ee24gtb * Modifies:
505d05c73a6e56769f263d4803b22eddd168ee24gtb * id
505d05c73a6e56769f263d4803b22eddd168ee24gtb *
505d05c73a6e56769f263d4803b22eddd168ee24gtb * Effects:
505d05c73a6e56769f263d4803b22eddd168ee24gtb * Closes the file cache, invalidates the id, and frees any resources
505d05c73a6e56769f263d4803b22eddd168ee24gtb * associated with the cache.
505d05c73a6e56769f263d4803b22eddd168ee24gtb */
505d05c73a6e56769f263d4803b22eddd168ee24gtbkrb5_error_code KRB5_CALLCONV
505d05c73a6e56769f263d4803b22eddd168ee24gtbkrb5_mcc_close(krb5_context context, krb5_ccache id)
505d05c73a6e56769f263d4803b22eddd168ee24gtb{
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_xfree(id);
505d05c73a6e56769f263d4803b22eddd168ee24gtb return KRB5_OK;
505d05c73a6e56769f263d4803b22eddd168ee24gtb}
505d05c73a6e56769f263d4803b22eddd168ee24gtb
505d05c73a6e56769f263d4803b22eddd168ee24gtbvoid
505d05c73a6e56769f263d4803b22eddd168ee24gtbkrb5_mcc_free(krb5_context context, krb5_ccache id)
505d05c73a6e56769f263d4803b22eddd168ee24gtb{
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_mcc_cursor curr,next;
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_mcc_data *d;
505d05c73a6e56769f263d4803b22eddd168ee24gtb
505d05c73a6e56769f263d4803b22eddd168ee24gtb d = (krb5_mcc_data *) id->data;
505d05c73a6e56769f263d4803b22eddd168ee24gtb for (curr = d->link; curr;) {
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_free_creds(context, curr->creds);
505d05c73a6e56769f263d4803b22eddd168ee24gtb next = curr->next;
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_xfree(curr);
505d05c73a6e56769f263d4803b22eddd168ee24gtb curr = next;
505d05c73a6e56769f263d4803b22eddd168ee24gtb }
505d05c73a6e56769f263d4803b22eddd168ee24gtb d->link = NULL;
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_free_principal(context, d->prin);
505d05c73a6e56769f263d4803b22eddd168ee24gtb}
505d05c73a6e56769f263d4803b22eddd168ee24gtb
505d05c73a6e56769f263d4803b22eddd168ee24gtb/*
505d05c73a6e56769f263d4803b22eddd168ee24gtb * Effects:
505d05c73a6e56769f263d4803b22eddd168ee24gtb * Destroys the contents of id.
505d05c73a6e56769f263d4803b22eddd168ee24gtb *
505d05c73a6e56769f263d4803b22eddd168ee24gtb * Errors:
505d05c73a6e56769f263d4803b22eddd168ee24gtb * none
505d05c73a6e56769f263d4803b22eddd168ee24gtb */
505d05c73a6e56769f263d4803b22eddd168ee24gtbkrb5_error_code KRB5_CALLCONV
505d05c73a6e56769f263d4803b22eddd168ee24gtbkrb5_mcc_destroy(krb5_context context, krb5_ccache id)
505d05c73a6e56769f263d4803b22eddd168ee24gtb{
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_mcc_list_node **curr, *node;
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_mcc_data *d;
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_error_code err;
505d05c73a6e56769f263d4803b22eddd168ee24gtb
505d05c73a6e56769f263d4803b22eddd168ee24gtb err = k5_mutex_lock(&krb5int_mcc_mutex);
505d05c73a6e56769f263d4803b22eddd168ee24gtb if (err)
505d05c73a6e56769f263d4803b22eddd168ee24gtb return err;
505d05c73a6e56769f263d4803b22eddd168ee24gtb
505d05c73a6e56769f263d4803b22eddd168ee24gtb d = (krb5_mcc_data *)id->data;
505d05c73a6e56769f263d4803b22eddd168ee24gtb for (curr = &mcc_head; *curr; curr = &(*curr)->next) {
505d05c73a6e56769f263d4803b22eddd168ee24gtb if ((*curr)->cache == d) {
505d05c73a6e56769f263d4803b22eddd168ee24gtb node = *curr;
505d05c73a6e56769f263d4803b22eddd168ee24gtb *curr = node->next;
505d05c73a6e56769f263d4803b22eddd168ee24gtb free(node);
505d05c73a6e56769f263d4803b22eddd168ee24gtb break;
505d05c73a6e56769f263d4803b22eddd168ee24gtb }
505d05c73a6e56769f263d4803b22eddd168ee24gtb }
505d05c73a6e56769f263d4803b22eddd168ee24gtb k5_mutex_unlock(&krb5int_mcc_mutex);
505d05c73a6e56769f263d4803b22eddd168ee24gtb
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_mcc_free(context, id);
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_xfree(d->name);
505d05c73a6e56769f263d4803b22eddd168ee24gtb k5_mutex_destroy(&d->lock);
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_xfree(d);
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_xfree(id);
505d05c73a6e56769f263d4803b22eddd168ee24gtb
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_change_cache ();
505d05c73a6e56769f263d4803b22eddd168ee24gtb return KRB5_OK;
505d05c73a6e56769f263d4803b22eddd168ee24gtb}
505d05c73a6e56769f263d4803b22eddd168ee24gtb
505d05c73a6e56769f263d4803b22eddd168ee24gtb/*
505d05c73a6e56769f263d4803b22eddd168ee24gtb * Requires:
505d05c73a6e56769f263d4803b22eddd168ee24gtb * residual is a legal path name, and a null-terminated string
505d05c73a6e56769f263d4803b22eddd168ee24gtb *
505d05c73a6e56769f263d4803b22eddd168ee24gtb * Modifies:
505d05c73a6e56769f263d4803b22eddd168ee24gtb * id
505d05c73a6e56769f263d4803b22eddd168ee24gtb *
505d05c73a6e56769f263d4803b22eddd168ee24gtb * Effects:
505d05c73a6e56769f263d4803b22eddd168ee24gtb * creates a file-based cred cache that will reside in the file
505d05c73a6e56769f263d4803b22eddd168ee24gtb * residual. The cache is not opened, but the filename is reserved.
505d05c73a6e56769f263d4803b22eddd168ee24gtb *
505d05c73a6e56769f263d4803b22eddd168ee24gtb * Returns:
505d05c73a6e56769f263d4803b22eddd168ee24gtb * A filled in krb5_ccache structure "id".
505d05c73a6e56769f263d4803b22eddd168ee24gtb *
505d05c73a6e56769f263d4803b22eddd168ee24gtb * Errors:
505d05c73a6e56769f263d4803b22eddd168ee24gtb * KRB5_CC_NOMEM - there was insufficient memory to allocate the
505d05c73a6e56769f263d4803b22eddd168ee24gtb * krb5_ccache. id is undefined.
505d05c73a6e56769f263d4803b22eddd168ee24gtb * permission errors
505d05c73a6e56769f263d4803b22eddd168ee24gtb */
505d05c73a6e56769f263d4803b22eddd168ee24gtbstatic krb5_error_code new_mcc_data (const char *, krb5_mcc_data **);
505d05c73a6e56769f263d4803b22eddd168ee24gtb
505d05c73a6e56769f263d4803b22eddd168ee24gtbkrb5_error_code KRB5_CALLCONV
505d05c73a6e56769f263d4803b22eddd168ee24gtbkrb5_mcc_resolve (krb5_context context, krb5_ccache *id, const char *residual)
505d05c73a6e56769f263d4803b22eddd168ee24gtb{
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_ccache lid;
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_mcc_list_node *ptr;
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_error_code err;
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_mcc_data *d;
505d05c73a6e56769f263d4803b22eddd168ee24gtb
505d05c73a6e56769f263d4803b22eddd168ee24gtb lid = (krb5_ccache) malloc(sizeof(struct _krb5_ccache));
505d05c73a6e56769f263d4803b22eddd168ee24gtb if (lid == NULL)
505d05c73a6e56769f263d4803b22eddd168ee24gtb return KRB5_CC_NOMEM;
505d05c73a6e56769f263d4803b22eddd168ee24gtb
505d05c73a6e56769f263d4803b22eddd168ee24gtb lid->ops = &krb5_mcc_ops;
505d05c73a6e56769f263d4803b22eddd168ee24gtb
505d05c73a6e56769f263d4803b22eddd168ee24gtb err = k5_mutex_lock(&krb5int_mcc_mutex);
505d05c73a6e56769f263d4803b22eddd168ee24gtb if (err) {
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan /* Solaris Kerberos - fix mem leak */
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_xfree(lid);
505d05c73a6e56769f263d4803b22eddd168ee24gtb return err;
505d05c73a6e56769f263d4803b22eddd168ee24gtb }
505d05c73a6e56769f263d4803b22eddd168ee24gtb for (ptr = mcc_head; ptr; ptr=ptr->next)
505d05c73a6e56769f263d4803b22eddd168ee24gtb if (!strcmp(ptr->cache->name, residual))
505d05c73a6e56769f263d4803b22eddd168ee24gtb break;
505d05c73a6e56769f263d4803b22eddd168ee24gtb if (ptr)
505d05c73a6e56769f263d4803b22eddd168ee24gtb d = ptr->cache;
505d05c73a6e56769f263d4803b22eddd168ee24gtb else {
505d05c73a6e56769f263d4803b22eddd168ee24gtb err = new_mcc_data(residual, &d);
505d05c73a6e56769f263d4803b22eddd168ee24gtb if (err) {
505d05c73a6e56769f263d4803b22eddd168ee24gtb k5_mutex_unlock(&krb5int_mcc_mutex);
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_xfree(lid);
505d05c73a6e56769f263d4803b22eddd168ee24gtb return err;
505d05c73a6e56769f263d4803b22eddd168ee24gtb }
505d05c73a6e56769f263d4803b22eddd168ee24gtb }
505d05c73a6e56769f263d4803b22eddd168ee24gtb k5_mutex_unlock(&krb5int_mcc_mutex);
505d05c73a6e56769f263d4803b22eddd168ee24gtb lid->data = d;
505d05c73a6e56769f263d4803b22eddd168ee24gtb *id = lid;
505d05c73a6e56769f263d4803b22eddd168ee24gtb return KRB5_OK;
505d05c73a6e56769f263d4803b22eddd168ee24gtb}
505d05c73a6e56769f263d4803b22eddd168ee24gtb
505d05c73a6e56769f263d4803b22eddd168ee24gtb/*
505d05c73a6e56769f263d4803b22eddd168ee24gtb * Effects:
505d05c73a6e56769f263d4803b22eddd168ee24gtb * Prepares for a sequential search of the credentials cache.
505d05c73a6e56769f263d4803b22eddd168ee24gtb * Returns a krb5_cc_cursor to be used with krb5_mcc_next_cred and
505d05c73a6e56769f263d4803b22eddd168ee24gtb * krb5_mcc_end_seq_get.
505d05c73a6e56769f263d4803b22eddd168ee24gtb *
505d05c73a6e56769f263d4803b22eddd168ee24gtb * If the cache is modified between the time of this call and the time
505d05c73a6e56769f263d4803b22eddd168ee24gtb * of the final krb5_mcc_end_seq_get, the results are undefined.
505d05c73a6e56769f263d4803b22eddd168ee24gtb *
505d05c73a6e56769f263d4803b22eddd168ee24gtb * Errors:
505d05c73a6e56769f263d4803b22eddd168ee24gtb * KRB5_CC_NOMEM
505d05c73a6e56769f263d4803b22eddd168ee24gtb * system errors
505d05c73a6e56769f263d4803b22eddd168ee24gtb */
505d05c73a6e56769f263d4803b22eddd168ee24gtbkrb5_error_code KRB5_CALLCONV
505d05c73a6e56769f263d4803b22eddd168ee24gtbkrb5_mcc_start_seq_get(krb5_context context, krb5_ccache id,
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_cc_cursor *cursor)
505d05c73a6e56769f263d4803b22eddd168ee24gtb{
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_mcc_cursor mcursor;
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_error_code err;
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_mcc_data *d;
505d05c73a6e56769f263d4803b22eddd168ee24gtb
505d05c73a6e56769f263d4803b22eddd168ee24gtb d = id->data;
505d05c73a6e56769f263d4803b22eddd168ee24gtb err = k5_mutex_lock(&d->lock);
505d05c73a6e56769f263d4803b22eddd168ee24gtb if (err)
505d05c73a6e56769f263d4803b22eddd168ee24gtb return err;
505d05c73a6e56769f263d4803b22eddd168ee24gtb mcursor = d->link;
505d05c73a6e56769f263d4803b22eddd168ee24gtb k5_mutex_unlock(&d->lock);
505d05c73a6e56769f263d4803b22eddd168ee24gtb *cursor = (krb5_cc_cursor) mcursor;
505d05c73a6e56769f263d4803b22eddd168ee24gtb return KRB5_OK;
505d05c73a6e56769f263d4803b22eddd168ee24gtb}
505d05c73a6e56769f263d4803b22eddd168ee24gtb
505d05c73a6e56769f263d4803b22eddd168ee24gtb/*
505d05c73a6e56769f263d4803b22eddd168ee24gtb * Requires:
505d05c73a6e56769f263d4803b22eddd168ee24gtb * cursor is a krb5_cc_cursor originally obtained from
505d05c73a6e56769f263d4803b22eddd168ee24gtb * krb5_mcc_start_seq_get.
505d05c73a6e56769f263d4803b22eddd168ee24gtb *
505d05c73a6e56769f263d4803b22eddd168ee24gtb * Modifes:
505d05c73a6e56769f263d4803b22eddd168ee24gtb * cursor, creds
505d05c73a6e56769f263d4803b22eddd168ee24gtb *
505d05c73a6e56769f263d4803b22eddd168ee24gtb * Effects:
505d05c73a6e56769f263d4803b22eddd168ee24gtb * Fills in creds with the "next" credentals structure from the cache
505d05c73a6e56769f263d4803b22eddd168ee24gtb * id. The actual order the creds are returned in is arbitrary.
505d05c73a6e56769f263d4803b22eddd168ee24gtb * Space is allocated for the variable length fields in the
505d05c73a6e56769f263d4803b22eddd168ee24gtb * credentials structure, so the object returned must be passed to
505d05c73a6e56769f263d4803b22eddd168ee24gtb * krb5_destroy_credential.
505d05c73a6e56769f263d4803b22eddd168ee24gtb *
505d05c73a6e56769f263d4803b22eddd168ee24gtb * The cursor is updated for the next call to krb5_mcc_next_cred.
505d05c73a6e56769f263d4803b22eddd168ee24gtb *
505d05c73a6e56769f263d4803b22eddd168ee24gtb * Errors:
505d05c73a6e56769f263d4803b22eddd168ee24gtb * system errors
505d05c73a6e56769f263d4803b22eddd168ee24gtb */
505d05c73a6e56769f263d4803b22eddd168ee24gtbkrb5_error_code KRB5_CALLCONV
505d05c73a6e56769f263d4803b22eddd168ee24gtbkrb5_mcc_next_cred(krb5_context context, krb5_ccache id,
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_cc_cursor *cursor, krb5_creds *creds)
505d05c73a6e56769f263d4803b22eddd168ee24gtb{
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_mcc_cursor mcursor;
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_error_code retval;
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_data *scratch;
505d05c73a6e56769f263d4803b22eddd168ee24gtb
505d05c73a6e56769f263d4803b22eddd168ee24gtb /* Once the node in the linked list is created, it's never
505d05c73a6e56769f263d4803b22eddd168ee24gtb modified, so we don't need to worry about locking here. (Note
505d05c73a6e56769f263d4803b22eddd168ee24gtb that we don't support _remove_cred.) */
505d05c73a6e56769f263d4803b22eddd168ee24gtb mcursor = (krb5_mcc_cursor) *cursor;
505d05c73a6e56769f263d4803b22eddd168ee24gtb if (mcursor == NULL)
505d05c73a6e56769f263d4803b22eddd168ee24gtb return KRB5_CC_END;
505d05c73a6e56769f263d4803b22eddd168ee24gtb memset(creds, 0, sizeof(krb5_creds));
505d05c73a6e56769f263d4803b22eddd168ee24gtb if (mcursor->creds) {
505d05c73a6e56769f263d4803b22eddd168ee24gtb *creds = *mcursor->creds;
505d05c73a6e56769f263d4803b22eddd168ee24gtb retval = krb5_copy_principal(context, mcursor->creds->client, &creds->client);
505d05c73a6e56769f263d4803b22eddd168ee24gtb if (retval)
505d05c73a6e56769f263d4803b22eddd168ee24gtb return retval;
505d05c73a6e56769f263d4803b22eddd168ee24gtb retval = krb5_copy_principal(context, mcursor->creds->server,
505d05c73a6e56769f263d4803b22eddd168ee24gtb &creds->server);
505d05c73a6e56769f263d4803b22eddd168ee24gtb if (retval)
505d05c73a6e56769f263d4803b22eddd168ee24gtb goto cleanclient;
505d05c73a6e56769f263d4803b22eddd168ee24gtb retval = krb5_copy_keyblock_contents(context, &mcursor->creds->keyblock,
505d05c73a6e56769f263d4803b22eddd168ee24gtb &creds->keyblock);
505d05c73a6e56769f263d4803b22eddd168ee24gtb if (retval)
505d05c73a6e56769f263d4803b22eddd168ee24gtb goto cleanserver;
505d05c73a6e56769f263d4803b22eddd168ee24gtb retval = krb5_copy_addresses(context, mcursor->creds->addresses,
505d05c73a6e56769f263d4803b22eddd168ee24gtb &creds->addresses);
505d05c73a6e56769f263d4803b22eddd168ee24gtb if (retval)
505d05c73a6e56769f263d4803b22eddd168ee24gtb goto cleanblock;
505d05c73a6e56769f263d4803b22eddd168ee24gtb retval = krb5_copy_data(context, &mcursor->creds->ticket, &scratch);
505d05c73a6e56769f263d4803b22eddd168ee24gtb if (retval)
505d05c73a6e56769f263d4803b22eddd168ee24gtb goto cleanaddrs;
505d05c73a6e56769f263d4803b22eddd168ee24gtb creds->ticket = *scratch;
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_xfree(scratch);
505d05c73a6e56769f263d4803b22eddd168ee24gtb retval = krb5_copy_data(context, &mcursor->creds->second_ticket, &scratch);
505d05c73a6e56769f263d4803b22eddd168ee24gtb if (retval)
505d05c73a6e56769f263d4803b22eddd168ee24gtb goto cleanticket;
505d05c73a6e56769f263d4803b22eddd168ee24gtb creds->second_ticket = *scratch;
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_xfree(scratch);
505d05c73a6e56769f263d4803b22eddd168ee24gtb retval = krb5_copy_authdata(context, mcursor->creds->authdata,
505d05c73a6e56769f263d4803b22eddd168ee24gtb &creds->authdata);
505d05c73a6e56769f263d4803b22eddd168ee24gtb if (retval)
505d05c73a6e56769f263d4803b22eddd168ee24gtb goto clearticket;
505d05c73a6e56769f263d4803b22eddd168ee24gtb }
505d05c73a6e56769f263d4803b22eddd168ee24gtb *cursor = (krb5_cc_cursor)mcursor->next;
505d05c73a6e56769f263d4803b22eddd168ee24gtb return KRB5_OK;
505d05c73a6e56769f263d4803b22eddd168ee24gtb
505d05c73a6e56769f263d4803b22eddd168ee24gtbclearticket:
505d05c73a6e56769f263d4803b22eddd168ee24gtb memset(creds->ticket.data,0, (unsigned) creds->ticket.length);
505d05c73a6e56769f263d4803b22eddd168ee24gtbcleanticket:
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_xfree(creds->ticket.data);
505d05c73a6e56769f263d4803b22eddd168ee24gtbcleanaddrs:
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_free_addresses(context, creds->addresses);
505d05c73a6e56769f263d4803b22eddd168ee24gtbcleanblock:
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_xfree(creds->keyblock.contents);
505d05c73a6e56769f263d4803b22eddd168ee24gtbcleanserver:
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_free_principal(context, creds->server);
505d05c73a6e56769f263d4803b22eddd168ee24gtbcleanclient:
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_free_principal(context, creds->client);
505d05c73a6e56769f263d4803b22eddd168ee24gtb return retval;
505d05c73a6e56769f263d4803b22eddd168ee24gtb}
505d05c73a6e56769f263d4803b22eddd168ee24gtb
505d05c73a6e56769f263d4803b22eddd168ee24gtb/*
505d05c73a6e56769f263d4803b22eddd168ee24gtb * Requires:
505d05c73a6e56769f263d4803b22eddd168ee24gtb * cursor is a krb5_cc_cursor originally obtained from
505d05c73a6e56769f263d4803b22eddd168ee24gtb * krb5_mcc_start_seq_get.
505d05c73a6e56769f263d4803b22eddd168ee24gtb *
505d05c73a6e56769f263d4803b22eddd168ee24gtb * Modifies:
505d05c73a6e56769f263d4803b22eddd168ee24gtb * id, cursor
505d05c73a6e56769f263d4803b22eddd168ee24gtb *
505d05c73a6e56769f263d4803b22eddd168ee24gtb * Effects:
505d05c73a6e56769f263d4803b22eddd168ee24gtb * Finishes sequential processing of the file credentials ccache id,
505d05c73a6e56769f263d4803b22eddd168ee24gtb * and invalidates the cursor (it must never be used after this call).
505d05c73a6e56769f263d4803b22eddd168ee24gtb */
505d05c73a6e56769f263d4803b22eddd168ee24gtb/* ARGSUSED */
505d05c73a6e56769f263d4803b22eddd168ee24gtbkrb5_error_code KRB5_CALLCONV
505d05c73a6e56769f263d4803b22eddd168ee24gtbkrb5_mcc_end_seq_get(krb5_context context, krb5_ccache id, krb5_cc_cursor *cursor)
505d05c73a6e56769f263d4803b22eddd168ee24gtb{
505d05c73a6e56769f263d4803b22eddd168ee24gtb *cursor = 0L;
505d05c73a6e56769f263d4803b22eddd168ee24gtb return KRB5_OK;
505d05c73a6e56769f263d4803b22eddd168ee24gtb}
505d05c73a6e56769f263d4803b22eddd168ee24gtb
505d05c73a6e56769f263d4803b22eddd168ee24gtb/* Utility routine: Creates the back-end data for a memory cache, and
505d05c73a6e56769f263d4803b22eddd168ee24gtb threads it into the global linked list.
505d05c73a6e56769f263d4803b22eddd168ee24gtb
505d05c73a6e56769f263d4803b22eddd168ee24gtb Call with the global list lock held. */
505d05c73a6e56769f263d4803b22eddd168ee24gtbstatic krb5_error_code
505d05c73a6e56769f263d4803b22eddd168ee24gtbnew_mcc_data (const char *name, krb5_mcc_data **dataptr)
505d05c73a6e56769f263d4803b22eddd168ee24gtb{
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_error_code err;
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_mcc_data *d;
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_mcc_list_node *n;
505d05c73a6e56769f263d4803b22eddd168ee24gtb
505d05c73a6e56769f263d4803b22eddd168ee24gtb d = malloc(sizeof(krb5_mcc_data));
505d05c73a6e56769f263d4803b22eddd168ee24gtb if (d == NULL)
505d05c73a6e56769f263d4803b22eddd168ee24gtb return KRB5_CC_NOMEM;
505d05c73a6e56769f263d4803b22eddd168ee24gtb
505d05c73a6e56769f263d4803b22eddd168ee24gtb err = k5_mutex_init(&d->lock);
505d05c73a6e56769f263d4803b22eddd168ee24gtb if (err) {
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_xfree(d);
505d05c73a6e56769f263d4803b22eddd168ee24gtb return err;
505d05c73a6e56769f263d4803b22eddd168ee24gtb }
505d05c73a6e56769f263d4803b22eddd168ee24gtb
505d05c73a6e56769f263d4803b22eddd168ee24gtb d->name = malloc(strlen(name) + 1);
505d05c73a6e56769f263d4803b22eddd168ee24gtb if (d->name == NULL) {
505d05c73a6e56769f263d4803b22eddd168ee24gtb k5_mutex_destroy(&d->lock);
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_xfree(d);
505d05c73a6e56769f263d4803b22eddd168ee24gtb return KRB5_CC_NOMEM;
505d05c73a6e56769f263d4803b22eddd168ee24gtb }
505d05c73a6e56769f263d4803b22eddd168ee24gtb d->link = NULL;
505d05c73a6e56769f263d4803b22eddd168ee24gtb d->prin = NULL;
505d05c73a6e56769f263d4803b22eddd168ee24gtb
505d05c73a6e56769f263d4803b22eddd168ee24gtb /* Set up the filename */
505d05c73a6e56769f263d4803b22eddd168ee24gtb strcpy(d->name, name);
505d05c73a6e56769f263d4803b22eddd168ee24gtb
505d05c73a6e56769f263d4803b22eddd168ee24gtb n = malloc(sizeof(krb5_mcc_list_node));
505d05c73a6e56769f263d4803b22eddd168ee24gtb if (n == NULL) {
505d05c73a6e56769f263d4803b22eddd168ee24gtb free(d->name);
505d05c73a6e56769f263d4803b22eddd168ee24gtb k5_mutex_destroy(&d->lock);
505d05c73a6e56769f263d4803b22eddd168ee24gtb free(d);
505d05c73a6e56769f263d4803b22eddd168ee24gtb return KRB5_CC_NOMEM;
505d05c73a6e56769f263d4803b22eddd168ee24gtb }
505d05c73a6e56769f263d4803b22eddd168ee24gtb
505d05c73a6e56769f263d4803b22eddd168ee24gtb n->cache = d;
505d05c73a6e56769f263d4803b22eddd168ee24gtb n->next = mcc_head;
505d05c73a6e56769f263d4803b22eddd168ee24gtb mcc_head = n;
505d05c73a6e56769f263d4803b22eddd168ee24gtb
505d05c73a6e56769f263d4803b22eddd168ee24gtb *dataptr = d;
505d05c73a6e56769f263d4803b22eddd168ee24gtb return 0;
505d05c73a6e56769f263d4803b22eddd168ee24gtb}
505d05c73a6e56769f263d4803b22eddd168ee24gtb
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalanstatic krb5_error_code random_string (krb5_context, char *, unsigned int);
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
505d05c73a6e56769f263d4803b22eddd168ee24gtb/*
505d05c73a6e56769f263d4803b22eddd168ee24gtb * Effects:
505d05c73a6e56769f263d4803b22eddd168ee24gtb * Creates a new file cred cache whose name is guaranteed to be
505d05c73a6e56769f263d4803b22eddd168ee24gtb * unique. The name begins with the string TKT_ROOT (from mcc.h).
505d05c73a6e56769f263d4803b22eddd168ee24gtb * The cache is not opened, but the new filename is reserved.
505d05c73a6e56769f263d4803b22eddd168ee24gtb *
505d05c73a6e56769f263d4803b22eddd168ee24gtb * Returns:
505d05c73a6e56769f263d4803b22eddd168ee24gtb * The filled in krb5_ccache id.
505d05c73a6e56769f263d4803b22eddd168ee24gtb *
505d05c73a6e56769f263d4803b22eddd168ee24gtb * Errors:
505d05c73a6e56769f263d4803b22eddd168ee24gtb * KRB5_CC_NOMEM - there was insufficient memory to allocate the
505d05c73a6e56769f263d4803b22eddd168ee24gtb * krb5_ccache. id is undefined.
505d05c73a6e56769f263d4803b22eddd168ee24gtb * system errors (from open)
505d05c73a6e56769f263d4803b22eddd168ee24gtb */
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
505d05c73a6e56769f263d4803b22eddd168ee24gtbkrb5_error_code KRB5_CALLCONV
505d05c73a6e56769f263d4803b22eddd168ee24gtbkrb5_mcc_generate_new (krb5_context context, krb5_ccache *id)
505d05c73a6e56769f263d4803b22eddd168ee24gtb{
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_ccache lid;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan char uniquename[8];
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_error_code err;
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_mcc_data *d;
505d05c73a6e56769f263d4803b22eddd168ee24gtb
505d05c73a6e56769f263d4803b22eddd168ee24gtb /* Allocate memory */
505d05c73a6e56769f263d4803b22eddd168ee24gtb lid = (krb5_ccache) malloc(sizeof(struct _krb5_ccache));
505d05c73a6e56769f263d4803b22eddd168ee24gtb if (lid == NULL)
505d05c73a6e56769f263d4803b22eddd168ee24gtb return KRB5_CC_NOMEM;
505d05c73a6e56769f263d4803b22eddd168ee24gtb
505d05c73a6e56769f263d4803b22eddd168ee24gtb lid->ops = &krb5_mcc_ops;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
505d05c73a6e56769f263d4803b22eddd168ee24gtb err = k5_mutex_lock(&krb5int_mcc_mutex);
505d05c73a6e56769f263d4803b22eddd168ee24gtb if (err) {
505d05c73a6e56769f263d4803b22eddd168ee24gtb free(lid);
505d05c73a6e56769f263d4803b22eddd168ee24gtb return err;
505d05c73a6e56769f263d4803b22eddd168ee24gtb }
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan /* Check for uniqueness with mutex locked to avoid race conditions */
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan while (1) {
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan krb5_mcc_list_node *ptr;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan random_string (context, uniquename, sizeof (uniquename));
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan for (ptr = mcc_head; ptr; ptr=ptr->next) {
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan if (!strcmp(ptr->cache->name, uniquename)) {
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan break; /* got a match, loop again */
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan }
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan }
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan if (!ptr) break; /* got to the end without finding a match */
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan }
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan err = new_mcc_data(uniquename, &d);
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
505d05c73a6e56769f263d4803b22eddd168ee24gtb k5_mutex_unlock(&krb5int_mcc_mutex);
505d05c73a6e56769f263d4803b22eddd168ee24gtb if (err) {
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_xfree(lid);
505d05c73a6e56769f263d4803b22eddd168ee24gtb return err;
505d05c73a6e56769f263d4803b22eddd168ee24gtb }
505d05c73a6e56769f263d4803b22eddd168ee24gtb lid->data = d;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan *id = lid;
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_change_cache ();
505d05c73a6e56769f263d4803b22eddd168ee24gtb return KRB5_OK;
505d05c73a6e56769f263d4803b22eddd168ee24gtb}
505d05c73a6e56769f263d4803b22eddd168ee24gtb
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan/* Utility routine: Creates a random memory ccache name.
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * This algorithm was selected because it creates readable
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * random ccache names in a fixed size buffer. */
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalanstatic krb5_error_code
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalanrandom_string (krb5_context context, char *string, unsigned int length)
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan{
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan static const unsigned char charlist[] =
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan krb5_error_code err = 0;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan unsigned char *bytes = NULL;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan unsigned int bytecount = length - 1;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan if (!err) {
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan bytes = malloc (bytecount);
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan if (bytes == NULL) { err = ENOMEM; }
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan }
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan if (!err) {
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan krb5_data data;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan data.length = bytecount;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan data.data = (char *) bytes;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan err = krb5_c_random_make_octets (context, &data);
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan }
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan if (!err) {
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan unsigned int i;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan for (i = 0; i < bytecount; i++) {
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan string [i] = charlist[bytes[i] % (sizeof (charlist) - 1)];
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan }
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan string[length - 1] = '\0';
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan }
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan if (bytes != NULL) { free (bytes); }
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan return err;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan}
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
505d05c73a6e56769f263d4803b22eddd168ee24gtb/*
505d05c73a6e56769f263d4803b22eddd168ee24gtb * Requires:
505d05c73a6e56769f263d4803b22eddd168ee24gtb * id is a file credential cache
505d05c73a6e56769f263d4803b22eddd168ee24gtb *
505d05c73a6e56769f263d4803b22eddd168ee24gtb * Returns:
505d05c73a6e56769f263d4803b22eddd168ee24gtb * The name of the file cred cache id.
505d05c73a6e56769f263d4803b22eddd168ee24gtb */
505d05c73a6e56769f263d4803b22eddd168ee24gtbconst char * KRB5_CALLCONV
505d05c73a6e56769f263d4803b22eddd168ee24gtbkrb5_mcc_get_name (krb5_context context, krb5_ccache id)
505d05c73a6e56769f263d4803b22eddd168ee24gtb{
505d05c73a6e56769f263d4803b22eddd168ee24gtb return (char *) ((krb5_mcc_data *) id->data)->name;
505d05c73a6e56769f263d4803b22eddd168ee24gtb}
505d05c73a6e56769f263d4803b22eddd168ee24gtb
505d05c73a6e56769f263d4803b22eddd168ee24gtb/*
505d05c73a6e56769f263d4803b22eddd168ee24gtb * Modifies:
505d05c73a6e56769f263d4803b22eddd168ee24gtb * id, princ
505d05c73a6e56769f263d4803b22eddd168ee24gtb *
505d05c73a6e56769f263d4803b22eddd168ee24gtb * Effects:
505d05c73a6e56769f263d4803b22eddd168ee24gtb * Retrieves the primary principal from id, as set with
505d05c73a6e56769f263d4803b22eddd168ee24gtb * krb5_mcc_initialize. The principal is returned is allocated
505d05c73a6e56769f263d4803b22eddd168ee24gtb * storage that must be freed by the caller via krb5_free_principal.
505d05c73a6e56769f263d4803b22eddd168ee24gtb *
505d05c73a6e56769f263d4803b22eddd168ee24gtb * Errors:
505d05c73a6e56769f263d4803b22eddd168ee24gtb * system errors
505d05c73a6e56769f263d4803b22eddd168ee24gtb * KRB5_CC_NOMEM
505d05c73a6e56769f263d4803b22eddd168ee24gtb */
505d05c73a6e56769f263d4803b22eddd168ee24gtbkrb5_error_code KRB5_CALLCONV
505d05c73a6e56769f263d4803b22eddd168ee24gtbkrb5_mcc_get_principal(krb5_context context, krb5_ccache id, krb5_principal *princ)
505d05c73a6e56769f263d4803b22eddd168ee24gtb{
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_mcc_data *ptr = (krb5_mcc_data *)id->data;
505d05c73a6e56769f263d4803b22eddd168ee24gtb if (!ptr->prin) {
505d05c73a6e56769f263d4803b22eddd168ee24gtb *princ = 0L;
505d05c73a6e56769f263d4803b22eddd168ee24gtb return KRB5_FCC_NOFILE;
505d05c73a6e56769f263d4803b22eddd168ee24gtb }
505d05c73a6e56769f263d4803b22eddd168ee24gtb return krb5_copy_principal(context, ptr->prin, princ);
505d05c73a6e56769f263d4803b22eddd168ee24gtb}
505d05c73a6e56769f263d4803b22eddd168ee24gtb
505d05c73a6e56769f263d4803b22eddd168ee24gtbkrb5_error_code KRB5_CALLCONV
505d05c73a6e56769f263d4803b22eddd168ee24gtbkrb5_mcc_retrieve(krb5_context context, krb5_ccache id, krb5_flags whichfields,
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_creds *mcreds, krb5_creds *creds)
505d05c73a6e56769f263d4803b22eddd168ee24gtb{
505d05c73a6e56769f263d4803b22eddd168ee24gtb return krb5_cc_retrieve_cred_default (context, id, whichfields,
505d05c73a6e56769f263d4803b22eddd168ee24gtb mcreds, creds);
505d05c73a6e56769f263d4803b22eddd168ee24gtb}
505d05c73a6e56769f263d4803b22eddd168ee24gtb
505d05c73a6e56769f263d4803b22eddd168ee24gtb/*
505d05c73a6e56769f263d4803b22eddd168ee24gtb * Non-functional stub implementation for krb5_mcc_remove
505d05c73a6e56769f263d4803b22eddd168ee24gtb *
505d05c73a6e56769f263d4803b22eddd168ee24gtb * Errors:
505d05c73a6e56769f263d4803b22eddd168ee24gtb * KRB5_CC_NOSUPP - not implemented
505d05c73a6e56769f263d4803b22eddd168ee24gtb */
505d05c73a6e56769f263d4803b22eddd168ee24gtbstatic krb5_error_code KRB5_CALLCONV
505d05c73a6e56769f263d4803b22eddd168ee24gtbkrb5_mcc_remove_cred(krb5_context context, krb5_ccache cache, krb5_flags flags,
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_creds *creds)
505d05c73a6e56769f263d4803b22eddd168ee24gtb{
505d05c73a6e56769f263d4803b22eddd168ee24gtb return KRB5_CC_NOSUPP;
505d05c73a6e56769f263d4803b22eddd168ee24gtb}
505d05c73a6e56769f263d4803b22eddd168ee24gtb
505d05c73a6e56769f263d4803b22eddd168ee24gtb
505d05c73a6e56769f263d4803b22eddd168ee24gtb/*
505d05c73a6e56769f263d4803b22eddd168ee24gtb * Requires:
505d05c73a6e56769f263d4803b22eddd168ee24gtb * id is a cred cache returned by krb5_mcc_resolve or
505d05c73a6e56769f263d4803b22eddd168ee24gtb * krb5_mcc_generate_new, but has not been opened by krb5_mcc_initialize.
505d05c73a6e56769f263d4803b22eddd168ee24gtb *
505d05c73a6e56769f263d4803b22eddd168ee24gtb * Modifies:
505d05c73a6e56769f263d4803b22eddd168ee24gtb * id
505d05c73a6e56769f263d4803b22eddd168ee24gtb *
505d05c73a6e56769f263d4803b22eddd168ee24gtb * Effects:
505d05c73a6e56769f263d4803b22eddd168ee24gtb * Sets the operational flags of id to flags.
505d05c73a6e56769f263d4803b22eddd168ee24gtb */
505d05c73a6e56769f263d4803b22eddd168ee24gtbkrb5_error_code KRB5_CALLCONV
505d05c73a6e56769f263d4803b22eddd168ee24gtbkrb5_mcc_set_flags(krb5_context context, krb5_ccache id, krb5_flags flags)
505d05c73a6e56769f263d4803b22eddd168ee24gtb{
505d05c73a6e56769f263d4803b22eddd168ee24gtb return KRB5_OK;
505d05c73a6e56769f263d4803b22eddd168ee24gtb}
505d05c73a6e56769f263d4803b22eddd168ee24gtb
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalanstatic krb5_error_code KRB5_CALLCONV
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalankrb5_mcc_get_flags(krb5_context context, krb5_ccache id, krb5_flags *flags)
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan{
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan *flags = 0;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan return KRB5_OK;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan}
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
505d05c73a6e56769f263d4803b22eddd168ee24gtb/* store: Save away creds in the ccache. */
505d05c73a6e56769f263d4803b22eddd168ee24gtbkrb5_error_code KRB5_CALLCONV
505d05c73a6e56769f263d4803b22eddd168ee24gtbkrb5_mcc_store(krb5_context ctx, krb5_ccache id, krb5_creds *creds)
505d05c73a6e56769f263d4803b22eddd168ee24gtb{
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_error_code err;
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_mcc_link *new_node;
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_mcc_data *mptr = (krb5_mcc_data *)id->data;
505d05c73a6e56769f263d4803b22eddd168ee24gtb
505d05c73a6e56769f263d4803b22eddd168ee24gtb new_node = malloc(sizeof(krb5_mcc_link));
505d05c73a6e56769f263d4803b22eddd168ee24gtb if (new_node == NULL)
505d05c73a6e56769f263d4803b22eddd168ee24gtb return errno;
505d05c73a6e56769f263d4803b22eddd168ee24gtb err = krb5_copy_creds(ctx, creds, &new_node->creds);
505d05c73a6e56769f263d4803b22eddd168ee24gtb if (err) {
505d05c73a6e56769f263d4803b22eddd168ee24gtb free(new_node);
505d05c73a6e56769f263d4803b22eddd168ee24gtb return err;
505d05c73a6e56769f263d4803b22eddd168ee24gtb }
505d05c73a6e56769f263d4803b22eddd168ee24gtb err = k5_mutex_lock(&mptr->lock);
505d05c73a6e56769f263d4803b22eddd168ee24gtb if (err) {
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan /* Solaris Kerberos - fix mem leaks */
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan krb5_free_creds(ctx, new_node->creds);
505d05c73a6e56769f263d4803b22eddd168ee24gtb free(new_node);
505d05c73a6e56769f263d4803b22eddd168ee24gtb return err;
505d05c73a6e56769f263d4803b22eddd168ee24gtb }
505d05c73a6e56769f263d4803b22eddd168ee24gtb new_node->next = mptr->link;
505d05c73a6e56769f263d4803b22eddd168ee24gtb mptr->link = new_node;
505d05c73a6e56769f263d4803b22eddd168ee24gtb k5_mutex_unlock(&mptr->lock);
505d05c73a6e56769f263d4803b22eddd168ee24gtb return 0;
505d05c73a6e56769f263d4803b22eddd168ee24gtb}
505d05c73a6e56769f263d4803b22eddd168ee24gtb
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalanstatic krb5_error_code KRB5_CALLCONV
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalankrb5_mcc_ptcursor_new(
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan krb5_context context,
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan krb5_cc_ptcursor *cursor)
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan{
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan krb5_error_code ret = 0;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan krb5_cc_ptcursor n = NULL;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan struct krb5_mcc_ptcursor_data *cdata = NULL;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan *cursor = NULL;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan n = malloc(sizeof(*n));
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan if (n == NULL)
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan return ENOMEM;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan n->ops = &krb5_mcc_ops;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan cdata = malloc(sizeof(struct krb5_mcc_ptcursor_data));
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan if (cdata == NULL) {
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan ret = ENOMEM;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan goto errout;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan }
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan n->data = cdata;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan ret = k5_mutex_lock(&krb5int_mcc_mutex);
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan if (ret)
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan goto errout;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan cdata->cur = mcc_head;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan ret = k5_mutex_unlock(&krb5int_mcc_mutex);
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan if (ret)
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan goto errout;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalanerrout:
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan if (ret) {
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan krb5_mcc_ptcursor_free(context, &n);
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan }
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan *cursor = n;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan return ret;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan}
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalanstatic krb5_error_code KRB5_CALLCONV
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalankrb5_mcc_ptcursor_next(
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan krb5_context context,
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan krb5_cc_ptcursor cursor,
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan krb5_ccache *ccache)
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan{
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan krb5_error_code ret = 0;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan struct krb5_mcc_ptcursor_data *cdata = NULL;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan *ccache = NULL;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan cdata = cursor->data;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan if (cdata->cur == NULL)
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan return 0;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan *ccache = malloc(sizeof(**ccache));
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan if (*ccache == NULL)
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan return ENOMEM;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan (*ccache)->ops = &krb5_mcc_ops;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan (*ccache)->data = cdata->cur->cache;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan ret = k5_mutex_lock(&krb5int_mcc_mutex);
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan if (ret)
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan goto errout;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan cdata->cur = cdata->cur->next;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan ret = k5_mutex_unlock(&krb5int_mcc_mutex);
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan if (ret)
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan goto errout;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalanerrout:
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan if (ret && *ccache != NULL) {
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan free(*ccache);
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan *ccache = NULL;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan }
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan return ret;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan}
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalanstatic krb5_error_code KRB5_CALLCONV
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalankrb5_mcc_ptcursor_free(
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan krb5_context context,
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan krb5_cc_ptcursor *cursor)
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan{
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan if (*cursor == NULL)
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan return 0;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan if ((*cursor)->data != NULL)
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan free((*cursor)->data);
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan free(*cursor);
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan *cursor = NULL;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan return 0;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan}
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
505d05c73a6e56769f263d4803b22eddd168ee24gtbconst krb5_cc_ops krb5_mcc_ops = {
505d05c73a6e56769f263d4803b22eddd168ee24gtb 0,
505d05c73a6e56769f263d4803b22eddd168ee24gtb "MEMORY",
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_mcc_get_name,
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_mcc_resolve,
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_mcc_generate_new,
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_mcc_initialize,
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_mcc_destroy,
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_mcc_close,
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_mcc_store,
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_mcc_retrieve,
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_mcc_get_principal,
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_mcc_start_seq_get,
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_mcc_next_cred,
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_mcc_end_seq_get,
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_mcc_remove_cred,
505d05c73a6e56769f263d4803b22eddd168ee24gtb krb5_mcc_set_flags,
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan krb5_mcc_get_flags,
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan krb5_mcc_ptcursor_new,
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan krb5_mcc_ptcursor_next,
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan krb5_mcc_ptcursor_free,
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan NULL,
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan NULL,
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan NULL,
505d05c73a6e56769f263d4803b22eddd168ee24gtb};