don't open connection to server until we loop over the principals, at
that time we know the realm of the (first) principal and we can default to that admin server git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@10388 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
		
							
								
								
									
										99
									
								
								admin/get.c
									
									
									
									
									
								
							
							
						
						
									
										99
									
								
								admin/get.c
									
									
									
									
									
								
							| @@ -35,12 +35,53 @@ | |||||||
|  |  | ||||||
| RCSID("$Id$"); | RCSID("$Id$"); | ||||||
|  |  | ||||||
|  | static void* | ||||||
|  | open_kadmin_connection(char *principal, | ||||||
|  | 		       const char *realm,  | ||||||
|  | 		       char *admin_server,  | ||||||
|  | 		       int server_port) | ||||||
|  | { | ||||||
|  |     krb5_error_code ret; | ||||||
|  |     kadm5_config_params conf; | ||||||
|  |     void *kadm_handle; | ||||||
|  |     memset(&conf, 0, sizeof(conf)); | ||||||
|  |  | ||||||
|  |     if(realm) { | ||||||
|  | 	conf.realm = (char*)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; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /* should get realm from each principal, instead of doing | ||||||
|  |        everything with the same (local) realm */ | ||||||
|  |  | ||||||
|  |     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 NULL; | ||||||
|  |     } | ||||||
|  |     return kadm_handle; | ||||||
|  | } | ||||||
|  |  | ||||||
| int | int | ||||||
| kt_get(int argc, char **argv) | kt_get(int argc, char **argv) | ||||||
| { | { | ||||||
|     krb5_error_code ret = 0; |     krb5_error_code ret = 0; | ||||||
|     krb5_keytab keytab; |     krb5_keytab keytab; | ||||||
|     kadm5_config_params conf; |  | ||||||
|     void *kadm_handle = NULL; |     void *kadm_handle = NULL; | ||||||
|     char *principal = NULL; |     char *principal = NULL; | ||||||
|     char *realm = NULL; |     char *realm = NULL; | ||||||
| @@ -78,18 +119,25 @@ kt_get(int argc, char **argv) | |||||||
|     args[4].value = &server_port; |     args[4].value = &server_port; | ||||||
|     args[5].value = &help_flag; |     args[5].value = &help_flag; | ||||||
|  |  | ||||||
|     memset(&conf, 0, sizeof(conf)); |  | ||||||
|  |  | ||||||
|     if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optind) |     if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optind) | ||||||
|        || help_flag) { |        || help_flag) { | ||||||
| 	arg_printusage(args, sizeof(args) / sizeof(args[0]),  | 	arg_printusage(args, sizeof(args) / sizeof(args[0]),  | ||||||
| 		       "ktutil get", "principal..."); | 		       "ktutil get", "principal..."); | ||||||
| 	return 1; | 	return 1; | ||||||
|     } |     } | ||||||
|  |     if(optind == argc) { | ||||||
|  | 	krb5_warnx(context, "no principals specified"); | ||||||
|  | 	arg_printusage(args, sizeof(args) / sizeof(args[0]),  | ||||||
|  | 		       "ktutil get", "principal..."); | ||||||
|  | 	return 1; | ||||||
|  |     } | ||||||
|      |      | ||||||
|     if((keytab = ktutil_open_keytab()) == NULL) |     if((keytab = ktutil_open_keytab()) == NULL) | ||||||
| 	return 1; | 	return 1; | ||||||
|  |  | ||||||
|  |     if(realm) | ||||||
|  | 	krb5_set_default_realm(context, realm); | ||||||
|  |  | ||||||
|     if (etype_strs.num_strings) { |     if (etype_strs.num_strings) { | ||||||
| 	int i; | 	int i; | ||||||
|  |  | ||||||
| @@ -111,36 +159,6 @@ kt_get(int argc, char **argv) | |||||||
| 	} | 	} | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     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; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /* should get realm from each principal, instead of doing |  | ||||||
|        everything with the same (local) realm */ |  | ||||||
|  |  | ||||||
|     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"); |  | ||||||
| 	goto out; |  | ||||||
|     } |  | ||||||
|      |      | ||||||
|     for(i = optind; i < argc; i++){ |     for(i = optind; i < argc; i++){ | ||||||
| 	krb5_principal princ_ent; | 	krb5_principal princ_ent; | ||||||
| @@ -159,6 +177,21 @@ kt_get(int argc, char **argv) | |||||||
| 	mask |= KADM5_ATTRIBUTES; | 	mask |= KADM5_ATTRIBUTES; | ||||||
| 	princ.princ_expire_time = 0; | 	princ.princ_expire_time = 0; | ||||||
| 	mask |= KADM5_PRINC_EXPIRE_TIME; | 	mask |= KADM5_PRINC_EXPIRE_TIME; | ||||||
|  |  | ||||||
|  | 	if(kadm_handle == NULL) { | ||||||
|  | 	    const char *r; | ||||||
|  | 	    if(realm != NULL) | ||||||
|  | 		r = realm; | ||||||
|  | 	    else | ||||||
|  | 		r = krb5_principal_get_realm(context, princ_ent); | ||||||
|  | 	    kadm_handle = open_kadmin_connection(principal,  | ||||||
|  | 						 r,  | ||||||
|  | 						 admin_server,  | ||||||
|  | 						 server_port); | ||||||
|  | 	    if(kadm_handle == NULL) { | ||||||
|  | 		break; | ||||||
|  | 	    } | ||||||
|  | 	} | ||||||
| 	 | 	 | ||||||
| 	ret = kadm5_create_principal(kadm_handle, &princ, mask, "x"); | 	ret = kadm5_create_principal(kadm_handle, &princ, mask, "x"); | ||||||
| 	if(ret == 0) | 	if(ret == 0) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Johan Danielsson
					Johan Danielsson