⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sipprotocol.cpp

📁 KphoneSI (kpsi) is a SIP (Session Initiation Protocol) user agent for Linux, with which you can in
💻 CPP
字号:
#include <stdio.h>#include <stdlib.h>#include <base64.h>#include <qstringlist.h>#include "siputil.h"#include "extern_md5.h"#include "sipprotocol.h"QString dissipate_ouraddress;Sip::Sip( void ){}Sip::~Sip( void ){}Sip::Method Sip::matchMethod( const QString m ){	if ( m.compare( getMethodString( MESSAGE ) ) == 0 ) { return MESSAGE; }	if ( m.compare( getMethodString( INVITE ) ) == 0 ) { return INVITE; }	if ( m.compare( getMethodString( ACK ) ) == 0 ) { return ACK; }	if ( m.compare( getMethodString( BYE ) ) == 0 ) { return BYE; }	if ( m.compare( getMethodString( OPTIONS ) ) == 0 ) { return OPTIONS; }	if ( m.compare( getMethodString( CANCEL ) ) == 0 ) { return CANCEL; }	if ( m.compare( getMethodString( REGISTER ) ) == 0 ) { return REGISTER; }	if ( m.compare( getMethodString( MSG ) ) == 0 ) { return MSG; }	if ( m.compare( getMethodString( SUBSCRIBE ) ) == 0 ) { return SUBSCRIBE; }	if ( m.compare( getMethodString( NOTIFY ) ) == 0 ) { return NOTIFY; }	if ( m.compare( getMethodString( PUBLISH ) ) == 0 ) { return PUBLISH; }		if ( m.compare( getMethodString( INFO ) ) == 0 ) { return INFO; }	if ( m.compare( getMethodString( REFER ) ) == 0 ) { return REFER; }	if ( m.compare( getMethodString( RNOTIFY ) ) == 0 ) { return NOTIFY; }	return BadMethod;}const QString Sip::getMethodString( Method m ){	switch ( m ) {		case MESSAGE: return "MESSAGE";		case INVITE: return "INVITE";		case ACK: return "ACK";		case BYE: return "BYE";		case OPTIONS: return "OPTIONS";		case CANCEL: return "CANCEL";		case REGISTER: return "REGISTER";		case MSG: return "MSG";		case SUBSCRIBE: return "SUBSCRIBE";		case NOTIFY: return "NOTIFY";		case PUBLISH: return "PUBLISH";		case INFO: return "INFO";		case REFER: return "REFER";		case RNOTIFY: return "NOTIFY";		case BadMethod: return "BAD";	};	return QString::null;}QString Sip::getLocalAddress(void){if( dissipate_ouraddress == QString::null ) dissipate_ouraddress = QString::fromUtf8( SipUtil::getLocalFqdn() );	return dissipate_ouraddress;}void Sip::setLocalAddress( const QString localaddr ){		dissipate_ouraddress = localaddr;}int Sip::parseQop(const QString &qop){	QString tmp;	int result = NO_QOP;	if (qop == "") return result;	QStringList lst(QStringList::split(",", qop));	QStringList::Iterator it = lst.begin();	for(; it != lst.end(); ++it) {		tmp = (*it).stripWhiteSpace();		if ((tmp) == "auth") result |= AUTH_QOP;		else if ((tmp) == "auth-int") result |= AUTH_INT_QOP;		else result |= UNKNOWN_QOP;	}	return result;}QString Sip::getDigestResponse( const QString &user, const QString &password,			const QString &method, const QString &requri, const QString &authstr,int nonceCounter ){	QString realm = "";	QString nonce = "";	QString opaque = "";	QString algorithm = "";	QString qop = "";	QString digest;	QString cnonce;	QString noncecount;	char nc[9];	const char *p = authstr.latin1();	HASHHEX HA1;	HASHHEX HA2 = "";	HASHHEX response;	int i = 0;	int qop_parsed;	while( *p ) {		while( *p && (( *p == ' ' ) || ( *p == ',' ) || (*p == '\t') ))			p++;		i = 0;		if( !*p){/* NOP */		}		else if( strncasecmp( p, "realm=\"", 7 ) == 0 ) {			p += 7;			while( *p && p[ i ] != '"' ) {				realm[ i ] = p[ i ];				i++;			}		} else if( strncasecmp( p, "nonce=\"", 7 ) == 0 ) {			p += 7;			while( *p && p[ i ] != '"' ) {				nonce[ i ] = p[ i ];				i++;			}		} else if( strncasecmp( p, "opaque=\"", 8 ) == 0 ) {			p += 8;			while( *p && p[ i ] != '"' ) {				opaque[ i ] = p[ i ];				i++;			}		} else if( strncasecmp( p, "algorith=\"", 10 ) == 0 ) {			p += 10;			while( *p && p[ i ] != '"' ) {				algorithm[ i ] = p[ i ];				i++;			}		} else if( strncasecmp( p, "algorithm=\"", 11 ) == 0 ) {			p += 11;			while( *p && p[ i ] != '"' ) {				algorithm[ i ] = p[ i ];				i++;			}		} else if( strncasecmp( p, "algorithm=", 10 ) == 0 ) {			p += 10;			while( *p && p[ i ] != '"' && p[ i ] != ',' &&					p[ i ] != ' ' && p[ i ] != '\t') {				algorithm[ i ] = p[ i ];				i++;			}		} else if( strncasecmp( p, "qop=\"", 5 ) == 0 ) {			p += 5;			while( *p && p[ i ] != '"' ) {				qop[ i ] = p[ i ];				i++;			}		} else if( strncasecmp( p, "qop=", 4 ) == 0 ) {			p += 4;			while( *p && p[ i ] != '"' && p[ i ] != ',' &&					p[ i ] != ' ' && p[ i ] != '\t') {				qop[ i ] = p[ i ];				i++;			}		}		if(*p) {		 if( i ) p += i; else p++;		}	}	digest = "Digest username=\"";	digest += user;	digest += "\", ";	digest += "realm=\"";	digest += realm;	digest += "\", ";	digest += "nonce=\"";	digest += nonce;	digest += "\", ";	digest += "uri=\"";	digest += requri;	digest += "\", ";	cnonce = "abcdefghi";	sprintf(nc,"%08x",nonceCounter);	noncecount=QString(nc);	//noncecount = "00000001";	qop_parsed = parseQop(qop);	//if (qop_parsed & AUTH_QOP) printf("getDigestResponse(): Remote endpoint supports Digest with qop=auth\n");	//if (qop_parsed & AUTH_INT_QOP) printf("getDigestResponse(): Remote endpoint supports Digest with qop=auth-int\n");	//if (qop_parsed & UNKNOWN_QOP) printf("getDigestResponse(): Unknown qop parameter found\n");	DigestCalcHA1( "MD5", user.latin1(), realm.latin1(), password.latin1(),		nonce.latin1(), cnonce.latin1(), HA1 );	//printf( "WL: SipProtocol: HA1=%s (%s:%s)\n",HA1,user.latin1(),realm.latin1() );	DigestCalcResponse( HA1, nonce.latin1(), noncecount.latin1(),		cnonce.latin1(),		(qop_parsed & AUTH_QOP) ? ("auth") : (""),		method.latin1(), requri.latin1(), HA2, response );	if (qop_parsed & AUTH_QOP) {		digest += "qop=auth, ";	}	digest += "cnonce=\"";	digest += cnonce;	digest += "\", ";	digest += "nc=";	digest += noncecount;	digest += ", ";	digest += "response=\"";	digest += response;	digest += "\"";	if( opaque != QString::null ) {		digest += ", opaque=\"";		digest += opaque;		digest += "\"";	}	//printf( "SipProtocol: Digest calculated.\n" );	return digest;}QString Sip::getBasicResponse( const QString &user, const QString &password ){	QString basic;	QString userpass;	basic = "Basic ";	userpass += user;	userpass += ":";	userpass += password;	basic += base64_encode_line( userpass.latin1() );	return basic;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -