aboutsummaryrefslogtreecommitdiff
path: root/lib/krb5/get_cred.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/krb5/get_cred.c')
-rw-r--r--lib/krb5/get_cred.c45
1 files changed, 29 insertions, 16 deletions
diff --git a/lib/krb5/get_cred.c b/lib/krb5/get_cred.c
index f7318eeb2488..b5dae62b0210 100644
--- a/lib/krb5/get_cred.c
+++ b/lib/krb5/get_cred.c
@@ -558,8 +558,10 @@ get_cred_kdc(krb5_context context,
out_creds->times.endtime = in_creds->times.endtime;
/* XXX should do better testing */
- if (flags.b.constrained_delegation || impersonate_principal)
+ if (flags.b.cname_in_addl_tkt || impersonate_principal)
eflags |= EXTRACT_TICKET_ALLOW_CNAME_MISMATCH;
+ if (flags.b.request_anonymous)
+ eflags |= EXTRACT_TICKET_MATCH_ANON;
ret = _krb5_extract_ticket(context,
&rep,
@@ -1033,7 +1035,7 @@ get_cred_kdc_referral(krb5_context context,
char *referral_realm;
/* Use cache if we are not doing impersonation or contrained deleg */
- if (impersonate_principal == NULL || flags.b.constrained_delegation) {
+ if (impersonate_principal == NULL || flags.b.cname_in_addl_tkt) {
krb5_cc_clear_mcred(&mcreds);
mcreds.server = referral.server;
krb5_timeofday(context, &mcreds.times.endtime);
@@ -1185,21 +1187,31 @@ check_cc(krb5_context context, krb5_flags options, krb5_ccache ccache,
{
krb5_error_code ret;
krb5_timestamp now;
- krb5_times save_times = in_creds->times;
- NAME_TYPE save_type = in_creds->server->name.name_type;
+ krb5_creds mcreds = *in_creds;
krb5_timeofday(context, &now);
if (!(options & KRB5_GC_EXPIRED_OK) &&
- in_creds->times.endtime < now) {
- in_creds->times.renew_till = 0;
- krb5_timeofday(context, &in_creds->times.endtime);
+ mcreds.times.endtime < now) {
+ mcreds.times.renew_till = 0;
+ krb5_timeofday(context, &mcreds.times.endtime);
options |= KRB5_TC_MATCH_TIMES;
}
- if (save_type == KRB5_NT_SRV_HST_NEEDS_CANON) {
+ if (mcreds.server->name.name_type == KRB5_NT_SRV_HST_NEEDS_CANON) {
/* Avoid name canonicalization in krb5_cc_retrieve_cred() */
- krb5_principal_set_type(context, in_creds->server, KRB5_NT_SRV_HST);
+ krb5_principal_set_type(context, mcreds.server, KRB5_NT_SRV_HST);
+ }
+
+ if (options & KRB5_GC_ANONYMOUS) {
+ ret = krb5_make_principal(context,
+ &mcreds.client,
+ krb5_principal_get_realm(context, mcreds.client),
+ KRB5_WELLKNOWN_NAME,
+ KRB5_ANON_NAME,
+ NULL);
+ if (ret)
+ return ret;
}
ret = krb5_cc_retrieve_cred(context, ccache,
@@ -1207,10 +1219,11 @@ check_cc(krb5_context context, krb5_flags options, krb5_ccache ccache,
(KRB5_TC_DONT_MATCH_REALM |
KRB5_TC_MATCH_KEYTYPE |
KRB5_TC_MATCH_TIMES)),
- in_creds, out_creds);
+ &mcreds, out_creds);
+
+ if (options & KRB5_GC_ANONYMOUS)
+ krb5_free_principal(context, mcreds.client);
- in_creds->server->name.name_type = save_type;
- in_creds->times = save_times;
return ret;
}
@@ -1574,10 +1587,10 @@ next_rule:
flags.b.forwardable = 1;
if (options & KRB5_GC_NO_TRANSIT_CHECK)
flags.b.disable_transited_check = 1;
- if (options & KRB5_GC_CONSTRAINED_DELEGATION) {
- flags.b.request_anonymous = 1; /* XXX ARGH confusion */
- flags.b.constrained_delegation = 1;
- }
+ if (options & KRB5_GC_CONSTRAINED_DELEGATION)
+ flags.b.cname_in_addl_tkt = 1;
+ if (options & KRB5_GC_ANONYMOUS)
+ flags.b.request_anonymous = 1;
tgts = NULL;
ret = _krb5_get_cred_kdc_any(context, flags, ccache,