|
|
|
@ -1492,7 +1492,7 @@ static void check_via(struct sip_pvt *p, struct sip_request *req);
|
|
|
|
|
static int get_rpid(struct sip_pvt *p, struct sip_request *oreq);
|
|
|
|
|
static int get_rdnis(struct sip_pvt *p, struct sip_request *oreq, char **name, char **number, int *reason);
|
|
|
|
|
static enum sip_get_dest_result get_destination(struct sip_pvt *p, struct sip_request *oreq, int *cc_recall_core_id);
|
|
|
|
|
static int get_msg_text(char *buf, int len, struct sip_request *req, int addnewline);
|
|
|
|
|
static int get_msg_text(char *buf, int len, struct sip_request *req);
|
|
|
|
|
static int transmit_state_notify(struct sip_pvt *p, int state, int full, int timeout);
|
|
|
|
|
static void update_connectedline(struct sip_pvt *p, const void *data, size_t datalen);
|
|
|
|
|
static void update_redirecting(struct sip_pvt *p, const void *data, size_t datalen);
|
|
|
|
@ -16344,30 +16344,37 @@ static int check_user(struct sip_pvt *p, struct sip_request *req, int sipmethod,
|
|
|
|
|
return check_user_full(p, req, sipmethod, uri, reliable, addr, NULL);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*! \brief Get text out of a SIP MESSAGE packet */
|
|
|
|
|
static int get_msg_text(char *buf, int len, struct sip_request *req, int addnewline)
|
|
|
|
|
/*! \brief Get message body from a SIP request
|
|
|
|
|
* \param buf Destination buffer
|
|
|
|
|
* \param len Destination buffer size
|
|
|
|
|
* \param req The SIP request
|
|
|
|
|
*
|
|
|
|
|
* When parsing the request originally, the lines are split by LF or CRLF.
|
|
|
|
|
* This function adds a single LF after every line.
|
|
|
|
|
*/
|
|
|
|
|
static int get_msg_text(char *buf, int len, struct sip_request *req)
|
|
|
|
|
{
|
|
|
|
|
int x;
|
|
|
|
|
int y;
|
|
|
|
|
int linelen;
|
|
|
|
|
|
|
|
|
|
buf[0] = '\0';
|
|
|
|
|
/*XXX isn't strlen(buf) going to always be 0? */
|
|
|
|
|
y = len - strlen(buf) - 5;
|
|
|
|
|
if (y < 0)
|
|
|
|
|
y = 0;
|
|
|
|
|
for (x = 0; x < req->lines; x++) {
|
|
|
|
|
--len; /* reserve strncat null */
|
|
|
|
|
for (x = 0; len && x < req->lines; ++x) {
|
|
|
|
|
const char *line = REQ_OFFSET_TO_STR(req, line[x]);
|
|
|
|
|
strncat(buf, line, y); /* safe */
|
|
|
|
|
y -= strlen(line) + 1;
|
|
|
|
|
if (y < 0)
|
|
|
|
|
y = 0;
|
|
|
|
|
if (y != 0 && addnewline)
|
|
|
|
|
strncat(buf, line, len); /* safe */
|
|
|
|
|
linelen = strlen(buf);
|
|
|
|
|
buf += linelen;
|
|
|
|
|
len -= linelen;
|
|
|
|
|
if (len) {
|
|
|
|
|
strcat(buf, "\n"); /* safe */
|
|
|
|
|
++buf;
|
|
|
|
|
--len;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int get_msg_text2(struct ast_str **buf, struct sip_request *req, int addnewline)
|
|
|
|
|
static int get_msg_text2(struct ast_str **buf, struct sip_request *req)
|
|
|
|
|
{
|
|
|
|
|
int i, res = 0;
|
|
|
|
|
|
|
|
|
@ -16376,7 +16383,7 @@ static int get_msg_text2(struct ast_str **buf, struct sip_request *req, int addn
|
|
|
|
|
for (i = 0; res >= 0 && i < req->lines; i++) {
|
|
|
|
|
const char *line = REQ_OFFSET_TO_STR(req, line[i]);
|
|
|
|
|
|
|
|
|
|
res = ast_str_append(buf, 0, "%s%s", line, addnewline ? "\n" : "");
|
|
|
|
|
res = ast_str_append(buf, 0, "%s\n", line);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return res < 0 ? -1 : 0;
|
|
|
|
@ -16408,6 +16415,8 @@ AST_THREADSTORAGE(sip_msg_buf);
|
|
|
|
|
static void receive_message(struct sip_pvt *p, struct sip_request *req, struct ast_sockaddr *addr, const char *e)
|
|
|
|
|
{
|
|
|
|
|
struct ast_str *buf;
|
|
|
|
|
char *cbuf;
|
|
|
|
|
size_t len;
|
|
|
|
|
struct ast_frame f;
|
|
|
|
|
const char *content_type = sip_get_header(req, "Content-Type");
|
|
|
|
|
struct ast_msg *msg;
|
|
|
|
@ -16429,11 +16438,7 @@ static void receive_message(struct sip_pvt *p, struct sip_request *req, struct a
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* If this is an out of dialog msg, add back newlines, otherwise strip the new lines.
|
|
|
|
|
* In dialog msg's newlines are stripped to preserve the behavior of how Asterisk has worked
|
|
|
|
|
* in the past. If it is found later that new lines can be added into in dialog msgs as well,
|
|
|
|
|
* then change this. */
|
|
|
|
|
if (get_msg_text2(&buf, req, p->owner ? FALSE : TRUE)) {
|
|
|
|
|
if (get_msg_text2(&buf, req)) {
|
|
|
|
|
ast_log(LOG_WARNING, "Unable to retrieve text from %s\n", p->callid);
|
|
|
|
|
transmit_response(p, "202 Accepted", req);
|
|
|
|
|
if (!p->owner)
|
|
|
|
@ -16441,6 +16446,18 @@ static void receive_message(struct sip_pvt *p, struct sip_request *req, struct a
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Strip trailing line feeds from message body. (get_msg_text2 may add
|
|
|
|
|
* a trailing linefeed and we don't need any at the end) */
|
|
|
|
|
cbuf = ast_str_buffer(buf);
|
|
|
|
|
len = ast_str_strlen(buf);
|
|
|
|
|
while (len > 0) {
|
|
|
|
|
if (cbuf[--len] != '\n') {
|
|
|
|
|
++len;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
ast_str_truncate(buf, len);
|
|
|
|
|
|
|
|
|
|
if (p->owner) {
|
|
|
|
|
if (sip_debug_test_pvt(p))
|
|
|
|
|
ast_verbose("SIP Text message received: '%s'\n", ast_str_buffer(buf));
|
|
|
|
@ -19066,7 +19083,7 @@ static void handle_request_info(struct sip_pvt *p, struct sip_request *req)
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
get_msg_text(buf, sizeof(buf), req, TRUE);
|
|
|
|
|
get_msg_text(buf, sizeof(buf), req);
|
|
|
|
|
duration = 100; /* 100 ms */
|
|
|
|
|
|
|
|
|
|
if (ast_strlen_zero(buf)) {
|
|
|
|
@ -22108,7 +22125,7 @@ static int handle_request_notify(struct sip_pvt *p, struct sip_request *req, str
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Get the text of the attachment */
|
|
|
|
|
if (get_msg_text(buf, sizeof(buf), req, TRUE)) {
|
|
|
|
|
if (get_msg_text(buf, sizeof(buf), req)) {
|
|
|
|
|
ast_log(LOG_WARNING, "Unable to retrieve attachment from NOTIFY %s\n", p->callid);
|
|
|
|
|
transmit_response(p, "400 Bad request", req);
|
|
|
|
|
sip_scheddestroy(p, DEFAULT_TRANS_TIMEOUT);
|
|
|
|
|