Commit d53c5e20 authored by urbant's avatar urbant
Browse files

decoding support for allow, authentication-info and comma separated parameter list

parent 416de4ab
Loading
Loading
Loading
Loading
+56 −4
Original line number Diff line number Diff line
@@ -144,6 +144,7 @@ bool is_tel_scheme (const char * pszScheme) {
#define SIPREG_HCOLON		"[ 	]*:" SIPREG_SWS
#define SIPREG_COMMA		SIPREG_SWS "[,]" SIPREG_SWS
#define SIPREG_SEMI			SIPREG_SWS "[;]" SIPREG_SWS
#define SIPREG_EQUAL		SIPREG_SWS "[=]" SIPREG_SWS

// without leading and trailing whitespace
#define SIPREG_QUOTED_STRING	"[\"]((" SIPREG_LWS ")|[]!#-[^-~" SIPCHARS_UTF8_NONASCII"]|([\\x5C][\"\\x5C]))*[\"]"
@@ -177,6 +178,8 @@ bool is_tel_scheme (const char * pszScheme) {
#define SIPREG_TELPARAM_VALUE	"([\\x21\\x23-\\x3A\\x3C-\\x7E]+|(" SIPREG_QUOTED_STRING "))"
#define SIPREG_TELPARAMS		"([;]" SIPREG_TELPARAM_NAME "([=]" SIPREG_TELPARAM_VALUE ")?)+"

#define SIPREG_CPARAM "[\\x21\\x23-\\x2B\\x2D-\\x3C\\x3E-\\x7E]"

void SipUrl::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
{

@@ -364,9 +367,21 @@ void AmpersandParam_List::PreDecodeField (int id, Buffer& buffer) throw (DecodeE
		SetHypSize(-2);
}

void CommaParam_List::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
{
	static Regex reg_separator ("^" SIPREG_COMMA);
	
	if (!buffer.GetBitsLeft() || GetSize() == 0)
		return;
	if (reg_separator.Match(buffer))
		buffer.SetPosition(buffer.GetPosition() + reg_separator.GetMatchedLength());
	else
		SetHypSize(-2);
}

void GenericParam::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
{
	static Regex reg_equals ("^=");
	static Regex reg_equal ("^" SIPREG_EQUAL);

	static Regex reg_pparname ("^" SIPREG_PPARAM "+");
	static Regex reg_pparvalue ("^" SIPREG_PPARAM "*");
@@ -377,6 +392,9 @@ void GenericParam::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
	static Regex reg_telparname ("^" SIPREG_TELPARAM_NAME);
	static Regex reg_telparvalue ("^" SIPREG_TELPARAM_VALUE);

	static Regex reg_cparname ("^" SIPREG_CPARAM "+");
	static Regex reg_cparvalue ("^(" SIPREG_CPARAM "+)|(" SIPREG_QUOTED_STRING ")");

	Regex * preg_name;
	Regex * preg_value;
	bool bMandatoryParam = false;
@@ -407,6 +425,8 @@ void GenericParam::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
		bMandatoryParam = true;
	}
	else if (strcmp(pszParName, "CommaParam_List") == 0){
		preg_name = &reg_cparname;
		preg_value = &reg_cparvalue;
	}
	else {
		std::string message ("Unexpected parent type of parameter record: '");
@@ -422,9 +442,9 @@ void GenericParam::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
		break;
	case id_paramValue:
		if (bMandatoryParam)
			reg_equals.AssertMatch(buffer, this);
		if(bMandatoryParam || (buffer.GetBitsLeft() && reg_equals.Match(buffer))) {
			buffer.SetPosition(buffer.GetPosition() + 8);
			reg_equal.AssertMatch(buffer, this);
		if(bMandatoryParam || (buffer.GetBitsLeft() && reg_equal.Match(buffer))) {
			buffer.SetPosition(buffer.GetPosition() + reg_equal.GetMatchedLength());
			preg_value->AssertMatch (buffer, this);
			SetHypFieldIsPresent (id, 1);
			SetHypFieldLength (id, preg_value->GetMatchedLength());
@@ -648,6 +668,9 @@ private:
		SIP_HEADER_ADD (Require,	,	require,	REQUIRE_E);
		SIP_HEADER_ADD (Proxy-Require,	,	proxyRequire,	PROXY_REQUIRE_E);
		SIP_HEADER_ADD (Record-Route,	,	recordRoute,	RECORD_ROUTE_E);
		SIP_HEADER_ADD (Allow,		 ,	allow,		ALLOW_E);
		SIP_HEADER_ADD (Authentication-Info,	,	authenticationInfo,	AUTHENTICATION_INFO_E);
		
		{
			mEntries.push_back(Entry("", "", MessageHeader::id_undefinedHeader_List, ""));
			Entry& e = *mEntries.rbegin();
@@ -1045,6 +1068,35 @@ void AlertInfoBody_List::PreDecodeField (int id, Buffer& buffer) throw (DecodeEr
		SetHypSize(-2);
}

void Allow::PreDecodeField (int id, Buffer& buffer) throw (DecodeError){
	static Regex reg_allow ("^[^,\\r\\n]");
	if (id == id_methods){
		if(reg_allow.Match(buffer)) {
			SetHypFieldIsPresent (id, 1);
		} else {
			SetHypFieldIsPresent (id, 0);
		}
	}
}

void Method_List::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
{
	static Regex reg_separator ("^" SIPREG_COMMA);
	static Regex reg_content ("^[]" SIPREG_TOKEN);

	if (!buffer.GetBitsLeft())
		return;
	bool bSeparated = reg_separator.Match(buffer);
	if (bSeparated)
		buffer.SetPosition(buffer.GetPosition() + reg_separator.GetMatchedLength());

	if (GetSize() == 0 || bSeparated) {
		reg_content.AssertMatch(buffer, this);
		SetHypFieldLength(reg_content.GetMatchedLength());
	} else
		SetHypSize(-2);
}

void NameAddr::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
{
	static Regex reg_display_name ("^" SIPREG_DISPLAY_NAME);