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