1 #pragma ident "%Z%%M% %I% %E% SMI"
2
3 /*
4 * WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
5 *
6 * Openvision retains the copyright to derivative works of
7 * this source code. Do *NOT* create a derivative of this
8 * source code before consulting with your legal department.
9 * Do *NOT* integrate *ANY* of this source code into another
10 * product before consulting with your legal department.
11 *
12 * For further information, read the top-level Openvision
13 * copyright which is contained in the top-level MIT Kerberos
14 * copyright.
15 *
16 * WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
17 *
18 */
19
20
21 #include <unistd.h>
22 #include <string.h>
23 #include <stdlib.h>
24 #include "autoconf.h"
25 #ifdef HAVE_MEMORY_H
26 #include <memory.h>
27 #endif
28
29 #include <k5-int.h>
30 #include <kadm5/admin.h>
31 #include <kadm5/server_internal.h>
32 #include <kdb.h>
33 #include "import_err.h"
34 #include "kdb5_util.h"
35 #include "nstrtok.h"
36
37 #define LINESIZE 32768 /* XXX */
38 #define PLURAL(count) (((count) == 1) ? error_message(IMPORT_SINGLE_RECORD) : error_message(IMPORT_PLURAL_RECORDS))
39
parse_pw_hist_ent(current,hist)40 static int parse_pw_hist_ent(current, hist)
41 char *current;
42 osa_pw_hist_ent *hist;
43 {
44 int tmp, i, j, ret;
45 char *cp;
46
47 ret = 0;
48 hist->n_key_data = 1;
49
50 hist->key_data = (krb5_key_data *) malloc(hist->n_key_data *
51 sizeof(krb5_key_data));
52 if (hist->key_data == NULL)
53 return ENOMEM;
54 memset(hist->key_data, 0, sizeof(krb5_key_data)*hist->n_key_data);
55
56 for (i = 0; i < hist->n_key_data; i++) {
57 krb5_key_data *key_data = &hist->key_data[i];
58
59 key_data->key_data_ver = 1;
60
61 if((cp = nstrtok((char *) NULL, "\t")) == NULL) {
62 com_err(NULL, IMPORT_BAD_RECORD, "%s", current);
63 ret = IMPORT_FAILED;
64 goto done;
65 }
66 key_data->key_data_type[0] = atoi(cp);
67
68 if((cp = nstrtok((char *) NULL, "\t")) == NULL) {
69 com_err(NULL, IMPORT_BAD_RECORD, "%s", current);
70 ret = IMPORT_FAILED;
71 goto done;
72 }
73 key_data->key_data_length[0] = atoi(cp);
74
75 if((cp = nstrtok((char *) NULL, "\t")) == NULL) {
76 com_err(NULL, IMPORT_BAD_RECORD, "%s", current);
77 ret = IMPORT_FAILED;
78 goto done;
79 }
80 if(!(key_data->key_data_contents[0] =
81 (krb5_octet *) malloc(key_data->key_data_length[0]+1))) {
82 ret = ENOMEM;
83 goto done;
84 }
85 for(j = 0; j < key_data->key_data_length[0]; j++) {
86 if(sscanf(cp, "%02x", &tmp) != 1) {
87 com_err(NULL, IMPORT_BAD_RECORD, "%s", current);
88 ret = IMPORT_FAILED;
89 goto done;
90 }
91 key_data->key_data_contents[0][j] = tmp;
92 cp = strchr(cp, ' ') + 1;
93 }
94 }
95
96 done:
97 return ret;
98 }
99
100 /*
101 * Function: parse_principal
102 *
103 * Purpose: parse principal line in db dump file
104 *
105 * Arguments:
106 * <return value> 0 on success, error code on failure
107 *
108 * Requires:
109 * principal database to be opened.
110 * nstrtok(3) to have a valid buffer in memory.
111 *
112 * Effects:
113 * [effects]
114 *
115 * Modifies:
116 * [modifies]
117 *
118 */
process_ov_principal(fname,kcontext,filep,verbose,linenop)119 int process_ov_principal(fname, kcontext, filep, verbose, linenop)
120 char *fname;
121 krb5_context kcontext;
122 FILE *filep;
123 int verbose;
124 int *linenop;
125 {
126 XDR xdrs;
127 osa_princ_ent_t rec;
128 krb5_error_code ret;
129 krb5_tl_data tl_data;
130 krb5_principal princ;
131 krb5_db_entry kdb;
132 char *current;
133 char *cp;
134 int x, one;
135 krb5_boolean more;
136 char line[LINESIZE];
137
138 if (fgets(line, LINESIZE, filep) == (char *) NULL) {
139 return IMPORT_BAD_FILE;
140 }
141 if((cp = nstrtok(line, "\t")) == NULL)
142 return IMPORT_BAD_FILE;
143 if((rec = (osa_princ_ent_t) malloc(sizeof(osa_princ_ent_rec))) == NULL)
144 return ENOMEM;
145 memset(rec, 0, sizeof(osa_princ_ent_rec));
146 if((ret = krb5_parse_name(kcontext, cp, &princ)))
147 goto done;
148 krb5_unparse_name(kcontext, princ, ¤t);
149 if((cp = nstrtok((char *) NULL, "\t")) == NULL) {
150 com_err(NULL, IMPORT_BAD_RECORD, "%s", current);
151 ret = IMPORT_FAILED;
152 goto done;
153 } else {
154 if(strcmp(cp, "")) {
155 if((rec->policy = (char *) malloc(strlen(cp)+1)) == NULL) {
156 ret = ENOMEM;
157 goto done;
158 }
159 strcpy(rec->policy, cp);
160 } else rec->policy = NULL;
161 }
162 if((cp = nstrtok((char *) NULL, "\t")) == NULL) {
163 com_err(NULL, IMPORT_BAD_RECORD, "%s", current);
164 ret = IMPORT_FAILED;
165 goto done;
166 }
167 rec->aux_attributes = strtol(cp, (char **)NULL, 16);
168 if((cp = nstrtok((char *) NULL, "\t")) == NULL) {
169 com_err(NULL, IMPORT_BAD_RECORD, "%s", current);
170 ret = IMPORT_FAILED;
171 goto done;
172 }
173 rec->old_key_len = atoi(cp);
174 if((cp = nstrtok((char *) NULL, "\t")) == NULL) {
175 com_err(NULL, IMPORT_BAD_RECORD, "%s", current);
176 ret = IMPORT_FAILED;
177 goto done;
178 }
179 rec->old_key_next = atoi(cp);
180 if((cp = nstrtok((char *) NULL, "\t")) == NULL) {
181 com_err(NULL, IMPORT_BAD_RECORD, "%s", current);
182 ret = IMPORT_FAILED;
183 goto done;
184 }
185 rec->admin_history_kvno = atoi(cp);
186 if (! rec->old_key_len) {
187 rec->old_keys = NULL;
188 } else {
189 if(!(rec->old_keys = (osa_pw_hist_ent *)
190 malloc(sizeof(osa_pw_hist_ent) * rec->old_key_len))) {
191 ret = ENOMEM;
192 goto done;
193 }
194 memset(rec->old_keys,0,
195 sizeof(osa_pw_hist_ent) * rec->old_key_len);
196 for(x = 0; x < rec->old_key_len; x++)
197 parse_pw_hist_ent(current, &rec->old_keys[x]);
198 }
199
200 xdralloc_create(&xdrs, XDR_ENCODE);
201 if (! xdr_osa_princ_ent_rec(&xdrs, rec)) {
202 xdr_destroy(&xdrs);
203 ret = KADM5_XDR_FAILURE;
204 goto done;
205 }
206
207 tl_data.tl_data_type = KRB5_TL_KADM_DATA;
208 tl_data.tl_data_length = xdr_getpos(&xdrs);
209 tl_data.tl_data_contents = (krb5_octet *) xdralloc_getdata(&xdrs);
210
211 one = 1;
212 ret = krb5_db_get_principal(kcontext, princ, &kdb, &one, &more);
213 if (ret)
214 goto done;
215
216 ret = krb5_dbe_update_tl_data(kcontext, &kdb, &tl_data);
217 if (ret)
218 goto done;
219
220 ret = krb5_db_put_principal(kcontext, &kdb, &one);
221 if (ret)
222 goto done;
223
224 xdr_destroy(&xdrs);
225
226 (*linenop)++;
227
228 done:
229 free(current);
230 krb5_free_principal(kcontext, princ);
231 osa_free_princ_ent(rec);
232 return ret;
233 }
234