2 * Copyright (c) 1997-2001 Kungliga Tekniska Högskolan
3 * (Royal Institute of Technology, Stockholm, Sweden).
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
17 * 3. Neither the name of the Institute nor the names of its contributors
18 * may be used to endorse or promote products derived from this software
19 * without specific prior written permission.
21 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34 #include "kadmin_locl.h"
35 #include <parse_units.h>
37 RCSID("$Id: get.c,v 1.13 2001/05/07 05:31:43 assar Exp $");
39 struct get_entry_data
{
41 void (*format
)(kadm5_principal_ent_t
);
45 print_entry_terse(kadm5_principal_ent_t princ
)
48 krb5_unparse_name(context
, princ
->principal
, &p
);
54 print_header_short(void)
56 printf("%-20s ", "Principal");
58 printf("%-10s ", "Expires");
60 printf("%-10s ", "PW-exp");
62 printf("%-10s ", "PW-change");
64 printf("%-9s ", "Max life");
66 printf("%-9s ", "Max renew");
72 print_entry_short(kadm5_principal_ent_t princ
)
76 krb5_unparse_name_fixed_short(context
, princ
->principal
, buf
, sizeof(buf
));
77 printf("%-20s ", buf
);
79 time_t2str(princ
->princ_expire_time
, buf
, sizeof(buf
), 0);
80 printf("%-10s ", buf
);
82 time_t2str(princ
->pw_expiration
, buf
, sizeof(buf
), 0);
83 printf("%-10s ", buf
);
85 time_t2str(princ
->last_pwd_change
, buf
, sizeof(buf
), 0);
86 printf("%-10s ", buf
);
88 deltat2str(princ
->max_life
, buf
, sizeof(buf
));
91 deltat2str(princ
->max_renewable_life
, buf
, sizeof(buf
));
95 time_t2str(princ
->mod_date
, buf
, sizeof(buf
), 0);
96 printf("%-10s ", buf
);
98 krb5_unparse_name_fixed(context
, princ
->mod_name
, buf
, sizeof(buf
));
106 * return 0 iff `salt' actually is the same as the current salt in `k'
110 cmp_salt (const krb5_salt
*salt
, const krb5_key_data
*k
)
112 if (salt
->salttype
!= k
->key_data_type
[1])
114 if (salt
->saltvalue
.length
!= k
->key_data_length
[1])
116 return memcmp (salt
->saltvalue
.data
, k
->key_data_contents
[1],
117 salt
->saltvalue
.length
);
121 print_entry_long(kadm5_principal_ent_t princ
)
127 krb5_unparse_name_fixed(context
, princ
->principal
, buf
, sizeof(buf
));
128 printf("%24s: %s\n", "Principal", buf
);
129 time_t2str(princ
->princ_expire_time
, buf
, sizeof(buf
), 1);
130 printf("%24s: %s\n", "Principal expires", buf
);
132 time_t2str(princ
->pw_expiration
, buf
, sizeof(buf
), 1);
133 printf("%24s: %s\n", "Password expires", buf
);
135 time_t2str(princ
->last_pwd_change
, buf
, sizeof(buf
), 1);
136 printf("%24s: %s\n", "Last password change", buf
);
138 deltat2str(princ
->max_life
, buf
, sizeof(buf
));
139 printf("%24s: %s\n", "Max ticket life", buf
);
141 deltat2str(princ
->max_renewable_life
, buf
, sizeof(buf
));
142 printf("%24s: %s\n", "Max renewable life", buf
);
143 printf("%24s: %d\n", "Kvno", princ
->kvno
);
144 printf("%24s: %d\n", "Mkvno", princ
->mkvno
);
145 printf("%24s: %s\n", "Policy", princ
->policy
? princ
->policy
: "none");
146 time_t2str(princ
->last_success
, buf
, sizeof(buf
), 1);
147 printf("%24s: %s\n", "Last successful login", buf
);
148 time_t2str(princ
->last_failed
, buf
, sizeof(buf
), 1);
149 printf("%24s: %s\n", "Last failed login", buf
);
150 printf("%24s: %d\n", "Failed login count", princ
->fail_auth_count
);
151 time_t2str(princ
->mod_date
, buf
, sizeof(buf
), 1);
152 printf("%24s: %s\n", "Last modified", buf
);
153 if(princ
->mod_name
!= NULL
) {
154 krb5_unparse_name_fixed(context
, princ
->mod_name
, buf
, sizeof(buf
));
155 printf("%24s: %s\n", "Modifier", buf
);
157 attributes2str (princ
->attributes
, buf
, sizeof(buf
));
158 printf("%24s: %s\n", "Attributes", buf
);
160 printf("%24s: ", "Keytypes(salttype[(salt-value)])");
162 krb5_get_pw_salt (context
, princ
->principal
, &def_salt
);
164 for (i
= 0; i
< princ
->n_key_data
; ++i
) {
165 krb5_key_data
*k
= &princ
->key_data
[i
];
167 char *e_string
, *s_string
, *salt
;
169 ret
= krb5_enctype_to_string (context
,
173 asprintf (&e_string
, "unknown(%d)", k
->key_data_type
[0]);
175 ret
= krb5_salttype_to_string (context
,
180 asprintf (&s_string
, "unknown(%d)", k
->key_data_type
[1]);
182 if (cmp_salt(&def_salt
, k
) == 0)
184 else if(k
->key_data_length
[1] == 0)
187 asprintf (&salt
, "(%.*s)", k
->key_data_length
[1],
188 (char *)k
->key_data_contents
[1]);
191 printf ("%s%s(%s%s)", (i
!= 0) ? ", " : "", e_string
, s_string
, salt
);
196 krb5_free_salt (context
, def_salt
);
201 do_get_entry(krb5_principal principal
, void *data
)
203 kadm5_principal_ent_rec princ
;
205 struct get_entry_data
*e
= data
;
207 memset(&princ
, 0, sizeof(princ
));
208 ret
= kadm5_get_principal(kadm_handle
, principal
,
210 KADM5_PRINCIPAL_NORMAL_MASK
|KADM5_KEY_DATA
);
216 e
->header
= NULL
; /* XXX only once */
219 kadm5_free_principal_ent(kadm_handle
, &princ
);
225 getit(const char *name
, int terse_flag
, int argc
, char **argv
)
229 struct get_entry_data data
;
230 struct getargs args
[] = {
231 { "long", 'l', arg_flag
, NULL
, "long format" },
232 { "short", 's', arg_flag
, NULL
, "short format" },
233 { "terse", 't', arg_flag
, NULL
, "terse format" },
235 int num_args
= sizeof(args
) / sizeof(args
[0]);
240 args
[0].value
= &long_flag
;
241 args
[1].value
= &short_flag
;
242 args
[2].value
= &terse_flag
;
244 if(getarg(args
, num_args
, argc
, argv
, &optind
))
249 if(long_flag
== -1 && (short_flag
== 1 || terse_flag
== 1))
251 if(short_flag
== -1 && (long_flag
== 1 || terse_flag
== 1))
253 if(terse_flag
== -1 && (long_flag
== 1 || short_flag
== 1))
255 if(long_flag
== 0 && short_flag
== 0 && terse_flag
== 0)
259 data
.format
= print_entry_long
;
261 } else if(short_flag
){
262 data
.format
= print_entry_short
;
263 data
.header
= print_header_short
;
264 } else if(terse_flag
) {
265 data
.format
= print_entry_terse
;
272 for(i
= 0; i
< argc
; i
++)
273 ret
= foreach_principal(argv
[i
], do_get_entry
, "get", &data
);
276 arg_printusage (args
, num_args
, name
, "principal...");
281 get_entry(int argc
, char **argv
)
283 return getit("get", 0, argc
, argv
);
287 list_princs(int argc
, char **argv
)
289 return getit("list", 1, argc
, argv
);