1c19800e8SDoug Rabson /*
2c19800e8SDoug Rabson * Copyright (c) 2005, PADL Software Pty Ltd.
3c19800e8SDoug Rabson * All rights reserved.
4c19800e8SDoug Rabson *
5c19800e8SDoug Rabson * Redistribution and use in source and binary forms, with or without
6c19800e8SDoug Rabson * modification, are permitted provided that the following conditions
7c19800e8SDoug Rabson * are met:
8c19800e8SDoug Rabson *
9c19800e8SDoug Rabson * 1. Redistributions of source code must retain the above copyright
10c19800e8SDoug Rabson * notice, this list of conditions and the following disclaimer.
11c19800e8SDoug Rabson *
12c19800e8SDoug Rabson * 2. Redistributions in binary form must reproduce the above copyright
13c19800e8SDoug Rabson * notice, this list of conditions and the following disclaimer in the
14c19800e8SDoug Rabson * documentation and/or other materials provided with the distribution.
15c19800e8SDoug Rabson *
16c19800e8SDoug Rabson * 3. Neither the name of PADL Software nor the names of its contributors
17c19800e8SDoug Rabson * may be used to endorse or promote products derived from this software
18c19800e8SDoug Rabson * without specific prior written permission.
19c19800e8SDoug Rabson *
20c19800e8SDoug Rabson * THIS SOFTWARE IS PROVIDED BY PADL SOFTWARE AND CONTRIBUTORS ``AS IS'' AND
21c19800e8SDoug Rabson * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22c19800e8SDoug Rabson * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23c19800e8SDoug Rabson * ARE DISCLAIMED. IN NO EVENT SHALL PADL SOFTWARE OR CONTRIBUTORS BE LIABLE
24c19800e8SDoug Rabson * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25c19800e8SDoug Rabson * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26c19800e8SDoug Rabson * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27c19800e8SDoug Rabson * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28c19800e8SDoug Rabson * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29c19800e8SDoug Rabson * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30c19800e8SDoug Rabson * SUCH DAMAGE.
31c19800e8SDoug Rabson */
32c19800e8SDoug Rabson
33c19800e8SDoug Rabson #include "kcm_locl.h"
34c19800e8SDoug Rabson
35*ae771770SStanislav Sedov RCSID("$Id$");
36c19800e8SDoug Rabson
37c19800e8SDoug Rabson /*
38c19800e8SDoug Rabson * Server-side loopback glue for credentials cache operations; this
39c19800e8SDoug Rabson * must be initialized with kcm_internal_ccache(), it is not for real
40c19800e8SDoug Rabson * use. This entire file assumes the cache is locked, it does not do
41c19800e8SDoug Rabson * any concurrency checking for multithread applications.
42c19800e8SDoug Rabson */
43c19800e8SDoug Rabson
44c19800e8SDoug Rabson #define KCMCACHE(X) ((kcm_ccache)(X)->data.data)
45c19800e8SDoug Rabson #define CACHENAME(X) (KCMCACHE(X)->name)
46c19800e8SDoug Rabson
47c19800e8SDoug Rabson static const char *
kcmss_get_name(krb5_context context,krb5_ccache id)48c19800e8SDoug Rabson kcmss_get_name(krb5_context context,
49c19800e8SDoug Rabson krb5_ccache id)
50c19800e8SDoug Rabson {
51c19800e8SDoug Rabson return CACHENAME(id);
52c19800e8SDoug Rabson }
53c19800e8SDoug Rabson
54c19800e8SDoug Rabson static krb5_error_code
kcmss_resolve(krb5_context context,krb5_ccache * id,const char * res)55c19800e8SDoug Rabson kcmss_resolve(krb5_context context, krb5_ccache *id, const char *res)
56c19800e8SDoug Rabson {
57c19800e8SDoug Rabson return KRB5_FCC_INTERNAL;
58c19800e8SDoug Rabson }
59c19800e8SDoug Rabson
60c19800e8SDoug Rabson static krb5_error_code
kcmss_gen_new(krb5_context context,krb5_ccache * id)61c19800e8SDoug Rabson kcmss_gen_new(krb5_context context, krb5_ccache *id)
62c19800e8SDoug Rabson {
63c19800e8SDoug Rabson return KRB5_FCC_INTERNAL;
64c19800e8SDoug Rabson }
65c19800e8SDoug Rabson
66c19800e8SDoug Rabson static krb5_error_code
kcmss_initialize(krb5_context context,krb5_ccache id,krb5_principal primary_principal)67c19800e8SDoug Rabson kcmss_initialize(krb5_context context,
68c19800e8SDoug Rabson krb5_ccache id,
69c19800e8SDoug Rabson krb5_principal primary_principal)
70c19800e8SDoug Rabson {
71c19800e8SDoug Rabson krb5_error_code ret;
72c19800e8SDoug Rabson kcm_ccache c = KCMCACHE(id);
73c19800e8SDoug Rabson
74c19800e8SDoug Rabson KCM_ASSERT_VALID(c);
75c19800e8SDoug Rabson
76c19800e8SDoug Rabson ret = kcm_zero_ccache_data_internal(context, c);
77c19800e8SDoug Rabson if (ret)
78c19800e8SDoug Rabson return ret;
79c19800e8SDoug Rabson
80c19800e8SDoug Rabson ret = krb5_copy_principal(context, primary_principal,
81c19800e8SDoug Rabson &c->client);
82c19800e8SDoug Rabson
83c19800e8SDoug Rabson return ret;
84c19800e8SDoug Rabson }
85c19800e8SDoug Rabson
86c19800e8SDoug Rabson static krb5_error_code
kcmss_close(krb5_context context,krb5_ccache id)87c19800e8SDoug Rabson kcmss_close(krb5_context context,
88c19800e8SDoug Rabson krb5_ccache id)
89c19800e8SDoug Rabson {
90c19800e8SDoug Rabson kcm_ccache c = KCMCACHE(id);
91c19800e8SDoug Rabson
92c19800e8SDoug Rabson KCM_ASSERT_VALID(c);
93c19800e8SDoug Rabson
94c19800e8SDoug Rabson id->data.data = NULL;
95c19800e8SDoug Rabson id->data.length = 0;
96c19800e8SDoug Rabson
97c19800e8SDoug Rabson return 0;
98c19800e8SDoug Rabson }
99c19800e8SDoug Rabson
100c19800e8SDoug Rabson static krb5_error_code
kcmss_destroy(krb5_context context,krb5_ccache id)101c19800e8SDoug Rabson kcmss_destroy(krb5_context context,
102c19800e8SDoug Rabson krb5_ccache id)
103c19800e8SDoug Rabson {
104c19800e8SDoug Rabson krb5_error_code ret;
105c19800e8SDoug Rabson kcm_ccache c = KCMCACHE(id);
106c19800e8SDoug Rabson
107c19800e8SDoug Rabson KCM_ASSERT_VALID(c);
108c19800e8SDoug Rabson
109c19800e8SDoug Rabson ret = kcm_ccache_destroy(context, CACHENAME(id));
110c19800e8SDoug Rabson
111c19800e8SDoug Rabson return ret;
112c19800e8SDoug Rabson }
113c19800e8SDoug Rabson
114c19800e8SDoug Rabson static krb5_error_code
kcmss_store_cred(krb5_context context,krb5_ccache id,krb5_creds * creds)115c19800e8SDoug Rabson kcmss_store_cred(krb5_context context,
116c19800e8SDoug Rabson krb5_ccache id,
117c19800e8SDoug Rabson krb5_creds *creds)
118c19800e8SDoug Rabson {
119c19800e8SDoug Rabson krb5_error_code ret;
120c19800e8SDoug Rabson kcm_ccache c = KCMCACHE(id);
121c19800e8SDoug Rabson krb5_creds *tmp;
122c19800e8SDoug Rabson
123c19800e8SDoug Rabson KCM_ASSERT_VALID(c);
124c19800e8SDoug Rabson
125c19800e8SDoug Rabson ret = kcm_ccache_store_cred_internal(context, c, creds, 1, &tmp);
126c19800e8SDoug Rabson
127c19800e8SDoug Rabson return ret;
128c19800e8SDoug Rabson }
129c19800e8SDoug Rabson
130c19800e8SDoug Rabson static krb5_error_code
kcmss_retrieve(krb5_context context,krb5_ccache id,krb5_flags which,const krb5_creds * mcred,krb5_creds * creds)131c19800e8SDoug Rabson kcmss_retrieve(krb5_context context,
132c19800e8SDoug Rabson krb5_ccache id,
133c19800e8SDoug Rabson krb5_flags which,
134c19800e8SDoug Rabson const krb5_creds *mcred,
135c19800e8SDoug Rabson krb5_creds *creds)
136c19800e8SDoug Rabson {
137c19800e8SDoug Rabson krb5_error_code ret;
138c19800e8SDoug Rabson kcm_ccache c = KCMCACHE(id);
139c19800e8SDoug Rabson krb5_creds *credp;
140c19800e8SDoug Rabson
141c19800e8SDoug Rabson KCM_ASSERT_VALID(c);
142c19800e8SDoug Rabson
143c19800e8SDoug Rabson ret = kcm_ccache_retrieve_cred_internal(context, c, which,
144c19800e8SDoug Rabson mcred, &credp);
145c19800e8SDoug Rabson if (ret)
146c19800e8SDoug Rabson return ret;
147c19800e8SDoug Rabson
148c19800e8SDoug Rabson ret = krb5_copy_creds_contents(context, credp, creds);
149c19800e8SDoug Rabson if (ret)
150c19800e8SDoug Rabson return ret;
151c19800e8SDoug Rabson
152c19800e8SDoug Rabson return 0;
153c19800e8SDoug Rabson }
154c19800e8SDoug Rabson
155c19800e8SDoug Rabson static krb5_error_code
kcmss_get_principal(krb5_context context,krb5_ccache id,krb5_principal * principal)156c19800e8SDoug Rabson kcmss_get_principal(krb5_context context,
157c19800e8SDoug Rabson krb5_ccache id,
158c19800e8SDoug Rabson krb5_principal *principal)
159c19800e8SDoug Rabson {
160c19800e8SDoug Rabson krb5_error_code ret;
161c19800e8SDoug Rabson kcm_ccache c = KCMCACHE(id);
162c19800e8SDoug Rabson
163c19800e8SDoug Rabson KCM_ASSERT_VALID(c);
164c19800e8SDoug Rabson
165c19800e8SDoug Rabson ret = krb5_copy_principal(context, c->client,
166c19800e8SDoug Rabson principal);
167c19800e8SDoug Rabson
168c19800e8SDoug Rabson return ret;
169c19800e8SDoug Rabson }
170c19800e8SDoug Rabson
171c19800e8SDoug Rabson static krb5_error_code
kcmss_get_first(krb5_context context,krb5_ccache id,krb5_cc_cursor * cursor)172c19800e8SDoug Rabson kcmss_get_first (krb5_context context,
173c19800e8SDoug Rabson krb5_ccache id,
174c19800e8SDoug Rabson krb5_cc_cursor *cursor)
175c19800e8SDoug Rabson {
176c19800e8SDoug Rabson kcm_ccache c = KCMCACHE(id);
177c19800e8SDoug Rabson
178c19800e8SDoug Rabson KCM_ASSERT_VALID(c);
179c19800e8SDoug Rabson
180c19800e8SDoug Rabson *cursor = c->creds;
181c19800e8SDoug Rabson
182c19800e8SDoug Rabson return (*cursor == NULL) ? KRB5_CC_END : 0;
183c19800e8SDoug Rabson }
184c19800e8SDoug Rabson
185c19800e8SDoug Rabson static krb5_error_code
kcmss_get_next(krb5_context context,krb5_ccache id,krb5_cc_cursor * cursor,krb5_creds * creds)186c19800e8SDoug Rabson kcmss_get_next (krb5_context context,
187c19800e8SDoug Rabson krb5_ccache id,
188c19800e8SDoug Rabson krb5_cc_cursor *cursor,
189c19800e8SDoug Rabson krb5_creds *creds)
190c19800e8SDoug Rabson {
191c19800e8SDoug Rabson krb5_error_code ret;
192c19800e8SDoug Rabson kcm_ccache c = KCMCACHE(id);
193c19800e8SDoug Rabson
194c19800e8SDoug Rabson KCM_ASSERT_VALID(c);
195c19800e8SDoug Rabson
196c19800e8SDoug Rabson ret = krb5_copy_creds_contents(context,
197c19800e8SDoug Rabson &((struct kcm_creds *)cursor)->cred,
198c19800e8SDoug Rabson creds);
199c19800e8SDoug Rabson if (ret)
200c19800e8SDoug Rabson return ret;
201c19800e8SDoug Rabson
202c19800e8SDoug Rabson *cursor = ((struct kcm_creds *)cursor)->next;
203c19800e8SDoug Rabson if (*cursor == 0)
204c19800e8SDoug Rabson ret = KRB5_CC_END;
205c19800e8SDoug Rabson
206c19800e8SDoug Rabson return ret;
207c19800e8SDoug Rabson }
208c19800e8SDoug Rabson
209c19800e8SDoug Rabson static krb5_error_code
kcmss_end_get(krb5_context context,krb5_ccache id,krb5_cc_cursor * cursor)210c19800e8SDoug Rabson kcmss_end_get (krb5_context context,
211c19800e8SDoug Rabson krb5_ccache id,
212c19800e8SDoug Rabson krb5_cc_cursor *cursor)
213c19800e8SDoug Rabson {
214c19800e8SDoug Rabson *cursor = NULL;
215c19800e8SDoug Rabson return 0;
216c19800e8SDoug Rabson }
217c19800e8SDoug Rabson
218c19800e8SDoug Rabson static krb5_error_code
kcmss_remove_cred(krb5_context context,krb5_ccache id,krb5_flags which,krb5_creds * cred)219c19800e8SDoug Rabson kcmss_remove_cred(krb5_context context,
220c19800e8SDoug Rabson krb5_ccache id,
221c19800e8SDoug Rabson krb5_flags which,
222c19800e8SDoug Rabson krb5_creds *cred)
223c19800e8SDoug Rabson {
224c19800e8SDoug Rabson krb5_error_code ret;
225c19800e8SDoug Rabson kcm_ccache c = KCMCACHE(id);
226c19800e8SDoug Rabson
227c19800e8SDoug Rabson KCM_ASSERT_VALID(c);
228c19800e8SDoug Rabson
229c19800e8SDoug Rabson ret = kcm_ccache_remove_cred_internal(context, c, which, cred);
230c19800e8SDoug Rabson
231c19800e8SDoug Rabson return ret;
232c19800e8SDoug Rabson }
233c19800e8SDoug Rabson
234c19800e8SDoug Rabson static krb5_error_code
kcmss_set_flags(krb5_context context,krb5_ccache id,krb5_flags flags)235c19800e8SDoug Rabson kcmss_set_flags(krb5_context context,
236c19800e8SDoug Rabson krb5_ccache id,
237c19800e8SDoug Rabson krb5_flags flags)
238c19800e8SDoug Rabson {
239c19800e8SDoug Rabson return 0;
240c19800e8SDoug Rabson }
241c19800e8SDoug Rabson
242c19800e8SDoug Rabson static krb5_error_code
kcmss_get_version(krb5_context context,krb5_ccache id)243c19800e8SDoug Rabson kcmss_get_version(krb5_context context,
244c19800e8SDoug Rabson krb5_ccache id)
245c19800e8SDoug Rabson {
246c19800e8SDoug Rabson return 0;
247c19800e8SDoug Rabson }
248c19800e8SDoug Rabson
249c19800e8SDoug Rabson static const krb5_cc_ops krb5_kcmss_ops = {
250*ae771770SStanislav Sedov KRB5_CC_OPS_VERSION,
251c19800e8SDoug Rabson "KCM",
252c19800e8SDoug Rabson kcmss_get_name,
253c19800e8SDoug Rabson kcmss_resolve,
254c19800e8SDoug Rabson kcmss_gen_new,
255c19800e8SDoug Rabson kcmss_initialize,
256c19800e8SDoug Rabson kcmss_destroy,
257c19800e8SDoug Rabson kcmss_close,
258c19800e8SDoug Rabson kcmss_store_cred,
259c19800e8SDoug Rabson kcmss_retrieve,
260c19800e8SDoug Rabson kcmss_get_principal,
261c19800e8SDoug Rabson kcmss_get_first,
262c19800e8SDoug Rabson kcmss_get_next,
263c19800e8SDoug Rabson kcmss_end_get,
264c19800e8SDoug Rabson kcmss_remove_cred,
265c19800e8SDoug Rabson kcmss_set_flags,
266c19800e8SDoug Rabson kcmss_get_version
267c19800e8SDoug Rabson };
268c19800e8SDoug Rabson
269c19800e8SDoug Rabson krb5_error_code
kcm_internal_ccache(krb5_context context,kcm_ccache c,krb5_ccache id)270c19800e8SDoug Rabson kcm_internal_ccache(krb5_context context,
271c19800e8SDoug Rabson kcm_ccache c,
272c19800e8SDoug Rabson krb5_ccache id)
273c19800e8SDoug Rabson {
274c19800e8SDoug Rabson id->ops = &krb5_kcmss_ops;
275c19800e8SDoug Rabson id->data.length = sizeof(*c);
276c19800e8SDoug Rabson id->data.data = c;
277c19800e8SDoug Rabson
278c19800e8SDoug Rabson return 0;
279c19800e8SDoug Rabson }
280c19800e8SDoug Rabson
281