Exemplo n.º 1
0
def forward_tcp_to_tcp(source: socket.socket, destination: socket.socket):
    try:
        log.debug("Ongoing connection route: %s ---> %s ---> %s" %
                  (source.getpeername(), source.getsockname(),
                   destination.getpeername()))
    except:
        # Do nothing
        log.debug("Socket closed maybe??")
    message = ' '
    while message:
        message = source.recv(tcp_bufsize)
        if message:
            destination.sendall(message)
        else:
            try:
                source.shutdown(socket.SHUT_RD)
            except:
                # traceback.print_exc()
                pass  # Do nothing then
            try:
                destination.shutdown(socket.SHUT_WR)
            except:
                # traceback.print_exc()
                pass  # Do nothing then
            break
Exemplo n.º 2
0
    async def handle(self, client: socket.socket) -> None:
        """Handle a single client socket from the server."""
        start_time = time.time_ns()

        # Read & parse connection.
        await (conn := Connection(client)).read()

        if 'Host' not in conn.headers:
            log('Connection missing Host header.', Ansi.LRED)
            client.shutdown(socket.SHUT_RDWR)
            client.close()
            return

        # Dispatch the handler.
        code = await self.dispatch(conn)

        if self.debug:
            # Event complete, stop timing, log result and cleanup.
            time_taken = (time.time_ns() - start_time) / 1e6

            col = (Ansi.LGREEN if 200 <= code < 300 else
                   Ansi.LYELLOW if 300 <= code < 400 else Ansi.LRED)

            uri = f'{conn.headers["Host"]}{conn.path}'

            log(f'[{conn.cmd}] {code} {uri}', col, end=' | ')
            printc(f'Elapsed: {time_taken:.2f}ms', Ansi.LBLUE)

        try:
            client.shutdown(socket.SHUT_RDWR)
            client.close()
        except socket.error:
            pass
Exemplo n.º 3
0
def listen_udp_forward_tcp_to_udp(tcp_client_socket: socket.socket,
                                  udp_listening_socket: socket.socket,
                                  udp_client: tuple):
    log.debug("Listening UDP: Forwarding TCP to UDP")
    server_msg = ' '
    while server_msg:
        try:
            server_msg = tcp_client_socket.recv(tcp_bufsize)
            if server_msg:
                udp_listening_socket.sendto(server_msg, udp_client)
            else:
                try:
                    tcp_client_socket.shutdown(socket.SHUT_RD)
                except:
                    pass
                try:
                    del udp_over_tcp[udp_client]
                except:
                    pass
        except:
            traceback.print_exc()
            try:
                tcp_client_socket.close()
            except:
                pass
            try:
                del udp_over_tcp[udp_client]
            except:
                pass
            break
Exemplo n.º 4
0
    async def handle(self, client: socket.socket) -> None:
        """Handle a single client socket from the server."""
        start_time = time.time_ns()

        # Read & parse connection.
        await (conn := Connection(client)).read()

        if 'Host' not in conn.headers:
            # This should never happen?
            client.shutdown(socket.SHUT_RDWR)
            client.close()
            return

        # Dispatch the handler.
        code = await self.dispatch(conn)

        # Event complete, stop timing, log result and cleanup.
        time_taken = (time.time_ns() - start_time) / 1e6

        colour = (Ansi.LGREEN if 200 <= code < 300 else
                  Ansi.LYELLOW if 300 <= code < 400 else Ansi.LRED)

        uri = f'{conn.headers["Host"]}{conn.path}'

        log(f'[{conn.cmd}] {code} {uri}', colour)

        if self.verbose:
            log(f'Request took {time_taken:.2f}ms', Ansi.LBLUE)

        client.shutdown(socket.SHUT_RDWR)
        client.close()
