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