/*! * \internal * \brief Session supplement callback for outgoing INVITE requests * * For an initial INVITE request, we may change the From header to appropriately * reflect the identity information. On all INVITEs (initial and reinvite) we may * add other identity headers such as P-Asserted-Identity and Remote-Party-ID based * on configuration and privacy settings * * \param session The session on which the INVITE will be sent * \param tdata The outbound INVITE request */ static void caller_id_outgoing_request(struct ast_sip_session *session, pjsip_tx_data *tdata) { struct ast_party_id connected_id; if (!session->channel) { return; } connected_id = ast_channel_connected_effective_id(session->channel); if (session->inv_session->state < PJSIP_INV_STATE_CONFIRMED && ast_strlen_zero(session->endpoint->fromuser) && (session->endpoint->id.trust_outbound || ((connected_id.name.presentation & AST_PRES_RESTRICTION) == AST_PRES_ALLOWED && (connected_id.number.presentation & AST_PRES_RESTRICTION) == AST_PRES_ALLOWED))) { /* Only change the From header on the initial outbound INVITE. Switching it * mid-call might confuse some UAs. */ pjsip_fromto_hdr *from; pjsip_dialog *dlg; from = pjsip_msg_find_hdr(tdata->msg, PJSIP_H_FROM, tdata->msg->hdr.next); dlg = session->inv_session->dlg; modify_id_header(tdata->pool, from, &connected_id); modify_id_header(dlg->pool, dlg->local.info, &connected_id); } add_id_headers(session, tdata, &connected_id); }
/*! * \internal * \brief Add a Remote-Party-ID header to an outbound message * \param tdata The message to add the header to * \param id The identification information used to populate the header */ static void add_rpid_header(pjsip_tx_data *tdata, const struct ast_party_id *id) { static const pj_str_t pj_rpid_name = { "Remote-Party-ID", 15 }; pjsip_fromto_hdr *rpid_hdr; pjsip_fromto_hdr *old_rpid; if (!id->number.valid) { return; } /* Since inv_session reuses responses, we have to make sure there's not already * a P-Asserted-Identity present. If there is, we just modify the old one. */ old_rpid = pjsip_msg_find_hdr_by_name(tdata->msg, &pj_rpid_name, NULL); if (old_rpid) { modify_id_header(tdata->pool, old_rpid, id); add_privacy_params(tdata, old_rpid, id); return; } rpid_hdr = create_new_id_hdr(&pj_rpid_name, tdata, id); if (!rpid_hdr) { return; } add_privacy_params(tdata, rpid_hdr, id); pjsip_msg_add_hdr(tdata->msg, (pjsip_hdr *)rpid_hdr); }
/*! * \internal * \brief Session supplement callback for outgoing INVITE requests * * For an initial INVITE request, we may change the From header to appropriately * reflect the identity information. On all INVITEs (initial and reinvite) we may * add other identity headers such as P-Asserted-Identity and Remote-Party-ID based * on configuration and privacy settings * * \param session The session on which the INVITE will be sent * \param tdata The outbound INVITE request */ static void caller_id_outgoing_request(struct ast_sip_session *session, pjsip_tx_data *tdata) { struct ast_party_id effective_id; struct ast_party_id connected_id; if (!session->channel) { return; } /* Must do a deep copy unless we hold the channel lock the entire time. */ ast_party_id_init(&connected_id); ast_channel_lock(session->channel); effective_id = ast_channel_connected_effective_id(session->channel); ast_party_id_copy(&connected_id, &effective_id); ast_channel_unlock(session->channel); if (session->inv_session->state < PJSIP_INV_STATE_CONFIRMED) { /* Only change the From header on the initial outbound INVITE. Switching it * mid-call might confuse some UAs. */ pjsip_fromto_hdr *from; pjsip_dialog *dlg; from = pjsip_msg_find_hdr(tdata->msg, PJSIP_H_FROM, tdata->msg->hdr.next); dlg = session->inv_session->dlg; if (ast_strlen_zero(session->endpoint->fromuser) && (session->endpoint->id.trust_outbound || (ast_party_id_presentation(&connected_id) & AST_PRES_RESTRICTION) == AST_PRES_ALLOWED)) { modify_id_header(tdata->pool, from, &connected_id); modify_id_header(dlg->pool, dlg->local.info, &connected_id); } ast_sip_add_usereqphone(session->endpoint, tdata->pool, from->uri); ast_sip_add_usereqphone(session->endpoint, dlg->pool, dlg->local.info->uri); } add_id_headers(session, tdata, &connected_id); ast_party_id_free(&connected_id); }
/*! * \internal * \brief Add a P-Asserted-Identity header to an outbound message * \param tdata The message to add the header to * \param id The identification information used to populate the header */ static void add_pai_header(pjsip_tx_data *tdata, const struct ast_party_id *id) { static const pj_str_t pj_pai_name = { "P-Asserted-Identity", 19 }; pjsip_fromto_hdr *pai_hdr; pjsip_fromto_hdr *old_pai; /* Since inv_session reuses responses, we have to make sure there's not already * a P-Asserted-Identity present. If there is, we just modify the old one. */ old_pai = pjsip_msg_find_hdr_by_name(tdata->msg, &pj_pai_name, NULL); if (old_pai) { /* If type is OTHER, then the existing header was most likely * added by the PJSIP_HEADER dial plan function as a simple * name/value pair. We can't pass this to modify_id_header because * there are no virtual functions to get the uri. We could parse * it into a pjsip_fromto_hdr but it isn't worth it since * modify_id_header is just going to overwrite the name and number * anyway. We'll just remove it from the header list instead * and create a new one. */ if (old_pai->type == PJSIP_H_OTHER) { pj_list_erase(old_pai); } else { modify_id_header(tdata->pool, old_pai, id); add_privacy_header(tdata, id); return; } } pai_hdr = create_new_id_hdr(&pj_pai_name, tdata, id); if (!pai_hdr) { return; } add_privacy_header(tdata, id); pjsip_msg_add_hdr(tdata->msg, (pjsip_hdr *)pai_hdr); }
/*! * \internal * \brief Add a P-Asserted-Identity header to an outbound message * \param tdata The message to add the header to * \param id The identification information used to populate the header */ static void add_pai_header(pjsip_tx_data *tdata, const struct ast_party_id *id) { static const pj_str_t pj_pai_name = { "P-Asserted-Identity", 19 }; pjsip_fromto_hdr *pai_hdr; pjsip_fromto_hdr *old_pai; /* Since inv_session reuses responses, we have to make sure there's not already * a P-Asserted-Identity present. If there is, we just modify the old one. */ old_pai = pjsip_msg_find_hdr_by_name(tdata->msg, &pj_pai_name, NULL); if (old_pai) { modify_id_header(tdata->pool, old_pai, id); add_privacy_header(tdata, id); return; } pai_hdr = create_new_id_hdr(&pj_pai_name, tdata, id); if (!pai_hdr) { return; } add_privacy_header(tdata, id); pjsip_msg_add_hdr(tdata->msg, (pjsip_hdr *)pai_hdr); }