Esempio n. 1
0
    def custom_socket(socket_config):
        if socket_config.bind_family == 4:
            ip = ipaddress.ip_address('224.0.0.252')
            sock = setup_base_socket(
                socket_config,
                bind_ip_override=ipaddress.ip_address(
                    '0.0.0.0'
                )  #if socket_config.platform != ResponderPlatform.WINDOWS else None
            )
            sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 255)
            mreq = struct.pack("=4sl", ip.packed, socket.INADDR_ANY)
            sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)

        else:
            ip = ipaddress.ip_address('FF02:0:0:0:0:0:1:3')
            sock = setup_base_socket(
                socket_config,
                bind_ip_override=ipaddress.ip_address('::') if
                socket_config.platform != ResponderPlatform.WINDOWS else None)
            sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 255)
            sock.setsockopt(
                41 if socket_config.platform == ResponderPlatform.WINDOWS else
                socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP,
                struct.pack('16sI', ip.packed, socket_config.bind_iface_idx))

        return sock
Esempio n. 2
0
def echo_server(ip, port, protocol, is_ssl=None):
    server_socket = setup_base_socket(
        interfaces.get_socketconfig_from_ip('127.0.0.1', port, protocol))
    server_socket.setblocking(True)
    if protocol == socket.SOCK_STREAM:
        if is_ssl:
            context = ssl.SSLContext()
            context.verify_mode = ssl.CERT_NONE
            context.load_cert_chain(certfile='../testcert/responder3.crt',
                                    keyfile='../testcert/responder3.key')
            server_socket = context.wrap_socket(server_socket,
                                                server_side=True)

        server_socket.listen(5)
        while True:
            # accept connections from outside
            (clientsocket, address) = server_socket.accept()
            # now do something with the clientsocket
            # in this case, we'll pretend this is a threaded server
            data = clientsocket.recv(1024)
            print(data)
            clientsocket.sendall(data)
    else:
        while True:
            data, addr = server_socket.recvfrom(1024)
            print(data)
            server_socket.sendto(data, addr)
Esempio n. 3
0
 async def serve_forever(self):
     if self._socket is None:
         self._socket = setup_base_socket(self.listener_socket_config)
     while True:
         data, addr = await recvfrom(self._loop, self._socket, 65536)
         reader = UDPReader(data, addr)
         writer = UDPWriter(self._loop, self._socket, addr, self._laddr)
         await self._callback(reader, writer)
Esempio n. 4
0
	def create_server_coro(self, server_task_config):
		self.server_config = server_task_config

		if 'listener_socket_config' in server_task_config and server_task_config['listener_socket_config'] is not None:
			self.listener_socket_config = server_task_config['listener_socket_config']
		else:
			raise Exception('Server listener socket MUST be defined!')

		if 'settings' in server_task_config:
			self.server_handler_settings = copy.deepcopy(server_task_config['settings'])

		if 'handler' in server_task_config and server_task_config['handler'] is not None:
			server_module = Responder3ServerTask.import_template(
				server_task_config['handler'],
			)
			self.server_handler = getattr(server_module, server_task_config['handler'])
			self.server_handler_session = getattr(server_module, '%s%s' % (server_task_config['handler'], 'Session'))
			# global session object will be immediately instantiated, as it is global for ALL clients
			gs = getattr(server_module, '%s%s' % (server_task_config['handler'], 'GlobalSession'), None)
			if gs is not None:
				self.server_handler_global_session = gs(self.listener_socket_config, self.server_handler_settings, self.log_queue)
		else:
			raise Exception('Server Handler MUST be specified!')

		if 'bind_sslctx' in server_task_config:
			self.listener_socket_config.is_ssl_wrapped = True
			self.listener_socket_ssl_context = SSLContextBuilder.from_dict(server_task_config['bind_sslctx'], server_side=True)

		self.server_name = '%s-%s' % (self.server_handler.__name__, self.listener_socket_config.get_protocolname())
		if self.listener_socket_ssl_context is not None:
			self.server_name += '-SSL'

		self.server_coro = None

		if self.listener_socket_config.bind_protocol == socket.SOCK_STREAM:
			sock = None
			if getattr(self.server_handler, "custom_socket", None) is not None and callable(
					getattr(self.server_handler, "custom_socket", None)):
				sock = self.server_handler.custom_socket(self.listener_socket_config)
			else:
				sock = setup_base_socket(self.listener_socket_config)

			self.server_coro = asyncio.start_server(self.accept_client, sock=sock, ssl=self.listener_socket_ssl_context)

		elif self.listener_socket_config.bind_protocol == socket.SOCK_DGRAM:
			udpserver_obj = getattr(importlib.import_module('responder3.core.udpwrapper'), 'UDPServer')
			sock = None
			if getattr(self.server_handler, "custom_socket", None) is not None and callable(
					getattr(self.server_handler, "custom_socket", None)):
				sock = self.server_handler.custom_socket(self.listener_socket_config)

			udpserver = udpserver_obj(self.accept_client, self.listener_socket_config, sock=sock)
			self.server_coro = udpserver.run()

		else:
			raise Exception('Unknown protocol type!')

		return self.server_coro
