get.c revision 55682
155682Smarkm/*
255682Smarkm * Copyright (c) 1997, 1998, 1999 Kungliga Tekniska H�gskolan
355682Smarkm * (Royal Institute of Technology, Stockholm, Sweden).
455682Smarkm * All rights reserved.
555682Smarkm *
655682Smarkm * Redistribution and use in source and binary forms, with or without
755682Smarkm * modification, are permitted provided that the following conditions
855682Smarkm * are met:
955682Smarkm *
1055682Smarkm * 1. Redistributions of source code must retain the above copyright
1155682Smarkm *    notice, this list of conditions and the following disclaimer.
1255682Smarkm *
1355682Smarkm * 2. Redistributions in binary form must reproduce the above copyright
1455682Smarkm *    notice, this list of conditions and the following disclaimer in the
1555682Smarkm *    documentation and/or other materials provided with the distribution.
1655682Smarkm *
1755682Smarkm * 3. Neither the name of the Institute nor the names of its contributors
1855682Smarkm *    may be used to endorse or promote products derived from this software
1955682Smarkm *    without specific prior written permission.
2055682Smarkm *
2155682Smarkm * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
2255682Smarkm * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2355682Smarkm * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2455682Smarkm * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
2555682Smarkm * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2655682Smarkm * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2755682Smarkm * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2855682Smarkm * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2955682Smarkm * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
3055682Smarkm * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3155682Smarkm * SUCH DAMAGE.
3255682Smarkm */
3355682Smarkm
3455682Smarkm#include "kadmin_locl.h"
3555682Smarkm#include <parse_units.h>
3655682Smarkm
3755682SmarkmRCSID("$Id: get.c,v 1.8 1999/12/02 17:04:58 joda Exp $");
3855682Smarkm
3955682Smarkmstruct get_entry_data {
4055682Smarkm    void (*header)(void);
4155682Smarkm    void (*format)(kadm5_principal_ent_t);
4255682Smarkm};
4355682Smarkm
4455682Smarkmstatic void
4555682Smarkmprint_entry_terse(kadm5_principal_ent_t princ)
4655682Smarkm{
4755682Smarkm    char *p;
4855682Smarkm    krb5_unparse_name(context, princ->principal, &p);
4955682Smarkm    printf("  %s\n", p);
5055682Smarkm    free(p);
5155682Smarkm}
5255682Smarkm
5355682Smarkmstatic void
5455682Smarkmprint_header_short(void)
5555682Smarkm{
5655682Smarkm    printf("%-20s ", "Principal");
5755682Smarkm
5855682Smarkm    printf("%-10s ", "Expires");
5955682Smarkm
6055682Smarkm    printf("%-10s ", "PW-exp");
6155682Smarkm
6255682Smarkm    printf("%-10s ", "PW-change");
6355682Smarkm
6455682Smarkm    printf("%-9s ", "Max life");
6555682Smarkm
6655682Smarkm    printf("%-9s ", "Max renew");
6755682Smarkm
6855682Smarkm    printf("\n");
6955682Smarkm}
7055682Smarkm
7155682Smarkmstatic void
7255682Smarkmprint_entry_short(kadm5_principal_ent_t princ)
7355682Smarkm{
7455682Smarkm    char buf[1024];
7555682Smarkm
7655682Smarkm    krb5_unparse_name_fixed_short(context, princ->principal, buf, sizeof(buf));
7755682Smarkm    printf("%-20s ", buf);
7855682Smarkm
7955682Smarkm    time_t2str(princ->princ_expire_time, buf, sizeof(buf), 0);
8055682Smarkm    printf("%-10s ", buf);
8155682Smarkm
8255682Smarkm    time_t2str(princ->pw_expiration, buf, sizeof(buf), 0);
8355682Smarkm    printf("%-10s ", buf);
8455682Smarkm
8555682Smarkm    time_t2str(princ->last_pwd_change, buf, sizeof(buf), 0);
8655682Smarkm    printf("%-10s ", buf);
8755682Smarkm
8855682Smarkm    deltat2str(princ->max_life, buf, sizeof(buf));
8955682Smarkm    printf("%-9s ", buf);
9055682Smarkm
9155682Smarkm    deltat2str(princ->max_renewable_life, buf, sizeof(buf));
9255682Smarkm    printf("%-9s ", buf);
9355682Smarkm
9455682Smarkm#if 0
9555682Smarkm    time_t2str(princ->mod_date, buf, sizeof(buf), 0);
9655682Smarkm    printf("%-10s ", buf);
9755682Smarkm
9855682Smarkm    krb5_unparse_name_fixed(context, princ->mod_name, buf, sizeof(buf));
9955682Smarkm    printf("%-24s", buf);
10055682Smarkm#endif
10155682Smarkm
10255682Smarkm    printf("\n");
10355682Smarkm}
10455682Smarkm
10555682Smarkmstatic void
10655682Smarkmprint_entry_long(kadm5_principal_ent_t princ)
10755682Smarkm{
10855682Smarkm    char buf[1024];
10955682Smarkm    int i;
11055682Smarkm
11155682Smarkm    krb5_unparse_name_fixed(context, princ->principal, buf, sizeof(buf));
11255682Smarkm    printf("%24s: %s\n", "Principal", buf);
11355682Smarkm    time_t2str(princ->princ_expire_time, buf, sizeof(buf), 1);
11455682Smarkm    printf("%24s: %s\n", "Principal expires", buf);
11555682Smarkm
11655682Smarkm    time_t2str(princ->pw_expiration, buf, sizeof(buf), 1);
11755682Smarkm    printf("%24s: %s\n", "Password expires", buf);
11855682Smarkm
11955682Smarkm    time_t2str(princ->last_pwd_change, buf, sizeof(buf), 1);
12055682Smarkm    printf("%24s: %s\n", "Last password change", buf);
12155682Smarkm
12255682Smarkm    deltat2str(princ->max_life, buf, sizeof(buf));
12355682Smarkm    printf("%24s: %s\n", "Max ticket life", buf);
12455682Smarkm
12555682Smarkm    deltat2str(princ->max_renewable_life, buf, sizeof(buf));
12655682Smarkm    printf("%24s: %s\n", "Max renewable life", buf);
12755682Smarkm    printf("%24s: %d\n", "Kvno", princ->kvno);
12855682Smarkm    printf("%24s: %d\n", "Mkvno", princ->mkvno);
12955682Smarkm    printf("%24s: %s\n", "Policy", princ->policy ? princ->policy : "none");
13055682Smarkm    time_t2str(princ->last_success, buf, sizeof(buf), 1);
13155682Smarkm    printf("%24s: %s\n", "Last successful login", buf);
13255682Smarkm    time_t2str(princ->last_failed, buf, sizeof(buf), 1);
13355682Smarkm    printf("%24s: %s\n", "Last failed login", buf);
13455682Smarkm    printf("%24s: %d\n", "Failed login count", princ->fail_auth_count);
13555682Smarkm    time_t2str(princ->mod_date, buf, sizeof(buf), 1);
13655682Smarkm    printf("%24s: %s\n", "Last modified", buf);
13755682Smarkm    krb5_unparse_name_fixed(context, princ->mod_name, buf, sizeof(buf));
13855682Smarkm    printf("%24s: %s\n", "Modifier", buf);
13955682Smarkm    attributes2str (princ->attributes, buf, sizeof(buf));
14055682Smarkm    printf("%24s: %s\n", "Attributes", buf);
14155682Smarkm
14255682Smarkm    printf("%24s: ", "Keytypes(salts)");
14355682Smarkm
14455682Smarkm    for (i = 0; i < princ->n_key_data; ++i) {
14555682Smarkm	krb5_key_data *k = &princ->key_data[i];
14655682Smarkm	krb5_error_code ret;
14755682Smarkm	char *e_string, *s_string;
14855682Smarkm
14955682Smarkm	ret = krb5_enctype_to_string (context,
15055682Smarkm				      k->key_data_type[0],
15155682Smarkm				      &e_string);
15255682Smarkm	if (ret)
15355682Smarkm	    asprintf (&e_string, "unknown(%d)", k->key_data_type[0]);
15455682Smarkm
15555682Smarkm	ret = krb5_salttype_to_string (context,
15655682Smarkm				       k->key_data_type[0],
15755682Smarkm				       k->key_data_type[1],
15855682Smarkm				       &s_string);
15955682Smarkm	if (ret)
16055682Smarkm	    asprintf (&s_string, "unknown(%d)", k->key_data_type[1]);
16155682Smarkm
16255682Smarkm	printf ("%s%s(%s)", (i != 0) ? ", " : "", e_string, s_string);
16355682Smarkm	free (e_string);
16455682Smarkm	free (s_string);
16555682Smarkm    }
16655682Smarkm    printf("\n\n");
16755682Smarkm}
16855682Smarkm
16955682Smarkmstatic int
17055682Smarkmdo_get_entry(krb5_principal principal, void *data)
17155682Smarkm{
17255682Smarkm    kadm5_principal_ent_rec princ;
17355682Smarkm    krb5_error_code ret;
17455682Smarkm    struct get_entry_data *e = data;
17555682Smarkm
17655682Smarkm    memset(&princ, 0, sizeof(princ));
17755682Smarkm    ret = kadm5_get_principal(kadm_handle, principal,
17855682Smarkm			      &princ,
17955682Smarkm			      KADM5_PRINCIPAL_NORMAL_MASK|KADM5_KEY_DATA);
18055682Smarkm    if(ret)
18155682Smarkm	return ret;
18255682Smarkm    else {
18355682Smarkm	if(e->header) {
18455682Smarkm	    (*e->header)();
18555682Smarkm	    e->header = NULL; /* XXX only once */
18655682Smarkm	}
18755682Smarkm	(e->format)(&princ);
18855682Smarkm	kadm5_free_principal_ent(kadm_handle, &princ);
18955682Smarkm    }
19055682Smarkm    return 0;
19155682Smarkm}
19255682Smarkm
19355682Smarkmint
19455682Smarkmget_entry(int argc, char **argv)
19555682Smarkm{
19655682Smarkm    int i;
19755682Smarkm    krb5_error_code ret;
19855682Smarkm    struct get_entry_data data;
19955682Smarkm    struct getargs args[] = {
20055682Smarkm	{ "long",	'l',	arg_flag,	NULL, "long format" },
20155682Smarkm	{ "terse",	't',	arg_flag,	NULL, "terse format" },
20255682Smarkm    };
20355682Smarkm    int num_args = sizeof(args) / sizeof(args[0]);
20455682Smarkm    int optind = 0;
20555682Smarkm    int long_flag = 0;
20655682Smarkm    int terse_flag = 0;
20755682Smarkm
20855682Smarkm    args[0].value = &long_flag;
20955682Smarkm    args[1].value = &terse_flag;
21055682Smarkm    if(getarg(args, num_args, argc, argv, &optind))
21155682Smarkm	goto usage;
21255682Smarkm    if(optind == argc)
21355682Smarkm	goto usage;
21455682Smarkm
21555682Smarkm    if(long_flag) {
21655682Smarkm	data.format = print_entry_long;
21755682Smarkm	data.header = NULL;
21855682Smarkm    } else if(terse_flag) {
21955682Smarkm	data.format = print_entry_terse;
22055682Smarkm	data.header = NULL;
22155682Smarkm    } else {
22255682Smarkm	data.format = print_entry_short;
22355682Smarkm	data.header = print_header_short;
22455682Smarkm    }
22555682Smarkm
22655682Smarkm    argc -= optind;
22755682Smarkm    argv += optind;
22855682Smarkm
22955682Smarkm    for(i = 0; i < argc; i++)
23055682Smarkm	ret = foreach_principal(argv[i], do_get_entry, &data);
23155682Smarkm    return 0;
23255682Smarkmusage:
23355682Smarkm    arg_printusage (args, num_args, "get", "principal...");
23455682Smarkm    return 0;
23555682Smarkm}
23655682Smarkm
23755682Smarkmint
23855682Smarkmlist_princs(int argc, char **argv)
23955682Smarkm{
24055682Smarkm    int i;
24155682Smarkm    krb5_error_code ret;
24255682Smarkm    struct get_entry_data data;
24355682Smarkm
24455682Smarkm    data.format = print_entry_terse;
24555682Smarkm    data.header = NULL;
24655682Smarkm
24755682Smarkm    for(i = 1; i < argc; i++)
24855682Smarkm	ret = foreach_principal(argv[i], do_get_entry, &data);
24955682Smarkm    return 0;
25055682Smarkm}
251