1505d05c7Sgtb /*
2505d05c7Sgtb * lib/krb5/ccache/ccfns.c
3505d05c7Sgtb *
4159d09a2SMark Phalan * Copyright 2000, 2007 by the Massachusetts Institute of Technology.
5505d05c7Sgtb * All Rights Reserved.
6505d05c7Sgtb *
7505d05c7Sgtb * Export of this software from the United States of America may
8505d05c7Sgtb * require a specific license from the United States Government.
9505d05c7Sgtb * It is the responsibility of any person or organization contemplating
10505d05c7Sgtb * export to obtain such a license before exporting.
11*55fea89dSDan Cross *
12505d05c7Sgtb * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
13505d05c7Sgtb * distribute this software and its documentation for any purpose and
14505d05c7Sgtb * without fee is hereby granted, provided that the above copyright
15505d05c7Sgtb * notice appear in all copies and that both that copyright notice and
16505d05c7Sgtb * this permission notice appear in supporting documentation, and that
17505d05c7Sgtb * the name of M.I.T. not be used in advertising or publicity pertaining
18505d05c7Sgtb * to distribution of the software without specific, written prior
19505d05c7Sgtb * permission. Furthermore if you modify this software you must label
20505d05c7Sgtb * your software as modified software and not distribute it in such a
21505d05c7Sgtb * fashion that it might be confused with the original M.I.T. software.
22505d05c7Sgtb * M.I.T. makes no representations about the suitability of
23505d05c7Sgtb * this software for any purpose. It is provided "as is" without express
24505d05c7Sgtb * or implied warranty.
25505d05c7Sgtb */
26505d05c7Sgtb
27505d05c7Sgtb /*
28505d05c7Sgtb * Dispatch methods for credentials cache code.
29505d05c7Sgtb */
30505d05c7Sgtb
31505d05c7Sgtb #include "k5-int.h"
32505d05c7Sgtb
33505d05c7Sgtb const char * KRB5_CALLCONV
krb5_cc_get_name(krb5_context context,krb5_ccache cache)34505d05c7Sgtb krb5_cc_get_name (krb5_context context, krb5_ccache cache)
35505d05c7Sgtb {
36505d05c7Sgtb return cache->ops->get_name(context, cache);
37505d05c7Sgtb }
38505d05c7Sgtb
39505d05c7Sgtb krb5_error_code KRB5_CALLCONV
krb5_cc_gen_new(krb5_context context,krb5_ccache * cache)40505d05c7Sgtb krb5_cc_gen_new (krb5_context context, krb5_ccache *cache)
41505d05c7Sgtb {
42505d05c7Sgtb return (*cache)->ops->gen_new(context, cache);
43505d05c7Sgtb }
44505d05c7Sgtb
45505d05c7Sgtb krb5_error_code KRB5_CALLCONV
krb5_cc_initialize(krb5_context context,krb5_ccache cache,krb5_principal principal)46505d05c7Sgtb krb5_cc_initialize(krb5_context context, krb5_ccache cache,
47505d05c7Sgtb krb5_principal principal)
48505d05c7Sgtb {
49505d05c7Sgtb return cache->ops->init(context, cache, principal);
50505d05c7Sgtb }
51505d05c7Sgtb
52505d05c7Sgtb krb5_error_code KRB5_CALLCONV
krb5_cc_destroy(krb5_context context,krb5_ccache cache)53505d05c7Sgtb krb5_cc_destroy (krb5_context context, krb5_ccache cache)
54505d05c7Sgtb {
55505d05c7Sgtb return cache->ops->destroy(context, cache);
56505d05c7Sgtb }
57505d05c7Sgtb
58505d05c7Sgtb krb5_error_code KRB5_CALLCONV
krb5_cc_close(krb5_context context,krb5_ccache cache)59505d05c7Sgtb krb5_cc_close (krb5_context context, krb5_ccache cache)
60505d05c7Sgtb {
61505d05c7Sgtb return cache->ops->close(context, cache);
62505d05c7Sgtb }
63505d05c7Sgtb
64505d05c7Sgtb krb5_error_code KRB5_CALLCONV
krb5_cc_store_cred(krb5_context context,krb5_ccache cache,krb5_creds * creds)65505d05c7Sgtb krb5_cc_store_cred (krb5_context context, krb5_ccache cache,
66505d05c7Sgtb krb5_creds *creds)
67505d05c7Sgtb {
68159d09a2SMark Phalan krb5_error_code ret;
69159d09a2SMark Phalan krb5_ticket *tkt;
70159d09a2SMark Phalan krb5_principal s1, s2;
71159d09a2SMark Phalan
72159d09a2SMark Phalan ret = cache->ops->store(context, cache, creds);
73159d09a2SMark Phalan if (ret) return ret;
74159d09a2SMark Phalan
75159d09a2SMark Phalan /*
76159d09a2SMark Phalan * If creds->server and the server in the decoded ticket differ,
77159d09a2SMark Phalan * store both principals.
78159d09a2SMark Phalan */
79159d09a2SMark Phalan s1 = creds->server;
80159d09a2SMark Phalan ret = decode_krb5_ticket(&creds->ticket, &tkt);
81159d09a2SMark Phalan /* Bail out on errors in case someone is storing a non-ticket. */
82159d09a2SMark Phalan if (ret) return 0;
83159d09a2SMark Phalan s2 = tkt->server;
84159d09a2SMark Phalan if (!krb5_principal_compare(context, s1, s2)) {
85159d09a2SMark Phalan creds->server = s2;
86159d09a2SMark Phalan ret = cache->ops->store(context, cache, creds);
87159d09a2SMark Phalan creds->server = s1;
88159d09a2SMark Phalan }
89159d09a2SMark Phalan krb5_free_ticket(context, tkt);
90159d09a2SMark Phalan return ret;
91505d05c7Sgtb }
92505d05c7Sgtb
93505d05c7Sgtb krb5_error_code KRB5_CALLCONV
krb5_cc_retrieve_cred(krb5_context context,krb5_ccache cache,krb5_flags flags,krb5_creds * mcreds,krb5_creds * creds)94505d05c7Sgtb krb5_cc_retrieve_cred (krb5_context context, krb5_ccache cache,
95505d05c7Sgtb krb5_flags flags, krb5_creds *mcreds,
96505d05c7Sgtb krb5_creds *creds)
97505d05c7Sgtb {
98159d09a2SMark Phalan krb5_error_code ret;
99159d09a2SMark Phalan krb5_data tmprealm;
100159d09a2SMark Phalan
101159d09a2SMark Phalan ret = cache->ops->retrieve(context, cache, flags, mcreds, creds);
102159d09a2SMark Phalan if (ret != KRB5_CC_NOTFOUND)
103159d09a2SMark Phalan return ret;
104159d09a2SMark Phalan if (!krb5_is_referral_realm(&mcreds->server->realm))
105159d09a2SMark Phalan return ret;
106159d09a2SMark Phalan
107159d09a2SMark Phalan /*
108159d09a2SMark Phalan * Retry using client's realm if service has referral realm.
109159d09a2SMark Phalan */
110159d09a2SMark Phalan tmprealm = mcreds->server->realm;
111159d09a2SMark Phalan mcreds->server->realm = mcreds->client->realm;
112159d09a2SMark Phalan ret = cache->ops->retrieve(context, cache, flags, mcreds, creds);
113159d09a2SMark Phalan mcreds->server->realm = tmprealm;
114159d09a2SMark Phalan return ret;
115505d05c7Sgtb }
116505d05c7Sgtb
117505d05c7Sgtb krb5_error_code KRB5_CALLCONV
krb5_cc_get_principal(krb5_context context,krb5_ccache cache,krb5_principal * principal)118505d05c7Sgtb krb5_cc_get_principal (krb5_context context, krb5_ccache cache,
119505d05c7Sgtb krb5_principal *principal)
120505d05c7Sgtb {
121505d05c7Sgtb return cache->ops->get_princ(context, cache, principal);
122505d05c7Sgtb }
123505d05c7Sgtb
124505d05c7Sgtb krb5_error_code KRB5_CALLCONV
krb5_cc_start_seq_get(krb5_context context,krb5_ccache cache,krb5_cc_cursor * cursor)125505d05c7Sgtb krb5_cc_start_seq_get (krb5_context context, krb5_ccache cache,
126505d05c7Sgtb krb5_cc_cursor *cursor)
127505d05c7Sgtb {
128505d05c7Sgtb return cache->ops->get_first(context, cache, cursor);
129505d05c7Sgtb }
130505d05c7Sgtb
131505d05c7Sgtb krb5_error_code KRB5_CALLCONV
krb5_cc_next_cred(krb5_context context,krb5_ccache cache,krb5_cc_cursor * cursor,krb5_creds * creds)132505d05c7Sgtb krb5_cc_next_cred (krb5_context context, krb5_ccache cache,
133505d05c7Sgtb krb5_cc_cursor *cursor, krb5_creds *creds)
134505d05c7Sgtb {
135505d05c7Sgtb return cache->ops->get_next(context, cache, cursor, creds);
136505d05c7Sgtb }
137505d05c7Sgtb
138505d05c7Sgtb krb5_error_code KRB5_CALLCONV
krb5_cc_end_seq_get(krb5_context context,krb5_ccache cache,krb5_cc_cursor * cursor)139505d05c7Sgtb krb5_cc_end_seq_get (krb5_context context, krb5_ccache cache,
140505d05c7Sgtb krb5_cc_cursor *cursor)
141505d05c7Sgtb {
142505d05c7Sgtb return cache->ops->end_get(context, cache, cursor);
143505d05c7Sgtb }
144505d05c7Sgtb
145505d05c7Sgtb krb5_error_code KRB5_CALLCONV
krb5_cc_remove_cred(krb5_context context,krb5_ccache cache,krb5_flags flags,krb5_creds * creds)146505d05c7Sgtb krb5_cc_remove_cred (krb5_context context, krb5_ccache cache, krb5_flags flags,
147505d05c7Sgtb krb5_creds *creds)
148505d05c7Sgtb {
149505d05c7Sgtb return cache->ops->remove_cred(context, cache, flags, creds);
150505d05c7Sgtb }
151505d05c7Sgtb
152505d05c7Sgtb krb5_error_code KRB5_CALLCONV
krb5_cc_set_flags(krb5_context context,krb5_ccache cache,krb5_flags flags)153505d05c7Sgtb krb5_cc_set_flags (krb5_context context, krb5_ccache cache, krb5_flags flags)
154505d05c7Sgtb {
155505d05c7Sgtb return cache->ops->set_flags(context, cache, flags);
156505d05c7Sgtb }
157505d05c7Sgtb
158159d09a2SMark Phalan krb5_error_code KRB5_CALLCONV
krb5_cc_get_flags(krb5_context context,krb5_ccache cache,krb5_flags * flags)159159d09a2SMark Phalan krb5_cc_get_flags (krb5_context context, krb5_ccache cache, krb5_flags *flags)
160159d09a2SMark Phalan {
161159d09a2SMark Phalan return cache->ops->get_flags(context, cache, flags);
162159d09a2SMark Phalan }
163159d09a2SMark Phalan
164505d05c7Sgtb const char * KRB5_CALLCONV
krb5_cc_get_type(krb5_context context,krb5_ccache cache)165505d05c7Sgtb krb5_cc_get_type (krb5_context context, krb5_ccache cache)
166505d05c7Sgtb {
167505d05c7Sgtb return cache->ops->prefix;
168505d05c7Sgtb }
169