Skip to content

Commit

Permalink
Maintain rport and received in VIA header of replies when doing topol…
Browse files Browse the repository at this point in the history
…ogy hiding
  • Loading branch information
vladpaiu committed Apr 2, 2015
1 parent dc9922f commit 6227550
Show file tree
Hide file tree
Showing 2 changed files with 198 additions and 27 deletions.
218 changes: 191 additions & 27 deletions modules/dialog/dlg_tophiding.c
Expand Up @@ -243,6 +243,8 @@ int dlg_th_onreply(struct dlg_cell *dlg, struct sip_msg *rpl, struct sip_msg *re
char* route,*p;
str via_str;
struct dlg_leg* leg;
char *received_buf=0,*rport_buf=0;
unsigned int rport_len=0,received_len=0;

/* parse all headers to be sure that all RR and Contact hdrs are found */
if (parse_headers(rpl, HDR_EOH_F, 0)< 0) {
Expand Down Expand Up @@ -283,40 +285,197 @@ int dlg_th_onreply(struct dlg_cell *dlg, struct sip_msg *rpl, struct sip_msg *re
return -1;
}

it = req->h_via1;
via_str.len = 0;
while (it) {
via_str.len += it->len;
it = it->sibling;
}
if ((req->msg_flags&FL_FORCE_RPORT)||(req->via1->rport)) {
if ((received_buf=received_builder(req,&received_len))==0){
LM_ERR("received_builder failed\n");
return -1;
}

LM_DBG("via len = %d\n",via_str.len);
if ((rport_buf=rport_builder(req, &rport_len))==0){
LM_ERR("rport_builder failed\n");
return -1;
}

/* take care of via1 + rest of VIA headers in h_via1 */
via_str.len = rport_len + received_len + req->h_via1->len;
LM_DBG("via len = %d\n",via_str.len);
if (req->via1->received) {
via_str.len -= req->via1->received->size+1;
LM_INFO(" have received will remove %d \n",req->via1->received->size+1);
}
if (req->via1->rport) {
via_str.len -= req->via1->rport->size+1;
LM_INFO(" have rport will remove %d \n",req->via1->rport->size+1);
}

if (via_str.len == 0)
goto restore_rr;
/* copy rest of VIA headers */
it = req->h_via1->sibling;
while (it) {
via_str.len += it->len;
it = it->sibling;
}

via_str.s = pkg_malloc(via_str.len);
if (!via_str.s) {
LM_ERR("no more pkg mem\n");
return -1;
}
via_str.s = pkg_malloc(via_str.len);
if (!via_str.s) {
LM_ERR("No more pkg mem\n");
goto err_free_rport;
}

LM_DBG("allocated via_str %p\n",via_str.s);
/* take care of via1 + rest of VIA headers in h_via1 */
if (req->via1->params.s){
size= req->via1->params.s-req->via1->hdr.s-1; /*compensate for ';' */
}else{
size= req->via1->host.s-req->via1->hdr.s+req->via1->host.len;
if (req->via1->port!=0){
size += req->via1->port_str.len + 1; /* +1 for ':'*/
}
}

it = req->h_via1;
p = via_str.s;
while (it) {
memcpy(p,it->name.s,it->len);
p+=it->len;
it = it->sibling;
}
p = via_str.s;
memcpy(p,req->via1->hdr.s,size);
p += size;
memcpy(p,received_buf,received_len);
p += received_len;
memcpy(p,rport_buf,rport_len);
p += rport_len;

int bytes_before = 0;
int bytes_after = 0;
int bytes_between = 0;
char *between = NULL;
char *after = NULL;

if (req->via1->received) {
if (!req->via1->rport) {
bytes_before = req->via1->received->start-req->via1->hdr.s-size-1;
memcpy(p,
req->via1->hdr.s+size,
bytes_before);
p += bytes_before;

bytes_after = req->h_via1->len - size - req->via1->received->size -
bytes_before - 1;
memcpy(p,
req->via1->received->start+req->via1->received->size,
bytes_after);
p += bytes_after;
} else {
/* we have both :( */
if (req->via1->rport->start > req->via1->received->start) {
bytes_before = req->via1->received->start-req->via1->hdr.s-size-1;
bytes_between = req->via1->rport->start - req->via1->received->start - req->via1->received->size - 1;
between = req->via1->received->start + req->via1->received->size;
after = req->via1->rport->start+req->via1->rport->size;

bytes_after = req->h_via1->len - size - req->via1->rport->size -
bytes_before - 1 - bytes_between - req->via1->received->size - 1;
LM_DBG("1 both , before = %d, between = %d, after = %d\n",bytes_before,bytes_between,bytes_after);
} else {
bytes_before = req->via1->rport->start-req->via1->hdr.s-size-1;
bytes_between = req->via1->received->start - req->via1->rport->start - req->via1->rport->size - 1;
between = req->via1->rport->start + req->via1->rport->size;

after = req->via1->received->start+req->via1->received->size;

bytes_after = req->h_via1->len - size - req->via1->rport->size -
bytes_before - 1 - bytes_between - req->via1->received->size -1 ;
LM_DBG("2 both , before = %d, between = %d, after = %d\n",bytes_before,bytes_between,bytes_after);
}

LM_DBG("inserting via headers - [%.*s]\n",via_str.len,via_str.s);
memcpy(p,
req->via1->hdr.s+size,
bytes_before);
p += bytes_before;

memcpy(p,
between,
bytes_between);
p += bytes_between;

memcpy(p,
after,
bytes_after);
p += bytes_after;
}
} else if (req->via1->rport) {
if (!req->via1->received) {
bytes_before = req->via1->rport->start-req->via1->hdr.s-size-1;
memcpy(p,
req->via1->hdr.s+size,
bytes_before);
p += bytes_before;

bytes_after = req->h_via1->len - size - req->via1->rport->size -
bytes_before - 1;
memcpy(p,
req->via1->rport->start+req->via1->rport->size,
bytes_after);
p += bytes_after;
}
} else {
/* no rport or received already present */
memcpy(p,req->via1->hdr.s+size,req->h_via1->len-size);
p+= req->h_via1->len-size;
}

/* copy rest of VIA headers */
it = req->h_via1->sibling;
while (it) {
memcpy(p,it->name.s,it->len);
p+=it->len;
it = it->sibling;
}

LM_DBG("built [%.*s], %d %d\n",(int)(p-via_str.s),via_str.s,(int)(p-via_str.s),via_str.len);

if ((lmp = insert_new_lump_after(lmp, via_str.s, via_str.len, 0)) == 0) {
LM_ERR("failed inserting new old vias\n");
pkg_free(via_str.s);
goto err_free_rport;
}

pkg_free(rport_buf);
pkg_free(received_buf);

} else {
/* no need to add received/rport , just copy the headers altogether */
it = req->h_via1;
via_str.len = 0;

while (it) {
via_str.len += it->len;
it = it->sibling;
}

LM_DBG("via len = %d\n",via_str.len);

if (via_str.len == 0)
goto restore_rr;

via_str.s = pkg_malloc(via_str.len);
if (!via_str.s) {
LM_ERR("no more pkg mem\n");
return -1;
}

LM_DBG("allocated via_str %p\n",via_str.s);

it = req->h_via1;
p = via_str.s;
while (it) {
memcpy(p,it->name.s,it->len);
p+=it->len;
it = it->sibling;
}

LM_DBG("inserting via headers - [%.*s]\n",via_str.len,via_str.s);

if ((lmp = insert_new_lump_after(lmp, via_str.s, via_str.len, 0)) == 0) {
LM_ERR("failed inserting new old vias\n");
pkg_free(via_str.s);
return -1;
}

if ((lmp = insert_new_lump_after(lmp, via_str.s, via_str.len, 0)) == 0) {
LM_ERR("failed inserting new old vias\n");
pkg_free(via_str.s);
return -1;
}

restore_rr:
Expand Down Expand Up @@ -348,6 +507,11 @@ int dlg_th_onreply(struct dlg_cell *dlg, struct sip_msg *rpl, struct sip_msg *re
}

return 0;

err_free_rport:
pkg_free(rport_buf);
pkg_free(received_buf);
return -1;
}

/* hide via, route sets and contacts */
Expand Down
7 changes: 7 additions & 0 deletions msg_translator.h
Expand Up @@ -122,4 +122,11 @@ int lumps_len(struct sip_msg* msg, struct lump* lumps,
struct socket_info* send_sock);
void process_lumps( struct sip_msg* msg, struct lump* lumps, char* new_buf,
unsigned int* new_buf_offs, unsigned int* orig_offs, struct socket_info* send_sock);

int is_del_via1_lump(struct sip_msg* msg);

char* received_builder(struct sip_msg *msg, unsigned int *received_len);

char* rport_builder(struct sip_msg *msg, unsigned int *rport_len);

#endif

0 comments on commit 6227550

Please sign in to comment.