latest.ipv8.messaging.anonymization.community
The tunnel community.
Author(s): Egbert Bouman
Module Contents
Classes
Settings to forward to the TunnelCommunity. |
|
Community to create circuits of intermediate peers (hops) that send data into (exit) and receive from the Internet. |
Functions
|
This function wrapper will unpack the normal payload for you, and handle a singular circuit_id parameter at |
- latest.ipv8.messaging.anonymization.community.unpack_cell(payload_cls: type[latest.ipv8.messaging.serialization.Serializable]) Callable[Ellipsis, Callable[[TunnelCommunity, latest.ipv8.types.Address, bytes, int | None], None]]
This function wrapper will unpack the normal payload for you, and handle a singular circuit_id parameter at the end of the parameter list You can now write your non-authenticated and signed functions as follows:
@unpack_cell(DataPayload) def on_message(source_address, payload): ''' :type source_address: str :type payload: DataPayload ''' pass.
- class latest.ipv8.messaging.anonymization.community.TunnelSettings
Bases:
latest.ipv8.community.CommunitySettings
Settings to forward to the TunnelCommunity.
- property max_relay_early: int
Return the maximum number of relay_early cells that are allowed to pass a relay.
- min_circuits = 1
- max_circuits = 8
- max_joined_circuits = 100
- max_time
- max_time_ip
- max_time_inactive = 20
- max_traffic
- circuit_timeout = 60
- unstable_timeout = 60
- next_hop_timeout = 10
- swarm_lookup_interval = 30
- swarm_connection_limit = 15
- remove_tunnel_delay = 5
- _max_relay_early = 8
- dht_provider: latest.ipv8.dht.provider.DHTCommunityProvider | None
- class latest.ipv8.messaging.anonymization.community.TunnelCommunity(settings: TunnelSettings)
Bases:
latest.ipv8.community.Community
Community to create circuits of intermediate peers (hops) that send data into (exit) and receive from the Internet.
- version = b'\x02'
- community_id
- settings_class
- get_serializer() latest.ipv8.messaging.serialization.Serializer
Extend our serializer with the ability to (un)pack exit node flags.
- add_cell_handler(payload_cls: type[latest.ipv8.messaging.lazy_payload.VariablePayloadWID], handler: Callable[[TunnelCommunity, latest.ipv8.types.Address, bytes, int | None], None] | Callable[[latest.ipv8.types.Address, bytes, int | None], None]) None
Handler for messages that are exclusively tunneled (i.e., never handled plaintext).
- do_circuits() None
Check if we have sufficient circuits and attempt to create new circuits if we have too little.
- build_tunnels(hops: int) None
Signal that we want circuits of a given number of hops.
The number of circuits created for this hop count is dictated by the
max_circuits
setting.
- do_remove() None
Remove all circuits that are inactive, old or overused and remove old peers from our candidate list.
- get_candidates(*requested_flags: int) list[latest.ipv8.peer.Peer]
Get all the peers that we can create circuits with.
- get_max_time(circuit_id: int) float
Get the maximum time (in seconds) that the given circuit is allowed to exist.
- find_circuits(ctype: str | None = CIRCUIT_TYPE_DATA, state: str | None = CIRCUIT_STATE_READY, exit_flags: collections.abc.Collection[int] | None = None, hops: int | None = None) list[Circuit]
Get circuits of the given type and state (and potentially exit flags and a given number of hops).
- create_circuit(goal_hops: int, ctype: str = CIRCUIT_TYPE_DATA, exit_flags: collections.abc.Collection[int] | None = None, required_exit: latest.ipv8.peer.Peer | None = None, info_hash: bytes | None = None) Circuit | None
Create a circuit of a given number of hops. The circuit will be created immediately but not be available for transmission of data immediately. Note that not all circuits exist to send data.
- Returns:
None if we are supposed to find an exit node and know of none.
- send_initial_create(circuit: Circuit, candidate_peers: list[latest.ipv8.peer.Peer], max_tries: int) None
Attempt to establish the first hop in a Circuit.
- async remove_circuit(circuit_id: int, additional_info: str = '', remove_now: bool = False, destroy: bool | int = False) None
Remove a circuit and optionally send a destroy message.
- async remove_relay(circuit_id: int, additional_info: str = '', remove_now: bool = False, destroy: bool = False) latest.ipv8.messaging.anonymization.tunnel.RelayRoute | None
Remove a relay and all information associated with the relay. Return the relays that have been removed.
- async remove_exit_socket(circuit_id: int, additional_info: str = '', remove_now: bool = False, destroy: bool = False) latest.ipv8.messaging.anonymization.exit_socket.TunnelExitSocket | None
Remove an exit socket. Send a destroy message if necessary.
- destroy_circuit(circuit: Circuit, reason: int = 0) None
Send a destroy message over a circuit.
Note that the circuit will still exist.
- destroy_relay(circuit_id: int, reason: int = 0) None
Destroy our relay circuit upon request and forward a destroy message.
Note that the relay route will still exist.
- destroy_exit_socket(exit_socket: latest.ipv8.messaging.anonymization.exit_socket.TunnelExitSocket, reason: int = 0) None
Destroy an exit socket.
Note that the exit socket will still exist.
- send_cell(target_addr: latest.ipv8.types.Address, payload: CellablePayload) None
Send the given payload DIRECTLY to the given peer with the appropriate encryption rules.
- send_data(target: latest.ipv8.types.Address, circuit_id: int, dest_address: latest.ipv8.types.Address, source_address: latest.ipv8.types.Address, data: bytes) None
Pack the given binary data and forward it to the given peer.
- send_packet(target: latest.ipv8.types.Address, packet: bytes) int
Send raw data over the socket to a given peer and return the length of the sent data.
- send_destroy(target: latest.ipv8.types.Address, circuit_id: int, reason: int) None
Send a destroy message directly to the given peer.
- _ours_on_created_extended(circuit_id: int, payload: CreatedPayload | ExtendedPayload) None
- send_extend(circuit: Circuit, candidates: list[bytes], max_tries: int) None
Extend a circuit by choosing one of the given candidates.
- extract_peer_flags(extra_bytes: bytes) list[int]
Convert piggybacked introduction bytes to a list of peer flags.
- introduction_request_callback(peer: latest.ipv8.peer.Peer, dist: latest.ipv8.messaging.payload_headers.GlobalTimeDistributionPayload, payload: latest.ipv8.messaging.payload.IntroductionRequestPayload | latest.ipv8.messaging.payload.NewIntroductionRequestPayload) None
Try to extract piggybacked data from the introduction request.
- introduction_response_callback(peer: latest.ipv8.peer.Peer, dist: latest.ipv8.messaging.payload_headers.GlobalTimeDistributionPayload, payload: latest.ipv8.messaging.payload.IntroductionResponsePayload | latest.ipv8.messaging.payload.NewIntroductionResponsePayload) None
Try to extract piggybacked data from the introduction response.
- create_introduction_request(socket_address: latest.ipv8.types.Address, extra_bytes: bytes = b'', new_style: bool = False, prefix: bytes | None = None) bytes
Add peer flags to our introduction requests.
- create_introduction_response(lan_socket_address: latest.ipv8.types.Address, socket_address: latest.ipv8.types.Address, identifier: int, introduction: latest.ipv8.peer.Peer | None = None, extra_bytes: bytes = b'', prefix: bytes | None = None, new_style: bool = False) bytes
Add peer flags to our introduction responses.
- on_cell(source_address: latest.ipv8.types.Address, data: bytes) None
Process an incoming cell, originating from a given address.
- on_packet_from_circuit(source_address: latest.ipv8.types.Address, data: bytes, circuit_id: int) None
Process incoming raw data, assumed to be an IPv8 packet, originating from a given address.
- async should_join_circuit(create_payload: CreatePayload, previous_node_address: latest.ipv8.types.Address) bool
Check whether we should join a circuit.
Note that this method is intended to be overwritten and, therefore, has unused arguments.
- join_circuit(create_payload: CreatePayload, previous_node_address: latest.ipv8.types.Address) None
Actively join a circuit and send a created message back.
- async on_create(source_address: latest.ipv8.types.Address, payload: CreatePayload, _: int | None) None
Process a request to join someone’s circuit.
- on_created(source_address: latest.ipv8.types.Address, payload: CreatedPayload, _: int | None) None
Callback for when another peer signals that they have joined our circuit.
- async on_extend(source_address: latest.ipv8.types.Address, payload: ExtendPayload, _: int | None) None
Callback for when a peer asks us to extend for their circuit.
- on_extended(source_address: latest.ipv8.types.Address, payload: ExtendedPayload, _: int | None) None
Callback for when a peer signals that they have extended our circuit.
- on_raw_data(circuit: Circuit, origin: latest.ipv8.types.Address, data: bytes) None
Handle data, coming from a specific circuit and origin. This method is usually implemented in subclasses of this community.
- on_data(sock_addr: latest.ipv8.types.Address, data: bytes, _: int | None) None
Callback for when we receive a DataPayload out of a circuit.
Data is readable only if this handler is (a) an exit node or (b) the one that created the circuit.
- on_ping(source_address: latest.ipv8.types.Address, payload: PingPayload, _: int | None) None
Callback for when we received a tunneled ping message.
- on_pong(source_address: latest.ipv8.types.Address, payload: PongPayload, _: int | None) None
Callback for when we received a tunneled pong (response) message.
- do_ping(exclude: list[int] | None = None) None
Ping circuits. Pings are only sent to the first hop, subsequent hops will relay the ping.
- on_destroy(peer: latest.ipv8.peer.Peer, payload: DestroyPayload) None
Callback for when we received a destroy message.
- exit_data(circuit_id: int, sock_addr: latest.ipv8.types.Address, destination: latest.ipv8.types.Address, data: bytes) None
Exit data (to the destination) out of the exit socket associated with the given circuit id.
- async dht_peer_lookup(mid: bytes, peer: latest.ipv8.peer.Peer | None = None) None
Perform a DHT lookup for a given SHA-1 hash of a public key.
Note that connections (if any) will be performed in the background. Query for results manually later.
- send_test_request(circuit: Circuit, request_size: int = 0, response_size: int = 0) Future[tuple[bytes, float]]
Send a speed test request and wait for a (data, RTT time in seconds) tuple to be recorded.