Class Jabber::Bytestreams::SOCKS5BytestreamsServer
In: lib/xmpp4r/bytestreams/helper/socks5bytestreams/server.rb
Parent: Object
Message Presence XMPPStanza Iq Singleton IdGenerator XMPPElement X IqQuery Error Connection Client Component Client Comparable JID RuntimeError AuthenticationFailure ErrorException NoNameXmlnsRegistered SOCKS5Error REXML::Element Stream SOCKS5Bytestreams SOCKS5BytestreamsTarget SOCKS5BytestreamsInitiator XMPPElement StreamHost IqSiFileRange IqSiFile StreamHostUsed IqSi XRosterItem RosterItem IqFeature XMUCUserItem XMUCUserInvite IqPubSub Items Subscription IqPubSubOwner Item Event Feature Item Identity XDataField XDataReported XDataTitle XDataInstructions IqVcard SOCKS5BytestreamsServerStreamHost TCPSocket SOCKS5Socket IqQuery IqQueryBytestreams IqQueryVersion IqQueryRoster IqQueryMUCOwner IqQueryRPC IqQueryDiscoItems IqQueryDiscoInfo IBB IBBTarget IBBInitiator Responder SimpleResponder Iq IqCommand RosterXItem XRoster RosterX X XMUCUser XMUC XDelay XData XParent MUCClient SimpleMUCClient XMLRPC::ParserWriterChooseMixin Client Server XMLRPC::ParseContentType XMLRPC::BasicServer Base DigestMD5 Plain ServiceHelper NodeHelper FileSource CallbackList Callback Semaphore StreamParser SOCKS5BytestreamsPeer SOCKS5BytestreamsServer IBBQueueItem Responder Helper MUCBrowser NodeBrowser Helper Helper lib/xmpp4r/authenticationfailure.rb lib/xmpp4r/xmppstanza.rb lib/xmpp4r/callbacks.rb lib/xmpp4r/idgenerator.rb lib/xmpp4r/connection.rb lib/xmpp4r/iq.rb lib/xmpp4r/jid.rb lib/xmpp4r/errorexception.rb lib/xmpp4r/client.rb lib/xmpp4r/stream.rb lib/xmpp4r/semaphore.rb lib/xmpp4r/streamparser.rb lib/xmpp4r/x.rb lib/xmpp4r/error.rb lib/xmpp4r/component.rb lib/xmpp4r/query.rb lib/xmpp4r/xmppelement.rb lib/xmpp4r/message.rb lib/xmpp4r/presence.rb lib/xmpp4r/bytestreams/helper/ibb/initiator.rb lib/xmpp4r/bytestreams/iq/si.rb lib/xmpp4r/bytestreams/iq/bytestreams.rb lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb lib/xmpp4r/bytestreams/helper/socks5bytestreams/server.rb lib/xmpp4r/bytestreams/helper/socks5bytestreams/target.rb lib/xmpp4r/bytestreams/helper/socks5bytestreams/socks5.rb lib/xmpp4r/bytestreams/helper/socks5bytestreams/initiator.rb lib/xmpp4r/bytestreams/helper/ibb/base.rb lib/xmpp4r/bytestreams/helper/ibb/target.rb Bytestreams XParent lib/xmpp4r/version/iq/version.rb lib/xmpp4r/version/helper/responder.rb lib/xmpp4r/version/helper/simpleresponder.rb Version lib/xmpp4r/command/iq/command.rb lib/xmpp4r/command/helper/responder.rb Command lib/xmpp4r/roster/helper/roster.rb lib/xmpp4r/roster/iq/roster.rb lib/xmpp4r/roster/x/roster.rb Roster lib/xmpp4r/feature_negotiation/iq/feature.rb FeatureNegotiation lib/xmpp4r/muc/x/muc.rb lib/xmpp4r/muc/helper/mucclient.rb lib/xmpp4r/muc/x/mucuseritem.rb lib/xmpp4r/muc/helper/mucbrowser.rb lib/xmpp4r/muc/x/mucuserinvite.rb lib/xmpp4r/muc/iq/mucowner.rb lib/xmpp4r/muc/helper/simplemucclient.rb MUC lib/xmpp4r/rpc/helper/server.rb lib/xmpp4r/rpc/helper/client.rb lib/xmpp4r/rpc/iq/rpc.rb RPC lib/xmpp4r/sasl.rb SASL lib/xmpp4r/delay/x/delay.rb Delay lib/xmpp4r/pubsub/stanzas/subscription.rb lib/xmpp4r/pubsub/helper/servicehelper.rb lib/xmpp4r/pubsub/stanzas/item.rb lib/xmpp4r/pubsub/helper/nodehelper.rb lib/xmpp4r/pubsub/iq/pubsub.rb lib/xmpp4r/pubsub/stanzas/event.rb lib/xmpp4r/pubsub/helper/nodebrowser.rb lib/xmpp4r/pubsub/stanzas/items.rb PubSub lib/xmpp4r/httpbinding/client.rb HTTPBinding lib/xmpp4r/bytestreams/helper/filetransfer.rb TransferSource FileTransfer lib/xmpp4r/discovery/iq/discoinfo.rb lib/xmpp4r/discovery/iq/discoitems.rb Discovery lib/xmpp4r/dataforms/x/data.rb Dataforms lib/xmpp4r/vcard/helper/vcard.rb lib/xmpp4r/vcard/iq/vcard.rb Vcard Jabber dot/m_80_0.png

