// $Id$ // // Copyright (c) 1996-2004 // The Regents of the University of California. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that: (1) source code distributions // retain the above copyright notice and this paragraph in its entirety, (2) // distributions including binary code include the above copyright notice and // this paragraph in its entirety in the documentation or other materials // provided with the distribution, and (3) all advertising materials mentioning // features or use of this software display the following acknowledgement: // ``This product includes software developed by the University of California, // Lawrence Berkeley Laboratory and its contributors.'' Neither the name of // the University nor the names of its contributors may be used to endorse // or promote products derived from this software without specific prior // written permission. // THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED // WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. #include "SOCKS.h" #include "socks_pac.h" #include "TCP_Reassembler.h" // TODO: Violation/Confirmation SOCKS_Analyzer::SOCKS_Analyzer(Connection* conn) : TCP_ApplicationAnalyzer(AnalyzerTag::SOCKS, conn) { interp = new binpac::SOCKS::SOCKS_Conn(this); orig_done = resp_done = false; pia = 0; } SOCKS_Analyzer::~SOCKS_Analyzer() { delete interp; } void SOCKS_Analyzer::EndpointDone(bool orig) { if ( orig ) orig_done = true; else resp_done = true; } void SOCKS_Analyzer::Done() { TCP_ApplicationAnalyzer::Done(); interp->FlowEOF(true); interp->FlowEOF(false); } void SOCKS_Analyzer::EndpointEOF(TCP_Reassembler* endp) { TCP_ApplicationAnalyzer::EndpointEOF(endp); interp->FlowEOF(endp->IsOrig()); } void SOCKS_Analyzer::DeliverStream(int len, const u_char* data, bool orig) { TCP_ApplicationAnalyzer::DeliverStream(len, data, orig); assert(TCP()); if ( TCP()->IsPartial() ) // punt on partial. return; if ( orig_done && resp_done ) { // Finished decapsulating tunnel layer. Now do standard processing // with the rest of the conneciton. // // Note that we assume that no payload data arrives before both endpoints // are done with there part of the SOCKS protocol. if ( ! pia ) { pia = new PIA_TCP(Conn()); AddChildAnalyzer(pia); pia->FirstPacket(true, 0); pia->FirstPacket(false, 0); } ForwardStream(len, data, orig); } else interp->NewData(orig, data, data + len); } void SOCKS_Analyzer::Undelivered(int seq, int len, bool orig) { TCP_ApplicationAnalyzer::Undelivered(seq, len, orig); interp->NewGap(orig, len); }