Merge "res_pjsip_outbound_registration: Don't fail on delayed processing."

changes/96/296/1
Joshua Colp 11 years ago committed by Gerrit Code Review
commit 648b22f19d

@ -697,13 +697,13 @@ struct ast_sip_outbound_authenticator {
* *
* \param auths A vector of IDs of auth sorcery objects * \param auths A vector of IDs of auth sorcery objects
* \param challenge The SIP response with authentication challenge(s) * \param challenge The SIP response with authentication challenge(s)
* \param tsx The transaction in which the challenge was received * \param old_request The request that received the auth challenge(s)
* \param new_request The new SIP request with challenge response(s) * \param new_request The new SIP request with challenge response(s)
* \retval 0 Successfully created new request * \retval 0 Successfully created new request
* \retval -1 Failed to create a new request * \retval -1 Failed to create a new request
*/ */
int (*create_request_with_auth)(const struct ast_sip_auth_vector *auths, struct pjsip_rx_data *challenge, int (*create_request_with_auth)(const struct ast_sip_auth_vector *auths, struct pjsip_rx_data *challenge,
struct pjsip_transaction *tsx, struct pjsip_tx_data **new_request); struct pjsip_tx_data *old_request, struct pjsip_tx_data **new_request);
}; };
/*! /*!
@ -1396,7 +1396,7 @@ enum ast_sip_check_auth_result ast_sip_check_authentication(struct ast_sip_endpo
* the parameters and return values. * the parameters and return values.
*/ */
int ast_sip_create_request_with_auth(const struct ast_sip_auth_vector *auths, pjsip_rx_data *challenge, int ast_sip_create_request_with_auth(const struct ast_sip_auth_vector *auths, pjsip_rx_data *challenge,
pjsip_transaction *tsx, pjsip_tx_data **new_request); pjsip_tx_data *tdata, pjsip_tx_data **new_request);
/*! /*!
* \brief Determine the endpoint that has sent a SIP message * \brief Determine the endpoint that has sent a SIP message

@ -2009,13 +2009,13 @@ void ast_sip_unregister_outbound_authenticator(struct ast_sip_outbound_authentic
} }
int ast_sip_create_request_with_auth(const struct ast_sip_auth_vector *auths, pjsip_rx_data *challenge, int ast_sip_create_request_with_auth(const struct ast_sip_auth_vector *auths, pjsip_rx_data *challenge,
pjsip_transaction *tsx, pjsip_tx_data **new_request) pjsip_tx_data *old_request, pjsip_tx_data **new_request)
{ {
if (!registered_outbound_authenticator) { if (!registered_outbound_authenticator) {
ast_log(LOG_WARNING, "No SIP outbound authenticator registered. Cannot respond to authentication challenge\n"); ast_log(LOG_WARNING, "No SIP outbound authenticator registered. Cannot respond to authentication challenge\n");
return -1; return -1;
} }
return registered_outbound_authenticator->create_request_with_auth(auths, challenge, tsx, new_request); return registered_outbound_authenticator->create_request_with_auth(auths, challenge, old_request, new_request);
} }
struct endpoint_identifier_list { struct endpoint_identifier_list {
@ -3107,7 +3107,7 @@ static void send_request_cb(void *token, pjsip_event *e)
&& endpoint && endpoint
&& ++req_data->challenge_count < MAX_RX_CHALLENGES /* Not in a challenge loop */ && ++req_data->challenge_count < MAX_RX_CHALLENGES /* Not in a challenge loop */
&& !ast_sip_create_request_with_auth(&endpoint->outbound_auths, && !ast_sip_create_request_with_auth(&endpoint->outbound_auths,
challenge, tsx, &tdata) challenge, tsx->last_tx, &tdata)
&& endpt_send_request(endpoint, tdata, -1, req_data, send_request_cb) && endpt_send_request(endpoint, tdata, -1, req_data, send_request_cb)
== PJ_SUCCESS; == PJ_SUCCESS;
ao2_cleanup(endpoint); ao2_cleanup(endpoint);

@ -63,7 +63,7 @@ static pj_bool_t outbound_auth(pjsip_rx_data *rdata)
return PJ_FALSE; return PJ_FALSE;
} }
if (ast_sip_create_request_with_auth(&endpoint->outbound_auths, rdata, tsx, &tdata)) { if (ast_sip_create_request_with_auth(&endpoint->outbound_auths, rdata, tsx->last_tx, &tdata)) {
return PJ_FALSE; return PJ_FALSE;
} }