Exemplo n.º 5
0
    def handle(self, conn: socket.socket):
        try:
            in_ = conn.makefile('r')
            out = conn.makefile('w')

            # we must read in the full header even if we dont
            # intend to use it...
            header = []
            line = " "
            while line not in ['\n', '\r\n', '']:
                line = in_.readline()
                header.append(line)

            print(
f"""HTTP/1.1 201
Content-Type: text/plain; charset=UTF-8
Server-name: CPO debugger

CPO State {datetime.datetime.now()}
""", file=out)
            self.show_cso_state(file=out)

            out.flush()
            out.close()
            conn.shutdown(0)
            conn.close()
        finally:
            if conn is not None:
                conn.close()
Exemplo n.º 6
0
def shutdown_socket(to_shutdown: socket.socket):
    try:
        #log.info("Shutting down socket")
        to_shutdown.shutdown(SHUT_RD)
        #log.info("Shutdown socket successfully")
    except:
        pass
Exemplo n.º 7
0
def channel_thread(channel: socket.socket):
    host, port = channel.getpeername()[0:2]

    while True:
        size_buffer = channel.recv(1)
        if len(size_buffer) == 0:
            break
        size = size_buffer[0]
        print('(pending: {})'.format(size))

        if size == 0:
            print('Closing connection to [{}]:{}'.format(host, port))
            break

        buffer = bytes()
        while len(buffer) < size:
            buffer_size = min([size - len(buffer), 64])
            buffer = buffer + channel.recv(buffer_size)

        print('Received message from [{}]:{}.'.format(host, port))
        print(buffer.decode('utf-8'))

        channel.send(bytes([
            size,
        ]))
        channel.send(buffer)

    send_john_cena(channel)
    channel.shutdown(socket.SHUT_WR)
    channel.close()
def transfer(src: socket.socket, dst: socket.socket, send: bool) -> None:
    """
    Send data received on the source socket to the destination socket.
    """
    src_addr, src_port = src.getsockname()
    dst_addr, dst_port = dst.getsockname()
    while True:
        try:
            buffer = src.recv(0x400)
        except socket.error:
            break
        if len(buffer) == 0:
            logging.debug("[-] No data received! Breaking...")
            break
        try:
            dst.send(buffer)
        except socket.error:
            break
    logging.debug(f"[+] Closing connections! [{src_addr}:{src_port}]")
    try:
        src.shutdown(socket.SHUT_RDWR)
        src.close()
    except socket.error:
        pass
    logging.debug(f"[+] Closing connections! [{dst_addr}:{dst_port}]")
    try:
        dst.shutdown(socket.SHUT_RDWR)
        dst.close()
    except socket.error:
        pass
Exemplo n.º 9
0
def send_and_wait_file(client_socket: socket.socket):
    transfer_mode_bytes = struct.pack('i', SEND_AND_WAIT_MODE)
    print(
        "send to server tranfer_mode -->send_and_wait (0 --> stream; 1--> send_and_wait)"
    )
    client_socket.send(transfer_mode_bytes)

    file_name = os.path.basename(file_path)
    file_name_size_bytes = struct.pack('i', len(file_name))
    client_socket.send(file_name_size_bytes)
    client_socket.send(file_name.encode('utf-8'))

    total_bytes_sent = 0
    total_messages_sent = 0
    start_time = ctime_millis()

    file_size = os.path.getsize(file_path)
    try:
        f = open(file_path, 'rb')
        while file_size > 0:
            if BLOCK_SIZE < file_size:
                sent_size = BLOCK_SIZE
            else:
                sent_size = file_size
            message = f.read(sent_size)
            client_socket.send(message)

            while True:
                #     waiting for ack from server
                try:
                    # unsigmned long long is on 8 bytes Q
                    ACK = client_socket.recv(8)
                    ACK = struct.unpack('Q', ACK)[0]
                    print("ACK is: {}".format(ACK))
                except Exception as e:
                    print(e)
                    #         ACK is lost
                    client_socket.send(message)
                else:
                    break

            file_size -= sent_size

            total_bytes_sent += sent_size
            total_messages_sent += 1

    except:
        pass

    print("Done sending file {} ".format(file_path))
    client_socket.shutdown(socket.SHUT_RDWR)
    client_socket.close()

    end_time = ctime_millis()
    time_diff = end_time - start_time

    print("File was sent in:              {}".format(nice_time(time_diff)))
    print("Total number of messages sent: {}".format(total_messages_sent))
    print("Total number of bytes sent:    {}".format(total_bytes_sent))
