An unknown client can only send HelloTLV and GoAwayTLV for security
This commit is contained in:
parent
f062ee7b13
commit
0a4ebd0c92
|
@ -51,7 +51,7 @@ class Hazelnut:
|
||||||
return self.addresses[0]
|
return self.addresses[0]
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return f"{self.id or '<unknown id>'}: {self.nickname or '<unknown nickname>'}, {self.addresses}"
|
return self.nickname or str(self.id) or str(self.main_address)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return repr(self)
|
return repr(self)
|
||||||
|
@ -370,10 +370,10 @@ class Squirrel(Hazelnut):
|
||||||
"""
|
"""
|
||||||
res = dict()
|
res = dict()
|
||||||
hazels = self.active_hazelnuts
|
hazels = self.active_hazelnuts
|
||||||
for key, hazel in hazels:
|
for hazel in hazels:
|
||||||
if hazel.symmetric:
|
if hazel.symmetric:
|
||||||
next_send = uniform(1, 2)
|
next_send = uniform(1, 2)
|
||||||
res[key] = [hazel, time.time() + next_send, 0]
|
res[hazel.main_address] = [hazel, time.time() + next_send, 0]
|
||||||
return res
|
return res
|
||||||
|
|
||||||
def remove_from_inundation(self, hazel: Hazelnut, sender_id: int, nonce: int) -> None:
|
def remove_from_inundation(self, hazel: Hazelnut, sender_id: int, nonce: int) -> None:
|
||||||
|
|
|
@ -73,7 +73,12 @@ class Pad1TLV(TLV):
|
||||||
return self.type.to_bytes(1, sys.byteorder)
|
return self.type.to_bytes(1, sys.byteorder)
|
||||||
|
|
||||||
def handle(self, squirrel: Any, sender: Any) -> None:
|
def handle(self, squirrel: Any, sender: Any) -> None:
|
||||||
# TODO Add some easter eggs
|
if not sender.active or not sender.id:
|
||||||
|
# It doesn't say hello, we don't listen to it
|
||||||
|
squirrel.send_packet(sender, Packet.construct(WarningTLV.construct(
|
||||||
|
"You are not my neighbour, I don't listen to your Pad1TLV. Please say me Hello before.")))
|
||||||
|
return
|
||||||
|
|
||||||
squirrel.add_system_message("I received a Pad1TLV, how disapointing.")
|
squirrel.add_system_message("I received a Pad1TLV, how disapointing.")
|
||||||
|
|
||||||
def __len__(self) -> int:
|
def __len__(self) -> int:
|
||||||
|
@ -118,7 +123,12 @@ class PadNTLV(TLV):
|
||||||
+ self.mbz[:self.length]
|
+ self.mbz[:self.length]
|
||||||
|
|
||||||
def handle(self, squirrel: Any, sender: Any) -> None:
|
def handle(self, squirrel: Any, sender: Any) -> None:
|
||||||
# TODO Add some easter eggs
|
if not sender.active or not sender.id:
|
||||||
|
# It doesn't say hello, we don't listen to it
|
||||||
|
squirrel.send_packet(sender, Packet.construct(WarningTLV.construct(
|
||||||
|
"You are not my neighbour, I don't listen to your PadNTLV. Please say me Hello before.")))
|
||||||
|
return
|
||||||
|
|
||||||
squirrel.add_system_message(f"I received {self.length} zeros.")
|
squirrel.add_system_message(f"I received {self.length} zeros.")
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
@ -229,6 +239,12 @@ class NeighbourTLV(TLV):
|
||||||
self.port.to_bytes(2, sys.byteorder)
|
self.port.to_bytes(2, sys.byteorder)
|
||||||
|
|
||||||
def handle(self, squirrel: Any, sender: Any) -> None:
|
def handle(self, squirrel: Any, sender: Any) -> None:
|
||||||
|
if not sender.active or not sender.id:
|
||||||
|
# It doesn't say hello, we don't listen to it
|
||||||
|
squirrel.send_packet(sender, Packet.construct(WarningTLV.construct(
|
||||||
|
"You are not my neighbour, I don't listen to your NeighbourTLV. Please say me Hello before.")))
|
||||||
|
return
|
||||||
|
|
||||||
if (self.ip_address, self.port) in squirrel.addresses:
|
if (self.ip_address, self.port) in squirrel.addresses:
|
||||||
# This case should never happen (and in our protocol it is not possible),
|
# This case should never happen (and in our protocol it is not possible),
|
||||||
# but we include this test as a security measure.
|
# but we include this test as a security measure.
|
||||||
|
@ -279,6 +295,12 @@ class DataTLV(TLV):
|
||||||
"""
|
"""
|
||||||
A message has been sent. We log it.
|
A message has been sent. We log it.
|
||||||
"""
|
"""
|
||||||
|
if not sender.active or not sender.id:
|
||||||
|
# It doesn't say hello, we don't listen to it
|
||||||
|
squirrel.send_packet(sender, Packet.construct(WarningTLV.construct(
|
||||||
|
"You are not my neighbour, I don't listen to your DataTLV. Please say me Hello before.")))
|
||||||
|
return
|
||||||
|
|
||||||
msg = self.data.decode('UTF-8')
|
msg = self.data.decode('UTF-8')
|
||||||
|
|
||||||
# Acknowledge the packet
|
# Acknowledge the packet
|
||||||
|
@ -342,7 +364,13 @@ class AckTLV(TLV):
|
||||||
"""
|
"""
|
||||||
When an AckTLV is received, we know that we do not have to inundate that neighbour anymore.
|
When an AckTLV is received, we know that we do not have to inundate that neighbour anymore.
|
||||||
"""
|
"""
|
||||||
squirrel.add_system_message("I received an AckTLV")
|
if not sender.active or not sender.id:
|
||||||
|
# It doesn't say hello, we don't listen to it
|
||||||
|
squirrel.send_packet(sender, Packet.construct(WarningTLV.construct(
|
||||||
|
"You are not my neighbour, I don't listen to your AckTLV. Please say me Hello before.")))
|
||||||
|
return
|
||||||
|
|
||||||
|
squirrel.add_system_message(f"I received an AckTLV from {sender}")
|
||||||
squirrel.remove_from_inundation(sender, self.sender_id, self.nonce)
|
squirrel.remove_from_inundation(sender, self.sender_id, self.nonce)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
@ -381,6 +409,12 @@ class GoAwayTLV(TLV):
|
||||||
self.message.encode("UTF-8")[:self.length - 1]
|
self.message.encode("UTF-8")[:self.length - 1]
|
||||||
|
|
||||||
def handle(self, squirrel: Any, sender: Any) -> None:
|
def handle(self, squirrel: Any, sender: Any) -> None:
|
||||||
|
if not sender.active or not sender.id:
|
||||||
|
# It doesn't say hello, we don't listen to it
|
||||||
|
squirrel.send_packet(sender, Packet.construct(WarningTLV.construct(
|
||||||
|
"You are not my neighbour, I don't listen to your GoAwayTLV. Please say me Hello before.")))
|
||||||
|
return
|
||||||
|
|
||||||
if sender.active:
|
if sender.active:
|
||||||
sender.active = False
|
sender.active = False
|
||||||
squirrel.update_hazelnut_table(sender)
|
squirrel.update_hazelnut_table(sender)
|
||||||
|
|
Loading…
Reference in New Issue