Skip to content

Commit

Permalink
Add queried names to server address record, and add the address recor…
Browse files Browse the repository at this point in the history
…d in parameter for on_verify_cb callback (#4256)
  • Loading branch information
Tarteszeus authored Jan 30, 2025
1 parent f9e56d8 commit dfcfa13
Show file tree
Hide file tree
Showing 5 changed files with 44 additions and 10 deletions.
3 changes: 3 additions & 0 deletions pjsip/include/pjsip/sip_resolve.h
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,9 @@ PJ_BEGIN_DECL
/** Address records. */
typedef struct pjsip_server_address_record
{
/** The queried name. */
pj_str_t name;

/** Preferable transport to be used to contact this address. */
pjsip_transport_type_e type;

Expand Down
5 changes: 5 additions & 0 deletions pjsip/include/pjsip/sip_transport_tls.h
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,11 @@ typedef struct pjsip_tls_on_verify_param {
*/
const pj_sockaddr_t *remote_addr;

/**
* Describes resolved server addresses.
*/
const pjsip_server_addresses *server_addr;

/**
* Describes transport direction.
*/
Expand Down
4 changes: 4 additions & 0 deletions pjsip/src/pjsip/sip_resolve.c
Original file line number Diff line number Diff line change
Expand Up @@ -387,6 +387,7 @@ PJ_DEF(void) pjsip_resolve( pjsip_resolver_t *resolver,
pjsip_transport_get_type_name(type),
pjsip_transport_get_type_desc(type)));

svr_addr.entry[i].name = target->addr.host;
svr_addr.entry[i].priority = 0;
svr_addr.entry[i].weight = 0;
svr_addr.entry[i].type = type;
Expand Down Expand Up @@ -571,6 +572,7 @@ static void dns_a_callback(void *user_data,
if (rec.addr[i].af != pj_AF_INET())
continue;

srv->entry[srv->count].name = rec.name;
srv->entry[srv->count].type = query->naptr[0].type;
srv->entry[srv->count].priority = 0;
srv->entry[srv->count].weight = 0;
Expand Down Expand Up @@ -633,6 +635,7 @@ static void dns_aaaa_callback(void *user_data,
if (rec.addr[i].af != pj_AF_INET6())
continue;

srv->entry[srv->count].name = rec.name;
srv->entry[srv->count].type = query->naptr[0].type |
PJSIP_TRANSPORT_IPV6;
srv->entry[srv->count].priority = 0;
Expand Down Expand Up @@ -692,6 +695,7 @@ static void srv_resolver_cb(void *user_data,
for (j = 0; j < s->addr_count &&
srv.count < PJSIP_MAX_RESOLVED_ADDRESSES; ++j)
{
srv.entry[srv.count].name = rec->entry[i].server.name;
srv.entry[srv.count].type = query->naptr[0].type;
srv.entry[srv.count].priority = rec->entry[i].priority;
srv.entry[srv.count].weight = rec->entry[i].weight;
Expand Down
36 changes: 26 additions & 10 deletions pjsip/src/pjsip/sip_transport_tls.c
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ struct tls_transport
pjsip_transport base;
pj_bool_t is_server;
pj_str_t remote_name;
pjsip_server_addresses server_addr;

pj_bool_t is_registered;
pj_bool_t is_closing;
Expand Down Expand Up @@ -166,6 +167,7 @@ static pj_status_t tls_create(struct tls_listener *listener,
const pj_sockaddr *local,
const pj_sockaddr *remote,
const pj_str_t *remote_name,
const pjsip_server_addresses *addr,
pj_grp_lock_t *glock,
struct tls_transport **p_tls);

Expand Down Expand Up @@ -851,6 +853,7 @@ static pj_status_t tls_create( struct tls_listener *listener,
const pj_sockaddr *local,
const pj_sockaddr *remote,
const pj_str_t *remote_name,
const pjsip_server_addresses *addr,
pj_grp_lock_t *glock,
struct tls_transport **p_tls)
{
Expand Down Expand Up @@ -927,6 +930,14 @@ static pj_status_t tls_create( struct tls_listener *listener,
sockaddr_to_host_port(pool, &tls->base.remote_name, remote);
}

if (addr) {
pj_memcpy( &tls->server_addr, addr,
sizeof(pjsip_server_addresses));
for (int i = 0; i < addr->count; ++i) {
pj_strdup(pool, &tls->server_addr.entry[i].name, &addr->entry[i].name);
}
}

tls->base.endpt = listener->endpt;
tls->base.tpmgr = listener->tpmgr;
tls->base.send_msg = &tls_send_msg;
Expand Down Expand Up @@ -1202,6 +1213,7 @@ static pj_status_t lis_create_transport(pjsip_tpfactory *factory,
pj_ssl_sock_param ssock_param;
pj_sockaddr local_addr;
pj_str_t remote_name;
pjsip_server_addresses server_addr;
pj_status_t status;

/* Sanity checks */
Expand All @@ -1221,12 +1233,14 @@ static pj_status_t lis_create_transport(pjsip_tpfactory *factory,
POOL_TP_INIT, POOL_TP_INC);
PJ_ASSERT_RETURN(pool != NULL, PJ_ENOMEM);

/* Get remote host name from tdata */
if (tdata)
/* Get remote host name and DNS queried server addresses from tdata */
if (tdata) {
remote_name = tdata->dest_info.name;
else
server_addr = tdata->dest_info.addr;
} else {
pj_bzero(&remote_name, sizeof(remote_name));

pj_bzero(&server_addr, sizeof(server_addr));
}
/* Build SSL socket param */
pj_ssl_sock_param_default(&ssock_param);
ssock_param.sock_af = (factory->type & PJSIP_TRANSPORT_IPV6) ?
Expand Down Expand Up @@ -1303,7 +1317,7 @@ static pj_status_t lis_create_transport(pjsip_tpfactory *factory,

/* Create the transport descriptor */
status = tls_create(listener, pool, ssock, PJ_FALSE, &local_addr,
rem_addr, &remote_name, glock, &tls);
rem_addr, &remote_name, &server_addr, glock, &tls);
if (status != PJ_SUCCESS)
return status;

Expand Down Expand Up @@ -1482,7 +1496,7 @@ static pj_bool_t on_accept_complete2(pj_ssl_sock_t *ssock,
* Create TLS transport for the new socket.
*/
status = tls_create( listener, NULL, new_ssock, PJ_TRUE,
&ssl_info.local_addr, &tmp_src_addr, NULL,
&ssl_info.local_addr, &tmp_src_addr, NULL, NULL,
ssl_info.grp_lock, &tls);

if (status != PJ_SUCCESS) {
Expand Down Expand Up @@ -1635,17 +1649,16 @@ static pj_bool_t on_data_sent(pj_ssl_sock_t *ssock,
static pj_bool_t on_verify_cb(pj_ssl_sock_t* ssock, pj_bool_t is_server)
{
pj_bool_t(*verify_cb)(const pjsip_tls_on_verify_param * param) = NULL;
struct tls_transport* tls_trans = NULL;

if (is_server) {
struct tls_listener* tls;

tls = (struct tls_listener*)pj_ssl_sock_get_user_data(ssock);
verify_cb = tls->tls_setting.on_verify_cb;
} else {
struct tls_transport* tls;

tls = (struct tls_transport*)pj_ssl_sock_get_user_data(ssock);
verify_cb = tls->on_verify_cb;
tls_trans = (struct tls_transport*)pj_ssl_sock_get_user_data(ssock);
verify_cb = tls_trans->on_verify_cb;
}

if (verify_cb) {
Expand All @@ -1655,6 +1668,9 @@ static pj_bool_t on_verify_cb(pj_ssl_sock_t* ssock, pj_bool_t is_server)
pj_bzero(&param, sizeof(param));
pj_ssl_sock_get_info(ssock, &info);

if (tls_trans) {
param.server_addr = &tls_trans->server_addr;
}
param.local_addr = &info.local_addr;
param.remote_addr = &info.remote_addr;
param.local_cert_info = info.local_cert_info;
Expand Down
6 changes: 6 additions & 0 deletions pjsip/src/pjsip/sip_util.c
Original file line number Diff line number Diff line change
Expand Up @@ -1371,6 +1371,9 @@ stateless_send_resolver_callback( pj_status_t status,
if (addr && addr != &tdata->dest_info.addr) {
pj_memcpy( &tdata->dest_info.addr, addr,
sizeof(pjsip_server_addresses));
for (int i = 0; i < addr->count; ++i) {
pj_strdup(tdata->pool, &tdata->dest_info.addr.entry[i].name, &addr->entry[i].name);
}
}
pj_assert(tdata->dest_info.addr.count != 0);

Expand Down Expand Up @@ -1832,6 +1835,9 @@ static void send_response_resolver_cb( pj_status_t status, void *token,

/* Update address in send_state. */
pj_memcpy(&send_state->tdata->dest_info.addr, addr, sizeof(*addr));
for (int i = 0; i < send_state->tdata->dest_info.addr.count; ++i) {
pj_strdup(send_state->tdata->pool, &send_state->tdata->dest_info.addr.entry[i].name, &addr->entry[i].name);
}

/* Send response using the transoprt. */
status = pjsip_transport_send( send_state->cur_transport,
Expand Down

0 comments on commit dfcfa13

Please sign in to comment.