commit 9952f9341174c12df63cf5b34a8d7e3e1a4ae2ed Author: Damian Johnson atagar@torproject.org Date: Tue Jan 16 10:36:38 2018 -0800
Stub Netinfo packing function
Not yet tested or even fully implemented yet since this requires the ability to pack an Address. --- stem/client/__init__.py | 8 ++++++++ stem/client/cell.py | 26 ++++++++++++++++++++++++-- 2 files changed, 32 insertions(+), 2 deletions(-)
diff --git a/stem/client/__init__.py b/stem/client/__init__.py index 271237d8..d15f0aa4 100644 --- a/stem/client/__init__.py +++ b/stem/client/__init__.py @@ -90,6 +90,14 @@ class Address(collections.namedtuple('Address', ['type', 'type_int', 'value', 'v """
@staticmethod + def pack(addr): + """ + Bytes payload for an address. + """ + + raise NotImplementedError('Not yet available') + + @staticmethod def pop(content): if not content: raise ValueError('Payload empty where an address was expected') diff --git a/stem/client/cell.py b/stem/client/cell.py index 8a6480c7..bc44298f 100644 --- a/stem/client/cell.py +++ b/stem/client/cell.py @@ -45,7 +45,7 @@ import sys
from stem import UNDEFINED from stem.client import ZERO, Address, Certificate, Size -from stem.util import _hash_attr +from stem.util import _hash_attr, datetime_to_unix
FIXED_PAYLOAD_LEN = 509 AUTH_CHALLENGE_SIZE = 32 @@ -352,7 +352,29 @@ class NetinfoCell(Cell):
@classmethod def pack(cls, link_version, receiver_address, sender_addresses, timestamp = None): - raise NotImplementedError('Netinfo packing not yet implemented') + """ + Payload about our timestamp and versions. + + :param int link_version: link protocol version + :param stem.client.Address receiver_address: address of the receiver + :param list sender_addresses: our addresses + :param datetime timestamp: current time according to our clock + + :returns: **bytes** with a payload for these versions + """ + + if timestamp is None: + timestamp = datetime.datetime.now() + + payload = io.BytesIO() + payload.write(Size.LONG.pack(int(datetime_to_unix(timestamp)))) + payload.write(Address.pack(receiver_address)) + payload.write(Size.CHAR.pack(len(sender_addresses))) + + for addr in sender_addresses: + payload.write(Address.pack(addr)) + + return cls._pack(link_version, payload.getvalue())
@classmethod def _unpack(cls, content, circ_id, link_version):