The SOCKS5BytestreamsServer is an implementation of a SOCKS5 server.

You can use it if you‘re reachable by your SOCKS5Bytestreams peers, thus avoiding use of an external proxy.

Usage:

Methods

Public Class methods

Start a local SOCKS5BytestreamsServer

Will start to listen on the given TCP port and accept new peers

port:[Fixnum] TCP port to listen on
listen_on:[String] Optional address for the server socket to listen on (i.e. ‘0.0.0.0’ or ’::’)

[Source]

    # File lib/xmpp4r/bytestreams/helper/socks5bytestreams/server.rb, line 27
27:       def initialize(port, listen_on=nil)
28:         @port = port
29:         @addresses = []
30:         @peers = []
31:         @peers_lock = Mutex.new
32:         if listen_on
33:           socket = TCPServer.new(listen_on, port)
34:         else
35:           socket = TCPServer.new(port)
36:         end
37: 
38:         Thread.new do
39:           Thread.current.abort_on_exception = true
40:           loop do
41:             peer = SOCKS5BytestreamsPeer.new(socket.accept)
42:             Thread.new do
43:               Thread.current.abort_on_exception = true
44:               begin
45:                 peer.start
46:               rescue
47:                 Jabber::debuglog("SOCKS5 BytestreamsServer: Error accepting peer: #{$!}")
48:               end
49:             end
50:             @peers_lock.synchronize do
51:               @peers << peer
52:             end
53:           end
54:         end
55:       end

Public Instance methods

Add an external IP address

This is a must-have, as SOCKS5BytestreamsInitiator must inform the target where to connect

[Source]

     # File lib/xmpp4r/bytestreams/helper/socks5bytestreams/server.rb, line 104
104:       def add_address(address)
105:         @addresses << address
106:       end

Iterate through all configured addresses, yielding SOCKS5BytestreamsServerStreamHost instances, which should be passed to SOCKS5BytestreamsInitiator#add_streamhost

This will be automatically invoked if you pass an instance of SOCKS5BytestreamsServer to SOCKS5BytestreamsInitiator#add_streamhost

my_jid:[JID] My Jabber-ID

[Source]

     # File lib/xmpp4r/bytestreams/helper/socks5bytestreams/server.rb, line 118
118:       def each_streamhost(my_jid, &block)
119:         @addresses.each { |address|
120:           yield SOCKS5BytestreamsServerStreamHost.new(self, my_jid, address, @port)
121:         }
122:       end

Find the socket a peer is associated to

This method also performs some housekeeping, ie. removing peers with closed sockets.

addr:[String] Address like SOCKS5Bytestreams#stream_address
result:[TCPSocker] or [nil]

[Source]

    # File lib/xmpp4r/bytestreams/helper/socks5bytestreams/server.rb, line 64
64:       def peer_sock(addr)
65:         res = nil
66:         @peers_lock.synchronize {
67:           removes = []
68: 
69:           @peers.each { |peer|
70:             if peer.socket and peer.socket.closed?
71:               # Queue peers with closed socket for removal
72:               removes << peer
73:             elsif peer.address == addr and res.nil?
74:               res = peer.socket
75:             end
76: 
77:             # If we sent multiple addresses of our own, clients may
78:             # connect multiple times. DO NOT close any other connections
79:             # here. These may belong to other concurrent bytestreams,
80:             # believe that the peer will close any unneeded sockets
81:             # which will then be picked up by the next call to peer_sock.
82:           }
83: 
84:           # If we sent multiple addresses of our own, clients may
85:           # connect multiple times. Close these connections here.
86:           @peers.delete_if { |peer|
87:             if removes.include? peer
88:               peer.socket.close rescue IOError
89:               true
90:             else
91:               false
92:             end
93:           }
94:         }
95: 
96:         res
97:       end

[Validate]