1 /**
2  * Copyright (C) 2012 Daniel-Constantin Mierla (asipto.com)
3  *
4  * This file is part of Kamailio, a free SIP server.
5  *
6  * This file is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version
10  *
11  *
12  * This file is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
20  *
21  */
22 
23 #include <stdio.h>
24 #include <unistd.h>
25 #include <stdlib.h>
26 #include <string.h>
27 
28 #include "../../core/dprint.h"
29 #include "../../core/globals.h"
30 #include "../../core/ut.h"
31 #include "../../core/dset.h"
32 
33 #include "msrp_parser.h"
34 #include "msrp_netio.h"
35 #include "msrp_env.h"
36 
37 extern int msrp_param_sipmsg;
38 
39 static msrp_env_t _msrp_env = {0};
40 
41 /**
42  *
43  */
msrp_get_env(void)44 msrp_env_t *msrp_get_env(void)
45 {
46 	return &_msrp_env;
47 }
48 
49 /**
50  *
51  */
msrp_reset_env(void)52 void msrp_reset_env(void)
53 {
54 	memset(&_msrp_env, 0, sizeof(struct msrp_env));
55 }
56 
57 /**
58  *
59  */
msrp_get_current_frame(void)60 msrp_frame_t *msrp_get_current_frame(void)
61 {
62 	return _msrp_env.msrp;
63 }
64 
65 /**
66  *
67  */
msrp_set_current_frame(msrp_frame_t * mf)68 int msrp_set_current_frame(msrp_frame_t *mf)
69 {
70 	_msrp_env.msrp = mf;
71 	init_dst_from_rcv(&_msrp_env.srcinfo, mf->tcpinfo->rcv);
72 	_msrp_env.envflags |= MSRP_ENV_SRCINFO;
73 	return 0;
74 }
75 
76 
77 /**
78  *
79  */
msrp_env_set_dstinfo(msrp_frame_t * mf,str * addr,str * fsock,int flags)80 int msrp_env_set_dstinfo(msrp_frame_t *mf, str *addr, str *fsock, int flags)
81 {
82 	struct socket_info *si = NULL;
83 	snd_flags_t sflags = {0};
84 
85 	if(fsock!=NULL && fsock->len>0)
86 	{
87 		si = msrp_get_local_socket(fsock);
88 		if(si==NULL)
89 		{
90 			LM_DBG("local socket not found [%.*s] - trying to continue\n",
91 					fsock->len, fsock->s);
92 		}
93 	}
94 	sflags.f = flags;
95 	if(si==NULL)
96 	{
97 		sflags.f &= ~SND_F_FORCE_SOCKET;
98 	} else {
99 		sflags.f |= SND_F_FORCE_SOCKET;
100 	}
101 
102 	sflags.f |=  _msrp_env.sndflags;
103 	memset(&_msrp_env.dstinfo, 0, sizeof(struct dest_info));
104 	if(msrp_uri_to_dstinfo(NULL, &_msrp_env.dstinfo, si, sflags, addr)==NULL)
105 	{
106 		LM_ERR("failed to set destination address [%.*s]\n",
107 				addr->len, addr->s);
108 		return -1;
109 	}
110 	_msrp_env.envflags |= MSRP_ENV_DSTINFO;
111 	return 0;
112 }
113 
114 /**
115  *
116  */
msrp_env_set_sndflags(msrp_frame_t * mf,int flags)117 int msrp_env_set_sndflags(msrp_frame_t *mf, int flags)
118 {
119 	_msrp_env.sndflags |= (flags & (~SND_F_FORCE_SOCKET));
120 	if(_msrp_env.envflags & MSRP_ENV_DSTINFO)
121 	{
122 		_msrp_env.dstinfo.send_flags.f |= _msrp_env.sndflags;
123 	}
124 	return 0;
125 }
126 
127 /**
128  *
129  */
msrp_env_set_rplflags(msrp_frame_t * mf,int flags)130 int msrp_env_set_rplflags(msrp_frame_t *mf, int flags)
131 {
132 	_msrp_env.rplflags |= (flags & (~SND_F_FORCE_SOCKET));
133 	if(_msrp_env.envflags & MSRP_ENV_SRCINFO)
134 	{
135 		_msrp_env.srcinfo.send_flags.f |= _msrp_env.rplflags;
136 	}
137 	return 0;
138 }
139 
140 
141 /**
142  *
143  */
144 #define MSRP_FAKED_SIPMSG_START "MSRP sip:a@127.0.0.1 SIP/2.0\r\nVia: SIP/2.0/UDP 127.0.0.1:9;branch=z9hG4bKa\r\nFrom: <b@127.0.0.1>;tag=a\r\nTo: <a@127.0.0.1>\r\nCall-ID: a\r\nCSeq: 1 MSRP\r\nContent-Length: 0\r\nMSRP-First-Line: "
145 #define MSRP_FAKED_SIPMSG_EXTRA 11240
146 #define MSRP_FAKED_SIPMSG_SIZE (sizeof(MSRP_FAKED_SIPMSG_START)+MSRP_FAKED_SIPMSG_EXTRA)
147 static char _msrp_faked_sipmsg_buf[MSRP_FAKED_SIPMSG_SIZE];
148 static sip_msg_t _msrp_faked_sipmsg;
149 static unsigned int _msrp_faked_sipmsg_no = 0;
150 
msrp_fake_sipmsg(msrp_frame_t * mf)151 sip_msg_t *msrp_fake_sipmsg(msrp_frame_t *mf)
152 {
153 	int len;
154 	if(msrp_param_sipmsg==0)
155 		return NULL;
156 	if(mf->buf.len >= MSRP_FAKED_SIPMSG_EXTRA-1)
157 		return NULL;
158 
159 	len = sizeof(MSRP_FAKED_SIPMSG_START)-1;
160 	memcpy(_msrp_faked_sipmsg_buf, MSRP_FAKED_SIPMSG_START, len);
161 	memcpy(_msrp_faked_sipmsg_buf + len, mf->buf.s,
162 			mf->fline.buf.len + mf->hbody.len);
163 	len += mf->fline.buf.len + mf->hbody.len;
164 	memcpy(_msrp_faked_sipmsg_buf + len, "\r\n", 2);
165 	len += 2;
166 	_msrp_faked_sipmsg_buf[len] = '\0';
167 
168 	memset(&_msrp_faked_sipmsg, 0, sizeof(sip_msg_t));
169 
170 	_msrp_faked_sipmsg.buf=_msrp_faked_sipmsg_buf;
171 	_msrp_faked_sipmsg.len=len;
172 
173 	_msrp_faked_sipmsg.set_global_address=default_global_address;
174 	_msrp_faked_sipmsg.set_global_port=default_global_port;
175 
176 	if (parse_msg(_msrp_faked_sipmsg.buf, _msrp_faked_sipmsg.len,
177 				&_msrp_faked_sipmsg)!=0)
178 	{
179 		LM_ERR("parse_msg failed\n");
180 		return NULL;
181 	}
182 
183 	_msrp_faked_sipmsg.id = 1 + _msrp_faked_sipmsg_no++;
184 	_msrp_faked_sipmsg.pid = my_pid();
185 	clear_branches();
186 	return &_msrp_faked_sipmsg;
187 }
188