diff options
author | Greg Hudson <ghudson@mit.edu> | 2011-09-05 16:26:37 +0000 |
---|---|---|
committer | Greg Hudson <ghudson@mit.edu> | 2011-09-05 16:26:37 +0000 |
commit | f784a37909b68b7dfc1eed8c3a0e014639c90e45 (patch) | |
tree | fab81e4348cffe5ff453522f76ee49d6f5528cb3 /src/lib/krb5/ccache | |
parent | 319c01a8f523843169b9e5342ac2d085ad67f8a2 (diff) | |
download | krb5-f784a37909b68b7dfc1eed8c3a0e014639c90e45.tar.gz krb5-f784a37909b68b7dfc1eed8c3a0e014639c90e45.tar.xz krb5-f784a37909b68b7dfc1eed8c3a0e014639c90e45.zip |
Add new cache collection APIs
* krb5_cc_get_full_name retrieves the full type:name of a cache.
* krb5_cc_switch makes a cache the primary cache.
* krb5_cc_cache_match searches the collection for a client principal.
* krb5_free_string releases a string (for the krb5_cc_get_full_name
result).
All of these are from Heimdal except for krb5_free_string (Heimdal uses
krb5_xfree).
ticket: 6954
git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@25155 dc483132-0cff-0310-8789-dd5450dbe970
Diffstat (limited to 'src/lib/krb5/ccache')
-rw-r--r-- | src/lib/krb5/ccache/cc_dir.c | 25 | ||||
-rw-r--r-- | src/lib/krb5/ccache/cc_file.c | 2 | ||||
-rw-r--r-- | src/lib/krb5/ccache/cc_keyring.c | 2 | ||||
-rw-r--r-- | src/lib/krb5/ccache/cc_memory.c | 1 | ||||
-rw-r--r-- | src/lib/krb5/ccache/cc_mslsa.c | 1 | ||||
-rw-r--r-- | src/lib/krb5/ccache/ccbase.c | 10 | ||||
-rw-r--r-- | src/lib/krb5/ccache/cccursor.c | 44 | ||||
-rw-r--r-- | src/lib/krb5/ccache/ccfns.c | 22 |
8 files changed, 107 insertions, 0 deletions
diff --git a/src/lib/krb5/ccache/cc_dir.c b/src/lib/krb5/ccache/cc_dir.c index 1f32c389ae..6cd192a710 100644 --- a/src/lib/krb5/ccache/cc_dir.c +++ b/src/lib/krb5/ccache/cc_dir.c @@ -672,6 +672,30 @@ dcc_unlock(krb5_context context, krb5_ccache cache) return krb5_fcc_ops.unlock(context, data->fcc); } +static krb5_error_code KRB5_CALLCONV +dcc_switch_to(krb5_context context, krb5_ccache cache) +{ + dcc_data *data = cache->data; + char *primary_path = NULL, *dirname = NULL, *filename = NULL; + krb5_error_code ret; + + ret = split_path(context, data->residual + 1, &dirname, &filename); + if (ret) + return ret; + + ret = primary_pathname(dirname, &primary_path); + if (ret) + goto cleanup; + + ret = write_primary_file(primary_path, filename); + +cleanup: + free(primary_path); + free(dirname); + free(filename); + return ret; +} + const krb5_cc_ops krb5_dcc_ops = { 0, "DIR", @@ -698,6 +722,7 @@ const krb5_cc_ops krb5_dcc_ops = { NULL, /* wasdefault */ dcc_lock, dcc_unlock, + dcc_switch_to, }; #endif /* not _WIN32 */ diff --git a/src/lib/krb5/ccache/cc_file.c b/src/lib/krb5/ccache/cc_file.c index aee8a83969..4599309322 100644 --- a/src/lib/krb5/ccache/cc_file.c +++ b/src/lib/krb5/ccache/cc_file.c @@ -2557,6 +2557,7 @@ const krb5_cc_ops krb5_fcc_ops = { NULL, /* wasdefault */ krb5_fcc_lock, krb5_fcc_unlock, + NULL, /* switch_to */ }; #if defined(_WIN32) @@ -2626,4 +2627,5 @@ const krb5_cc_ops krb5_cc_file_ops = { NULL, /* wasdefault */ krb5_fcc_lock, krb5_fcc_unlock, + NULL, /* switch_to */ }; diff --git a/src/lib/krb5/ccache/cc_keyring.c b/src/lib/krb5/ccache/cc_keyring.c index 2c77c3cdab..fd1bcec38d 100644 --- a/src/lib/krb5/ccache/cc_keyring.c +++ b/src/lib/krb5/ccache/cc_keyring.c @@ -2073,6 +2073,7 @@ const krb5_cc_ops krb5_krcc_ops = { NULL, /* wasdefault */ krb5_krcc_lock, krb5_krcc_unlock, + NULL, /* switch_to */ }; #else /* !USE_KEYRING_CCACHE */ @@ -2106,5 +2107,6 @@ const krb5_cc_ops krb5_krcc_ops = { NULL, NULL, NULL, + NULL, }; #endif /* USE_KEYRING_CCACHE */ diff --git a/src/lib/krb5/ccache/cc_memory.c b/src/lib/krb5/ccache/cc_memory.c index 5ce6a0e6c2..07d9261444 100644 --- a/src/lib/krb5/ccache/cc_memory.c +++ b/src/lib/krb5/ccache/cc_memory.c @@ -827,4 +827,5 @@ const krb5_cc_ops krb5_mcc_ops = { NULL, /* wasdefault */ krb5_mcc_lock, krb5_mcc_unlock, + NULL, /* switch_to */ }; diff --git a/src/lib/krb5/ccache/cc_mslsa.c b/src/lib/krb5/ccache/cc_mslsa.c index 9727b4fead..600478a158 100644 --- a/src/lib/krb5/ccache/cc_mslsa.c +++ b/src/lib/krb5/ccache/cc_mslsa.c @@ -2758,5 +2758,6 @@ const krb5_cc_ops krb5_lcc_ops = { NULL, NULL, NULL, + NULL, }; #endif /* _WIN32 */ diff --git a/src/lib/krb5/ccache/ccbase.c b/src/lib/krb5/ccache/ccbase.c index b330784c90..a1fd3aa837 100644 --- a/src/lib/krb5/ccache/ccbase.c +++ b/src/lib/krb5/ccache/ccbase.c @@ -418,6 +418,16 @@ krb5_cc_move(krb5_context context, krb5_ccache src, krb5_ccache dst) return ret; } +krb5_boolean KRB5_CALLCONV +krb5_cc_support_switch(krb5_context context, const char *type) +{ + const krb5_cc_ops *ops; + krb5_error_code err; + + err = krb5int_cc_getops(context, type, &ops); + return (err ? FALSE : (ops->switch_to != NULL)); +} + krb5_error_code k5_cc_mutex_init(k5_cc_mutex *m) { diff --git a/src/lib/krb5/ccache/cccursor.c b/src/lib/krb5/ccache/cccursor.c index 3d9bb7c8bd..7bb0749385 100644 --- a/src/lib/krb5/ccache/cccursor.c +++ b/src/lib/krb5/ccache/cccursor.c @@ -358,3 +358,47 @@ cccol_pertype_next(krb5_context context, errout: return ret; } + +krb5_error_code +krb5_cc_cache_match(krb5_context context, krb5_principal client, + krb5_ccache *cache_out) +{ + krb5_error_code ret; + krb5_cccol_cursor cursor; + krb5_ccache cache; + krb5_principal princ; + char *name; + krb5_boolean eq; + + *cache_out = NULL; + ret = krb5_cccol_cursor_new(context, &cursor); + if (ret) + return ret; + + while ((ret = krb5_cccol_cursor_next(context, cursor, &cache)) == 0 && + cache != NULL) { + ret = krb5_cc_get_principal(context, cache, &princ); + if (ret == 0) { + eq = krb5_principal_compare(context, princ, client); + krb5_free_principal(context, princ); + if (eq) + break; + } + krb5_cc_close(context, cache); + } + krb5_cccol_cursor_free(context, &cursor); + if (ret) + return ret; + if (cache == NULL) { + ret = krb5_unparse_name(context, client, &name); + if (ret == 0) { + krb5_set_error_message(context, KRB5_CC_NOTFOUND, + _("Can't find client principal %s in " + "cache collection"), name); + krb5_free_unparsed_name(context, name); + } + ret = KRB5_CC_NOTFOUND; + } else + *cache_out = cache; + return ret; +} diff --git a/src/lib/krb5/ccache/ccfns.c b/src/lib/krb5/ccache/ccfns.c index b92824d0a5..70c607dfb4 100644 --- a/src/lib/krb5/ccache/ccfns.c +++ b/src/lib/krb5/ccache/ccfns.c @@ -33,6 +33,20 @@ krb5_cc_get_name(krb5_context context, krb5_ccache cache) } krb5_error_code KRB5_CALLCONV +krb5_cc_get_full_name(krb5_context context, krb5_ccache cache, + char **fullname_out) +{ + char *name; + + *fullname_out = NULL; + if (asprintf(&name, "%s:%s", cache->ops->prefix, + cache->ops->get_name(context, cache)) < 0) + return ENOMEM; + *fullname_out = name; + return 0; +} + +krb5_error_code KRB5_CALLCONV krb5_cc_gen_new(krb5_context context, krb5_ccache *cache) { TRACE_CC_GEN_NEW(context, cache); @@ -323,3 +337,11 @@ out: krb5_free_cred_contents(context, &mcred); return ret; } + +krb5_error_code KRB5_CALLCONV +krb5_cc_switch(krb5_context context, krb5_ccache cache) +{ + if (cache->ops->switch_to == NULL) + return 0; + return cache->ops->switch_to(context, cache); +} |