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 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 */ 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