# Kpasswd tests
#
^samba.tests.krb5.kpasswd_tests.samba.tests.krb5.kpasswd_tests.KpasswdTests.test_kpasswd_from_rodc.ad_dc
-^samba.tests.krb5.kpasswd_tests.samba.tests.krb5.kpasswd_tests.KpasswdTests.test_kpasswd_ticket_requester_sid_tgs.ad_dc
^samba.tests.krb5.kpasswd_tests.samba.tests.krb5.kpasswd_tests.KpasswdTests.test_kpasswd_wrong_key.ad_dc
^samba.tests.krb5.kpasswd_tests.samba.tests.krb5.kpasswd_tests.KpasswdTests.test_kpasswd_wrong_key_server.ad_dc
^samba.tests.krb5.kpasswd_tests.samba.tests.krb5.kpasswd_tests.KpasswdTests.test_kpasswd_wrong_key_service.ad_dc
#include "kdc_locl.h"
+/* Awful hack to get access to 'struct samba_kdc_entry'. */
+#include "../../kdc/samba_kdc.h"
+
/*
* return the realm of a krbtgt-ticket or NULL
*/
static krb5_error_code
check_tgs_flags(krb5_context context,
krb5_kdc_configuration *config,
+ const hdb_entry_ex *krbtgt_in,
KDC_REQ_BODY *b, const EncTicketPart *tgt, EncTicketPart *et)
{
KDCOptions f = b->kdc_options;
et->endtime = min(*et->renew_till, et->endtime);
}
+ if (tgt->endtime - kdc_time <= CHANGEPW_LIFETIME) {
+ /* Check that the ticket has not arrived across a trust. */
+ const struct samba_kdc_entry *skdc_entry = krbtgt_in->ctx;
+ if (!skdc_entry->is_trust) {
+ /* This may be a kpasswd ticket rather than a TGT, so don't accept it. */
+ kdc_log(context, config, 0,
+ "Ticket is not a ticket-granting ticket");
+ return KRB5KRB_AP_ERR_TKT_EXPIRED;
+ }
+ }
+
#if 0
/* checks for excess flags */
if(f.request_anonymous && !config->allow_anonymous){
hdb_entry_ex *client,
krb5_principal client_principal,
const char *tgt_realm,
+ const hdb_entry_ex *krbtgt_in,
hdb_entry_ex *krbtgt,
krb5_pac mspac,
uint16_t rodc_id,
ALLOC(et.starttime);
*et.starttime = kdc_time;
- ret = check_tgs_flags(context, config, b, tgt, &et);
+ ret = check_tgs_flags(context, config, krbtgt_in, b, tgt, &et);
if(ret)
goto out;
client,
cp,
tgt_realm,
+ krbtgt,
krbtgt_out,
mspac,
rodc_id,