Break out PAC generation
This commit is contained in:

committed by
Love Hörnquist Åstrand

parent
94157d4410
commit
4d63c98125
@@ -1428,6 +1428,50 @@ send_pac_p(krb5_context context, KDC_REQ *req)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
static krb5_error_code
|
||||||
|
generate_pac(kdc_request_t r, Key *skey)
|
||||||
|
{
|
||||||
|
krb5_error_code ret;
|
||||||
|
krb5_pac p = NULL;
|
||||||
|
krb5_data data;
|
||||||
|
|
||||||
|
ret = _kdc_pac_generate(r->context, r->client, &p);
|
||||||
|
if (ret) {
|
||||||
|
_kdc_r_log(r, 0, "PAC generation failed for -- %s",
|
||||||
|
r->client_name);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
if (p == NULL)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
ret = _krb5_pac_sign(r->context, p, r->et.authtime,
|
||||||
|
r->client->entry.principal,
|
||||||
|
&skey->key, /* Server key */
|
||||||
|
&skey->key, /* FIXME: should be krbtgt key */
|
||||||
|
&data);
|
||||||
|
krb5_pac_free(r->context, p);
|
||||||
|
if (ret) {
|
||||||
|
_kdc_r_log(r, 0, "PAC signing failed for -- %s",
|
||||||
|
r->client_name);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = _kdc_tkt_add_if_relevant_ad(r->context, &r->et,
|
||||||
|
KRB5_AUTHDATA_WIN2K_PAC,
|
||||||
|
&data);
|
||||||
|
krb5_data_free(&data);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
krb5_boolean
|
krb5_boolean
|
||||||
_kdc_is_anonymous(krb5_context context, krb5_principal principal)
|
_kdc_is_anonymous(krb5_context context, krb5_principal principal)
|
||||||
{
|
{
|
||||||
@@ -1691,7 +1735,7 @@ _kdc_as_rep(kdc_request_t r,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((found_pa == 0 && require_preauth_p(r)) || b->kdc_options.request_anonymous) {
|
if (found_pa == 0 && (require_preauth_p(r) || b->kdc_options.request_anonymous)) {
|
||||||
size_t n;
|
size_t n;
|
||||||
|
|
||||||
for (n = 0; n < sizeof(pat) / sizeof(pat[0]); n++) {
|
for (n = 0; n < sizeof(pat) / sizeof(pat[0]); n++) {
|
||||||
@@ -2053,35 +2097,7 @@ _kdc_as_rep(kdc_request_t r,
|
|||||||
|
|
||||||
/* Add the PAC */
|
/* Add the PAC */
|
||||||
if (send_pac_p(context, req)) {
|
if (send_pac_p(context, req)) {
|
||||||
krb5_pac p = NULL;
|
generate_pac(r, skey);
|
||||||
krb5_data data;
|
|
||||||
|
|
||||||
ret = _kdc_pac_generate(context, r->client, &p);
|
|
||||||
if (ret) {
|
|
||||||
kdc_log(context, config, 0, "PAC generation failed for -- %s",
|
|
||||||
r->client_name);
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
if (p != NULL) {
|
|
||||||
ret = _krb5_pac_sign(context, p, et.authtime,
|
|
||||||
r->client->entry.principal,
|
|
||||||
&skey->key, /* Server key */
|
|
||||||
&skey->key, /* FIXME: should be krbtgt key */
|
|
||||||
&data);
|
|
||||||
krb5_pac_free(context, p);
|
|
||||||
if (ret) {
|
|
||||||
kdc_log(context, config, 0, "PAC signing failed for -- %s",
|
|
||||||
r->client_name);
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = _kdc_tkt_add_if_relevant_ad(context, &et,
|
|
||||||
KRB5_AUTHDATA_WIN2K_PAC,
|
|
||||||
&data);
|
|
||||||
krb5_data_free(&data);
|
|
||||||
if (ret)
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_kdc_log_timestamp(context, config, "AS-REQ", et.authtime, et.starttime,
|
_kdc_log_timestamp(context, config, "AS-REQ", et.authtime, et.starttime,
|
||||||
@@ -2110,7 +2126,7 @@ _kdc_as_rep(kdc_request_t r,
|
|||||||
ret = add_enc_pa_rep(r);
|
ret = add_enc_pa_rep(r);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
const char *msg = krb5_get_error_message(r->context, ret);
|
const char *msg = krb5_get_error_message(r->context, ret);
|
||||||
_kdc_r_log(r, 0, "add_enc_pa_rep failed: %d: %s", ret, msg);
|
_kdc_r_log(r, 0, "add_enc_pa_rep failed: %s: %d", msg, ret);
|
||||||
krb5_free_error_message(r->context, msg);
|
krb5_free_error_message(r->context, msg);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
@@ -2141,7 +2157,7 @@ out:
|
|||||||
/*
|
/*
|
||||||
* In case of a non proxy error, build an error message.
|
* In case of a non proxy error, build an error message.
|
||||||
*/
|
*/
|
||||||
if(ret != 0 && ret != HDB_ERR_NOT_FOUND_HERE){
|
if(ret != 0 && ret != HDB_ERR_NOT_FOUND_HERE) {
|
||||||
kdc_log(context, config, 10, "as-req: sending error: %d to client", ret);
|
kdc_log(context, config, 10, "as-req: sending error: %d to client", ret);
|
||||||
ret = _kdc_fast_mk_error(context,
|
ret = _kdc_fast_mk_error(context,
|
||||||
&error_method,
|
&error_method,
|
||||||
|
Reference in New Issue
Block a user