def launch_transport_listener(transport, bindaddr, role, remote_addrport, pt_config, ext_or_cookie_file=None): """ Launch a listener for 'transport' in role 'role' (socks/client/server/ext_server). If 'bindaddr' is set, then listen on bindaddr. Otherwise, listen on an ephemeral port on localhost. 'remote_addrport' is the TCP/IP address of the other end of the circuit. It's not used if we are in 'socks' role. 'pt_config' contains configuration options (such as the state location) which are of interest to the pluggable transport. 'ext_or_cookie_file' is the filesystem path where the Extended ORPort Authentication cookie is stored. It's only used in 'ext_server' mode. Return a tuple (addr, port) representing where we managed to bind. Throws obfsproxy.transports.transports.TransportNotFound if the transport could not be found. Throws twisted.internet.error.CannotListenError if the listener could not be set up. """ transport_class = transports.get_transport_class(transport, role) listen_host = bindaddr[0] if bindaddr else 'localhost' listen_port = int(bindaddr[1]) if bindaddr else 0 if role == 'socks': factory = socks.OBFSSOCKSv5Factory(transport_class, pt_config) elif role == 'ext_server': assert (remote_addrport and ext_or_cookie_file) factory = extended_orport.ExtORPortServerFactory( remote_addrport, ext_or_cookie_file, transport, transport_class, pt_config) else: assert (remote_addrport) factory = network.StaticDestinationServerFactory( remote_addrport, role, transport_class, pt_config) addrport = reactor.listenTCP(listen_port, factory, interface=listen_host) return (addrport.getHost().host, addrport.getHost().port)
def _configure_transport_class(self, mode, pt_config): """Use the global arguments to configure the trasnport.""" transport_args = [mode, ADDR, "--dest=%s" % ADDR] + self.args sys.argv = [sys.argv[0], "--log-file", join(const.TEMP_DIR, "%s.log" % mode), "--log-min-severity", "debug"] sys.argv.append("wfpad") # use wfpad transport sys.argv += transport_args parser = set_up_cli_parsing() consider_cli_args(parser.parse_args()) transport_class = get_transport_class(self.transport, mode) transport_class.setup(pt_config) p = ArgumentParser() transport_class.register_external_mode_cli(p) args = p.parse_args(transport_args) transport_class.validate_external_mode_cli(args) return transport_class
def _configure_transport_class(self, mode, pt_config): """Use the global arguments to configure the trasnport.""" transport_args = [mode, ADDR, "--dest=%s" % ADDR] + self.args sys.argv = [ sys.argv[0], "--log-file", join(const.TEMP_DIR, "%s.log" % mode), "--log-min-severity", "debug" ] sys.argv.append("wfpad") # use wfpad transport sys.argv += transport_args parser = set_up_cli_parsing() consider_cli_args(parser.parse_args()) transport_class = get_transport_class(self.transport, mode) transport_class.setup(pt_config) p = ArgumentParser() transport_class.register_external_mode_cli(p) args = p.parse_args(transport_args) transport_class.validate_external_mode_cli(args) return transport_class
def launch_transport_listener(transport, bindaddr, role, remote_addrport, pt_config, ext_or_cookie_file=None): """ Launch a listener for 'transport' in role 'role' (socks/client/server/ext_server). If 'bindaddr' is set, then listen on bindaddr. Otherwise, listen on an ephemeral port on localhost. 'remote_addrport' is the TCP/IP address of the other end of the circuit. It's not used if we are in 'socks' role. 'pt_config' contains configuration options (such as the state location) which are of interest to the pluggable transport. 'ext_or_cookie_file' is the filesystem path where the Extended ORPort Authentication cookie is stored. It's only used in 'ext_server' mode. Return a tuple (addr, port) representing where we managed to bind. Throws obfsproxy.transports.transports.TransportNotFound if the transport could not be found. Throws twisted.internet.error.CannotListenError if the listener could not be set up. """ transport_class = transports.get_transport_class(transport, role) listen_host = bindaddr[0] if bindaddr else 'localhost' listen_port = int(bindaddr[1]) if bindaddr else 0 if role == 'socks': factory = socks.SOCKSv4Factory(transport_class, pt_config) elif role == 'ext_server': assert(remote_addrport and ext_or_cookie_file) factory = extended_orport.ExtORPortServerFactory(remote_addrport, ext_or_cookie_file, transport, transport_class, pt_config) else: assert(remote_addrport) factory = network.StaticDestinationServerFactory(remote_addrport, role, transport_class, pt_config) addrport = reactor.listenTCP(listen_port, factory, interface=listen_host) return (addrport.getHost().host, addrport.getHost().port)
# Will hold configuration parameters for the pluggable transport module. pt_config = transport_config.TransportConfig() pt_config.setStateLocation(ptserver.config.getStateLocation()) if ext_orport: pt_config.setListenerMode("ext_server") else: pt_config.setListenerMode("server") pt_config.setObfsproxyMode("managed") transport_options = "" if server_transport_options and transport in server_transport_options: transport_options = server_transport_options[transport] pt_config.setServerTransportOptions(transport_options) # Call setup() method for this tranpsort. transport_class = transports.get_transport_class(transport, 'server') try: transport_class.setup(pt_config) except base.TransportSetupFailed, err: log.warning("Transport '%s' failed during setup()." % transport) ptserver.reportMethodError(transport, "setup() failed: %s." % (err)) continue try: if ext_orport: addrport = launch_transport.launch_transport_listener( transport, transport_bindaddr, 'ext_server', ext_orport,
ptclient.reportProxyError(str(err)) return ptclient.reportProxySuccess() for transport in ptclient.getTransports(): # Will hold configuration parameters for the pluggable transport module. pt_config = transport_config.TransportConfig() pt_config.setStateLocation(ptclient.config.getStateLocation()) pt_config.setListenerMode("socks") pt_config.setObfsproxyMode("managed") pt_config.setProxy(proxy) # Call setup() method for this transport. transport_class = transports.get_transport_class(transport, 'socks') transport_class.setup(pt_config) try: addrport = launch_transport.launch_transport_listener( transport, None, 'socks', None, pt_config) except transports.TransportNotFound: log.warning("Could not find transport '%s'" % transport) ptclient.reportMethodError(transport, "Could not find transport.") continue except error.CannotListenError, e: error_msg = "Could not set up listener (%s:%s) for '%s' (%s)." % \ (e.interface, e.port, transport, e.socketError[1]) log.warning(error_msg) ptclient.reportMethodError(transport, error_msg) continue
except EnvError, err: log.warning("Client managed-proxy protocol failed (%s)." % err) return log.debug("pyptlib gave us the following data:\n'%s'", pprint.pformat(ptclient.getDebugData())) for transport in ptclient.getTransports(): # Will hold configuration parameters for the pluggable transport module. pt_config = transport_config.TransportConfig() pt_config.setStateLocation(ptclient.config.getStateLocation()) pt_config.setListenerMode("socks") pt_config.setObfsproxyMode("managed") # Call setup() method for this transport. transport_class = transports.get_transport_class(transport, 'socks') transport_class.setup(pt_config) try: addrport = launch_transport.launch_transport_listener(transport, None, 'socks', None, pt_config) except transports.TransportNotFound: log.warning("Could not find transport '%s'" % transport) ptclient.reportMethodError(transport, "Could not find transport.") continue except error.CannotListenError, e: error_msg = "Could not set up listener (%s:%s) for '%s' (%s)." % \ (e.interface, e.port, transport, e.socketError[1]) log.warning(error_msg) ptclient.reportMethodError(transport, error_msg) continue
# Will hold configuration parameters for the pluggable transport module. pt_config = transport_config.TransportConfig() pt_config.setStateLocation(ptserver.config.getStateLocation()) if ext_orport: pt_config.setListenerMode("ext_server") else: pt_config.setListenerMode("server") pt_config.setObfsproxyMode("managed") transport_options = "" if server_transport_options and transport in server_transport_options: transport_options = server_transport_options[transport] pt_config.setServerTransportOptions(transport_options) # Call setup() method for this tranpsort. transport_class = transports.get_transport_class(transport, 'server') transport_class.setup(pt_config) try: if ext_orport: addrport = launch_transport.launch_transport_listener(transport, transport_bindaddr, 'ext_server', ext_orport, pt_config, ext_or_cookie_file=authcookie) else: addrport = launch_transport.launch_transport_listener(transport, transport_bindaddr, 'server', orport,
ptclient.reportProxyError(str(err)) return ptclient.reportProxySuccess() for transport in ptclient.getTransports(): # Will hold configuration parameters for the pluggable transport module. pt_config = transport_config.TransportConfig() pt_config.setStateLocation(ptclient.config.getStateLocation()) pt_config.setListenerMode("socks") pt_config.setObfsproxyMode("managed") pt_config.setProxy(proxy) # Call setup() method for this transport. transport_class = transports.get_transport_class(transport, "socks") transport_class.setup(pt_config) try: addrport = launch_transport.launch_transport_listener(transport, None, "socks", None, pt_config) except transports.TransportNotFound: log.warning("Could not find transport '%s'" % transport) ptclient.reportMethodError(transport, "Could not find transport.") continue except error.CannotListenError, e: error_msg = "Could not set up listener (%s:%s) for '%s' (%s)." % ( e.interface, e.port, transport, e.socketError[1], )
def do_managed_server(): """Start the managed-proxy protocol as a server.""" should_start_event_loop = False ptserver = ServerTransportPlugin() try: ptserver.init(transports.transports.keys()) except EnvError as err: log.warning("Server managed-proxy protocol failed (%s)." % err) return log.debug("pyptlib gave us the following data:\n'%s'", pprint.pformat(ptserver.getDebugData())) ext_orport = ptserver.config.getExtendedORPort() authcookie = ptserver.config.getAuthCookieFile() orport = ptserver.config.getORPort() server_transport_options = ptserver.config.getServerTransportOptions() for transport, transport_bindaddr in ptserver.getBindAddresses().items(): # Will hold configuration parameters for the pluggable transport module. pt_config = transport_config.TransportConfig() pt_config.setStateLocation(ptserver.config.getStateLocation()) if ext_orport: pt_config.setListenerMode("ext_server") else: pt_config.setListenerMode("server") pt_config.setObfsproxyMode("managed") transport_options = "" if server_transport_options and transport in server_transport_options: transport_options = server_transport_options[transport] pt_config.setServerTransportOptions(transport_options) # Call setup() method for this tranpsort. transport_class = transports.get_transport_class(transport, 'server') try: transport_class.setup(pt_config) except base.TransportSetupFailed as err: log.warning("Transport '%s' failed during setup()." % transport) ptserver.reportMethodError(transport, "setup() failed: %s." % (err)) continue try: if ext_orport: addrport = launch_transport.launch_transport_listener( transport, transport_bindaddr, 'ext_server', ext_orport, pt_config, ext_or_cookie_file=authcookie) else: addrport = launch_transport.launch_transport_listener( transport, transport_bindaddr, 'server', orport, pt_config) except transports.TransportNotFound: log.warning("Could not find transport '%s'" % transport) ptserver.reportMethodError(transport, "Could not find transport.") continue except error.CannotListenError as e: error_msg = "Could not set up listener (%s:%s) for '%s' (%s)." % \ (e.interface, e.port, transport, e.socketError[1]) log.warning(error_msg) ptserver.reportMethodError(transport, error_msg) continue should_start_event_loop = True extra_log = "" # Include server transport options in the log message if we got 'em if transport_options: extra_log = " (server transport options: '%s')" % str( transport_options) log.debug("Successfully launched '%s' at '%s'%s" % (transport, log.safe_addr_str(str(addrport)), extra_log)) # Invoke the transport-specific get_public_server_options() # method to potentially filter the server transport options # that should be passed on to Tor and eventually to BridgeDB. public_options_dict = transport_class.get_public_server_options( transport_options) public_options_str = None # If the transport filtered its options: if public_options_dict: optlist = [] for k, v in public_options_dict.items(): optlist.append("%s=%s" % (k, v)) public_options_str = ",".join(optlist) log.debug( "do_managed_server: sending only public_options to tor: %s" % public_options_str) # Report success for this transport. # If public_options_str is None then all of the # transport options from ptserver are used instead. ptserver.reportMethodSuccess(transport, addrport, public_options_str) ptserver.reportMethodsEnd() if should_start_event_loop: log.info("Starting up the event loop.") reactor.run() else: log.info("No transports launched. Nothing to do.")
def do_managed_client(): """Start the managed-proxy protocol as a client.""" should_start_event_loop = False ptclient = ClientTransportPlugin() try: ptclient.init(transports.transports.keys()) except EnvError as err: log.warning("Client managed-proxy protocol failed (%s)." % err) return log.debug("pyptlib gave us the following data:\n'%s'", pprint.pformat(ptclient.getDebugData())) # Apply the proxy settings if any proxy = ptclient.config.getProxy() if proxy: # Make sure that we have all the necessary dependencies try: network.ensure_outgoing_proxy_dependencies() except network.OutgoingProxyDepsFailure as err: ptclient.reportProxyError(str(err)) return ptclient.reportProxySuccess() for transport in ptclient.getTransports(): # Will hold configuration parameters for the pluggable transport module. pt_config = transport_config.TransportConfig() pt_config.setStateLocation(ptclient.config.getStateLocation()) pt_config.setListenerMode("socks") pt_config.setObfsproxyMode("managed") pt_config.setProxy(proxy) # Call setup() method for this transport. transport_class = transports.get_transport_class(transport, 'socks') try: transport_class.setup(pt_config) except base.TransportSetupFailed as err: log.warning("Transport '%s' failed during setup()." % transport) ptclient.reportMethodError(transport, "setup() failed: %s." % (err)) continue try: addrport = launch_transport.launch_transport_listener(transport, None, 'socks', None, pt_config) except transports.TransportNotFound: log.warning("Could not find transport '%s'" % transport) ptclient.reportMethodError(transport, "Could not find transport.") continue except error.CannotListenError as e: error_msg = "Could not set up listener (%s:%s) for '%s' (%s)." % \ (e.interface, e.port, transport, e.socketError[1]) log.warning(error_msg) ptclient.reportMethodError(transport, error_msg) continue should_start_event_loop = True log.debug("Successfully launched '%s' at '%s'" % (transport, log.safe_addr_str(str(addrport)))) ptclient.reportMethodSuccess(transport, "socks5", addrport, None, None) ptclient.reportMethodsEnd() if should_start_event_loop: log.info("Starting up the event loop.") reactor.run() else: log.info("No transports launched. Nothing to do.")