r3460 - in trunk: libminisip/source/subsystem_signaling/sip libmsip/include/libmsip libmsip/source/dialogs libmsip/source/messages

mikma at minisip.org mikma at minisip.org
Sat Nov 10 20:35:38 CET 2007


Author: mikma
Date: 2007-11-10 20:35:38 +0100 (Sat, 10 Nov 2007)
New Revision: 3460

Modified:
   trunk/libminisip/source/subsystem_signaling/sip/SipDialogVoipServer.cxx
   trunk/libmsip/include/libmsip/SipDialog.h
   trunk/libmsip/include/libmsip/SipMessage.h
   trunk/libmsip/include/libmsip/SipResponse.h
   trunk/libmsip/source/dialogs/SipDialog.cxx
   trunk/libmsip/source/messages/SipMessage.cxx
   trunk/libmsip/source/messages/SipResponse.cxx
Log:
Reject INVITEs with unsupported extensions in Require header(s), sending
420 (Bad Extension).


Modified: trunk/libminisip/source/subsystem_signaling/sip/SipDialogVoipServer.cxx
===================================================================
--- trunk/libminisip/source/subsystem_signaling/sip/SipDialogVoipServer.cxx	2007-11-02 19:25:21 UTC (rev 3459)
+++ trunk/libminisip/source/subsystem_signaling/sip/SipDialogVoipServer.cxx	2007-11-10 19:35:38 UTC (rev 3460)
@@ -157,6 +157,11 @@
 		
 	MRef<SipRequest*> inv = (SipRequest *)*command.getCommandPacket();
 
+	if( rejectUnsupported( inv ) ){
+		// Unsupported extension(s)
+		return true;
+	}
+
 	if( !inv->supported("100rel") && !inv->requires("100rel") ){
 		return false;
 	}

Modified: trunk/libmsip/include/libmsip/SipDialog.h
===================================================================
--- trunk/libmsip/include/libmsip/SipDialog.h	2007-11-02 19:25:21 UTC (rev 3459)
+++ trunk/libmsip/include/libmsip/SipDialog.h	2007-11-10 19:35:38 UTC (rev 3460)
@@ -244,6 +244,19 @@
 
 		std::string getDialogDebugString();
 
+		/**
+		 * @return a list of SIP extensions listed in
+		 * "Require" header(s) but not supported by the SIP stack.
+		 */
+		std::list<std::string> getRequiredUnsupported( MRef<SipMessage*> msg );
+
+		/**
+		 * Send a 420 (Bad Extension) response if the SIP request
+		 * requires unsupported SIP extensions.
+		 * @return true if a 420 response is sent.
+		 */
+		bool rejectUnsupported( MRef<SipRequest*> req );
+
 	protected:
 		
 		bool updateAuthentication( MRef<SipResponse*> resp,

Modified: trunk/libmsip/include/libmsip/SipMessage.h
===================================================================
--- trunk/libmsip/include/libmsip/SipMessage.h	2007-11-02 19:25:21 UTC (rev 3459)
+++ trunk/libmsip/include/libmsip/SipMessage.h	2007-11-10 19:35:38 UTC (rev 3460)
@@ -148,6 +148,13 @@
                  */
 		bool requires(std::string extension);
 
+                /**
+                 * Returns a list of required extensions listed in
+		 * "Require" headers.
+		 * @return list of required extensions.
+                 */
+		std::list<std::string> getRequired();
+
 		/**
 		 * Returns true if the message contains a SIP "Supported" header with
 		 * the extension given as argument to this method.

Modified: trunk/libmsip/include/libmsip/SipResponse.h
===================================================================
--- trunk/libmsip/include/libmsip/SipResponse.h	2007-11-02 19:25:21 UTC (rev 3459)
+++ trunk/libmsip/include/libmsip/SipResponse.h	2007-11-10 19:35:38 UTC (rev 3460)
@@ -74,6 +74,13 @@
 
 		virtual const std::string& getType(){return type;}
 
+		/**
+		 * Insert "Unupported" header in a 420 (Bad Extension)
+		 * response containing unsupported extensions.
+		 * @param unsupported list of unsupported extensions.
+		 */
+		void addUnsupported(const std::list<std::string> &unsupported);
+
 	private:
 		int32_t status_code;
 		std::string status_desc;

Modified: trunk/libmsip/source/dialogs/SipDialog.cxx
===================================================================
--- trunk/libmsip/source/dialogs/SipDialog.cxx	2007-11-02 19:25:21 UTC (rev 3459)
+++ trunk/libmsip/source/dialogs/SipDialog.cxx	2007-11-10 19:35:38 UTC (rev 3460)
@@ -596,3 +596,35 @@
 	return ret;
 }
 
