void SOCKS5BytestreamManager::rejectSOCKS5Bytestream( const std::string& sid, StanzaError reason ) { AsyncTrackMap::iterator it = m_asyncTrackMap.find( sid ); if( it != m_asyncTrackMap.end() ) { rejectSOCKS5Bytestream( (*it).second.from, (*it).second.id, reason ); m_asyncTrackMap.erase( it ); } }
bool SOCKS5BytestreamManager::handleIq( Stanza *stanza ) { Tag* q = stanza->findChild( "query", "xmlns", XMLNS_BYTESTREAMS ); if( !q || !m_socks5BytestreamHandler ) return false; if( m_trackMap.find( stanza->id() ) != m_trackMap.end() ) return false; switch( stanza->subtype() ) { case StanzaIqSet: { const std::string& sid = q->findAttribute( "sid" ); const std::string& mode = q->findAttribute( "mode" ); if( haveStream( stanza->from() ) || sid.empty() || mode == "udp" ) { rejectSOCKS5Bytestream( stanza->from(), stanza->id(), StanzaErrorNotAcceptable ); return true; } AsyncS5BItem asi; Tag::TagList& l = q->children(); Tag::TagList::const_iterator it = l.begin(); for( ; it != l.end(); ++it ) { if( (*it)->name() == "streamhost" && (*it)->hasAttribute( "jid" ) && (*it)->hasAttribute( "host" ) && (*it)->hasAttribute( "port" ) ) { StreamHost sh; sh.jid = (*it)->findAttribute( "jid" ); sh.host = (*it)->findAttribute( "host" ); sh.port = atoi( (*it)->findAttribute( "port" ).c_str() ); asi.sHosts.push_back( sh ); } } asi.id = stanza->id(); asi.from = stanza->from(); asi.incoming = true; m_asyncTrackMap[sid] = asi; m_socks5BytestreamHandler->handleIncomingSOCKS5BytestreamRequest( sid, stanza->from() ); break; } case StanzaIqError: m_socks5BytestreamHandler->handleSOCKS5BytestreamError( stanza, std::string() ); break; default: break; } return true; }
bool SOCKS5BytestreamManager::handleIq( const IQ& iq ) { const Query* q = iq.findExtension<Query>( ExtS5BQuery ); if( !q || !m_socks5BytestreamHandler || m_trackMap.find( iq.id() ) != m_trackMap.end() ) return false; switch( iq.subtype() ) { case IQ::Set: { const std::string& sid = q->sid(); // FIXME What is haveStream() good for? if( /*haveStream( iq.from() ) ||*/ sid.empty() || q->mode() == S5BUDP ) { rejectSOCKS5Bytestream( iq.from(), iq.id(), StanzaErrorNotAcceptable ); return true; } AsyncS5BItem asi; asi.sHosts = q->hosts(); asi.id = iq.id(); asi.from = iq.from(); asi.to = iq.to(); asi.incoming = true; m_asyncTrackMap[sid] = asi; m_socks5BytestreamHandler->handleIncomingBytestreamRequest( sid, iq.from() ); break; } case IQ::Error: m_socks5BytestreamHandler->handleBytestreamError( iq, EmptyString ); break; default: break; } return true; }