int mangle_message_cpim(struct sip_msg* _msg, char* _s1, char* _s2) { char *body = get_body(_msg); int parsed_content_type; struct hdr_field *content_type = _msg->content_type; int body_len = 0; parse_headers(_msg, HDR_CONTENTLENGTH_F|HDR_CONTENTTYPE_F, 0); parsed_content_type = parse_content_type_hdr(_msg); body_len = get_content_length(_msg); LOG(L_ERR, "mangle_message_cpim -1- content_type==%.*s %x (patching %x) bodylen=%d\n", content_type->body.len, content_type->body.s, parsed_content_type, MIMETYPE(MESSAGE,CPIM), body_len); if (body && (parsed_content_type == MIMETYPE(MESSAGE,CPIM))) { char *ptr = strstr(body, "\r\n\r\n"); char *new_content_type_str = strstr(body, "Content-Type: "); int new_content_type_len = 0; char *new_content_type_body; if (new_content_type_str) { char *new_content_type_end = strstr(new_content_type_str, "\r\n"); if (new_content_type_end) { new_content_type_str += 14; new_content_type_len = new_content_type_end - new_content_type_str; } else { new_content_type_len = 10; new_content_type_str = "text/plain"; } } else { new_content_type_len = 10; new_content_type_str = "text/plain"; } if (strncmp(new_content_type_str, "application/sip-iscomposing+xml", 31) == 0) { new_content_type_len = 30; new_content_type_str = "application/im-iscomposing+xml"; } new_content_type_body = pkg_malloc(new_content_type_len); strncpy(new_content_type_body, new_content_type_str, new_content_type_len); //LOG(L_ERR, "mangle_message_cpim -1- oldbody=%.*s\n", body_len, body); patch_msg(_msg, content_type->body.s, content_type->body.len, new_content_type_body, new_content_type_len); LOG(L_ERR, "mangle_message_cpim -1b- patched content-type=%.*s\n", new_content_type_len, new_content_type_str); if (ptr) { char *new_body = NULL; int new_body_len = body_len - (ptr + 4 - body); //LOG(L_ERR, "mangle_message_cpim -2- old_body_len=%d new_body_len=%d\n", body_len, new_body_len); new_body = pkg_malloc(new_body_len+1); strncpy(new_body, ptr+4, new_body_len+1); patch_msg(_msg, body, body_len, new_body, new_body_len); } } LOG(L_ERR, "mangle_message_cpim -3-\n"); return 1; }
pa_destroy, /* destroy function */ 0, /* oncancel function */ pa_child_init/* per-child init function */ }; void pa_sig_handler(int s) { DBG("PA:pa_worker:%d: SIGNAL received=%d\n **************", getpid(), s); } static struct mimetype_test { const char *string; int parsed; } mimetype_tests[] = { { "text/plain", MIMETYPE(TEXT,PLAIN) }, { "message/cpim", MIMETYPE(MESSAGE,CPIM) }, { "application/sdp", MIMETYPE(APPLICATION,SDP) }, { "application/cpl+xml", MIMETYPE(APPLICATION,CPLXML) }, { "application/pidf+xml", MIMETYPE(APPLICATION,PIDFXML) }, { "application/rlmi+xml", MIMETYPE(APPLICATION,RLMIXML) }, { "multipart/related", MIMETYPE(MULTIPART,RELATED) }, { "application/lpidf+xml", MIMETYPE(APPLICATION,LPIDFXML) }, { "application/xpidf+xml", MIMETYPE(APPLICATION,XPIDFXML) }, { "application/watcherinfo+xml", MIMETYPE(APPLICATION,WATCHERINFOXML) }, { "application/external-body", MIMETYPE(APPLICATION,EXTERNAL_BODY) }, { "application/*", MIMETYPE(APPLICATION,ALL) }, #ifdef SUBTYPE_XML_MSRTC_PIDF { "text/xml+msrtcp.pidf", MIMETYPE(TEXT,XML_MSRTC_PIDF) }, #endif { NULL, 0 }
static int publish_presence(struct sip_msg* _m, struct presentity* presentity) { char *body = get_body(_m); int body_len = 0; int msg_expires = default_expires; time_t expires = 0; str etag; dbid_t generated_etag; int has_etag; presentity_info_t *p = NULL; int content_type = -1; if (_m->content_type) content_type = get_content_type(_m); if (_m->content_length) body_len = get_content_length(_m); if (_m->expires) { if (_m->expires->parsed) { msg_expires = ((exp_body_t*)_m->expires->parsed)->val; } } if (msg_expires > max_publish_expiration) msg_expires = max_publish_expiration; if (msg_expires != 0) expires = msg_expires + act_time; if (_m->sipifmatch) { if (_m->sipifmatch->parsed) etag = *(str*)_m->sipifmatch->parsed; else str_clear(&etag); has_etag = 1; } else { /* ETag was not set, generate a new one */ generate_dbid(generated_etag); etag.len = dbid_strlen(generated_etag); etag.s = dbid_strptr(generated_etag); has_etag = 0; } if (body_len > 0) { switch (content_type) { case MIMETYPE(APPLICATION,PIDFXML): if (parse_pidf_document(&p, body, body_len) != 0) { LOG(L_ERR, "can't parse PIDF document\n"); paerrno = PA_UNSUPP_DOC; /* ? PA_PARSE_ERR */ } break; case MIMETYPE(APPLICATION,CPIM_PIDFXML): if (parse_cpim_pidf_document(&p, body, body_len) != 0) { LOG(L_ERR, "can't parse CPIM-PIDF document\n"); paerrno = PA_UNSUPP_DOC; } break; default: LOG(L_ERR, "unsupported Content-Type 0x%x for PUBLISH handling\n", content_type); paerrno = PA_UNSUPP_DOC; } if (paerrno != PA_OK) return -1; } if (process_published_presentity_info(presentity, p, &etag, expires, has_etag) == 0) { /* add header fields into response */ add_expires_to_rpl(_m, msg_expires); add_etag_to_rpl(_m, &etag); } if (p) free_presentity_info(p); return 0; }