1*0a6a1f1dSLionel Sambuc /* $NetBSD: get_princs_s.c,v 1.1.1.2 2014/04/24 12:45:48 pettai Exp $ */
2ebfedea0SLionel Sambuc
3ebfedea0SLionel Sambuc /*
4ebfedea0SLionel Sambuc * Copyright (c) 1997, 1998, 1999 Kungliga Tekniska Högskolan
5ebfedea0SLionel Sambuc * (Royal Institute of Technology, Stockholm, Sweden).
6ebfedea0SLionel Sambuc * All rights reserved.
7ebfedea0SLionel Sambuc *
8ebfedea0SLionel Sambuc * Redistribution and use in source and binary forms, with or without
9ebfedea0SLionel Sambuc * modification, are permitted provided that the following conditions
10ebfedea0SLionel Sambuc * are met:
11ebfedea0SLionel Sambuc *
12ebfedea0SLionel Sambuc * 1. Redistributions of source code must retain the above copyright
13ebfedea0SLionel Sambuc * notice, this list of conditions and the following disclaimer.
14ebfedea0SLionel Sambuc *
15ebfedea0SLionel Sambuc * 2. Redistributions in binary form must reproduce the above copyright
16ebfedea0SLionel Sambuc * notice, this list of conditions and the following disclaimer in the
17ebfedea0SLionel Sambuc * documentation and/or other materials provided with the distribution.
18ebfedea0SLionel Sambuc *
19ebfedea0SLionel Sambuc * 3. Neither the name of the Institute nor the names of its contributors
20ebfedea0SLionel Sambuc * may be used to endorse or promote products derived from this software
21ebfedea0SLionel Sambuc * without specific prior written permission.
22ebfedea0SLionel Sambuc *
23ebfedea0SLionel Sambuc * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
24ebfedea0SLionel Sambuc * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25ebfedea0SLionel Sambuc * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26ebfedea0SLionel Sambuc * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
27ebfedea0SLionel Sambuc * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28ebfedea0SLionel Sambuc * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29ebfedea0SLionel Sambuc * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30ebfedea0SLionel Sambuc * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31ebfedea0SLionel Sambuc * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32ebfedea0SLionel Sambuc * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33ebfedea0SLionel Sambuc * SUCH DAMAGE.
34ebfedea0SLionel Sambuc */
35ebfedea0SLionel Sambuc
36ebfedea0SLionel Sambuc #include "kadm5_locl.h"
37ebfedea0SLionel Sambuc
38*0a6a1f1dSLionel Sambuc __RCSID("NetBSD");
39ebfedea0SLionel Sambuc
40ebfedea0SLionel Sambuc struct foreach_data {
41ebfedea0SLionel Sambuc const char *exp;
42ebfedea0SLionel Sambuc char *exp2;
43ebfedea0SLionel Sambuc char **princs;
44ebfedea0SLionel Sambuc int count;
45ebfedea0SLionel Sambuc };
46ebfedea0SLionel Sambuc
47ebfedea0SLionel Sambuc static krb5_error_code
add_princ(struct foreach_data * d,char * princ)48ebfedea0SLionel Sambuc add_princ(struct foreach_data *d, char *princ)
49ebfedea0SLionel Sambuc {
50ebfedea0SLionel Sambuc char **tmp;
51ebfedea0SLionel Sambuc tmp = realloc(d->princs, (d->count + 1) * sizeof(*tmp));
52ebfedea0SLionel Sambuc if(tmp == NULL)
53ebfedea0SLionel Sambuc return ENOMEM;
54ebfedea0SLionel Sambuc d->princs = tmp;
55ebfedea0SLionel Sambuc d->princs[d->count++] = princ;
56ebfedea0SLionel Sambuc return 0;
57ebfedea0SLionel Sambuc }
58ebfedea0SLionel Sambuc
59ebfedea0SLionel Sambuc static krb5_error_code
foreach(krb5_context context,HDB * db,hdb_entry_ex * ent,void * data)60ebfedea0SLionel Sambuc foreach(krb5_context context, HDB *db, hdb_entry_ex *ent, void *data)
61ebfedea0SLionel Sambuc {
62ebfedea0SLionel Sambuc struct foreach_data *d = data;
63ebfedea0SLionel Sambuc char *princ;
64ebfedea0SLionel Sambuc krb5_error_code ret;
65ebfedea0SLionel Sambuc ret = krb5_unparse_name(context, ent->entry.principal, &princ);
66ebfedea0SLionel Sambuc if(ret)
67ebfedea0SLionel Sambuc return ret;
68ebfedea0SLionel Sambuc if(d->exp){
69ebfedea0SLionel Sambuc if(fnmatch(d->exp, princ, 0) == 0 || fnmatch(d->exp2, princ, 0) == 0)
70ebfedea0SLionel Sambuc ret = add_princ(d, princ);
71ebfedea0SLionel Sambuc else
72ebfedea0SLionel Sambuc free(princ);
73ebfedea0SLionel Sambuc }else{
74ebfedea0SLionel Sambuc ret = add_princ(d, princ);
75ebfedea0SLionel Sambuc }
76ebfedea0SLionel Sambuc if(ret)
77ebfedea0SLionel Sambuc free(princ);
78ebfedea0SLionel Sambuc return ret;
79ebfedea0SLionel Sambuc }
80ebfedea0SLionel Sambuc
81ebfedea0SLionel Sambuc kadm5_ret_t
kadm5_s_get_principals(void * server_handle,const char * expression,char *** princs,int * count)82ebfedea0SLionel Sambuc kadm5_s_get_principals(void *server_handle,
83ebfedea0SLionel Sambuc const char *expression,
84ebfedea0SLionel Sambuc char ***princs,
85ebfedea0SLionel Sambuc int *count)
86ebfedea0SLionel Sambuc {
87ebfedea0SLionel Sambuc struct foreach_data d;
88ebfedea0SLionel Sambuc kadm5_server_context *context = server_handle;
89ebfedea0SLionel Sambuc kadm5_ret_t ret;
90ebfedea0SLionel Sambuc ret = context->db->hdb_open(context->context, context->db, O_RDWR, 0);
91ebfedea0SLionel Sambuc if(ret) {
92ebfedea0SLionel Sambuc krb5_warn(context->context, ret, "opening database");
93ebfedea0SLionel Sambuc return ret;
94ebfedea0SLionel Sambuc }
95ebfedea0SLionel Sambuc d.exp = expression;
96ebfedea0SLionel Sambuc {
97ebfedea0SLionel Sambuc krb5_realm r;
98ebfedea0SLionel Sambuc krb5_get_default_realm(context->context, &r);
99ebfedea0SLionel Sambuc asprintf(&d.exp2, "%s@%s", expression, r);
100ebfedea0SLionel Sambuc free(r);
101ebfedea0SLionel Sambuc }
102ebfedea0SLionel Sambuc d.princs = NULL;
103ebfedea0SLionel Sambuc d.count = 0;
104ebfedea0SLionel Sambuc ret = hdb_foreach(context->context, context->db, HDB_F_ADMIN_DATA, foreach, &d);
105ebfedea0SLionel Sambuc context->db->hdb_close(context->context, context->db);
106ebfedea0SLionel Sambuc if(ret == 0)
107ebfedea0SLionel Sambuc ret = add_princ(&d, NULL);
108ebfedea0SLionel Sambuc if(ret == 0){
109ebfedea0SLionel Sambuc *princs = d.princs;
110ebfedea0SLionel Sambuc *count = d.count - 1;
111ebfedea0SLionel Sambuc }else
112ebfedea0SLionel Sambuc kadm5_free_name_list(context, d.princs, &d.count);
113ebfedea0SLionel Sambuc free(d.exp2);
114ebfedea0SLionel Sambuc return _kadm5_error_code(ret);
115ebfedea0SLionel Sambuc }
116