@ -102,13 +102,13 @@ cleanup:
} }
static int digest_create_request_with_auth(const struct ast_sip_auth_vector *auths, pjsip_rx_data *challenge, static int digest_create_request_with_auth(const struct ast_sip_auth_vector *auths, pjsip_rx_data *challenge,
pjsip_transaction *tsx, pjsip_tx_data **new_request) pjsip_tx_data *old_request, pjsip_tx_data **new_request)
{ {
pjsip_auth_clt_sess auth_sess; pjsip_auth_clt_sess auth_sess;
pjsip_cseq_hdr *cseq; pjsip_cseq_hdr *cseq;
if (pjsip_auth_clt_init(&auth_sess, ast_sip_get_pjsip_endpoint(), if (pjsip_auth_clt_init(&auth_sess, ast_sip_get_pjsip_endpoint(),
tsx->pool, 0) != PJ_SUCCESS) { old_request->pool, 0) != PJ_SUCCESS) {
ast_log(LOG_WARNING, "Failed to initialize client authentication session\n"); ast_log(LOG_WARNING, "Failed to initialize client authentication session\n");
return -1; return -1;
} }
@ -119,7 +119,7 @@ static int digest_create_request_with_auth(const struct ast_sip_auth_vector *aut
} }
switch (pjsip_auth_clt_reinit_req(&auth_sess, challenge, switch (pjsip_auth_clt_reinit_req(&auth_sess, challenge,
tsx->last_tx, new_request)) { old_request, new_request)) {
case PJ_SUCCESS: case PJ_SUCCESS:
/* PJSIP creates a new transaction for new_request (meaning it creates a new /* PJSIP creates a new transaction for new_request (meaning it creates a new
* branch). However, it recycles the Call-ID, from-tag, and CSeq from the * branch). However, it recycles the Call-ID, from-tag, and CSeq from the

@ -867,8 +867,10 @@ static void sip_outbound_publish_callback(struct pjsip_publishc_cbparam *param)
} }
if (param->code == 401 || param->code == 407) { if (param->code == 401 || param->code == 407) {
pjsip_transaction *tsx = pjsip_rdata_get_tsx(param->rdata);
if (!ast_sip_create_request_with_auth(&publish->outbound_auths, if (!ast_sip_create_request_with_auth(&publish->outbound_auths,
param->rdata, pjsip_rdata_get_tsx(param->rdata), &tdata)) { param->rdata, tsx->last_tx, &tdata)) {
pjsip_publishc_send(client->client, tdata); pjsip_publishc_send(client->client, tdata);
} }
client->auth_attempts++; client->auth_attempts++;

@ -568,8 +568,8 @@ struct registration_response {
struct sip_outbound_registration_client_state *client_state; struct sip_outbound_registration_client_state *client_state;
/*! \brief The response message */ /*! \brief The response message */
pjsip_rx_data *rdata; pjsip_rx_data *rdata;
/*! \brief The response transaction */ /*! \brief Request for which the response was received */
pjsip_transaction *tsx; pjsip_tx_data *old_request;
}; };
/*! \brief Registration response structure destructor */ /*! \brief Registration response structure destructor */
@ -581,6 +581,10 @@ static void registration_response_destroy(void *obj)
pjsip_rx_data_free_cloned(response->rdata); pjsip_rx_data_free_cloned(response->rdata);
} }
if (response->old_request) {
pjsip_tx_data_dec_ref(response->old_request);
}
ao2_cleanup(response->client_state); ao2_cleanup(response->client_state);
} }
@ -633,19 +637,19 @@ static int handle_registration_response(void *data)
ast_copy_pj_str(client_uri, &info.client_uri, sizeof(client_uri)); ast_copy_pj_str(client_uri, &info.client_uri, sizeof(client_uri));
if (response->client_state->status == SIP_REGISTRATION_STOPPED) { if (response->client_state->status == SIP_REGISTRATION_STOPPED) {
ast_debug(1, "Not handling registration response from '%s' (transaction %s). Registration already stopped\n", ast_debug(1, "Not handling registration response from server '%s' for client '%s'. Registration already stopped\n",
server_uri, response->tsx ? response->tsx->obj_name : "<none>"); server_uri, client_uri);
return 0; return 0;
} }
ast_debug(1, "Processing REGISTER response %d from '%s' (transaction %s)\n", ast_debug(1, "Processing REGISTER response %d from server '%s' for client '%s'\n",
response->code, server_uri, response->tsx ? response->tsx->obj_name : "<none>"); response->code, server_uri, client_uri);
if (!response->client_state->auth_attempted && if (!response->client_state->auth_attempted &&
(response->code == 401 || response->code == 407)) { (response->code == 401 || response->code == 407)) {
pjsip_tx_data *tdata; pjsip_tx_data *tdata;
if (!ast_sip_create_request_with_auth(&response->client_state->outbound_auths, if (!ast_sip_create_request_with_auth(&response->client_state->outbound_auths,
response->rdata, response->tsx, &tdata)) { response->rdata, response->old_request, &tdata)) {
ao2_ref(response->client_state, +1); ao2_ref(response->client_state, +1);
response->client_state->auth_attempted = 1; response->client_state->auth_attempted = 1;
ast_debug(1, "Sending authenticated REGISTER to server '%s' from client '%s'\n", ast_debug(1, "Sending authenticated REGISTER to server '%s' from client '%s'\n",
@ -748,9 +752,12 @@ static void sip_outbound_registration_response_cb(struct pjsip_regc_cbparam *par
if (param->rdata) { if (param->rdata) {
struct pjsip_retry_after_hdr *retry_after = pjsip_msg_find_hdr(param->rdata->msg_info.msg, PJSIP_H_RETRY_AFTER, NULL); struct pjsip_retry_after_hdr *retry_after = pjsip_msg_find_hdr(param->rdata->msg_info.msg, PJSIP_H_RETRY_AFTER, NULL);
pjsip_transaction *tsx;
response->retry_after = retry_after ? retry_after->ivalue : 0; response->retry_after = retry_after ? retry_after->ivalue : 0;
response->tsx = pjsip_rdata_get_tsx(param->rdata); tsx = pjsip_rdata_get_tsx(param->rdata);
response->old_request = tsx->last_tx;
pjsip_tx_data_add_ref(response->old_request);
pjsip_rx_data_clone(param->rdata, 0, &response->rdata); pjsip_rx_data_clone(param->rdata, 0, &response->rdata);
} }

Loading…
Cancel
Save