⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 plugin.c

📁 partysip 插件开发 用于实时在线管理
💻 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 + -