예제 #1
0
 def on_interest(self, name: FormalName, _param: InterestParam, _app_param: typing.Optional[BinaryStr]):
     # Get the name and segment number
     if Component.get_type(name[-1]) == Component.TYPE_SEGMENT:
         obj_name = Component.get_value(name[-2])
         seg_no = Component.to_number(name[-1])
     else:
         obj_name = Component.get_value(name[-1])
         seg_no = 0
     # Read the data
     # Git objects are small so we can read the whole object
     try:
         obj_type, data = self.repo.read_obj(bytes(obj_name))
     except ValueError:
         logging.warning(f'Requested file {obj_name} does not exist in repo {self.repo.repo_name}')
         return
     # Extract the segment and calculate Name
     data_name = self.prefix + [Component.from_bytes(obj_name), Component.from_segment(seg_no)]
     start_pos = seg_no * SEGMENTATION_SIZE
     data_seg = data[start_pos:start_pos + SEGMENTATION_SIZE]
     packet_obj = SyncObject()
     packet_obj.obj_type = obj_type.encode()
     packet_obj.obj_data = data_seg
     wire = packet_obj.encode()
     final_block = (len(data) + SEGMENTATION_SIZE - 1) // SEGMENTATION_SIZE
     self.app.put_data(data_name, wire,
                       freshness_period=3600000,
                       final_block_id=Component.from_segment(final_block))
     logging.debug(f'Responded {obj_name} segment {final_block} in repo {self.repo.repo_name}')
예제 #2
0
    def test_app_param():
        interest = (
            b'\x05\x42\x07\x36\x08\x05local\x08\x03ndn\x08\x06prefix'
            b'\x02 \x47\x75\x6f\x21\xfe\x0e\xe2\x65\x14\x9a\xa2\xbe\x3c\x63\xc5\x38'
            b'\xa7\x23\x78\xe9\xb0\xa5\x8b\x39\xc5\x91\x63\x67\xd3\x5b\xda\x10'
            b'\x0c\x02\x0f\xa0\x24\x04\x01\x02\x03\x04')
        name, params, app_params, sig = parse_interest(interest)
        assert name == Name.from_str(
            '/local/ndn/prefix'
            '/params-sha256=47756f21fe0ee265149aa2be3c63c538a72378e9b0a58b39c5916367d35bda10'
        )
        assert app_params == b'\x01\x02\x03\x04'
        assert not params.can_be_prefix
        assert not params.must_be_fresh
        assert params.nonce is None
        assert params.lifetime == 4000
        assert params.hop_limit is None
        assert sig.signature_info is None

        algo = hashlib.sha256()
        algo.update(b'\x24\x04\x01\x02\x03\x04')
        assert Component.get_value(name[-1]) == algo.digest()
        algo = hashlib.sha256()
        for part in sig.digest_covered_part:
            algo.update(part)
        assert sig.digest_value_buf == algo.digest()
 def decode_sql(name, catalog_prefix):
     #remove the prefix
     sql_name_component = name[len(Name.normalize(catalog_prefix))]
     # parse the sql_name_component
     sqls_tlv_model = SqlsTlvModel.parse(
         Component.get_value(sql_name_component).tobytes())
     # from list of bytearray to list of string
     sqls = list(map(lambda x: x.tobytes().decode(), sqls_tlv_model.sqls))
     return sqls
예제 #4
0
 def decode_cmd_param_bytes(name) -> RepoCommandParameter:
     """
     Decode the command interest and return a RepoCommandParameter object.
     Command interests have the format of:
     /<routable_repo_prefix>/insert/<cmd_param_blob>/<timestamp>/<random-value>/<SignatureInfo>/<SignatureValue>
     Throw RuntimeError on decoding failure.
     """
     param_bytes = Component.get_value(name[-1])
     return RepoCommandParameter.parse(param_bytes)
예제 #5
0
 def test_number():
     assert Component.from_segment(13) == b'!\x01\r'
     assert Component.from_byte_offset(13) == b'\x22\x01\r'
     assert Component.from_sequence_num(13) == b'%\x01\r'
     assert Component.from_version(13) == b'#\x01\r'
     timeval = 15686790223318112
     comp = Component.from_timestamp(timeval)
     assert Component.get_type(comp) == 36
     assert Component.get_value(comp) == b'\x00\x37\xbb\x0d\x76\xed\x4c\x60'
     assert Component.to_number(comp) == timeval
예제 #6
0
 def decode_datainfo(name, node_recall_prefix):
     # get the datainfo name component
     datainfo_name_component = name[len(node_recall_prefix)]
     # parse the datainfo_name_component
     datainfo_tlv_model = DatainfoTlvModel.parse(
         Component.get_value(datainfo_name_component).tobytes())
     # from bytearray to string (uint)
     data_name = datainfo_tlv_model.data_name.tobytes().decode()
     hash = datainfo_tlv_model.hash.tobytes().decode()
     desired_copies = datainfo_tlv_model.desired_copies
     return data_name, hash, desired_copies
예제 #7
0
 def __init__(self, comp: Component = None) -> None:
     try:
         model = MetaDataModel.parse(bytes(Component.get_value(comp)))
         self.source = model.source
         self.tseqno = model.tseqno
         self.nulled = model.nulled
         self.nopcks = model.nopcks
     except (ValueError, TypeError, IndexError, DecodeError):
         self.source = b''
         self.tseqno = 0
         self.nulled = 0
         self.nopcks = 0
예제 #8
0
    def test_number():
        assert Component.from_segment(13) == b'!\x01\r'
        assert Component.from_byte_offset(13) == b'\x22\x01\r'
        assert Component.from_sequence_num(13) == b'%\x01\r'
        assert Component.from_version(13) == b'#\x01\r'
        timeval = 15686790223318112
        comp = Component.from_timestamp(timeval)
        assert Component.get_type(comp) == 36
        assert Component.get_value(comp) == b'\x00\x37\xbb\x0d\x76\xed\x4c\x60'
        assert Component.to_number(comp) == timeval

        assert Component.to_str(Component.from_segment(13)) == 'seg=13'
        assert Component.to_str(Component.from_byte_offset(13)) == 'off=13'
        assert Component.to_str(Component.from_sequence_num(13)) == 'seq=13'
        assert Component.to_str(Component.from_version(13)) == 'v=13'
        assert Component.to_str(
            Component.from_timestamp(timeval)) == 't=15686790223318112'

        assert Component.from_str('seg=13') == b'!\x01\r'
        assert Component.from_str('off=13') == b'\x22\x01\r'
        assert Component.from_str('seq=13') == b'%\x01\r'
        assert Component.from_str('v=13') == b'#\x01\r'
        assert Component.from_str(
            't=15686790223318112') == b'$\x08\x007\xbb\rv\xedL`'
예제 #9
0
 def decode_cmd_param_bytes(name) -> CatalogCommandParameter:
     param_bytes = Component.get_value(name[-1])
     return CatalogCommandParameter.parse(param_bytes)
예제 #10
0
 def __init__(self, comp:Component=None) -> None:
     try:
         model:MetaDataModel = MetaDataModel.parse(bytes(Component.get_value(comp)))
         self.source, self.tseqno, self.nopcks = model.source, model.tseqno, model.nopcks
     except (ValueError,TypeError,IndexError,DecodeError):
         self.source, self.tseqno, self.nopcks = b'', 0, 0