split up ktutil in several files
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@7714 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
@@ -8,7 +8,15 @@ man_MANS = ktutil.8
|
|||||||
|
|
||||||
sbin_PROGRAMS = ktutil
|
sbin_PROGRAMS = ktutil
|
||||||
|
|
||||||
ktutil_SOURCES = ktutil.c srvconvert.c srvcreate.c
|
ktutil_SOURCES = add.c \
|
||||||
|
change.c \
|
||||||
|
copy.c \
|
||||||
|
get.c \
|
||||||
|
ktutil.c \
|
||||||
|
list.c \
|
||||||
|
remove.c \
|
||||||
|
srvconvert.c \
|
||||||
|
srvcreate.c
|
||||||
|
|
||||||
LDADD = \
|
LDADD = \
|
||||||
$(top_builddir)/lib/kadm5/libkadm5clnt.la \
|
$(top_builddir)/lib/kadm5/libkadm5clnt.la \
|
||||||
|
155
admin/add.c
Normal file
155
admin/add.c
Normal file
@@ -0,0 +1,155 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 1997 - 2000 Kungliga Tekniska H<>gskolan
|
||||||
|
* (Royal Institute of Technology, Stockholm, Sweden).
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of the Institute nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "ktutil_locl.h"
|
||||||
|
|
||||||
|
RCSID("$Id$");
|
||||||
|
|
||||||
|
int
|
||||||
|
kt_add(int argc, char **argv)
|
||||||
|
{
|
||||||
|
krb5_error_code ret;
|
||||||
|
krb5_keytab_entry entry;
|
||||||
|
char buf[128];
|
||||||
|
char *principal_string = NULL;
|
||||||
|
int kvno = -1;
|
||||||
|
char *enctype_string = NULL;
|
||||||
|
krb5_enctype enctype;
|
||||||
|
char *password_string = NULL;
|
||||||
|
int salt_flag = 1;
|
||||||
|
int random_flag = 0;
|
||||||
|
int help_flag = 0;
|
||||||
|
struct getargs args[] = {
|
||||||
|
{ "principal", 'p', arg_string, NULL, "principal of key", "principal"},
|
||||||
|
{ "kvno", 'V', arg_integer, NULL, "key version of key" },
|
||||||
|
{ "enctype", 'e', arg_string, NULL, "encryption type of key" },
|
||||||
|
{ "password", 'w', arg_string, NULL, "password for key"},
|
||||||
|
{ "salt", 's', arg_negative_flag, NULL, "no salt" },
|
||||||
|
{ "random", 'r', arg_flag, NULL, "generate random key" },
|
||||||
|
{ "help", 'h', arg_flag, NULL }
|
||||||
|
};
|
||||||
|
int num_args = sizeof(args) / sizeof(args[0]);
|
||||||
|
int optind = 0;
|
||||||
|
int i = 0;
|
||||||
|
args[i++].value = &principal_string;
|
||||||
|
args[i++].value = &kvno;
|
||||||
|
args[i++].value = &enctype_string;
|
||||||
|
args[i++].value = &password_string;
|
||||||
|
args[i++].value = &salt_flag;
|
||||||
|
args[i++].value = &random_flag;
|
||||||
|
args[i++].value = &help_flag;
|
||||||
|
|
||||||
|
if(getarg(args, num_args, argc, argv, &optind)) {
|
||||||
|
arg_printusage(args, num_args, "ktutil add", "");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if(help_flag) {
|
||||||
|
arg_printusage(args, num_args, "ktutil add", "");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if(principal_string == NULL) {
|
||||||
|
printf("Principal: ");
|
||||||
|
if (fgets(buf, sizeof(buf), stdin) == NULL)
|
||||||
|
return 0;
|
||||||
|
buf[strcspn(buf, "\r\n")] = '\0';
|
||||||
|
principal_string = buf;
|
||||||
|
}
|
||||||
|
ret = krb5_parse_name(context, principal_string, &entry.principal);
|
||||||
|
if(ret) {
|
||||||
|
krb5_warn(context, ret, "%s", principal_string);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if(enctype_string == NULL) {
|
||||||
|
printf("Encryption type: ");
|
||||||
|
if (fgets(buf, sizeof(buf), stdin) == NULL) {
|
||||||
|
krb5_free_principal (context, entry.principal);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
buf[strcspn(buf, "\r\n")] = '\0';
|
||||||
|
enctype_string = buf;
|
||||||
|
}
|
||||||
|
ret = krb5_string_to_enctype(context, enctype_string, &enctype);
|
||||||
|
if(ret) {
|
||||||
|
int t;
|
||||||
|
if(sscanf(enctype_string, "%d", &t) == 1)
|
||||||
|
enctype = t;
|
||||||
|
else {
|
||||||
|
krb5_warn(context, ret, "%s", enctype_string);
|
||||||
|
krb5_free_principal(context, entry.principal);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(kvno == -1) {
|
||||||
|
printf("Key version: ");
|
||||||
|
if (fgets(buf, sizeof(buf), stdin) == NULL) {
|
||||||
|
krb5_free_principal (context, entry.principal);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
buf[strcspn(buf, "\r\n")] = '\0';
|
||||||
|
kvno = atoi(buf);
|
||||||
|
}
|
||||||
|
if(password_string == NULL && random_flag == 0) {
|
||||||
|
if(des_read_pw_string(buf, sizeof(buf), "Password: ", 1)) {
|
||||||
|
krb5_free_principal (context, entry.principal);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
password_string = buf;
|
||||||
|
}
|
||||||
|
if(password_string) {
|
||||||
|
if (!salt_flag) {
|
||||||
|
krb5_salt salt;
|
||||||
|
krb5_data pw;
|
||||||
|
|
||||||
|
salt.salttype = KRB5_PW_SALT;
|
||||||
|
salt.saltvalue.data = NULL;
|
||||||
|
salt.saltvalue.length = 0;
|
||||||
|
pw.data = (void*)password_string;
|
||||||
|
pw.length = strlen(password_string);
|
||||||
|
krb5_string_to_key_data_salt(context, enctype, pw, salt,
|
||||||
|
&entry.keyblock);
|
||||||
|
} else {
|
||||||
|
krb5_string_to_key(context, enctype, password_string,
|
||||||
|
entry.principal, &entry.keyblock);
|
||||||
|
}
|
||||||
|
memset (password_string, 0, strlen(password_string));
|
||||||
|
} else {
|
||||||
|
krb5_generate_random_keyblock(context, enctype, &entry.keyblock);
|
||||||
|
}
|
||||||
|
entry.vno = kvno;
|
||||||
|
entry.timestamp = time (NULL);
|
||||||
|
ret = krb5_kt_add_entry(context, keytab, &entry);
|
||||||
|
if(ret)
|
||||||
|
krb5_warn(context, ret, "add");
|
||||||
|
krb5_kt_free_entry(context, &entry);
|
||||||
|
return 0;
|
||||||
|
}
|
224
admin/change.c
Normal file
224
admin/change.c
Normal file
@@ -0,0 +1,224 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 1997 - 2000 Kungliga Tekniska H<>gskolan
|
||||||
|
* (Royal Institute of Technology, Stockholm, Sweden).
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of the Institute nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "ktutil_locl.h"
|
||||||
|
|
||||||
|
RCSID("$Id$");
|
||||||
|
|
||||||
|
static void
|
||||||
|
change_entry (krb5_context context, krb5_keytab_entry *entry,
|
||||||
|
const char *realm, const char *admin_server, int server_port)
|
||||||
|
{
|
||||||
|
krb5_error_code ret;
|
||||||
|
kadm5_config_params conf;
|
||||||
|
void *kadm_handle;
|
||||||
|
char *client_name;
|
||||||
|
krb5_keyblock *keys;
|
||||||
|
int num_keys;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
ret = krb5_unparse_name (context, entry->principal, &client_name);
|
||||||
|
if (ret) {
|
||||||
|
krb5_warn (context, ret, "kadm5_c_init_with_skey_ctx");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset (&conf, 0, sizeof(conf));
|
||||||
|
|
||||||
|
if(realm)
|
||||||
|
conf.realm = (char *)realm;
|
||||||
|
else
|
||||||
|
conf.realm = *krb5_princ_realm (context, entry->principal);
|
||||||
|
conf.mask |= KADM5_CONFIG_REALM;
|
||||||
|
|
||||||
|
if (admin_server) {
|
||||||
|
conf.admin_server = (char *)admin_server;
|
||||||
|
conf.mask |= KADM5_CONFIG_ADMIN_SERVER;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (server_port) {
|
||||||
|
conf.kadmind_port = htons(server_port);
|
||||||
|
conf.mask |= KADM5_CONFIG_KADMIND_PORT;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = kadm5_init_with_skey_ctx (context,
|
||||||
|
client_name,
|
||||||
|
keytab_string,
|
||||||
|
KADM5_ADMIN_SERVICE,
|
||||||
|
&conf, 0, 0,
|
||||||
|
&kadm_handle);
|
||||||
|
free (client_name);
|
||||||
|
if (ret) {
|
||||||
|
krb5_warn (context, ret, "kadm5_c_init_with_skey_ctx");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ret = kadm5_randkey_principal (kadm_handle, entry->principal,
|
||||||
|
&keys, &num_keys);
|
||||||
|
kadm5_destroy (kadm_handle);
|
||||||
|
if (ret) {
|
||||||
|
krb5_warn(context, ret, "kadm5_randkey_principal");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (i = 0; i < num_keys; ++i) {
|
||||||
|
krb5_keytab_entry new_entry;
|
||||||
|
|
||||||
|
new_entry = *entry;
|
||||||
|
new_entry.timestamp = time (NULL);
|
||||||
|
++new_entry.vno;
|
||||||
|
new_entry.keyblock = keys[i];
|
||||||
|
|
||||||
|
ret = krb5_kt_add_entry (context, keytab, &new_entry);
|
||||||
|
if (ret)
|
||||||
|
krb5_warn (context, ret, "krb5_kt_add_entry");
|
||||||
|
krb5_free_keyblock_contents (context, &keys[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* loop over all the entries in the keytab (or those given) and change
|
||||||
|
* their keys, writing the new keys
|
||||||
|
*/
|
||||||
|
|
||||||
|
int
|
||||||
|
kt_change (int argc, char **argv)
|
||||||
|
{
|
||||||
|
krb5_error_code ret;
|
||||||
|
krb5_kt_cursor cursor;
|
||||||
|
krb5_keytab_entry entry;
|
||||||
|
char *realm = NULL;
|
||||||
|
char *admin_server = NULL;
|
||||||
|
int server_port = 0;
|
||||||
|
int help_flag = 0;
|
||||||
|
int optind = 0;
|
||||||
|
int j, max;
|
||||||
|
krb5_principal *princs;
|
||||||
|
|
||||||
|
struct getargs args[] = {
|
||||||
|
{ "realm", 'r', arg_string, NULL,
|
||||||
|
"realm to use", "realm"
|
||||||
|
},
|
||||||
|
{ "admin-server", 'a', arg_string, NULL,
|
||||||
|
"server to contact", "host"
|
||||||
|
},
|
||||||
|
{ "server-port", 's', arg_integer, NULL,
|
||||||
|
"port to contact", "port number"
|
||||||
|
},
|
||||||
|
{ "help", 'h', arg_flag, NULL }
|
||||||
|
};
|
||||||
|
|
||||||
|
args[0].value = &realm;
|
||||||
|
args[1].value = &admin_server;
|
||||||
|
args[2].value = &server_port;
|
||||||
|
args[3].value = &help_flag;
|
||||||
|
|
||||||
|
if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optind)
|
||||||
|
|| help_flag) {
|
||||||
|
arg_printusage(args, sizeof(args) / sizeof(args[0]),
|
||||||
|
"ktutil change", "principal...");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
j = 0;
|
||||||
|
max = 10;
|
||||||
|
princs = malloc (max * sizeof(*princs));
|
||||||
|
if (princs == NULL) {
|
||||||
|
krb5_warnx (context, "malloc: out of memory");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = krb5_kt_start_seq_get(context, keytab, &cursor);
|
||||||
|
if(ret){
|
||||||
|
krb5_warn(context, ret, "krb5_kt_start_seq_get");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
while((ret = krb5_kt_next_entry(context, keytab, &entry, &cursor)) == 0) {
|
||||||
|
int i;
|
||||||
|
int done = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < j; ++i)
|
||||||
|
if (krb5_principal_compare (context, princs[i],
|
||||||
|
entry.principal))
|
||||||
|
break;
|
||||||
|
if (i < j)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (optind == argc) {
|
||||||
|
change_entry (context, &entry, realm, admin_server, server_port);
|
||||||
|
done = 1;
|
||||||
|
} else {
|
||||||
|
for (i = optind; i < argc; ++i) {
|
||||||
|
krb5_principal princ;
|
||||||
|
|
||||||
|
ret = krb5_parse_name (context, argv[i], &princ);
|
||||||
|
if (ret) {
|
||||||
|
krb5_warn (context, ret, "krb5_parse_name %s", argv[i]);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (krb5_principal_compare (context, princ, entry.principal)) {
|
||||||
|
change_entry (context, &entry,
|
||||||
|
realm, admin_server, server_port);
|
||||||
|
done = 1;
|
||||||
|
}
|
||||||
|
krb5_free_principal (context, princ);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (done) {
|
||||||
|
if (j >= max) {
|
||||||
|
void *tmp;
|
||||||
|
|
||||||
|
max *= 2;
|
||||||
|
tmp = realloc (princs, max * sizeof(*princs));
|
||||||
|
if (tmp == NULL) {
|
||||||
|
krb5_kt_free_entry (context, &entry);
|
||||||
|
krb5_warnx (context, "realloc: out of memory");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
princs = tmp;
|
||||||
|
}
|
||||||
|
ret = krb5_copy_principal (context, entry.principal, &princs[j]);
|
||||||
|
if (ret) {
|
||||||
|
krb5_warn (context, ret, "krb5_copy_principal");
|
||||||
|
krb5_kt_free_entry (context, &entry);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
++j;
|
||||||
|
}
|
||||||
|
krb5_kt_free_entry (context, &entry);
|
||||||
|
}
|
||||||
|
while (j-- > 0)
|
||||||
|
krb5_free_principal (context, princs[j]);
|
||||||
|
free (princs);
|
||||||
|
ret = krb5_kt_end_seq_get(context, keytab, &cursor);
|
||||||
|
return 0;
|
||||||
|
}
|
119
admin/copy.c
Normal file
119
admin/copy.c
Normal file
@@ -0,0 +1,119 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 1997 - 2000 Kungliga Tekniska H<>gskolan
|
||||||
|
* (Royal Institute of Technology, Stockholm, Sweden).
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of the Institute nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "ktutil_locl.h"
|
||||||
|
|
||||||
|
RCSID("$Id$");
|
||||||
|
|
||||||
|
int
|
||||||
|
kt_copy (int argc, char **argv)
|
||||||
|
{
|
||||||
|
krb5_error_code ret;
|
||||||
|
int help_flag = 0;
|
||||||
|
int optind = 0;
|
||||||
|
krb5_keytab src_keytab, dst_keytab;
|
||||||
|
krb5_kt_cursor cursor;
|
||||||
|
krb5_keytab_entry entry;
|
||||||
|
|
||||||
|
struct getargs args[] = {
|
||||||
|
{ "help", 'h', arg_flag, NULL}
|
||||||
|
};
|
||||||
|
|
||||||
|
int num_args = sizeof(args) / sizeof(args[0]);
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
args[i++].value = &help_flag;
|
||||||
|
|
||||||
|
if(getarg(args, num_args, argc, argv, &optind)) {
|
||||||
|
arg_printusage(args, num_args, "ktutil copy",
|
||||||
|
"keytab-src keytab-dest");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (help_flag) {
|
||||||
|
arg_printusage(args, num_args, "ktutil copy",
|
||||||
|
"keytab-src keytab-dest");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
argv += optind;
|
||||||
|
argc -= optind;
|
||||||
|
|
||||||
|
if (argc != 2) {
|
||||||
|
arg_printusage(args, num_args, "ktutil copy",
|
||||||
|
"keytab-src keytab-dest");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = krb5_kt_resolve (context, argv[0], &src_keytab);
|
||||||
|
if (ret) {
|
||||||
|
krb5_warn (context, ret, "resolving src keytab `%s'", argv[0]);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = krb5_kt_resolve (context, argv[1], &dst_keytab);
|
||||||
|
if (ret) {
|
||||||
|
krb5_kt_close (context, src_keytab);
|
||||||
|
krb5_warn (context, ret, "resolving dst keytab `%s'", argv[1]);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = krb5_kt_start_seq_get (context, src_keytab, &cursor);
|
||||||
|
if (ret) {
|
||||||
|
krb5_warn (context, ret, "krb5_kt_start_seq_get");
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
while((ret = krb5_kt_next_entry(context, src_keytab,
|
||||||
|
&entry, &cursor)) == 0) {
|
||||||
|
ret = krb5_kt_add_entry (context, dst_keytab, &entry);
|
||||||
|
if (verbose_flag) {
|
||||||
|
char *name_str;
|
||||||
|
|
||||||
|
krb5_unparse_name (context, entry.principal, &name_str);
|
||||||
|
printf ("copying %s\n", name_str);
|
||||||
|
free (name_str);
|
||||||
|
}
|
||||||
|
|
||||||
|
krb5_kt_free_entry (context, &entry);
|
||||||
|
if (ret) {
|
||||||
|
krb5_warn (context, ret, "krb5_kt_add_entry");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
krb5_kt_end_seq_get (context, src_keytab, &cursor);
|
||||||
|
|
||||||
|
fail:
|
||||||
|
krb5_kt_close (context, src_keytab);
|
||||||
|
krb5_kt_close (context, dst_keytab);
|
||||||
|
return 0;
|
||||||
|
}
|
162
admin/get.c
Normal file
162
admin/get.c
Normal file
@@ -0,0 +1,162 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 1997 - 2000 Kungliga Tekniska H<>gskolan
|
||||||
|
* (Royal Institute of Technology, Stockholm, Sweden).
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of the Institute nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "ktutil_locl.h"
|
||||||
|
|
||||||
|
RCSID("$Id$");
|
||||||
|
|
||||||
|
int
|
||||||
|
kt_get(int argc, char **argv)
|
||||||
|
{
|
||||||
|
krb5_error_code ret;
|
||||||
|
kadm5_config_params conf;
|
||||||
|
void *kadm_handle;
|
||||||
|
char *principal = NULL;
|
||||||
|
char *realm = NULL;
|
||||||
|
char *admin_server = NULL;
|
||||||
|
int server_port = 0;
|
||||||
|
int help_flag = 0;
|
||||||
|
int optind = 0;
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
struct getargs args[] = {
|
||||||
|
{ "principal", 'p', arg_string, NULL,
|
||||||
|
"admin principal", "principal"
|
||||||
|
},
|
||||||
|
{ "realm", 'r', arg_string, NULL,
|
||||||
|
"realm to use", "realm"
|
||||||
|
},
|
||||||
|
{ "admin-server", 'a', arg_string, NULL,
|
||||||
|
"server to contact", "host"
|
||||||
|
},
|
||||||
|
{ "server-port", 's', arg_integer, NULL,
|
||||||
|
"port to contact", "port number"
|
||||||
|
},
|
||||||
|
{ "help", 'h', arg_flag, NULL }
|
||||||
|
};
|
||||||
|
|
||||||
|
args[0].value = &principal;
|
||||||
|
args[1].value = &realm;
|
||||||
|
args[2].value = &admin_server;
|
||||||
|
args[3].value = &server_port;
|
||||||
|
args[4].value = &help_flag;
|
||||||
|
|
||||||
|
memset(&conf, 0, sizeof(conf));
|
||||||
|
|
||||||
|
if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optind)
|
||||||
|
|| help_flag) {
|
||||||
|
arg_printusage(args, sizeof(args) / sizeof(args[0]),
|
||||||
|
"ktutil get", "principal...");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(realm) {
|
||||||
|
krb5_set_default_realm(context, realm); /* XXX should be fixed
|
||||||
|
some other way */
|
||||||
|
conf.realm = realm;
|
||||||
|
conf.mask |= KADM5_CONFIG_REALM;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (admin_server) {
|
||||||
|
conf.admin_server = admin_server;
|
||||||
|
conf.mask |= KADM5_CONFIG_ADMIN_SERVER;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (server_port) {
|
||||||
|
conf.kadmind_port = htons(server_port);
|
||||||
|
conf.mask |= KADM5_CONFIG_KADMIND_PORT;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = kadm5_init_with_password_ctx(context,
|
||||||
|
principal,
|
||||||
|
NULL,
|
||||||
|
KADM5_ADMIN_SERVICE,
|
||||||
|
&conf, 0, 0,
|
||||||
|
&kadm_handle);
|
||||||
|
if(ret) {
|
||||||
|
krb5_warn(context, ret, "kadm5_init_with_password");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
for(i = optind; i < argc; i++){
|
||||||
|
krb5_principal princ_ent;
|
||||||
|
kadm5_principal_ent_rec princ;
|
||||||
|
int mask = 0;
|
||||||
|
krb5_keyblock *keys;
|
||||||
|
int n_keys;
|
||||||
|
int created = 0;
|
||||||
|
krb5_keytab_entry entry;
|
||||||
|
|
||||||
|
ret = krb5_parse_name(context, argv[i], &princ_ent);
|
||||||
|
memset(&princ, 0, sizeof(princ));
|
||||||
|
princ.principal = princ_ent;
|
||||||
|
mask |= KADM5_PRINCIPAL;
|
||||||
|
princ.attributes |= KRB5_KDB_DISALLOW_ALL_TIX;
|
||||||
|
mask |= KADM5_ATTRIBUTES;
|
||||||
|
princ.princ_expire_time = 0;
|
||||||
|
mask |= KADM5_PRINC_EXPIRE_TIME;
|
||||||
|
|
||||||
|
ret = kadm5_create_principal(kadm_handle, &princ, mask, "x");
|
||||||
|
if(ret == 0)
|
||||||
|
created++;
|
||||||
|
else if(ret != KADM5_DUP) {
|
||||||
|
krb5_free_principal(context, princ_ent);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
ret = kadm5_randkey_principal(kadm_handle, princ_ent, &keys, &n_keys);
|
||||||
|
|
||||||
|
ret = kadm5_get_principal(kadm_handle, princ_ent, &princ,
|
||||||
|
KADM5_PRINCIPAL | KADM5_KVNO | KADM5_ATTRIBUTES);
|
||||||
|
princ.attributes &= (~KRB5_KDB_DISALLOW_ALL_TIX);
|
||||||
|
mask = KADM5_ATTRIBUTES;
|
||||||
|
if(created) {
|
||||||
|
princ.kvno = 1;
|
||||||
|
mask |= KADM5_KVNO;
|
||||||
|
}
|
||||||
|
ret = kadm5_modify_principal(kadm_handle, &princ, mask);
|
||||||
|
for(j = 0; j < n_keys; j++) {
|
||||||
|
entry.principal = princ_ent;
|
||||||
|
entry.vno = princ.kvno;
|
||||||
|
entry.keyblock = keys[j];
|
||||||
|
entry.timestamp = time (NULL);
|
||||||
|
ret = krb5_kt_add_entry(context, keytab, &entry);
|
||||||
|
krb5_free_keyblock_contents(context, &keys[j]);
|
||||||
|
}
|
||||||
|
|
||||||
|
kadm5_free_principal_ent(kadm_handle, &princ);
|
||||||
|
krb5_free_principal(context, princ_ent);
|
||||||
|
}
|
||||||
|
kadm5_destroy(kadm_handle);
|
||||||
|
return 0;
|
||||||
|
}
|
643
admin/ktutil.c
643
admin/ktutil.c
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1997, 1998, 1999 Kungliga Tekniska H<>gskolan
|
* Copyright (c) 1997 - 2000 Kungliga Tekniska H<>gskolan
|
||||||
* (Royal Institute of Technology, Stockholm, Sweden).
|
* (Royal Institute of Technology, Stockholm, Sweden).
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
@@ -35,643 +35,10 @@
|
|||||||
|
|
||||||
RCSID("$Id$");
|
RCSID("$Id$");
|
||||||
|
|
||||||
static int help_flag;
|
int help_flag;
|
||||||
static int version_flag;
|
int version_flag;
|
||||||
static int verbose_flag;
|
int verbose_flag;
|
||||||
static char *keytab_string;
|
char *keytab_string;
|
||||||
|
|
||||||
static int
|
|
||||||
kt_list(int argc, char **argv)
|
|
||||||
{
|
|
||||||
krb5_error_code ret;
|
|
||||||
krb5_kt_cursor cursor;
|
|
||||||
krb5_keytab_entry entry;
|
|
||||||
|
|
||||||
ret = krb5_kt_start_seq_get(context, keytab, &cursor);
|
|
||||||
if(ret){
|
|
||||||
krb5_warn(context, ret, "krb5_kt_start_seq_get");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
printf("%s", "Version");
|
|
||||||
printf(" ");
|
|
||||||
printf("%-15s", "Type");
|
|
||||||
printf(" ");
|
|
||||||
printf("%s", "Principal");
|
|
||||||
printf("\n");
|
|
||||||
while((ret = krb5_kt_next_entry(context, keytab, &entry, &cursor)) == 0){
|
|
||||||
char *p;
|
|
||||||
printf(" %3d ", entry.vno);
|
|
||||||
printf(" ");
|
|
||||||
ret = krb5_enctype_to_string(context, entry.keyblock.keytype, &p);
|
|
||||||
if (ret != 0)
|
|
||||||
asprintf(&p, "unknown (%d)", entry.keyblock.keytype);
|
|
||||||
printf("%-15s", p);
|
|
||||||
free(p);
|
|
||||||
printf(" ");
|
|
||||||
krb5_unparse_name(context, entry.principal, &p);
|
|
||||||
printf("%s ", p);
|
|
||||||
free(p);
|
|
||||||
printf("\n");
|
|
||||||
if (verbose_flag) {
|
|
||||||
char tstamp[256];
|
|
||||||
struct tm *tm;
|
|
||||||
time_t ts = entry.timestamp;
|
|
||||||
|
|
||||||
tm = gmtime (&ts);
|
|
||||||
strftime (tstamp, sizeof(tstamp), "%Y-%m-%d %H:%M:%S UTC", tm);
|
|
||||||
printf(" Timestamp: %s\n", tstamp);
|
|
||||||
}
|
|
||||||
krb5_kt_free_entry(context, &entry);
|
|
||||||
}
|
|
||||||
ret = krb5_kt_end_seq_get(context, keytab, &cursor);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
kt_remove(int argc, char **argv)
|
|
||||||
{
|
|
||||||
krb5_error_code ret;
|
|
||||||
krb5_keytab_entry entry;
|
|
||||||
char *principal_string = NULL;
|
|
||||||
krb5_principal principal = NULL;
|
|
||||||
int kvno = 0;
|
|
||||||
char *keytype_string = NULL;
|
|
||||||
krb5_enctype enctype = 0;
|
|
||||||
int help_flag = 0;
|
|
||||||
struct getargs args[] = {
|
|
||||||
{ "principal", 'p', arg_string, NULL, "principal to remove" },
|
|
||||||
{ "kvno", 'V', arg_integer, NULL, "key version to remove" },
|
|
||||||
{ "enctype", 'e', arg_string, NULL, "enctype to remove" },
|
|
||||||
{ "help", 'h', arg_flag, NULL }
|
|
||||||
};
|
|
||||||
int num_args = sizeof(args) / sizeof(args[0]);
|
|
||||||
int optind = 0;
|
|
||||||
int i = 0;
|
|
||||||
args[i++].value = &principal_string;
|
|
||||||
args[i++].value = &kvno;
|
|
||||||
args[i++].value = &keytype_string;
|
|
||||||
args[i++].value = &help_flag;
|
|
||||||
if(getarg(args, num_args, argc, argv, &optind)) {
|
|
||||||
arg_printusage(args, num_args, "ktutil remove", "");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if(help_flag) {
|
|
||||||
arg_printusage(args, num_args, "ktutil remove", "");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if(principal_string) {
|
|
||||||
ret = krb5_parse_name(context, principal_string, &principal);
|
|
||||||
if(ret) {
|
|
||||||
krb5_warn(context, ret, "%s", principal_string);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(keytype_string) {
|
|
||||||
ret = krb5_string_to_enctype(context, keytype_string, &enctype);
|
|
||||||
if(ret) {
|
|
||||||
int t;
|
|
||||||
if(sscanf(keytype_string, "%d", &t) == 1)
|
|
||||||
enctype = t;
|
|
||||||
else {
|
|
||||||
krb5_warn(context, ret, "%s", keytype_string);
|
|
||||||
if(principal)
|
|
||||||
krb5_free_principal(context, principal);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!principal && !enctype && !kvno) {
|
|
||||||
krb5_warnx(context,
|
|
||||||
"You must give at least one of "
|
|
||||||
"principal, enctype or kvno.");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
entry.principal = principal;
|
|
||||||
entry.keyblock.keytype = enctype;
|
|
||||||
entry.vno = kvno;
|
|
||||||
ret = krb5_kt_remove_entry(context, keytab, &entry);
|
|
||||||
if(ret)
|
|
||||||
krb5_warn(context, ret, "remove");
|
|
||||||
if(principal)
|
|
||||||
krb5_free_principal(context, principal);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
kt_add(int argc, char **argv)
|
|
||||||
{
|
|
||||||
krb5_error_code ret;
|
|
||||||
krb5_keytab_entry entry;
|
|
||||||
char buf[128];
|
|
||||||
char *principal_string = NULL;
|
|
||||||
int kvno = -1;
|
|
||||||
char *enctype_string = NULL;
|
|
||||||
krb5_enctype enctype;
|
|
||||||
char *password_string = NULL;
|
|
||||||
int salt_flag = 1;
|
|
||||||
int random_flag = 0;
|
|
||||||
int help_flag = 0;
|
|
||||||
struct getargs args[] = {
|
|
||||||
{ "principal", 'p', arg_string, NULL, "principal of key", "principal"},
|
|
||||||
{ "kvno", 'V', arg_integer, NULL, "key version of key" },
|
|
||||||
{ "enctype", 'e', arg_string, NULL, "encryption type of key" },
|
|
||||||
{ "password", 'w', arg_string, NULL, "password for key"},
|
|
||||||
{ "salt", 's', arg_negative_flag, NULL, "no salt" },
|
|
||||||
{ "random", 'r', arg_flag, NULL, "generate random key" },
|
|
||||||
{ "help", 'h', arg_flag, NULL }
|
|
||||||
};
|
|
||||||
int num_args = sizeof(args) / sizeof(args[0]);
|
|
||||||
int optind = 0;
|
|
||||||
int i = 0;
|
|
||||||
args[i++].value = &principal_string;
|
|
||||||
args[i++].value = &kvno;
|
|
||||||
args[i++].value = &enctype_string;
|
|
||||||
args[i++].value = &password_string;
|
|
||||||
args[i++].value = &salt_flag;
|
|
||||||
args[i++].value = &random_flag;
|
|
||||||
args[i++].value = &help_flag;
|
|
||||||
|
|
||||||
if(getarg(args, num_args, argc, argv, &optind)) {
|
|
||||||
arg_printusage(args, num_args, "ktutil add", "");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if(help_flag) {
|
|
||||||
arg_printusage(args, num_args, "ktutil add", "");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if(principal_string == NULL) {
|
|
||||||
printf("Principal: ");
|
|
||||||
if (fgets(buf, sizeof(buf), stdin) == NULL)
|
|
||||||
return 0;
|
|
||||||
buf[strcspn(buf, "\r\n")] = '\0';
|
|
||||||
principal_string = buf;
|
|
||||||
}
|
|
||||||
ret = krb5_parse_name(context, principal_string, &entry.principal);
|
|
||||||
if(ret) {
|
|
||||||
krb5_warn(context, ret, "%s", principal_string);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if(enctype_string == NULL) {
|
|
||||||
printf("Encryption type: ");
|
|
||||||
if (fgets(buf, sizeof(buf), stdin) == NULL) {
|
|
||||||
krb5_free_principal (context, entry.principal);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
buf[strcspn(buf, "\r\n")] = '\0';
|
|
||||||
enctype_string = buf;
|
|
||||||
}
|
|
||||||
ret = krb5_string_to_enctype(context, enctype_string, &enctype);
|
|
||||||
if(ret) {
|
|
||||||
int t;
|
|
||||||
if(sscanf(enctype_string, "%d", &t) == 1)
|
|
||||||
enctype = t;
|
|
||||||
else {
|
|
||||||
krb5_warn(context, ret, "%s", enctype_string);
|
|
||||||
krb5_free_principal(context, entry.principal);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(kvno == -1) {
|
|
||||||
printf("Key version: ");
|
|
||||||
if (fgets(buf, sizeof(buf), stdin) == NULL) {
|
|
||||||
krb5_free_principal (context, entry.principal);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
buf[strcspn(buf, "\r\n")] = '\0';
|
|
||||||
kvno = atoi(buf);
|
|
||||||
}
|
|
||||||
if(password_string == NULL && random_flag == 0) {
|
|
||||||
if(des_read_pw_string(buf, sizeof(buf), "Password: ", 1)) {
|
|
||||||
krb5_free_principal (context, entry.principal);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
password_string = buf;
|
|
||||||
}
|
|
||||||
if(password_string) {
|
|
||||||
if (!salt_flag) {
|
|
||||||
krb5_salt salt;
|
|
||||||
krb5_data pw;
|
|
||||||
|
|
||||||
salt.salttype = KRB5_PW_SALT;
|
|
||||||
salt.saltvalue.data = NULL;
|
|
||||||
salt.saltvalue.length = 0;
|
|
||||||
pw.data = (void*)password_string;
|
|
||||||
pw.length = strlen(password_string);
|
|
||||||
krb5_string_to_key_data_salt(context, enctype, pw, salt,
|
|
||||||
&entry.keyblock);
|
|
||||||
} else {
|
|
||||||
krb5_string_to_key(context, enctype, password_string,
|
|
||||||
entry.principal, &entry.keyblock);
|
|
||||||
}
|
|
||||||
memset (password_string, 0, strlen(password_string));
|
|
||||||
} else {
|
|
||||||
krb5_generate_random_keyblock(context, enctype, &entry.keyblock);
|
|
||||||
}
|
|
||||||
entry.vno = kvno;
|
|
||||||
entry.timestamp = time (NULL);
|
|
||||||
ret = krb5_kt_add_entry(context, keytab, &entry);
|
|
||||||
if(ret)
|
|
||||||
krb5_warn(context, ret, "add");
|
|
||||||
krb5_kt_free_entry(context, &entry);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
kt_get(int argc, char **argv)
|
|
||||||
{
|
|
||||||
krb5_error_code ret;
|
|
||||||
kadm5_config_params conf;
|
|
||||||
void *kadm_handle;
|
|
||||||
char *principal = NULL;
|
|
||||||
char *realm = NULL;
|
|
||||||
char *admin_server = NULL;
|
|
||||||
int server_port = 0;
|
|
||||||
int help_flag = 0;
|
|
||||||
int optind = 0;
|
|
||||||
int i, j;
|
|
||||||
|
|
||||||
struct getargs args[] = {
|
|
||||||
{ "principal", 'p', arg_string, NULL,
|
|
||||||
"admin principal", "principal"
|
|
||||||
},
|
|
||||||
{ "realm", 'r', arg_string, NULL,
|
|
||||||
"realm to use", "realm"
|
|
||||||
},
|
|
||||||
{ "admin-server", 'a', arg_string, NULL,
|
|
||||||
"server to contact", "host"
|
|
||||||
},
|
|
||||||
{ "server-port", 's', arg_integer, NULL,
|
|
||||||
"port to contact", "port number"
|
|
||||||
},
|
|
||||||
{ "help", 'h', arg_flag, NULL }
|
|
||||||
};
|
|
||||||
|
|
||||||
args[0].value = &principal;
|
|
||||||
args[1].value = &realm;
|
|
||||||
args[2].value = &admin_server;
|
|
||||||
args[3].value = &server_port;
|
|
||||||
args[4].value = &help_flag;
|
|
||||||
|
|
||||||
memset(&conf, 0, sizeof(conf));
|
|
||||||
|
|
||||||
if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optind)
|
|
||||||
|| help_flag) {
|
|
||||||
arg_printusage(args, sizeof(args) / sizeof(args[0]),
|
|
||||||
"ktutil get", "principal...");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(realm) {
|
|
||||||
krb5_set_default_realm(context, realm); /* XXX should be fixed
|
|
||||||
some other way */
|
|
||||||
conf.realm = realm;
|
|
||||||
conf.mask |= KADM5_CONFIG_REALM;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (admin_server) {
|
|
||||||
conf.admin_server = admin_server;
|
|
||||||
conf.mask |= KADM5_CONFIG_ADMIN_SERVER;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (server_port) {
|
|
||||||
conf.kadmind_port = htons(server_port);
|
|
||||||
conf.mask |= KADM5_CONFIG_KADMIND_PORT;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = kadm5_init_with_password_ctx(context,
|
|
||||||
principal,
|
|
||||||
NULL,
|
|
||||||
KADM5_ADMIN_SERVICE,
|
|
||||||
&conf, 0, 0,
|
|
||||||
&kadm_handle);
|
|
||||||
if(ret) {
|
|
||||||
krb5_warn(context, ret, "kadm5_init_with_password");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
for(i = optind; i < argc; i++){
|
|
||||||
krb5_principal princ_ent;
|
|
||||||
kadm5_principal_ent_rec princ;
|
|
||||||
int mask = 0;
|
|
||||||
krb5_keyblock *keys;
|
|
||||||
int n_keys;
|
|
||||||
int created = 0;
|
|
||||||
krb5_keytab_entry entry;
|
|
||||||
|
|
||||||
ret = krb5_parse_name(context, argv[i], &princ_ent);
|
|
||||||
memset(&princ, 0, sizeof(princ));
|
|
||||||
princ.principal = princ_ent;
|
|
||||||
mask |= KADM5_PRINCIPAL;
|
|
||||||
princ.attributes |= KRB5_KDB_DISALLOW_ALL_TIX;
|
|
||||||
mask |= KADM5_ATTRIBUTES;
|
|
||||||
princ.princ_expire_time = 0;
|
|
||||||
mask |= KADM5_PRINC_EXPIRE_TIME;
|
|
||||||
|
|
||||||
ret = kadm5_create_principal(kadm_handle, &princ, mask, "x");
|
|
||||||
if(ret == 0)
|
|
||||||
created++;
|
|
||||||
else if(ret != KADM5_DUP) {
|
|
||||||
krb5_free_principal(context, princ_ent);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
ret = kadm5_randkey_principal(kadm_handle, princ_ent, &keys, &n_keys);
|
|
||||||
|
|
||||||
ret = kadm5_get_principal(kadm_handle, princ_ent, &princ,
|
|
||||||
KADM5_PRINCIPAL | KADM5_KVNO | KADM5_ATTRIBUTES);
|
|
||||||
princ.attributes &= (~KRB5_KDB_DISALLOW_ALL_TIX);
|
|
||||||
mask = KADM5_ATTRIBUTES;
|
|
||||||
if(created) {
|
|
||||||
princ.kvno = 1;
|
|
||||||
mask |= KADM5_KVNO;
|
|
||||||
}
|
|
||||||
ret = kadm5_modify_principal(kadm_handle, &princ, mask);
|
|
||||||
for(j = 0; j < n_keys; j++) {
|
|
||||||
entry.principal = princ_ent;
|
|
||||||
entry.vno = princ.kvno;
|
|
||||||
entry.keyblock = keys[j];
|
|
||||||
entry.timestamp = time (NULL);
|
|
||||||
ret = krb5_kt_add_entry(context, keytab, &entry);
|
|
||||||
krb5_free_keyblock_contents(context, &keys[j]);
|
|
||||||
}
|
|
||||||
|
|
||||||
kadm5_free_principal_ent(kadm_handle, &princ);
|
|
||||||
krb5_free_principal(context, princ_ent);
|
|
||||||
}
|
|
||||||
kadm5_destroy(kadm_handle);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
kt_copy (int argc, char **argv)
|
|
||||||
{
|
|
||||||
krb5_error_code ret;
|
|
||||||
int help_flag = 0;
|
|
||||||
int optind = 0;
|
|
||||||
krb5_keytab src_keytab, dst_keytab;
|
|
||||||
krb5_kt_cursor cursor;
|
|
||||||
krb5_keytab_entry entry;
|
|
||||||
|
|
||||||
struct getargs args[] = {
|
|
||||||
{ "help", 'h', arg_flag, NULL}
|
|
||||||
};
|
|
||||||
|
|
||||||
int num_args = sizeof(args) / sizeof(args[0]);
|
|
||||||
int i = 0;
|
|
||||||
|
|
||||||
args[i++].value = &help_flag;
|
|
||||||
|
|
||||||
if(getarg(args, num_args, argc, argv, &optind)) {
|
|
||||||
arg_printusage(args, num_args, "ktutil copy",
|
|
||||||
"keytab-src keytab-dest");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (help_flag) {
|
|
||||||
arg_printusage(args, num_args, "ktutil copy",
|
|
||||||
"keytab-src keytab-dest");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
argv += optind;
|
|
||||||
argc -= optind;
|
|
||||||
|
|
||||||
if (argc != 2) {
|
|
||||||
arg_printusage(args, num_args, "ktutil copy",
|
|
||||||
"keytab-src keytab-dest");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = krb5_kt_resolve (context, argv[0], &src_keytab);
|
|
||||||
if (ret) {
|
|
||||||
krb5_warn (context, ret, "resolving src keytab `%s'", argv[0]);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = krb5_kt_resolve (context, argv[1], &dst_keytab);
|
|
||||||
if (ret) {
|
|
||||||
krb5_kt_close (context, src_keytab);
|
|
||||||
krb5_warn (context, ret, "resolving dst keytab `%s'", argv[1]);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = krb5_kt_start_seq_get (context, src_keytab, &cursor);
|
|
||||||
if (ret) {
|
|
||||||
krb5_warn (context, ret, "krb5_kt_start_seq_get");
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
while((ret = krb5_kt_next_entry(context, src_keytab,
|
|
||||||
&entry, &cursor)) == 0) {
|
|
||||||
ret = krb5_kt_add_entry (context, dst_keytab, &entry);
|
|
||||||
if (verbose_flag) {
|
|
||||||
char *name_str;
|
|
||||||
|
|
||||||
krb5_unparse_name (context, entry.principal, &name_str);
|
|
||||||
printf ("copying %s\n", name_str);
|
|
||||||
free (name_str);
|
|
||||||
}
|
|
||||||
|
|
||||||
krb5_kt_free_entry (context, &entry);
|
|
||||||
if (ret) {
|
|
||||||
krb5_warn (context, ret, "krb5_kt_add_entry");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
krb5_kt_end_seq_get (context, src_keytab, &cursor);
|
|
||||||
|
|
||||||
fail:
|
|
||||||
krb5_kt_close (context, src_keytab);
|
|
||||||
krb5_kt_close (context, dst_keytab);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
change_entry (krb5_context context, krb5_keytab_entry *entry,
|
|
||||||
const char *realm, const char *admin_server, int server_port)
|
|
||||||
{
|
|
||||||
krb5_error_code ret;
|
|
||||||
kadm5_config_params conf;
|
|
||||||
void *kadm_handle;
|
|
||||||
char *client_name;
|
|
||||||
krb5_keyblock *keys;
|
|
||||||
int num_keys;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
ret = krb5_unparse_name (context, entry->principal, &client_name);
|
|
||||||
if (ret) {
|
|
||||||
krb5_warn (context, ret, "kadm5_c_init_with_skey_ctx");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
memset (&conf, 0, sizeof(conf));
|
|
||||||
|
|
||||||
if(realm)
|
|
||||||
conf.realm = (char *)realm;
|
|
||||||
else
|
|
||||||
conf.realm = *krb5_princ_realm (context, entry->principal);
|
|
||||||
conf.mask |= KADM5_CONFIG_REALM;
|
|
||||||
|
|
||||||
if (admin_server) {
|
|
||||||
conf.admin_server = (char *)admin_server;
|
|
||||||
conf.mask |= KADM5_CONFIG_ADMIN_SERVER;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (server_port) {
|
|
||||||
conf.kadmind_port = htons(server_port);
|
|
||||||
conf.mask |= KADM5_CONFIG_KADMIND_PORT;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = kadm5_init_with_skey_ctx (context,
|
|
||||||
client_name,
|
|
||||||
keytab_string,
|
|
||||||
KADM5_ADMIN_SERVICE,
|
|
||||||
&conf, 0, 0,
|
|
||||||
&kadm_handle);
|
|
||||||
free (client_name);
|
|
||||||
if (ret) {
|
|
||||||
krb5_warn (context, ret, "kadm5_c_init_with_skey_ctx");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
ret = kadm5_randkey_principal (kadm_handle, entry->principal,
|
|
||||||
&keys, &num_keys);
|
|
||||||
kadm5_destroy (kadm_handle);
|
|
||||||
if (ret) {
|
|
||||||
krb5_warn(context, ret, "kadm5_randkey_principal");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
for (i = 0; i < num_keys; ++i) {
|
|
||||||
krb5_keytab_entry new_entry;
|
|
||||||
|
|
||||||
new_entry = *entry;
|
|
||||||
new_entry.timestamp = time (NULL);
|
|
||||||
++new_entry.vno;
|
|
||||||
new_entry.keyblock = keys[i];
|
|
||||||
|
|
||||||
ret = krb5_kt_add_entry (context, keytab, &new_entry);
|
|
||||||
if (ret)
|
|
||||||
krb5_warn (context, ret, "krb5_kt_add_entry");
|
|
||||||
krb5_free_keyblock_contents (context, &keys[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* loop over all the entries in the keytab (or those given) and change
|
|
||||||
* their keys, writing the new keys
|
|
||||||
*/
|
|
||||||
|
|
||||||
static int
|
|
||||||
kt_change (int argc, char **argv)
|
|
||||||
{
|
|
||||||
krb5_error_code ret;
|
|
||||||
krb5_kt_cursor cursor;
|
|
||||||
krb5_keytab_entry entry;
|
|
||||||
char *realm = NULL;
|
|
||||||
char *admin_server = NULL;
|
|
||||||
int server_port = 0;
|
|
||||||
int help_flag = 0;
|
|
||||||
int optind = 0;
|
|
||||||
int j, max;
|
|
||||||
krb5_principal *princs;
|
|
||||||
|
|
||||||
struct getargs args[] = {
|
|
||||||
{ "realm", 'r', arg_string, NULL,
|
|
||||||
"realm to use", "realm"
|
|
||||||
},
|
|
||||||
{ "admin-server", 'a', arg_string, NULL,
|
|
||||||
"server to contact", "host"
|
|
||||||
},
|
|
||||||
{ "server-port", 's', arg_integer, NULL,
|
|
||||||
"port to contact", "port number"
|
|
||||||
},
|
|
||||||
{ "help", 'h', arg_flag, NULL }
|
|
||||||
};
|
|
||||||
|
|
||||||
args[0].value = &realm;
|
|
||||||
args[1].value = &admin_server;
|
|
||||||
args[2].value = &server_port;
|
|
||||||
args[3].value = &help_flag;
|
|
||||||
|
|
||||||
if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optind)
|
|
||||||
|| help_flag) {
|
|
||||||
arg_printusage(args, sizeof(args) / sizeof(args[0]),
|
|
||||||
"ktutil change", "principal...");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
j = 0;
|
|
||||||
max = 10;
|
|
||||||
princs = malloc (max * sizeof(*princs));
|
|
||||||
if (princs == NULL) {
|
|
||||||
krb5_warnx (context, "malloc: out of memory");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = krb5_kt_start_seq_get(context, keytab, &cursor);
|
|
||||||
if(ret){
|
|
||||||
krb5_warn(context, ret, "krb5_kt_start_seq_get");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
while((ret = krb5_kt_next_entry(context, keytab, &entry, &cursor)) == 0) {
|
|
||||||
int i;
|
|
||||||
int done = 0;
|
|
||||||
|
|
||||||
for (i = 0; i < j; ++i)
|
|
||||||
if (krb5_principal_compare (context, princs[i],
|
|
||||||
entry.principal))
|
|
||||||
break;
|
|
||||||
if (i < j)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (optind == argc) {
|
|
||||||
change_entry (context, &entry, realm, admin_server, server_port);
|
|
||||||
done = 1;
|
|
||||||
} else {
|
|
||||||
for (i = optind; i < argc; ++i) {
|
|
||||||
krb5_principal princ;
|
|
||||||
|
|
||||||
ret = krb5_parse_name (context, argv[i], &princ);
|
|
||||||
if (ret) {
|
|
||||||
krb5_warn (context, ret, "krb5_parse_name %s", argv[i]);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (krb5_principal_compare (context, princ, entry.principal)) {
|
|
||||||
change_entry (context, &entry,
|
|
||||||
realm, admin_server, server_port);
|
|
||||||
done = 1;
|
|
||||||
}
|
|
||||||
krb5_free_principal (context, princ);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (done) {
|
|
||||||
if (j >= max) {
|
|
||||||
void *tmp;
|
|
||||||
|
|
||||||
max *= 2;
|
|
||||||
tmp = realloc (princs, max * sizeof(*princs));
|
|
||||||
if (tmp == NULL) {
|
|
||||||
krb5_kt_free_entry (context, &entry);
|
|
||||||
krb5_warnx (context, "realloc: out of memory");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
princs = tmp;
|
|
||||||
}
|
|
||||||
ret = krb5_copy_principal (context, entry.principal, &princs[j]);
|
|
||||||
if (ret) {
|
|
||||||
krb5_warn (context, ret, "krb5_copy_principal");
|
|
||||||
krb5_kt_free_entry (context, &entry);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
++j;
|
|
||||||
}
|
|
||||||
krb5_kt_free_entry (context, &entry);
|
|
||||||
}
|
|
||||||
while (j-- > 0)
|
|
||||||
krb5_free_principal (context, princs[j]);
|
|
||||||
free (princs);
|
|
||||||
ret = krb5_kt_end_seq_get(context, keytab, &cursor);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int help(int argc, char **argv);
|
static int help(int argc, char **argv);
|
||||||
|
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1997, 1998, 1999 Kungliga Tekniska H<>gskolan
|
* Copyright (c) 1997 - 2000 Kungliga Tekniska H<>gskolan
|
||||||
* (Royal Institute of Technology, Stockholm, Sweden).
|
* (Royal Institute of Technology, Stockholm, Sweden).
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
@@ -63,6 +63,17 @@
|
|||||||
extern krb5_context context;
|
extern krb5_context context;
|
||||||
extern krb5_keytab keytab;
|
extern krb5_keytab keytab;
|
||||||
|
|
||||||
|
extern int help_flag;
|
||||||
|
extern int version_flag;
|
||||||
|
extern int verbose_flag;
|
||||||
|
extern char *keytab_string;
|
||||||
|
|
||||||
|
int kt_add (int argc, char **argv);
|
||||||
|
int kt_change (int argc, char **argv);
|
||||||
|
int kt_copy (int argc, char **argv);
|
||||||
|
int kt_get (int argc, char **argv);
|
||||||
|
int kt_list(int argc, char **argv);
|
||||||
|
int kt_remove(int argc, char **argv);
|
||||||
int srvconv(int argc, char **argv);
|
int srvconv(int argc, char **argv);
|
||||||
int srvcreate(int argc, char **argv);
|
int srvcreate(int argc, char **argv);
|
||||||
|
|
||||||
|
83
admin/list.c
Normal file
83
admin/list.c
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 1997 - 2000 Kungliga Tekniska H<>gskolan
|
||||||
|
* (Royal Institute of Technology, Stockholm, Sweden).
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of the Institute nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "ktutil_locl.h"
|
||||||
|
|
||||||
|
RCSID("$Id$");
|
||||||
|
|
||||||
|
int
|
||||||
|
kt_list(int argc, char **argv)
|
||||||
|
{
|
||||||
|
krb5_error_code ret;
|
||||||
|
krb5_kt_cursor cursor;
|
||||||
|
krb5_keytab_entry entry;
|
||||||
|
|
||||||
|
ret = krb5_kt_start_seq_get(context, keytab, &cursor);
|
||||||
|
if(ret){
|
||||||
|
krb5_warn(context, ret, "krb5_kt_start_seq_get");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
printf("%s", "Version");
|
||||||
|
printf(" ");
|
||||||
|
printf("%-15s", "Type");
|
||||||
|
printf(" ");
|
||||||
|
printf("%s", "Principal");
|
||||||
|
printf("\n");
|
||||||
|
while((ret = krb5_kt_next_entry(context, keytab, &entry, &cursor)) == 0){
|
||||||
|
char *p;
|
||||||
|
printf(" %3d ", entry.vno);
|
||||||
|
printf(" ");
|
||||||
|
ret = krb5_enctype_to_string(context, entry.keyblock.keytype, &p);
|
||||||
|
if (ret != 0)
|
||||||
|
asprintf(&p, "unknown (%d)", entry.keyblock.keytype);
|
||||||
|
printf("%-15s", p);
|
||||||
|
free(p);
|
||||||
|
printf(" ");
|
||||||
|
krb5_unparse_name(context, entry.principal, &p);
|
||||||
|
printf("%s ", p);
|
||||||
|
free(p);
|
||||||
|
printf("\n");
|
||||||
|
if (verbose_flag) {
|
||||||
|
char tstamp[256];
|
||||||
|
struct tm *tm;
|
||||||
|
time_t ts = entry.timestamp;
|
||||||
|
|
||||||
|
tm = gmtime (&ts);
|
||||||
|
strftime (tstamp, sizeof(tstamp), "%Y-%m-%d %H:%M:%S UTC", tm);
|
||||||
|
printf(" Timestamp: %s\n", tstamp);
|
||||||
|
}
|
||||||
|
krb5_kt_free_entry(context, &entry);
|
||||||
|
}
|
||||||
|
ret = krb5_kt_end_seq_get(context, keytab, &cursor);
|
||||||
|
return 0;
|
||||||
|
}
|
107
admin/remove.c
Normal file
107
admin/remove.c
Normal file
@@ -0,0 +1,107 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 1997 - 2000 Kungliga Tekniska H<>gskolan
|
||||||
|
* (Royal Institute of Technology, Stockholm, Sweden).
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of the Institute nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "ktutil_locl.h"
|
||||||
|
|
||||||
|
RCSID("$Id$");
|
||||||
|
|
||||||
|
int
|
||||||
|
kt_remove(int argc, char **argv)
|
||||||
|
{
|
||||||
|
krb5_error_code ret;
|
||||||
|
krb5_keytab_entry entry;
|
||||||
|
char *principal_string = NULL;
|
||||||
|
krb5_principal principal = NULL;
|
||||||
|
int kvno = 0;
|
||||||
|
char *keytype_string = NULL;
|
||||||
|
krb5_enctype enctype = 0;
|
||||||
|
int help_flag = 0;
|
||||||
|
struct getargs args[] = {
|
||||||
|
{ "principal", 'p', arg_string, NULL, "principal to remove" },
|
||||||
|
{ "kvno", 'V', arg_integer, NULL, "key version to remove" },
|
||||||
|
{ "enctype", 'e', arg_string, NULL, "enctype to remove" },
|
||||||
|
{ "help", 'h', arg_flag, NULL }
|
||||||
|
};
|
||||||
|
int num_args = sizeof(args) / sizeof(args[0]);
|
||||||
|
int optind = 0;
|
||||||
|
int i = 0;
|
||||||
|
args[i++].value = &principal_string;
|
||||||
|
args[i++].value = &kvno;
|
||||||
|
args[i++].value = &keytype_string;
|
||||||
|
args[i++].value = &help_flag;
|
||||||
|
if(getarg(args, num_args, argc, argv, &optind)) {
|
||||||
|
arg_printusage(args, num_args, "ktutil remove", "");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if(help_flag) {
|
||||||
|
arg_printusage(args, num_args, "ktutil remove", "");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if(principal_string) {
|
||||||
|
ret = krb5_parse_name(context, principal_string, &principal);
|
||||||
|
if(ret) {
|
||||||
|
krb5_warn(context, ret, "%s", principal_string);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(keytype_string) {
|
||||||
|
ret = krb5_string_to_enctype(context, keytype_string, &enctype);
|
||||||
|
if(ret) {
|
||||||
|
int t;
|
||||||
|
if(sscanf(keytype_string, "%d", &t) == 1)
|
||||||
|
enctype = t;
|
||||||
|
else {
|
||||||
|
krb5_warn(context, ret, "%s", keytype_string);
|
||||||
|
if(principal)
|
||||||
|
krb5_free_principal(context, principal);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!principal && !enctype && !kvno) {
|
||||||
|
krb5_warnx(context,
|
||||||
|
"You must give at least one of "
|
||||||
|
"principal, enctype or kvno.");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
entry.principal = principal;
|
||||||
|
entry.keyblock.keytype = enctype;
|
||||||
|
entry.vno = kvno;
|
||||||
|
ret = krb5_kt_remove_entry(context, keytab, &entry);
|
||||||
|
if(ret)
|
||||||
|
krb5_warn(context, ret, "remove");
|
||||||
|
if(principal)
|
||||||
|
krb5_free_principal(context, principal);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
Reference in New Issue
Block a user