get_cred_kdc_capath() always try direct cross-realm first
This commit is contained in:

committed by
Love Hornquist Astrand

parent
344071becb
commit
a73d30e619
@@ -710,26 +710,12 @@ add_cred(krb5_context context, krb5_creds const *tkt, krb5_creds ***tgts)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
get_cred(server)
|
|
||||||
creds = cc_get_cred(server)
|
|
||||||
if(creds) return creds
|
|
||||||
tgt = cc_get_cred(krbtgt/server_realm@any_realm)
|
|
||||||
if(tgt)
|
|
||||||
return get_cred_tgt(server, tgt)
|
|
||||||
if(client_realm == server_realm)
|
|
||||||
return NULL
|
|
||||||
tgt = get_cred(krbtgt/server_realm@client_realm)
|
|
||||||
while(tgt_inst != server_realm)
|
|
||||||
tgt = get_cred(krbtgt/server_realm@tgt_inst)
|
|
||||||
return get_cred_tgt(server, tgt)
|
|
||||||
*/
|
|
||||||
|
|
||||||
static krb5_error_code
|
static krb5_error_code
|
||||||
get_cred_kdc_capath(krb5_context context,
|
get_cred_kdc_capath_worker(krb5_context context,
|
||||||
krb5_kdc_flags flags,
|
krb5_kdc_flags flags,
|
||||||
krb5_ccache ccache,
|
krb5_ccache ccache,
|
||||||
krb5_creds *in_creds,
|
krb5_creds *in_creds,
|
||||||
|
krb5_const_realm try_realm,
|
||||||
krb5_principal impersonate_principal,
|
krb5_principal impersonate_principal,
|
||||||
Ticket *second_ticket,
|
Ticket *second_ticket,
|
||||||
krb5_creds **out_creds,
|
krb5_creds **out_creds,
|
||||||
@@ -737,7 +723,7 @@ get_cred_kdc_capath(krb5_context context,
|
|||||||
{
|
{
|
||||||
krb5_error_code ret;
|
krb5_error_code ret;
|
||||||
krb5_creds *tgt, tmp_creds;
|
krb5_creds *tgt, tmp_creds;
|
||||||
krb5_const_realm client_realm, server_realm, try_realm;
|
krb5_const_realm client_realm, server_realm;
|
||||||
int ok_as_delegate = 1;
|
int ok_as_delegate = 1;
|
||||||
|
|
||||||
*out_creds = NULL;
|
*out_creds = NULL;
|
||||||
@@ -749,11 +735,6 @@ get_cred_kdc_capath(krb5_context context,
|
|||||||
if(ret)
|
if(ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
try_realm = krb5_config_get_string(context, NULL, "capaths",
|
|
||||||
client_realm, server_realm, NULL);
|
|
||||||
if (try_realm == NULL)
|
|
||||||
try_realm = client_realm;
|
|
||||||
|
|
||||||
ret = krb5_make_principal(context,
|
ret = krb5_make_principal(context,
|
||||||
&tmp_creds.server,
|
&tmp_creds.server,
|
||||||
try_realm,
|
try_realm,
|
||||||
@@ -863,6 +844,56 @@ get_cred_kdc_capath(krb5_context context,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
get_cred(server)
|
||||||
|
creds = cc_get_cred(server)
|
||||||
|
if(creds) return creds
|
||||||
|
tgt = cc_get_cred(krbtgt/server_realm@any_realm)
|
||||||
|
if(tgt)
|
||||||
|
return get_cred_tgt(server, tgt)
|
||||||
|
if(client_realm == server_realm)
|
||||||
|
return NULL
|
||||||
|
tgt = get_cred(krbtgt/server_realm@client_realm)
|
||||||
|
while(tgt_inst != server_realm)
|
||||||
|
tgt = get_cred(krbtgt/server_realm@tgt_inst)
|
||||||
|
return get_cred_tgt(server, tgt)
|
||||||
|
*/
|
||||||
|
|
||||||
|
static krb5_error_code
|
||||||
|
get_cred_kdc_capath(krb5_context context,
|
||||||
|
krb5_kdc_flags flags,
|
||||||
|
krb5_ccache ccache,
|
||||||
|
krb5_creds *in_creds,
|
||||||
|
krb5_principal impersonate_principal,
|
||||||
|
Ticket *second_ticket,
|
||||||
|
krb5_creds **out_creds,
|
||||||
|
krb5_creds ***ret_tgts)
|
||||||
|
{
|
||||||
|
krb5_error_code ret;
|
||||||
|
krb5_const_realm client_realm, server_realm, try_realm;
|
||||||
|
|
||||||
|
client_realm = krb5_principal_get_realm(context, in_creds->client);
|
||||||
|
server_realm = krb5_principal_get_realm(context, in_creds->server);
|
||||||
|
|
||||||
|
try_realm = client_realm;
|
||||||
|
ret = get_cred_kdc_capath_worker(context, flags, ccache, in_creds, try_realm,
|
||||||
|
impersonate_principal, second_ticket, out_creds,
|
||||||
|
ret_tgts);
|
||||||
|
|
||||||
|
if (ret == KRB5KDC_ERR_S_PRINCIPAL_UNKNOWN) {
|
||||||
|
try_realm = krb5_config_get_string(context, NULL, "capaths",
|
||||||
|
client_realm, server_realm, NULL);
|
||||||
|
|
||||||
|
if (try_realm != NULL && strcmp(try_realm, client_realm)) {
|
||||||
|
ret = get_cred_kdc_capath_worker(context, flags, ccache, in_creds,
|
||||||
|
try_realm, impersonate_principal,
|
||||||
|
second_ticket, out_creds, ret_tgts);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static krb5_error_code
|
static krb5_error_code
|
||||||
get_cred_kdc_referral(krb5_context context,
|
get_cred_kdc_referral(krb5_context context,
|
||||||
krb5_kdc_flags flags,
|
krb5_kdc_flags flags,
|
||||||
|
Reference in New Issue
Block a user