extern HIDDEN fr_dict_attr_t const *attr_tls_session_version;
extern HIDDEN fr_dict_attr_t const *attr_tls_session_resume_type;
+extern HIDDEN fr_dict_attr_t const *attr_module_failure_message;
+
extern HIDDEN fr_dict_attr_t const *attr_tls_packet_type;
extern HIDDEN fr_dict_attr_t const *attr_tls_session_data;
extern HIDDEN fr_dict_attr_t const *attr_tls_session_id;
fr_dict_attr_t const *attr_tls_session_version;
fr_dict_attr_t const *attr_tls_session_resume_type;
+fr_dict_attr_t const *attr_module_failure_message;
+
fr_dict_attr_t const *attr_tls_packet_type;
fr_dict_attr_t const *attr_tls_session_data;
fr_dict_attr_t const *attr_tls_session_id;
{ .out = &attr_tls_session_version, .name = "TLS-Session-Version", .type = FR_TYPE_STRING, .dict = &dict_freeradius },
{ .out = &attr_tls_session_resume_type, .name = "TLS-Session-Resume-Type", .type = FR_TYPE_UINT32, .dict = &dict_freeradius },
+ { .out = &attr_module_failure_message, .name = "Module-Failure-Message", .type = FR_TYPE_STRING, .dict = &dict_freeradius },
+
/*
* Eventually all TLS attributes will be in the TLS dictionary
*/
request_t *request, void *uctx)
{
fr_tls_session_t *tls_session = talloc_get_type_abort(uctx, fr_tls_session_t);
- fr_pair_t *vp;
+ fr_pair_t *vp, *next;
fr_assert(tls_session->validate.state == FR_TLS_VALIDATION_REQUESTED);
vp = fr_pair_find_by_da(&request->reply_pairs, NULL, attr_tls_packet_type);
if (!vp || (vp->vp_uint32 != enum_tls_packet_type_success->vb_uint32)) {
REDEBUG("Failed (re-)validating certificates");
+
+ /*
+ * Hoist any instances of Module-Failure-Message from the subrequest
+ * so they can be used for logging failures.
+ */
+ vp = fr_pair_find_by_da(&request->request_pairs, NULL, attr_module_failure_message);
+ while (vp && request->parent) {
+ next = fr_pair_find_by_da(&request->request_pairs, vp, attr_module_failure_message);
+ fr_pair_remove(&request->request_pairs, vp);
+ fr_pair_steal_append(request->parent->request_ctx, &request->parent->request_pairs, vp);
+ vp = next;
+ }
+
tls_session->validate.state = FR_TLS_VALIDATION_FAILED;
return UNLANG_ACTION_CALCULATE_RESULT;
}