From 3d7ef4835af28441122ca15c825e903101f7d065 Mon Sep 17 00:00:00 2001 From: Assar Westerlund Date: Wed, 27 Aug 1997 23:38:33 +0000 Subject: [PATCH] add print_flags, parse_flags, init_entry, set_created_by, set_modified_by, edit_entry, set_password. Use them. git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@3198 ec53bebd-3082-4978-b11e-865c3cabbd6b --- admin/util.c | 167 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 167 insertions(+) diff --git a/admin/util.c b/admin/util.c index a04f19d36..39ead96a7 100644 --- a/admin/util.c +++ b/admin/util.c @@ -86,6 +86,11 @@ event2string(Event *ev, char **str) *str = p; } +/* + * Perhaps this should not be a struct of bit-fields or rather a union + * of an int and a struct of bit-fields. + */ + int flags2int(HDBFlags *f) { @@ -100,3 +105,165 @@ flags2int(HDBFlags *f) (f->require_preauth << 8) | (f->change_pw << 9); } + +static struct flag_name { + const char *name; + int val; +} flag_names[] = { + {"initial", 0}, + {"forwardable", 1}, + {"proxiable", 2}, + {"renewable", 3}, + {"postdate", 4}, + {"server", 5}, + {"client", 6}, + {"invalid", 7}, + {"require_preauth", 8}, + {"change_pw", 9}, + {NULL, 0} +}; + +void +print_flags (FILE *fp, HDBFlags *flags) +{ + struct flag_name *f; + int first_flag = 1; + int n = flags2int (flags); + + for(f = flag_names; f->name != NULL; ++f) + if (n & f->val) { + if(!first_flag) + fprintf(fp, ", "); + fprintf(fp, "%s", f->name); + first_flag = 0; + } +} + +int +parse_flags (const char *s, HDBFlags *flags) +{ +} + +void +init_entry (HDB *db, hdb_entry *ent) +{ + krb5_realm *realm; + krb5_principal def_principal; + hdb_entry def; + + realm = krb5_princ_realm(context, ent->principal); + krb5_build_principal(context, &def_principal, + strlen(*realm), + *realm, + "default", + NULL); + def.principal = def_principal; + if(db->fetch(context, db, &def)) { + /* XXX */ + } + krb5_free_principal (context, def_principal); + memset(&ent->flags, 0, sizeof(ent->flags)); + ent->flags.client = 1; + ent->flags.server = 1; + ent->flags.forwardable = 1; + ent->flags.proxiable = 1; + ent->flags.renewable = 1; + ent->flags.postdate = 1; + ent->max_life = malloc(sizeof(*ent->max_life)); + *ent->max_life = *def.max_life; + ent->max_renew = malloc(sizeof(*ent->max_renew)); + *ent->max_renew = *def.max_renew; + hdb_free_entry(context, &def); + +} + +static void +set_event (hdb_entry *ent, Event *ev) +{ + krb5_realm *realm; + + ev->time = time(NULL); + realm = krb5_princ_realm(context, ent->principal); + + krb5_build_principal(context, &ev->principal, + strlen(*realm), + *realm, + "kadmin", + NULL); +} + +void +set_created_by (hdb_entry *ent) +{ + set_event (ent, &ent->created_by); +} + +void +set_modified_by (hdb_entry *ent) +{ + if (ent->modified_by) + free_Event(ent->modified_by); + else + ent->modified_by = malloc(sizeof(*ent->modified_by)); + set_event (ent, ent->modified_by); +} + +static void +get_life (const char *name, unsigned **v) +{ + char buf[128]; + time_t t; + + if (*v) { + unparse_time (**v, buf, sizeof(buf)); + t = getlife (name, buf); + } else { + t = getlife (name, "unlimited"); + } + if (t) { + if(*v == NULL) + *v = malloc(sizeof(**v)); + **v = t; + } else if(*v) { + free(*v); + *v = NULL; + } +} + +static void +get_time (const char *name, time_t **v) +{ + /* XXX */ +} + +void +edit_entry(hdb_entry *ent) +{ + get_time ("Valid start", &ent->valid_start); + get_time ("Valid end", &ent->valid_end); + get_time ("Password end", &ent->pw_end); + get_life ("Max ticket life", &ent->max_life); + get_life ("Max renewable life", &ent->max_renew); + /* flags */ +} + +void +set_password(hdb_entry *ent) +{ + char buf[128]; + int i; + + des_read_pw_string(buf, sizeof(buf), "Password:", 1); + for (i = 0; i < ent->keys.len; ++i) + free_Key (&ent->keys.val[i]); + free (ent->keys.val); + if(strcasecmp(buf, "random") == 0) { + ent->keys.len = 0; + ent->keys.val = NULL; + init_des_key(ent); + } else{ + ent->keys.len = 1; + ent->keys.val = calloc(1, sizeof(*ent->keys.val)); + set_keys(ent, buf); + } +}