Provide server side kadm5_chpass_principal_3() with ks_tuple implementation.
We enable kadm5_chpass_principal_3() in the server side of the library. The client kadm5 library calls will still return the error KAMD5_KS_TUPLE_NO_SUPP. Signed-off-by: Nicolas Williams <nico@cryptonector.com>
This commit is contained in:
		
				
					committed by
					
						
						Nicolas Williams
					
				
			
			
				
	
			
			
			
						parent
						
							00bea41dcb
						
					
				
				
					commit
					af011f57fc
				
			@@ -600,12 +600,13 @@ krb5_error_code
 | 
			
		||||
hdb_generate_key_set_password(krb5_context context,
 | 
			
		||||
			      krb5_principal principal,
 | 
			
		||||
			      const char *password,
 | 
			
		||||
			      krb5_key_salt_tuple *ks_tuple, int n_ks_tuple, 
 | 
			
		||||
			      Key **keys, size_t *num_keys)
 | 
			
		||||
{
 | 
			
		||||
    krb5_error_code ret;
 | 
			
		||||
    size_t i;
 | 
			
		||||
 | 
			
		||||
    ret = hdb_generate_key_set(context, principal, NULL, 0,
 | 
			
		||||
    ret = hdb_generate_key_set(context, principal, ks_tuple, n_ks_tuple,
 | 
			
		||||
				keys, num_keys, 0);
 | 
			
		||||
    if (ret)
 | 
			
		||||
	return ret;
 | 
			
		||||
 
 | 
			
		||||
@@ -94,7 +94,7 @@ main(int argc, char **argv)
 | 
			
		||||
    *keyset.set_time = time(NULL);
 | 
			
		||||
 | 
			
		||||
    ret = hdb_generate_key_set_password(context, principal, password_str,
 | 
			
		||||
					&keyset.keys.val, &len);
 | 
			
		||||
					NULL, 0, &keyset.keys.val, &len);
 | 
			
		||||
    if (ret)
 | 
			
		||||
	krb5_err(context, 1, ret, "hdb_generate_key_set_password");
 | 
			
		||||
    keyset.keys.len = len;
 | 
			
		||||
 
 | 
			
		||||
@@ -509,6 +509,8 @@ static kadm5_ret_t
 | 
			
		||||
kadm5_ad_chpass_principal(void *server_handle,
 | 
			
		||||
			  krb5_principal principal,
 | 
			
		||||
			  int keepold,
 | 
			
		||||
			  int n_ks_tuple,
 | 
			
		||||
			  krb5_key_salt_tuple *ks_tuple,
 | 
			
		||||
			  const char *password)
 | 
			
		||||
{
 | 
			
		||||
    kadm5_ad_context *context = server_handle;
 | 
			
		||||
@@ -519,6 +521,9 @@ kadm5_ad_chpass_principal(void *server_handle,
 | 
			
		||||
    if (keepold)
 | 
			
		||||
	return KADM5_KEEPOLD_NOSUPP;
 | 
			
		||||
 | 
			
		||||
    if (n_ks_tuple > 0)
 | 
			
		||||
       return KADM5_KS_TUPLE_NOSUPP;
 | 
			
		||||
 | 
			
		||||
    ret = ad_get_cred(context, NULL);
 | 
			
		||||
    if (ret)
 | 
			
		||||
	return ret;
 | 
			
		||||
 
 | 
			
		||||
@@ -39,6 +39,8 @@ kadm5_ret_t
 | 
			
		||||
kadm5_c_chpass_principal(void *server_handle,
 | 
			
		||||
			 krb5_principal princ,
 | 
			
		||||
			 int keepold,
 | 
			
		||||
			 int n_ks_tuple,
 | 
			
		||||
			 krb5_key_salt_tuple *ks_tuple,
 | 
			
		||||
			 const char *password)
 | 
			
		||||
{
 | 
			
		||||
    kadm5_client_context *context = server_handle;
 | 
			
		||||
@@ -48,6 +50,14 @@ kadm5_c_chpass_principal(void *server_handle,
 | 
			
		||||
    int32_t tmp;
 | 
			
		||||
    krb5_data reply;
 | 
			
		||||
 | 
			
		||||
    /*
 | 
			
		||||
     * We should get around to implementing this...  At the moment, the
 | 
			
		||||
     * the server side API is implemented but the wire protocol has not
 | 
			
		||||
     * been updated.
 | 
			
		||||
     */
 | 
			
		||||
    if (n_ks_tuple > 0)
 | 
			
		||||
       return KADM5_KS_TUPLE_NOSUPP;
 | 
			
		||||
 | 
			
		||||
    ret = _kadm5_connect(server_handle);
 | 
			
		||||
    if(ret)
 | 
			
		||||
	return ret;
 | 
			
		||||
 
 | 
			
		||||
@@ -39,6 +39,8 @@ static kadm5_ret_t
 | 
			
		||||
change(void *server_handle,
 | 
			
		||||
       krb5_principal princ,
 | 
			
		||||
       int keepold,
 | 
			
		||||
       int n_ks_tuple,
 | 
			
		||||
       krb5_key_salt_tuple *ks_tuple,
 | 
			
		||||
       const char *password,
 | 
			
		||||
       int cond)
 | 
			
		||||
{
 | 
			
		||||
@@ -84,7 +86,8 @@ change(void *server_handle,
 | 
			
		||||
	ent.entry.keys.len = 0;
 | 
			
		||||
	ent.entry.keys.val = NULL;
 | 
			
		||||
 | 
			
		||||
	ret = _kadm5_set_keys(context, &ent.entry, password);
 | 
			
		||||
	ret = _kadm5_set_keys(context, &ent.entry, n_ks_tuple, ks_tuple,
 | 
			
		||||
			      password);
 | 
			
		||||
	if(ret) {
 | 
			
		||||
	    _kadm5_free_keys(context->context, num_keys, keys);
 | 
			
		||||
	    goto out2;
 | 
			
		||||
@@ -165,7 +168,7 @@ kadm5_s_chpass_principal_cond(void *server_handle,
 | 
			
		||||
			      int keepold,
 | 
			
		||||
			      const char *password)
 | 
			
		||||
{
 | 
			
		||||
    return change (server_handle, princ, keepold, password, 1);
 | 
			
		||||
    return change (server_handle, princ, keepold, 0, NULL, password, 1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
@@ -176,9 +179,12 @@ kadm5_ret_t
 | 
			
		||||
kadm5_s_chpass_principal(void *server_handle,
 | 
			
		||||
			 krb5_principal princ,
 | 
			
		||||
			 int keepold,
 | 
			
		||||
			 int n_ks_tuple,
 | 
			
		||||
			 krb5_key_salt_tuple *ks_tuple,
 | 
			
		||||
			 const char *password)
 | 
			
		||||
{
 | 
			
		||||
    return change (server_handle, princ, keepold, password, 0);
 | 
			
		||||
    return change (server_handle, princ, keepold,
 | 
			
		||||
	n_ks_tuple, ks_tuple, password, 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 
 | 
			
		||||
@@ -42,7 +42,8 @@ kadm5_chpass_principal(void *server_handle,
 | 
			
		||||
		       krb5_principal princ,
 | 
			
		||||
		       const char *password)
 | 
			
		||||
{
 | 
			
		||||
    return __CALL(chpass_principal, (server_handle, princ, 0, password));
 | 
			
		||||
    return __CALL(chpass_principal, (server_handle, princ, 0,
 | 
			
		||||
		  0, NULL, password));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
kadm5_ret_t
 | 
			
		||||
@@ -53,14 +54,8 @@ kadm5_chpass_principal_3(void *server_handle,
 | 
			
		||||
		         krb5_key_salt_tuple *ks_tuple,
 | 
			
		||||
		         const char *password)
 | 
			
		||||
{
 | 
			
		||||
    /*
 | 
			
		||||
     * We should get around to implementing this...  This can be useful
 | 
			
		||||
     * for, e.g., x-realm principals.  For now we need the _3() to get
 | 
			
		||||
     * certain applications written to the kadm5 API to build and run.
 | 
			
		||||
     */
 | 
			
		||||
    if (n_ks_tuple > 0)
 | 
			
		||||
	return KADM5_KS_TUPLE_NOSUPP;
 | 
			
		||||
    return __CALL(chpass_principal, (server_handle, princ, keepold, password));
 | 
			
		||||
    return __CALL(chpass_principal, (server_handle, princ, keepold,
 | 
			
		||||
		  n_ks_tuple, ks_tuple, password));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
kadm5_ret_t
 | 
			
		||||
 
 | 
			
		||||
@@ -178,7 +178,7 @@ kadm5_s_create_principal(void *server_handle,
 | 
			
		||||
    ent.entry.keys.len = 0;
 | 
			
		||||
    ent.entry.keys.val = NULL;
 | 
			
		||||
 | 
			
		||||
    ret = _kadm5_set_keys(context, &ent.entry, password);
 | 
			
		||||
    ret = _kadm5_set_keys(context, &ent.entry, 0, NULL, password);
 | 
			
		||||
    if (ret)
 | 
			
		||||
	goto out;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -37,7 +37,8 @@
 | 
			
		||||
#define __kadm5_privatex_h__
 | 
			
		||||
 | 
			
		||||
struct kadm_func {
 | 
			
		||||
    kadm5_ret_t (*chpass_principal) (void *, krb5_principal, int, const char*);
 | 
			
		||||
    kadm5_ret_t (*chpass_principal) (void *, krb5_principal, int,
 | 
			
		||||
				     int, krb5_key_salt_tuple*, const char*);
 | 
			
		||||
    kadm5_ret_t (*create_principal) (void*, kadm5_principal_ent_t,
 | 
			
		||||
				     uint32_t, const char*);
 | 
			
		||||
    kadm5_ret_t (*delete_principal) (void*, krb5_principal);
 | 
			
		||||
 
 | 
			
		||||
@@ -42,6 +42,8 @@ RCSID("$Id$");
 | 
			
		||||
kadm5_ret_t
 | 
			
		||||
_kadm5_set_keys(kadm5_server_context *context,
 | 
			
		||||
		hdb_entry *ent,
 | 
			
		||||
		int n_ks_tuple,
 | 
			
		||||
		krb5_key_salt_tuple *ks_tuple,
 | 
			
		||||
		const char *password)
 | 
			
		||||
{
 | 
			
		||||
    Key *keys;
 | 
			
		||||
@@ -50,7 +52,9 @@ _kadm5_set_keys(kadm5_server_context *context,
 | 
			
		||||
 | 
			
		||||
    ret = hdb_generate_key_set_password(context->context,
 | 
			
		||||
					ent->principal,
 | 
			
		||||
					password, &keys, &num_keys);
 | 
			
		||||
					password,
 | 
			
		||||
					ks_tuple, n_ks_tuple, 
 | 
			
		||||
					&keys, &num_keys);
 | 
			
		||||
    if (ret)
 | 
			
		||||
	return ret;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user