From 47341638a33f8222e1c7ae8119cd504eb9c94336 Mon Sep 17 00:00:00 2001 From: Johan Danielsson Date: Wed, 23 Jul 1997 03:56:35 +0000 Subject: [PATCH] New db-format. git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@2535 ec53bebd-3082-4978-b11e-865c3cabbd6b --- admin/load.c | 197 ++++++++++++++++++++++++++++++++++++-------------- kadmin/load.c | 197 ++++++++++++++++++++++++++++++++++++-------------- 2 files changed, 288 insertions(+), 106 deletions(-) diff --git a/admin/load.c b/admin/load.c index 8601147ae..0cfbadd88 100644 --- a/admin/load.c +++ b/admin/load.c @@ -42,14 +42,14 @@ RCSID("$Id$"); struct entry{ char *principal; - char *kvno; - char *keytype; char *key; char *max_life; char *max_renew; - char *last_change; - char *changed_by; - char *expires; + char *created; + char *modified; + char *valid_start; + char *valid_end; + char *pw_end; char *flags; }; @@ -63,11 +63,15 @@ skip_next(char *p) return p; } -time_t -str2time(char *s) +time_t* +parse_time(time_t *t, char *s) { int year, month, date, hour, minute, second; struct tm tm; + if(strcmp(s, "-") == 0) + return NULL; + if(t == NULL) + t = malloc(sizeof(*t)); sscanf(s, "%04d%02d%02d%02d%02d%02d", &year, &month, &date, &hour, &minute, &second); tm.tm_year = year - 1900; @@ -77,13 +81,108 @@ str2time(char *s) tm.tm_min = minute; tm.tm_sec = second; tm.tm_isdst = 0; - return timegm(&tm); + *t = timegm(&tm); + return t; +} + +unsigned* +parse_integer(unsigned *u, char *s) +{ + if(u == NULL) + u = malloc(sizeof(*u)); + sscanf(s, "%u", u); + return u; +} + +static void +parse_keys(hdb_entry *ent, char *str) +{ + char *save = NULL; + Key *key; + int tmp; + char *p; + int i; + p = strtok_r(str, ":", &save); + sscanf(p, "%d", &tmp); + ent->kvno = tmp; + p = strtok_r(NULL, ":", &save); + while(p){ + Key *key; + key = realloc(ent->keys.val, + (ent->keys.len + 1) * sizeof(*ent->keys.val)); + if(key == NULL) + abort(); + ent->keys.val = key; + key = ent->keys.val + ent->keys.len; + ent->keys.len++; + sscanf(p, "%d", &tmp); + key->mkvno = tmp; + p = strtok_r(NULL, ":", &save); + sscanf(p, "%d", &tmp); + key->key.keytype = tmp; + p = strtok_r(NULL, ":", &save); + krb5_data_alloc(&key->key.keyvalue, (strlen(p) - 1) / 2 + 1); + for(i = 0; i < strlen(p); i += 2){ + sscanf(p + i, "%02x", &tmp); + ((u_char*)key->key.keyvalue.data)[i / 2] = tmp; + } + p = strtok_r(NULL, ":", &save); + if(strcmp(p, "-") != 0){ + key->salt = malloc(sizeof(*key->salt)); + krb5_data_alloc(key->salt, (strlen(p) - 1) / 2 + 1); + for(i = 0; i < strlen(p); i += 2){ + sscanf(p + i, "%02x", &tmp); + ((u_char*)key->salt->data)[i / 2] = tmp; + } + } + p = strtok_r(NULL, ":", &save); + } +} + +static Event* +parse_event(Event *ev, char *str) +{ + char *save = NULL; + char *p; + if(strcmp(str, "-") == 0) + return NULL; + if(ev == NULL) + ev = malloc(sizeof(*ev)); + memset(ev, 0, sizeof(*ev)); + p = strtok_r(str, ":", &save); + parse_time(&ev->time, p); + p = strtok_r(NULL, ":", &save); + krb5_parse_name(context, p, &ev->principal); + return ev; +} + +static HDBFlags +parse_flags(char *str) +{ + unsigned i; + HDBFlags f; + parse_integer(&i, str); + f.initial = i & 1; + i >>= 1; + f.forwardable = i & 1; + i >>= 1; + f.proxiable = i & 1; + i >>= 1; + f.renewable = i & 1; + i >>= 1; + f.postdate = i & 1; + i >>= 1; + f.server = i & 1; + i >>= 1; + f.client = i & 1; + i >>= 1; + f.invalid = i & 1; + return f; } static void doit(char *filename, int merge) { -#if 0 FILE *f; HDB *db; char s[1024]; @@ -122,69 +221,61 @@ doit(char *filename, int merge) } } p = skip_next(p); - e.kvno = p; - while(*p && isdigit(*p)) p++; - *p++ = 0; - e.keytype = p; - while(*p && isdigit(*p)) p++; - *p++ = 0; + e.key = p; p = skip_next(p); + e.created = p; + p = skip_next(p); + + e.modified = p; + p = skip_next(p); + + e.valid_start = p; + p = skip_next(p); + + e.valid_end = p; + p = skip_next(p); + + e.pw_end = p; + p = skip_next(p); + e.max_life = p; p = skip_next(p); e.max_renew = p; p = skip_next(p); - e.last_change = p; - p = skip_next(p); - - e.changed_by = p; - p = skip_next(p); - - e.expires = p; - p = skip_next(p); - e.flags = p; p = skip_next(p); - { - krb5_principal p; - err = krb5_parse_name(context, e.principal, &p); - if(err){ - fprintf(stderr, "%s:%s:%s (%s)\n", - filename, - line, - krb5_get_err_text(context, err), - e.principal); - continue; - } - ent.principal = *p; - free(p); + memset(&ent, 0, sizeof(ent)); + err = krb5_parse_name(context, e.principal, &ent.principal); + if(err){ + fprintf(stderr, "%s:%s:%s (%s)\n", + filename, + line, + krb5_get_err_text(context, err), + e.principal); + continue; } - ent.keyblock.keytype = KEYTYPE_DES; - ent.keyblock.keyvalue.data = malloc(strlen(e.key)/2+1); - for(i = 0; i < strlen(e.key); i += 2){ - unsigned tmp; - sscanf(e.key + i, "%2x", &tmp); - ((unsigned char *)ent.keyblock.keyvalue.data)[i/2] = tmp; - } - ent.keyblock.keyvalue.length = i / 2; - ent.kvno = atoi(e.kvno); - ent.max_life = atoi(e.max_life); - ent.max_renew = atoi(e.max_renew); - ent.last_change = str2time(e.last_change); - krb5_parse_name(context, e.changed_by, &ent.changed_by); - ent.expires = str2time(e.expires); - ent.flags.i = atoi(e.flags); /* XXX */ + parse_keys(&ent, e.key); + + parse_event(&ent.created_by, e.created); + ent.modified_by = parse_event(NULL, e.modified); + ent.valid_start = parse_time(NULL, e.valid_start); + ent.valid_end = parse_time(NULL, e.valid_end); + ent.pw_end = parse_time(NULL, e.pw_end); + ent.max_life = parse_integer(NULL, e.max_life); + ent.max_renew = parse_integer(NULL, e.max_renew); + + ent.flags = parse_flags(e.flags); db->store(context, db, &ent); hdb_free_entry (context, &ent); } db->close(context, db); fclose(f); -#endif } int diff --git a/kadmin/load.c b/kadmin/load.c index 8601147ae..0cfbadd88 100644 --- a/kadmin/load.c +++ b/kadmin/load.c @@ -42,14 +42,14 @@ RCSID("$Id$"); struct entry{ char *principal; - char *kvno; - char *keytype; char *key; char *max_life; char *max_renew; - char *last_change; - char *changed_by; - char *expires; + char *created; + char *modified; + char *valid_start; + char *valid_end; + char *pw_end; char *flags; }; @@ -63,11 +63,15 @@ skip_next(char *p) return p; } -time_t -str2time(char *s) +time_t* +parse_time(time_t *t, char *s) { int year, month, date, hour, minute, second; struct tm tm; + if(strcmp(s, "-") == 0) + return NULL; + if(t == NULL) + t = malloc(sizeof(*t)); sscanf(s, "%04d%02d%02d%02d%02d%02d", &year, &month, &date, &hour, &minute, &second); tm.tm_year = year - 1900; @@ -77,13 +81,108 @@ str2time(char *s) tm.tm_min = minute; tm.tm_sec = second; tm.tm_isdst = 0; - return timegm(&tm); + *t = timegm(&tm); + return t; +} + +unsigned* +parse_integer(unsigned *u, char *s) +{ + if(u == NULL) + u = malloc(sizeof(*u)); + sscanf(s, "%u", u); + return u; +} + +static void +parse_keys(hdb_entry *ent, char *str) +{ + char *save = NULL; + Key *key; + int tmp; + char *p; + int i; + p = strtok_r(str, ":", &save); + sscanf(p, "%d", &tmp); + ent->kvno = tmp; + p = strtok_r(NULL, ":", &save); + while(p){ + Key *key; + key = realloc(ent->keys.val, + (ent->keys.len + 1) * sizeof(*ent->keys.val)); + if(key == NULL) + abort(); + ent->keys.val = key; + key = ent->keys.val + ent->keys.len; + ent->keys.len++; + sscanf(p, "%d", &tmp); + key->mkvno = tmp; + p = strtok_r(NULL, ":", &save); + sscanf(p, "%d", &tmp); + key->key.keytype = tmp; + p = strtok_r(NULL, ":", &save); + krb5_data_alloc(&key->key.keyvalue, (strlen(p) - 1) / 2 + 1); + for(i = 0; i < strlen(p); i += 2){ + sscanf(p + i, "%02x", &tmp); + ((u_char*)key->key.keyvalue.data)[i / 2] = tmp; + } + p = strtok_r(NULL, ":", &save); + if(strcmp(p, "-") != 0){ + key->salt = malloc(sizeof(*key->salt)); + krb5_data_alloc(key->salt, (strlen(p) - 1) / 2 + 1); + for(i = 0; i < strlen(p); i += 2){ + sscanf(p + i, "%02x", &tmp); + ((u_char*)key->salt->data)[i / 2] = tmp; + } + } + p = strtok_r(NULL, ":", &save); + } +} + +static Event* +parse_event(Event *ev, char *str) +{ + char *save = NULL; + char *p; + if(strcmp(str, "-") == 0) + return NULL; + if(ev == NULL) + ev = malloc(sizeof(*ev)); + memset(ev, 0, sizeof(*ev)); + p = strtok_r(str, ":", &save); + parse_time(&ev->time, p); + p = strtok_r(NULL, ":", &save); + krb5_parse_name(context, p, &ev->principal); + return ev; +} + +static HDBFlags +parse_flags(char *str) +{ + unsigned i; + HDBFlags f; + parse_integer(&i, str); + f.initial = i & 1; + i >>= 1; + f.forwardable = i & 1; + i >>= 1; + f.proxiable = i & 1; + i >>= 1; + f.renewable = i & 1; + i >>= 1; + f.postdate = i & 1; + i >>= 1; + f.server = i & 1; + i >>= 1; + f.client = i & 1; + i >>= 1; + f.invalid = i & 1; + return f; } static void doit(char *filename, int merge) { -#if 0 FILE *f; HDB *db; char s[1024]; @@ -122,69 +221,61 @@ doit(char *filename, int merge) } } p = skip_next(p); - e.kvno = p; - while(*p && isdigit(*p)) p++; - *p++ = 0; - e.keytype = p; - while(*p && isdigit(*p)) p++; - *p++ = 0; + e.key = p; p = skip_next(p); + e.created = p; + p = skip_next(p); + + e.modified = p; + p = skip_next(p); + + e.valid_start = p; + p = skip_next(p); + + e.valid_end = p; + p = skip_next(p); + + e.pw_end = p; + p = skip_next(p); + e.max_life = p; p = skip_next(p); e.max_renew = p; p = skip_next(p); - e.last_change = p; - p = skip_next(p); - - e.changed_by = p; - p = skip_next(p); - - e.expires = p; - p = skip_next(p); - e.flags = p; p = skip_next(p); - { - krb5_principal p; - err = krb5_parse_name(context, e.principal, &p); - if(err){ - fprintf(stderr, "%s:%s:%s (%s)\n", - filename, - line, - krb5_get_err_text(context, err), - e.principal); - continue; - } - ent.principal = *p; - free(p); + memset(&ent, 0, sizeof(ent)); + err = krb5_parse_name(context, e.principal, &ent.principal); + if(err){ + fprintf(stderr, "%s:%s:%s (%s)\n", + filename, + line, + krb5_get_err_text(context, err), + e.principal); + continue; } - ent.keyblock.keytype = KEYTYPE_DES; - ent.keyblock.keyvalue.data = malloc(strlen(e.key)/2+1); - for(i = 0; i < strlen(e.key); i += 2){ - unsigned tmp; - sscanf(e.key + i, "%2x", &tmp); - ((unsigned char *)ent.keyblock.keyvalue.data)[i/2] = tmp; - } - ent.keyblock.keyvalue.length = i / 2; - ent.kvno = atoi(e.kvno); - ent.max_life = atoi(e.max_life); - ent.max_renew = atoi(e.max_renew); - ent.last_change = str2time(e.last_change); - krb5_parse_name(context, e.changed_by, &ent.changed_by); - ent.expires = str2time(e.expires); - ent.flags.i = atoi(e.flags); /* XXX */ + parse_keys(&ent, e.key); + + parse_event(&ent.created_by, e.created); + ent.modified_by = parse_event(NULL, e.modified); + ent.valid_start = parse_time(NULL, e.valid_start); + ent.valid_end = parse_time(NULL, e.valid_end); + ent.pw_end = parse_time(NULL, e.pw_end); + ent.max_life = parse_integer(NULL, e.max_life); + ent.max_renew = parse_integer(NULL, e.max_renew); + + ent.flags = parse_flags(e.flags); db->store(context, db, &ent); hdb_free_entry (context, &ent); } db->close(context, db); fclose(f); -#endif } int