Exemplo n.º 10
0
 def _close_socket_on_stop(self, sock: socket.socket) -> None:
     # This function runs in the background waiting for the `stop` Event to
     # be set at which point it closes the socket, causing the server to
     # shutdown.  This allows the server threads to be cleanly closed on
     # demand.
     self.wait_stopped()
     sock.shutdown(socket.SHUT_RD)
     sock.close()
Exemplo n.º 11
0
 def serve_client(self, client_sock: socket.socket):
     client_sock.settimeout(TIMEOUT)
     while True:
         data = client_sock.recv(1024)
         if data == b"":
             client_sock.shutdown(1)
             client_sock.close()
             break
         if data:
             client_sock.sendall(data)
Exemplo n.º 12
0
def _command_quit(sock: socket.socket, msg: str, socket_id):
    global sockets, msg_buffer
    log('debug', f'Closed connection {socket_id} by request.')
    sock.shutdown(socket.SHUT_RDWR)
    sock.close()
    if socket_id in sockets:
        del sockets[socket_id]
    if socket_id in msg_buffer:
        del msg_buffer[socket_id]
    return None
Exemplo n.º 13
0
def sync_send_response(conn: socket.socket, response: Dict[Any, Any]) -> None:
    """
    Syncronous version of send_response, using old style sockets

    :param conn: socket.accept() connection
    :param reponse: Dict[Any, Any] response
    :return: None
    """
    conn.send(bencode.encode(response))
    conn.shutdown(SHUT_WR)
Exemplo n.º 14
0
def talks(talks_socket: socket.socket):
    c = ''
    while c != b'\n':
        c = talks_socket.recv(1024)
        if c.decode() == '':
            talks_socket.shutdown(socket.SHUT_RDWR)
            talks_socket.close()
            delete_client(talks_socket, client_list)
            print('connection closed.')
            return
        for client in client_list:
            client.send(c)
Exemplo n.º 15
0
def execute(client_socket: socket.socket):
    client_socket.settimeout(100.0)
    while True:
        try:
            command = client_socket.recv(100)
            result = subprocess.run(command,
                                    capture_output=True,
                                    encoding="UTF-8")
        except socket.timeout:
            break
        response = f"=== Execution Result: {str(result.returncode)} ===\n{result.stdout}=== Execution End ==="
        client_socket.send(bytes(response, "UTF-8"))
    client_socket.shutdown(socket.SHUT_RDWR)
Exemplo n.º 16
0
 def handlefile(self, conn: socket.socket, fname: str, mode: Action):
     if mode == Action.POST:
         with open(fname, 'rb') as f:
             conn.sendfile(f)
             conn.shutdown(socket.SHUT_RD)
     elif mode == Action.GET:
         logging.info(f"Receiving data from {conn.getsockname()}")
         with open(fname, 'wb') as f:
             while True:
                 data = conn.recv(Packet.BUFFER)
                 f.write(data)
                 if data == b'':
                     break
Exemplo n.º 17
0
def run_client(client: socket):
    client.setblocking(False)
    while True:
        r, w, x = select([client], [], [], 0.1)
        if client not in r:
            continue
        print('received data')
        data = client.recv(0x1000)
        if not data:
            break
        client.send(data)
    client.shutdown(SHUT_WR)
    client.close()
