khm/src/khm/Objects/Client/OnionRelay.php

317 lines
10 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/** @noinspection PhpMissingFieldTypeInspection */
namespace khm\Objects\Client;
use khm\Abstracts\OnionVersionStatus;
class OnionRelay
{
/**
* Relay nickname consisting of 119 alphanumerical characters.
*
* @var string
*/
public $Nickname;
/**
* Relay fingerprint consisting of 40 upper-case hexadecimal characters.
*
* @var string
*/
public $Fingerprint;
/**
* Array of IPv4 or IPv6 addresses and TCP ports or port lists where the relay accepts onion-routing connections.
* The first address is the primary onion-routing address that the relay used to register in the network,
* subsequent addresses are in arbitrary order. IPv6 hex characters are all lower-case.
*
* @var string[]
*/
public $OrAddresses;
/**
* Array of IPv4 addresses that the relay used to exit to the Internet in the past 24 hours.
* Omitted if array is empty.
*
* @var string[]
*/
public $ExitAddresses;
/**
* IPv4 address where the relay accepts directory connections.
* Omitted if the relay does not accept directory connections.
*
* @var string|null
*/
public $DirAddress;
/**
* TCP port where the relay accepts directory connections.
* Omitted if the relay does not accept directory connections.
*
* @var int|null
*/
public $DirPort;
/**
* Unix Timestamp for when this relay was last seen in a network status consensus.
*
* @var int
*/
public $LastSeenTimestamp;
/**
* Unix Timestamp for when this relay last stopped announcing an IPv4 or IPv6 address or TCP port where it
* previously accepted onion-routing or directory connections. This timestamp can serve as indicator whether
* this relay would be a suitable fallback directory.
*
* @var int
*/
public $LastChangedAddressOrPort;
/**
* Unix Timestamp for when this relay was first seen in a network status consensus.
*
* @var int
*/
public $FirstSeen;
/**
* Array of relay flags that the directory authorities assigned to this relay. May be omitted if empty.
*
* @var array
*/
public $Flags;
/**
* Boolean field saying whether this relay was listed as running in the last relay network status consensus.
*
* @var bool
*/
public $Running;
/**
* Indicates if the exit flag is present
*
* @var bool
*/
public $Exit;
/**
* Indicates if the fast flag is present
*
* @var bool
*/
public $Fast;
/**
* Indicates if the guard flag is present
*
* @var bool
*/
public $Guard;
/**
* Indicates if the stable flag is present
*
* @var bool
*/
public $Stable;
/**
* Indicates if the valid flag is present
*
* @var bool
*/
public $Valid;
/**
* Contact address of the relay operator. Omitted if empty or if descriptor containing this information
* cannot be found.
*
* @var string|null
*/
public $Contact;
/**
* Platform string containing operating system and Tor version details. Omitted if empty or if descriptor
* containing this information cannot be found.
*
* @var string|null
*/
public $Platform;
/**
* Tor software version without leading "Tor" as reported by the directory authorities in the "v" line of the
* consensus. Omitted if either the directory authorities or the relay did not report which version the
* relay runs or if the relay runs an alternative Tor implementation.
*
* @var string|null
*/
public $Version;
/**
* Status of the Tor software version of this relay based on the versions recommended by the directory
* authorities. Possible version statuses are: "recommended" if a version is listed as recommended;
* "experimental" if a version is newer than every recommended version; "obsolete" if a version is older
* than every recommended version; "new in series" if a version has other recommended versions with the
* same first three components, and the version is newer than all such recommended versions, but it is not
* newer than every recommended version; "unrecommended" if none of the above conditions hold. Omitted if
* either the directory authorities did not recommend versions, or the relay did not report which version it runs.
*
* @var string|OnionVersionStatus|null
*/
public $VersionStatus;
/**
* Weight assigned to this relay by the directory authorities that clients use in their path selection
* algorithm. The unit is arbitrary; currently it's kilobytes per second, but that might change in the future.
*
* @var int
*/
public $ConsensusWeight;
/**
* The Unix Timestamp for when this record was last updated
*
* @var int
*/
public $LastUpdatedTimestmap;
/**
* The Unix Timestamp for when this record was first registered into the database
*
* @var int
*/
public $CreatedTimestmap;
/**
* Returns an array representation of the object
*
* @return array
* @noinspection PhpCastIsUnnecessaryInspection
*/
public function toArray(): array
{
return [
'nickname' => $this->Nickname,
'fingerprint' => $this->Fingerprint,
'or_addresses' => $this->OrAddresses,
'exit_addresses' => $this->ExitAddresses,
'dir_address' => $this->DirAddress,
'dir_port' => (int)$this->DirPort,
'last_seen_timestamp' => (int)$this->LastSeenTimestamp,
'last_changed_address_or_port' => (int)$this->LastChangedAddressOrPort,
'first_seen' => (int)$this->FirstSeen,
'flags' => $this->Flags,
'running' => (bool)$this->Running,
'exit' => (bool)$this->Exit,
'fast' => (bool)$this->Fast,
'guard' => (bool)$this->Guard,
'stable' => (bool)$this->Stable,
'valid' => (bool)$this->Valid,
'contact' => $this->Contact,
'platform' => $this->Platform,
'version' => $this->Version,
'version_status' => $this->VersionStatus,
'consensus_weight' => (int)$this->ConsensusWeight,
'last_updated_timestamp' => (int)$this->LastUpdatedTimestmap,
'created_timestamp' => (int)$this->CreatedTimestmap
];
}
/**
* Constructs object from an array representation
*
* @param array $data
* @return OnionRelay
*/
public static function fromArray(array $data): OnionRelay
{
$OnionRelayObject = new OnionRelay();
if(isset($data['nickname']))
$OnionRelayObject->Nickname = $data['nickname'];
if(isset($data['fingerprint']))
$OnionRelayObject->Fingerprint = $data['fingerprint'];
if(isset($data['or_addresses']))
$OnionRelayObject->OrAddresses = $data['or_addresses'];
if(isset($data['exit_addresses']))
$OnionRelayObject->ExitAddresses = $data['exit_addresses'];
if(isset($data['dir_address']))
$OnionRelayObject->DirAddress = $data['dir_address'];
if(isset($data['dir_port']))
$OnionRelayObject->DirPort = (int)$data['dir_port'];
if(isset($data['last_seen_timestamp']))
$OnionRelayObject->LastSeenTimestamp = (int)$data['last_seen_timestamp'];
if(isset($data['last_changed_address_or_port']))
$OnionRelayObject->LastChangedAddressOrPort = (int)$data['last_changed_address_or_port'];
if(isset($data['first_seen']))
$OnionRelayObject->FirstSeen = (int)$data['first_seen'];
if(isset($data['flags']))
$OnionRelayObject->Flags = $data['flags'];
if(isset($data['running']))
$OnionRelayObject->Running = (bool)$data['running'];
if(isset($data['exit']))
$OnionRelayObject->Exit = (bool)$data['exit'];
if(isset($data['fast']))
$OnionRelayObject->Fast = (bool)$data['fast'];
if(isset($data['guard']))
$OnionRelayObject->Guard = (bool)$data['guard'];
if(isset($data['stable']))
$OnionRelayObject->Stable = (bool)$data['stable'];
if(isset($data['valid']))
$OnionRelayObject->Valid = (bool)$data['valid'];
if(isset($data['contact']))
$OnionRelayObject->Contact = $data['contact'];
if(isset($data['platform']))
$OnionRelayObject->Platform = $data['platform'];
if(isset($data['version']))
$OnionRelayObject->Version = $data['version'];
if(isset($data['version_status']))
$OnionRelayObject->VersionStatus = $data['version_status'];
if(isset($data['consensus_weight']))
$OnionRelayObject->ConsensusWeight = $data['consensus_weight'];
if(isset($data['last_updated_timestamp']))
$OnionRelayObject->LastUpdatedTimestmap = (int)$data['last_updated_timestamp'];
if(isset($data['created_timestamp']))
$OnionRelayObject->CreatedTimestmap = (int)$data['created_timestamp'];
return $OnionRelayObject;
}
/**
* Constructs object from a onion relay record
*
* @param \khm\Objects\OnionRelay $relay
* @return OnionRelay
*/
public static function fromOnionRelayObject(\khm\Objects\OnionRelay $relay): OnionRelay
{
return self::fromArray($relay->toArray());
}
}