1b528cefcSMark Murray /*
2*ae771770SStanislav Sedov * Copyright (c) 1997-2004 Kungliga Tekniska Högskolan
3b528cefcSMark Murray * (Royal Institute of Technology, Stockholm, Sweden).
4b528cefcSMark Murray * All rights reserved.
5b528cefcSMark Murray *
6b528cefcSMark Murray * Redistribution and use in source and binary forms, with or without
7b528cefcSMark Murray * modification, are permitted provided that the following conditions
8b528cefcSMark Murray * are met:
9b528cefcSMark Murray *
10b528cefcSMark Murray * 1. Redistributions of source code must retain the above copyright
11b528cefcSMark Murray * notice, this list of conditions and the following disclaimer.
12b528cefcSMark Murray *
13b528cefcSMark Murray * 2. Redistributions in binary form must reproduce the above copyright
14b528cefcSMark Murray * notice, this list of conditions and the following disclaimer in the
15b528cefcSMark Murray * documentation and/or other materials provided with the distribution.
16b528cefcSMark Murray *
17b528cefcSMark Murray * 3. Neither the name of the Institute nor the names of its contributors
18b528cefcSMark Murray * may be used to endorse or promote products derived from this software
19b528cefcSMark Murray * without specific prior written permission.
20b528cefcSMark Murray *
21b528cefcSMark Murray * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
22b528cefcSMark Murray * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23b528cefcSMark Murray * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24b528cefcSMark Murray * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
25b528cefcSMark Murray * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26b528cefcSMark Murray * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27b528cefcSMark Murray * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28b528cefcSMark Murray * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29b528cefcSMark Murray * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30b528cefcSMark Murray * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31b528cefcSMark Murray * SUCH DAMAGE.
32b528cefcSMark Murray */
33b528cefcSMark Murray
34b528cefcSMark Murray #include "ktutil_locl.h"
35c19800e8SDoug Rabson #include <rtbl.h>
36b528cefcSMark Murray
37*ae771770SStanislav Sedov RCSID("$Id$");
38b528cefcSMark Murray
39adb0ddaeSAssar Westerlund static int
do_list(struct list_options * opt,const char * keytab_str)40c19800e8SDoug Rabson do_list(struct list_options *opt, const char *keytab_str)
41b528cefcSMark Murray {
42b528cefcSMark Murray krb5_error_code ret;
43adb0ddaeSAssar Westerlund krb5_keytab keytab;
44b528cefcSMark Murray krb5_keytab_entry entry;
45adb0ddaeSAssar Westerlund krb5_kt_cursor cursor;
46c19800e8SDoug Rabson rtbl_t table;
475e9cd1aeSAssar Westerlund
484137ff4cSJacques Vidrine /* XXX specialcase the ANY type */
49c19800e8SDoug Rabson if(strncasecmp(keytab_str, "ANY:", 4) == 0) {
504137ff4cSJacques Vidrine int flag = 0;
514137ff4cSJacques Vidrine char buf[1024];
52c19800e8SDoug Rabson keytab_str += 4;
53c19800e8SDoug Rabson ret = 0;
54c19800e8SDoug Rabson while (strsep_copy((const char**)&keytab_str, ",",
554137ff4cSJacques Vidrine buf, sizeof(buf)) != -1) {
564137ff4cSJacques Vidrine if(flag)
574137ff4cSJacques Vidrine printf("\n");
58c19800e8SDoug Rabson if(do_list(opt, buf))
59c19800e8SDoug Rabson ret = 1;
604137ff4cSJacques Vidrine flag = 1;
614137ff4cSJacques Vidrine }
62c19800e8SDoug Rabson return ret;
634137ff4cSJacques Vidrine }
644137ff4cSJacques Vidrine
65c19800e8SDoug Rabson ret = krb5_kt_resolve(context, keytab_str, &keytab);
66adb0ddaeSAssar Westerlund if (ret) {
67c19800e8SDoug Rabson krb5_warn(context, ret, "resolving keytab %s", keytab_str);
68c19800e8SDoug Rabson return ret;
695e9cd1aeSAssar Westerlund }
70b528cefcSMark Murray
71b528cefcSMark Murray ret = krb5_kt_start_seq_get(context, keytab, &cursor);
72b528cefcSMark Murray if(ret) {
73c19800e8SDoug Rabson krb5_warn(context, ret, "krb5_kt_start_seq_get %s", keytab_str);
74c19800e8SDoug Rabson krb5_kt_close(context, keytab);
75c19800e8SDoug Rabson return ret;
76b528cefcSMark Murray }
77adb0ddaeSAssar Westerlund
78c19800e8SDoug Rabson printf ("%s:\n\n", keytab_str);
79c19800e8SDoug Rabson
80c19800e8SDoug Rabson table = rtbl_create();
81c19800e8SDoug Rabson rtbl_add_column_by_id(table, 0, "Vno", RTBL_ALIGN_RIGHT);
82c19800e8SDoug Rabson rtbl_add_column_by_id(table, 1, "Type", 0);
83c19800e8SDoug Rabson rtbl_add_column_by_id(table, 2, "Principal", 0);
84c19800e8SDoug Rabson if (opt->timestamp_flag)
85c19800e8SDoug Rabson rtbl_add_column_by_id(table, 3, "Date", 0);
86c19800e8SDoug Rabson if(opt->keys_flag)
87c19800e8SDoug Rabson rtbl_add_column_by_id(table, 4, "Key", 0);
88*ae771770SStanislav Sedov rtbl_add_column_by_id(table, 5, "Aliases", 0);
89c19800e8SDoug Rabson rtbl_set_separator(table, " ");
90adb0ddaeSAssar Westerlund
91*ae771770SStanislav Sedov while(krb5_kt_next_entry(context, keytab, &entry, &cursor) == 0){
92c19800e8SDoug Rabson char buf[1024], *s;
93b528cefcSMark Murray
94c19800e8SDoug Rabson snprintf(buf, sizeof(buf), "%d", entry.vno);
95c19800e8SDoug Rabson rtbl_add_column_entry_by_id(table, 0, buf);
96c19800e8SDoug Rabson
97c19800e8SDoug Rabson ret = krb5_enctype_to_string(context,
98c19800e8SDoug Rabson entry.keyblock.keytype, &s);
99c19800e8SDoug Rabson if (ret != 0) {
100c19800e8SDoug Rabson snprintf(buf, sizeof(buf), "unknown (%d)", entry.keyblock.keytype);
101c19800e8SDoug Rabson rtbl_add_column_entry_by_id(table, 1, buf);
102c19800e8SDoug Rabson } else {
103c19800e8SDoug Rabson rtbl_add_column_entry_by_id(table, 1, s);
104c19800e8SDoug Rabson free(s);
105c19800e8SDoug Rabson }
106c19800e8SDoug Rabson
107c19800e8SDoug Rabson krb5_unparse_name_fixed(context, entry.principal, buf, sizeof(buf));
108c19800e8SDoug Rabson rtbl_add_column_entry_by_id(table, 2, buf);
109c19800e8SDoug Rabson
110c19800e8SDoug Rabson if (opt->timestamp_flag) {
111c19800e8SDoug Rabson krb5_format_time(context, entry.timestamp, buf,
112c19800e8SDoug Rabson sizeof(buf), FALSE);
113c19800e8SDoug Rabson rtbl_add_column_entry_by_id(table, 3, buf);
114c19800e8SDoug Rabson }
115c19800e8SDoug Rabson if(opt->keys_flag) {
116*ae771770SStanislav Sedov size_t i;
117c19800e8SDoug Rabson s = malloc(2 * entry.keyblock.keyvalue.length + 1);
118c19800e8SDoug Rabson if (s == NULL) {
119c19800e8SDoug Rabson krb5_warnx(context, "malloc failed");
120c19800e8SDoug Rabson ret = ENOMEM;
121adb0ddaeSAssar Westerlund goto out;
122adb0ddaeSAssar Westerlund }
1235e9cd1aeSAssar Westerlund for(i = 0; i < entry.keyblock.keyvalue.length; i++)
124c19800e8SDoug Rabson snprintf(s + 2 * i, 3, "%02x",
1255e9cd1aeSAssar Westerlund ((unsigned char*)entry.keyblock.keyvalue.data)[i]);
126c19800e8SDoug Rabson rtbl_add_column_entry_by_id(table, 4, s);
127c19800e8SDoug Rabson free(s);
1285e9cd1aeSAssar Westerlund }
129*ae771770SStanislav Sedov if (entry.aliases) {
130*ae771770SStanislav Sedov unsigned int i;
131*ae771770SStanislav Sedov struct rk_strpool *p = NULL;
132*ae771770SStanislav Sedov
133*ae771770SStanislav Sedov for (i = 0; i< entry.aliases->len; i++) {
134*ae771770SStanislav Sedov krb5_unparse_name_fixed(context, entry.principal, buf, sizeof(buf));
135*ae771770SStanislav Sedov rk_strpoolprintf(p, "%s%s", buf,
136*ae771770SStanislav Sedov i + 1 < entry.aliases->len ? ", " : "");
137*ae771770SStanislav Sedov
138*ae771770SStanislav Sedov }
139*ae771770SStanislav Sedov rtbl_add_column_entry_by_id(table, 5, rk_strpoolcollect(p));
140*ae771770SStanislav Sedov }
141*ae771770SStanislav Sedov
142b528cefcSMark Murray krb5_kt_free_entry(context, &entry);
143b528cefcSMark Murray }
144b528cefcSMark Murray ret = krb5_kt_end_seq_get(context, keytab, &cursor);
145c19800e8SDoug Rabson rtbl_format(table, stdout);
1465e9cd1aeSAssar Westerlund
147adb0ddaeSAssar Westerlund out:
148c19800e8SDoug Rabson rtbl_destroy(table);
149c19800e8SDoug Rabson
150adb0ddaeSAssar Westerlund krb5_kt_close(context, keytab);
151c19800e8SDoug Rabson return ret;
152adb0ddaeSAssar Westerlund }
153adb0ddaeSAssar Westerlund
154adb0ddaeSAssar Westerlund int
kt_list(struct list_options * opt,int argc,char ** argv)155c19800e8SDoug Rabson kt_list(struct list_options *opt, int argc, char **argv)
156adb0ddaeSAssar Westerlund {
1574137ff4cSJacques Vidrine krb5_error_code ret;
1584137ff4cSJacques Vidrine char kt[1024];
159adb0ddaeSAssar Westerlund
160adb0ddaeSAssar Westerlund if(verbose_flag)
161c19800e8SDoug Rabson opt->timestamp_flag = 1;
162adb0ddaeSAssar Westerlund
163adb0ddaeSAssar Westerlund if (keytab_string == NULL) {
1644137ff4cSJacques Vidrine if((ret = krb5_kt_default_name(context, kt, sizeof(kt))) != 0) {
1654137ff4cSJacques Vidrine krb5_warn(context, ret, "getting default keytab name");
166c19800e8SDoug Rabson return 1;
167adb0ddaeSAssar Westerlund }
1684137ff4cSJacques Vidrine keytab_string = kt;
1694137ff4cSJacques Vidrine }
170c19800e8SDoug Rabson return do_list(opt, keytab_string) != 0;
171b528cefcSMark Murray }
172