Exemplo n.º 18
0
 def __init__(self):
     # Set up the interrupt socket
     interrupt_server = Socket()
     interrupt_server.bind(("localhost", 0))
     interrupt_server.listen(1)
     self.interrupt_writer = Socket()
     self.interrupt_writer.setblocking(False)
     self.interrupt_writer.connect("localhost", interrupt_server.getsockname()[1])
     self.interrupt_reader = interrupt_server.accept()
     interrupt_server.shutdown(SHUT_RDWR)
     interrupt_server.close()
     self.interrupt_reader.setblocking(False)
     self.interrupt_writer.setblocking(False)
Exemplo n.º 19
0
def forward(dst: socket.socket, src: socket.socket) -> None:
    while True:
        data = src.recv(64 * 1024)
        if data:
            dst.sendall(data)
        else:
            try:
                # Close destination first as origin is likely already closed
                dst.shutdown(socket.SHUT_WR)
                src.shutdown(socket.SHUT_RD)
            except OSError:
                pass
            return
Exemplo n.º 20
0
def _send(s: socket.socket, message: str):
    signed = _pgp.sign(message, passphrase='1234567890', clearsign=True)

    if signed.data:
        s.sendall(
            struct.pack('>I', 4) + struct.pack('>I', len(signed.data)) +
            signed.data)
    else:
        log.error(signed.status)
        s.shutdown(socket.SHUT_RDWR)
        s.close()
        pass
    return
Exemplo n.º 21
0
 def _close_connection(self, connection: socket.socket) -> None:
     """Close a socket and make sure it is closed."""
     # pylint: disable=no-self-use
     if connection.fileno() >= 0:
         # Only call shutdown active sockets
         try:
             connection.shutdown(socket.SHUT_RDWR)
         except OSError as e:
             if e.errno == 107:  # Transport endpoint is not connected
                 # nothingtodohere.png
                 pass
             else:
                 raise e
     connection.close()
     return
Exemplo n.º 22
0
    def _close_socket_on_stop(self, sock: socket.socket) -> None:
        # This function runs in the background waiting for the `stop` Event to
        # be set at which point it closes the socket, causing the server to
        # shutdown.  This allows the server threads to be cleanly closed on
        # demand.
        self.wait_stopped()

        try:
            sock.shutdown(socket.SHUT_RD)
        except OSError as e:
            # on mac OS this can result in the following error:
            # OSError: [Errno 57] Socket is not connected
            if e.errno != errno.ENOTCONN:
                raise

        sock.close()
Exemplo n.º 23
0
 def conn_handler(self, conn: socket.socket, addr: "tuple(str, int)"):
     while True:
         try:
             rl, wl, _ = select.select([
                 conn,
             ], [
                 conn,
             ], [], 5)
             if conn in rl:
                 data = conn.recv(self.bufsize)
                 if data == b'':
                     continue
                 conn.send('ACK\n')
         except select.error:
             conn.shutdown(socket.SHUT_RDWR)
             conn.close()
Exemplo n.º 24
0
def handle_request(connection: socket.socket, address, logger, root_dir):
    logger.debug("Connected at %r", address)
    try:
        req = models.Request(connection.recv(1024))
    except IndexError:
        connection.send(b'Non HTTP protocol used')
        connection.close()
        logger.debug("Connection closed")
        return

    is_dir = False
    path = root_dir + urllib.parse.unquote(urllib.parse.urlparse(req.URL).path)
    if path[-1] == '/':
        is_dir = True
        path += 'index.html'

    resp_code = 200
    if not os.path.exists(path):
        if is_dir:
            resp_code = 403
        else:
            resp_code = 404
    if path.find('../') != -1:
        resp_code = 403
    resp: models.Response
    if resp_code == 200 and req.Method in methods:
        size = os.path.getsize(path)
        resp = models.Response(req.Protocol, req.Method, resp_code,
                               mimetypes.guess_type(path)[0], size)
    else:
        resp = models.Response(req.Protocol, req.Method, resp_code)

    logger.debug(resp_code)

    connection.sendall(resp.get_raw_headers())
    if req.Method == 'GET' and resp_code == 200:
        file = open(path, 'rb')

        connection.sendfile(file, 0)
        file.close()
        connection.shutdown(socket.SHUT_RDWR)

    connection.shutdown(socket.SHUT_RDWR)

    logger.debug("Connection closed")
