📄 register.c
字号:
/* Copyright (C) 2002 Thomas Ries <tries@gmx.net> This file is part of Siproxd. Siproxd 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. Siproxd 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 Siproxd; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */#include "config.h"#include <stdio.h>#include <time.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#include <sys/types.h>#include <netinet/in.h>#include <arpa/inet.h>#include <osipparser2/osip_parser.h>#include "siproxd.h"#include "log.h"static char const ident[]="$Id: " __FILE__ ": " PACKAGE "-" VERSION "-" BUILDSTR " $";/* configuration storage */extern struct siproxd_config configuration;struct urlmap_s urlmap[URLMAP_SIZE]; /* URL mapping table */extern int sip_socket; /* sending SIP datagrams */extern int errno;/* * initialize the URL mapping table */void register_init(void) { FILE *stream; int sts, size, i; char buff[128]; memset(urlmap, 0, sizeof(urlmap)); if (configuration.registrationfile) { stream = fopen(configuration.registrationfile, "r"); if (!stream) { /* * the file does not exist, or the size was incorrect, * delete it and start from scratch */ unlink(configuration.registrationfile); WARN("registration file not found, starting with empty table"); } else { /* read the url table from file */ for (i=0;i < URLMAP_SIZE; i++) { fgets(buff, sizeof(buff), stream); sts=sscanf(buff, "***:%i:%i", &urlmap[i].active, &urlmap[i].expires); if (urlmap[i].active) { osip_uri_init(&urlmap[i].true_url); osip_uri_init(&urlmap[i].masq_url); osip_uri_init(&urlmap[i].reg_url); #define R(X) {\ fgets(buff, sizeof(buff), stream);\ buff[sizeof(buff)-1]='\0';\ if (strchr(buff, 10)) *strchr(buff, 10)='\0';\ if (strchr(buff, 13)) *strchr(buff, 13)='\0';\ if (strlen(buff) > 0) {\ size = strlen(buff);\ X =(char*)malloc(size+1);\ sts=sscanf(buff,"%s",X);\ } else {\ X = NULL;\ }\ } R(urlmap[i].true_url->scheme); R(urlmap[i].true_url->username); R(urlmap[i].true_url->host); R(urlmap[i].true_url->port); R(urlmap[i].masq_url->scheme); R(urlmap[i].masq_url->username); R(urlmap[i].masq_url->host); R(urlmap[i].masq_url->port); R(urlmap[i].reg_url->scheme); R(urlmap[i].reg_url->username); R(urlmap[i].reg_url->host); R(urlmap[i].reg_url->port); } } fclose(stream); } } return;}/* * shut down the URL mapping table */void register_shut(void) { int i; FILE *stream; if (configuration.registrationfile) { /* write urlmap back to file */ stream = fopen(configuration.registrationfile, "w+"); if (!stream) { /* try to unlink it and open again */ unlink(configuration.registrationfile); stream = fopen(configuration.registrationfile, "w+"); /* open file for write failed, complain */ if (!stream) { ERROR("unable to write registration file"); return; } } for (i=0;i < URLMAP_SIZE; i++) { fprintf(stream, "***:%i:%i\n", urlmap[i].active, urlmap[i].expires); if (urlmap[i].active) { #define W(X) fprintf(stream, "%s\n", (X)? X:""); W(urlmap[i].true_url->scheme); W(urlmap[i].true_url->username); W(urlmap[i].true_url->host); W(urlmap[i].true_url->port); W(urlmap[i].masq_url->scheme); W(urlmap[i].masq_url->username); W(urlmap[i].masq_url->host); W(urlmap[i].masq_url->port); W(urlmap[i].reg_url->scheme); W(urlmap[i].reg_url->username); W(urlmap[i].reg_url->host); W(urlmap[i].reg_url->port); } } fclose(stream); } return;}/* * handles register requests and updates the URL mapping table * * RETURNS: * STS_SUCCESS : successfully registered * STS_FAILURE : registration failed * STS_NEED_AUTH : authentication needed */int register_client(osip_message_t *my_msg, int force_lcl_masq) { int i, j, n, sts; int expires; time_t time_now; osip_uri_t *url1_to, *url1_contact; osip_uri_t *url2_to, *url2_contact; osip_header_t *expires_hdr; osip_uri_param_t *expires_param=NULL; /* * RFC 3261, Section 16.3 step 6 * Proxy Behavior - Request Validation - Proxy-Authorization */ sts = authenticate_proxy(my_msg); if (sts == STS_FAILURE) { /* failed */ WARN("proxy authentication failed for %s@%s", (my_msg->to->url->username)? my_msg->to->url->username : "*NULL*", my_msg->to->url->host); return STS_FAILURE; } else if (sts == STS_NEED_AUTH) { /* needed */ DEBUGC(DBCLASS_REG,"proxy authentication needed for %s@%s", my_msg->to->url->username,my_msg->to->url->host); return STS_NEED_AUTH; }/* fetch 1st Via entry and remember this address. Incoming requests for the registered address have to be passed on to that host. To: -> address to be registered Contact: -> host is reachable there => Mapping is To: <1--n> Contact */ time(&time_now); DEBUGC(DBCLASS_BABBLE,"sip_register:"); /* evaluate Expires Header field */ osip_message_get_expires(my_msg, 0, &expires_hdr); /* * look for an Contact expires parameter - in case of REGISTER * these two are equal. The Contact expires has higher priority! */ osip_contact_param_get_byname( (osip_contact_t*) my_msg->contacts->node->element, EXPIRES, &expires_param); if (expires_param && expires_param->gvalue) { /* get expires from contact Header */ expires=atoi(expires_param->gvalue); } else if (expires_hdr && expires_hdr->hvalue) { /* get expires from expires Header */ expires=atoi(expires_hdr->hvalue); } else { /* it seems, the expires field is not present everywhere... */ WARN("no 'expires' header found - set time to 600 sec"); expires=600; osip_message_set_expires(my_msg, "600"); } url1_to=my_msg->to->url; url1_contact=((osip_contact_t*)(my_msg->contacts->node->element))->url; DEBUGC(DBCLASS_REG,"register: %s@%s expires=%i seconds", (url1_contact->username) ? url1_contact->username : "*NULL*", (url1_contact->host) ? url1_contact->host : "*NULL*", expires);/* Update registration. There are two possibilities: * - already registered, then update the existing record * - not registered, then create a new record */ j=-1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -