Home | History | Annotate | Download | only in dbutil
      1 /*
      2  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
      3  * Use is subject to license terms.
      4  */
      5 
      6 /*
      7  * WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
      8  *
      9  *	Openvision retains the copyright to derivative works of
     10  *	this source code.  Do *NOT* create a derivative of this
     11  *	source code before consulting with your legal department.
     12  *	Do *NOT* integrate *ANY* of this source code into another
     13  *	product before consulting with your legal department.
     14  *
     15  *	For further information, read the top-level Openvision
     16  *	copyright which is contained in the top-level MIT Kerberos
     17  *	copyright.
     18  *
     19  * WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
     20  *
     21  */
     22 
     23 
     24 /*
     25  * admin/destroy/kdb5_destroy.c
     26  *
     27  * Copyright 1990 by the Massachusetts Institute of Technology.
     28  * All Rights Reserved.
     29  *
     30  * Export of this software from the United States of America may
     31  *   require a specific license from the United States Government.
     32  *   It is the responsibility of any person or organization contemplating
     33  *   export to obtain such a license before exporting.
     34  *
     35  * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
     36  * distribute this software and its documentation for any purpose and
     37  * without fee is hereby granted, provided that the above copyright
     38  * notice appear in all copies and that both that copyright notice and
     39  * this permission notice appear in supporting documentation, and that
     40  * the name of M.I.T. not be used in advertising or publicity pertaining
     41  * to distribution of the software without specific, written prior
     42  * permission.  Furthermore if you modify this software you must label
     43  * your software as modified software and not distribute it in such a
     44  * fashion that it might be confused with the original M.I.T. software.
     45  * M.I.T. makes no representations about the suitability of
     46  * this software for any purpose.  It is provided "as is" without express
     47  * or implied warranty.
     48  *
     49  *
     50  * kdb_dest(roy): destroy the named database.
     51  *
     52  * This version knows about DBM format databases.
     53  */
     54 
     55 #include "k5-int.h"
     56 #include <stdio.h>
     57 #include "com_err.h"
     58 #include <kadm5/admin.h>
     59 #include <kdb.h>
     60 #include <libintl.h>
     61 #include "kdb5_util.h"
     62 
     63 extern int exit_status;
     64 extern krb5_boolean dbactive;
     65 extern kadm5_config_params global_params;
     66 
     67 void
     68 kdb5_destroy(argc, argv)
     69     int argc;
     70     char *argv[];
     71 {
     72     extern char *optarg;
     73     extern int optind;
     74     int optchar;
     75     char *dbname;
     76     char buf[5];
     77     krb5_error_code retval1;
     78     krb5_context context;
     79     int force = 0;
     80     char ufilename[MAX_FILENAME];
     81 
     82     retval1 = kadm5_init_krb5_context(&context);
     83     if( retval1 )
     84     {
     85 	/* Solaris Kerberos */
     86 	com_err(progname, retval1, "while initializing krb5_context");
     87 	exit(1);
     88     }
     89 
     90     if ((retval1 = krb5_set_default_realm(context,
     91 					  util_context->default_realm))) {
     92 	/* Solaris Kerberos */
     93 	com_err(progname, retval1, "while setting default realm name");
     94 	exit(1);
     95     }
     96 
     97 /* Solaris Kerberos */
     98 #if 0
     99     if (strrchr(argv[0], '/'))
    100 	argv[0] = strrchr(argv[0], '/')+1;
    101 #endif
    102     dbname = global_params.dbname;
    103 
    104     optind = 1;
    105     while ((optchar = getopt(argc, argv, "f")) != -1) {
    106 	switch(optchar) {
    107 	case 'f':
    108 	    force++;
    109 	    break;
    110 	case '?':
    111 	default:
    112 	    usage();
    113 	    return;
    114 	    /*NOTREACHED*/
    115 	}
    116     }
    117     if (!force) {
    118 	printf(gettext("Deleting KDC database stored in '%s', "
    119 		"are you sure?\n"), dbname);
    120 	printf(gettext("(type 'yes' or 'y' to confirm)? "));
    121 	if (fgets(buf, sizeof(buf), stdin) == NULL) {
    122 	    exit_status++; return;
    123         }
    124 	if ((strncmp(buf, gettext("yes\n"),
    125 	 	strlen(gettext("yes\n"))) != 0) &&
    126 	(strncmp(buf, gettext("y\n"),
    127 		strlen(gettext("y\n"))) != 0)) {
    128 	printf(gettext("database not deleted !! '%s'...\n"),
    129 		dbname);
    130 
    131 	    exit_status++; return;
    132         }
    133 	printf(gettext("OK, deleting database '%s'...\n"), dbname);
    134     }
    135 
    136     retval1 = krb5_db_destroy(context, db5util_db_args);
    137 
    138     /* check for a stash file and delete it if necessary */
    139     if (global_params.stash_file == NULL) {
    140 	char stash[MAXPATHLEN+1];
    141 	extern krb5_principal master_princ;
    142 	krb5_data *realm = krb5_princ_realm(context, master_princ);
    143 	(void) strlcpy(stash, DEFAULT_KEYFILE_STUB, sizeof (stash));
    144 	/*
    145 	 * realm->data is not necessarily NULL terminated so be
    146 	 * careful how much data is copied here.  Don't overrun
    147 	 * the "stash" buffer and dont overrun the realm->data buffer,
    148 	 * copy the smaller of the 2 lengths.
    149 	 */
    150 	(void) strncat(stash, realm->data,
    151 		(realm->length < (MAXPATHLEN-strlen(stash)) ? realm->length :
    152 		MAXPATHLEN-strlen(stash)));
    153 	global_params.stash_file = (char *)strdup(stash);
    154     }
    155     if (!access(global_params.stash_file, F_OK))
    156 	(void)unlink(global_params.stash_file);
    157 
    158     if (retval1) {
    159 		/* Solaris Kerberos */
    160 		com_err(progname, retval1,
    161 			gettext("deleting database '%s'"), dbname);
    162 	exit_status++; return;
    163     }
    164 
    165     if (global_params.iprop_enabled) {
    166 	if (strlcpy(ufilename, dbname, MAX_FILENAME) >= MAX_FILENAME) {
    167 		exit_status++;
    168 		return;
    169 	}
    170 	if (strlcat(ufilename, ".ulog", MAX_FILENAME) >= MAX_FILENAME) {
    171 		exit_status++;
    172 		return;
    173 	}
    174 
    175 	(void) unlink(ufilename);
    176     }
    177 
    178     dbactive = FALSE;
    179     printf(gettext("** Database '%s' destroyed.\n"), dbname);
    180     return;
    181 }
    182