Exemplo n.º 25
0
def stream_file(client_socket: socket.socket, file_path: str):
    transfer_mode_bytes = struct.pack('i', STREAMING_MODE)
    print(
        "send to server tranfer_mode --> stream (0 --> stream; 1--> send_and_wait)"
    )
    client_socket.send(transfer_mode_bytes)

    file_name = os.path.basename(file_path)
    file_name_size_bytes = struct.pack('i', len(file_name))
    client_socket.send(file_name_size_bytes)
    client_socket.send(file_name.encode('utf-8'))

    total_bytes_sent = 0
    total_messages_sent = 0
    start_time = ctime_millis()

    file_size = os.path.getsize(file_path)
    try:
        f = open(file_path, 'rb')
        while file_size > 0:
            if BLOCK_SIZE < file_size:
                sent_size = BLOCK_SIZE
            else:
                sent_size = file_size
            message = f.read(sent_size)
            client_socket.send(message)
            file_size -= sent_size

            total_bytes_sent += sent_size
            total_messages_sent += 1

    except:
        pass

    print("Done sending file {} ".format(file_path))
    client_socket.shutdown(socket.SHUT_RDWR)
    client_socket.close()

    end_time = ctime_millis()
    time_diff = end_time - start_time

    print("File was sent in:              {}".format(nice_time(time_diff)))
    print("Total number of messages sent: {}".format(total_messages_sent))
    print("Total number of bytes sent:    {}".format(total_bytes_sent))
Exemplo n.º 26
0
def stream_send_file(sock: socket.socket, message_block: int, file_size: int):
    messages_sent = 0
    bytes_sent = 0
    start_transmission = time.time()

    print("Stream a file of size:{}".format(file_size))
    print("Message block:{}".format(message_block))

    with open(FIVE_HUNDRED_MB_FILE_LOCATION, mode="rb") as file_object:
        while True:
            message = file_object.read(message_block)
            if len(message) == 0:
                break

            sock.send(message)
            file_size -= len(message)
            print("Remains {} bytes to transfer".format(file_size))
            messages_sent += 1
            bytes_sent += len(message)

    # while file_size > 0:
    #     if message_block < file_size:
    #         size = message_block
    #     else:
    #         size = file_size
    #
    #     message = generate_message_block(size).encode("utf-8")
    #     # print(message)
    #     sock.send(message)
    #     file_size -= size
    #
    #     print("Remains {} bytes to transfer".format(file_size))
    #     messages_sent += 1
    #     bytes_sent += size
    #     # time.sleep(1)

    print("File was sent")
    sock.shutdown(socket.SHUT_RDWR)
    sock.close()

    transmission_duration = time.time() - start_transmission
    print("Transmission duration: {}".format(transmission_duration))
    print("Number of sent messages: {}".format(messages_sent))
    print("Number of sent bytes: {}".format(bytes_sent))
