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