浏览代码

- forward uri now works for secure uris (sips:blbalba)
- parse_uri now parses sips uris; lr=something, r2|r2=something
added to the parse_uri recognized parameters
- resolver now sets the default port properly (5061 for tls, 5060 for others)

Andrei Pelinescu-Onciul 22 年之前
父节点
当前提交
3f601bd0f5
共有 6 个文件被更改,包括 98 次插入11 次删除
  1. 1 1
      Makefile.defs
  2. 13 2
      action.c
  3. 1 1
      error.h
  4. 4 0
      parser/msg_parser.h
  5. 76 6
      parser/parse_uri.c
  6. 3 1
      resolve.c

+ 1 - 1
Makefile.defs

@@ -40,7 +40,7 @@ export makefile_defs
 VERSION = 0
 PATCHLEVEL = 8
 SUBLEVEL =   12
-EXTRAVERSION = dev-t03
+EXTRAVERSION = dev-t04
 
 RELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
 OS = $(shell uname -s | sed -e s/SunOS/solaris/ | tr "[A-Z]" "[a-z]")

+ 13 - 2
action.c

@@ -163,11 +163,22 @@ int do_action(struct action* a, struct sip_msg* msg)
 						proto=u->proto;
 						break;
 					default:
-						LOG(L_ERR,"ERROR: do action: forward: bad uri protocol"
-								" %d\n", u->proto);
+						LOG(L_ERR,"ERROR: do action: forward: bad uri"
+								" transport %d\n", u->proto);
 						ret=E_BAD_PROTO;
 						goto error_fwd_uri;
 				}
+#ifdef USE_TLS
+				if (u->secure){
+					if (u->proto==PROTO_UDP){
+						LOG(L_ERR, "ERROR: do_action: forward: secure uri"
+								" incompatible with transport %d\n", u->proto);
+						ret=E_BAD_PROTO;
+						goto error_fwd_uri;
+					}
+					proto=PROTO_TLS;
+				}
+#endif
 				/* create a temporary proxy*/
 				p=mk_proxy(&u->host, port, proto);
 				if (p==0){

+ 1 - 1
error.h

@@ -42,7 +42,7 @@
 #define E_BAD_TUPEL		-9
 /* script programming error */
 #define E_SCRIPT		-10
-/* error in exceution of external tools */
+/* error in excecution of external tools */
 #define E_EXEC			-11
 /* too many branches demanded */
 #define E_TOO_MANY_BRANCHES -12

+ 4 - 0
parser/msg_parser.h

@@ -124,6 +124,7 @@ struct sip_uri {
 	str headers;  
 	unsigned short port_no;
 	unsigned short proto; /* from transport */
+	int secure; /* 1 if is a sips, 0 otherwise */
 	/* parameters */
 	str transport;
 	str ttl;
@@ -131,12 +132,15 @@ struct sip_uri {
 	str maddr;
 	str method;
 	str lr;
+	str r2; /* ser specific rr parameter */
 	/* values */
 	str transport_val;
 	str ttl_val;
 	str user_param_val;
 	str maddr_val;
 	str method_val;
+	str lr_val; /* lr value placeholder for lr=on a.s.o*/
+	str r2_val;
 };
 
 

+ 76 - 6
parser/parse_uri.c

@@ -32,6 +32,7 @@
  *              works in one pass) (andrei)
  * 2003-04-11  ser_error is now set in parse_uri (andrei)
  * 2003-04-26  ZSW (jiri)
+ * 2003-07-03  sips:, r2, lr=on support added (andrei)
  */
 
 
@@ -67,7 +68,10 @@ int parse_uri(char* buf, int len, struct sip_uri* uri)
 					/* maddr */
 					      PMA_A, PMA_D, PMA_D2, PMA_R, PMA_eq,
 					/* lr */
-					PLR_L, PLR_R_FIN,
+					PLR_L, PLR_R_FIN, PLR_eq,
+					/* r2 */
+					PR2_R, PR2_2_FIN, PR2_eq,
+					
 					/* transport values */
 					/* udp */
 					VU_U, VU_D, VU_P_FIN,
@@ -312,9 +316,14 @@ int parse_uri(char* buf, int len, struct sip_uri* uri)
 	state=URI_INIT;
 	memset(uri, 0, sizeof(struct sip_uri)); /* zero it all, just to be sure*/
 	/*look for sip:*/
-	if (len<4) goto error_too_short;
-	if (! ( ((buf[0]|0x20)=='s')&&((buf[1]|0x20)=='i')&&((buf[2]|0x20)=='p')&&
-		     (buf[3]==':') ) ) goto error_bad_uri;
+	if (len<5) goto error_too_short;
+	if (! ( ((buf[0]|0x20)=='s')&&((buf[1]|0x20)=='i')&&((buf[2]|0x20)=='p')))
+		goto error_bad_uri;
+	if (buf[3]!=':'){
+		/* parse also sips: */
+		if  (((buf[3]|0x20)=='s')&&(buf[4]==':')) {p++; uri->secure=1;}
+		else goto error_bad_uri;
+	}
 	
 	s=p;
 	for(;p<end; p++){
@@ -549,13 +558,17 @@ int parse_uri(char* buf, int len, struct sip_uri* uri)
 						b=p;
 						state=PLR_L;
 						break;
+					case 'r':
+					case 'R':
+						b=p;
+						state=PR2_R;
 					default:
 						state=URI_PARAM_P;
 				}
 				break;
 			case URI_PARAM_P: /* ignore current param */
 				/* supported params:
-				 *  maddr, transport, ttl, lr, user, method  */
+				 *  maddr, transport, ttl, lr, user, method, r2  */
 				switch(*p){
 					param_common_cases;
 				};
@@ -691,6 +704,9 @@ int parse_uri(char* buf, int len, struct sip_uri* uri)
 					case '@':
 						still_at_user; 
 						break;
+					case '=':
+						state=PLR_eq;
+						break;
 					semicolon_case; 
 						uri->lr.s=b;
 						uri->lr.len=(p-b);
@@ -705,7 +721,52 @@ int parse_uri(char* buf, int len, struct sip_uri* uri)
 						state=URI_PARAM_P;
 				}
 				break;
