19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
# File 'lib/ermir/evil_registry.rb', line 19
def handle_connection!
unless
Utils.print_rmi_transport_msg("Ermir received an invalid RMI protocol header from the remote peer.", @peeraddr, "red")
return
end
Utils.print_rmi_transport_msg("received a valid RMI protocol header.", @peeraddr)
case @socket.getbyte
when TransportConstants::STREAM_PROTOCOL
@socket.putc(TransportConstants::PROTOCOL_ACK)
@socket.write([@peeraddr[-1].size].pack("S>"))
@socket.write(@peeraddr[-1])
@socket.write([@peeraddr[1]].pack("L>"))
Utils.print_rmi_transport_msg("sent acknowledgement of the RMI connection to the remote peer.", @peeraddr)
len = @socket.read(2).unpack("S>")[0]
rmi_server_ip = @socket.read(len)
rmi_server_port = @socket.read(4).unpack("L>")[0]
when TransportConstants::SINGLE_OP_PROTOCOL
else
Utils.print_rmi_transport_msg("received an invalid RMI protocol type.", @peeraddr, "red")
end
unless rmi_message_valid?
Utils.print_rmi_transport_msg("received an invalid RMI message.", @peeraddr, "red")
return
end
Utils.print_rmi_transport_msg("received a valid RMI message header from remote peer.", @peeraddr)
_ = @socket.read(22)
op = @socket.read(4).unpack("L>")[0]
interface_hash = @socket.read(8).unpack("Q>")[0]
unless interface_hash.eql?(rmi_server_port.zero? ? TransportConstants::INTERFACE_STUB_HASH : TransportConstants::INTERFACE_SKEL_HASH)
Utils.print_rmi_transport_msg("received an incorrect Registry interface hash.", @peeraddr, "red")
return
end
if (0..4).include?(op)
ret = self.send("handle_#{TransportConstants::OPS[op]}")
if ret.is_a?(String)
Utils.print_rmi_transport_msg("error: #{ret}.", @peeraddr, "red")
end
else
Utils.print_rmi_transport_msg("error: received an invalid RMI CALL OP.", @peeraddr, "red")
end
end
|