]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
If a "new session" section exists run that before creating TLS session
authorNick Porter <nick@portercomputing.co.uk>
Mon, 2 Dec 2024 12:07:13 +0000 (12:07 +0000)
committerNick Porter <nick@portercomputing.co.uk>
Sun, 22 Dec 2024 13:56:55 +0000 (13:56 +0000)
src/modules/rlm_eap/types/rlm_eap_tls/rlm_eap_tls.c

index 898b4e23acbd8503bc0780b9aa77bcd99c9e832e..5911d55f799188718fea8723e8fbd1967786e55f 100644 (file)
@@ -178,10 +178,7 @@ static unlang_action_t mod_handshake_process(UNUSED rlm_rcode_t *p_result, UNUSE
        return eap_tls_process(request, eap_session);
 }
 
-/*
- *     Send an initial eap-tls request to the peer, using the libeap functions.
- */
-static unlang_action_t mod_session_init(rlm_rcode_t *p_result, module_ctx_t const *mctx, request_t *request)
+static unlang_action_t mod_session_init_resume(rlm_rcode_t *p_result, module_ctx_t const *mctx, request_t *request)
 {
        rlm_eap_tls_t           *inst = talloc_get_type_abort(mctx->mi->data, rlm_eap_tls_t);
        rlm_eap_tls_thread_t    *t = talloc_get_type_abort(mctx->thread, rlm_eap_tls_thread_t);
@@ -191,8 +188,6 @@ static unlang_action_t mod_session_init(rlm_rcode_t *p_result, module_ctx_t cons
        fr_pair_t               *vp;
        bool                    client_cert;
 
-       eap_session->tls = true;
-
        /*
         *      EAP-TLS-Require-Client-Cert attribute will override
         *      the require_client_cert configuration option.
@@ -226,6 +221,23 @@ static unlang_action_t mod_session_init(rlm_rcode_t *p_result, module_ctx_t cons
        RETURN_MODULE_HANDLED;
 }
 
+/*
+ *     Send an initial eap-tls request to the peer, using the libeap functions.
+ */
+static unlang_action_t mod_session_init(UNUSED rlm_rcode_t *p_result, module_ctx_t const *mctx, request_t *request)
+{
+       rlm_eap_tls_t           *inst = talloc_get_type_abort(mctx->mi->data, rlm_eap_tls_t);
+       eap_session_t           *eap_session = eap_session_get(request->parent);
+
+       eap_session->tls = true;
+
+       (void) unlang_module_yield(request, mod_session_init_resume, NULL, 0, NULL);
+
+       if (inst->tls_conf->new_session) return fr_tls_new_session_push(request, inst->tls_conf);
+
+       return UNLANG_ACTION_CALCULATE_RESULT;
+}
+
 static int mod_thread_instantiate(module_thread_inst_ctx_t const *mctx)
 {
        rlm_eap_tls_t           *inst = talloc_get_type_abort(mctx->mi->data, rlm_eap_tls_t);