-						
+				/* handle lr=something case */
+			case PLR_eq:
+				param=&uri->lr;
+				param_val=&uri->lr_val;
+				switch(*p){
+					param_common_cases;
+					default:
+						v=p;
+						state=URI_VAL_P;
+				}
+				break;
+			/* r2 */
+			param_switch1(PR2_R,  '2', PR2_2_FIN);
+			case PR2_2_FIN:
+				switch(*p){
+					case '@':
+						still_at_user; 
+						break;
+					case '=':
+						state=PR2_eq;
+						break;
+					semicolon_case; 
+						uri->r2.s=b;
+						uri->r2.len=(p-b);
+						break;
+					question_case; 
+						uri->r2.s=b;
+						uri->r2.len=(p-b);
+						break;
+					colon_case;
+						break;
+					default:
+						state=URI_PARAM_P;
+				}
+				break;
+				/* handle lr=something case */
+			case PR2_eq:
+				param=&uri->r2;
+				param_val=&uri->r2_val;
+				switch(*p){
+					param_common_cases;
+					default:
+						v=p;
+						state=URI_VAL_P;
+				}
+				break;
 				
 				
 			case URI_HEADERS:
@@ -814,16 +875,25 @@ int parse_uri(char* buf, int len, struct sip_uri* uri)
 		case PM_D:
 		case PM_eq:
 		case PLR_L: /* lr */
+		case PR2_R:  /* r2 */
 			uri->params.s=s;
 			uri->params.len=p-s;
 			break;
 		/* fin param states */
 		case PLR_R_FIN:
+		case PLR_eq:
 			uri->params.s=s;
 			uri->params.len=p-s;
 			uri->lr.s=b;
 			uri->lr.len=p-b;
 			break;
+		case PR2_2_FIN:
+		case PR2_eq:
+			uri->params.s=s;
+			uri->params.len=p-s;
+			uri->r2.s=b;
+			uri->r2.len=p-b;
+			break;
 		case URI_VAL_P:
 		/* intermediate value states */
 		case VU_U:

+ 3 - 1
resolve.c

@@ -28,6 +28,7 @@
  * History:
  * -------
  *  2003-02-13  added proto to sip_resolvehost, for SRV lookups (andrei)
+ *  2003-07-03  default port value set according to proto (andrei)
  */ 
 
 
@@ -469,7 +470,8 @@ struct hostent* sip_resolvehost(str* name, unsigned short* port, int proto)
 
 	/* try SRV if no port specified (draft-ietf-sip-srv-06) */
 	if ((port)&&(*port==0)){
-		*port=SIP_PORT; /* just in case we don't find another */
+		*port=(proto==PROTO_TLS)?SIPS_PORT:SIP_PORT; /* just in case we don't
+														find another */
 		if ((name->len+SRV_PREFIX_LEN+1)>MAX_DNS_NAME){
 			LOG(L_WARN, "WARNING: sip_resolvehost: domain name too long (%d),"
 						" unable to perform SRV lookup\n", name->len);