provide interface to find avaible databates
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@15937 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
		
							
								
								
									
										212
									
								
								lib/hdb/dbinfo.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										212
									
								
								lib/hdb/dbinfo.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,212 @@ | |||||||
|  | /* | ||||||
|  |  * Copyright (c) 2005 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 "hdb_locl.h" | ||||||
|  |  | ||||||
|  | RCSID("$Id$"); | ||||||
|  |  | ||||||
|  | struct hdb_dbinfo { | ||||||
|  |     char *label; | ||||||
|  |     char *realm; | ||||||
|  |     char *dbname; | ||||||
|  |     char *mkey_file; | ||||||
|  |     const krb5_config_binding *binding; | ||||||
|  |     struct hdb_dbinfo *next; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | static int | ||||||
|  | get_dbinfo(krb5_context context, | ||||||
|  | 	   const krb5_config_binding *db_binding, | ||||||
|  | 	   const char *label, | ||||||
|  | 	   struct hdb_dbinfo **db) | ||||||
|  | { | ||||||
|  |     struct hdb_dbinfo *di; | ||||||
|  |     const char *p; | ||||||
|  |  | ||||||
|  |     *db = NULL; | ||||||
|  |  | ||||||
|  |     p = krb5_config_get_string(context, db_binding, "realm", NULL); | ||||||
|  |     if(p == NULL) | ||||||
|  | 	return 0; | ||||||
|  |  | ||||||
|  |     di = calloc(1, sizeof(*di)); | ||||||
|  |     if (di == NULL) { | ||||||
|  | 	krb5_set_error_string(context, "malloc: out of memory"); | ||||||
|  | 	return ENOMEM; | ||||||
|  |     } | ||||||
|  |     di->label = strdup(label); | ||||||
|  |     di->realm = strdup(p); | ||||||
|  |  | ||||||
|  |     p = krb5_config_get_string(context, db_binding, "dbname", NULL); | ||||||
|  |     if(p) | ||||||
|  | 	di->dbname = strdup(p); | ||||||
|  |     p = krb5_config_get_string(context, db_binding, "mkey_file", NULL); | ||||||
|  |     if(p) | ||||||
|  | 	di->mkey_file = strdup(p); | ||||||
|  |  | ||||||
|  |     di->binding = db_binding; | ||||||
|  |  | ||||||
|  |     *db = di; | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | int | ||||||
|  | hdb_get_dbinfo(krb5_context context, struct hdb_dbinfo **dbp) | ||||||
|  | { | ||||||
|  |     const krb5_config_binding *db_binding; | ||||||
|  |     struct hdb_dbinfo *di, **dt, *databases; | ||||||
|  |     const char *default_dbname = HDB_DEFAULT_DB; | ||||||
|  |     const char *default_mkey = HDB_DB_DIR "/m-key"; | ||||||
|  |     const char *p; | ||||||
|  |     int ret; | ||||||
|  |  | ||||||
|  |     *dbp = NULL; | ||||||
|  |     dt = NULL; | ||||||
|  |     databases = NULL; | ||||||
|  |  | ||||||
|  |     db_binding = krb5_config_get(context, NULL, krb5_config_list, | ||||||
|  | 				 "kdc",  | ||||||
|  | 				 "database", | ||||||
|  | 				 NULL); | ||||||
|  |     if (db_binding) { | ||||||
|  |  | ||||||
|  | 	ret = get_dbinfo(context, db_binding, "default", &di); | ||||||
|  | 	if (ret == 0 && di) { | ||||||
|  | 	    databases = di; | ||||||
|  | 	    dt = &di->next; | ||||||
|  | 	}		 | ||||||
|  |  | ||||||
|  | 	for ( ; db_binding != NULL; db_binding = db_binding->next) { | ||||||
|  |  | ||||||
|  | 	    if (db_binding->type != krb5_config_list) | ||||||
|  | 		continue; | ||||||
|  |  | ||||||
|  | 	    ret = get_dbinfo(context, db_binding->u.list,  | ||||||
|  | 			     db_binding->name, &di); | ||||||
|  | 	    if (ret) | ||||||
|  | 		krb5_err(context, 1, ret, "failed getting realm"); | ||||||
|  |  | ||||||
|  | 	    if (di == NULL) | ||||||
|  | 		continue; | ||||||
|  |  | ||||||
|  | 	    if (dt) | ||||||
|  | 		*dt = di; | ||||||
|  | 	    else | ||||||
|  | 		databases = di; | ||||||
|  | 	    dt = &di->next; | ||||||
|  |  | ||||||
|  | 	} | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if(databases == NULL) { | ||||||
|  | 	/* if there are none specified, use some default */ | ||||||
|  | 	di = calloc(1, sizeof(*di)); | ||||||
|  | 	di->dbname = strdup(default_dbname); | ||||||
|  | 	di->mkey_file = strdup(default_mkey); | ||||||
|  | 	databases = di; | ||||||
|  |     } | ||||||
|  |     for(di = databases; di; di = di->next) { | ||||||
|  | 	if(di->dbname == NULL) | ||||||
|  | 	    di->dbname = strdup(default_dbname); | ||||||
|  | 	if(di->mkey_file == NULL) { | ||||||
|  | 	    p = strrchr(di->dbname, '.'); | ||||||
|  | 	    if(p == NULL || strchr(p, '/') != NULL) | ||||||
|  | 		/* final pathname component does not contain a . */ | ||||||
|  | 		asprintf(&di->mkey_file, "%s.mkey", di->dbname); | ||||||
|  | 	    else | ||||||
|  | 		/* the filename is something.else, replace .else with | ||||||
|  |                    .mkey */ | ||||||
|  | 		asprintf(&di->mkey_file, "%.*s.mkey",  | ||||||
|  | 			 (int)(p - di->dbname), di->dbname); | ||||||
|  | 	} | ||||||
|  |     } | ||||||
|  |     *dbp = databases; | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | struct hdb_dbinfo * | ||||||
|  | hdb_dbinfo_get_next(struct hdb_dbinfo *dbp, struct hdb_dbinfo *dbprevp) | ||||||
|  | { | ||||||
|  |     if (dbprevp == NULL) | ||||||
|  | 	return dbp; | ||||||
|  |     else | ||||||
|  | 	return dbprevp->next; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | const char * | ||||||
|  | hdb_dbinfo_get_label(krb5_context context, struct hdb_dbinfo *dbp) | ||||||
|  | { | ||||||
|  |     return dbp->label; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | const char * | ||||||
|  | hdb_dbinfo_get_realm(krb5_context context, struct hdb_dbinfo *dbp) | ||||||
|  | { | ||||||
|  |     return dbp->realm; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | const char * | ||||||
|  | hdb_dbinfo_get_dbname(krb5_context context, struct hdb_dbinfo *dbp) | ||||||
|  | { | ||||||
|  |     return dbp->dbname; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | const char * | ||||||
|  | hdb_dbinfo_get_mkey_file(krb5_context context, struct hdb_dbinfo *dbp) | ||||||
|  | { | ||||||
|  |     return dbp->mkey_file; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | const krb5_config_binding * | ||||||
|  | hdb_dbinfo_get_binding(krb5_context context, struct hdb_dbinfo *dbp) | ||||||
|  | { | ||||||
|  |     return dbp->binding; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void | ||||||
|  | hdb_free_dbinfo(krb5_context context, struct hdb_dbinfo **dbp) | ||||||
|  | { | ||||||
|  |     struct hdb_dbinfo *di, *ndi; | ||||||
|  |  | ||||||
|  |     for(di = *dbp; di != NULL; di = ndi) { | ||||||
|  | 	ndi = di->next; | ||||||
|  | 	free (di->realm); | ||||||
|  | 	free (di->dbname); | ||||||
|  | 	if (di->mkey_file) | ||||||
|  | 	    free (di->mkey_file); | ||||||
|  | 	free(di); | ||||||
|  |     } | ||||||
|  |     *dbp = NULL; | ||||||
|  | } | ||||||
							
								
								
									
										90
									
								
								lib/hdb/test_dbinfo.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								lib/hdb/test_dbinfo.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,90 @@ | |||||||
|  | /* | ||||||
|  |  * Copyright (c) 2005 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 "hdb_locl.h" | ||||||
|  | #include <getarg.h> | ||||||
|  |  | ||||||
|  | RCSID("$Id$"); | ||||||
|  |  | ||||||
|  | static int help_flag; | ||||||
|  | static int version_flag; | ||||||
|  |  | ||||||
|  | struct getargs args[] = { | ||||||
|  |     { "help",		'h',	arg_flag,   &help_flag }, | ||||||
|  |     { "version",	0,	arg_flag,   &version_flag } | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | static int num_args = sizeof(args) / sizeof(args[0]); | ||||||
|  |  | ||||||
|  | int | ||||||
|  | main(int argc, char **argv) | ||||||
|  | { | ||||||
|  |     struct hdb_dbinfo *info, *d; | ||||||
|  |     krb5_context context; | ||||||
|  |     int ret, o = 0; | ||||||
|  |  | ||||||
|  |     setprogname(argv[0]); | ||||||
|  |  | ||||||
|  |     if(getarg(args, num_args, argc, argv, &o)) | ||||||
|  | 	krb5_std_usage(1, args, num_args); | ||||||
|  |  | ||||||
|  |     if(help_flag) | ||||||
|  | 	krb5_std_usage(0, args, num_args); | ||||||
|  |      | ||||||
|  |     if(version_flag){ | ||||||
|  | 	print_version(NULL); | ||||||
|  | 	exit(0); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     ret = krb5_init_context(&context); | ||||||
|  |     if (ret) | ||||||
|  | 	errx (1, "krb5_init_context failed: %d", ret); | ||||||
|  |  | ||||||
|  |     ret = hdb_get_dbinfo(context, &info); | ||||||
|  |     if (ret) | ||||||
|  | 	krb5_err(context, 1, ret, "hdb_get_dbinfo"); | ||||||
|  |  | ||||||
|  |     d = NULL; | ||||||
|  |     while ((d = hdb_dbinfo_get_next(info, d)) != NULL) { | ||||||
|  | 	printf("label: %s\n", hdb_dbinfo_get_label(context, d)); | ||||||
|  | 	printf("\trealm: %s\n", hdb_dbinfo_get_realm(context, d)); | ||||||
|  | 	printf("\tdbname: %s\n", hdb_dbinfo_get_dbname(context, d)); | ||||||
|  | 	printf("\tmkey_file: %s\n", hdb_dbinfo_get_mkey_file(context, d)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     hdb_free_dbinfo(context, &info); | ||||||
|  |  | ||||||
|  |     krb5_free_context(context); | ||||||
|  |  | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user
	 Love Hörnquist Åstrand
					Love Hörnquist Åstrand