Deleted Added
full compact
copy.c (55682) copy.c (72445)
1/*
2 * Copyright (c) 1997 - 2000 Kungliga Tekniska H�gskolan
3 * (Royal Institute of Technology, Stockholm, Sweden).
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:

--- 19 unchanged lines hidden (view full) ---

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
31 * SUCH DAMAGE.
32 */
33
34#include "ktutil_locl.h"
35
1/*
2 * Copyright (c) 1997 - 2000 Kungliga Tekniska H�gskolan
3 * (Royal Institute of Technology, Stockholm, Sweden).
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:

--- 19 unchanged lines hidden (view full) ---

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
31 * SUCH DAMAGE.
32 */
33
34#include "ktutil_locl.h"
35
36RCSID("$Id: copy.c,v 1.1 2000/01/02 04:41:01 assar Exp $");
36RCSID("$Id: copy.c,v 1.5 2000/12/16 00:45:29 joda Exp $");
37
37
38
39static krb5_boolean
40compare_keyblock(const krb5_keyblock *a, const krb5_keyblock *b)
41{
42 if(a->keytype != b->keytype ||
43 a->keyvalue.length != b->keyvalue.length ||
44 memcmp(a->keyvalue.data, b->keyvalue.data, a->keyvalue.length) != 0)
45 return FALSE;
46 return TRUE;
47}
48
49static int
50kt_copy_int (const char *from, const char *to)
51{
52 krb5_error_code ret;
53 krb5_keytab src_keytab, dst_keytab;
54 krb5_kt_cursor cursor;
55 krb5_keytab_entry entry, dummy;
56
57 ret = krb5_kt_resolve (context, from, &src_keytab);
58 if (ret) {
59 krb5_warn (context, ret, "resolving src keytab `%s'", from);
60 return 0;
61 }
62
63 ret = krb5_kt_resolve (context, to, &dst_keytab);
64 if (ret) {
65 krb5_kt_close (context, src_keytab);
66 krb5_warn (context, ret, "resolving dst keytab `%s'", to);
67 return 0;
68 }
69
70 ret = krb5_kt_start_seq_get (context, src_keytab, &cursor);
71 if (ret) {
72 krb5_warn (context, ret, "krb5_kt_start_seq_get %s", keytab_string);
73 goto fail;
74 }
75
76 while((ret = krb5_kt_next_entry(context, src_keytab,
77 &entry, &cursor)) == 0) {
78 char *name_str;
79 char *etype_str;
80 krb5_unparse_name (context, entry.principal, &name_str);
81 krb5_enctype_to_string(context, entry.keyblock.keytype, &etype_str);
82 ret = krb5_kt_get_entry(context, dst_keytab,
83 entry.principal,
84 entry.vno,
85 entry.keyblock.keytype,
86 &dummy);
87 if(ret == 0) {
88 /* this entry is already in the new keytab, so no need to
89 copy it; if the keyblocks are not the same, something
90 is weird, so complain about that */
91 if(!compare_keyblock(&entry.keyblock, &dummy.keyblock)) {
92 krb5_warnx(context, "entry with different keyvalue "
93 "already exists for %s, keytype %s, kvno %d",
94 name_str, etype_str, entry.vno);
95 }
96 krb5_kt_free_entry(context, &dummy);
97 krb5_kt_free_entry (context, &entry);
98 free(name_str);
99 free(etype_str);
100 continue;
101 } else if(ret != KRB5_KT_NOTFOUND) {
102 krb5_warn(context, ret, "krb5_kt_get_entry(%s)", name_str);
103 krb5_kt_free_entry (context, &entry);
104 free(name_str);
105 free(etype_str);
106 break;
107 }
108 if (verbose_flag)
109 fprintf (stderr, "copying %s, keytype %s, kvno %d\n", name_str,
110 etype_str, entry.vno);
111 ret = krb5_kt_add_entry (context, dst_keytab, &entry);
112 krb5_kt_free_entry (context, &entry);
113 if (ret) {
114 krb5_warn (context, ret, "krb5_kt_add_entry(%s)", name_str);
115 free(name_str);
116 free(etype_str);
117 break;
118 }
119 free(name_str);
120 free(etype_str);
121 }
122 krb5_kt_end_seq_get (context, src_keytab, &cursor);
123
124 fail:
125 krb5_kt_close (context, src_keytab);
126 krb5_kt_close (context, dst_keytab);
127 return 0;
128}
129
38int
39kt_copy (int argc, char **argv)
40{
130int
131kt_copy (int argc, char **argv)
132{
41 krb5_error_code ret;
42 int help_flag = 0;
43 int optind = 0;
133 int help_flag = 0;
134 int optind = 0;
44 krb5_keytab src_keytab, dst_keytab;
45 krb5_kt_cursor cursor;
46 krb5_keytab_entry entry;
47
48 struct getargs args[] = {
49 { "help", 'h', arg_flag, NULL}
50 };
51
52 int num_args = sizeof(args) / sizeof(args[0]);
53 int i = 0;
54
55 args[i++].value = &help_flag;
135
136 struct getargs args[] = {
137 { "help", 'h', arg_flag, NULL}
138 };
139
140 int num_args = sizeof(args) / sizeof(args[0]);
141 int i = 0;
142
143 args[i++].value = &help_flag;
144 args[i++].value = &verbose_flag;
56
57 if(getarg(args, num_args, argc, argv, &optind)) {
58 arg_printusage(args, num_args, "ktutil copy",
59 "keytab-src keytab-dest");
60 return 0;
61 }
62 if (help_flag) {
63 arg_printusage(args, num_args, "ktutil copy",

--- 5 unchanged lines hidden (view full) ---

69 argc -= optind;
70
71 if (argc != 2) {
72 arg_printusage(args, num_args, "ktutil copy",
73 "keytab-src keytab-dest");
74 return 0;
75 }
76
145
146 if(getarg(args, num_args, argc, argv, &optind)) {
147 arg_printusage(args, num_args, "ktutil copy",
148 "keytab-src keytab-dest");
149 return 0;
150 }
151 if (help_flag) {
152 arg_printusage(args, num_args, "ktutil copy",

--- 5 unchanged lines hidden (view full) ---

158 argc -= optind;
159
160 if (argc != 2) {
161 arg_printusage(args, num_args, "ktutil copy",
162 "keytab-src keytab-dest");
163 return 0;
164 }
165
77 ret = krb5_kt_resolve (context, argv[0], &src_keytab);
78 if (ret) {
79 krb5_warn (context, ret, "resolving src keytab `%s'", argv[0]);
80 return 0;
81 }
166 return kt_copy_int(argv[0], argv[1]);
167}
82
168
83 ret = krb5_kt_resolve (context, argv[1], &dst_keytab);
84 if (ret) {
85 krb5_kt_close (context, src_keytab);
86 krb5_warn (context, ret, "resolving dst keytab `%s'", argv[1]);
169#ifndef KEYFILE
170#define KEYFILE "/etc/srvtab"
171#endif
172
173/* copy to from v4 srvtab, just short for copy */
174static int
175conv(int srvconv, int argc, char **argv)
176{
177 int help_flag = 0;
178 char *srvtab = KEYFILE;
179 int optind = 0;
180 char kt4[1024], kt5[1024];
181
182 char *name;
183
184 struct getargs args[] = {
185 { "srvtab", 's', arg_string, NULL},
186 { "help", 'h', arg_flag, NULL}
187 };
188
189 int num_args = sizeof(args) / sizeof(args[0]);
190 int i = 0;
191
192 args[i++].value = &srvtab;
193 args[i++].value = &help_flag;
194
195 if(srvconv)
196 name = "ktutil srvconvert";
197 else
198 name = "ktutil srvcreate";
199
200 if(getarg(args, num_args, argc, argv, &optind)){
201 arg_printusage(args, num_args, name, "");
202 return 1;
203 }
204 if(help_flag){
205 arg_printusage(args, num_args, name, "");
87 return 0;
88 }
89
206 return 0;
207 }
208
90 ret = krb5_kt_start_seq_get (context, src_keytab, &cursor);
91 if (ret) {
92 krb5_warn (context, ret, "krb5_kt_start_seq_get");
93 goto fail;
209 argc -= optind;
210 argv += optind;
211
212 if (argc != 0) {
213 arg_printusage(args, num_args, name, "");
214 return 1;
94 }
95
215 }
216
96 while((ret = krb5_kt_next_entry(context, src_keytab,
97 &entry, &cursor)) == 0) {
98 ret = krb5_kt_add_entry (context, dst_keytab, &entry);
99 if (verbose_flag) {
100 char *name_str;
217 snprintf(kt4, sizeof(kt4), "krb4:%s", srvtab);
101
218
102 krb5_unparse_name (context, entry.principal, &name_str);
103 printf ("copying %s\n", name_str);
104 free (name_str);
219 if(srvconv) {
220 if(keytab_string != NULL)
221 return kt_copy_int(kt4, keytab_string);
222 else {
223 krb5_kt_default_name(context, kt5, sizeof(kt5));
224 return kt_copy_int(kt4, kt5);
105 }
225 }
226 } else {
227 if(keytab_string != NULL)
228 return kt_copy_int(keytab_string, kt4);
106
229
107 krb5_kt_free_entry (context, &entry);
108 if (ret) {
109 krb5_warn (context, ret, "krb5_kt_add_entry");
110 break;
111 }
230 krb5_kt_default_name(context, kt5, sizeof(kt5));
231 return kt_copy_int(kt5, kt4);
112 }
232 }
113 krb5_kt_end_seq_get (context, src_keytab, &cursor);
233}
114
234
115fail:
116 krb5_kt_close (context, src_keytab);
117 krb5_kt_close (context, dst_keytab);
118 return 0;
235int
236srvconv(int argc, char **argv)
237{
238 return conv(1, argc, argv);
119}
239}
240
241int
242srvcreate(int argc, char **argv)
243{
244 return conv(0, argc, argv);
245}