Exemplo n.º 27
0
    async def handle(self, client: socket.socket) -> None:
        """Handle a single client socket from the server."""
        if self.debug:
            t1 = clock_ns()

        # read & parse connection
        conn = Connection(client)
        await conn.parse()

        if self.debug:
            t2 = clock_ns()

        if 'Host' not in conn.headers:
            log('Connection missing Host header.', Ansi.LRED)
            client.shutdown(socket.SHUT_RDWR)
            client.close()
            return

        # dispatch the connection
        # to the appropriate handler
        code = await self.dispatch(conn)

        if self.debug:
            # event complete, stop timing, log result and cleanup
            t3 = clock_ns()

            t2_t1 = magnitude_fmt_time(t2 - t1)
            t3_t2 = magnitude_fmt_time(t3 - t2)

            col = (Ansi.LGREEN  if 200 <= code < 300 else
                   Ansi.LYELLOW if 300 <= code < 400 else
                   Ansi.LRED)

            uri = f'{conn.headers["Host"]}{conn.path}'

            log(f'[{conn.cmd}] {code} {uri}', col, end=' | ')
            printc(f'Parsing: {t2_t1}', Ansi.LBLUE, end=' | ')
            printc(f'Handling: {t3_t2}', Ansi.LBLUE)

        try:
            client.shutdown(socket.SHUT_RDWR)
            client.close()
        except socket.error:
            pass
Exemplo n.º 28
0
 def clientHandler(self, conn: socket.socket, address,
                   stop_event: threading.Event):
     print("clientHandler")
     disconnect = threading.Event()
     while not stop_event.is_set() and not disconnect.is_set():
         try:
             data = conn.recv(self.max_recv_bytes)
             if data:
                 if self.lag is not None:
                     time.sleep(self.lag)
                 response = self.produce_respose(data, disconnect)
                 conn.send(response)
             else:
                 raise Exception('Client disconnected')
         except Exception as e:
             disconnect.set()
             conn.shutdown(socket.SHUT_RDWR)
             conn.close()
     conn.close()
Exemplo n.º 29
0
def forward_packet_to_ws_client(reserved_socket: socket.socket,
                                ws: ws.WebSocketHandler):
    asyncio.set_event_loop(asyncio.new_event_loop())
    message = ' '
    while message:
        message = reserved_socket.recv(pw.tcp_bufsize)
        #log.info("VCL  " + str(message))
        if message:
            ws.write_message(message=message, binary=binary_type)
        else:
            try:
                reserved_socket.shutdown(SHUT_RD)
            except:
                pass
            try:
                ws.close()
                pass
            except:
                pass
    pass
Exemplo n.º 30
0
 def receive_message(self, connection: socket.socket):
     while True:
         try:
             receive_data = connection.recv(2048)
             if len(receive_data) == 0:
                 self.normal_log("接收中断: 客户端[" +
                                 self.get_client_name(connection) +
                                 "]可能主动断开了连接")
                 self.remove_socket_from_client_sockets(connection)
                 connection.shutdown(socket.SHUT_RDWR)
                 connection.close()
                 break
             else:
                 if not self.on_process_json_query(connection,
                                                   receive_data):
                     break
         except:
             self.error_log("接收中断")
             self.remove_socket_from_client_sockets(connection)
             break
Exemplo n.º 31
0
def forward_udp_to_udp(listen_socket: socket.socket,
                       client_socket: socket.socket):
    while True:
        try:
            server_msg = client_socket.recvfrom(udp_bufsize)
            if server_msg:
                listen_socket.sendto(server_msg[0],
                                     udp_nat_port[server_msg[1]])
            else:
                try:
                    client_socket.shutdown(socket.SHUT_RD)
                except:
                    pass  # Do nothing then
                try:
                    del udp_nat_port[udp_nat_port[server_msg[1]]]
                    log.debug(
                        "Removing entry from map to prevent anything wrong")
                except:
                    pass  # Do nothing then
                try:
                    del udp_nat_port[server_msg[1]]
                except:
                    pass  # Do nothing then
                break
        except:
            # If it throws exception, looks like the socket has been closed, let's close our socket
            try:
                client_socket.shutdown(socket.SHUT_RD)
            except:
                pass  # Do nothing then
            try:
                del udp_nat_port[udp_nat_port[server_msg[1]]]
                log.debug("Removing entry from map to prevent anything wrong")
            except:
                pass  # Do nothing then
            try:
                del udp_nat_port[server_msg[1]]
            except:
                pass  # Do nothing then
            break