From bae1697bdbff507500ff7c4b59285e58621c43f1 Mon Sep 17 00:00:00 2001 From: Johan Danielsson Date: Sun, 1 Mar 1998 04:04:07 +0000 Subject: [PATCH] Use `foreach_principal'. git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@4499 ec53bebd-3082-4978-b11e-865c3cabbd6b --- kadmin/cpw.c | 96 ++++++++++++++++++++++++++++------------------------ kadmin/del.c | 26 ++++++-------- kadmin/ext.c | 82 ++++++++++++++++++++++++-------------------- 3 files changed, 106 insertions(+), 98 deletions(-) diff --git a/kadmin/cpw.c b/kadmin/cpw.c index 4eda0b8cf..5b5d6c93c 100644 --- a/kadmin/cpw.c +++ b/kadmin/cpw.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997 Kungliga Tekniska Högskolan + * Copyright (c) 1997, 1998 Kungliga Tekniska Högskolan * (Royal Institute of Technology, Stockholm, Sweden). * All rights reserved. * @@ -40,6 +40,11 @@ RCSID("$Id$"); +struct cpw_entry_data { + int random; + char *password; +}; + static struct getargs args[] = { { "random-key", 'r', arg_flag, NULL, "set random key" }, { "password", 'p', arg_string, NULL, "princial's password" }, @@ -53,18 +58,55 @@ usage(void) arg_printusage(args, num_args, "principal..."); } +static int +do_cpw_entry(krb5_principal principal, void *data) +{ + char *pw, pwbuf[128], prompt[128], *pr; + struct cpw_entry_data *e = data; + krb5_error_code ret; + + pw = e->password; + if(e->random == 0){ + if(pw == NULL){ + krb5_unparse_name(context, principal, &pr); + snprintf(prompt, sizeof(prompt), "%s's Password: ", pr); + free(pr); + ret = des_read_pw_string(pwbuf, sizeof(pwbuf), prompt, 1); + if(ret){ + return 0; /* XXX error code? */ + } + pw = pwbuf; + } + if(ret == 0) + ret = kadm5_chpass_principal(kadm_handle, principal, pw); + memset(pwbuf, 0, sizeof(pwbuf)); + }else{ + int i; + krb5_keyblock *keys; + int num_keys; + ret = kadm5_randkey_principal(kadm_handle, principal, &keys, &num_keys); + if(ret) + return ret; + for(i = 0; i < num_keys; i++) + krb5_free_keyblock_contents(context, &keys[i]); + free(keys); + } + return ret; +} + int cpw_entry(int argc, char **argv) { krb5_error_code ret; - krb5_principal princ; int i; int optind = 0; - char *password = NULL, pwbuf[128], prompt[128], *pr; - int rnd = 0; + struct cpw_entry_data data; - args[0].value = &rnd; - args[1].value = &password; + data.random = 0; + data.password = NULL; + + args[0].value = &data.random; + args[1].value = &data.password; if(getarg(args, num_args, argc, argv, &optind)){ usage(); return 0; @@ -72,45 +114,9 @@ cpw_entry(int argc, char **argv) argc -= optind; argv += optind; - if(password == NULL) - password = pwbuf; - - for(i = 0; i < argc; i++){ - ret = krb5_parse_name(context, argv[i], &princ); - if(ret){ - krb5_warn(context, ret, "krb5_parse_name(%s)", argv[i]); - continue; - } - if(rnd == 0){ - if(password == pwbuf){ - krb5_unparse_name(context, princ, &pr); - snprintf(prompt, sizeof(prompt), "%s's Password: ", pr); - free(pr); - ret = des_read_pw_string(pwbuf, sizeof(pwbuf), prompt, 1); - if(ret){ - printf("Verify failure\n"); - } - } - if(ret == 0){ - ret = kadm5_chpass_principal(kadm_handle, princ, password); - if(ret) - krb5_warn(context, ret, "%s", argv[i]); - } - memset(pwbuf, 0, sizeof(pwbuf)); - }else{ - krb5_keyblock *keys; - int num_keys; - ret = kadm5_randkey_principal(kadm_handle, princ, &keys, &num_keys); - if(ret) - krb5_warn(context, ret, "%s", argv[i]); - else{ - for(i = 0; i < num_keys; i++) - krb5_free_keyblock_contents(context, &keys[i]); - free(keys); - } - } - krb5_free_principal(context, princ); - } + for(i = 0; i < argc; i++) + ret = foreach_principal(argv[i], do_cpw_entry, &data); + return 0; } diff --git a/kadmin/del.c b/kadmin/del.c index 77c0a242f..3e2cf6fa5 100644 --- a/kadmin/del.c +++ b/kadmin/del.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997 Kungliga Tekniska Högskolan + * Copyright (c) 1997, 1998 Kungliga Tekniska Högskolan * (Royal Institute of Technology, Stockholm, Sweden). * All rights reserved. * @@ -40,24 +40,18 @@ RCSID("$Id$"); +static int +do_del_entry(krb5_principal principal, void *data) +{ + return kadm5_delete_principal(kadm_handle, principal); +} + int del_entry(int argc, char **argv) { - krb5_error_code ret; - krb5_principal princ; int i; - - for(i = 1; i < argc; i++){ - ret = krb5_parse_name(context, argv[i], &princ); - if(ret){ - krb5_warn(context, ret, "krb5_parse_name(%s)", argv[i]); - continue; - } - ret = kadm5_delete_principal(kadm_handle, princ); - if(ret) - krb5_warn(context, ret, "%s", argv[i]); - krb5_free_principal(context, princ); - } + krb5_error_code ret; + for(i = 0; i < argc; i++) + ret = foreach_principal(argv[i], do_del_entry, NULL); return 0; } - diff --git a/kadmin/ext.c b/kadmin/ext.c index 420d5d142..79cf908b4 100644 --- a/kadmin/ext.c +++ b/kadmin/ext.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997 Kungliga Tekniska Högskolan + * Copyright (c) 1997, 1998 Kungliga Tekniska Högskolan * (Royal Institute of Technology, Stockholm, Sweden). * All rights reserved. * @@ -40,6 +40,10 @@ RCSID("$Id$"); +struct ext_keytab_data { + krb5_keytab keytab; +}; + static struct getargs args[] = { { "keytab", 'k', arg_string, NULL, "keytab to use" }, }; @@ -52,61 +56,65 @@ usage(void) arg_printusage(args, num_args, "principal..."); } +static int +do_ext_keytab(krb5_principal principal, void *data) +{ + krb5_error_code ret; + int i; + kadm5_principal_ent_rec princ; + struct ext_keytab_data *e = data; + + ret = kadm5_get_principal(kadm_handle, principal, &princ, + KADM5_PRINCIPAL|KADM5_KVNO|KADM5_KEY_DATA); + if(ret) + return ret; + for(i = 0; i < princ.n_key_data; i++){ + krb5_keytab_entry key; + krb5_key_data *k = &princ.key_data[i]; + key.principal = princ.principal; + key.vno = k->key_data_kvno; + key.keyblock.keytype = k->key_data_type[0]; + key.keyblock.keyvalue.length = k->key_data_length[0]; + key.keyblock.keyvalue.data = k->key_data_contents[0]; + ret = krb5_kt_add_entry(context, e->keytab, &key); + if(ret) + krb5_warn(context, ret, "krb5_kt_add_entry"); + } + kadm5_free_principal_ent(kadm_handle, &princ); + return 0; +} + int ext_keytab(int argc, char **argv) { krb5_error_code ret; - kadm5_principal_ent_rec princ; - krb5_principal princ_ent; int i; int optind = 0; char *keytab = NULL; - krb5_keytab kt; - + struct ext_keytab_data data; + args[0].value = &keytab; if(getarg(args, num_args, argc, argv, &optind)){ usage(); return 0; } - argc -= optind; - argv += optind; - if(keytab) - ret = krb5_kt_resolve(context, keytab, &kt); + ret = krb5_kt_resolve(context, keytab, &data.keytab); else - ret = krb5_kt_default(context, &kt); + ret = krb5_kt_default(context, &data.keytab); if(ret){ krb5_warn(context, ret, "krb5_kt_resolve"); return 0; } - for(i = 0; i < argc; i++){ - ret = krb5_parse_name(context, argv[i], &princ_ent); - if(ret){ - krb5_warn(context, ret, "krb5_parse_name(%s)", argv[i]); - continue; - } - ret = kadm5_get_principal(kadm_handle, princ_ent, &princ, - KADM5_PRINCIPAL|KADM5_KVNO|KADM5_KEY_DATA); - if(ret){ - krb5_warn(context, ret, "%s", argv[i]); - }else{ - for(i = 0; i < princ.n_key_data; i++){ - krb5_keytab_entry key; - krb5_key_data *k = &princ.key_data[i]; - key.principal = princ.principal; - key.vno = k->key_data_kvno; - key.keyblock.keytype = k->key_data_type[0]; - key.keyblock.keyvalue.length = k->key_data_length[0]; - key.keyblock.keyvalue.data = k->key_data_contents[0]; - ret = krb5_kt_add_entry(context, kt, &key); - if(ret) - krb5_warn(context, ret, "krb5_kt_add_entry"); - } - kadm5_free_principal_ent(kadm_handle, &princ); - } - krb5_free_principal(context, princ_ent); - } + argc -= optind; + argv += optind; + + for(i = 0; i < argc; i++) + foreach_principal(argv[i], do_ext_keytab, &data); + + krb5_kt_close(context, data.keytab); + return 0; }