Пример #1
0
    def wrapped_recv(s: ssl.SSLSocket, sf: BinaryIO) -> bytes:
      if timeout is None:
        return s.recv(1024)
      else:
        s.setblocking(False)
        s.settimeout(timeout)

        try:
          return s.recv(1024)
        except (socket.timeout, ssl.SSLError, ssl.SSLWantReadError):
          return None
        finally:
          s.setblocking(True)
Пример #2
0
def perform_handshake(accepted_socket: ssl.SSLSocket) -> None:
    """
    Tries to perform a TLS handshake, if handshake don't succeed in 10 seconds, it closes the
    connection

    :param accepted_socket: SSLSocket object wrapping an accepted client socket
    :return: None
    """
    accepted_socket.settimeout(src.Constants.HANDSHAKE_TIMEOUT_SECONDS)
    try:
        accepted_socket.do_handshake()
        accepted_socket.settimeout(None)
    except (socket.timeout, ssl.SSLError, OSError):
        accepted_socket.close()
        exit(0)
Пример #3
0
def recv_ssl_msg_timeout(sock: ssl.SSLSocket, delimiter=b'\n', timeout=2):
    if sock not in socket_buffer_dict.keys():
        socket_buffer_dict[sock] = bytearray()

    buff = socket_buffer_dict[sock]
    last = time.time()
    received = False

    sock.setblocking(False)
    sock.settimeout(timeout)
    while True:
        available = select.select([sock], [], [], timeout / 25)
        data = None
        if available[0]:
            data = bytearray()
            subdata = sock.recv()
            while subdata:
                data.extend(subdata)
                try:
                    subdata = sock.recv()
                except socket.timeout:
                    subdata = None

        if not data:
            if (time.time() - last > timeout):
                break
            continue

        last = time.time()
        buff.extend(data)
        if delimiter in buff:
            received = True
            break

    sock.setblocking(True)
    if not received:
        raise TimeoutError

    pos = buff.index(delimiter)
    res = buff[0:pos]
    del buff[0:pos + 1]
    return base64.standard_b64decode(res)