remove.c revision 78527
1230557Sjimharris/* 2230557Sjimharris * Copyright (c) 1997 - 2001 Kungliga Tekniska H�gskolan 3230557Sjimharris * (Royal Institute of Technology, Stockholm, Sweden). 4230557Sjimharris * All rights reserved. 5230557Sjimharris * 6230557Sjimharris * Redistribution and use in source and binary forms, with or without 7230557Sjimharris * modification, are permitted provided that the following conditions 8230557Sjimharris * are met: 9230557Sjimharris * 10230557Sjimharris * 1. Redistributions of source code must retain the above copyright 11230557Sjimharris * notice, this list of conditions and the following disclaimer. 12230557Sjimharris * 13230557Sjimharris * 2. Redistributions in binary form must reproduce the above copyright 14230557Sjimharris * notice, this list of conditions and the following disclaimer in the 15230557Sjimharris * documentation and/or other materials provided with the distribution. 16230557Sjimharris * 17230557Sjimharris * 3. Neither the name of the Institute nor the names of its contributors 18230557Sjimharris * may be used to endorse or promote products derived from this software 19230557Sjimharris * without specific prior written permission. 20230557Sjimharris * 21230557Sjimharris * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 22230557Sjimharris * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23230557Sjimharris * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24230557Sjimharris * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 25230557Sjimharris * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26230557Sjimharris * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27230557Sjimharris * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28230557Sjimharris * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29230557Sjimharris * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30230557Sjimharris * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31230557Sjimharris * SUCH DAMAGE. 32230557Sjimharris */ 33230557Sjimharris 34230557Sjimharris#include "ktutil_locl.h" 35230557Sjimharris 36230557SjimharrisRCSID("$Id: remove.c,v 1.2 2001/05/10 15:44:58 assar Exp $"); 37230557Sjimharris 38230557Sjimharrisint 39230557Sjimharriskt_remove(int argc, char **argv) 40230557Sjimharris{ 41230557Sjimharris krb5_error_code ret = 0; 42230557Sjimharris krb5_keytab_entry entry; 43230557Sjimharris krb5_keytab keytab; 44230557Sjimharris char *principal_string = NULL; 45230557Sjimharris krb5_principal principal = NULL; 46230557Sjimharris int kvno = 0; 47230557Sjimharris char *keytype_string = NULL; 48230557Sjimharris krb5_enctype enctype = 0; 49230557Sjimharris int help_flag = 0; 50230557Sjimharris struct getargs args[] = { 51230557Sjimharris { "principal", 'p', arg_string, NULL, "principal to remove" }, 52230557Sjimharris { "kvno", 'V', arg_integer, NULL, "key version to remove" }, 53230557Sjimharris { "enctype", 'e', arg_string, NULL, "enctype to remove" }, 54230557Sjimharris { "help", 'h', arg_flag, NULL } 55230557Sjimharris }; 56230557Sjimharris int num_args = sizeof(args) / sizeof(args[0]); 57230557Sjimharris int optind = 0; 58230557Sjimharris int i = 0; 59230557Sjimharris args[i++].value = &principal_string; 60230557Sjimharris args[i++].value = &kvno; 61230557Sjimharris args[i++].value = &keytype_string; 62230557Sjimharris args[i++].value = &help_flag; 63230557Sjimharris if(getarg(args, num_args, argc, argv, &optind)) { 64230557Sjimharris arg_printusage(args, num_args, "ktutil remove", ""); 65230557Sjimharris return 1; 66230557Sjimharris } 67230557Sjimharris if(help_flag) { 68230557Sjimharris arg_printusage(args, num_args, "ktutil remove", ""); 69230557Sjimharris return 0; 70230557Sjimharris } 71230557Sjimharris if(principal_string) { 72230557Sjimharris ret = krb5_parse_name(context, principal_string, &principal); 73230557Sjimharris if(ret) { 74230557Sjimharris krb5_warn(context, ret, "%s", principal_string); 75230557Sjimharris return 1; 76230557Sjimharris } 77230557Sjimharris } 78230557Sjimharris if(keytype_string) { 79230557Sjimharris ret = krb5_string_to_enctype(context, keytype_string, &enctype); 80230557Sjimharris if(ret) { 81230557Sjimharris int t; 82230557Sjimharris if(sscanf(keytype_string, "%d", &t) == 1) 83230557Sjimharris enctype = t; 84230557Sjimharris else { 85230557Sjimharris krb5_warn(context, ret, "%s", keytype_string); 86230557Sjimharris if(principal) 87230557Sjimharris krb5_free_principal(context, principal); 88230557Sjimharris return 1; 89230557Sjimharris } 90230557Sjimharris } 91230557Sjimharris } 92230557Sjimharris if (!principal && !enctype && !kvno) { 93230557Sjimharris krb5_warnx(context, 94230557Sjimharris "You must give at least one of " 95230557Sjimharris "principal, enctype or kvno."); 96230557Sjimharris return 1; 97230557Sjimharris } 98230557Sjimharris 99230557Sjimharris if (keytab_string == NULL) { 100230557Sjimharris ret = krb5_kt_default_modify_name (context, keytab_buf, 101230557Sjimharris sizeof(keytab_buf)); 102230557Sjimharris if (ret) { 103230557Sjimharris krb5_warn(context, ret, "krb5_kt_default_modify_name"); 104230557Sjimharris return 1; 105230557Sjimharris } 106 keytab_string = keytab_buf; 107 } 108 ret = krb5_kt_resolve(context, keytab_string, &keytab); 109 if (ret) { 110 krb5_warn(context, ret, "resolving keytab %s", keytab_string); 111 return 1; 112 } 113 114 if (verbose_flag) 115 fprintf (stderr, "Using keytab %s\n", keytab_string); 116 117 entry.principal = principal; 118 entry.keyblock.keytype = enctype; 119 entry.vno = kvno; 120 ret = krb5_kt_remove_entry(context, keytab, &entry); 121 krb5_kt_close(context, keytab); 122 if(ret) 123 krb5_warn(context, ret, "remove"); 124 if(principal) 125 krb5_free_principal(context, principal); 126 return 0; 127} 128 129