+list<string> SipDialog::getRequiredUnsupported( MRef<SipMessage*> msg ) {
+	list<string> required = msg->getRequired();
+	list<string> unsupported;
+
+	list<string>::iterator i;
+	list<string>::iterator last = required.end();
+
+	for( i = required.begin(); i != last; i++ ){
+		const string &req = *i;
+
+		if( !callConfig->sipStack->supports( req ) )
+			unsupported.push_back( req );
+	}
+
+	return unsupported;
+}
+
+bool SipDialog::rejectUnsupported( MRef<SipRequest*> req ){
+	list<string> unsuppored = getRequiredUnsupported( *req );
+
+	if( !unsuppored.empty() ){
+		// Send 420 Bad Extension
+		MRef<SipResponse*> resp =
+			createSipResponse( req, 420, "Bad Extension" );
+
+		resp->addUnsupported( unsuppored );
+		sendSipMessage( *resp );
+		return true;
+	}
+
+	return false;
+}

Modified: trunk/libmsip/source/messages/SipMessage.cxx
===================================================================
--- trunk/libmsip/source/messages/SipMessage.cxx	2007-11-02 19:25:21 UTC (rev 3459)
+++ trunk/libmsip/source/messages/SipMessage.cxx	2007-11-10 19:35:38 UTC (rev 3460)
@@ -542,6 +542,18 @@
 }
 
 
+list<string> SipMessage::getRequired() {
+	list<string> set;
+	int n=0;
+	MRef<SipHeaderValue*> rr;
+	while ( ! (rr=getHeaderValueNo(SIP_HEADER_TYPE_REQUIRE,n++)).isNull() ){
+		set.push_back( ((SipHeaderValueRequire*)*rr)->getString() );
+	}
+
+	return set;
+}
+
+
 bool SipMessage::supported(string extension){
 	MRef<SipHeaderValue*> hval;
 	bool ret=false;

Modified: trunk/libmsip/source/messages/SipResponse.cxx
===================================================================
--- trunk/libmsip/source/messages/SipResponse.cxx	2007-11-02 19:25:21 UTC (rev 3459)
+++ trunk/libmsip/source/messages/SipResponse.cxx	2007-11-10 19:35:38 UTC (rev 3460)
@@ -43,6 +43,7 @@
 #include<libmsip/SipHeaderCallID.h>
 #include<libmsip/SipHeaderCSeq.h>
 #include<libmsip/SipHeaderMaxForwards.h>
+#include<libmsip/SipHeaderUnsupported.h>
 
 #include<libmsip/SipException.h>
 #include<libmsip/SipUtils.h>
@@ -149,3 +150,14 @@
 	return status_desc;
 }
 
+void SipResponse::addUnsupported(const std::list<string> &unsupported){
+	list<string>::const_iterator i;
+	list<string>::const_iterator last = unsupported.end();
+
+	for( i = unsupported.begin(); i != last; i++ ){
+		const string &ext = *i;
+
+		SipHeaderValue *value = new SipHeaderValueUnsupported( ext );
+		addHeader( new SipHeader( value ));
+	}
+}



More information about the Minisip-devel mailing list