📄 plugin.c
字号:
/* search a related package */ osip_message_header_get_byname(request, "event", 0, &event); if (event==NULL || event->hvalue==NULL) { /* serach for compact form of Event header: "o" */ osip_message_header_get_byname(request, "o", 0, &event); if (event==NULL || event->hvalue==NULL) { OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_INFO2, NULL, "%s plugin: missing event header in SUBSCRIBE request!\n", PLUGIN_NAME)); } } /* default is presence */ if (event==NULL || event->hvalue==NULL) osip_strncpy(eventp, "presence", 8); else snprintf(eventp, 256, event->hvalue); if (0==osip_strcasecmp(eventp, "presence")) { } else {#if 0 psp_request_set_uas_status (psp_req, 489); psp_request_set_mode (psp_req, PSP_UAS_MODE); psp_request_set_state (psp_req, PSP_MANDATE);#endif /* not handled on server */ psp_request_set_state (psp_req, PSP_CONTINUE); OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_WARNING, NULL, "%s plugin: unsupported package extension (%s)!\n", PLUGIN_NAME, event->hvalue)); return 0; } /* reject message where attachment type is not supported */ if (osip_list_eol(request->accepts, 0)) { /* the default one is always accepted */ } else { int found=0; pos=0; accept=NULL; while (!osip_list_eol(request->accepts, pos)) { accept = (osip_accept_t *) osip_list_get(request->accepts, pos); if (accept!=NULL && accept->type!=NULL && accept->subtype!=NULL && 0==osip_strcasecmp(eventp, "presence") && 0==osip_strcasecmp(accept->type, "application") && 0==osip_strcasecmp(accept->subtype, "pidf+xml")) { found=1; break; } else if (accept!=NULL && accept->type!=NULL && accept->subtype!=NULL && 0==osip_strcasecmp(eventp, "presence") && 0==osip_strcasecmp(accept->type, "application") && 0==osip_strcasecmp(accept->subtype, "xpidf+xml")) { found=1; break; } pos++; } if (found==0) { psp_request_set_uas_status (psp_req, 415); psp_request_set_mode (psp_req, PSP_UAS_MODE); psp_request_set_state (psp_req, PSP_MANDATE); return 0; } } if (request->from==NULL ||request->from->url==NULL ||request->from->url->username==NULL ||request->from->url->host==NULL ||request->req_uri==NULL ||request->req_uri->username==NULL ||request->req_uri->host==NULL) { OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_WARNING, NULL, "%s plugin: no defined target for SUBSCRIBE request\n", PLUGIN_NAME)); psp_request_set_uas_status (psp_req, 400); psp_request_set_mode (psp_req, PSP_UAS_MODE); psp_request_set_state (psp_req, PSP_MANDATE); return 0; } /* is user authorized to view subscription? */ i = module_subscribe_authorize_user(request->from, request->req_uri, eventp); if (i>=300) { psp_request_set_uas_status (psp_req, i); psp_request_set_mode (psp_req, PSP_UAS_MODE); psp_request_set_state (psp_req, PSP_MANDATE); return 0; } osip_from_param_get_byname (request->to, "tag", &tag_to);#define MIN_EXPIRES_HEADER 500 osip_message_header_get_byname(request, "expires", 0, &expires); if (expires!=NULL && expires->hvalue!=NULL && 0==osip_strcasecmp(expires->hvalue, "0")) { OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_WARNING, NULL, "%s plugin: dialog for SUBSCRIBE is closed\n", PLUGIN_NAME)); if (tag_to==NULL || tag_to->gvalue==NULL) { psp_request_set_uas_status (psp_req, 423); /* too short??? */ psp_request_set_mode (psp_req, PSP_UAS_MODE); psp_request_set_state (psp_req, PSP_MANDATE); return 0; } /* delete subscription */ module_subscribe_delete_subscription(tag_to->gvalue,request->from,request->to, eventp); psp_request_set_uas_status (psp_req, 200); /* close subscription */ psp_request_set_mode (psp_req, PSP_UAS_MODE); psp_request_set_state (psp_req, PSP_MANDATE); return 0; } else if (expires!=NULL && expires->hvalue!=NULL && 0!=osip_strcasecmp(expires->hvalue, "0")) { int exp = atoi(expires->hvalue); if (exp<MIN_EXPIRES_HEADER) { OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_WARNING, NULL, "%s plugin: SUBSCRIBE within dialog\n", PLUGIN_NAME)); psp_request_set_uas_status (psp_req, 423); psp_request_set_mode (psp_req, PSP_UAS_MODE); psp_request_set_state (psp_req, PSP_MANDATE); return 0; } } if (tag_to!=NULL && tag_to->gvalue!=NULL ) { /* subscription should already exist! */ /* is there any dialog for this to tag */ i = module_subscribe_dialog_exist(tag_to->gvalue, eventp); if (i!=0) { psp_request_set_uas_status (psp_req, 481); psp_request_set_mode (psp_req, PSP_UAS_MODE); psp_request_set_state (psp_req, PSP_MANDATE); return 0; } OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_WARNING, NULL, "%s plugin: SUBSCRIBE within dialog\n", PLUGIN_NAME)); psp_request_set_uas_status (psp_req, 200); psp_request_set_mode (psp_req, PSP_UAS_MODE); psp_request_set_state (psp_req, PSP_MANDATE); return 0; } i = module_subscribe_authorize_user(request->from, request->req_uri, eventp); if (i>=300) { psp_request_set_uas_status (psp_req, i); psp_request_set_mode (psp_req, PSP_UAS_MODE); psp_request_set_state (psp_req, PSP_MANDATE); return 0; } psp_request_set_uas_status (psp_req, 202); psp_request_set_mode (psp_req, PSP_UAS_MODE); psp_request_set_state (psp_req, PSP_MANDATE); OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_WARNING, NULL, "%s plugin: accepted subscription!\n", PLUGIN_NAME)); return 0;}intcb_plugin_complete_2xxanswer (psp_request_t * psp_req, osip_message_t * response) /* HOOK MIDDLE */{ osip_message_t *request; osip_header_t *expires; request = psp_request_get_request(psp_req); if (!MSG_IS_SUBSCRIBE (request)) { /* bug?? */ psp_request_set_state (psp_req, PSP_CONTINUE); return 0; } if (0 != psp_core_is_responsible_for_this_domain (request-> req_uri)) { /* this module only handle SUBSCRIBE to local users */ psp_request_set_state (psp_req, PSP_CONTINUE); return 0; } OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_INFO4, NULL, "mysqldb_auth plugin: complete answer in this 2xx for SUBSCRIBE!\n")); osip_message_header_get_byname(response, "expires", 0, &expires); if (expires==NULL || expires->hvalue==NULL) { } osip_message_header_get_byname(request, "expires", 0, &expires); if (expires==NULL || expires->hvalue==NULL) { osip_message_set_expires(response, "900"); } else if (expires!=NULL && expires->hvalue!=NULL && 0==osip_strcasecmp(expires->hvalue, "0")) { OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_WARNING, NULL, "%s plugin: dialog for SUBSCRIBE is closed\n", PLUGIN_NAME)); osip_message_set_expires(response, expires->hvalue); return 0; } else { osip_message_set_expires(response, expires->hvalue); } module_subscribe_store_dialog(request, response); psp_request_set_state (psp_req, PSP_CONTINUE); return 0;}intcb_plugin_complete_4xxanswer (psp_request_t * psp_req, osip_message_t * response) /* HOOK MIDDLE */{ int status = psp_request_get_uas_status (psp_req); osip_message_t *request; request = psp_request_get_request(psp_req); if (!MSG_IS_SUBSCRIBE (request)) { /* bug?? */ psp_request_set_state (psp_req, PSP_CONTINUE); return 0; } if (0 != psp_core_is_responsible_for_this_domain (request-> req_uri)) { /* this module only handle SUBSCRIBE to local users */ psp_request_set_state (psp_req, PSP_CONTINUE); return 0; } OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_INFO4, NULL, "%s plugin: complete answer in this 2xx for SUBSCRIBE!\n", PLUGIN_NAME)); if (status==423) { osip_message_set_header(response, "Min-Expires", "900"); } if (status==415) { osip_message_set_accept(response, "application/pidf+xml"); } psp_request_set_state (psp_req, PSP_CONTINUE); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -