diff --git a/kadmin/load.c b/kadmin/load.c index 4f4a6a12d..870ff3177 100644 --- a/kadmin/load.c +++ b/kadmin/load.c @@ -49,6 +49,7 @@ struct entry { char *pw_end; char *flags; char *generation; + char *extensions; }; static char * @@ -309,6 +310,49 @@ parse_generation(char *str, GENERATION **gen) return 0; } +static int +parse_extensions(char *str, HDB_extensions **e) +{ + char *p; + int ret; + + if(strcmp(str, "-") == 0 || *str == '\0') { + *e = NULL; + return 0; + } + *e = calloc(1, sizeof(**e)); + + p = strsep(&str, ":"); + + while (p) { + HDB_extension ext; + ssize_t len; + void *d; + + len = strlen(p); + d = malloc(len); + + len = hex_decode(p, d, len); + if (len < 0) + return -1; + + ret = decode_HDB_extension(d, len, &ext, NULL); + free(d); + if (ret) + return -1; + d = realloc((*e)->val, ((*e)->len + 1) * sizeof((*e)->val[0])); + if (d == NULL) + abort(); + (*e)->val = d; + (*e)->val[(*e)->len] = ext; + (*e)->len++; + + p = strsep(&str, ":"); + } + + return 0; +} + /* * Parse the dump file in `filename' and create the database (merging @@ -353,7 +397,12 @@ doit(const char *filename, int mergep) while(fgets(s, sizeof(s), f) != NULL) { ret = 0; line++; - e.principal = s; + + p = s; + while (isspace((unsigned char)*p)) + p++; + + e.principal = p; for(p = s; *p; p++){ if(*p == '\\') p++; @@ -394,6 +443,9 @@ doit(const char *filename, int mergep) e.generation = p; p = skip_next(p); + e.extensions = p; + p = skip_next(p); + memset(&ent, 0, sizeof(ent)); ret = krb5_parse_name(context, e.principal, &ent.principal); if(ret) { @@ -471,6 +523,13 @@ doit(const char *filename, int mergep) continue; } + if(parse_extensions(e.extensions, &ent.extensions) == -1) { + fprintf (stderr, "%s:%d:error parsing extension (%s)\n", + filename, line, e.extensions); + hdb_free_entry (context, &ent); + continue; + } + ret = db->hdb_store(context, db, HDB_F_REPLACE, &ent); hdb_free_entry (context, &ent); if (ret) {