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