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