o b@sdZddlZddlZddlZddlZddlmZmZmZddl m Z Gdddej Z Gdddej Z Gd d d ej ZGd d d ejZGd ddejZdS)z) Implementation of the SOCKSv4 protocol. N)deferprotocolreactor)logc@s4eZdZddZddZddZddZd d Zd S) SOCKSv4OutgoingcC ||_dSN)socksselfr r 9/usr/lib/python3/dist-packages/twisted/protocols/socks.py__init__ zSOCKSv4Outgoing.__init__cCs.|j}|jjdd|j|jd||j_dS)NZr)portip) transportgetPeerr makeReplyrhost otherConn)r peerr r r connectionMades  zSOCKSv4Outgoing.connectionMadecC|jjdSrr rloseConnectionr reasonr r r connectionLostzSOCKSv4Outgoing.connectionLostcC|j|dSrr writer datar r r dataReceived!r zSOCKSv4Outgoing.dataReceivedcC|j|||j|dSrr rrr#r$r r r r#$zSOCKSv4Outgoing.writeN)__name__ __module__ __qualname__rrrr&r#r r r r rs  rc@s,eZdZddZddZddZddZd S) SOCKSv4IncomingcCs||_||j_dSr)r rr r r r r*s zSOCKSv4Incoming.__init__cCrrrrr r r r.r zSOCKSv4Incoming.connectionLostcCr!rr"r$r r r r&1r zSOCKSv4Incoming.dataReceivedcCr'rr(r$r r r r#4r)zSOCKSv4Incoming.writeN)r*r+r,rrr&r#r r r r r-)s  r-c@speZdZdZdefddZddZddZd d Zd d Z d dZ ddZ ddZ dddZ ddZddZdS)SOCKSv4a An implementation of the SOCKSv4 protocol. @type logging: L{str} or L{None} @ivar logging: If not L{None}, the name of the logfile to which connection information will be written. @type reactor: object providing L{twisted.internet.interfaces.IReactorTCP} @ivar reactor: The reactor used to create connections. @type buf: L{str} @ivar buf: Part of a SOCKSv4 connection request. @type otherConn: C{SOCKSv4Incoming}, C{SOCKSv4Outgoing} or L{None} @ivar otherConn: Until the connection has been established, C{otherConn} is L{None}. After that, it is the proxy-to-destination protocol instance along which the client's connection is being forwarded. NcC||_||_dSr)loggingr)r r0rr r r rM zSOCKSv4.__init__cCsd|_d|_dS)N)bufr)r r r r rQr1zSOCKSv4.connectionMadec Cs2|jr |j|dS|j||_|j}d|jddvr|jdd|jdd}|_td|dd\}}}|jdd\}|_|dddkr|dddkrd|jvr^||_dS|jdd\}|_|j|} | |j ||||| |fd d dSt |dd}| |||||dSdS) z Called whenever data is received. @type data: L{bytes} @param data: Part or all of a SOCKSv4 packet. N!BBHscS |dSN[rresultr r r r p z&SOCKSv4.dataReceived..) rr#r3structunpacksplitrresolve addCallback_dataReceived2 addErrbacksocket inet_ntoa) r r%completeBufferheadversioncoderuserserverdr r r r&Us*      zSOCKSv4.dataReceivedcCs|dks Jd||||||s|ddS|dkr/|||t|}||fddn|dkrE|d t||}||fd dntd ||j d ksZJd t |j dS)a4 The second half of the SOCKS connection setup. For a SOCKSv4 packet this is after the server address has been extracted from the header. For a SOCKSv4a packet this is after the host name has been resolved. @type server: L{str} @param server: The IP address of the destination, represented as a dotted quad. @type user: L{str} @param user: The username associated with the connection. @type version: L{int} @param version: The SOCKS protocol version number. @type code: L{int} @param code: The command code. 1 means establish a TCP/IP stream connection, and 2 means establish a TCP/IP port binding. @type port: L{int} @param port: The port number associated with the connection. r7zBad version code: %sr<Nr8cSr:r;r=r>r r r r@rAz(SOCKSv4._dataReceived2..rcSs|dd|d|dS)Nrrr8r=)xr r r r r@szBad Connect Code: r2z hmm, still stuff in buffer... %s) authorizer connectClassrrH listenClassSOCKSv4IncomingFactoryrF RuntimeErrorr3repr)r rPrOrMrNrrQr r r rGws  zSOCKSv4._dataReceived2cCs|jr |jjdSdSr)rrrrr r r rszSOCKSv4.connectionLostcCstd||||fdS)Nz0code %s connection to %s:%s (user %s) authorizedr8)rmsg)r rNrPrrOr r r rTs  zSOCKSv4.authorizecGstjt|g|R||Sr)r ClientCreatorr connectTCP)r rrklassargsr r r rUszSOCKSv4.connectClasscGs&t|||}t|ddS)Nr8)r listenTCPrsucceedgetHost)r rr]r^servr r r rVszSOCKSv4.listenClassr0.0.0.0cCs<|jtd|||t||dkr|jdSdS)Nr6r)rr#rBpackrI inet_atonr)r replyrMrrr r r rs zSOCKSv4.makeReplycCs||||j|dSr)rrr#r$r r r r#s z SOCKSv4.writec Cs |jsdS|j}|jj}t|jd}|dt|j|j ||kr&dp'd|j|j f|rz|dd|dd}}|t t dd|dd|dt |d d|D]}t t|d krm|d q]||q]|d |s1|d |dS) Naz%s %s:%d %s %s:%d <>cSs dt|S)Nz%02X)ord)rSr r r r@s zSOCKSv4.log.. . )r0rrropenr#timectimerrstringjoinmaplenrYclose)r protor%r their_peerfpcr r r rs8         z SOCKSv4.log)rrrc)r*r+r,__doc__rrrr&rGrrTrUrVrr#rr r r r r.9s"%  r.c@ eZdZdZddZddZdS)SOCKSv4Factoryz` A factory for a SOCKSv4 proxy. Constructor accepts one argument, a log file name. cCrr)r0)r rr r r rrzSOCKSv4Factory.__init__cCs t|jtSr)r.r0rr addrr r r buildProtocols zSOCKSv4Factory.buildProtocolNr*r+r,r}rrr r r r rs rc@r~)rWzJ A utility class for building protocols for incoming connections. cCr/r)r r)r r rr r r rr1zSOCKSv4IncomingFactory.__init__cCsR|d|jkrd|_|jddt|jS|jdkrdS|jddd|_dS)Nrrr<)rr rr-rr r r rs  z$SOCKSv4IncomingFactory.buildProtocolNrr r r r rWs rW)r}rIrsrBrqtwisted.internetrrrtwisted.pythonrProtocolrr-r.FactoryrrWr r r r s