xref: /minix3/crypto/external/bsd/heimdal/dist/lib/kadm5/iprop-log.c (revision ebfedea0ce5bbe81e252ddf32d732e40fb633fae)
1*ebfedea0SLionel Sambuc /*	$NetBSD: iprop-log.c,v 1.1.1.1 2011/04/13 18:15:29 elric Exp $	*/
2*ebfedea0SLionel Sambuc 
3*ebfedea0SLionel Sambuc /*
4*ebfedea0SLionel Sambuc  * Copyright (c) 1997 - 2005 Kungliga Tekniska Högskolan
5*ebfedea0SLionel Sambuc  * (Royal Institute of Technology, Stockholm, Sweden).
6*ebfedea0SLionel Sambuc  * All rights reserved.
7*ebfedea0SLionel Sambuc  *
8*ebfedea0SLionel Sambuc  * Redistribution and use in source and binary forms, with or without
9*ebfedea0SLionel Sambuc  * modification, are permitted provided that the following conditions
10*ebfedea0SLionel Sambuc  * are met:
11*ebfedea0SLionel Sambuc  *
12*ebfedea0SLionel Sambuc  * 1. Redistributions of source code must retain the above copyright
13*ebfedea0SLionel Sambuc  *    notice, this list of conditions and the following disclaimer.
14*ebfedea0SLionel Sambuc  *
15*ebfedea0SLionel Sambuc  * 2. Redistributions in binary form must reproduce the above copyright
16*ebfedea0SLionel Sambuc  *    notice, this list of conditions and the following disclaimer in the
17*ebfedea0SLionel Sambuc  *    documentation and/or other materials provided with the distribution.
18*ebfedea0SLionel Sambuc  *
19*ebfedea0SLionel Sambuc  * 3. Neither the name of the Institute nor the names of its contributors
20*ebfedea0SLionel Sambuc  *    may be used to endorse or promote products derived from this software
21*ebfedea0SLionel Sambuc  *    without specific prior written permission.
22*ebfedea0SLionel Sambuc  *
23*ebfedea0SLionel Sambuc  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
24*ebfedea0SLionel Sambuc  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25*ebfedea0SLionel Sambuc  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26*ebfedea0SLionel Sambuc  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
27*ebfedea0SLionel Sambuc  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28*ebfedea0SLionel Sambuc  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29*ebfedea0SLionel Sambuc  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30*ebfedea0SLionel Sambuc  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31*ebfedea0SLionel Sambuc  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32*ebfedea0SLionel Sambuc  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33*ebfedea0SLionel Sambuc  * SUCH DAMAGE.
34*ebfedea0SLionel Sambuc  */
35*ebfedea0SLionel Sambuc 
36*ebfedea0SLionel Sambuc #include "iprop.h"
37*ebfedea0SLionel Sambuc #include <krb5/sl.h>
38*ebfedea0SLionel Sambuc #include <krb5/parse_time.h>
39*ebfedea0SLionel Sambuc #include "iprop-commands.h"
40*ebfedea0SLionel Sambuc 
41*ebfedea0SLionel Sambuc __RCSID("$NetBSD: iprop-log.c,v 1.1.1.1 2011/04/13 18:15:29 elric Exp $");
42*ebfedea0SLionel Sambuc 
43*ebfedea0SLionel Sambuc static krb5_context context;
44*ebfedea0SLionel Sambuc 
45*ebfedea0SLionel Sambuc static kadm5_server_context *
46*ebfedea0SLionel Sambuc get_kadmin_context(const char *config_file, char *realm)
47*ebfedea0SLionel Sambuc {
48*ebfedea0SLionel Sambuc     kadm5_config_params conf;
49*ebfedea0SLionel Sambuc     krb5_error_code ret;
50*ebfedea0SLionel Sambuc     void *kadm_handle;
51*ebfedea0SLionel Sambuc     char **files;
52*ebfedea0SLionel Sambuc 
53*ebfedea0SLionel Sambuc     if (config_file == NULL) {
54*ebfedea0SLionel Sambuc 	char *file;
55*ebfedea0SLionel Sambuc 	asprintf(&file, "%s/kdc.conf", hdb_db_dir(context));
56*ebfedea0SLionel Sambuc 	if (file == NULL)
57*ebfedea0SLionel Sambuc 	    errx(1, "out of memory");
58*ebfedea0SLionel Sambuc 	config_file = file;
59*ebfedea0SLionel Sambuc     }
60*ebfedea0SLionel Sambuc 
61*ebfedea0SLionel Sambuc     ret = krb5_prepend_config_files_default(config_file, &files);
62*ebfedea0SLionel Sambuc     if (ret)
63*ebfedea0SLionel Sambuc 	krb5_err(context, 1, ret, "getting configuration files");
64*ebfedea0SLionel Sambuc 
65*ebfedea0SLionel Sambuc     ret = krb5_set_config_files(context, files);
66*ebfedea0SLionel Sambuc     krb5_free_config_files(files);
67*ebfedea0SLionel Sambuc     if (ret)
68*ebfedea0SLionel Sambuc 	krb5_err(context, 1, ret, "reading configuration files");
69*ebfedea0SLionel Sambuc 
70*ebfedea0SLionel Sambuc     memset(&conf, 0, sizeof(conf));
71*ebfedea0SLionel Sambuc     if(realm) {
72*ebfedea0SLionel Sambuc 	conf.mask |= KADM5_CONFIG_REALM;
73*ebfedea0SLionel Sambuc 	conf.realm = realm;
74*ebfedea0SLionel Sambuc     }
75*ebfedea0SLionel Sambuc 
76*ebfedea0SLionel Sambuc     ret = kadm5_init_with_password_ctx (context,
77*ebfedea0SLionel Sambuc 					KADM5_ADMIN_SERVICE,
78*ebfedea0SLionel Sambuc 					NULL,
79*ebfedea0SLionel Sambuc 					KADM5_ADMIN_SERVICE,
80*ebfedea0SLionel Sambuc 					&conf, 0, 0,
81*ebfedea0SLionel Sambuc 					&kadm_handle);
82*ebfedea0SLionel Sambuc     if (ret)
83*ebfedea0SLionel Sambuc 	krb5_err (context, 1, ret, "kadm5_init_with_password_ctx");
84*ebfedea0SLionel Sambuc 
85*ebfedea0SLionel Sambuc     return (kadm5_server_context *)kadm_handle;
86*ebfedea0SLionel Sambuc }
87*ebfedea0SLionel Sambuc 
88*ebfedea0SLionel Sambuc /*
89*ebfedea0SLionel Sambuc  * dump log
90*ebfedea0SLionel Sambuc  */
91*ebfedea0SLionel Sambuc 
92*ebfedea0SLionel Sambuc static const char *op_names[] = {
93*ebfedea0SLionel Sambuc     "get",
94*ebfedea0SLionel Sambuc     "delete",
95*ebfedea0SLionel Sambuc     "create",
96*ebfedea0SLionel Sambuc     "rename",
97*ebfedea0SLionel Sambuc     "chpass",
98*ebfedea0SLionel Sambuc     "modify",
99*ebfedea0SLionel Sambuc     "randkey",
100*ebfedea0SLionel Sambuc     "get_privs",
101*ebfedea0SLionel Sambuc     "get_princs",
102*ebfedea0SLionel Sambuc     "chpass_with_key",
103*ebfedea0SLionel Sambuc     "nop"
104*ebfedea0SLionel Sambuc };
105*ebfedea0SLionel Sambuc 
106*ebfedea0SLionel Sambuc static void
107*ebfedea0SLionel Sambuc print_entry(kadm5_server_context *server_context,
108*ebfedea0SLionel Sambuc 	    uint32_t ver,
109*ebfedea0SLionel Sambuc 	    time_t timestamp,
110*ebfedea0SLionel Sambuc 	    enum kadm_ops op,
111*ebfedea0SLionel Sambuc 	    uint32_t len,
112*ebfedea0SLionel Sambuc 	    krb5_storage *sp,
113*ebfedea0SLionel Sambuc 	    void *ctx)
114*ebfedea0SLionel Sambuc {
115*ebfedea0SLionel Sambuc     char t[256];
116*ebfedea0SLionel Sambuc     int32_t mask;
117*ebfedea0SLionel Sambuc     hdb_entry ent;
118*ebfedea0SLionel Sambuc     krb5_principal source;
119*ebfedea0SLionel Sambuc     char *name1, *name2;
120*ebfedea0SLionel Sambuc     krb5_data data;
121*ebfedea0SLionel Sambuc     krb5_context scontext = server_context->context;
122*ebfedea0SLionel Sambuc 
123*ebfedea0SLionel Sambuc     off_t end = krb5_storage_seek(sp, 0, SEEK_CUR) + len;
124*ebfedea0SLionel Sambuc 
125*ebfedea0SLionel Sambuc     krb5_error_code ret;
126*ebfedea0SLionel Sambuc 
127*ebfedea0SLionel Sambuc     strftime(t, sizeof(t), "%Y-%m-%d %H:%M:%S", localtime(&timestamp));
128*ebfedea0SLionel Sambuc 
129*ebfedea0SLionel Sambuc     if(op < kadm_get || op > kadm_nop) {
130*ebfedea0SLionel Sambuc 	printf("unknown op: %d\n", op);
131*ebfedea0SLionel Sambuc 	krb5_storage_seek(sp, end, SEEK_SET);
132*ebfedea0SLionel Sambuc 	return;
133*ebfedea0SLionel Sambuc     }
134*ebfedea0SLionel Sambuc 
135*ebfedea0SLionel Sambuc     printf ("%s: ver = %u, timestamp = %s, len = %u\n",
136*ebfedea0SLionel Sambuc 	    op_names[op], ver, t, len);
137*ebfedea0SLionel Sambuc     switch(op) {
138*ebfedea0SLionel Sambuc     case kadm_delete:
139*ebfedea0SLionel Sambuc 	krb5_ret_principal(sp, &source);
140*ebfedea0SLionel Sambuc 	krb5_unparse_name(scontext, source, &name1);
141*ebfedea0SLionel Sambuc 	printf("    %s\n", name1);
142*ebfedea0SLionel Sambuc 	free(name1);
143*ebfedea0SLionel Sambuc 	krb5_free_principal(scontext, source);
144*ebfedea0SLionel Sambuc 	break;
145*ebfedea0SLionel Sambuc     case kadm_rename:
146*ebfedea0SLionel Sambuc 	ret = krb5_data_alloc(&data, len);
147*ebfedea0SLionel Sambuc 	if (ret)
148*ebfedea0SLionel Sambuc 	    krb5_err (scontext, 1, ret, "kadm_rename: data alloc: %d", len);
149*ebfedea0SLionel Sambuc 	krb5_ret_principal(sp, &source);
150*ebfedea0SLionel Sambuc 	krb5_storage_read(sp, data.data, data.length);
151*ebfedea0SLionel Sambuc 	hdb_value2entry(scontext, &data, &ent);
152*ebfedea0SLionel Sambuc 	krb5_unparse_name(scontext, source, &name1);
153*ebfedea0SLionel Sambuc 	krb5_unparse_name(scontext, ent.principal, &name2);
154*ebfedea0SLionel Sambuc 	printf("    %s -> %s\n", name1, name2);
155*ebfedea0SLionel Sambuc 	free(name1);
156*ebfedea0SLionel Sambuc 	free(name2);
157*ebfedea0SLionel Sambuc 	krb5_free_principal(scontext, source);
158*ebfedea0SLionel Sambuc 	free_hdb_entry(&ent);
159*ebfedea0SLionel Sambuc 	break;
160*ebfedea0SLionel Sambuc     case kadm_create:
161*ebfedea0SLionel Sambuc 	ret = krb5_data_alloc(&data, len);
162*ebfedea0SLionel Sambuc 	if (ret)
163*ebfedea0SLionel Sambuc 	    krb5_err (scontext, 1, ret, "kadm_create: data alloc: %d", len);
164*ebfedea0SLionel Sambuc 	krb5_storage_read(sp, data.data, data.length);
165*ebfedea0SLionel Sambuc 	ret = hdb_value2entry(scontext, &data, &ent);
166*ebfedea0SLionel Sambuc 	if(ret)
167*ebfedea0SLionel Sambuc 	    abort();
168*ebfedea0SLionel Sambuc 	mask = ~0;
169*ebfedea0SLionel Sambuc 	goto foo;
170*ebfedea0SLionel Sambuc     case kadm_modify:
171*ebfedea0SLionel Sambuc 	ret = krb5_data_alloc(&data, len);
172*ebfedea0SLionel Sambuc 	if (ret)
173*ebfedea0SLionel Sambuc 	    krb5_err (scontext, 1, ret, "kadm_modify: data alloc: %d", len);
174*ebfedea0SLionel Sambuc 	krb5_ret_int32(sp, &mask);
175*ebfedea0SLionel Sambuc 	krb5_storage_read(sp, data.data, data.length);
176*ebfedea0SLionel Sambuc 	ret = hdb_value2entry(scontext, &data, &ent);
177*ebfedea0SLionel Sambuc 	if(ret)
178*ebfedea0SLionel Sambuc 	    abort();
179*ebfedea0SLionel Sambuc     foo:
180*ebfedea0SLionel Sambuc 	if(ent.principal /* mask & KADM5_PRINCIPAL */) {
181*ebfedea0SLionel Sambuc 	    krb5_unparse_name(scontext, ent.principal, &name1);
182*ebfedea0SLionel Sambuc 	    printf("    principal = %s\n", name1);
183*ebfedea0SLionel Sambuc 	    free(name1);
184*ebfedea0SLionel Sambuc 	}
185*ebfedea0SLionel Sambuc 	if(mask & KADM5_PRINC_EXPIRE_TIME) {
186*ebfedea0SLionel Sambuc 	    if(ent.valid_end == NULL) {
187*ebfedea0SLionel Sambuc 		strlcpy(t, "never", sizeof(t));
188*ebfedea0SLionel Sambuc 	    } else {
189*ebfedea0SLionel Sambuc 		strftime(t, sizeof(t), "%Y-%m-%d %H:%M:%S",
190*ebfedea0SLionel Sambuc 			 localtime(ent.valid_end));
191*ebfedea0SLionel Sambuc 	    }
192*ebfedea0SLionel Sambuc 	    printf("    expires = %s\n", t);
193*ebfedea0SLionel Sambuc 	}
194*ebfedea0SLionel Sambuc 	if(mask & KADM5_PW_EXPIRATION) {
195*ebfedea0SLionel Sambuc 	    if(ent.pw_end == NULL) {
196*ebfedea0SLionel Sambuc 		strlcpy(t, "never", sizeof(t));
197*ebfedea0SLionel Sambuc 	    } else {
198*ebfedea0SLionel Sambuc 		strftime(t, sizeof(t), "%Y-%m-%d %H:%M:%S",
199*ebfedea0SLionel Sambuc 			 localtime(ent.pw_end));
200*ebfedea0SLionel Sambuc 	    }
201*ebfedea0SLionel Sambuc 	    printf("    password exp = %s\n", t);
202*ebfedea0SLionel Sambuc 	}
203*ebfedea0SLionel Sambuc 	if(mask & KADM5_LAST_PWD_CHANGE) {
204*ebfedea0SLionel Sambuc 	}
205*ebfedea0SLionel Sambuc 	if(mask & KADM5_ATTRIBUTES) {
206*ebfedea0SLionel Sambuc 	    unparse_flags(HDBFlags2int(ent.flags),
207*ebfedea0SLionel Sambuc 			  asn1_HDBFlags_units(), t, sizeof(t));
208*ebfedea0SLionel Sambuc 	    printf("    attributes = %s\n", t);
209*ebfedea0SLionel Sambuc 	}
210*ebfedea0SLionel Sambuc 	if(mask & KADM5_MAX_LIFE) {
211*ebfedea0SLionel Sambuc 	    if(ent.max_life == NULL)
212*ebfedea0SLionel Sambuc 		strlcpy(t, "for ever", sizeof(t));
213*ebfedea0SLionel Sambuc 	    else
214*ebfedea0SLionel Sambuc 		unparse_time(*ent.max_life, t, sizeof(t));
215*ebfedea0SLionel Sambuc 	    printf("    max life = %s\n", t);
216*ebfedea0SLionel Sambuc 	}
217*ebfedea0SLionel Sambuc 	if(mask & KADM5_MAX_RLIFE) {
218*ebfedea0SLionel Sambuc 	    if(ent.max_renew == NULL)
219*ebfedea0SLionel Sambuc 		strlcpy(t, "for ever", sizeof(t));
220*ebfedea0SLionel Sambuc 	    else
221*ebfedea0SLionel Sambuc 		unparse_time(*ent.max_renew, t, sizeof(t));
222*ebfedea0SLionel Sambuc 	    printf("    max rlife = %s\n", t);
223*ebfedea0SLionel Sambuc 	}
224*ebfedea0SLionel Sambuc 	if(mask & KADM5_MOD_TIME) {
225*ebfedea0SLionel Sambuc 	    printf("    mod time\n");
226*ebfedea0SLionel Sambuc 	}
227*ebfedea0SLionel Sambuc 	if(mask & KADM5_MOD_NAME) {
228*ebfedea0SLionel Sambuc 	    printf("    mod name\n");
229*ebfedea0SLionel Sambuc 	}
230*ebfedea0SLionel Sambuc 	if(mask & KADM5_KVNO) {
231*ebfedea0SLionel Sambuc 	    printf("    kvno = %d\n", ent.kvno);
232*ebfedea0SLionel Sambuc 	}
233*ebfedea0SLionel Sambuc 	if(mask & KADM5_MKVNO) {
234*ebfedea0SLionel Sambuc 	    printf("    mkvno\n");
235*ebfedea0SLionel Sambuc 	}
236*ebfedea0SLionel Sambuc 	if(mask & KADM5_AUX_ATTRIBUTES) {
237*ebfedea0SLionel Sambuc 	    printf("    aux attributes\n");
238*ebfedea0SLionel Sambuc 	}
239*ebfedea0SLionel Sambuc 	if(mask & KADM5_POLICY) {
240*ebfedea0SLionel Sambuc 	    printf("    policy\n");
241*ebfedea0SLionel Sambuc 	}
242*ebfedea0SLionel Sambuc 	if(mask & KADM5_POLICY_CLR) {
243*ebfedea0SLionel Sambuc 	    printf("    mod time\n");
244*ebfedea0SLionel Sambuc 	}
245*ebfedea0SLionel Sambuc 	if(mask & KADM5_LAST_SUCCESS) {
246*ebfedea0SLionel Sambuc 	    printf("    last success\n");
247*ebfedea0SLionel Sambuc 	}
248*ebfedea0SLionel Sambuc 	if(mask & KADM5_LAST_FAILED) {
249*ebfedea0SLionel Sambuc 	    printf("    last failed\n");
250*ebfedea0SLionel Sambuc 	}
251*ebfedea0SLionel Sambuc 	if(mask & KADM5_FAIL_AUTH_COUNT) {
252*ebfedea0SLionel Sambuc 	    printf("    fail auth count\n");
253*ebfedea0SLionel Sambuc 	}
254*ebfedea0SLionel Sambuc 	if(mask & KADM5_KEY_DATA) {
255*ebfedea0SLionel Sambuc 	    printf("    key data\n");
256*ebfedea0SLionel Sambuc 	}
257*ebfedea0SLionel Sambuc 	if(mask & KADM5_TL_DATA) {
258*ebfedea0SLionel Sambuc 	    printf("    tl data\n");
259*ebfedea0SLionel Sambuc 	}
260*ebfedea0SLionel Sambuc 	free_hdb_entry(&ent);
261*ebfedea0SLionel Sambuc 	break;
262*ebfedea0SLionel Sambuc     case kadm_nop :
263*ebfedea0SLionel Sambuc 	break;
264*ebfedea0SLionel Sambuc     default:
265*ebfedea0SLionel Sambuc 	abort();
266*ebfedea0SLionel Sambuc     }
267*ebfedea0SLionel Sambuc     krb5_storage_seek(sp, end, SEEK_SET);
268*ebfedea0SLionel Sambuc }
269*ebfedea0SLionel Sambuc 
270*ebfedea0SLionel Sambuc int
271*ebfedea0SLionel Sambuc iprop_dump(struct dump_options *opt, int argc, char **argv)
272*ebfedea0SLionel Sambuc {
273*ebfedea0SLionel Sambuc     kadm5_server_context *server_context;
274*ebfedea0SLionel Sambuc     krb5_error_code ret;
275*ebfedea0SLionel Sambuc 
276*ebfedea0SLionel Sambuc     server_context = get_kadmin_context(opt->config_file_string,
277*ebfedea0SLionel Sambuc 					opt->realm_string);
278*ebfedea0SLionel Sambuc 
279*ebfedea0SLionel Sambuc     ret = kadm5_log_init (server_context);
280*ebfedea0SLionel Sambuc     if (ret)
281*ebfedea0SLionel Sambuc 	krb5_err (context, 1, ret, "kadm5_log_init");
282*ebfedea0SLionel Sambuc 
283*ebfedea0SLionel Sambuc     ret = kadm5_log_foreach (server_context, print_entry, NULL);
284*ebfedea0SLionel Sambuc     if(ret)
285*ebfedea0SLionel Sambuc 	krb5_warn(context, ret, "kadm5_log_foreach");
286*ebfedea0SLionel Sambuc 
287*ebfedea0SLionel Sambuc     ret = kadm5_log_end (server_context);
288*ebfedea0SLionel Sambuc     if (ret)
289*ebfedea0SLionel Sambuc 	krb5_warn(context, ret, "kadm5_log_end");
290*ebfedea0SLionel Sambuc     return 0;
291*ebfedea0SLionel Sambuc }
292*ebfedea0SLionel Sambuc 
293*ebfedea0SLionel Sambuc int
294*ebfedea0SLionel Sambuc iprop_truncate(struct truncate_options *opt, int argc, char **argv)
295*ebfedea0SLionel Sambuc {
296*ebfedea0SLionel Sambuc     kadm5_server_context *server_context;
297*ebfedea0SLionel Sambuc     krb5_error_code ret;
298*ebfedea0SLionel Sambuc 
299*ebfedea0SLionel Sambuc     server_context = get_kadmin_context(opt->config_file_string,
300*ebfedea0SLionel Sambuc 					opt->realm_string);
301*ebfedea0SLionel Sambuc 
302*ebfedea0SLionel Sambuc     ret = kadm5_log_truncate (server_context);
303*ebfedea0SLionel Sambuc     if (ret)
304*ebfedea0SLionel Sambuc 	krb5_err (context, 1, ret, "kadm5_log_truncate");
305*ebfedea0SLionel Sambuc 
306*ebfedea0SLionel Sambuc     return 0;
307*ebfedea0SLionel Sambuc }
308*ebfedea0SLionel Sambuc 
309*ebfedea0SLionel Sambuc int
310*ebfedea0SLionel Sambuc last_version(struct last_version_options *opt, int argc, char **argv)
311*ebfedea0SLionel Sambuc {
312*ebfedea0SLionel Sambuc     kadm5_server_context *server_context;
313*ebfedea0SLionel Sambuc     krb5_error_code ret;
314*ebfedea0SLionel Sambuc     uint32_t version;
315*ebfedea0SLionel Sambuc 
316*ebfedea0SLionel Sambuc     server_context = get_kadmin_context(opt->config_file_string,
317*ebfedea0SLionel Sambuc 					opt->realm_string);
318*ebfedea0SLionel Sambuc 
319*ebfedea0SLionel Sambuc     ret = kadm5_log_init (server_context);
320*ebfedea0SLionel Sambuc     if (ret)
321*ebfedea0SLionel Sambuc 	krb5_err (context, 1, ret, "kadm5_log_init");
322*ebfedea0SLionel Sambuc 
323*ebfedea0SLionel Sambuc     ret = kadm5_log_get_version (server_context, &version);
324*ebfedea0SLionel Sambuc     if (ret)
325*ebfedea0SLionel Sambuc 	krb5_err (context, 1, ret, "kadm5_log_get_version");
326*ebfedea0SLionel Sambuc 
327*ebfedea0SLionel Sambuc     ret = kadm5_log_end (server_context);
328*ebfedea0SLionel Sambuc     if (ret)
329*ebfedea0SLionel Sambuc 	krb5_warn(context, ret, "kadm5_log_end");
330*ebfedea0SLionel Sambuc 
331*ebfedea0SLionel Sambuc     printf("version: %lu\n", (unsigned long)version);
332*ebfedea0SLionel Sambuc 
333*ebfedea0SLionel Sambuc     return 0;
334*ebfedea0SLionel Sambuc }
335*ebfedea0SLionel Sambuc 
336*ebfedea0SLionel Sambuc /*
337*ebfedea0SLionel Sambuc  * Replay log
338*ebfedea0SLionel Sambuc  */
339*ebfedea0SLionel Sambuc 
340*ebfedea0SLionel Sambuc int start_version = -1;
341*ebfedea0SLionel Sambuc int end_version = -1;
342*ebfedea0SLionel Sambuc 
343*ebfedea0SLionel Sambuc static void
344*ebfedea0SLionel Sambuc apply_entry(kadm5_server_context *server_context,
345*ebfedea0SLionel Sambuc 	    uint32_t ver,
346*ebfedea0SLionel Sambuc 	    time_t timestamp,
347*ebfedea0SLionel Sambuc 	    enum kadm_ops op,
348*ebfedea0SLionel Sambuc 	    uint32_t len,
349*ebfedea0SLionel Sambuc 	    krb5_storage *sp,
350*ebfedea0SLionel Sambuc 	    void *ctx)
351*ebfedea0SLionel Sambuc {
352*ebfedea0SLionel Sambuc     struct replay_options *opt = ctx;
353*ebfedea0SLionel Sambuc     krb5_error_code ret;
354*ebfedea0SLionel Sambuc 
355*ebfedea0SLionel Sambuc     if((opt->start_version_integer != -1 && ver < opt->start_version_integer) ||
356*ebfedea0SLionel Sambuc        (opt->end_version_integer != -1 && ver > opt->end_version_integer)) {
357*ebfedea0SLionel Sambuc 	/* XXX skip this entry */
358*ebfedea0SLionel Sambuc 	krb5_storage_seek(sp, len, SEEK_CUR);
359*ebfedea0SLionel Sambuc 	return;
360*ebfedea0SLionel Sambuc     }
361*ebfedea0SLionel Sambuc     printf ("ver %u... ", ver);
362*ebfedea0SLionel Sambuc     fflush (stdout);
363*ebfedea0SLionel Sambuc 
364*ebfedea0SLionel Sambuc     ret = kadm5_log_replay (server_context,
365*ebfedea0SLionel Sambuc 			    op, ver, len, sp);
366*ebfedea0SLionel Sambuc     if (ret)
367*ebfedea0SLionel Sambuc 	krb5_warn (server_context->context, ret, "kadm5_log_replay");
368*ebfedea0SLionel Sambuc 
369*ebfedea0SLionel Sambuc     printf ("done\n");
370*ebfedea0SLionel Sambuc }
371*ebfedea0SLionel Sambuc 
372*ebfedea0SLionel Sambuc int
373*ebfedea0SLionel Sambuc iprop_replay(struct replay_options *opt, int argc, char **argv)
374*ebfedea0SLionel Sambuc {
375*ebfedea0SLionel Sambuc     kadm5_server_context *server_context;
376*ebfedea0SLionel Sambuc     krb5_error_code ret;
377*ebfedea0SLionel Sambuc 
378*ebfedea0SLionel Sambuc     server_context = get_kadmin_context(opt->config_file_string,
379*ebfedea0SLionel Sambuc 					opt->realm_string);
380*ebfedea0SLionel Sambuc 
381*ebfedea0SLionel Sambuc     ret = server_context->db->hdb_open(context,
382*ebfedea0SLionel Sambuc 				       server_context->db,
383*ebfedea0SLionel Sambuc 				       O_RDWR | O_CREAT, 0600);
384*ebfedea0SLionel Sambuc     if (ret)
385*ebfedea0SLionel Sambuc 	krb5_err (context, 1, ret, "db->open");
386*ebfedea0SLionel Sambuc 
387*ebfedea0SLionel Sambuc     ret = kadm5_log_init (server_context);
388*ebfedea0SLionel Sambuc     if (ret)
389*ebfedea0SLionel Sambuc 	krb5_err (context, 1, ret, "kadm5_log_init");
390*ebfedea0SLionel Sambuc 
391*ebfedea0SLionel Sambuc     ret = kadm5_log_foreach (server_context, apply_entry, opt);
392*ebfedea0SLionel Sambuc     if(ret)
393*ebfedea0SLionel Sambuc 	krb5_warn(context, ret, "kadm5_log_foreach");
394*ebfedea0SLionel Sambuc     ret = kadm5_log_end (server_context);
395*ebfedea0SLionel Sambuc     if (ret)
396*ebfedea0SLionel Sambuc 	krb5_warn(context, ret, "kadm5_log_end");
397*ebfedea0SLionel Sambuc     ret = server_context->db->hdb_close (context, server_context->db);
398*ebfedea0SLionel Sambuc     if (ret)
399*ebfedea0SLionel Sambuc 	krb5_err (context, 1, ret, "db->close");
400*ebfedea0SLionel Sambuc 
401*ebfedea0SLionel Sambuc     return 0;
402*ebfedea0SLionel Sambuc }
403*ebfedea0SLionel Sambuc 
404*ebfedea0SLionel Sambuc static int help_flag;
405*ebfedea0SLionel Sambuc static int version_flag;
406*ebfedea0SLionel Sambuc 
407*ebfedea0SLionel Sambuc static struct getargs args[] = {
408*ebfedea0SLionel Sambuc     { "version", 	0,	arg_flag, 	&version_flag,
409*ebfedea0SLionel Sambuc       NULL,		NULL
410*ebfedea0SLionel Sambuc     },
411*ebfedea0SLionel Sambuc     { "help", 	'h', 	arg_flag, 	&help_flag,
412*ebfedea0SLionel Sambuc       NULL, NULL
413*ebfedea0SLionel Sambuc     }
414*ebfedea0SLionel Sambuc };
415*ebfedea0SLionel Sambuc 
416*ebfedea0SLionel Sambuc static int num_args = sizeof(args) / sizeof(args[0]);
417*ebfedea0SLionel Sambuc 
418*ebfedea0SLionel Sambuc int
419*ebfedea0SLionel Sambuc help(void *opt, int argc, char **argv)
420*ebfedea0SLionel Sambuc {
421*ebfedea0SLionel Sambuc     if(argc == 0) {
422*ebfedea0SLionel Sambuc 	sl_help(commands, 1, argv - 1 /* XXX */);
423*ebfedea0SLionel Sambuc     } else {
424*ebfedea0SLionel Sambuc 	SL_cmd *c = sl_match (commands, argv[0], 0);
425*ebfedea0SLionel Sambuc  	if(c == NULL) {
426*ebfedea0SLionel Sambuc 	    fprintf (stderr, "No such command: %s. "
427*ebfedea0SLionel Sambuc 		     "Try \"help\" for a list of commands\n",
428*ebfedea0SLionel Sambuc 		     argv[0]);
429*ebfedea0SLionel Sambuc 	} else {
430*ebfedea0SLionel Sambuc 	    if(c->func) {
431*ebfedea0SLionel Sambuc 		char *fake[] = { NULL, "--help", NULL };
432*ebfedea0SLionel Sambuc 		fake[0] = argv[0];
433*ebfedea0SLionel Sambuc 		(*c->func)(2, fake);
434*ebfedea0SLionel Sambuc 		fprintf(stderr, "\n");
435*ebfedea0SLionel Sambuc 	    }
436*ebfedea0SLionel Sambuc 	    if(c->help && *c->help)
437*ebfedea0SLionel Sambuc 		fprintf (stderr, "%s\n", c->help);
438*ebfedea0SLionel Sambuc 	    if((++c)->name && c->func == NULL) {
439*ebfedea0SLionel Sambuc 		int f = 0;
440*ebfedea0SLionel Sambuc 		fprintf (stderr, "Synonyms:");
441*ebfedea0SLionel Sambuc 		while (c->name && c->func == NULL) {
442*ebfedea0SLionel Sambuc 		    fprintf (stderr, "%s%s", f ? ", " : " ", (c++)->name);
443*ebfedea0SLionel Sambuc 		    f = 1;
444*ebfedea0SLionel Sambuc 		}
445*ebfedea0SLionel Sambuc 		fprintf (stderr, "\n");
446*ebfedea0SLionel Sambuc 	    }
447*ebfedea0SLionel Sambuc 	}
448*ebfedea0SLionel Sambuc     }
449*ebfedea0SLionel Sambuc     return 0;
450*ebfedea0SLionel Sambuc }
451*ebfedea0SLionel Sambuc 
452*ebfedea0SLionel Sambuc static void
453*ebfedea0SLionel Sambuc usage(int status)
454*ebfedea0SLionel Sambuc {
455*ebfedea0SLionel Sambuc     arg_printusage(args, num_args, NULL, "command");
456*ebfedea0SLionel Sambuc     exit(status);
457*ebfedea0SLionel Sambuc }
458*ebfedea0SLionel Sambuc 
459*ebfedea0SLionel Sambuc int
460*ebfedea0SLionel Sambuc main(int argc, char **argv)
461*ebfedea0SLionel Sambuc {
462*ebfedea0SLionel Sambuc     int optidx = 0;
463*ebfedea0SLionel Sambuc     krb5_error_code ret;
464*ebfedea0SLionel Sambuc 
465*ebfedea0SLionel Sambuc     setprogname(argv[0]);
466*ebfedea0SLionel Sambuc 
467*ebfedea0SLionel Sambuc     if(getarg(args, num_args, argc, argv, &optidx))
468*ebfedea0SLionel Sambuc 	usage(1);
469*ebfedea0SLionel Sambuc     if(help_flag)
470*ebfedea0SLionel Sambuc 	usage(0);
471*ebfedea0SLionel Sambuc     if(version_flag) {
472*ebfedea0SLionel Sambuc 	print_version(NULL);
473*ebfedea0SLionel Sambuc 	exit(0);
474*ebfedea0SLionel Sambuc     }
475*ebfedea0SLionel Sambuc     argc -= optidx;
476*ebfedea0SLionel Sambuc     argv += optidx;
477*ebfedea0SLionel Sambuc     if(argc == 0)
478*ebfedea0SLionel Sambuc 	usage(1);
479*ebfedea0SLionel Sambuc 
480*ebfedea0SLionel Sambuc     ret = krb5_init_context(&context);
481*ebfedea0SLionel Sambuc     if (ret)
482*ebfedea0SLionel Sambuc 	errx(1, "krb5_init_context failed with: %d\n", ret);
483*ebfedea0SLionel Sambuc 
484*ebfedea0SLionel Sambuc     ret = sl_command(commands, argc, argv);
485*ebfedea0SLionel Sambuc     if(ret == -1)
486*ebfedea0SLionel Sambuc 	warnx ("unrecognized command: %s", argv[0]);
487*ebfedea0SLionel Sambuc     return ret;
488*ebfedea0SLionel Sambuc }
489