get.c revision 72445
155682Smarkm/*
272445Sassar * Copyright (c) 1997-2000 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
3772445SassarRCSID("$Id: get.c,v 1.12 2000/12/15 14:24:24 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
10572445Sassar/*
10672445Sassar * return 0 iff `salt' actually is the same as the current salt in `k'
10772445Sassar */
10872445Sassar
10972445Sassarstatic int
11072445Sassarcmp_salt (const krb5_salt *salt, const krb5_key_data *k)
11172445Sassar{
11272445Sassar    if (salt->salttype != k->key_data_type[1])
11372445Sassar	return 1;
11472445Sassar    if (salt->saltvalue.length != k->key_data_length[1])
11572445Sassar	return 1;
11672445Sassar    return memcmp (salt->saltvalue.data, k->key_data_contents[1],
11772445Sassar		   salt->saltvalue.length);
11872445Sassar}
11972445Sassar
12055682Smarkmstatic void
12155682Smarkmprint_entry_long(kadm5_principal_ent_t princ)
12255682Smarkm{
12355682Smarkm    char buf[1024];
12455682Smarkm    int i;
12572445Sassar    krb5_salt def_salt;
12655682Smarkm
12755682Smarkm    krb5_unparse_name_fixed(context, princ->principal, buf, sizeof(buf));
12855682Smarkm    printf("%24s: %s\n", "Principal", buf);
12955682Smarkm    time_t2str(princ->princ_expire_time, buf, sizeof(buf), 1);
13055682Smarkm    printf("%24s: %s\n", "Principal expires", buf);
13155682Smarkm
13255682Smarkm    time_t2str(princ->pw_expiration, buf, sizeof(buf), 1);
13355682Smarkm    printf("%24s: %s\n", "Password expires", buf);
13455682Smarkm
13555682Smarkm    time_t2str(princ->last_pwd_change, buf, sizeof(buf), 1);
13655682Smarkm    printf("%24s: %s\n", "Last password change", buf);
13755682Smarkm
13855682Smarkm    deltat2str(princ->max_life, buf, sizeof(buf));
13955682Smarkm    printf("%24s: %s\n", "Max ticket life", buf);
14055682Smarkm
14155682Smarkm    deltat2str(princ->max_renewable_life, buf, sizeof(buf));
14255682Smarkm    printf("%24s: %s\n", "Max renewable life", buf);
14355682Smarkm    printf("%24s: %d\n", "Kvno", princ->kvno);
14455682Smarkm    printf("%24s: %d\n", "Mkvno", princ->mkvno);
14555682Smarkm    printf("%24s: %s\n", "Policy", princ->policy ? princ->policy : "none");
14655682Smarkm    time_t2str(princ->last_success, buf, sizeof(buf), 1);
14755682Smarkm    printf("%24s: %s\n", "Last successful login", buf);
14855682Smarkm    time_t2str(princ->last_failed, buf, sizeof(buf), 1);
14955682Smarkm    printf("%24s: %s\n", "Last failed login", buf);
15055682Smarkm    printf("%24s: %d\n", "Failed login count", princ->fail_auth_count);
15155682Smarkm    time_t2str(princ->mod_date, buf, sizeof(buf), 1);
15255682Smarkm    printf("%24s: %s\n", "Last modified", buf);
15372445Sassar    if(princ->mod_name != NULL) {
15472445Sassar	krb5_unparse_name_fixed(context, princ->mod_name, buf, sizeof(buf));
15572445Sassar	printf("%24s: %s\n", "Modifier", buf);
15672445Sassar    }
15755682Smarkm    attributes2str (princ->attributes, buf, sizeof(buf));
15855682Smarkm    printf("%24s: %s\n", "Attributes", buf);
15955682Smarkm
16072445Sassar    printf("%24s: ", "Keytypes(salttype[(salt-value)])");
16155682Smarkm
16272445Sassar    krb5_get_pw_salt (context, princ->principal, &def_salt);
16372445Sassar
16455682Smarkm    for (i = 0; i < princ->n_key_data; ++i) {
16555682Smarkm	krb5_key_data *k = &princ->key_data[i];
16655682Smarkm	krb5_error_code ret;
16772445Sassar	char *e_string, *s_string, *salt;
16855682Smarkm
16955682Smarkm	ret = krb5_enctype_to_string (context,
17055682Smarkm				      k->key_data_type[0],
17155682Smarkm				      &e_string);
17255682Smarkm	if (ret)
17355682Smarkm	    asprintf (&e_string, "unknown(%d)", k->key_data_type[0]);
17455682Smarkm
17555682Smarkm	ret = krb5_salttype_to_string (context,
17655682Smarkm				       k->key_data_type[0],
17755682Smarkm				       k->key_data_type[1],
17855682Smarkm				       &s_string);
17955682Smarkm	if (ret)
18055682Smarkm	    asprintf (&s_string, "unknown(%d)", k->key_data_type[1]);
18155682Smarkm
18272445Sassar	if (cmp_salt(&def_salt, k) == 0)
18372445Sassar	    salt = strdup("");
18472445Sassar	else if(k->key_data_length[1] == 0)
18572445Sassar	    salt = strdup("()");
18672445Sassar	else
18772445Sassar	    asprintf (&salt, "(%.*s)", k->key_data_length[1],
18872445Sassar		      (char *)k->key_data_contents[1]);
18972445Sassar
19072445Sassar
19172445Sassar	printf ("%s%s(%s%s)", (i != 0) ? ", " : "", e_string, s_string, salt);
19255682Smarkm	free (e_string);
19355682Smarkm	free (s_string);
19472445Sassar	free (salt);
19555682Smarkm    }
19672445Sassar    krb5_free_salt (context, def_salt);
19755682Smarkm    printf("\n\n");
19855682Smarkm}
19955682Smarkm
20055682Smarkmstatic int
20155682Smarkmdo_get_entry(krb5_principal principal, void *data)
20255682Smarkm{
20355682Smarkm    kadm5_principal_ent_rec princ;
20455682Smarkm    krb5_error_code ret;
20555682Smarkm    struct get_entry_data *e = data;
20655682Smarkm
20755682Smarkm    memset(&princ, 0, sizeof(princ));
20855682Smarkm    ret = kadm5_get_principal(kadm_handle, principal,
20955682Smarkm			      &princ,
21055682Smarkm			      KADM5_PRINCIPAL_NORMAL_MASK|KADM5_KEY_DATA);
21155682Smarkm    if(ret)
21255682Smarkm	return ret;
21355682Smarkm    else {
21455682Smarkm	if(e->header) {
21555682Smarkm	    (*e->header)();
21655682Smarkm	    e->header = NULL; /* XXX only once */
21755682Smarkm	}
21855682Smarkm	(e->format)(&princ);
21955682Smarkm	kadm5_free_principal_ent(kadm_handle, &princ);
22055682Smarkm    }
22155682Smarkm    return 0;
22255682Smarkm}
22355682Smarkm
22472445Sassarstatic int
22572445Sassargetit(const char *name, int terse_flag, int argc, char **argv)
22655682Smarkm{
22755682Smarkm    int i;
22855682Smarkm    krb5_error_code ret;
22955682Smarkm    struct get_entry_data data;
23055682Smarkm    struct getargs args[] = {
23155682Smarkm	{ "long",	'l',	arg_flag,	NULL, "long format" },
23272445Sassar	{ "short",	's',	arg_flag,	NULL, "short format" },
23355682Smarkm	{ "terse",	't',	arg_flag,	NULL, "terse format" },
23455682Smarkm    };
23555682Smarkm    int num_args = sizeof(args) / sizeof(args[0]);
23655682Smarkm    int optind = 0;
23772445Sassar    int long_flag = -1;
23872445Sassar    int short_flag = -1;
23955682Smarkm
24055682Smarkm    args[0].value = &long_flag;
24172445Sassar    args[1].value = &short_flag;
24272445Sassar    args[2].value = &terse_flag;
24372445Sassar
24455682Smarkm    if(getarg(args, num_args, argc, argv, &optind))
24555682Smarkm	goto usage;
24655682Smarkm    if(optind == argc)
24755682Smarkm	goto usage;
24855682Smarkm
24972445Sassar    if(long_flag == -1 && (short_flag == 1 || terse_flag == 1))
25072445Sassar	long_flag = 0;
25172445Sassar    if(short_flag == -1 && (long_flag == 1 || terse_flag == 1))
25272445Sassar	short_flag = 0;
25372445Sassar    if(terse_flag == -1 && (long_flag == 1 || short_flag == 1))
25472445Sassar	terse_flag = 0;
25572445Sassar    if(long_flag == 0 && short_flag == 0 && terse_flag == 0)
25672445Sassar	short_flag = 1;
25772445Sassar
25855682Smarkm    if(long_flag) {
25955682Smarkm	data.format = print_entry_long;
26055682Smarkm	data.header = NULL;
26172445Sassar    } else if(short_flag){
26272445Sassar	data.format = print_entry_short;
26372445Sassar	data.header = print_header_short;
26455682Smarkm    } else if(terse_flag) {
26555682Smarkm	data.format = print_entry_terse;
26655682Smarkm	data.header = NULL;
26755682Smarkm    }
26855682Smarkm
26955682Smarkm    argc -= optind;
27055682Smarkm    argv += optind;
27155682Smarkm
27255682Smarkm    for(i = 0; i < argc; i++)
27355682Smarkm	ret = foreach_principal(argv[i], do_get_entry, &data);
27455682Smarkm    return 0;
27555682Smarkmusage:
27672445Sassar    arg_printusage (args, num_args, name, "principal...");
27755682Smarkm    return 0;
27855682Smarkm}
27955682Smarkm
28055682Smarkmint
28172445Sassarget_entry(int argc, char **argv)
28272445Sassar{
28372445Sassar    return getit("get", 0, argc, argv);
28472445Sassar}
28572445Sassar
28672445Sassarint
28755682Smarkmlist_princs(int argc, char **argv)
28855682Smarkm{
28972445Sassar    return getit("list", 1, argc, argv);
29055682Smarkm}
291