Esempio n. 1
0
 def test_pack(self):
     p = Packet()
     p.SEQ = 1
     p.ACK = 2
     p.src_port = 8080
     p.dest_port = 9090
     p.set_flags(Packet.Flags.SYN, Packet.Flags.ACK)
     p.set_payload(b"hello")
     target = b'\x00\x00\x00\x01\x00\x00\x00\x02\x1f\x90#\x82\x00\x00\x00\x05\x030000000380d489e62c4e775e665acdda1710bb3hello'
     self.assertEqual(len(p.pack()), len(target))
     self.assertEqual(p.pack(), target)
Esempio n. 2
0
    def message_arrived(self, sock: socket.socket, msg: VM_Message):
        action = msg.payload["action"]
        data = tuple(msg.payload["data"])
        if action == "is_bindable":
            if self.socket_container.bindable(data):
                out = dict(status=0, message="Ok", data=None)
            else:
                out = dict(status=1, message="Not bindable", data=None)
            sock.sendall(VM_Message(out).pack())

        elif action == "bind":
            try:
                curr = InternalSocket(sock, data)
                self.socket_container.insert(curr)
                out = dict(status=0, message="Ok", data=None)
            except ValueError as e:
                out = dict(status=1, message=str(e), data=None)
            except:
                raise RuntimeError("Exception not caught")

            sock.sendall(VM_Message(out).pack())

        elif action == "connect":
            try:
                internal_sock = self.socket_container.get_by_unix_sock(sock)
            except ValueError:
                self.logger.error("Socket not found in bind table")
                return
            p = Packet()
            p.SEQ = 1
            p.ACK = 0
            p.set_flags(Packet.Flags.SYN)
            p.src_port = internal_sock.b_context[1]
            p.dest_port = data[1]
            dest_ip = data[0]
            internal_sock.state = States.SYN_SENT
            self.push_packet(p, (dest_ip, VM.UDP_PORT))

        elif action == "listen":
            try:
                internal_sock = self.socket_container.get_by_unix_sock(sock)
            except ValueError:
                self.logger.error("Socket not found in bind table")
                return
            internal_sock.listen = data[0]
            internal_sock.state = States.LISTENING
            out = dict(status=0, message="Ok", data=None)
            assert sock == internal_sock.unix_sock
            sock.sendall(VM_Message(out).pack())

        elif action == "accept":
            try:
                internal_sock = self.socket_container.get_by_unix_sock(sock)
                self.accept_queue.put((sock, internal_sock))
            except:
                self.logger.error("Socket not found in bind table")
                return

        elif action == "send":
            pass
        else:
            raise NotImplementedError