Class RouterInfo

All Implemented Interfaces:
Serializable, DataStructure

public class RouterInfo
extends DatabaseEntry
Defines the data that a router either publishes to the global routing table or provides to trusted peers. For efficiency, the methods and structures here are now unsynchronized. Initialize the RI with readBytes(), or call the setters and then sign() in a single thread. Don't change it after that. To ensure integrity of the RouterInfo, methods that change an element of the RouterInfo will throw an IllegalStateException after the RouterInfo is signed.
Since:
0.9.16 moved from net.i2p.data
Author:
jrandom
See Also:
Serialized Form
  • Field Details

  • Constructor Details

    • RouterInfo

      public RouterInfo()
    • RouterInfo

      public RouterInfo​(RouterInfo old)
      Used only by Router and PublishLocalRouterInfoJob. Copies ONLY the identity and peers. Does not copy published, addresses, options, or signature.
  • Method Details

    • getDate

      public long getDate()
      Description copied from class: DatabaseEntry
      A common interface to the timestamp of the two subclasses. Identical to getEarliestLeaseData() in LeaseSet, and getPublished() in RouterInfo. Note that for a LeaseSet this will be in the future, and for a RouterInfo it will be in the past. Either way, it's a timestamp.
      Specified by:
      getDate in class DatabaseEntry
    • getKeysAndCert

      public KeysAndCert getKeysAndCert()
      Description copied from class: DatabaseEntry
      Get the keys and the cert Identical to getDestination() in LeaseSet, and getIdentity() in RouterInfo.
      Specified by:
      getKeysAndCert in class DatabaseEntry
      Returns:
      KAC or null
    • getType

      public int getType()
      Description copied from class: DatabaseEntry
      Get the type of the data structure. This should be faster than instanceof.
      Specified by:
      getType in class DatabaseEntry
      Returns:
      KEY_TYPE_ROUTERINFO or KEY_TYPE_LEASESET or LS2 types
    • getIdentity

      public RouterIdentity getIdentity()
      Retrieve the identity of the router represented
    • setIdentity

      public void setIdentity​(RouterIdentity ident)
      Configure the identity of the router represented
      Throws:
      IllegalStateException - if RouterInfo is already signed
    • getPublished

      public long getPublished()
      Retrieve the timestamp on which the info was published, essentially a version number for the RouterInfo. This should be used to expire old RouterInfo structures.
    • setPublished

      public void setPublished​(long published)
      Date on which it was published, in milliseconds since Midnight GMT on Jan 01, 1970
      Throws:
      IllegalStateException - if RouterInfo is already signed
    • getAddressCount

      public int getAddressCount()
      Return the number of router addresses. More efficient than getAddresses().size()
      Since:
      0.9.27
    • getAddresses

      public Collection<RouterAddress> getAddresses()
      Retrieve the set of RouterAddress structures at which this router can be contacted.
      Returns:
      unmodifiable view, non-null
    • setAddresses

      public void setAddresses​(Collection<RouterAddress> addresses)
      Specify a set of RouterAddress structures at which this router can be contacted.
      Parameters:
      addresses - may be null
      Throws:
      IllegalStateException - if RouterInfo is already signed or addresses previously set
      IllegalArgumentException - if too many addresses
    • getPeers

      @Deprecated public Set<Hash> getPeers()
      Deprecated.
      Implemented here but unused elsewhere
      Retrieve a set of SHA-256 hashes of RouterIdentities from routers this router can be reached through.
    • setPeers

      @Deprecated public void setPeers​(Set<Hash> peers)
      Deprecated.
      Implemented here but unused elsewhere
      Specify a set of SHA-256 hashes of RouterIdentities from routers this router can be reached through.
      Throws:
      IllegalStateException - if RouterInfo is already signed
    • getOptions

      @Deprecated public Properties getOptions()
      Deprecated.
      use getOptionsMap()
      Retrieve a set of options or statistics that the router can expose.
      Returns:
      sorted, non-null, NOT a copy, do not modify!!!
    • getOptionsMap

      public Map<Object,​Object> getOptionsMap()
      Retrieve a set of options or statistics that the router can expose.
      Returns:
      an unmodifiable view, non-null, sorted
      Since:
      0.8.13
    • getOption

      public String getOption​(String opt)
    • getVersion

      public String getVersion()
      For convenience, the same as getOption("router.version"), but returns "0" if unset.
      Returns:
      non-null, "0" if unknown.
      Since:
      0.9.18
    • setOptions

      public void setOptions​(Properties options)
      Configure a set of options or statistics that the router can expose. Makes a copy. Warning, clears all capabilities, must be called BEFORE addCapability().
      Parameters:
      options - if null, clears current options
      Throws:
      IllegalStateException - if RouterInfo is already signed
    • getBytes

      protected byte[] getBytes() throws DataFormatException
      Write out the raw payload of the routerInfo, excluding the signature. This caches the data in memory if possible.
      Specified by:
      getBytes in class DatabaseEntry
      Returns:
      null on error ???????????????????????
      Throws:
      DataFormatException - if the data is somehow b0rked (missing props, etc)
    • isValid

      public boolean isValid()
      Determine whether this router info is authorized with a valid signature
    • verifySignature

      public boolean verifySignature()
      Same as isValid()
      Overrides:
      verifySignature in class DatabaseEntry
      Returns:
      valid
      Since:
      0.9
    • getNetworkId

      public int getNetworkId()
      which network is this routerInfo a part of. configured through the property PROP_NETWORK_ID
      Returns:
      -1 if unknown
    • getCapabilities

      public String getCapabilities()
      what special capabilities this router offers
      Returns:
      non-null, empty string if none
    • isHidden

      public boolean isHidden()
      Is this a hidden node?
      Returns:
      true if either 'H' is in the capbilities, or router identity contains a hidden cert.
    • getBandwidthTier

      public String getBandwidthTier()
      Return a string representation of this node's bandwidth tier, or "Unknown"
    • isCurrent

      public boolean isCurrent​(long maxAgeMs)
      Determine whether the router was published recently (within the given age milliseconds). The age should be large enough to take into consideration any clock fudge factor, so values such as 1 or 2 hours are probably reasonable.
      Parameters:
      maxAgeMs - milliseconds between the current time and publish date to check
      Returns:
      true if it was published recently, false otherwise
    • getTargetAddress

      public RouterAddress getTargetAddress​(String transportStyle)
      Pull the first workable target address for the given transport. Use to check for any address. For all addresses, use getTargetAddresses(), which you probably want if you care about IPv6.
    • getTargetAddresses

      public List<RouterAddress> getTargetAddresses​(String transportStyle)
      For multiple addresses per-transport (IPv4 or IPv6)
      Returns:
      non-null
      Since:
      0.7.11
    • getTargetAddresses

      public List<RouterAddress> getTargetAddresses​(String transportStyle1, String transportStyle2)
      For multiple addresses per-transport (IPv4 or IPv6) Return addresses matching either of two styles
      Returns:
      non-null
      Since:
      0.9.35
    • readBytes

      public void readBytes​(InputStream in) throws DataFormatException, IOException
      This does NOT validate the signature
      Parameters:
      in - stream to read from
      Throws:
      IllegalStateException - if RouterInfo was already read in
      DataFormatException - if the data is improperly formatted
      IOException - if there was a problem reading the stream
    • readBytes

      public void readBytes​(InputStream in, boolean verifySig) throws DataFormatException, IOException
      If verifySig is true, this validates the signature while reading in, and throws a DataFormatException if the sig is invalid. This is faster than reserializing to validate later.
      Throws:
      IllegalStateException - if RouterInfo was already read in
      DataFormatException
      IOException
      Since:
      0.9
    • writeBytes

      public void writeBytes​(OutputStream out) throws DataFormatException, IOException
      This does NOT validate the signature
      Parameters:
      out - stream to write to
      Throws:
      DataFormatException - if the data was incomplete or not yet ready to be written
      IOException - if there was a problem writing to the stream
    • equals

      public boolean equals​(Object object)
      Overrides:
      equals in class Object
    • hashCode

      public int hashCode()
      Overrides:
      hashCode in class Object
    • toString

      public String toString()
      Overrides:
      toString in class Object
    • main

      public static void main​(String[] args)
      Print out routerinfos from files specified on the command line. Exits 1 if any RI is invalid, fails signature, etc.
      Since:
      0.8