Esempio n. 5
0
 def custom_socket(socket_config):
     if socket_config.bind_family == 6:
         raise Exception(
             'DHCP server should not be run on IPv6 (requires a different protocol)'
         )
     sock = setup_base_socket(
         socket_config, bind_ip_override=ipaddress.ip_address('0.0.0.0'))
     sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
     return sock
Esempio n. 6
0
 def custom_socket(socket_config):
     if socket_config.bind_family == 6:
         raise Exception(
             'DHCP server should not be run on IPv6 (requires a different protocol)'
         )
     sock = setup_base_socket(socket_config)
     sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
     sock.setsockopt(
         socket.SOL_SOCKET, socket.SO_REUSEADDR,
         0)  #important to turn off reuse address (at least on windows!!!)
     return sock
Esempio n. 7
0
	def setup(self):
		"""
		Upsets the server. :)
		Imports necessary modules, parses configuration dict, creates session obj...
		:return: None
		"""
		self.import_packages()
		self.server_properties = ServerProperties.from_dict(self.serverentry)
		self.loop    = asyncio.get_event_loop()
		self.clients = {}
		self.server  = self.server_properties.serverhandler
		self.session = self.server_properties.serversession
		self.globalsession = self.server_properties.serverglobalsession
		if self.server_properties.serverglobalsession is not None:
			self.globalsession = self.server_properties.serverglobalsession(self.server_properties)
		self.logQ    = self.server_properties.shared_logQ
		self.rdnsd   = self.server_properties.shared_rdns
		self.connectionFactory = ConnectionFactory(self.rdnsd)
		self.modulename = '%s-%s' % (self.server_properties.serverhandler.__name__, str(self.server_properties.listener_socket_config.get_print_address()))
		self.serverCoro = None
		self.server_stop_event = asyncio.Event()

		if self.server_properties.listener_socket_config.bind_protocol == socket.SOCK_STREAM:
			sock = None
			if getattr(self.server_properties.serverhandler, "custom_socket", None) is not None and callable(getattr(self.server_properties.serverhandler, "custom_socket", None)):
				sock = self.server_properties.serverhandler.custom_socket(self.server_properties.listener_socket_config)
			else:
				sock = setup_base_socket(self.server_properties.listener_socket_config)
			
			self.serverCoro = asyncio.start_server(self.accept_client, sock = sock, ssl=self.server_properties.sslcontext)
		
		elif self.server_properties.listener_socket_config.bind_protocol == socket.SOCK_DGRAM:
			sock = None
			if getattr(self.server_properties.serverhandler, "custom_socket", None) is not None and callable(getattr(self.server_properties.serverhandler, "custom_socket", None)):
				sock = self.server_properties.serverhandler.custom_socket(self.server_properties.listener_socket_config)
			
			udpserver = self.udpserver(self.accept_client, self.server_properties, sock = sock)
			self.serverCoro = udpserver.run()

		else:
			raise Exception('Unknown protocol type!')
Esempio n. 8
0
	def create_listener_socket_config(self):
		try:
			self.listener_socket_config = setup_base_socket(self.server_props)
			#self.listener_socket_config.listen(500)
		except Exception as e:
			raise e
Esempio n. 9
0
 def custom_socket(server_properties):
     sock = setup_base_socket(
         server_properties,
         bind_ip_override=ipaddress.ip_address('0.0.0.0'))
     sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
     return sock