📄 plugin.c
字号:
/* The PUBLISH plugin is a GPL plugin for partysip. Copyright (C) 2002 2003 Aymeric MOIZARD - <jack@atosc.org> The PUBLISH plugin is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. The PUBLISH plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Foobar; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA*/#include <partysip/partysip.h>#include "plugin.h"#include <osipparser2/osip_port.h>#include <osipparser2/osip_message.h>#include <ppl/ppl_md5.h>#include <sql_module.h>plugin_ctx_t *plugin_context = NULL;extern psp_plugin_t PPL_DECLARE_DATA mysqldb_publish_plugin;extern char name_config[50];intplugin_ctx_init (){ int i; plugin_context = (plugin_ctx_t *) malloc (sizeof (plugin_ctx_t)); if (plugin_context == NULL) return -1; /* my_thread_init(); */ /* do I need that? (only one thread access SQL elements. */ memset(plugin_context, '\0', sizeof(plugin_context)); i = module_publish_initialize(); if (i==0) return 0; plugin_ctx_free(); plugin_context = NULL; return -1;}voidplugin_ctx_free (){ /* my_thread_end(); */ if (plugin_context==NULL) return; if (plugin_context->connected==1) mysql_close(&(plugin_context->mysql_conn)); plugin_context->connected = 0; free (plugin_context); plugin_context = NULL;}/* This method returns: -2 if plugin consider this request should be totally discarded! -1 on error 0 nothing has been done 1 things has been done on psp_req element*/intcb_plugin_validate_publish (psp_request_t * psp_req){ osip_header_t *if_match; osip_message_t *request; osip_header_t *event; osip_header_t *expires; osip_accept_t *accept; int pos, i; char eventp[256]; memset(eventp, '\0', 256); osip_strncpy(eventp, "presence", 8); request = psp_request_get_request(psp_req); OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_INFO2, NULL, "%s plugin: Processing publish request!\n", PLUGIN_NAME)); if (!MSG_IS_PUBLISH (request)) { 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; } /* 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; } if (osip_list_eol(request->bodies, 0)) { OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_WARNING, NULL, "%s plugin: missing attachment in PUBLISH (%s)!\n", PLUGIN_NAME, event->hvalue)); 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; } /* 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->content_type==NULL || request->content_type->type==NULL || request->content_type->subtype==NULL || 0!=osip_strcasecmp(request->content_type->type, "application") || 0!=osip_strcasecmp(request->content_type->subtype, "pidf+xml")) { 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 publication? */ i = module_publish_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_message_header_get_byname(request, "SIP-If-Match",0,&if_match);#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 (if_match==NULL || if_match->hvalue==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 publication */ module_publish_delete_publication(if_match->hvalue,request->from,request->req_uri, eventp); psp_request_set_uas_status (psp_req, 200); /* close publication */ 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 (if_match!=NULL && if_match->hvalue!=NULL) { /* publication should already exist! */ OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_WARNING, NULL, "%s plugin: SUBSCRIBE within dialog\n", PLUGIN_NAME)); /* is there any dialog for this to tag */ i = module_publish_dialog_exist(if_match->hvalue, 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; } /* !!trigger notify!! */ /* !!trigger notify!! */ 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_publish_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_INFO2, NULL, "%s plugin: PUBLISH was accepted!\n", PLUGIN_NAME)); return 0;}intcb_plugin_publish_complete_2xxanswer (psp_request_t * psp_req, osip_message_t * response) /* HOOK MIDDLE */{ osip_message_t *request; osip_header_t *expires; osip_header_t *event; char eventp[256]; memset(eventp, '\0', 256); osip_strncpy(eventp, "presence", 8); request = psp_request_get_request(psp_req); if (!MSG_IS_PUBLISH (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; } /* skip non presence publish answer */ 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")) { /* probably not handled by this server! */ psp_request_set_state (psp_req, PSP_CONTINUE); return 0; } OSIP_TRACE (osip_trace (__FILE__, __LINE__, OSIP_INFO2, NULL, "%s plugin: complete answer in this 2xx for PUBLISH!\n" , PLUGIN_NAME)); 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_publish_store_dialog(request, response); psp_request_set_state (psp_req, PSP_CONTINUE); return 0;}intcb_plugin_publish_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_PUBLISH (request)) { 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 + -